vite_rails 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
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,75 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ class ManifestTest < Minitest::Test
6
+ def test_lookup_exception!
7
+ asset_file = 'calendar.js'
8
+
9
+ error = assert_raises_manifest_missing_entry_error do
10
+ ViteRails.manifest.lookup!(asset_file)
11
+ end
12
+
13
+ assert_match "ViteRails can't find #{ asset_file } in #{ manifest_path }", error.message
14
+ end
15
+
16
+ def test_lookup_with_type_exception!
17
+ asset_file = 'calendar'
18
+
19
+ error = assert_raises_manifest_missing_entry_error do
20
+ ViteRails.manifest.lookup!(asset_file, type: :javascript)
21
+ end
22
+
23
+ assert_match "ViteRails can't find #{ asset_file }.js in #{ manifest_path }", error.message
24
+ end
25
+
26
+ def test_lookup_success!
27
+ assert_equal ViteRails.manifest.lookup!('bootstrap.js'), '/packs/bootstrap-300631c4f0e0f9c865bc.js'
28
+ end
29
+
30
+ def test_lookup_nil
31
+ assert_nil ViteRails.manifest.lookup('foo.js')
32
+ end
33
+
34
+ def test_lookup_chunks_nil
35
+ assert_nil ViteRails.manifest.lookup_pack_with_chunks('foo.js')
36
+ end
37
+
38
+ def test_lookup_success
39
+ assert_equal ViteRails.manifest.lookup('bootstrap.js'), '/packs/bootstrap-300631c4f0e0f9c865bc.js'
40
+ end
41
+
42
+ def test_lookup_entrypoint_exception!
43
+ asset_file = 'calendar'
44
+
45
+ error = assert_raises_manifest_missing_entry_error do
46
+ ViteRails.manifest.lookup_pack_with_chunks!(asset_file, type: :javascript)
47
+ end
48
+
49
+ assert_match "ViteRails can't find #{ asset_file }.js in #{ manifest_path }", error.message
50
+ end
51
+
52
+ def test_lookup_entrypoint
53
+ application_entrypoints = [
54
+ '/packs/vendors~application~bootstrap-c20632e7baf2c81200d3.chunk.js',
55
+ '/packs/vendors~application-e55f2aae30c07fb6d82a.chunk.js',
56
+ '/packs/application-k344a6d59eef8632c9d1.js',
57
+ ]
58
+
59
+ assert_equal ViteRails.manifest.lookup_pack_with_chunks!('application', type: :javascript), application_entrypoints
60
+ end
61
+
62
+ private
63
+
64
+ def assert_raises_manifest_missing_entry_error(&block)
65
+ error = nil
66
+ ViteRails.config.stub :compile?, false do
67
+ error = assert_raises ViteRails::Manifest::MissingEntryError, &block
68
+ end
69
+ error
70
+ end
71
+
72
+ def manifest_path
73
+ File.expand_path File.join(File.dirname(__FILE__), 'test_app/public/packs', 'manifest.json').to_s
74
+ end
75
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ class ModeTest < ViteRails::Test
6
+ def test_current
7
+ assert_equal ViteRails.config.mode, Rails.env
8
+ end
9
+
10
+ def test_custom_without_config
11
+ with_rails_env('foo') do
12
+ assert_equal ViteRails.config.mode, 'production'
13
+ end
14
+ end
15
+
16
+ def test_custom_with_config
17
+ with_rails_env('staging') do
18
+ assert_equal ViteRails.config.mode, 'staging'
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bundler/setup'
4
+
5
+ APP_RAKEFILE = File.expand_path('test/dummy/Rakefile', __dir__)
6
+ load 'rails/tasks/engine.rake'
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'config/application'
4
+
5
+ Rails.application.load_tasks
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ APP_PATH = File.expand_path('../config/application', __dir__)
5
+ require 'rails/commands'
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'rake'
5
+ Rake.application.run
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ # This file allows the `Rails.root` to be correctly determined.
4
+
5
+ require_relative 'config/environment'
6
+
7
+ run Rails.application
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'action_controller/railtie'
4
+ require 'action_view/railtie'
5
+ require 'vite_rails'
6
+
7
+ module TestDummyApp
8
+ class Application < Rails::Application
9
+ config.secret_key_base = 'abcdef'
10
+ config.eager_load = true
11
+ end
12
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'application'
4
+
5
+ Rails.application.initialize!
@@ -0,0 +1,20 @@
1
+ {
2
+ "development": {
3
+ "autoBuild": true,
4
+ "port": "3535",
5
+ "https": true,
6
+ "publicOutputDir": "vite-development"
7
+ },
8
+ "test": {
9
+ "autoBuild": true,
10
+ "publicOutputDir": "vite-test"
11
+ },
12
+ "production": {
13
+ "autoBuild": false,
14
+ "publicOutputDir": "vite-production"
15
+ },
16
+ "staging": {
17
+ "autoBuild": false,
18
+ "publicOutputDir": "vite-staging"
19
+ }
20
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "private": true,
3
+ "dependencies": {
4
+ "vite_rails": "file:../../../../"
5
+ },
6
+ "license": "MIT"
7
+ }
@@ -0,0 +1,74 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ class RakeTasksTest < Minitest::Test
6
+ def test_rake_tasks
7
+ output = Dir.chdir(test_app_path) { `rake -T` }
8
+ assert_includes output, 'vite_rails'
9
+ assert_includes output, 'vite:check_binstubs'
10
+ assert_includes output, 'vite:check_node'
11
+ assert_includes output, 'vite:check_yarn'
12
+ assert_includes output, 'vite:clean'
13
+ assert_includes output, 'vite:clobber'
14
+ assert_includes output, 'vite:compile'
15
+ assert_includes output, 'vite:install'
16
+ assert_includes output, 'vite:verify_install'
17
+ end
18
+
19
+ def test_rake_task_vite_check_binstubs
20
+ output = Dir.chdir(test_app_path) { `rake vite:check_binstubs 2>&1` }
21
+ refute_includes output, 'vite binstub not found.'
22
+ end
23
+
24
+ def test_check_node_version
25
+ output = Dir.chdir(test_app_path) { `rake vite:check_node 2>&1` }
26
+ refute_includes output, 'ViteRails requires Node.js'
27
+ end
28
+
29
+ def test_check_yarn_version
30
+ output = Dir.chdir(test_app_path) { `rake vite:check_yarn 2>&1` }
31
+ refute_includes output, 'Yarn not installed'
32
+ refute_includes output, 'ViteRails requires Yarn'
33
+ end
34
+
35
+ def test_rake_vite_install_dependencies_in_non_production_environments
36
+ assert_includes test_app_dev_dependencies, 'right-pad'
37
+
38
+ ViteRails.with_node_env('test') do
39
+ Dir.chdir(test_app_path) do
40
+ `bundle exec rake vite:install_dependencies`
41
+ end
42
+ end
43
+
44
+ assert_includes installed_node_module_names, 'right-pad',
45
+ 'Expected dev dependencies to be installed'
46
+ end
47
+
48
+ def test_rake_vite_install_dependencies_in_production_environment
49
+ ViteRails.with_node_env('production') do
50
+ Dir.chdir(test_app_path) do
51
+ `bundle exec rake vite:install_dependencies`
52
+ end
53
+ end
54
+
55
+ refute_includes installed_node_module_names, 'right-pad',
56
+ 'Expected only production dependencies to be installed'
57
+ end
58
+
59
+ private
60
+
61
+ def test_app_path
62
+ File.expand_path('test_app', __dir__)
63
+ end
64
+
65
+ def test_app_dev_dependencies
66
+ package_json = File.expand_path('package.json', test_app_path)
67
+ JSON.parse(File.read(package_json))['devDependencies']
68
+ end
69
+
70
+ def installed_node_module_names
71
+ node_modules_path = File.expand_path('node_modules', test_app_path)
72
+ Dir.chdir(node_modules_path) { Dir.glob('*') }
73
+ end
74
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'config/application'
4
+
5
+ Rails.application.load_tasks
@@ -0,0 +1,10 @@
1
+ /* eslint no-console:0 */
2
+ // This file is automatically compiled by Vite, along with any other files
3
+ // present in this directory. You're encouraged to place your actual application logic in
4
+ // a relevant structure within app/javascript and only use these pack files to reference
5
+ // that code so it'll be compiled.
6
+ //
7
+ // To reference this file, add <%= javascript_pack_tag 'application' %> to the appropriate
8
+ // layout file, like app/views/layouts/application.html.erb
9
+
10
+ console.log('Hello World from ViteRails')
@@ -0,0 +1,4 @@
1
+ /*
2
+ * Dummy file #1 for Multi File Entry points: https://vite.js.org/guides/entry-advanced/
3
+ * This file must be named the same
4
+ */
@@ -0,0 +1,4 @@
1
+ /*
2
+ * Dummy file #2 for Multi File Entry points: https://vite.js.org/guides/entry-advanced/
3
+ * This file must be named the same
4
+ */
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ ENV['RAILS_ENV'] ||= ENV['RACK_ENV'] || 'development'
5
+ ENV['NODE_ENV'] ||= ENV['RAILS_ENV'] == 'development' ? 'development' : 'production'
6
+
7
+ require 'pathname'
8
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', Pathname.new(__FILE__).realpath)
9
+
10
+ require 'bundler/setup'
11
+
12
+ require 'vite_rails'
13
+
14
+ APP_ROOT = File.expand_path('..', __dir__)
15
+ Dir.chdir(APP_ROOT) do
16
+ ViteRails.run(ARGV)
17
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ # This file allows the `Rails.root` to be correctly determined.
4
+
5
+ require_relative 'config/environment'
6
+
7
+ run Rails.application
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'action_controller/railtie'
4
+ require 'action_view/railtie'
5
+ require 'vite_rails'
6
+
7
+ module TestApp
8
+ class Application < ::Rails::Application
9
+ config.secret_key_base = 'abcdef'
10
+ config.eager_load = true
11
+ config.active_support.test_order = :sorted
12
+ end
13
+ end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'application'
4
+
5
+ Rails.backtrace_cleaner.remove_silencers!
6
+ Rails.application.initialize!
@@ -0,0 +1,20 @@
1
+ {
2
+ "development": {
3
+ "autoBuild": true,
4
+ "port": "3535",
5
+ "https": true,
6
+ "publicOutputDir": "vite-development"
7
+ },
8
+ "test": {
9
+ "autoBuild": true,
10
+ "publicOutputDir": "vite-test"
11
+ },
12
+ "production": {
13
+ "autoBuild": false,
14
+ "publicOutputDir": "vite-production"
15
+ },
16
+ "staging": {
17
+ "autoBuild": false,
18
+ "publicOutputDir": "vite-staging"
19
+ }
20
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "development": {
3
+ "autoBuild": true,
4
+ "port": "3535",
5
+ "https": true,
6
+ "publicDir": "../public"
7
+ },
8
+ "test": {
9
+ "autoBuild": true,
10
+ "publicOutputDir": "vite-test"
11
+ },
12
+ "production": {
13
+ "autoBuild": false,
14
+ "publicOutputDir": "vite-production"
15
+ },
16
+ "staging": {
17
+ "autoBuild": false,
18
+ "publicOutputDir": "vite-staging"
19
+ }
20
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "name": "test_app",
3
+ "version": "1.0.0",
4
+ "main": "index.js",
5
+ "license": "MIT",
6
+ "private": true,
7
+ "dependencies": {
8
+ "left-pad": "^1.2.0"
9
+ },
10
+ "devDependencies": {
11
+ "right-pad": "^1.0.1"
12
+ }
13
+ }
@@ -0,0 +1,36 @@
1
+ {
2
+ "bootstrap.css": "/packs/bootstrap-c38deda30895059837cf.css",
3
+ "application.css": "/packs/application-dd6b1cd38bfa093df600.css",
4
+ "bootstrap.js": "/packs/bootstrap-300631c4f0e0f9c865bc.js",
5
+ "application.js": "/packs/application-k344a6d59eef8632c9d1.js",
6
+ "application.png": "/packs/application-k344a6d59eef8632c9d1.png",
7
+ "fonts/fa-regular-400.woff2": "/packs/fonts/fa-regular-400-944fb546bd7018b07190a32244f67dc9.woff2",
8
+ "media/images/image.jpg": "/packs/media/images/image-c38deda30895059837cf.jpg",
9
+ "media/images/image-2x.jpg": "/packs/media/images/image-2x-7cca48e6cae66ec07b8e.jpg",
10
+ "media/images/nested/image.jpg": "/packs/media/images/nested/image-c38deda30895059837cf.jpg",
11
+ "media/images/mb-icon.png": "/packs/media/images/mb-icon-c38deda30895059837cf.png",
12
+ "media/images/nested/mb-icon.png": "/packs/media/images/nested/mb-icon-c38deda30895059837cf.png",
13
+ "entrypoints": {
14
+ "application": {
15
+ "assets": {
16
+ "js": [
17
+ "/packs/vendors~application~bootstrap-c20632e7baf2c81200d3.chunk.js",
18
+ "/packs/vendors~application-e55f2aae30c07fb6d82a.chunk.js",
19
+ "/packs/application-k344a6d59eef8632c9d1.js"
20
+ ],
21
+ "css": [
22
+ "/packs/1-c20632e7baf2c81200d3.chunk.css",
23
+ "/packs/application-k344a6d59eef8632c9d1.chunk.css"
24
+ ]
25
+ }
26
+ },
27
+ "hello_stimulus": {
28
+ "assets": {
29
+ "css": [
30
+ "/packs/1-c20632e7baf2c81200d3.chunk.css",
31
+ "/packs/hello_stimulus-k344a6d59eef8632c9d1.chunk.css"
32
+ ]
33
+ }
34
+ }
35
+ }
36
+ }
File without changes
@@ -0,0 +1,11 @@
1
+ # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
2
+ # yarn lockfile v1
3
+
4
+
5
+ left-pad@^1.2.0:
6
+ version "1.2.0"
7
+ resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.2.0.tgz#d30a73c6b8201d8f7d8e7956ba9616087a68e0ee"
8
+
9
+ right-pad@^1.0.1:
10
+ version "1.0.1"
11
+ resolved "https://registry.yarnpkg.com/right-pad/-/right-pad-1.0.1.tgz#8ca08c2cbb5b55e74dafa96bf7fd1a27d568c8d0"