Commit d224b59a authored by Mike Greiling's avatar Mike Greiling

update webpack manifest integration to recognize multi-chunk entrypoints

parent 996e5d79
require 'webpack/rails/manifest' require 'gitlab/webpack/manifest'
module WebpackHelper module WebpackHelper
def webpack_bundle_tag(bundle, force_same_domain: false) 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 end
def webpack_controller_bundle_tags def webpack_controller_bundle_tags
...@@ -18,23 +18,22 @@ module WebpackHelper ...@@ -18,23 +18,22 @@ module WebpackHelper
until route.empty? until route.empty?
begin 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) bundles.unshift(*asset_paths)
rescue Webpack::Rails::Manifest::EntryPointMissingError rescue Gitlab::Webpack::Manifest::AssetMissingError
# no bundle exists for this path # no bundle exists for this path
end end
route.pop route.pop
end end
javascript_include_tag(*bundles) javascript_include_tag(*bundles.uniq)
end end
# override webpack-rails gem helper until changes can make it upstream def entrypoint_paths(source, extension: nil, force_same_domain: false)
def gitlab_webpack_asset_paths(source, extension: nil, force_same_domain: false)
return "" unless source.present? return "" unless source.present?
paths = Webpack::Rails::Manifest.asset_paths(source) paths = Gitlab::Webpack::Manifest.entrypoint_paths(source)
if extension if extension
paths.select! { |p| p.ends_with? ".#{extension}" } paths.select! { |p| p.ends_with? ".#{extension}" }
end end
......
...@@ -38,9 +38,6 @@ ...@@ -38,9 +38,6 @@
= yield :library_javascripts = yield :library_javascripts
= javascript_include_tag locale_path unless I18n.locale == :en = 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 = webpack_bundle_tag "raven" if Gitlab::CurrentSettings.clientside_sentry_enabled
- if content_for?(:page_specific_javascripts) - if content_for?(:page_specific_javascripts)
......
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
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment