diff --git a/Gemfile b/Gemfile index ac5cbf1f..c20c3f20 100644 --- a/Gemfile +++ b/Gemfile @@ -6,7 +6,7 @@ git_source(:github) { |repo| "https://github.com/#{repo}.git" } ruby "3.4.6" gem "react_on_rails", "16.1.1" -gem "shakapacker", "9.0.0.beta.8" +gem "shakapacker", "9.1.0" # Bundle edge Rails instead: gem "rails", github: "rails/rails" gem "listen" diff --git a/Gemfile.lock b/Gemfile.lock index bf1ddead..1eacd99a 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -383,7 +383,7 @@ GEM websocket (~> 1.0) semantic_range (3.1.0) sexp_processor (4.17.1) - shakapacker (9.0.0.beta.8) + shakapacker (9.1.0) activesupport (>= 5.2) package_json rack-proxy (>= 0.6.1) @@ -493,7 +493,7 @@ DEPENDENCIES scss_lint sdoc selenium-webdriver (~> 4) - shakapacker (= 9.0.0.beta.8) + shakapacker (= 9.1.0) spring spring-commands-rspec stimulus-rails (~> 1.3) @@ -502,7 +502,7 @@ DEPENDENCIES web-console RUBY VERSION - ruby 3.4.6p54 + ruby 3.4.6p32 BUNDLED WITH 2.4.17 diff --git a/README.md b/README.md index ba825675..53f88ee3 100644 --- a/README.md +++ b/README.md @@ -165,10 +165,46 @@ See package.json and Gemfile for versions + **Testing Mode**: When running tests, it is useful to run `foreman start -f Procfile.spec` in order to have webpack automatically recompile the static bundles. Rspec is configured to automatically check whether or not this process is running. If it is not, it will automatically rebuild the webpack bundle to ensure you are not running tests on stale client code. This is achieved via the `ReactOnRails::TestHelper.configure_rspec_to_compile_assets(config)` line in the `rails_helper.rb` file. If you are using this project as an example and are not using RSpec, you may want to implement similar logic in your own project. -## Webpack +## Webpack and Rspack -_Converted to use Shakapacker webpack configuration_. +_Converted to use Shakapacker with support for both Webpack and Rspack bundlers_. +This project supports both Webpack and Rspack as JavaScript bundlers via [Shakapacker](https://github.com/shakacode/shakapacker). Switch between them by changing the `assets_bundler` setting in `config/shakapacker.yml`: + +```yaml +# Use Rspack (default - faster builds) +assets_bundler: rspack + +# Or use Webpack (classic, stable) +assets_bundler: webpack +``` + +### Performance Comparison + +Measured bundler compile times for this project (client + server bundles): + +| Build Type | Webpack | Rspack | Improvement | +|------------|---------|--------|-------------| +| Development | ~3.1s | ~1.0s | **~3x faster** | +| Production (cold) | ~22s | ~10.7s | **~2x faster** | + +**Benefits of Rspack:** +- 67% faster development builds (saves ~2.1s per incremental build) +- 51% faster production builds (saves ~11s on cold builds) +- Faster incremental rebuilds during development +- Reduced CI build times +- Drop-in replacement - same configuration files work for both bundlers + +_Note: These are actual bundler compile times. Total build times including package manager overhead may vary._ + +### Configuration Files + +All bundler configuration is in `config/webpack/`: +- `webpack.config.js` - Main entry point (auto-detects Webpack or Rspack) +- `commonWebpackConfig.js` - Shared configuration +- `clientWebpackConfig.js` - Client bundle settings +- `serverWebpackConfig.js` - Server-side rendering bundle +- `development.js`, `production.js`, `test.js` - Environment-specific settings ### Additional Resources - [Webpack Docs](https://webpack.js.org/) diff --git a/bin/shakapacker b/bin/shakapacker index 13a008dc..3ab4930e 100755 --- a/bin/shakapacker +++ b/bin/shakapacker @@ -2,12 +2,10 @@ ENV["RAILS_ENV"] ||= "development" ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile", __FILE__) +ENV["APP_ROOT"] ||= File.expand_path("..", __dir__) require "bundler/setup" require "shakapacker" -require "shakapacker/webpack_runner" +require "shakapacker/runner" -APP_ROOT = File.expand_path("..", __dir__) -Dir.chdir(APP_ROOT) do - Shakapacker::WebpackRunner.run(ARGV) -end +Shakapacker::Runner.run(ARGV) diff --git a/client/__tests__/webpack/bundlerUtils.spec.js b/client/__tests__/webpack/bundlerUtils.spec.js new file mode 100644 index 00000000..222d7b72 --- /dev/null +++ b/client/__tests__/webpack/bundlerUtils.spec.js @@ -0,0 +1,141 @@ +/** + * Unit tests for bundlerUtils.js + * Tests bundler auto-detection and helper functions + * + * Note: These tests verify the bundler selection logic without actually + * loading Rspack (which requires Node.js globals not available in jsdom). + */ + +// Mock the bundler packages to avoid loading them +jest.mock('webpack', () => ({ + ProvidePlugin: class MockProvidePlugin {}, + optimize: { LimitChunkCountPlugin: class MockLimitChunkCount {} }, +})); + +jest.mock('@rspack/core', () => ({ + ProvidePlugin: class MockRspackProvidePlugin {}, + CssExtractRspackPlugin: class MockCssExtractRspackPlugin {}, + optimize: { LimitChunkCountPlugin: class MockRspackLimitChunkCount {} }, +})); + +jest.mock('mini-css-extract-plugin', () => class MiniCssExtractPlugin {}); + +describe('bundlerUtils', () => { + let mockConfig; + + beforeEach(() => { + // Reset module cache + jest.resetModules(); + + // Create fresh mock config + mockConfig = { assets_bundler: 'webpack' }; + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + describe('getBundler()', () => { + it('returns webpack when assets_bundler is webpack', () => { + mockConfig.assets_bundler = 'webpack'; + jest.doMock('shakapacker', () => ({ config: mockConfig })); + const utils = require('../../../config/webpack/bundlerUtils'); + + const bundler = utils.getBundler(); + + expect(bundler).toBeDefined(); + expect(bundler.ProvidePlugin).toBeDefined(); + expect(bundler.ProvidePlugin.name).toBe('MockProvidePlugin'); + }); + + it('returns rspack when assets_bundler is rspack', () => { + mockConfig.assets_bundler = 'rspack'; + jest.doMock('shakapacker', () => ({ config: mockConfig })); + const utils = require('../../../config/webpack/bundlerUtils'); + + const bundler = utils.getBundler(); + + expect(bundler).toBeDefined(); + // Rspack has CssExtractRspackPlugin + expect(bundler.CssExtractRspackPlugin).toBeDefined(); + expect(bundler.CssExtractRspackPlugin.name).toBe('MockCssExtractRspackPlugin'); + }); + }); + + describe('isRspack()', () => { + it('returns false when assets_bundler is webpack', () => { + mockConfig.assets_bundler = 'webpack'; + jest.doMock('shakapacker', () => ({ config: mockConfig })); + const utils = require('../../../config/webpack/bundlerUtils'); + + expect(utils.isRspack()).toBe(false); + }); + + it('returns true when assets_bundler is rspack', () => { + mockConfig.assets_bundler = 'rspack'; + jest.doMock('shakapacker', () => ({ config: mockConfig })); + const utils = require('../../../config/webpack/bundlerUtils'); + + expect(utils.isRspack()).toBe(true); + }); + }); + + describe('getCssExtractPlugin()', () => { + it('returns mini-css-extract-plugin when using webpack', () => { + mockConfig.assets_bundler = 'webpack'; + jest.doMock('shakapacker', () => ({ config: mockConfig })); + const utils = require('../../../config/webpack/bundlerUtils'); + + const plugin = utils.getCssExtractPlugin(); + + expect(plugin).toBeDefined(); + expect(plugin.name).toBe('MiniCssExtractPlugin'); + }); + + it('returns CssExtractRspackPlugin when using rspack', () => { + mockConfig.assets_bundler = 'rspack'; + jest.doMock('shakapacker', () => ({ config: mockConfig })); + const utils = require('../../../config/webpack/bundlerUtils'); + + const plugin = utils.getCssExtractPlugin(); + + expect(plugin).toBeDefined(); + // Rspack plugin class name + expect(plugin.name).toBe('MockCssExtractRspackPlugin'); + }); + }); + + describe('Edge cases and error handling', () => { + it('defaults to webpack when assets_bundler is undefined', () => { + mockConfig.assets_bundler = undefined; + jest.doMock('shakapacker', () => ({ config: mockConfig })); + const utils = require('../../../config/webpack/bundlerUtils'); + + const bundler = utils.getBundler(); + + expect(bundler).toBeDefined(); + expect(bundler.ProvidePlugin.name).toBe('MockProvidePlugin'); + }); + + it('throws error for invalid bundler type', () => { + mockConfig.assets_bundler = 'invalid-bundler'; + jest.doMock('shakapacker', () => ({ config: mockConfig })); + const utils = require('../../../config/webpack/bundlerUtils'); + + expect(() => utils.getBundler()).toThrow('Invalid assets_bundler: "invalid-bundler"'); + expect(() => utils.getBundler()).toThrow('Must be one of: webpack, rspack'); + }); + + it('returns cached bundler on subsequent calls', () => { + mockConfig.assets_bundler = 'webpack'; + jest.doMock('shakapacker', () => ({ config: mockConfig })); + const utils = require('../../../config/webpack/bundlerUtils'); + + const bundler1 = utils.getBundler(); + const bundler2 = utils.getBundler(); + + // Should return same instance (memoized) + expect(bundler1).toBe(bundler2); + }); + }); +}); diff --git a/config/shakapacker.yml b/config/shakapacker.yml index e47c4412..6f201a6f 100644 --- a/config/shakapacker.yml +++ b/config/shakapacker.yml @@ -9,6 +9,7 @@ default: &default webpack_compile_output: true nested_entries: true javascript_transpiler: swc + assets_bundler: rspack # Additional paths webpack should lookup modules # ['app/assets', 'engine/foo/app/assets'] diff --git a/config/swc.config.js b/config/swc.config.js index ce4d4dac..e76be6a3 100644 --- a/config/swc.config.js +++ b/config/swc.config.js @@ -10,8 +10,12 @@ const customConfig = { loose: false, transform: { react: { - // Use automatic runtime (React 17+) - no need to import React - runtime: 'automatic', + // Use classic runtime for SSR compatibility with React on Rails + // This ensures React is explicitly imported in each component file, which + // provides better compatibility with server-side rendering in Rails. + // Classic runtime is more explicit and works reliably across all React versions. + // TODO: Consider switching to 'automatic' runtime when fully on React 19+ + runtime: 'classic', // Enable React Fast Refresh in development refresh: env.isDevelopment && env.runningWebpackDevServer, }, diff --git a/config/webpack/bundlerUtils.js b/config/webpack/bundlerUtils.js new file mode 100644 index 00000000..e659e03e --- /dev/null +++ b/config/webpack/bundlerUtils.js @@ -0,0 +1,74 @@ +/** + * Bundler utilities for automatic Webpack/Rspack detection. + * + * Shakapacker 9.1+ supports both Webpack and Rspack as bundlers. + * The bundler is selected via config/shakapacker.yml: + * assets_bundler: webpack # or 'rspack' + */ + +const { config } = require('shakapacker'); + +const VALID_BUNDLERS = ['webpack', 'rspack']; + +// Cache for bundler module (config is read at startup and cannot change without restart) +let _cachedBundler = null; +let _cachedBundlerType = null; + +/** + * Gets the appropriate bundler module based on shakapacker.yml configuration. + * + * Note: The bundler configuration is read from shakapacker.yml at startup. + * Changing the config requires restarting the Node process. This function + * memoizes the result for performance. + * + * @returns {Object} Either webpack or @rspack/core module + * @throws {Error} If assets_bundler is not 'webpack' or 'rspack' + */ +const getBundler = () => { + // Return cached bundler if config hasn't changed + if (_cachedBundler && _cachedBundlerType === config.assets_bundler) { + return _cachedBundler; + } + + // Validate bundler configuration + const bundlerType = config.assets_bundler || 'webpack'; // Default to webpack + if (!VALID_BUNDLERS.includes(bundlerType)) { + throw new Error( + `Invalid assets_bundler: "${bundlerType}". ` + + `Must be one of: ${VALID_BUNDLERS.join(', ')}. ` + + `Check config/shakapacker.yml`, + ); + } + + // Load and cache the bundler module + _cachedBundlerType = bundlerType; + _cachedBundler = bundlerType === 'rspack' + ? require('@rspack/core') + : require('webpack'); + + return _cachedBundler; +}; + +/** + * Checks if the current bundler is Rspack. + * + * @returns {boolean} True if using Rspack, false if using Webpack + */ +const isRspack = () => config.assets_bundler === 'rspack'; + +/** + * Gets the appropriate CSS extraction plugin for the current bundler. + * + * @returns {Object} Either mini-css-extract-plugin (Webpack) or CssExtractRspackPlugin (Rspack) + */ +const getCssExtractPlugin = () => { + return isRspack() + ? getBundler().CssExtractRspackPlugin + : require('mini-css-extract-plugin'); +}; + +module.exports = { + getBundler, + isRspack, + getCssExtractPlugin, +}; diff --git a/config/webpack/client.js b/config/webpack/client.js index 9ddf84c9..0ba4e5db 100644 --- a/config/webpack/client.js +++ b/config/webpack/client.js @@ -1,16 +1,21 @@ const devBuild = process.env.NODE_ENV === 'development'; const isHMR = process.env.WEBPACK_DEV_SERVER === 'TRUE'; const ReactRefreshWebpackPlugin = require('@pmmmwh/react-refresh-webpack-plugin'); -const webpack = require('webpack'); +const { config } = require('shakapacker'); const environment = require('./environment'); +// Auto-detect bundler from shakapacker config and load the appropriate library +const bundler = config.assets_bundler === 'rspack' + ? require('@rspack/core') + : require('webpack'); + if (devBuild && !isHMR) { environment.loaders.get('sass').use.find((item) => item.loader === 'sass-loader').options.sourceMap = false; } environment.plugins.append( 'Provide', - new webpack.ProvidePlugin({ + new bundler.ProvidePlugin({ $: 'jquery', jQuery: 'jquery', jquery: 'jquery', diff --git a/config/webpack/clientWebpackConfig.js b/config/webpack/clientWebpackConfig.js index d1e29def..6352208f 100644 --- a/config/webpack/clientWebpackConfig.js +++ b/config/webpack/clientWebpackConfig.js @@ -1,14 +1,15 @@ // The source code including full typescript support is available at: // https://github.com/shakacode/react_on_rails_tutorial_with_ssr_and_hmr_fast_refresh/blob/master/config/webpack/clientWebpackConfig.js -const webpack = require('webpack'); const commonWebpackConfig = require('./commonWebpackConfig'); +const { getBundler } = require('./bundlerUtils'); const configureClient = () => { + const bundler = getBundler(); const clientConfig = commonWebpackConfig(); clientConfig.plugins.push( - new webpack.ProvidePlugin({ + new bundler.ProvidePlugin({ $: 'jquery', jQuery: 'jquery', ActionCable: '@rails/actioncable', diff --git a/config/webpack/commonWebpackConfig.js b/config/webpack/commonWebpackConfig.js index 9f18dc83..1034f5dc 100644 --- a/config/webpack/commonWebpackConfig.js +++ b/config/webpack/commonWebpackConfig.js @@ -4,14 +4,14 @@ // Common configuration applying to client and server configuration const { generateWebpackConfig, merge } = require('shakapacker'); -const baseClientWebpackConfig = generateWebpackConfig(); const commonOptions = { resolve: { - extensions: ['.css', '.ts', '.tsx'], + // Add .bs.js extension for ReScript-compiled modules + extensions: ['.css', '.ts', '.tsx', '.bs.js'], }, }; -// add sass resource loader +// Sass resource loader config - globally imports app variables const sassLoaderConfig = { loader: 'sass-resources-loader', options: { @@ -20,56 +20,87 @@ const sassLoaderConfig = { }; const ignoreWarningsConfig = { + // React 19 uses react-dom/client but not all deps have migrated yet ignoreWarnings: [/Module not found: Error: Can't resolve 'react-dom\/client'/], }; -const scssConfigIndex = baseClientWebpackConfig.module.rules.findIndex((config) => - '.scss'.match(config.test) && config.use, -); +/** + * Generates the common webpack/rspack configuration used by both client and server bundles. + * + * IMPORTANT: This function calls generateWebpackConfig() fresh on each invocation, so mutations + * to the returned config are safe and won't affect other builds. The config is regenerated + * for each build (client, server, etc.). + * + * Key customizations: + * - CSS Modules: Configured for default exports (namedExport: false) for backward compatibility + * - Sass: Configured with modern API and global variable imports + * - ReScript: Added .bs.js to resolve extensions + * + * @returns {Object} Webpack/Rspack configuration object (auto-detected based on shakapacker.yml) + */ +const commonWebpackConfig = () => { + // Generate fresh config - safe to mutate since it's a new object each time + const baseWebpackConfig = generateWebpackConfig(); -if (scssConfigIndex === -1) { - console.warn('No SCSS rule with use array found in webpack config'); -} else { - // Configure sass-loader to use the modern API - const scssRule = baseClientWebpackConfig.module.rules[scssConfigIndex]; - const sassLoaderIndex = scssRule.use.findIndex((loader) => { - if (typeof loader === 'string') { - return loader.includes('sass-loader'); + // Fix CSS Modules to use default exports for backward compatibility + // Shakapacker 9 changed default to namedExport: true, breaking existing imports like: + // import css from './file.module.scss' + // This ensures css is an object with properties, not undefined + baseWebpackConfig.module.rules.forEach((rule) => { + if (rule.use && Array.isArray(rule.use)) { + const cssLoader = rule.use.find((loader) => { + const loaderName = typeof loader === 'string' ? loader : loader?.loader; + return loaderName?.includes('css-loader'); + }); + + if (cssLoader?.options?.modules) { + cssLoader.options.modules.namedExport = false; + cssLoader.options.modules.exportLocalsConvention = 'camelCase'; + } } - return loader.loader && loader.loader.includes('sass-loader'); }); - if (sassLoaderIndex !== -1) { - const sassLoader = scssRule.use[sassLoaderIndex]; - if (typeof sassLoader === 'string') { - scssRule.use[sassLoaderIndex] = { - loader: sassLoader, - options: { - api: 'modern' - } - }; - } else { - sassLoader.options = sassLoader.options || {}; - sassLoader.options.api = 'modern'; - } - } + const scssConfigIndex = baseWebpackConfig.module.rules.findIndex((config) => + '.scss'.match(config.test) && config.use, + ); - // Fix css-loader configuration for CSS modules if namedExport is enabled - // When namedExport is true, exportLocalsConvention must be camelCaseOnly or dashesOnly - const cssLoader = scssRule.use.find((loader) => { - const loaderName = typeof loader === 'string' ? loader : loader?.loader; - return loaderName?.includes('css-loader'); - }); + if (scssConfigIndex === -1) { + console.warn('No SCSS rule with use array found in webpack config'); + // Not throwing error since config might work without SCSS + } else { + // Configure sass-loader to use the modern API + const scssRule = baseWebpackConfig.module.rules[scssConfigIndex]; + const sassLoaderIndex = scssRule.use.findIndex((loader) => { + if (typeof loader === 'string') { + return loader.includes('sass-loader'); + } + return loader.loader && loader.loader.includes('sass-loader'); + }); - if (cssLoader?.options?.modules?.namedExport) { - cssLoader.options.modules.exportLocalsConvention = 'camelCaseOnly'; - } + if (sassLoaderIndex !== -1) { + const sassLoader = scssRule.use[sassLoaderIndex]; + if (typeof sassLoader === 'string') { + scssRule.use[sassLoaderIndex] = { + loader: sassLoader, + options: { + // Use modern API for better performance and to support sass-resources-loader + // The modern API uses the Sass JavaScript API instead of the legacy Node API + api: 'modern' + } + }; + } else { + sassLoader.options = sassLoader.options || {}; + // Use modern API for better performance and to support sass-resources-loader + // The modern API uses the Sass JavaScript API instead of the legacy Node API + sassLoader.options.api = 'modern'; + } + } - baseClientWebpackConfig.module.rules[scssConfigIndex].use.push(sassLoaderConfig); -} + baseWebpackConfig.module.rules[scssConfigIndex].use.push(sassLoaderConfig); + } -// Copy the object using merge b/c the baseClientWebpackConfig and commonOptions are mutable globals -const commonWebpackConfig = () => merge({}, baseClientWebpackConfig, commonOptions, ignoreWarningsConfig); + return merge({}, baseWebpackConfig, commonOptions, ignoreWarningsConfig); +}; module.exports = commonWebpackConfig; diff --git a/config/webpack/server.js b/config/webpack/server.js index aff79fdd..37de00f9 100644 --- a/config/webpack/server.js +++ b/config/webpack/server.js @@ -1,16 +1,20 @@ const merge = require('webpack-merge'); const devBuild = process.env.NODE_ENV === 'production' ? 'production' : 'development'; -const webpack = require('webpack'); - +const { config } = require('shakapacker'); const environment = require('./environment'); +// Auto-detect bundler from shakapacker config and load the appropriate library +const bundler = config.assets_bundler === 'rspack' + ? require('@rspack/core') + : require('webpack'); + // React Server Side Rendering shakapacker config // Builds a Node compatible file that React on Rails can load, never served to the client. environment.plugins.insert( 'DefinePlugin', - new webpack.DefinePlugin({ + new bundler.DefinePlugin({ TRACE_TURBOLINKS: true, 'process.env': { NODE_ENV: devBuild, diff --git a/config/webpack/serverWebpackConfig.js b/config/webpack/serverWebpackConfig.js index a6e9631d..a4e505b5 100644 --- a/config/webpack/serverWebpackConfig.js +++ b/config/webpack/serverWebpackConfig.js @@ -4,10 +4,27 @@ const path = require('path'); const { config } = require('shakapacker'); const commonWebpackConfig = require('./commonWebpackConfig'); - -const webpack = require('webpack'); - +const { getBundler } = require('./bundlerUtils'); + +/** + * Generates the server-side rendering (SSR) bundle configuration. + * + * This creates a separate bundle optimized for server-side rendering: + * - Single chunk (no code splitting for Node.js execution) + * - CSS extraction disabled (uses exportOnlyLocals for class name mapping) + * - No asset hashing (not served directly to clients) + * - Outputs to ssr-generated/ directory + * + * Key differences from client config: + * - Removes CSS extraction loaders (mini-css-extract-plugin/CssExtractRspackPlugin) + * - Preserves CSS Modules configuration but adds exportOnlyLocals: true + * - Disables optimization/minification for faster builds and better debugging + * + * @returns {Object} Webpack/Rspack configuration object for server bundle + */ const configureServer = () => { + const bundler = getBundler(); + // We need to use "merge" because the clientConfigObject, EVEN after running // toWebpackConfig() is a mutable GLOBAL. Thus any changes, like modifying the // entry value will result in changing the client config! @@ -20,8 +37,19 @@ const configureServer = () => { }; if (!serverEntry['server-bundle']) { + const sourcePath = config.source_path || 'client/app'; + const entryPath = config.source_entry_path || 'packs'; + const fullPath = `${sourcePath}/${entryPath}/server-bundle.js`; + throw new Error( - "Create a pack with the file name 'server-bundle.js' containing all the server rendering files", + `Server bundle entry 'server-bundle' not found.\n` + + `Expected file: ${fullPath}\n` + + `Current source_path: ${config.source_path}\n` + + `Current source_entry_path: ${config.source_entry_path}\n` + + `Verify:\n` + + `1. The server-bundle.js file exists at the expected location\n` + + `2. nested_entries is configured correctly in shakapacker.yml\n` + + `3. The file is properly exported from your entry point`, ); } @@ -42,7 +70,7 @@ const configureServer = () => { serverWebpackConfig.optimization = { minimize: false, }; - serverWebpackConfig.plugins.unshift(new webpack.optimize.LimitChunkCountPlugin({ maxChunks: 1 })); + serverWebpackConfig.plugins.unshift(new bundler.optimize.LimitChunkCountPlugin({ maxChunks: 1 })); // Custom output for the server-bundle that matches the config in // config/initializers/react_on_rails.rb @@ -68,13 +96,13 @@ const configureServer = () => { ); // Configure loader rules for SSR - // Remove the mini-css-extract-plugin from the style loaders because + // Remove the mini-css-extract-plugin/CssExtractRspackPlugin from the style loaders because // the client build will handle exporting CSS. // replace file-loader with null-loader const rules = serverWebpackConfig.module.rules; rules.forEach((rule) => { if (Array.isArray(rule.use)) { - // remove the mini-css-extract-plugin and style-loader + // remove the mini-css-extract-plugin/CssExtractRspackPlugin and style-loader rule.use = rule.use.filter((item) => { let testValue; if (typeof item === 'string') { @@ -82,7 +110,7 @@ const configureServer = () => { } else if (typeof item.loader === 'string') { testValue = item.loader; } - return !(testValue.match(/mini-css-extract-plugin/) || testValue === 'style-loader'); + return !(testValue?.match(/mini-css-extract-plugin/) || testValue?.includes('cssExtractLoader') || testValue === 'style-loader'); }); const cssLoader = rule.use.find((item) => { let testValue; @@ -93,10 +121,14 @@ const configureServer = () => { testValue = item.loader; } - return testValue.includes('css-loader'); + return testValue?.includes('css-loader'); }); - if (cssLoader && cssLoader.options) { - cssLoader.options.modules = { exportOnlyLocals: true }; + if (cssLoader && cssLoader.options && cssLoader.options.modules) { + // Preserve existing modules config but add exportOnlyLocals for SSR + cssLoader.options.modules = { + ...cssLoader.options.modules, + exportOnlyLocals: true, + }; } // Skip writing image files during SSR by setting emitFile to false diff --git a/package.json b/package.json index a4440b59..e4ccdd38 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,7 @@ }, "homepage": "https://github.com/shakacode/react-webpack-rails-tutorial", "scripts": { + "postinstall": "patch-package", "res:clean": "rescript clean", "res:format": "rescript format -all", "res:dev": "yarn res:clean && rescript build -w", @@ -91,7 +92,7 @@ "sass": "^1.58.3", "sass-loader": "^13.3.2", "sass-resources-loader": "^2.2.5", - "shakapacker": "9.0.0-beta.8", + "shakapacker": "9.1.0", "stimulus": "^3.0.1", "style-loader": "^3.3.1", "swc-loader": "^0.2.6", @@ -108,6 +109,8 @@ "@babel/eslint-parser": "^7.16.5", "@babel/preset-react": "^7.18.6", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.10", + "@rspack/cli": "^1.5.8", + "@rspack/core": "^1.5.8", "@tailwindcss/typography": "^0.5.10", "@testing-library/dom": "^10.4.1", "@testing-library/jest-dom": "^6.9.1", @@ -131,12 +134,14 @@ "jest": "^29.5.0", "jest-environment-jsdom": "^30.2.0", "mini-css-extract-plugin": "^2.7.2", + "patch-package": "^8.0.0", "preload-webpack-plugin": "^3.0.0-alpha.1", "prettier": "^2.2.1", "prettier-eslint-cli": "^7.1.0", "react-refresh": "^0.14.0", "react-transform-hmr": "^1.0.4", "regenerator-runtime": "^0.13.11", + "rspack-manifest-plugin": "^5.1.0", "typescript": "^5.1.3", "webpack-dev-server": "^4.11.1" }, diff --git a/patches/@glennsl+rescript-json-combinators+1.4.0.patch b/patches/@glennsl+rescript-json-combinators+1.4.0.patch new file mode 100644 index 00000000..b1f01eea --- /dev/null +++ b/patches/@glennsl+rescript-json-combinators+1.4.0.patch @@ -0,0 +1,22 @@ +diff --git a/node_modules/@glennsl/rescript-json-combinators/bsconfig.json b/node_modules/@glennsl/rescript-json-combinators/bsconfig.json +index 9c45da7..70a588d 100644 +--- a/node_modules/@glennsl/rescript-json-combinators/bsconfig.json ++++ b/node_modules/@glennsl/rescript-json-combinators/bsconfig.json +@@ -2,10 +2,13 @@ + "name": "@glennsl/rescript-json-combinators", + "namespace": "JsonCombinators", + "sources": [ +- "src", ++ "src" ++ ], ++ "package-specs": [ + { +- "dir": "examples", +- "type": "dev" ++ "module": "esmodule", ++ "in-source": true + } +- ] ++ ], ++ "suffix": ".bs.js" + } diff --git a/patches/README.md b/patches/README.md new file mode 100644 index 00000000..2228bb77 --- /dev/null +++ b/patches/README.md @@ -0,0 +1,69 @@ +# Patches + +This directory contains patches applied to npm packages using [patch-package](https://github.com/ds300/patch-package). + +## Why Patches? + +Patches are used when npm packages need modifications that haven't been released upstream yet, or when quick fixes are needed for compatibility issues. + +## Current Patches + +### @glennsl/rescript-json-combinators+1.4.0.patch + +**Issue**: This package ships with only ReScript source files (`.res`), not compiled JavaScript files (`.bs.js`). Its `bsconfig.json` lacks the `package-specs` configuration needed to generate compiled output. + +**Impact**: Without this patch, Rspack/Webpack cannot resolve imports like: +```javascript +import * as Json from "@glennsl/rescript-json-combinators/src/Json.bs.js"; +``` + +**What the patch does**: +1. Removes reference to non-existent `examples` directory +2. Adds `package-specs` configuration for ES module output +3. Adds `suffix: ".bs.js"` to generate `.bs.js` files + +**When applied**: Automatically during `yarn install` via the `postinstall` script + +**Upstream status**: +- Opened issue: https://github.com/glennsl/rescript-json-combinators/issues/9 +- This is a common pattern for in-source builds with ReScript +- May not be accepted upstream if author prefers source-only distribution + +**TODO**: Check if patch is still needed when upgrading `@glennsl/rescript-json-combinators` + +## Verifying Patches + +After running `yarn install`, verify the patch was applied correctly: + +```bash +# Run ReScript build - should succeed without errors +yarn res:build + +# Expected output: Compiled successfully +# If you see errors about missing .bs.js files, the patch wasn't applied +``` + +**Common issues**: +- **Patch not applied**: Check that `postinstall` script ran (look for patch-package output during install) +- **Build fails**: Run `yarn install --force` to reapply patches +- **Wrong ReScript version**: Ensure ReScript version matches the patched package expectations + +## How Patches Work + +1. **Creation**: When you modify a package in `node_modules/`, run: + ```bash + npx patch-package package-name + ``` + +2. **Application**: Patches are automatically applied after `yarn install` via the `postinstall` script in `package.json` + +3. **Updating**: If the package is updated and the patch fails, you'll need to either: + - Regenerate the patch with the new version + - Remove the patch if it's no longer needed + - Update the patch manually + +## Maintenance + +- **Before upgrading patched packages**: Check if the patch is still necessary +- **If patch fails to apply**: The build will fail with a clear error message +- **Review patches regularly**: Consider contributing fixes upstream to reduce maintenance burden diff --git a/spec/webpack/bundler_switching_spec.rb b/spec/webpack/bundler_switching_spec.rb new file mode 100644 index 00000000..3afecc4d --- /dev/null +++ b/spec/webpack/bundler_switching_spec.rb @@ -0,0 +1,67 @@ +# frozen_string_literal: true + +require 'spec_helper' +require 'yaml' + +RSpec.describe 'Bundler Switching', type: :feature do + let(:shakapacker_config_path) { Rails.root.join('config', 'shakapacker.yml') } + let(:original_config) { YAML.load_file(shakapacker_config_path, aliases: true) } + + after do + # Restore original config after each test + File.write(shakapacker_config_path, YAML.dump(original_config)) + end + + describe 'switching between webpack and rspack' do + it 'successfully builds with webpack' do + # Set bundler to webpack (deep copy to avoid mutating original_config) + config = YAML.load(YAML.dump(original_config)) + config['default']['assets_bundler'] = 'webpack' + File.write(shakapacker_config_path, YAML.dump(config)) + + # Run build + output = `NODE_ENV=test RAILS_ENV=test bin/shakapacker 2>&1` + + expect($CHILD_STATUS.success?).to be true + expect(output).to include('webpack') + expect(output).to include('compiled successfully') + end + + it 'successfully builds with rspack' do + # Set bundler to rspack (deep copy to avoid mutating original_config) + config = YAML.load(YAML.dump(original_config)) + config['default']['assets_bundler'] = 'rspack' + File.write(shakapacker_config_path, YAML.dump(config)) + + # Run build + output = `NODE_ENV=test RAILS_ENV=test bin/shakapacker 2>&1` + + expect($CHILD_STATUS.success?).to be true + expect(output).to include('Rspack') + expect(output).to include('compiled successfully') + end + + it 'produces functional bundles with both bundlers' do + bundlers = %w[webpack rspack] + + bundlers.each do |bundler| + # Set bundler (deep copy to avoid mutating original_config) + config = YAML.load(YAML.dump(original_config)) + config['default']['assets_bundler'] = bundler + File.write(shakapacker_config_path, YAML.dump(config)) + + # Build + `NODE_ENV=test RAILS_ENV=test bin/shakapacker 2>&1` + expect($CHILD_STATUS.success?).to be true + + # Verify manifest exists + manifest_path = Rails.root.join('public', 'packs-test', 'manifest.json') + expect(File.exist?(manifest_path)).to be true + + # Verify server bundle exists + server_bundle_path = Rails.root.join('ssr-generated', 'server-bundle.js') + expect(File.exist?(server_bundle_path)).to be true + end + end + end +end diff --git a/yarn.lock b/yarn.lock index de0fe613..41cb8851 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1277,11 +1277,33 @@ resolved "https://registry.npmjs.org/@csstools/utilities/-/utilities-1.0.0.tgz" integrity sha512-tAgvZQe/t2mlvpNosA4+CkMiZ2azISW5WPAcdSalZlEjQvUfghHxfQcrCiK/7/CrfAWVxyM88kGFYO82heIGDg== -"@discoveryjs/json-ext@^0.5.0": +"@discoveryjs/json-ext@0.5.7", "@discoveryjs/json-ext@^0.5.0", "@discoveryjs/json-ext@^0.5.7": version "0.5.7" resolved "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz" integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== +"@emnapi/core@^1.5.0": + version "1.5.0" + resolved "https://registry.npmjs.org/@emnapi/core/-/core-1.5.0.tgz#85cd84537ec989cebb2343606a1ee663ce4edaf0" + integrity sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg== + dependencies: + "@emnapi/wasi-threads" "1.1.0" + tslib "^2.4.0" + +"@emnapi/runtime@^1.5.0": + version "1.5.0" + resolved "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.5.0.tgz#9aebfcb9b17195dce3ab53c86787a6b7d058db73" + integrity sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ== + dependencies: + tslib "^2.4.0" + +"@emnapi/wasi-threads@1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz#60b2102fddc9ccb78607e4a3cf8403ea69be41bf" + integrity sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ== + dependencies: + tslib "^2.4.0" + "@eslint-community/eslint-utils@^4.2.0": version "4.9.0" resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz" @@ -1762,6 +1784,50 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" +"@jsonjoy.com/base64@^1.1.2": + version "1.1.2" + resolved "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz#cf8ea9dcb849b81c95f14fc0aaa151c6b54d2578" + integrity sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA== + +"@jsonjoy.com/buffers@^1.0.0", "@jsonjoy.com/buffers@^1.2.0": + version "1.2.0" + resolved "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.2.0.tgz#57b9bbc509055de80f22cf6b696ac7efd7554046" + integrity sha512-6RX+W5a+ZUY/c/7J5s5jK9UinLfJo5oWKh84fb4X0yK2q4WXEWUWZWuEMjvCb1YNUQhEAhUfr5scEGOH7jC4YQ== + +"@jsonjoy.com/codegen@^1.0.0": + version "1.0.0" + resolved "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-1.0.0.tgz#5c23f796c47675f166d23b948cdb889184b93207" + integrity sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g== + +"@jsonjoy.com/json-pack@^1.11.0": + version "1.19.0" + resolved "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.19.0.tgz#247e069d5ce375a065670c8ea89b150d8c88ed8b" + integrity sha512-ed3bz2NTJOH+i/HoVOGDjI9FCIA1yW2xLFuB+7PABRJrs0Dj+SoUpHMhQgNe2xYZ3zTiT2jb6xp8VTvM1MBdcQ== + dependencies: + "@jsonjoy.com/base64" "^1.1.2" + "@jsonjoy.com/buffers" "^1.2.0" + "@jsonjoy.com/codegen" "^1.0.0" + "@jsonjoy.com/json-pointer" "^1.0.2" + "@jsonjoy.com/util" "^1.9.0" + hyperdyperid "^1.2.0" + thingies "^2.5.0" + +"@jsonjoy.com/json-pointer@^1.0.2": + version "1.0.2" + resolved "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-1.0.2.tgz#049cb530ac24e84cba08590c5e36b431c4843408" + integrity sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg== + dependencies: + "@jsonjoy.com/codegen" "^1.0.0" + "@jsonjoy.com/util" "^1.9.0" + +"@jsonjoy.com/util@^1.9.0": + version "1.9.0" + resolved "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.9.0.tgz#7ee95586aed0a766b746cd8d8363e336c3c47c46" + integrity sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ== + dependencies: + "@jsonjoy.com/buffers" "^1.0.0" + "@jsonjoy.com/codegen" "^1.0.0" + "@leichtgewicht/ip-codec@^2.0.1": version "2.0.5" resolved "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz" @@ -1803,6 +1869,58 @@ dependencies: make-plural "^7.0.0" +"@module-federation/error-codes@0.18.0": + version "0.18.0" + resolved "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.18.0.tgz#00830ece3b5b6bcda0a874a8426bcd94599bf738" + integrity sha512-Woonm8ehyVIUPXChmbu80Zj6uJkC0dD9SJUZ/wOPtO8iiz/m+dkrOugAuKgoiR6qH4F+yorWila954tBz4uKsQ== + +"@module-federation/runtime-core@0.18.0": + version "0.18.0" + resolved "https://registry.npmjs.org/@module-federation/runtime-core/-/runtime-core-0.18.0.tgz#d696bce1001b42a3074613a9e51b1f9e843f5492" + integrity sha512-ZyYhrDyVAhUzriOsVfgL6vwd+5ebYm595Y13KeMf6TKDRoUHBMTLGQ8WM4TDj8JNsy7LigncK8C03fn97of0QQ== + dependencies: + "@module-federation/error-codes" "0.18.0" + "@module-federation/sdk" "0.18.0" + +"@module-federation/runtime-tools@0.18.0": + version "0.18.0" + resolved "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.18.0.tgz#8eddf50178974e0b2caaf8ad42e798eff3ab98e2" + integrity sha512-fSga9o4t1UfXNV/Kh6qFvRyZpPp3EHSPRISNeyT8ZoTpzDNiYzhtw0BPUSSD8m6C6XQh2s/11rI4g80UY+d+hA== + dependencies: + "@module-federation/runtime" "0.18.0" + "@module-federation/webpack-bundler-runtime" "0.18.0" + +"@module-federation/runtime@0.18.0": + version "0.18.0" + resolved "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.18.0.tgz#875486c67a0038d474a7efc890be5ee6f579ad38" + integrity sha512-+C4YtoSztM7nHwNyZl6dQKGUVJdsPrUdaf3HIKReg/GQbrt9uvOlUWo2NXMZ8vDAnf/QRrpSYAwXHmWDn9Obaw== + dependencies: + "@module-federation/error-codes" "0.18.0" + "@module-federation/runtime-core" "0.18.0" + "@module-federation/sdk" "0.18.0" + +"@module-federation/sdk@0.18.0": + version "0.18.0" + resolved "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.18.0.tgz#47bdbc23768fc2b9aae4f70bad47d6454349c1c1" + integrity sha512-Lo/Feq73tO2unjmpRfyyoUkTVoejhItXOk/h5C+4cistnHbTV8XHrW/13fD5e1Iu60heVdAhhelJd6F898Ve9A== + +"@module-federation/webpack-bundler-runtime@0.18.0": + version "0.18.0" + resolved "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.18.0.tgz#ba81a43800e6ceaff104a6956d9088b84df5a496" + integrity sha512-TEvErbF+YQ+6IFimhUYKK3a5wapD90d90sLsNpcu2kB3QGT7t4nIluE25duXuZDVUKLz86tEPrza/oaaCWTpvQ== + dependencies: + "@module-federation/runtime" "0.18.0" + "@module-federation/sdk" "0.18.0" + +"@napi-rs/wasm-runtime@^1.0.5": + version "1.0.6" + resolved "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.0.6.tgz#ba6cf875b7bf96052d0de29a91b029c94c6e9a48" + integrity sha512-DXj75ewm11LIWUk198QSKUTxjyRjsBwk09MuMk5DGK+GDUtyPhhEHOGP/Xwwj3DjQXXkivoBirmOnKrLfc0+9g== + dependencies: + "@emnapi/core" "^1.5.0" + "@emnapi/runtime" "^1.5.0" + "@tybys/wasm-util" "^0.10.1" + "@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.3": version "2.1.8-no-fsevents.3" resolved "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz" @@ -1943,6 +2061,11 @@ schema-utils "^4.2.0" source-map "^0.7.3" +"@polka/url@^1.0.0-next.24": + version "1.0.0-next.29" + resolved "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz#5a40109a1ab5f84d6fd8fc928b19f367cbe7e7b1" + integrity sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww== + "@prettier/eslint@npm:prettier-eslint@^15.0.1": version "15.0.1" resolved "https://registry.npmjs.org/prettier-eslint/-/prettier-eslint-15.0.1.tgz" @@ -1983,6 +2106,112 @@ resolved "https://registry.npmjs.org/@rescript/react/-/react-0.11.0.tgz" integrity sha512-RzoAO+3cJwXE2D7yodMo4tBO2EkeDYCN/I/Sj/yRweI3S1CY1ZBOF/GMcVtjeIurJJt7KMveqQXTaRrqoGZBBg== +"@rspack/binding-darwin-arm64@1.5.8": + version "1.5.8" + resolved "https://registry.npmjs.org/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-1.5.8.tgz#a50909f7bad21de27ea770a86e0e3c85006d95e9" + integrity sha512-spJfpOSN3f7V90ic45/ET2NKB2ujAViCNmqb0iGurMNQtFRq+7Kd+jvVKKGXKBHBbsQrFhidSWbbqy2PBPGK8g== + +"@rspack/binding-darwin-x64@1.5.8": + version "1.5.8" + resolved "https://registry.npmjs.org/@rspack/binding-darwin-x64/-/binding-darwin-x64-1.5.8.tgz#d69814aa7a1b30a901abb04bc573bf11d22f8fdb" + integrity sha512-YFOzeL1IBknBcri8vjUp43dfUBylCeQnD+9O9p0wZmLAw7DtpN5JEOe2AkGo8kdTqJjYKI+cczJPKIw6lu1LWw== + +"@rspack/binding-linux-arm64-gnu@1.5.8": + version "1.5.8" + resolved "https://registry.npmjs.org/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.5.8.tgz#3d2d21c0c9b3cc043335b6943ef404b7ceb559fc" + integrity sha512-UAWCsOnpkvy8eAVRo0uipbHXDhnoDq5zmqWTMhpga0/a3yzCp2e+fnjZb/qnFNYb5MeL0O1mwMOYgn1M3oHILQ== + +"@rspack/binding-linux-arm64-musl@1.5.8": + version "1.5.8" + resolved "https://registry.npmjs.org/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.5.8.tgz#9c6d5f2b5ec36b02e1d3b08edf8c33034d5fee24" + integrity sha512-GnSvGT4GjokPSD45cTtE+g7LgghuxSP1MRmvd+Vp/I8pnxTVSTsebRod4TAqyiv+l11nuS8yqNveK9qiOkBLWw== + +"@rspack/binding-linux-x64-gnu@1.5.8": + version "1.5.8" + resolved "https://registry.npmjs.org/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.5.8.tgz#45004557db9f3977e0bc1ead789a68c3904d1dec" + integrity sha512-XLxh5n/pzUfxsugz/8rVBv+Tx2nqEM+9rharK69kfooDsQNKyz7PANllBQ/v4svJ+W0BRHnDL4qXSGdteZeEjA== + +"@rspack/binding-linux-x64-musl@1.5.8": + version "1.5.8" + resolved "https://registry.npmjs.org/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-1.5.8.tgz#288d92af44d1460d634e41ec110bc500365e4e6e" + integrity sha512-gE0+MZmwF+01p9/svpEESkzkLpBkVUG2o03YMpwXYC/maeRRhWvF8BJ7R3i/Ls/jFGSE87dKX5NbRLVzqksq/w== + +"@rspack/binding-wasm32-wasi@1.5.8": + version "1.5.8" + resolved "https://registry.npmjs.org/@rspack/binding-wasm32-wasi/-/binding-wasm32-wasi-1.5.8.tgz#a3398bef73dd011d7b789f66574dfdeb6a46f20e" + integrity sha512-cfg3niNHeJuxuml1Vy9VvaJrI/5TakzoaZvKX2g5S24wfzR50Eyy4JAsZ+L2voWQQp1yMJbmPYPmnTCTxdJQBQ== + dependencies: + "@napi-rs/wasm-runtime" "^1.0.5" + +"@rspack/binding-win32-arm64-msvc@1.5.8": + version "1.5.8" + resolved "https://registry.npmjs.org/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.5.8.tgz#13d923b9fecffe9b420ac25ceba24742e409ff22" + integrity sha512-7i3ZTHFXKfU/9Jm9XhpMkrdkxO7lfeYMNVEGkuU5dyBfRMQj69dRgPL7zJwc2plXiqu9LUOl+TwDNTjap7Q36g== + +"@rspack/binding-win32-ia32-msvc@1.5.8": + version "1.5.8" + resolved "https://registry.npmjs.org/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.5.8.tgz#d3da0d8ead85f6cd5bf1c439a3057ae74c21565e" + integrity sha512-7ZPPWO11J+soea1+mnfaPpQt7GIodBM7A86dx6PbXgVEoZmetcWPrCF2NBfXxQWOKJ9L3RYltC4z+ZyXRgMOrw== + +"@rspack/binding-win32-x64-msvc@1.5.8": + version "1.5.8" + resolved "https://registry.npmjs.org/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.5.8.tgz#36b36b8d208961ae2f800b1b0a2aa652878499c3" + integrity sha512-N/zXQgzIxME3YUzXT8qnyzxjqcnXudWOeDh8CAG9zqTCnCiy16SFfQ/cQgEoLlD9geQntV6jx2GbDDI5kpDGMQ== + +"@rspack/binding@1.5.8": + version "1.5.8" + resolved "https://registry.npmjs.org/@rspack/binding/-/binding-1.5.8.tgz#8a529d734bd3e55cd504cdc7ccab9f31d4f96d2e" + integrity sha512-/91CzhRl9r5BIQCgGsS7jA6MDbw1I2BQpbfcUUdkdKl2P79K3Zo/Mw/TvKzS86catwLaUQEgkGRmYawOfPg7ow== + optionalDependencies: + "@rspack/binding-darwin-arm64" "1.5.8" + "@rspack/binding-darwin-x64" "1.5.8" + "@rspack/binding-linux-arm64-gnu" "1.5.8" + "@rspack/binding-linux-arm64-musl" "1.5.8" + "@rspack/binding-linux-x64-gnu" "1.5.8" + "@rspack/binding-linux-x64-musl" "1.5.8" + "@rspack/binding-wasm32-wasi" "1.5.8" + "@rspack/binding-win32-arm64-msvc" "1.5.8" + "@rspack/binding-win32-ia32-msvc" "1.5.8" + "@rspack/binding-win32-x64-msvc" "1.5.8" + +"@rspack/cli@^1.5.8": + version "1.5.8" + resolved "https://registry.npmjs.org/@rspack/cli/-/cli-1.5.8.tgz#f7e1c008423ebe7e53f63aa539d48b04b9999716" + integrity sha512-CVqxLGTHBLGDJxYRlVNCtbWix+bXLIHxT11225wAXSyn/5/kJYWxJNNy42vjUNNGSP1Va/aI5lse/pCZjn3xNA== + dependencies: + "@discoveryjs/json-ext" "^0.5.7" + "@rspack/dev-server" "~1.1.4" + colorette "2.0.20" + exit-hook "^4.0.0" + pirates "^4.0.7" + webpack-bundle-analyzer "4.10.2" + yargs "17.7.2" + +"@rspack/core@^1.5.8": + version "1.5.8" + resolved "https://registry.npmjs.org/@rspack/core/-/core-1.5.8.tgz#d7c2aa848a469873b07cb01073b9311a80105794" + integrity sha512-sUd2LfiDhqYVfvknuoz0+/c+wSpn693xotnG5g1CSWKZArbtwiYzBIVnNlcHGmuoBRsnj/TkSq8dTQ7gwfBroQ== + dependencies: + "@module-federation/runtime-tools" "0.18.0" + "@rspack/binding" "1.5.8" + "@rspack/lite-tapable" "1.0.1" + +"@rspack/dev-server@~1.1.4": + version "1.1.4" + resolved "https://registry.npmjs.org/@rspack/dev-server/-/dev-server-1.1.4.tgz#f31096a9ff65cb29444e5cc86c03754aa6361b8f" + integrity sha512-kGHYX2jYf3ZiHwVl0aUEPBOBEIG1aWleCDCAi+Jg32KUu3qr/zDUpCEd0wPuHfLEgk0X0xAEYCS6JMO7nBStNQ== + dependencies: + chokidar "^3.6.0" + http-proxy-middleware "^2.0.9" + p-retry "^6.2.0" + webpack-dev-server "5.2.2" + ws "^8.18.0" + +"@rspack/lite-tapable@1.0.1", "@rspack/lite-tapable@^1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@rspack/lite-tapable/-/lite-tapable-1.0.1.tgz#d4540a5d28bd6177164bc0ba0bee4bdec0458591" + integrity sha512-VynGOEsVw2s8TAlLf/uESfrgfrq2+rcXB1muPJYBWbsm1Oa6r5qVQhjA5ggM6z/coYPrsVMgovl3Ff7Q7OCp1w== + "@rtsao/scc@^1.1.0": version "1.1.0" resolved "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz" @@ -2145,6 +2374,13 @@ resolved "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz" integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== +"@tybys/wasm-util@^0.10.1": + version "0.10.1" + resolved "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz#ecddd3205cf1e2d5274649ff0eedd2991ed7f414" + integrity sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg== + dependencies: + tslib "^2.4.0" + "@types/aria-query@^5.0.1": version "5.0.4" resolved "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz#1a31c3d378850d2778dabb6374d036dcba4ba708" @@ -2191,14 +2427,14 @@ "@types/connect" "*" "@types/node" "*" -"@types/bonjour@^3.5.9": +"@types/bonjour@^3.5.13", "@types/bonjour@^3.5.9": version "3.5.13" resolved "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz" integrity sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ== dependencies: "@types/node" "*" -"@types/connect-history-api-fallback@^1.3.5": +"@types/connect-history-api-fallback@^1.3.5", "@types/connect-history-api-fallback@^1.5.4": version "1.5.4" resolved "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz" integrity sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw== @@ -2244,6 +2480,16 @@ "@types/range-parser" "*" "@types/send" "*" +"@types/express-serve-static-core@^4.17.21": + version "4.19.7" + resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.7.tgz#f1d306dcc03b1aafbfb6b4fe684cce8a31cffc10" + integrity sha512-FvPtiIf1LfhzsaIXhv/PHan/2FeQBbtBDtfX2QfvPxdUelMDEckK08SM6nqo1MIZY3RUlfA+HV8+hFUSio78qg== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + "@types/send" "*" + "@types/express-serve-static-core@^4.17.33": version "4.19.6" resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz" @@ -2254,7 +2500,7 @@ "@types/range-parser" "*" "@types/send" "*" -"@types/express@*", "@types/express@^4.17.13": +"@types/express@*", "@types/express@^4.17.13", "@types/express@^4.17.21": version "4.17.23" resolved "https://registry.npmjs.org/@types/express/-/express-4.17.23.tgz" integrity sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ== @@ -2385,12 +2631,17 @@ resolved "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz" integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== +"@types/retry@0.12.2": + version "0.12.2" + resolved "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz#ed279a64fa438bb69f2480eda44937912bb7480a" + integrity sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow== + "@types/semver@^7.3.12": version "7.7.1" resolved "https://registry.npmjs.org/@types/semver/-/semver-7.7.1.tgz" integrity sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA== -"@types/send@*": +"@types/send@*", "@types/send@<1": version "0.17.5" resolved "https://registry.npmjs.org/@types/send/-/send-0.17.5.tgz" integrity sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w== @@ -2398,7 +2649,7 @@ "@types/mime" "^1" "@types/node" "*" -"@types/serve-index@^1.9.1": +"@types/serve-index@^1.9.1", "@types/serve-index@^1.9.4": version "1.9.4" resolved "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz" integrity sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug== @@ -2414,7 +2665,16 @@ "@types/node" "*" "@types/send" "*" -"@types/sockjs@^0.3.33": +"@types/serve-static@^1.15.5": + version "1.15.9" + resolved "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.9.tgz#f9b08ab7dd8bbb076f06f5f983b683654fe0a025" + integrity sha512-dOTIuqpWLyl3BBXU3maNQsS4A3zuuoYRNIvYSxxhebPfXg2mzWQEPne/nlJ37yOse6uGgR386uTpdsx4D0QZWA== + dependencies: + "@types/http-errors" "*" + "@types/node" "*" + "@types/send" "<1" + +"@types/sockjs@^0.3.33", "@types/sockjs@^0.3.36": version "0.3.36" resolved "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz" integrity sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q== @@ -2436,7 +2696,7 @@ resolved "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz" integrity sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA== -"@types/ws@^8.5.5": +"@types/ws@^8.5.10", "@types/ws@^8.5.5": version "8.18.1" resolved "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz" integrity sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg== @@ -2664,6 +2924,11 @@ resolved "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== +"@yarnpkg/lockfile@^1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" + integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== + accepts@~1.3.4, accepts@~1.3.8: version "1.3.8" resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz" @@ -2682,7 +2947,14 @@ acorn-jsx@^5.3.2: resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn@^8.15.0, acorn@^8.9.0: +acorn-walk@^8.0.0: + version "8.3.4" + resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz#794dd169c3977edf4ba4ea47583587c5866236b7" + integrity sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g== + dependencies: + acorn "^8.11.0" + +acorn@^8.0.4, acorn@^8.11.0, acorn@^8.15.0, acorn@^8.9.0: version "8.15.0" resolved "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz" integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg== @@ -3157,7 +3429,7 @@ body-parser@1.20.3, body-parser@^1.20.2: type-is "~1.6.18" unpipe "1.0.0" -bonjour-service@^1.0.11: +bonjour-service@^1.0.11, bonjour-service@^1.2.1: version "1.3.0" resolved "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz" integrity sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA== @@ -3220,6 +3492,13 @@ buffer-from@^1.0.0: resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== +bundle-name@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz#f3b96b34160d6431a19d7688135af7cfb8797889" + integrity sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q== + dependencies: + run-applescript "^7.0.0" + bytes@3.1.2: version "3.1.2" resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz" @@ -3365,7 +3644,7 @@ chrome-trace-event@^1.0.2: resolved "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz" integrity sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ== -ci-info@^3.2.0: +ci-info@^3.2.0, ci-info@^3.7.0: version "3.9.0" resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz" integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== @@ -3458,7 +3737,7 @@ colord@^2.9.3: resolved "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz" integrity sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw== -colorette@^2.0.10, colorette@^2.0.14: +colorette@2.0.20, colorette@^2.0.10, colorette@^2.0.14: version "2.0.20" resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz" integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== @@ -3861,6 +4140,11 @@ data-view-byte-offset@^1.0.1: es-errors "^1.3.0" is-data-view "^1.0.1" +debounce@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz#38881d8f4166a5c5848020c11827b834bcb3e0a5" + integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug== + debug@2.6.9: version "2.6.9" resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" @@ -3912,6 +4196,19 @@ deepmerge@^4.2.2, deepmerge@^4.3.1: resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz" integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== +default-browser-id@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz#a1d98bf960c15082d8a3fa69e83150ccccc3af26" + integrity sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA== + +default-browser@^5.2.1: + version "5.2.1" + resolved "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz#7b7ba61204ff3e425b556869ae6d3e9d9f1712cf" + integrity sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg== + dependencies: + bundle-name "^4.1.0" + default-browser-id "^5.0.0" + default-gateway@^6.0.3: version "6.0.3" resolved "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz" @@ -3933,6 +4230,11 @@ define-lazy-prop@^2.0.0: resolved "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz" integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== +define-lazy-prop@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz#dbb19adfb746d7fc6d734a06b72f4a00d021255f" + integrity sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg== + define-properties@^1.1.3, define-properties@^1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz" @@ -4122,6 +4424,11 @@ dunder-proto@^1.0.0, dunder-proto@^1.0.1: es-errors "^1.3.0" gopd "^1.2.0" +duplexer@^0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" + integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== + eastasianwidth@^0.2.0: version "0.2.0" resolved "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz" @@ -4686,6 +4993,11 @@ execa@^5.0.0: signal-exit "^3.0.3" strip-final-newline "^2.0.0" +exit-hook@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/exit-hook/-/exit-hook-4.0.0.tgz#c1e16ebd03d3166f837b1502dac755bb5c460d58" + integrity sha512-Fqs7ChZm72y40wKjOFXBKg7nJZvQJmewP5/7LtePDdnah/+FH9Hp5sgMujSCMPXlxOAW2//1jrW9pnsY7o20vQ== + exit@^0.1.2: version "0.1.2" resolved "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz" @@ -4707,7 +5019,7 @@ expose-loader@^4.0.0: resolved "https://registry.npmjs.org/expose-loader/-/expose-loader-4.1.0.tgz" integrity sha512-oLAesnzerwDGGADzBMnu0LPqqnlVz6e2V9lTa+/4X6VeW9W93x/nJpw05WBrcIdbqXm/EdnEQpiVDFFiQXuNfg== -express@^4.17.3, express@^4.18.2: +express@^4.17.3, express@^4.18.2, express@^4.21.2: version "4.21.2" resolved "https://registry.npmjs.org/express/-/express-4.21.2.tgz" integrity sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA== @@ -4869,6 +5181,13 @@ find-up@^5.0.0: locate-path "^6.0.0" path-exists "^4.0.0" +find-yarn-workspace-root@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz#f47fb8d239c900eb78179aa81b66673eac88f7bd" + integrity sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ== + dependencies: + micromatch "^4.0.2" + flat-cache@^3.0.4: version "3.2.0" resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz" @@ -4923,6 +5242,15 @@ fresh@0.5.2: resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== +fs-extra@^10.0.0: + version "10.1.0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + fs-monkey@^1.0.4: version "1.1.0" resolved "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.1.0.tgz" @@ -5042,6 +5370,11 @@ glob-parent@^6.0.2: dependencies: is-glob "^4.0.3" +glob-to-regex.js@^1.0.1: + version "1.2.0" + resolved "https://registry.npmjs.org/glob-to-regex.js/-/glob-to-regex.js-1.2.0.tgz#2b323728271d133830850e32311f40766c5f6413" + integrity sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ== + glob-to-regexp@^0.4.1: version "0.4.1" resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz" @@ -5111,7 +5444,7 @@ gopd@^1.0.1, gopd@^1.2.0: resolved "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz" integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== -graceful-fs@^4.1.2, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: +graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: version "4.2.11" resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== @@ -5121,6 +5454,13 @@ graphemer@^1.4.0: resolved "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz" integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== +gzip-size@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz#065367fd50c239c0671cbcbad5be3e2eeb10e462" + integrity sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q== + dependencies: + duplexer "^0.1.2" + handle-thing@^2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz" @@ -5215,7 +5555,7 @@ html-entities@^2.1.0, html-entities@^2.3.2: resolved "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz" integrity sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ== -html-escaper@^2.0.0: +html-escaper@^2.0.0, html-escaper@^2.0.2: version "2.0.2" resolved "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== @@ -5303,7 +5643,7 @@ http-proxy-agent@^7.0.2: agent-base "^7.1.0" debug "^4.3.4" -http-proxy-middleware@^2.0.3: +http-proxy-middleware@^2.0.3, http-proxy-middleware@^2.0.9: version "2.0.9" resolved "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz" integrity sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q== @@ -5336,6 +5676,11 @@ human-signals@^2.1.0: resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== +hyperdyperid@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz#59668d323ada92228d2a869d3e474d5a33b69e6b" + integrity sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A== + iconv-lite@0.4.24: version "0.4.24" resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" @@ -5468,7 +5813,7 @@ ipaddr.js@1.9.1: resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== -ipaddr.js@^2.0.1: +ipaddr.js@^2.0.1, ipaddr.js@^2.1.0: version "2.2.0" resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz" integrity sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA== @@ -5554,6 +5899,11 @@ is-docker@^2.0.0, is-docker@^2.1.1: resolved "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz" integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== +is-docker@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz#90093aa3106277d8a77a5910dbae71747e15a200" + integrity sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ== + is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" @@ -5598,6 +5948,13 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" +is-inside-container@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz#e81fba699662eb31dbdaf26766a61d4814717ea4" + integrity sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA== + dependencies: + is-docker "^3.0.0" + is-map@^2.0.3: version "2.0.3" resolved "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz" @@ -5608,6 +5965,11 @@ is-negative-zero@^2.0.3: resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz" integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== +is-network-error@^1.0.0: + version "1.3.0" + resolved "https://registry.npmjs.org/is-network-error/-/is-network-error-1.3.0.tgz#2ce62cbca444abd506f8a900f39d20b898d37512" + integrity sha512-6oIwpsgRfnDiyEDLMay/GqCl3HoAtH5+RUKW29gYkL0QA+ipzpDLA16yQs7/RHCSu+BwgbJaOUqa4A99qNVQVw== + is-number-object@^1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz" @@ -5719,13 +6081,20 @@ is-weakset@^2.0.3: call-bound "^1.0.3" get-intrinsic "^1.2.6" -is-wsl@^2.2.0: +is-wsl@^2.1.1, is-wsl@^2.2.0: version "2.2.0" - resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz" + resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== dependencies: is-docker "^2.0.0" +is-wsl@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz#e1c657e39c10090afcbedec61720f6b924c3cbd2" + integrity sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw== + dependencies: + is-inside-container "^1.0.0" + isarray@^2.0.5: version "2.0.5" resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz" @@ -6330,6 +6699,17 @@ json-stable-stringify-without-jsonify@^1.0.1: resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== +json-stable-stringify@^1.0.2: + version "1.3.0" + resolved "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.3.0.tgz#8903cfac42ea1a0f97f35d63a4ce0518f0cc6a70" + integrity sha512-qtYiSSFlwot9XHtF9bD9c7rwKjr+RecWT//ZnPvSmEjpV5mmPOCN4j8UjY5hbjNkOwZ/jQv3J6R1/pL7RwgMsg== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.4" + isarray "^2.0.5" + jsonify "^0.0.1" + object-keys "^1.1.1" + json5@^1.0.1, json5@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz" @@ -6342,6 +6722,20 @@ json5@^2.1.2, json5@^2.2.3: resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== +jsonfile@^6.0.1: + version "6.2.0" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz#7c265bd1b65de6977478300087c99f1c84383f62" + integrity sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +jsonify@^0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz#2aa3111dae3d34a0f151c63f3a45d995d9420978" + integrity sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg== + "jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.5: version "3.3.5" resolved "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz" @@ -6364,6 +6758,13 @@ kind-of@^6.0.2: resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== +klaw-sync@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz#1fd2cfd56ebb6250181114f0a581167099c2b28c" + integrity sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ== + dependencies: + graceful-fs "^4.1.11" + kleur@^3.0.3: version "3.0.3" resolved "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz" @@ -6381,7 +6782,7 @@ language-tags@^1.0.9: dependencies: language-subtag-registry "^0.3.20" -launch-editor@^2.6.0: +launch-editor@^2.6.0, launch-editor@^2.6.1: version "2.11.1" resolved "https://registry.npmjs.org/launch-editor/-/launch-editor-2.11.1.tgz" integrity sha512-SEET7oNfgSaB6Ym0jufAdCeo3meJVeCaaDyzRygy0xsp2BFKCprcfHljTq4QkzTLUxEKkFK6OK4811YM2oSrRg== @@ -6707,6 +7108,18 @@ memfs@^3.4.3: dependencies: fs-monkey "^1.0.4" +memfs@^4.43.1: + version "4.49.0" + resolved "https://registry.npmjs.org/memfs/-/memfs-4.49.0.tgz#bc35069570d41a31c62e31f1a6ec6057a8ea82f0" + integrity sha512-L9uC9vGuc4xFybbdOpRLoOAOq1YEBBsocCs5NVW32DfU+CZWWIn3OVF+lB8Gp4ttBVSMazwrTrjv8ussX/e3VQ== + dependencies: + "@jsonjoy.com/json-pack" "^1.11.0" + "@jsonjoy.com/util" "^1.9.0" + glob-to-regex.js "^1.0.1" + thingies "^2.5.0" + tree-dump "^1.0.3" + tslib "^2.0.0" + memory-fs@^0.2.0: version "0.2.0" resolved "https://registry.npmjs.org/memory-fs/-/memory-fs-0.2.0.tgz" @@ -6745,6 +7158,11 @@ mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== +mime-db@^1.54.0: + version "1.54.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz#cddb3ee4f9c64530dff640236661d42cb6a314f5" + integrity sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ== + mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34: version "2.1.35" resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" @@ -6752,6 +7170,13 @@ mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24, dependencies: mime-db "1.52.0" +mime-types@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz#b1d94d6997a9b32fd69ebaed0db73de8acb519ce" + integrity sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA== + dependencies: + mime-db "^1.54.0" + mime@1.6.0: version "1.6.0" resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" @@ -6816,6 +7241,11 @@ moo@^0.5.1: resolved "https://registry.npmjs.org/moo/-/moo-0.5.2.tgz" integrity sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q== +mrmime@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz#bc3e87f7987853a54c9850eeb1f1078cd44adddc" + integrity sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ== + ms@2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" @@ -7011,7 +7441,7 @@ obuf@^1.0.0, obuf@^1.1.2: resolved "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz" integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== -on-finished@2.4.1: +on-finished@2.4.1, on-finished@^2.4.1: version "2.4.1" resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz" integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== @@ -7037,6 +7467,24 @@ onetime@^5.1.2: dependencies: mimic-fn "^2.1.0" +open@^10.0.3: + version "10.2.0" + resolved "https://registry.npmjs.org/open/-/open-10.2.0.tgz#b9d855be007620e80b6fb05fac98141fe62db73c" + integrity sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA== + dependencies: + default-browser "^5.2.1" + define-lazy-prop "^3.0.0" + is-inside-container "^1.0.0" + wsl-utils "^0.1.0" + +open@^7.4.2: + version "7.4.2" + resolved "https://registry.npmjs.org/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" + integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q== + dependencies: + is-docker "^2.0.0" + is-wsl "^2.1.1" + open@^8.0.9: version "8.4.2" resolved "https://registry.npmjs.org/open/-/open-8.4.2.tgz" @@ -7046,6 +7494,11 @@ open@^8.0.9: is-docker "^2.1.1" is-wsl "^2.2.0" +opener@^1.5.2: + version "1.5.2" + resolved "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" + integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== + optionator@^0.9.3: version "0.9.4" resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz" @@ -7110,6 +7563,15 @@ p-retry@^4.5.0: "@types/retry" "0.12.0" retry "^0.13.1" +p-retry@^6.2.0: + version "6.2.1" + resolved "https://registry.npmjs.org/p-retry/-/p-retry-6.2.1.tgz#81828f8dc61c6ef5a800585491572cc9892703af" + integrity sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ== + dependencies: + "@types/retry" "0.12.2" + is-network-error "^1.0.0" + retry "^0.13.1" + p-try@^2.0.0: version "2.2.0" resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" @@ -7170,6 +7632,26 @@ pascal-case@^3.1.2: no-case "^3.0.4" tslib "^2.0.3" +patch-package@^8.0.0: + version "8.0.1" + resolved "https://registry.npmjs.org/patch-package/-/patch-package-8.0.1.tgz#79d02f953f711e06d1f8949c8a13e5d3d7ba1a60" + integrity sha512-VsKRIA8f5uqHQ7NGhwIna6Bx6D9s/1iXlA1hthBVBEbkq+t4kXD0HHt+rJhf/Z+Ci0F/HCB2hvn0qLdLG+Qxlw== + dependencies: + "@yarnpkg/lockfile" "^1.1.0" + chalk "^4.1.2" + ci-info "^3.7.0" + cross-spawn "^7.0.3" + find-yarn-workspace-root "^2.0.0" + fs-extra "^10.0.0" + json-stable-stringify "^1.0.2" + klaw-sync "^6.0.0" + minimist "^1.2.6" + open "^7.4.2" + semver "^7.5.3" + slash "^2.0.0" + tmp "^0.2.4" + yaml "^2.2.2" + path-complete-extname@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/path-complete-extname/-/path-complete-extname-1.0.0.tgz" @@ -7243,7 +7725,7 @@ pify@^4.0.1: resolved "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz" integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== -pirates@^4.0.1, pirates@^4.0.4: +pirates@^4.0.1, pirates@^4.0.4, pirates@^4.0.7: version "4.0.7" resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz" integrity sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA== @@ -8385,6 +8867,18 @@ rrweb-cssom@^0.8.0: resolved "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz#3021d1b4352fbf3b614aaeed0bc0d5739abe0bc2" integrity sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw== +rspack-manifest-plugin@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/rspack-manifest-plugin/-/rspack-manifest-plugin-5.1.0.tgz#09621d32d290a6de32e13aa10feb7f593dc15ae5" + integrity sha512-XAt1VOfRt6gcNlekB7rpiYK0MuC8VuWRrM2F33Eu83B/fmEVJUNVMDxZJhqJ0NMDJNxq80404j+NAfzlYQCjrw== + dependencies: + "@rspack/lite-tapable" "^1.0.1" + +run-applescript@^7.0.0: + version "7.1.0" + resolved "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz#2e9e54c4664ec3106c5b5630e249d3d6595c4911" + integrity sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q== + run-parallel@^1.1.9: version "1.2.0" resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" @@ -8523,7 +9017,7 @@ select-hose@^2.0.0: resolved "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz" integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== -selfsigned@^2.1.1: +selfsigned@^2.1.1, selfsigned@^2.4.1: version "2.4.1" resolved "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz" integrity sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q== @@ -8641,10 +9135,10 @@ setprototypeof@1.2.0: resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== -shakapacker@9.0.0-beta.8: - version "9.0.0-beta.8" - resolved "https://registry.npmjs.org/shakapacker/-/shakapacker-9.0.0-beta.8.tgz" - integrity sha512-NPu5cTB6lL/Bzl8XDl1NfjlljLARWPH9YhjIh1CvXEuSdaNP2qJLSiIr68Bqv3IGHQmqtifgRl1iXQB8pNnAfQ== +shakapacker@9.1.0: + version "9.1.0" + resolved "https://registry.npmjs.org/shakapacker/-/shakapacker-9.1.0.tgz#6d63c4d27b9358073dd8fc3c6e79252b96d36a36" + integrity sha512-PL0DuzNLFJMwr5s908ImMuvejmC20WuDa7EfAPpPFU1pM5U8cPqqC4kwSdXFLfVU0Or/UqeegNyIB1sGBdSPiw== dependencies: js-yaml "^4.1.0" path-complete-extname "^1.0.0" @@ -8724,6 +9218,15 @@ signal-exit@^4.0.1: resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== +sirv@^2.0.3: + version "2.0.4" + resolved "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz#5dd9a725c578e34e449f332703eb2a74e46a29b0" + integrity sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ== + dependencies: + "@polka/url" "^1.0.0-next.24" + mrmime "^2.0.0" + totalist "^3.0.0" + sisteransi@^1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz" @@ -9226,6 +9729,11 @@ thenify-all@^1.0.0: dependencies: any-promise "^1.0.0" +thingies@^2.5.0: + version "2.5.0" + resolved "https://registry.npmjs.org/thingies/-/thingies-2.5.0.tgz#5f7b882c933b85989f8466b528a6247a6881e04f" + integrity sha512-s+2Bwztg6PhWUD7XMfeYm5qliDdSiZm7M7n8KjTkIsm3l/2lgVRc2/Gx/v+ZX8lT4FMA+i8aQvhcWylldc+ZNw== + thunky@^1.0.2: version "1.1.0" resolved "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz" @@ -9243,6 +9751,11 @@ tldts@^6.1.32: dependencies: tldts-core "^6.1.86" +tmp@^0.2.4: + version "0.2.5" + resolved "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz#b06bcd23f0f3c8357b426891726d16015abfd8f8" + integrity sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow== + tmpl@1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz" @@ -9260,6 +9773,11 @@ toidentifier@1.0.1: resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== +totalist@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz#ba3a3d600c915b1a97872348f79c127475f6acf8" + integrity sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ== + tough-cookie@^5.1.1: version "5.1.2" resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz#66d774b4a1d9e12dc75089725af3ac75ec31bed7" @@ -9274,6 +9792,11 @@ tr46@^5.1.0: dependencies: punycode "^2.3.1" +tree-dump@^1.0.3: + version "1.1.0" + resolved "https://registry.npmjs.org/tree-dump/-/tree-dump-1.1.0.tgz#ab29129169dc46004414f5a9d4a3c6e89f13e8a4" + integrity sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA== + ts-interface-checker@^0.1.9: version "0.1.13" resolved "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz" @@ -9289,7 +9812,7 @@ tsconfig-paths@^3.15.0: minimist "^1.2.6" strip-bom "^3.0.0" -tslib@2, tslib@^2.0.3, tslib@^2.1.0: +tslib@2, tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.4.0: version "2.8.1" resolved "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz" integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== @@ -9439,6 +9962,11 @@ unicode-property-aliases-ecmascript@^2.0.0: resolved "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz" integrity sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ== +universalify@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" + integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== + unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" @@ -9579,6 +10107,24 @@ webpack-assets-manifest@5: schema-utils "^3.3.0" tapable "^2.2.1" +webpack-bundle-analyzer@4.10.2: + version "4.10.2" + resolved "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.2.tgz#633af2862c213730be3dbdf40456db171b60d5bd" + integrity sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw== + dependencies: + "@discoveryjs/json-ext" "0.5.7" + acorn "^8.0.4" + acorn-walk "^8.0.0" + commander "^7.2.0" + debounce "^1.2.1" + escape-string-regexp "^4.0.0" + gzip-size "^6.0.0" + html-escaper "^2.0.2" + opener "^1.5.2" + picocolors "^1.0.0" + sirv "^2.0.3" + ws "^7.3.1" + webpack-cli@5: version "5.1.4" resolved "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz" @@ -9609,6 +10155,52 @@ webpack-dev-middleware@^5.3.4: range-parser "^1.2.1" schema-utils "^4.0.0" +webpack-dev-middleware@^7.4.2: + version "7.4.5" + resolved "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.5.tgz#d4e8720aa29cb03bc158084a94edb4594e3b7ac0" + integrity sha512-uxQ6YqGdE4hgDKNf7hUiPXOdtkXvBJXrfEGYSx7P7LC8hnUYGK70X6xQXUvXeNyBDDcsiQXpG2m3G9vxowaEuA== + dependencies: + colorette "^2.0.10" + memfs "^4.43.1" + mime-types "^3.0.1" + on-finished "^2.4.1" + range-parser "^1.2.1" + schema-utils "^4.0.0" + +webpack-dev-server@5.2.2: + version "5.2.2" + resolved "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.2.tgz#96a143d50c58fef0c79107e61df911728d7ceb39" + integrity sha512-QcQ72gh8a+7JO63TAx/6XZf/CWhgMzu5m0QirvPfGvptOusAxG12w2+aua1Jkjr7hzaWDnJ2n6JFeexMHI+Zjg== + dependencies: + "@types/bonjour" "^3.5.13" + "@types/connect-history-api-fallback" "^1.5.4" + "@types/express" "^4.17.21" + "@types/express-serve-static-core" "^4.17.21" + "@types/serve-index" "^1.9.4" + "@types/serve-static" "^1.15.5" + "@types/sockjs" "^0.3.36" + "@types/ws" "^8.5.10" + ansi-html-community "^0.0.8" + bonjour-service "^1.2.1" + chokidar "^3.6.0" + colorette "^2.0.10" + compression "^1.7.4" + connect-history-api-fallback "^2.0.0" + express "^4.21.2" + graceful-fs "^4.2.6" + http-proxy-middleware "^2.0.9" + ipaddr.js "^2.1.0" + launch-editor "^2.6.1" + open "^10.0.3" + p-retry "^6.2.0" + schema-utils "^4.2.0" + selfsigned "^2.4.1" + serve-index "^1.9.1" + sockjs "^0.3.24" + spdy "^4.0.2" + webpack-dev-middleware "^7.4.2" + ws "^8.18.0" + webpack-dev-server@^4.11.1: version "4.15.2" resolved "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz" @@ -9848,11 +10440,23 @@ write-file-atomic@^4.0.2: imurmurhash "^0.1.4" signal-exit "^3.0.7" +ws@^7.3.1: + version "7.5.10" + resolved "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9" + integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== + ws@^8.13.0, ws@^8.18.0: version "8.18.3" resolved "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz" integrity sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg== +wsl-utils@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz#8783d4df671d4d50365be2ee4c71917a0557baab" + integrity sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw== + dependencies: + is-wsl "^3.1.0" + xml-name-validator@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz#82be9b957f7afdacf961e5980f1bf227c0bf7673" @@ -9878,6 +10482,11 @@ yallist@^3.0.2: resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== +yaml@^2.2.2: + version "2.8.1" + resolved "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz#1870aa02b631f7e8328b93f8bc574fac5d6c4d79" + integrity sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw== + yargs-parser@^13.1.2: version "13.1.2" resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz" @@ -9891,6 +10500,19 @@ yargs-parser@^21.1.1: resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== +yargs@17.7.2, yargs@^17.3.1: + version "17.7.2" + resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + yargs@^13.1.1: version "13.3.2" resolved "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz" @@ -9907,19 +10529,6 @@ yargs@^13.1.1: y18n "^4.0.0" yargs-parser "^13.1.2" -yargs@^17.3.1: - version "17.7.2" - resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz" - integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== - dependencies: - cliui "^8.0.1" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.1.1" - yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz"