webpacker 5.2.1 → 6.0.0.beta.4

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 (169) hide show
  1. checksums.yaml +4 -4
  2. data/.eslintrc.js +1 -1
  3. data/.github/workflows/jest.yml +1 -1
  4. data/.github/workflows/js-lint.yml +1 -1
  5. data/.github/workflows/ruby.yml +9 -6
  6. data/.gitignore +2 -0
  7. data/.node-version +1 -1
  8. data/.rubocop.yml +11 -16
  9. data/6_0_upgrade.md +48 -0
  10. data/CHANGELOG.md +27 -0
  11. data/CONTRIBUTING.md +1 -1
  12. data/Gemfile.lock +23 -15
  13. data/README.md +252 -103
  14. data/config/README.md +3 -0
  15. data/config/webpacker.yml +1 -0
  16. data/lib/install/config/webpack/base.js +3 -0
  17. data/lib/install/config/webpack/development.js +2 -2
  18. data/lib/install/config/webpack/production.js +2 -2
  19. data/lib/install/config/webpack/test.js +2 -2
  20. data/lib/install/config/webpacker.yml +12 -39
  21. data/lib/install/{javascript/packs → packs/entrypoints}/application.js +5 -3
  22. data/lib/install/template.rb +36 -22
  23. data/lib/tasks/webpacker.rake +2 -11
  24. data/lib/tasks/webpacker/binstubs.rake +6 -4
  25. data/lib/tasks/webpacker/check_binstubs.rake +4 -4
  26. data/lib/tasks/webpacker/check_yarn.rake +1 -2
  27. data/lib/tasks/webpacker/compile.rake +4 -2
  28. data/lib/tasks/webpacker/info.rake +12 -10
  29. data/lib/tasks/webpacker/install.rake +6 -4
  30. data/lib/tasks/webpacker/verify_install.rake +2 -1
  31. data/lib/tasks/webpacker/yarn_install.rake +9 -1
  32. data/lib/webpacker/commands.rb +3 -2
  33. data/lib/webpacker/compiler.rb +16 -9
  34. data/lib/webpacker/configuration.rb +6 -30
  35. data/lib/webpacker/dev_server_runner.rb +23 -2
  36. data/lib/webpacker/helper.rb +26 -36
  37. data/lib/webpacker/manifest.rb +1 -1
  38. data/lib/webpacker/version.rb +1 -1
  39. data/lib/webpacker/webpack_runner.rb +6 -0
  40. data/package.json +23 -39
  41. data/package/__tests__/config.js +5 -37
  42. data/package/__tests__/development.js +11 -12
  43. data/package/__tests__/env.js +12 -4
  44. data/package/__tests__/index.js +9 -0
  45. data/package/__tests__/production.js +6 -6
  46. data/package/__tests__/staging.js +7 -6
  47. data/package/__tests__/test.js +4 -5
  48. data/package/babel/preset.js +55 -0
  49. data/package/config.js +3 -11
  50. data/package/env.js +8 -2
  51. data/package/environments/__tests__/base.js +19 -51
  52. data/package/environments/base.js +65 -125
  53. data/package/environments/development.js +46 -44
  54. data/package/environments/production.js +66 -64
  55. data/package/environments/test.js +2 -2
  56. data/package/index.js +13 -8
  57. data/package/rules/babel.js +9 -7
  58. data/package/rules/coffee.js +6 -0
  59. data/package/rules/erb.js +15 -0
  60. data/package/rules/file.js +21 -19
  61. data/package/rules/index.js +16 -18
  62. data/package/rules/less.js +22 -0
  63. data/package/rules/raw.js +5 -0
  64. data/package/rules/sass.js +12 -9
  65. data/package/rules/stylus.js +26 -0
  66. data/package/utils/get_style_rule.js +26 -36
  67. data/package/utils/helpers.js +26 -35
  68. data/test/compiler_test.rb +0 -12
  69. data/test/configuration_test.rb +3 -34
  70. data/test/dev_server_runner_test.rb +33 -6
  71. data/test/engine_rake_tasks_test.rb +39 -0
  72. data/test/helper_test.rb +15 -9
  73. data/test/mounted_app/Rakefile +4 -0
  74. data/test/mounted_app/test/dummy/Rakefile +3 -0
  75. data/test/mounted_app/test/dummy/bin/rails +3 -0
  76. data/test/mounted_app/test/dummy/bin/rake +3 -0
  77. data/test/mounted_app/test/dummy/config.ru +5 -0
  78. data/test/mounted_app/test/dummy/config/application.rb +10 -0
  79. data/test/mounted_app/test/dummy/config/environment.rb +3 -0
  80. data/test/mounted_app/test/dummy/config/webpacker.yml +75 -0
  81. data/test/mounted_app/test/dummy/package.json +7 -0
  82. data/test/rake_tasks_test.rb +1 -10
  83. data/test/test_app/app/{javascript/packs → packs/entrypoints}/application.js +1 -1
  84. data/test/test_app/app/{javascript/packs → packs/entrypoints}/multi_entry.css +0 -0
  85. data/test/test_app/app/{javascript/packs → packs/entrypoints}/multi_entry.js +0 -0
  86. data/test/test_app/config/webpacker.yml +3 -27
  87. data/test/test_app/config/webpacker_public_root.yml +0 -1
  88. data/test/test_app/public/packs/manifest.json +17 -13
  89. data/test/test_app/some.config.js +0 -0
  90. data/test/webpack_runner_test.rb +9 -3
  91. data/webpacker.gemspec +1 -1
  92. data/yarn.lock +1858 -4915
  93. metadata +54 -97
  94. data/.travis.yml +0 -43
  95. data/docs/assets.md +0 -119
  96. data/docs/cloud9.md +0 -310
  97. data/docs/css.md +0 -308
  98. data/docs/deployment.md +0 -130
  99. data/docs/docker.md +0 -68
  100. data/docs/engines.md +0 -213
  101. data/docs/env.md +0 -63
  102. data/docs/es6.md +0 -72
  103. data/docs/folder-structure.md +0 -66
  104. data/docs/integrations.md +0 -220
  105. data/docs/misc.md +0 -23
  106. data/docs/props.md +0 -223
  107. data/docs/target.md +0 -22
  108. data/docs/testing.md +0 -136
  109. data/docs/troubleshooting.md +0 -158
  110. data/docs/typescript.md +0 -190
  111. data/docs/v4-upgrade.md +0 -142
  112. data/docs/webpack-dev-server.md +0 -92
  113. data/docs/webpack.md +0 -364
  114. data/docs/yarn.md +0 -23
  115. data/lib/install/angular.rb +0 -23
  116. data/lib/install/coffee.rb +0 -25
  117. data/lib/install/config/.browserslistrc +0 -1
  118. data/lib/install/config/babel.config.js +0 -70
  119. data/lib/install/config/postcss.config.js +0 -12
  120. data/lib/install/config/webpack/environment.js +0 -3
  121. data/lib/install/elm.rb +0 -39
  122. data/lib/install/erb.rb +0 -25
  123. data/lib/install/examples/angular/hello_angular.js +0 -7
  124. data/lib/install/examples/angular/hello_angular/app/app.component.ts +0 -9
  125. data/lib/install/examples/angular/hello_angular/app/app.module.ts +0 -16
  126. data/lib/install/examples/angular/hello_angular/index.ts +0 -8
  127. data/lib/install/examples/angular/hello_angular/polyfills.ts +0 -73
  128. data/lib/install/examples/coffee/hello_coffee.coffee +0 -4
  129. data/lib/install/examples/elm/Main.elm +0 -55
  130. data/lib/install/examples/elm/hello_elm.js +0 -16
  131. data/lib/install/examples/erb/hello_erb.js.erb +0 -6
  132. data/lib/install/examples/react/babel.config.js +0 -87
  133. data/lib/install/examples/react/hello_react.jsx +0 -26
  134. data/lib/install/examples/react/tsconfig.json +0 -21
  135. data/lib/install/examples/stimulus/application.js +0 -1
  136. data/lib/install/examples/stimulus/controllers/hello_controller.js +0 -18
  137. data/lib/install/examples/stimulus/controllers/index.js +0 -9
  138. data/lib/install/examples/svelte/app.svelte +0 -11
  139. data/lib/install/examples/svelte/hello_svelte.js +0 -20
  140. data/lib/install/examples/typescript/hello_typescript.ts +0 -4
  141. data/lib/install/examples/typescript/tsconfig.json +0 -24
  142. data/lib/install/examples/vue/app.vue +0 -22
  143. data/lib/install/examples/vue/hello_vue.js +0 -72
  144. data/lib/install/loaders/coffee.js +0 -6
  145. data/lib/install/loaders/elm.js +0 -25
  146. data/lib/install/loaders/erb.js +0 -11
  147. data/lib/install/loaders/svelte.js +0 -9
  148. data/lib/install/loaders/vue.js +0 -6
  149. data/lib/install/react.rb +0 -18
  150. data/lib/install/stimulus.rb +0 -12
  151. data/lib/install/svelte.rb +0 -29
  152. data/lib/install/typescript.rb +0 -39
  153. data/lib/install/vue.rb +0 -49
  154. data/lib/tasks/installers.rake +0 -42
  155. data/package/config_types/__tests__/config_list.js +0 -118
  156. data/package/config_types/__tests__/config_object.js +0 -43
  157. data/package/config_types/config_list.js +0 -75
  158. data/package/config_types/config_object.js +0 -55
  159. data/package/config_types/index.js +0 -7
  160. data/package/rules/module.css.js +0 -3
  161. data/package/rules/module.sass.js +0 -8
  162. data/package/rules/node_modules.js +0 -22
  163. data/package/utils/__tests__/deep_assign.js +0 -32
  164. data/package/utils/__tests__/deep_merge.js +0 -10
  165. data/package/utils/__tests__/get_style_rule.js +0 -65
  166. data/package/utils/__tests__/objectify.js +0 -9
  167. data/package/utils/deep_assign.js +0 -22
  168. data/package/utils/deep_merge.js +0 -22
  169. data/package/utils/objectify.js +0 -3
@@ -1,53 +1,55 @@
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
+ injectClient: devServer.inject_client,
38
+ useLocalIp: devServer.use_local_ip,
39
+ public: devServer.public,
40
+ publicPath,
41
+ historyApiFallback: { disableDotRule: true },
42
+ headers: devServer.headers,
43
+ overlay: devServer.overlay,
44
+ stats: {
45
+ entrypoints: false,
46
+ errorDetails: true,
47
+ modules: false,
48
+ moduleTrace: false
49
+ },
50
+ watchOptions: devServer.watch_options
51
51
  }
52
- }
52
+ })
53
53
  }
54
+
55
+ module.exports = merge(baseConfig, devConfig)
@@ -1,77 +1,79 @@
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')
9
+
10
+ const getPlugins = () => {
11
+ const plugins = []
6
12
 
7
- module.exports = class extends Base {
8
- constructor() {
9
- super()
13
+ plugins.push(
14
+ new CompressionPlugin({
15
+ filename: '[path][base].gz[query]',
16
+ algorithm: 'gzip',
17
+ test: /\.(js|css|html|json|ico|svg|eot|otf|ttf|map)$/
18
+ })
19
+ )
10
20
 
11
- this.plugins.append(
12
- 'Compression',
21
+ if ('brotli' in process.versions) {
22
+ plugins.push(
13
23
  new CompressionPlugin({
14
- filename: '[path].gz[query]',
15
- algorithm: 'gzip',
24
+ filename: '[path][base].br[query]',
25
+ algorithm: 'brotliCompress',
16
26
  test: /\.(js|css|html|json|ico|svg|eot|otf|ttf|map)$/
17
27
  })
18
28
  )
29
+ }
19
30
 
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
- }
31
+ return plugins
32
+ }
30
33
 
31
- this.plugins.append(
32
- 'OptimizeCSSAssets',
33
- new OptimizeCSSAssetsPlugin({
34
- parser: safePostCssParser,
35
- map: {
36
- inline: false,
37
- annotation: true
34
+ const tryCssMinimizer = () => {
35
+ if (
36
+ moduleExists('css-loader') &&
37
+ moduleExists('css-minimizer-webpack-plugin')
38
+ ) {
39
+ const CssMinimizerPlugin = require('css-minimizer-webpack-plugin')
40
+ return new CssMinimizerPlugin({ sourceMap: true })
41
+ }
42
+
43
+ return null
44
+ }
45
+
46
+ const productionConfig = {
47
+ devtool: 'source-map',
48
+ stats: 'normal',
49
+ bail: true,
50
+ plugins: getPlugins(),
51
+ optimization: {
52
+ minimizer: [
53
+ tryCssMinimizer(),
54
+ new TerserPlugin({
55
+ parallel: Number.parseInt(process.env.WEBPACKER_PARALLEL, 10) || true,
56
+ terserOptions: {
57
+ parse: {
58
+ // Let terser parse ecma 8 code but always output
59
+ // ES5 compliant code for older browsers
60
+ ecma: 8
61
+ },
62
+ compress: {
63
+ ecma: 5,
64
+ warnings: false,
65
+ comparisons: false
66
+ },
67
+ mangle: { safari10: true },
68
+ output: {
69
+ ecma: 5,
70
+ comments: false,
71
+ ascii_only: true
72
+ }
38
73
  }
39
74
  })
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
- })
75
+ ].filter(Boolean)
76
76
  }
77
77
  }
78
+
79
+ 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
@@ -1,24 +1,29 @@
1
1
  /* eslint global-require: 0 */
2
2
  /* eslint import/no-dynamic-require: 0 */
3
3
 
4
+ const webpackMerge = 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
+ moduleExists,
27
+ canProcess,
28
+ ...webpackMerge
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,23 @@
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
+ /\.svg$/
17
+ ],
18
+ exclude: [/\.(js|mjs|jsx|ts|tsx)$/],
19
+ type: 'asset/resource',
20
+ generator: {
21
+ filename: 'media/images/[hash][ext][query]'
22
+ }
21
23
  }
@@ -1,20 +1,18 @@
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
+ raw: require('./raw'),
6
+ file: require('./file'),
7
+ css: require('./css'),
8
+ sass: require('./sass'),
9
+ babel: require('./babel'),
10
+ erb: require('./erb'),
11
+ coffee: require('./coffee'),
12
+ less: require('./less'),
13
+ stylus: require('./stylus')
20
14
  }
15
+
16
+ module.exports = Object.keys(rules)
17
+ .filter((key) => !!rules[key])
18
+ .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
+ )