shakapacker 7.1.0 → 7.2.0.rc.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/generator.yml +3 -0
- data/.github/workflows/ruby-backward-compatibility.yml +6 -0
- data/.github/workflows/ruby.yml +7 -0
- data/CHANGELOG.md +12 -6
- data/README.md +29 -3
- data/docs/v6_upgrade.md +1 -1
- data/lib/install/template.rb +56 -16
- data/lib/shakapacker/compiler.rb +5 -3
- data/lib/shakapacker/configuration.rb +8 -0
- data/lib/shakapacker/dev_server_runner.rb +11 -5
- data/lib/shakapacker/runner.rb +19 -1
- data/lib/shakapacker/utils/misc.rb +12 -0
- data/lib/shakapacker/version.rb +1 -1
- data/lib/shakapacker/webpack_runner.rb +12 -5
- data/lib/tasks/shakapacker/binstubs.rake +1 -1
- data/lib/tasks/shakapacker/check_manager.rake +27 -0
- data/lib/tasks/shakapacker/check_yarn.rake +2 -1
- data/lib/tasks/shakapacker/info.rake +20 -3
- data/lib/tasks/shakapacker/install.rake +1 -1
- data/lib/tasks/shakapacker/verify_install.rake +1 -1
- data/lib/tasks/shakapacker.rake +2 -2
- data/lib/tasks/webpacker/check_yarn.rake +1 -1
- data/package.json +2 -2
- data/shakapacker.gemspec +1 -0
- data/spec/backward_compatibility_specs/dev_server_runner_spec.rb +90 -30
- data/spec/backward_compatibility_specs/engine_rake_tasks_spec.rb +29 -7
- data/spec/backward_compatibility_specs/webpack_runner_spec.rb +44 -10
- data/spec/generator_specs/e2e_template/template.rb +31 -10
- data/spec/generator_specs/fake-bin/bun +10 -0
- data/spec/generator_specs/fake-bin/npm +10 -0
- data/spec/generator_specs/fake-bin/pnpm +10 -0
- data/spec/generator_specs/fake-bin/yarn +10 -0
- data/spec/generator_specs/generator_spec.rb +167 -17
- data/spec/mounted_app/package.json +1 -0
- data/spec/shakapacker/compiler_spec.rb +9 -5
- data/spec/shakapacker/configuration_spec.rb +48 -0
- data/spec/shakapacker/dev_server_runner_spec.rb +88 -29
- data/spec/shakapacker/engine_rake_tasks_spec.rb +27 -6
- data/spec/shakapacker/rake_tasks_spec.rb +6 -5
- data/spec/shakapacker/spec_helper_initializer.rb +18 -0
- data/spec/shakapacker/webpack_runner_spec.rb +44 -10
- data/spec/spec_helper.rb +2 -0
- data/spec/support/package_json_helpers.rb +16 -0
- metadata +26 -5
@@ -17,48 +17,108 @@ describe "DevServerRunner" do
|
|
17
17
|
|
18
18
|
let(:test_app_path) { File.expand_path("webpacker_test_app", __dir__) }
|
19
19
|
|
20
|
-
|
21
|
-
|
20
|
+
NODE_PACKAGE_MANAGERS.each do |fallback_manager|
|
21
|
+
context "when using package_json with #{fallback_manager} as the manager" do
|
22
|
+
with_use_package_json_gem(enabled: true, fallback_manager: fallback_manager)
|
22
23
|
|
23
|
-
|
24
|
-
end
|
24
|
+
let(:package_json) { PackageJson.read(test_app_path) }
|
25
25
|
|
26
|
-
|
27
|
-
cmd = ["yarn", "webpack", "serve", "--config", "#{test_app_path}/config/webpack/webpack.config.js"]
|
26
|
+
require "package_json"
|
28
27
|
|
29
|
-
|
30
|
-
|
28
|
+
it "uses the expected package manager", unless: fallback_manager == "yarn_classic" do
|
29
|
+
cmd = package_json.manager.native_exec_command("webpack", ["serve", "--config", "#{test_app_path}/config/webpack/webpack.config.js"])
|
31
30
|
|
32
|
-
|
33
|
-
cmd = ["#{test_app_path}/node_modules/.bin/webpack", "serve", "--config", "#{test_app_path}/config/webpack/webpack.config.js", "--quiet"]
|
31
|
+
manager_name = fallback_manager.split("_")[0]
|
34
32
|
|
35
|
-
|
36
|
-
|
33
|
+
expect(cmd).to start_with(manager_name)
|
34
|
+
end
|
35
|
+
|
36
|
+
it "runs the command using the manager" do
|
37
|
+
cmd = package_json.manager.native_exec_command("webpack", ["serve", "--config", "#{test_app_path}/config/webpack/webpack.config.js"])
|
38
|
+
|
39
|
+
verify_command(cmd)
|
40
|
+
end
|
41
|
+
|
42
|
+
it "passes on arguments" do
|
43
|
+
cmd = package_json.manager.native_exec_command("webpack", ["serve", "--config", "#{test_app_path}/config/webpack/webpack.config.js", "--quiet"])
|
37
44
|
|
38
|
-
|
39
|
-
|
45
|
+
verify_command(cmd, argv: (["--quiet"]))
|
46
|
+
end
|
47
|
+
|
48
|
+
it "supports the https flag" do
|
49
|
+
cmd = package_json.manager.native_exec_command("webpack", ["serve", "--config", "#{test_app_path}/config/webpack/webpack.config.js", "--https"])
|
50
|
+
|
51
|
+
dev_server = double()
|
52
|
+
allow(dev_server).to receive(:host).and_return("localhost")
|
53
|
+
allow(dev_server).to receive(:port).and_return("3035")
|
54
|
+
allow(dev_server).to receive(:pretty?).and_return(false)
|
55
|
+
allow(dev_server).to receive(:https?).and_return(true)
|
56
|
+
allow(dev_server).to receive(:hmr?).and_return(false)
|
57
|
+
|
58
|
+
allow(Shakapacker::DevServer).to receive(:new) do
|
59
|
+
verify_command(cmd, argv: (["--https"]))
|
60
|
+
end.and_return(dev_server)
|
61
|
+
end
|
62
|
+
|
63
|
+
it "accepts environment variables" do
|
64
|
+
cmd = package_json.manager.native_exec_command("webpack", ["serve", "--config", "#{test_app_path}/config/webpack/webpack.config.js"])
|
65
|
+
env = Webpacker::Compiler.env.dup
|
40
66
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
allow(dev_server).to receive(:pretty?).and_return(false)
|
45
|
-
allow(dev_server).to receive(:https?).and_return(true)
|
46
|
-
allow(dev_server).to receive(:hmr?).and_return(false)
|
67
|
+
# ENV["WEBPACKER_CONFIG"] is the interface and env["SHAKAPACKER_CONFIG"] is internal
|
68
|
+
ENV["WEBPACKER_CONFIG"] = env["SHAKAPACKER_CONFIG"] = "#{test_app_path}/config/webpacker_other_location.yml"
|
69
|
+
env["WEBPACK_SERVE"] = "true"
|
47
70
|
|
48
|
-
|
49
|
-
|
50
|
-
end
|
71
|
+
verify_command(cmd, env: env)
|
72
|
+
end
|
73
|
+
end
|
51
74
|
end
|
52
75
|
|
53
|
-
|
54
|
-
|
55
|
-
env = Webpacker::Compiler.env.dup
|
76
|
+
context "when not using package_json" do
|
77
|
+
with_use_package_json_gem(enabled: false)
|
56
78
|
|
57
|
-
|
58
|
-
|
59
|
-
env["WEBPACK_SERVE"] = "true"
|
79
|
+
it "supports running via node modules" do
|
80
|
+
cmd = ["#{test_app_path}/node_modules/.bin/webpack", "serve", "--config", "#{test_app_path}/config/webpack/webpack.config.js"]
|
60
81
|
|
61
|
-
|
82
|
+
verify_command(cmd, use_node_modules: true)
|
83
|
+
end
|
84
|
+
|
85
|
+
it "supports running via yarn" do
|
86
|
+
cmd = ["yarn", "webpack", "serve", "--config", "#{test_app_path}/config/webpack/webpack.config.js"]
|
87
|
+
|
88
|
+
verify_command(cmd, use_node_modules: false)
|
89
|
+
end
|
90
|
+
|
91
|
+
it "passes on arguments" do
|
92
|
+
cmd = ["#{test_app_path}/node_modules/.bin/webpack", "serve", "--config", "#{test_app_path}/config/webpack/webpack.config.js", "--quiet"]
|
93
|
+
|
94
|
+
verify_command(cmd, argv: (["--quiet"]))
|
95
|
+
end
|
96
|
+
|
97
|
+
it "supports the https flag" do
|
98
|
+
cmd = ["#{test_app_path}/node_modules/.bin/webpack", "serve", "--config", "#{test_app_path}/config/webpack/webpack.config.js", "--https"]
|
99
|
+
|
100
|
+
dev_server = double()
|
101
|
+
allow(dev_server).to receive(:host).and_return("localhost")
|
102
|
+
allow(dev_server).to receive(:port).and_return("3035")
|
103
|
+
allow(dev_server).to receive(:pretty?).and_return(false)
|
104
|
+
allow(dev_server).to receive(:https?).and_return(true)
|
105
|
+
allow(dev_server).to receive(:hmr?).and_return(false)
|
106
|
+
|
107
|
+
allow(Shakapacker::DevServer).to receive(:new) do
|
108
|
+
verify_command(cmd, argv: (["--https"]))
|
109
|
+
end.and_return(dev_server)
|
110
|
+
end
|
111
|
+
|
112
|
+
it "accepts environment variables" do
|
113
|
+
cmd = ["#{test_app_path}/node_modules/.bin/webpack", "serve", "--config", "#{test_app_path}/config/webpack/webpack.config.js"]
|
114
|
+
env = Webpacker::Compiler.env.dup
|
115
|
+
|
116
|
+
# ENV["WEBPACKER_CONFIG"] is the interface and env["SHAKAPACKER_CONFIG"] is internal
|
117
|
+
ENV["WEBPACKER_CONFIG"] = env["SHAKAPACKER_CONFIG"] = "#{test_app_path}/config/webpacker_other_location.yml"
|
118
|
+
env["WEBPACK_SERVE"] = "true"
|
119
|
+
|
120
|
+
verify_command(cmd, env: env)
|
121
|
+
end
|
62
122
|
end
|
63
123
|
|
64
124
|
private
|
@@ -9,16 +9,38 @@ describe "EngineRakeTasks" do
|
|
9
9
|
remove_webpack_binstubs
|
10
10
|
end
|
11
11
|
|
12
|
-
|
13
|
-
|
12
|
+
NODE_PACKAGE_MANAGERS.each do |fallback_manager|
|
13
|
+
context "when using package_json with #{fallback_manager} as the manager" do
|
14
|
+
with_use_package_json_gem(enabled: true, fallback_manager: fallback_manager)
|
14
15
|
|
15
|
-
|
16
|
-
|
16
|
+
it "mounts app:webpacker task successfully" do
|
17
|
+
output = Dir.chdir(mounted_app_path) { `rake -T` }
|
18
|
+
|
19
|
+
expect(output).to match /app:webpacker.+DEPRECATED/
|
20
|
+
expect(output).to match /app:webpacker:binstubs.+DEPRECATED/
|
21
|
+
end
|
22
|
+
|
23
|
+
it "only adds expected files to bin directory when binstubs is run" do
|
24
|
+
Dir.chdir(mounted_app_path) { `bundle exec rake app:webpacker:binstubs` }
|
25
|
+
expected_binstub_paths.each { |path| expect(File.exist?(path)).to be true }
|
26
|
+
end
|
27
|
+
end
|
17
28
|
end
|
18
29
|
|
19
|
-
|
20
|
-
|
21
|
-
|
30
|
+
context "when not using package_json" do
|
31
|
+
with_use_package_json_gem(enabled: false)
|
32
|
+
|
33
|
+
it "mounts app:webpacker task successfully" do
|
34
|
+
output = Dir.chdir(mounted_app_path) { `rake -T` }
|
35
|
+
|
36
|
+
expect(output).to match /app:webpacker.+DEPRECATED/
|
37
|
+
expect(output).to match /app:webpacker:binstubs.+DEPRECATED/
|
38
|
+
end
|
39
|
+
|
40
|
+
it "only adds expected files to bin directory when binstubs is run" do
|
41
|
+
Dir.chdir(mounted_app_path) { `bundle exec rake app:webpacker:binstubs` }
|
42
|
+
expected_binstub_paths.each { |path| expect(File.exist?(path)).to be true }
|
43
|
+
end
|
22
44
|
end
|
23
45
|
|
24
46
|
private
|
@@ -15,22 +15,56 @@ describe "WebpackRunner" do
|
|
15
15
|
|
16
16
|
let(:test_app_path) { File.expand_path("./webpacker_test_app", __dir__) }
|
17
17
|
|
18
|
-
|
19
|
-
|
18
|
+
NODE_PACKAGE_MANAGERS.each do |fallback_manager|
|
19
|
+
context "when using package_json with #{fallback_manager} as the manager" do
|
20
|
+
with_use_package_json_gem(enabled: true, fallback_manager: fallback_manager)
|
20
21
|
|
21
|
-
|
22
|
-
|
22
|
+
let(:package_json) { PackageJson.read(test_app_path) }
|
23
|
+
|
24
|
+
require "package_json"
|
25
|
+
|
26
|
+
it "uses the expected package manager", unless: fallback_manager == "yarn_classic" do
|
27
|
+
cmd = package_json.manager.native_exec_command("webpack", ["--config", "#{test_app_path}/config/webpack/webpack.config.js"])
|
28
|
+
|
29
|
+
manager_name = fallback_manager.split("_")[0]
|
30
|
+
|
31
|
+
expect(cmd).to start_with(manager_name)
|
32
|
+
end
|
33
|
+
|
34
|
+
it "runs the command using the manager" do
|
35
|
+
cmd = package_json.manager.native_exec_command("webpack", ["--config", "#{test_app_path}/config/webpack/webpack.config.js"])
|
23
36
|
|
24
|
-
|
25
|
-
|
37
|
+
verify_command(cmd)
|
38
|
+
end
|
26
39
|
|
27
|
-
|
40
|
+
it "passes on arguments" do
|
41
|
+
cmd = package_json.manager.native_exec_command("webpack", ["--config", "#{test_app_path}/config/webpack/webpack.config.js", "--watch"])
|
42
|
+
|
43
|
+
verify_command(cmd, argv: (["--watch"]))
|
44
|
+
end
|
45
|
+
end
|
28
46
|
end
|
29
47
|
|
30
|
-
|
31
|
-
|
48
|
+
context "when not using package_json" do
|
49
|
+
with_use_package_json_gem(enabled: false)
|
50
|
+
|
51
|
+
it "supports running via node_modules" do
|
52
|
+
cmd = ["#{test_app_path}/node_modules/.bin/webpack", "--config", "#{test_app_path}/config/webpack/webpack.config.js"]
|
53
|
+
|
54
|
+
verify_command(cmd, use_node_modules: true)
|
55
|
+
end
|
56
|
+
|
57
|
+
it "supports running via yarn" do
|
58
|
+
cmd = ["yarn", "webpack", "--config", "#{test_app_path}/config/webpack/webpack.config.js"]
|
32
59
|
|
33
|
-
|
60
|
+
verify_command(cmd, use_node_modules: false)
|
61
|
+
end
|
62
|
+
|
63
|
+
it "passes on arguments" do
|
64
|
+
cmd = ["#{test_app_path}/node_modules/.bin/webpack", "--config", "#{test_app_path}/config/webpack/webpack.config.js", "--watch"]
|
65
|
+
|
66
|
+
verify_command(cmd, argv: ["--watch"])
|
67
|
+
end
|
34
68
|
end
|
35
69
|
|
36
70
|
private
|
@@ -1,13 +1,34 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
1
|
+
require "shakapacker/utils/misc"
|
2
|
+
|
3
|
+
if Shakapacker::Utils::Misc.use_package_json_gem
|
4
|
+
Shakapacker::Utils::Misc.require_package_json_gem
|
5
|
+
|
6
|
+
package_json = PackageJson.new
|
7
|
+
|
8
|
+
# install react
|
9
|
+
package_json.manager.add(["react", "react-dom", "@babel/preset-react"])
|
10
|
+
|
11
|
+
# update webpack presets for react
|
12
|
+
package_json.merge! do |pj|
|
13
|
+
babel = pj.fetch("babel", {})
|
14
|
+
|
15
|
+
babel["presets"] ||= []
|
16
|
+
babel["presets"].unshift("@babel/preset-react")
|
17
|
+
|
18
|
+
{ "babel" => babel }
|
19
|
+
end
|
20
|
+
else
|
21
|
+
# install react
|
22
|
+
system("yarn add react react-dom @babel/preset-react")
|
23
|
+
|
24
|
+
# update webpack presets for react
|
25
|
+
package_json_path = Rails.root.join("./package.json")
|
26
|
+
insert_into_file(
|
27
|
+
package_json_path,
|
28
|
+
%( "@babel/preset-react",\n),
|
29
|
+
after: /"presets": \[\n/
|
30
|
+
)
|
31
|
+
end
|
11
32
|
|
12
33
|
# install rspec-rails
|
13
34
|
system("bundle add rspec-rails --group development,test")
|
@@ -0,0 +1,10 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
binary = "bun"
|
4
|
+
major_version = "1"
|
5
|
+
|
6
|
+
unless ENV["SHAKAPACKER_EXPECTED_PACKAGE_MANGER"] == binary
|
7
|
+
raise StandardError, "(#{binary}) this is not the package manager you're looking for..."
|
8
|
+
end
|
9
|
+
|
10
|
+
exec("npx", "-y", "#{binary}@#{major_version}", *ARGV)
|
@@ -0,0 +1,10 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
binary = "npm"
|
4
|
+
major_version = "9"
|
5
|
+
|
6
|
+
unless ENV["SHAKAPACKER_EXPECTED_PACKAGE_MANGER"] == binary
|
7
|
+
raise StandardError, "(#{binary}) this is not the package manager you're looking for..."
|
8
|
+
end
|
9
|
+
|
10
|
+
exec("npx", "-y", "#{binary}@#{major_version}", *ARGV)
|
@@ -0,0 +1,10 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
binary = "pnpm"
|
4
|
+
major_version = "8"
|
5
|
+
|
6
|
+
unless ENV["SHAKAPACKER_EXPECTED_PACKAGE_MANGER"] == binary
|
7
|
+
raise StandardError, "(#{binary}) this is not the package manager you're looking for..."
|
8
|
+
end
|
9
|
+
|
10
|
+
exec("npx", "-y", "#{binary}@#{major_version}", *ARGV)
|
@@ -0,0 +1,10 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
binary = "yarn"
|
4
|
+
major_version = "1"
|
5
|
+
|
6
|
+
unless ENV["SHAKAPACKER_EXPECTED_PACKAGE_MANGER"] == "#{binary}_classic"
|
7
|
+
raise StandardError, "(#{binary}) this is not the package manager you're looking for..."
|
8
|
+
end
|
9
|
+
|
10
|
+
exec("npx", "-y", "#{binary}@#{major_version}", *ARGV)
|
@@ -3,6 +3,7 @@ require "rake"
|
|
3
3
|
require "json"
|
4
4
|
require "shakapacker/utils/misc"
|
5
5
|
require "shakapacker/utils/version_syntax_converter"
|
6
|
+
require "package_json"
|
6
7
|
|
7
8
|
GEM_ROOT = Pathname.new(File.expand_path("../../..", __FILE__))
|
8
9
|
SPEC_PATH = Pathname.new(File.expand_path("../", __FILE__))
|
@@ -12,13 +13,13 @@ TEMP_RAILS_APP_PATH = SPEC_PATH.join("temp-rails-app")
|
|
12
13
|
describe "Generator" do
|
13
14
|
before :all do
|
14
15
|
# Don't use --skip-git because we want .gitignore file to exist in the project
|
15
|
-
sh_in_dir(SPEC_PATH, %(
|
16
|
+
sh_in_dir({}, SPEC_PATH, %(
|
16
17
|
rails new base-rails-app --skip-javascript --skip-bundle --skip-spring
|
17
18
|
rm -rf base-rails-app/.git
|
18
19
|
))
|
19
20
|
|
20
21
|
Bundler.with_unbundled_env do
|
21
|
-
sh_in_dir(BASE_RAILS_APP_PATH, %(
|
22
|
+
sh_in_dir({}, BASE_RAILS_APP_PATH, %(
|
22
23
|
gem update bundler
|
23
24
|
bundle add shakapacker --path "#{GEM_ROOT}"
|
24
25
|
))
|
@@ -31,12 +32,144 @@ describe "Generator" do
|
|
31
32
|
end
|
32
33
|
|
33
34
|
describe "shakapacker:install" do
|
34
|
-
|
35
|
+
# TODO: ideally "yarn_berry" should be here too, but it requires more complex setup
|
36
|
+
NODE_PACKAGE_MANAGERS.reject { |fm| fm == "yarn_berry" }.each do |fallback_manager|
|
37
|
+
context "when using package_json with #{fallback_manager} as the manager" do
|
38
|
+
before :all do
|
39
|
+
sh_opts = { fallback_manager: fallback_manager }
|
40
|
+
|
41
|
+
sh_in_dir(sh_opts, SPEC_PATH, "cp -r '#{BASE_RAILS_APP_PATH}' '#{TEMP_RAILS_APP_PATH}'")
|
42
|
+
|
43
|
+
Bundler.with_unbundled_env do
|
44
|
+
sh_in_dir(sh_opts, TEMP_RAILS_APP_PATH, "FORCE=true bundle exec rails shakapacker:install")
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
after :all do
|
49
|
+
Dir.chdir(SPEC_PATH)
|
50
|
+
FileUtils.rm_rf(TEMP_RAILS_APP_PATH)
|
51
|
+
end
|
52
|
+
|
53
|
+
it "creates `config/shakapacker.yml`" do
|
54
|
+
config_file_relative_path = "config/shakapacker.yml"
|
55
|
+
actual_content = read(path_in_the_app(config_file_relative_path))
|
56
|
+
expected_content = read(path_in_the_gem(config_file_relative_path))
|
57
|
+
|
58
|
+
expect(actual_content).to eq expected_content
|
59
|
+
end
|
60
|
+
|
61
|
+
it "replaces package.json with the template file" do
|
62
|
+
package_json = PackageJson.read(path_in_the_app)
|
63
|
+
|
64
|
+
expect(package_json.fetch("name", "")).to eq("app")
|
65
|
+
end
|
66
|
+
|
67
|
+
it "creates webpack config directory and its files" do
|
68
|
+
expected_files = [
|
69
|
+
"webpack.config.js"
|
70
|
+
]
|
71
|
+
|
72
|
+
Dir.chdir(path_in_the_app("config/webpack")) do
|
73
|
+
existing_files_in_config_webpack_dir = Dir.glob("*")
|
74
|
+
expect(existing_files_in_config_webpack_dir).to eq expected_files
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
it "adds binstubs" do
|
79
|
+
expected_binstubs = []
|
80
|
+
Dir.chdir(File.join(GEM_ROOT, "lib/install/bin")) do
|
81
|
+
expected_binstubs = Dir.glob("bin/*")
|
82
|
+
end
|
83
|
+
|
84
|
+
Dir.chdir(File.join(TEMP_RAILS_APP_PATH, "bin")) do
|
85
|
+
actual_binstubs = Dir.glob("*")
|
86
|
+
expect(actual_binstubs).to include(*expected_binstubs)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
it "modifies .gitignore" do
|
91
|
+
actual_content = read(path_in_the_app(".gitignore"))
|
92
|
+
|
93
|
+
expect(actual_content).to match ".yarn-integrity"
|
94
|
+
end
|
95
|
+
|
96
|
+
it 'adds <%= javascript_pack_tag "application" %>' do
|
97
|
+
actual_content = read(path_in_the_app("app/views/layouts/application.html.erb"))
|
98
|
+
|
99
|
+
expect(actual_content).to match '<%= javascript_pack_tag "application" %>'
|
100
|
+
end
|
101
|
+
|
102
|
+
it "updates `bin/setup`" do
|
103
|
+
package_json = PackageJson.read(path_in_the_app)
|
104
|
+
cmd = package_json.manager.native_install_command.join(" ")
|
105
|
+
|
106
|
+
setup_file_content = read(path_in_the_app("bin/setup"))
|
107
|
+
|
108
|
+
expect(setup_file_content).to match %r(^\s*system!\(['"]#{cmd}['"]\))
|
109
|
+
end
|
110
|
+
|
111
|
+
it "adds relevant shakapacker version in package.json depending on gem version" do
|
112
|
+
npm_version = Shakapacker::Utils::VersionSyntaxConverter.new.rubygem_to_npm(Shakapacker::VERSION)
|
113
|
+
|
114
|
+
package_json = PackageJson.read(path_in_the_app)
|
115
|
+
actual_version = package_json.fetch("dependencies", {})["shakapacker"]
|
116
|
+
|
117
|
+
expect(actual_version).to eq(npm_version)
|
118
|
+
end
|
119
|
+
|
120
|
+
it "adds Shakapacker peer dependencies to package.json" do
|
121
|
+
package_json = PackageJson.read(path_in_the_app)
|
122
|
+
actual_dependencies = package_json.fetch("dependencies", {}).keys
|
123
|
+
|
124
|
+
expected_dependencies = %w(
|
125
|
+
@babel/core
|
126
|
+
@babel/plugin-transform-runtime
|
127
|
+
@babel/preset-env
|
128
|
+
@babel/runtime
|
129
|
+
babel-loader
|
130
|
+
compression-webpack-plugin
|
131
|
+
terser-webpack-plugin
|
132
|
+
webpack
|
133
|
+
webpack-assets-manifest
|
134
|
+
webpack-cli
|
135
|
+
webpack-merge
|
136
|
+
)
|
137
|
+
|
138
|
+
expect(actual_dependencies).to include(*expected_dependencies)
|
139
|
+
end
|
140
|
+
|
141
|
+
it "adds Shakapacker peer dev dependencies to package.json" do
|
142
|
+
package_json = PackageJson.read(path_in_the_app)
|
143
|
+
actual_dev_dependencies = package_json.fetch("devDependencies", {}).keys
|
144
|
+
|
145
|
+
expected_dev_dependencies = %w(
|
146
|
+
webpack-dev-server
|
147
|
+
)
|
148
|
+
|
149
|
+
expect(actual_dev_dependencies).to include(*expected_dev_dependencies)
|
150
|
+
end
|
151
|
+
|
152
|
+
context "with a basic react app setup" do
|
153
|
+
it "passes the test for rendering react component on the page" do
|
154
|
+
sh_opts = { fallback_manager: fallback_manager }
|
155
|
+
|
156
|
+
Bundler.with_unbundled_env do
|
157
|
+
sh_in_dir(sh_opts, TEMP_RAILS_APP_PATH, "./bin/rails app:template LOCATION=../e2e_template/template.rb")
|
158
|
+
expect(sh_in_dir(sh_opts, TEMP_RAILS_APP_PATH, "bundle exec rspec")).to be_truthy
|
159
|
+
end
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
context "when not using package_json" do
|
35
166
|
before :all do
|
36
|
-
|
167
|
+
sh_opts = { fallback_manager: nil }
|
168
|
+
|
169
|
+
sh_in_dir(sh_opts, SPEC_PATH, "cp -r '#{BASE_RAILS_APP_PATH}' '#{TEMP_RAILS_APP_PATH}'")
|
37
170
|
|
38
171
|
Bundler.with_unbundled_env do
|
39
|
-
sh_in_dir(TEMP_RAILS_APP_PATH, "FORCE=true bundle exec rails shakapacker:install")
|
172
|
+
sh_in_dir(sh_opts, TEMP_RAILS_APP_PATH, "FORCE=true bundle exec rails shakapacker:install")
|
40
173
|
end
|
41
174
|
end
|
42
175
|
|
@@ -53,10 +186,10 @@ describe "Generator" do
|
|
53
186
|
expect(actual_content).to eq expected_content
|
54
187
|
end
|
55
188
|
|
56
|
-
it "replaces package.json with
|
57
|
-
|
189
|
+
it "replaces package.json with template file" do
|
190
|
+
package_json = PackageJson.read(path_in_the_app)
|
58
191
|
|
59
|
-
expect(
|
192
|
+
expect(package_json.fetch("name", "")).to eq("app")
|
60
193
|
end
|
61
194
|
|
62
195
|
it "creates the webpack config directory and its files" do
|
@@ -104,14 +237,15 @@ describe "Generator" do
|
|
104
237
|
it "uses the shakapacker version in package.json depending on gem version" do
|
105
238
|
npm_version = Shakapacker::Utils::VersionSyntaxConverter.new.rubygem_to_npm(Shakapacker::VERSION)
|
106
239
|
|
107
|
-
|
240
|
+
package_json = PackageJson.read(path_in_the_app)
|
241
|
+
actual_version = package_json.fetch("dependencies", {})["shakapacker"]
|
108
242
|
|
109
|
-
expect(
|
243
|
+
expect(actual_version).to eq(npm_version)
|
110
244
|
end
|
111
245
|
|
112
246
|
it "adds Shakapacker peer dependencies to package.json" do
|
113
|
-
package_json =
|
114
|
-
actual_dependencies = package_json
|
247
|
+
package_json = PackageJson.read(path_in_the_app)
|
248
|
+
actual_dependencies = package_json.fetch("dependencies", {}).keys
|
115
249
|
|
116
250
|
expected_dependencies = %w(
|
117
251
|
@babel/core
|
@@ -131,8 +265,8 @@ describe "Generator" do
|
|
131
265
|
end
|
132
266
|
|
133
267
|
it "adds Shakapacker peer dev dependencies to package.json" do
|
134
|
-
package_json =
|
135
|
-
actual_dev_dependencies = package_json
|
268
|
+
package_json = PackageJson.read(path_in_the_app)
|
269
|
+
actual_dev_dependencies = package_json.fetch("devDependencies", {}).keys
|
136
270
|
|
137
271
|
expected_dev_dependencies = %w(
|
138
272
|
webpack-dev-server
|
@@ -143,10 +277,12 @@ describe "Generator" do
|
|
143
277
|
|
144
278
|
context "with a basic react app setup" do
|
145
279
|
it "passes the test for rendering react component on the page" do
|
280
|
+
sh_opts = { fallback_manager: nil }
|
281
|
+
|
146
282
|
Bundler.with_unbundled_env do
|
147
|
-
sh_in_dir(TEMP_RAILS_APP_PATH, "./bin/rails app:template LOCATION=../e2e_template/template.rb")
|
283
|
+
sh_in_dir(sh_opts, TEMP_RAILS_APP_PATH, "./bin/rails app:template LOCATION=../e2e_template/template.rb")
|
148
284
|
|
149
|
-
expect(sh_in_dir(TEMP_RAILS_APP_PATH, "bundle exec rspec")).to be_truthy
|
285
|
+
expect(sh_in_dir(sh_opts, TEMP_RAILS_APP_PATH, "bundle exec rspec")).to be_truthy
|
150
286
|
end
|
151
287
|
end
|
152
288
|
end
|
@@ -167,7 +303,21 @@ describe "Generator" do
|
|
167
303
|
File.read(path)
|
168
304
|
end
|
169
305
|
|
170
|
-
def
|
306
|
+
def sort_out_package_json(opts)
|
307
|
+
ENV["PATH"] = "#{SPEC_PATH}/fake-bin:#{ENV["PATH"]}"
|
308
|
+
|
309
|
+
if opts[:fallback_manager].nil?
|
310
|
+
ENV["SHAKAPACKER_EXPECTED_PACKAGE_MANGER"] = "yarn_classic"
|
311
|
+
ENV["SHAKAPACKER_USE_PACKAGE_JSON_GEM"] = "false"
|
312
|
+
else
|
313
|
+
ENV["SHAKAPACKER_EXPECTED_PACKAGE_MANGER"] = opts[:fallback_manager]
|
314
|
+
ENV["SHAKAPACKER_USE_PACKAGE_JSON_GEM"] = "true"
|
315
|
+
ENV["PACKAGE_JSON_FALLBACK_MANAGER"] = opts[:fallback_manager]
|
316
|
+
end
|
317
|
+
end
|
318
|
+
|
319
|
+
def sh_in_dir(opts, dir, *shell_commands)
|
320
|
+
sort_out_package_json(opts)
|
171
321
|
Shakapacker::Utils::Misc.sh_in_dir(dir, *shell_commands)
|
172
322
|
end
|
173
323
|
end
|
@@ -0,0 +1 @@
|
|
1
|
+
{}
|
@@ -50,10 +50,14 @@ describe "Shakapacker::Compiler" do
|
|
50
50
|
expect(Shakapacker.compiler.send(:webpack_env)["SHAKAPACKER_ASSET_HOST"]).to be nil
|
51
51
|
expect(Shakapacker.compiler.send(:webpack_env)["SHAKAPACKER_RELATIVE_URL_ROOT"]).to be nil
|
52
52
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
53
|
+
custom_env_variables = {
|
54
|
+
"SHAKAPACKER_ASSET_HOST" => "foo.bar",
|
55
|
+
"SHAKAPACKER_RELATIVE_URL_ROOT" => "/baz"
|
56
|
+
}
|
57
|
+
|
58
|
+
with_env_variable(custom_env_variables) do
|
59
|
+
expect(Shakapacker.compiler.send(:webpack_env)["SHAKAPACKER_ASSET_HOST"]).to eq "foo.bar"
|
60
|
+
expect(Shakapacker.compiler.send(:webpack_env)["SHAKAPACKER_RELATIVE_URL_ROOT"]).to eq "/baz"
|
61
|
+
end
|
58
62
|
end
|
59
63
|
end
|