shakapacker 6.1.1 → 6.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. checksums.yaml +4 -4
  2. data/.node-version +1 -1
  3. data/CHANGELOG.md +16 -2
  4. data/Gemfile.lock +1 -1
  5. data/README.md +31 -15
  6. data/docs/customizing_babel_config.md +2 -0
  7. data/docs/style_loader_vs_mini_css.md +48 -0
  8. data/docs/using_esbuild_loader.md +1 -1
  9. data/docs/using_swc_loader.md +2 -2
  10. data/docs/v6_upgrade.md +69 -73
  11. data/lib/install/config/webpacker.yml +14 -0
  12. data/lib/install/template.rb +2 -2
  13. data/lib/webpacker/commands.rb +2 -2
  14. data/lib/webpacker/compiler.rb +1 -1
  15. data/lib/webpacker/configuration.rb +12 -4
  16. data/lib/webpacker/dev_server.rb +11 -2
  17. data/lib/webpacker/helper.rb +0 -7
  18. data/lib/webpacker/instance.rb +1 -1
  19. data/lib/webpacker/manifest.rb +3 -3
  20. data/lib/webpacker/railtie.rb +7 -0
  21. data/lib/webpacker/version.rb +1 -1
  22. data/lib/webpacker/version_checker.rb +152 -0
  23. data/package/__tests__/config.js +11 -0
  24. data/package/config.js +6 -0
  25. data/package/environments/base.js +1 -1
  26. data/package/inliningCss.js +1 -1
  27. data/package/rules/__tests__/file.js +35 -0
  28. data/package/rules/__tests__/index.js +11 -0
  29. data/package/rules/__tests__/raw.js +18 -0
  30. data/package/rules/file.js +2 -17
  31. data/package/rules/raw.js +2 -2
  32. data/package/swc/index.js +3 -3
  33. data/package.json +1 -1
  34. data/test/configuration_test.rb +24 -3
  35. data/test/fixtures/beta_package.json +13 -0
  36. data/test/fixtures/git_url_package.json +13 -0
  37. data/test/fixtures/github_url_package.json +13 -0
  38. data/test/fixtures/normal_package.json +13 -0
  39. data/test/fixtures/relative_path_package.json +13 -0
  40. data/test/fixtures/semver_caret_package.json +13 -0
  41. data/test/fixtures/semver_tilde_package.json +13 -0
  42. data/test/fixtures/without_package.json +13 -0
  43. data/test/helper_test.rb +12 -12
  44. data/test/test_app/config/webpacker.yml +4 -0
  45. data/test/test_app/config/webpacker_manifest_path.yml +80 -0
  46. data/test/version_checker_test.rb +271 -0
  47. data/test/webpacker_test.rb +15 -0
  48. metadata +28 -3
@@ -80,8 +80,8 @@ class Webpacker::Manifest
80
80
  end
81
81
 
82
82
  def load
83
- if config.public_manifest_path.exist?
84
- JSON.parse config.public_manifest_path.read
83
+ if config.manifest_path.exist?
84
+ JSON.parse config.manifest_path.read
85
85
  else
86
86
  {}
87
87
  end
@@ -104,7 +104,7 @@ class Webpacker::Manifest
104
104
 
105
105
  def missing_file_from_manifest_error(bundle_name)
106
106
  <<-MSG
107
- Webpacker can't find #{bundle_name} in #{config.public_manifest_path}. Possible causes:
107
+ Webpacker can't find #{bundle_name} in #{config.manifest_path}. Possible causes:
108
108
  1. You forgot to install node packages (try `yarn install`) or are running an incompatible version of Node
109
109
  2. Your app has code with a non-standard extension (like a `.jsx` file) but the extension is not in the `extensions` config in `config/webpacker.yml`
110
110
  3. You have set compile: false (see `config/webpacker.yml`) for this environment
@@ -2,11 +2,18 @@ require "rails/railtie"
2
2
 
3
3
  require "webpacker/helper"
4
4
  require "webpacker/dev_server_proxy"
5
+ require "webpacker/version_checker"
5
6
 
6
7
  class Webpacker::Engine < ::Rails::Engine
7
8
  # Allows Webpacker config values to be set via Rails env config files
8
9
  config.webpacker = ActiveSupport::OrderedOptions.new
9
10
 
11
+ initializer "webpacker.version_checker" do
12
+ if File.exist?(Webpacker::VersionChecker::NodePackageVersion.package_json_path)
13
+ Webpacker::VersionChecker.build.raise_if_gem_and_node_package_versions_differ
14
+ end
15
+ end
16
+
10
17
  initializer "webpacker.proxy" do |app|
11
18
  if (Webpacker.config.dev_server.present? rescue nil)
12
19
  app.middleware.insert_before 0,
@@ -1,4 +1,4 @@
1
1
  module Webpacker
2
2
  # Change the version in package.json too, please!
3
- VERSION = "6.1.1".freeze
3
+ VERSION = "6.2.0".freeze
4
4
  end
@@ -0,0 +1,152 @@
1
+ # frozen_string_literal: true
2
+ require "webpacker/version"
3
+
4
+ module Webpacker
5
+ class VersionChecker
6
+ attr_reader :node_package_version
7
+
8
+ MAJOR_MINOR_PATCH_VERSION_REGEX = /(\d+)\.(\d+)\.(\d+)/.freeze
9
+
10
+ def self.build
11
+ new(NodePackageVersion.build)
12
+ end
13
+
14
+ def initialize(node_package_version)
15
+ @node_package_version = node_package_version
16
+ end
17
+
18
+ def raise_if_gem_and_node_package_versions_differ
19
+ # Skip check if package is not in package.json or listed from relative path, git repo or github URL
20
+ return if node_package_version.skip_processing?
21
+
22
+ node_major_minor_patch = node_package_version.major_minor_patch
23
+ gem_major_minor_patch = gem_major_minor_patch_version
24
+ versions_match = node_major_minor_patch[0] == gem_major_minor_patch[0] &&
25
+ node_major_minor_patch[1] == gem_major_minor_patch[1] &&
26
+ node_major_minor_patch[2] == gem_major_minor_patch[2]
27
+
28
+ uses_wildcard = node_package_version.semver_wildcard?
29
+
30
+ if !Webpacker.config.ensure_consistent_versioning? && (uses_wildcard || !versions_match)
31
+ check_failed = if uses_wildcard
32
+ "Semver wildcard detected"
33
+ else
34
+ "Version mismatch detected"
35
+ end
36
+
37
+ warn <<-MSG.strip_heredoc
38
+ Webpacker::VersionChecker - #{check_failed}
39
+
40
+ You are currently not checking for consistent versions of shakapacker gem and npm package. A version mismatch or usage of semantic versioning wildcard (~ or ^) has been detected.
41
+
42
+ Version mismatch can lead to incorrect behavior and bugs. You should ensure that both the gem and npm package dependencies are locked to the same version.
43
+
44
+ You can enable the version check by setting `ensure_consistent_versioning: true` in your `webpacker.yml` file.
45
+
46
+ Checking for gem and npm package versions mismatch or wildcard will be enabled by default in the next major version of shakapacker.
47
+ MSG
48
+
49
+ return
50
+ end
51
+
52
+ raise_differing_versions_warning unless versions_match
53
+
54
+ raise_node_semver_version_warning if uses_wildcard
55
+ end
56
+
57
+ private
58
+
59
+ def common_error_msg
60
+ <<-MSG.strip_heredoc
61
+ Detected: #{node_package_version.raw}
62
+ gem: #{gem_version}
63
+ Ensure the installed version of the gem is the same as the version of
64
+ your installed node package. Do not use >= or ~> in your Gemfile for shakapacker.
65
+ Do not use ^ or ~ in your package.json for shakapacker.
66
+ Run `yarn add shakapacker --exact` in the directory containing folder node_modules.
67
+ MSG
68
+ end
69
+
70
+ def raise_differing_versions_warning
71
+ msg = "**ERROR** Webpacker: Webpacker gem and node package versions do not match\n#{common_error_msg}"
72
+ raise msg
73
+ end
74
+
75
+ def raise_node_semver_version_warning
76
+ msg = "**ERROR** Webpacker: Your node package version for shakapacker contains a "\
77
+ "^ or ~\n#{common_error_msg}"
78
+ raise msg
79
+ end
80
+
81
+ def gem_version
82
+ Webpacker::VERSION
83
+ end
84
+
85
+ def gem_major_minor_patch_version
86
+ match = gem_version.match(MAJOR_MINOR_PATCH_VERSION_REGEX)
87
+ [match[1], match[2], match[3]]
88
+ end
89
+
90
+ class NodePackageVersion
91
+ attr_reader :package_json
92
+
93
+ def self.build
94
+ new(package_json_path)
95
+ end
96
+
97
+ def self.package_json_path
98
+ Rails.root.join("package.json")
99
+ end
100
+
101
+ def initialize(package_json)
102
+ @package_json = package_json
103
+ end
104
+
105
+ def raw
106
+ parsed_package_contents = JSON.parse(package_json_contents)
107
+ parsed_package_contents.dig("dependencies", "shakapacker").to_s
108
+ end
109
+
110
+ def semver_wildcard?
111
+ raw.match(/[~^]/).present?
112
+ end
113
+
114
+ def skip_processing?
115
+ !package_specified? || relative_path? || git_url? || github_url?
116
+ end
117
+
118
+ def major_minor_patch
119
+ return if skip_processing?
120
+
121
+ match = raw.match(MAJOR_MINOR_PATCH_VERSION_REGEX)
122
+ unless match
123
+ raise "Cannot parse version number '#{raw}' (wildcard versions are not supported)"
124
+ end
125
+
126
+ [match[1], match[2], match[3]]
127
+ end
128
+
129
+ private
130
+
131
+ def package_specified?
132
+ raw.present?
133
+ end
134
+
135
+ def relative_path?
136
+ raw.match(%r{(\.\.|\Afile:///)}).present?
137
+ end
138
+
139
+ def git_url?
140
+ raw.match(%r{^git}).present?
141
+ end
142
+
143
+ def github_url?
144
+ raw.match(%r{^([\w-]+\/[\w-]+)}).present?
145
+ end
146
+
147
+ def package_json_contents
148
+ @package_json_contents ||= File.read(package_json)
149
+ end
150
+ end
151
+ end
152
+ end
@@ -1,6 +1,7 @@
1
1
  /* global test expect, describe */
2
2
 
3
3
  const { chdirCwd, chdirTestApp, resetEnv } = require('../utils/helpers')
4
+ const { resolve } = require('path')
4
5
 
5
6
  chdirTestApp()
6
7
 
@@ -31,4 +32,14 @@ describe('Config', () => {
31
32
  'app/elm'
32
33
  ])
33
34
  })
35
+
36
+ test('should default manifestPath to the public dir', () => {
37
+ expect(config.manifestPath).toEqual(resolve('public/packs/manifest.json'))
38
+ })
39
+
40
+ test('should allow overriding manifestPath', () => {
41
+ process.env.WEBPACKER_CONFIG = 'config/webpacker_manifest_path.yml'
42
+ const config = require('../config')
43
+ expect(config.manifestPath).toEqual(resolve('app/packs/manifest.json'))
44
+ })
34
45
  })
data/package/config.js CHANGED
@@ -29,4 +29,10 @@ const getPublicPath = () => {
29
29
  config.publicPath = getPublicPath()
30
30
  config.publicPathWithoutCDN = `/${config.public_output_path}/`
31
31
 
32
+ if (config.manifest_path) {
33
+ config.manifestPath = resolve(config.manifest_path)
34
+ } else {
35
+ config.manifestPath = resolve(config.outputPath, 'manifest.json')
36
+ }
37
+
32
38
  module.exports = config
@@ -54,7 +54,7 @@ const getPlugins = () => {
54
54
  new WebpackAssetsManifest({
55
55
  entrypoints: true,
56
56
  writeToDisk: true,
57
- output: 'manifest.json',
57
+ output: config.manifestPath,
58
58
  entrypointsUseAssets: true,
59
59
  publicPath: true
60
60
  })
@@ -2,6 +2,6 @@ const { runningWebpackDevServer } = require('./env')
2
2
  const devServer = require('./dev_server')
3
3
 
4
4
  // This logic is tied to lib/webpacker/instance.rb
5
- const inliningCss = runningWebpackDevServer && devServer.hmr
5
+ const inliningCss = runningWebpackDevServer && devServer.hmr && devServer.inline_css !== false
6
6
 
7
7
  module.exports = inliningCss
@@ -0,0 +1,35 @@
1
+ const file = require('../file')
2
+
3
+ describe('file', () => {
4
+ test('test expected file types', () => {
5
+ const types = [
6
+ '.bmp',
7
+ '.gif',
8
+ '.jpg',
9
+ '.jpeg',
10
+ '.png',
11
+ '.tiff',
12
+ '.ico',
13
+ '.avif',
14
+ '.webp',
15
+ '.eot',
16
+ '.otf',
17
+ '.ttf',
18
+ '.woff',
19
+ '.woff2',
20
+ '.svg',
21
+ ]
22
+ types.forEach(type => expect(file.test.test(type)).toBe(true))
23
+ })
24
+
25
+ test('exclude expected file types', () => {
26
+ const types = [
27
+ '.js',
28
+ '.mjs',
29
+ '.jsx',
30
+ '.ts',
31
+ '.tsx',
32
+ ]
33
+ types.forEach(type => expect(file.exclude.test(type)).toBe(true))
34
+ })
35
+ })
@@ -0,0 +1,11 @@
1
+ const rules = require('../index')
2
+
3
+ describe('index', () => {
4
+ test('rule tests are regexes', () => {
5
+ rules.forEach(rule => expect(rule.test instanceof RegExp).toBe(true))
6
+ })
7
+
8
+ test('rule excludes are regexes', () => {
9
+ rules.forEach(rule => expect(rule.exclude instanceof RegExp).toBe(true))
10
+ })
11
+ })
@@ -0,0 +1,18 @@
1
+ const raw = require('../raw')
2
+
3
+ describe('raw', () => {
4
+ test('test expected file types', () => {
5
+ expect(raw.test.test('.html')).toBe(true)
6
+ })
7
+
8
+ test('exclude expected file types', () => {
9
+ const types = [
10
+ '.js',
11
+ '.mjs',
12
+ '.jsx',
13
+ '.ts',
14
+ '.tsx',
15
+ ]
16
+ types.forEach(type => expect(raw.exclude.test(type)).toBe(true))
17
+ })
18
+ })
@@ -2,23 +2,8 @@ const { dirname, join } = require('path')
2
2
  const { source_path: sourcePath } = require('../config')
3
3
 
4
4
  module.exports = {
5
- test: [
6
- /\.bmp$/,
7
- /\.gif$/,
8
- /\.jpe?g$/,
9
- /\.png$/,
10
- /\.tiff$/,
11
- /\.ico$/,
12
- /\.avif$/,
13
- /\.webp$/,
14
- /\.eot$/,
15
- /\.otf$/,
16
- /\.ttf$/,
17
- /\.woff$/,
18
- /\.woff2$/,
19
- /\.svg$/
20
- ],
21
- exclude: [/\.(js|mjs|jsx|ts|tsx)$/],
5
+ test: /\.(bmp|gif|jpe?g|png|tiff|ico|avif|webp|eot|otf|ttf|woff|woff2|svg)$/,
6
+ exclude: /\.(js|mjs|jsx|ts|tsx)$/,
22
7
  type: 'asset/resource',
23
8
  generator: {
24
9
  filename: (pathData) => {
data/package/rules/raw.js CHANGED
@@ -1,5 +1,5 @@
1
1
  module.exports = {
2
- test: [/\.html$/],
3
- exclude: [/\.(js|mjs|jsx|ts|tsx)$/],
2
+ test: /\.html$/,
3
+ exclude: /\.(js|mjs|jsx|ts|tsx)$/,
4
4
  type: 'asset/source'
5
5
  }
data/package/swc/index.js CHANGED
@@ -30,12 +30,12 @@ const getSwcLoaderConfig = (filenameToProcess) => {
30
30
  : 'ecmascript',
31
31
  [isTypescriptFile(filenameToProcess) ? 'tsx' : 'jsx']:
32
32
  isJsxFile(filenameToProcess)
33
- }
33
+ },
34
+ loose: true
34
35
  },
35
36
  sourceMaps: true,
36
37
  env: {
37
- coreJs: '3.8',
38
- loose: true,
38
+ coreJs: 3,
39
39
  exclude: ['transform-typeof-symbol'],
40
40
  mode: 'entry'
41
41
  }
data/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "shakapacker",
3
- "version": "6.1.1",
3
+ "version": "6.2.0",
4
4
  "description": "Use webpack to manage app-like JavaScript modules in Rails",
5
5
  "main": "package/index.js",
6
6
  "files": [
@@ -38,9 +38,18 @@ class ConfigurationTest < Webpacker::Test
38
38
  assert_equal @config.public_output_path.to_s, public_output_path
39
39
  end
40
40
 
41
- def test_public_manifest_path
42
- public_manifest_path = File.expand_path File.join(File.dirname(__FILE__), "test_app/public/packs", "manifest.json").to_s
43
- assert_equal @config.public_manifest_path.to_s, public_manifest_path
41
+ def test_manifest_path
42
+ manifest_path = File.expand_path File.join(File.dirname(__FILE__), "test_app/public/packs", "manifest.json").to_s
43
+ assert_equal @config.manifest_path.to_s, manifest_path
44
+
45
+ @config = Webpacker::Configuration.new(
46
+ root_path: @config.root_path,
47
+ config_path: Pathname.new(File.expand_path("./test_app/config/webpacker_manifest_path.yml", __dir__)),
48
+ env: "production"
49
+ )
50
+
51
+ manifest_path = File.expand_path File.join(File.dirname(__FILE__), "test_app/app/packs", "manifest.json").to_s
52
+ assert_equal @config.manifest_path.to_s, manifest_path
44
53
  end
45
54
 
46
55
  def test_cache_path
@@ -75,4 +84,16 @@ class ConfigurationTest < Webpacker::Test
75
84
  assert Webpacker.config.compile?
76
85
  end
77
86
  end
87
+
88
+ def test_ensure_consistent_versioning?
89
+ refute @config.ensure_consistent_versioning?
90
+
91
+ with_rails_env("development") do
92
+ assert Webpacker.config.ensure_consistent_versioning?
93
+ end
94
+
95
+ with_rails_env("test") do
96
+ refute Webpacker.config.ensure_consistent_versioning?
97
+ end
98
+ end
78
99
  end
@@ -0,0 +1,13 @@
1
+ {
2
+ "name": "test_app",
3
+ "version": "1.0.0",
4
+ "main": "index.js",
5
+ "license": "MIT",
6
+ "private": true,
7
+ "dependencies": {
8
+ "shakapacker": "6.0.0-beta.1"
9
+ },
10
+ "devDependencies": {
11
+ "right-pad": "^1.0.1"
12
+ }
13
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "name": "test_app",
3
+ "version": "1.0.0",
4
+ "main": "index.js",
5
+ "license": "MIT",
6
+ "private": true,
7
+ "dependencies": {
8
+ "shakapacker": "git://github.com/shakapacker/shakapacker.git"
9
+ },
10
+ "devDependencies": {
11
+ "right-pad": "^1.0.1"
12
+ }
13
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "name": "test_app",
3
+ "version": "1.0.0",
4
+ "main": "index.js",
5
+ "license": "MIT",
6
+ "private": true,
7
+ "dependencies": {
8
+ "shakapacker": "shakapacker/shakapacker#feature\/branch"
9
+ },
10
+ "devDependencies": {
11
+ "right-pad": "^1.0.1"
12
+ }
13
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "name": "test_app",
3
+ "version": "1.0.0",
4
+ "main": "index.js",
5
+ "license": "MIT",
6
+ "private": true,
7
+ "dependencies": {
8
+ "shakapacker": "6.0.0"
9
+ },
10
+ "devDependencies": {
11
+ "right-pad": "^1.0.1"
12
+ }
13
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "name": "test_app",
3
+ "version": "1.0.0",
4
+ "main": "index.js",
5
+ "license": "MIT",
6
+ "private": true,
7
+ "dependencies": {
8
+ "shakapacker": "../shakapacker"
9
+ },
10
+ "devDependencies": {
11
+ "right-pad": "^1.0.1"
12
+ }
13
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "name": "test_app",
3
+ "version": "1.0.0",
4
+ "main": "index.js",
5
+ "license": "MIT",
6
+ "private": true,
7
+ "dependencies": {
8
+ "shakapacker": "^6.0.0"
9
+ },
10
+ "devDependencies": {
11
+ "right-pad": "^1.0.1"
12
+ }
13
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "name": "test_app",
3
+ "version": "1.0.0",
4
+ "main": "index.js",
5
+ "license": "MIT",
6
+ "private": true,
7
+ "dependencies": {
8
+ "shakapacker": "~6.0.0"
9
+ },
10
+ "devDependencies": {
11
+ "right-pad": "^1.0.1"
12
+ }
13
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "name": "test_app",
3
+ "version": "1.0.0",
4
+ "main": "index.js",
5
+ "license": "MIT",
6
+ "private": true,
7
+ "dependencies": {
8
+ "left-pad": "1.0.2"
9
+ },
10
+ "devDependencies": {
11
+ "right-pad": "^1.0.1"
12
+ }
13
+ }
data/test/helper_test.rb CHANGED
@@ -14,7 +14,6 @@ class HelperTest < ActionView::TestCase
14
14
  end.new
15
15
 
16
16
  @javascript_pack_tag_loaded = nil
17
- @stylesheet_pack_tag_loaded = nil
18
17
  end
19
18
 
20
19
  def test_asset_pack_path
@@ -149,19 +148,19 @@ class HelperTest < ActionView::TestCase
149
148
  end
150
149
 
151
150
  def hello_stimulus_stylesheet_chunks
152
- %w[/packs/hello_stimulus-k344a6d59eef8632c9d1.chunk.css]
151
+ %w[/packs/1-c20632e7baf2c81200d3.chunk.css /packs/hello_stimulus-k344a6d59eef8632c9d1.chunk.css]
153
152
  end
154
153
 
155
154
  def test_stylesheet_pack_tag
156
155
  assert_equal \
157
- (application_stylesheet_chunks + hello_stimulus_stylesheet_chunks)
156
+ (application_stylesheet_chunks + hello_stimulus_stylesheet_chunks).uniq
158
157
  .map { |chunk| stylesheet_link_tag(chunk) }.join("\n"),
159
158
  stylesheet_pack_tag("application", "hello_stimulus")
160
159
  end
161
160
 
162
161
  def test_stylesheet_pack_tag_symbol
163
162
  assert_equal \
164
- (application_stylesheet_chunks + hello_stimulus_stylesheet_chunks)
163
+ (application_stylesheet_chunks + hello_stimulus_stylesheet_chunks).uniq
165
164
  .map { |chunk| stylesheet_link_tag(chunk) }.join("\n"),
166
165
  stylesheet_pack_tag(:application, :hello_stimulus)
167
166
  end
@@ -172,15 +171,16 @@ class HelperTest < ActionView::TestCase
172
171
  stylesheet_pack_tag("application", media: "all")
173
172
  end
174
173
 
175
- def test_stylesheet_pack_tag_multiple_invocations
176
- error = assert_raises do
177
- stylesheet_pack_tag(:application)
178
- stylesheet_pack_tag(:hello_stimulus)
179
- end
174
+ def test_stylesheet_pack_tag_multiple_invocations_are_allowed
175
+ app_style = stylesheet_pack_tag(:application)
176
+ stimulus_style = stylesheet_pack_tag(:hello_stimulus)
180
177
 
181
178
  assert_equal \
182
- "To prevent duplicated chunks on the page, you should call stylesheet_pack_tag only once on the page. " +
183
- "Please refer to https://github.com/shakacode/shakapacker/blob/master/README.md#usage for the usage guide",
184
- error.message
179
+ application_stylesheet_chunks.map { |chunk| stylesheet_link_tag(chunk) }.join("\n"),
180
+ app_style
181
+
182
+ assert_equal \
183
+ hello_stimulus_stylesheet_chunks.map { |chunk| stylesheet_link_tag(chunk) }.join("\n"),
184
+ stimulus_style
185
185
  end
186
186
  end
@@ -9,6 +9,9 @@ default: &default
9
9
  webpack_compile_output: false
10
10
  webpack_loader: babel
11
11
 
12
+ # Location for manifest.json, defaults to {public_output_path}/manifest.json if unset
13
+ # manifest_path: public/packs/manifest.json
14
+
12
15
  # Additional paths webpack should look up modules
13
16
  # ['app/assets', 'engine/foo/app/assets']
14
17
  additional_paths:
@@ -36,6 +39,7 @@ default: &default
36
39
  development:
37
40
  <<: *default
38
41
  compile: true
42
+ ensure_consistent_versioning: true
39
43
 
40
44
  # Reference: https://webpack.js.org/configuration/dev-server/
41
45
  dev_server: