diff --git a/.github/workflows/lint-js-and-ruby.yml b/.github/workflows/lint-js-and-ruby.yml index a055af9568..6786a63718 100644 --- a/.github/workflows/lint-js-and-ruby.yml +++ b/.github/workflows/lint-js-and-ruby.yml @@ -134,6 +134,8 @@ jobs: run: yarn run eslint --report-unused-disable-directives - name: Check formatting run: yarn start format.listDifferent + - name: Lint SCSS with stylelint + run: yarn run lint:scss - name: Type-check TypeScript run: yarn run type-check - name: Pack for attw and publint diff --git a/.scss-lint.yml b/.scss-lint.yml deleted file mode 100644 index 566c880084..0000000000 --- a/.scss-lint.yml +++ /dev/null @@ -1,205 +0,0 @@ -# See http://sass-guidelin.es/#zeros - -scss_files: - - 'spec/dummy/app/assets/stylesheets/**/*.scss' -exclude: - - 'spec/dummy/app/assets/stylesheets/application.css' -linters: - # BangFormat: - # enabled: true - # space_before_bang: true - # space_after_bang: false - # - # BorderZero: - # enabled: true - # convention: zero # or `none` - # - ColorKeyword: - enabled: false - ColorVariable: - enabled: false - # - # Comment: - # enabled: true - # - # DebugStatement: - # enabled: true - # - # DeclarationOrder: - # enabled: true - # - # DuplicateProperty: - # enabled: true - # - # ElsePlacement: - # enabled: true - # style: same_line # or 'new_line' - # - # EmptyLineBetweenBlocks: - # enabled: true - # ignore_single_line_blocks: true - # - # EmptyRule: - # enabled: true - # - # FinalNewline: - # enabled: true - # present: true - # - HexLength: - enabled: true - style: long - - HexNotation: - enabled: true - style: uppercase - # - # HexValidation: - # enabled: true - # - IdSelector: - enabled: true - # - # ImportantRule: - # enabled: true - # - # ImportPath: - # enabled: true - # leading_underscore: false - # filename_extension: false - # - # Indentation: - # enabled: true - # allow_non_nested_indentation: false - # character: space # or 'tab' - # width: 2 - # - LeadingZero: - enabled: true - style: include_zero -# -# MergeableSelector: -# enabled: true -# force_nesting: true -# -# NameFormat: -# enabled: true -# allow_leading_underscore: true -# convention: hyphenated_lowercase # or 'camel_case', or 'snake_case', or a regex pattern -# -# NestingDepth: -# enabled: true -# max_depth: 3 -# -# PlaceholderInExtend: -# enabled: true -# -# PropertyCount: -# enabled: false -# include_nested: false -# max_properties: 10 -# -# PropertyUnits: -# enabled: true -# global: [ -# 'ch', 'em', 'ex', 'rem', # Font-relative lengths -# 'cm', 'in', 'mm', 'pc', 'pt', 'px', 'q', # Absolute lengths -# 'vh', 'vw', 'vmin', 'vmax', # Viewport-percentage lengths -# 'deg', 'grad', 'rad', 'turn', # Angle -# 'ms', 's', # Duration -# 'Hz', 'kHz', # Frequency -# 'dpi', 'dpcm', 'dppx', # Resolution -# '%', # Other -# ] -# properties: {} -# -# PropertySortOrder: -# enabled: true -# ignore_unspecified: false -# separate_groups: false -# -# PropertySpelling: -# enabled: true -# extra_properties: [] -# -# QualifyingElement: -# enabled: true -# allow_element_with_attribute: false -# allow_element_with_class: false -# allow_element_with_id: false -# -# SelectorDepth: -# enabled: true -# max_depth: 3 -# -# SelectorFormat: -# enabled: true -# convention: hyphenated_lowercase # or 'strict_BEM', or 'hyphenated_BEM', or 'snake_case', or 'camel_case', or a regex pattern -# -# Shorthand: -# enabled: true -# allowed_shorthands: [1, 2, 3] -# -# SingleLinePerProperty: -# enabled: true -# allow_single_line_rule_sets: true -# -# SingleLinePerSelector: -# enabled: true -# -# SpaceAfterComma: -# enabled: true -# -# SpaceAfterPropertyColon: -# enabled: true -# style: one_space # or 'no_space', or 'at_least_one_space', or 'aligned' -# -# SpaceAfterPropertyName: -# enabled: true -# -# SpaceBeforeBrace: -# enabled: true -# style: space # or 'new_line' -# allow_single_line_padding: false -# -# SpaceBetweenParens: -# enabled: true -# spaces: 0 -# -# StringQuotes: -# enabled: true -# style: single_quotes # or double_quotes -# -# TrailingSemicolon: -# enabled: true -# -# TrailingZero: -# enabled: false -# -# UnnecessaryMantissa: -# enabled: true -# -# UnnecessaryParentReference: -# enabled: true -# -# UrlFormat: -# enabled: true -# -# UrlQuotes: -# enabled: true -# -# VariableForProperty: -# enabled: false -# properties: [] -# -# VendorPrefix: -# enabled: true -# identifier_list: base -# additional_identifiers: [] -# excluded_identifiers: [] -# -# ZeroUnit: -# enabled: true -# -# Compass::*: -# enabled: false diff --git a/.stylelintrc.json b/.stylelintrc.json new file mode 100644 index 0000000000..212a39767b --- /dev/null +++ b/.stylelintrc.json @@ -0,0 +1,46 @@ +{ + "extends": "stylelint-config-standard-scss", + "rules": { + "color-named": null, + "color-hex-length": "long", + "selector-id-pattern": null, + "scss/at-rule-no-unknown": [ + true, + { + "ignoreAtRules": [ + "include", + "mixin", + "each", + "if", + "else", + "for", + "while", + "function", + "return", + "use", + "forward" + ] + } + ], + "selector-class-pattern": null, + "custom-property-pattern": null, + "keyframes-name-pattern": null, + "scss/percent-placeholder-pattern": null, + "scss/dollar-variable-pattern": null, + "scss/at-function-pattern": null, + "scss/at-mixin-pattern": null, + "import-notation": null, + "at-rule-empty-line-before": null, + "font-family-name-quotes": null, + "rule-empty-line-before": null, + "scss/dollar-variable-empty-line-before": null, + "function-url-quotes": null + }, + "ignoreFiles": [ + "spec/dummy/app/assets/stylesheets/application.css", + "**/*.js", + "**/*.jsx", + "**/*.ts", + "**/*.tsx" + ] +} diff --git a/Gemfile.development_dependencies b/Gemfile.development_dependencies index dd89e56930..a391e52400 100644 --- a/Gemfile.development_dependencies +++ b/Gemfile.development_dependencies @@ -38,7 +38,6 @@ group :development, :test do gem "rubocop", "1.61.0", require: false gem "rubocop-performance", "~>1.20.0", require: false gem "rubocop-rspec", "~>2.26", require: false - gem "scss_lint", require: false gem "spring", "~> 4.0" gem "lefthook", require: false # Added for Ruby 3.5+ compatibility to silence warnings diff --git a/Gemfile.lock b/Gemfile.lock index a3950a469b..53509fdcec 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - react_on_rails (16.2.0.beta.4) + react_on_rails (16.2.0.beta.5) addressable connection_pool execjs (~> 2.5) @@ -332,11 +332,6 @@ GEM rubocop (~> 1.40) ruby-progressbar (1.13.0) rubyzip (2.3.2) - sass (3.7.4) - sass-listen (~> 4.0.0) - sass-listen (4.0.0) - rb-fsevent (~> 0.9, >= 0.9.4) - rb-inotify (~> 0.9, >= 0.9.7) sass-rails (6.0.0) sassc-rails (~> 2.1, >= 2.1.1) sassc (2.4.0) @@ -347,8 +342,6 @@ GEM sprockets (> 3.0) sprockets-rails tilt - scss_lint (0.60.0) - sass (~> 3.5, >= 3.5.5) sdoc (2.6.1) rdoc (>= 5.0) securerandom (0.4.1) @@ -473,7 +466,6 @@ DEPENDENCIES rubocop-performance (~> 1.20.0) rubocop-rspec (~> 2.26) sass-rails (~> 6.0) - scss_lint sdoc selenium-webdriver (= 4.9.0) shakapacker (= 9.3.0) diff --git a/knip.ts b/knip.ts index 60a6e0c7ef..d1faf6f48e 100644 --- a/knip.ts +++ b/knip.ts @@ -126,6 +126,12 @@ const config: KnipConfig = { '**/app-react16/**/*', // Playwright support files and helpers - generated by cypress-on-rails gem 'e2e/playwright/support/**', + // Components and files used dynamically by React on Rails (registered at runtime) + 'client/app/actions/**', + 'client/app/components/**', + 'client/app/routes/**', + 'client/app/startup/**', + 'client/app/store/**', ], project: ['**/*.{js,cjs,mjs,jsx,ts,cts,mts,tsx}!', 'config/webpack/*.js'], paths: { @@ -156,6 +162,18 @@ const config: KnipConfig = { 'url-loader', // Transitive dependency of shakapacker but listed as direct dependency 'webpack-merge', + // Dependencies not detected in production mode + '@babel/runtime', + 'mini-css-extract-plugin', + 'css-loader', + 'sass', + 'sass-loader', + // Dependencies used dynamically by React on Rails + 'create-react-class', + 'react-helmet', + '@types/react-helmet', + 'react-redux', + 'react-router-dom', ], }, }, diff --git a/lib/generators/react_on_rails/base_generator.rb b/lib/generators/react_on_rails/base_generator.rb index 8558705088..6f31eca25f 100644 --- a/lib/generators/react_on_rails/base_generator.rb +++ b/lib/generators/react_on_rails/base_generator.rb @@ -4,10 +4,12 @@ require "fileutils" require_relative "generator_messages" require_relative "generator_helper" +require_relative "js_dependency_manager" module ReactOnRails module Generators class BaseGenerator < Rails::Generators::Base include GeneratorHelper + include JsDependencyManager Rails::Generators.hide_namespace(namespace) source_root(File.expand_path("templates", __dir__)) @@ -107,7 +109,7 @@ def add_base_gems_to_gemfile run "bundle" end - def update_gitignore_for_generated_bundles + def update_gitignore_for_auto_registration gitignore_path = File.join(destination_root, ".gitignore") return unless File.exist?(gitignore_path) @@ -146,123 +148,6 @@ def append_to_spec_rails_helper private - def setup_js_dependencies - add_js_dependencies - install_js_dependencies - end - - def add_js_dependencies - add_react_on_rails_package - add_react_dependencies - add_css_dependencies - add_dev_dependencies - end - - def add_react_on_rails_package - major_minor_patch_only = /\A\d+\.\d+\.\d+\z/ - - # Try to use package_json gem first, fall back to direct npm commands - react_on_rails_pkg = if ReactOnRails::VERSION.match?(major_minor_patch_only) - ["react-on-rails@#{ReactOnRails::VERSION}"] - else - puts "Adding the latest react-on-rails NPM module. " \ - "Double check this is correct in package.json" - ["react-on-rails"] - end - - puts "Installing React on Rails package..." - return if add_npm_dependencies(react_on_rails_pkg) - - puts "Using direct npm commands as fallback" - success = system("npm", "install", *react_on_rails_pkg) - handle_npm_failure("react-on-rails package", react_on_rails_pkg) unless success - end - - def add_react_dependencies - puts "Installing React dependencies..." - react_deps = %w[ - react - react-dom - @babel/preset-react - prop-types - babel-plugin-transform-react-remove-prop-types - babel-plugin-macros - ] - return if add_npm_dependencies(react_deps) - - success = system("npm", "install", *react_deps) - handle_npm_failure("React dependencies", react_deps) unless success - end - - def add_css_dependencies - puts "Installing CSS handling dependencies..." - css_deps = %w[ - css-loader - css-minimizer-webpack-plugin - mini-css-extract-plugin - style-loader - ] - return if add_npm_dependencies(css_deps) - - success = system("npm", "install", *css_deps) - handle_npm_failure("CSS dependencies", css_deps) unless success - end - - def add_dev_dependencies - puts "Installing development dependencies..." - dev_deps = %w[ - @pmmmwh/react-refresh-webpack-plugin - react-refresh - ] - return if add_npm_dependencies(dev_deps, dev: true) - - success = system("npm", "install", "--save-dev", *dev_deps) - handle_npm_failure("development dependencies", dev_deps, dev: true) unless success - end - - def install_js_dependencies - # Detect which package manager to use - success = if File.exist?(File.join(destination_root, "yarn.lock")) - system("yarn", "install") - elsif File.exist?(File.join(destination_root, "pnpm-lock.yaml")) - system("pnpm", "install") - elsif File.exist?(File.join(destination_root, "package-lock.json")) || - File.exist?(File.join(destination_root, "package.json")) - # Use npm for package-lock.json or as default fallback - system("npm", "install") - else - true # No package manager detected, skip - end - - unless success - GeneratorMessages.add_warning(<<~MSG.strip) - ⚠️ JavaScript dependencies installation failed. - - This could be due to network issues or missing package manager. - You can install dependencies manually later by running: - • npm install (if using npm) - • yarn install (if using yarn) - • pnpm install (if using pnpm) - MSG - end - - success - end - - def handle_npm_failure(dependency_type, packages, dev: false) - install_command = dev ? "npm install --save-dev" : "npm install" - GeneratorMessages.add_warning(<<~MSG.strip) - ⚠️ Failed to install #{dependency_type}. - - The following packages could not be installed automatically: - #{packages.map { |pkg| " • #{pkg}" }.join("\n")} - - This could be due to network issues or missing package manager. - You can install them manually later by running: - #{install_command} #{packages.join(' ')} - MSG - end - def copy_webpack_main_config(base_path, config) webpack_config_path = "config/webpack/webpack.config.js" diff --git a/lib/generators/react_on_rails/install_generator.rb b/lib/generators/react_on_rails/install_generator.rb index f39168bc37..32cfd565a4 100644 --- a/lib/generators/react_on_rails/install_generator.rb +++ b/lib/generators/react_on_rails/install_generator.rb @@ -4,12 +4,14 @@ require "json" require_relative "generator_helper" require_relative "generator_messages" +require_relative "js_dependency_manager" module ReactOnRails module Generators # rubocop:disable Metrics/ClassLength class InstallGenerator < Rails::Generators::Base include GeneratorHelper + include JsDependencyManager # fetch USAGE file for details generator description source_root(File.expand_path(__dir__)) @@ -113,10 +115,7 @@ def invoke_generators end def setup_react_dependencies - @added_dependencies_to_package_json ||= false - @ran_direct_installs ||= false - add_js_dependencies - install_js_dependencies if @added_dependencies_to_package_json && !@ran_direct_installs + setup_js_dependencies end # NOTE: other requirements for existing files such as .gitignore or application. @@ -366,29 +365,8 @@ def missing_package_manager? def install_typescript_dependencies puts Rainbow("📝 Installing TypeScript dependencies...").yellow - - # Install TypeScript and React type definitions - typescript_packages = %w[ - typescript - @types/react - @types/react-dom - @babel/preset-typescript - ] - - # Try using GeneratorHelper first (package manager agnostic) - return if add_npm_dependencies(typescript_packages, dev: true) - - # Fallback to npm if GeneratorHelper fails - success = system("npm", "install", "--save-dev", *typescript_packages) - return if success - - warning = <<~MSG.strip - ⚠️ Failed to install TypeScript dependencies automatically. - - Please run manually: - npm install --save-dev #{typescript_packages.join(' ')} - MSG - GeneratorMessages.add_warning(warning) + # Delegate to shared module for consistent dependency management + add_typescript_dependencies end def create_css_module_types @@ -450,159 +428,6 @@ def create_typescript_config puts Rainbow("✅ Created tsconfig.json").green end - def add_js_dependencies - add_react_on_rails_package - add_react_dependencies - add_css_dependencies - add_rspack_dependencies if options.rspack? - add_dev_dependencies - end - - def add_react_on_rails_package - major_minor_patch_only = /\A\d+\.\d+\.\d+\z/ - - # Try to use package_json gem first, fall back to direct npm commands - react_on_rails_pkg = if ReactOnRails::VERSION.match?(major_minor_patch_only) - ["react-on-rails@#{ReactOnRails::VERSION}"] - else - puts "Adding the latest react-on-rails NPM module. " \ - "Double check this is correct in package.json" - ["react-on-rails"] - end - - puts "Installing React on Rails package..." - if add_npm_dependencies(react_on_rails_pkg) - @added_dependencies_to_package_json = true - return - end - - puts "Using direct npm commands as fallback" - success = system("npm", "install", *react_on_rails_pkg) - @ran_direct_installs = true if success - handle_npm_failure("react-on-rails package", react_on_rails_pkg) unless success - end - - def add_react_dependencies - puts "Installing React dependencies..." - react_deps = %w[ - react - react-dom - @babel/preset-react - prop-types - babel-plugin-transform-react-remove-prop-types - babel-plugin-macros - ] - if add_npm_dependencies(react_deps) - @added_dependencies_to_package_json = true - return - end - - success = system("npm", "install", *react_deps) - @ran_direct_installs = true if success - handle_npm_failure("React dependencies", react_deps) unless success - end - - def add_css_dependencies - puts "Installing CSS handling dependencies..." - css_deps = %w[ - css-loader - css-minimizer-webpack-plugin - mini-css-extract-plugin - style-loader - ] - if add_npm_dependencies(css_deps) - @added_dependencies_to_package_json = true - return - end - - success = system("npm", "install", *css_deps) - @ran_direct_installs = true if success - handle_npm_failure("CSS dependencies", css_deps) unless success - end - - def add_rspack_dependencies - puts "Installing Rspack core dependencies..." - rspack_deps = %w[ - @rspack/core - rspack-manifest-plugin - ] - if add_npm_dependencies(rspack_deps) - @added_dependencies_to_package_json = true - return - end - - success = system("npm", "install", *rspack_deps) - @ran_direct_installs = true if success - handle_npm_failure("Rspack dependencies", rspack_deps) unless success - end - - def add_dev_dependencies - puts "Installing development dependencies..." - dev_deps = if options.rspack? - %w[ - @rspack/cli - @rspack/plugin-react-refresh - react-refresh - ] - else - %w[ - @pmmmwh/react-refresh-webpack-plugin - react-refresh - ] - end - if add_npm_dependencies(dev_deps, dev: true) - @added_dependencies_to_package_json = true - return - end - - success = system("npm", "install", "--save-dev", *dev_deps) - @ran_direct_installs = true if success - handle_npm_failure("development dependencies", dev_deps, dev: true) unless success - end - - def install_js_dependencies - # Detect which package manager to use - success = if File.exist?(File.join(destination_root, "yarn.lock")) - system("yarn", "install") - elsif File.exist?(File.join(destination_root, "pnpm-lock.yaml")) - system("pnpm", "install") - elsif File.exist?(File.join(destination_root, "package-lock.json")) || - File.exist?(File.join(destination_root, "package.json")) - # Use npm for package-lock.json or as default fallback - system("npm", "install") - else - true # No package manager detected, skip - end - - unless success - GeneratorMessages.add_warning(<<~MSG.strip) - ⚠️ JavaScript dependencies installation failed. - - This could be due to network issues or missing package manager. - You can install dependencies manually later by running: - • npm install (if using npm) - • yarn install (if using yarn) - • pnpm install (if using pnpm) - MSG - end - - success - end - - def handle_npm_failure(dependency_type, packages, dev: false) - install_command = dev ? "npm install --save-dev" : "npm install" - GeneratorMessages.add_warning(<<~MSG.strip) - ⚠️ Failed to install #{dependency_type}. - - The following packages could not be installed automatically: - #{packages.map { |pkg| " • #{pkg}" }.join("\n")} - - This could be due to network issues or missing package manager. - You can install them manually later by running: - #{install_command} #{packages.join(' ')} - MSG - end - # Removed: Shakapacker auto-installation logic (now explicit dependency) # Removed: Shakapacker 8+ is now required as explicit dependency diff --git a/lib/generators/react_on_rails/js_dependency_manager.rb b/lib/generators/react_on_rails/js_dependency_manager.rb new file mode 100644 index 0000000000..00d2de9e96 --- /dev/null +++ b/lib/generators/react_on_rails/js_dependency_manager.rb @@ -0,0 +1,272 @@ +# frozen_string_literal: true + +require_relative "generator_messages" + +module ReactOnRails + module Generators + # Shared module for managing JavaScript dependencies across generators + # This module provides common functionality for adding and installing + # JS dependencies to avoid code duplication between generators. + # + # Since react_on_rails requires shakapacker, and shakapacker includes + # package_json as a dependency, the package_json gem is always available. + # + # == Instance Variables + # The module initializes and manages these instance variables: + # - @added_dependencies_to_package_json: Boolean tracking if package_json gem was used + # (initialized by setup_js_dependencies using `unless defined?` pattern) + # + # == Required Methods + # Including classes must include GeneratorHelper module which provides: + # - add_npm_dependencies(packages, dev: false): Add packages via package_json gem + # - package_json: Access to PackageJson instance (always available via shakapacker) + # - destination_root: Generator destination directory + # + # == Optional Methods + # Including classes may define: + # - options.rspack?: Returns true if --rspack flag is set (for Rspack support) + # - options.typescript?: Returns true if --typescript flag is set (for TypeScript support) + # + # == Installation Behavior + # The module ALWAYS runs package manager install after adding dependencies. + # This is safe because package_json gem's install is idempotent - it only + # installs what's actually needed from package.json. This prevents edge cases + # where package.json was modified but dependencies weren't installed. + # + # == Usage + # Include this module in generator classes and call setup_js_dependencies + # to handle all JS dependency installation via package_json gem. + module JsDependencyManager + # Core React dependencies required for React on Rails + # Note: @babel/preset-react and babel plugins are NOT included here because: + # - Shakapacker handles JavaScript transpiler configuration (babel, swc, or esbuild) + # - Users configure their preferred transpiler via shakapacker.yml javascript_transpiler setting + # - SWC is now the default and doesn't need Babel presets + # - For Babel users, shakapacker will install babel-loader and its dependencies + REACT_DEPENDENCIES = %w[ + react + react-dom + prop-types + ].freeze + + # CSS processing dependencies for webpack + CSS_DEPENDENCIES = %w[ + css-loader + css-minimizer-webpack-plugin + mini-css-extract-plugin + style-loader + ].freeze + + # Development-only dependencies for hot reloading (Webpack) + DEV_DEPENDENCIES = %w[ + @pmmmwh/react-refresh-webpack-plugin + react-refresh + ].freeze + + # Rspack core dependencies (only installed when --rspack flag is used) + RSPACK_DEPENDENCIES = %w[ + @rspack/core + rspack-manifest-plugin + ].freeze + + # Rspack development dependencies for hot reloading + RSPACK_DEV_DEPENDENCIES = %w[ + @rspack/cli + @rspack/plugin-react-refresh + react-refresh + ].freeze + + # TypeScript dependencies (only installed when --typescript flag is used) + # Note: @babel/preset-typescript is NOT included because: + # - SWC is now the default javascript_transpiler (has built-in TypeScript support) + # - Shakapacker handles the transpiler configuration via shakapacker.yml + # - If users choose javascript_transpiler: 'babel', they should manually add @babel/preset-typescript + # and configure it in their babel.config.js + TYPESCRIPT_DEPENDENCIES = %w[ + typescript + @types/react + @types/react-dom + ].freeze + + private + + def setup_js_dependencies + # Initialize instance variable if not already defined by including class + # This ensures safe operation when the module is first included + @added_dependencies_to_package_json = false unless defined?(@added_dependencies_to_package_json) + add_js_dependencies + + # Always run install to ensure all dependencies are properly installed. + # The package_json gem's install method is idempotent and safe to call + # even if packages were already added - it will only install what's needed. + # This ensures edge cases where package.json was modified but install wasn't + # run are handled correctly. + install_js_dependencies + end + + def add_js_dependencies + add_react_on_rails_package + add_react_dependencies + add_css_dependencies + # Rspack dependencies are only added when --rspack flag is used + add_rspack_dependencies if respond_to?(:options) && options.rspack? + # Dev dependencies vary based on bundler choice + add_dev_dependencies + end + + def add_react_on_rails_package + # Use exact version match between gem and npm package for stable releases + # For pre-release versions (e.g., 16.1.0-rc.1), use latest to avoid installing + # a version that may not exist in the npm registry + major_minor_patch_only = /\A\d+\.\d+\.\d+\z/ + react_on_rails_pkg = if ReactOnRails::VERSION.match?(major_minor_patch_only) + "react-on-rails@#{ReactOnRails::VERSION}" + else + puts "Adding the latest react-on-rails NPM module. " \ + "Double check this is correct in package.json" + "react-on-rails" + end + + puts "Installing React on Rails package..." + if add_js_dependency(react_on_rails_pkg) + @added_dependencies_to_package_json = true + else + # This should not happen since package_json is always available via shakapacker + raise "Failed to add react-on-rails package via package_json gem. " \ + "This indicates shakapacker dependency may not be properly installed." + end + end + + def add_react_dependencies + puts "Installing React dependencies..." + + if add_js_dependencies_batch(REACT_DEPENDENCIES) + @added_dependencies_to_package_json = true + else + # This should not happen since package_json is always available via shakapacker + raise "Failed to add React dependencies (#{REACT_DEPENDENCIES.join(', ')}) via package_json gem. " \ + "This indicates shakapacker dependency may not be properly installed." + end + end + + def add_css_dependencies + puts "Installing CSS handling dependencies..." + + if add_js_dependencies_batch(CSS_DEPENDENCIES) + @added_dependencies_to_package_json = true + else + # This should not happen since package_json is always available via shakapacker + raise "Failed to add CSS dependencies (#{CSS_DEPENDENCIES.join(', ')}) via package_json gem. " \ + "This indicates shakapacker dependency may not be properly installed." + end + end + + def add_rspack_dependencies + puts "Installing Rspack core dependencies..." + + if add_js_dependencies_batch(RSPACK_DEPENDENCIES) + @added_dependencies_to_package_json = true + else + # This should not happen since package_json is always available via shakapacker + raise "Failed to add Rspack dependencies (#{RSPACK_DEPENDENCIES.join(', ')}) via package_json gem. " \ + "This indicates shakapacker dependency may not be properly installed." + end + end + + def add_typescript_dependencies + puts "Installing TypeScript dependencies..." + + if add_js_dependencies_batch(TYPESCRIPT_DEPENDENCIES, dev: true) + @added_dependencies_to_package_json = true + else + # This should not happen since package_json is always available via shakapacker + raise "Failed to add TypeScript dependencies (#{TYPESCRIPT_DEPENDENCIES.join(', ')}) via package_json gem. " \ + "This indicates shakapacker dependency may not be properly installed." + end + end + + def add_dev_dependencies + puts "Installing development dependencies..." + + # Use Rspack-specific dev dependencies if --rspack flag is set + dev_deps = if respond_to?(:options) && options.rspack? + RSPACK_DEV_DEPENDENCIES + else + DEV_DEPENDENCIES + end + + if add_js_dependencies_batch(dev_deps, dev: true) + @added_dependencies_to_package_json = true + else + # This should not happen since package_json is always available via shakapacker + raise "Failed to add development dependencies (#{dev_deps.join(', ')}) via package_json gem. " \ + "This indicates shakapacker dependency may not be properly installed." + end + end + + # Add a single dependency using package_json gem + # + # This method is used internally for adding the react-on-rails package + # with version-specific handling (react-on-rails@VERSION). + # For batch operations, use add_js_dependencies_batch instead. + # + # @param package [String] Package specifier (e.g., "react-on-rails@16.0.0") + # @param dev [Boolean] Whether to add as dev dependency + # @return [Boolean] true if successful, false otherwise + def add_js_dependency(package, dev: false) + pj = package_json + return false unless pj + + begin + # Ensure package is in array format for package_json gem + packages_array = [package] + if dev + pj.manager.add(packages_array, type: :dev) + else + pj.manager.add(packages_array) + end + true + rescue StandardError => e + puts "Warning: Could not add #{package} via package_json gem: #{e.message}" + false + end + end + + # Add multiple dependencies at once using package_json gem + # + # This method delegates to GeneratorHelper's add_npm_dependencies for + # better package manager abstraction and batch processing efficiency. + # + # @param packages [Array] Package names to add + # @param dev [Boolean] Whether to add as dev dependencies + # @return [Boolean] true if successful, false otherwise + def add_js_dependencies_batch(packages, dev: false) + # Use the add_npm_dependencies helper from GeneratorHelper + add_npm_dependencies(packages, dev: dev) + end + + def install_js_dependencies + # Use package_json gem's install method (always available via shakapacker) + # package_json is guaranteed to be available because: + # 1. react_on_rails gemspec requires shakapacker + # 2. shakapacker gemspec requires package_json + # 3. GeneratorHelper provides package_json method + package_json.manager.install + true + rescue StandardError => e + GeneratorMessages.add_warning(<<~MSG.strip) + ⚠️ JavaScript dependencies installation failed: #{e.message} + + This could be due to network issues or package manager problems. + You can install dependencies manually later by running: + • npm install (if using npm) + • yarn install (if using yarn) + • pnpm install (if using pnpm) + MSG + false + end + + # No longer needed since package_json gem handles package manager detection + end + end +end diff --git a/lib/generators/react_on_rails/templates/base/base/config/shakapacker.yml b/lib/generators/react_on_rails/templates/base/base/config/shakapacker.yml index 30e290fcbc..26f2db0dbf 100644 --- a/lib/generators/react_on_rails/templates/base/base/config/shakapacker.yml +++ b/lib/generators/react_on_rails/templates/base/base/config/shakapacker.yml @@ -36,8 +36,15 @@ default: &default # Reload manifest.json on all requests so we reload latest compiled packs cache_manifest: false - # Select loader to use, available options are 'babel' (default), 'swc' or 'esbuild' - webpack_loader: 'babel' + # Select JavaScript transpiler to use + # Available options: 'swc' (default, 20x faster), 'babel', 'esbuild', or 'none' + # Use 'none' when providing a completely custom webpack configuration + # Note: When using rspack, swc is used automatically regardless of this setting + javascript_transpiler: "swc" + + # Select assets bundler to use + # Available options: 'webpack' (default) or 'rspack' + assets_bundler: "webpack" # Raises an error if there is a mismatch in the shakapacker gem and npm package being used ensure_consistent_versioning: true diff --git a/lib/react_on_rails/version.rb b/lib/react_on_rails/version.rb index 4df67052b2..aace207307 100644 --- a/lib/react_on_rails/version.rb +++ b/lib/react_on_rails/version.rb @@ -1,5 +1,5 @@ # frozen_string_literal: true module ReactOnRails - VERSION = "16.2.0.beta.4" + VERSION = "16.2.0.beta.5" end diff --git a/package.json b/package.json index 3d2a498bbc..f8ed2bd916 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "react-on-rails-workspace", - "version": "16.2.0-beta.4", + "version": "16.2.0-beta.5", "description": "react-on-rails monorepo workspace manager", "private": true, "type": "module", @@ -55,6 +55,8 @@ "react-dom": "^19.0.0", "react-on-rails-rsc": "19.0.2", "redux": "^4.2.1", + "stylelint": "^16.14.0", + "stylelint-config-standard-scss": "^13.1.0", "swc-loader": "^0.2.6", "ts-jest": "^29.2.5", "typescript": "^5.8.3", @@ -67,6 +69,7 @@ "build": "yarn workspace react-on-rails run build && yarn workspace react-on-rails-pro run build", "build-watch": "yarn workspaces run build-watch", "lint": "nps eslint", + "lint:scss": "stylelint \"spec/dummy/app/assets/stylesheets/**/*.scss\" \"spec/dummy/client/**/*.scss\"", "check": "yarn run lint && yarn workspaces run check", "type-check": "yarn workspaces run type-check", "yalc:publish": "yarn workspaces run yalc:publish", diff --git a/packages/react-on-rails-pro/package.json b/packages/react-on-rails-pro/package.json index c28c7a20f0..7f36e9f432 100644 --- a/packages/react-on-rails-pro/package.json +++ b/packages/react-on-rails-pro/package.json @@ -1,6 +1,6 @@ { "name": "react-on-rails-pro", - "version": "16.2.0-beta.4", + "version": "16.2.0-beta.5", "description": "React on Rails Pro package with React Server Components support", "type": "module", "scripts": { @@ -56,7 +56,7 @@ "./ServerComponentFetchError": "./lib/ServerComponentFetchError.js" }, "dependencies": { - "react-on-rails": "16.2.0-beta.4" + "react-on-rails": "16.2.0-beta.5" }, "peerDependencies": { "react": ">= 16", diff --git a/packages/react-on-rails/package.json b/packages/react-on-rails/package.json index cff886a120..877ba9ea64 100644 --- a/packages/react-on-rails/package.json +++ b/packages/react-on-rails/package.json @@ -1,6 +1,6 @@ { "name": "react-on-rails", - "version": "16.2.0-beta.4", + "version": "16.2.0-beta.5", "description": "react-on-rails JavaScript for react_on_rails Ruby gem", "main": "lib/ReactOnRails.full.js", "type": "module", diff --git a/rakelib/docker.rake b/rakelib/docker.rake index 6fb0ddaebf..6e881d9f04 100644 --- a/rakelib/docker.rake +++ b/rakelib/docker.rake @@ -6,7 +6,7 @@ namespace :docker do sh "docker-compose run lint rake lint:rubocop" end - desc "Run scss-lint linter from docker" + desc "Run stylelint linter from docker" task :scss do sh "docker-compose run lint rake lint:scss" end diff --git a/rakelib/lint.rake b/rakelib/lint.rake index 4b444266ba..91e8eebea9 100644 --- a/rakelib/lint.rake +++ b/rakelib/lint.rake @@ -2,7 +2,7 @@ require_relative "task_helpers" -namespace :lint do +namespace :lint do # rubocop:disable Metrics/BlockLength include ReactOnRails::TaskHelpers desc "Run Rubocop as shell" @@ -10,9 +10,9 @@ namespace :lint do sh_in_dir(gem_root, "bundle exec rubocop --version", "bundle exec rubocop .") end - desc "Run scss-lint as shell" + desc "Run stylelint as shell" task :scss do - sh_in_dir(gem_root, "bundle exec scss-lint spec/dummy/app/assets/stylesheets/") + sh_in_dir(gem_root, stylelint_command) end desc "Run eslint as shell" @@ -20,8 +20,8 @@ namespace :lint do sh_in_dir(gem_root, "yarn run eslint --version", "yarn run eslint .") end - desc "Run all eslint & rubocop linters. Skip scss" - task lint: %i[eslint rubocop] do + desc "Run all eslint, rubocop & stylelint linters" + task lint: %i[eslint rubocop scss] do puts "Completed all linting" end @@ -29,9 +29,20 @@ namespace :lint do task :autofix do sh_in_dir(gem_root, "yarn run eslint . --fix") sh_in_dir(gem_root, "yarn run prettier --write .") + sh_in_dir(gem_root, stylelint_fix_command) sh_in_dir(gem_root, "bundle exec rubocop -A") puts "Completed auto-fixing all linting violations" end + + private + + def stylelint_command + "yarn run stylelint \"spec/dummy/app/assets/stylesheets/**/*.scss\" \"spec/dummy/client/**/*.scss\"" + end + + def stylelint_fix_command + "#{stylelint_command} --fix" + end end desc "Runs all linters. Run `rake -D lint` to see all available lint options" diff --git a/react_on_rails_pro/Gemfile.lock b/react_on_rails_pro/Gemfile.lock index d72ae72051..9e14b6d8cd 100644 --- a/react_on_rails_pro/Gemfile.lock +++ b/react_on_rails_pro/Gemfile.lock @@ -9,7 +9,7 @@ GIT PATH remote: .. specs: - react_on_rails (16.2.0.beta.4) + react_on_rails (16.2.0.beta.5) addressable connection_pool execjs (~> 2.5) @@ -20,7 +20,7 @@ PATH PATH remote: . specs: - react_on_rails_pro (16.2.0.beta.4) + react_on_rails_pro (16.2.0.beta.5) addressable async (>= 2.6) connection_pool @@ -28,7 +28,7 @@ PATH httpx (~> 1.5) jwt (~> 2.7) rainbow - react_on_rails (= 16.2.0.beta.4) + react_on_rails (= 16.2.0.beta.5) GEM remote: https://rubygems.org/ 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 c9d4eb5008..8618c7250a 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 = "16.2.0.beta.4" + VERSION = "16.2.0.beta.5" PROTOCOL_VERSION = "2.0.0" end diff --git a/react_on_rails_pro/package.json b/react_on_rails_pro/package.json index e7b85fb568..8d88fadd81 100644 --- a/react_on_rails_pro/package.json +++ b/react_on_rails_pro/package.json @@ -1,6 +1,6 @@ { "name": "react-on-rails-pro-node-renderer", - "version": "16.2.0-beta.4", + "version": "16.2.0-beta.5", "protocolVersion": "2.0.0", "description": "react-on-rails-pro JavaScript for react_on_rails_pro Ruby gem", "exports": { diff --git a/react_on_rails_pro/spec/dummy/Gemfile.lock b/react_on_rails_pro/spec/dummy/Gemfile.lock index 3d50301024..178909ffbc 100644 --- a/react_on_rails_pro/spec/dummy/Gemfile.lock +++ b/react_on_rails_pro/spec/dummy/Gemfile.lock @@ -9,7 +9,7 @@ GIT PATH remote: ../../.. specs: - react_on_rails (16.2.0.beta.4) + react_on_rails (16.2.0.beta.5) addressable connection_pool execjs (~> 2.5) @@ -20,14 +20,15 @@ PATH PATH remote: ../.. specs: - react_on_rails_pro (16.2.0.beta.4) + react_on_rails_pro (16.2.0.beta.5) addressable + async (>= 2.6) connection_pool execjs (~> 2.9) httpx (~> 1.5) jwt (~> 2.7) rainbow - react_on_rails (= 16.2.0.beta.4) + react_on_rails (= 16.2.0.beta.5) GEM remote: https://rubygems.org/ @@ -107,6 +108,12 @@ GEM public_suffix (>= 2.0.2, < 7.0) amazing_print (1.6.0) ast (2.4.2) + async (2.34.0) + console (~> 1.29) + fiber-annotation + io-event (~> 1.11) + metrics (~> 0.12) + traces (~> 0.18) base64 (0.2.0) benchmark (0.4.0) bigdecimal (3.1.9) @@ -131,6 +138,10 @@ GEM coderay (1.1.3) concurrent-ruby (1.3.5) connection_pool (2.5.0) + console (1.34.2) + fiber-annotation + fiber-local (~> 1.1) + json coveralls (0.8.23) json (>= 1.8, < 3) simplecov (~> 0.16.1) @@ -165,6 +176,9 @@ GEM ffi (1.17.0-x86_64-darwin) ffi (1.17.0-x86_64-linux-gnu) ffi (1.17.0-x86_64-linux-musl) + fiber-annotation (0.2.0) + fiber-local (1.1.0) + fiber-storage fiber-storage (1.0.0) generator_spec (0.10.0) activesupport (>= 3.0.0) @@ -184,6 +198,7 @@ GEM i18n (1.14.7) concurrent-ruby (~> 1.0) io-console (0.8.0) + io-event (1.14.2) irb (1.15.1) pp (>= 0.6.0) rdoc (>= 4.0.0) @@ -216,6 +231,7 @@ GEM marcel (1.0.4) matrix (0.4.2) method_source (1.1.0) + metrics (0.15.0) mini_mime (1.1.5) mini_portile2 (2.8.8) minitest (5.25.4) @@ -447,6 +463,7 @@ GEM tins (1.33.0) bigdecimal sync + traces (0.18.2) turbolinks (5.2.1) turbolinks-source (~> 5.2) turbolinks-source (5.2.0) diff --git a/react_on_rails_pro/spec/dummy/bin/dev b/react_on_rails_pro/spec/dummy/bin/dev index 2daf77649c..9fb5cf7573 100755 --- a/react_on_rails_pro/spec/dummy/bin/dev +++ b/react_on_rails_pro/spec/dummy/bin/dev @@ -1,9 +1,5 @@ -#!/usr/bin/env bash +#!/usr/bin/env ruby +# frozen_string_literal: true -if ! command -v foreman &> /dev/null -then - echo "Installing foreman..." - gem install foreman -fi - -foreman start -f Procfile.dev +# This script calls the base dev script with a fixed route for the dummy app +exec File.join(__dir__, "../../../../lib/generators/react_on_rails/templates/base/base/bin/dev"), "--route=/", *ARGV diff --git a/spec/dummy/Gemfile.lock b/spec/dummy/Gemfile.lock index d6281818c1..2c202ec26d 100644 --- a/spec/dummy/Gemfile.lock +++ b/spec/dummy/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: ../.. specs: - react_on_rails (16.2.0.beta.4) + react_on_rails (16.2.0.beta.5) addressable connection_pool execjs (~> 2.5) @@ -327,11 +327,6 @@ GEM rubocop-factory_bot (~> 2.22) ruby-progressbar (1.13.0) rubyzip (2.3.2) - sass (3.7.4) - sass-listen (~> 4.0.0) - sass-listen (4.0.0) - rb-fsevent (~> 0.9, >= 0.9.4) - rb-inotify (~> 0.9, >= 0.9.7) sass-rails (6.0.0) sassc-rails (~> 2.1, >= 2.1.1) sassc (2.4.0) @@ -342,8 +337,6 @@ GEM sprockets (> 3.0) sprockets-rails tilt - scss_lint (0.60.0) - sass (~> 3.5, >= 3.5.5) sdoc (2.6.1) rdoc (>= 5.0) securerandom (0.4.1) @@ -466,7 +459,6 @@ DEPENDENCIES rubocop-performance (~> 1.20.0) rubocop-rspec (~> 2.26) sass-rails (~> 6.0) - scss_lint sdoc selenium-webdriver (= 4.9.0) shakapacker (= 9.3.0) diff --git a/spec/dummy/bin/dev b/spec/dummy/bin/dev deleted file mode 120000 index a253a84c49..0000000000 --- a/spec/dummy/bin/dev +++ /dev/null @@ -1 +0,0 @@ -../../../lib/generators/react_on_rails/templates/base/base/bin/dev \ No newline at end of file diff --git a/spec/dummy/bin/dev b/spec/dummy/bin/dev new file mode 100755 index 0000000000..de10fbc303 --- /dev/null +++ b/spec/dummy/bin/dev @@ -0,0 +1,5 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +# This script calls the base dev script with a fixed route for the dummy app +exec File.join(__dir__, "../../../lib/generators/react_on_rails/templates/base/base/bin/dev"), "--route=/", *ARGV diff --git a/spec/dummy/bin/scss-lint b/spec/dummy/bin/scss-lint deleted file mode 100755 index d195391be2..0000000000 --- a/spec/dummy/bin/scss-lint +++ /dev/null @@ -1,29 +0,0 @@ -#!/usr/bin/env ruby -# frozen_string_literal: true - -# -# This file was generated by Bundler. -# -# The application 'scss-lint' is installed as part of a gem, and -# this file is here to facilitate running it. -# - -require "pathname" -ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile", - Pathname.new(__FILE__).realpath) - -bundle_binstub = File.expand_path("../bundle", __FILE__) - -if File.file?(bundle_binstub) - if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/ - load(bundle_binstub) - else - abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run. -Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.") - end -end - -require "rubygems" -require "bundler/setup" - -load Gem.bin_path("scss_lint", "scss-lint") diff --git a/spec/react_on_rails/generators/message_deduplication_spec.rb b/spec/react_on_rails/generators/message_deduplication_spec.rb new file mode 100644 index 0000000000..51188c2185 --- /dev/null +++ b/spec/react_on_rails/generators/message_deduplication_spec.rb @@ -0,0 +1,141 @@ +# frozen_string_literal: true + +require_relative "../support/generator_spec_helper" +require_relative "../support/version_test_helpers" + +describe "Message Deduplication", type: :generator do + include GeneratorSpec::TestCase + + destination File.expand_path("../dummy-for-generators", __dir__) + tests ReactOnRails::Generators::InstallGenerator + + describe "Post-install message handling" do + before do + # Clear any previous messages to ensure clean test state + GeneratorMessages.clear + # Mock Shakapacker installation to succeed + allow(File).to receive(:exist?).and_call_original + allow(File).to receive(:exist?).with("bin/shakapacker").and_return(true) + allow(File).to receive(:exist?).with("bin/shakapacker-dev-server").and_return(true) + allow(File).to receive(:exist?).with("config/shakapacker.yml").and_return(true) + allow(File).to receive(:exist?).with("config/webpack/webpack.config.js").and_return(true) + # Mock file reading for webpack config - use call_original first, then specific mock + allow(File).to receive(:read).and_call_original + allow(File).to receive(:read).with("config/webpack/webpack.config.js").and_return("// mock webpack config") + end + + context "with non-Redux installation" do + it "shows the success message exactly once" do + run_generator_test_with_args(%w[], package_json: true) + output_text = GeneratorMessages.output.join("\n") + + # Count occurrences of the success message + success_count = output_text.scan("🎉 React on Rails Successfully Installed!").count + expect(success_count).to( + eq(1), + "Expected success message to appear exactly once, but appeared #{success_count} times" + ) + + # Ensure post-install message components are present + expect(output_text).to include("📋 QUICK START:") + expect(output_text).to include("✨ KEY FEATURES:") + end + end + + context "with Redux installation" do + it "shows the success message exactly once" do + run_generator_test_with_args(%w[--redux], package_json: true) + output_text = GeneratorMessages.output.join("\n") + + # Count occurrences of the success message + success_count = output_text.scan("🎉 React on Rails Successfully Installed!").count + expect(success_count).to( + eq(1), + "Expected success message to appear exactly once with Redux, but appeared #{success_count} times" + ) + + # Ensure post-install message components are present + expect(output_text).to include("📋 QUICK START:") + expect(output_text).to include("✨ KEY FEATURES:") + + # The message should be from the Redux generator, containing Redux-specific info + expect(output_text).to include("HelloWorldApp") + end + end + end + + describe "NPM install execution" do + let(:install_generator) { ReactOnRails::Generators::InstallGenerator.new } + + before do + # Mock the system to track NPM install calls + allow(install_generator).to receive_messages( + system: true, + add_npm_dependencies: false, + destination_root: "/test/path" + ) + allow(File).to receive(:exist?).and_return(false) + allow(File).to receive(:exist?).with(a_string_matching(/package\.json$/)).and_return(true) + + # Initialize instance variables + install_generator.instance_variable_set(:@added_dependencies_to_package_json, false) + end + + context "when using package_json gem (always available via shakapacker)" do + before do + # Mock the actual methods used by JsDependencyManager + # add_npm_dependencies is from GeneratorHelper and is used by add_js_dependencies_batch + # Mock package_json to prevent actual package manager calls + # rubocop:disable RSpec/VerifiedDoubles + mock_manager = double("PackageManager", install: true) + mock_package_json = double("PackageJson", manager: mock_manager) + # rubocop:enable RSpec/VerifiedDoubles + allow(install_generator).to receive_messages( + add_npm_dependencies: true, + package_json: mock_package_json + ) + end + + it "does not run duplicate install commands" do + # When package_json gem methods work, it should NOT call system() commands + expect(install_generator).not_to receive(:system) + + # Run the dependency setup + install_generator.send(:setup_js_dependencies) + + # Verify state was set correctly to indicate package_json was used + expect(install_generator.instance_variable_get(:@added_dependencies_to_package_json)).to be true + end + end + end + + describe "JS dependency method organization" do + it "uses the shared JsDependencyManager module in base_generator" do + expect(ReactOnRails::Generators::BaseGenerator.ancestors) + .to include(ReactOnRails::Generators::JsDependencyManager) + end + + it "uses the shared JsDependencyManager module in install_generator" do + expect(ReactOnRails::Generators::InstallGenerator.ancestors) + .to include(ReactOnRails::Generators::JsDependencyManager) + end + + it "does not duplicate JS dependency methods between generators" do + base_generator = ReactOnRails::Generators::BaseGenerator.new + install_generator = ReactOnRails::Generators::InstallGenerator.new + + # Both should respond to the shared methods + shared_methods = %i[setup_js_dependencies add_js_dependencies install_js_dependencies] + + shared_methods.each do |method| + expect(base_generator.respond_to?(method, true)).to be(true) + expect(install_generator.respond_to?(method, true)).to be(true) + # Verify the methods are defined by the shared module + expect(ReactOnRails::Generators::BaseGenerator.instance_method(method).owner) + .to eq(ReactOnRails::Generators::JsDependencyManager) + expect(ReactOnRails::Generators::InstallGenerator.instance_method(method).owner) + .to eq(ReactOnRails::Generators::JsDependencyManager) + end + end + end +end diff --git a/yarn.lock b/yarn.lock index 1c9699ebea..1415751d8f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1073,11 +1073,59 @@ resolved "https://registry.npmjs.org/@braidai/lang/-/lang-1.1.0.tgz" integrity sha512-xyJYkiyNQtTyCLeHxZmOs7rnB94D+N1IjKNArQIh8+8lTBOY7TFgwEV+Ow5a1uaBi5j2w9fLbWcJFTWLDItl5g== +"@cacheable/memoize@^2.0.1", "@cacheable/memoize@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@cacheable/memoize/-/memoize-2.0.2.tgz#5b4796906454a1f4b41ccd789a9d9e6678ee9901" + integrity sha512-wPrr7FUiq3Qt4yQyda2/NcOLTJCFcQSU3Am2adP+WLy+sz93/fKTokVTHmtz+rjp4PD7ee0AEOeRVNN6IvIfsg== + dependencies: + "@cacheable/utils" "^2.0.2" + +"@cacheable/memory@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@cacheable/memory/-/memory-2.0.2.tgz#14787e34c3025bdbbb6f9c1719b5bc4e1af68e5b" + integrity sha512-sJTITLfeCI1rg7P3ssaGmQryq235EGT8dXGcx6oZwX5NRnKq9IE6lddlllcOl+oXW+yaeTRddCjo0xrfU6ZySA== + dependencies: + "@cacheable/memoize" "^2.0.1" + "@cacheable/utils" "^2.0.2" + "@keyv/bigmap" "^1.0.2" + hookified "^1.12.1" + keyv "^5.5.2" + +"@cacheable/utils@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@cacheable/utils/-/utils-2.0.2.tgz#5b28f9c653ca25ad9ab638ed4a98103afd7d88cf" + integrity sha512-JTFM3raFhVv8LH95T7YnZbf2YoE9wEtkPPStuRF9a6ExZ103hFvs+QyCuYJ6r0hA9wRtbzgZtwUCoDWxssZd4Q== + "@colors/colors@1.5.0": version "1.5.0" resolved "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz" integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== +"@csstools/css-parser-algorithms@^3.0.5": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz#5755370a9a29abaec5515b43c8b3f2cf9c2e3076" + integrity sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ== + +"@csstools/css-tokenizer@^3.0.4": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz#333fedabc3fd1a8e5d0100013731cf19e6a8c5d3" + integrity sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw== + +"@csstools/media-query-list-parser@^4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.3.tgz#7aec77bcb89c2da80ef207e73f474ef9e1b3cdf1" + integrity sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ== + +"@csstools/selector-specificity@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz#037817b574262134cabd68fc4ec1a454f168407b" + integrity sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw== + +"@dual-bundle/import-meta-resolve@^4.1.0": + version "4.2.1" + resolved "https://registry.yarnpkg.com/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.2.1.tgz#cd0b25b3808cd9e684cd6cd549bbf8e1dcf05ee7" + integrity sha512-id+7YRUgoUX6CgV0DtuhirQWodeeA7Lf4i2x71JS/vtA5pRb/hIGWlw+G6MeXvsM+MXrz0VAydTGElX1rAfgPg== + "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.7.0": version "4.7.0" resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz" @@ -1410,6 +1458,18 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" +"@keyv/bigmap@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@keyv/bigmap/-/bigmap-1.0.2.tgz#9480d168c99a4a6c2fd3b677387cd922aa82a470" + integrity sha512-KR03xkEZlAZNF4IxXgVXb+uNIVNvwdh8UwI0cnc7WI6a+aQcDp8GL80qVfeB4E5NpsKJzou5jU0r6yLSSbMOtA== + dependencies: + hookified "^1.12.1" + +"@keyv/serialize@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@keyv/serialize/-/serialize-1.1.1.tgz#0c01dd3a3483882af7cf3878d4e71d505c81fc4a" + integrity sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA== + "@loaderkit/resolve@^1.0.2": version "1.0.3" resolved "https://registry.npmjs.org/@loaderkit/resolve/-/resolve-1.0.3.tgz" @@ -1514,74 +1574,74 @@ ignore "^5.1.8" p-map "^4.0.0" -"@swc/core-darwin-arm64@1.15.0": - version "1.15.0" - resolved "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.15.0.tgz#158a0890fb2546b4d57b99234c1033e4a38b62e2" - integrity sha512-TBKWkbnShnEjlIbO4/gfsrIgAqHBVqgPWLbWmPdZ80bF393yJcLgkrb7bZEnJs6FCbSSuGwZv2rx1jDR2zo6YA== - -"@swc/core-darwin-x64@1.15.0": - version "1.15.0" - resolved "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.15.0.tgz#d03a71e60244f19ac921bf23c2cafc4122d76d8e" - integrity sha512-f5JKL1v1H56CIZc1pVn4RGPOfnWqPwmuHdpf4wesvXunF1Bx85YgcspW5YxwqG5J9g3nPU610UFuExJXVUzOiQ== - -"@swc/core-linux-arm-gnueabihf@1.15.0": - version "1.15.0" - resolved "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.15.0.tgz#fe978712a8924c0555c6b248ad3b57912ba123fb" - integrity sha512-duK6nG+WyuunnfsfiTUQdzC9Fk8cyDLqT9zyXvY2i2YgDu5+BH5W6wM5O4mDNCU5MocyB/SuF5YDF7XySnowiQ== - -"@swc/core-linux-arm64-gnu@1.15.0": - version "1.15.0" - resolved "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.15.0.tgz#a5dacdd857dec4ac2931820def17bc0e42c88ede" - integrity sha512-ITe9iDtTRXM98B91rvyPP6qDVbhUBnmA/j4UxrHlMQ0RlwpqTjfZYZkD0uclOxSZ6qIrOj/X5CaoJlDUuQ0+Cw== - -"@swc/core-linux-arm64-musl@1.15.0": - version "1.15.0" - resolved "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.15.0.tgz#243643a7d22c8e2f334046c1d76f342ad4369be9" - integrity sha512-Q5ldc2bzriuzYEoAuqJ9Vr3FyZhakk5hiwDbniZ8tlEXpbjBhbOleGf9/gkhLaouDnkNUEazFW9mtqwUTRdh7Q== - -"@swc/core-linux-x64-gnu@1.15.0": - version "1.15.0" - resolved "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.15.0.tgz#26936f55c916f65d33a4cf957c7573722f9eca54" - integrity sha512-pY4is+jEpOxlYCSnI+7N8Oxbap9TmTz5YT84tUvRTlOlTBwFAUlWFCX0FRwWJlsfP0TxbqhIe8dNNzlsEmJbXQ== - -"@swc/core-linux-x64-musl@1.15.0": - version "1.15.0" - resolved "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.15.0.tgz#a7164c11ac86ed99a1d5d8bef86ec0fbe6235f6c" - integrity sha512-zYEt5eT8y8RUpoe7t5pjpoOdGu+/gSTExj8PV86efhj6ugB3bPlj3Y85ogdW3WMVXr4NvwqvzdaYGCZfXzSyVg== - -"@swc/core-win32-arm64-msvc@1.15.0": - version "1.15.0" - resolved "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.15.0.tgz#645fe54564eab4224127672f2f4fe44876223af0" - integrity sha512-zC1rmOgFH5v2BCbByOazEqs0aRNpTdLRchDExfcCfgKgeaD+IdpUOqp7i3VG1YzkcnbuZjMlXfM0ugpt+CddoA== - -"@swc/core-win32-ia32-msvc@1.15.0": - version "1.15.0" - resolved "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.15.0.tgz#fd70c8c8b542a52a88cda758fb82569d52ea949a" - integrity sha512-7t9U9KwMwQblkdJIH+zX1V4q1o3o41i0HNO+VlnAHT5o+5qHJ963PHKJ/pX3P2UlZnBCY465orJuflAN4rAP9A== - -"@swc/core-win32-x64-msvc@1.15.0": - version "1.15.0" - resolved "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.15.0.tgz#1d4f06078c7dbf757c537dd08740472694257198" - integrity sha512-VE0Zod5vcs8iMLT64m5QS1DlTMXJFI/qSgtMDRx8rtZrnjt6/9NW8XUaiPJuRu8GluEO1hmHoyf1qlbY19gGSQ== +"@swc/core-darwin-arm64@1.15.1": + version "1.15.1" + resolved "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.15.1.tgz#3e47fd61aec6ec3ede76c0e7eff8b206b9bcd727" + integrity sha512-vEPrVxegWIjKEz+1VCVuKRY89jhokhSmQ/YXBWLnmLj9cI08G61RTZJvdsIcjYUjjTu7NgZlYVK+b2y0fbh11g== + +"@swc/core-darwin-x64@1.15.1": + version "1.15.1" + resolved "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.15.1.tgz#7e4b866057208abb4629fb2e95a4eb901ce330e6" + integrity sha512-z9QguKxE3aldvwKHHDg5OlKehasbJBF1lacn5CnN6SlrHbdwokXHFA3nIoO3Bh1Tw7bCgFtdIR4jKlTTn3kBZA== + +"@swc/core-linux-arm-gnueabihf@1.15.1": + version "1.15.1" + resolved "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.15.1.tgz#0bcb201e5acf9966c72739bcbd3934a43e12bfd9" + integrity sha512-yS2FHA8E4YeiPG9YeYk/6mKiCWuXR5RdYlCmtlGzKcjWbI4GXUVe7+p9C0M6myRt3zdj3M1knmJxk52MQA9EZQ== + +"@swc/core-linux-arm64-gnu@1.15.1": + version "1.15.1" + resolved "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.15.1.tgz#cf10e46b5a4c66d6f4efcb3f640ad4d6f62460c2" + integrity sha512-IFrjDu7+5Y61jLsUqBVXlXutDoPBX10eEeNTjW6C1yzm+cSTE7ayiKXMIFri4gEZ4VpXS6MUgkwjxtDpIXTh+w== + +"@swc/core-linux-arm64-musl@1.15.1": + version "1.15.1" + resolved "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.15.1.tgz#7d4688f7f9f2aa7196b8d7e1661ebdd206bbd758" + integrity sha512-fKzP9mRQGbhc5QhJPIsqKNNX/jyWrZgBxmo3Nz1SPaepfCUc7RFmtcJQI5q8xAun3XabXjh90wqcY/OVyg2+Kg== + +"@swc/core-linux-x64-gnu@1.15.1": + version "1.15.1" + resolved "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.15.1.tgz#028fdb1e419d6bc1d422fb27e95928d0b9d7b782" + integrity sha512-ZLjMi138uTJxb+1wzo4cB8mIbJbAsSLWRNeHc1g1pMvkERPWOGlem+LEYkkzaFzCNv1J8aKcL653Vtw8INHQeg== + +"@swc/core-linux-x64-musl@1.15.1": + version "1.15.1" + resolved "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.15.1.tgz#7d9e481293dd2542a0479d7ae4929f6f57c7ed2a" + integrity sha512-jvSI1IdsIYey5kOITzyajjofXOOySVitmLxb45OPUjoNojql4sDojvlW5zoHXXFePdA6qAX4Y6KbzAOV3T3ctA== + +"@swc/core-win32-arm64-msvc@1.15.1": + version "1.15.1" + resolved "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.15.1.tgz#5b17333f912942c22e4e619e2cc9450649f402f2" + integrity sha512-X/FcDtNrDdY9r4FcXHt9QxUqC/2FbQdvZobCKHlHe8vTSKhUHOilWl5EBtkFVfsEs4D5/yAri9e3bJbwyBhhBw== + +"@swc/core-win32-ia32-msvc@1.15.1": + version "1.15.1" + resolved "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.15.1.tgz#d8eaa08300093ffef28f5f33c0f72d9e30ba8bfb" + integrity sha512-vfheiWBux8PpC87oy1cshcqzgH7alWYpnVq5jWe7xuVkjqjGGDbBUKuS84eJCdsWcVaB5EXIWLKt+11W3/BOwA== + +"@swc/core-win32-x64-msvc@1.15.1": + version "1.15.1" + resolved "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.15.1.tgz#ae48e151b5230abc3015af4063c8f7a7a79b5f48" + integrity sha512-n3Ppn0LSov/IdlANq+8kxHqENuJRX5XtwQqPgQsgwKIcFq22u17NKfDs9vL5PwRsEHY6Xd67pnOqQX0h4AvbuQ== "@swc/core@^1.15.0": - version "1.15.0" - resolved "https://registry.npmjs.org/@swc/core/-/core-1.15.0.tgz#6ae4dbd5a164261ba799ccdf9eae3bbc61e112c2" - integrity sha512-8SnJV+JV0rYbfSiEiUvYOmf62E7QwsEG+aZueqSlKoxFt0pw333+bgZSQXGUV6etXU88nxur0afVMaINujBMSw== + version "1.15.1" + resolved "https://registry.npmjs.org/@swc/core/-/core-1.15.1.tgz#57eec6c405518875b30062861e6f4a93292b51b5" + integrity sha512-s9GN3M2jA32k+StvuS9uGe4ztf5KVGBdlJMMC6LR6Ah23Lq/CWKVcC3WeQi8qaAcLd+DiddoNCNMUWymLv+wWQ== dependencies: "@swc/counter" "^0.1.3" "@swc/types" "^0.1.25" optionalDependencies: - "@swc/core-darwin-arm64" "1.15.0" - "@swc/core-darwin-x64" "1.15.0" - "@swc/core-linux-arm-gnueabihf" "1.15.0" - "@swc/core-linux-arm64-gnu" "1.15.0" - "@swc/core-linux-arm64-musl" "1.15.0" - "@swc/core-linux-x64-gnu" "1.15.0" - "@swc/core-linux-x64-musl" "1.15.0" - "@swc/core-win32-arm64-msvc" "1.15.0" - "@swc/core-win32-ia32-msvc" "1.15.0" - "@swc/core-win32-x64-msvc" "1.15.0" + "@swc/core-darwin-arm64" "1.15.1" + "@swc/core-darwin-x64" "1.15.1" + "@swc/core-linux-arm-gnueabihf" "1.15.1" + "@swc/core-linux-arm64-gnu" "1.15.1" + "@swc/core-linux-arm64-musl" "1.15.1" + "@swc/core-linux-x64-gnu" "1.15.1" + "@swc/core-linux-x64-musl" "1.15.1" + "@swc/core-win32-arm64-msvc" "1.15.1" + "@swc/core-win32-ia32-msvc" "1.15.1" + "@swc/core-win32-x64-msvc" "1.15.1" "@swc/counter@^0.1.3": version "0.1.3" @@ -1737,7 +1797,7 @@ "@types/mock-fs@^4.13.4": version "4.13.4" - resolved "https://registry.yarnpkg.com/@types/mock-fs/-/mock-fs-4.13.4.tgz#e73edb4b4889d44d23f1ea02d6eebe50aa30b09a" + resolved "https://registry.npmjs.org/@types/mock-fs/-/mock-fs-4.13.4.tgz#e73edb4b4889d44d23f1ea02d6eebe50aa30b09a" integrity sha512-mXmM0o6lULPI8z3XNnQCpL0BGxPwx1Ul1wXYEPBGl4efShyxW2Rln0JOPEWGyZaYZMM6OVXM/15zUuFMY52ljg== dependencies: "@types/node" "*" @@ -1750,9 +1810,9 @@ undici-types "~6.19.2" "@types/prop-types@*": - version "15.7.15" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.15.tgz#e6e5a86d602beaca71ce5163fadf5f95d70931c7" - integrity sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw== + version "15.7.14" + resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz" + integrity sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ== "@types/react-dom@^18.3.5": version "18.3.5" @@ -1760,9 +1820,9 @@ integrity sha512-P4t6saawp+b/dFrUr2cvkVsfvPguwsxtH6dNIYRllMsefqFzkZk5UIjzyDOv5g1dXIPdG4Sp1yCR4Z6RCUsG/Q== "@types/react@^18.3.18": - version "18.3.26" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.26.tgz#4c5970878d30db3d2a0bca1e4eb5f258e391bbeb" - integrity sha512-RFA/bURkcKzx/X9oumPG9Vp3D3JUgus/d0b67KB0t5S/raciymilkOa66olh78MUI92QLbEJevO7rvqU/kjwKA== + version "18.3.18" + resolved "https://registry.npmjs.org/@types/react/-/react-18.3.18.tgz" + integrity sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ== dependencies: "@types/prop-types" "*" csstype "^3.0.2" @@ -1951,6 +2011,16 @@ ajv@^6.12.4: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +ajv@^8.0.1: + version "8.17.1" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6" + integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== + dependencies: + fast-deep-equal "^3.1.3" + fast-uri "^3.0.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + ansi-escapes@^4.2.1: version "4.3.1" resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz" @@ -2056,6 +2126,11 @@ array-includes@^3.1.6, array-includes@^3.1.8: get-intrinsic "^1.2.4" is-string "^1.0.7" +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + array.prototype.findlast@^1.2.5: version "1.2.5" resolved "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz" @@ -2135,6 +2210,11 @@ ast-types-flow@^0.0.8: resolved "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz" integrity sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ== +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + async@^3.2.3: version "3.2.6" resolved "https://registry.npmjs.org/async/-/async-3.2.6.tgz" @@ -2251,6 +2331,11 @@ balanced-match@^1.0.0: resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +balanced-match@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-2.0.0.tgz#dc70f920d78db8b858535795867bf48f820633d9" + integrity sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA== + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" @@ -2302,6 +2387,17 @@ buffer-from@^1.0.0: resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz" integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== +cacheable@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/cacheable/-/cacheable-2.0.2.tgz#25b71b64068e7e5e6be89231eaa42e0003fcc9c0" + integrity sha512-dWjhLx8RWnPsAWVKwW/wI6OJpQ/hSVb1qS0NUif8TR9vRiSwci7Gey8x04kRU9iAF+Rnbtex5Kjjfg/aB5w8Pg== + dependencies: + "@cacheable/memoize" "^2.0.2" + "@cacheable/memory" "^2.0.2" + "@cacheable/utils" "^2.0.2" + hookified "^1.12.1" + keyv "^5.5.2" + 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.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz" @@ -2485,6 +2581,11 @@ color-name@~1.1.4: resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +colord@^2.9.3: + version "2.9.3" + resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.3.tgz#4f8ce919de456f1d5c1c368c307fe20f3e59fb43" + integrity sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw== + combined-stream@^1.0.8: version "1.0.8" resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" @@ -2534,6 +2635,16 @@ core-js-compat@^3.31.0, core-js-compat@^3.33.1: dependencies: browserslist "^4.22.2" +cosmiconfig@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/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" + create-jest@^29.7.0: version "29.7.0" resolved "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz" @@ -2571,11 +2682,29 @@ cross-spawn@^7.0.3, cross-spawn@^7.0.6: shebang-command "^2.0.0" which "^2.0.1" +css-functions-list@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/css-functions-list/-/css-functions-list-3.2.3.tgz#95652b0c24f0f59b291a9fc386041a19d4f40dbe" + integrity sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA== + +css-tree@^3.0.1, css-tree@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-3.1.0.tgz#7aabc035f4e66b5c86f54570d55e05b1346eb0fd" + integrity sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w== + dependencies: + mdn-data "2.12.2" + source-map-js "^1.0.1" + css.escape@^1.5.1: version "1.5.1" resolved "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz" integrity sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg== +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + cssom@^0.5.0: version "0.5.0" resolved "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz" @@ -2669,6 +2798,13 @@ debug@^3.2.7: dependencies: ms "^2.1.1" +debug@^4.4.1: + version "4.4.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" + integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== + dependencies: + ms "^2.1.3" + decamelize@^1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" @@ -2739,6 +2875,13 @@ diff-sequences@^29.6.3: resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz" integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + doctrine@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz" @@ -2836,6 +2979,11 @@ entities@^4.5.0: resolved "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz" integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== +env-paths@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" + integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== + environment@^1.0.0: version "1.1.0" resolved "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz" @@ -3324,7 +3472,7 @@ fast-diff@^1.1.2: resolved "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz" integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== -fast-glob@^3.3.2, fast-glob@^3.3.3: +fast-glob@^3.2.9, fast-glob@^3.3.2, fast-glob@^3.3.3: version "3.3.3" resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz" integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== @@ -3345,6 +3493,16 @@ fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= +fast-uri@^3.0.1: + version "3.1.0" + resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.1.0.tgz#66eecff6c764c0df9b762e62ca7edcfb53b4edfa" + integrity sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA== + +fastest-levenshtein@^1.0.16: + version "1.0.16" + resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" + integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== + fastq@^1.15.0, fastq@^1.6.0: version "1.18.0" resolved "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz" @@ -3364,6 +3522,13 @@ fflate@^0.8.2: resolved "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz" integrity sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A== +file-entry-cache@^10.1.4: + version "10.1.4" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-10.1.4.tgz#1e81441517dc33ba5fe14421d96dc5fe7e37e820" + integrity sha512-5XRUFc0WTtUbjfGzEwXc42tiGxQHBmtbUG1h9L2apu4SulCGN3Hqm//9D6FAolf8MYNL7f/YlJl9vy08pj5JuA== + dependencies: + flat-cache "^6.1.13" + file-entry-cache@^8.0.0: version "8.0.0" resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz" @@ -3423,7 +3588,16 @@ flat-cache@^4.0.0: flatted "^3.2.9" keyv "^4.5.4" -flatted@^3.2.9: +flat-cache@^6.1.13: + version "6.1.14" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-6.1.14.tgz#1c95d57ae4fce8668e10c90681c163d24b47a29b" + integrity sha512-ExZSCSV9e7v/Zt7RzCbX57lY2dnPdxzU/h3UE6WJ6NtEMfwBd8jmi1n4otDEUfz+T/R+zxrFDpICFdjhD3H/zw== + dependencies: + cacheable "^2.0.1" + flatted "^3.3.3" + hookified "^1.12.0" + +flatted@^3.2.9, flatted@^3.3.3: version "3.3.3" resolved "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz" integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg== @@ -3555,6 +3729,22 @@ glob@^7.1.3, glob@^7.1.4: once "^1.3.0" path-is-absolute "^1.0.0" +global-modules@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" + integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== + dependencies: + global-prefix "^3.0.0" + +global-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" + integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== + dependencies: + ini "^1.3.5" + kind-of "^6.0.2" + which "^1.3.1" + globals@^11.1.0: version "11.12.0" resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" @@ -3578,6 +3768,23 @@ globalthis@^1.0.4: define-properties "^1.2.1" gopd "^1.0.1" +globby@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +globjoin@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/globjoin/-/globjoin-0.1.4.tgz#2f4494ac8919e3767c5cbb691e9f463324285d43" + integrity sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg== + gopd@^1.0.1, gopd@^1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz" @@ -3646,6 +3853,11 @@ highlight.js@^10.7.1: resolved "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz" integrity sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A== +hookified@^1.12.0, hookified@^1.12.1: + version "1.12.1" + resolved "https://registry.yarnpkg.com/hookified/-/hookified-1.12.1.tgz#b0de0116ca346fd6c4e55db901f52d5cd728ef00" + integrity sha512-xnKGl+iMIlhrZmGHB729MqlmPoWBznctSQTYCpFKqNsCgimJQmithcW0xSQMMFzYnV2iKUh25alswn6epgxS0Q== + html-encoding-sniffer@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz" @@ -3658,6 +3870,11 @@ html-escaper@^2.0.0: resolved "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== +html-tags@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.3.1.tgz#a04026a18c882e4bba8a01a3d39cfe465d40b5ce" + integrity sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ== + http-proxy-agent@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz" @@ -3692,9 +3909,9 @@ ignore@^5.1.8, ignore@^5.2.0: resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz" integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== -ignore@^7.0.0: +ignore@^7.0.0, ignore@^7.0.5: version "7.0.5" - resolved "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-7.0.5.tgz#4cb5f6cd7d4c7ab0365738c7aea888baa6d7efd9" integrity sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg== import-fresh@^3.2.1: @@ -3705,6 +3922,14 @@ import-fresh@^3.2.1: parent-module "^1.0.0" resolve-from "^4.0.0" +import-fresh@^3.3.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.1.tgz#9cecb56503c0ada1f2741dbbd6546e4b13b57ccf" + integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + import-local@^3.0.2: version "3.0.2" resolved "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz" @@ -3736,6 +3961,11 @@ inherits@2: resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== +ini@^1.3.5: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + internal-slot@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz" @@ -3874,6 +4104,11 @@ is-object@^1.0.1: resolved "https://registry.npmjs.org/is-object/-/is-object-1.0.2.tgz" integrity sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA== +is-plain-object@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" + integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== + is-potential-custom-element-name@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz" @@ -4526,6 +4761,11 @@ json-schema-traverse@^0.4.1: resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" @@ -4560,6 +4800,18 @@ keyv@^4.5.4: dependencies: json-buffer "3.0.1" +keyv@^5.5.2: + version "5.5.2" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-5.5.2.tgz#942348b882e08a27429688897eec4f735f75a978" + integrity sha512-TXcFHbmm/z7MGd1u9ASiCSfTS+ei6Z8B3a5JHzx3oPa/o7QzWVtPRpc4KGER5RR469IC+/nfg4U5YLIuDUua2g== + dependencies: + "@keyv/serialize" "^1.1.1" + +kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + kleur@^3.0.3: version "3.0.3" resolved "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz" @@ -4587,6 +4839,16 @@ knip@^5.46.0: zod "^3.22.4" zod-validation-error "^3.0.3" +known-css-properties@^0.36.0: + version "0.36.0" + resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.36.0.tgz#5c4365f3c9549ca2e813d2e729e6c47ef6a6cb60" + integrity sha512-A+9jP+IUmuQsNdsLdcg6Yt7voiMF/D4K83ew0OpJtpu+l34ef7LaohWV0Rc6KNvzw6ZDizkqfyB5JznZnzuKQA== + +known-css-properties@^0.37.0: + version "0.37.0" + resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.37.0.tgz#10ebe49b9dbb6638860ff8a002fb65a053f4aec5" + integrity sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ== + language-subtag-registry@^0.3.20: version "0.3.22" resolved "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz" @@ -4670,6 +4932,11 @@ lodash.merge@^4.6.2: resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== +lodash.truncate@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" + integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== + lodash@^4.17.21, lodash@^4.17.4: version "4.17.21" resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" @@ -4751,12 +5018,32 @@ math-intrinsics@^1.1.0: resolved "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz" integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== +mathml-tag-names@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz#4ddadd67308e780cf16a47685878ee27b736a0a3" + integrity sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg== + +mdn-data@2.12.2: + version "2.12.2" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.12.2.tgz#9ae6c41a9e65adf61318b32bff7b64fbfb13f8cf" + integrity sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA== + +mdn-data@^2.21.0: + version "2.24.0" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.24.0.tgz#e51beee564113d8fa1b0813260d9cc920f11885a" + integrity sha512-i97fklrJl03tL1tdRVw0ZfLLvuDsdb6wxL+TrJ+PKkCbLrp2PCu2+OYdCKychIUm19nSM/35S6qz7pJpnXttoA== + +meow@^13.2.0: + version "13.2.0" + resolved "https://registry.yarnpkg.com/meow/-/meow-13.2.0.tgz#6b7d63f913f984063b3cc261b6e8800c4cd3474f" + integrity sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA== + merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== -merge2@^1.3.0: +merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== @@ -4819,7 +5106,7 @@ minimist@^1.2.0, minimist@^1.2.6, minimist@^1.2.8: mock-fs@^5.5.0: version "5.5.0" - resolved "https://registry.yarnpkg.com/mock-fs/-/mock-fs-5.5.0.tgz#94a46d299aaa588e735a201cbe823c876e91f385" + resolved "https://registry.npmjs.org/mock-fs/-/mock-fs-5.5.0.tgz#94a46d299aaa588e735a201cbe823c876e91f385" integrity sha512-d/P1M/RacgM3dB0sJ8rjeRNXxtapkPCUnMGmIN0ixJ16F/E4GUZCvWcSGfWGz8eaXYvn1s9baUwNjI4LOPEjiA== mri@^1.1.0: @@ -4841,6 +5128,11 @@ mz@^2.4.0: object-assign "^4.0.1" thenify-all "^1.0.0" +nanoid@^3.3.11: + version "3.3.11" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b" + integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" @@ -5170,6 +5462,11 @@ path-parse@^1.0.7: resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + pause-stream@0.0.11: version "0.0.11" resolved "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz" @@ -5209,6 +5506,48 @@ possible-typed-array-names@^1.0.0: resolved "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz" integrity sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg== +postcss-media-query-parser@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz#27b39c6f4d94f81b1a73b8f76351c609e5cef244" + integrity sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig== + +postcss-resolve-nested-selector@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.6.tgz#3d84dec809f34de020372c41b039956966896686" + integrity sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw== + +postcss-safe-parser@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/postcss-safe-parser/-/postcss-safe-parser-7.0.1.tgz#36e4f7e608111a0ca940fd9712ce034718c40ec0" + integrity sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A== + +postcss-scss@^4.0.9: + version "4.0.9" + resolved "https://registry.yarnpkg.com/postcss-scss/-/postcss-scss-4.0.9.tgz#a03c773cd4c9623cb04ce142a52afcec74806685" + integrity sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A== + +postcss-selector-parser@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz#4d6af97eba65d73bc4d84bcb343e865d7dd16262" + integrity sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-value-parser@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== + +postcss@^8.5.6: + version "8.5.6" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.6.tgz#2825006615a619b4f62a9e7426cc120b349a8f3c" + integrity sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg== + dependencies: + nanoid "^3.3.11" + picocolors "^1.1.1" + source-map-js "^1.2.1" + prefix-matches@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/prefix-matches/-/prefix-matches-1.0.1.tgz" @@ -5463,6 +5802,11 @@ require-directory@^2.1.1: resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + require-main-filename@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz" @@ -5684,6 +6028,11 @@ signal-exit@^3.0.3, signal-exit@^3.0.7: resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== +signal-exit@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + sisteransi@^1.0.4: version "1.0.5" resolved "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz" @@ -5701,11 +6050,25 @@ slash@^3.0.0: resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + smol-toml@^1.3.1: version "1.3.1" resolved "https://registry.npmjs.org/smol-toml/-/smol-toml-1.3.1.tgz" integrity sha512-tEYNll18pPKHroYSmLLrksq233j021G0giwW7P3D24jC54pQ5W5BXMsQ/Mvw1OJCmEYDgY+lrzT+3nNUtoNfXQ== +source-map-js@^1.0.1, source-map-js@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" + integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== + source-map-support@0.5.13: version "0.5.13" resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz" @@ -5903,6 +6266,93 @@ strip-json-comments@^3.1.1: resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== +stylelint-config-recommended-scss@^14.0.0: + version "14.1.0" + resolved "https://registry.yarnpkg.com/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-14.1.0.tgz#1a5855655cddcb5f77c10f38c76567adf2bb9aa3" + integrity sha512-bhaMhh1u5dQqSsf6ri2GVWWQW5iUjBYgcHkh7SgDDn92ijoItC/cfO/W+fpXshgTQWhwFkP1rVcewcv4jaftRg== + dependencies: + postcss-scss "^4.0.9" + stylelint-config-recommended "^14.0.1" + stylelint-scss "^6.4.0" + +stylelint-config-recommended@^14.0.1: + version "14.0.1" + resolved "https://registry.yarnpkg.com/stylelint-config-recommended/-/stylelint-config-recommended-14.0.1.tgz#d25e86409aaf79ee6c6085c2c14b33c7e23c90c6" + integrity sha512-bLvc1WOz/14aPImu/cufKAZYfXs/A/owZfSMZ4N+16WGXLoX5lOir53M6odBxvhgmgdxCVnNySJmZKx73T93cg== + +stylelint-config-standard-scss@^13.1.0: + version "13.1.0" + resolved "https://registry.yarnpkg.com/stylelint-config-standard-scss/-/stylelint-config-standard-scss-13.1.0.tgz#2be36ca13087325a42c1f26df8267808667cc886" + integrity sha512-Eo5w7/XvwGHWkeGLtdm2FZLOMYoZl1omP2/jgFCXyl2x5yNz7/8vv4Tj6slHvMSSUNTaGoam/GAZ0ZhukvalfA== + dependencies: + stylelint-config-recommended-scss "^14.0.0" + stylelint-config-standard "^36.0.0" + +stylelint-config-standard@^36.0.0: + version "36.0.1" + resolved "https://registry.yarnpkg.com/stylelint-config-standard/-/stylelint-config-standard-36.0.1.tgz#727cbb2a1ef3e210f5ce8329cde531129f156609" + integrity sha512-8aX8mTzJ6cuO8mmD5yon61CWuIM4UD8Q5aBcWKGSf6kg+EC3uhB+iOywpTK4ca6ZL7B49en8yanOFtUW0qNzyw== + dependencies: + stylelint-config-recommended "^14.0.1" + +stylelint-scss@^6.4.0: + version "6.12.1" + resolved "https://registry.yarnpkg.com/stylelint-scss/-/stylelint-scss-6.12.1.tgz#7de9980a7c9acb7a3f203498e7296526cb52ffa0" + integrity sha512-UJUfBFIvXfly8WKIgmqfmkGKPilKB4L5j38JfsDd+OCg2GBdU0vGUV08Uw82tsRZzd4TbsUURVVNGeOhJVF7pA== + dependencies: + css-tree "^3.0.1" + is-plain-object "^5.0.0" + known-css-properties "^0.36.0" + mdn-data "^2.21.0" + postcss-media-query-parser "^0.2.3" + postcss-resolve-nested-selector "^0.1.6" + postcss-selector-parser "^7.1.0" + postcss-value-parser "^4.2.0" + +stylelint@^16.14.0: + version "16.24.0" + resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-16.24.0.tgz#a436920636732b496a55665997f2804d1d63b5b6" + integrity sha512-7ksgz3zJaSbTUGr/ujMXvLVKdDhLbGl3R/3arNudH7z88+XZZGNLMTepsY28WlnvEFcuOmUe7fg40Q3lfhOfSQ== + dependencies: + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/media-query-list-parser" "^4.0.3" + "@csstools/selector-specificity" "^5.0.0" + "@dual-bundle/import-meta-resolve" "^4.1.0" + balanced-match "^2.0.0" + colord "^2.9.3" + cosmiconfig "^9.0.0" + css-functions-list "^3.2.3" + css-tree "^3.1.0" + debug "^4.4.1" + fast-glob "^3.3.3" + fastest-levenshtein "^1.0.16" + file-entry-cache "^10.1.4" + global-modules "^2.0.0" + globby "^11.1.0" + globjoin "^0.1.4" + html-tags "^3.3.1" + ignore "^7.0.5" + imurmurhash "^0.1.4" + is-plain-object "^5.0.0" + known-css-properties "^0.37.0" + mathml-tag-names "^2.1.3" + meow "^13.2.0" + micromatch "^4.0.8" + normalize-path "^3.0.0" + picocolors "^1.1.1" + postcss "^8.5.6" + postcss-resolve-nested-selector "^0.1.6" + postcss-safe-parser "^7.0.1" + postcss-selector-parser "^7.1.0" + postcss-value-parser "^4.2.0" + resolve-from "^5.0.0" + string-width "^4.2.3" + supports-hyperlinks "^3.2.0" + svg-tags "^1.0.0" + table "^6.9.0" + write-file-atomic "^5.0.1" + summary@2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/summary/-/summary-2.1.0.tgz" @@ -5929,7 +6379,7 @@ supports-color@^8.0.0: dependencies: has-flag "^4.0.0" -supports-hyperlinks@^3.1.0: +supports-hyperlinks@^3.1.0, supports-hyperlinks@^3.2.0: version "3.2.0" resolved "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.2.0.tgz" integrity sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig== @@ -5942,6 +6392,11 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== +svg-tags@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/svg-tags/-/svg-tags-1.0.0.tgz#58f71cee3bd519b59d4b2a843b6c7de64ac04764" + integrity sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA== + swc-loader@^0.2.6: version "0.2.6" resolved "https://registry.npmjs.org/swc-loader/-/swc-loader-0.2.6.tgz#bf0cba8eeff34bb19620ead81d1277fefaec6bc8" @@ -5962,6 +6417,17 @@ synckit@^0.9.1: "@pkgr/core" "^0.1.0" tslib "^2.6.2" +table@^6.9.0: + version "6.9.0" + resolved "https://registry.yarnpkg.com/table/-/table-6.9.0.tgz#50040afa6264141c7566b3b81d4d82c47a8668f5" + integrity sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A== + dependencies: + ajv "^8.0.1" + lodash.truncate "^4.4.2" + slice-ansi "^4.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" + tapable@^2.2.0: version "2.2.1" resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz" @@ -6230,6 +6696,11 @@ url-parse@^1.5.3: querystringify "^2.1.1" requires-port "^1.0.0" +util-deprecate@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + v8-to-istanbul@^9.0.1: version "9.0.1" resolved "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz" @@ -6374,6 +6845,13 @@ which-typed-array@^1.1.16, which-typed-array@^1.1.18: gopd "^1.2.0" has-tostringtag "^1.0.2" +which@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + which@^2.0.1: version "2.0.2" resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" @@ -6417,6 +6895,14 @@ write-file-atomic@^4.0.2: imurmurhash "^0.1.4" signal-exit "^3.0.7" +write-file-atomic@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-5.0.1.tgz#68df4717c55c6fa4281a7860b4c2ba0a6d2b11e7" + integrity sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw== + dependencies: + imurmurhash "^0.1.4" + signal-exit "^4.0.1" + ws@^8.11.0, ws@^8.13.0: version "8.18.0" resolved "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz"