vite_rails 1.0.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 (57) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +3 -0
  3. data/CONTRIBUTING.md +34 -0
  4. data/LICENSE.txt +21 -0
  5. data/README.md +64 -0
  6. data/lib/install/binstubs.rb +6 -0
  7. data/lib/install/template.rb +62 -0
  8. data/lib/vite_rails.rb +91 -0
  9. data/lib/vite_rails/builder.rb +113 -0
  10. data/lib/vite_rails/commands.rb +68 -0
  11. data/lib/vite_rails/config.rb +106 -0
  12. data/lib/vite_rails/dev_server.rb +23 -0
  13. data/lib/vite_rails/dev_server_proxy.rb +47 -0
  14. data/lib/vite_rails/engine.rb +40 -0
  15. data/lib/vite_rails/helper.rb +41 -0
  16. data/lib/vite_rails/manifest.rb +134 -0
  17. data/lib/vite_rails/runner.rb +56 -0
  18. data/lib/vite_rails/version.rb +5 -0
  19. data/package.json +28 -0
  20. data/package/default.vite.json +15 -0
  21. data/test/builder_test.rb +72 -0
  22. data/test/command_test.rb +35 -0
  23. data/test/configuration_test.rb +80 -0
  24. data/test/dev_server_runner_test.rb +83 -0
  25. data/test/dev_server_test.rb +39 -0
  26. data/test/engine_rake_tasks_test.rb +42 -0
  27. data/test/helper_test.rb +138 -0
  28. data/test/manifest_test.rb +75 -0
  29. data/test/mode_test.rb +21 -0
  30. data/test/mounted_app/Rakefile +6 -0
  31. data/test/mounted_app/test/dummy/Rakefile +5 -0
  32. data/test/mounted_app/test/dummy/bin/rails +5 -0
  33. data/test/mounted_app/test/dummy/bin/rake +5 -0
  34. data/test/mounted_app/test/dummy/config.ru +7 -0
  35. data/test/mounted_app/test/dummy/config/application.rb +12 -0
  36. data/test/mounted_app/test/dummy/config/environment.rb +5 -0
  37. data/test/mounted_app/test/dummy/config/vite.json +20 -0
  38. data/test/mounted_app/test/dummy/package.json +7 -0
  39. data/test/rake_tasks_test.rb +74 -0
  40. data/test/test_app/Rakefile +5 -0
  41. data/test/test_app/app/javascript/entrypoints/application.js +10 -0
  42. data/test/test_app/app/javascript/entrypoints/multi_entry.css +4 -0
  43. data/test/test_app/app/javascript/entrypoints/multi_entry.js +4 -0
  44. data/test/test_app/bin/vite +17 -0
  45. data/test/test_app/config.ru +7 -0
  46. data/test/test_app/config/application.rb +13 -0
  47. data/test/test_app/config/environment.rb +6 -0
  48. data/test/test_app/config/vite.json +20 -0
  49. data/test/test_app/config/vite_public_root.yml +20 -0
  50. data/test/test_app/package.json +13 -0
  51. data/test/test_app/public/vite/manifest.json +36 -0
  52. data/test/test_app/some.config.js +0 -0
  53. data/test/test_app/yarn.lock +11 -0
  54. data/test/test_helper.rb +34 -0
  55. data/test/vite_runner_test.rb +59 -0
  56. data/test/webpacker_test.rb +15 -0
  57. metadata +234 -0
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ class ViteRails
4
+ VERSION = '1.0.0'
5
+ end
@@ -0,0 +1,28 @@
1
+ {
2
+ "name": "only-for-workflows",
3
+ "version": "unknown",
4
+ "scripts": {
5
+ "test": "jest",
6
+ "lint": "eslint package/"
7
+ },
8
+ "dependencies": {
9
+ "vite": "^2.0.0-beta.30",
10
+ "vite-plugin-ruby": "1.0.0"
11
+ },
12
+ "devDependencies": {
13
+ "@vitejs/plugin-vue": "^1.0.6",
14
+ "eslint": "^7.16.0",
15
+ "eslint-config-airbnb": "^18.2.0",
16
+ "eslint-config-prettier": "^7.1.0",
17
+ "eslint-plugin-import": "^2.22.1",
18
+ "eslint-plugin-jsx-a11y": "^6.3.1",
19
+ "eslint-plugin-react": "^7.21.4",
20
+ "jest": "^26.5.3"
21
+ },
22
+ "jest": {
23
+ "testRegex": "(/__tests__/.*|(\\.|/))\\.jsx?$",
24
+ "roots": [
25
+ "<rootDir>/package"
26
+ ]
27
+ }
28
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "assetsDir": "assets",
3
+ "autoBuild": false,
4
+ "buildCacheDir": "tmp/cache/vite",
5
+ "publicOutputDir": "vite",
6
+ "configPath": "config/vite.json",
7
+ "publicDir": "public",
8
+ "entrypointsDir": "entrypoints",
9
+ "sourceCodeDir": "app/javascript",
10
+ "host": "localhost",
11
+ "https": null,
12
+ "port": 3036,
13
+ "hideBuildConsoleOutput": false,
14
+ "watchAdditionalPaths": []
15
+ }
@@ -0,0 +1,72 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ class BuilderTest < Minitest::Test
6
+ def remove_files_digest_path
7
+ ViteRails.builder.send(:files_digest_path).tap do |path|
8
+ path.delete if path.exist?
9
+ end
10
+ end
11
+
12
+ def setup
13
+ remove_files_digest_path
14
+ end
15
+
16
+ def teardown
17
+ remove_files_digest_path
18
+ end
19
+
20
+ def test_custom_environment_variables
21
+ assert_nil ViteRails.builder.send(:vite_env)['FOO']
22
+ ViteRails.env['FOO'] = 'BAR'
23
+ assert ViteRails.builder.send(:vite_env)['FOO'] == 'BAR'
24
+ ensure
25
+ ViteRails.env = {}
26
+ end
27
+
28
+ def test_freshness
29
+ assert ViteRails.builder.stale?
30
+ assert !ViteRails.builder.fresh?
31
+ end
32
+
33
+ def test_build
34
+ assert !ViteRails.builder.build
35
+ end
36
+
37
+ def test_freshness_on_build_success
38
+ status = OpenStruct.new(success?: true)
39
+
40
+ assert ViteRails.builder.stale?
41
+ Open3.stub :capture3, [:sterr, :stdout, status] do
42
+ ViteRails.builder.build
43
+ assert ViteRails.builder.fresh?
44
+ end
45
+ end
46
+
47
+ def test_freshness_on_build_fail
48
+ status = OpenStruct.new(success?: false)
49
+
50
+ assert ViteRails.builder.stale?
51
+ Open3.stub :capture3, [:sterr, :stdout, status] do
52
+ ViteRails.builder.build
53
+ assert ViteRails.builder.fresh?
54
+ end
55
+ end
56
+
57
+ def test_files_digest_path
58
+ assert_equal ViteRails.builder.send(:files_digest_path).basename.to_s, "last-compilation-digest-#{ ViteRails.config.mode }"
59
+ end
60
+
61
+ def test_external_env_variables
62
+ ViteRails.env = {}
63
+ assert_equal ViteRails.builder.send(:vite_env)['VITE_RUBY_MODE'], 'production'
64
+ assert_equal ViteRails.builder.send(:vite_env)['VITE_RUBY_ROOT'], Rails.root.to_s
65
+
66
+ ENV['VITE_RUBY_MODE'] = 'foo.bar'
67
+ ENV['VITE_RUBY_ROOT'] = '/baz'
68
+
69
+ assert_equal ViteRails.builder.send(:vite_env)['VITE_RUBY_MODE'], 'foo.bar'
70
+ assert_equal ViteRails.builder.send(:vite_env)['VITE_RUBY_ROOT'], '/baz'
71
+ end
72
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ class CommandTest < Minitest::Test
6
+ def test_compile_command_returns_success_status_when_stale
7
+ ViteRails.builder.stub :stale?, true do
8
+ ViteRails.builder.stub :run_vite, true do
9
+ assert_equal true, ViteRails.commands.compile
10
+ end
11
+ end
12
+ end
13
+
14
+ def test_compile_command_returns_success_status_when_fresh
15
+ ViteRails.builder.stub :stale?, false do
16
+ ViteRails.builder.stub :run_vite, true do
17
+ assert_equal true, ViteRails.commands.compile
18
+ end
19
+ end
20
+ end
21
+
22
+ def test_compile_command_returns_failure_status_when_stale
23
+ ViteRails.builder.stub :stale?, true do
24
+ ViteRails.builder.stub :run_vite, false do
25
+ assert_equal false, ViteRails.commands.compile
26
+ end
27
+ end
28
+ end
29
+
30
+ def test_clean_command_works_with_nested_hashes_and_without_any_compiled_files
31
+ File.stub :delete, true do
32
+ assert ViteRails.commands.clean
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,80 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ class ConfigurationTest < ViteRails::Test
6
+ def setup
7
+ @config = ViteRails::Configuration.new(
8
+ root_path: Pathname.new(File.expand_path('test_app', __dir__)),
9
+ config_path: Pathname.new(File.expand_path('./test_app/config/vite.yml', __dir__)),
10
+ env: 'production',
11
+ )
12
+ end
13
+
14
+ def test_source_path
15
+ source_path = File.expand_path File.join(File.dirname(__FILE__), 'test_app/app/javascript').to_s
16
+ assert_equal source_path, @config.source_path.to_s
17
+ end
18
+
19
+ def test_source_entry_path
20
+ source_entry_path = File.expand_path File.join(File.dirname(__FILE__), 'test_app/app/javascript', 'packs').to_s
21
+ assert_equal @config.source_entry_path.to_s, source_entry_path
22
+ end
23
+
24
+ def test_public_root_path
25
+ public_root_path = File.expand_path File.join(File.dirname(__FILE__), 'test_app/public').to_s
26
+ assert_equal @config.public_path.to_s, public_root_path
27
+ end
28
+
29
+ def test_public_output_path
30
+ public_output_path = File.expand_path File.join(File.dirname(__FILE__), 'test_app/public/packs').to_s
31
+ assert_equal @config.public_output_path.to_s, public_output_path
32
+
33
+ @config = ViteRails::Configuration.new(
34
+ root_path: @config.root_path,
35
+ config_path: Pathname.new(File.expand_path('./test_app/config/vite_public_root.yml', __dir__)),
36
+ env: 'production',
37
+ )
38
+
39
+ public_output_path = File.expand_path File.join(File.dirname(__FILE__), 'public/packs').to_s
40
+ assert_equal @config.public_output_path.to_s, public_output_path
41
+ end
42
+
43
+ def test_public_manifest_path
44
+ public_manifest_path = File.expand_path File.join(File.dirname(__FILE__), 'test_app/public/packs', 'manifest.json').to_s
45
+ assert_equal @config.public_manifest_path.to_s, public_manifest_path
46
+ end
47
+
48
+ def test_cache_path
49
+ cache_path = File.expand_path File.join(File.dirname(__FILE__), 'test_app/tmp/cache/vite').to_s
50
+ assert_equal @config.cache_path.to_s, cache_path
51
+ end
52
+
53
+ def test_additional_paths
54
+ assert_equal @config.additional_paths, ['app/assets', '/etc/yarn', 'some.config.js', 'app/elm']
55
+ end
56
+
57
+ def test_cache_manifest?
58
+ assert @config.cache_manifest?
59
+
60
+ with_rails_env('development') do
61
+ refute ViteRails.config.cache_manifest?
62
+ end
63
+
64
+ with_rails_env('test') do
65
+ refute ViteRails.config.cache_manifest?
66
+ end
67
+ end
68
+
69
+ def test_compile?
70
+ refute @config.compile?
71
+
72
+ with_rails_env('development') do
73
+ assert ViteRails.config.compile?
74
+ end
75
+
76
+ with_rails_env('test') do
77
+ assert ViteRails.config.compile?
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,83 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ class DevServerRunnerTest < ViteRails::Test
6
+ def setup
7
+ @original_node_env, ENV['NODE_ENV'] = ENV['NODE_ENV'], 'development'
8
+ @original_rails_env, ENV['RAILS_ENV'] = ENV['RAILS_ENV'], 'development'
9
+ end
10
+
11
+ def teardown
12
+ ENV['NODE_ENV'] = @original_node_env
13
+ ENV['RAILS_ENV'] = @original_rails_env
14
+ end
15
+
16
+ def test_run_cmd_via_node_modules
17
+ cmd = ["#{ test_app_path }/node_modules/.bin/vite", '--mode', 'development']
18
+
19
+ verify_command(cmd, use_node_modules: true)
20
+ end
21
+
22
+ def test_run_cmd_via_yarn
23
+ cmd = ['yarn', 'vite', '--mode', 'development']
24
+
25
+ verify_command(cmd, use_node_modules: false)
26
+ end
27
+
28
+ def test_run_cmd_argv
29
+ cmd = ["#{ test_app_path }/node_modules/.bin/vite", '--quiet', '--mode', 'development']
30
+
31
+ verify_command(cmd, argv: ['--quiet'])
32
+ end
33
+
34
+ def test_run_cmd_argv_with_https
35
+ cmd = ["#{ test_app_path }/node_modules/.bin/vite", '--https', '--mode', 'development']
36
+
37
+ dev_server = ViteRails::DevServer.new({})
38
+ def dev_server.host
39
+ 'localhost'
40
+ end
41
+
42
+ def dev_server.port
43
+ '3035'
44
+ end
45
+
46
+ def dev_server.pretty?
47
+ false
48
+ end
49
+
50
+ def dev_server.https?
51
+ true
52
+ end
53
+ ViteRails::DevServer.stub(:new, dev_server) do
54
+ verify_command(cmd, argv: ['--https'])
55
+ end
56
+ end
57
+
58
+ private
59
+
60
+ def test_app_path
61
+ File.expand_path('test_app', __dir__)
62
+ end
63
+
64
+ def verify_command(cmd, use_node_modules: true, argv: [])
65
+ cwd = Dir.pwd
66
+ Dir.chdir(test_app_path)
67
+
68
+ klass = ViteRails::Runner
69
+ instance = klass.new(argv)
70
+ mock = Minitest::Mock.new
71
+ mock.expect(:call, nil, [ViteRails.env, *cmd])
72
+
73
+ klass.stub(:new, instance) do
74
+ instance.stub(:executable_exists?, use_node_modules) do
75
+ Kernel.stub(:exec, mock) { ViteRails.run(argv) }
76
+ end
77
+ end
78
+
79
+ mock.verify
80
+ ensure
81
+ Dir.chdir(cwd)
82
+ end
83
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ class DevServerTest < ViteRails::Test
6
+ def test_running?
7
+ refute ViteRails.dev_server.running?
8
+ end
9
+
10
+ def test_host
11
+ with_rails_env('development') do
12
+ assert_equal ViteRails.config.host, 'localhost'
13
+ end
14
+ end
15
+
16
+ def test_port
17
+ with_rails_env('development') do
18
+ assert_equal ViteRails.config.port, 3035
19
+ end
20
+ end
21
+
22
+ def test_https?
23
+ with_rails_env('development') do
24
+ assert_equal ViteRails.config.https, false
25
+ end
26
+ end
27
+
28
+ def test_protocol
29
+ with_rails_env('development') do
30
+ assert_equal ViteRails.config.protocol, 'http'
31
+ end
32
+ end
33
+
34
+ def test_host_with_port
35
+ with_rails_env('development') do
36
+ assert_equal ViteRails.config.host_with_port, 'localhost:3035'
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ class EngineRakeTasksTest < Minitest::Test
6
+ def setup
7
+ remove_vite_binstubs
8
+ end
9
+
10
+ def teardown
11
+ remove_vite_binstubs
12
+ end
13
+
14
+ def test_task_mounted
15
+ output = Dir.chdir(mounted_app_path) { `rake -T` }
16
+ assert_includes output, 'app:vite'
17
+ end
18
+
19
+ def test_binstubs
20
+ Dir.chdir(mounted_app_path) { `bundle exec rake app:vite:binstubs` }
21
+ vite_binstub_paths.each { |path| assert File.exist?(path) }
22
+ end
23
+
24
+ private
25
+
26
+ def mounted_app_path
27
+ File.expand_path('mounted_app', __dir__)
28
+ end
29
+
30
+ def vite_binstub_paths
31
+ [
32
+ "#{ mounted_app_path }/test/dummy/bin/vite",
33
+ "#{ mounted_app_path }/test/dummy/bin/vite-dev-server",
34
+ ]
35
+ end
36
+
37
+ def remove_vite_binstubs
38
+ vite_binstub_paths.each do |path|
39
+ File.delete(path) if File.exist?(path)
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,138 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ class HelperTest < ActionView::TestCase
6
+ tests ViteRails::Helper
7
+
8
+ attr_reader :request
9
+
10
+ def setup
11
+ @request = Class.new do
12
+ def send_early_hints(links) end
13
+
14
+ def base_url
15
+ 'https://example.com'
16
+ end
17
+ end.new
18
+ end
19
+
20
+ def test_asset_pack_path
21
+ assert_equal '/packs/bootstrap-300631c4f0e0f9c865bc.js', asset_pack_path('bootstrap.js')
22
+ assert_equal '/packs/bootstrap-c38deda30895059837cf.css', asset_pack_path('bootstrap.css')
23
+ end
24
+
25
+ def test_asset_pack_url
26
+ assert_equal 'https://example.com/packs/bootstrap-300631c4f0e0f9c865bc.js', asset_pack_url('bootstrap.js')
27
+ assert_equal 'https://example.com/packs/bootstrap-c38deda30895059837cf.css', asset_pack_url('bootstrap.css')
28
+ end
29
+
30
+ def test_image_pack_path
31
+ assert_equal '/packs/application-k344a6d59eef8632c9d1.png', image_pack_path('application.png')
32
+ assert_equal '/packs/media/images/image-c38deda30895059837cf.jpg', image_pack_path('image.jpg')
33
+ assert_equal '/packs/media/images/image-c38deda30895059837cf.jpg', image_pack_path('media/images/image.jpg')
34
+ assert_equal '/packs/media/images/nested/image-c38deda30895059837cf.jpg', image_pack_path('nested/image.jpg')
35
+ assert_equal '/packs/media/images/nested/image-c38deda30895059837cf.jpg', image_pack_path('media/images/nested/image.jpg')
36
+ end
37
+
38
+ def test_image_pack_url
39
+ assert_equal 'https://example.com/packs/application-k344a6d59eef8632c9d1.png', image_pack_url('application.png')
40
+ assert_equal 'https://example.com/packs/media/images/image-c38deda30895059837cf.jpg', image_pack_url('image.jpg')
41
+ assert_equal 'https://example.com/packs/media/images/image-c38deda30895059837cf.jpg', image_pack_url('media/images/image.jpg')
42
+ assert_equal 'https://example.com/packs/media/images/nested/image-c38deda30895059837cf.jpg', image_pack_url('nested/image.jpg')
43
+ assert_equal 'https://example.com/packs/media/images/nested/image-c38deda30895059837cf.jpg', image_pack_url('media/images/nested/image.jpg')
44
+ end
45
+
46
+ def test_image_pack_tag
47
+ assert_equal \
48
+ '<img alt="Edit Entry" src="/packs/application-k344a6d59eef8632c9d1.png" width="16" height="10" />',
49
+ image_pack_tag('application.png', size: '16x10', alt: 'Edit Entry')
50
+ assert_equal \
51
+ '<img alt="Edit Entry" src="/packs/media/images/image-c38deda30895059837cf.jpg" width="16" height="10" />',
52
+ image_pack_tag('image.jpg', size: '16x10', alt: 'Edit Entry')
53
+ assert_equal \
54
+ '<img alt="Edit Entry" src="/packs/media/images/image-c38deda30895059837cf.jpg" width="16" height="10" />',
55
+ image_pack_tag('media/images/image.jpg', size: '16x10', alt: 'Edit Entry')
56
+ assert_equal \
57
+ '<img alt="Edit Entry" src="/packs/media/images/nested/image-c38deda30895059837cf.jpg" width="16" height="10" />',
58
+ image_pack_tag('nested/image.jpg', size: '16x10', alt: 'Edit Entry')
59
+ assert_equal \
60
+ '<img alt="Edit Entry" src="/packs/media/images/nested/image-c38deda30895059837cf.jpg" width="16" height="10" />',
61
+ image_pack_tag('media/images/nested/image.jpg', size: '16x10', alt: 'Edit Entry')
62
+ assert_equal \
63
+ '<img srcset="/packs/media/images/image-2x-7cca48e6cae66ec07b8e.jpg 2x" src="/packs/media/images/image-c38deda30895059837cf.jpg" />',
64
+ image_pack_tag('media/images/image.jpg', srcset: { 'media/images/image-2x.jpg' => '2x' })
65
+ end
66
+
67
+ def test_favicon_pack_tag
68
+ assert_equal \
69
+ '<link rel="apple-touch-icon" type="image/png" href="/packs/application-k344a6d59eef8632c9d1.png" />',
70
+ favicon_pack_tag('application.png', rel: 'apple-touch-icon', type: 'image/png')
71
+ assert_equal \
72
+ '<link rel="apple-touch-icon" type="image/png" href="/packs/media/images/mb-icon-c38deda30895059837cf.png" />',
73
+ favicon_pack_tag('mb-icon.png', rel: 'apple-touch-icon', type: 'image/png')
74
+ assert_equal \
75
+ '<link rel="apple-touch-icon" type="image/png" href="/packs/media/images/mb-icon-c38deda30895059837cf.png" />',
76
+ favicon_pack_tag('media/images/mb-icon.png', rel: 'apple-touch-icon', type: 'image/png')
77
+ assert_equal \
78
+ '<link rel="apple-touch-icon" type="image/png" href="/packs/media/images/nested/mb-icon-c38deda30895059837cf.png" />',
79
+ favicon_pack_tag('nested/mb-icon.png', rel: 'apple-touch-icon', type: 'image/png')
80
+ assert_equal \
81
+ '<link rel="apple-touch-icon" type="image/png" href="/packs/media/images/nested/mb-icon-c38deda30895059837cf.png" />',
82
+ favicon_pack_tag('media/images/nested/mb-icon.png', rel: 'apple-touch-icon', type: 'image/png')
83
+ end
84
+
85
+ def test_javascript_pack_tag
86
+ assert_equal \
87
+ %(<script src="/packs/bootstrap-300631c4f0e0f9c865bc.js"></script>),
88
+ javascript_pack_tag('bootstrap.js')
89
+ end
90
+
91
+ def test_javascript_pack_tag_symbol
92
+ assert_equal \
93
+ %(<script src="/packs/bootstrap-300631c4f0e0f9c865bc.js"></script>),
94
+ javascript_pack_tag(:bootstrap)
95
+ end
96
+
97
+ def test_javascript_pack_tag_splat
98
+ assert_equal \
99
+ %(<script src="/packs/bootstrap-300631c4f0e0f9c865bc.js" defer="defer"></script>\n) +
100
+ %(<script src="/packs/application-k344a6d59eef8632c9d1.js" defer="defer"></script>),
101
+ javascript_pack_tag('bootstrap.js', 'application.js', defer: true)
102
+ end
103
+
104
+ def test_javascript_pack_tag_split_chunks
105
+ assert_equal \
106
+ %(<script src="/packs/vendors~application~bootstrap-c20632e7baf2c81200d3.chunk.js"></script>\n) +
107
+ %(<script src="/packs/vendors~application-e55f2aae30c07fb6d82a.chunk.js"></script>\n) +
108
+ %(<script src="/packs/application-k344a6d59eef8632c9d1.js"></script>),
109
+ javascript_packs_with_chunks_tag('application')
110
+ end
111
+
112
+ def test_stylesheet_pack_tag_split_chunks
113
+ assert_equal \
114
+ %(<link rel="stylesheet" media="screen" href="/packs/1-c20632e7baf2c81200d3.chunk.css" />\n) +
115
+ %(<link rel="stylesheet" media="screen" href="/packs/application-k344a6d59eef8632c9d1.chunk.css" />\n) +
116
+ %(<link rel="stylesheet" media="screen" href="/packs/hello_stimulus-k344a6d59eef8632c9d1.chunk.css" />),
117
+ stylesheet_packs_with_chunks_tag('application', 'hello_stimulus')
118
+ end
119
+
120
+ def test_stylesheet_pack_tag
121
+ assert_equal \
122
+ %(<link rel="stylesheet" media="screen" href="/packs/bootstrap-c38deda30895059837cf.css" />),
123
+ stylesheet_pack_tag('bootstrap.css')
124
+ end
125
+
126
+ def test_stylesheet_pack_tag_symbol
127
+ assert_equal \
128
+ %(<link rel="stylesheet" media="screen" href="/packs/bootstrap-c38deda30895059837cf.css" />),
129
+ stylesheet_pack_tag(:bootstrap)
130
+ end
131
+
132
+ def test_stylesheet_pack_tag_splat
133
+ assert_equal \
134
+ %(<link rel="stylesheet" media="all" href="/packs/bootstrap-c38deda30895059837cf.css" />\n) +
135
+ %(<link rel="stylesheet" media="all" href="/packs/application-dd6b1cd38bfa093df600.css" />),
136
+ stylesheet_pack_tag('bootstrap.css', 'application.css', media: 'all')
137
+ end
138
+ end