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

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -1,12 +1,14 @@
1
1
  require "shakapacker/utils/misc"
2
+ require "shakapacker/utils/manager"
2
3
  require "shakapacker/utils/version_syntax_converter"
4
+ require "package_json"
3
5
 
4
6
  # Install Shakapacker
5
7
 
6
8
  force_option = ENV["FORCE"] ? { force: true } : {}
7
9
 
8
10
  copy_file "#{__dir__}/config/shakapacker.yml", "config/shakapacker.yml", force_option
9
- copy_file "#{__dir__}/package.json", "package.json", force_option
11
+ remove_file "#{__dir__}/package.json" if force_option[:force]
10
12
 
11
13
  say "Copying webpack core config"
12
14
  directory "#{__dir__}/config/webpack", "config/webpack", force_option
@@ -43,22 +45,37 @@ else
43
45
  end
44
46
 
45
47
  def package_json
46
- if @package_json.nil?
47
- Shakapacker::Utils::Misc.require_package_json_gem
48
+ @package_json ||= PackageJson.new
49
+ end
50
+
51
+ # setup the package manager with default values
52
+ package_json.merge! do |pj|
53
+ babel = pj.fetch("babel", {})
54
+
55
+ babel["presets"] ||= []
56
+ babel["presets"].push("./node_modules/shakapacker/package/babel/preset.js")
48
57
 
49
- @package_json = PackageJson.read
58
+ package_manager = pj.fetch("packageManager") do
59
+ "#{Shakapacker::Utils::Manager.guess_binary}@#{Shakapacker::Utils::Manager.guess_version}"
50
60
  end
51
61
 
52
- @package_json
62
+ {
63
+ "name" => "app",
64
+ "private" => true,
65
+ "version" => "0.1.0",
66
+ "babel" => babel,
67
+ "browserslist" => [
68
+ "defaults"
69
+ ],
70
+ "packageManager" => package_manager
71
+ }.merge(pj)
53
72
  end
54
73
 
74
+ Shakapacker::Utils::Manager.error_unless_package_manager_is_obvious!
75
+
55
76
  # Ensure there is `system!("bin/yarn")` command in `./bin/setup` file
56
77
  if (setup_path = Rails.root.join("bin/setup")).exist?
57
- def native_install_command
58
- return "bin/yarn" unless Shakapacker::Utils::Misc.use_package_json_gem
59
-
60
- package_json.manager.native_install_command.join(" ")
61
- end
78
+ native_install_command = package_json.manager.native_install_command.join(" ")
62
79
 
63
80
  say "Run #{native_install_command} during bin/setup"
64
81
 
@@ -88,23 +105,14 @@ if (setup_path = Rails.root.join("bin/setup")).exist?
88
105
  end
89
106
 
90
107
  def add_dependencies(dependencies, type)
91
- return package_json.manager.add!(dependencies, type: type) if Shakapacker::Utils::Misc.use_package_json_gem
92
-
93
- # TODO: check that run actually errors
94
- run("yarn add #{dependencies.join(" ")}") if type == :production
95
- run("yarn add --dev #{dependencies.join(" ")}") if type == :dev
108
+ package_json.manager.add!(dependencies, type: type)
96
109
  rescue PackageJson::Error
97
110
  say "Shakapacker installation failed 😭 See above for details.", :red
98
111
  exit 1
99
112
  end
100
113
 
101
114
  def fetch_peer_dependencies
102
- if Shakapacker::Utils::Misc.use_package_json_gem
103
- return PackageJson.read("#{__dir__}/../../").fetch("peerDependencies")
104
- end
105
-
106
- package_json = File.read("#{__dir__}/../../package.json")
107
- JSON.parse(package_json)["peerDependencies"]
115
+ PackageJson.read("#{__dir__}/../../").fetch("peerDependencies")
108
116
  end
109
117
 
110
118
  Dir.chdir(Rails.root) do
@@ -112,15 +120,13 @@ Dir.chdir(Rails.root) do
112
120
  say "Installing shakapacker@#{npm_version}"
113
121
  add_dependencies(["shakapacker@#{npm_version}"], :production)
114
122
 
115
- if Shakapacker::Utils::Misc.use_package_json_gem
116
- package_json.merge! do |pj|
117
- {
118
- "dependencies" => pj["dependencies"].merge({
119
- # TODO: workaround for test suite - long-run need to actually account for diff pkg manager behaviour
120
- "shakapacker" => pj["dependencies"]["shakapacker"].delete_prefix("^")
121
- })
122
- }
123
- end
123
+ package_json.merge! do |pj|
124
+ {
125
+ "dependencies" => pj["dependencies"].merge({
126
+ # TODO: workaround for test suite - long-run need to actually account for diff pkg manager behaviour
127
+ "shakapacker" => pj["dependencies"]["shakapacker"].delete_prefix("^")
128
+ })
129
+ }
124
130
  end
125
131
 
126
132
  peers = fetch_peer_dependencies
@@ -16,7 +16,8 @@ module Shakapacker
16
16
  [
17
17
  *config.additional_paths.map { |path| "#{path}{,/**/*}" },
18
18
  "#{config.source_path}{,/**/*}",
19
- "yarn.lock", "package.json",
19
+ "package.json", "package-lock.json", "yarn.lock",
20
+ "pnpm-lock.yaml", "bun.lockb",
20
21
  "config/webpack{,/**/*}"
21
22
  ].freeze
22
23
  end
@@ -72,7 +72,7 @@ class Shakapacker::Compiler
72
72
  config.root_path.join("tmp/shakapacker.lock")
73
73
  end
74
74
 
75
- def optionalRubyRunner
75
+ def optional_ruby_runner
76
76
  first_line = File.readlines(bin_shakapacker_path).first.chomp
77
77
  /ruby/.match?(first_line) ? RbConfig.ruby : ""
78
78
  end
@@ -82,13 +82,13 @@ class Shakapacker::Compiler
82
82
 
83
83
  stdout, stderr, status = Open3.capture3(
84
84
  webpack_env,
85
- "#{optionalRubyRunner} '#{bin_shakapacker_path}'",
85
+ "#{optional_ruby_runner} '#{bin_shakapacker_path}'",
86
86
  chdir: File.expand_path(config.root_path)
87
87
  )
88
88
 
89
89
  if status.success?
90
90
  logger.info "Compiled all packs in #{config.public_output_path}"
91
- logger.error "#{stderr}" unless stderr.empty?
91
+ logger.warn "#{stderr}" unless stderr.empty?
92
92
 
93
93
  if config.webpack_compile_output?
94
94
  logger.info stdout
@@ -104,28 +104,13 @@ class Shakapacker::Compiler
104
104
  def webpack_env
105
105
  return env unless defined?(ActionController::Base)
106
106
 
107
- Shakapacker.set_shakapacker_env_variables_for_backward_compatibility
108
-
109
107
  env.merge(
110
- "SHAKAPACKER_ASSET_HOST" => instance.config.asset_host,
111
- "SHAKAPACKER_RELATIVE_URL_ROOT" => instance.config.relative_url_root,
112
- "SHAKAPACKER_CONFIG" => instance.config_path.to_s
108
+ "SHAKAPACKER_ASSET_HOST" => instance.config.asset_host,
109
+ "SHAKAPACKER_CONFIG" => instance.config.config_path.to_s
113
110
  )
114
111
  end
115
112
 
116
113
  def bin_shakapacker_path
117
- if File.exist?(config.root_path.join("bin/shakapacker"))
118
- config.root_path.join("bin/shakapacker")
119
- elsif File.exist?(config.root_path.join("bin/webpacker"))
120
- Shakapacker.puts_deprecation_message(
121
- Shakapacker.short_deprecation_message(
122
- "bin/webpacker",
123
- "bin/shakapacker"
124
- )
125
- )
126
- config.root_path.join("bin/webpacker")
127
- else
128
- config.root_path.join("bin/shakapacker")
129
- end
114
+ config.root_path.join("bin/shakapacker")
130
115
  end
131
116
  end
@@ -12,10 +12,7 @@ class Shakapacker::Configuration
12
12
  def initialize(root_path:, config_path:, env:)
13
13
  @root_path = root_path
14
14
  @env = env
15
-
16
- # For backward compatibility
17
- Shakapacker.set_shakapacker_env_variables_for_backward_compatibility
18
- @config_path = Pathname.new(ENV["SHAKAPACKER_CONFIG"] || config_path)
15
+ @config_path = config_path
19
16
  end
20
17
 
21
18
  def dev_server
@@ -43,17 +40,6 @@ class Shakapacker::Configuration
43
40
  fetch(:shakapacker_precompile)
44
41
  end
45
42
 
46
- def webpacker_precompile?
47
- Shakapacker.puts_deprecation_message(
48
- Shakapacker.short_deprecation_message(
49
- "webpacker_precompile?",
50
- "shakapacker_precompile?"
51
- )
52
- )
53
-
54
- shakapacker_precompile?
55
- end
56
-
57
43
  def source_path
58
44
  root_path.join(fetch(:source_path))
59
45
  end
@@ -103,17 +89,7 @@ class Shakapacker::Configuration
103
89
  end
104
90
 
105
91
  def fetch(key)
106
- return data.fetch(key, defaults[key]) unless key == :webpacker_precompile
107
-
108
- # for backward compatibility
109
- Shakapacker.puts_deprecation_message(
110
- Shakapacker.short_deprecation_message(
111
- "webpacker_precompile",
112
- "shakapacker_precompile"
113
- )
114
- )
115
-
116
- data.fetch(key, defaults[:shakapacker_precompile])
92
+ data.fetch(key, defaults[key])
117
93
  end
118
94
 
119
95
  def asset_host
@@ -123,19 +99,6 @@ class Shakapacker::Configuration
123
99
  )
124
100
  end
125
101
 
126
- def relative_url_root
127
- result = ENV.fetch(
128
- "SHAKAPACKER_RELATIVE_URL_ROOT",
129
- fetch(:relative_url_root) || ActionController::Base.relative_url_root
130
- )
131
-
132
- if result
133
- Shakapacker.puts_deprecation_message("The usage of relative_url_root is deprecated in Shakapacker and will be removed in v8.")
134
- end
135
-
136
- result
137
- end
138
-
139
102
  private
140
103
  def data
141
104
  @data ||= load
@@ -149,13 +112,6 @@ class Shakapacker::Configuration
149
112
  end
150
113
  symbolized_config = config[env].deep_symbolize_keys
151
114
 
152
- # For backward compatibility
153
- if symbolized_config.key?(:shakapacker_precompile) && !symbolized_config.key?(:webpacker_precompile)
154
- symbolized_config[:webpacker_precompile] = symbolized_config[:shakapacker_precompile]
155
- elsif !symbolized_config.key?(:shakapacker_precompile) && symbolized_config.key?(:webpacker_precompile)
156
- symbolized_config[:shakapacker_precompile] = symbolized_config[:webpacker_precompile]
157
- end
158
-
159
115
  return symbolized_config
160
116
  rescue Errno::ENOENT => e
161
117
  if self.class.installing
@@ -1,87 +1,9 @@
1
1
  require "thor"
2
2
 
3
3
  module Shakapacker
4
- DEPRECATION_GUIDE_URL = "https://github.com/shakacode/shakapacker/blob/master/docs/v7_upgrade.md"
5
- DEPRECATION_MESSAGE = <<~MSG
6
- DEPRECATION NOTICE:
7
-
8
- Using webpacker spelling is deprecated in Shakapacker.
9
- Update your project with the new spelling.
10
-
11
- For more information about this process, check:
12
- #{DEPRECATION_GUIDE_URL}
13
- MSG
14
4
  SHELL = Thor::Shell::Color.new
15
5
 
16
- def get_config_file_path_with_backward_compatibility(config_path)
17
- if config_path.to_s.end_with?("shakapacker.yml") && !File.exist?(config_path)
18
- webpacker_config_path = if config_path.class == Pathname
19
- Pathname.new(config_path.to_s.gsub("shakapacker.yml", "webpacker.yml"))
20
- else
21
- config_path.gsub("shakapacker.yml", "webpacker.yml")
22
- end
23
-
24
- if File.exist?(webpacker_config_path)
25
- puts_deprecation_message(
26
- short_deprecation_message(
27
- "config/webpacker.yml",
28
- "config/shakapacker.yml"
29
- )
30
- )
31
- return webpacker_config_path
32
- end
33
- end
34
-
35
- config_path
36
- end
37
-
38
- def set_shakapacker_env_variables_for_backward_compatibility
39
- webpacker_env_variables = ENV.select { |key| key.start_with?("WEBPACKER_") }
40
-
41
- deprecation_message_body = ""
42
-
43
- webpacker_env_variables.each do |webpacker_key, _|
44
- shakapacker_key = webpacker_key.gsub("WEBPACKER_", "SHAKAPACKER_")
45
- next if ENV.key?(shakapacker_key)
46
-
47
- deprecation_message_body += <<~MSG
48
- Use `#{shakapacker_key}` instead of the deprecated `#{webpacker_key}`.
49
- MSG
50
-
51
- ENV[shakapacker_key] = ENV[webpacker_key]
52
- end
53
-
54
- if deprecation_message_body.present?
55
- Shakapacker.puts_deprecation_message(
56
- <<~MSG
57
- DEPRECATION NOTICE:
58
-
59
- #{deprecation_message_body}
60
- Read more: #{Shakapacker::DEPRECATION_GUIDE_URL}
61
- MSG
62
- )
63
- end
64
- end
65
-
66
- def short_deprecation_message(old_usage, new_usage)
67
- <<~MSG
68
- DEPRECATION NOTICE:
69
-
70
- Consider using `#{new_usage}` instead of the deprecated `#{old_usage}`.
71
- Read more: #{DEPRECATION_GUIDE_URL}
72
- MSG
73
- end
74
-
75
6
  def puts_deprecation_message(message)
76
7
  SHELL.say "\n#{message}\n", :yellow
77
8
  end
78
-
79
- def puts_rake_deprecation_message(webpacker_task_name)
80
- Shakapacker.puts_deprecation_message(
81
- Shakapacker.short_deprecation_message(
82
- "rake #{webpacker_task_name}",
83
- "rake #{webpacker_task_name.gsub("webpacker", "shakapacker")}"
84
- )
85
- )
86
- end
87
9
  end
@@ -30,21 +30,6 @@ class Shakapacker::DevServer
30
30
  fetch(:port)
31
31
  end
32
32
 
33
- def https?
34
- value = fetch(:https)
35
-
36
- unless value.nil?
37
- puts "WARNING: `https: true` has been deprecated in favor of `server: 'https'`"
38
- end
39
-
40
- case value
41
- when true, "true", Hash
42
- true
43
- else
44
- false
45
- end
46
- end
47
-
48
33
  def server
49
34
  server_value = fetch(:server)
50
35
  server_type = server_value.is_a?(Hash) ? server_value[:type] : server_value
@@ -65,7 +50,7 @@ class Shakapacker::DevServer
65
50
  end
66
51
 
67
52
  def protocol
68
- return "https" if server == "https" || https? == true
53
+ return "https" if server == "https"
69
54
 
70
55
  "http"
71
56
  end
@@ -70,16 +70,7 @@ module Shakapacker
70
70
 
71
71
  cmd = build_cmd
72
72
 
73
- if @argv.include?("--debug-webpacker")
74
- Shakapacker.puts_deprecation_message(
75
- Shakapacker.short_deprecation_message(
76
- "--debug-webpacker",
77
- "--debug-shakapacker"
78
- )
79
- )
80
- end
81
-
82
- if @argv.delete("--debug-shakapacker") || @argv.delete("--debug-webpacker")
73
+ if @argv.delete("--debug-shakapacker")
83
74
  env["NODE_OPTIONS"] = "#{env["NODE_OPTIONS"]} --inspect-brk --trace-warnings"
84
75
  end
85
76
 
@@ -98,17 +89,7 @@ module Shakapacker
98
89
  end
99
90
 
100
91
  def build_cmd
101
- if Shakapacker::Utils::Misc.use_package_json_gem
102
- return package_json.manager.native_exec_command("webpack", ["serve"])
103
- end
104
-
105
- return ["#{@node_modules_bin_path}/webpack", "serve"] if node_modules_bin_exist?
106
-
107
- ["yarn", "webpack", "serve"]
108
- end
109
-
110
- def node_modules_bin_exist?
111
- File.exist?("#{@node_modules_bin_path}/webpack-dev-server")
92
+ package_json.manager.native_exec_command("webpack", ["serve"])
112
93
  end
113
94
  end
114
95
  end
@@ -20,7 +20,7 @@ class Shakapacker::Env
20
20
  end
21
21
 
22
22
  def fallback_env_warning
23
- logger.info "RAILS_ENV=#{Rails.env} environment is not defined in config/shakapacker.yml, falling back to #{Shakapacker::DEFAULT_ENV} environment"
23
+ logger.info "RAILS_ENV=#{Rails.env} environment is not defined in #{config_path}, falling back to #{Shakapacker::DEFAULT_ENV} environment"
24
24
  end
25
25
 
26
26
  def available_environments
@@ -98,7 +98,7 @@ module Shakapacker::Helper
98
98
  def javascript_pack_tag(*names, defer: true, **options)
99
99
  if @javascript_pack_tag_loaded
100
100
  raise "To prevent duplicated chunks on the page, you should call javascript_pack_tag only once on the page. " \
101
- "Please refer to https://github.com/shakacode/shakapacker/blob/master/README.md#view-helpers-javascript_pack_tag-and-stylesheet_pack_tag for the usage guide"
101
+ "Please refer to https://github.com/shakacode/shakapacker/blob/main/README.md#view-helpers-javascript_pack_tag-and-stylesheet_pack_tag for the usage guide"
102
102
  end
103
103
 
104
104
  append_javascript_pack_tag(*names, defer: defer)
@@ -169,7 +169,7 @@ module Shakapacker::Helper
169
169
  def append_stylesheet_pack_tag(*names)
170
170
  if @stylesheet_pack_tag_loaded
171
171
  raise "You can only call append_stylesheet_pack_tag before stylesheet_pack_tag helper. " \
172
- "Please refer to https://github.com/shakacode/shakapacker/blob/master/README.md#view-helper-append_javascript_pack_tag-prepend_javascript_pack_tag-and-append_stylesheet_pack_tag for the usage guide"
172
+ "Please refer to https://github.com/shakacode/shakapacker/blob/main/README.md#view-helper-append_javascript_pack_tag-prepend_javascript_pack_tag-and-append_stylesheet_pack_tag for the usage guide"
173
173
  end
174
174
 
175
175
  @stylesheet_pack_tag_queue ||= []
@@ -196,7 +196,7 @@ module Shakapacker::Helper
196
196
  def update_javascript_pack_tag_queue(defer:)
197
197
  if @javascript_pack_tag_loaded
198
198
  raise "You can only call #{caller_locations(1..1).first.label} before javascript_pack_tag helper. " \
199
- "Please refer to https://github.com/shakacode/shakapacker/blob/master/README.md#view-helper-append_javascript_pack_tag-prepend_javascript_pack_tag-and-append_stylesheet_pack_tag for the usage guide"
199
+ "Please refer to https://github.com/shakacode/shakapacker/blob/main/README.md#view-helper-append_javascript_pack_tag-prepend_javascript_pack_tag-and-append_stylesheet_pack_tag for the usage guide"
200
200
  end
201
201
 
202
202
  yield(defer ? :deferred : :non_deferred)
@@ -7,9 +7,7 @@ class Shakapacker::Instance
7
7
 
8
8
  def initialize(root_path: Rails.root, config_path: Rails.root.join("config/shakapacker.yml"))
9
9
  @root_path = root_path
10
-
11
- # For backward compatibility
12
- @config_path = Shakapacker.get_config_file_path_with_backward_compatibility(config_path)
10
+ @config_path = Pathname.new(ENV["SHAKAPACKER_CONFIG"] || config_path)
13
11
  end
14
12
 
15
13
  def env
@@ -105,7 +105,7 @@ class Shakapacker::Manifest
105
105
  def missing_file_from_manifest_error(bundle_name)
106
106
  <<-MSG
107
107
  Shakapacker can't find #{bundle_name} in #{config.manifest_path}. Possible causes:
108
- 1. You forgot to install node packages (try `yarn install`) or are running an incompatible version of Node
108
+ 1. You forgot to install javascript packages or are running an incompatible javascript runtime version
109
109
  2. Your app has code with a non-standard extension (like a `.jsx` file) but the extension is not in the `extensions` config in `config/shakapacker.yml`
110
110
  3. You have set compile: false (see `config/shakapacker.yml`) for this environment
111
111
  (unless you are using the `bin/shakapacker -w` or the `bin/shakapacker-dev-server`, in which case maybe you aren't running the dev server in the background?)
@@ -3,6 +3,7 @@ require "rails/railtie"
3
3
  require "shakapacker/helper"
4
4
  require "shakapacker/dev_server_proxy"
5
5
  require "shakapacker/version_checker"
6
+ require "shakapacker/utils/manager"
6
7
 
7
8
  class Shakapacker::Engine < ::Rails::Engine
8
9
  # Allows Shakapacker config values to be set via Rails env config files
@@ -14,6 +15,12 @@ class Shakapacker::Engine < ::Rails::Engine
14
15
  end
15
16
  end
16
17
 
18
+ initializer "shakapacker.manager_checker" do
19
+ if File.exist?(Shakapacker::VersionChecker::NodePackageVersion.package_json_path)
20
+ Shakapacker::Utils::Manager.error_unless_package_manager_is_obvious!
21
+ end
22
+ end
23
+
17
24
  initializer "shakapacker.proxy" do |app|
18
25
  if (Shakapacker.config.dev_server.present? rescue nil)
19
26
  app.middleware.insert_before 0,
@@ -1,4 +1,6 @@
1
1
  require "shakapacker/utils/misc"
2
+ require "shakapacker/utils/manager"
3
+ require "package_json"
2
4
 
3
5
  module Shakapacker
4
6
  class Runner
@@ -13,34 +15,18 @@ module Shakapacker
13
15
 
14
16
  @app_path = File.expand_path(".", Dir.pwd)
15
17
  @webpack_config = File.join(@app_path, "config/webpack/webpack.config.js")
16
-
17
- Shakapacker.set_shakapacker_env_variables_for_backward_compatibility
18
-
19
- @node_modules_bin_path = fetch_node_modules_bin_path
20
18
  @shakapacker_config = ENV["SHAKAPACKER_CONFIG"] || File.join(@app_path, "config/shakapacker.yml")
21
19
 
22
- @shakapacker_config = Shakapacker.get_config_file_path_with_backward_compatibility(@shakapacker_config)
23
-
24
20
  unless File.exist?(@webpack_config)
25
21
  $stderr.puts "webpack config #{@webpack_config} not found, please run 'bundle exec rails shakapacker:install' to install Shakapacker with default configs or add the missing config file for your custom environment."
26
22
  exit!
27
23
  end
28
- end
29
24
 
30
- def fetch_node_modules_bin_path
31
- return nil if Shakapacker::Utils::Misc.use_package_json_gem
32
-
33
- ENV["SHAKAPACKER_NODE_MODULES_BIN_PATH"] || `yarn bin`.chomp
25
+ Shakapacker::Utils::Manager.error_unless_package_manager_is_obvious!
34
26
  end
35
27
 
36
28
  def package_json
37
- if @package_json.nil?
38
- Shakapacker::Utils::Misc.require_package_json_gem
39
-
40
- @package_json = PackageJson.read(@app_path)
41
- end
42
-
43
- @package_json
29
+ @package_json ||= PackageJson.read(@app_path)
44
30
  end
45
31
  end
46
32
  end
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "package_json"
4
+
5
+ module Shakapacker
6
+ module Utils
7
+ class Manager
8
+ class Error < StandardError; end
9
+
10
+ MANAGER_LOCKS = {
11
+ "bun" => "bun.lockb",
12
+ "npm" => "package-lock.json",
13
+ "pnpm" => "pnpm-lock.yaml",
14
+ "yarn" => "yarn.lock"
15
+ }
16
+
17
+ # Emits a warning if it's not obvious what package manager to use
18
+ def self.error_unless_package_manager_is_obvious!
19
+ return unless PackageJson.read.fetch("packageManager", nil).nil?
20
+
21
+ guessed_binary = guess_binary
22
+
23
+ return if guessed_binary == "npm"
24
+
25
+ raise Error, <<~MSG
26
+ You don't have "packageManager" set in your package.json
27
+ meaning that Shakapacker will use npm but you've got a #{MANAGER_LOCKS[guessed_binary]}
28
+ file meaning you probably want to be using #{guessed_binary} instead.
29
+
30
+ To make this happen, set "packageManager" in your package.json to #{guessed_binary}@#{guess_version}
31
+ MSG
32
+ end
33
+
34
+ # Guesses the binary of the package manager to use based on what lockfiles exist
35
+ #
36
+ # @return [String]
37
+ def self.guess_binary
38
+ MANAGER_LOCKS.find { |_, lock| File.exist?(lock) }&.first || "npm"
39
+ end
40
+
41
+ # Guesses the version of the package manager to use by calling `<manager> --version`
42
+ #
43
+ # @return [String]
44
+ def self.guess_version
45
+ require "open3"
46
+
47
+ command = "#{guess_binary} --version"
48
+ stdout, stderr, status = Open3.capture3(command)
49
+
50
+ unless status.success?
51
+ raise Error, "#{command} failed with exit code #{status.exitstatus}: #{stderr}"
52
+ end
53
+
54
+ stdout.chomp
55
+ end
56
+ end
57
+ end
58
+ end
@@ -8,18 +8,6 @@ module Shakapacker
8
8
  class Misc
9
9
  extend FileUtils
10
10
 
11
- def self.use_package_json_gem
12
- ENV.fetch("SHAKAPACKER_USE_PACKAGE_JSON_GEM", "false").casecmp("true").zero?
13
- end
14
-
15
- def self.require_package_json_gem
16
- unless use_package_json_gem
17
- raise "PackageJson should not be used unless SHAKAPACKER_USE_PACKAGE_JSON_GEM is true"
18
- end
19
-
20
- require "package_json"
21
- end
22
-
23
11
  def self.uncommitted_changes?(message_handler)
24
12
  return false if ENV["COVERAGE"] == "true"
25
13
 
@@ -1,4 +1,4 @@
1
1
  module Shakapacker
2
2
  # Change the version in package.json too, please!
3
- VERSION = "7.3.0.beta.1".freeze
3
+ VERSION = "8.0.0-rc.1".freeze
4
4
  end