diff --git a/.gitignore b/.gitignore index 5eb4e135..e0166ca0 100644 --- a/.gitignore +++ b/.gitignore @@ -60,4 +60,9 @@ client/app/bundles/comments/rescript/**/*.bs.js # Generated React on Rails packs **/generated/** +# Generated ReScript files (compiled from .res source files) +**/*.res.js +**/*.res.mjs +**/*.bs.js + .claude/ 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/bsconfig.json b/bsconfig.json index a7b92f10..5281eccc 100644 --- a/bsconfig.json +++ b/bsconfig.json @@ -13,7 +13,7 @@ } ], "bsc-flags": ["-open JsonCombinators", "-open Belt"], - "suffix": ".bs.js", + "suffix": ".res.js", "bs-dependencies": [ "@rescript/react", "@rescript/core", diff --git a/client/__tests__/webpack/bundlerUtils.spec.js b/client/__tests__/webpack/bundlerUtils.spec.js new file mode 100644 index 00000000..80318cda --- /dev/null +++ b/client/__tests__/webpack/bundlerUtils.spec.js @@ -0,0 +1,144 @@ +/* eslint-disable max-classes-per-file */ +/* eslint-disable global-require */ +/** + * 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). + * We use require() inside tests to ensure proper mocking order. + */ + +// 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/client/app/bundles/comments/rescript/ReScriptShow/ror_components/RescriptShow.jsx b/client/app/bundles/comments/rescript/ReScriptShow/ror_components/RescriptShow.jsx new file mode 100644 index 00000000..395a6fff --- /dev/null +++ b/client/app/bundles/comments/rescript/ReScriptShow/ror_components/RescriptShow.jsx @@ -0,0 +1,6 @@ +// Wrapper for ReScript component to work with react_on_rails auto-registration +// react_on_rails looks for components in ror_components/ subdirectories + +import RescriptShow from '../../ReScriptShow.res.js'; + +export default RescriptShow; diff --git a/client/app/bundles/comments/rescript/RescriptShow/ror_components/RescriptShow.jsx b/client/app/bundles/comments/rescript/RescriptShow/ror_components/RescriptShow.jsx deleted file mode 100644 index a8ea13bf..00000000 --- a/client/app/bundles/comments/rescript/RescriptShow/ror_components/RescriptShow.jsx +++ /dev/null @@ -1,129 +0,0 @@ -// Generated by ReScript, PLEASE EDIT WITH CARE - -import * as React from "react"; -import * as Header from "../../Header/Header.bs.js"; -import * as Actions from "../../Actions/Actions.bs.js"; -import * as AlertError from "../../CommentList/AlertError/AlertError.bs.js"; -import * as ActionCable from "../../bindings/ActionCable.bs.js"; -import * as CommentForm from "../../CommentForm/CommentForm.bs.js"; -import * as CommentList from "../../CommentList/CommentList.bs.js"; -import * as JsxRuntime from "react/jsx-runtime"; - -function reducer(param, action) { - if (typeof action !== "object") { - return { - commentsFetchStatus: "FetchError" - }; - } else { - return { - commentsFetchStatus: { - TAG: "CommentsFetched", - _0: action._0 - } - }; - } -} - -function ReScriptShow$default(props) { - var match = React.useReducer(reducer, { - commentsFetchStatus: { - TAG: "CommentsFetched", - _0: [] - } - }); - var dispatch = match[1]; - var fetchData = async function () { - var comments = await Actions.Fetch.fetchComments(); - if (comments.TAG === "Ok") { - return dispatch({ - TAG: "SetComments", - _0: comments._0 - }); - } else { - return dispatch("SetFetchError"); - } - }; - var subscribeToCommentsChannel = function () { - return ActionCable.subscribeConsumer("CommentsChannel", { - connected: (function () { - console.log("Connected"); - }), - received: (function (data) { - dispatch({ - TAG: "SetComments", - _0: [data] - }); - }), - disconnected: (function () { - console.log("Disconnected"); - }) - }); - }; - React.useEffect((function () { - var scription = subscribeToCommentsChannel(); - return (function () { - scription.unsubscribe(); - }); - }), []); - React.useEffect((function () { - fetchData(); - }), []); - var comments = match[0].commentsFetchStatus; - var tmp; - tmp = typeof comments !== "object" ? JsxRuntime.jsx(AlertError.make, { - errorMsg: "Can't fetch the comments!" - }) : JsxRuntime.jsx(CommentList.make, { - comments: comments._0 - }); - return JsxRuntime.jsxs("div", { - children: [ - JsxRuntime.jsxs("h2", { - children: [ - "Rescript + Rails Backend (with ", - JsxRuntime.jsx("a", { - children: "react_on_rails gem", - href: "https://github.com/shakacode/react_on_rails" - }), - ")" - ] - }), - JsxRuntime.jsx(Header.make, {}), - JsxRuntime.jsxs("div", { - children: [ - JsxRuntime.jsx("h2", { - children: "Comments" - }), - JsxRuntime.jsxs("ul", { - children: [ - JsxRuntime.jsx("li", { - children: "Text supports Github Flavored Markdown." - }), - JsxRuntime.jsx("li", { - children: "Comments older than 24 hours are deleted." - }), - JsxRuntime.jsx("li", { - children: "Name is preserved. Text is reset, between submits" - }), - JsxRuntime.jsx("li", { - children: "To see Action Cable instantly update two browsers, open two browsers and submit a comment!" - }) - ] - }), - JsxRuntime.jsx(CommentForm.make, { - fetchData: fetchData - }), - tmp - ], - className: "prose max-w-none prose-a:text-sky-700 prose-li:my-0" - }) - ] - }); -} - -var $$default = ReScriptShow$default; - -export { - reducer , - $$default as default, -} -/* react Not a pure module */ 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..2ccfafbe --- /dev/null +++ b/config/webpack/bundlerUtils.js @@ -0,0 +1,77 @@ +/** + * 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 +// IMPORTANT: Shakapacker config is immutable at runtime - it's loaded once when the +// Node process starts. Changing shakapacker.yml requires restarting the server. +// This cache is safe because config.assets_bundler cannot change during execution. +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..1a99ddbc 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 .res.js extension for ReScript-compiled modules (modern ReScript convention) + extensions: ['.css', '.ts', '.tsx', '.res.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 .res.js to resolve extensions (modern ReScript v11+ convention) + * + * @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..8dada649 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 @@ -59,22 +87,23 @@ const configureServer = () => { }; // Don't hash the server bundle b/c would conflict with the client manifest - // And no need for the MiniCssExtractPlugin + // And no need for CSS extraction plugins (MiniCssExtractPlugin or CssExtractRspackPlugin) serverWebpackConfig.plugins = serverWebpackConfig.plugins.filter( (plugin) => plugin.constructor.name !== 'WebpackAssetsManifest' && plugin.constructor.name !== 'MiniCssExtractPlugin' && + plugin.constructor.name !== 'CssExtractRspackPlugin' && plugin.constructor.name !== 'ForkTsCheckerWebpackPlugin', ); // 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 +111,12 @@ 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?.match(/CssExtractRspackPlugin/) || + testValue?.includes('cssExtractLoader') || + testValue === 'style-loader' + ); }); const cssLoader = rule.use.find((item) => { let testValue; @@ -93,10 +127,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/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"