shakapacker 8.3.0 → 9.0.0.beta.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 (54) hide show
  1. checksums.yaml +4 -4
  2. data/.github/STATUS.md +1 -0
  3. data/.github/workflows/dummy.yml +1 -1
  4. data/.github/workflows/generator.yml +4 -14
  5. data/.github/workflows/node.yml +1 -1
  6. data/CHANGELOG.md +17 -1
  7. data/Gemfile.lock +3 -3
  8. data/README.md +3 -3
  9. data/docs/css-modules-export-mode.md +288 -0
  10. data/docs/peer-dependencies.md +40 -0
  11. data/docs/react.md +2 -10
  12. data/docs/rspack.md +190 -0
  13. data/docs/subresource_integrity.md +54 -0
  14. data/docs/troubleshooting.md +5 -0
  15. data/lib/install/bin/shakapacker +14 -2
  16. data/lib/install/bin/shakapacker-rspack +13 -0
  17. data/lib/install/config/rspack/rspack.config.js +6 -0
  18. data/lib/install/config/shakapacker.yml +16 -3
  19. data/lib/install/package.json +30 -0
  20. data/lib/install/template.rb +13 -3
  21. data/lib/shakapacker/configuration.rb +16 -0
  22. data/lib/shakapacker/dev_server_runner.rb +17 -7
  23. data/lib/shakapacker/helper.rb +40 -4
  24. data/lib/shakapacker/manifest.rb +9 -3
  25. data/lib/shakapacker/rspack_runner.rb +57 -0
  26. data/lib/shakapacker/runner.rb +48 -2
  27. data/lib/shakapacker/version.rb +1 -1
  28. data/package/config.js +2 -0
  29. data/package/environments/base.js +16 -48
  30. data/package/environments/development.js +18 -3
  31. data/package/environments/production.js +24 -51
  32. data/package/environments/test.js +15 -1
  33. data/package/index.d.ts +14 -0
  34. data/package/index.js +4 -2
  35. data/package/optimization/rspack.js +25 -0
  36. data/package/optimization/webpack.js +49 -0
  37. data/package/plugins/rspack.js +104 -0
  38. data/package/plugins/webpack.js +62 -0
  39. data/package/rules/css.js +1 -1
  40. data/package/rules/file.js +11 -5
  41. data/package/rules/less.js +1 -1
  42. data/package/rules/raw.js +11 -1
  43. data/package/rules/rspack.js +96 -0
  44. data/package/rules/sass.js +6 -2
  45. data/package/rules/stylus.js +1 -1
  46. data/package/utils/getStyleRule.js +16 -3
  47. data/package/utils/requireOrError.js +15 -0
  48. data/package.json +19 -26
  49. data/test/package/config.test.js +40 -0
  50. data/test/package/environments/base.test.js +1 -1
  51. data/test/package/rules/{index.test.js → webpack.test.js} +1 -1
  52. data/yarn.lock +2146 -724
  53. metadata +22 -11
  54. /data/package/rules/{index.js → webpack.js} +0 -0
@@ -0,0 +1,15 @@
1
+ /* eslint global-require: 0 */
2
+ /* eslint import/no-dynamic-require: 0 */
3
+ const config = require("../config")
4
+
5
+ const requireOrError = (moduleName) => {
6
+ try {
7
+ return require(moduleName)
8
+ } catch (error) {
9
+ throw new Error(
10
+ `[SHAKAPACKER]: ${moduleName} is required for ${config.bundler} but is not installed. View Shakapacker's documented dependencies at https://github.com/shakacode/shakapacker/tree/main/docs/peer-dependencies.md`
11
+ )
12
+ }
13
+ }
14
+
15
+ module.exports = { requireOrError }
data/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "shakapacker",
3
- "version": "8.3.0",
3
+ "version": "9.0.0-beta.0",
4
4
  "description": "Use webpack to manage app-like JavaScript modules in Rails",
5
5
  "homepage": "https://github.com/shakacode/shakapacker",
6
6
  "bugs": {
@@ -14,6 +14,16 @@
14
14
  "author": "David Heinemeier Hansson <david@basecamp.com>, Justin Gordon <justin@shakacode.com>",
15
15
  "main": "package/index.js",
16
16
  "types": "package/index.d.ts",
17
+ "exports": {
18
+ ".": "./package/index.js",
19
+ "./webpack": "./package/webpack/index.js",
20
+ "./rspack": "./package/rspack/index.js",
21
+ "./swc": "./package/swc/index.js",
22
+ "./esbuild": "./package/esbuild/index.js",
23
+ "./package.json": "./package.json",
24
+ "./package/babel/preset.js": "./package/babel/preset.js",
25
+ "./package/*": "./package/*"
26
+ },
17
27
  "files": [
18
28
  "package",
19
29
  "lib/install/config/shakapacker.yml"
@@ -27,8 +37,11 @@
27
37
  "path-complete-extname": "^1.0.0"
28
38
  },
29
39
  "devDependencies": {
40
+ "@rspack/cli": "^1.4.11",
41
+ "@rspack/core": "^1.4.11",
30
42
  "babel-loader": "^8.2.4",
31
43
  "compression-webpack-plugin": "^9.0.0",
44
+ "css-loader": "^7.1.2",
32
45
  "esbuild-loader": "^2.18.0",
33
46
  "eslint": "^8.0.0",
34
47
  "eslint-config-airbnb": "^19.0.0",
@@ -41,36 +54,16 @@
41
54
  "eslint-plugin-react-hooks": "^4.6.0",
42
55
  "jest": "^29.7.0",
43
56
  "memory-fs": "^0.5.0",
57
+ "mini-css-extract-plugin": "^2.9.4",
44
58
  "prettier": "^3.2.5",
59
+ "rspack-manifest-plugin": "^5.0.3",
60
+ "sass-loader": "^16.0.5",
45
61
  "swc-loader": "^0.1.15",
46
62
  "thenify": "^3.3.1",
47
63
  "webpack": "5.93.0",
48
64
  "webpack-assets-manifest": "^5.0.6",
49
- "webpack-merge": "^5.8.0"
50
- },
51
- "peerDependencies": {
52
- "@babel/core": "^7.17.9",
53
- "@babel/plugin-transform-runtime": "^7.17.0",
54
- "@babel/preset-env": "^7.16.11",
55
- "@babel/runtime": "^7.17.9",
56
- "@types/babel__core": "^7.0.0",
57
- "@types/webpack": "^5.0.0",
58
- "babel-loader": "^8.2.4 || ^9.0.0 || ^10.0.0",
59
- "compression-webpack-plugin": "^9.0.0 || ^10.0.0|| ^11.0.0",
60
- "terser-webpack-plugin": "^5.3.1",
61
- "webpack": "^5.76.0",
62
- "webpack-assets-manifest": "^5.0.6 || ^6.0.0",
63
- "webpack-cli": "^4.9.2 || ^5.0.0 || ^6.0.0",
64
- "webpack-dev-server": "^4.9.0 || ^5.0.0",
65
- "webpack-merge": "^5.8.0 || ^6.0.0"
66
- },
67
- "peerDependenciesMeta": {
68
- "@types/babel__core": {
69
- "optional": true
70
- },
71
- "@types/webpack": {
72
- "optional": true
73
- }
65
+ "webpack-merge": "^5.8.0",
66
+ "webpack-subresource-integrity": "^5.1.0"
74
67
  },
75
68
  "packageManager": "yarn@1.22.22",
76
69
  "engines": {
@@ -54,4 +54,44 @@ describe("Config", () => {
54
54
  resolve("app/javascript/manifest.json")
55
55
  )
56
56
  })
57
+
58
+ test("should have integrity disabled by default", () => {
59
+ const config = require("../../package/config")
60
+ expect(config.integrity.enabled).toBe(false)
61
+ })
62
+
63
+ test("should have sha384 as default hash function", () => {
64
+ const config = require("../../package/config")
65
+ expect(config.integrity.hash_functions).toStrictEqual(["sha384"])
66
+ })
67
+
68
+ test("should have anonymous as default crossorigin", () => {
69
+ const config = require("../../package/config")
70
+ expect(config.integrity.cross_origin).toBe("anonymous")
71
+ })
72
+
73
+ test("should allow enabling integrity", () => {
74
+ process.env.SHAKAPACKER_CONFIG = "config/shakapacker_integrity.yml"
75
+ const config = require("../../package/config")
76
+
77
+ expect(config.integrity.enabled).toBe(true)
78
+ })
79
+
80
+ test("should allow configuring hash functions", () => {
81
+ process.env.SHAKAPACKER_CONFIG = "config/shakapacker_integrity.yml"
82
+ const config = require("../../package/config")
83
+
84
+ expect(config.integrity.hash_functions).toStrictEqual([
85
+ "sha384",
86
+ "sha256",
87
+ "sha512"
88
+ ])
89
+ })
90
+
91
+ test("should allow configuring crossorigin", () => {
92
+ process.env.SHAKAPACKER_CONFIG = "config/shakapacker_integrity.yml"
93
+ const config = require("../../package/config")
94
+
95
+ expect(config.integrity.cross_origin).toBe("use-credentials")
96
+ })
57
97
  })
@@ -79,7 +79,7 @@ describe("Base config", () => {
79
79
  })
80
80
 
81
81
  test("should return default loader rules for each file in config/loaders", () => {
82
- const rules = require("../../../package/rules")
82
+ const rules = require("../../../package/rules/webpack")
83
83
 
84
84
  const defaultRules = Object.keys(rules)
85
85
  const configRules = baseConfig.module.rules
@@ -1,4 +1,4 @@
1
- const rules = require("../../../package/rules/index")
1
+ const rules = require("../../../package/rules/webpack")
2
2
 
3
3
  jest.mock("../../../package/utils/helpers", () => {
4
4
  const original = jest.requireActual("../../../package/utils/helpers")