shakapacker 6.6.0 → 7.0.0.rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (197) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby-backward-compatibility.yml +43 -0
  3. data/CHANGELOG.md +50 -4
  4. data/CONTRIBUTING.md +4 -4
  5. data/Gemfile.development_dependencies +1 -1
  6. data/README.md +113 -88
  7. data/Rakefile +5 -0
  8. data/config/shakapacker.yml +1 -0
  9. data/docs/deployment.md +12 -10
  10. data/docs/developing_webpacker.md +5 -5
  11. data/docs/react.md +10 -6
  12. data/docs/style_loader_vs_mini_css.md +2 -2
  13. data/docs/troubleshooting.md +22 -18
  14. data/docs/using_esbuild_loader.md +5 -3
  15. data/docs/using_swc_loader.md +2 -2
  16. data/docs/v6_upgrade.md +2 -2
  17. data/docs/v7_upgrade.md +56 -0
  18. data/lib/install/bin/shakapacker +13 -0
  19. data/lib/install/bin/shakapacker-dev-server +13 -0
  20. data/lib/install/config/{webpacker.yml → shakapacker.yml} +13 -8
  21. data/lib/install/template.rb +7 -7
  22. data/lib/{webpacker → shakapacker}/base_strategy.rb +2 -2
  23. data/lib/{webpacker → shakapacker}/commands.rb +4 -4
  24. data/lib/{webpacker → shakapacker}/compiler.rb +43 -15
  25. data/lib/{webpacker → shakapacker}/compiler_strategy.rb +6 -6
  26. data/lib/{webpacker → shakapacker}/configuration.rb +52 -21
  27. data/lib/shakapacker/deprecation_helper.rb +88 -0
  28. data/lib/{webpacker → shakapacker}/dev_server.rb +27 -4
  29. data/lib/{webpacker → shakapacker}/dev_server_proxy.rb +4 -4
  30. data/lib/shakapacker/dev_server_runner.rb +104 -0
  31. data/lib/{webpacker → shakapacker}/digest_strategy.rb +6 -6
  32. data/lib/{webpacker → shakapacker}/env.rb +8 -8
  33. data/lib/{webpacker → shakapacker}/helper.rb +20 -20
  34. data/lib/{webpacker → shakapacker}/instance.rb +13 -10
  35. data/lib/{webpacker → shakapacker}/manifest.rb +14 -14
  36. data/lib/{webpacker → shakapacker}/mtime_strategy.rb +5 -5
  37. data/lib/shakapacker/railtie.rb +70 -0
  38. data/lib/shakapacker/runner.rb +28 -0
  39. data/lib/shakapacker/utils/version_syntax_converter.rb +2 -2
  40. data/lib/{webpacker → shakapacker}/version.rb +2 -2
  41. data/lib/{webpacker → shakapacker}/version_checker.rb +8 -8
  42. data/lib/shakapacker/webpack_runner.rb +67 -0
  43. data/lib/shakapacker.rb +51 -1
  44. data/lib/tasks/shakapacker/binstubs.rake +15 -0
  45. data/lib/tasks/shakapacker/check_binstubs.rake +25 -0
  46. data/lib/tasks/shakapacker/check_node.rake +31 -0
  47. data/lib/tasks/shakapacker/check_yarn.rake +33 -0
  48. data/lib/tasks/shakapacker/clean.rake +23 -0
  49. data/lib/tasks/shakapacker/clobber.rake +18 -0
  50. data/lib/tasks/shakapacker/compile.rake +31 -0
  51. data/lib/tasks/shakapacker/info.rake +21 -0
  52. data/lib/tasks/shakapacker/install.rake +17 -0
  53. data/lib/tasks/shakapacker/verify_config.rake +12 -0
  54. data/lib/tasks/shakapacker/verify_install.rake +4 -0
  55. data/lib/tasks/shakapacker/yarn_install.rake +24 -0
  56. data/lib/tasks/shakapacker.rake +18 -0
  57. data/lib/tasks/webpacker/binstubs.rake +5 -11
  58. data/lib/tasks/webpacker/check_binstubs.rake +6 -9
  59. data/lib/tasks/webpacker/check_node.rake +5 -27
  60. data/lib/tasks/webpacker/check_yarn.rake +5 -29
  61. data/lib/tasks/webpacker/clean.rake +5 -19
  62. data/lib/tasks/webpacker/clobber.rake +6 -13
  63. data/lib/tasks/webpacker/compile.rake +5 -33
  64. data/lib/tasks/webpacker/info.rake +5 -17
  65. data/lib/tasks/webpacker/install.rake +5 -13
  66. data/lib/tasks/webpacker/verify_config.rake +6 -11
  67. data/lib/tasks/webpacker/verify_install.rake +7 -2
  68. data/lib/tasks/webpacker/yarn_install.rake +5 -20
  69. data/lib/tasks/webpacker.rake +15 -13
  70. data/lib/webpacker/dev_server_runner.rb +9 -96
  71. data/lib/webpacker/webpack_runner.rb +9 -58
  72. data/lib/webpacker.rb +3 -47
  73. data/package/__tests__/config-bc.js +27 -0
  74. data/package/__tests__/config.js +6 -5
  75. data/package/__tests__/dev_server-bc.js +46 -0
  76. data/package/__tests__/dev_server.js +9 -8
  77. data/package/__tests__/development-bc.js +66 -0
  78. data/package/__tests__/development.js +36 -5
  79. data/package/__tests__/env-bc.js +59 -0
  80. data/package/__tests__/env.js +3 -2
  81. data/package/__tests__/index.js +13 -0
  82. data/package/__tests__/production-bc.js +51 -0
  83. data/package/__tests__/production.js +25 -3
  84. data/package/__tests__/staging-bc.js +53 -0
  85. data/package/__tests__/staging.js +27 -4
  86. data/package/__tests__/test-bc.js +43 -0
  87. data/package/__tests__/test.js +22 -4
  88. data/package/babel/preset.js +1 -4
  89. data/package/config.js +25 -7
  90. data/package/dev_server.js +7 -4
  91. data/package/env.js +22 -3
  92. data/package/environments/__tests__/base-bc.js +107 -0
  93. data/package/environments/__tests__/base.js +13 -13
  94. data/package/environments/base.js +1 -1
  95. data/package/environments/development.js +4 -46
  96. data/package/environments/production.js +1 -1
  97. data/package/index.js +11 -4
  98. data/package/rules/__tests__/__utils__/webpack.js +1 -1
  99. data/package/rules/__tests__/file.js +27 -0
  100. data/package/rules/__tests__/swc.js +1 -2
  101. data/package/rules/file.js +2 -2
  102. data/package/utils/configPath.js +19 -0
  103. data/package/utils/defaultConfigPath.js +2 -0
  104. data/package/utils/get_style_rule.js +5 -2
  105. data/package/utils/helpers.js +24 -1
  106. data/package/utils/inliningCss.js +7 -0
  107. data/package/utils/snakeToCamelCase +7 -0
  108. data/package/webpackDevServerConfig.js +68 -0
  109. data/package.json +2 -2
  110. data/{webpacker.gemspec → shakapacker.gemspec} +3 -3
  111. data/spec/backward_compatibility_specs/command_spec_bc.rb +116 -0
  112. data/spec/backward_compatibility_specs/compiler_spec_bc.rb +59 -0
  113. data/spec/backward_compatibility_specs/compiler_strategy_spec_bc.rb +22 -0
  114. data/spec/backward_compatibility_specs/configuration_spec_bc.rb +286 -0
  115. data/spec/backward_compatibility_specs/dev_server_runner_spec_bc.rb +79 -0
  116. data/spec/backward_compatibility_specs/dev_server_spec_bc.rb +47 -0
  117. data/spec/backward_compatibility_specs/digest_strategy_spec_bc.rb +35 -0
  118. data/spec/backward_compatibility_specs/engine_rake_tasks_spec_bc.rb +44 -0
  119. data/spec/backward_compatibility_specs/env_spec_bc.rb +23 -0
  120. data/spec/backward_compatibility_specs/helper_spec_bc.rb +243 -0
  121. data/spec/backward_compatibility_specs/instance_spec_bc.rb +31 -0
  122. data/spec/backward_compatibility_specs/manifest_spec_bc.rb +100 -0
  123. data/spec/backward_compatibility_specs/mtime_strategy_spec_bc.rb +55 -0
  124. data/spec/backward_compatibility_specs/rake_tasks_spec_bc.rb +37 -0
  125. data/spec/backward_compatibility_specs/spec_helper_initializer.rb +24 -0
  126. data/spec/backward_compatibility_specs/webpack_runner_spec_bc.rb +56 -0
  127. data/spec/backward_compatibility_specs/webpacker_spec_bc.rb +41 -0
  128. data/spec/backward_compatibility_specs/webpacker_test_app/.gitignore +2 -0
  129. data/spec/backward_compatibility_specs/webpacker_test_app/Rakefile +3 -0
  130. data/spec/{test_app → backward_compatibility_specs/webpacker_test_app}/app/packs/entrypoints/application.js +1 -1
  131. data/{lib/install → spec/backward_compatibility_specs/webpacker_test_app}/bin/webpacker +0 -0
  132. data/spec/backward_compatibility_specs/webpacker_test_app/config/application.rb +11 -0
  133. data/spec/backward_compatibility_specs/webpacker_test_app/config/environment.rb +4 -0
  134. data/spec/backward_compatibility_specs/webpacker_test_app/config/initializers/inspect_autoload_paths.rb +1 -0
  135. data/spec/backward_compatibility_specs/webpacker_test_app/config/webpack/webpack.config.js +0 -0
  136. data/spec/{test_app → backward_compatibility_specs/webpacker_test_app}/config/webpacker.yml +1 -1
  137. data/spec/{test_app → backward_compatibility_specs/webpacker_test_app}/config/webpacker_css_extract_ignore_order_warnings.yml +1 -1
  138. data/spec/{test_app → backward_compatibility_specs/webpacker_test_app}/config/webpacker_defaults_fallback.yml +1 -1
  139. data/spec/backward_compatibility_specs/webpacker_test_app/config/webpacker_no_precompile.yml +7 -0
  140. data/spec/{test_app → backward_compatibility_specs/webpacker_test_app}/config/webpacker_other_location.yml +1 -1
  141. data/spec/{test_app → backward_compatibility_specs/webpacker_test_app}/config/webpacker_public_root.yml +1 -1
  142. data/spec/backward_compatibility_specs/webpacker_test_app/config.ru +5 -0
  143. data/spec/backward_compatibility_specs/webpacker_test_app/package.json +13 -0
  144. data/spec/backward_compatibility_specs/webpacker_test_app/public/packs/manifest.json +58 -0
  145. data/spec/backward_compatibility_specs/webpacker_test_app/some.config.js +0 -0
  146. data/spec/backward_compatibility_specs/webpacker_test_app/tmp/shakapacker/last-compilation-digest-production +1 -0
  147. data/spec/backward_compatibility_specs/webpacker_test_app/yarn.lock +11 -0
  148. data/spec/command_spec.rb +18 -16
  149. data/spec/compiler_spec.rb +19 -17
  150. data/spec/compiler_strategy_spec.rb +9 -7
  151. data/spec/configuration_spec.rb +108 -66
  152. data/spec/dev_server_runner_spec.rb +9 -8
  153. data/spec/dev_server_spec.rb +97 -9
  154. data/spec/digest_strategy_spec.rb +4 -2
  155. data/spec/engine_rake_tasks_spec.rb +12 -16
  156. data/spec/env_spec.rb +7 -5
  157. data/spec/helper_spec.rb +4 -2
  158. data/spec/instance_spec.rb +31 -0
  159. data/spec/manifest_spec.rb +21 -19
  160. data/spec/mounted_app/test/dummy/config/application.rb +1 -1
  161. data/spec/mounted_app/test/dummy/config/webpacker.yml +3 -3
  162. data/spec/mtime_strategy_spec.rb +4 -2
  163. data/spec/rake_tasks_spec.rb +20 -18
  164. data/spec/spec_helper.rb +0 -25
  165. data/spec/spec_helper_initializer.rb +24 -0
  166. data/spec/test_app/.gitignore +2 -0
  167. data/spec/test_app/app/javascript/entrypoints/application.js +10 -0
  168. data/spec/test_app/app/javascript/entrypoints/generated/something.js +2 -0
  169. data/spec/test_app/app/javascript/entrypoints/multi_entry.css +4 -0
  170. data/spec/test_app/app/javascript/entrypoints/multi_entry.js +4 -0
  171. data/spec/test_app/bin/{webpacker-dev-server → shakapacker} +3 -3
  172. data/spec/test_app/bin/{webpacker → shakapacker-dev-server} +3 -3
  173. data/spec/test_app/config/application.rb +1 -1
  174. data/spec/test_app/config/shakapacker.yml +82 -0
  175. data/spec/test_app/config/shakapacker_css_extract_ignore_order_warnings.yml +84 -0
  176. data/spec/test_app/config/shakapacker_defaults_fallback.yml +11 -0
  177. data/spec/test_app/config/shakapacker_manifest_path.yml +80 -0
  178. data/spec/test_app/config/shakapacker_nested_entries.yml +83 -0
  179. data/spec/test_app/config/shakapacker_no_precompile.yml +7 -0
  180. data/spec/test_app/config/shakapacker_other_location.yml +85 -0
  181. data/spec/test_app/config/shakapacker_public_root.yml +18 -0
  182. data/spec/version_checker_spec.rb +16 -15
  183. data/spec/webpack_runner_spec.rb +4 -3
  184. data/spec/webpacker_spec.rb +9 -29
  185. metadata +119 -44
  186. data/config/webpacker.yml +0 -1
  187. data/lib/webpacker/railtie.rb +0 -70
  188. data/lib/webpacker/runner.rb +0 -23
  189. data/package/configPath.js +0 -3
  190. data/package/inliningCss.js +0 -7
  191. data/spec/test_app/config/webpacker_no_precompile.yml +0 -7
  192. /data/spec/{test_app → backward_compatibility_specs/webpacker_test_app}/app/packs/entrypoints/generated/something.js +0 -0
  193. /data/spec/{test_app → backward_compatibility_specs/webpacker_test_app}/app/packs/entrypoints/multi_entry.css +0 -0
  194. /data/spec/{test_app → backward_compatibility_specs/webpacker_test_app}/app/packs/entrypoints/multi_entry.js +0 -0
  195. /data/{lib/install → spec/backward_compatibility_specs/webpacker_test_app}/bin/webpacker-dev-server +0 -0
  196. /data/spec/{test_app → backward_compatibility_specs/webpacker_test_app}/config/webpacker_manifest_path.yml +0 -0
  197. /data/spec/{test_app → backward_compatibility_specs/webpacker_test_app}/config/webpacker_nested_entries.yml +0 -0
@@ -0,0 +1,47 @@
1
+ require_relative "spec_helper_initializer"
2
+
3
+ describe "DevServer" do
4
+ it "doesn't run by default" do
5
+ expect(Webpacker.dev_server.running?).to be_falsy
6
+ end
7
+
8
+ it "uses localhost as host in development environment" do
9
+ with_rails_env("development") do
10
+ expect(Webpacker.dev_server.host).to eq "localhost"
11
+ end
12
+ end
13
+
14
+ it "uses port 3035 in development environment" do
15
+ with_rails_env("development") do
16
+ expect(Webpacker.dev_server.port).to eq 3035
17
+ end
18
+ end
19
+
20
+ it "doesn't use https in development environment" do
21
+ with_rails_env("development") do
22
+ expect(Webpacker.dev_server.https?).to be false
23
+ end
24
+ end
25
+
26
+ it "uses http protocol in development environment" do
27
+ with_rails_env("development") do
28
+ expect(Webpacker.dev_server.protocol).to eq "http"
29
+ end
30
+ end
31
+
32
+ it "sets host_with_port to localhost:3035 in development environment" do
33
+ with_rails_env("development") do
34
+ expect(Webpacker.dev_server.host_with_port).to eq "localhost:3035"
35
+ end
36
+ end
37
+
38
+ it "doesn't use pretty in development environment" do
39
+ with_rails_env("development") do
40
+ expect(Webpacker.dev_server.pretty?).to be false
41
+ end
42
+ end
43
+
44
+ it "users SHAKAPACKER_DEV_SERVER for DEFAULT_ENV_PREFIX" do
45
+ expect(Webpacker::DevServer::DEFAULT_ENV_PREFIX).to eq "SHAKAPACKER_DEV_SERVER"
46
+ end
47
+ end
@@ -0,0 +1,35 @@
1
+ require_relative "spec_helper_initializer"
2
+
3
+ describe "DigestStrategy" do
4
+ def remove_compilation_digest_path
5
+ @digest_strategy.send(:compilation_digest_path).tap do |path|
6
+ path.delete if path.exist?
7
+ end
8
+ end
9
+
10
+ before :all do
11
+ @digest_strategy = Webpacker::DigestStrategy.new
12
+ remove_compilation_digest_path
13
+ end
14
+
15
+ after :all do
16
+ remove_compilation_digest_path
17
+ end
18
+
19
+ it "is not fresh before compilation" do
20
+ expect(@digest_strategy.stale?).to be true
21
+ expect(@digest_strategy.fresh?).to be_falsy
22
+ end
23
+
24
+ it "is fresh after compilation" do
25
+ @digest_strategy.after_compile_hook
26
+ expect(@digest_strategy.stale?).to be false
27
+ expect(@digest_strategy.fresh?).to be true
28
+ end
29
+
30
+ it "generates correct compilation_digest_path" do
31
+ actual_path = @digest_strategy.send(:compilation_digest_path).basename.to_s
32
+ expected_path = "last-compilation-digest-#{Webpacker.env}"
33
+ expect(actual_path).to eq expected_path
34
+ end
35
+ end
@@ -0,0 +1,44 @@
1
+ require_relative "spec_helper_initializer"
2
+
3
+ describe "EngineRakeTasks" do
4
+ before :context do
5
+ remove_webpack_binstubs
6
+ end
7
+
8
+ after :context do
9
+ remove_webpack_binstubs
10
+ end
11
+
12
+ it "mounts app:webpacker task successfully" do
13
+ output = Dir.chdir(mounted_app_path) { `rake -T` }
14
+ expect(output).to match /app:webpacker.+DEPRECATED/
15
+ expect(output).to match /app:webpacker:binstubs.+DEPRECATED/
16
+ end
17
+
18
+ it "binstubs adds only expected files to bin directory" do
19
+ Dir.chdir(mounted_app_path) { `bundle exec rake app:webpacker:binstubs` }
20
+ expected_binstub_paths.each { |path| expect(File.exist?(path)).to be true }
21
+ end
22
+
23
+ private
24
+ def mounted_app_path
25
+ File.expand_path("../mounted_app", __dir__)
26
+ end
27
+
28
+ def current_files_in_bin
29
+ Dir.glob("#{mounted_app_path}/test/dummy/bin/*")
30
+ end
31
+
32
+ def expected_binstub_paths
33
+ gem_path = File.expand_path("../..", __dir__)
34
+ Dir.chdir("#{gem_path}/lib/install/bin") do
35
+ Dir.glob("*").map { |file| "#{mounted_app_path}/test/dummy/bin/#{file}" }
36
+ end
37
+ end
38
+
39
+ def remove_webpack_binstubs
40
+ expected_binstub_paths.each do |path|
41
+ File.delete(path) if File.exist?(path)
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,23 @@
1
+ require_relative "spec_helper_initializer"
2
+
3
+ RSpec.describe "Webpacker.env" do
4
+ it "uses the same env for Rails and Webpacker" do
5
+ expect(Webpacker.env).to eq Rails.env
6
+ end
7
+
8
+ it "uses production env without config" do
9
+ with_rails_env("foo") do
10
+ expect(Webpacker.env).to eq "production"
11
+ end
12
+ end
13
+
14
+ it "uses the given env in custom config" do
15
+ with_rails_env("staging") do
16
+ expect(Webpacker.env).to eq "staging"
17
+ end
18
+ end
19
+
20
+ it "uses 'production' as default env" do
21
+ expect(Webpacker::DEFAULT_ENV).to eq "production"
22
+ end
23
+ end
@@ -0,0 +1,243 @@
1
+ require_relative "spec_helper_initializer"
2
+
3
+ module ActionView::TestCase::Behavior
4
+ attr_accessor :request
5
+
6
+ describe "Webpacker::Helper" do
7
+ let(:application_stylesheet_chunks) { %w[/packs/1-c20632e7baf2c81200d3.chunk.css /packs/application-k344a6d59eef8632c9d1.chunk.css] }
8
+ let(:hello_stimulus_stylesheet_chunks) { %w[/packs/1-c20632e7baf2c81200d3.chunk.css /packs/hello_stimulus-k344a6d59eef8632c9d1.chunk.css] }
9
+
10
+ before :each do
11
+ extend Webpacker::Helper
12
+ extend ActionView::Helpers
13
+ extend ActionView::Helpers::AssetTagHelper
14
+ extend ActionView::TestCase::Behavior
15
+
16
+ @request = Class.new do
17
+ def send_early_hints(links) end
18
+ def base_url
19
+ "https://example.com"
20
+ end
21
+ end.new
22
+ @javascript_pack_tag_loaded = nil
23
+ end
24
+
25
+ it "#asset_pack_path generates correct path" do
26
+ expect(asset_pack_path("bootstrap.js")).to eq "/packs/bootstrap-300631c4f0e0f9c865bc.js"
27
+ expect(asset_pack_path("bootstrap.css")).to eq "/packs/bootstrap-c38deda30895059837cf.css"
28
+ end
29
+
30
+ it "#asset_pack_url generates correct url" do
31
+ expect(asset_pack_url("bootstrap.js")).to eq "https://example.com/packs/bootstrap-300631c4f0e0f9c865bc.js"
32
+ expect(asset_pack_url("bootstrap.css")).to eq "https://example.com/packs/bootstrap-c38deda30895059837cf.css"
33
+ end
34
+
35
+ it "#image_pack_path generates correct path" do
36
+ expect(image_pack_path("application.png")).to eq "/packs/application-k344a6d59eef8632c9d1.png"
37
+ expect(image_pack_path("image.jpg")).to eq "/packs/static/image-c38deda30895059837cf.jpg"
38
+ expect(image_pack_path("static/image.jpg")).to eq "/packs/static/image-c38deda30895059837cf.jpg"
39
+ expect(image_pack_path("nested/image.jpg")).to eq "/packs/static/nested/image-c38deda30895059837cf.jpg"
40
+ expect(image_pack_path("static/nested/image.jpg")).to eq "/packs/static/nested/image-c38deda30895059837cf.jpg"
41
+ end
42
+
43
+ it "#image_pack_url generates correct path" do
44
+ expect(image_pack_url("application.png")).to eq "https://example.com/packs/application-k344a6d59eef8632c9d1.png"
45
+ expect(image_pack_url("image.jpg")).to eq "https://example.com/packs/static/image-c38deda30895059837cf.jpg"
46
+ expect(image_pack_url("static/image.jpg")).to eq "https://example.com/packs/static/image-c38deda30895059837cf.jpg"
47
+ expect(image_pack_url("nested/image.jpg")).to eq "https://example.com/packs/static/nested/image-c38deda30895059837cf.jpg"
48
+ expect(image_pack_url("static/nested/image.jpg")).to eq "https://example.com/packs/static/nested/image-c38deda30895059837cf.jpg"
49
+ end
50
+
51
+ it "#image_pack_tag generates correct tags" do
52
+ expect(image_pack_tag("application.png", size: "16x10", alt: "Edit Entry")).to eq "<img alt=\"Edit Entry\" src=\"/packs/application-k344a6d59eef8632c9d1.png\" width=\"16\" height=\"10\" />"
53
+ expect(image_pack_tag("image.jpg", size: "16x10", alt: "Edit Entry")).to eq "<img alt=\"Edit Entry\" src=\"/packs/static/image-c38deda30895059837cf.jpg\" width=\"16\" height=\"10\" />"
54
+ expect(image_pack_tag("static/image.jpg", size: "16x10", alt: "Edit Entry")).to eq "<img alt=\"Edit Entry\" src=\"/packs/static/image-c38deda30895059837cf.jpg\" width=\"16\" height=\"10\" />"
55
+ expect(image_pack_tag("nested/image.jpg", size: "16x10", alt: "Edit Entry")).to eq "<img alt=\"Edit Entry\" src=\"/packs/static/nested/image-c38deda30895059837cf.jpg\" width=\"16\" height=\"10\" />"
56
+ expect(image_pack_tag("static/nested/image.jpg", size: "16x10", alt: "Edit Entry")).to eq "<img alt=\"Edit Entry\" src=\"/packs/static/nested/image-c38deda30895059837cf.jpg\" width=\"16\" height=\"10\" />"
57
+ expect(image_pack_tag("static/image.jpg", srcset: { "static/image-2x.jpg" => "2x" })).to eq "<img srcset=\"/packs/static/image-2x-7cca48e6cae66ec07b8e.jpg 2x\" src=\"/packs/static/image-c38deda30895059837cf.jpg\" />"
58
+ end
59
+
60
+ it "#favicon_pack_tag generates correct tags" do
61
+ expect(favicon_pack_tag("application.png", rel: "apple-touch-icon", type: "image/png")).to eq "<link rel=\"apple-touch-icon\" type=\"image/png\" href=\"/packs/application-k344a6d59eef8632c9d1.png\" />"
62
+ expect(favicon_pack_tag("mb-icon.png", rel: "apple-touch-icon", type: "image/png")).to eq "<link rel=\"apple-touch-icon\" type=\"image/png\" href=\"/packs/static/mb-icon-c38deda30895059837cf.png\" />"
63
+ expect(favicon_pack_tag("static/mb-icon.png", rel: "apple-touch-icon", type: "image/png")).to eq "<link rel=\"apple-touch-icon\" type=\"image/png\" href=\"/packs/static/mb-icon-c38deda30895059837cf.png\" />"
64
+ expect(favicon_pack_tag("nested/mb-icon.png", rel: "apple-touch-icon", type: "image/png")).to eq "<link rel=\"apple-touch-icon\" type=\"image/png\" href=\"/packs/static/nested/mb-icon-c38deda30895059837cf.png\" />"
65
+ expect(favicon_pack_tag("static/nested/mb-icon.png", rel: "apple-touch-icon", type: "image/png")).to eq "<link rel=\"apple-touch-icon\" type=\"image/png\" href=\"/packs/static/nested/mb-icon-c38deda30895059837cf.png\" />"
66
+ end
67
+
68
+ it "#preload_pack_asset generates correct tag" do
69
+ if self.class.method_defined?(:preload_link_tag)
70
+ expect(preload_pack_asset("fonts/fa-regular-400.woff2")).to eq %(<link rel="preload" href="/packs/fonts/fa-regular-400-944fb546bd7018b07190a32244f67dc9.woff2" as="font" type="font/woff2" crossorigin="anonymous">)
71
+ else
72
+ expect { preload_pack_asset("fonts/fa-regular-400.woff2") }.to raise_error "You need Rails >= 5.2 to use this tag."
73
+ end
74
+ end
75
+
76
+ it "#javascript_pack_tag generates correct tags" do
77
+ expected = <<~HTML.chomp
78
+ <script src="/packs/vendors~application~bootstrap-c20632e7baf2c81200d3.chunk.js" defer="defer"></script>
79
+ <script src="/packs/vendors~application-e55f2aae30c07fb6d82a.chunk.js" defer="defer"></script>
80
+ <script src="/packs/application-k344a6d59eef8632c9d1.js" defer="defer"></script>
81
+ <script src="/packs/bootstrap-300631c4f0e0f9c865bc.js" defer="defer"></script>
82
+ HTML
83
+
84
+ expect(javascript_pack_tag("application", "bootstrap")).to eq expected
85
+ end
86
+
87
+ it "#javascript_pack_tag generates correct tags by passing `defer: false`" do
88
+ expected = <<~HTML.chomp
89
+ <script src="/packs/vendors~application~bootstrap-c20632e7baf2c81200d3.chunk.js"></script>
90
+ <script src="/packs/vendors~application-e55f2aae30c07fb6d82a.chunk.js"></script>
91
+ <script src="/packs/application-k344a6d59eef8632c9d1.js"></script>
92
+ <script src="/packs/bootstrap-300631c4f0e0f9c865bc.js"></script>
93
+ HTML
94
+
95
+ expect(javascript_pack_tag("application", "bootstrap", defer: false)).to eq expected
96
+ end
97
+
98
+ it "#javascript_pack_tag generates correct appended tag" do
99
+ append_javascript_pack_tag("bootstrap", defer: false)
100
+
101
+ expected = <<~HTML.chomp
102
+ <script src="/packs/vendors~application~bootstrap-c20632e7baf2c81200d3.chunk.js" defer="defer"></script>
103
+ <script src="/packs/vendors~application-e55f2aae30c07fb6d82a.chunk.js" defer="defer"></script>
104
+ <script src="/packs/application-k344a6d59eef8632c9d1.js" defer="defer"></script>
105
+ <script src="/packs/bootstrap-300631c4f0e0f9c865bc.js"></script>
106
+ HTML
107
+
108
+ expect(javascript_pack_tag("application")).to eq expected
109
+ end
110
+
111
+ it "#javascript_pack_tag generates correct prepended tag" do
112
+ append_javascript_pack_tag("bootstrap")
113
+ prepend_javascript_pack_tag("main")
114
+
115
+ expected = <<~HTML.chomp
116
+ <script src="/packs/main-e323a53c7f30f5d53cbb.js" defer="defer"></script>
117
+ <script src="/packs/bootstrap-300631c4f0e0f9c865bc.js" defer="defer"></script>
118
+ <script src="/packs/vendors~application~bootstrap-c20632e7baf2c81200d3.chunk.js" defer="defer"></script>
119
+ <script src="/packs/vendors~application-e55f2aae30c07fb6d82a.chunk.js" defer="defer"></script>
120
+ <script src="/packs/application-k344a6d59eef8632c9d1.js" defer="defer"></script>
121
+ HTML
122
+
123
+ expect(javascript_pack_tag("application")).to eq expected
124
+ end
125
+
126
+ it "#append_javascript_pack_tag raises error if called after calling #javascript_pack_tag" do
127
+ expected_error_message = \
128
+ "You can only call append_javascript_pack_tag before javascript_pack_tag helper. " +
129
+ "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"
130
+
131
+ expect {
132
+ javascript_pack_tag("application")
133
+ append_javascript_pack_tag("bootstrap", defer: false)
134
+ }.to raise_error(expected_error_message)
135
+ end
136
+
137
+ it "#prepend_javascript_pack_tag raises error if called after calling #javascript_pack_tag" do
138
+ expected_error_message = \
139
+ "You can only call prepend_javascript_pack_tag before javascript_pack_tag helper. " +
140
+ "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"
141
+
142
+ expect {
143
+ javascript_pack_tag("application")
144
+ prepend_javascript_pack_tag("bootstrap", defer: false)
145
+ }.to raise_error(expected_error_message)
146
+ end
147
+
148
+ it "#javascript_pack_tag generates correct tags by passing `defer: true`" do
149
+ expected = <<~HTML.chomp
150
+ <script src="/packs/vendors~application~bootstrap-c20632e7baf2c81200d3.chunk.js" defer="defer"></script>
151
+ <script src="/packs/vendors~application-e55f2aae30c07fb6d82a.chunk.js" defer="defer"></script>
152
+ <script src="/packs/application-k344a6d59eef8632c9d1.js" defer="defer"></script>
153
+ HTML
154
+
155
+ expect(javascript_pack_tag("application", defer: true)).to eq expected
156
+ end
157
+
158
+ it "#javascript_pack_tag generates correct tags by passing symbol" do
159
+ expected = <<~HTML.chomp
160
+ <script src="/packs/vendors~application~bootstrap-c20632e7baf2c81200d3.chunk.js" defer="defer"></script>
161
+ <script src="/packs/vendors~application-e55f2aae30c07fb6d82a.chunk.js" defer="defer"></script>
162
+ <script src="/packs/application-k344a6d59eef8632c9d1.js" defer="defer"></script>
163
+ HTML
164
+
165
+ expect(javascript_pack_tag(:application)).to eq expected
166
+ end
167
+
168
+ it "#javascript_pack_tag rases error on multiple invocations" do
169
+ expected_error_message = "To prevent duplicated chunks on the page, you should call javascript_pack_tag only once on the page. " +
170
+ "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"
171
+
172
+ expect {
173
+ javascript_pack_tag(:application)
174
+ javascript_pack_tag(:bootstrap)
175
+ }.to raise_error(expected_error_message)
176
+ end
177
+
178
+ it "#stylesheet_pack_tag generates correct link tag with string arguments" do
179
+ expected = (application_stylesheet_chunks + hello_stimulus_stylesheet_chunks)
180
+ .uniq
181
+ .map { |chunk| stylesheet_link_tag(chunk) }
182
+ .join("\n")
183
+
184
+ expect(stylesheet_pack_tag("application", "hello_stimulus")).to eq expected
185
+ end
186
+
187
+ it "#stylesheet_pack_tag generates correct link tag with symbol arguments" do
188
+ expected = (application_stylesheet_chunks + hello_stimulus_stylesheet_chunks)
189
+ .uniq
190
+ .map { |chunk| stylesheet_link_tag(chunk) }
191
+ .join("\n")
192
+
193
+ expect(stylesheet_pack_tag(:application, :hello_stimulus)).to eq expected
194
+ end
195
+
196
+ it "#stylesheet_pack_tag generates correct link tag with mixed arguments" do
197
+ expected = (application_stylesheet_chunks)
198
+ .map { |chunk| stylesheet_link_tag(chunk, media: "all") }
199
+ .join("\n")
200
+
201
+ expect(stylesheet_pack_tag("application", media: "all")).to eq expected
202
+ end
203
+
204
+ it "#stylesheet_pack_tag allows multiple invocations" do
205
+ app_style = stylesheet_pack_tag(:application)
206
+ stimulus_style = stylesheet_pack_tag(:hello_stimulus)
207
+
208
+ expect(app_style).to eq application_stylesheet_chunks.map { |chunk| stylesheet_link_tag(chunk) }.join("\n")
209
+
210
+ expect(stimulus_style).to eq hello_stimulus_stylesheet_chunks.map { |chunk| stylesheet_link_tag(chunk) }.join("\n")
211
+
212
+ expect {
213
+ stylesheet_pack_tag(:application)
214
+ stylesheet_pack_tag(:hello_stimulus)
215
+ }.to_not raise_error
216
+ end
217
+
218
+ it "#stylesheet_pack_tag appends" do
219
+ append_stylesheet_pack_tag(:hello_stimulus)
220
+
221
+ expect(stylesheet_pack_tag(:application)).to eq \
222
+ (application_stylesheet_chunks + hello_stimulus_stylesheet_chunks).uniq.map { |chunk| stylesheet_link_tag(chunk) }.join("\n")
223
+ end
224
+
225
+ it "#stylesheet_pack_tag appends duplicate" do
226
+ append_stylesheet_pack_tag(:hello_stimulus)
227
+ append_stylesheet_pack_tag(:application)
228
+
229
+ expect(stylesheet_pack_tag(:application)).to eq \
230
+ (application_stylesheet_chunks + hello_stimulus_stylesheet_chunks).uniq.map { |chunk| stylesheet_link_tag(chunk) }.join("\n")
231
+ end
232
+
233
+ it "#stylesheet_pack_tag supports multiple invocations with different media attr" do
234
+ app_style = stylesheet_pack_tag(:application)
235
+ app_style_with_media = stylesheet_pack_tag(:application, media: "print")
236
+ hello_stimulus_style_with_media = stylesheet_pack_tag(:hello_stimulus, media: "all")
237
+
238
+ expect(app_style).to eq application_stylesheet_chunks.map { |chunk| stylesheet_link_tag(chunk) }.join("\n")
239
+ expect(app_style_with_media).to eq application_stylesheet_chunks.map { |chunk| stylesheet_link_tag(chunk, media: "print") }.join("\n")
240
+ expect(hello_stimulus_style_with_media).to eq hello_stimulus_stylesheet_chunks.map { |chunk| stylesheet_link_tag(chunk, media: "all") }.join("\n")
241
+ end
242
+ end
243
+ end
@@ -0,0 +1,31 @@
1
+ require_relative "spec_helper_initializer"
2
+
3
+ describe "Webpacker::Instance" do
4
+ before :each do
5
+ ENV.delete("WEBPACKER_CONFIG")
6
+ ENV.delete("SHAKAPACKER_CONFIG")
7
+ Webpacker.instance = Webpacker::Instance.new
8
+ end
9
+
10
+ after :each do
11
+ ENV.delete("WEBPACKER_CONFIG")
12
+ ENV.delete("SHAKAPACKER_CONFIG")
13
+ Webpacker.instance = Webpacker::Instance.new
14
+ end
15
+
16
+ it "uses default config path if no env variable defined" do
17
+ actual_config_path = Rails.root.join("config/webpacker.yml")
18
+ expected_config_path = Webpacker.config.config_path
19
+
20
+ expect(expected_config_path).to eq(actual_config_path)
21
+ end
22
+
23
+ it "uses WEBPACKER_CONFIG env variable for config file" do
24
+ ENV["WEBPACKER_CONFIG"] = "/some/random/path.yml"
25
+
26
+ actual_config_path = "/some/random/path.yml"
27
+ expected_config_path = Webpacker.config.config_path.to_s
28
+
29
+ expect(Webpacker.config.config_path.to_s).to eq("/some/random/path.yml")
30
+ end
31
+ end
@@ -0,0 +1,100 @@
1
+ require_relative "spec_helper_initializer"
2
+
3
+ describe "Webpacker::Manifest" do
4
+ let(:manifest_path) { File.expand_path File.join(File.dirname(__FILE__), "webpacker_test_app/public/packs", "manifest.json").to_s }
5
+
6
+ it "#lookup! throws exception for a non-existing asset file" do
7
+ asset_file = "calendar.js"
8
+ expected_error_message = "Shakapacker can't find #{asset_file} in #{manifest_path}"
9
+
10
+ allow(Webpacker.config).to receive(:compile?).and_return(false)
11
+
12
+ expect {
13
+ Webpacker.manifest.lookup!(asset_file)
14
+ }.to raise_error(Webpacker::Manifest::MissingEntryError, /#{expected_error_message}/)
15
+ end
16
+
17
+ it "#lookup! throws exception for a non-existing asset file with type and without extension" do
18
+ asset_file = "calendar"
19
+ expected_error_message = "Shakapacker can't find #{asset_file}.js in #{manifest_path}"
20
+
21
+ allow(Webpacker.config).to receive(:compile?).and_return(false)
22
+
23
+ expect {
24
+ Webpacker.manifest.lookup!(asset_file, type: :javascript)
25
+ }.to raise_error(Webpacker::Manifest::MissingEntryError, /#{expected_error_message}/)
26
+ end
27
+
28
+ it "#lookup! returns path to bundled bootstrap.js" do
29
+ actual = Webpacker.manifest.lookup!("bootstrap.js")
30
+ expected = "/packs/bootstrap-300631c4f0e0f9c865bc.js"
31
+
32
+ expect(actual).to eq expected
33
+ end
34
+
35
+ it "#lookup_pack_with_chunks! returns array of path to bundled bootstrap with type of javascript" do
36
+ actual = Webpacker.manifest.lookup_pack_with_chunks!("bootstrap", type: :javascript)
37
+ expected = ["/packs/bootstrap-300631c4f0e0f9c865bc.js"]
38
+
39
+ expect(actual).to eq expected
40
+ end
41
+
42
+ it "#lookup_with_chunks! returns array of path to bundled bootstrap.js with type of javascript" do
43
+ actual = Webpacker.manifest.lookup_pack_with_chunks!("bootstrap.js", type: :javascript)
44
+ expected = ["/packs/bootstrap-300631c4f0e0f9c865bc.js"]
45
+
46
+ expect(actual).to eq expected
47
+ end
48
+
49
+ it "#lookup_with_chunks! returns array of path to bundled 'print/application' without extension and in a sub-directory" do
50
+ actual = Webpacker.manifest.lookup_pack_with_chunks!("print/application", type: :css)
51
+ expected = ["/packs/print/application-983b6c164a47f7ed49cd.css"]
52
+
53
+ expect(actual).to eq expected
54
+ end
55
+
56
+ it "#lookup_with_chunks! returns array of path to bundled 'print/application.css' in a sub-directory" do
57
+ actual = Webpacker.manifest.lookup_pack_with_chunks!("print/application.css", type: :css)
58
+ expected = ["/packs/print/application-983b6c164a47f7ed49cd.css"]
59
+
60
+ expect(actual).to eq expected
61
+ end
62
+
63
+ it "#lookup returns nil for non-existing asset file" do
64
+ expect(Webpacker.manifest.lookup("foo.js")).to be nil
65
+ end
66
+
67
+ it "#lookup_pack_with_chunks returns nil for non-existing asset file" do
68
+ expect(Webpacker.manifest.lookup_pack_with_chunks("foo.js")).to be nil
69
+ end
70
+
71
+ it "#lookup returns path for bootstrap.js" do
72
+ actual = Webpacker.manifest.lookup("bootstrap.js")
73
+ expected = "/packs/bootstrap-300631c4f0e0f9c865bc.js"
74
+
75
+ expect(actual).to eq expected
76
+ end
77
+
78
+ it "#lookup_pack_with_chunks! throws exception for a non-existing asset file" do
79
+ asset_file = "calendar"
80
+
81
+ expected_error_message = "Shakapacker can't find #{asset_file}.js in #{manifest_path}"
82
+
83
+ allow(Webpacker.config).to receive(:compile?).and_return(false)
84
+
85
+ expect {
86
+ Webpacker.manifest.lookup_pack_with_chunks!(asset_file, type: :javascript)
87
+ }.to raise_error(Shakapacker::Manifest::MissingEntryError, /#{expected_error_message}/)
88
+ end
89
+
90
+ it "#lookup_pack_with_chunks! returns array of paths to bundled js files with 'application' in their name" do
91
+ actual_application_entrypoints = Webpacker.manifest.lookup_pack_with_chunks!("application", type: :javascript)
92
+ expected_application_entrypoints = [
93
+ "/packs/vendors~application~bootstrap-c20632e7baf2c81200d3.chunk.js",
94
+ "/packs/vendors~application-e55f2aae30c07fb6d82a.chunk.js",
95
+ "/packs/application-k344a6d59eef8632c9d1.js"
96
+ ]
97
+
98
+ expect(actual_application_entrypoints).to eq expected_application_entrypoints
99
+ end
100
+ end
@@ -0,0 +1,55 @@
1
+ require_relative "spec_helper_initializer"
2
+
3
+ describe "Webpacker::MtimeStrategy" do
4
+ let(:mtime_strategy) { Webpacker::MtimeStrategy.new }
5
+ let(:manifest_timestamp) { Time.parse("2021-01-01 12:34:56 UTC") }
6
+
7
+ describe "#fresh?" do
8
+ it "returns false when manifest is missing" do
9
+ latest_timestamp = manifest_timestamp + 3600
10
+
11
+ with_stubs(latest_timestamp: latest_timestamp.to_i, manifest_exists: false) do
12
+ expect(mtime_strategy.fresh?).to be false
13
+ end
14
+ end
15
+
16
+ it "returns false when manifest is older" do
17
+ latest_timestamp = manifest_timestamp + 3600
18
+
19
+ with_stubs(latest_timestamp: latest_timestamp.to_i) do
20
+ expect(mtime_strategy.fresh?).to be false
21
+ end
22
+ end
23
+
24
+ it "returns true when manifest is new" do
25
+ latest_timestamp = manifest_timestamp - 3600
26
+
27
+ with_stubs(latest_timestamp: latest_timestamp.to_i) do
28
+ expect(mtime_strategy.fresh?).to be true
29
+ end
30
+ end
31
+ end
32
+
33
+ describe "#stale?" do
34
+ it "returns false when #fresh? is true" do
35
+ expect(mtime_strategy).to receive(:fresh?).and_return(true)
36
+
37
+ expect(mtime_strategy.stale?).to be false
38
+ end
39
+
40
+ it "returns true when #fresh? is false" do
41
+ expect(mtime_strategy).to receive(:fresh?).and_return(false)
42
+
43
+ expect(mtime_strategy.stale?).to be true
44
+ end
45
+ end
46
+
47
+ private
48
+
49
+ def with_stubs(latest_timestamp:, manifest_exists: true)
50
+ allow(mtime_strategy).to receive(:latest_modified_timestamp).and_return(latest_timestamp)
51
+ allow(FileTest).to receive(:exist?).and_return(manifest_exists)
52
+ allow(File).to receive(:mtime).and_return(manifest_timestamp)
53
+ yield
54
+ end
55
+ end
@@ -0,0 +1,37 @@
1
+ require_relative "spec_helper_initializer"
2
+
3
+ describe "RakeTasks" do
4
+ let(:test_app_path) { File.expand_path("webpacker_test_app", __dir__) }
5
+
6
+ it "`rake -T` lists Webpacker tasks" do
7
+ output = Dir.chdir(test_app_path) { `rake -T` }
8
+ expect(output).to match /webpacker .+DEPRECATED/
9
+ expect(output).to match /webpacker:check_binstubs.+DEPRECATED/
10
+ expect(output).to match /webpacker:check_node.+DEPRECATED/
11
+ expect(output).to match /webpacker:check_yarn.+DEPRECATED/
12
+ expect(output).to match /webpacker:clean.+DEPRECATED/
13
+ expect(output).to match /webpacker:clobber.+DEPRECATED/
14
+ expect(output).to match /webpacker:compile.+DEPRECATED/
15
+ expect(output).to match /webpacker:install.+DEPRECATED/
16
+ expect(output).to match /webpacker:verify_install.+DEPRECATED/
17
+ end
18
+
19
+ it "`webpacker:check_binstubs` doesn't get 'webpack binstub not found' error" do
20
+ output = Dir.chdir(test_app_path) { `rake webpacker:check_binstubs 2>&1` }
21
+ expect(output).to_not include "webpack binstub not found."
22
+ expect(output).to include "DEPRECATION"
23
+ end
24
+
25
+ it "`webpacker:check_node` doesn't get 'webpacker requires Node.js' error" do
26
+ output = Dir.chdir(test_app_path) { `rake webpacker:check_node 2>&1` }
27
+ expect(output).to_not include "Shakapacker requires Node.js"
28
+ expect(output).to include "DEPRECATION"
29
+ end
30
+
31
+ it "`webpacker:check_yarn` doesn't get error related to yarn" do
32
+ output = Dir.chdir(test_app_path) { `rake webpacker:check_yarn 2>&1` }
33
+ expect(output).to_not include "Yarn not installed"
34
+ expect(output).to_not include "Shakapacker requires Yarn"
35
+ expect(output).to include "DEPRECATION"
36
+ end
37
+ end
@@ -0,0 +1,24 @@
1
+ require_relative "webpacker_test_app/config/environment"
2
+
3
+ Rails.env = "production"
4
+
5
+ Webpacker.instance = ::Webpacker::Instance.new
6
+
7
+ def reloaded_config
8
+ Webpacker.instance.instance_variable_set(:@env, nil)
9
+ Webpacker.instance.instance_variable_set(:@config, nil)
10
+ Webpacker.instance.instance_variable_set(:@dev_server, nil)
11
+ Webpacker.env
12
+ Webpacker.config
13
+ Webpacker.dev_server
14
+ end
15
+
16
+ def with_rails_env(env)
17
+ original = Rails.env
18
+ Rails.env = ActiveSupport::StringInquirer.new(env)
19
+ reloaded_config
20
+ yield
21
+ ensure
22
+ Rails.env = ActiveSupport::StringInquirer.new(original)
23
+ reloaded_config
24
+ end