shakapacker 8.0.2 → 9.2.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 (198) 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 +9 -4
  9. data/.github/workflows/generator.yml +32 -10
  10. data/.github/workflows/node.yml +23 -1
  11. data/.github/workflows/ruby.yml +33 -2
  12. data/.github/workflows/test-bundlers.yml +170 -0
  13. data/.gitignore +20 -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 +302 -16
  20. data/CLAUDE.md +29 -0
  21. data/CONTRIBUTING.md +138 -20
  22. data/Gemfile.lock +83 -89
  23. data/README.md +343 -105
  24. data/Rakefile +39 -4
  25. data/TODO.md +50 -0
  26. data/TODO_v9.md +87 -0
  27. data/bin/export-bundler-config +11 -0
  28. data/conductor-setup.sh +70 -0
  29. data/conductor.json +7 -0
  30. data/docs/cdn_setup.md +379 -0
  31. data/docs/common-upgrades.md +615 -0
  32. data/docs/css-modules-export-mode.md +512 -0
  33. data/docs/deployment.md +62 -9
  34. data/docs/optional-peer-dependencies.md +198 -0
  35. data/docs/peer-dependencies.md +60 -0
  36. data/docs/react.md +6 -14
  37. data/docs/releasing.md +197 -0
  38. data/docs/rspack.md +190 -0
  39. data/docs/rspack_migration_guide.md +305 -0
  40. data/docs/subresource_integrity.md +54 -0
  41. data/docs/transpiler-migration.md +209 -0
  42. data/docs/transpiler-performance.md +179 -0
  43. data/docs/troubleshooting.md +157 -22
  44. data/docs/typescript-migration.md +379 -0
  45. data/docs/typescript.md +99 -0
  46. data/docs/using_esbuild_loader.md +3 -3
  47. data/docs/using_swc_loader.md +112 -10
  48. data/docs/v6_upgrade.md +10 -0
  49. data/docs/v8_upgrade.md +3 -5
  50. data/docs/v9_upgrade.md +458 -0
  51. data/gemfiles/Gemfile-rails.6.0.x +2 -1
  52. data/gemfiles/Gemfile-rails.6.1.x +1 -1
  53. data/gemfiles/Gemfile-rails.7.0.x +2 -2
  54. data/gemfiles/Gemfile-rails.7.1.x +1 -2
  55. data/gemfiles/Gemfile-rails.7.2.x +11 -0
  56. data/gemfiles/Gemfile-rails.8.0.x +11 -0
  57. data/lib/install/bin/export-bundler-config +11 -0
  58. data/lib/install/bin/shakapacker +4 -6
  59. data/lib/install/bin/shakapacker-dev-server +1 -1
  60. data/lib/install/config/rspack/rspack.config.js +6 -0
  61. data/lib/install/config/rspack/rspack.config.ts +7 -0
  62. data/lib/install/config/shakapacker.yml +25 -5
  63. data/lib/install/config/webpack/webpack.config.ts +7 -0
  64. data/lib/install/package.json +38 -0
  65. data/lib/install/template.rb +194 -44
  66. data/lib/shakapacker/bundler_switcher.rb +329 -0
  67. data/lib/shakapacker/compiler.rb +2 -1
  68. data/lib/shakapacker/compiler_strategy.rb +2 -2
  69. data/lib/shakapacker/configuration.rb +173 -2
  70. data/lib/shakapacker/dev_server_runner.rb +29 -8
  71. data/lib/shakapacker/digest_strategy.rb +2 -1
  72. data/lib/shakapacker/doctor.rb +905 -0
  73. data/lib/shakapacker/helper.rb +64 -16
  74. data/lib/shakapacker/manifest.rb +10 -3
  75. data/lib/shakapacker/mtime_strategy.rb +1 -1
  76. data/lib/shakapacker/railtie.rb +4 -4
  77. data/lib/shakapacker/rspack_runner.rb +19 -0
  78. data/lib/shakapacker/runner.rb +159 -10
  79. data/lib/shakapacker/swc_migrator.rb +384 -0
  80. data/lib/shakapacker/utils/manager.rb +15 -2
  81. data/lib/shakapacker/version.rb +1 -1
  82. data/lib/shakapacker/version_checker.rb +2 -2
  83. data/lib/shakapacker/webpack_runner.rb +6 -43
  84. data/lib/shakapacker.rb +22 -11
  85. data/lib/tasks/shakapacker/doctor.rake +8 -0
  86. data/lib/tasks/shakapacker/export_bundler_config.rake +72 -0
  87. data/lib/tasks/shakapacker/install.rake +12 -2
  88. data/lib/tasks/shakapacker/migrate_to_swc.rake +13 -0
  89. data/lib/tasks/shakapacker/switch_bundler.rake +82 -0
  90. data/lib/tasks/shakapacker.rake +2 -0
  91. data/package/.npmignore +4 -0
  92. data/package/babel/preset.ts +56 -0
  93. data/package/config.ts +175 -0
  94. data/package/configExporter/cli.ts +683 -0
  95. data/package/configExporter/configDocs.ts +102 -0
  96. data/package/configExporter/fileWriter.ts +92 -0
  97. data/package/configExporter/index.ts +5 -0
  98. data/package/configExporter/types.ts +36 -0
  99. data/package/configExporter/yamlSerializer.ts +266 -0
  100. data/package/{dev_server.js → dev_server.ts} +8 -5
  101. data/package/env.ts +92 -0
  102. data/package/environments/__type-tests__/rspack-plugin-compatibility.ts +30 -0
  103. data/package/environments/{base.js → base.ts} +56 -60
  104. data/package/environments/development.ts +90 -0
  105. data/package/environments/production.ts +80 -0
  106. data/package/environments/test.ts +53 -0
  107. data/package/environments/types.ts +98 -0
  108. data/package/esbuild/index.ts +42 -0
  109. data/package/index.d.ts +3 -60
  110. data/package/index.ts +55 -0
  111. data/package/loaders.d.ts +28 -0
  112. data/package/optimization/rspack.ts +36 -0
  113. data/package/optimization/webpack.ts +57 -0
  114. data/package/plugins/rspack.ts +103 -0
  115. data/package/plugins/webpack.ts +62 -0
  116. data/package/rspack/index.ts +64 -0
  117. data/package/rules/{babel.js → babel.ts} +2 -2
  118. data/package/rules/{coffee.js → coffee.ts} +1 -1
  119. data/package/rules/css.ts +3 -0
  120. data/package/rules/{erb.js → erb.ts} +1 -1
  121. data/package/rules/esbuild.ts +10 -0
  122. data/package/rules/file.ts +40 -0
  123. data/package/rules/{jscommon.js → jscommon.ts} +4 -4
  124. data/package/rules/{less.js → less.ts} +4 -4
  125. data/package/rules/raw.ts +25 -0
  126. data/package/rules/rspack.ts +176 -0
  127. data/package/rules/{sass.js → sass.ts} +7 -3
  128. data/package/rules/{stylus.js → stylus.ts} +4 -8
  129. data/package/rules/swc.ts +10 -0
  130. data/package/rules/webpack.ts +16 -0
  131. data/package/swc/index.ts +56 -0
  132. data/package/types/README.md +88 -0
  133. data/package/types/index.ts +61 -0
  134. data/package/types.ts +108 -0
  135. data/package/utils/configPath.ts +6 -0
  136. data/package/utils/debug.ts +49 -0
  137. data/package/utils/defaultConfigPath.ts +4 -0
  138. data/package/utils/errorCodes.ts +219 -0
  139. data/package/utils/errorHelpers.ts +143 -0
  140. data/package/utils/getStyleRule.ts +64 -0
  141. data/package/utils/helpers.ts +85 -0
  142. data/package/utils/{inliningCss.js → inliningCss.ts} +3 -3
  143. data/package/utils/pathValidation.ts +139 -0
  144. data/package/utils/requireOrError.ts +15 -0
  145. data/package/utils/snakeToCamelCase.ts +5 -0
  146. data/package/utils/typeGuards.ts +342 -0
  147. data/package/utils/validateDependencies.ts +61 -0
  148. data/package/webpack-types.d.ts +33 -0
  149. data/package/webpackDevServerConfig.ts +117 -0
  150. data/package-lock.json +13047 -0
  151. data/package.json +154 -18
  152. data/scripts/remove-use-strict.js +45 -0
  153. data/scripts/type-check-no-emit.js +27 -0
  154. data/test/helpers.js +1 -1
  155. data/test/package/config.test.js +43 -0
  156. data/test/package/env.test.js +42 -7
  157. data/test/package/environments/base.test.js +5 -1
  158. data/test/package/rules/babel.test.js +16 -0
  159. data/test/package/rules/esbuild.test.js +1 -1
  160. data/test/package/rules/raw.test.js +40 -7
  161. data/test/package/rules/swc.test.js +1 -1
  162. data/test/package/rules/webpack.test.js +35 -0
  163. data/test/package/staging.test.js +4 -3
  164. data/test/package/transpiler-defaults.test.js +127 -0
  165. data/test/peer-dependencies.sh +85 -0
  166. data/test/scripts/remove-use-strict.test.js +125 -0
  167. data/test/typescript/build.test.js +118 -0
  168. data/test/typescript/environments.test.js +107 -0
  169. data/test/typescript/pathValidation.test.js +142 -0
  170. data/test/typescript/securityValidation.test.js +182 -0
  171. data/tools/README.md +124 -0
  172. data/tools/css-modules-v9-codemod.js +179 -0
  173. data/tsconfig.eslint.json +16 -0
  174. data/tsconfig.json +38 -0
  175. data/yarn.lock +4165 -2706
  176. metadata +129 -41
  177. data/package/babel/preset.js +0 -37
  178. data/package/config.js +0 -54
  179. data/package/env.js +0 -48
  180. data/package/environments/development.js +0 -13
  181. data/package/environments/production.js +0 -88
  182. data/package/environments/test.js +0 -3
  183. data/package/esbuild/index.js +0 -40
  184. data/package/index.js +0 -40
  185. data/package/rules/css.js +0 -3
  186. data/package/rules/esbuild.js +0 -10
  187. data/package/rules/file.js +0 -29
  188. data/package/rules/index.js +0 -20
  189. data/package/rules/raw.js +0 -5
  190. data/package/rules/swc.js +0 -10
  191. data/package/swc/index.js +0 -50
  192. data/package/utils/configPath.js +0 -4
  193. data/package/utils/defaultConfigPath.js +0 -2
  194. data/package/utils/getStyleRule.js +0 -40
  195. data/package/utils/helpers.js +0 -58
  196. data/package/utils/snakeToCamelCase.js +0 -5
  197. data/package/webpackDevServerConfig.js +0 -71
  198. data/test/package/rules/index.test.js +0 -16
@@ -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
- }
@@ -1,20 +0,0 @@
1
- /* eslint global-require: 0 */
2
- /* eslint import/no-dynamic-require: 0 */
3
-
4
- const rules = {
5
- raw: require("./raw"),
6
- file: require("./file"),
7
- css: require("./css"),
8
- sass: require("./sass"),
9
- babel: require("./babel"),
10
- swc: require("./swc"),
11
- esbuild: require("./esbuild"),
12
- erb: require("./erb"),
13
- coffee: require("./coffee"),
14
- less: require("./less"),
15
- stylus: require("./stylus")
16
- }
17
-
18
- module.exports = Object.keys(rules)
19
- .filter((key) => !!rules[key])
20
- .map((key) => rules[key])
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,58 +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 packageMajorVersion = (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.match(/^\d+/)[0]
49
- }
50
-
51
- module.exports = {
52
- isBoolean,
53
- ensureTrailingSlash,
54
- canProcess,
55
- moduleExists,
56
- loaderMatches,
57
- packageMajorVersion
58
- }
@@ -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
- })