shakapacker 8.4.0 → 9.0.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 (166) hide show
  1. checksums.yaml +4 -4
  2. data/.eslintignore +1 -0
  3. data/.eslintrc.fast.js +40 -0
  4. data/.eslintrc.js +48 -0
  5. data/.github/STATUS.md +1 -0
  6. data/.github/workflows/claude-code-review.yml +54 -0
  7. data/.github/workflows/claude.yml +50 -0
  8. data/.github/workflows/dummy.yml +8 -4
  9. data/.github/workflows/generator.yml +17 -14
  10. data/.github/workflows/node.yml +23 -1
  11. data/.github/workflows/ruby.yml +11 -0
  12. data/.github/workflows/test-bundlers.yml +170 -0
  13. data/.gitignore +17 -0
  14. data/.husky/pre-commit +2 -0
  15. data/.npmignore +56 -0
  16. data/.prettierignore +3 -0
  17. data/.rubocop.yml +1 -0
  18. data/.yalcignore +26 -0
  19. data/CHANGELOG.md +156 -18
  20. data/CLAUDE.md +29 -0
  21. data/CONTRIBUTING.md +138 -20
  22. data/Gemfile.lock +3 -3
  23. data/README.md +130 -5
  24. data/Rakefile +39 -4
  25. data/TODO.md +50 -0
  26. data/TODO_v9.md +87 -0
  27. data/conductor-setup.sh +70 -0
  28. data/conductor.json +7 -0
  29. data/docs/cdn_setup.md +379 -0
  30. data/docs/css-modules-export-mode.md +512 -0
  31. data/docs/deployment.md +10 -1
  32. data/docs/optional-peer-dependencies.md +198 -0
  33. data/docs/peer-dependencies.md +60 -0
  34. data/docs/rspack.md +190 -0
  35. data/docs/rspack_migration_guide.md +202 -0
  36. data/docs/transpiler-migration.md +188 -0
  37. data/docs/transpiler-performance.md +179 -0
  38. data/docs/troubleshooting.md +5 -0
  39. data/docs/typescript-migration.md +378 -0
  40. data/docs/typescript.md +99 -0
  41. data/docs/using_esbuild_loader.md +3 -3
  42. data/docs/using_swc_loader.md +5 -3
  43. data/docs/v6_upgrade.md +10 -0
  44. data/docs/v9_upgrade.md +413 -0
  45. data/lib/install/bin/shakapacker +3 -5
  46. data/lib/install/config/rspack/rspack.config.js +6 -0
  47. data/lib/install/config/rspack/rspack.config.ts +7 -0
  48. data/lib/install/config/shakapacker.yml +12 -2
  49. data/lib/install/config/webpack/webpack.config.ts +7 -0
  50. data/lib/install/package.json +38 -0
  51. data/lib/install/template.rb +194 -44
  52. data/lib/shakapacker/configuration.rb +141 -0
  53. data/lib/shakapacker/dev_server_runner.rb +25 -5
  54. data/lib/shakapacker/doctor.rb +844 -0
  55. data/lib/shakapacker/manifest.rb +4 -2
  56. data/lib/shakapacker/rspack_runner.rb +19 -0
  57. data/lib/shakapacker/runner.rb +144 -4
  58. data/lib/shakapacker/swc_migrator.rb +376 -0
  59. data/lib/shakapacker/utils/manager.rb +2 -0
  60. data/lib/shakapacker/version.rb +1 -1
  61. data/lib/shakapacker/version_checker.rb +1 -1
  62. data/lib/shakapacker/webpack_runner.rb +4 -42
  63. data/lib/shakapacker.rb +2 -1
  64. data/lib/tasks/shakapacker/doctor.rake +8 -0
  65. data/lib/tasks/shakapacker/install.rake +12 -2
  66. data/lib/tasks/shakapacker/migrate_to_swc.rake +13 -0
  67. data/lib/tasks/shakapacker.rake +1 -0
  68. data/package/.npmignore +4 -0
  69. data/package/babel/preset.ts +56 -0
  70. data/package/config.ts +175 -0
  71. data/package/{dev_server.js → dev_server.ts} +8 -5
  72. data/package/env.ts +92 -0
  73. data/package/environments/base.ts +138 -0
  74. data/package/environments/development.ts +90 -0
  75. data/package/environments/production.ts +80 -0
  76. data/package/environments/test.ts +53 -0
  77. data/package/environments/types.ts +90 -0
  78. data/package/esbuild/index.ts +42 -0
  79. data/package/index.d.ts +3 -97
  80. data/package/index.ts +52 -0
  81. data/package/loaders.d.ts +28 -0
  82. data/package/optimization/rspack.ts +36 -0
  83. data/package/optimization/webpack.ts +57 -0
  84. data/package/plugins/rspack.ts +103 -0
  85. data/package/plugins/webpack.ts +62 -0
  86. data/package/rspack/index.ts +64 -0
  87. data/package/rules/{babel.js → babel.ts} +2 -2
  88. data/package/rules/{coffee.js → coffee.ts} +1 -1
  89. data/package/rules/css.ts +3 -0
  90. data/package/rules/{erb.js → erb.ts} +1 -1
  91. data/package/rules/esbuild.ts +10 -0
  92. data/package/rules/file.ts +40 -0
  93. data/package/rules/{jscommon.js → jscommon.ts} +4 -4
  94. data/package/rules/{less.js → less.ts} +4 -4
  95. data/package/rules/raw.ts +25 -0
  96. data/package/rules/rspack.ts +176 -0
  97. data/package/rules/{sass.js → sass.ts} +7 -3
  98. data/package/rules/{stylus.js → stylus.ts} +4 -8
  99. data/package/rules/swc.ts +10 -0
  100. data/package/rules/{index.js → webpack.ts} +1 -1
  101. data/package/swc/index.ts +54 -0
  102. data/package/types/README.md +87 -0
  103. data/package/types/index.ts +60 -0
  104. data/package/types.ts +108 -0
  105. data/package/utils/configPath.ts +6 -0
  106. data/package/utils/debug.ts +49 -0
  107. data/package/utils/defaultConfigPath.ts +4 -0
  108. data/package/utils/errorCodes.ts +219 -0
  109. data/package/utils/errorHelpers.ts +143 -0
  110. data/package/utils/getStyleRule.ts +64 -0
  111. data/package/utils/helpers.ts +85 -0
  112. data/package/utils/{inliningCss.js → inliningCss.ts} +3 -3
  113. data/package/utils/pathValidation.ts +139 -0
  114. data/package/utils/requireOrError.ts +15 -0
  115. data/package/utils/snakeToCamelCase.ts +5 -0
  116. data/package/utils/typeGuards.ts +342 -0
  117. data/package/utils/validateDependencies.ts +61 -0
  118. data/package/webpack-types.d.ts +33 -0
  119. data/package/webpackDevServerConfig.ts +117 -0
  120. data/package.json +134 -9
  121. data/scripts/remove-use-strict.js +45 -0
  122. data/scripts/type-check-no-emit.js +27 -0
  123. data/test/package/config.test.js +3 -0
  124. data/test/package/env.test.js +42 -7
  125. data/test/package/environments/base.test.js +5 -1
  126. data/test/package/rules/babel.test.js +16 -0
  127. data/test/package/rules/esbuild.test.js +1 -1
  128. data/test/package/rules/raw.test.js +40 -7
  129. data/test/package/rules/swc.test.js +1 -1
  130. data/test/package/rules/webpack.test.js +35 -0
  131. data/test/package/staging.test.js +4 -3
  132. data/test/package/transpiler-defaults.test.js +127 -0
  133. data/test/peer-dependencies.sh +85 -0
  134. data/test/scripts/remove-use-strict.test.js +125 -0
  135. data/test/typescript/build.test.js +118 -0
  136. data/test/typescript/environments.test.js +107 -0
  137. data/test/typescript/pathValidation.test.js +142 -0
  138. data/test/typescript/securityValidation.test.js +182 -0
  139. data/tools/README.md +124 -0
  140. data/tools/css-modules-v9-codemod.js +179 -0
  141. data/tsconfig.eslint.json +16 -0
  142. data/tsconfig.json +38 -0
  143. data/yarn.lock +2704 -767
  144. metadata +111 -41
  145. data/package/babel/preset.js +0 -48
  146. data/package/config.js +0 -56
  147. data/package/env.js +0 -48
  148. data/package/environments/base.js +0 -171
  149. data/package/environments/development.js +0 -13
  150. data/package/environments/production.js +0 -88
  151. data/package/environments/test.js +0 -3
  152. data/package/esbuild/index.js +0 -40
  153. data/package/index.js +0 -40
  154. data/package/rules/css.js +0 -3
  155. data/package/rules/esbuild.js +0 -10
  156. data/package/rules/file.js +0 -29
  157. data/package/rules/raw.js +0 -5
  158. data/package/rules/swc.js +0 -10
  159. data/package/swc/index.js +0 -50
  160. data/package/utils/configPath.js +0 -4
  161. data/package/utils/defaultConfigPath.js +0 -2
  162. data/package/utils/getStyleRule.js +0 -40
  163. data/package/utils/helpers.js +0 -62
  164. data/package/utils/snakeToCamelCase.js +0 -5
  165. data/package/webpackDevServerConfig.js +0 -71
  166. data/test/package/rules/index.test.js +0 -16
@@ -1,88 +0,0 @@
1
- /* eslint global-require: 0 */
2
- /* eslint import/no-dynamic-require: 0 */
3
-
4
- const { merge } = require("webpack-merge")
5
- const CompressionPlugin = require("compression-webpack-plugin")
6
- const TerserPlugin = require("terser-webpack-plugin")
7
- const baseConfig = require("./base")
8
- const { moduleExists } = require("../utils/helpers")
9
- const config = require("../config")
10
-
11
- const getPlugins = () => {
12
- const plugins = []
13
-
14
- plugins.push(
15
- new CompressionPlugin({
16
- filename: "[path][base].gz[query]",
17
- algorithm: "gzip",
18
- test: /\.(js|css|html|json|ico|svg|eot|otf|ttf|map)$/
19
- })
20
- )
21
-
22
- if ("brotli" in process.versions) {
23
- plugins.push(
24
- new CompressionPlugin({
25
- filename: "[path][base].br[query]",
26
- algorithm: "brotliCompress",
27
- test: /\.(js|css|html|json|ico|svg|eot|otf|ttf|map)$/
28
- })
29
- )
30
- }
31
-
32
- return plugins
33
- }
34
-
35
- const tryCssMinimizer = () => {
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()
42
- }
43
-
44
- return null
45
- }
46
-
47
- const productionConfig = {
48
- devtool: "source-map",
49
- stats: "normal",
50
- bail: true,
51
- plugins: getPlugins(),
52
- optimization: {
53
- minimizer: [
54
- tryCssMinimizer(),
55
- new TerserPlugin({
56
- parallel: Number.parseInt(process.env.SHAKAPACKER_PARALLEL, 10) || true,
57
- terserOptions: {
58
- parse: {
59
- // Let terser parse ecma 8 code but always output
60
- // ES5 compliant code for older browsers
61
- ecma: 8
62
- },
63
- compress: {
64
- ecma: 5,
65
- warnings: false,
66
- comparisons: false
67
- },
68
- mangle: { safari10: true },
69
- output: {
70
- ecma: 5,
71
- comments: false,
72
- ascii_only: true
73
- }
74
- }
75
- })
76
- ].filter(Boolean)
77
- }
78
- }
79
-
80
- if (config.useContentHash === false) {
81
- // eslint-disable-next-line no-console
82
- console.warn(`⚠️ WARNING
83
- Setting 'useContentHash' to 'false' in the production environment (specified by NODE_ENV environment variable) is not allowed!
84
- Content hashes get added to the filenames regardless of setting useContentHash in 'shakapacker.yml' to false.
85
- `)
86
- }
87
-
88
- module.exports = merge(baseConfig, productionConfig)
@@ -1,3 +0,0 @@
1
- const baseConfig = require("./base")
2
-
3
- module.exports = baseConfig
@@ -1,40 +0,0 @@
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 { merge } = require("webpack-merge")
7
-
8
- const getLoaderExtension = (filename) => {
9
- const matchData = filename.match(/\.([jt]sx?)?(\.erb)?$/)
10
-
11
- if (!matchData) {
12
- return "js"
13
- }
14
-
15
- return matchData[1]
16
- }
17
-
18
- const getCustomConfig = () => {
19
- const path = resolve("config", "esbuild.config.js")
20
- if (existsSync(path)) {
21
- return require(path)
22
- }
23
- return {}
24
- }
25
-
26
- const getEsbuildLoaderConfig = (filenameToProcess) => {
27
- const customConfig = getCustomConfig()
28
- const defaultConfig = {
29
- loader: require.resolve("esbuild-loader"),
30
- options: {
31
- loader: getLoaderExtension(filenameToProcess)
32
- }
33
- }
34
-
35
- return merge(defaultConfig, customConfig)
36
- }
37
-
38
- module.exports = {
39
- getEsbuildLoaderConfig
40
- }
data/package/index.js DELETED
@@ -1,40 +0,0 @@
1
- /* eslint global-require: 0 */
2
- /* eslint import/no-dynamic-require: 0 */
3
-
4
- const webpackMerge = require("webpack-merge")
5
- const { resolve } = require("path")
6
- const { existsSync } = require("fs")
7
- const baseConfig = require("./environments/base")
8
- const rules = require("./rules")
9
- const config = require("./config")
10
- const devServer = require("./dev_server")
11
- const env = require("./env")
12
- const { moduleExists, canProcess } = require("./utils/helpers")
13
- const inliningCss = require("./utils/inliningCss")
14
-
15
- const generateWebpackConfig = (extraConfig = {}, ...extraArgs) => {
16
- if (extraArgs.length > 0) {
17
- throw new Error(
18
- "Only one extra config may be passed here - use webpack-merge to merge configs before passing them to Shakapacker"
19
- )
20
- }
21
-
22
- const { nodeEnv } = env
23
- const path = resolve(__dirname, "environments", `${nodeEnv}.js`)
24
- const environmentConfig = existsSync(path) ? require(path) : baseConfig
25
-
26
- return webpackMerge.merge({}, environmentConfig, extraConfig)
27
- }
28
-
29
- module.exports = {
30
- config, // shakapacker.yml
31
- devServer,
32
- generateWebpackConfig,
33
- baseConfig,
34
- env,
35
- rules,
36
- moduleExists,
37
- canProcess,
38
- inliningCss,
39
- ...webpackMerge
40
- }
data/package/rules/css.js DELETED
@@ -1,3 +0,0 @@
1
- const getStyleRule = require("../utils/getStyleRule")
2
-
3
- module.exports = getStyleRule(/\.(css)$/i)
@@ -1,10 +0,0 @@
1
- const { loaderMatches } = require("../utils/helpers")
2
- const { getEsbuildLoaderConfig } = require("../esbuild")
3
- const { webpack_loader: webpackLoader } = require("../config")
4
- const jscommon = require("./jscommon")
5
-
6
- module.exports = loaderMatches(webpackLoader, "esbuild", () => ({
7
- test: /\.(ts|tsx|js|jsx|mjs|coffee)?(\.erb)?$/,
8
- ...jscommon,
9
- use: ({ resource }) => getEsbuildLoaderConfig(resource)
10
- }))
@@ -1,29 +0,0 @@
1
- const { dirname } = require("path")
2
- const {
3
- additional_paths: additionalPaths,
4
- source_path: sourcePath
5
- } = require("../config")
6
-
7
- module.exports = {
8
- test: /\.(bmp|gif|jpe?g|png|tiff|ico|avif|webp|eot|otf|ttf|woff|woff2|svg)$/,
9
- exclude: /\.(js|mjs|jsx|ts|tsx)$/,
10
- type: "asset/resource",
11
- generator: {
12
- filename: (pathData) => {
13
- const path = dirname(pathData.filename)
14
- const stripPaths = [...additionalPaths, sourcePath]
15
-
16
- const selectedStripPath = stripPaths.find((includePath) =>
17
- path.startsWith(includePath)
18
- )
19
-
20
- const folders = path
21
- .replace(`${selectedStripPath}`, "")
22
- .split("/")
23
- .filter(Boolean)
24
-
25
- const foldersWithStatic = ["static", ...folders].join("/")
26
- return `${foldersWithStatic}/[name]-[hash][ext][query]`
27
- }
28
- }
29
- }
data/package/rules/raw.js DELETED
@@ -1,5 +0,0 @@
1
- module.exports = {
2
- test: /\.html$/,
3
- exclude: /\.(js|mjs|jsx|ts|tsx)$/,
4
- type: "asset/source"
5
- }
data/package/rules/swc.js DELETED
@@ -1,10 +0,0 @@
1
- const { loaderMatches } = require("../utils/helpers")
2
- const { getSwcLoaderConfig } = require("../swc")
3
- const { webpack_loader: webpackLoader } = require("../config")
4
- const jscommon = require("./jscommon")
5
-
6
- module.exports = loaderMatches(webpackLoader, "swc", () => ({
7
- test: /\.(ts|tsx|js|jsx|mjs|coffee)?(\.erb)?$/,
8
- ...jscommon,
9
- use: ({ resource }) => getSwcLoaderConfig(resource)
10
- }))
data/package/swc/index.js DELETED
@@ -1,50 +0,0 @@
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 { merge } = require("webpack-merge")
7
-
8
- const isJsxFile = (filename) => !!filename.match(/\.(jsx|tsx)?(\.erb)?$/)
9
-
10
- const isTypescriptFile = (filename) => !!filename.match(/\.(ts|tsx)?(\.erb)?$/)
11
-
12
- const getCustomConfig = () => {
13
- const path = resolve("config", "swc.config.js")
14
- if (existsSync(path)) {
15
- return require(path)
16
- }
17
- return {}
18
- }
19
-
20
- const getSwcLoaderConfig = (filenameToProcess) => {
21
- const customConfig = getCustomConfig()
22
- const defaultConfig = {
23
- loader: require.resolve("swc-loader"),
24
- options: {
25
- jsc: {
26
- parser: {
27
- dynamicImport: true,
28
- syntax: isTypescriptFile(filenameToProcess)
29
- ? "typescript"
30
- : "ecmascript",
31
- [isTypescriptFile(filenameToProcess) ? "tsx" : "jsx"]:
32
- isJsxFile(filenameToProcess)
33
- },
34
- loose: true
35
- },
36
- sourceMaps: true,
37
- env: {
38
- coreJs: 3,
39
- exclude: ["transform-typeof-symbol"],
40
- mode: "entry"
41
- }
42
- }
43
- }
44
-
45
- return merge(defaultConfig, customConfig)
46
- }
47
-
48
- module.exports = {
49
- getSwcLoaderConfig
50
- }
@@ -1,4 +0,0 @@
1
- const { resolve } = require("path")
2
-
3
- module.exports =
4
- process.env.SHAKAPACKER_CONFIG || resolve("config", "shakapacker.yml")
@@ -1,2 +0,0 @@
1
- const path = require.resolve("../../lib/install/config/shakapacker.yml")
2
- module.exports = path
@@ -1,40 +0,0 @@
1
- /* eslint global-require: 0 */
2
- const { canProcess, moduleExists } = require("./helpers")
3
- const inliningCss = require("./inliningCss")
4
-
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
- }))
12
-
13
- // style-loader is required when using css modules with HMR on the webpack-dev-server
14
-
15
- const use = [
16
- inliningCss ? "style-loader" : require("mini-css-extract-plugin").loader,
17
- {
18
- loader: require.resolve("css-loader"),
19
- options: {
20
- sourceMap: true,
21
- importLoaders: 2,
22
- modules: {
23
- auto: true
24
- }
25
- }
26
- },
27
- tryPostcss(),
28
- ...preprocessors
29
- ].filter(Boolean)
30
-
31
- return {
32
- test,
33
- use
34
- }
35
- }
36
-
37
- return null
38
- }
39
-
40
- module.exports = getStyleRule
@@ -1,62 +0,0 @@
1
- const isBoolean = (str) => /^true/.test(str) || /^false/.test(str)
2
-
3
- const ensureTrailingSlash = (path) => (path.endsWith("/") ? path : `${path}/`)
4
-
5
- const resolvedPath = (packageName) => {
6
- try {
7
- return require.resolve(packageName)
8
- } catch (e) {
9
- if (e.code !== "MODULE_NOT_FOUND") {
10
- throw e
11
- }
12
- return null
13
- }
14
- }
15
-
16
- const moduleExists = (packageName) => !!resolvedPath(packageName)
17
-
18
- const canProcess = (rule, fn) => {
19
- const modulePath = resolvedPath(rule)
20
-
21
- if (modulePath) {
22
- return fn(modulePath)
23
- }
24
-
25
- return null
26
- }
27
-
28
- const loaderMatches = (configLoader, loaderToCheck, fn) => {
29
- if (configLoader !== loaderToCheck) {
30
- return null
31
- }
32
-
33
- const loaderName = `${configLoader}-loader`
34
-
35
- if (!moduleExists(loaderName)) {
36
- throw new Error(
37
- `Your Shakapacker config specified using ${configLoader}, but ${loaderName} package is not installed. Please install ${loaderName} first.`
38
- )
39
- }
40
-
41
- return fn()
42
- }
43
-
44
- const packageFullVersion = (packageName) => {
45
- // eslint-disable-next-line import/no-dynamic-require
46
- const packageJsonPath = require.resolve(`${packageName}/package.json`)
47
- // eslint-disable-next-line import/no-dynamic-require, global-require
48
- return require(packageJsonPath).version
49
- }
50
-
51
- const packageMajorVersion = (packageName) =>
52
- packageFullVersion(packageName).match(/^\d+/)[0]
53
-
54
- module.exports = {
55
- isBoolean,
56
- ensureTrailingSlash,
57
- canProcess,
58
- moduleExists,
59
- loaderMatches,
60
- packageFullVersion,
61
- packageMajorVersion
62
- }
@@ -1,5 +0,0 @@
1
- function snakeToCamelCase(s) {
2
- return s.replace(/(_\w)/g, (match) => match[1].toUpperCase())
3
- }
4
-
5
- module.exports = snakeToCamelCase
@@ -1,71 +0,0 @@
1
- const shakapackerDevServerYamlConfig = require("./dev_server")
2
- const snakeToCamelCase = require("./utils/snakeToCamelCase")
3
- const { outputPath: contentBase, publicPath } = require("./config")
4
-
5
- const webpackDevServerMappedKeys = new Set([
6
- // client, server, liveReload, devMiddleware are handled separately
7
- "allowedHosts",
8
- "bonjour",
9
- "compress",
10
- "headers",
11
- "historyApiFallback",
12
- "host",
13
- "hot",
14
- "http2",
15
- "https",
16
- "ipc",
17
- "magicHtml",
18
- "onAfterSetupMiddleware",
19
- "onBeforeSetupMiddleware",
20
- "open",
21
- "port",
22
- "proxy",
23
- "server",
24
- "setupExitSignals",
25
- "setupMiddlewares",
26
- "watchFiles",
27
- "webSocketServer"
28
- ])
29
-
30
- function createDevServerConfig() {
31
- const devServerYamlConfig = { ...shakapackerDevServerYamlConfig }
32
- const liveReload =
33
- devServerYamlConfig.live_reload !== undefined
34
- ? devServerYamlConfig.live_reload
35
- : !devServerYamlConfig.hmr
36
- delete devServerYamlConfig.live_reload
37
-
38
- const config = {
39
- devMiddleware: {
40
- publicPath
41
- },
42
- liveReload,
43
- historyApiFallback: {
44
- disableDotRule: true
45
- },
46
- static: {
47
- publicPath: contentBase
48
- }
49
- }
50
-
51
- if (devServerYamlConfig.static) {
52
- config.static = { ...config.static, ...devServerYamlConfig.static }
53
- delete devServerYamlConfig.static
54
- }
55
-
56
- if (devServerYamlConfig.client) {
57
- config.client = devServerYamlConfig.client
58
- delete devServerYamlConfig.client
59
- }
60
-
61
- Object.keys(devServerYamlConfig).forEach((yamlKey) => {
62
- const camelYamlKey = snakeToCamelCase(yamlKey)
63
- if (webpackDevServerMappedKeys.has(camelYamlKey)) {
64
- config[camelYamlKey] = devServerYamlConfig[yamlKey]
65
- }
66
- })
67
-
68
- return config
69
- }
70
-
71
- module.exports = createDevServerConfig
@@ -1,16 +0,0 @@
1
- const rules = require("../../../package/rules/index")
2
-
3
- jest.mock("../../../package/utils/helpers", () => {
4
- const original = jest.requireActual("../../../package/utils/helpers")
5
- const moduleExists = () => false
6
- return {
7
- ...original,
8
- moduleExists
9
- }
10
- })
11
-
12
- describe("index", () => {
13
- test("rule tests are regexes", () => {
14
- rules.forEach((rule) => expect(rule.test instanceof RegExp).toBe(true))
15
- })
16
- })