webpacker 5.2.1 → 6.0.0.pre.1

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 (154) hide show
  1. checksums.yaml +4 -4
  2. data/.eslintrc.js +1 -1
  3. data/.gitignore +2 -0
  4. data/.node-version +1 -1
  5. data/.rubocop.yml +11 -16
  6. data/CHANGELOG.md +15 -4
  7. data/CONTRIBUTING.md +1 -1
  8. data/Gemfile.lock +17 -11
  9. data/README.md +8 -4
  10. data/docs/assets.md +21 -5
  11. data/docs/css.md +24 -29
  12. data/docs/deployment.md +18 -0
  13. data/docs/docker.md +2 -2
  14. data/docs/engines.md +1 -1
  15. data/docs/env.md +5 -0
  16. data/docs/es6.md +1 -1
  17. data/docs/integrations.md +1 -1
  18. data/docs/props.md +2 -38
  19. data/docs/react.md +183 -0
  20. data/docs/testing.md +11 -0
  21. data/docs/typescript.md +2 -2
  22. data/docs/webpack-dev-server.md +17 -15
  23. data/docs/webpack.md +58 -107
  24. data/lib/install/config/webpack/base.js +3 -0
  25. data/lib/install/config/webpack/development.js +2 -2
  26. data/lib/install/config/webpack/production.js +2 -2
  27. data/lib/install/config/webpack/test.js +2 -2
  28. data/lib/install/config/webpacker.yml +8 -37
  29. data/lib/install/examples/{vue → vue3}/app.vue +10 -5
  30. data/lib/install/examples/vue3/hello_vue.js +15 -0
  31. data/lib/install/javascript/packs/application.css +9 -0
  32. data/lib/install/template.rb +33 -19
  33. data/lib/tasks/webpacker.rake +2 -11
  34. data/lib/tasks/webpacker/binstubs.rake +6 -4
  35. data/lib/tasks/webpacker/check_binstubs.rake +4 -4
  36. data/lib/tasks/webpacker/check_yarn.rake +1 -2
  37. data/lib/tasks/webpacker/compile.rake +4 -2
  38. data/lib/tasks/webpacker/info.rake +12 -10
  39. data/lib/tasks/webpacker/install.rake +6 -4
  40. data/lib/tasks/webpacker/verify_install.rake +2 -1
  41. data/lib/tasks/webpacker/yarn_install.rake +9 -1
  42. data/lib/webpacker/commands.rb +1 -1
  43. data/lib/webpacker/compiler.rb +7 -6
  44. data/lib/webpacker/configuration.rb +6 -30
  45. data/lib/webpacker/dev_server_runner.rb +21 -2
  46. data/lib/webpacker/helper.rb +22 -32
  47. data/lib/webpacker/manifest.rb +1 -1
  48. data/lib/webpacker/version.rb +1 -1
  49. data/lib/webpacker/webpack_runner.rb +5 -0
  50. data/package.json +23 -39
  51. data/package/__tests__/config.js +5 -37
  52. data/package/__tests__/development.js +9 -11
  53. data/package/__tests__/env.js +12 -4
  54. data/package/__tests__/production.js +6 -6
  55. data/package/__tests__/staging.js +7 -6
  56. data/package/__tests__/test.js +4 -5
  57. data/package/babel/preset-react.js +62 -0
  58. data/package/babel/preset.js +44 -0
  59. data/package/config.js +3 -11
  60. data/package/env.js +8 -2
  61. data/package/environments/__tests__/base.js +15 -47
  62. data/package/environments/base.js +66 -126
  63. data/package/environments/development.js +45 -44
  64. data/package/environments/production.js +69 -65
  65. data/package/environments/test.js +2 -2
  66. data/package/index.js +6 -6
  67. data/package/rules/babel.js +9 -7
  68. data/package/rules/coffee.js +6 -0
  69. data/package/rules/erb.js +13 -0
  70. data/package/rules/file.js +19 -19
  71. data/package/rules/index.js +24 -18
  72. data/package/rules/less.js +18 -0
  73. data/package/rules/sass.js +5 -6
  74. data/package/rules/svg.js +23 -0
  75. data/package/utils/get_style_rule.js +22 -28
  76. data/package/utils/helpers.js +3 -35
  77. data/test/compiler_test.rb +0 -12
  78. data/test/configuration_test.rb +1 -32
  79. data/test/dev_server_runner_test.rb +24 -5
  80. data/test/engine_rake_tasks_test.rb +39 -0
  81. data/test/helper_test.rb +15 -9
  82. data/test/mounted_app/Rakefile +4 -0
  83. data/test/mounted_app/test/dummy/Rakefile +3 -0
  84. data/test/mounted_app/test/dummy/bin/rails +3 -0
  85. data/test/mounted_app/test/dummy/bin/rake +3 -0
  86. data/test/mounted_app/test/dummy/config.ru +5 -0
  87. data/test/mounted_app/test/dummy/config/application.rb +10 -0
  88. data/test/mounted_app/test/dummy/config/environment.rb +3 -0
  89. data/test/mounted_app/test/dummy/config/webpacker.yml +75 -0
  90. data/test/mounted_app/test/dummy/package.json +7 -0
  91. data/test/rake_tasks_test.rb +1 -10
  92. data/test/test_app/config/webpacker.yml +1 -25
  93. data/test/test_app/config/webpacker_public_root.yml +0 -1
  94. data/test/test_app/public/packs/manifest.json +17 -13
  95. data/test/test_app/some.config.js +0 -0
  96. data/test/webpack_runner_test.rb +9 -3
  97. data/webpacker.gemspec +1 -1
  98. data/yarn.lock +1858 -4915
  99. metadata +47 -70
  100. data/.travis.yml +0 -43
  101. data/lib/install/angular.rb +0 -23
  102. data/lib/install/coffee.rb +0 -25
  103. data/lib/install/config/.browserslistrc +0 -1
  104. data/lib/install/config/babel.config.js +0 -70
  105. data/lib/install/config/postcss.config.js +0 -12
  106. data/lib/install/config/webpack/environment.js +0 -3
  107. data/lib/install/elm.rb +0 -39
  108. data/lib/install/erb.rb +0 -25
  109. data/lib/install/examples/angular/hello_angular.js +0 -7
  110. data/lib/install/examples/angular/hello_angular/app/app.component.ts +0 -9
  111. data/lib/install/examples/angular/hello_angular/app/app.module.ts +0 -16
  112. data/lib/install/examples/angular/hello_angular/index.ts +0 -8
  113. data/lib/install/examples/angular/hello_angular/polyfills.ts +0 -73
  114. data/lib/install/examples/coffee/hello_coffee.coffee +0 -4
  115. data/lib/install/examples/elm/Main.elm +0 -55
  116. data/lib/install/examples/elm/hello_elm.js +0 -16
  117. data/lib/install/examples/erb/hello_erb.js.erb +0 -6
  118. data/lib/install/examples/react/babel.config.js +0 -87
  119. data/lib/install/examples/react/hello_react.jsx +0 -26
  120. data/lib/install/examples/react/tsconfig.json +0 -21
  121. data/lib/install/examples/stimulus/application.js +0 -1
  122. data/lib/install/examples/stimulus/controllers/hello_controller.js +0 -18
  123. data/lib/install/examples/stimulus/controllers/index.js +0 -9
  124. data/lib/install/examples/svelte/app.svelte +0 -11
  125. data/lib/install/examples/svelte/hello_svelte.js +0 -20
  126. data/lib/install/examples/typescript/hello_typescript.ts +0 -4
  127. data/lib/install/examples/typescript/tsconfig.json +0 -24
  128. data/lib/install/examples/vue/hello_vue.js +0 -72
  129. data/lib/install/loaders/coffee.js +0 -6
  130. data/lib/install/loaders/elm.js +0 -25
  131. data/lib/install/loaders/erb.js +0 -11
  132. data/lib/install/loaders/svelte.js +0 -9
  133. data/lib/install/loaders/vue.js +0 -6
  134. data/lib/install/react.rb +0 -18
  135. data/lib/install/stimulus.rb +0 -12
  136. data/lib/install/svelte.rb +0 -29
  137. data/lib/install/typescript.rb +0 -39
  138. data/lib/install/vue.rb +0 -49
  139. data/lib/tasks/installers.rake +0 -42
  140. data/package/config_types/__tests__/config_list.js +0 -118
  141. data/package/config_types/__tests__/config_object.js +0 -43
  142. data/package/config_types/config_list.js +0 -75
  143. data/package/config_types/config_object.js +0 -55
  144. data/package/config_types/index.js +0 -7
  145. data/package/rules/module.css.js +0 -3
  146. data/package/rules/module.sass.js +0 -8
  147. data/package/rules/node_modules.js +0 -22
  148. data/package/utils/__tests__/deep_assign.js +0 -32
  149. data/package/utils/__tests__/deep_merge.js +0 -10
  150. data/package/utils/__tests__/get_style_rule.js +0 -65
  151. data/package/utils/__tests__/objectify.js +0 -9
  152. data/package/utils/deep_assign.js +0 -22
  153. data/package/utils/deep_merge.js +0 -22
  154. data/package/utils/objectify.js +0 -3
@@ -1,53 +1,54 @@
1
+ const { merge } = require('webpack-merge')
1
2
  const webpack = require('webpack')
2
- const Base = require('./base')
3
+
4
+ const baseConfig = require('./base')
3
5
  const devServer = require('../dev_server')
6
+
4
7
  const { outputPath: contentBase, publicPath } = require('../config')
5
8
 
6
- module.exports = class extends Base {
7
- constructor() {
8
- super()
9
+ let devConfig = {
10
+ mode: 'development',
11
+ devtool: 'cheap-module-source-map'
12
+ }
9
13
 
10
- this.config.merge({
11
- mode: 'development',
12
- devtool: 'cheap-module-source-map'
14
+ if (
15
+ process.env.WEBPACK_DEV_SERVER &&
16
+ process.env.WEBPACK_DEV_SERVER !== 'undefined'
17
+ ) {
18
+ if (devServer.hmr) {
19
+ devConfig = merge(devConfig, {
20
+ output: { filename: '[name]-[hash].js' },
21
+ plugins: [new webpack.HotModuleReplacementPlugin()]
13
22
  })
23
+ }
14
24
 
15
- if (process.env.WEBPACK_DEV_SERVER
16
- && process.env.WEBPACK_DEV_SERVER !== 'undefined') {
17
- if (devServer.hmr) {
18
- this.plugins.append('HotModuleReplacement', new webpack.HotModuleReplacementPlugin())
19
- this.config.output.filename = '[name]-[hash].js'
20
- }
21
-
22
- this.config.merge({
23
- devServer: {
24
- clientLogLevel: 'none',
25
- compress: devServer.compress,
26
- quiet: devServer.quiet,
27
- disableHostCheck: devServer.disable_host_check,
28
- host: devServer.host,
29
- port: devServer.port,
30
- https: devServer.https,
31
- hot: devServer.hmr,
32
- contentBase,
33
- inline: devServer.inline,
34
- useLocalIp: devServer.use_local_ip,
35
- public: devServer.public,
36
- publicPath,
37
- historyApiFallback: {
38
- disableDotRule: true
39
- },
40
- headers: devServer.headers,
41
- overlay: devServer.overlay,
42
- stats: {
43
- entrypoints: false,
44
- errorDetails: true,
45
- modules: false,
46
- moduleTrace: false
47
- },
48
- watchOptions: devServer.watch_options
49
- }
50
- })
25
+ devConfig = merge(devConfig, {
26
+ devServer: {
27
+ clientLogLevel: 'none',
28
+ compress: devServer.compress,
29
+ quiet: devServer.quiet,
30
+ disableHostCheck: devServer.disable_host_check,
31
+ host: devServer.host,
32
+ port: devServer.port,
33
+ https: devServer.https,
34
+ hot: devServer.hmr,
35
+ contentBase,
36
+ inline: devServer.inline,
37
+ useLocalIp: devServer.use_local_ip,
38
+ public: devServer.public,
39
+ publicPath,
40
+ historyApiFallback: { disableDotRule: true },
41
+ headers: devServer.headers,
42
+ overlay: devServer.overlay,
43
+ stats: {
44
+ entrypoints: false,
45
+ errorDetails: true,
46
+ modules: false,
47
+ moduleTrace: false
48
+ },
49
+ watchOptions: devServer.watch_options
51
50
  }
52
- }
51
+ })
53
52
  }
53
+
54
+ module.exports = merge(baseConfig, devConfig)
@@ -1,77 +1,81 @@
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')
6
8
 
7
- module.exports = class extends Base {
8
- constructor() {
9
- super()
9
+ const getPlugins = () => {
10
+ let compressionPlugin = new CompressionPlugin({
11
+ filename: '[path].gz[query]',
12
+ algorithm: 'gzip',
13
+ test: /\.(js|css|html|json|ico|svg|eot|otf|ttf|map)$/
14
+ })
10
15
 
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
- )
16
+ if ('brotli' in process.versions) {
17
+ compressionPlugin = new CompressionPlugin({
18
+ filename: '[path].br[query]',
19
+ algorithm: 'brotliCompress',
20
+ test: /\.(js|css|html|json|ico|svg|eot|otf|ttf|map)$/
21
+ })
22
+ }
23
+
24
+ const plugins = [compressionPlugin]
19
25
 
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)$/
26
+ try {
27
+ if (require.resolve('css-loader')) {
28
+ const OptimizeCSSAssetsPlugin = require.resolve(
29
+ 'optimize-css-assets-webpack-plugin'
30
+ )
31
+ const safePostCssParser = require.resolve('postcss-safe-parser')
32
+ plugins.push(
33
+ new OptimizeCSSAssetsPlugin({
34
+ parser: safePostCssParser,
35
+ map: {
36
+ inline: false,
37
+ annotation: true
38
+ }
27
39
  })
28
40
  )
29
41
  }
42
+ } catch (e) {
43
+ /* Work out what to output without clutter */
44
+ }
45
+
46
+ return plugins
47
+ }
30
48
 
31
- this.plugins.append(
32
- 'OptimizeCSSAssets',
33
- new OptimizeCSSAssetsPlugin({
34
- parser: safePostCssParser,
35
- map: {
36
- inline: false,
37
- annotation: true
49
+ const productionConfig = {
50
+ devtool: 'source-map',
51
+ stats: 'normal',
52
+ bail: true,
53
+ plugins: getPlugins(),
54
+ optimization: {
55
+ minimizer: [
56
+ new TerserPlugin({
57
+ parallel: Number.parseInt(process.env.WEBPACKER_PARALLEL, 10) || true,
58
+ terserOptions: {
59
+ parse: {
60
+ // Let terser parse ecma 8 code but always output
61
+ // ES5 compliant code for older browsers
62
+ ecma: 8
63
+ },
64
+ compress: {
65
+ ecma: 5,
66
+ warnings: false,
67
+ comparisons: false
68
+ },
69
+ mangle: { safari10: true },
70
+ output: {
71
+ ecma: 5,
72
+ comments: false,
73
+ ascii_only: true
74
+ }
38
75
  }
39
76
  })
40
- )
41
-
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
- })
77
+ ]
76
78
  }
77
79
  }
80
+
81
+ 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
@@ -3,22 +3,22 @@
3
3
 
4
4
  const { resolve } = require('path')
5
5
  const { existsSync } = require('fs')
6
- const Environment = require('./environments/base')
6
+ const baseConfig = require('./environments/base')
7
7
  const loaders = require('./rules')
8
8
  const config = require('./config')
9
9
  const devServer = require('./dev_server')
10
10
  const { nodeEnv } = require('./env')
11
11
 
12
- const createEnvironment = () => {
12
+ const webpackConfig = () => {
13
13
  const path = resolve(__dirname, 'environments', `${nodeEnv}.js`)
14
- const constructor = existsSync(path) ? require(path) : Environment
15
- return new constructor()
14
+ const environmentConfig = existsSync(path) ? require(path) : baseConfig
15
+ return environmentConfig
16
16
  }
17
17
 
18
18
  module.exports = {
19
19
  config,
20
20
  devServer,
21
- environment: createEnvironment(),
22
- Environment,
21
+ webpackConfig: webpackConfig(),
22
+ baseConfig,
23
23
  loaders
24
24
  }
@@ -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
+ module.exports = {
2
+ test: /\.coffee(\.erb)?$/,
3
+ use: [
4
+ { loader: require.resolve('coffee-loader') }
5
+ ]
6
+ }
@@ -0,0 +1,13 @@
1
+ const runner = /^win/.test(process.platform) ? 'ruby ' : ''
2
+
3
+ module.exports = {
4
+ test: /\.erb$/,
5
+ enforce: 'pre',
6
+ exclude: /node_modules/,
7
+ use: [
8
+ {
9
+ loader: require.resolve('rails-erb-loader'),
10
+ options: { runner: `${runner}bin/rails runner` }
11
+ }
12
+ ]
13
+ }
@@ -1,21 +1,21 @@
1
- const { join } = 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(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,26 @@
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 load = (name) => {
5
+ try {
6
+ return require(`./${name}`)
7
+ } catch (e) {
8
+ return null
9
+ }
20
10
  }
11
+
12
+ const rules = {
13
+ file: load('file'),
14
+ svg: load('svg'),
15
+ css: load('css'),
16
+ sass: load('sass'),
17
+ babel: load('babel'),
18
+ erb: load('erb'),
19
+ coffee: load('coffee'),
20
+ html: load('html'),
21
+ less: load('less')
22
+ }
23
+
24
+ module.exports = Object.keys(rules)
25
+ .filter((key) => !!rules[key])
26
+ .map((key) => rules[key])
@@ -0,0 +1,18 @@
1
+ const path = require('path')
2
+ const getStyleRule = require('../utils/get_style_rule')
3
+ const {
4
+ additional_paths: paths,
5
+ source_path: sourcePath
6
+ } = require('../config')
7
+
8
+ module.exports = getStyleRule(/\.(less)(\.erb)?$/i, [
9
+ {
10
+ loader: require.resolve('less-loader'),
11
+ options: {
12
+ lessOptions: {
13
+ paths: [path.resolve(__dirname, 'node_modules'), sourcePath, ...paths]
14
+ },
15
+ sourceMap: true
16
+ }
17
+ }
18
+ ])
@@ -1,14 +1,13 @@
1
+ const sass = require('sass')
1
2
  const getStyleRule = require('../utils/get_style_rule')
2
3
  const { additional_paths: includePaths } = require('../config')
3
4
 
4
- module.exports = getStyleRule(/\.(scss|sass)(\.erb)?$/i, false, [
5
+ module.exports = getStyleRule(/\.(scss|sass)(\.erb)?$/i, [
5
6
  {
6
- loader: 'sass-loader',
7
+ loader: require.resolve('sass-loader'),
7
8
  options: {
8
- sourceMap: true,
9
- sassOptions: {
10
- includePaths
11
- }
9
+ sassOptions: { includePaths },
10
+ implementation: sass
12
11
  }
13
12
  }
14
13
  ])