webpacker 4.0.7 → 4.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (76) hide show
  1. checksums.yaml +4 -4
  2. data/.node-version +1 -1
  3. data/.rubocop.yml +2 -1
  4. data/.travis.yml +7 -4
  5. data/CHANGELOG.md +212 -137
  6. data/Gemfile.lock +78 -59
  7. data/README.md +110 -3
  8. data/docs/css.md +12 -0
  9. data/docs/deployment.md +38 -9
  10. data/docs/docker.md +25 -6
  11. data/docs/engines.md +40 -3
  12. data/docs/es6.md +19 -1
  13. data/docs/troubleshooting.md +37 -9
  14. data/docs/typescript.md +8 -5
  15. data/docs/webpack-dev-server.md +1 -1
  16. data/docs/webpack.md +18 -3
  17. data/gemfiles/Gemfile-rails.6.0.x +9 -0
  18. data/lib/install/bin/webpack +0 -1
  19. data/lib/install/bin/webpack-dev-server +0 -1
  20. data/lib/install/coffee.rb +1 -1
  21. data/lib/install/config/babel.config.js +10 -10
  22. data/lib/install/config/webpacker.yml +2 -1
  23. data/lib/install/elm.rb +1 -1
  24. data/lib/install/erb.rb +2 -2
  25. data/lib/install/examples/angular/hello_angular/polyfills.ts +2 -2
  26. data/lib/install/examples/react/babel.config.js +16 -14
  27. data/lib/install/examples/svelte/app.svelte +11 -0
  28. data/lib/install/examples/svelte/hello_svelte.js +20 -0
  29. data/lib/install/loaders/elm.js +9 -6
  30. data/lib/install/loaders/svelte.js +9 -0
  31. data/lib/install/loaders/typescript.js +1 -1
  32. data/lib/install/svelte.rb +29 -0
  33. data/lib/install/typescript.rb +1 -1
  34. data/lib/install/vue.rb +1 -1
  35. data/lib/tasks/installers.rake +1 -0
  36. data/lib/tasks/webpacker.rake +2 -0
  37. data/lib/tasks/webpacker/clean.rake +15 -0
  38. data/lib/tasks/webpacker/compile.rake +1 -1
  39. data/lib/tasks/webpacker/yarn_install.rake +15 -0
  40. data/lib/webpacker.rb +1 -1
  41. data/lib/webpacker/commands.rb +26 -0
  42. data/lib/webpacker/compiler.rb +15 -8
  43. data/lib/webpacker/configuration.rb +9 -1
  44. data/lib/webpacker/dev_server.rb +1 -1
  45. data/lib/webpacker/dev_server_proxy.rb +2 -8
  46. data/lib/webpacker/helper.rb +39 -13
  47. data/lib/webpacker/railtie.rb +4 -0
  48. data/lib/webpacker/version.rb +1 -1
  49. data/package.json +36 -36
  50. data/package/__tests__/config.js +0 -23
  51. data/package/config.js +2 -10
  52. data/package/config_types/config_list.js +3 -3
  53. data/package/config_types/config_object.js +1 -1
  54. data/package/environments/base.js +2 -2
  55. data/package/environments/development.js +1 -1
  56. data/package/environments/production.js +12 -0
  57. data/package/rules/babel.js +1 -1
  58. data/package/rules/node_modules.js +2 -2
  59. data/package/rules/sass.js +1 -1
  60. data/package/utils/__tests__/get_style_rule.js +9 -0
  61. data/package/utils/deep_merge.js +5 -5
  62. data/package/utils/get_style_rule.js +7 -12
  63. data/package/utils/helpers.js +9 -9
  64. data/test/command_test.rb +6 -0
  65. data/test/compiler_test.rb +5 -6
  66. data/test/configuration_test.rb +36 -27
  67. data/test/dev_server_test.rb +22 -0
  68. data/test/helper_test.rb +34 -0
  69. data/test/rake_tasks_test.rb +6 -0
  70. data/test/test_app/bin/webpack +0 -1
  71. data/test/test_app/bin/webpack-dev-server +0 -1
  72. data/test/test_app/config/webpacker.yml +1 -0
  73. data/test/test_app/public/packs/manifest.json +3 -0
  74. data/webpacker.gemspec +1 -0
  75. data/yarn.lock +1934 -1634
  76. metadata +24 -4
@@ -1,13 +1,13 @@
1
1
  module Webpacker::Helper
2
- # Returns current Webpacker instance.
2
+ # Returns the current Webpacker instance.
3
3
  # Could be overridden to use multiple Webpacker
4
- # configurations within the same app (e.g. with engines)
4
+ # configurations within the same app (e.g. with engines).
5
5
  def current_webpacker_instance
6
6
  Webpacker.instance
7
7
  end
8
8
 
9
9
  # Computes the relative path for a given Webpacker asset.
10
- # Return relative path using manifest.json and passes it to asset_path helper.
10
+ # Returns the relative path using manifest.json and passes it to asset_path helper.
11
11
  # This will use asset_path internally, so most of their behaviors will be the same.
12
12
  #
13
13
  # Example:
@@ -19,12 +19,12 @@ module Webpacker::Helper
19
19
  # <%= asset_pack_path 'calendar.css' %> # => "/packs/calendar-1016838bab065ae1e122.css"
20
20
  def asset_pack_path(name, **options)
21
21
  if current_webpacker_instance.config.extract_css? || !stylesheet?(name)
22
- asset_path(current_webpacker_instance.manifest.lookup!(name), **options)
22
+ asset_path(current_webpacker_instance.manifest.lookup!(name), options)
23
23
  end
24
24
  end
25
25
 
26
26
  # Computes the absolute path for a given Webpacker asset.
27
- # Return absolute path using manifest.json and passes it to asset_url helper.
27
+ # Returns the absolute path using manifest.json and passes it to asset_url helper.
28
28
  # This will use asset_url internally, so most of their behaviors will be the same.
29
29
  #
30
30
  # Example:
@@ -36,18 +36,28 @@ module Webpacker::Helper
36
36
  # <%= asset_pack_url 'calendar.css' %> # => "http://example.com/packs/calendar-1016838bab065ae1e122.css"
37
37
  def asset_pack_url(name, **options)
38
38
  if current_webpacker_instance.config.extract_css? || !stylesheet?(name)
39
- asset_url(current_webpacker_instance.manifest.lookup!(name), **options)
39
+ asset_url(current_webpacker_instance.manifest.lookup!(name), options)
40
40
  end
41
41
  end
42
42
 
43
- # Creates a image tag that references the named pack file.
43
+ # Creates an image tag that references the named pack file.
44
44
  #
45
45
  # Example:
46
46
  #
47
47
  # <%= image_pack_tag 'application.png', size: '16x10', alt: 'Edit Entry' %>
48
48
  # <img alt='Edit Entry' src='/packs/application-k344a6d59eef8632c9d1.png' width='16' height='10' />
49
49
  def image_pack_tag(name, **options)
50
- image_tag(resolve_path_to_image(name), **options)
50
+ image_tag(resolve_path_to_image(name), options)
51
+ end
52
+
53
+ # Creates a link tag for a favicon that references the named pack file.
54
+ #
55
+ # Example:
56
+ #
57
+ # <%= favicon_pack_tag 'mb-icon.png', rel: 'apple-touch-icon', type: 'image/png' %>
58
+ # <link href="/packs/mb-icon-k344a6d59eef8632c9d1.png" rel="apple-touch-icon" type="image/png" />
59
+ def favicon_pack_tag(name, **options)
60
+ favicon_link_tag(resolve_path_to_image(name), options)
51
61
  end
52
62
 
53
63
  # Creates a script tag that references the named pack file, as compiled by webpack per the entries list
@@ -62,7 +72,7 @@ module Webpacker::Helper
62
72
  javascript_include_tag(*sources_from_manifest_entries(names, type: :javascript), **options)
63
73
  end
64
74
 
65
- # Creates script tags that references the js chunks from entrypoints when using split chunks API,
75
+ # Creates script tags that reference the js chunks from entrypoints when using split chunks API,
66
76
  # as compiled by webpack per the entries list in config/webpack/shared.js.
67
77
  # By default, this list is auto-generated to match everything in
68
78
  # app/javascript/packs/*.js and all the dependent chunks. In production mode, the digested reference is automatically looked up.
@@ -78,12 +88,27 @@ module Webpacker::Helper
78
88
  # DO:
79
89
  # <%= javascript_packs_with_chunks_tag 'calendar', 'map' %>
80
90
  # DON'T:
81
- # <%= javascript_packs_with_chunks_tag 'calendar' %>
91
+ # <%= javascript_packs_with_chunks_tag 'calendar' %>
82
92
  # <%= javascript_packs_with_chunks_tag 'map' %>
83
93
  def javascript_packs_with_chunks_tag(*names, **options)
84
94
  javascript_include_tag(*sources_from_manifest_entrypoints(names, type: :javascript), **options)
85
95
  end
86
96
 
97
+ # Creates a link tag, for preloading, that references a given Webpacker asset.
98
+ # In production mode, the digested reference is automatically looked up.
99
+ # See: https://developer.mozilla.org/en-US/docs/Web/HTML/Preloading_content
100
+ # Example:
101
+ #
102
+ # <%= preload_pack_asset 'fonts/fa-regular-400.woff2' %> # =>
103
+ # <link rel="preload" href="/packs/fonts/fa-regular-400-944fb546bd7018b07190a32244f67dc9.woff2" as="font" type="font/woff2" crossorigin="anonymous">
104
+ def preload_pack_asset(name, **options)
105
+ if self.class.method_defined?(:preload_link_tag)
106
+ preload_link_tag(current_webpacker_instance.manifest.lookup!(name), options)
107
+ else
108
+ raise "You need Rails >= 5.2 to use this tag."
109
+ end
110
+ end
111
+
87
112
  # Creates a link tag that references the named pack file, as compiled by webpack per the entries list
88
113
  # in config/webpack/shared.js. By default, this list is auto-generated to match everything in
89
114
  # app/javascript/packs/*.js. In production mode, the digested reference is automatically looked up.
@@ -106,12 +131,13 @@ module Webpacker::Helper
106
131
  end
107
132
  end
108
133
 
109
- # Creates link tags that references the css chunks from entrypoints when using split chunks API,
134
+ # Creates link tags that reference the css chunks from entrypoints when using split chunks API,
110
135
  # as compiled by webpack per the entries list in config/webpack/shared.js.
111
136
  # By default, this list is auto-generated to match everything in
112
137
  # app/javascript/packs/*.js and all the dependent chunks. In production mode, the digested reference is automatically looked up.
113
138
  # See: https://webpack.js.org/plugins/split-chunks-plugin/
114
- # Example:
139
+ #
140
+ # Examples:
115
141
  #
116
142
  # <%= stylesheet_packs_with_chunks_tag 'calendar', 'map' %> # =>
117
143
  # <link rel="stylesheet" media="screen" href="/packs/3-8c7ce31a.chunk.css" />
@@ -120,7 +146,7 @@ module Webpacker::Helper
120
146
  # DO:
121
147
  # <%= stylesheet_packs_with_chunks_tag 'calendar', 'map' %>
122
148
  # DON'T:
123
- # <%= stylesheet_packs_with_chunks_tag 'calendar' %>
149
+ # <%= stylesheet_packs_with_chunks_tag 'calendar' %>
124
150
  # <%= stylesheet_packs_with_chunks_tag 'map' %>
125
151
  def stylesheet_packs_with_chunks_tag(*names, **options)
126
152
  if current_webpacker_instance.config.extract_css?
@@ -89,4 +89,8 @@ class Webpacker::Engine < ::Rails::Engine
89
89
  end
90
90
  end
91
91
  end
92
+
93
+ initializer "webpacker.set_source" do |app|
94
+ app.config.javascript_path = Webpacker.config.source_path.relative_path_from(Rails.root.join("app")).to_s
95
+ end
92
96
  end
@@ -1,4 +1,4 @@
1
1
  module Webpacker
2
2
  # Change the version in package.json too, please!
3
- VERSION = "4.0.7".freeze
3
+ VERSION = "4.1.0".freeze
4
4
  end
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rails/webpacker",
3
- "version": "4.0.7",
3
+ "version": "4.1.0",
4
4
  "description": "Use webpack to manage app-like JavaScript modules in Rails",
5
5
  "main": "package/index.js",
6
6
  "files": [
@@ -8,56 +8,56 @@
8
8
  "lib/install/config/webpacker.yml"
9
9
  ],
10
10
  "engines": {
11
- "node": ">=6.14.4",
11
+ "node": ">=8.16.0",
12
12
  "yarn": ">=1.0.0"
13
13
  },
14
14
  "dependencies": {
15
- "@babel/core": "^7.4.5",
16
- "@babel/plugin-proposal-class-properties": "^7.4.4",
17
- "@babel/plugin-proposal-object-rest-spread": "^7.4.4",
15
+ "@babel/core": "^7.7.2",
16
+ "@babel/plugin-proposal-class-properties": "^7.7.0",
17
+ "@babel/plugin-proposal-object-rest-spread": "^7.6.2",
18
18
  "@babel/plugin-syntax-dynamic-import": "^7.2.0",
19
- "@babel/plugin-transform-destructuring": "^7.4.4",
20
- "@babel/plugin-transform-regenerator": "^7.4.5",
21
- "@babel/plugin-transform-runtime": "^7.4.4",
22
- "@babel/preset-env": "^7.4.5",
23
- "@babel/runtime": "^7.4.5",
19
+ "@babel/plugin-transform-destructuring": "^7.6.0",
20
+ "@babel/plugin-transform-regenerator": "^7.7.0",
21
+ "@babel/plugin-transform-runtime": "^7.6.2",
22
+ "@babel/preset-env": "^7.7.1",
23
+ "@babel/runtime": "^7.7.2",
24
24
  "babel-loader": "^8.0.6",
25
- "babel-plugin-dynamic-import-node": "^2.2.0",
26
- "babel-plugin-macros": "^2.5.0",
25
+ "babel-plugin-dynamic-import-node": "^2.3.0",
26
+ "babel-plugin-macros": "^2.6.1",
27
27
  "case-sensitive-paths-webpack-plugin": "^2.2.0",
28
- "compression-webpack-plugin": "^2.0.0",
29
- "core-js": "^3.1.3",
30
- "css-loader": "^2.1.1",
31
- "file-loader": "^3.0.1",
32
- "flatted": "^2.0.0",
33
- "glob": "^7.1.4",
28
+ "compression-webpack-plugin": "^3.0.0",
29
+ "core-js": "^3.4.0",
30
+ "css-loader": "^3.2.0",
31
+ "file-loader": "^4.2.0",
32
+ "flatted": "^2.0.1",
33
+ "glob": "^7.1.6",
34
34
  "js-yaml": "^3.13.1",
35
- "mini-css-extract-plugin": "^0.7.0",
36
- "node-sass": "^4.12.0",
37
- "optimize-css-assets-webpack-plugin": "^5.0.1",
35
+ "mini-css-extract-plugin": "^0.8.0",
36
+ "node-sass": "^4.13.0",
37
+ "optimize-css-assets-webpack-plugin": "^5.0.3",
38
38
  "path-complete-extname": "^1.0.0",
39
- "pnp-webpack-plugin": "^1.4.3",
39
+ "pnp-webpack-plugin": "^1.5.0",
40
40
  "postcss-flexbugs-fixes": "^4.1.0",
41
41
  "postcss-import": "^12.0.1",
42
42
  "postcss-loader": "^3.0.0",
43
- "postcss-preset-env": "^6.6.0",
43
+ "postcss-preset-env": "^6.7.0",
44
44
  "postcss-safe-parser": "^4.0.1",
45
- "regenerator-runtime": "^0.13.2",
46
- "sass-loader": "^7.1.0",
47
- "style-loader": "^0.23.1",
48
- "terser-webpack-plugin": "^1.3.0",
49
- "webpack": "^4.32.2",
45
+ "regenerator-runtime": "^0.13.3",
46
+ "sass-loader": "7.3.1",
47
+ "style-loader": "^1.0.0",
48
+ "terser-webpack-plugin": "^2.2.1",
49
+ "webpack": "^4.41.2",
50
50
  "webpack-assets-manifest": "^3.1.1",
51
- "webpack-cli": "^3.3.2",
52
- "webpack-sources": "^1.3.0"
51
+ "webpack-cli": "^3.3.10",
52
+ "webpack-sources": "^1.4.3"
53
53
  },
54
54
  "devDependencies": {
55
- "eslint": "^5.16.0",
56
- "eslint-config-airbnb": "^17.1.0",
57
- "eslint-plugin-import": "^2.17.3",
58
- "eslint-plugin-jsx-a11y": "^6.2.1",
59
- "eslint-plugin-react": "^7.13.0",
60
- "jest": "^24.8.0"
55
+ "eslint": "^6.6.0",
56
+ "eslint-config-airbnb": "^18.0.1",
57
+ "eslint-plugin-import": "^2.18.2",
58
+ "eslint-plugin-jsx-a11y": "^6.2.3",
59
+ "eslint-plugin-react": "^7.16.0",
60
+ "jest": "^24.9.0"
61
61
  },
62
62
  "jest": {
63
63
  "testRegex": "(/__tests__/.*|(\\.|/))\\.jsx?$",
@@ -16,29 +16,6 @@ describe('Config', () => {
16
16
  expect(config.publicPath).toEqual('/packs/')
17
17
  })
18
18
 
19
- // also tests removal of extra slashes
20
- test('public path with relative root', () => {
21
- process.env.RAILS_ENV = 'development'
22
- process.env.RAILS_RELATIVE_URL_ROOT = '/foo'
23
- const config = require('../config')
24
- expect(config.publicPath).toEqual('/foo/packs/')
25
- })
26
-
27
- test('public path with relative root without slash', () => {
28
- process.env.RAILS_ENV = 'development'
29
- process.env.RAILS_RELATIVE_URL_ROOT = 'foo'
30
- const config = require('../config')
31
- expect(config.publicPath).toEqual('/foo/packs/')
32
- })
33
-
34
- test('public path with asset host and relative root', () => {
35
- process.env.RAILS_ENV = 'development'
36
- process.env.RAILS_RELATIVE_URL_ROOT = '/foo/'
37
- process.env.WEBPACKER_ASSET_HOST = 'http://foo.com/'
38
- const config = require('../config')
39
- expect(config.publicPath).toEqual('http://foo.com/foo/packs/')
40
- })
41
-
42
19
  test('public path with asset host', () => {
43
20
  process.env.RAILS_ENV = 'development'
44
21
  process.env.WEBPACKER_ASSET_HOST = 'http://foo.com/'
@@ -27,16 +27,8 @@ config.outputPath = resolve(config.public_root_path, config.public_output_path)
27
27
  // Ensure that the publicPath includes our asset host so dynamic imports
28
28
  // (code-splitting chunks and static assets) load from the CDN instead of a relative path.
29
29
  const getPublicPath = () => {
30
- const rootUrl = process.env.WEBPACKER_ASSET_HOST || '/'
31
- let packPath = `${config.public_output_path}/`
32
- // Add relative root prefix to pack path.
33
- if (process.env.RAILS_RELATIVE_URL_ROOT) {
34
- let relativeRoot = process.env.RAILS_RELATIVE_URL_ROOT
35
- relativeRoot = relativeRoot.startsWith('/') ? relativeRoot.substr(1) : relativeRoot
36
- packPath = `${ensureTrailingSlash(relativeRoot)}${packPath}`
37
- }
38
-
39
- return ensureTrailingSlash(rootUrl) + packPath
30
+ const rootUrl = ensureTrailingSlash(process.env.WEBPACKER_ASSET_HOST || '/')
31
+ return `${rootUrl}${config.public_output_path}/`
40
32
  }
41
33
 
42
34
  config.publicPath = getPublicPath()
@@ -38,7 +38,7 @@ class ConfigList extends Array {
38
38
  }
39
39
 
40
40
  getIndex(key, shouldThrow = false) {
41
- const index = this.findIndex(entry => (
41
+ const index = this.findIndex((entry) => (
42
42
  entry === key
43
43
  || entry.key === key
44
44
  || (entry.constructor && entry.constructor.name === key)
@@ -64,11 +64,11 @@ class ConfigList extends Array {
64
64
  }
65
65
 
66
66
  values() {
67
- return this.map(item => item.value)
67
+ return this.map((item) => item.value)
68
68
  }
69
69
 
70
70
  keys() {
71
- return this.map(item => item.key)
71
+ return this.map((item) => item.key)
72
72
  }
73
73
  }
74
74
 
@@ -42,7 +42,7 @@ class ConfigObject extends Object {
42
42
  toObject() {
43
43
  const object = {}
44
44
  /* eslint no-return-assign: 0 */
45
- Object.keys(this).forEach(key => (object[key] = this[key]))
45
+ Object.keys(this).forEach((key) => (object[key] = this[key]))
46
46
  return object
47
47
  }
48
48
 
@@ -22,7 +22,7 @@ const config = require('../config')
22
22
 
23
23
  const getLoaderList = () => {
24
24
  const result = new ConfigList()
25
- Object.keys(rules).forEach(key => result.append(key, rules[key]))
25
+ Object.keys(rules).forEach((key) => result.append(key, rules[key]))
26
26
  return result
27
27
  }
28
28
 
@@ -74,7 +74,7 @@ const getModulePaths = () => {
74
74
  const result = new ConfigList()
75
75
  result.append('source', resolve(config.source_path))
76
76
  if (config.resolved_paths) {
77
- config.resolved_paths.forEach(path => result.append(path, resolve(path)))
77
+ config.resolved_paths.forEach((path) => result.append(path, resolve(path)))
78
78
  }
79
79
  result.append('node_modules', 'node_modules')
80
80
  return result
@@ -40,7 +40,7 @@ module.exports = class extends Base {
40
40
  overlay: devServer.overlay,
41
41
  stats: {
42
42
  entrypoints: false,
43
- errorDetails: false,
43
+ errorDetails: true,
44
44
  modules: false,
45
45
  moduleTrace: false
46
46
  },
@@ -18,6 +18,18 @@ module.exports = class extends Base {
18
18
  })
19
19
  )
20
20
 
21
+ if ('brotli' in process.versions) {
22
+ this.plugins.append(
23
+ 'Compression Brotli',
24
+ new CompressionPlugin({
25
+ filename: '[path].br[query]',
26
+ algorithm: 'brotliCompress',
27
+ cache: true,
28
+ test: /\.(js|css|html|json|ico|svg|eot|otf|ttf|map)$/
29
+ })
30
+ )
31
+ }
32
+
21
33
  this.plugins.append(
22
34
  'OptimizeCSSAssets',
23
35
  new OptimizeCSSAssetsPlugin({
@@ -6,7 +6,7 @@ const { nodeEnv } = require('../env')
6
6
  // Uses application .babelrc to apply any transformations
7
7
  module.exports = {
8
8
  test: /\.(js|jsx|mjs)?(\.erb)?$/,
9
- include: [sourcePath, ...resolvedPaths].map(p => resolve(p)),
9
+ include: [sourcePath, ...resolvedPaths].map((p) => resolve(p)),
10
10
  exclude: /node_modules/,
11
11
  use: [
12
12
  {
@@ -3,11 +3,11 @@ const { cache_path: cachePath } = require('../config')
3
3
  const { nodeEnv } = require('../env')
4
4
 
5
5
  // Compile standard ES features for JS in node_modules with Babel.
6
- // Regex details for exclude: https://regex101.com/r/CglKdg/5/
6
+ // Regex details for exclude: https://regex101.com/r/SKPnnv/1
7
7
  module.exports = {
8
8
  test: /\.(js|mjs)$/,
9
9
  include: /node_modules/,
10
- exclude: /(?:@?babel(?:\/|\\{1,2}|-).+)|regenerator-runtime|core-js|webpack/,
10
+ exclude: /(?:@?babel(?:\/|\\{1,2}|-).+)|regenerator-runtime|core-js|^webpack$|^webpack-assets-manifest$|^webpack-cli$|^webpack-sources$|^@rails\/webpacker$/,
11
11
  use: [
12
12
  {
13
13
  loader: 'babel-loader',
@@ -1,6 +1,6 @@
1
1
  const getStyleRule = require('../utils/get_style_rule')
2
2
 
3
- module.exports = getStyleRule(/\.(scss|sass)$/i, false, [
3
+ module.exports = getStyleRule(/\.(scss|sass)(\.erb)?$/i, false, [
4
4
  {
5
5
  loader: 'sass-loader',
6
6
  options: { sourceMap: true }
@@ -44,6 +44,15 @@ describe('getStyleRule', () => {
44
44
  expect(cssRule.use).toMatchObject(expect.arrayContaining(expectation))
45
45
  })
46
46
 
47
+ test('adds style-loader when extract_css is true', () => {
48
+ const expectation = [{loader: 'style-loader'}]
49
+
50
+ require('../../config').extract_css = false
51
+ const cssRule = getStyleRule(/\.(css)$/i)
52
+
53
+ expect(cssRule.use).toMatchObject(expect.objectContaining(expectation))
54
+ })
55
+
47
56
  test(`doesn't add mini-css-extract-plugin when extract_css is false`, () => {
48
57
  const MiniCssExtractPlugin = require('mini-css-extract-plugin')
49
58
  const expectation = [MiniCssExtractPlugin.loader]
@@ -10,11 +10,11 @@ const deepMerge = (target, source) => {
10
10
  if (!(isObject(target) && isObject(source))) return source
11
11
 
12
12
  return [...Object.keys(target), ...Object.keys(source)].reduce(
13
- (result, key) => (Object.assign(
14
- {},
15
- result,
16
- { [key]: deepMerge(target[key], source[key]) }
17
- )),
13
+ (result, key) => ({
14
+
15
+ ...result,
16
+ [key]: deepMerge(target[key], source[key])
17
+ }),
18
18
  {}
19
19
  )
20
20
  }
@@ -1,17 +1,9 @@
1
1
  const MiniCssExtractPlugin = require('mini-css-extract-plugin')
2
2
  const { resolve } = require('path')
3
- const devServer = require('../dev_server')
4
3
  const config = require('../config')
5
4
 
6
- const inDevServer = process.argv.find(v => v.includes('webpack-dev-server'))
7
- const isHMR = inDevServer && (devServer && devServer.hmr)
8
-
9
5
  const styleLoader = {
10
- loader: 'style-loader',
11
- options: {
12
- hmr: isHMR,
13
- sourceMap: true
14
- }
6
+ loader: 'style-loader'
15
7
  }
16
8
 
17
9
  const getStyleRule = (test, modules = false, preprocessors = []) => {
@@ -21,8 +13,9 @@ const getStyleRule = (test, modules = false, preprocessors = []) => {
21
13
  options: {
22
14
  sourceMap: true,
23
15
  importLoaders: 2,
24
- localIdentName: '[name]__[local]___[hash:base64:5]',
25
- modules
16
+ modules: modules ? {
17
+ localIdentName: '[name]__[local]___[hash:base64:5]'
18
+ } : false
26
19
  }
27
20
  },
28
21
  {
@@ -44,7 +37,9 @@ const getStyleRule = (test, modules = false, preprocessors = []) => {
44
37
  }
45
38
 
46
39
  // sideEffects - See https://github.com/webpack/webpack/issues/6571
47
- return Object.assign({}, { test, use, sideEffects: !modules }, options)
40
+ return {
41
+ test, use, sideEffects: !modules, ...options
42
+ }
48
43
  }
49
44
 
50
45
  module.exports = getStyleRule