vite_rails 1.0.12 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
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)