vite_ruby 1.0.2 → 1.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b2e4a4837608a4f3c936c1a9a8f74fa8a92ea19997899701b285a46f4a97a304
4
- data.tar.gz: 2528a634b5365f702b3c88901423526bef7ac7f408aca224bca30a7d81fe5f53
3
+ metadata.gz: 0b78a801ecceb4a2206fc1429bb297344b8cfa473eb8e54dd2f1e3646444df30
4
+ data.tar.gz: 1630116f09c64c025bedbc3d1623c67c30c8ab5dbe0020d5ebe94b7f0c6be162
5
5
  SHA512:
6
- metadata.gz: af6b4ce0fe79ed2067dcca012a67be1e1c9db860700534ae198ca1e46d2553e84aaa75f4cd357632d5f0b22a07484ad039a5e16c1a9233b8b9bf0bd10c9f992c
7
- data.tar.gz: 35b68110b56caa97c701b7bb7480c8371f9e62cea0868997b6a3ae801d032ac7b455ea6fcc0dae70946f073c3e07160aae83b24d4ca4a985b2344913a751f360
6
+ metadata.gz: 358fb53657d931fea67da39cd2faca5914b7c0787f75125621a7fc92190a8e02e83c71cfbc41e653380c4dd4ace434b45f85b8cbd1d80a8cd9698007585573c7
7
+ data.tar.gz: e767487d9d16afb62d5dc3bcaac4409972b44dea3933b0e75d4fe1344c31d9995dd12b1539fa3d60082053254f63ae943320d02e72304877da15d731ffd24ad4
data/CHANGELOG.md CHANGED
@@ -1,3 +1,55 @@
1
+ ## [1.1.1](https://github.com/ElMassimo/vite_ruby/compare/vite_ruby@1.1.0...vite_ruby@1.1.1) (2021-03-19)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * handle getaddrinfo errors when checking dev server ([#39](https://github.com/ElMassimo/vite_ruby/issues/39)) ([df57d6b](https://github.com/ElMassimo/vite_ruby/commit/df57d6ba5d8ed20e15bd2de3a57c8ff711671d28))
7
+
8
+
9
+
10
+ # [1.1.0](https://github.com/ElMassimo/vite_ruby/compare/vite_ruby@1.0.5...vite_ruby@1.1.0) (2021-03-07)
11
+
12
+
13
+ ### Bug Fixes
14
+
15
+ * Add development mutex in manifest to prevent re-entrant builds ([a6c6976](https://github.com/ElMassimo/vite_ruby/commit/a6c6976ba3821d8d6f26d012de13a440cb91c95b))
16
+ * Allow passing --inspect and other options to the build command ([1818ea4](https://github.com/ElMassimo/vite_ruby/commit/1818ea4f1d211923dfe0c04037baca8b2fd3b991))
17
+
18
+
19
+ ### Features
20
+
21
+ * Record status and timestamp of each build to provide better errors ([a35a64a](https://github.com/ElMassimo/vite_ruby/commit/a35a64ad4ca802da7bb6d5f5139985da864293a4))
22
+ * Stream build output to provide feedback as the command runs ([2bce338](https://github.com/ElMassimo/vite_ruby/commit/2bce33888513f6961da11ddfa9f9c703182abfa6))
23
+
24
+
25
+
26
+ ## [1.0.5](https://github.com/ElMassimo/vite_ruby/compare/vite_ruby@1.0.4...vite_ruby@1.0.5) (2021-03-03)
27
+
28
+
29
+ ### Bug Fixes
30
+
31
+ * Fix installation of JS packages, prevent silent failures (closes [#22](https://github.com/ElMassimo/vite_ruby/issues/22)) ([#23](https://github.com/ElMassimo/vite_ruby/issues/23)) ([d972e6f](https://github.com/ElMassimo/vite_ruby/commit/d972e6f3968988460753e7a831c8e9199bbd6891))
32
+
33
+
34
+
35
+ ## [1.0.4](https://github.com/ElMassimo/vite_ruby/compare/vite_ruby@1.0.3...vite_ruby@1.0.4) (2021-02-25)
36
+
37
+
38
+ ### Features
39
+
40
+ * Create Vite.js integration with Padrino ([#17](https://github.com/ElMassimo/vite_ruby/issues/17)) ([9e9a0a6](https://github.com/ElMassimo/vite_ruby/commit/9e9a0a67abceed0a784d3c2e0554c717d7f5d1d6))
41
+
42
+
43
+
44
+ ## [1.0.3](https://github.com/ElMassimo/vite_ruby/compare/vite_ruby@1.0.2...vite_ruby@1.0.3) (2021-02-25)
45
+
46
+
47
+ ### Bug Fixes
48
+
49
+ * Infer package manager correctly ([09d3036](https://github.com/ElMassimo/vite_ruby/commit/09d303627d6012ead50acd6f814a32521a76927f))
50
+
51
+
52
+
1
53
  ## Vite Ruby 1.0.2 (2020-02-10)
2
54
 
3
55
  - Fix auto-compilation when the dev server is not available.
data/README.md CHANGED
@@ -70,6 +70,8 @@ Please use [Issues] to report bugs you find, and [Discussions] to make feature r
70
70
 
71
71
  Don't hesitate to _⭐️ star the project_ if you find it useful!
72
72
 
73
+ Using it in production? Always love to hear about it! 😃
74
+
73
75
 
74
76
  ## Special Thanks 🙏
75
77
 
data/lib/vite_ruby.rb CHANGED
@@ -17,18 +17,17 @@ class ViteRuby
17
17
  ENV_PREFIX = 'VITE_RUBY'
18
18
 
19
19
  # Internal: Versions used by default when running `vite install`.
20
- DEFAULT_VITE_VERSION = '^2.0.0-beta.65'
21
- DEFAULT_PLUGIN_VERSION = '^1.0.8'
20
+ DEFAULT_VITE_VERSION = '^2.0.3'
21
+ DEFAULT_PLUGIN_VERSION = '^1.0.13'
22
22
 
23
23
  # Internal: Ruby Frameworks that have a companion library for Vite Ruby.
24
- SUPPORTED_FRAMEWORKS = %w[rails hanami roda].freeze
24
+ SUPPORTED_FRAMEWORKS = %w[rails hanami roda padrino sinatra].freeze
25
25
 
26
26
  class << self
27
27
  extend Forwardable
28
28
 
29
29
  def_delegators :instance, :config, :commands, :run_proxy?
30
30
  def_delegators :config, :mode
31
- def_delegators 'ViteRuby::Runner.new', :run
32
31
 
33
32
  def instance
34
33
  @instance ||= ViteRuby.new
@@ -52,6 +51,11 @@ class ViteRuby
52
51
  load File.expand_path('tasks/vite.rake', __dir__)
53
52
  end
54
53
 
54
+ # Internal: Executes the vite binary.
55
+ def run(argv, **options)
56
+ ViteRuby::Runner.new(instance).run(argv, **options)
57
+ end
58
+
55
59
  # Internal: Refreshes the config after setting the env vars.
56
60
  def reload_with(env_vars)
57
61
  env.update(env_vars)
@@ -75,9 +79,6 @@ class ViteRuby
75
79
  end
76
80
  end
77
81
 
78
- extend Forwardable
79
- def_delegators :builder, :build
80
-
81
82
  attr_writer :logger
82
83
 
83
84
  def logger
@@ -93,7 +94,7 @@ class ViteRuby
93
94
  Socket.tcp(config.host, config.port, connect_timeout: config.dev_server_connect_timeout).close
94
95
  @running_at = Time.now
95
96
  true
96
- rescue SystemCallError
97
+ rescue StandardError
97
98
  @running_at = false
98
99
  end
99
100
 
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Internal: Value object with information about the last build.
4
+ ViteRuby::Build = Struct.new(:success, :timestamp, :digest, :current_digest) do
5
+ # Internal: Combines information from a previous build with the current digest.
6
+ def self.from_previous(attrs, current_digest)
7
+ new(attrs['success'], attrs['timestamp'] || 'never', attrs['digest'] || 'none', current_digest)
8
+ end
9
+
10
+ # Internal: Returns true if watched files have changed since the last build.
11
+ def stale?
12
+ digest != current_digest
13
+ end
14
+
15
+ # Internal: Returns true if watched files have not changed since the last build.
16
+ def fresh?
17
+ !stale?
18
+ end
19
+
20
+ # Internal: Returns a new build with the specified result.
21
+ def with_result(success)
22
+ self.class.new(success, Time.now.strftime('%F %T'), current_digest)
23
+ end
24
+
25
+ # Internal: Returns a JSON string with the metadata of the build.
26
+ def to_json(*_args)
27
+ JSON.pretty_generate(to_h)
28
+ end
29
+ end
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'json'
3
4
  require 'digest/sha1'
4
5
 
5
6
  # Public: Keeps track of watched files and triggers builds as needed.
@@ -10,23 +11,22 @@ class ViteRuby::Builder
10
11
 
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
- def build
14
- if stale?
15
- build_with_vite.tap { record_files_digest }
16
- else
17
- logger.debug 'Skipping build. Vite assets are already up-to-date ⚡️'
14
+ def build(*args)
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) }
18
+ elsif last_build.success
19
+ logger.debug "Skipping vite build. Watched files have not changed since the last build at #{ last_build.timestamp }"
18
20
  true
21
+ else
22
+ logger.error "Skipping vite build. Watched files have not changed since the build failed at #{ last_build.timestamp } ❌"
23
+ false
19
24
  end
20
25
  end
21
26
 
22
- # Public: Returns true if all the assets built by Vite are up to date.
23
- def fresh?
24
- previous_files_digest&.== watched_files_digest
25
- end
26
-
27
- # Public: Returns true if any of the assets built by Vite is out of date.
28
- def stale?
29
- !fresh?
27
+ # Internal: Reads the result of the last compilation from disk.
28
+ def last_build_metadata
29
+ ViteRuby::Build.from_previous(last_build_attrs, watched_files_digest)
30
30
  end
31
31
 
32
32
  private
@@ -35,21 +35,22 @@ private
35
35
 
36
36
  def_delegators :@vite_ruby, :config, :logger
37
37
 
38
- # Internal: Writes a digest of the watched files to disk for future checks.
39
- def record_files_digest
40
- config.build_cache_dir.mkpath
41
- files_digest_path.write(watched_files_digest)
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
+ {}
42
43
  end
43
44
 
44
- # Internal: The path of where a digest of the watched files is stored.
45
- def files_digest_path
46
- config.build_cache_dir.join("last-compilation-digest-#{ config.mode }")
45
+ # Internal: Writes a digest of the watched files to disk for future checks.
46
+ def record_build_metadata(success, build)
47
+ config.build_cache_dir.mkpath
48
+ last_build_path.write build.with_result(success).to_json
47
49
  end
48
50
 
49
- # Internal: Reads a digest of watched files from disk.
50
- def previous_files_digest
51
- files_digest_path.read if files_digest_path.exist? && config.manifest_path.exist?
52
- rescue Errno::ENOENT, Errno::ENOTDIR
51
+ # Internal: The file path where metadata of the last build is stored.
52
+ def last_build_path
53
+ config.build_cache_dir.join("last-build-#{ config.mode }.json")
53
54
  end
54
55
 
55
56
  # Internal: Returns a digest of all the watched files, allowing to detect
@@ -65,11 +66,11 @@ private
65
66
  # Public: Initiates a Vite build command to generate assets.
66
67
  #
67
68
  # Returns true if the build is successful, or false if it failed.
68
- def build_with_vite
69
+ def build_with_vite(*args)
69
70
  logger.info 'Building with Vite ⚡️'
70
71
 
71
- stdout, stderr, status = ViteRuby.run(['build'], capture: true)
72
- log_build_result(stdout, stderr, status)
72
+ stdout, stderr, status = ViteRuby.run(['build', *args], capture: true)
73
+ log_build_result(stdout, stderr.to_s, status)
73
74
 
74
75
  status.success?
75
76
  end
@@ -77,14 +78,14 @@ private
77
78
  # Internal: Outputs the build results.
78
79
  #
79
80
  # NOTE: By default it also outputs the manifest entries.
80
- def log_build_result(stdout, stderr, status)
81
+ def log_build_result(_stdout, stderr, status)
81
82
  if status.success?
82
83
  logger.info "Build with Vite complete: #{ config.build_output_dir }"
83
- logger.error(stderr.to_s) unless stderr.empty?
84
- logger.info(stdout) unless config.hide_build_console_output
84
+ logger.error stderr.to_s unless stderr.empty?
85
85
  else
86
- non_empty_streams = [stdout, stderr].delete_if(&:empty?)
87
- logger.error "Build with Vite failed:\n#{ non_empty_streams.join("\n\n") }"
86
+ logger.error stderr
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')
88
89
  end
89
90
  end
90
91
 
@@ -96,7 +97,11 @@ private
96
97
  *config.watch_additional_paths,
97
98
  "#{ config.source_code_dir }/**/*",
98
99
  'yarn.lock',
100
+ 'package-lock.json',
101
+ 'pnpm-lock.yaml',
99
102
  'package.json',
103
+ 'vite.config.ts',
104
+ 'vite.config.js',
100
105
  config.config_path,
101
106
  ].freeze
102
107
  end
@@ -5,14 +5,19 @@ class ViteRuby::CLI::Build < Dry::CLI::Command
5
5
  DEFAULT_ENV = CURRENT_ENV || 'production'
6
6
 
7
7
  def self.shared_options
8
- option(:mode, default: self::DEFAULT_ENV, values: %w[development production], aliases: ['m'], desc: 'The build mode for Vite.')
8
+ option(:mode, default: self::DEFAULT_ENV, values: %w[development production], aliases: ['m'], desc: 'The build mode for Vite')
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)
9
12
  end
10
13
 
11
14
  desc 'Bundle all entrypoints using Vite.'
12
15
  shared_options
16
+ option(:force, desc: 'Force the build even if assets have not changed', type: :boolean)
13
17
 
14
- def call(mode:)
18
+ def call(mode:, args: [], **boolean_opts)
15
19
  ViteRuby.env['VITE_RUBY_MODE'] = mode
16
- block_given? ? yield(mode) : ViteRuby.commands.build_from_task
20
+ boolean_opts.map { |name, value| args << "--#{ name }" if value }
21
+ block_given? ? yield(args) : ViteRuby.commands.build_from_task(*args)
17
22
  end
18
23
  end
@@ -5,8 +5,9 @@ class ViteRuby::CLI::Dev < ViteRuby::CLI::Build
5
5
 
6
6
  desc 'Start the Vite development server.'
7
7
  shared_options
8
+ option(:force, desc: 'Force Vite to re-bundle dependencies', type: :boolean)
8
9
 
9
- def call(mode:, args: [])
10
- super(mode: mode) { ViteRuby.run(args) }
10
+ def call(**options)
11
+ super { |args| ViteRuby.run(args) }
11
12
  end
12
13
  end
@@ -75,7 +75,7 @@ private
75
75
  write(package_json, '{}') unless package_json.exist?
76
76
  Dir.chdir(root) do
77
77
  deps = "vite@#{ ViteRuby::DEFAULT_VITE_VERSION } vite-plugin-ruby@#{ ViteRuby::DEFAULT_PLUGIN_VERSION }"
78
- stdout, stderr, status = Open3.capture3({ 'CI' => 'true' }, "npx ni -D #{ deps }")
78
+ stdout, stderr, status = Open3.capture3({ 'CI' => 'true' }, "npx --package @antfu/ni -- ni -D #{ deps }")
79
79
  stdout, stderr, = Open3.capture3({}, "yarn add -D #{ deps }") unless status.success?
80
80
  say(stdout, "\n", stderr)
81
81
  end
@@ -8,17 +8,17 @@ class ViteRuby::Commands
8
8
  end
9
9
 
10
10
  # Public: Defaults to production, and exits if the build fails.
11
- def build_from_task
11
+ def build_from_task(*args)
12
12
  with_node_env(ENV.fetch('NODE_ENV', 'production')) {
13
13
  ensure_log_goes_to_stdout {
14
- build || exit!
14
+ build(*args) || exit!
15
15
  }
16
16
  }
17
17
  end
18
18
 
19
19
  # Public: Builds all assets that are managed by Vite, from the entrypoints.
20
- def build
21
- builder.build.tap { manifest.refresh }
20
+ def build(*args)
21
+ builder.build(*args).tap { manifest.refresh }
22
22
  end
23
23
 
24
24
  # Public: Removes all build cache and previously compiled assets.
@@ -69,6 +69,7 @@ class ViteRuby::Commands
69
69
  def verify_install
70
70
  unless File.exist?(config.root.join('bin/vite'))
71
71
  warn <<~WARN
72
+
72
73
  vite binstub not found.
73
74
  Have you run `bundle binstub vite`?
74
75
  Make sure the bin directory and bin/vite are not included in .gitignore
@@ -78,6 +79,7 @@ class ViteRuby::Commands
78
79
  config_path = config.root.join(config.config_path)
79
80
  unless config_path.exist?
80
81
  warn <<~WARN
82
+
81
83
  Configuration #{ config_path } file for vite-plugin-ruby not found.
82
84
  Make sure `bundle exec vite install` has run successfully before running dependent tasks.
83
85
  WARN
@@ -88,7 +90,7 @@ class ViteRuby::Commands
88
90
  # Internal: Prints information about ViteRuby's environment.
89
91
  def print_info
90
92
  Dir.chdir(config.root) do
91
- $stdout.puts "Is bin/vite present?: #{ File.exist? 'bin/vite' }"
93
+ $stdout.puts "bin/vite present?: #{ File.exist? 'bin/vite' }"
92
94
 
93
95
  $stdout.puts "vite_ruby: #{ ViteRuby::VERSION }"
94
96
  ViteRuby.framework_libraries.each do |framework, library|
@@ -98,11 +100,14 @@ class ViteRuby::Commands
98
100
 
99
101
  $stdout.puts "node: #{ `node --version` }"
100
102
  $stdout.puts "npm: #{ `npm --version` }"
101
- $stdout.puts "yarn: #{ `yarn --version` }"
103
+ $stdout.puts "yarn: #{ `yarn --version` rescue nil }"
104
+ $stdout.puts "pnpm: #{ `pnpm --version` rescue nil }"
102
105
  $stdout.puts "ruby: #{ `ruby --version` }"
103
106
 
104
107
  $stdout.puts "\n"
105
- $stdout.puts "vite-plugin-ruby: \n#{ `npm list vite-plugin-ruby version` }"
108
+ packages = `npm ls vite vite-plugin-ruby`
109
+ packages_msg = packages.include?('vite@') ? "installed packages:\n#{ packages }" : '❌ Check that vite and vite-plugin-ruby have been added as development dependencies and installed.'
110
+ $stdout.puts packages_msg
106
111
  end
107
112
  end
108
113
 
@@ -144,10 +149,12 @@ private
144
149
  end
145
150
 
146
151
  def ensure_log_goes_to_stdout
147
- old_logger = logger
148
- self.logger = Logger.new($stdout)
152
+ old_logger, original_sync = logger, $stdout.sync
153
+
154
+ $stdout.sync = true
155
+ self.logger = Logger.new($stdout, formatter: proc { |_, _, progname, msg| progname == 'vite' ? msg : "#{ msg }\n" })
149
156
  yield
150
157
  ensure
151
- self.logger = old_logger
158
+ self.logger, $stdout.sync = old_logger, original_sync
152
159
  end
153
160
  end
@@ -9,7 +9,7 @@ class ViteRuby::DevServerProxy < Rack::Proxy
9
9
 
10
10
  def initialize(app = nil, options = {})
11
11
  @vite_ruby = options.delete(:vite_ruby) || ViteRuby.instance
12
- options[:streaming] = false if ViteRuby.mode == 'test' && !options.key?(:streaming)
12
+ options[:streaming] = false if config.mode == 'test' && !options.key?(:streaming)
13
13
  super
14
14
  end
15
15
 
@@ -39,6 +39,7 @@ private
39
39
 
40
40
  def forward_to_vite_dev_server(env)
41
41
  rewrite_uri_for_vite(env)
42
+ env['QUERY_STRING'] ||= ''
42
43
  env['HTTP_HOST'] = env['HTTP_X_FORWARDED_HOST'] = config.host
43
44
  env['HTTP_X_FORWARDED_SERVER'] = config.host_with_port
44
45
  env['HTTP_PORT'] = env['HTTP_X_FORWARDED_PORT'] = config.port.to_s
@@ -15,6 +15,7 @@ class ViteRuby::Manifest
15
15
 
16
16
  def initialize(vite_ruby)
17
17
  @vite_ruby = vite_ruby
18
+ @build_mutex = Mutex.new if config.auto_build
18
19
  end
19
20
 
20
21
  # Public: Returns the path for the specified Vite entrypoint file.
@@ -65,7 +66,7 @@ protected
65
66
  # manifest.lookup('calendar.js')
66
67
  # => { "file" => "/vite/assets/calendar-1016838bab065ae1e122.js", "imports" => [] }
67
68
  def lookup(name, type: nil)
68
- build if should_build?
69
+ @build_mutex.synchronize { builder.build } if should_build?
69
70
 
70
71
  find_manifest_entry(with_file_extension(name, type))
71
72
  end
@@ -74,7 +75,7 @@ private
74
75
 
75
76
  extend Forwardable
76
77
 
77
- def_delegators :@vite_ruby, :config, :build, :dev_server_running?
78
+ def_delegators :@vite_ruby, :config, :builder, :dev_server_running?
78
79
 
79
80
  # NOTE: Auto compilation is convenient when running tests, when the developer
80
81
  # won't focus on the frontend, or when running the Vite server is not desired.
@@ -142,27 +143,38 @@ private
142
143
  # Internal: Raises a detailed message when an entry is missing in the manifest.
143
144
  def missing_entry_error(name, type: nil, **_options)
144
145
  file_name = with_file_extension(name, type)
146
+ last_build = builder.last_build_metadata
145
147
  raise ViteRuby::Manifest::MissingEntryError, <<~MSG
146
- Vite Ruby can't find #{ file_name } in #{ config.manifest_path } or #{ config.assets_manifest_path }.
148
+ Vite Ruby can't find #{ file_name } in #{ config.manifest_path.relative_path_from(config.root) } or #{ config.assets_manifest_path.relative_path_from(config.root) }.
147
149
 
148
150
  Possible causes:
149
- #{ missing_entry_causes.map { |cause| "\t- #{ cause }" }.join("\n") }
150
-
151
- Content in your manifests:
152
- #{ JSON.pretty_generate(@manifest) }
151
+ #{ possible_causes(last_build) }
152
+ Visit the Troubleshooting guide for more information:
153
+ https://vite-ruby.netlify.app/guide/troubleshooting.html#troubleshooting
154
+ #{ "\nContent in your manifests:\n#{ JSON.pretty_generate(@manifest) }\n" if last_build.success }
155
+ #{ "\nLast build in #{ config.mode } mode:\n#{ last_build.to_json }\n" unless last_build.success.nil? }
153
156
  MSG
154
157
  end
155
158
 
156
- def missing_entry_causes
157
- local = config.auto_build
158
- [
159
- (dev_server_running? && 'Vite has not yet re-built your latest changes.'),
160
- (local && !dev_server_running? && "\"autoBuild\": false in your #{ config.mode } configuration."),
161
- (local && !dev_server_running? && 'The Vite development server has crashed or is no longer available.'),
162
- 'You have misconfigured config/vite.json file.',
163
- (!local && 'Assets have not been precompiled'),
164
- ].select(&:itself)
165
- rescue StandardError
166
- []
159
+ def possible_causes(last_build)
160
+ return FAILED_BUILD_CAUSES if last_build.success == false
161
+ return DEFAULT_CAUSES if config.auto_build
162
+
163
+ DEFAULT_CAUSES + NO_AUTO_BUILD_CAUSES
167
164
  end
165
+
166
+ FAILED_BUILD_CAUSES = <<-MSG
167
+ - The last build failed. Try running `bin/vite build --force` manually and check for errors.
168
+ MSG
169
+
170
+ DEFAULT_CAUSES = <<-MSG
171
+ - The file path is incorrect.
172
+ - The file is not in the entrypoints directory.
173
+ - Some files are outside the sourceCodeDir, and have not been added to watchAdditionalPaths.
174
+ MSG
175
+
176
+ NO_AUTO_BUILD_CAUSES = <<-MSG
177
+ - You have not run `bin/vite dev` to start Vite, or the dev server is not reachable.
178
+ - "autoBuild" is set to `false` in your config/vite.json for this environment.
179
+ MSG
168
180
  end
@@ -4,54 +4,61 @@ require 'open3'
4
4
 
5
5
  # Public: Executes Vite commands, providing conveniences for debugging.
6
6
  class ViteRuby::Runner
7
- # Public: Executes Vite with the specified arguments.
8
- def run(argv, **options)
9
- $stdout.sync = true
10
- detect_unsupported_switches!(argv)
11
- execute_command(argv.clone, **options)
12
- end
13
-
14
- private
15
-
16
- UNSUPPORTED_SWITCHES = %w[--host --port --https --root -r --config -c].freeze
17
-
18
- # Internal: Allows to prevent configuration mistakes by ensuring the Ruby app
19
- # and vite-plugin-ruby are using the same configuration for the dev server.
20
- def detect_unsupported_switches!(args)
21
- return unless (unsupported = UNSUPPORTED_SWITCHES & args).any?
22
-
23
- $stdout.puts "Please set the following switches in your vite.json instead: #{ unsupported }."
24
- exit!
7
+ def initialize(vite_ruby)
8
+ @vite_ruby = vite_ruby
25
9
  end
26
10
 
27
- # Internal: Executes the command with the specified arguments.
28
- def execute_command(args, capture: false)
11
+ # Public: Executes Vite with the specified arguments.
12
+ def run(argv, capture: false)
29
13
  if capture
30
- Open3.capture3(*command_for(args), chdir: ViteRuby.config.root)
14
+ capture3_with_output(*command_for(argv), chdir: config.root)
31
15
  else
32
- Dir.chdir(ViteRuby.config.root) { Kernel.exec(*command_for(args)) }
16
+ Dir.chdir(config.root) { Kernel.exec(*command_for(argv)) }
33
17
  end
34
18
  end
35
19
 
20
+ private
21
+
22
+ extend Forwardable
23
+
24
+ def_delegators :@vite_ruby, :config, :logger
25
+
36
26
  # Internal: Returns an Array with the command to run.
37
27
  def command_for(args)
38
- [vite_env].tap do |cmd|
39
- cmd.append('node', '--inspect-brk') if args.include?('--debug')
40
- cmd.append('node', '--trace-deprecation') if args.delete('--trace-deprecation')
28
+ [config.to_env].tap do |cmd|
29
+ args = args.clone
30
+ cmd.append('node', '--inspect-brk') if args.delete('--inspect')
31
+ cmd.append('node', '--trace-deprecation') if args.delete('--trace_deprecation')
41
32
  cmd.append(*vite_executable(cmd))
42
33
  cmd.append(*args)
43
- cmd.append('--mode', ViteRuby.mode) unless args.include?('--mode') || args.include?('-m')
34
+ cmd.append('--mode', config.mode) unless args.include?('--mode') || args.include?('-m')
44
35
  end
45
36
  end
46
37
 
47
- # Internal: The environment variables to pass to the command.
48
- def vite_env
49
- ViteRuby.config.to_env
50
- end
51
-
52
38
  # Internal: Resolves to an executable for Vite.
53
39
  def vite_executable(cmd)
54
- npx = cmd.include?('node') ? `which npx`.chomp("\n") : 'npx' rescue 'npx'
55
- [npx, 'vite']
40
+ cmd.include?('node') ? ['./node_modules/.bin/vite'] : ['npx', '--no-install', '--', 'vite']
41
+ end
42
+
43
+ # Internal: A modified version of capture3 that continuosly prints stdout.
44
+ # NOTE: This improves the experience of running bin/vite build.
45
+ def capture3_with_output(*cmd, **opts)
46
+ return Open3.capture3(*cmd, opts) if config.hide_build_console_output
47
+
48
+ Open3.popen3(*cmd, opts) { |_stdin, stdout, stderr, wait_threads|
49
+ out = Thread.new { read_lines(stdout) { |l| logger.info('vite') { l } } }
50
+ err = Thread.new { stderr.read }
51
+ [out.value, err.value, wait_threads.value]
52
+ }
53
+ end
54
+
55
+ # Internal: Reads and yield every line in the stream. Returns the full content.
56
+ def read_lines(io)
57
+ buffer = +''
58
+ while line = io.gets
59
+ buffer << line
60
+ yield line
61
+ end
62
+ buffer
56
63
  end
57
64
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class ViteRuby
4
- VERSION = '1.0.2'
4
+ VERSION = '1.1.1'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vite_ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ version: 1.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Máximo Mussini
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-02-10 00:00:00.000000000 Z
11
+ date: 2021-03-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dry-cli
@@ -28,6 +28,9 @@ dependencies:
28
28
  name: rack-proxy
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.6'
31
34
  - - ">="
32
35
  - !ruby/object:Gem::Version
33
36
  version: 0.6.1
@@ -35,6 +38,9 @@ dependencies:
35
38
  prerelease: false
36
39
  version_requirements: !ruby/object:Gem::Requirement
37
40
  requirements:
41
+ - - "~>"
42
+ - !ruby/object:Gem::Version
43
+ version: '0.6'
38
44
  - - ">="
39
45
  - !ruby/object:Gem::Version
40
46
  version: 0.6.1
@@ -42,58 +48,156 @@ dependencies:
42
48
  name: zeitwerk
43
49
  requirement: !ruby/object:Gem::Requirement
44
50
  requirements:
45
- - - ">="
51
+ - - "~>"
46
52
  - !ruby/object:Gem::Version
47
- version: '0'
53
+ version: '2.2'
48
54
  type: :runtime
49
55
  prerelease: false
50
56
  version_requirements: !ruby/object:Gem::Requirement
51
57
  requirements:
52
- - - ">="
58
+ - - "~>"
53
59
  - !ruby/object:Gem::Version
54
- version: '0'
60
+ version: '2.2'
55
61
  - !ruby/object:Gem::Dependency
56
- name: bundler
62
+ name: m
57
63
  requirement: !ruby/object:Gem::Requirement
58
64
  requirements:
59
- - - ">="
65
+ - - "~>"
60
66
  - !ruby/object:Gem::Version
61
- version: 1.3.0
67
+ version: '1.5'
62
68
  type: :development
63
69
  prerelease: false
64
70
  version_requirements: !ruby/object:Gem::Requirement
65
71
  requirements:
66
- - - ">="
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '1.5'
75
+ - !ruby/object:Gem::Dependency
76
+ name: minitest
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '5.0'
82
+ type: :development
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
67
87
  - !ruby/object:Gem::Version
68
- version: 1.3.0
88
+ version: '5.0'
89
+ - !ruby/object:Gem::Dependency
90
+ name: minitest-reporters
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: '1.4'
96
+ type: :development
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: '1.4'
103
+ - !ruby/object:Gem::Dependency
104
+ name: minitest-stub_any_instance
105
+ requirement: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: '1.0'
110
+ type: :development
111
+ prerelease: false
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - "~>"
115
+ - !ruby/object:Gem::Version
116
+ version: '1.0'
117
+ - !ruby/object:Gem::Dependency
118
+ name: pry-byebug
119
+ requirement: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - "~>"
122
+ - !ruby/object:Gem::Version
123
+ version: '3.9'
124
+ type: :development
125
+ prerelease: false
126
+ version_requirements: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - "~>"
129
+ - !ruby/object:Gem::Version
130
+ version: '3.9'
131
+ - !ruby/object:Gem::Dependency
132
+ name: rake
133
+ requirement: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - "~>"
136
+ - !ruby/object:Gem::Version
137
+ version: '13.0'
138
+ type: :development
139
+ prerelease: false
140
+ version_requirements: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - "~>"
143
+ - !ruby/object:Gem::Version
144
+ version: '13.0'
69
145
  - !ruby/object:Gem::Dependency
70
146
  name: rubocop
71
147
  requirement: !ruby/object:Gem::Requirement
72
148
  requirements:
73
- - - ">="
149
+ - - "~>"
74
150
  - !ruby/object:Gem::Version
75
- version: '0'
151
+ version: '1.9'
76
152
  type: :development
77
153
  prerelease: false
78
154
  version_requirements: !ruby/object:Gem::Requirement
79
155
  requirements:
80
- - - ">="
156
+ - - "~>"
81
157
  - !ruby/object:Gem::Version
82
- version: '0'
158
+ version: '1.9'
159
+ - !ruby/object:Gem::Dependency
160
+ name: rubocop-minitest
161
+ requirement: !ruby/object:Gem::Requirement
162
+ requirements:
163
+ - - "~>"
164
+ - !ruby/object:Gem::Version
165
+ version: '0.10'
166
+ type: :development
167
+ prerelease: false
168
+ version_requirements: !ruby/object:Gem::Requirement
169
+ requirements:
170
+ - - "~>"
171
+ - !ruby/object:Gem::Version
172
+ version: '0.10'
83
173
  - !ruby/object:Gem::Dependency
84
174
  name: rubocop-performance
85
175
  requirement: !ruby/object:Gem::Requirement
86
176
  requirements:
87
- - - ">="
177
+ - - "~>"
88
178
  - !ruby/object:Gem::Version
89
- version: '0'
179
+ version: '1.9'
90
180
  type: :development
91
181
  prerelease: false
92
182
  version_requirements: !ruby/object:Gem::Requirement
93
183
  requirements:
94
- - - ">="
184
+ - - "~>"
185
+ - !ruby/object:Gem::Version
186
+ version: '1.9'
187
+ - !ruby/object:Gem::Dependency
188
+ name: simplecov
189
+ requirement: !ruby/object:Gem::Requirement
190
+ requirements:
191
+ - - "<"
192
+ - !ruby/object:Gem::Version
193
+ version: '0.18'
194
+ type: :development
195
+ prerelease: false
196
+ version_requirements: !ruby/object:Gem::Requirement
197
+ requirements:
198
+ - - "<"
95
199
  - !ruby/object:Gem::Version
96
- version: '0'
200
+ version: '0.18'
97
201
  description:
98
202
  email:
99
203
  - maximomussini@gmail.com
@@ -103,13 +207,13 @@ extensions: []
103
207
  extra_rdoc_files: []
104
208
  files:
105
209
  - CHANGELOG.md
106
- - CONTRIBUTING.md
107
210
  - LICENSE.txt
108
211
  - README.md
109
212
  - default.vite.json
110
213
  - exe/vite
111
214
  - lib/tasks/vite.rake
112
215
  - lib/vite_ruby.rb
216
+ - lib/vite_ruby/build.rb
113
217
  - lib/vite_ruby/builder.rb
114
218
  - lib/vite_ruby/cli.rb
115
219
  - lib/vite_ruby/cli/build.rb
@@ -129,8 +233,8 @@ homepage: https://github.com/ElMassimo/vite_ruby
129
233
  licenses:
130
234
  - MIT
131
235
  metadata:
132
- source_code_uri: https://github.com/ElMassimo/vite_ruby/tree/vite_ruby@1.0.2/vite_ruby
133
- changelog_uri: https://github.com/ElMassimo/vite_ruby/blob/vite_ruby@1.0.2/vite_ruby/CHANGELOG.md
236
+ source_code_uri: https://github.com/ElMassimo/vite_ruby/tree/vite_ruby@1.1.1/vite_ruby
237
+ changelog_uri: https://github.com/ElMassimo/vite_ruby/blob/vite_ruby@1.1.1/vite_ruby/CHANGELOG.md
134
238
  post_install_message:
135
239
  rdoc_options: []
136
240
  require_paths:
data/CONTRIBUTING.md DELETED
@@ -1,33 +0,0 @@
1
- ## Setting Up a Development Environment
2
-
3
- 1. Install [Yarn](https://yarnpkg.com/)
4
-
5
- 2. Run the following commands to set up the development environment.
6
-
7
- ```
8
- bundle install
9
- ```
10
-
11
- ## Making sure your changes pass all tests
12
- There are a number of automated checks which run on GitHub Actions when a pull request is created.
13
- You can run those checks on your own locally to make sure that your changes would not break the CI build.
14
-
15
- ### 1. Check the code for JavaScript style violations
16
- ```
17
- yarn lint
18
- ```
19
-
20
- ### 2. Check the code for Ruby style violations
21
- ```
22
- bundle exec rubocop
23
- ```
24
-
25
- ### 3. Run the JavaScript test suite
26
- ```
27
- yarn test
28
- ```
29
-
30
- ### 4. Run the Ruby test suite
31
- ```
32
- bundle exec rake test
33
- ```