webpacker 5.4.3 → 6.0.0.beta

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 (161) hide show
  1. checksums.yaml +4 -4
  2. data/.eslintrc.js +1 -1
  3. data/.github/workflows/ruby.yml +12 -0
  4. data/.gitignore +2 -0
  5. data/.node-version +1 -1
  6. data/.rubocop.yml +3 -108
  7. data/6_0_upgrade.md +43 -0
  8. data/CHANGELOG.md +19 -18
  9. data/CONTRIBUTING.md +1 -1
  10. data/Gemfile.lock +91 -94
  11. data/README.md +220 -99
  12. data/gemfiles/Gemfile-rails-edge +1 -1
  13. data/lib/install/config/webpack/base.js +3 -0
  14. data/lib/install/config/webpack/development.js +2 -2
  15. data/lib/install/config/webpack/production.js +2 -2
  16. data/lib/install/config/webpack/test.js +2 -2
  17. data/lib/install/config/webpacker.yml +8 -37
  18. data/lib/install/javascript/packs/application.css +9 -0
  19. data/lib/install/javascript/packs/application.js +3 -1
  20. data/lib/install/template.rb +32 -26
  21. data/lib/tasks/webpacker/binstubs.rake +6 -4
  22. data/lib/tasks/webpacker/check_binstubs.rake +4 -4
  23. data/lib/tasks/webpacker/check_yarn.rake +1 -1
  24. data/lib/tasks/webpacker/compile.rake +4 -2
  25. data/lib/tasks/webpacker/info.rake +12 -10
  26. data/lib/tasks/webpacker/install.rake +6 -4
  27. data/lib/tasks/webpacker/verify_install.rake +2 -1
  28. data/lib/tasks/webpacker/yarn_install.rake +9 -7
  29. data/lib/tasks/webpacker.rake +2 -11
  30. data/lib/webpacker/compiler.rb +15 -8
  31. data/lib/webpacker/configuration.rb +10 -45
  32. data/lib/webpacker/dev_server_runner.rb +21 -2
  33. data/lib/webpacker/env.rb +1 -5
  34. data/lib/webpacker/helper.rb +22 -32
  35. data/lib/webpacker/manifest.rb +1 -1
  36. data/lib/webpacker/version.rb +1 -1
  37. data/lib/webpacker/webpack_runner.rb +5 -0
  38. data/package/__tests__/config.js +5 -37
  39. data/package/__tests__/development.js +9 -11
  40. data/package/__tests__/env.js +12 -4
  41. data/package/__tests__/production.js +6 -6
  42. data/package/__tests__/staging.js +7 -6
  43. data/package/__tests__/test.js +4 -5
  44. data/package/babel/preset.js +55 -0
  45. data/package/config.js +3 -11
  46. data/package/env.js +8 -2
  47. data/package/environments/__tests__/base.js +15 -47
  48. data/package/environments/base.js +62 -125
  49. data/package/environments/development.js +45 -44
  50. data/package/environments/production.js +63 -68
  51. data/package/environments/test.js +2 -2
  52. data/package/index.js +13 -8
  53. data/package/rules/babel.js +9 -7
  54. data/package/rules/coffee.js +6 -0
  55. data/package/rules/erb.js +15 -0
  56. data/package/rules/file.js +19 -19
  57. data/package/rules/index.js +15 -18
  58. data/package/rules/less.js +22 -0
  59. data/package/rules/sass.js +10 -10
  60. data/package/rules/svg.js +20 -0
  61. data/package/utils/get_style_rule.js +26 -36
  62. data/package/utils/helpers.js +26 -35
  63. data/package.json +29 -45
  64. data/test/compiler_test.rb +0 -12
  65. data/test/configuration_test.rb +1 -32
  66. data/test/dev_server_runner_test.rb +24 -5
  67. data/test/engine_rake_tasks_test.rb +39 -0
  68. data/test/helper_test.rb +24 -30
  69. data/test/mounted_app/Rakefile +4 -0
  70. data/test/mounted_app/test/dummy/Rakefile +3 -0
  71. data/test/mounted_app/test/dummy/bin/rails +3 -0
  72. data/test/mounted_app/test/dummy/bin/rake +3 -0
  73. data/test/mounted_app/test/dummy/config/application.rb +10 -0
  74. data/test/mounted_app/test/dummy/config/environment.rb +3 -0
  75. data/test/mounted_app/test/dummy/config/webpacker.yml +75 -0
  76. data/test/mounted_app/test/dummy/config.ru +5 -0
  77. data/test/mounted_app/test/dummy/package.json +7 -0
  78. data/test/rake_tasks_test.rb +1 -10
  79. data/test/test_app/config/webpacker.yml +1 -25
  80. data/test/test_app/config/webpacker_public_root.yml +0 -1
  81. data/test/test_app/public/packs/manifest.json +17 -13
  82. data/test/test_app/some.config.js +0 -0
  83. data/test/webpack_runner_test.rb +9 -3
  84. data/yarn.lock +2505 -4943
  85. metadata +41 -87
  86. data/.travis.yml +0 -43
  87. data/docs/assets.md +0 -119
  88. data/docs/cloud9.md +0 -310
  89. data/docs/css.md +0 -308
  90. data/docs/deployment.md +0 -130
  91. data/docs/docker.md +0 -68
  92. data/docs/engines.md +0 -213
  93. data/docs/env.md +0 -63
  94. data/docs/es6.md +0 -72
  95. data/docs/folder-structure.md +0 -66
  96. data/docs/integrations.md +0 -220
  97. data/docs/misc.md +0 -23
  98. data/docs/props.md +0 -223
  99. data/docs/target.md +0 -22
  100. data/docs/testing.md +0 -136
  101. data/docs/troubleshooting.md +0 -158
  102. data/docs/typescript.md +0 -190
  103. data/docs/v4-upgrade.md +0 -142
  104. data/docs/webpack-dev-server.md +0 -92
  105. data/docs/webpack.md +0 -364
  106. data/docs/yarn.md +0 -23
  107. data/lib/install/angular.rb +0 -23
  108. data/lib/install/coffee.rb +0 -25
  109. data/lib/install/config/.browserslistrc +0 -1
  110. data/lib/install/config/babel.config.js +0 -82
  111. data/lib/install/config/postcss.config.js +0 -12
  112. data/lib/install/config/webpack/environment.js +0 -3
  113. data/lib/install/elm.rb +0 -39
  114. data/lib/install/erb.rb +0 -25
  115. data/lib/install/examples/angular/hello_angular/app/app.component.ts +0 -9
  116. data/lib/install/examples/angular/hello_angular/app/app.module.ts +0 -16
  117. data/lib/install/examples/angular/hello_angular/index.ts +0 -8
  118. data/lib/install/examples/angular/hello_angular/polyfills.ts +0 -73
  119. data/lib/install/examples/angular/hello_angular.js +0 -7
  120. data/lib/install/examples/coffee/hello_coffee.coffee +0 -4
  121. data/lib/install/examples/elm/Main.elm +0 -55
  122. data/lib/install/examples/elm/hello_elm.js +0 -16
  123. data/lib/install/examples/erb/hello_erb.js.erb +0 -6
  124. data/lib/install/examples/react/babel.config.js +0 -99
  125. data/lib/install/examples/react/hello_react.jsx +0 -26
  126. data/lib/install/examples/react/tsconfig.json +0 -21
  127. data/lib/install/examples/stimulus/application.js +0 -1
  128. data/lib/install/examples/stimulus/controllers/hello_controller.js +0 -18
  129. data/lib/install/examples/stimulus/controllers/index.js +0 -9
  130. data/lib/install/examples/svelte/app.svelte +0 -11
  131. data/lib/install/examples/svelte/hello_svelte.js +0 -20
  132. data/lib/install/examples/typescript/hello_typescript.ts +0 -4
  133. data/lib/install/examples/typescript/tsconfig.json +0 -24
  134. data/lib/install/examples/vue/app.vue +0 -22
  135. data/lib/install/examples/vue/hello_vue.js +0 -72
  136. data/lib/install/loaders/coffee.js +0 -6
  137. data/lib/install/loaders/elm.js +0 -25
  138. data/lib/install/loaders/erb.js +0 -11
  139. data/lib/install/loaders/svelte.js +0 -9
  140. data/lib/install/loaders/vue.js +0 -6
  141. data/lib/install/react.rb +0 -18
  142. data/lib/install/stimulus.rb +0 -12
  143. data/lib/install/svelte.rb +0 -29
  144. data/lib/install/typescript.rb +0 -39
  145. data/lib/install/vue.rb +0 -49
  146. data/lib/tasks/installers.rake +0 -42
  147. data/package/config_types/__tests__/config_list.js +0 -118
  148. data/package/config_types/__tests__/config_object.js +0 -43
  149. data/package/config_types/config_list.js +0 -75
  150. data/package/config_types/config_object.js +0 -55
  151. data/package/config_types/index.js +0 -7
  152. data/package/rules/module.css.js +0 -3
  153. data/package/rules/module.sass.js +0 -8
  154. data/package/rules/node_modules.js +0 -22
  155. data/package/utils/__tests__/deep_assign.js +0 -32
  156. data/package/utils/__tests__/deep_merge.js +0 -10
  157. data/package/utils/__tests__/get_style_rule.js +0 -65
  158. data/package/utils/__tests__/objectify.js +0 -9
  159. data/package/utils/deep_assign.js +0 -22
  160. data/package/utils/deep_merge.js +0 -22
  161. data/package/utils/objectify.js +0 -3
@@ -1,77 +1,72 @@
1
- const TerserPlugin = require('terser-webpack-plugin')
1
+ /* eslint global-require: 0 */
2
+ /* eslint import/no-dynamic-require: 0 */
3
+
4
+ const { merge } = require('webpack-merge')
2
5
  const CompressionPlugin = require('compression-webpack-plugin')
3
- const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin')
4
- const safePostCssParser = require('postcss-safe-parser')
5
- const Base = require('./base')
6
+ const TerserPlugin = require('terser-webpack-plugin')
7
+ const baseConfig = require('./base')
8
+ const { moduleExists } = require('../utils/helpers')
6
9
 
7
- module.exports = class extends Base {
8
- constructor() {
9
- super()
10
+ const getPlugins = () => {
11
+ let compressionPlugin = new CompressionPlugin({
12
+ filename: '[path].gz[query]',
13
+ algorithm: 'gzip',
14
+ test: /\.(js|css|html|json|ico|svg|eot|otf|ttf|map)$/
15
+ })
10
16
 
11
- this.plugins.append(
12
- 'Compression',
13
- new CompressionPlugin({
14
- filename: '[path].gz[query]',
15
- algorithm: 'gzip',
16
- test: /\.(js|css|html|json|ico|svg|eot|otf|ttf|map)$/
17
- })
18
- )
17
+ if ('brotli' in process.versions) {
18
+ compressionPlugin = new CompressionPlugin({
19
+ filename: '[path].br[query]',
20
+ algorithm: 'brotliCompress',
21
+ test: /\.(js|css|html|json|ico|svg|eot|otf|ttf|map)$/
22
+ })
23
+ }
19
24
 
20
- if ('brotli' in process.versions) {
21
- this.plugins.append(
22
- 'Compression Brotli',
23
- new CompressionPlugin({
24
- filename: '[path].br[query]',
25
- algorithm: 'brotliCompress',
26
- test: /\.(js|css|html|json|ico|svg|eot|otf|ttf|map)$/
27
- })
28
- )
29
- }
25
+ return [compressionPlugin]
26
+ }
30
27
 
31
- this.plugins.append(
32
- 'OptimizeCSSAssets',
33
- new OptimizeCSSAssetsPlugin({
34
- parser: safePostCssParser,
35
- map: {
36
- inline: false,
37
- annotation: true
28
+ const productionConfig = {
29
+ devtool: 'source-map',
30
+ stats: 'normal',
31
+ bail: true,
32
+ plugins: getPlugins(),
33
+ optimization: {
34
+ minimizer: [
35
+ () => {
36
+ if (
37
+ moduleExists('css-loader') &&
38
+ moduleExists('css-minimizer-webpack-plugin')
39
+ ) {
40
+ const CssMinimizerPlugin = require('css-minimizer-webpack-plugin')
41
+ return new CssMinimizerPlugin({ sourceMap: true })
38
42
  }
39
- })
40
- )
41
43
 
42
- this.config.merge({
43
- devtool: 'source-map',
44
- stats: 'normal',
45
- bail: true,
46
- optimization: {
47
- minimizer: [
48
- new TerserPlugin({
49
- parallel: Number.parseInt(process.env.WEBPACKER_PARALLEL, 10) || true,
50
- cache: true,
51
- sourceMap: true,
52
- terserOptions: {
53
- parse: {
54
- // Let terser parse ecma 8 code but always output
55
- // ES5 compliant code for older browsers
56
- ecma: 8
57
- },
58
- compress: {
59
- ecma: 5,
60
- warnings: false,
61
- comparisons: false
62
- },
63
- mangle: {
64
- safari10: true
65
- },
66
- output: {
67
- ecma: 5,
68
- comments: false,
69
- ascii_only: true
70
- }
71
- }
72
- })
73
- ]
74
- }
75
- })
44
+ return false
45
+ },
46
+
47
+ new TerserPlugin({
48
+ parallel: Number.parseInt(process.env.WEBPACKER_PARALLEL, 10) || true,
49
+ terserOptions: {
50
+ parse: {
51
+ // Let terser parse ecma 8 code but always output
52
+ // ES5 compliant code for older browsers
53
+ ecma: 8
54
+ },
55
+ compress: {
56
+ ecma: 5,
57
+ warnings: false,
58
+ comparisons: false
59
+ },
60
+ mangle: { safari10: true },
61
+ output: {
62
+ ecma: 5,
63
+ comments: false,
64
+ ascii_only: true
65
+ }
66
+ }
67
+ })
68
+ ].filter(Boolean)
76
69
  }
77
70
  }
71
+
72
+ module.exports = merge(baseConfig, productionConfig)
@@ -1,3 +1,3 @@
1
- const Base = require('./base')
1
+ const baseConfig = require('./base')
2
2
 
3
- module.exports = class extends Base {}
3
+ module.exports = baseConfig
data/package/index.js CHANGED
@@ -1,24 +1,29 @@
1
1
  /* eslint global-require: 0 */
2
2
  /* eslint import/no-dynamic-require: 0 */
3
3
 
4
+ const { merge } = require('webpack-merge')
4
5
  const { resolve } = require('path')
5
6
  const { existsSync } = require('fs')
6
- const Environment = require('./environments/base')
7
- const loaders = require('./rules')
7
+ const baseConfig = require('./environments/base')
8
+ const rules = require('./rules')
8
9
  const config = require('./config')
9
10
  const devServer = require('./dev_server')
10
11
  const { nodeEnv } = require('./env')
12
+ const { moduleExists, canProcess } = require('./utils/helpers')
11
13
 
12
- const createEnvironment = () => {
14
+ const webpackConfig = () => {
13
15
  const path = resolve(__dirname, 'environments', `${nodeEnv}.js`)
14
- const constructor = existsSync(path) ? require(path) : Environment
15
- return new constructor()
16
+ const environmentConfig = existsSync(path) ? require(path) : baseConfig
17
+ return environmentConfig
16
18
  }
17
19
 
18
20
  module.exports = {
19
21
  config,
20
22
  devServer,
21
- environment: createEnvironment(),
22
- Environment,
23
- loaders
23
+ webpackConfig: webpackConfig(),
24
+ baseConfig,
25
+ rules,
26
+ merge,
27
+ moduleExists,
28
+ canProcess
24
29
  }
@@ -1,10 +1,12 @@
1
1
  const { resolve } = require('path')
2
2
  const { realpathSync } = require('fs')
3
- const { source_path: sourcePath, additional_paths: additionalPaths } = require('../config')
4
- const { nodeEnv } = require('../env')
5
3
 
6
- // Process application Javascript code with Babel.
7
- // Uses application .babelrc to apply any transformations
4
+ const {
5
+ source_path: sourcePath,
6
+ additional_paths: additionalPaths
7
+ } = require('../config')
8
+ const { isProduction } = require('../env')
9
+
8
10
  module.exports = {
9
11
  test: /\.(js|jsx|mjs|ts|tsx)?(\.erb)?$/,
10
12
  include: [sourcePath, ...additionalPaths].map((p) => {
@@ -17,11 +19,11 @@ module.exports = {
17
19
  exclude: /node_modules/,
18
20
  use: [
19
21
  {
20
- loader: 'babel-loader',
22
+ loader: require.resolve('babel-loader'),
21
23
  options: {
22
24
  cacheDirectory: true,
23
- cacheCompression: nodeEnv === 'production',
24
- compact: nodeEnv === 'production'
25
+ cacheCompression: isProduction,
26
+ compact: isProduction
25
27
  }
26
28
  }
27
29
  ]
@@ -0,0 +1,6 @@
1
+ const { canProcess } = require('../utils/helpers')
2
+
3
+ module.exports = canProcess('coffee-loader', (resolvedPath) => ({
4
+ test: /\.coffee(\.erb)?$/,
5
+ use: [{ loader: resolvedPath }]
6
+ }))
@@ -0,0 +1,15 @@
1
+ const { canProcess } = require('../utils/helpers')
2
+
3
+ const runner = /^win/.test(process.platform) ? 'ruby ' : ''
4
+
5
+ module.exports = canProcess('rails-erb-loader', (resolvedPath) => ({
6
+ test: /\.erb$/,
7
+ enforce: 'pre',
8
+ exclude: /node_modules/,
9
+ use: [
10
+ {
11
+ loader: resolvedPath,
12
+ options: { runner: `${runner}bin/rails runner` }
13
+ }
14
+ ]
15
+ }))
@@ -1,21 +1,21 @@
1
- const { join, normalize } = require('path')
2
- const { source_path: sourcePath, static_assets_extensions: fileExtensions } = require('../config')
3
-
4
1
  module.exports = {
5
- test: new RegExp(`(${fileExtensions.join('|')})$`, 'i'),
6
- use: [
7
- {
8
- loader: 'file-loader',
9
- options: {
10
- name(file) {
11
- if (file.includes(normalize(sourcePath))) {
12
- return 'media/[path][name]-[hash].[ext]'
13
- }
14
- return 'media/[folder]/[name]-[hash:8].[ext]'
15
- },
16
- esModule: false,
17
- context: join(sourcePath)
18
- }
19
- }
20
- ]
2
+ test: [
3
+ /\.bmp$/,
4
+ /\.gif$/,
5
+ /\.jpe?g$/,
6
+ /\.png$/,
7
+ /\.tiff$/,
8
+ /\.ico$/,
9
+ /\.avif$/,
10
+ /\.webp$/,
11
+ /\.eot$/,
12
+ /\.otf$/,
13
+ /\.ttf$/,
14
+ /\.woff$/,
15
+ /\.woff2$/,
16
+ /\.html$/,
17
+ /\.json$/
18
+ ],
19
+ exclude: [/\.(js|mjs|jsx|ts|tsx)$/],
20
+ type: 'asset/resource'
21
21
  }
@@ -1,20 +1,17 @@
1
- const babel = require('./babel')
2
- const file = require('./file')
3
- const css = require('./css')
4
- const sass = require('./sass')
5
- const moduleCss = require('./module.css')
6
- const moduleSass = require('./module.sass')
7
- const nodeModules = require('./node_modules')
1
+ /* eslint global-require: 0 */
2
+ /* eslint import/no-dynamic-require: 0 */
8
3
 
9
- // Webpack loaders are processed in reverse order
10
- // https://webpack.js.org/concepts/loaders/#loader-features
11
- // Lastly, process static files using file loader
12
- module.exports = {
13
- file,
14
- css,
15
- sass,
16
- moduleCss,
17
- moduleSass,
18
- nodeModules,
19
- babel
4
+ const rules = {
5
+ file: require('./file'),
6
+ svg: require('./svg'),
7
+ css: require('./css'),
8
+ sass: require('./sass'),
9
+ babel: require('./babel'),
10
+ erb: require('./erb'),
11
+ coffee: require('./coffee'),
12
+ less: require('./less')
20
13
  }
14
+
15
+ module.exports = Object.keys(rules)
16
+ .filter((key) => !!rules[key])
17
+ .map((key) => rules[key])
@@ -0,0 +1,22 @@
1
+ const path = require('path')
2
+ const { canProcess } = require('../utils/helpers')
3
+ const getStyleRule = require('../utils/get_style_rule')
4
+
5
+ const {
6
+ additional_paths: paths,
7
+ source_path: sourcePath
8
+ } = require('../config')
9
+
10
+ module.exports = canProcess('less-loader', (resolvedPath) =>
11
+ getStyleRule(/\.(less)(\.erb)?$/i, [
12
+ {
13
+ loader: resolvedPath,
14
+ options: {
15
+ lessOptions: {
16
+ paths: [path.resolve(__dirname, 'node_modules'), sourcePath, ...paths]
17
+ },
18
+ sourceMap: true
19
+ }
20
+ }
21
+ ])
22
+ )
@@ -1,17 +1,17 @@
1
1
  /* eslint global-require: 0 */
2
2
 
3
3
  const getStyleRule = require('../utils/get_style_rule')
4
+ const { canProcess } = require('../utils/helpers')
4
5
  const { additional_paths: includePaths } = require('../config')
5
6
 
6
- module.exports = getStyleRule(/\.(scss|sass)(\.erb)?$/i, false, [
7
- {
8
- loader: 'sass-loader',
9
- options: {
10
- sourceMap: true,
11
- implementation: require('sass'),
12
- sassOptions: {
13
- includePaths
7
+ module.exports = canProcess('sass-loader', (resolvedPath) =>
8
+ getStyleRule(/\.(scss|sass)(\.erb)?$/i, [
9
+ {
10
+ loader: resolvedPath,
11
+ options: {
12
+ sassOptions: { includePaths },
13
+ implementation: require('sass')
14
14
  }
15
15
  }
16
- }
17
- ])
16
+ ])
17
+ )
@@ -0,0 +1,20 @@
1
+ /* eslint global-require: 0 */
2
+ /* eslint import/no-dynamic-require: 0 */
3
+ const { moduleExists } = require('../utils/helpers')
4
+
5
+ module.exports = {
6
+ test: /\.svg$/i,
7
+ type: 'asset/inline',
8
+ generator: {
9
+ dataUrl: (content) => {
10
+ let optimisedContent = content
11
+
12
+ if (moduleExists('mini-svg-data-uri')) {
13
+ const svgToMiniDataURI = require('mini-svg-data-uri')
14
+ optimisedContent = svgToMiniDataURI(content.toString())
15
+ }
16
+
17
+ return optimisedContent
18
+ }
19
+ }
20
+ }
@@ -1,45 +1,35 @@
1
- const MiniCssExtractPlugin = require('mini-css-extract-plugin')
2
- const { resolve } = require('path')
3
- const config = require('../config')
1
+ /* eslint global-require: 0 */
4
2
 
5
- const styleLoader = {
6
- loader: 'style-loader'
7
- }
3
+ const { canProcess, moduleExists } = require('./helpers')
8
4
 
9
- const getStyleRule = (test, modules = false, preprocessors = []) => {
10
- const use = [
11
- {
12
- loader: 'css-loader',
13
- options: {
14
- sourceMap: true,
15
- importLoaders: 2,
16
- modules: modules ? {
17
- localIdentName: '[name]__[local]___[hash:base64:5]'
18
- } : false
19
- }
20
- },
21
- {
22
- loader: 'postcss-loader',
23
- options: {
24
- config: { path: resolve() },
25
- sourceMap: true
26
- }
27
- },
28
- ...preprocessors
29
- ]
5
+ const getStyleRule = (test, preprocessors = []) => {
6
+ if (moduleExists('css-loader')) {
7
+ const tryPostcss = () =>
8
+ canProcess('postcss-loader', (loaderPath) => ({
9
+ loader: loaderPath,
10
+ options: { sourceMap: true }
11
+ }))
30
12
 
31
- const options = modules ? { include: /\.module\.[a-z]+$/ } : { exclude: /\.module\.[a-z]+$/ }
13
+ const use = [
14
+ { loader: require('mini-css-extract-plugin').loader },
15
+ {
16
+ loader: require.resolve('css-loader'),
17
+ options: {
18
+ sourceMap: true,
19
+ importLoaders: 2
20
+ }
21
+ },
22
+ tryPostcss(),
23
+ ...preprocessors
24
+ ].filter(Boolean)
32
25
 
33
- if (config.extract_css) {
34
- use.unshift(MiniCssExtractPlugin.loader)
35
- } else {
36
- use.unshift(styleLoader)
26
+ return {
27
+ test,
28
+ use
29
+ }
37
30
  }
38
31
 
39
- // sideEffects - See https://github.com/webpack/webpack/issues/6571
40
- return {
41
- test, use, sideEffects: !modules, ...options
42
- }
32
+ return null
43
33
  }
44
34
 
45
35
  module.exports = getStyleRule
@@ -1,30 +1,5 @@
1
- const { stringify } = require('flatted')
2
-
3
- const isObject = (value) => typeof value === 'object'
4
- && value !== null
5
- && (value.length === undefined || value.length === null)
6
-
7
- const isNotObject = (value) => !isObject(value)
8
-
9
- const isBoolean = (str) => /^true/.test(str) || /^false/.test(str)
10
-
11
- const isEmpty = (value) => value === null || value === undefined
12
-
13
- const isString = (key) => key && typeof key === 'string'
14
-
15
- const isStrPath = (key) => {
16
- if (!isString(key)) throw new Error(`Key ${key} should be string`)
17
- return isString(key) && key.includes('.')
18
- }
19
-
20
1
  const isArray = (value) => Array.isArray(value)
21
-
22
- const isEqual = (target, source) => stringify(target) === stringify(source)
23
-
24
- const canMerge = (value) => isObject(value) || isArray(value)
25
-
26
- const prettyPrint = (obj) => JSON.stringify(obj, null, 2)
27
-
2
+ const isBoolean = (str) => /^true/.test(str) || /^false/.test(str)
28
3
  const chdirTestApp = () => {
29
4
  try {
30
5
  return process.chdir('test/test_app')
@@ -41,18 +16,34 @@ const resetEnv = () => {
41
16
 
42
17
  const ensureTrailingSlash = (path) => (path.endsWith('/') ? path : `${path}/`)
43
18
 
19
+ const moduleExists = (packageName) => {
20
+ try {
21
+ return require.resolve(packageName)
22
+ } catch (e) {
23
+ if (e.code !== 'MODULE_NOT_FOUND') {
24
+ throw e
25
+ }
26
+ return null
27
+ }
28
+ }
29
+
30
+ const canProcess = (rule, fn) => {
31
+ const modulePath = moduleExists(rule)
32
+
33
+ if (modulePath) {
34
+ return fn(modulePath)
35
+ }
36
+
37
+ return null
38
+ }
39
+
44
40
  module.exports = {
45
41
  chdirTestApp,
46
42
  chdirCwd,
47
- ensureTrailingSlash,
48
- isObject,
49
- isNotObject,
50
- isBoolean,
51
43
  isArray,
52
- isEqual,
53
- isEmpty,
54
- isStrPath,
55
- canMerge,
56
- prettyPrint,
44
+ isBoolean,
45
+ ensureTrailingSlash,
46
+ canProcess,
47
+ moduleExists,
57
48
  resetEnv
58
49
  }
data/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rails/webpacker",
3
- "version": "5.4.3",
3
+ "version": "6.0.0-beta",
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,40 @@
8
8
  "lib/install/config/webpacker.yml"
9
9
  ],
10
10
  "engines": {
11
- "node": ">=10.17.0",
12
- "yarn": ">=1 <4"
11
+ "node": ">=10.22.1 || ^12 || >=14",
12
+ "yarn": ">=1 <3"
13
13
  },
14
14
  "dependencies": {
15
- "@babel/core": "^7.15.0",
16
- "@babel/plugin-proposal-class-properties": "^7.14.5",
17
- "@babel/plugin-proposal-object-rest-spread": "^7.14.7",
18
- "@babel/plugin-syntax-dynamic-import": "^7.8.3",
19
- "@babel/plugin-transform-destructuring": "^7.14.7",
20
- "@babel/plugin-transform-regenerator": "^7.14.5",
21
- "@babel/plugin-transform-runtime": "^7.15.0",
22
- "@babel/preset-env": "^7.15.0",
23
- "@babel/runtime": "^7.15.3",
15
+ "@babel/core": "^7.12.9",
16
+ "@babel/plugin-proposal-class-properties": "^7.12.1",
17
+ "@babel/plugin-transform-runtime": "^7.12.1",
18
+ "@babel/preset-env": "^7.12.11",
19
+ "@babel/runtime": "^7.12.5",
24
20
  "babel-loader": "^8.2.2",
25
- "babel-plugin-dynamic-import-node": "^2.3.3",
26
- "babel-plugin-macros": "^2.8.0",
27
- "case-sensitive-paths-webpack-plugin": "^2.4.0",
28
- "compression-webpack-plugin": "^4.0.1",
29
- "core-js": "^3.16.2",
30
- "css-loader": "^3.6.0",
31
- "file-loader": "^6.2.0",
32
- "flatted": "^3.2.2",
33
- "glob": "^7.1.7",
34
- "js-yaml": "^3.14.1",
35
- "mini-css-extract-plugin": "^0.9.0",
36
- "optimize-css-assets-webpack-plugin": "^5.0.8",
21
+ "babel-plugin-macros": "^3.0.1",
22
+ "case-sensitive-paths-webpack-plugin": "^2.3.0",
23
+ "compression-webpack-plugin": "^7.1.0",
24
+ "core-js": "^3.8.0",
25
+ "glob": "^7.1.6",
26
+ "js-yaml": "^3.14.0",
37
27
  "path-complete-extname": "^1.0.0",
38
- "pnp-webpack-plugin": "^1.7.0",
39
- "postcss-flexbugs-fixes": "^4.2.1",
40
- "postcss-import": "^12.0.1",
41
- "postcss-loader": "^3.0.0",
42
- "postcss-preset-env": "^6.7.0",
43
- "postcss-safe-parser": "^4.0.2",
44
- "regenerator-runtime": "^0.13.9",
45
- "sass": "^1.38.0",
46
- "sass-loader": "10.1.1",
47
- "style-loader": "^1.3.0",
48
- "terser-webpack-plugin": "^4.2.3",
49
- "webpack": "^4.46.0",
50
- "webpack-assets-manifest": "^3.1.1",
51
- "webpack-cli": "^3.3.12",
52
- "webpack-sources": "^1.4.3"
28
+ "pnp-webpack-plugin": "^1.6.4",
29
+ "regenerator-runtime": "^0.13.7",
30
+ "terser-webpack-plugin": "^5.0.3",
31
+ "webpack": "^5.11.0",
32
+ "webpack-assets-manifest": "^5.0.0",
33
+ "webpack-cli": "^4.2.0",
34
+ "webpack-merge": "^5.7.2",
35
+ "webpack-sources": "^2.2.0"
53
36
  },
54
37
  "devDependencies": {
55
- "eslint": "^7.32.0",
56
- "eslint-config-airbnb": "^18.2.1",
57
- "eslint-plugin-import": "^2.24.0",
58
- "eslint-plugin-jsx-a11y": "^6.4.1",
59
- "eslint-plugin-react": "^7.24.0",
60
- "jest": "^27.0.6"
38
+ "eslint": "^7.16.0",
39
+ "eslint-config-airbnb": "^18.2.0",
40
+ "eslint-config-prettier": "^7.1.0",
41
+ "eslint-plugin-import": "^2.22.1",
42
+ "eslint-plugin-jsx-a11y": "^6.3.1",
43
+ "eslint-plugin-react": "^7.21.4",
44
+ "jest": "^26.5.3"
61
45
  },
62
46
  "jest": {
63
47
  "testRegex": "(/__tests__/.*|(\\.|/))\\.jsx?$",
@@ -23,18 +23,6 @@ class CompilerTest < Minitest::Test
23
23
  Webpacker.compiler.env = {}
24
24
  end
25
25
 
26
- def test_default_watched_paths
27
- assert_equal Webpacker.compiler.send(:default_watched_paths), [
28
- "app/assets/**/*{.mjs,.js,.sass,.scss,.css,.module.sass,.module.scss,.module.css,.png,.svg,.gif,.jpeg,.jpg,.elm}",
29
- "/etc/yarn/**/*{.mjs,.js,.sass,.scss,.css,.module.sass,.module.scss,.module.css,.png,.svg,.gif,.jpeg,.jpg,.elm}",
30
- "app/elm/**/*{.mjs,.js,.sass,.scss,.css,.module.sass,.module.scss,.module.css,.png,.svg,.gif,.jpeg,.jpg,.elm}",
31
- "app/javascript/**/*{.mjs,.js,.sass,.scss,.css,.module.sass,.module.scss,.module.css,.png,.svg,.gif,.jpeg,.jpg,.elm}",
32
- "yarn.lock",
33
- "package.json",
34
- "config/webpack/**/*"
35
- ]
36
- end
37
-
38
26
  def test_freshness
39
27
  assert Webpacker.compiler.stale?
40
28
  assert !Webpacker.compiler.fresh?