vite_rails 1.0.12 → 2.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 (70) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +6 -0
  3. data/README.md +39 -34
  4. data/lib/tasks/vite.rake +17 -0
  5. data/lib/vite_rails.rb +5 -82
  6. data/lib/vite_rails/config.rb +11 -135
  7. data/lib/vite_rails/engine.rb +7 -11
  8. data/lib/vite_rails/installation.rb +47 -0
  9. data/lib/vite_rails/tag_helpers.rb +61 -0
  10. data/lib/vite_rails/version.rb +2 -2
  11. data/{test/mounted_app/test/dummy/config/vite.json → templates/config/rails-vite.json} +1 -0
  12. data/{lib/install/javascript → templates}/entrypoints/application.js +0 -0
  13. metadata +25 -129
  14. data/lib/install/bin/vite +0 -17
  15. data/lib/install/binstubs.rb +0 -6
  16. data/lib/install/config/vite.config.ts +0 -8
  17. data/lib/install/config/vite.json +0 -14
  18. data/lib/install/template.rb +0 -40
  19. data/lib/tasks/vite/binstubs.rake +0 -12
  20. data/lib/tasks/vite/build.rake +0 -39
  21. data/lib/tasks/vite/clean.rake +0 -23
  22. data/lib/tasks/vite/clobber.rake +0 -20
  23. data/lib/tasks/vite/info.rake +0 -20
  24. data/lib/tasks/vite/install.rake +0 -12
  25. data/lib/tasks/vite/install_dependencies.rake +0 -14
  26. data/lib/tasks/vite/verify_install.rake +0 -23
  27. data/lib/vite_rails/builder.rb +0 -111
  28. data/lib/vite_rails/commands.rb +0 -109
  29. data/lib/vite_rails/dev_server.rb +0 -23
  30. data/lib/vite_rails/dev_server_proxy.rb +0 -57
  31. data/lib/vite_rails/helper.rb +0 -71
  32. data/lib/vite_rails/manifest.rb +0 -143
  33. data/lib/vite_rails/runner.rb +0 -53
  34. data/package.json +0 -19
  35. data/package/default.vite.json +0 -16
  36. data/test/builder_test.rb +0 -77
  37. data/test/commands_test.rb +0 -67
  38. data/test/config_test.rb +0 -133
  39. data/test/dev_server_proxy_test.rb +0 -102
  40. data/test/dev_server_test.rb +0 -9
  41. data/test/engine_rake_tasks_test.rb +0 -81
  42. data/test/helper_test.rb +0 -75
  43. data/test/manifest_test.rb +0 -85
  44. data/test/mode_test.rb +0 -16
  45. data/test/mounted_app/Rakefile +0 -6
  46. data/test/mounted_app/test/dummy/Rakefile +0 -5
  47. data/test/mounted_app/test/dummy/bin/rails +0 -5
  48. data/test/mounted_app/test/dummy/bin/rake +0 -5
  49. data/test/mounted_app/test/dummy/config.ru +0 -7
  50. data/test/mounted_app/test/dummy/config/application.rb +0 -12
  51. data/test/mounted_app/test/dummy/config/environment.rb +0 -5
  52. data/test/mounted_app/test/dummy/package.json +0 -8
  53. data/test/mounted_app/test/dummy/yarn.lock +0 -208
  54. data/test/rake_tasks_test.rb +0 -60
  55. data/test/runner_test.rb +0 -31
  56. data/test/test_app/Rakefile +0 -5
  57. data/test/test_app/app/frontend/entrypoints/application.js +0 -2
  58. data/test/test_app/bin/vite +0 -17
  59. data/test/test_app/config.ru +0 -7
  60. data/test/test_app/config/application.rb +0 -13
  61. data/test/test_app/config/environment.rb +0 -6
  62. data/test/test_app/config/vite.json +0 -18
  63. data/test/test_app/config/vite_additional_paths.json +0 -5
  64. data/test/test_app/config/vite_public_dir.json +0 -5
  65. data/test/test_app/package.json +0 -13
  66. data/test/test_app/public/vite-production/manifest-assets.json +0 -10
  67. data/test/test_app/public/vite-production/manifest.json +0 -39
  68. data/test/test_app/some.config.js +0 -0
  69. data/test/test_app/yarn.lock +0 -11
  70. data/test/test_helper.rb +0 -68
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 57f866deafddde5401e02ec27cf751eb26a40a0be1fd832d9d3813fd7a69e721
4
- data.tar.gz: 7cf22c583a3ac70f4353e227b0da4463b42067dd38f0c36774e665e619b31f2d
3
+ metadata.gz: 04dad5363dea685fe1e9e7ad2a852566927bd2804f0dab0ddecc8016da915dd0
4
+ data.tar.gz: 5a8d82f9cfbcf65bef55d28dfdf8cdf5bb77fb04ba83ce9db6b7c4eb2ffb749d
5
5
  SHA512:
6
- metadata.gz: d101294de0e6f585b7df56c2881c465698f4c6ccbe8c4220117d7119c84f21e8b80e6aa2865dd353fa27b3b2c3d7a78095e80466c2d9b5f6eda60b6073a55ed0
7
- data.tar.gz: fdbe92f7afafd6f82bafc6525a4099151efcdc385ce49e5cc5f696ea79efe5d411b6eaf093b9b1ec1402140a7d4ac34f629401fb70d9005535eaf38e989cf4cd
6
+ metadata.gz: 312c305aa1d69cfb57f93110c093cc7f8b5193a24c16aa5916efc60f8b284d86eba0090aa2e1831748526c7bf57ea6c8962b6d290d469d0ca1b0bdd014888431
7
+ data.tar.gz: d118d7eecbc36163b8ef3789d9198da5c991aab64f6da739381878e7b045c1d365155d22be92226665ce7583f99e0d6d60fd6b01aeb94f5596371a359a242a6d
data/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ ## Vite Rails 2.0.0 (2020-02-09)
2
+
3
+ - Extracted core functionality to `vite_ruby`.
4
+ - User-facing API hasn't really changed, but internal classes have been renamed.
5
+ - Installation script now injects tags to `application.html.erb` if it exists.
6
+
1
7
  ## Vite Rails 1.0.12 (2020-01-29)
2
8
 
3
9
  - Add support for Vite 2.0.0-beta.56, which modified the manifest to output a `css` field in the manifest.
data/README.md CHANGED
@@ -1,54 +1,66 @@
1
1
  <h1 align="center">
2
- <a href="https://vite-rails.netlify.app/">
3
- <img src="https://raw.githubusercontent.com/ElMassimo/vite_rails/main/docs/public/logo.svg" width="120px"/>
2
+ <a href="https://vite-ruby.netlify.app/">
3
+ <img src="https://raw.githubusercontent.com/ElMassimo/vite_ruby/main/docs/public/logo.svg" width="120px"/>
4
4
  </a>
5
5
 
6
6
  <br>
7
7
 
8
- <a href="https://vite-rails.netlify.app/">
8
+ <a href="https://vite-ruby.netlify.app/">
9
9
  Vite Rails
10
10
  </a>
11
11
 
12
12
  <br>
13
13
 
14
14
  <p align="center">
15
- <a href="https://github.com/ElMassimo/vite_rails/actions">
16
- <img alt="Build Status" src="https://github.com/ElMassimo/vite_rails/workflows/build/badge.svg"/>
15
+ <a href="https://github.com/ElMassimo/vite_ruby/actions">
16
+ <img alt="Build Status" src="https://github.com/ElMassimo/vite_ruby/workflows/build/badge.svg"/>
17
17
  </a>
18
- <a href="https://codeclimate.com/github/ElMassimo/vite_rails">
19
- <img alt="Maintainability" src="https://codeclimate.com/github/ElMassimo/vite_rails/badges/gpa.svg"/>
18
+ <a href="https://codeclimate.com/github/ElMassimo/vite_ruby">
19
+ <img alt="Maintainability" src="https://codeclimate.com/github/ElMassimo/vite_ruby/badges/gpa.svg"/>
20
20
  </a>
21
- <a href="https://codeclimate.com/github/ElMassimo/vite_rails">
22
- <img alt="Test Coverage" src="https://codeclimate.com/github/ElMassimo/vite_rails/badges/coverage.svg"/>
21
+ <a href="https://codeclimate.com/github/ElMassimo/vite_ruby">
22
+ <img alt="Test Coverage" src="https://codeclimate.com/github/ElMassimo/vite_ruby/badges/coverage.svg"/>
23
23
  </a>
24
24
  <a href="https://rubygems.org/gems/vite_rails">
25
25
  <img alt="Gem Version" src="https://img.shields.io/gem/v/vite_rails.svg?colorB=e9573f"/>
26
26
  </a>
27
- <a href="https://github.com/ElMassimo/vite_rails/blob/master/LICENSE.txt">
27
+ <a href="https://github.com/ElMassimo/vite_ruby/blob/master/LICENSE.txt">
28
28
  <img alt="License" src="https://img.shields.io/badge/license-MIT-428F7E.svg"/>
29
29
  </a>
30
30
  </p>
31
31
  </h1>
32
32
 
33
- [website]: https://vite-rails.netlify.app/
34
- [configuration reference]: https://vite-rails.netlify.app/config/
35
- [features]: https://vite-rails.netlify.app/guide/introduction.html
36
- [guides]: https://vite-rails.netlify.app/guide/
37
- [config]: https://vite-rails.netlify.app/config/
38
- [vite_rails]: https://github.com/ElMassimo/vite_rails
33
+ [website]: https://vite-ruby.netlify.app/
34
+ [configuration reference]: https://vite-ruby.netlify.app/config/
35
+ [features]: https://vite-ruby.netlify.app/guide/introduction.html
36
+ [guides]: https://vite-ruby.netlify.app/guide/
37
+ [config]: https://vite-ruby.netlify.app/config/
38
+ [vite_rails]: https://github.com/ElMassimo/vite_ruby/tree/main/vite_rails
39
39
  [webpacker]: https://github.com/rails/webpacker
40
40
  [vite]: http://vitejs.dev/
41
- [config file]: https://github.com/ElMassimo/vite_rails/blob/main/package/default.vite.json
42
- [example app]: https://github.com/ElMassimo/vite_rails/tree/main/examples/blog
43
- [heroku]: https://vite-rails-demo.herokuapp.com/
44
- [Issues]: https://github.com/ElMassimo/vite_rails/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc
45
- [Discussions]: https://github.com/ElMassimo/vite_rails/discussions
46
-
47
- [__Vite Rails__][vite_rails] allows you to use [Vite] to power the frontend of your Rails app.
41
+ [config file]: https://github.com/ElMassimo/vite_ruby/blob/main/vite-plugin-ruby/default.vite.json
42
+ [example app]: https://github.com/ElMassimo/pingcrm-vite
43
+ [heroku]: https://pingcrm-vite.herokuapp.com/
44
+ [Issues]: https://github.com/ElMassimo/vite_ruby/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc
45
+ [Discussions]: https://github.com/ElMassimo/vite_ruby/discussions
46
+ [no bundling]: https://vitejs.dev/guide/introduction.html#the-problem
47
+ [bundling]: https://vitejs.dev/guide/introduction.html#why-bundle-for-production
48
48
 
49
49
  [Vite] is to frontend tooling as Ruby to programming, pure joy! 😍
50
50
 
51
- Check an [example app] running on [Heroku].
51
+ [__Vite Rails__][vite_rails] provides a complete setup for Rails applications,
52
+ allowing you to leverage [Vite] to power the frontend of your Rails app.
53
+
54
+ ## Why Vite? 🤔
55
+
56
+ Vite [does not bundle your code during development][no bundling], which means the
57
+ dev server is extremely __fast to start__, and your changes will be __updated instantly__.
58
+
59
+ In production, Vite [bundles your code][bundling]
60
+ with tree-shaking, lazy-loading, and common chunk splitting out of the box, to achieve optimal loading performance.
61
+
62
+ Check [this video comparison with webpack](https://github.com/ElMassimo/pingcrm-vite/pull/1)
63
+ which demonstrates the difference in speed during development.
52
64
 
53
65
  ## Features ⚡️
54
66
 
@@ -74,7 +86,7 @@ Then, run:
74
86
 
75
87
  ```bash
76
88
  bundle install
77
- bin/rake vite:install
89
+ bundle exec vite install
78
90
  ```
79
91
 
80
92
  This will generate configuration files and a sample setup.
@@ -83,16 +95,9 @@ Additional installation instructions are available in the [documentation website
83
95
 
84
96
  ## Getting Started 💻
85
97
 
86
- Restart your Rails server, and then run <kbd>bin/vite</kbd> to start the Vite development server.
87
-
88
- Add the following your `views/layouts/application.html.erb`:
89
-
90
- ```erb
91
- <%= vite_client_tag %>
92
- <%= vite_javascript_tag 'application' %>
93
- ```
98
+ Restart your Rails server, and then run <kbd>bin/vite dev</kbd> to start the Vite development server.
94
99
 
95
- Visit any page and you should see a printed console output: `Vite ⚡️ Rails`.
100
+ Visit any page and you should see a printed console output: `Vite ⚡️ Ruby`.
96
101
 
97
102
  For more [guides] and a full [configuration reference], check the [documentation website][website].
98
103
 
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'vite_ruby'
4
+ ViteRuby.install_tasks
5
+
6
+ namespace :vite_rails do
7
+ desc 'Fixes Rails management of node dev dependencies (build dependencies)'
8
+ task :set_node_env do
9
+ ENV['NODE_ENV'] = 'development'
10
+ end
11
+ end
12
+
13
+ # Set NODE_ENV before installation, so that Rails installs JS build dependencies
14
+ # on servers that precompile assets.
15
+ ['yarn:install', 'webpacker:yarn_install'].each do |name|
16
+ Rake::Task[name].enhance([:'vite_rails:set_node_env']) if Rake::Task.task_defined?(name)
17
+ end
data/lib/vite_rails.rb CHANGED
@@ -1,85 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'rails'
4
- require 'active_support/all'
3
+ require 'vite_ruby'
5
4
 
6
- require 'zeitwerk'
7
- loader = Zeitwerk::Loader.for_gem
8
- loader.ignore("#{ __dir__ }/install")
9
- loader.ignore("#{ __dir__ }/tasks")
10
- loader.setup
11
-
12
- class ViteRails
13
- # Internal: Prefix used for environment variables that modify the configuration.
14
- ENV_PREFIX = 'VITE_RUBY'
15
-
16
- class << self
17
- delegate :config, :builder, :manifest, :commands, :dev_server, :dev_server_running?, :run_proxy?, to: :instance
18
- delegate :mode, to: :config
19
- delegate :bootstrap, :clean, :clean_from_rake, :clobber, :build, :build_from_rake, to: :commands
20
-
21
- attr_writer :instance
22
-
23
- def instance
24
- @instance ||= ViteRails.new
25
- end
26
-
27
- def run(args)
28
- $stdout.sync = true
29
- ViteRails::Runner.new(args).run
30
- end
31
-
32
- # Internal: Allows to obtain any env variables for configuration options.
33
- def load_env_variables
34
- ENV.select { |key, _| key.start_with?(ENV_PREFIX) }
35
- end
36
- end
37
-
38
- # Public: Additional environment variables to pass to Vite.
39
- #
40
- # Example:
41
- # ViteRails.env['VITE_RUBY_CONFIG_PATH'] = 'config/alternate_vite.json'
42
- cattr_accessor(:env) { load_env_variables }
43
-
44
- cattr_accessor(:logger) { ActiveSupport::TaggedLogging.new(ActiveSupport::Logger.new(STDOUT)) }
45
-
46
- # Public: Returns true if the Vite development server is running.
47
- def dev_server_running?
48
- run_proxy? && dev_server.running?
49
- end
50
-
51
- # Public: The proxy for assets should only run in development mode.
52
- def run_proxy?
53
- config.mode == 'development'
54
- rescue StandardError => error
55
- ViteRails.logger.error("Failed to check mode for Vite: #{ error.message }")
56
- false
57
- end
58
-
59
- # Public: Current instance configuration for Vite.
60
- def config
61
- @config ||= ViteRails::Config.resolve_config
62
- end
63
-
64
- # Public: Keeps track of watched files and triggers builds as needed.
65
- def builder
66
- @builder ||= ViteRails::Builder.new(self)
67
- end
68
-
69
- # Public: Allows to check if the Vite development server is running.
70
- def dev_server
71
- @dev_server ||= ViteRails::DevServer.new(config)
72
- end
73
-
74
- # Public: Enables looking up assets managed by Vite using name and type.
75
- def manifest
76
- @manifest ||= ViteRails::Manifest.new(self)
77
- end
78
-
79
- # Internal: Helper to run commands related with Vite.
80
- def commands
81
- @commands ||= ViteRails::Commands.new(self)
82
- end
83
- end
84
-
85
- ViteRails::Engine if defined?(Rails)
5
+ require 'vite_rails/version'
6
+ require 'vite_rails/config'
7
+ require 'vite_rails/tag_helpers'
8
+ require 'vite_rails/engine' if defined?(Rails)
@@ -1,139 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'json'
4
-
5
- # Public: Allows to resolve configuration sourced from `config/vite.json` and
6
- # environment variables, combining them with the default options.
7
- class ViteRails::Config
8
- delegate :as_json, :inspect, to: :@config
9
-
10
- def initialize(attrs)
11
- @config = attrs.tap { |config| coerce_values(config) }.freeze
12
- end
13
-
14
- def protocol
15
- https ? 'https' : 'http'
16
- end
17
-
18
- def host_with_port
19
- "#{ host }:#{ port }"
20
- end
21
-
22
- # Internal: Path where Vite outputs the manifest file.
23
- def manifest_path
24
- build_output_dir.join('manifest.json')
25
- end
26
-
27
- # Internal: Path where vite-plugin-ruby outputs the assets manifest file.
28
- def assets_manifest_path
29
- build_output_dir.join('manifest-assets.json')
30
- end
31
-
32
- # Public: The directory where Vite will store the built assets.
33
- def build_output_dir
34
- root.join(public_dir, public_output_dir)
35
- end
36
-
37
- # Public: The directory where the entries are located.
38
- def resolved_entrypoints_dir
39
- root.join(source_code_dir, entrypoints_dir)
40
- end
41
-
42
- # Internal: The directory where Vite stores its processing cache.
43
- def vite_cache_dir
44
- root.join('node_modules/.vite')
45
- end
46
-
47
- # Public: Sets additional environment variables for vite-plugin-ruby.
48
- def to_env
49
- CONFIGURABLE_WITH_ENV.each_with_object({}) do |option, env|
50
- unless (value = @config[option]).nil?
51
- env["#{ ViteRails::ENV_PREFIX }_#{ option.upcase }"] = value.to_s
52
- end
53
- end.merge(ViteRails.env)
54
- end
55
-
56
- private
57
-
58
- # Internal: Coerces all the configuration values, in case they were passed
59
- # as environment variables which are always strings.
60
- def coerce_values(config)
61
- config['mode'] = config['mode'].to_s
62
- config['port'] = config['port'].to_i
63
- config['root'] = Pathname.new(config['root'])
64
- config['build_cache_dir'] = config['root'].join(config['build_cache_dir'])
65
- coerce_booleans(config, 'auto_build', 'hide_build_console_output', 'https')
66
- end
67
-
68
- # Internal: Coerces configuration options to boolean.
69
- def coerce_booleans(config, *names)
70
- names.each { |name| config[name] = [true, 'true'].include?(config[name]) }
71
- end
72
-
73
- class << self
74
- # Public: Returns the project configuration for Vite.
75
- def resolve_config(**attrs)
76
- config = attrs.transform_keys(&:to_s).reverse_merge(config_defaults)
77
- file_path = File.join(config['root'], config['config_path'])
78
- file_config = config_from_file(file_path, mode: config['mode'])
79
- new DEFAULT_CONFIG.merge(file_config).merge(config_from_env).merge(config)
80
- end
81
-
82
- private
83
-
84
- # Internal: Default values for a Rails application.
85
- def config_defaults
86
- {
87
- 'asset_host' => option_from_env('asset_host') || Rails.application&.config&.action_controller&.asset_host,
88
- 'config_path' => option_from_env('config_path') || DEFAULT_CONFIG.fetch('config_path'),
89
- 'mode' => option_from_env('mode') || Rails.env.to_s,
90
- 'root' => option_from_env('root') || Rails.root || Dir.pwd,
91
- }
92
- end
93
-
94
- # Internal: Used to load a JSON file from the specified path.
95
- def load_json(path)
96
- JSON.parse(File.read(File.expand_path(path))).deep_transform_keys(&:underscore)
97
- end
98
-
99
- # Internal: Retrieves a configuration option from environment variables.
100
- def option_from_env(name)
101
- ViteRails.env["#{ ViteRails::ENV_PREFIX }_#{ name.upcase }"]
102
- end
103
-
104
- # Internal: Extracts the configuration options provided as env vars.
105
- def config_from_env
106
- CONFIGURABLE_WITH_ENV.each_with_object({}) do |option, env_vars|
107
- if value = option_from_env(option)
108
- env_vars[option] = value
109
- end
110
- end
111
- end
112
-
113
- # Internal: Loads the configuration options provided in a JSON file.
114
- def config_from_file(path, mode:)
115
- multi_env_config = load_json(path)
116
- multi_env_config.fetch('all', {})
117
- .merge(multi_env_config.fetch(mode, {}))
118
- rescue Errno::ENOENT => error
119
- warn "Check that your vite.json configuration file is available in the load path. #{ error.message }"
120
- {}
121
- end
122
- end
123
-
124
- # Internal: Shared configuration with the Vite plugin for Ruby.
125
- DEFAULT_CONFIG = load_json("#{ __dir__ }/../../package/default.vite.json").freeze
126
-
127
- # Internal: Configuration options that can not be provided as env vars.
128
- NOT_CONFIGURABLE_WITH_ENV = %w[watch_additional_paths].freeze
129
-
130
- # Internal: Configuration options that can be provided as env vars.
131
- CONFIGURABLE_WITH_ENV = (DEFAULT_CONFIG.keys + %w[mode root] - NOT_CONFIGURABLE_WITH_ENV).freeze
132
-
133
- public
134
-
135
- # Define getters for the configuration options.
136
- (CONFIGURABLE_WITH_ENV + NOT_CONFIGURABLE_WITH_ENV).each do |option|
137
- define_method(option) { @config[option] }
3
+ module ViteRails::Config
4
+ # Override: Default values for a Rails application.
5
+ def config_defaults
6
+ require 'rails'
7
+ super(
8
+ asset_host: Rails.application&.config&.action_controller&.asset_host,
9
+ mode: Rails.env.to_s,
10
+ root: Rails.root || Dir.pwd,
11
+ )
138
12
  end
139
13
  end
14
+
15
+ ViteRuby::Config.singleton_class.prepend(ViteRails::Config)
@@ -4,36 +4,32 @@ require 'rails/railtie'
4
4
 
5
5
  class ViteRails::Engine < Rails::Engine
6
6
  initializer 'vite_rails.proxy' do |app|
7
- app.middleware.insert_before 0, ViteRails::DevServerProxy, ssl_verify_none: true if ViteRails.run_proxy?
7
+ app.middleware.insert_before 0, ViteRuby::DevServerProxy, ssl_verify_none: true if ViteRuby.run_proxy?
8
8
  end
9
9
 
10
10
  initializer 'vite_rails.helper' do
11
11
  ActiveSupport.on_load(:action_controller) do
12
- ActionController::Base.helper(ViteRails::Helper)
12
+ ActionController::Base.helper(ViteRails::TagHelpers)
13
13
  end
14
14
 
15
15
  ActiveSupport.on_load(:action_view) do
16
- include ViteRails::Helper
16
+ include ViteRails::TagHelpers
17
17
  end
18
18
  end
19
19
 
20
20
  initializer 'vite_rails.logger' do
21
21
  config.after_initialize do
22
- ViteRails.logger = if ::Rails.logger.respond_to?(:tagged)
23
- ::Rails.logger
24
- else
25
- ActiveSupport::TaggedLogging.new(::Rails.logger)
26
- end
22
+ ViteRuby.instance.logger = Rails.logger
27
23
  end
28
24
  end
29
25
 
30
26
  initializer 'vite_rails.bootstrap' do
31
27
  if defined?(Rails::Server) || defined?(Rails::Console)
32
- ViteRails.bootstrap
28
+ ViteRuby.bootstrap
33
29
  if defined?(Spring)
34
30
  require 'spring/watcher'
35
- Spring.after_fork { ViteRails.bootstrap }
36
- Spring.watch(ViteRails.config.config_path)
31
+ Spring.after_fork { ViteRuby.bootstrap }
32
+ Spring.watch(ViteRuby.config.config_path)
37
33
  end
38
34
  end
39
35
  end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'vite_rails'
4
+
5
+ # Internal: Extends the base installation script from Vite Ruby to work for a
6
+ # typical Rails app.
7
+ module ViteRails::Installation
8
+ RAILS_TEMPLATES = Pathname.new(File.expand_path('../../templates', __dir__))
9
+
10
+ # Override: Setup a typical apps/web Hanami app to use Vite.
11
+ def setup_app_files
12
+ cp RAILS_TEMPLATES.join('config/rails-vite.json'), config.config_path
13
+ setup_content_security_policy root.join('config/initializers/content_security_policy.rb')
14
+ end
15
+
16
+ # Internal: Configure CSP rules that allow to load @vite/client correctly.
17
+ def setup_content_security_policy(csp_file)
18
+ return unless csp_file.exist?
19
+
20
+ inject_line_after csp_file, 'policy.script_src', <<-CSP
21
+ # You may need to enable this in production as well depending on your setup.
22
+ policy.script_src *policy.script_src, :blob if Rails.env.test?
23
+ CSP
24
+ inject_line_after csp_file, 'policy.connect_src', <<-CSP
25
+ # Allow @vite/client to hot reload changes in development
26
+ policy.connect_src *policy.connect_src, "ws://\#{ ViteRuby.config.host_with_port }" if Rails.env.development?
27
+ CSP
28
+ inject_line_after csp_file, 'policy.script_src', <<-CSP
29
+ # Allow @vite/client to hot reload changes in development
30
+ policy.script_src *policy.script_src, :unsafe_eval, "http://#{ ViteRuby.config.host_with_port }" if Rails.env.development?
31
+ CSP
32
+ end
33
+
34
+ # Override: Create a sample JS file and attempt to inject it in an HTML template.
35
+ def install_sample_files
36
+ cp RAILS_TEMPLATES.join('entrypoints/application.js'), config.resolved_entrypoints_dir.join('application.js')
37
+
38
+ if (layout_file = root.join('app/views/layouts/application.html.erb')).exist?
39
+ inject_line_before layout_file, '</head>', <<-HTML
40
+ <%= vite_client_tag %>
41
+ <%= vite_javascript_tag 'application' %>
42
+ HTML
43
+ end
44
+ end
45
+ end
46
+
47
+ ViteRuby::CLI::Install.prepend(ViteRails::Installation)