vite_ruby 3.9.1 → 4.0.0.alpha1

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,35 +1,18 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "json"
4
- require "time"
3
+ require 'time'
5
4
 
6
5
  # Internal: Value object with information about the last build.
7
- ViteRuby::Build = Struct.new(:success, :timestamp, :vite_ruby, :digest, :current_digest, :last_build_path, :errors, keyword_init: true) do
8
- class << self
9
- # Internal: Combines information from a previous build with the current digest.
10
- def from_previous(last_build_path, current_digest)
11
- new(
12
- **parse_metadata(last_build_path),
13
- current_digest: current_digest,
14
- last_build_path: last_build_path,
15
- )
16
- end
17
-
18
- private
19
-
20
- # Internal: Reads metadata recorded on the last build, if it exists.
21
- def parse_metadata(pathname)
22
- return default_metadata unless pathname.exist?
23
-
24
- JSON.parse(pathname.read.to_s).transform_keys(&:to_sym).slice(*members)
25
- rescue JSON::JSONError, Errno::ENOENT, Errno::ENOTDIR
26
- default_metadata
27
- end
28
-
29
- # Internal: To make it evident that there's no last build in error messages.
30
- def default_metadata
31
- {timestamp: "never", digest: "none"}
32
- end
6
+ ViteRuby::Build = Struct.new(:success, :timestamp, :vite_ruby, :digest, :current_digest) do
7
+ # Internal: Combines information from a previous build with the current digest.
8
+ def self.from_previous(attrs, current_digest)
9
+ new(
10
+ attrs['success'],
11
+ attrs['timestamp'] || 'never',
12
+ attrs['vite_ruby'] || 'unknown',
13
+ attrs['digest'] || 'none',
14
+ current_digest,
15
+ )
33
16
  end
34
17
 
35
18
  # Internal: A build is considered stale when watched files have changed since
@@ -53,30 +36,17 @@ ViteRuby::Build = Struct.new(:success, :timestamp, :vite_ruby, :digest, :current
53
36
  end
54
37
 
55
38
  # Internal: Returns a new build with the specified result.
56
- def with_result(**attrs)
39
+ def with_result(success)
57
40
  self.class.new(
58
- **attrs,
59
- timestamp: Time.now.strftime("%F %T"),
60
- vite_ruby: ViteRuby::VERSION,
61
- digest: current_digest,
62
- current_digest: current_digest,
63
- last_build_path: last_build_path,
41
+ success,
42
+ Time.now.strftime('%F %T'),
43
+ ViteRuby::VERSION,
44
+ current_digest,
64
45
  )
65
46
  end
66
47
 
67
- # Internal: Writes the result of the new build to a local file.
68
- def write_to_cache
69
- last_build_path.write to_json
70
- end
71
-
72
48
  # Internal: Returns a JSON string with the metadata of the build.
73
49
  def to_json(*_args)
74
- JSON.pretty_generate(
75
- success: success,
76
- errors: errors,
77
- timestamp: timestamp,
78
- vite_ruby: vite_ruby,
79
- digest: digest,
80
- )
50
+ JSON.pretty_generate(to_h)
81
51
  end
82
52
  end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "digest/sha1"
3
+ require 'json'
4
+ require 'digest/sha1'
4
5
 
5
6
  # Public: Keeps track of watched files and triggers builds as needed.
6
7
  class ViteRuby::Builder
@@ -11,25 +12,21 @@ class ViteRuby::Builder
11
12
  # Public: Checks if the watched files have changed since the last compilation,
12
13
  # and triggers a Vite build if any files have changed.
13
14
  def build(*args)
14
- last_build = last_build_metadata(ssr: args.include?("--ssr"))
15
-
16
- if args.delete("--force") || last_build.stale? || config.manifest_paths.empty?
17
- stdout, stderr, status = build_with_vite(*args)
18
- log_build_result(stdout, stderr, status)
19
- record_build_metadata(last_build, errors: stderr, success: status.success?)
20
- status.success?
15
+ last_build = last_build_metadata
16
+ if args.delete('--force') || last_build.stale?
17
+ build_with_vite(*args).tap { |success| record_build_metadata(success, last_build) }
21
18
  elsif last_build.success
22
- logger.debug "Skipping vite build. Watched files have not changed since the last build at #{last_build.timestamp}"
19
+ logger.debug "Skipping vite build. Watched files have not changed since the last build at #{ last_build.timestamp }"
23
20
  true
24
21
  else
25
- logger.error "Skipping vite build. Watched files have not changed since the build failed at #{last_build.timestamp} ❌"
22
+ logger.error "Skipping vite build. Watched files have not changed since the build failed at #{ last_build.timestamp } ❌"
26
23
  false
27
24
  end
28
25
  end
29
26
 
30
27
  # Internal: Reads the result of the last compilation from disk.
31
- def last_build_metadata(ssr: false)
32
- ViteRuby::Build.from_previous(last_build_path(ssr: ssr), watched_files_digest)
28
+ def last_build_metadata
29
+ ViteRuby::Build.from_previous(last_build_attrs, watched_files_digest)
33
30
  end
34
31
 
35
32
  private
@@ -38,35 +35,44 @@ private
38
35
 
39
36
  def_delegators :@vite_ruby, :config, :logger, :run
40
37
 
38
+ # Internal: Reads metadata recorded on the last build, if it exists.
39
+ def last_build_attrs
40
+ last_build_path.exist? ? JSON.parse(last_build_path.read.to_s) : {}
41
+ rescue JSON::JSONError, Errno::ENOENT, Errno::ENOTDIR
42
+ {}
43
+ end
44
+
41
45
  # Internal: Writes a digest of the watched files to disk for future checks.
42
- def record_build_metadata(build, **attrs)
46
+ def record_build_metadata(success, build)
43
47
  config.build_cache_dir.mkpath
44
- build.with_result(**attrs).write_to_cache
48
+ last_build_path.write build.with_result(success).to_json
45
49
  end
46
50
 
47
51
  # Internal: The file path where metadata of the last build is stored.
48
- def last_build_path(ssr:)
49
- config.build_cache_dir.join("last#{"-ssr" if ssr}-build-#{config.mode}.json")
52
+ def last_build_path
53
+ config.build_cache_dir.join("last-build-#{ config.mode }.json")
50
54
  end
51
55
 
52
56
  # Internal: Returns a digest of all the watched files, allowing to detect
53
57
  # changes, and skip Vite builds if no files have changed.
54
58
  def watched_files_digest
55
- return @last_digest if @last_digest_at && Time.now - @last_digest_at < 1
56
-
57
- config.within_root do
59
+ Dir.chdir File.expand_path(config.root) do
58
60
  files = Dir[*config.watched_paths].reject { |f| File.directory?(f) }
59
- file_ids = files.sort.map { |f| "#{File.basename(f)}/#{Digest::SHA1.file(f).hexdigest}" }
60
- @last_digest_at = Time.now
61
- @last_digest = Digest::SHA1.hexdigest(file_ids.join("/"))
61
+ file_ids = files.sort.map { |f| "#{ File.basename(f) }/#{ Digest::SHA1.file(f).hexdigest }" }
62
+ Digest::SHA1.hexdigest(file_ids.join('/'))
62
63
  end
63
64
  end
64
65
 
65
66
  # Public: Initiates a Vite build command to generate assets.
67
+ #
68
+ # Returns true if the build is successful, or false if it failed.
66
69
  def build_with_vite(*args)
67
- logger.info "Building with Vite ⚡️"
70
+ logger.info 'Building with Vite ⚡️'
71
+
72
+ stdout, stderr, status = run(['build', *args])
73
+ log_build_result(stdout, stderr.to_s, status)
68
74
 
69
- run(["build", *args])
75
+ status.success?
70
76
  end
71
77
 
72
78
  # Internal: Outputs the build results.
@@ -74,13 +80,12 @@ private
74
80
  # NOTE: By default it also outputs the manifest entries.
75
81
  def log_build_result(_stdout, stderr, status)
76
82
  if status.success?
77
- logger.info "Build with Vite complete: #{config.build_output_dir}"
78
- logger.error stderr unless stderr.empty?
83
+ logger.info "Build with Vite complete: #{ config.build_output_dir }"
84
+ logger.error stderr.to_s unless stderr.empty?
79
85
  else
80
86
  logger.error stderr
81
- logger.error status
82
- logger.error "Build with Vite failed! ❌"
83
- logger.error "❌ Check that vite and vite-plugin-ruby are in devDependencies and have been installed. " if stderr.include?("ERR! canceled")
87
+ logger.error 'Build with Vite failed! ❌'
88
+ logger.error '❌ Check that vite and vite-plugin-ruby are in devDependencies and have been installed. ' if stderr.include?('ERR! canceled')
84
89
  end
85
90
  end
86
91
  end
@@ -1,14 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class ViteRuby::CLI::Build < ViteRuby::CLI::Vite
4
- DEFAULT_ENV = CURRENT_ENV || "production"
4
+ DEFAULT_ENV = CURRENT_ENV || 'production'
5
5
 
6
- desc "Bundle all entrypoints using Vite."
6
+ desc 'Bundle all entrypoints using Vite.'
7
7
  shared_options
8
- option(:ssr, desc: "Build the SSR entrypoint instead", type: :boolean)
9
- option(:force, desc: "Force the build even if assets have not changed", type: :boolean)
10
- option(:watch, desc: "Start the Rollup watcher and rebuild on files changes", type: :boolean)
11
- option(:profile, desc: "Gather performance metrics from the build ", type: :boolean)
8
+ option(:force, desc: 'Force the build even if assets have not changed', type: :boolean)
9
+ option(:watch, desc: 'Start the Rollup watcher and rebuild on files changes', type: :boolean)
12
10
 
13
11
  def call(**options)
14
12
  super { |args| ViteRuby.commands.build_from_task(*args) }
@@ -1,14 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class ViteRuby::CLI::Clobber < Dry::CLI::Command
4
- desc "Clear the Vite cache, temp files, and builds"
4
+ desc 'Clear the Vite cache, temp files, and builds'
5
5
 
6
- current_env = ENV["RACK_ENV"] || ENV["RAILS_ENV"] || "development"
6
+ current_env = ENV['RACK_ENV'] || ENV['RAILS_ENV'] || 'development'
7
7
 
8
- option(:mode, default: current_env, values: %w[development production test], aliases: ["m"], desc: "The mode to use")
8
+ option(:mode, default: current_env, values: %w[development production test], aliases: ['m'], desc: 'The mode to use')
9
9
 
10
10
  def call(mode:, **)
11
- ViteRuby.env["VITE_RUBY_MODE"] = mode
11
+ ViteRuby.env['VITE_RUBY_MODE'] = mode
12
12
  ViteRuby.commands.clobber
13
13
  end
14
14
  end
@@ -1,11 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class ViteRuby::CLI::Dev < ViteRuby::CLI::Vite
4
- DEFAULT_ENV = CURRENT_ENV || "development"
4
+ DEFAULT_ENV = CURRENT_ENV || 'development'
5
5
 
6
- desc "Start the Vite development server."
6
+ desc 'Start the Vite development server.'
7
7
  shared_options
8
- option(:force, desc: "Force Vite to re-bundle dependencies", type: :boolean)
8
+ option(:force, desc: 'Force Vite to re-bundle dependencies', type: :boolean)
9
9
 
10
10
  def call(**options)
11
11
  super { |args| ViteRuby.run(args, exec: true) }
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "pathname"
4
- require "fileutils"
3
+ require 'pathname'
4
+ require 'fileutils'
5
5
 
6
6
  # NOTE: Extracted from dry-cli version 0.6.0, which later removed this file as
7
7
  # it was refactored and extracted into the more complete (and complex) dry-files.
@@ -36,7 +36,7 @@ module ViteRuby::CLI::FileUtils
36
36
  return if content.join.include?(contents)
37
37
 
38
38
  content << "\n" unless content.last&.end_with?("\n")
39
- content << "#{contents}\n"
39
+ content << "#{ contents }\n"
40
40
 
41
41
  write(path, content)
42
42
  end
@@ -47,7 +47,7 @@ module ViteRuby::CLI::FileUtils
47
47
  # @api private
48
48
  def replace_first_line(path, target, replacement)
49
49
  content = read_lines(path)
50
- content[index(content, path, target)] = "#{replacement}\n"
50
+ content[index(content, path, target)] = "#{ replacement }\n"
51
51
 
52
52
  write(path, content)
53
53
  end
@@ -95,14 +95,14 @@ module ViteRuby::CLI::FileUtils
95
95
  # @api private
96
96
  def index(content, path, target)
97
97
  content.index { |line| line.include?(target) } ||
98
- raise(ArgumentError, "Cannot find `#{target}' inside `#{path}'.")
98
+ raise(ArgumentError, "Cannot find `#{ target }' inside `#{ path }'.")
99
99
  end
100
100
 
101
101
  # @since 1.2.11
102
102
  # @api private
103
103
  def rindex(content, path, target)
104
104
  content.rindex { |line| line.include?(target) } ||
105
- raise(ArgumentError, "Cannot find `#{target}' inside `#{path}'.")
105
+ raise(ArgumentError, "Cannot find `#{ target }' inside `#{ path }'.")
106
106
  end
107
107
 
108
108
  # @since 1.2.11
@@ -113,7 +113,7 @@ module ViteRuby::CLI::FileUtils
113
113
 
114
114
  i = finder.call(content, path, target)
115
115
 
116
- content.insert(i, "#{contents}\n")
116
+ content.insert(i, "#{ contents }\n")
117
117
  write(path, content)
118
118
  end
119
119
 
@@ -125,7 +125,7 @@ module ViteRuby::CLI::FileUtils
125
125
 
126
126
  i = finder.call(content, path, target)
127
127
 
128
- content.insert(i + 1, "#{contents}\n")
128
+ content.insert(i + 1, "#{ contents }\n")
129
129
  write(path, content)
130
130
  end
131
131
  end
@@ -1,31 +1,26 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "stringio"
4
- require "json"
3
+ require 'stringio'
5
4
 
6
5
  class ViteRuby::CLI::Install < Dry::CLI::Command
7
- desc "Performs the initial configuration setup to get started with Vite Ruby."
8
-
9
- option(:package_manager, values: %w[npm pnpm yarn bun], aliases: %w[package-manager with], desc: "The package manager to use when installing JS dependencies.")
10
-
11
- def call(package_manager: nil, **)
12
- ENV["VITE_RUBY_PACKAGE_MANAGER"] ||= package_manager if package_manager
6
+ desc 'Performs the initial configuration setup to get started with Vite Ruby.'
13
7
 
8
+ def call(**)
14
9
  $stdout.sync = true
15
10
 
16
- say "Creating binstub"
11
+ say 'Creating binstub'
17
12
  ViteRuby.commands.install_binstubs
18
13
 
19
- say "Creating configuration files"
14
+ say 'Creating configuration files'
20
15
  create_configuration_files
21
16
 
22
- say "Installing sample files"
17
+ say 'Installing sample files'
23
18
  install_sample_files
24
19
 
25
- say "Installing js dependencies"
20
+ say 'Installing js dependencies'
26
21
  install_js_dependencies
27
22
 
28
- say "Adding files to .gitignore"
23
+ say 'Adding files to .gitignore'
29
24
  install_gitignore
30
25
 
31
26
  say "\nVite ⚡️ Ruby successfully installed! 🎉"
@@ -36,30 +31,30 @@ protected
36
31
  # Internal: The JS packages that should be added to the app.
37
32
  def js_dependencies
38
33
  [
39
- "vite@#{ViteRuby::DEFAULT_VITE_VERSION}",
40
- "vite-plugin-ruby@#{ViteRuby::DEFAULT_PLUGIN_VERSION}",
34
+ "vite@#{ ViteRuby::DEFAULT_VITE_VERSION }",
35
+ "vite-plugin-ruby@#{ ViteRuby::DEFAULT_PLUGIN_VERSION }",
41
36
  ]
42
37
  end
43
38
 
44
39
  # Internal: Setup for a plain Rack application.
45
40
  def setup_app_files
46
- copy_template "config/vite.json", to: config.config_path
41
+ copy_template 'config/vite.json', to: config.config_path
47
42
 
48
- if (rackup_file = root.join("config.ru")).exist?
49
- inject_line_after_last rackup_file, "require", "use(ViteRuby::DevServerProxy, ssl_verify_none: true) if ViteRuby.run_proxy?"
43
+ if (rackup_file = root.join('config.ru')).exist?
44
+ inject_line_after_last rackup_file, 'require', 'use(ViteRuby::DevServerProxy, ssl_verify_none: true) if ViteRuby.run_proxy?'
50
45
  end
51
46
  end
52
47
 
53
48
  # Internal: Create a sample JS file and attempt to inject it in an HTML template.
54
49
  def install_sample_files
55
- copy_template "entrypoints/application.js", to: config.resolved_entrypoints_dir.join("application.js")
50
+ copy_template 'entrypoints/application.js', to: config.resolved_entrypoints_dir.join('application.js')
56
51
  end
57
52
 
58
53
  private
59
54
 
60
55
  extend Forwardable
61
56
 
62
- def_delegators "ViteRuby", :config
57
+ def_delegators 'ViteRuby', :config
63
58
 
64
59
  %i[append cp inject_line_after inject_line_after_last inject_line_before replace_first_line write].each do |util|
65
60
  define_method(util) { |*args|
@@ -67,7 +62,7 @@ private
67
62
  }
68
63
  end
69
64
 
70
- TEMPLATES_PATH = Pathname.new(File.expand_path("../../../templates", __dir__))
65
+ TEMPLATES_PATH = Pathname.new(File.expand_path('../../../templates', __dir__))
71
66
 
72
67
  def copy_template(path, to:)
73
68
  cp TEMPLATES_PATH.join(path), to
@@ -75,39 +70,30 @@ private
75
70
 
76
71
  # Internal: Creates the Vite and vite-plugin-ruby configuration files.
77
72
  def create_configuration_files
78
- copy_template "config/vite.config.ts", to: root.join("vite.config.ts")
79
- append root.join("Procfile.dev"), "vite: bin/vite dev"
73
+ copy_template 'config/vite.config.ts', to: root.join('vite.config.ts')
74
+ append root.join('Procfile.dev'), 'vite: bin/vite dev'
80
75
  setup_app_files
81
76
  ViteRuby.reload_with(config_path: config.config_path)
82
77
  end
83
78
 
84
79
  # Internal: Installs vite and vite-plugin-ruby at the project level.
85
80
  def install_js_dependencies
86
- package_json = root.join("package.json")
87
- unless package_json.exist?
88
- write package_json, <<~JSON
89
- {
90
- "private": true,
91
- "type": "module"
92
- }
93
- JSON
94
- end
95
-
96
- if (JSON.parse(package_json.read)["type"] != "module" rescue nil)
97
- FileUtils.mv root.join("vite.config.ts"), root.join("vite.config.mts"), force: true, verbose: true
98
- end
99
-
100
- install_js_packages js_dependencies.join(" ")
81
+ package_json = root.join('package.json')
82
+ write(package_json, '{}') unless package_json.exist?
83
+ deps = js_dependencies.join(' ')
84
+ run_with_capture("#{ npm_install } -D #{ deps }", stdin_data: "\n")
101
85
  end
102
86
 
103
87
  # Internal: Adds compilation output dirs to git ignore.
104
88
  def install_gitignore
105
- return unless (gitignore_file = root.join(".gitignore")).exist?
89
+ return unless (gitignore_file = root.join('.gitignore')).exist?
106
90
 
107
91
  append(gitignore_file, <<~GITIGNORE)
108
92
 
109
93
  # Vite Ruby
110
- /public/vite*
94
+ /public/vite
95
+ /public/vite-dev
96
+ /public/vite-test
111
97
  node_modules
112
98
  # Vite uses dotenv and suggests to ignore local-only env files. See
113
99
  # https://vitejs.dev/guide/env-and-mode.html#env-files
@@ -127,12 +113,16 @@ private
127
113
  def run_with_capture(*args, **options)
128
114
  Dir.chdir(root) do
129
115
  _, stderr, status = ViteRuby::IO.capture(*args, **options)
130
- say(stderr) unless status.success? || stderr.empty?
116
+ say(stderr) unless status.success? || stderr.to_s.empty?
131
117
  end
132
118
  end
133
119
 
134
- def install_js_packages(deps)
135
- run_with_capture("#{config.package_manager} add -D #{deps}", stdin_data: "\n")
120
+ # Internal: Support all popular package managers.
121
+ def npm_install
122
+ return 'yarn add' if root.join('yarn.lock').exist?
123
+ return 'pnpm install' if root.join('pnpm-lock.yaml').exist?
124
+
125
+ 'npm install'
136
126
  end
137
127
 
138
128
  # Internal: Avoid printing warning about missing vite.json, we will create one.
@@ -144,3 +134,8 @@ private
144
134
  $stderr = old_stderr
145
135
  end
146
136
  end
137
+
138
+ # NOTE: This allows framework-specific variants to extend the installation.
139
+ ViteRuby.framework_libraries.each do |_framework, library|
140
+ require "#{ library.name.tr('-', '/') }/installation"
141
+ end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class ViteRuby::CLI::Upgrade < ViteRuby::CLI::Install
4
- desc "Updates Vite Ruby related gems and npm packages."
4
+ desc 'Updates Vite Ruby related gems and npm packages.'
5
5
 
6
6
  def call(**)
7
7
  upgrade_ruby_gems
@@ -11,15 +11,15 @@ class ViteRuby::CLI::Upgrade < ViteRuby::CLI::Install
11
11
  protected
12
12
 
13
13
  def upgrade_ruby_gems
14
- say "Updating gems"
14
+ say 'Updating gems'
15
15
 
16
16
  libraries = ViteRuby.framework_libraries.map { |_f, library| library.name }
17
17
 
18
- run_with_capture("bundle update #{libraries.join(" ")}")
18
+ run_with_capture("bundle update #{ libraries.join(' ') }")
19
19
  end
20
20
 
21
21
  # NOTE: Spawn a new process so that it uses the updated vite_ruby.
22
22
  def upgrade_npm_packages
23
- Kernel.exec("bundle exec vite upgrade_packages")
23
+ Kernel.exec('bundle exec vite upgrade_packages')
24
24
  end
25
25
  end
@@ -1,10 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class ViteRuby::CLI::UpgradePackages < ViteRuby::CLI::Install
4
- desc "Upgrades the npm packages to the recommended versions."
4
+ desc 'Upgrades the npm packages to the recommended versions.'
5
5
 
6
6
  def call(**)
7
- say "Upgrading npm packages"
8
- install_js_packages js_dependencies.join(" ")
7
+ say 'Upgrading npm packages'
8
+ deps = js_dependencies.join(' ')
9
+ run_with_capture("#{ npm_install } -D #{ deps }")
9
10
  end
10
11
  end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class ViteRuby::CLI::Version < Dry::CLI::Command
4
- desc "Print version"
4
+ desc 'Print version'
5
5
 
6
6
  def call(**)
7
7
  ViteRuby.commands.print_info
@@ -1,35 +1,20 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class ViteRuby::CLI::Vite < Dry::CLI::Command
4
- CURRENT_ENV = ENV["RACK_ENV"] || ENV["RAILS_ENV"]
5
-
6
- def self.executable_options
7
- option(:mode, default: self::DEFAULT_ENV, values: %w[development production test], aliases: ["m"], desc: "The build mode for Vite")
8
- option(:node_options, desc: "Node options for the Vite executable", aliases: ["node-options"])
9
- option(:inspect, desc: "Run Vite in a debugging session with node --inspect-brk", aliases: ["inspect-brk"], type: :boolean)
10
- option(:trace_deprecation, desc: "Run Vite in debugging mode with node --trace-deprecation", aliases: ["trace-deprecation"], type: :boolean)
11
- end
4
+ CURRENT_ENV = ENV['RACK_ENV'] || ENV['RAILS_ENV']
12
5
 
13
6
  def self.shared_options
14
- executable_options
15
- option(:debug, desc: "Run Vite in verbose mode, printing all debugging output", aliases: ["verbose"], type: :boolean)
16
- option(:clobber, desc: "Clear cache and previous builds", type: :boolean, aliases: %w[clean clear])
7
+ option(:mode, default: self::DEFAULT_ENV, values: %w[development production test], aliases: ['m'], desc: 'The build mode for Vite')
8
+ option(:clobber, desc: 'Clear cache and previous builds', type: :boolean, aliases: %w[clean clear])
9
+ option(:debug, desc: 'Run Vite in verbose mode, printing all debugging output', aliases: ['verbose'], type: :boolean)
10
+ option(:inspect, desc: 'Run Vite in a debugging session with node --inspect-brk', aliases: ['inspect-brk'], type: :boolean)
11
+ option(:trace_deprecation, desc: 'Run Vite in debugging mode with node --trace-deprecation', aliases: ['trace-deprecation'], type: :boolean)
17
12
  end
18
13
 
19
- def call(mode:, args: [], clobber: false, node_options: nil, inspect: nil, trace_deprecation: nil, **boolean_opts)
20
- ViteRuby.env["VITE_RUBY_MODE"] = mode
14
+ def call(mode:, args: [], clobber: false, **boolean_opts)
15
+ ViteRuby.env['VITE_RUBY_MODE'] = mode
21
16
  ViteRuby.commands.clobber if clobber
22
-
23
- node_options = [
24
- node_options,
25
- ("--inspect-brk" if inspect),
26
- ("--trace-deprecation" if trace_deprecation),
27
- ].compact.join(" ")
28
-
29
- args << %(--node-options="#{node_options}") unless node_options.empty?
30
-
31
- boolean_opts.map { |name, value| args << "--#{name}" if value }
32
-
17
+ boolean_opts.map { |name, value| args << "--#{ name }" if value }
33
18
  yield(args)
34
19
  end
35
20
  end
data/lib/vite_ruby/cli.rb CHANGED
@@ -1,30 +1,17 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "dry/cli"
3
+ require 'dry/cli'
4
4
 
5
5
  # Public: Command line interface that allows to install the library, and run
6
6
  # simple commands.
7
7
  class ViteRuby::CLI
8
8
  extend Dry::CLI::Registry
9
9
 
10
- register "build", Build, aliases: ["b"]
11
- register "clobber", Clobber, aliases: %w[clean clear]
12
- register "dev", Dev, aliases: %w[d serve]
13
- register "install", Install
14
- register "ssr", SSR
15
- register "version", Version, aliases: ["v", "-v", "--version", "info"]
16
- register "upgrade", Upgrade, aliases: ["update"]
17
- register "upgrade_packages", UpgradePackages, aliases: ["update_packages"]
18
-
19
- # Internal: Allows framework-specific variants to extend the CLI.
20
- def self.require_framework_libraries(path = "cli")
21
- ViteRuby.framework_libraries.each do |_framework, library|
22
- require [library.name.tr("-", "/").to_s, path].compact.join("/")
23
- end
24
- rescue LoadError
25
- require_framework_libraries "installation" unless path == "installation"
26
- end
10
+ register 'build', Build, aliases: ['b']
11
+ register 'clobber', Clobber, aliases: %w[clean clear]
12
+ register 'dev', Dev, aliases: %w[d serve]
13
+ register 'install', Install
14
+ register 'version', Version, aliases: ['v', '-v', '--version', 'info']
15
+ register 'upgrade', Upgrade, aliases: ['update']
16
+ register 'upgrade_packages', UpgradePackages, aliases: ['update_packages']
27
17
  end
28
-
29
- # NOTE: This allows framework-specific variants to extend the CLI.
30
- ViteRuby::CLI.require_framework_libraries("cli")