shakapacker 7.3.0.beta.1 → 8.0.0.rc.2

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 (231) hide show
  1. checksums.yaml +4 -4
  2. data/.eslintignore +1 -1
  3. data/.eslintrc.js +29 -8
  4. data/.github/PULL_REQUEST_TEMPLATE.md +10 -3
  5. data/.github/workflows/dummy.yml +6 -1
  6. data/.github/workflows/generator.yml +14 -18
  7. data/.github/workflows/node.yml +56 -0
  8. data/.github/workflows/ruby.yml +29 -17
  9. data/.node-version +1 -1
  10. data/.rubocop.yml +1 -0
  11. data/CHANGELOG.md +56 -5
  12. data/README.md +101 -48
  13. data/Rakefile +1 -7
  14. data/docs/customizing_babel_config.md +2 -2
  15. data/docs/deployment.md +13 -6
  16. data/docs/react.md +7 -13
  17. data/docs/troubleshooting.md +4 -4
  18. data/docs/using_esbuild_loader.md +1 -1
  19. data/docs/using_swc_loader.md +1 -1
  20. data/docs/v6_upgrade.md +1 -1
  21. data/docs/v8_upgrade.md +148 -0
  22. data/gemfiles/Gemfile-rails.7.1.x +12 -0
  23. data/jest.config.js +4 -0
  24. data/lib/install/config/shakapacker.yml +2 -2
  25. data/lib/install/template.rb +36 -30
  26. data/lib/shakapacker/base_strategy.rb +2 -1
  27. data/lib/shakapacker/compiler.rb +6 -21
  28. data/lib/shakapacker/configuration.rb +2 -46
  29. data/lib/shakapacker/deprecation_helper.rb +0 -78
  30. data/lib/shakapacker/dev_server.rb +1 -16
  31. data/lib/shakapacker/dev_server_runner.rb +2 -21
  32. data/lib/shakapacker/env.rb +1 -1
  33. data/lib/shakapacker/helper.rb +3 -3
  34. data/lib/shakapacker/instance.rb +1 -3
  35. data/lib/shakapacker/manifest.rb +1 -1
  36. data/lib/shakapacker/railtie.rb +7 -0
  37. data/lib/shakapacker/runner.rb +4 -18
  38. data/lib/shakapacker/utils/manager.rb +58 -0
  39. data/lib/shakapacker/utils/misc.rb +0 -12
  40. data/lib/shakapacker/version.rb +1 -1
  41. data/lib/shakapacker/version_checker.rb +9 -30
  42. data/lib/shakapacker/webpack_runner.rb +2 -21
  43. data/lib/shakapacker.rb +0 -2
  44. data/lib/tasks/shakapacker/check_binstubs.rake +12 -26
  45. data/lib/tasks/shakapacker/check_manager.rake +3 -8
  46. data/lib/tasks/shakapacker/info.rake +6 -15
  47. data/package/babel/preset.js +15 -15
  48. data/package/config.js +15 -19
  49. data/package/dev_server.js +4 -4
  50. data/package/env.js +19 -17
  51. data/package/environments/base.js +41 -24
  52. data/package/environments/development.js +6 -6
  53. data/package/environments/production.js +16 -16
  54. data/package/environments/test.js +1 -1
  55. data/package/esbuild/index.js +6 -6
  56. data/package/index.d.ts +0 -2
  57. data/package/index.js +17 -46
  58. data/package/rules/babel.js +6 -8
  59. data/package/rules/coffee.js +2 -2
  60. data/package/rules/css.js +1 -1
  61. data/package/rules/erb.js +4 -4
  62. data/package/rules/esbuild.js +5 -7
  63. data/package/rules/file.js +14 -7
  64. data/package/rules/index.js +11 -11
  65. data/package/rules/jscommon.js +8 -5
  66. data/package/rules/less.js +10 -9
  67. data/package/rules/raw.js +1 -1
  68. data/package/rules/sass.js +4 -4
  69. data/package/rules/stylus.js +12 -7
  70. data/package/rules/swc.js +5 -7
  71. data/package/swc/index.js +10 -10
  72. data/package/utils/configPath.js +3 -18
  73. data/package/utils/defaultConfigPath.js +1 -1
  74. data/package/utils/{get_style_rule.js → getStyleRule.js} +6 -6
  75. data/package/utils/helpers.js +2 -43
  76. data/package/utils/inliningCss.js +4 -3
  77. data/package/utils/snakeToCamelCase.js +5 -0
  78. data/package/webpackDevServerConfig.js +28 -25
  79. data/package.json +12 -18
  80. data/prettier.config.js +4 -0
  81. data/shakapacker.gemspec +1 -1
  82. data/spec/dummy/app/javascript/packs/application.js +1 -1
  83. data/spec/dummy/config/application.rb +3 -0
  84. data/spec/dummy/config/initializers/react_on_rails.rb +2 -2
  85. data/spec/dummy/config/shakapacker.yml +3 -4
  86. data/spec/dummy/config/webpack/commonWebpackConfig.js +0 -1
  87. data/spec/dummy/config/webpack/webpack.config.js +1 -1
  88. data/spec/dummy/package.json +2 -1
  89. data/spec/dummy/yarn.lock +2 -3
  90. data/spec/fixtures/github_url_package-lock.v1.json +1 -1
  91. data/spec/fixtures/github_url_package-lock.v2.json +2 -2
  92. data/spec/fixtures/github_url_package.json +1 -1
  93. data/spec/fixtures/github_url_pnpm-lock.v7.yaml +1 -1
  94. data/spec/fixtures/github_url_pnpm-lock.v8.yaml +1 -1
  95. data/spec/fixtures/github_url_yarn.v1.lock +1 -1
  96. data/spec/fixtures/github_url_yarn.v2.lock +2 -2
  97. data/spec/generator_specs/e2e_template/template.rb +15 -28
  98. data/spec/generator_specs/generator_spec.rb +6 -136
  99. data/spec/mounted_app/test/dummy/config/webpacker.yml +0 -1
  100. data/spec/shakapacker/compiler_spec.rb +1 -3
  101. data/spec/shakapacker/configuration_spec.rb +4 -56
  102. data/spec/shakapacker/dev_server_runner_spec.rb +19 -102
  103. data/spec/shakapacker/dev_server_spec.rb +1 -16
  104. data/spec/shakapacker/engine_rake_tasks_spec.rb +1 -16
  105. data/spec/shakapacker/helper_spec.rb +3 -3
  106. data/spec/shakapacker/instance_spec.rb +1 -3
  107. data/spec/shakapacker/rake_tasks_spec.rb +2 -14
  108. data/spec/shakapacker/shakapacker_spec.rb +0 -1
  109. data/spec/shakapacker/test_app/config/shakapacker_css_extract_ignore_order_warnings.yml +0 -1
  110. data/spec/shakapacker/test_app/config/shakapacker_manifest_path.yml +0 -1
  111. data/spec/shakapacker/test_app/config/shakapacker_nested_entries.yml +0 -1
  112. data/spec/shakapacker/test_app/config/shakapacker_other_location.yml +0 -1
  113. data/spec/shakapacker/test_app/package.json +2 -1
  114. data/spec/shakapacker/utils_manager_spec.rb +125 -0
  115. data/spec/shakapacker/version_checker_spec.rb +5 -5
  116. data/spec/shakapacker/webpack_runner_spec.rb +19 -28
  117. data/spec/support/package_json_helpers.rb +7 -4
  118. data/test/helpers.js +67 -0
  119. data/test/package/config.test.js +50 -0
  120. data/test/package/dev_server.test.js +44 -0
  121. data/test/package/development.test.js +43 -0
  122. data/test/package/env.test.js +57 -0
  123. data/test/package/environments/base.test.js +105 -0
  124. data/test/package/environments/development.test.js +50 -0
  125. data/test/package/environments/production.test.js +106 -0
  126. data/test/package/index.test.js +45 -0
  127. data/test/package/production.test.js +32 -0
  128. data/test/package/rules/babel.test.js +58 -0
  129. data/test/package/rules/esbuild.test.js +59 -0
  130. data/test/package/rules/file.test.js +81 -0
  131. data/test/package/rules/index.test.js +7 -0
  132. data/test/package/rules/raw.test.js +12 -0
  133. data/test/package/rules/swc.test.js +59 -0
  134. data/test/package/staging.test.js +31 -0
  135. data/test/package/test.test.js +28 -0
  136. data/yarn.lock +1278 -421
  137. metadata +50 -100
  138. data/.github/workflows/jest.yml +0 -33
  139. data/.github/workflows/js-lint.yml +0 -33
  140. data/.github/workflows/rubocop.yml +0 -28
  141. data/.github/workflows/ruby-backward-compatibility.yml +0 -51
  142. data/lib/install/package.json +0 -15
  143. data/lib/tasks/shakapacker/check_yarn.rake +0 -34
  144. data/lib/tasks/shakapacker/yarn_install.rake +0 -24
  145. data/lib/tasks/webpacker/binstubs.rake +0 -9
  146. data/lib/tasks/webpacker/check_binstubs.rake +0 -9
  147. data/lib/tasks/webpacker/check_node.rake +0 -9
  148. data/lib/tasks/webpacker/check_yarn.rake +0 -9
  149. data/lib/tasks/webpacker/clean.rake +0 -9
  150. data/lib/tasks/webpacker/clobber.rake +0 -11
  151. data/lib/tasks/webpacker/compile.rake +0 -9
  152. data/lib/tasks/webpacker/info.rake +0 -9
  153. data/lib/tasks/webpacker/install.rake +0 -9
  154. data/lib/tasks/webpacker/verify_config.rake +0 -9
  155. data/lib/tasks/webpacker/verify_install.rake +0 -9
  156. data/lib/tasks/webpacker/yarn_install.rake +0 -9
  157. data/lib/tasks/webpacker.rake +0 -20
  158. data/lib/webpacker/dev_server_runner.rb +0 -9
  159. data/lib/webpacker/webpack_runner.rb +0 -9
  160. data/lib/webpacker.rb +0 -4
  161. data/package/__tests__/config-bc.js +0 -27
  162. data/package/__tests__/config.js +0 -46
  163. data/package/__tests__/dev_server-bc.js +0 -46
  164. data/package/__tests__/dev_server.js +0 -46
  165. data/package/__tests__/development-bc.js +0 -66
  166. data/package/__tests__/development.js +0 -66
  167. data/package/__tests__/env-bc.js +0 -59
  168. data/package/__tests__/env.js +0 -59
  169. data/package/__tests__/index-bc.js +0 -22
  170. data/package/__tests__/index.js +0 -46
  171. data/package/__tests__/production-bc.js +0 -51
  172. data/package/__tests__/production.js +0 -51
  173. data/package/__tests__/staging-bc.js +0 -53
  174. data/package/__tests__/staging.js +0 -53
  175. data/package/__tests__/test-bc.js +0 -43
  176. data/package/__tests__/test.js +0 -43
  177. data/package/environments/__tests__/base-bc.js +0 -107
  178. data/package/environments/__tests__/base.js +0 -107
  179. data/package/environments/__tests__/development.js +0 -53
  180. data/package/environments/__tests__/production.js +0 -92
  181. data/package/rules/__tests__/__utils__/webpack.js +0 -50
  182. data/package/rules/__tests__/babel.js +0 -63
  183. data/package/rules/__tests__/esbuild.js +0 -64
  184. data/package/rules/__tests__/file.js +0 -79
  185. data/package/rules/__tests__/index.js +0 -7
  186. data/package/rules/__tests__/raw.js +0 -18
  187. data/package/rules/__tests__/swc.js +0 -63
  188. data/package/utils/snakeToCamelCase +0 -7
  189. data/spec/backward_compatibility_specs/command_spec.rb +0 -116
  190. data/spec/backward_compatibility_specs/compiler_spec.rb +0 -59
  191. data/spec/backward_compatibility_specs/compiler_strategy_spec.rb +0 -24
  192. data/spec/backward_compatibility_specs/configuration_spec.rb +0 -294
  193. data/spec/backward_compatibility_specs/dev_server_runner_spec.rb +0 -206
  194. data/spec/backward_compatibility_specs/dev_server_spec.rb +0 -47
  195. data/spec/backward_compatibility_specs/digest_strategy_spec.rb +0 -38
  196. data/spec/backward_compatibility_specs/engine_rake_tasks_spec.rb +0 -67
  197. data/spec/backward_compatibility_specs/env_spec.rb +0 -23
  198. data/spec/backward_compatibility_specs/helper_spec.rb +0 -243
  199. data/spec/backward_compatibility_specs/instance_spec.rb +0 -31
  200. data/spec/backward_compatibility_specs/manifest_spec.rb +0 -100
  201. data/spec/backward_compatibility_specs/mtime_strategy_spec.rb +0 -55
  202. data/spec/backward_compatibility_specs/rake_tasks_spec.rb +0 -41
  203. data/spec/backward_compatibility_specs/spec_helper_initializer.rb +0 -24
  204. data/spec/backward_compatibility_specs/webpack_runner_spec.rb +0 -86
  205. data/spec/backward_compatibility_specs/webpacker_spec.rb +0 -41
  206. data/spec/backward_compatibility_specs/webpacker_test_app/.gitignore +0 -2
  207. data/spec/backward_compatibility_specs/webpacker_test_app/Rakefile +0 -3
  208. data/spec/backward_compatibility_specs/webpacker_test_app/app/packs/entrypoints/application.js +0 -10
  209. data/spec/backward_compatibility_specs/webpacker_test_app/app/packs/entrypoints/generated/something.js +0 -2
  210. data/spec/backward_compatibility_specs/webpacker_test_app/app/packs/entrypoints/multi_entry.css +0 -4
  211. data/spec/backward_compatibility_specs/webpacker_test_app/app/packs/entrypoints/multi_entry.js +0 -4
  212. data/spec/backward_compatibility_specs/webpacker_test_app/bin/webpacker +0 -13
  213. data/spec/backward_compatibility_specs/webpacker_test_app/bin/webpacker-dev-server +0 -13
  214. data/spec/backward_compatibility_specs/webpacker_test_app/config/application.rb +0 -11
  215. data/spec/backward_compatibility_specs/webpacker_test_app/config/environment.rb +0 -4
  216. data/spec/backward_compatibility_specs/webpacker_test_app/config/initializers/inspect_autoload_paths.rb +0 -1
  217. data/spec/backward_compatibility_specs/webpacker_test_app/config/webpack/webpack.config.js +0 -0
  218. data/spec/backward_compatibility_specs/webpacker_test_app/config/webpacker.yml +0 -83
  219. data/spec/backward_compatibility_specs/webpacker_test_app/config/webpacker_css_extract_ignore_order_warnings.yml +0 -84
  220. data/spec/backward_compatibility_specs/webpacker_test_app/config/webpacker_defaults_fallback.yml +0 -11
  221. data/spec/backward_compatibility_specs/webpacker_test_app/config/webpacker_manifest_path.yml +0 -80
  222. data/spec/backward_compatibility_specs/webpacker_test_app/config/webpacker_nested_entries.yml +0 -83
  223. data/spec/backward_compatibility_specs/webpacker_test_app/config/webpacker_no_precompile.yml +0 -7
  224. data/spec/backward_compatibility_specs/webpacker_test_app/config/webpacker_other_location.yml +0 -85
  225. data/spec/backward_compatibility_specs/webpacker_test_app/config/webpacker_public_root.yml +0 -18
  226. data/spec/backward_compatibility_specs/webpacker_test_app/config.ru +0 -5
  227. data/spec/backward_compatibility_specs/webpacker_test_app/package.json +0 -13
  228. data/spec/backward_compatibility_specs/webpacker_test_app/public/packs/manifest.json +0 -58
  229. data/spec/backward_compatibility_specs/webpacker_test_app/some.config.js +0 -0
  230. data/spec/backward_compatibility_specs/webpacker_test_app/tmp/shakapacker/last-compilation-digest-production +0 -1
  231. data/spec/backward_compatibility_specs/webpacker_test_app/yarn.lock +0 -11
@@ -2,6 +2,13 @@ require_relative "spec_helper_initializer"
2
2
  require "shakapacker/webpack_runner"
3
3
 
4
4
  describe "WebpackRunner" do
5
+ around do |example|
6
+ within_temp_directory do
7
+ FileUtils.cp_r(File.expand_path("./test_app", __dir__), Dir.pwd)
8
+ Dir.chdir("test_app") { example.run }
9
+ end
10
+ end
11
+
5
12
  before :all do
6
13
  @original_node_env, ENV["NODE_ENV"] = ENV["NODE_ENV"], "development"
7
14
  @original_rails_env, ENV["RAILS_ENV"] = ENV["RAILS_ENV"], "development"
@@ -12,15 +19,21 @@ describe "WebpackRunner" do
12
19
  ENV["RAILS_ENV"] = @original_rails_env
13
20
  end
14
21
 
15
- let(:test_app_path) { File.expand_path("./test_app", __dir__) }
22
+ let(:test_app_path) { Dir.pwd }
16
23
 
17
24
  NODE_PACKAGE_MANAGERS.each do |fallback_manager|
18
25
  context "when using package_json with #{fallback_manager} as the manager" do
19
- with_use_package_json_gem(enabled: true, fallback_manager: fallback_manager)
26
+ before do
27
+ manager_name = fallback_manager.split("_")[0]
28
+ manager_version = "1.2.3"
29
+ manager_version = "4.5.6" if fallback_manager == "yarn_berry"
20
30
 
21
- let(:package_json) { PackageJson.read(test_app_path) }
31
+ PackageJson.read.merge! { { "packageManager" => "#{manager_name}@#{manager_version}" } }
22
32
 
23
- require "package_json"
33
+ allow(Shakapacker::Utils::Manager).to receive(:error_unless_package_manager_is_obvious!)
34
+ end
35
+
36
+ let(:package_json) { PackageJson.read(test_app_path) }
24
37
 
25
38
  it "uses the expected package manager", unless: fallback_manager == "yarn_classic" do
26
39
  cmd = package_json.manager.native_exec_command("webpack", ["--config", "#{test_app_path}/config/webpack/webpack.config.js"])
@@ -44,42 +57,20 @@ describe "WebpackRunner" do
44
57
  end
45
58
  end
46
59
 
47
- context "when not using package_json" do
48
- with_use_package_json_gem(enabled: false)
49
-
50
- it "supports running via node_modules" do
51
- cmd = ["#{test_app_path}/node_modules/.bin/webpack", "--config", "#{test_app_path}/config/webpack/webpack.config.js"]
52
-
53
- verify_command(cmd, use_node_modules: true)
54
- end
55
-
56
- it "supports running via yarn" do
57
- cmd = ["yarn", "webpack", "--config", "#{test_app_path}/config/webpack/webpack.config.js"]
58
-
59
- verify_command(cmd, use_node_modules: false)
60
- end
61
-
62
- it "passes on arguments" do
63
- cmd = ["#{test_app_path}/node_modules/.bin/webpack", "--config", "#{test_app_path}/config/webpack/webpack.config.js", "--watch"]
64
-
65
- verify_command(cmd, argv: ["--watch"])
66
- end
67
- end
68
-
69
60
  private
70
61
 
71
- def verify_command(cmd, use_node_modules: true, argv: [])
62
+ def verify_command(cmd, argv: [])
72
63
  Dir.chdir(test_app_path) do
73
64
  klass = Shakapacker::WebpackRunner
74
65
  instance = klass.new(argv)
75
66
 
76
67
  allow(klass).to receive(:new).and_return(instance)
77
- allow(instance).to receive(:node_modules_bin_exist?).and_return(use_node_modules)
78
68
  allow(Kernel).to receive(:exec)
79
69
 
80
70
  klass.run(argv)
81
71
 
82
72
  expect(Kernel).to have_received(:exec).with(Shakapacker::Compiler.env, *cmd)
73
+ expect(Shakapacker::Utils::Manager).to have_received(:error_unless_package_manager_is_obvious!)
83
74
  end
84
75
  end
85
76
  end
@@ -1,16 +1,19 @@
1
1
  NODE_PACKAGE_MANAGERS = ["npm", "yarn_classic", "yarn_berry", "pnpm", "bun"]
2
2
 
3
- def with_use_package_json_gem(enabled:, fallback_manager: nil)
3
+ def with_package_json_fallback_manager(fallback_manager)
4
4
  around do |example|
5
- old_use_package_json_gem_value = ENV["SHAKAPACKER_USE_PACKAGE_JSON_GEM"]
6
5
  old_package_json_fallback_manager_value = ENV["PACKAGE_JSON_FALLBACK_MANAGER"]
7
6
 
8
- ENV["SHAKAPACKER_USE_PACKAGE_JSON_GEM"] = enabled.to_s
9
7
  ENV["PACKAGE_JSON_FALLBACK_MANAGER"] = fallback_manager.to_s
10
8
 
11
9
  example.run
12
10
 
13
- ENV["SHAKAPACKER_USE_PACKAGE_JSON_GEM"] = old_use_package_json_gem_value
14
11
  ENV["PACKAGE_JSON_FALLBACK_MANAGER"] = old_package_json_fallback_manager_value
15
12
  end
16
13
  end
14
+
15
+ def within_temp_directory(tmpdir = nil, &block)
16
+ Dir.mktmpdir("shakapacker-", tmpdir) do |dir|
17
+ Dir.chdir(dir, &block)
18
+ end
19
+ end
data/test/helpers.js ADDED
@@ -0,0 +1,67 @@
1
+ const webpack = require("webpack")
2
+ const MemoryFS = require("memory-fs")
3
+ const thenify = require("thenify")
4
+ const path = require("path")
5
+
6
+ const createTrackLoader = () => {
7
+ const filesTracked = {}
8
+ return [
9
+ filesTracked,
10
+ (source) => {
11
+ filesTracked[source.resource] = true
12
+ return source
13
+ }
14
+ ]
15
+ }
16
+
17
+ const pathToNodeModules = path.resolve("node_modules")
18
+ const pathToNodeModulesIncluded = path.resolve("node_modules/included")
19
+ const pathToAppJavascript = path.resolve("app/javascript")
20
+
21
+ const createInMemoryFs = () => {
22
+ const fs = new MemoryFS()
23
+
24
+ fs.mkdirpSync(pathToNodeModules)
25
+ fs.mkdirpSync(pathToNodeModulesIncluded)
26
+ fs.mkdirpSync(pathToAppJavascript)
27
+
28
+ return fs
29
+ }
30
+
31
+ const createTestCompiler = (config, fs = createInMemoryFs()) => {
32
+ Object.values(config.entry).forEach((file) => {
33
+ fs.writeFileSync(file, "console.log(1);")
34
+ })
35
+
36
+ const compiler = webpack(config)
37
+ compiler.run = thenify(compiler.run)
38
+ compiler.inputFileSystem = fs
39
+ compiler.outputFileSystem = fs
40
+ return compiler
41
+ }
42
+
43
+ const chdirTestApp = () => {
44
+ try {
45
+ return process.chdir("spec/shakapacker/test_app")
46
+ } catch (e) {
47
+ return null
48
+ }
49
+ }
50
+
51
+ const chdirCwd = () => process.chdir(process.cwd())
52
+
53
+ const resetEnv = () => {
54
+ process.env = {}
55
+ }
56
+
57
+ module.exports = {
58
+ chdirTestApp,
59
+ chdirCwd,
60
+ resetEnv,
61
+ createTrackLoader,
62
+ pathToNodeModules,
63
+ pathToNodeModulesIncluded,
64
+ pathToAppJavascript,
65
+ createInMemoryFs,
66
+ createTestCompiler
67
+ }
@@ -0,0 +1,50 @@
1
+ const { resolve } = require("path")
2
+ const { chdirTestApp, resetEnv } = require("../helpers")
3
+
4
+ const rootPath = process.cwd()
5
+ chdirTestApp()
6
+
7
+ describe("Config", () => {
8
+ beforeEach(() => jest.resetModules() && resetEnv())
9
+ afterAll(() => process.chdir(rootPath))
10
+
11
+ test("public path", () => {
12
+ process.env.RAILS_ENV = "development"
13
+ const config = require("../../package/config")
14
+ expect(config.publicPath).toBe("/packs/")
15
+ })
16
+
17
+ test("public path with asset host", () => {
18
+ process.env.RAILS_ENV = "development"
19
+ process.env.SHAKAPACKER_ASSET_HOST = "http://foo.com/"
20
+ const config = require("../../package/config")
21
+ expect(config.publicPath).toBe("http://foo.com/packs/")
22
+ })
23
+
24
+ test("should return additional paths as listed in app config, with resolved paths", () => {
25
+ const config = require("../../package/config")
26
+
27
+ expect(config.additional_paths).toStrictEqual([
28
+ "app/assets",
29
+ "/etc/yarn",
30
+ "some.config.js",
31
+ "app/elm"
32
+ ])
33
+ })
34
+
35
+ test("should default manifestPath to the public dir", () => {
36
+ const config = require("../../package/config")
37
+
38
+ expect(config.manifestPath).toStrictEqual(
39
+ resolve("public/packs/manifest.json")
40
+ )
41
+ })
42
+
43
+ test("should allow overriding manifestPath", () => {
44
+ process.env.SHAKAPACKER_CONFIG = "config/shakapacker_manifest_path.yml"
45
+ const config = require("../../package/config")
46
+ expect(config.manifestPath).toStrictEqual(
47
+ resolve("app/javascript/manifest.json")
48
+ )
49
+ })
50
+ })
@@ -0,0 +1,44 @@
1
+ const { chdirTestApp } = require("../helpers")
2
+
3
+ const rootPath = process.cwd()
4
+ chdirTestApp()
5
+
6
+ describe("DevServer", () => {
7
+ beforeEach(() => jest.resetModules())
8
+ afterAll(() => process.chdir(rootPath))
9
+
10
+ test("with NODE_ENV and RAILS_ENV set to development", () => {
11
+ process.env.NODE_ENV = "development"
12
+ process.env.RAILS_ENV = "development"
13
+ process.env.SHAKAPACKER_DEV_SERVER_HOST = "0.0.0.0"
14
+ process.env.SHAKAPACKER_DEV_SERVER_PORT = 5000
15
+ process.env.SHAKAPACKER_DEV_SERVER_DISABLE_HOST_CHECK = false
16
+
17
+ const devServer = require("../../package/dev_server")
18
+ expect(devServer).toBeDefined()
19
+ expect(devServer.host).toBe("0.0.0.0")
20
+ expect(devServer.port).toBe("5000")
21
+ expect(devServer.disable_host_check).toBe(false)
22
+ })
23
+
24
+ test("with custom env prefix", () => {
25
+ const config = require("../../package/config")
26
+ config.dev_server.env_prefix = "TEST_SHAKAPACKER_DEV_SERVER"
27
+
28
+ process.env.NODE_ENV = "development"
29
+ process.env.RAILS_ENV = "development"
30
+ process.env.TEST_SHAKAPACKER_DEV_SERVER_HOST = "0.0.0.0"
31
+ process.env.TEST_SHAKAPACKER_DEV_SERVER_PORT = 5000
32
+
33
+ const devServer = require("../../package/dev_server")
34
+ expect(devServer).toBeDefined()
35
+ expect(devServer.host).toBe("0.0.0.0")
36
+ expect(devServer.port).toBe("5000")
37
+ })
38
+
39
+ test("with NODE_ENV and RAILS_ENV set to production", () => {
40
+ process.env.RAILS_ENV = "production"
41
+ process.env.NODE_ENV = "production"
42
+ expect(require("../../package/dev_server")).toStrictEqual({})
43
+ })
44
+ })
@@ -0,0 +1,43 @@
1
+ const { resolve } = require("path")
2
+ const { chdirTestApp, resetEnv } = require("../helpers")
3
+
4
+ const rootPath = process.cwd()
5
+ chdirTestApp()
6
+
7
+ describe("Development environment", () => {
8
+ beforeEach(() => jest.resetModules() && resetEnv())
9
+ afterAll(() => process.chdir(rootPath))
10
+
11
+ describe("generateWebpackConfig", () => {
12
+ beforeEach(() => jest.resetModules())
13
+
14
+ test("should use development config and environment including devServer if WEBPACK_SERVE", () => {
15
+ process.env.RAILS_ENV = "development"
16
+ process.env.NODE_ENV = "development"
17
+ process.env.WEBPACK_SERVE = "true"
18
+ const { generateWebpackConfig } = require("../../package/index")
19
+
20
+ const webpackConfig = generateWebpackConfig()
21
+
22
+ expect(webpackConfig.output.path).toStrictEqual(
23
+ resolve("public", "packs")
24
+ )
25
+ expect(webpackConfig.output.publicPath).toBe("/packs/")
26
+ })
27
+
28
+ test("should use development config and environment if WEBPACK_SERVE", () => {
29
+ process.env.RAILS_ENV = "development"
30
+ process.env.NODE_ENV = "development"
31
+ process.env.WEBPACK_SERVE = undefined
32
+ const { generateWebpackConfig } = require("../../package/index")
33
+
34
+ const webpackConfig = generateWebpackConfig()
35
+
36
+ expect(webpackConfig.output.path).toStrictEqual(
37
+ resolve("public", "packs")
38
+ )
39
+ expect(webpackConfig.output.publicPath).toBe("/packs/")
40
+ expect(webpackConfig.devServer).toBeUndefined()
41
+ })
42
+ })
43
+ })
@@ -0,0 +1,57 @@
1
+ const { chdirTestApp } = require("../helpers")
2
+
3
+ const rootPath = process.cwd()
4
+ chdirTestApp()
5
+
6
+ describe("Env", () => {
7
+ beforeEach(() => jest.resetModules())
8
+ afterAll(() => process.chdir(rootPath))
9
+
10
+ test("with NODE_ENV and RAILS_ENV set to development", () => {
11
+ process.env.RAILS_ENV = "development"
12
+ process.env.NODE_ENV = "development"
13
+ expect(require("../../package/env")).toStrictEqual({
14
+ railsEnv: "development",
15
+ nodeEnv: "development",
16
+ isProduction: false,
17
+ isDevelopment: true,
18
+ runningWebpackDevServer: false
19
+ })
20
+ })
21
+
22
+ test("with undefined NODE_ENV and RAILS_ENV set to development", () => {
23
+ process.env.RAILS_ENV = "development"
24
+ delete process.env.NODE_ENV
25
+ expect(require("../../package/env")).toStrictEqual({
26
+ railsEnv: "development",
27
+ nodeEnv: "production",
28
+ isProduction: true,
29
+ isDevelopment: false,
30
+ runningWebpackDevServer: false
31
+ })
32
+ })
33
+
34
+ test("with undefined NODE_ENV and RAILS_ENV", () => {
35
+ delete process.env.NODE_ENV
36
+ delete process.env.RAILS_ENV
37
+ expect(require("../../package/env")).toStrictEqual({
38
+ railsEnv: "production",
39
+ nodeEnv: "production",
40
+ isProduction: true,
41
+ isDevelopment: false,
42
+ runningWebpackDevServer: false
43
+ })
44
+ })
45
+
46
+ test("with a non-standard environment", () => {
47
+ process.env.RAILS_ENV = "staging"
48
+ process.env.NODE_ENV = "staging"
49
+ expect(require("../../package/env")).toStrictEqual({
50
+ railsEnv: "staging",
51
+ nodeEnv: "production",
52
+ isProduction: true,
53
+ isDevelopment: false,
54
+ runningWebpackDevServer: false
55
+ })
56
+ })
57
+ })
@@ -0,0 +1,105 @@
1
+ // environment.js expects to find config/shakapacker.yml and resolved modules from
2
+ // the root of a Rails project
3
+
4
+ const { resolve } = require("path")
5
+ const { chdirTestApp, resetEnv } = require("../../helpers")
6
+
7
+ const rootPath = process.cwd()
8
+ chdirTestApp()
9
+
10
+ const baseConfig = require("../../../package/environments/base")
11
+ const config = require("../../../package/config")
12
+
13
+ describe("Base config", () => {
14
+ beforeEach(() => jest.resetModules() && resetEnv())
15
+ afterAll(() => process.chdir(rootPath))
16
+
17
+ describe("config", () => {
18
+ test("should return entry", () => {
19
+ expect(baseConfig.entry.application).toStrictEqual(
20
+ resolve("app", "javascript", "entrypoints", "application.js")
21
+ )
22
+ })
23
+
24
+ test("should return false for css_extract_ignore_order_warnings when using default config", () => {
25
+ expect(config.css_extract_ignore_order_warnings).toBe(false)
26
+ })
27
+
28
+ test("should return true for css_extract_ignore_order_warnings when configured", () => {
29
+ process.env.SHAKAPACKER_CONFIG =
30
+ "config/shakapacker_css_extract_ignore_order_warnings.yml"
31
+ const config2 = require("../../../package/config")
32
+
33
+ expect(config2.css_extract_ignore_order_warnings).toBe(true)
34
+ })
35
+
36
+ test("should return only 2 entry points with config.nested_entries == false", () => {
37
+ expect(config.nested_entries).toBe(false)
38
+
39
+ expect(baseConfig.entry.multi_entry.sort()).toStrictEqual([
40
+ resolve("app", "javascript", "entrypoints", "multi_entry.css"),
41
+ resolve("app", "javascript", "entrypoints", "multi_entry.js")
42
+ ])
43
+ expect(baseConfig.entry["generated/something"]).toBeUndefined()
44
+ })
45
+
46
+ test("should returns top level and nested entry points with config.nested_entries == true", () => {
47
+ process.env.SHAKAPACKER_CONFIG = "config/shakapacker_nested_entries.yml"
48
+ const config2 = require("../../../package/config")
49
+ const baseConfig2 = require("../../../package/environments/base")
50
+
51
+ expect(config2.nested_entries).toBe(true)
52
+
53
+ expect(baseConfig2.entry.application).toStrictEqual(
54
+ resolve("app", "javascript", "entrypoints", "application.js")
55
+ )
56
+ expect(baseConfig2.entry.multi_entry.sort()).toStrictEqual([
57
+ resolve("app", "javascript", "entrypoints", "multi_entry.css"),
58
+ resolve("app", "javascript", "entrypoints", "multi_entry.js")
59
+ ])
60
+ expect(baseConfig2.entry["generated/something"]).toStrictEqual(
61
+ resolve("app", "javascript", "entrypoints", "generated", "something.js")
62
+ )
63
+ })
64
+
65
+ test("should return output", () => {
66
+ expect(baseConfig.output.filename).toBe("js/[name]-[contenthash].js")
67
+ expect(baseConfig.output.chunkFilename).toBe(
68
+ "js/[name]-[contenthash].chunk.js"
69
+ )
70
+ })
71
+
72
+ test("should return default loader rules for each file in config/loaders", () => {
73
+ const rules = require("../../../package/rules")
74
+
75
+ const defaultRules = Object.keys(rules)
76
+ const configRules = baseConfig.module.rules
77
+
78
+ expect(defaultRules).toHaveLength(3)
79
+ expect(configRules).toHaveLength(3)
80
+ })
81
+
82
+ test("should return default plugins", () => {
83
+ expect(baseConfig.plugins).toHaveLength(2)
84
+ })
85
+
86
+ test("should return default resolveLoader", () => {
87
+ expect(baseConfig.resolveLoader.modules).toStrictEqual(["node_modules"])
88
+ })
89
+
90
+ test("should return default resolve.modules with additions", () => {
91
+ expect(baseConfig.resolve.modules).toStrictEqual([
92
+ resolve("app", "javascript"),
93
+ resolve("app/assets"),
94
+ resolve("/etc/yarn"),
95
+ resolve("some.config.js"),
96
+ resolve("app/elm"),
97
+ "node_modules"
98
+ ])
99
+ })
100
+
101
+ test("returns plugins property as Array", () => {
102
+ expect(baseConfig.plugins).toBeInstanceOf(Array)
103
+ })
104
+ })
105
+ })
@@ -0,0 +1,50 @@
1
+ const { chdirTestApp, resetEnv } = require("../../helpers")
2
+
3
+ const rootPath = process.cwd()
4
+ chdirTestApp()
5
+
6
+ describe("Development specific config", () => {
7
+ beforeEach(() => {
8
+ jest.resetModules()
9
+ resetEnv()
10
+ process.env.NODE_ENV = "development"
11
+ })
12
+ afterAll(() => process.chdir(rootPath))
13
+
14
+ describe("with config.useContentHash = true", () => {
15
+ test("sets filename to use contentHash", () => {
16
+ const config = require("../../../package/config")
17
+ config.useContentHash = true
18
+ const environmentConfig = require("../../../package/environments/development")
19
+
20
+ expect(environmentConfig.output.filename).toBe(
21
+ "js/[name]-[contenthash].js"
22
+ )
23
+ expect(environmentConfig.output.chunkFilename).toBe(
24
+ "js/[name]-[contenthash].chunk.js"
25
+ )
26
+ })
27
+ })
28
+
29
+ describe("with config.useContentHash = false", () => {
30
+ test("sets filename without using contentHash", () => {
31
+ const config = require("../../../package/config")
32
+ config.useContentHash = false
33
+ const environmentConfig = require("../../../package/environments/development")
34
+
35
+ expect(environmentConfig.output.filename).toBe("js/[name].js")
36
+ expect(environmentConfig.output.chunkFilename).toBe("js/[name].chunk.js")
37
+ })
38
+ })
39
+
40
+ describe("with unset config.useContentHash", () => {
41
+ test("sets filename without using contentHash", () => {
42
+ const config = require("../../../package/config")
43
+ delete config.useContentHash
44
+ const environmentConfig = require("../../../package/environments/development")
45
+
46
+ expect(environmentConfig.output.filename).toBe("js/[name].js")
47
+ expect(environmentConfig.output.chunkFilename).toBe("js/[name].chunk.js")
48
+ })
49
+ })
50
+ })
@@ -0,0 +1,106 @@
1
+ const { chdirTestApp, resetEnv } = require("../../helpers")
2
+
3
+ const rootPath = process.cwd()
4
+ chdirTestApp()
5
+
6
+ describe("Production specific config", () => {
7
+ beforeEach(() => {
8
+ jest.resetModules()
9
+ resetEnv()
10
+ process.env.NODE_ENV = "production"
11
+ })
12
+ afterAll(() => process.chdir(rootPath))
13
+
14
+ describe("with config.useContentHash = true", () => {
15
+ test("sets filename to use contentHash", () => {
16
+ const config = require("../../../package/config")
17
+ config.useContentHash = true
18
+ const environmentConfig = require("../../../package/environments/production")
19
+
20
+ expect(environmentConfig.output.filename).toBe(
21
+ "js/[name]-[contenthash].js"
22
+ )
23
+ expect(environmentConfig.output.chunkFilename).toBe(
24
+ "js/[name]-[contenthash].chunk.js"
25
+ )
26
+ })
27
+
28
+ test("doesn't shows any warning message", () => {
29
+ const consoleWarnSpy = jest.spyOn(console, "warn")
30
+ const config = require("../../../package/config")
31
+ config.useContentHash = true
32
+
33
+ require("../../../package/environments/production")
34
+
35
+ expect(consoleWarnSpy).not.toHaveBeenCalledWith(
36
+ expect.stringMatching(
37
+ /Setting 'useContentHash' to 'false' in the production environment/
38
+ )
39
+ )
40
+
41
+ consoleWarnSpy.mockRestore()
42
+ })
43
+ })
44
+
45
+ describe("with config.useContentHash = false", () => {
46
+ test("sets filename to use contentHash", () => {
47
+ const config = require("../../../package/config")
48
+ config.useContentHash = false
49
+ const environmentConfig = require("../../../package/environments/production")
50
+
51
+ expect(environmentConfig.output.filename).toBe(
52
+ "js/[name]-[contenthash].js"
53
+ )
54
+ expect(environmentConfig.output.chunkFilename).toBe(
55
+ "js/[name]-[contenthash].chunk.js"
56
+ )
57
+ })
58
+
59
+ test("shows a warning message", () => {
60
+ const consoleWarnSpy = jest.spyOn(console, "warn")
61
+ const config = require("../../../package/config")
62
+ config.useContentHash = false
63
+
64
+ require("../../../package/environments/production")
65
+
66
+ expect(consoleWarnSpy).toHaveBeenCalledWith(
67
+ expect.stringMatching(
68
+ /Setting 'useContentHash' to 'false' in the production environment/
69
+ )
70
+ )
71
+
72
+ consoleWarnSpy.mockRestore()
73
+ })
74
+ })
75
+
76
+ describe("with unset config.useContentHash", () => {
77
+ test("sets filename to use contentHash", () => {
78
+ const config = require("../../../package/config")
79
+ delete config.useContentHash
80
+ const environmentConfig = require("../../../package/environments/production")
81
+
82
+ expect(environmentConfig.output.filename).toBe(
83
+ "js/[name]-[contenthash].js"
84
+ )
85
+ expect(environmentConfig.output.chunkFilename).toBe(
86
+ "js/[name]-[contenthash].chunk.js"
87
+ )
88
+ })
89
+
90
+ test("doesn't shows any warning message", () => {
91
+ const consoleWarnSpy = jest.spyOn(console, "warn")
92
+ const config = require("../../../package/config")
93
+ delete config.useContentHash
94
+
95
+ require("../../../package/environments/production")
96
+
97
+ expect(consoleWarnSpy).not.toHaveBeenCalledWith(
98
+ expect.stringMatching(
99
+ /Setting 'useContentHash' to 'false' in the production environment/
100
+ )
101
+ )
102
+
103
+ consoleWarnSpy.mockRestore()
104
+ })
105
+ })
106
+ })
@@ -0,0 +1,45 @@
1
+ const index = require("../../package/index")
2
+
3
+ describe("index", () => {
4
+ test("exports webpack-merge v5 functions", () => {
5
+ expect(index.merge).toBeInstanceOf(Function)
6
+ expect(index.mergeWithRules).toBeInstanceOf(Function)
7
+ expect(index.mergeWithCustomize).toBeInstanceOf(Function)
8
+ })
9
+
10
+ test("webpackConfig returns an immutable object", () => {
11
+ const { generateWebpackConfig } = require("../../package/index")
12
+
13
+ const webpackConfig1 = generateWebpackConfig()
14
+ const webpackConfig2 = generateWebpackConfig()
15
+
16
+ webpackConfig1.newKey = "new value"
17
+ webpackConfig1.output.path = "new path"
18
+
19
+ expect(webpackConfig2).not.toHaveProperty("newKey")
20
+ expect(webpackConfig2.output.path).not.toBe("new value")
21
+ })
22
+
23
+ test("webpackConfig merges extra config", () => {
24
+ const { generateWebpackConfig } = require("../../package/index")
25
+
26
+ const webpackConfig = generateWebpackConfig({
27
+ newKey: "new value",
28
+ output: {
29
+ path: "new path"
30
+ }
31
+ })
32
+
33
+ expect(webpackConfig).toHaveProperty("newKey", "new value")
34
+ expect(webpackConfig).toHaveProperty("output.path", "new path")
35
+ expect(webpackConfig).toHaveProperty("output.publicPath", "/packs/")
36
+ })
37
+
38
+ test("webpackConfig errors if multiple configs are provided", () => {
39
+ const { generateWebpackConfig } = require("../../package/index")
40
+
41
+ expect(() => generateWebpackConfig({}, {})).toThrow(
42
+ "use webpack-merge to merge configs before passing them to Shakapacker"
43
+ )
44
+ })
45
+ })