webpacker 4.0.3 → 4.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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 +244 -129
  6. data/Gemfile.lock +79 -60
  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 +11 -11
  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 +18 -15
  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 -37
  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 -1
  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 +2 -1
  75. data/yarn.lock +1934 -1642
  76. metadata +24 -10
@@ -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.3".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.3",
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,57 +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",
24
- "@babel/runtime-corejs3": "^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",
25
24
  "babel-loader": "^8.0.6",
26
- "babel-plugin-dynamic-import-node": "^2.2.0",
27
- "babel-plugin-macros": "^2.5.0",
25
+ "babel-plugin-dynamic-import-node": "^2.3.0",
26
+ "babel-plugin-macros": "^2.6.1",
28
27
  "case-sensitive-paths-webpack-plugin": "^2.2.0",
29
- "compression-webpack-plugin": "^2.0.0",
30
- "core-js": "^3.1.3",
31
- "css-loader": "^2.1.1",
32
- "file-loader": "^3.0.1",
33
- "flatted": "^2.0.0",
34
- "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",
35
34
  "js-yaml": "^3.13.1",
36
- "mini-css-extract-plugin": "^0.7.0",
37
- "node-sass": "^4.12.0",
38
- "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",
39
38
  "path-complete-extname": "^1.0.0",
40
- "pnp-webpack-plugin": "^1.4.3",
39
+ "pnp-webpack-plugin": "^1.5.0",
41
40
  "postcss-flexbugs-fixes": "^4.1.0",
42
41
  "postcss-import": "^12.0.1",
43
42
  "postcss-loader": "^3.0.0",
44
- "postcss-preset-env": "^6.6.0",
43
+ "postcss-preset-env": "^6.7.0",
45
44
  "postcss-safe-parser": "^4.0.1",
46
- "regenerator-runtime": "^0.13.2",
47
- "sass-loader": "^7.1.0",
48
- "style-loader": "^0.23.1",
49
- "terser-webpack-plugin": "^1.3.0",
50
- "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",
51
50
  "webpack-assets-manifest": "^3.1.1",
52
- "webpack-cli": "^3.3.2",
53
- "webpack-sources": "^1.3.0"
51
+ "webpack-cli": "^3.3.10",
52
+ "webpack-sources": "^1.4.3"
54
53
  },
55
54
  "devDependencies": {
56
- "eslint": "^5.16.0",
57
- "eslint-config-airbnb": "^17.1.0",
58
- "eslint-plugin-import": "^2.17.3",
59
- "eslint-plugin-jsx-a11y": "^6.2.1",
60
- "eslint-plugin-react": "^7.13.0",
61
- "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"
62
61
  },
63
62
  "jest": {
64
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,10 +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/SKPnnv/1
6
7
  module.exports = {
7
8
  test: /\.(js|mjs)$/,
8
9
  include: /node_modules/,
9
- exclude: /@babel(?:\/|\\{1,2})runtime|core-js/,
10
+ exclude: /(?:@?babel(?:\/|\\{1,2}|-).+)|regenerator-runtime|core-js|^webpack$|^webpack-assets-manifest$|^webpack-cli$|^webpack-sources$|^@rails\/webpacker$/,
10
11
  use: [
11
12
  {
12
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