diff options
author | Mike Greiling <mike@pixelcog.com> | 2018-04-26 15:12:39 -0500 |
---|---|---|
committer | Mike Greiling <mike@pixelcog.com> | 2018-05-01 15:15:10 -0500 |
commit | d224b59a769de823e868b115b4631e0cd2d8bb09 (patch) | |
tree | 8bdaa158ce4bda4837b54216517d8b1a130c1600 | |
parent | 996e5d79dfefac5dd5cacbfdd08c443f007f4492 (diff) | |
download | gitlab-ce-d224b59a769de823e868b115b4631e0cd2d8bb09.tar.gz |
update webpack manifest integration to recognize multi-chunk entrypoints
-rw-r--r-- | app/helpers/webpack_helper.rb | 15 | ||||
-rw-r--r-- | app/views/layouts/_head.html.haml | 3 | ||||
-rw-r--r-- | lib/gitlab/webpack/manifest.rb | 49 |
3 files changed, 56 insertions, 11 deletions
diff --git a/app/helpers/webpack_helper.rb b/app/helpers/webpack_helper.rb index 8bcced70d63..8f0a3b5b190 100644 --- a/app/helpers/webpack_helper.rb +++ b/app/helpers/webpack_helper.rb @@ -1,8 +1,8 @@ -require 'webpack/rails/manifest' +require 'gitlab/webpack/manifest' module WebpackHelper def webpack_bundle_tag(bundle, force_same_domain: false) - javascript_include_tag(*gitlab_webpack_asset_paths(bundle, force_same_domain: force_same_domain)) + javascript_include_tag(*entrypoint_paths(bundle, force_same_domain: force_same_domain)) end def webpack_controller_bundle_tags @@ -18,23 +18,22 @@ module WebpackHelper until route.empty? begin - asset_paths = gitlab_webpack_asset_paths("pages.#{route.join('.')}", extension: 'js') + asset_paths = entrypoint_paths("pages.#{route.join('.')}", extension: 'js') bundles.unshift(*asset_paths) - rescue Webpack::Rails::Manifest::EntryPointMissingError + rescue Gitlab::Webpack::Manifest::AssetMissingError # no bundle exists for this path end route.pop end - javascript_include_tag(*bundles) + javascript_include_tag(*bundles.uniq) end - # override webpack-rails gem helper until changes can make it upstream - def gitlab_webpack_asset_paths(source, extension: nil, force_same_domain: false) + def entrypoint_paths(source, extension: nil, force_same_domain: false) return "" unless source.present? - paths = Webpack::Rails::Manifest.asset_paths(source) + paths = Gitlab::Webpack::Manifest.entrypoint_paths(source) if extension paths.select! { |p| p.ends_with? ".#{extension}" } end diff --git a/app/views/layouts/_head.html.haml b/app/views/layouts/_head.html.haml index b981b5fdafa..02bdfe9aa3c 100644 --- a/app/views/layouts/_head.html.haml +++ b/app/views/layouts/_head.html.haml @@ -38,9 +38,6 @@ = yield :library_javascripts = javascript_include_tag locale_path unless I18n.locale == :en - = webpack_bundle_tag "webpack_runtime" - = webpack_bundle_tag "common" - = webpack_bundle_tag "main" = webpack_bundle_tag "raven" if Gitlab::CurrentSettings.clientside_sentry_enabled - if content_for?(:page_specific_javascripts) diff --git a/lib/gitlab/webpack/manifest.rb b/lib/gitlab/webpack/manifest.rb new file mode 100644 index 00000000000..6d23e938de8 --- /dev/null +++ b/lib/gitlab/webpack/manifest.rb @@ -0,0 +1,49 @@ +require 'webpack/rails/manifest' + +module Gitlab + module Webpack + class Manifest < ::Webpack::Rails::Manifest + # Raised if webpack couldn't build one of your assets + class WebpackError < StandardError + def initialize(errors) + super "Error in webpack compile, details follow below:\n#{errors.join("\n\n")}" + end + end + + # Raised if a supplied asset does not exist in the webpack manifest + AssetMissingError = Class.new(StandardError) + + class << self + def asset_paths(source) + raise ::Webpack::Rails::Manifest::WebpackError, manifest["errors"] unless manifest_bundled? + + paths = manifest["assetsByChunkName"][source] + if paths + # Can be either a string or an array of strings. + # Do not include source maps as they are not javascript + [paths].flatten.reject { |p| p =~ /.*\.map$/ }.map do |p| + "/#{::Rails.configuration.webpack.public_path}/#{p}" + end + else + raise AssetMissingError, "Can't find asset '#{source}' in webpack manifest" + end + end + + def entrypoint_paths(source) + raise ::Webpack::Rails::Manifest::WebpackError, manifest["errors"] unless manifest_bundled? + + entrypoint = manifest["entrypoints"][source] + if entrypoint && entrypoint["assets"] + # Can be either a string or an array of strings. + # Do not include source maps as they are not javascript + [entrypoint["assets"]].flatten.reject { |p| p =~ /.*\.map$/ }.map do |p| + "/#{::Rails.configuration.webpack.public_path}/#{p}" + end + else + raise AssetMissingError, "Can't find entry point '#{source}' in webpack manifest" + end + end + end + end + end +end |