diff --git a/CHANGELOG.md b/CHANGELOG.md index 738f818d0e..d50625a18a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,8 @@ Changes since the last non-beta release. - **Attribution Comment**: Added HTML comment attribution to Rails views containing React on Rails functionality. The comment automatically displays which version is in use (open source React on Rails or React on Rails Pro) and, for Pro users, shows the license status. This helps identify React on Rails usage across your application. [PR #1857](https://github.com/shakacode/react_on_rails/pull/1857) by [AbanoubGhadban](https://github.com/AbanoubGhadban). +- **Improved Error Messages**: Error messages for version mismatches and package configuration issues now include package-manager-specific installation commands (npm, yarn, pnpm, bun). [PR #1881](https://github.com/shakacode/react_on_rails/pull/1881) by [AbanoubGhadban](https://github.com/AbanoubGhadban). + #### Breaking Changes - **React on Rails Core Package**: Several Pro-only methods have been removed from the core package and are now exclusively available in the `react-on-rails-pro` package. If you're using any of the following methods, you'll need to migrate to React on Rails Pro: @@ -106,6 +108,14 @@ To migrate to React on Rails Pro: These helpers are now defined exclusively in the `react-on-rails-pro` gem. +- **Strict Version Validation at Boot Time**: Applications now fail to boot (instead of logging warnings) when package.json is misconfigured with wrong versions, missing packages, or semver wildcards. Users must use exact versions in package.json (no ^, ~, >, <, \* operators). **Migration**: Update package.json to use exact versions matching installed gem (e.g., `"16.1.1"` not `"^16.1.1"`). [PR #1881](https://github.com/shakacode/react_on_rails/pull/1881) by [AbanoubGhadban](https://github.com/AbanoubGhadban). + +- **Node Renderer Version Validation** (Pro users only): Remote node renderer now validates gem version at request time. Version mismatches in development return 412 Precondition Failed (production allows with warning). **Migration**: Ensure react_on_rails_pro gem and @shakacode-tools/react-on-rails-pro-node-renderer package versions match. [PR #1881](https://github.com/shakacode/react_on_rails/pull/1881) by [AbanoubGhadban](https://github.com/AbanoubGhadban). + +#### Security + +- **Command Injection Protection**: Added security hardening to prevent potential command injection in package manager commands. [PR #1881](https://github.com/shakacode/react_on_rails/pull/1881) by [AbanoubGhadban](https://github.com/AbanoubGhadban). + ### [16.1.1] - 2025-09-24 #### Bug Fixes diff --git a/docs/contributor-info/releasing.md b/docs/contributor-info/releasing.md index c10a847f54..1c1833d070 100644 --- a/docs/contributor-info/releasing.md +++ b/docs/contributor-info/releasing.md @@ -1,6 +1,6 @@ # Install and Release -We're releasing this as a combined Ruby gem plus two NPM packages. We keep the version numbers in sync across all packages. +We're releasing this as a unified release with 5 packages total. We keep the version numbers in sync across all packages using unified versioning. ## Testing the Gem before Release from a Rails App @@ -13,41 +13,79 @@ Run `rake -D release` to see instructions on how to release via the rake task. ### Release Command ```bash -rake release[gem_version,dry_run] +rake release[version,dry_run,registry,skip_push] ``` **Arguments:** -- `gem_version`: The new version in rubygem format (no dashes). Pass no argument to automatically perform a patch version bump. -- `dry_run`: Optional. Pass `true` to see what would happen without actually releasing. +1. **`version`** (required): Version bump type or explicit version -**Example:** + - Bump types: `patch`, `minor`, `major` + - Explicit: `16.2.0` + - Pre-release: `16.2.0.beta.1` (rubygem format with dots, converted to `16.2.0-beta.1` for NPM) + +2. **`dry_run`** (optional): `true` to preview changes without releasing + + - Default: `false` + +3. **`registry`** (optional): Publishing registry for testing + + - `verdaccio`: Publish all NPM packages to local Verdaccio (skips RubyGems) + - `npm`: Normal release to npmjs.org + rubygems.org (default) + +4. **`skip_push`** (optional): Skip git push to remote + - `skip_push`: Don't push commits/tags to remote + - Default: pushes to remote + +**Examples:** ```bash -rake release[16.2.0] # Release version 16.2.0 -rake release[16.2.0,true] # Dry run to preview changes -rake release # Auto-bump patch version +rake release[patch] # Bump patch version (16.1.1 → 16.1.2) +rake release[minor] # Bump minor version (16.1.1 → 16.2.0) +rake release[major] # Bump major version (16.1.1 → 17.0.0) +rake release[16.2.0] # Set explicit version +rake release[16.2.0.beta.1] # Set pre-release version (→ 16.2.0-beta.1 for NPM) +rake release[16.2.0,true] # Dry run to preview changes +rake release[16.2.0,false,verdaccio] # Test with local Verdaccio +rake release[patch,false,npm,skip_push] # Release but don't push to GitHub ``` ### What Gets Released -The release task publishes three packages with the same version number: +The release task publishes 5 packages with unified versioning: -1. **react-on-rails** NPM package -2. **react-on-rails-pro** NPM package -3. **react_on_rails** Ruby gem +**PUBLIC (npmjs.org + rubygems.org):** + +1. **react-on-rails** - NPM package +2. **react-on-rails-pro** - NPM package +3. **react_on_rails** - RubyGem + +**PRIVATE (GitHub Packages):** 4. **@shakacode-tools/react-on-rails-pro-node-renderer** - NPM package 5. **react_on_rails_pro** - RubyGem ### Version Synchronization The task updates versions in all the following files: -- `lib/react_on_rails/version.rb` (source of truth) +**Core package:** + +- `lib/react_on_rails/version.rb` (source of truth for all packages) - `package.json` (root workspace) - `packages/react-on-rails/package.json` -- `packages/react-on-rails-pro/package.json` (both version field and react-on-rails dependency) +- `Gemfile.lock` (root) - `spec/dummy/Gemfile.lock` -**Note:** The `react-on-rails-pro` package declares an exact version dependency on `react-on-rails` (e.g., `"react-on-rails": "16.2.0"`). This ensures users install compatible versions of both packages. +**Pro package:** + +- `react_on_rails_pro/lib/react_on_rails_pro/version.rb` (VERSION only, not PROTOCOL_VERSION) +- `react_on_rails_pro/package.json` (node-renderer) +- `packages/react-on-rails-pro/package.json` (+ dependency version) +- `react_on_rails_pro/Gemfile.lock` +- `react_on_rails_pro/spec/dummy/Gemfile.lock` + +**Note:** + +- `react_on_rails_pro.gemspec` dynamically references `ReactOnRails::VERSION` +- `react-on-rails-pro` NPM dependency is pinned to exact version (e.g., `"react-on-rails": "16.2.0"`) ### Pre-release Versions @@ -107,14 +145,85 @@ After a successful release, you'll see instructions to: ## Requirements -This task depends on the `gem-release` Ruby gem, which is installed via `bundle install`. +### NPM Publishing + +You must be logged in and have publish permissions: -For NPM publishing, you must be logged in to npm and have publish permissions for both packages: +**For public packages (npmjs.org):** ```bash npm login ``` +**For private packages (GitHub Packages):** + +- Get a GitHub personal access token with `write:packages` scope +- Add to `~/.npmrc`: + ```ini + //npm.pkg.github.com/:_authToken= + always-auth=true + ``` +- Set environment variable: + ```bash + export GITHUB_TOKEN= + ``` + +### RubyGems Publishing + +**For public gem (rubygems.org):** + +- Standard RubyGems credentials via `gem push` + +**For private gem (GitHub Packages):** + +- Add to `~/.gem/credentials`: + ``` + :github: Bearer + ``` + +### Ruby Version Management + +The script automatically detects and switches Ruby versions when needed: + +- Supports: RVM, rbenv, asdf +- Set via `RUBY_VERSION_MANAGER` environment variable (default: `rvm`) +- Example: Pro dummy app requires Ruby 3.3.7, script auto-switches from 3.3.0 + +### Dependencies + +This task depends on the `gem-release` Ruby gem, which is installed via `bundle install`. + +## Testing with Verdaccio + +Before releasing to production, test the release process locally: + +1. Install and start Verdaccio: + + ```bash + npm install -g verdaccio + verdaccio + ``` + +2. Run release with verdaccio registry: + + ```bash + rake release[patch,false,verdaccio] + ``` + +3. This will: + + - Publish all 3 NPM packages to local Verdaccio + - Skip RubyGem publishing + - Update version files (revert manually after testing) + +4. Test installing from Verdaccio: + ```bash + npm set registry http://localhost:4873/ + npm install react-on-rails@16.2.0 + # Reset when done: + npm config delete registry + ``` + ## Troubleshooting ### Dry Run First diff --git a/lib/react_on_rails/engine.rb b/lib/react_on_rails/engine.rb index a6565b842f..6369839f0f 100644 --- a/lib/react_on_rails/engine.rb +++ b/lib/react_on_rails/engine.rb @@ -4,8 +4,17 @@ module ReactOnRails class Engine < ::Rails::Engine + # Validate package versions and compatibility on Rails startup + # This ensures the application fails fast if versions don't match or packages are misconfigured + initializer "react_on_rails.validate_version_and_package_compatibility" do + config.after_initialize do + Rails.logger.info "[React on Rails] Validating package version and compatibility..." + VersionChecker.build.validate_version_and_package_compatibility! + Rails.logger.info "[React on Rails] Package validation successful" + end + end + config.to_prepare do - VersionChecker.build.log_if_gem_and_node_package_versions_differ ReactOnRails::ServerRenderingPool.reset_pool end diff --git a/lib/react_on_rails/utils.rb b/lib/react_on_rails/utils.rb index b95c5dbea8..fa96692f86 100644 --- a/lib/react_on_rails/utils.rb +++ b/lib/react_on_rails/utils.rb @@ -5,6 +5,7 @@ require "rainbow" require "active_support" require "active_support/core_ext/string" +require "shellwords" # rubocop:disable Metrics/ModuleLength module ReactOnRails @@ -283,6 +284,125 @@ def self.prepend_to_file_if_text_not_present(file:, text_to_prepend:, regex:) puts "Prepended\n#{text_to_prepend}to #{file}." end + # Detects which package manager is being used. + # First checks the packageManager field in package.json (Node.js Corepack standard), + # then falls back to checking for lock files. + # + # @return [Symbol] The package manager symbol (:npm, :yarn, :pnpm, :bun) + def self.detect_package_manager + manager = detect_package_manager_from_package_json || detect_package_manager_from_lock_files + manager || :yarn # Default to yarn if no detection succeeds + end + + # Validates package_name input to prevent command injection + # + # @param package_name [String] The package name to validate + # @raise [ReactOnRails::Error] if package_name contains potentially unsafe characters + private_class_method def self.validate_package_name!(package_name) + raise ReactOnRails::Error, "package_name cannot be nil" if package_name.nil? + raise ReactOnRails::Error, "package_name cannot be empty" if package_name.to_s.strip.empty? + + # Allow valid npm package names: alphanumeric, hyphens, underscores, dots, slashes (for scoped packages) + # See: https://github.com/npm/validate-npm-package-name + return if package_name.match?(%r{\A[@a-z0-9][a-z0-9._/-]*\z}i) + + raise ReactOnRails::Error, "Invalid package name: #{package_name.inspect}. " \ + "Package names must contain only alphanumeric characters, " \ + "hyphens, underscores, dots, and slashes (for scoped packages)." + end + + # Validates package_name and version inputs to prevent command injection + # + # @param package_name [String] The package name to validate + # @param version [String] The version to validate + # @raise [ReactOnRails::Error] if inputs contain potentially unsafe characters + private_class_method def self.validate_package_command_inputs!(package_name, version) + validate_package_name!(package_name) + + raise ReactOnRails::Error, "version cannot be nil" if version.nil? + raise ReactOnRails::Error, "version cannot be empty" if version.to_s.strip.empty? + + # Allow valid semver versions and common npm version patterns + # This allows: 1.2.3, 1.2.3-beta.1, 1.2.3-alpha, etc. + return if version.match?(/\A[a-z0-9][a-z0-9._-]*\z/i) + + raise ReactOnRails::Error, "Invalid version: #{version.inspect}. " \ + "Versions must contain only alphanumeric characters, dots, hyphens, and underscores." + end + + private_class_method def self.detect_package_manager_from_package_json + package_json_path = File.join(Rails.root, ReactOnRails.configuration.node_modules_location, "package.json") + return nil unless File.exist?(package_json_path) + + package_json_data = JSON.parse(File.read(package_json_path)) + return nil unless package_json_data["packageManager"] + + manager_string = package_json_data["packageManager"] + # Extract manager name from strings like "yarn@3.6.0" or "pnpm@8.0.0" + manager_name = manager_string.split("@").first + manager_name.to_sym if %w[npm yarn pnpm bun].include?(manager_name) + rescue StandardError + nil + end + + private_class_method def self.detect_package_manager_from_lock_files + root = Rails.root + return :yarn if File.exist?(File.join(root, "yarn.lock")) + return :pnpm if File.exist?(File.join(root, "pnpm-lock.yaml")) + return :bun if File.exist?(File.join(root, "bun.lockb")) + return :npm if File.exist?(File.join(root, "package-lock.json")) + + nil + end + + # Returns the appropriate install command for the detected package manager. + # Generates the correct command with exact version syntax. + # + # @param package_name [String] The name of the package to install + # @param version [String] The exact version to install + # @return [String] The command to run (e.g., "yarn add react-on-rails@16.0.0 --exact") + def self.package_manager_install_exact_command(package_name, version) + validate_package_command_inputs!(package_name, version) + + manager = detect_package_manager + # Escape shell arguments to prevent command injection + safe_package = Shellwords.escape("#{package_name}@#{version}") + + case manager + when :pnpm + "pnpm add #{safe_package} --save-exact" + when :bun + "bun add #{safe_package} --exact" + when :npm + "npm install #{safe_package} --save-exact" + else # :yarn or unknown, default to yarn + "yarn add #{safe_package} --exact" + end + end + + # Returns the appropriate remove command for the detected package manager. + # + # @param package_name [String] The name of the package to remove + # @return [String] The command to run (e.g., "yarn remove react-on-rails") + def self.package_manager_remove_command(package_name) + validate_package_name!(package_name) + + manager = detect_package_manager + # Escape shell arguments to prevent command injection + safe_package = Shellwords.escape(package_name) + + case manager + when :pnpm + "pnpm remove #{safe_package}" + when :bun + "bun remove #{safe_package}" + when :npm + "npm uninstall #{safe_package}" + else # :yarn or unknown, default to yarn + "yarn remove #{safe_package}" + end + end + def self.default_troubleshooting_section <<~DEFAULT 📞 Get Help & Support: diff --git a/lib/react_on_rails/version_checker.rb b/lib/react_on_rails/version_checker.rb index 364708f9ef..34e4e1ed95 100644 --- a/lib/react_on_rails/version_checker.rb +++ b/lib/react_on_rails/version_checker.rb @@ -17,38 +17,187 @@ def initialize(node_package_version) @node_package_version = node_package_version end - # For compatibility, the gem and the node package versions should always match, - # unless the user really knows what they're doing. So we will give a - # warning if they do not. - def log_if_gem_and_node_package_versions_differ - return if node_package_version.raw.nil? || node_package_version.local_path_or_url? - return log_node_semver_version_warning if node_package_version.semver_wildcard? - - log_differing_versions_warning unless node_package_version.parts == gem_version_parts + # Validates version and package compatibility. + # Raises ReactOnRails::Error if: + # - package.json file is not found + # - Both react-on-rails and react-on-rails-pro packages are installed + # - Pro gem is installed but using react-on-rails package + # - Pro package is installed but Pro gem is not installed + # - Non-exact version is used + # - Versions don't match + def validate_version_and_package_compatibility! + validate_package_json_exists! + validate_package_gem_compatibility! + validate_exact_version! + validate_version_match! end private - def common_error_msg - <<-MSG.strip_heredoc - Detected: #{node_package_version.raw} - gem: #{gem_version} - Ensure the installed version of the gem is the same as the version of - your installed Node package. Do not use >= or ~> in your Gemfile for react_on_rails. - Do not use ^, ~, or other non-exact versions in your package.json for react-on-rails. - Run `yarn add react-on-rails --exact` in the directory containing folder node_modules. + def validate_package_json_exists! + return if File.exist?(node_package_version.package_json) + + base_install_cmd = ReactOnRails::Utils.package_manager_install_exact_command("react-on-rails", gem_version) + pro_install_cmd = ReactOnRails::Utils.package_manager_install_exact_command("react-on-rails-pro", gem_version) + + raise ReactOnRails::Error, <<~MSG.strip + **ERROR** ReactOnRails: package.json file not found. + + Expected location: #{node_package_version.package_json} + + React on Rails requires a package.json file with either 'react-on-rails' or + 'react-on-rails-pro' package installed. + + Fix: + 1. Ensure you have a package.json in your project root + 2. Run: #{base_install_cmd} + + Or if using React on Rails Pro: + Run: #{pro_install_cmd} MSG end - def log_differing_versions_warning - msg = "**WARNING** ReactOnRails: ReactOnRails gem and Node package versions do not match\n#{common_error_msg}" - Rails.logger.warn(msg) + def validate_package_gem_compatibility! + has_base_package = node_package_version.react_on_rails_package? + has_pro_package = node_package_version.react_on_rails_pro_package? + is_pro_gem = ReactOnRails::Utils.react_on_rails_pro? + + validate_packages_installed!(has_base_package, has_pro_package) + validate_no_duplicate_packages!(has_base_package, has_pro_package) + validate_pro_gem_uses_pro_package!(is_pro_gem, has_pro_package) + validate_pro_package_has_pro_gem!(is_pro_gem, has_pro_package) end - def log_node_semver_version_warning - msg = "**WARNING** ReactOnRails: Your Node package version for react-on-rails is not an exact version\n" \ - "#{common_error_msg}" - Rails.logger.warn(msg) + def validate_packages_installed!(has_base_package, has_pro_package) + return if has_base_package || has_pro_package + + base_install_cmd = ReactOnRails::Utils.package_manager_install_exact_command("react-on-rails", gem_version) + pro_install_cmd = ReactOnRails::Utils.package_manager_install_exact_command("react-on-rails-pro", gem_version) + + raise ReactOnRails::Error, <<~MSG.strip + **ERROR** ReactOnRails: No React on Rails npm package is installed. + + You must install either 'react-on-rails' or 'react-on-rails-pro' package. + + Fix: + If using the standard (free) version: + Run: #{base_install_cmd} + + Or if using React on Rails Pro: + Run: #{pro_install_cmd} + + #{package_json_location} + MSG + end + + def validate_no_duplicate_packages!(has_base_package, has_pro_package) + return unless has_base_package && has_pro_package + + remove_cmd = ReactOnRails::Utils.package_manager_remove_command("react-on-rails") + + raise ReactOnRails::Error, <<~MSG.strip + **ERROR** ReactOnRails: Both 'react-on-rails' and 'react-on-rails-pro' packages are installed. + + If you're using React on Rails Pro, only install the 'react-on-rails-pro' package. + The Pro package already includes all functionality from the base package. + + Fix: + 1. Remove 'react-on-rails' from your package.json dependencies + 2. Run: #{remove_cmd} + 3. Keep only: react-on-rails-pro + + #{package_json_location} + MSG + end + + def validate_pro_gem_uses_pro_package!(is_pro_gem, has_pro_package) + return unless is_pro_gem && !has_pro_package + + remove_cmd = ReactOnRails::Utils.package_manager_remove_command("react-on-rails") + install_cmd = ReactOnRails::Utils.package_manager_install_exact_command("react-on-rails-pro", gem_version) + + raise ReactOnRails::Error, <<~MSG.strip + **ERROR** ReactOnRails: You have the Pro gem installed but are using the base 'react-on-rails' package. + + When using React on Rails Pro, you must use the 'react-on-rails-pro' npm package. + + Fix: + 1. Remove the base package: #{remove_cmd} + 2. Install the Pro package: #{install_cmd} + + #{package_json_location} + MSG + end + + def validate_pro_package_has_pro_gem!(is_pro_gem, has_pro_package) + return unless !is_pro_gem && has_pro_package + + remove_pro_cmd = ReactOnRails::Utils.package_manager_remove_command("react-on-rails-pro") + install_base_cmd = ReactOnRails::Utils.package_manager_install_exact_command("react-on-rails", gem_version) + + raise ReactOnRails::Error, <<~MSG.strip + **ERROR** ReactOnRails: You have the 'react-on-rails-pro' package installed but the Pro gem is not installed. + + The Pro npm package requires the Pro gem to function. + + Fix: + 1. Install the Pro gem by adding to your Gemfile: + gem 'react_on_rails_pro' + 2. Run: bundle install + + Or if you meant to use the base version: + 1. Remove the Pro package: #{remove_pro_cmd} + 2. Install the base package: #{install_base_cmd} + + #{package_json_location} + MSG + end + + def validate_exact_version! + return if node_package_version.raw.nil? || node_package_version.local_path_or_url? + + return unless node_package_version.semver_wildcard? + + package_name = node_package_version.package_name + install_cmd = ReactOnRails::Utils.package_manager_install_exact_command(package_name, gem_version) + + raise ReactOnRails::Error, <<~MSG.strip + **ERROR** ReactOnRails: The '#{package_name}' package version is not an exact version. + + Detected: #{node_package_version.raw} + Gem: #{gem_version} + + React on Rails requires exact version matching between the gem and npm package. + Do not use ^, ~, >, <, *, or other semver ranges. + + Fix: + Run: #{install_cmd} + + #{package_json_location} + MSG + end + + def validate_version_match! + return if node_package_version.raw.nil? || node_package_version.local_path_or_url? + + return if node_package_version.parts == gem_version_parts + + package_name = node_package_version.package_name + install_cmd = ReactOnRails::Utils.package_manager_install_exact_command(package_name, gem_version) + + raise ReactOnRails::Error, <<~MSG.strip + **ERROR** ReactOnRails: The '#{package_name}' package version does not match the gem version. + + Package: #{node_package_version.raw} + Gem: #{gem_version} + + The npm package and gem versions must match exactly for compatibility. + + Fix: + Run: #{install_cmd} + + #{package_json_location} + MSG end def gem_version @@ -59,6 +208,10 @@ def gem_version_parts gem_version.match(VERSION_PARTS_REGEX)&.captures&.compact end + def package_json_location + "Package.json location: #{VersionChecker::NodePackageVersion.package_json_path}" + end + class NodePackageVersion attr_reader :package_json @@ -77,24 +230,68 @@ def initialize(package_json) def raw return @raw if defined?(@raw) - if File.exist?(package_json) - parsed_package_contents = JSON.parse(package_json_contents) - if parsed_package_contents.key?("dependencies") && - parsed_package_contents["dependencies"].key?("react-on-rails") - return @raw = parsed_package_contents["dependencies"]["react-on-rails"] - end - end - msg = "No 'react-on-rails' entry in the dependencies of #{NodePackageVersion.package_json_path}, " \ - "which is the expected location according to ReactOnRails.configuration.node_modules_location" + return @raw = nil unless File.exist?(package_json) + + parsed = parsed_package_contents + return @raw = nil unless parsed.key?("dependencies") + + deps = parsed["dependencies"] + + # Check for react-on-rails-pro first (Pro takes precedence) + return @raw = deps["react-on-rails-pro"] if deps.key?("react-on-rails-pro") + + # Fall back to react-on-rails + return @raw = deps["react-on-rails"] if deps.key?("react-on-rails") + + # Neither package found + msg = "No 'react-on-rails' or 'react-on-rails-pro' entry in the dependencies of " \ + "#{NodePackageVersion.package_json_path}, which is the expected location according to " \ + "ReactOnRails.configuration.node_modules_location" Rails.logger.warn(msg) @raw = nil end + def react_on_rails_package? + package_installed?("react-on-rails") + end + + def react_on_rails_pro_package? + package_installed?("react-on-rails-pro") + end + + def package_name + return "react-on-rails-pro" if react_on_rails_pro_package? + + "react-on-rails" + end + def semver_wildcard? # See https://docs.npmjs.com/cli/v10/configuring-npm/package-json#dependencies # We want to disallow all expressions other than exact versions # and the ones allowed by local_path_or_url? - raw.blank? || raw.start_with?(/[~^><*]/) || raw.include?(" - ") || raw.include?(" || ") + return true if raw.blank? + + special_version_string? || wildcard_or_x_range? || range_operator? || range_syntax? + end + + def special_version_string? + %w[latest next canary beta alpha rc].include?(raw.downcase) + end + + def wildcard_or_x_range? + raw == "*" || + raw =~ /^[xX*]$/ || + raw =~ /^[xX*]\./ || + raw =~ /\.[xX*]\b/ || + raw =~ /\.[xX*]$/ + end + + def range_operator? + raw.start_with?(/[~^><*]/) + end + + def range_syntax? + raw.include?(" - ") || raw.include?(" || ") end def local_path_or_url? @@ -117,9 +314,39 @@ def parts private + def package_installed?(package_name) + return false unless File.exist?(package_json) + + parsed = parsed_package_contents + parsed.dig("dependencies", package_name).present? + end + def package_json_contents @package_json_contents ||= File.read(package_json) end + + def parsed_package_contents + return @parsed_package_contents if defined?(@parsed_package_contents) + + begin + @parsed_package_contents = JSON.parse(package_json_contents) + rescue JSON::ParserError => e + raise ReactOnRails::Error, <<~MSG.strip + **ERROR** ReactOnRails: Failed to parse package.json file. + + Location: #{package_json} + Error: #{e.message} + + The package.json file contains invalid JSON. Please check the file for syntax errors. + + Common issues: + - Missing or extra commas + - Unquoted keys or values + - Trailing commas (not allowed in JSON) + - Comments (not allowed in standard JSON) + MSG + end + end end end end diff --git a/rakelib/release.rake b/rakelib/release.rake index 85c7e63a88..205a534c35 100644 --- a/rakelib/release.rake +++ b/rakelib/release.rake @@ -15,29 +15,40 @@ end # rubocop:disable Metrics/BlockLength -desc("Releases the gem and both NPM packages (react-on-rails and react-on-rails-pro). - -IMPORTANT: the gem version must be in valid rubygem format (no dashes). -It will be automatically converted to valid npm semver by the rake task -for the node package versions. This only makes a difference for pre-release -versions such as `3.0.0.beta.1` (npm version would be `3.0.0-beta.1`). - -This task depends on the gem-release ruby gem which is installed via `bundle install`. - -1st argument: The new version in rubygem format (no dashes). Pass no argument to - automatically perform a patch version bump. -2nd argument: Perform a dry run by passing 'true' as a second argument. -3rd argument: Use Verdaccio local registry by passing 'verdaccio' as a third argument. - Requires Verdaccio server running on http://localhost:4873/ -4th argument: Skip pushing to remote by passing 'skip_push' as a fourth argument. - Useful for testing the release process locally. +desc("Unified release script for all React on Rails packages and gems. + +IMPORTANT: This script uses UNIFIED VERSIONING - all packages (core + pro) will be +updated to the same version number and released together. + +Version argument can be: + - Semver bump type: 'patch', 'minor', or 'major' (e.g., 16.1.1 → 16.1.2, 16.2.0, or 17.0.0) + - Explicit version: '16.2.0' + - Pre-release version: '16.2.0.beta.1' (rubygem format with dots, converted to 16.2.0-beta.1 for NPM) + +This will update and release: + PUBLIC (npmjs.org + rubygems.org): + - react-on-rails NPM package + - react-on-rails-pro NPM package + - react_on_rails RubyGem + PRIVATE (GitHub Packages): + - @shakacode-tools/react-on-rails-pro-node-renderer NPM package + - react_on_rails_pro RubyGem + +1st argument: Version (patch/minor/major OR explicit version like 16.2.0) +2nd argument: Dry run (true/false, default: false) +3rd argument: Registry (verdaccio/npm, default: npm) +4th argument: Skip push (skip_push to skip, default: push) Examples: - rake release[16.2.0] # Release to production - rake release[16.2.0,true] # Dry run - rake release[16.2.0,false,verdaccio] # Test release to Verdaccio + rake release[patch] # Bump patch version (16.1.1 → 16.1.2) + rake release[minor] # Bump minor version (16.1.1 → 16.2.0) + rake release[major] # Bump major version (16.1.1 → 17.0.0) + rake release[16.2.0] # Set explicit version + rake release[16.2.0.beta.1] # Set pre-release version (→ 16.2.0-beta.1 for NPM) + rake release[patch,true] # Dry run + rake release[16.2.0,false,verdaccio] # Test with Verdaccio rake release[16.2.0,false,npm,skip_push] # Release without pushing to remote") -task :release, %i[gem_version dry_run registry skip_push] do |_t, args| +task :release, %i[version dry_run registry skip_push] do |_t, args| include ReactOnRails::TaskHelpers # Check if there are uncommitted changes @@ -63,20 +74,37 @@ task :release, %i[gem_version dry_run registry skip_push] do |_t, args| skip_push = skip_push_value == "skip_push" - gem_version = args_hash.fetch(:gem_version, "") + version_input = args_hash.fetch(:version, "") + + if version_input.strip.empty? + raise ArgumentError, + "Version argument is required. Use 'patch', 'minor', 'major', or explicit version (e.g., '16.2.0')" + end # Having the examples prevents publishing Rake::Task["shakapacker_examples:clobber"].invoke # Delete any react_on_rails.gemspec except the root one sh_in_dir(gem_root, "find . -mindepth 2 -name 'react_on_rails.gemspec' -delete") + # Delete any react_on_rails_pro.gemspec except the one in react_on_rails_pro directory + sh_in_dir(gem_root, "find . -mindepth 3 -name 'react_on_rails_pro.gemspec' -delete") - # Pull latest changes - sh_in_dir(gem_root, "git pull --rebase") + # Pull latest changes (skip in dry-run mode or when skip_push is set) + sh_in_dir(gem_root, "git pull --rebase") unless is_dry_run || skip_push - # Bump gem version using gem-release - sh_in_dir(gem_root, "gem bump --no-commit #{%(--version #{gem_version}) unless gem_version.strip.empty?}") + # Determine if version_input is semver keyword or explicit version + semver_keywords = %w[patch minor major] + is_semver_bump = semver_keywords.include?(version_input.strip.downcase) - # Read the actual version that was set + if is_semver_bump + # Use gem bump with semver keyword + puts "Bumping #{version_input} version for react_on_rails gem..." + else + # Use explicit version + puts "Setting react_on_rails gem version to #{version_input}..." + end + sh_in_dir(gem_root, "gem bump --no-commit --version #{version_input}") + + # Read the actual version that was set for react_on_rails actual_gem_version = begin version_file = File.join(gem_root, "lib", "react_on_rails", "version.rb") version_content = File.read(version_file) @@ -85,21 +113,39 @@ task :release, %i[gem_version dry_run registry skip_push] do |_t, args| actual_npm_version = ReactOnRails::VersionSyntaxConverter.new.rubygem_to_npm(actual_gem_version) - puts "Updating package.json files to version #{actual_npm_version}..." + puts "\n#{'=' * 80}" + puts "UNIFIED VERSION: #{actual_gem_version} (gem) / #{actual_npm_version} (npm)" + puts "=" * 80 + + # Update react_on_rails_pro gem version to match + puts "\nUpdating react_on_rails_pro gem version to #{actual_gem_version}..." + pro_gem_root = File.join(gem_root, "react_on_rails_pro") + pro_version_file = File.join(pro_gem_root, "lib", "react_on_rails_pro", "version.rb") + pro_version_content = File.read(pro_version_file) + # We use gsub instead of `gem bump` here because the git tree is already dirty + # from bumping the core gem version above, and `gem bump` fails with uncommitted changes + # Use word boundary \b to match only VERSION, not PROTOCOL_VERSION + pro_version_content.gsub!(/\bVERSION = ".+"/, "VERSION = \"#{actual_gem_version}\"") + File.write(pro_version_file, pro_version_content) + puts " Updated #{pro_version_file}" + puts " Note: react_on_rails_pro.gemspec will automatically use ReactOnRails::VERSION" + + puts "\nUpdating package.json files to version #{actual_npm_version}..." # Update all package.json files package_json_files = [ File.join(gem_root, "package.json"), File.join(gem_root, "packages", "react-on-rails", "package.json"), - File.join(gem_root, "packages", "react-on-rails-pro", "package.json") + File.join(gem_root, "packages", "react-on-rails-pro", "package.json"), + File.join(gem_root, "react_on_rails_pro", "package.json") ] package_json_files.each do |file| content = JSON.parse(File.read(file)) content["version"] = actual_npm_version - # For react-on-rails-pro, also update the react-on-rails dependency - if file.include?("react-on-rails-pro") + # For react-on-rails-pro package, also update the react-on-rails dependency to exact version + if content["name"] == "react-on-rails-pro" content["dependencies"] ||= {} content["dependencies"]["react-on-rails"] = actual_npm_version end @@ -111,6 +157,11 @@ task :release, %i[gem_version dry_run registry skip_push] do |_t, args| bundle_install_in(gem_root) # Update dummy app's Gemfile.lock bundle_install_in(dummy_app_dir) + # Update pro dummy app's Gemfile.lock + pro_dummy_app_dir = File.join(gem_root, "react_on_rails_pro", "spec", "dummy") + bundle_install_in(pro_dummy_app_dir) if Dir.exist?(pro_dummy_app_dir) + # Update pro root Gemfile.lock + bundle_install_in(pro_gem_root) # Prepare NPM registry configuration npm_registry_url = use_verdaccio ? "http://localhost:4873/" : "https://registry.npmjs.org/" @@ -143,7 +194,7 @@ task :release, %i[gem_version dry_run registry skip_push] do |_t, args| end puts "\n#{'=' * 80}" - puts "Publishing NPM packages to #{use_verdaccio ? 'Verdaccio (local)' : 'npmjs.org'}..." + puts "Publishing PUBLIC packages to #{use_verdaccio ? 'Verdaccio (local)' : 'npmjs.org'}..." puts "=" * 80 # Publish react-on-rails NPM package @@ -157,17 +208,47 @@ task :release, %i[gem_version dry_run registry skip_push] do |_t, args| sh_in_dir(gem_root, "yarn workspace react-on-rails-pro publish --new-version #{actual_npm_version} #{npm_publish_args}") + # Publish node-renderer NPM package (to Verdaccio or GitHub Packages depending on mode) + puts "\n#{'=' * 80}" if use_verdaccio - puts "Skipping Ruby gem publication (Verdaccio mode)" - puts "=" * 80 + puts "Publishing node-renderer to Verdaccio (local)..." + else + puts "Publishing PRIVATE node-renderer to GitHub Packages..." + end + puts "=" * 80 + + # Publish react-on-rails-pro-node-renderer NPM package + node_renderer_registry = if use_verdaccio + "Verdaccio (http://localhost:4873/)" + else + "GitHub Packages" + end + node_renderer_name = "@shakacode-tools/react-on-rails-pro-node-renderer" + puts "\nPublishing #{node_renderer_name}@#{actual_npm_version} to #{node_renderer_registry}..." + puts "Ensure you're authenticated with GitHub Packages (see ~/.npmrc)" unless use_verdaccio + sh_in_dir(pro_gem_root, + "yarn publish --new-version #{actual_npm_version} --no-git-tag-version #{npm_publish_args}") + + if use_verdaccio + puts "\nSkipping Ruby gem publication (Verdaccio is NPM-only)" else puts "\n#{'=' * 80}" - puts "Publishing Ruby gem..." + puts "Publishing PUBLIC Ruby gem..." puts "=" * 80 - # Publish Ruby gem + # Publish react_on_rails Ruby gem puts "\nCarefully add your OTP for Rubygems when prompted." sh_in_dir(gem_root, "gem release") + + puts "\n#{'=' * 80}" + puts "Publishing PRIVATE Ruby gem to GitHub Packages..." + puts "=" * 80 + + # Publish react_on_rails_pro Ruby gem to GitHub Packages + puts "\nPublishing react_on_rails_pro gem to GitHub Packages..." + puts "Ensure you have GitHub token in ~/.gem/credentials" + sh_in_dir(pro_gem_root, + "gem release --key github --host https://rubygems.pkg.github.com/shakacode-tools") end end @@ -183,12 +264,16 @@ task :release, %i[gem_version dry_run registry skip_push] do |_t, args| puts "=" * 80 puts "Version would be bumped to: #{actual_gem_version} (gem) / #{actual_npm_version} (npm)" puts "NPM Registry: #{npm_registry_note}" - puts "Files that would be updated:" + puts "\nFiles that would be updated:" puts " - lib/react_on_rails/version.rb" + puts " - react_on_rails_pro/lib/react_on_rails_pro/version.rb" puts " - package.json (root)" puts " - packages/react-on-rails/package.json" puts " - packages/react-on-rails-pro/package.json (version + dependency)" - puts " - spec/dummy/Gemfile.lock" + puts " - react_on_rails_pro/package.json (node-renderer)" + puts " - Gemfile.lock files (root, dummy apps, pro)" + puts "\nAuto-synced (no write needed):" + puts " - react_on_rails_pro/react_on_rails_pro.gemspec (uses ReactOnRails::VERSION)" registry_arg = use_verdaccio ? ",false,verdaccio" : "" puts "\nTo actually release, run: rake release[#{actual_gem_version}#{registry_arg}]" else @@ -201,9 +286,14 @@ task :release, %i[gem_version dry_run registry skip_push] do |_t, args| Published to #{npm_registry_note}: - react-on-rails@#{actual_npm_version} - react-on-rails-pro@#{actual_npm_version} + - @shakacode-tools/react-on-rails-pro-node-renderer@#{actual_npm_version} MSG - msg += " - react_on_rails #{actual_gem_version} (RubyGems)\n" unless use_verdaccio + unless use_verdaccio + msg += "\n Ruby Gems:\n" + msg += " - react_on_rails #{actual_gem_version} (RubyGems.org)\n" + msg += " - react_on_rails_pro #{actual_gem_version} (GitHub Packages)\n" + end if skip_push msg += <<~SKIP_PUSH @@ -215,26 +305,30 @@ task :release, %i[gem_version dry_run registry skip_push] do |_t, args| SKIP_PUSH end - if use_verdaccio - msg += <<~VERDACCIO + msg += if use_verdaccio + <<~VERDACCIO - Verdaccio test packages published successfully! + Verdaccio test packages published successfully! - To test installation: - npm install --registry http://localhost:4873/ react-on-rails@#{actual_npm_version} - npm install --registry http://localhost:4873/ react-on-rails-pro@#{actual_npm_version} + To test installation: + npm install --registry http://localhost:4873/ react-on-rails@#{actual_npm_version} + npm install --registry http://localhost:4873/ react-on-rails-pro@#{actual_npm_version} + npm install --registry http://localhost:4873/ @shakacode-tools/react-on-rails-pro-node-renderer@#{actual_npm_version} - VERDACCIO - else - msg += <<~PRODUCTION + Note: Ruby gems were not published (Verdaccio is NPM-only) - Next steps: - 1. Update CHANGELOG.md: bundle exec rake update_changelog - 3. Commit CHANGELOG: cd #{gem_root} && git commit -a -m 'Update CHANGELOG.md and spec/dummy Gemfile.lock' - 4. Push changes: git push + VERDACCIO + else + <<~PRODUCTION - PRODUCTION - end + Next steps: + 1. Update CHANGELOG.md: bundle exec rake update_changelog + 2. Update pro CHANGELOG.md: cd react_on_rails_pro && bundle exec rake update_changelog + 3. Commit CHANGELOGs: git commit -a -m 'Update CHANGELOG.md files' + 4. Push changes: git push + + PRODUCTION + end puts msg end diff --git a/rakelib/task_helpers.rb b/rakelib/task_helpers.rb index 3e9c40f9e3..8339f9e8d1 100644 --- a/rakelib/task_helpers.rb +++ b/rakelib/task_helpers.rb @@ -1,5 +1,7 @@ # frozen_string_literal: true +require "English" + module ReactOnRails module TaskHelpers # Returns the root folder of the react_on_rails gem @@ -35,9 +37,74 @@ def unbundled_sh_in_dir(dir, *shell_commands) end def bundle_install_in(dir) - unbundled_sh_in_dir(dir, "bundle install") + required_version = detect_bundler_ruby_version(dir) + + if required_version && required_version != RUBY_VERSION + puts " Switching Ruby version: #{RUBY_VERSION} → #{required_version}" + # Run version switch and bundle install in the same shell context + bundle_install_with_ruby_version(dir, required_version) + else + unbundled_sh_in_dir(dir, "bundle install") + end end + private + + # Runs bundle install with the specified Ruby version in the same shell context + def bundle_install_with_ruby_version(dir, version) + version_manager = ENV.fetch("RUBY_VERSION_MANAGER", "rvm") + + command = case version_manager + when "rvm" + "rvm #{version} do bundle install" + when "rbenv" + "RBENV_VERSION=#{version} bundle install" + when "asdf" + "asdf shell ruby #{version} && bundle install" + else + # TODO: add support for chruby + puts " ⚠️ Unknown RUBY_VERSION_MANAGER: #{version_manager}" + puts " Supported values: rvm, rbenv, asdf" + raise "Ruby version #{version} required. Current: #{RUBY_VERSION}" + end + + unbundled_sh_in_dir(dir, command) + rescue StandardError => e + puts " ⚠️ Failed to switch Ruby version and run bundle install: #{e.message}" + puts " Please manually switch to Ruby #{version} and try again" + raise + end + + # Detects the required Ruby version using Bundler + def detect_bundler_ruby_version(dir) + output = nil + exit_status = nil + + # Run in unbundled environment to avoid conflicts with parent Bundler context + Bundler.with_unbundled_env do + Dir.chdir(dir) do + output = `bundle platform --ruby 2>&1` + exit_status = $CHILD_STATUS.exitstatus + end + end + + unless exit_status.zero? + puts " ⚠️ Failed to detect Ruby version in #{dir}" + puts " Error: #{output.strip}" unless output.strip.empty? + return nil + end + + # Parse "ruby 3.3.7" or "ruby 3.3.7-rc1" or "ruby 3.4.0-preview1" + # Regex matches: digits.dots followed by optional -prerelease + match = output.strip.match(/ruby\s+([\d.]+(?:-[a-zA-Z0-9.]+)?)/) + match ? match[1] : nil + rescue StandardError => e + puts " ⚠️ Error detecting Ruby version: #{e.message}" + nil + end + + public + def bundle_install_in_no_turbolinks(dir) sh_in_dir(dir, "DISABLE_TURBOLINKS=TRUE bundle install") end diff --git a/react_on_rails_pro/CHANGELOG.md b/react_on_rails_pro/CHANGELOG.md index 36dbc16183..1fe5a126b3 100644 --- a/react_on_rails_pro/CHANGELOG.md +++ b/react_on_rails_pro/CHANGELOG.md @@ -30,6 +30,7 @@ You can find the **package** version numbers from this repo's tags and below in - `rsc_payload_react_component` - RSC payload rendering These helpers were previously in the open-source gem but have been moved to Pro as they are Pro-only features. +- **Node Renderer Gem Version Validation**: The node renderer now validates that the Ruby gem version (`react_on_rails_pro`) matches the node renderer package version (`@shakacode-tools/react-on-rails-pro-node-renderer`) on every render request. Environment-aware: strict enforcement in development (returns 412 Precondition Failed on mismatch), permissive in production (allows with warning). Includes version normalization to handle Ruby gem vs NPM format differences (e.g., `4.0.0.rc.1` vs `4.0.0-rc.1`). [PR #1881](https://github.com/shakacode/react_on_rails/pull/1881) by [AbanoubGhadban](https://github.com/AbanoubGhadban). ### Changed (Breaking) - `config.prerender_caching`, which controls caching for non-streaming components, now also controls caching for streamed components. To disable caching for an individual render, pass `internal_option(:skip_prerender_cache)`. diff --git a/react_on_rails_pro/CONTRIBUTING.md b/react_on_rails_pro/CONTRIBUTING.md index d1450cbd40..7afa2cc115 100644 --- a/react_on_rails_pro/CONTRIBUTING.md +++ b/react_on_rails_pro/CONTRIBUTING.md @@ -282,14 +282,51 @@ TRACE_REACT_ON_RAILS=true && foreman start -f Procfile.dev ``` # Releasing -Contact Justin Gordon, [justin@shakacode.com](mailto:justin@shakacode.com). -> [!NOTE] -> These files need to include auth tokens to [publish to Github Packages](https://docs.github.com/en/enterprise-server%403.10/packages/working-with-a-github-packages-registry/working-with-the-rubygems-registry): -> 1. `~/.npmrc` -> 2. `~/.gem/credentials` +⚠️ **The release process has moved to the repository root.** + +React on Rails Pro is now released together with React on Rails using unified versioning. +All packages (core + pro) are released together with the same version number. + +Contact Justin Gordon, [justin@shakacode.com](mailto:justin@shakacode.com) for release permissions. + +## Prerequisites + +You need authentication for both public and private package registries: + +**Public packages (npmjs.org + rubygems.org):** +- NPM: Run `npm login` +- RubyGems: Standard credentials via `gem push` + +**Private packages (GitHub Packages):** +- Get a GitHub personal access token with `write:packages` scope +- Configure `~/.npmrc`: + ```ini + //npm.pkg.github.com/:_authToken= + always-auth=true + ``` +- Configure `~/.gem/credentials`: + ```yaml + :github: Bearer + ``` +- Set environment variable: `export GITHUB_TOKEN=` + +## Release Command + +From the **repository root**, run: -Then run a command like: ```bash -bundle exec rake release\[4.0.0.rc.1\] +# Full release +cd /path/to/react_on_rails +rake release[17.0.0] + +# Dry run first +rake release[17.0.0,true] + +# Test with Verdaccio +rake release[17.0.0,false,verdaccio] ``` + +For complete documentation, see: +- [Root Release Documentation](../docs/contributor-info/releasing.md) +- Run `rake -D release` for inline help diff --git a/react_on_rails_pro/Gemfile.lock b/react_on_rails_pro/Gemfile.lock index c2c4975857..2dd062cf1c 100644 --- a/react_on_rails_pro/Gemfile.lock +++ b/react_on_rails_pro/Gemfile.lock @@ -20,14 +20,14 @@ PATH PATH remote: . specs: - react_on_rails_pro (4.0.0) + react_on_rails_pro (16.1.1) addressable connection_pool execjs (~> 2.9) httpx (~> 1.5) jwt (~> 2.7) rainbow - react_on_rails (>= 16.0.0) + react_on_rails (= 16.1.1) GEM remote: https://rubygems.org/ diff --git a/react_on_rails_pro/docs/contributors-info/releasing.md b/react_on_rails_pro/docs/contributors-info/releasing.md index b9bd9631a8..83378179a2 100644 --- a/react_on_rails_pro/docs/contributors-info/releasing.md +++ b/react_on_rails_pro/docs/contributors-info/releasing.md @@ -1,37 +1,40 @@ -# Install and Release -Github packages and gems are used for distribution from the https://github.com/shakacode-tools/react_on_rails_pro repo. -1. Check that the CHANGELOG.md is updated -2. See below for Prerequisites and then run the release command like this +# Releasing React on Rails Pro -``` -rake release[1.5.7] -``` +⚠️ **This documentation is outdated.** -or for a beta release. Note the period, not dash, before the 'beta'. +React on Rails Pro is now released together with React on Rails using a unified release script. -``` -rake release[1.5.6.beta.2] -``` +## Current Release Process -## Testing the Gem before Release from a Rails App -See [Contributing](https://github.com/shakacode/react_on_rails_pro/blob/master/CONTRIBUTING.md) +Please refer to the main release documentation: -### Prerequisites -Before this command can be run, a bit of setup is required: +👉 **[/docs/contributor-info/releasing.md](../../../docs/contributor-info/releasing.md)** -1. Get a Github personal access token that provides both Repo and write:packages access -2. In `~/.npmrc` -``` -//npm.pkg.github.com/:_authToken= -always-auth=true -``` -3. Ensure that you set the ENV value when you will run the script. A `.envrc` is convenient for this. +Or run from the repository root: + +```bash +cd .. && rake -D release ``` -export GITHUB_TOKEN= + +## Quick Reference + +```bash +# From repository root (not from react_on_rails_pro/) +cd /path/to/react_on_rails + +# Release with version bump +rake release[17.0.0] + +# Dry run first (recommended) +rake release[17.0.0,true] + +# Test with local Verdaccio +rake release[17.0.0,false,verdaccio] ``` -### Details -1. See `/package.json` for how npm release and release-it know how to publish the package to Github -2. See `/react_on_rails.gemspec` for the gem specification. -3. See `/rakelib/release.rake` for details on how a release is done. The gem is set to publish to - Github by the `gem_push_command` +This unified script releases all 5 packages together: +- react-on-rails (NPM) +- react-on-rails-pro (NPM) +- react_on_rails (RubyGem) +- @shakacode-tools/react-on-rails-pro-node-renderer (NPM, GitHub Packages) +- react_on_rails_pro (RubyGem, GitHub Packages) diff --git a/react_on_rails_pro/lib/react_on_rails_pro/utils.rb b/react_on_rails_pro/lib/react_on_rails_pro/utils.rb index d5f7f5a84f..952cf6cc1e 100644 --- a/react_on_rails_pro/lib/react_on_rails_pro/utils.rb +++ b/react_on_rails_pro/lib/react_on_rails_pro/utils.rb @@ -176,7 +176,8 @@ def self.common_form_data "gemVersion" => ReactOnRailsPro::VERSION, "protocolVersion" => ReactOnRailsPro::PROTOCOL_VERSION, "password" => ReactOnRailsPro.configuration.renderer_password, - "dependencyBundleTimestamps" => dependencies + "dependencyBundleTimestamps" => dependencies, + "railsEnv" => Rails.env.to_s } end diff --git a/react_on_rails_pro/lib/react_on_rails_pro/version.rb b/react_on_rails_pro/lib/react_on_rails_pro/version.rb index e2107d07cc..07857da794 100644 --- a/react_on_rails_pro/lib/react_on_rails_pro/version.rb +++ b/react_on_rails_pro/lib/react_on_rails_pro/version.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true module ReactOnRailsPro - VERSION = "4.0.0" + VERSION = "16.1.1" PROTOCOL_VERSION = "2.0.0" end diff --git a/react_on_rails_pro/package.json b/react_on_rails_pro/package.json index 11b5f93300..be861fb2e9 100644 --- a/react_on_rails_pro/package.json +++ b/react_on_rails_pro/package.json @@ -1,6 +1,6 @@ { "name": "@shakacode-tools/react-on-rails-pro-node-renderer", - "version": "4.0.0", + "version": "16.1.1", "protocolVersion": "2.0.0", "description": "react-on-rails-pro JavaScript for react_on_rails_pro Ruby gem", "exports": { @@ -20,18 +20,6 @@ "publishConfig": { "registry": "https://npm.pkg.github.com" }, - "release-it": { - "git": { - "requireCleanWorkingDir": false - }, - "github": { - "release": false - }, - "npm": { - "publish": true, - "skipChecks": true - } - }, "directories": { "doc": "docs" }, @@ -89,7 +77,6 @@ "prettier": "^3.2.5", "react-on-rails": "link:.yalc/react-on-rails", "redis": "^5.0.1", - "release-it": "^17.6.0", "sentry-testkit": "^5.0.6", "touch": "^3.1.0", "typescript": "^5.4.3", diff --git a/react_on_rails_pro/packages/node-renderer/src/worker/checkProtocolVersionHandler.ts b/react_on_rails_pro/packages/node-renderer/src/worker/checkProtocolVersionHandler.ts index b1f0f3b3ca..cf637bbdd9 100644 --- a/react_on_rails_pro/packages/node-renderer/src/worker/checkProtocolVersionHandler.ts +++ b/react_on_rails_pro/packages/node-renderer/src/worker/checkProtocolVersionHandler.ts @@ -4,9 +4,47 @@ */ import type { FastifyRequest } from './types'; import packageJson from '../shared/packageJson'; +import log from '../shared/log'; + +const NODE_ENV = process.env.NODE_ENV || 'production'; + +// Cache to store version comparison results to avoid repeated normalization and logging +// Key: gemVersion string, Value: boolean (true if matches, false if mismatch) +// If key exists, it means we've already processed and logged this version (if needed) +// Cache is cleared when it exceeds 10 entries to prevent unbounded growth +const VERSION_CACHE_MAX_SIZE = 10; +const versionCache = new Map(); + +/** + * Normalizes a version string to handle differences between Ruby gem and NPM version formats. + * Converts prerelease versions like "4.0.0.rc.1" to "4.0.0-rc.1" for consistent comparison. + * Also handles case normalization and whitespace trimming. + * + * @param version - The version string to normalize + * @returns Normalized version string + */ +function normalizeVersion(version: string): string { + if (!version) return ''; + + let normalized = version.trim().toLowerCase(); + + // Replace the first dot after major.minor.patch with a hyphen to handle Ruby gem format + // Examples: "4.0.0.rc.1" -> "4.0.0-rc.1", "4.0.0.alpha.1" -> "4.0.0-alpha.1" + normalized = normalized.replace(/^(\d+\.\d+\.\d+)\.([a-z]+)/, '$1-$2'); + + return normalized; +} + +interface RequestBody { + protocolVersion?: string; + gemVersion?: string; + railsEnv?: string; +} export = function checkProtocolVersion(req: FastifyRequest) { - const reqProtocolVersion = (req.body as { protocolVersion?: string }).protocolVersion; + const { protocolVersion: reqProtocolVersion, gemVersion, railsEnv } = req.body as RequestBody; + + // Check protocol version if (reqProtocolVersion !== packageJson.protocolVersion) { return { headers: { 'Cache-Control': 'no-cache, no-store, max-age=0, must-revalidate' }, @@ -20,5 +58,54 @@ Update either the renderer or the Rails server`, }; } + // Check gem version + if (gemVersion) { + // Check cache first + let versionsMatch = versionCache.get(gemVersion); + let justCached = false; + + // If not in cache, perform comparison and cache the result + if (versionsMatch === undefined) { + const normalizedGemVersion = normalizeVersion(gemVersion); + const normalizedPackageVersion = normalizeVersion(packageJson.version); + versionsMatch = normalizedGemVersion === normalizedPackageVersion; + + // Clear cache if it exceeds max size to prevent unbounded growth + if (versionCache.size >= VERSION_CACHE_MAX_SIZE) { + versionCache.clear(); + } + + versionCache.set(gemVersion, versionsMatch); + justCached = true; + } + + // Handle version mismatch + if (!versionsMatch) { + const isProduction = railsEnv === 'production' || NODE_ENV === 'production'; + + const mismatchMessage = `React on Rails Pro gem version (${gemVersion}) does not match node renderer version (${packageJson.version}). Using exact matching versions is recommended for best compatibility.`; + + if (isProduction) { + // In production, log a warning but allow the request to proceed + // Only log once per unique gemVersion (when it was first cached) + if (justCached) { + log.warn(mismatchMessage); + } + } else { + // In development, throw an error to prevent potential issues + return { + headers: { 'Cache-Control': 'no-cache, no-store, max-age=0, must-revalidate' }, + status: 412, + data: `Version mismatch error: ${mismatchMessage} + +Gem version: ${gemVersion} +Node renderer version: ${packageJson.version} + +Update either the gem or the node renderer package to match versions.`, + }; + } + } + } + return undefined; }; diff --git a/react_on_rails_pro/packages/node-renderer/tests/worker.test.ts b/react_on_rails_pro/packages/node-renderer/tests/worker.test.ts index 8f52ab1d0a..d024c936a3 100644 --- a/react_on_rails_pro/packages/node-renderer/tests/worker.test.ts +++ b/react_on_rails_pro/packages/node-renderer/tests/worker.test.ts @@ -26,6 +26,7 @@ const bundlePathForTest = () => bundlePath(testName); const gemVersion = packageJson.version; const { protocolVersion } = packageJson; +const railsEnv = 'test'; disableHttp2(); @@ -46,6 +47,7 @@ describe('worker', () => { const form = formAutoContent({ gemVersion, protocolVersion, + railsEnv, renderingRequest: 'ReactOnRails.dummy', bundle: createReadStream(getFixtureBundle()), asset1: createReadStream(getFixtureAsset()), @@ -73,6 +75,7 @@ describe('worker', () => { const form = formAutoContent({ gemVersion, protocolVersion, + railsEnv, renderingRequest: 'ReactOnRails.dummy', bundle: createReadStream(getFixtureBundle()), [`bundle_${SECONDARY_BUNDLE_TIMESTAMP}`]: createReadStream(getFixtureSecondaryBundle()), @@ -114,6 +117,7 @@ describe('worker', () => { password: undefined, gemVersion, protocolVersion, + railsEnv, }) .end(); expect(res.statusCode).toBe(401); @@ -140,6 +144,7 @@ describe('worker', () => { password: 'wrong', gemVersion, protocolVersion, + railsEnv, }) .end(); expect(res.statusCode).toBe(401); @@ -166,6 +171,7 @@ describe('worker', () => { password: 'my_password', gemVersion, protocolVersion, + railsEnv, }) .end(); expect(res.statusCode).toBe(200); @@ -192,6 +198,7 @@ describe('worker', () => { password: undefined, gemVersion, protocolVersion, + railsEnv, }); expect(res.headers['cache-control']).toBe('public, max-age=31536000'); expect(res.statusCode).toBe(200); @@ -283,6 +290,7 @@ describe('worker', () => { const form = formAutoContent({ gemVersion, protocolVersion, + railsEnv, password: 'my_password', targetBundles: [bundleHash], asset1: createReadStream(getFixtureAsset()), @@ -306,6 +314,7 @@ describe('worker', () => { const form = formAutoContent({ gemVersion, protocolVersion, + railsEnv, password: 'my_password', targetBundles: [bundleHash, bundleHashOther], asset1: createReadStream(getFixtureAsset()), @@ -319,4 +328,144 @@ describe('worker', () => { expect(fs.existsSync(assetPath(testName, bundleHashOther))).toBe(true); expect(fs.existsSync(assetPathOther(testName, bundleHashOther))).toBe(true); }); + + describe('gem version validation', () => { + test('allows request when gem version matches package version', async () => { + await createVmBundleForTest(); + + const app = worker({ + bundlePath: bundlePathForTest(), + }); + + const res = await app + .inject() + .post('/bundles/1495063024898/render/d41d8cd98f00b204e9800998ecf8427e') + .payload({ + renderingRequest: 'ReactOnRails.dummy', + gemVersion: packageJson.version, + protocolVersion, + railsEnv: 'development', + }); + + expect(res.statusCode).toBe(200); + expect(res.payload).toBe('{"html":"Dummy Object"}'); + }); + + test('rejects request in development when gem version does not match', async () => { + await createVmBundleForTest(); + + const app = worker({ + bundlePath: bundlePathForTest(), + }); + + const res = await app + .inject() + .post('/bundles/1495063024898/render/d41d8cd98f00b204e9800998ecf8427e') + .payload({ + renderingRequest: 'ReactOnRails.dummy', + gemVersion: '999.0.0', + protocolVersion, + railsEnv: 'development', + }) + .end(); + + expect(res.statusCode).toBe(412); + expect(res.payload).toContain('Version mismatch error'); + expect(res.payload).toContain('999.0.0'); + expect(res.payload).toContain(packageJson.version); + }); + + test('allows request in production when gem version does not match (with warning)', async () => { + await createVmBundleForTest(); + + const app = worker({ + bundlePath: bundlePathForTest(), + }); + + const res = await app + .inject() + .post('/bundles/1495063024898/render/d41d8cd98f00b204e9800998ecf8427e') + .payload({ + renderingRequest: 'ReactOnRails.dummy', + gemVersion: '999.0.0', + protocolVersion, + railsEnv: 'production', + }); + + expect(res.statusCode).toBe(200); + expect(res.payload).toBe('{"html":"Dummy Object"}'); + }); + + test('normalizes gem version with dot before prerelease (4.0.0.rc.1 == 4.0.0-rc.1)', async () => { + await createVmBundleForTest(); + + const app = worker({ + bundlePath: bundlePathForTest(), + }); + + // If package version is 4.0.0, this tests that 4.0.0.rc.1 gets normalized to 4.0.0-rc.1 + // For this test to work properly, we need to use a version that when normalized matches + // Let's create a version with .rc. that normalizes to the package version + const gemVersionWithDot = packageJson.version.replace(/-([a-z]+)/, '.$1'); + + const res = await app + .inject() + .post('/bundles/1495063024898/render/d41d8cd98f00b204e9800998ecf8427e') + .payload({ + renderingRequest: 'ReactOnRails.dummy', + gemVersion: gemVersionWithDot, + protocolVersion, + railsEnv: 'development', + }); + + expect(res.statusCode).toBe(200); + expect(res.payload).toBe('{"html":"Dummy Object"}'); + }); + + test('normalizes gem version case-insensitively (4.0.0-RC.1 == 4.0.0-rc.1)', async () => { + await createVmBundleForTest(); + + const app = worker({ + bundlePath: bundlePathForTest(), + }); + + const gemVersionUpperCase = packageJson.version.toUpperCase(); + + const res = await app + .inject() + .post('/bundles/1495063024898/render/d41d8cd98f00b204e9800998ecf8427e') + .payload({ + renderingRequest: 'ReactOnRails.dummy', + gemVersion: gemVersionUpperCase, + protocolVersion, + railsEnv: 'development', + }); + + expect(res.statusCode).toBe(200); + expect(res.payload).toBe('{"html":"Dummy Object"}'); + }); + + test('handles whitespace in gem version', async () => { + await createVmBundleForTest(); + + const app = worker({ + bundlePath: bundlePathForTest(), + }); + + const gemVersionWithWhitespace = ` ${packageJson.version} `; + + const res = await app + .inject() + .post('/bundles/1495063024898/render/d41d8cd98f00b204e9800998ecf8427e') + .payload({ + renderingRequest: 'ReactOnRails.dummy', + gemVersion: gemVersionWithWhitespace, + protocolVersion, + railsEnv: 'development', + }); + + expect(res.statusCode).toBe(200); + expect(res.payload).toBe('{"html":"Dummy Object"}'); + }); + }); }); diff --git a/react_on_rails_pro/rakelib/release.rake b/react_on_rails_pro/rakelib/release.rake deleted file mode 100644 index 83fb4581d9..0000000000 --- a/react_on_rails_pro/rakelib/release.rake +++ /dev/null @@ -1,97 +0,0 @@ -# frozen_string_literal: true - -require_relative "./task_helpers" -require "react_on_rails" - -class ThrowingMessageHandler - def add_error(error) - raise error - end -end - -# rubocop:disable Metrics/BlockLength - -desc("Releases both the gem and node package using the given version. - -Periodically, update `release-it`: -`yarn global add release-it` - -IMPORTANT: the gem version must be in valid rubygem format (no dashes). -It will be automatically converted to a valid yarn semver by the rake task -for the node package version. This only makes a difference for pre-release -versions such as `3.0.0.beta.1` (yarn version would be `3.0.0-beta.1`). - -This task depends on the gem-release (ruby gem) and release-it (node package) -which are installed via `bundle install` and `yarn` - -1st argument: The new version in rubygem format (no dashes). Pass no argument to - automatically perform a patch version bump. -2nd argument: Perform a dry run by passing 'true' as a second argument. - -Example: `rake release[2.1.0,false]` - -Before this command can be run: - -1. Get a Github personal access token that provides both Repo and write:packages access -2. In `~/.npmrc` -``` -//npm.pkg.github.com/:_authToken= -always-auth=true -``` -3. Create or edit a ~/.gem/credentials to include the following, replacing TOKEN with your personal access token. - ---- -:github: Bearer TOKEN - - Details: https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-rubygems-registry#authenticating-with-a-personal-access-token -") - -task :release, %i[gem_version dry_run tools_install] do |_t, args| - include ReactOnRailsPro::TaskHelpers - - # Check if there are uncommited changes - ReactOnRails::GitUtils.uncommitted_changes?(ThrowingMessageHandler.new) - - args_hash = args.to_hash - - is_dry_run = ReactOnRails::Utils.object_to_boolean(args_hash[:dry_run]) - - gem_version = args_hash.fetch(:gem_version, "") - - npm_version = if gem_version.strip.empty? - "" - else - ReactOnRails::VersionSyntaxConverter.new.rubygem_to_npm(gem_version) - end - - # Delete any react_on_rails.gemspec except the root one - sh_in_dir(gem_root, "find . -mindepth 2 -name 'react_on_rails_pro.gemspec' -delete") - - # See https://github.com/svenfuchs/gem-release - sh_in_dir(gem_root, "git pull --rebase") - sh_in_dir(gem_root, "gem bump --no-commit #{gem_version.strip.empty? ? '' : %(--version #{gem_version})}") - - # Update the child spec apps with the new gem - bundle_install_in(dummy_app_dir, frozen: false) - # Update top level Gemfile.lock - bundle_install_in(gem_root, frozen: false) - - # Will bump the yarn version, commit, tag the commit, push to repo, and release on yarn - release_it_command = +"$(yarn bin)/release-it" - release_it_command << " #{npm_version}" unless npm_version.strip.empty? - release_it_command << " --ci --verbose" - release_it_command << " --dry-run" if is_dry_run - sh_in_dir(gem_root, release_it_command) - - # Release the new gem version - gem_push_command = "gem release --key github --host https://rubygems.pkg.github.com/shakacode-tools" - sh_in_dir(gem_root, gem_push_command) unless is_dry_run - - msg = <<~MSG - Once you have successfully published, check the publication of the new versions: - * https://github.com/shakacode-tools/react_on_rails_pro/packages - MSG - puts msg -end - -# rubocop:enable Metrics/BlockLength diff --git a/react_on_rails_pro/react_on_rails_pro.gemspec b/react_on_rails_pro/react_on_rails_pro.gemspec index 0b95a6e910..59b0b6aab6 100644 --- a/react_on_rails_pro/react_on_rails_pro.gemspec +++ b/react_on_rails_pro/react_on_rails_pro.gemspec @@ -4,6 +4,10 @@ lib = File.expand_path("lib", __dir__) $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) require "react_on_rails_pro/version" +# Load the core react_on_rails version for dependency +# This is evaluated at build time, not on user machines +require_relative "../lib/react_on_rails/version" + Gem::Specification.new do |s| s.name = "react_on_rails_pro" s.version = ReactOnRailsPro::VERSION @@ -34,7 +38,7 @@ Gem::Specification.new do |s| s.add_runtime_dependency "httpx", "~> 1.5" s.add_runtime_dependency "jwt", "~> 2.7" s.add_runtime_dependency "rainbow" - s.add_runtime_dependency "react_on_rails", ">= 16.0.0" + s.add_runtime_dependency "react_on_rails", ReactOnRails::VERSION s.add_development_dependency "bundler" s.add_development_dependency "commonmarker" s.add_development_dependency "gem-release" diff --git a/react_on_rails_pro/script/release b/react_on_rails_pro/script/release deleted file mode 100644 index cb20c43130..0000000000 --- a/react_on_rails_pro/script/release +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash - -echo "See `rake -D release`" diff --git a/react_on_rails_pro/spec/dummy/Gemfile.lock b/react_on_rails_pro/spec/dummy/Gemfile.lock index 4a000e6931..bbd82b79bd 100644 --- a/react_on_rails_pro/spec/dummy/Gemfile.lock +++ b/react_on_rails_pro/spec/dummy/Gemfile.lock @@ -20,14 +20,14 @@ PATH PATH remote: ../.. specs: - react_on_rails_pro (4.0.0) + react_on_rails_pro (16.1.1) addressable connection_pool execjs (~> 2.9) httpx (~> 1.5) jwt (~> 2.7) rainbow - react_on_rails (>= 16.0.0) + react_on_rails (= 16.1.1) GEM remote: https://rubygems.org/ diff --git a/react_on_rails_pro/yarn.lock b/react_on_rails_pro/yarn.lock index 57f7780ab6..821d238200 100644 --- a/react_on_rails_pro/yarn.lock +++ b/react_on_rails_pro/yarn.lock @@ -1189,16 +1189,6 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.4.2.tgz#1860473de7dfa1546767448f333db80cb0ff2161" integrity sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ== -"@iarna/toml@2.2.5": - version "2.2.5" - resolved "https://registry.yarnpkg.com/@iarna/toml/-/toml-2.2.5.tgz#b32366c89b43c6f8cefbdefac778b9c828e3ba8c" - integrity sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg== - -"@inquirer/figures@^1.0.3": - version "1.0.5" - resolved "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.5.tgz#57f9a996d64d3e3345d2a3ca04d36912e94f8790" - integrity sha512-79hP/VWdZ2UVc9bFGJnoQ/lQMpL74mGgzSYX1xUqCVk7/v73vJCMw1VuyWN1jGkZ9B3z7THAbySqGbCNefcjfA== - "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" @@ -1476,127 +1466,11 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@octokit/auth-token@^4.0.0": - version "4.0.0" - resolved "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-4.0.0.tgz#40d203ea827b9f17f42a29c6afb93b7745ef80c7" - integrity sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA== - -"@octokit/core@^5.0.2": - version "5.2.0" - resolved "https://registry.npmjs.org/@octokit/core/-/core-5.2.0.tgz#ddbeaefc6b44a39834e1bb2e58a49a117672a7ea" - integrity sha512-1LFfa/qnMQvEOAdzlQymH0ulepxbxnCYAKJZfMci/5XJyIHWgEYnDmgnKakbTh7CH2tFQ5O60oYDvns4i9RAIg== - dependencies: - "@octokit/auth-token" "^4.0.0" - "@octokit/graphql" "^7.1.0" - "@octokit/request" "^8.3.1" - "@octokit/request-error" "^5.1.0" - "@octokit/types" "^13.0.0" - before-after-hook "^2.2.0" - universal-user-agent "^6.0.0" - -"@octokit/endpoint@^9.0.6": - version "9.0.6" - resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-9.0.6.tgz#114d912108fe692d8b139cfe7fc0846dfd11b6c0" - integrity sha512-H1fNTMA57HbkFESSt3Y9+FBICv+0jFceJFPWDePYlR/iMGrwM5ph+Dd4XRQs+8X+PUFURLQgX9ChPfhJ/1uNQw== - dependencies: - "@octokit/types" "^13.1.0" - universal-user-agent "^6.0.0" - -"@octokit/graphql@^7.1.0": - version "7.1.1" - resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-7.1.1.tgz#79d9f3d0c96a8fd13d64186fe5c33606d48b79cc" - integrity sha512-3mkDltSfcDUoa176nlGoA32RGjeWjl3K7F/BwHwRMJUW/IteSa4bnSV8p2ThNkcIcZU2umkZWxwETSSCJf2Q7g== - dependencies: - "@octokit/request" "^8.4.1" - "@octokit/types" "^13.0.0" - universal-user-agent "^6.0.0" - -"@octokit/openapi-types@^23.0.1": - version "23.0.1" - resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-23.0.1.tgz#3721646ecd36b596ddb12650e0e89d3ebb2dd50e" - integrity sha512-izFjMJ1sir0jn0ldEKhZ7xegCTj/ObmEDlEfpFrx4k/JyZSMRHbO3/rBwgE7f3m2DHt+RrNGIVw4wSmwnm3t/g== - -"@octokit/plugin-paginate-rest@11.3.1": - version "11.3.1" - resolved "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.3.1.tgz#fe92d04b49f134165d6fbb716e765c2f313ad364" - integrity sha512-ryqobs26cLtM1kQxqeZui4v8FeznirUsksiA+RYemMPJ7Micju0WSkv50dBksTuZks9O5cg4wp+t8fZ/cLY56g== - dependencies: - "@octokit/types" "^13.5.0" - -"@octokit/plugin-request-log@^4.0.0": - version "4.0.1" - resolved "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-4.0.1.tgz#98a3ca96e0b107380664708111864cb96551f958" - integrity sha512-GihNqNpGHorUrO7Qa9JbAl0dbLnqJVrV8OXe2Zm5/Y4wFkZQDfTreBzVmiRfJVfE4mClXdihHnbpyyO9FSX4HA== - -"@octokit/plugin-rest-endpoint-methods@13.2.2": - version "13.2.2" - resolved "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-13.2.2.tgz#af8e5dd2cddfea576f92ffaf9cb84659f302a638" - integrity sha512-EI7kXWidkt3Xlok5uN43suK99VWqc8OaIMktY9d9+RNKl69juoTyxmLoWPIZgJYzi41qj/9zU7G/ljnNOJ5AFA== - dependencies: - "@octokit/types" "^13.5.0" - -"@octokit/request-error@^5.1.0", "@octokit/request-error@^5.1.1": - version "5.1.1" - resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-5.1.1.tgz#b9218f9c1166e68bb4d0c89b638edc62c9334805" - integrity sha512-v9iyEQJH6ZntoENr9/yXxjuezh4My67CBSu9r6Ve/05Iu5gNgnisNWOsoJHTP6k0Rr0+HQIpnH+kyammu90q/g== - dependencies: - "@octokit/types" "^13.1.0" - deprecation "^2.0.0" - once "^1.4.0" - -"@octokit/request@^8.3.1", "@octokit/request@^8.4.1": - version "8.4.1" - resolved "https://registry.yarnpkg.com/@octokit/request/-/request-8.4.1.tgz#715a015ccf993087977ea4365c44791fc4572486" - integrity sha512-qnB2+SY3hkCmBxZsR/MPCybNmbJe4KAlfWErXq+rBKkQJlbjdJeS85VI9r8UqeLYLvnAenU8Q1okM/0MBsAGXw== - dependencies: - "@octokit/endpoint" "^9.0.6" - "@octokit/request-error" "^5.1.1" - "@octokit/types" "^13.1.0" - universal-user-agent "^6.0.0" - -"@octokit/rest@20.1.1": - version "20.1.1" - resolved "https://registry.npmjs.org/@octokit/rest/-/rest-20.1.1.tgz#ec775864f53fb42037a954b9a40d4f5275b3dc95" - integrity sha512-MB4AYDsM5jhIHro/dq4ix1iWTLGToIGk6cWF5L6vanFaMble5jTX/UBQyiv05HsWnwUtY8JrfHy2LWfKwihqMw== - dependencies: - "@octokit/core" "^5.0.2" - "@octokit/plugin-paginate-rest" "11.3.1" - "@octokit/plugin-request-log" "^4.0.0" - "@octokit/plugin-rest-endpoint-methods" "13.2.2" - -"@octokit/types@^13.0.0", "@octokit/types@^13.1.0", "@octokit/types@^13.5.0": - version "13.8.0" - resolved "https://registry.yarnpkg.com/@octokit/types/-/types-13.8.0.tgz#3815885e5abd16ed9ffeea3dced31d37ce3f8a0a" - integrity sha512-x7DjTIbEpEWXK99DMd01QfWy0hd5h4EN+Q7shkdKds3otGQP+oWE/y0A76i1OvH9fygo4ddvNf7ZvF0t78P98A== - dependencies: - "@octokit/openapi-types" "^23.0.1" - "@pkgr/core@^0.2.1": version "0.2.1" resolved "https://registry.yarnpkg.com/@pkgr/core/-/core-0.2.1.tgz#6d083acfddae21fb329c8df8c94bf895ce7d0c15" integrity sha512-VzgHzGblFmUeBmmrk55zPyrQIArQN4vujc9shWytaPdB3P7qhi0cpaiKIr7tlCmFv2lYUwnLospIqjL9ZSAhhg== -"@pnpm/config.env-replace@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz#ab29da53df41e8948a00f2433f085f54de8b3a4c" - integrity sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w== - -"@pnpm/network.ca-file@^1.0.1": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz#2ab05e09c1af0cdf2fcf5035bea1484e222f7983" - integrity sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA== - dependencies: - graceful-fs "4.2.10" - -"@pnpm/npm-conf@^2.1.0": - version "2.2.2" - resolved "https://registry.yarnpkg.com/@pnpm/npm-conf/-/npm-conf-2.2.2.tgz#0058baf1c26cbb63a828f0193795401684ac86f0" - integrity sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA== - dependencies: - "@pnpm/config.env-replace" "^1.1.0" - "@pnpm/network.ca-file" "^1.0.1" - config-chain "^1.1.11" - "@redis/bloom@5.8.3": version "5.8.3" resolved "https://registry.yarnpkg.com/@redis/bloom/-/bloom-5.8.3.tgz#c0f04cba102eeb3a68792a599f7c320915eba366" @@ -1684,11 +1558,6 @@ resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== -"@sindresorhus/merge-streams@^2.1.0": - version "2.3.0" - resolved "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz#719df7fb41766bc143369eaa0dd56d8dc87c9958" - integrity sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg== - "@sinonjs/commons@^3.0.0": version "3.0.1" resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.1.tgz#1029357e44ca901a615585f6d27738dbc89084cd" @@ -1708,11 +1577,6 @@ resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== -"@tootallnate/quickjs-emscripten@^0.23.0": - version "0.23.0" - resolved "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz#db4ecfd499a9765ab24002c3b696d02e6d32a12c" - integrity sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA== - "@tsconfig/node14@^14.1.2": version "14.1.2" resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-14.1.2.tgz#ed84879e927a2f12ae8bb020baa990bd4cc3dabb" @@ -2170,11 +2034,6 @@ agent-base@^4.3.0: dependencies: es6-promisify "^5.0.0" -agent-base@^7.1.0, agent-base@^7.1.2: - version "7.1.3" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.3.tgz#29435eb821bc4194633a5b89e5bc4703bafc25a1" - integrity sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw== - ajv-formats@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-3.0.1.tgz#3d5dc762bca17679c3c2ea7e90ad6b7532309578" @@ -2209,14 +2068,7 @@ ansi-align@^2.0.0: dependencies: string-width "^2.0.0" -ansi-align@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" - integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== - dependencies: - string-width "^4.1.0" - -ansi-escapes@^4.2.1, ansi-escapes@^4.3.2: +ansi-escapes@^4.2.1: version "4.3.2" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== @@ -2238,11 +2090,6 @@ ansi-regex@^5.0.1: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== -ansi-regex@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" - integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== - ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" @@ -2262,11 +2109,6 @@ ansi-styles@^5.0.0: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== -ansi-styles@^6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" - integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== - anymatch@^3.0.3, anymatch@~3.1.2: version "3.1.3" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" @@ -2391,25 +2233,11 @@ ast-types-flow@^0.0.8: resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.8.tgz#0a85e1c92695769ac13a428bb653e7538bea27d6" integrity sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ== -ast-types@^0.13.4: - version "0.13.4" - resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.4.tgz#ee0d77b343263965ecc3fb62da16e7222b2b6782" - integrity sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w== - dependencies: - tslib "^2.0.1" - async-limiter@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== -async-retry@1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/async-retry/-/async-retry-1.3.3.tgz#0e7f36c04d8478e7a58bdbed80cedf977785f280" - integrity sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw== - dependencies: - retry "0.13.1" - asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -2420,14 +2248,6 @@ atomic-sleep@^1.0.0: resolved "https://registry.yarnpkg.com/atomic-sleep/-/atomic-sleep-1.0.0.tgz#eb85b77a601fc932cfe432c5acd364a9e2c9075b" integrity sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ== -atomically@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/atomically/-/atomically-2.0.3.tgz#27e47bbe39994d324918491ba7c0edb7783e56cb" - integrity sha512-kU6FmrwZ3Lx7/7y3hPS5QnbJfaohcIul5fGqf7ok+4KklIEk9tJ0C2IQPdacSbVUWv6zVHXEBWoWd6NrVMT7Cw== - dependencies: - stubborn-fs "^1.2.5" - when-exit "^2.1.1" - available-typed-arrays@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" @@ -2547,30 +2367,11 @@ base64-js@^1.3.1: resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== -basic-ftp@^5.0.2: - version "5.0.5" - resolved "https://registry.yarnpkg.com/basic-ftp/-/basic-ftp-5.0.5.tgz#14a474f5fffecca1f4f406f1c26b18f800225ac0" - integrity sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg== - -before-after-hook@^2.2.0: - version "2.2.3" - resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.3.tgz#c51e809c81a4e354084422b9b26bad88249c517c" - integrity sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ== - binary-extensions@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== -bl@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" - integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== - dependencies: - buffer "^5.5.0" - inherits "^2.0.4" - readable-stream "^3.4.0" - body-parser@^1.20.1, "body-parser@npm:empty-npm-package@1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/empty-npm-package/-/empty-npm-package-1.0.0.tgz#fda29eb6de5efa391f73d578697853af55f6793a" @@ -2589,20 +2390,6 @@ boxen@^1.2.1: term-size "^1.2.0" widest-line "^2.0.0" -boxen@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/boxen/-/boxen-8.0.1.tgz#7e9fcbb45e11a2d7e6daa8fdcebfc3242fc19fe3" - integrity sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw== - dependencies: - ansi-align "^3.0.1" - camelcase "^8.0.0" - chalk "^5.3.0" - cli-boxes "^3.0.0" - string-width "^7.2.0" - type-fest "^4.21.0" - widest-line "^5.0.0" - wrap-ansi "^9.0.0" - brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -2680,14 +2467,6 @@ buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== -buffer@^5.5.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" - integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.1.13" - buffer@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" @@ -2696,13 +2475,6 @@ buffer@^6.0.3: base64-js "^1.3.1" ieee754 "^1.2.1" -bundle-name@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz#f3b96b34160d6431a19d7688135af7cfb8797889" - integrity sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q== - dependencies: - run-applescript "^7.0.0" - call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" @@ -2749,11 +2521,6 @@ camelcase@^6.2.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -camelcase@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-8.0.0.tgz#c0d36d418753fb6ad9c5e0437579745c1c14a534" - integrity sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA== - caniuse-lite@^1.0.30001688: version "1.0.30001712" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001712.tgz#41ee150f12de11b5f57c5889d4f30deb451deedf" @@ -2772,11 +2539,6 @@ carlo@^0.9.46: debug "^4.1.0" puppeteer-core "~1.12.0" -chalk@5.4.1, chalk@^5.3.0: - version "5.4.1" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.4.1.tgz#1b48bf0963ec158dce2aacf69c093ae2dd2092d8" - integrity sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w== - chalk@^2.0.1: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" @@ -2799,11 +2561,6 @@ char-regex@^1.0.2: resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== -chardet@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" - integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== - chokidar@^3.0.2: version "3.6.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" @@ -2834,11 +2591,6 @@ ci-info@^3.2.0: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== -ci-info@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-4.2.0.tgz#cbd21386152ebfe1d56f280a3b5feccbd96764c7" - integrity sha512-cYY9mypksY8NRqgDB1XD1RiJL338v/551niynFTGkZOO2LHuB2OmOYxDIe/ttN9AHwrqdum1360G3ald0W9kCg== - cjs-module-lexer@^1.0.0: version "1.3.1" resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz#c485341ae8fd999ca4ee5af2d7a1c9ae01e0099c" @@ -2849,35 +2601,6 @@ cli-boxes@^1.0.0: resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" integrity sha512-3Fo5wu8Ytle8q9iCzS4D2MWVL2X7JVWRiS1BnXbTFDhS9c/REkM9vd1AmabsoZoY5/dGi5TT9iKL8Kb6DeBRQg== -cli-boxes@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-3.0.0.tgz#71a10c716feeba005e4504f36329ef0b17cf3145" - integrity sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g== - -cli-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" - integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== - dependencies: - restore-cursor "^3.1.0" - -cli-cursor@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-5.0.0.tgz#24a4831ecf5a6b01ddeb32fb71a4b2088b0dce38" - integrity sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw== - dependencies: - restore-cursor "^5.0.0" - -cli-spinners@^2.5.0, cli-spinners@^2.9.2: - version "2.9.2" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.2.tgz#1773a8f4b9c4d6ac31563df53b3fc1d79462fe41" - integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== - -cli-width@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz#42daac41d3c254ef38ad8ac037672130173691c5" - integrity sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ== - cliui@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" @@ -2905,11 +2628,6 @@ cliui@^8.0.1: strip-ansi "^6.0.1" wrap-ansi "^7.0.0" -clone@^1.0.2: - version "1.0.4" - resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" - integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== - cluster-key-slot@1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz#88ddaa46906e303b5de30d3153b7d9fe0a0c19ac" @@ -2999,14 +2717,6 @@ concurrently@^9.1.0: tree-kill "^1.2.2" yargs "^17.7.2" -config-chain@^1.1.11: - version "1.1.13" - resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.13.tgz#fad0795aa6a6cdaff9ed1b68e9dff94372c232f4" - integrity sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ== - dependencies: - ini "^1.3.4" - proto-list "~1.2.1" - configstore@^3.0.0: version "3.1.5" resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.5.tgz#e9af331fadc14dabd544d3e7e76dc446a09a530f" @@ -3019,16 +2729,6 @@ configstore@^3.0.0: write-file-atomic "^2.0.0" xdg-basedir "^3.0.0" -configstore@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/configstore/-/configstore-7.0.0.tgz#4461561fc51cb40e5ee1161230bc0337e069cc6b" - integrity sha512-yk7/5PN5im4qwz0WFZW3PXnzHgPu9mX29Y8uZ3aefe2lBPC1FYttWZRcaW9fKkT0pBCJyuQ2HfbmPVaODi9jcQ== - dependencies: - atomically "^2.0.3" - dot-prop "^9.0.0" - graceful-fs "^4.2.11" - xdg-basedir "^5.1.0" - confusing-browser-globals@^1.0.10: version "1.0.11" resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz#ae40e9b57cdd3915408a2805ebd3a5585608dc81" @@ -3056,16 +2756,6 @@ core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== -cosmiconfig@9.0.0: - version "9.0.0" - resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz#34c3fc58287b915f3ae905ab6dc3de258b55ad9d" - integrity sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg== - dependencies: - env-paths "^2.2.1" - import-fresh "^3.3.0" - js-yaml "^4.1.0" - parse-json "^5.2.0" - cosmiconfig@^7.0.0: version "7.1.0" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" @@ -3142,11 +2832,6 @@ damerau-levenshtein@^1.0.8: resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== -data-uri-to-buffer@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz#8a58bb67384b261a38ef18bea1810cb01badd28b" - integrity sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw== - data-urls@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" @@ -3239,26 +2924,6 @@ deepmerge@^4.2.2: resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== -default-browser-id@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz#a1d98bf960c15082d8a3fa69e83150ccccc3af26" - integrity sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA== - -default-browser@^5.2.1: - version "5.2.1" - resolved "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz#7b7ba61204ff3e425b556869ae6d3e9d9f1712cf" - integrity sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg== - dependencies: - bundle-name "^4.1.0" - default-browser-id "^5.0.0" - -defaults@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" - integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== - dependencies: - clone "^1.0.2" - define-data-property@^1.0.1, define-data-property@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" @@ -3268,11 +2933,6 @@ define-data-property@^1.0.1, define-data-property@^1.1.4: es-errors "^1.3.0" gopd "^1.0.1" -define-lazy-prop@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz#dbb19adfb746d7fc6d734a06b72f4a00d021255f" - integrity sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg== - define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" @@ -3282,25 +2942,11 @@ define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1: has-property-descriptors "^1.0.0" object-keys "^1.1.1" -degenerator@^5.0.0: - version "5.0.1" - resolved "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz#9403bf297c6dad9a1ece409b37db27954f91f2f5" - integrity sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ== - dependencies: - ast-types "^0.13.4" - escodegen "^2.1.0" - esprima "^4.0.1" - delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== -deprecation@^2.0.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" - integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ== - detect-indent@^6.0.0: version "6.1.0" resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.1.0.tgz#592485ebbbf6b3b1ab2be175c8393d04ca0d57e6" @@ -3337,13 +2983,6 @@ dot-prop@^4.2.1: dependencies: is-obj "^1.0.0" -dot-prop@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-9.0.0.tgz#bae5982fe6dc6b8fddb92efef4f2ddff26779e92" - integrity sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ== - dependencies: - type-fest "^4.18.2" - dunder-proto@^1.0.0, dunder-proto@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" @@ -3380,11 +3019,6 @@ emittery@^0.13.1: resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== -emoji-regex@^10.3.0: - version "10.3.0" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz#76998b9268409eb3dae3de989254d456e70cfe23" - integrity sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw== - emoji-regex@^7.0.1: version "7.0.3" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" @@ -3407,11 +3041,6 @@ end-of-stream@^1.1.0: dependencies: once "^1.4.0" -env-paths@^2.2.1: - version "2.2.1" - resolved "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" - integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== - error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" @@ -3558,11 +3187,6 @@ escalade@^3.1.1, escalade@^3.2.0: resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== -escape-goat@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-4.0.0.tgz#9424820331b510b0666b98f7873fe11ac4aa8081" - integrity sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg== - escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" @@ -3578,7 +3202,7 @@ escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -escodegen@^2.0.0, escodegen@^2.1.0: +escodegen@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17" integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== @@ -3884,21 +3508,6 @@ events@^3.3.0: resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== -execa@8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-8.0.0.tgz#bed67705f9966469cd93e521617868c52a4df6e8" - integrity sha512-CTNS0BcKBcoOsawKBlpcKNmK4Kjuyz5jVLhf+PUsHGMqiKMVTa4cN3U7r7bRY8KTpfOGpXMo27fdy0dYVg2pqA== - dependencies: - cross-spawn "^7.0.3" - get-stream "^8.0.1" - human-signals "^5.0.0" - is-stream "^3.0.0" - merge-stream "^2.0.0" - npm-run-path "^5.1.0" - onetime "^6.0.0" - signal-exit "^4.1.0" - strip-final-newline "^3.0.0" - execa@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" @@ -3912,7 +3521,7 @@ execa@^0.7.0: signal-exit "^3.0.0" strip-eof "^1.0.0" -execa@^5.0.0, execa@^5.1.1: +execa@^5.0.0: version "5.1.1" resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== @@ -3948,15 +3557,6 @@ express@^4.18.2, "express@npm:empty-npm-package@1.0.0": resolved "https://registry.yarnpkg.com/empty-npm-package/-/empty-npm-package-1.0.0.tgz#fda29eb6de5efa391f73d578697853af55f6793a" integrity sha512-q4Mq/+XO7UNDdMiPpR/LIBIW1Zl4V0Z6UT9aKGqIAnBCtCb3lvZJM1KbDbdzdC8fKflwflModfjR29Nt0EpcwA== -external-editor@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" - integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== - dependencies: - chardet "^0.7.0" - iconv-lite "^0.4.24" - tmp "^0.0.33" - extract-zip@^1.6.6: version "1.7.0" resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.7.0.tgz#556cc3ae9df7f452c493a0cfb51cc30277940927" @@ -4271,11 +3871,6 @@ get-caller-file@^2.0.1, get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-east-asian-width@^1.0.0: - version "1.2.0" - resolved "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz#5e6ebd9baee6fb8b7b6bd505221065f0cd91f64e" - integrity sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA== - get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@^1.2.7, get-intrinsic@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" @@ -4315,11 +3910,6 @@ get-stream@^6.0.0: resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== -get-stream@^8.0.1: - version "8.0.1" - resolved "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz#def9dfd71742cd7754a7761ed43749a27d02eca2" - integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== - get-symbol-description@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.1.0.tgz#7bdd54e0befe8ffc9f3b4e203220d9f1e881b6ee" @@ -4336,31 +3926,6 @@ get-tsconfig@^4.10.0: dependencies: resolve-pkg-maps "^1.0.0" -get-uri@^6.0.1: - version "6.0.3" - resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-6.0.3.tgz#0d26697bc13cf91092e519aa63aa60ee5b6f385a" - integrity sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw== - dependencies: - basic-ftp "^5.0.2" - data-uri-to-buffer "^6.0.2" - debug "^4.3.4" - fs-extra "^11.2.0" - -git-up@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/git-up/-/git-up-7.0.0.tgz#bace30786e36f56ea341b6f69adfd83286337467" - integrity sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ== - dependencies: - is-ssh "^1.4.0" - parse-url "^8.1.0" - -git-url-parse@14.0.0: - version "14.0.0" - resolved "https://registry.npmjs.org/git-url-parse/-/git-url-parse-14.0.0.tgz#18ce834726d5fbca0c25a4555101aa277017418f" - integrity sha512-NnLweV+2A4nCvn4U/m2AoYu0pPKlsmhK9cknG7IMwsjFY1S2jxM+mAhsDxyxfCIGfGaD+dozsyX4b6vkYc83yQ== - dependencies: - git-up "^7.0.0" - glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" @@ -4375,7 +3940,7 @@ glob-parent@^6.0.2: dependencies: is-glob "^4.0.3" -glob@^7.0.0, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: +glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -4387,13 +3952,6 @@ glob@^7.0.0, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: once "^1.3.0" path-is-absolute "^1.0.0" -global-directory@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz#4d7ac7cfd2cb73f304c53b8810891748df5e361e" - integrity sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q== - dependencies: - ini "4.1.1" - global-dirs@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" @@ -4424,18 +3982,6 @@ globalthis@^1.0.4: define-properties "^1.2.1" gopd "^1.0.1" -globby@14.0.2: - version "14.0.2" - resolved "https://registry.npmjs.org/globby/-/globby-14.0.2.tgz#06554a54ccfe9264e5a9ff8eded46aa1e306482f" - integrity sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw== - dependencies: - "@sindresorhus/merge-streams" "^2.1.0" - fast-glob "^3.3.2" - ignore "^5.2.4" - path-type "^5.0.0" - slash "^5.1.0" - unicorn-magic "^0.1.0" - gopd@^1.0.1, gopd@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" @@ -4458,12 +4004,7 @@ got@^6.7.1: unzip-response "^2.0.1" url-parse-lax "^1.0.0" -graceful-fs@4.2.10: - version "4.2.10" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" - integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== - -graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.9: +graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.9: version "4.2.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== @@ -4547,14 +4088,6 @@ http-proxy-agent@^4.0.1: agent-base "6" debug "4" -http-proxy-agent@^7.0.0, http-proxy-agent@^7.0.1: - version "7.0.2" - resolved "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz#9a8b1f246866c028509486585f62b8f2c18c270e" - integrity sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig== - dependencies: - agent-base "^7.1.0" - debug "^4.3.4" - https-proxy-agent@^2.2.1: version "2.2.4" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz#4ee7a737abd92678a293d9b34a1af4d0d08c787b" @@ -4571,24 +4104,11 @@ https-proxy-agent@^5.0.0: agent-base "6" debug "4" -https-proxy-agent@^7.0.6: - version "7.0.6" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz#da8dfeac7da130b05c2ba4b59c9b6cd66611a6b9" - integrity sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw== - dependencies: - agent-base "^7.1.2" - debug "4" - human-signals@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== -human-signals@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz#42665a284f9ae0dade3ba41ebc37eb4b852f3a28" - integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ== - husky@^4.3.6: version "4.3.8" resolved "https://registry.yarnpkg.com/husky/-/husky-4.3.8.tgz#31144060be963fd6850e5cc8f019a1dfe194296d" @@ -4605,14 +4125,14 @@ husky@^4.3.6: slash "^3.0.0" which-pm-runs "^1.0.0" -iconv-lite@0.4.24, iconv-lite@^0.4.24: +iconv-lite@0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" -ieee754@^1.1.13, ieee754@^1.2.1: +ieee754@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== @@ -4624,7 +4144,7 @@ ignore-walk@^3.0.3: dependencies: minimatch "^3.0.4" -ignore@^5.0.4, ignore@^5.2.0, ignore@^5.2.4, ignore@^5.3.1: +ignore@^5.0.4, ignore@^5.2.0, ignore@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== @@ -4634,7 +4154,7 @@ immediate@~3.0.5: resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== -import-fresh@^3.2.1, import-fresh@^3.3.0: +import-fresh@^3.2.1: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== @@ -4668,16 +4188,11 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: +inherits@2, inherits@^2.0.3, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -ini@4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ini/-/ini-4.1.1.tgz#d95b3d843b1e906e56d6747d5447904ff50ce7a1" - integrity sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g== - ini@^1.3.4, ini@~1.3.0: version "1.3.8" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" @@ -4688,24 +4203,6 @@ ini@^2.0.0: resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== -inquirer@9.3.2: - version "9.3.2" - resolved "https://registry.npmjs.org/inquirer/-/inquirer-9.3.2.tgz#9bc5ced19f572e848044baa05094a498f1e448c6" - integrity sha512-+ynEbhWKhyomnaX0n2aLIMSkgSlGB5RrWbNXnEqj6mdaIydu6y40MdBjL38SAB0JcdmOaIaMua1azdjLEr3sdw== - dependencies: - "@inquirer/figures" "^1.0.3" - ansi-escapes "^4.3.2" - cli-width "^4.1.0" - external-editor "^3.1.0" - mute-stream "1.0.0" - ora "^5.4.1" - run-async "^3.0.0" - rxjs "^7.8.1" - string-width "^4.2.3" - strip-ansi "^6.0.1" - wrap-ansi "^6.2.0" - yoctocolors-cjs "^2.1.1" - internal-slot@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.1.0.tgz#1eac91762947d2f7056bc838d93e13b2e9604961" @@ -4715,19 +4212,6 @@ internal-slot@^1.1.0: hasown "^2.0.2" side-channel "^1.1.0" -interpret@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" - integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== - -ip-address@^9.0.5: - version "9.0.5" - resolved "https://registry.yarnpkg.com/ip-address/-/ip-address-9.0.5.tgz#117a960819b08780c3bd1f14ef3c1cc1d3f3ea5a" - integrity sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g== - dependencies: - jsbn "1.1.0" - sprintf-js "^1.1.3" - ipaddr.js@^2.1.0: version "2.2.0" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.2.0.tgz#d33fa7bac284f4de7af949638c9d68157c6b92e8" @@ -4819,11 +4303,6 @@ is-date-object@^1.0.5, is-date-object@^1.1.0: call-bound "^1.0.2" has-tostringtag "^1.0.2" -is-docker@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-3.0.0.tgz#90093aa3106277d8a77a5910dbae71747e15a200" - integrity sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ== - is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" @@ -4865,18 +4344,6 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" -is-in-ci@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-in-ci/-/is-in-ci-1.0.0.tgz#9a86bbda7e42c6129902e0574c54b018fbb6ab88" - integrity sha512-eUuAjybVTHMYWm/U+vBO1sY/JOCgoPCXRxzdju0K+K0BiGW0SChEL1MLC0PoCIR1OlPo5YAp8HuQoUlsWEICwg== - -is-inside-container@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-inside-container/-/is-inside-container-1.0.0.tgz#e81fba699662eb31dbdaf26766a61d4814717ea4" - integrity sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA== - dependencies: - is-docker "^3.0.0" - is-installed-globally@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80" @@ -4885,24 +4352,6 @@ is-installed-globally@^0.1.0: global-dirs "^0.1.0" is-path-inside "^1.0.0" -is-installed-globally@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-1.0.0.tgz#08952c43758c33d815692392f7f8437b9e436d5a" - integrity sha512-K55T22lfpQ63N4KEN57jZUAaAYqYHEe8veb/TycJRk9DdSCLLcovXz/mL6mOnhQaZsQGwPhuFopdQIlqGSEjiQ== - dependencies: - global-directory "^4.0.1" - is-path-inside "^4.0.0" - -is-interactive@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" - integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== - -is-interactive@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-2.0.0.tgz#40c57614593826da1100ade6059778d597f16e90" - integrity sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ== - is-map@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" @@ -4913,11 +4362,6 @@ is-npm@^1.0.0: resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" integrity sha512-9r39FIr3d+KD9SbX0sfMsHzb5PP3uimOiwr3YupUaUFG4W0l1U57Rx3utpttV7qz5U3jmrO5auUa04LU9pyHsg== -is-npm@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-6.0.0.tgz#b59e75e8915543ca5d881ecff864077cba095261" - integrity sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ== - is-number-object@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.1.1.tgz#144b21e95a1bc148205dcc2814a9134ec41b2541" @@ -4948,11 +4392,6 @@ is-path-inside@^1.0.0: dependencies: path-is-inside "^1.0.1" -is-path-inside@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz#805aeb62c47c1b12fc3fd13bfb3ed1e7430071db" - integrity sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA== - is-potential-custom-element-name@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" @@ -4990,13 +4429,6 @@ is-shared-array-buffer@^1.0.4: dependencies: call-bound "^1.0.3" -is-ssh@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/is-ssh/-/is-ssh-1.4.0.tgz#4f8220601d2839d8fa624b3106f8e8884f01b8b2" - integrity sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ== - dependencies: - protocols "^2.0.1" - is-stream@^1.0.0, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" @@ -5007,11 +4439,6 @@ is-stream@^2.0.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== -is-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" - integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== - is-string@^1.0.7, is-string@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.1.1.tgz#92ea3f3d5c5b6e039ca8677e5ac8d07ea773cbb9" @@ -5036,21 +4463,6 @@ is-typed-array@^1.1.13, is-typed-array@^1.1.14, is-typed-array@^1.1.15: dependencies: which-typed-array "^1.1.16" -is-unicode-supported@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" - integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== - -is-unicode-supported@^1.3.0: - version "1.3.0" - resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz#d824984b616c292a2e198207d4a609983842f714" - integrity sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ== - -is-unicode-supported@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.0.0.tgz#fdf32df9ae98ff6ab2cedc155a5a6e895701c451" - integrity sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q== - is-weakmap@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd" @@ -5076,13 +4488,6 @@ is-wsl@^1.1.0: resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" integrity sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw== -is-wsl@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz#e1c657e39c10090afcbedec61720f6b924c3cbd2" - integrity sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw== - dependencies: - is-inside-container "^1.0.0" - isarray@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" @@ -5105,17 +4510,6 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== -issue-parser@7.0.1: - version "7.0.1" - resolved "https://registry.npmjs.org/issue-parser/-/issue-parser-7.0.1.tgz#8a053e5a4952c75bb216204e454b4fc7d4cc9637" - integrity sha512-3YZcUUR2Wt1WsapF+S/WiA2WmlW0cWAoPccMqne7AxEBhCdFeTPjfv/Axb8V2gyCgY3nRw+ksZ3xSUX+R47iAg== - dependencies: - lodash.capitalize "^4.2.1" - lodash.escaperegexp "^4.1.2" - lodash.isplainobject "^4.0.6" - lodash.isstring "^4.0.1" - lodash.uniqby "^4.7.0" - istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" @@ -5574,11 +4968,6 @@ js-yaml@^4.1.0: dependencies: argparse "^2.0.1" -jsbn@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-1.1.0.tgz#b01307cb29b618a1ed26ec79e911f803c4da0040" - integrity sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A== - jsdom@^16.5.0: version "16.7.0" resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.7.0.tgz#918ae71965424b197c819f8183a754e18977b710" @@ -5742,11 +5131,6 @@ kleur@^3.0.3: resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== -ky@^1.2.0: - version "1.4.0" - resolved "https://registry.npmjs.org/ky/-/ky-1.4.0.tgz#68b4a71eccfb4177199fe6ee2d5041b50bb41931" - integrity sha512-tPhhoGUiEiU/WXR4rt8klIoLdnTtyu+9jVKHd/wauEjYud32jyn63mzKWQweaQrHWxBQtYoVtdcEnYX1LosnFQ== - language-subtag-registry@^0.3.20: version "0.3.23" resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz#23529e04d9e3b74679d70142df3fd2eb6ec572e7" @@ -5766,13 +5150,6 @@ latest-version@^3.0.0: dependencies: package-json "^4.0.0" -latest-version@^9.0.0: - version "9.0.0" - resolved "https://registry.npmjs.org/latest-version/-/latest-version-9.0.0.tgz#e91ed216e7a4badc6f73b66c65adb46c58ec6ba1" - integrity sha512-7W0vV3rqv5tokqkBAFV1LbR7HPOWzXQDpDgEuib/aJ1jsZZx6x3c2mBI+TJhJzOhkGeaLbCKEHXEXLfirtG2JA== - dependencies: - package-json "^10.0.0" - leven@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" @@ -5851,21 +5228,11 @@ lockfile@^1.0.4: dependencies: signal-exit "^3.0.2" -lodash.capitalize@^4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz#f826c9b4e2a8511d84e3aca29db05e1a4f3b72a9" - integrity sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw== - lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== -lodash.escaperegexp@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz#64762c48618082518ac3df4ccf5d5886dae20347" - integrity sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw== - lodash.includes@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" @@ -5906,32 +5273,11 @@ lodash.once@^4.0.0: resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" integrity sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg== -lodash.uniqby@^4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz#d99c07a669e9e6d24e1362dfe266c67616af1302" - integrity sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww== - -lodash@4.17.21, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.7.0: +lodash@^4.17.21, lodash@^4.17.4, lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== -log-symbols@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" - integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== - dependencies: - chalk "^4.1.0" - is-unicode-supported "^0.1.0" - -log-symbols@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz#bb95e5f05322651cac30c0feb6404f9f2a8a9439" - integrity sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw== - dependencies: - chalk "^5.3.0" - is-unicode-supported "^1.3.0" - loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" @@ -5959,16 +5305,6 @@ lru-cache@^5.1.1: dependencies: yallist "^3.0.2" -lru-cache@^7.14.1: - version "7.18.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" - integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== - -macos-release@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-3.2.0.tgz#dcee82b6a4932971b1538dbf6f3aabc4a903b613" - integrity sha512-fSErXALFNsnowREYZ49XCdOHF8wOPWuFOGQrAhP7x5J/BqQv+B02cNsTykGpDgRVx43EKg++6ANmTaGTtW+hUA== - make-dir@^1.0.0: version "1.3.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" @@ -6028,7 +5364,7 @@ mime-db@1.52.0: resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -mime-types@2.1.35, mime-types@^2.1.12: +mime-types@^2.1.12: version "2.1.35" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== @@ -6045,16 +5381,6 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -mimic-fn@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" - integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== - -mimic-function@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/mimic-function/-/mimic-function-5.0.1.tgz#acbe2b3349f99b9deaca7fb70e48b83e94e67076" - integrity sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA== - minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" @@ -6096,11 +5422,6 @@ ms@^2.1.1, ms@^2.1.3: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -mute-stream@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-1.0.0.tgz#e31bd9fe62f0aed23520aa4324ea6671531e013e" - integrity sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA== - nan@^2.14.0: version "2.20.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.20.0.tgz#08c5ea813dd54ed16e5bd6505bf42af4f7838ca3" @@ -6129,18 +5450,6 @@ ndb@^1.1.5: optionalDependencies: node-pty "^0.9.0-beta18" -netmask@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/netmask/-/netmask-2.0.2.tgz#8b01a07644065d536383835823bc52004ebac5e7" - integrity sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg== - -new-github-release-url@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/new-github-release-url/-/new-github-release-url-2.0.0.tgz#335189b91f52bbb9569042a7485900a205a0500b" - integrity sha512-NHDDGYudnvRutt/VhKFlX26IotXe1w0cmkDm6JGquh5bz/bDTw0LufSmH/GxTjEdpHEO+bVKFTwdrcGa/9XlKQ== - dependencies: - type-fest "^2.5.1" - node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" @@ -6199,13 +5508,6 @@ npm-run-path@^4.0.1: dependencies: path-key "^3.0.0" -npm-run-path@^5.1.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.3.0.tgz#e23353d0ebb9317f174e93417e4a4d82d0249e9f" - integrity sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ== - dependencies: - path-key "^4.0.0" - nps@^5.9.12: version "5.10.0" resolved "https://registry.yarnpkg.com/nps/-/nps-5.10.0.tgz#cb7e7c8fe9a0d28061bf1d496a7192694ddc6185" @@ -6307,37 +5609,13 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0: dependencies: wrappy "1" -onetime@^5.1.0, onetime@^5.1.2: +onetime@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== dependencies: mimic-fn "^2.1.0" -onetime@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" - integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== - dependencies: - mimic-fn "^4.0.0" - -onetime@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-7.0.0.tgz#9f16c92d8c9ef5120e3acd9dd9957cceecc1ab60" - integrity sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ== - dependencies: - mimic-function "^5.0.0" - -open@10.1.0: - version "10.1.0" - resolved "https://registry.npmjs.org/open/-/open-10.1.0.tgz#a7795e6e5d519abe4286d9937bb24b51122598e1" - integrity sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw== - dependencies: - default-browser "^5.2.1" - define-lazy-prop "^3.0.0" - is-inside-container "^1.0.0" - is-wsl "^3.1.0" - opencollective-postinstall@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz#7a0fff978f6dbfa4d006238fbac98ed4198c3259" @@ -6362,49 +5640,6 @@ optionator@^0.9.3: type-check "^0.4.0" word-wrap "^1.2.5" -ora@8.1.1: - version "8.1.1" - resolved "https://registry.yarnpkg.com/ora/-/ora-8.1.1.tgz#8efc8865e44c87e4b55468a47e80a03e678b0e54" - integrity sha512-YWielGi1XzG1UTvOaCFaNgEnuhZVMSHYkW/FQ7UX8O26PtlpdM84c0f7wLPlkvx2RfiQmnzd61d/MGxmpQeJPw== - dependencies: - chalk "^5.3.0" - cli-cursor "^5.0.0" - cli-spinners "^2.9.2" - is-interactive "^2.0.0" - is-unicode-supported "^2.0.0" - log-symbols "^6.0.0" - stdin-discarder "^0.2.2" - string-width "^7.2.0" - strip-ansi "^7.1.0" - -ora@^5.4.1: - version "5.4.1" - resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" - integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== - dependencies: - bl "^4.1.0" - chalk "^4.1.0" - cli-cursor "^3.1.0" - cli-spinners "^2.5.0" - is-interactive "^1.0.0" - is-unicode-supported "^0.1.0" - log-symbols "^4.1.0" - strip-ansi "^6.0.0" - wcwidth "^1.0.1" - -os-name@5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/os-name/-/os-name-5.1.0.tgz#4f5ab5edfa6938b590112714f1570fe79f1d957a" - integrity sha512-YEIoAnM6zFmzw3PQ201gCVCIWbXNyKObGlVvpAVvraAeOHnlYVKFssbA/riRX5R40WA6kKrZ7Dr7dWzO3nKSeQ== - dependencies: - macos-release "^3.1.0" - windows-release "^5.0.1" - -os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== - own-keys@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/own-keys/-/own-keys-1.0.1.tgz#e4006910a2bf913585289676eebd6f390cf51358" @@ -6478,38 +5713,6 @@ p-try@^2.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== -pac-proxy-agent@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz#9cfaf33ff25da36f6147a20844230ec92c06e5df" - integrity sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA== - dependencies: - "@tootallnate/quickjs-emscripten" "^0.23.0" - agent-base "^7.1.2" - debug "^4.3.4" - get-uri "^6.0.1" - http-proxy-agent "^7.0.0" - https-proxy-agent "^7.0.6" - pac-resolver "^7.0.1" - socks-proxy-agent "^8.0.5" - -pac-resolver@^7.0.1: - version "7.0.1" - resolved "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz#54675558ea368b64d210fd9c92a640b5f3b8abb6" - integrity sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg== - dependencies: - degenerator "^5.0.0" - netmask "^2.0.2" - -package-json@^10.0.0: - version "10.0.1" - resolved "https://registry.npmjs.org/package-json/-/package-json-10.0.1.tgz#e49ee07b8de63b638e7f1b5bb353733e428fe7d7" - integrity sha512-ua1L4OgXSBdsu1FPb7F3tYH0F48a6kxvod4pLUlGY9COeJAJQNX/sNH2IiEmsxw7lqYiAwrdHMjz1FctOsyDQg== - dependencies: - ky "^1.2.0" - registry-auth-token "^5.0.2" - registry-url "^6.0.1" - semver "^7.6.0" - package-json@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" @@ -6537,20 +5740,6 @@ parse-json@^5.0.0, parse-json@^5.2.0: json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" -parse-path@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/parse-path/-/parse-path-7.0.0.tgz#605a2d58d0a749c8594405d8cc3a2bf76d16099b" - integrity sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog== - dependencies: - protocols "^2.0.0" - -parse-url@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/parse-url/-/parse-url-8.1.0.tgz#972e0827ed4b57fc85f0ea6b0d839f0d8a57a57d" - integrity sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w== - dependencies: - parse-path "^7.0.0" - parse5@6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" @@ -6586,11 +5775,6 @@ path-key@^3.0.0, path-key@^3.1.0: resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== -path-key@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" - integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== - path-parse@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" @@ -6601,11 +5785,6 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== -path-type@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz#14b01ed7aea7ddf9c7c3f46181d4d04f9c785bb8" - integrity sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg== - pause-stream@0.0.11: version "0.0.11" resolved "https://registry.yarnpkg.com/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" @@ -6806,31 +5985,7 @@ prop-types@^15.8.1: object-assign "^4.1.1" react-is "^16.13.1" -proto-list@~1.2.1: - version "1.2.4" - resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" - integrity sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA== - -protocols@^2.0.0, protocols@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/protocols/-/protocols-2.0.1.tgz#8f155da3fc0f32644e83c5782c8e8212ccf70a86" - integrity sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q== - -proxy-agent@6.5.0: - version "6.5.0" - resolved "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-6.5.0.tgz#9e49acba8e4ee234aacb539f89ed9c23d02f232d" - integrity sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A== - dependencies: - agent-base "^7.1.2" - debug "^4.3.4" - http-proxy-agent "^7.0.1" - https-proxy-agent "^7.0.6" - lru-cache "^7.14.1" - pac-proxy-agent "^7.1.0" - proxy-from-env "^1.1.0" - socks-proxy-agent "^8.0.5" - -proxy-from-env@^1.0.0, proxy-from-env@^1.1.0: +proxy-from-env@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== @@ -6865,13 +6020,6 @@ punycode@^2.1.0, punycode@^2.1.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== -pupa@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/pupa/-/pupa-3.1.0.tgz#f15610274376bbcc70c9a3aa8b505ea23f41c579" - integrity sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug== - dependencies: - escape-goat "^4.0.0" - puppeteer-core@~1.12.0: version "1.12.2" resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-1.12.2.tgz#f4797979aa9fde1045e52b343840f60500d5988e" @@ -6906,7 +6054,7 @@ quick-format-unescaped@^4.0.3: resolved "https://registry.yarnpkg.com/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz#93ef6dd8d3453cbc7970dd614fad4c5954d6b5a7" integrity sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg== -rc@1.2.8, rc@^1.0.1, rc@^1.1.6: +rc@^1.0.1, rc@^1.1.6: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== @@ -6943,15 +6091,6 @@ readable-stream@^2.2.2: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^3.4.0: - version "3.6.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" - integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - readable-stream@^4.0.0: version "4.5.2" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-4.5.2.tgz#9e7fc4c45099baeed934bff6eb97ba6cf2729e09" @@ -6980,13 +6119,6 @@ real-require@^0.2.0: resolved "https://registry.yarnpkg.com/real-require/-/real-require-0.2.0.tgz#209632dea1810be2ae063a6ac084fee7e33fba78" integrity sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg== -rechoir@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" - integrity sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw== - dependencies: - resolve "^1.1.6" - redis@^5.0.1: version "5.8.3" resolved "https://registry.yarnpkg.com/redis/-/redis-5.8.3.tgz#c65d52ff9099579e278bf8ce100efbadafe5580a" @@ -7068,13 +6200,6 @@ registry-auth-token@^3.0.1: rc "^1.1.6" safe-buffer "^5.0.1" -registry-auth-token@^5.0.2: - version "5.0.2" - resolved "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.2.tgz#8b026cc507c8552ebbe06724136267e63302f756" - integrity sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ== - dependencies: - "@pnpm/npm-conf" "^2.1.0" - registry-url@^3.0.3: version "3.1.0" resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" @@ -7082,13 +6207,6 @@ registry-url@^3.0.3: dependencies: rc "^1.0.1" -registry-url@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz#056d9343680f2f64400032b1e199faa692286c58" - integrity sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q== - dependencies: - rc "1.2.8" - regjsgen@^0.8.0: version "0.8.0" resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.8.0.tgz#df23ff26e0c5b300a6470cad160a9d090c3a37ab" @@ -7101,36 +6219,6 @@ regjsparser@^0.12.0: dependencies: jsesc "~3.0.2" -release-it@^17.6.0: - version "17.11.0" - resolved "https://registry.yarnpkg.com/release-it/-/release-it-17.11.0.tgz#4cb858194f45fdc1966b8a53209efff887d1994e" - integrity sha512-qQGgfMbUZ3/vpXUPmngsgjFObOLjlkwtiozHUYen9fo9AEGciXjG1ZpGr+FNmuBT8R7TOSY+x/s84wOCRKJjbA== - dependencies: - "@iarna/toml" "2.2.5" - "@octokit/rest" "20.1.1" - async-retry "1.3.3" - chalk "5.4.1" - ci-info "^4.1.0" - cosmiconfig "9.0.0" - execa "8.0.0" - git-url-parse "14.0.0" - globby "14.0.2" - inquirer "9.3.2" - issue-parser "7.0.1" - lodash "4.17.21" - mime-types "2.1.35" - new-github-release-url "2.0.0" - open "10.1.0" - ora "8.1.1" - os-name "5.1.0" - proxy-agent "6.5.0" - semver "7.6.3" - shelljs "0.8.5" - update-notifier "7.3.1" - url-join "5.0.0" - wildcard-match "5.1.4" - yargs-parser "21.1.1" - require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" @@ -7178,7 +6266,7 @@ resolve.exports@^2.0.0: resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== -resolve@^1.1.6, resolve@^1.14.2, resolve@^1.20.0, resolve@^1.22.4: +resolve@^1.14.2, resolve@^1.20.0, resolve@^1.22.4: version "1.22.8" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== @@ -7196,32 +6284,11 @@ resolve@^2.0.0-next.5: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -restore-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" - integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== - dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" - -restore-cursor@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-5.1.0.tgz#0766d95699efacb14150993f55baf0953ea1ebe7" - integrity sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA== - dependencies: - onetime "^7.0.0" - signal-exit "^4.1.0" - ret@~0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/ret/-/ret-0.5.0.tgz#30a4d38a7e704bd96dc5ffcbe7ce2a9274c41c95" integrity sha512-I1XxrZSQ+oErkRR4jYbAyEEu2I0avBvvMM5JN+6EBprOGRCs63ENqZ3vjavq8fBw2+62G5LF5XelKwuJpcvcxw== -retry@0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" - integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== - reusify@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" @@ -7239,16 +6306,6 @@ rimraf@^2.6.1: dependencies: glob "^7.1.3" -run-applescript@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz#e5a553c2bffd620e169d276c1cd8f1b64778fbeb" - integrity sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A== - -run-async@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-3.0.0.tgz#42a432f6d76c689522058984384df28be379daad" - integrity sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q== - run-parallel@^1.1.9: version "1.2.0" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" @@ -7357,11 +6414,6 @@ semver-regex@^3.1.2: resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-3.1.4.tgz#13053c0d4aa11d070a2f2872b6b1e3ae1e1971b4" integrity sha512-6IiqeZNgq01qGf0TId0t3NvKzSvUsjcpdEO3AQNeIjR6A2+ckTnQlDpl4qu1bjRv0RzN3FP9hzFmws3lKqRWkA== -semver@7.6.3: - version "7.6.3" - resolved "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" - integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== - semver@^5.0.3, semver@^5.1.0: version "5.7.2" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" @@ -7372,7 +6424,7 @@ semver@^6.3.0, semver@^6.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.5.3, semver@^7.5.4, semver@^7.6.0, semver@^7.6.3, semver@^7.7.1: +semver@^7.5.3, semver@^7.5.4, semver@^7.6.0, semver@^7.7.1: version "7.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.1.tgz#abd5098d82b18c6c81f6074ff2647fd3e7220c9f" integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA== @@ -7455,15 +6507,6 @@ shell-quote@^1.8.1: resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== -shelljs@0.8.5: - version "0.8.5" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.5.tgz#de055408d8361bed66c669d2f000538ced8ee20c" - integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== - dependencies: - glob "^7.0.0" - interpret "^1.0.0" - rechoir "^0.6.2" - side-channel-list@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.0.tgz#10cb5984263115d3b7a0e336591e290a830af8ad" @@ -7509,11 +6552,6 @@ signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== -signal-exit@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" - integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== - sisteransi@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" @@ -7524,33 +6562,6 @@ slash@^3.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== -slash@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz#be3adddcdf09ac38eebe8dcdc7b1a57a75b095ce" - integrity sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg== - -smart-buffer@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" - integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== - -socks-proxy-agent@^8.0.5: - version "8.0.5" - resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz#b9cdb4e7e998509d7659d689ce7697ac21645bee" - integrity sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw== - dependencies: - agent-base "^7.1.2" - debug "^4.3.4" - socks "^2.8.3" - -socks@^2.8.3: - version "2.8.3" - resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.3.tgz#1ebd0f09c52ba95a09750afe3f3f9f724a800cb5" - integrity sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw== - dependencies: - ip-address "^9.0.5" - smart-buffer "^4.2.0" - sonic-boom@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-4.0.1.tgz#515b7cef2c9290cb362c4536388ddeece07aed30" @@ -7596,11 +6607,6 @@ split@0.3: dependencies: through "2" -sprintf-js@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.3.tgz#4914b903a2f8b685d17fdf78a70e917e872e444a" - integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA== - sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" @@ -7630,11 +6636,6 @@ starts-with@^1.0.2: resolved "https://registry.yarnpkg.com/starts-with/-/starts-with-1.0.2.tgz#16793a729d89d4cf3d4fb2eda2f908ae357f196f" integrity sha512-QUw5X+IMTGDm1nrdowEdDaA0MNiUmRlQFwpTTXmhuPKQc+7b0h8fOHtlt1zZqcEK5x1Fsitrobo7KEusc+d1rg== -stdin-discarder@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/stdin-discarder/-/stdin-discarder-0.2.2.tgz#390037f44c4ae1a1ae535c5fe38dc3aba8d997be" - integrity sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ== - stream-combiner@~0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14" @@ -7676,15 +6677,6 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string-width@^7.0.0, string-width@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-7.2.0.tgz#b5bb8e2165ce275d4d43476dd2700ad9091db6dc" - integrity sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ== - dependencies: - emoji-regex "^10.3.0" - get-east-asian-width "^1.0.0" - strip-ansi "^7.1.0" - string.prototype.includes@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz#eceef21283640761a81dbe16d6c7171a4edf7d92" @@ -7753,7 +6745,7 @@ string.prototype.trimstart@^1.0.8: define-properties "^1.2.1" es-object-atoms "^1.0.0" -string_decoder@^1.1.1, string_decoder@^1.3.0: +string_decoder@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== @@ -7788,13 +6780,6 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" -strip-ansi@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" - integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== - dependencies: - ansi-regex "^6.0.1" - strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" @@ -7815,11 +6800,6 @@ strip-final-newline@^2.0.0: resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== -strip-final-newline@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" - integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== - strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" @@ -7830,11 +6810,6 @@ strip-json-comments@~2.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== -stubborn-fs@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/stubborn-fs/-/stubborn-fs-1.2.5.tgz#e5e244223166921ddf66ed5e062b6b3bf285bfd2" - integrity sha512-H2N9c26eXjzL/S/K+i/RHHcFanE74dptvvjM8iwzwbVcWY/zjBbgRqF3K0DY4+OD+uTTASTBvDoxPDaPN02D7g== - supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" @@ -7915,13 +6890,6 @@ tinyglobby@^0.2.12: fdir "^6.4.3" picomatch "^4.0.2" -tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== - dependencies: - os-tmpdir "~1.0.2" - tmpl@1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" @@ -7981,7 +6949,7 @@ tsconfig-paths@^3.15.0: minimist "^1.2.6" strip-bom "^3.0.0" -tslib@^2.0.1, tslib@^2.1.0, tslib@^2.4.0, tslib@^2.8.1: +tslib@^2.1.0, tslib@^2.4.0, tslib@^2.8.1: version "2.8.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== @@ -8008,16 +6976,6 @@ type-fest@^0.7.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== -type-fest@^2.5.1: - version "2.19.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" - integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== - -type-fest@^4.18.2, type-fest@^4.21.0: - version "4.39.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.39.1.tgz#7521f6944e279abaf79cf60cfbc4823f4858083e" - integrity sha512-uW9qzd66uyHYxwyVBYiwS4Oi0qZyUqwjU+Oevr6ZogYiXt99EOYtwvzMSLw1c3lYo2HzJsep/NB23iEVEgjG/w== - typed-array-buffer@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz#a72395450a4869ec033fd549371b47af3a2ee536" @@ -8120,11 +7078,6 @@ unicode-property-aliases-ecmascript@^2.0.0: resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== -unicorn-magic@^0.1.0: - version "0.1.0" - resolved "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz#1bb9a51c823aaf9d73a8bfcd3d1a23dde94b0ce4" - integrity sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ== - unique-string@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" @@ -8132,11 +7085,6 @@ unique-string@^1.0.0: dependencies: crypto-random-string "^1.0.0" -universal-user-agent@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.1.tgz#15f20f55da3c930c57bddbf1734c6654d5fd35aa" - integrity sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ== - universalify@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" @@ -8186,22 +7134,6 @@ update-browserslist-db@^1.1.1: escalade "^3.2.0" picocolors "^1.1.1" -update-notifier@7.3.1: - version "7.3.1" - resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-7.3.1.tgz#49af1ad6acfa0ea01c0d0f3c04047c154ead7096" - integrity sha512-+dwUY4L35XFYEzE+OAL3sarJdUioVovq+8f7lcIJ7wnmnYQV5UD1Y/lcwaMSyaQ6Bj3JMj1XSTjZbNLHn/19yA== - dependencies: - boxen "^8.0.1" - chalk "^5.3.0" - configstore "^7.0.0" - is-in-ci "^1.0.0" - is-installed-globally "^1.0.0" - is-npm "^6.0.0" - latest-version "^9.0.0" - pupa "^3.1.0" - semver "^7.6.3" - xdg-basedir "^5.1.0" - update-notifier@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.5.0.tgz#d0744593e13f161e406acb1d9408b72cad08aff6" @@ -8225,11 +7157,6 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" -url-join@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/url-join/-/url-join-5.0.0.tgz#c2f1e5cbd95fa91082a93b58a1f42fecb4bdbcf1" - integrity sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA== - url-parse-lax@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" @@ -8245,7 +7172,7 @@ url-parse@^1.5.3: querystringify "^2.1.1" requires-port "^1.0.0" -util-deprecate@^1.0.1, util-deprecate@~1.0.1: +util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== @@ -8285,13 +7212,6 @@ walker@^1.0.8: dependencies: makeerror "1.0.12" -wcwidth@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" - integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== - dependencies: - defaults "^1.0.3" - webidl-conversions@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" @@ -8323,11 +7243,6 @@ whatwg-url@^8.0.0, whatwg-url@^8.5.0: tr46 "^2.1.0" webidl-conversions "^6.1.0" -when-exit@^2.1.1: - version "2.1.4" - resolved "https://registry.yarnpkg.com/when-exit/-/when-exit-2.1.4.tgz#e2a0e998f7ad67eb0d2ce37e9794386663cc96f7" - integrity sha512-4rnvd3A1t16PWzrBUcSDZqcAmsUIy4minDXT/CZ8F2mVDgd65i4Aalimgz1aQkRGU0iH5eT5+6Rx2TK8o443Pg== - which-boxed-primitive@^1.1.0, which-boxed-primitive@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz#d76ec27df7fa165f18d5808374a5fe23c29b176e" @@ -8412,25 +7327,6 @@ widest-line@^2.0.0: dependencies: string-width "^2.1.1" -widest-line@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-5.0.0.tgz#b74826a1e480783345f0cd9061b49753c9da70d0" - integrity sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA== - dependencies: - string-width "^7.0.0" - -wildcard-match@5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/wildcard-match/-/wildcard-match-5.1.4.tgz#26428c802f20743ebae255e4e9526ae81ddf1816" - integrity sha512-wldeCaczs8XXq7hj+5d/F38JE2r7EXgb6WQDM84RVwxy81T/sxB5e9+uZLK9Q9oNz1mlvjut+QtvgaOQFPVq/g== - -windows-release@^5.0.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/windows-release/-/windows-release-5.1.1.tgz#7ac7019f9baeaea6c00ec889b11824f46c12ee8d" - integrity sha512-NMD00arvqcq2nwqc5Q6KtrSRHK+fVD31erE5FEMahAw5PmVCgD7MUXodq3pdZSUkqA9Cda2iWx6s1XYwiJWRmw== - dependencies: - execa "^5.1.1" - word-wrap@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" @@ -8445,15 +7341,6 @@ wrap-ansi@^5.1.0: string-width "^3.0.0" strip-ansi "^5.0.0" -wrap-ansi@^6.2.0: - version "6.2.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" - integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" @@ -8463,15 +7350,6 @@ wrap-ansi@^7.0.0: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-9.0.0.tgz#1a3dc8b70d85eeb8398ddfb1e4a02cd186e58b3e" - integrity sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q== - dependencies: - ansi-styles "^6.2.1" - string-width "^7.0.0" - strip-ansi "^7.1.0" - wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" @@ -8511,11 +7389,6 @@ xdg-basedir@^3.0.0: resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" integrity sha512-1Dly4xqlulvPD3fZUQJLY+FUIeqN3N2MM3uqe4rCJftAvOjFa3jFGfctOgluGx4ahPbUCsZkmJILiP0Vi4T6lQ== -xdg-basedir@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-5.1.0.tgz#1efba19425e73be1bc6f2a6ceb52a3d2c884c0c9" - integrity sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ== - xml-name-validator@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" @@ -8575,11 +7448,6 @@ yaml@^1.10.0: resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== -yargs-parser@21.1.1, yargs-parser@^21.1.1: - version "21.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" - integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== - yargs-parser@^15.0.0: version "15.0.3" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-15.0.3.tgz#316e263d5febe8b38eef61ac092b33dfcc9b1115" @@ -8593,6 +7461,11 @@ yargs-parser@^20.2.2: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + yargs@14.2.0: version "14.2.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-14.2.0.tgz#f116a9242c4ed8668790b40759b4906c276e76c3" @@ -8648,8 +7521,3 @@ yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== - -yoctocolors-cjs@^2.1.1: - version "2.1.2" - resolved "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz#f4b905a840a37506813a7acaa28febe97767a242" - integrity sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA== diff --git a/spec/react_on_rails/fixtures/both_packages.json b/spec/react_on_rails/fixtures/both_packages.json new file mode 100644 index 0000000000..677585b42c --- /dev/null +++ b/spec/react_on_rails/fixtures/both_packages.json @@ -0,0 +1,11 @@ +{ + "dependencies": { + "babel": "^6.3.26", + "react-on-rails": "16.1.1", + "react-on-rails-pro": "16.1.1", + "webpack": "^1.12.8" + }, + "devDependencies": { + "babel-eslint": "^5.0.0-beta6" + } +} diff --git a/spec/react_on_rails/fixtures/pro_package.json b/spec/react_on_rails/fixtures/pro_package.json new file mode 100644 index 0000000000..20a8819b0b --- /dev/null +++ b/spec/react_on_rails/fixtures/pro_package.json @@ -0,0 +1,10 @@ +{ + "dependencies": { + "babel": "^6.3.26", + "react-on-rails-pro": "16.1.1", + "webpack": "^1.12.8" + }, + "devDependencies": { + "babel-eslint": "^5.0.0-beta6" + } +} diff --git a/spec/react_on_rails/fixtures/pro_semver_caret_package.json b/spec/react_on_rails/fixtures/pro_semver_caret_package.json new file mode 100644 index 0000000000..44d4b5c33b --- /dev/null +++ b/spec/react_on_rails/fixtures/pro_semver_caret_package.json @@ -0,0 +1,10 @@ +{ + "dependencies": { + "babel": "^6.3.26", + "react-on-rails-pro": "^16.1.1", + "webpack": "^1.12.8" + }, + "devDependencies": { + "babel-eslint": "^5.0.0-beta6" + } +} diff --git a/spec/react_on_rails/utils_spec.rb b/spec/react_on_rails/utils_spec.rb index ca2629704d..b43f4d9444 100644 --- a/spec/react_on_rails/utils_spec.rb +++ b/spec/react_on_rails/utils_spec.rb @@ -654,6 +654,247 @@ def self.configuration=(config) described_class.gem_available?("nonexistent_gem") end end + + describe ".detect_package_manager" do + let(:package_json_path) { File.join(Rails.root, "client", "package.json") } + + before do + allow(ReactOnRails).to receive_message_chain("configuration.node_modules_location") + .and_return("client") + allow(Rails).to receive(:root).and_return(Rails.root) + end + + context "when packageManager field exists in package.json" do + it "returns :yarn for yarn@3.6.0" do + allow(File).to receive(:exist?).with(package_json_path).and_return(true) + allow(File).to receive(:read).with(package_json_path) + .and_return('{"packageManager": "yarn@3.6.0"}') + + expect(described_class.detect_package_manager).to eq(:yarn) + end + + it "returns :pnpm for pnpm@8.0.0" do + allow(File).to receive(:exist?).with(package_json_path).and_return(true) + allow(File).to receive(:read).with(package_json_path) + .and_return('{"packageManager": "pnpm@8.0.0"}') + + expect(described_class.detect_package_manager).to eq(:pnpm) + end + + it "returns :bun for bun@1.0.0" do + allow(File).to receive(:exist?).with(package_json_path).and_return(true) + allow(File).to receive(:read).with(package_json_path) + .and_return('{"packageManager": "bun@1.0.0"}') + + expect(described_class.detect_package_manager).to eq(:bun) + end + + it "returns :npm for npm@9.0.0" do + allow(File).to receive(:exist?).with(package_json_path).and_return(true) + allow(File).to receive(:read).with(package_json_path) + .and_return('{"packageManager": "npm@9.0.0"}') + + expect(described_class.detect_package_manager).to eq(:npm) + end + + it "falls back to lock file detection for unknown manager" do + allow(File).to receive(:exist?).and_call_original + allow(File).to receive(:exist?).with(package_json_path).and_return(true) + allow(File).to receive(:read).with(package_json_path) + .and_return('{"packageManager": "unknown@1.0.0"}') + allow(File).to receive(:exist?).with(File.join(Rails.root, "yarn.lock")).and_return(true) + + expect(described_class.detect_package_manager).to eq(:yarn) + end + end + + context "when packageManager field does not exist" do + before do + allow(File).to receive(:exist?).with(package_json_path).and_return(true) + allow(File).to receive(:read).with(package_json_path) + .and_return('{"name": "my-app"}') + end + + it "returns :yarn when yarn.lock exists" do + allow(File).to receive(:exist?).and_call_original + allow(File).to receive(:exist?).with(package_json_path).and_return(true) + allow(File).to receive(:exist?).with(File.join(Rails.root, "yarn.lock")).and_return(true) + + expect(described_class.detect_package_manager).to eq(:yarn) + end + + it "returns :pnpm when pnpm-lock.yaml exists" do + allow(File).to receive(:exist?).and_call_original + allow(File).to receive(:exist?).with(package_json_path).and_return(true) + allow(File).to receive(:exist?).with(File.join(Rails.root, "yarn.lock")).and_return(false) + allow(File).to receive(:exist?).with(File.join(Rails.root, "pnpm-lock.yaml")).and_return(true) + + expect(described_class.detect_package_manager).to eq(:pnpm) + end + + it "returns :bun when bun.lockb exists" do + allow(File).to receive(:exist?).and_call_original + allow(File).to receive(:exist?).with(package_json_path).and_return(true) + allow(File).to receive(:exist?).with(File.join(Rails.root, "yarn.lock")).and_return(false) + allow(File).to receive(:exist?).with(File.join(Rails.root, "pnpm-lock.yaml")).and_return(false) + allow(File).to receive(:exist?).with(File.join(Rails.root, "bun.lockb")).and_return(true) + + expect(described_class.detect_package_manager).to eq(:bun) + end + + it "returns :npm when package-lock.json exists" do + allow(File).to receive(:exist?).and_call_original + allow(File).to receive(:exist?).with(package_json_path).and_return(true) + allow(File).to receive(:exist?).with(File.join(Rails.root, "yarn.lock")).and_return(false) + allow(File).to receive(:exist?).with(File.join(Rails.root, "pnpm-lock.yaml")).and_return(false) + allow(File).to receive(:exist?).with(File.join(Rails.root, "bun.lockb")).and_return(false) + allow(File).to receive(:exist?).with(File.join(Rails.root, "package-lock.json")).and_return(true) + + expect(described_class.detect_package_manager).to eq(:npm) + end + + it "defaults to :yarn when no lock files exist" do + allow(File).to receive(:exist?).and_call_original + allow(File).to receive(:exist?).with(package_json_path).and_return(true) + allow(File).to receive(:exist?).with(File.join(Rails.root, "yarn.lock")).and_return(false) + allow(File).to receive(:exist?).with(File.join(Rails.root, "pnpm-lock.yaml")).and_return(false) + allow(File).to receive(:exist?).with(File.join(Rails.root, "bun.lockb")).and_return(false) + allow(File).to receive(:exist?).with(File.join(Rails.root, "package-lock.json")).and_return(false) + + expect(described_class.detect_package_manager).to eq(:yarn) + end + end + + context "when package.json cannot be parsed" do + before do + allow(File).to receive(:exist?).and_call_original + allow(File).to receive(:exist?).with(package_json_path).and_return(true) + allow(File).to receive(:read).with(package_json_path).and_return("invalid json") + end + + it "falls back to lock file detection" do + allow(File).to receive(:exist?).with(File.join(Rails.root, "yarn.lock")).and_return(true) + + expect(described_class.detect_package_manager).to eq(:yarn) + end + end + + context "when package.json does not exist" do + before do + allow(File).to receive(:exist?).and_call_original + allow(File).to receive(:exist?).with(package_json_path).and_return(false) + end + + it "falls back to lock file detection" do + allow(File).to receive(:exist?).with(File.join(Rails.root, "yarn.lock")).and_return(false) + allow(File).to receive(:exist?).with(File.join(Rails.root, "pnpm-lock.yaml")).and_return(true) + + expect(described_class.detect_package_manager).to eq(:pnpm) + end + end + end + + describe ".package_manager_install_exact_command" do + before do + allow(described_class).to receive(:detect_package_manager).and_return(package_manager) + end + + context "when using yarn" do + let(:package_manager) { :yarn } + + it "returns yarn add command with --exact flag" do + expect(described_class.package_manager_install_exact_command("react-on-rails", "16.0.0")) + .to eq("yarn add react-on-rails@16.0.0 --exact") + end + end + + context "when using pnpm" do + let(:package_manager) { :pnpm } + + it "returns pnpm add command with --save-exact flag" do + expect(described_class.package_manager_install_exact_command("react-on-rails", "16.0.0")) + .to eq("pnpm add react-on-rails@16.0.0 --save-exact") + end + end + + context "when using bun" do + let(:package_manager) { :bun } + + it "returns bun add command with --exact flag" do + expect(described_class.package_manager_install_exact_command("react-on-rails", "16.0.0")) + .to eq("bun add react-on-rails@16.0.0 --exact") + end + end + + context "when using npm" do + let(:package_manager) { :npm } + + it "returns npm install command with --save-exact flag" do + expect(described_class.package_manager_install_exact_command("react-on-rails", "16.0.0")) + .to eq("npm install react-on-rails@16.0.0 --save-exact") + end + end + + context "when package manager is unknown" do + let(:package_manager) { :unknown } + + it "defaults to yarn add command" do + expect(described_class.package_manager_install_exact_command("react-on-rails", "16.0.0")) + .to eq("yarn add react-on-rails@16.0.0 --exact") + end + end + end + + describe ".package_manager_remove_command" do + before do + allow(described_class).to receive(:detect_package_manager).and_return(package_manager) + end + + context "when using yarn" do + let(:package_manager) { :yarn } + + it "returns yarn remove command" do + expect(described_class.package_manager_remove_command("react-on-rails")) + .to eq("yarn remove react-on-rails") + end + end + + context "when using pnpm" do + let(:package_manager) { :pnpm } + + it "returns pnpm remove command" do + expect(described_class.package_manager_remove_command("react-on-rails")) + .to eq("pnpm remove react-on-rails") + end + end + + context "when using bun" do + let(:package_manager) { :bun } + + it "returns bun remove command" do + expect(described_class.package_manager_remove_command("react-on-rails")) + .to eq("bun remove react-on-rails") + end + end + + context "when using npm" do + let(:package_manager) { :npm } + + it "returns npm uninstall command" do + expect(described_class.package_manager_remove_command("react-on-rails")) + .to eq("npm uninstall react-on-rails") + end + end + + context "when package manager is unknown" do + let(:package_manager) { :unknown } + + it "defaults to yarn remove command" do + expect(described_class.package_manager_remove_command("react-on-rails")) + .to eq("yarn remove react-on-rails") + end + end + end end # RSC utility method tests moved to react_on_rails_pro/spec/react_on_rails_pro/utils_spec.rb diff --git a/spec/react_on_rails/version_checker_spec.rb b/spec/react_on_rails/version_checker_spec.rb index 3b7fd01caf..8f1f9676b1 100644 --- a/spec/react_on_rails/version_checker_spec.rb +++ b/spec/react_on_rails/version_checker_spec.rb @@ -13,104 +13,223 @@ def error(message) module ReactOnRails # rubocop:disable Metrics/ModuleLength describe VersionChecker do - describe "#warn_if_gem_and_node_package_versions_differ" do + describe "#validate_version_and_package_compatibility!" do let(:logger) { FakeLogger.new } - context "when gem and node package major and minor versions are equal" do + before do + # Stub ReactOnRails::Utils.react_on_rails_pro? to return false by default + allow(ReactOnRails::Utils).to receive(:react_on_rails_pro?).and_return(false) + end + + context "when both react-on-rails and react-on-rails-pro packages are installed" do let(:node_package_version) do - double_package_version(raw: "2.2.5-beta.2", parts: %w[2 2 5 beta.2]) + instance_double(VersionChecker::NodePackageVersion, + react_on_rails_package?: true, + react_on_rails_pro_package?: true, + raw: "16.1.1", + local_path_or_url?: false, + package_json: "/fake/path/package.json") end - before { stub_gem_version("2.2.5.beta.2") } + it "raises an error" do + expect { check_version_and_raise(node_package_version) } + .to raise_error(ReactOnRails::Error, + /Both 'react-on-rails' and 'react-on-rails-pro' packages are installed/) + end + end - it "does not log" do - allow(Rails.logger).to receive(:warn) - check_version_and_log(node_package_version) - expect(Rails.logger).not_to have_received(:warn) + context "when neither react-on-rails nor react-on-rails-pro packages are installed" do + let(:node_package_version) do + instance_double(VersionChecker::NodePackageVersion, + react_on_rails_package?: false, + react_on_rails_pro_package?: false, + raw: nil, + local_path_or_url?: false, + package_json: "/fake/path/package.json") + end + + before do + stub_gem_version("16.1.1") + end + + it "raises an error" do + expect { check_version_and_raise(node_package_version) } + .to raise_error(ReactOnRails::Error, + /No React on Rails npm package is installed/) end end - context "when major and minor versions are equal BUT node uses semver wildcard" do + context "when Pro gem is installed but using base package" do let(:node_package_version) do - double_package_version(raw: "^2.2.5", semver_wildcard: true, parts: %w[2 2 5]) + instance_double(VersionChecker::NodePackageVersion, + react_on_rails_package?: true, + react_on_rails_pro_package?: false, + raw: "16.1.1", + local_path_or_url?: false, + semver_wildcard?: false, + parts: %w[16 1 1], + package_json: "/fake/path/package.json") end - before { stub_gem_version("2.2.5") } + before do + allow(ReactOnRails::Utils).to receive(:react_on_rails_pro?).and_return(true) + stub_gem_version("16.1.1") + end - it "logs" do - allow(Rails.logger).to receive(:warn) - message = /ReactOnRails: Your Node package version for react-on-rails is not an exact version/ - check_version_and_log(node_package_version) - expect(Rails.logger).to have_received(:warn).with(message) + it "raises an error" do + expect { check_version_and_raise(node_package_version) } + .to raise_error(ReactOnRails::Error, + /You have the Pro gem installed but are using the base 'react-on-rails' package/) end end - context "when gem and node package major versions differ" do + context "when Pro package is installed but Pro gem is not" do let(:node_package_version) do - double_package_version(raw: "13.0.0.beta-2", parts: %w[13 0 0 beta-2]) + instance_double(VersionChecker::NodePackageVersion, + react_on_rails_package?: false, + react_on_rails_pro_package?: true, + raw: "16.1.1", + local_path_or_url?: false, + semver_wildcard?: false, + parts: %w[16 1 1], + package_name: "react-on-rails-pro", + package_json: "/fake/path/package.json") end - before { stub_gem_version("12.0.0.beta.1") } + before do + allow(ReactOnRails::Utils).to receive(:react_on_rails_pro?).and_return(false) + stub_gem_version("16.1.1") + end - it "logs" do - allow(Rails.logger).to receive(:warn) - message = /ReactOnRails: ReactOnRails gem and Node package versions do not match/ - check_version_and_log(node_package_version) - expect(Rails.logger).to have_received(:warn).with(message) + it "raises an error" do + expect { check_version_and_raise(node_package_version) } + .to raise_error(ReactOnRails::Error, + /You have the 'react-on-rails-pro' package installed but the Pro gem is not installed/) end end - context "when gem and node package major versions match and minor differs" do + context "when package version is not exact (has semver wildcard)" do let(:node_package_version) do - double_package_version(raw: "13.0.0.beta-2", parts: %w[13 0 0 beta-2]) + instance_double(VersionChecker::NodePackageVersion, + react_on_rails_package?: true, + react_on_rails_pro_package?: false, + raw: "^16.1.1", + local_path_or_url?: false, + semver_wildcard?: true, + package_name: "react-on-rails", + package_json: "/fake/path/package.json") end - before { stub_gem_version("13.1.0") } + before { stub_gem_version("16.1.1") } - it "logs" do - allow(Rails.logger).to receive(:warn) - message = /ReactOnRails: ReactOnRails gem and Node package versions do not match/ - check_version_and_log(node_package_version) - expect(Rails.logger).to have_received(:warn).with(message) + it "raises an error" do + expect { check_version_and_raise(node_package_version) } + .to raise_error(ReactOnRails::Error, /The 'react-on-rails' package version is not an exact version/) end end - context "when gem and node package major, minor versions match and patch differs" do + context "when package version does not match gem version" do let(:node_package_version) do - double_package_version(raw: "13.0.1", parts: %w[13 0 1]) + instance_double(VersionChecker::NodePackageVersion, + react_on_rails_package?: true, + react_on_rails_pro_package?: false, + raw: "16.1.2", + local_path_or_url?: false, + semver_wildcard?: false, + parts: %w[16 1 2], + package_name: "react-on-rails", + package_json: "/fake/path/package.json") end - before { stub_gem_version("13.0.0") } + before { stub_gem_version("16.1.1") } - it "logs" do - allow(Rails.logger).to receive(:warn) - message = /ReactOnRails: ReactOnRails gem and Node package versions do not match/ - check_version_and_log(node_package_version) - expect(Rails.logger).to have_received(:warn).with(message) + it "raises an error" do + expect { check_version_and_raise(node_package_version) } + .to raise_error(ReactOnRails::Error, /The 'react-on-rails' package version does not match the gem version/) end end - context "when package json uses a relative path with dots" do + context "when versions match exactly" do let(:node_package_version) do - double_package_version(raw: "../../..", parts: nil, local_path_or_url: true) + instance_double(VersionChecker::NodePackageVersion, + react_on_rails_package?: true, + react_on_rails_pro_package?: false, + raw: "16.1.1", + local_path_or_url?: false, + semver_wildcard?: false, + parts: %w[16 1 1], + package_json: "/fake/path/package.json") end - before { stub_gem_version("2.0.0.beta.1") } + before { stub_gem_version("16.1.1") } - it "does not log" do - allow(Rails.logger).to receive(:warn) - check_version_and_log(node_package_version) - expect(Rails.logger).not_to have_received(:warn) + it "does not raise an error" do + expect { check_version_and_raise(node_package_version) }.not_to raise_error end end - context "when package json doesn't exist" do + context "when using local path" do let(:node_package_version) do - double_package_version(raw: nil) + instance_double(VersionChecker::NodePackageVersion, + react_on_rails_package?: true, + react_on_rails_pro_package?: false, + raw: "file:../react-on-rails", + local_path_or_url?: true, + semver_wildcard?: false, + package_json: "/fake/path/package.json") end - it "log method returns nil" do - expect(check_version_and_log(node_package_version)).to be_nil + before { stub_gem_version("16.1.1") } + + it "does not raise an error" do + expect { check_version_and_raise(node_package_version) }.not_to raise_error + end + end + + context "when Pro gem and Pro package are both installed with matching versions" do + let(:node_package_version) do + instance_double(VersionChecker::NodePackageVersion, + react_on_rails_package?: false, + react_on_rails_pro_package?: true, + raw: "16.1.1", + local_path_or_url?: false, + semver_wildcard?: false, + parts: %w[16 1 1], + package_json: "/fake/path/package.json") + end + + before do + allow(ReactOnRails::Utils).to receive(:react_on_rails_pro?).and_return(true) + stub_gem_version("16.1.1") + end + + it "does not raise an error" do + expect { check_version_and_raise(node_package_version) }.not_to raise_error + end + end + + context "when package.json file does not exist" do + let(:node_package_version) do + instance_double(VersionChecker::NodePackageVersion, + package_json: "/path/to/nonexistent/package.json") + end + + it "raises an error" do + # Mock Rails.root properly + fake_root = File.dirname(node_package_version.package_json) + fake_root_pathname = Pathname.new(fake_root) + allow(Rails).to receive(:root).and_return(fake_root_pathname) + + # Override File.exist? to return false for all paths (including package.json) + allow(File).to receive(:exist?).and_return(false) + # Mock yarn.lock to exist so package manager detection works + allow(File).to receive(:exist?).with(File.join(fake_root, "yarn.lock")).and_return(true) + + allow(ReactOnRails).to receive_message_chain(:configuration, :node_modules_location).and_return("") + + version_checker = described_class.new(node_package_version) + expect { version_checker.validate_version_and_package_compatibility! } + .to raise_error(ReactOnRails::Error, /package\.json file not found/) end end end @@ -121,18 +240,30 @@ def double_package_version(raw: nil, semver_wildcard: false, raw: raw, semver_wildcard?: semver_wildcard, parts: parts, - local_path_or_url?: local_path_or_url) + local_path_or_url?: local_path_or_url, + package_json: "/fake/path/package.json") end + # rubocop:disable Metrics/AbcSize def check_version_and_raise(node_package_version) + # Mock Rails.root to return a proper path string + fake_root = File.dirname(node_package_version.package_json) + fake_root_pathname = Pathname.new(fake_root) + allow(Rails).to receive(:root).and_return(fake_root_pathname) + + # Stub File.exist? for the package.json and lock files + # We mock specific paths and return false for everything else + allow(File).to receive(:exist?).and_return(false) + allow(File).to receive(:exist?).with(node_package_version.package_json).and_return(true) + # Mock lock files - use yarn.lock so package manager detection returns :yarn + allow(File).to receive(:exist?).with(File.join(fake_root, "yarn.lock")).and_return(true) + + # Stub ReactOnRails.configuration.node_modules_location + allow(ReactOnRails).to receive_message_chain(:configuration, :node_modules_location).and_return("") version_checker = VersionChecker.new(node_package_version) - version_checker.raise_if_gem_and_node_package_versions_differ - end - - def check_version_and_log(node_package_version) - version_checker = VersionChecker.new(node_package_version) - version_checker.log_if_gem_and_node_package_versions_differ + version_checker.validate_version_and_package_compatibility! end + # rubocop:enable Metrics/AbcSize describe VersionChecker::NodePackageVersion do subject(:node_package_version) { described_class.new(package_json) } @@ -140,13 +271,14 @@ def check_version_and_log(node_package_version) describe "#build" do it "initializes NodePackageVersion with ReactOnRails.configuration.node_modules_location" do allow(ReactOnRails).to receive_message_chain(:configuration, :node_modules_location).and_return("spec/dummy") - root_package_json_path = File.expand_path("../../package.json", __dir__) - allow(Rails).to receive_message_chain(:root, :join).and_return(root_package_json_path) - message = "No 'react-on-rails' entry in the dependencies of #{root_package_json_path}, which is " \ - "the expected location according to ReactOnRails.configuration.node_modules_location" + # Use a fixture that has dependencies but not react-on-rails packages + test_package_json = File.expand_path("fixtures/beta_package.json", __dir__) + allow(Rails).to receive_message_chain(:root, :join).and_return(test_package_json) + + # beta_package.json has react-on-rails, so it should not warn allow(Rails.logger).to receive(:warn) - described_class.build.raw - expect(Rails.logger).to have_received(:warn).with(message) + result = described_class.build.raw + expect(result).to eq("^14.0.0.beta-2") end end @@ -295,6 +427,110 @@ def check_version_and_log(node_package_version) end end end + + describe "Pro package detection" do + context "with react-on-rails package" do + let(:package_json) { File.expand_path("fixtures/normal_package.json", __dir__) } + + describe "#react_on_rails_package?" do + specify { expect(node_package_version.react_on_rails_package?).to be true } + end + + describe "#react_on_rails_pro_package?" do + specify { expect(node_package_version.react_on_rails_pro_package?).to be false } + end + + describe "#package_name" do + specify { expect(node_package_version.package_name).to eq("react-on-rails") } + end + + describe "#raw" do + specify { expect(node_package_version.raw).to eq("0.0.2") } + end + end + + context "with react-on-rails-pro package" do + let(:package_json) { File.expand_path("fixtures/pro_package.json", __dir__) } + + describe "#react_on_rails_package?" do + specify { expect(node_package_version.react_on_rails_package?).to be false } + end + + describe "#react_on_rails_pro_package?" do + specify { expect(node_package_version.react_on_rails_pro_package?).to be true } + end + + describe "#package_name" do + specify { expect(node_package_version.package_name).to eq("react-on-rails-pro") } + end + + describe "#raw" do + specify { expect(node_package_version.raw).to eq("16.1.1") } + end + end + + context "with both packages" do + let(:package_json) { File.expand_path("fixtures/both_packages.json", __dir__) } + + describe "#react_on_rails_package?" do + specify { expect(node_package_version.react_on_rails_package?).to be true } + end + + describe "#react_on_rails_pro_package?" do + specify { expect(node_package_version.react_on_rails_pro_package?).to be true } + end + + describe "#package_name" do + it "prefers Pro package name" do + expect(node_package_version.package_name).to eq("react-on-rails-pro") + end + end + + describe "#raw" do + it "returns Pro package version (takes precedence)" do + expect(node_package_version.raw).to eq("16.1.1") + end + end + end + + context "with Pro package using semver caret" do + let(:package_json) { File.expand_path("fixtures/pro_semver_caret_package.json", __dir__) } + + describe "#react_on_rails_pro_package?" do + specify { expect(node_package_version.react_on_rails_pro_package?).to be true } + end + + describe "#package_name" do + specify { expect(node_package_version.package_name).to eq("react-on-rails-pro") } + end + + describe "#raw" do + specify { expect(node_package_version.raw).to eq("^16.1.1") } + end + + describe "#semver_wildcard?" do + specify { expect(node_package_version.semver_wildcard?).to be true } + end + end + + context "with package.json without any react-on-rails packages" do + let(:package_json) { File.expand_path("../../package.json", __dir__) } + + describe "#react_on_rails_package?" do + specify { expect(node_package_version.react_on_rails_package?).to be false } + end + + describe "#react_on_rails_pro_package?" do + specify { expect(node_package_version.react_on_rails_pro_package?).to be false } + end + + describe "#package_name" do + it "defaults to react-on-rails" do + expect(node_package_version.package_name).to eq("react-on-rails") + end + end + end + end end end end