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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -0
- data/README.md +39 -34
- data/lib/tasks/vite.rake +17 -0
- data/lib/vite_rails.rb +5 -82
- data/lib/vite_rails/config.rb +11 -135
- data/lib/vite_rails/engine.rb +7 -11
- data/lib/vite_rails/installation.rb +47 -0
- data/lib/vite_rails/tag_helpers.rb +61 -0
- data/lib/vite_rails/version.rb +2 -2
- data/{test/mounted_app/test/dummy/config/vite.json → templates/config/rails-vite.json} +1 -0
- data/{lib/install/javascript → templates}/entrypoints/application.js +0 -0
- metadata +25 -129
- data/lib/install/bin/vite +0 -17
- data/lib/install/binstubs.rb +0 -6
- data/lib/install/config/vite.config.ts +0 -8
- data/lib/install/config/vite.json +0 -14
- data/lib/install/template.rb +0 -40
- data/lib/tasks/vite/binstubs.rake +0 -12
- data/lib/tasks/vite/build.rake +0 -39
- data/lib/tasks/vite/clean.rake +0 -23
- data/lib/tasks/vite/clobber.rake +0 -20
- data/lib/tasks/vite/info.rake +0 -20
- data/lib/tasks/vite/install.rake +0 -12
- data/lib/tasks/vite/install_dependencies.rake +0 -14
- data/lib/tasks/vite/verify_install.rake +0 -23
- data/lib/vite_rails/builder.rb +0 -111
- data/lib/vite_rails/commands.rb +0 -109
- data/lib/vite_rails/dev_server.rb +0 -23
- data/lib/vite_rails/dev_server_proxy.rb +0 -57
- data/lib/vite_rails/helper.rb +0 -71
- data/lib/vite_rails/manifest.rb +0 -143
- data/lib/vite_rails/runner.rb +0 -53
- data/package.json +0 -19
- data/package/default.vite.json +0 -16
- data/test/builder_test.rb +0 -77
- data/test/commands_test.rb +0 -67
- data/test/config_test.rb +0 -133
- data/test/dev_server_proxy_test.rb +0 -102
- data/test/dev_server_test.rb +0 -9
- data/test/engine_rake_tasks_test.rb +0 -81
- data/test/helper_test.rb +0 -75
- data/test/manifest_test.rb +0 -85
- data/test/mode_test.rb +0 -16
- data/test/mounted_app/Rakefile +0 -6
- data/test/mounted_app/test/dummy/Rakefile +0 -5
- data/test/mounted_app/test/dummy/bin/rails +0 -5
- data/test/mounted_app/test/dummy/bin/rake +0 -5
- data/test/mounted_app/test/dummy/config.ru +0 -7
- data/test/mounted_app/test/dummy/config/application.rb +0 -12
- data/test/mounted_app/test/dummy/config/environment.rb +0 -5
- data/test/mounted_app/test/dummy/package.json +0 -8
- data/test/mounted_app/test/dummy/yarn.lock +0 -208
- data/test/rake_tasks_test.rb +0 -60
- data/test/runner_test.rb +0 -31
- data/test/test_app/Rakefile +0 -5
- data/test/test_app/app/frontend/entrypoints/application.js +0 -2
- data/test/test_app/bin/vite +0 -17
- data/test/test_app/config.ru +0 -7
- data/test/test_app/config/application.rb +0 -13
- data/test/test_app/config/environment.rb +0 -6
- data/test/test_app/config/vite.json +0 -18
- data/test/test_app/config/vite_additional_paths.json +0 -5
- data/test/test_app/config/vite_public_dir.json +0 -5
- data/test/test_app/package.json +0 -13
- data/test/test_app/public/vite-production/manifest-assets.json +0 -10
- data/test/test_app/public/vite-production/manifest.json +0 -39
- data/test/test_app/some.config.js +0 -0
- data/test/test_app/yarn.lock +0 -11
- data/test/test_helper.rb +0 -68
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 04dad5363dea685fe1e9e7ad2a852566927bd2804f0dab0ddecc8016da915dd0
|
4
|
+
data.tar.gz: 5a8d82f9cfbcf65bef55d28dfdf8cdf5bb77fb04ba83ce9db6b7c4eb2ffb749d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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-
|
3
|
-
<img src="https://raw.githubusercontent.com/ElMassimo/
|
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-
|
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/
|
16
|
-
<img alt="Build Status" src="https://github.com/ElMassimo/
|
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/
|
19
|
-
<img alt="Maintainability" src="https://codeclimate.com/github/ElMassimo/
|
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/
|
22
|
-
<img alt="Test Coverage" src="https://codeclimate.com/github/ElMassimo/
|
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/
|
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-
|
34
|
-
[configuration reference]: https://vite-
|
35
|
-
[features]: https://vite-
|
36
|
-
[guides]: https://vite-
|
37
|
-
[config]: https://vite-
|
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/
|
42
|
-
[example app]: https://github.com/ElMassimo/
|
43
|
-
[heroku]: https://vite
|
44
|
-
[Issues]: https://github.com/ElMassimo/
|
45
|
-
[Discussions]: https://github.com/ElMassimo/
|
46
|
-
|
47
|
-
[
|
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
|
-
|
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
|
-
|
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 ⚡️
|
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
|
|
data/lib/tasks/vite.rake
ADDED
@@ -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 '
|
4
|
-
require 'active_support/all'
|
3
|
+
require 'vite_ruby'
|
5
4
|
|
6
|
-
require '
|
7
|
-
|
8
|
-
|
9
|
-
|
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)
|
data/lib/vite_rails/config.rb
CHANGED
@@ -1,139 +1,15 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
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)
|
data/lib/vite_rails/engine.rb
CHANGED
@@ -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,
|
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::
|
12
|
+
ActionController::Base.helper(ViteRails::TagHelpers)
|
13
13
|
end
|
14
14
|
|
15
15
|
ActiveSupport.on_load(:action_view) do
|
16
|
-
include ViteRails::
|
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
|
-
|
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
|
-
|
28
|
+
ViteRuby.bootstrap
|
33
29
|
if defined?(Spring)
|
34
30
|
require 'spring/watcher'
|
35
|
-
Spring.after_fork {
|
36
|
-
Spring.watch(
|
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)
|