jetpacker 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (190) hide show
  1. checksums.yaml +4 -4
  2. data/.eslintignore +4 -0
  3. data/.eslintrc.js +14 -0
  4. data/.gitignore +11 -11
  5. data/.node-version +1 -0
  6. data/.rubocop.yml +125 -0
  7. data/.travis.yml +54 -5
  8. data/CHANGELOG.jetpacker.md +7 -0
  9. data/CHANGELOG.md +1000 -0
  10. data/CONTRIBUTING.md +33 -0
  11. data/Gemfile +9 -3
  12. data/Gemfile.lock +157 -21
  13. data/MIT-LICENSE +20 -0
  14. data/README.md +671 -16
  15. data/Rakefile +8 -3
  16. data/docs/assets.md +119 -0
  17. data/docs/cloud9.md +310 -0
  18. data/docs/css.md +253 -0
  19. data/docs/deployment.md +130 -0
  20. data/docs/docker.md +68 -0
  21. data/docs/engines.md +200 -0
  22. data/docs/env.md +65 -0
  23. data/docs/es6.md +72 -0
  24. data/docs/folder-structure.md +66 -0
  25. data/docs/misc.md +23 -0
  26. data/docs/props.md +223 -0
  27. data/docs/testing.md +137 -0
  28. data/docs/troubleshooting.md +156 -0
  29. data/docs/typescript.md +126 -0
  30. data/docs/v4-upgrade.md +142 -0
  31. data/docs/webpack-dev-server.md +92 -0
  32. data/docs/webpack.md +364 -0
  33. data/docs/yarn.md +23 -0
  34. data/gemfiles/Gemfile-rails-edge +12 -0
  35. data/gemfiles/Gemfile-rails.4.2.x +9 -0
  36. data/gemfiles/Gemfile-rails.5.0.x +9 -0
  37. data/gemfiles/Gemfile-rails.5.1.x +9 -0
  38. data/gemfiles/Gemfile-rails.5.2.x +9 -0
  39. data/gemfiles/Gemfile-rails.6.0.x +9 -0
  40. data/jetpacker.gemspec +28 -22
  41. data/lib/install/angular.rb +23 -0
  42. data/lib/install/bin/webpack +18 -0
  43. data/lib/install/bin/webpack-dev-server +18 -0
  44. data/lib/install/binstubs.rb +4 -0
  45. data/lib/install/coffee.rb +25 -0
  46. data/lib/install/config/.browserslistrc +1 -0
  47. data/lib/install/config/babel.config.js +72 -0
  48. data/lib/install/config/postcss.config.js +12 -0
  49. data/lib/install/config/webpack/development.js +5 -0
  50. data/lib/install/config/webpack/environment.js +3 -0
  51. data/lib/install/config/webpack/production.js +5 -0
  52. data/lib/install/config/webpack/test.js +5 -0
  53. data/lib/install/config/webpacker.yml +96 -0
  54. data/lib/install/elm.rb +39 -0
  55. data/lib/install/erb.rb +25 -0
  56. data/lib/install/examples/angular/hello_angular.js +7 -0
  57. data/lib/install/examples/angular/hello_angular/app/app.component.ts +9 -0
  58. data/lib/install/examples/angular/hello_angular/app/app.module.ts +16 -0
  59. data/lib/install/examples/angular/hello_angular/index.ts +8 -0
  60. data/lib/install/examples/angular/hello_angular/polyfills.ts +73 -0
  61. data/lib/install/examples/coffee/hello_coffee.coffee +4 -0
  62. data/lib/install/examples/elm/Main.elm +55 -0
  63. data/lib/install/examples/elm/hello_elm.js +16 -0
  64. data/lib/install/examples/erb/hello_erb.js.erb +6 -0
  65. data/lib/install/examples/react/babel.config.js +87 -0
  66. data/lib/install/examples/react/hello_react.jsx +26 -0
  67. data/lib/install/examples/react/tsconfig.json +20 -0
  68. data/lib/install/examples/stimulus/application.js +1 -0
  69. data/lib/install/examples/stimulus/controllers/hello_controller.js +18 -0
  70. data/lib/install/examples/stimulus/controllers/index.js +9 -0
  71. data/lib/install/examples/svelte/app.svelte +11 -0
  72. data/lib/install/examples/svelte/hello_svelte.js +20 -0
  73. data/lib/install/examples/typescript/hello_typescript.ts +4 -0
  74. data/lib/install/examples/typescript/tsconfig.json +23 -0
  75. data/lib/install/examples/vue/app.vue +22 -0
  76. data/lib/install/examples/vue/hello_vue.js +72 -0
  77. data/lib/install/javascript/packs/application.js +18 -0
  78. data/lib/install/loaders/coffee.js +6 -0
  79. data/lib/install/loaders/elm.js +25 -0
  80. data/lib/install/loaders/erb.js +11 -0
  81. data/lib/install/loaders/svelte.js +9 -0
  82. data/lib/install/loaders/typescript.js +11 -0
  83. data/lib/install/loaders/vue.js +6 -0
  84. data/lib/install/react.rb +18 -0
  85. data/lib/install/stimulus.rb +12 -0
  86. data/lib/install/svelte.rb +29 -0
  87. data/lib/install/template.rb +55 -0
  88. data/lib/install/typescript.rb +46 -0
  89. data/lib/install/vue.rb +49 -0
  90. data/lib/jetpacker/version.rb +2 -1
  91. data/lib/tasks/installers.rake +37 -0
  92. data/lib/tasks/webpacker.rake +28 -0
  93. data/lib/tasks/webpacker/binstubs.rake +11 -0
  94. data/lib/tasks/webpacker/check_binstubs.rake +12 -0
  95. data/lib/tasks/webpacker/check_node.rake +24 -0
  96. data/lib/tasks/webpacker/check_yarn.rake +24 -0
  97. data/lib/tasks/webpacker/clean.rake +21 -0
  98. data/lib/tasks/webpacker/clobber.rake +16 -0
  99. data/lib/tasks/webpacker/compile.rake +43 -0
  100. data/lib/tasks/webpacker/info.rake +20 -0
  101. data/lib/tasks/webpacker/install.rake +13 -0
  102. data/lib/tasks/webpacker/verify_install.rake +13 -0
  103. data/lib/tasks/webpacker/yarn_install.rake +21 -0
  104. data/lib/webpacker.rb +46 -0
  105. data/lib/webpacker/commands.rb +50 -0
  106. data/lib/webpacker/compiler.rb +107 -0
  107. data/lib/webpacker/configuration.rb +113 -0
  108. data/lib/webpacker/dev_server.rb +66 -0
  109. data/lib/webpacker/dev_server_proxy.rb +31 -0
  110. data/lib/webpacker/dev_server_runner.rb +72 -0
  111. data/lib/webpacker/env.rb +39 -0
  112. data/lib/webpacker/helper.rb +176 -0
  113. data/lib/webpacker/instance.rb +37 -0
  114. data/lib/webpacker/manifest.rb +118 -0
  115. data/lib/webpacker/railtie.rb +98 -0
  116. data/lib/webpacker/rake_tasks.rb +6 -0
  117. data/lib/webpacker/runner.rb +22 -0
  118. data/lib/webpacker/version.rb +4 -0
  119. data/lib/webpacker/webpack_runner.rb +32 -0
  120. data/package.json +82 -0
  121. data/package/__tests__/config.js +55 -0
  122. data/package/__tests__/dev_server.js +43 -0
  123. data/package/__tests__/development.js +30 -0
  124. data/package/__tests__/env.js +46 -0
  125. data/package/__tests__/production.js +29 -0
  126. data/package/__tests__/staging.js +29 -0
  127. data/package/__tests__/test.js +26 -0
  128. data/package/config.js +37 -0
  129. data/package/config_types/__tests__/config_list.js +118 -0
  130. data/package/config_types/__tests__/config_object.js +43 -0
  131. data/package/config_types/config_list.js +75 -0
  132. data/package/config_types/config_object.js +55 -0
  133. data/package/config_types/index.js +7 -0
  134. data/package/dev_server.js +20 -0
  135. data/package/env.js +19 -0
  136. data/package/environments/__tests__/base.js +74 -0
  137. data/package/environments/base.js +166 -0
  138. data/package/environments/development.js +51 -0
  139. data/package/environments/production.js +79 -0
  140. data/package/environments/test.js +3 -0
  141. data/package/index.js +24 -0
  142. data/package/rules/babel.js +21 -0
  143. data/package/rules/css.js +3 -0
  144. data/package/rules/file.js +20 -0
  145. data/package/rules/index.js +20 -0
  146. data/package/rules/module.css.js +3 -0
  147. data/package/rules/module.sass.js +8 -0
  148. data/package/rules/node_modules.js +24 -0
  149. data/package/rules/sass.js +8 -0
  150. data/package/utils/__tests__/deep_assign.js +32 -0
  151. data/package/utils/__tests__/deep_merge.js +10 -0
  152. data/package/utils/__tests__/get_style_rule.js +65 -0
  153. data/package/utils/__tests__/objectify.js +9 -0
  154. data/package/utils/deep_assign.js +22 -0
  155. data/package/utils/deep_merge.js +22 -0
  156. data/package/utils/get_style_rule.js +45 -0
  157. data/package/utils/helpers.js +58 -0
  158. data/package/utils/objectify.js +3 -0
  159. data/test/command_test.rb +33 -0
  160. data/test/compiler_test.rb +75 -0
  161. data/test/configuration_test.rb +108 -0
  162. data/test/dev_server_runner_test.rb +51 -0
  163. data/test/dev_server_test.rb +47 -0
  164. data/test/env_test.rb +23 -0
  165. data/test/helper_test.rb +142 -0
  166. data/test/manifest_test.rb +42 -0
  167. data/test/rake_tasks_test.rb +69 -0
  168. data/test/test_app/Rakefile +3 -0
  169. data/test/test_app/app/javascript/packs/application.js +10 -0
  170. data/test/test_app/bin/webpack +14 -0
  171. data/test/test_app/bin/webpack-dev-server +14 -0
  172. data/test/test_app/config.ru +5 -0
  173. data/test/test_app/config/application.rb +12 -0
  174. data/test/test_app/config/environment.rb +4 -0
  175. data/test/test_app/config/webpack/development.js +0 -0
  176. data/test/test_app/config/webpacker.yml +97 -0
  177. data/test/test_app/config/webpacker_public_root.yml +19 -0
  178. data/test/test_app/package.json +13 -0
  179. data/test/test_app/public/packs/manifest.json +31 -0
  180. data/test/test_app/yarn.lock +11 -0
  181. data/test/test_helper.rb +33 -0
  182. data/test/webpack_runner_test.rb +51 -0
  183. data/test/webpacker_test.rb +13 -0
  184. data/yarn.lock +8321 -0
  185. metadata +267 -29
  186. data/.rspec +0 -3
  187. data/LICENSE.txt +0 -21
  188. data/bin/console +0 -14
  189. data/bin/setup +0 -8
  190. data/lib/jetpacker.rb +0 -6
@@ -0,0 +1,166 @@
1
+ /* eslint global-require: 0 */
2
+ /* eslint import/no-dynamic-require: 0 */
3
+
4
+ const {
5
+ basename, dirname, join, relative, resolve
6
+ } = require('path')
7
+ const { sync } = require('glob')
8
+ const extname = require('path-complete-extname')
9
+
10
+ const webpack = require('webpack')
11
+ const MiniCssExtractPlugin = require('mini-css-extract-plugin')
12
+ const WebpackAssetsManifest = require('webpack-assets-manifest')
13
+ const CaseSensitivePathsPlugin = require('case-sensitive-paths-webpack-plugin')
14
+ const PnpWebpackPlugin = require('pnp-webpack-plugin')
15
+
16
+ const { isNotObject, prettyPrint } = require('../utils/helpers')
17
+ const deepMerge = require('../utils/deep_merge')
18
+
19
+ const { ConfigList, ConfigObject } = require('../config_types')
20
+ const rules = require('../rules')
21
+ const config = require('../config')
22
+
23
+ const getLoaderList = () => {
24
+ const result = new ConfigList()
25
+ Object.keys(rules).forEach((key) => result.append(key, rules[key]))
26
+ return result
27
+ }
28
+
29
+ const getPluginList = () => {
30
+ const result = new ConfigList()
31
+ result.append(
32
+ 'Environment',
33
+ new webpack.EnvironmentPlugin(JSON.parse(JSON.stringify(process.env)))
34
+ )
35
+ result.append('CaseSensitivePaths', new CaseSensitivePathsPlugin())
36
+ result.append(
37
+ 'MiniCssExtract',
38
+ new MiniCssExtractPlugin({
39
+ filename: 'css/[name]-[contenthash:8].css',
40
+ chunkFilename: 'css/[name]-[contenthash:8].chunk.css'
41
+ })
42
+ )
43
+ result.append(
44
+ 'Manifest',
45
+ new WebpackAssetsManifest({
46
+ integrity: false,
47
+ entrypoints: true,
48
+ writeToDisk: true,
49
+ publicPath: config.publicPathWithoutCDN
50
+ })
51
+ )
52
+ return result
53
+ }
54
+
55
+ const getExtensionsGlob = () => {
56
+ const { extensions } = config
57
+ return extensions.length === 1 ? `**/*${extensions[0]}` : `**/*{${extensions.join(',')}}`
58
+ }
59
+
60
+ const getEntryObject = () => {
61
+ const result = new ConfigObject()
62
+ const glob = getExtensionsGlob()
63
+ const rootPath = join(config.source_path, config.source_entry_path)
64
+ const paths = sync(join(rootPath, glob))
65
+ paths.forEach((path) => {
66
+ const namespace = relative(join(rootPath), dirname(path))
67
+ const name = join(namespace, basename(path, extname(path)))
68
+ result.set(name, resolve(path))
69
+ })
70
+ return result
71
+ }
72
+
73
+ const getModulePaths = () => {
74
+ const result = new ConfigList()
75
+ result.append('source', resolve(config.source_path))
76
+ if (config.resolved_paths) {
77
+ config.resolved_paths.forEach((path) => result.append(path, resolve(path)))
78
+ }
79
+ result.append('node_modules', 'node_modules')
80
+ return result
81
+ }
82
+
83
+ const getBaseConfig = () => new ConfigObject({
84
+ mode: 'production',
85
+ output: {
86
+ filename: 'js/[name]-[contenthash].js',
87
+ chunkFilename: 'js/[name]-[contenthash].chunk.js',
88
+ hotUpdateChunkFilename: 'js/[id]-[hash].hot-update.js',
89
+ path: config.outputPath,
90
+ publicPath: config.publicPath
91
+ },
92
+
93
+ resolve: {
94
+ extensions: config.extensions,
95
+ plugins: [PnpWebpackPlugin]
96
+ },
97
+
98
+ resolveLoader: {
99
+ modules: ['node_modules'],
100
+ plugins: [PnpWebpackPlugin.moduleLoader(module)]
101
+ },
102
+
103
+ node: {
104
+ dgram: 'empty',
105
+ fs: 'empty',
106
+ net: 'empty',
107
+ tls: 'empty',
108
+ child_process: 'empty'
109
+ }
110
+ })
111
+
112
+ module.exports = class Base {
113
+ constructor() {
114
+ this.loaders = getLoaderList()
115
+ this.plugins = getPluginList()
116
+ this.config = getBaseConfig()
117
+ this.entry = getEntryObject()
118
+ this.resolvedModules = getModulePaths()
119
+ }
120
+
121
+ splitChunks(callback = null) {
122
+ let appConfig = {}
123
+ const defaultConfig = {
124
+ optimization: {
125
+ // Split vendor and common chunks
126
+ // https://twitter.com/wSokra/status/969633336732905474
127
+ splitChunks: {
128
+ chunks: 'all',
129
+ name: false
130
+ },
131
+ // Separate runtime chunk to enable long term caching
132
+ // https://twitter.com/wSokra/status/969679223278505985
133
+ runtimeChunk: true
134
+ }
135
+ }
136
+
137
+ if (callback) {
138
+ appConfig = callback(defaultConfig)
139
+ if (isNotObject(appConfig)) {
140
+ throw new Error(`
141
+ ${prettyPrint(appConfig)} is not a valid splitChunks configuration.
142
+ See https://webpack.js.org/plugins/split-chunks-plugin/#configuration
143
+ `)
144
+ }
145
+ }
146
+
147
+ return this.config.merge(deepMerge(defaultConfig, appConfig))
148
+ }
149
+
150
+ toWebpackConfig() {
151
+ return this.config.merge({
152
+ entry: this.entry.toObject(),
153
+
154
+ module: {
155
+ strictExportPresence: true,
156
+ rules: [{ parser: { requireEnsure: false } }, ...this.loaders.values()]
157
+ },
158
+
159
+ plugins: this.plugins.values(),
160
+
161
+ resolve: {
162
+ modules: this.resolvedModules.values()
163
+ }
164
+ })
165
+ }
166
+ }
@@ -0,0 +1,51 @@
1
+ const webpack = require('webpack')
2
+ const Base = require('./base')
3
+ const devServer = require('../dev_server')
4
+ const { outputPath: contentBase, publicPath } = require('../config')
5
+
6
+ module.exports = class extends Base {
7
+ constructor() {
8
+ super()
9
+
10
+ if (devServer.hmr) {
11
+ this.plugins.append('HotModuleReplacement', new webpack.HotModuleReplacementPlugin())
12
+ this.config.output.filename = '[name]-[hash].js'
13
+ }
14
+
15
+ this.config.merge({
16
+ mode: 'development',
17
+ cache: true,
18
+ devtool: 'cheap-module-source-map',
19
+ output: {
20
+ pathinfo: true
21
+ },
22
+ devServer: {
23
+ clientLogLevel: 'none',
24
+ compress: devServer.compress,
25
+ quiet: devServer.quiet,
26
+ disableHostCheck: devServer.disable_host_check,
27
+ host: devServer.host,
28
+ port: devServer.port,
29
+ https: devServer.https,
30
+ hot: devServer.hmr,
31
+ contentBase,
32
+ inline: devServer.inline,
33
+ useLocalIp: devServer.use_local_ip,
34
+ public: devServer.public,
35
+ publicPath,
36
+ historyApiFallback: {
37
+ disableDotRule: true
38
+ },
39
+ headers: devServer.headers,
40
+ overlay: devServer.overlay,
41
+ stats: {
42
+ entrypoints: false,
43
+ errorDetails: true,
44
+ modules: false,
45
+ moduleTrace: false
46
+ },
47
+ watchOptions: devServer.watch_options
48
+ }
49
+ })
50
+ }
51
+ }
@@ -0,0 +1,79 @@
1
+ const TerserPlugin = require('terser-webpack-plugin')
2
+ 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
+
7
+ module.exports = class extends Base {
8
+ constructor() {
9
+ super()
10
+
11
+ this.plugins.append(
12
+ 'Compression',
13
+ new CompressionPlugin({
14
+ filename: '[path].gz[query]',
15
+ algorithm: 'gzip',
16
+ cache: true,
17
+ test: /\.(js|css|html|json|ico|svg|eot|otf|ttf|map)$/
18
+ })
19
+ )
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
+
33
+ this.plugins.append(
34
+ 'OptimizeCSSAssets',
35
+ new OptimizeCSSAssetsPlugin({
36
+ parser: safePostCssParser,
37
+ map: {
38
+ inline: false,
39
+ annotation: true
40
+ }
41
+ })
42
+ )
43
+
44
+ this.config.merge({
45
+ devtool: 'source-map',
46
+ stats: 'normal',
47
+ bail: true,
48
+ optimization: {
49
+ minimizer: [
50
+ new TerserPlugin({
51
+ parallel: true,
52
+ cache: true,
53
+ sourceMap: true,
54
+ terserOptions: {
55
+ parse: {
56
+ // Let terser parse ecma 8 code but always output
57
+ // ES5 compliant code for older browsers
58
+ ecma: 8
59
+ },
60
+ compress: {
61
+ ecma: 5,
62
+ warnings: false,
63
+ comparisons: false
64
+ },
65
+ mangle: {
66
+ safari10: true
67
+ },
68
+ output: {
69
+ ecma: 5,
70
+ comments: false,
71
+ ascii_only: true
72
+ }
73
+ }
74
+ })
75
+ ]
76
+ }
77
+ })
78
+ }
79
+ }
@@ -0,0 +1,3 @@
1
+ const Base = require('./base')
2
+
3
+ module.exports = class extends Base {}
@@ -0,0 +1,24 @@
1
+ /* eslint global-require: 0 */
2
+ /* eslint import/no-dynamic-require: 0 */
3
+
4
+ const { resolve } = require('path')
5
+ const { existsSync } = require('fs')
6
+ const Environment = require('./environments/base')
7
+ const loaders = require('./rules')
8
+ const config = require('./config')
9
+ const devServer = require('./dev_server')
10
+ const { nodeEnv } = require('./env')
11
+
12
+ const createEnvironment = () => {
13
+ const path = resolve(__dirname, 'environments', `${nodeEnv}.js`)
14
+ const constructor = existsSync(path) ? require(path) : Environment
15
+ return new constructor()
16
+ }
17
+
18
+ module.exports = {
19
+ config,
20
+ devServer,
21
+ environment: createEnvironment(),
22
+ Environment,
23
+ loaders
24
+ }
@@ -0,0 +1,21 @@
1
+ const { join, resolve } = require('path')
2
+ const { cache_path: cachePath, source_path: sourcePath, resolved_paths: resolvedPaths } = require('../config')
3
+ const { nodeEnv } = require('../env')
4
+
5
+ // Process application Javascript code with Babel.
6
+ // Uses application .babelrc to apply any transformations
7
+ module.exports = {
8
+ test: /\.(js|jsx|mjs)?(\.erb)?$/,
9
+ include: [sourcePath, ...resolvedPaths].map((p) => resolve(p)),
10
+ exclude: /node_modules/,
11
+ use: [
12
+ {
13
+ loader: 'babel-loader',
14
+ options: {
15
+ cacheDirectory: join(cachePath, 'babel-loader-node-modules'),
16
+ cacheCompression: nodeEnv === 'production',
17
+ compact: nodeEnv === 'production'
18
+ }
19
+ }
20
+ ]
21
+ }
@@ -0,0 +1,3 @@
1
+ const getStyleRule = require('../utils/get_style_rule')
2
+
3
+ module.exports = getStyleRule(/\.(css)$/i)
@@ -0,0 +1,20 @@
1
+ const { join } = require('path')
2
+ const { source_path: sourcePath, static_assets_extensions: fileExtensions } = require('../config')
3
+
4
+ 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
+ context: join(sourcePath)
17
+ }
18
+ }
19
+ ]
20
+ }
@@ -0,0 +1,20 @@
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')
8
+
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
20
+ }
@@ -0,0 +1,3 @@
1
+ const getStyleRule = require('../utils/get_style_rule')
2
+
3
+ module.exports = getStyleRule(/\.(css)$/i, true)
@@ -0,0 +1,8 @@
1
+ const getStyleRule = require('../utils/get_style_rule')
2
+
3
+ module.exports = getStyleRule(/\.(scss|sass)$/i, true, [
4
+ {
5
+ loader: 'sass-loader',
6
+ options: { sourceMap: true }
7
+ }
8
+ ])
@@ -0,0 +1,24 @@
1
+ const { join } = require('path')
2
+ const { cache_path: cachePath } = require('../config')
3
+ const { nodeEnv } = require('../env')
4
+
5
+ // Compile standard ES features for JS in node_modules with Babel.
6
+ // Regex details for exclude: https://regex101.com/r/SKPnnv/1
7
+ module.exports = {
8
+ test: /\.(js|mjs)$/,
9
+ include: /node_modules/,
10
+ exclude: /(?:@?babel(?:\/|\\{1,2}|-).+)|regenerator-runtime|core-js|^webpack$|^webpack-assets-manifest$|^webpack-cli$|^webpack-sources$|^@rails\/webpacker$/,
11
+ use: [
12
+ {
13
+ loader: 'babel-loader',
14
+ options: {
15
+ babelrc: false,
16
+ presets: [['@babel/preset-env', { modules: false }]],
17
+ cacheDirectory: join(cachePath, 'babel-loader-node-modules'),
18
+ cacheCompression: nodeEnv === 'production',
19
+ compact: false,
20
+ sourceMaps: false
21
+ }
22
+ }
23
+ ]
24
+ }
@@ -0,0 +1,8 @@
1
+ const getStyleRule = require('../utils/get_style_rule')
2
+
3
+ module.exports = getStyleRule(/\.(scss|sass)(\.erb)?$/i, false, [
4
+ {
5
+ loader: 'sass-loader',
6
+ options: { sourceMap: true }
7
+ }
8
+ ])