diff --git a/docs/source/upgrade-guide/index.md b/docs/source/upgrade-guide/index.md index 1bc73cf71ee..43663cd5c7b 100644 --- a/docs/source/upgrade-guide/index.md +++ b/docs/source/upgrade-guide/index.md @@ -111,6 +111,18 @@ Finally, update your add-on file {file}`babel.config.js`. + const presets = ['@plone/razzle']; ``` +### Replace `razzle-dev-utils` with `@plone/razzle-dev-utils` +```{versionchanged} Volto 19.0.0-alpha.28 +``` + +`@plone/razzle-dev-utils` is a maintained fork of the original `razzle-dev-utils` package that contains Volto-specific fixes and patches. + +To verify whether your project requires updates, search for any direct references to internal `razzle-dev-utils` modules: + +```shell +grep -R "razzle-dev-utils" -n --exclude-dir=node_modules || true +``` + ### `pnpm` has been upgraded to version 10 ```{versionchanged} Volto 19.0.0-alpha.7 ``` diff --git a/packages/volto-razzle-dev-utils/.release-it.json b/packages/volto-razzle-dev-utils/.release-it.json new file mode 100644 index 00000000000..bc6c60fad75 --- /dev/null +++ b/packages/volto-razzle-dev-utils/.release-it.json @@ -0,0 +1,29 @@ +{ + "plugins": { + "../scripts/prepublish.js": {} + }, + "hooks": { + "after:bump": [ + "pipx run towncrier build --draft --yes --version ${version} > .changelog.draft", + "pipx run towncrier build --yes --version ${version}" + ], + "after:release": "rm .changelog.draft" + }, + "npm": { + "publish": false + }, + "git": { + "commitArgs": ["--no-verify"], + "changelog": "pipx run towncrier build --draft --yes --version 0.0.0", + "requireUpstream": false, + "requireCleanWorkingDir": false, + "commitMessage": "Release @plone/razzle-dev-utils ${version}", + "tagName": "plone-razzle-dev-utils-${version}", + "tagAnnotation": "Release @plone/razzle-dev-utils ${version}" + }, + "github": { + "release": true, + "releaseName": "@plone/razzle-dev-utils ${version}", + "releaseNotes": "cat .changelog.draft" + } +} diff --git a/packages/volto-razzle-dev-utils/CHANGELOG.md b/packages/volto-razzle-dev-utils/CHANGELOG.md new file mode 100644 index 00000000000..2b7fa31d6da --- /dev/null +++ b/packages/volto-razzle-dev-utils/CHANGELOG.md @@ -0,0 +1,9 @@ +# @plone/razzle-dev-utils Release Notes + + + + diff --git a/packages/volto-razzle-dev-utils/FileSizeReporter.js b/packages/volto-razzle-dev-utils/FileSizeReporter.js new file mode 100644 index 00000000000..294b5002c71 --- /dev/null +++ b/packages/volto-razzle-dev-utils/FileSizeReporter.js @@ -0,0 +1,182 @@ +'use strict'; + +/** + * Copyright (c) 2015-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +var fs = require('fs'); +var path = require('path'); +var chalk = require('chalk'); +var filesize = require('filesize'); +var recursive = require('recursive-readdir'); +var stripAnsi = require('strip-ansi'); +var gzipSize = require('gzip-size').sync; + +function canReadAsset(asset) { + return ( + /\.(js|css|html|json)$/.test(asset) && + !/service-worker\.js/.test(asset) && + !/precache-manifest\.[0-9a-f]+\.js/.test(asset) + ); +} + +// Prints a detailed summary of build files. +function printFileSizesAfterBuild( + webpackStats, + previousSizeMap, + buildFolder, + maxBundleGzipSize, + maxChunkGzipSize, +) { + var root = previousSizeMap.root; + var sizes = previousSizeMap.sizes; + var assets = (webpackStats.stats || [webpackStats]) + .map((stats) => + stats + .toJson({ all: false, assets: true }) + .assets.filter((asset) => canReadAsset(asset.name)) + .map((asset) => { + var fileContents = fs.readFileSync(path.join(root, asset.name)); + var size = gzipSize(fileContents); + var previousSize = sizes[removeFileNameHash(root, asset.name)]; + var difference = getDifferenceLabel(size, previousSize); + return { + folder: path.join( + path.basename(buildFolder), + path.basename(root), + path.dirname(asset.name), + ), + name: path.basename(asset.name), + size: size, + sizeLabel: + filesize(size) + (difference ? ' (' + difference + ')' : ''), + }; + }), + ) + .reduce((single, all) => all.concat(single), []); + assets.sort((a, b) => b.size - a.size); + var longestSizeLabelLength = Math.max.apply( + null, + assets.map((a) => stripAnsi(a.sizeLabel).length), + ); + var suggestBundleSplitting = false; + assets.forEach((asset) => { + var sizeLabel = asset.sizeLabel; + var sizeLength = stripAnsi(sizeLabel).length; + if (sizeLength < longestSizeLabelLength) { + var rightPadding = ' '.repeat(longestSizeLabelLength - sizeLength); + sizeLabel += rightPadding; + } + var isMainBundle = asset.name.indexOf('main.') === 0; + var maxRecommendedSize = isMainBundle + ? maxBundleGzipSize + : maxChunkGzipSize; + var isLarge = maxRecommendedSize && asset.size > maxRecommendedSize; + if (isLarge && path.extname(asset.name) === '.js') { + suggestBundleSplitting = true; + } + console.log( + ' ' + + (isLarge ? chalk.yellow(sizeLabel) : sizeLabel) + + ' ' + + chalk.dim( + asset.folder + (/[\/\\]$/.test(asset.folder) ? '' : path.sep), + ) + + chalk.cyan(asset.name), + ); + }); + if (suggestBundleSplitting) { + console.log(); + console.log( + chalk.yellow('The bundle size is significantly larger than recommended.'), + ); + console.log( + chalk.yellow( + 'Consider reducing it with code splitting: https://goo.gl/9VhYWB', + ), + ); + console.log( + chalk.yellow( + 'You can also analyze the project dependencies: https://goo.gl/LeUzfb', + ), + ); + } +} + +function removeFileNameHash(buildFolder, fileName) { + return fileName + .replace(buildFolder, '') + .replace(/\\/g, '/') + .replace( + /\/?(.*)(\.[0-9a-f]+)(\.chunk)?(\.js|\.css)/, + (match, p1, p2, p3, p4) => p1 + p4, + ); +} + +// Input: 1024, 2048 +// Output: "(+1 KB)" +function getDifferenceLabel(currentSize, previousSize) { + var FIFTY_KILOBYTES = 1024 * 50; + var difference = currentSize - previousSize; + var fileSize = !Number.isNaN(difference) ? filesize(difference) : 0; + if (difference >= FIFTY_KILOBYTES) { + return chalk.red('+' + fileSize); + } else if (difference < FIFTY_KILOBYTES && difference > 0) { + return chalk.yellow('+' + fileSize); + } else if (difference < 0) { + return chalk.green(fileSize); + } else { + return ''; + } +} + +function measureFileSizesBeforeBuild(buildFolder) { + return new Promise((resolve) => { + recursive(buildFolder, (err, fileNames) => { + var sizes; + if (!err && fileNames) { + sizes = fileNames.filter(canReadAsset).reduce((memo, fileName) => { + var contents = fs.readFileSync(fileName); + var key = removeFileNameHash(buildFolder, fileName); + memo[key] = gzipSize(contents); + return memo; + }, {}); + } + resolve({ + root: buildFolder, + sizes: sizes || {}, + }); + }); + }); +} + +function removeFilePrefix(buildFolder, fileName) { + return fileName.replace(buildFolder, '').replace(/\\/g, '/'); +} + +function getFileNamesAsStat(buildFolder) { + return new Promise((resolve) => { + recursive(buildFolder, (err, fileNames) => { + var filteredFileNames; + if (!err && fileNames) { + filteredFileNames = fileNames + .filter(canReadAsset) + .map((fileName) => removeFilePrefix(buildFolder, fileName)); + } + resolve({ + toJson: () => ({ + assets: filteredFileNames.map((name) => ({ name: name })), + }), + }); + }); + }); +} + +module.exports = { + measureFileSizesBeforeBuild: measureFileSizesBeforeBuild, + printFileSizesAfterBuild: printFileSizesAfterBuild, + getFileNamesAsStat: getFileNamesAsStat, +}; diff --git a/packages/volto-razzle-dev-utils/FriendlyErrorsPlugin.js b/packages/volto-razzle-dev-utils/FriendlyErrorsPlugin.js new file mode 100644 index 00000000000..b13d253f6e2 --- /dev/null +++ b/packages/volto-razzle-dev-utils/FriendlyErrorsPlugin.js @@ -0,0 +1,82 @@ +'use strict'; + +const chalk = require('chalk'); +const clearConsole = require('react-dev-utils/clearConsole'); +const formatWebpackMessages = require('react-dev-utils/formatWebpackMessages'); +const logger = require('./logger'); + +let WEBPACK_COMPILING = false; +let WEBPACK_DONE = false; + +// This is a custom Webpack Plugin that prints out prettier console messages +// and errors depending on webpack compiler events. It runs on the Node.js +// server webpack instance. +class WebpackErrorsPlugin { + constructor(options) { + options = options || {}; + this.verbose = options.verbose; + this.onSuccessMessage = options.onSuccessMessage; + this.target = options.target === 'web' ? 'CLIENT' : 'SERVER'; + } + + apply(compiler) { + compiler.plugin('done', (stats) => { + const rawMessages = stats.toJson({}, true); + const messages = formatWebpackMessages(rawMessages); + WEBPACK_COMPILING = false; + if (!messages.errors.length && !messages.warnings.length) { + if (!WEBPACK_DONE) { + if (!this.verbose) { + clearConsole(); + } + logger.done('Compiled successfully'); + WEBPACK_DONE = true; + + if (this.onSuccessMessage) { + logger.log(this.onSuccessMessage); + logger.log(''); + } + } + } + + if ( + messages.errors.length && + !( + rawMessages.errors && + rawMessages.errors.length > 0 && + (rawMessages.errors[0].includes('assets.json') || + rawMessages.errors[0].includes('chunks.json') || + rawMessages.errors[0].includes("Module not found: Can't resolve")) + ) + ) { + messages.errors.forEach((e) => { + logger.error( + `Failed to compile ${this.target} with ${messages.errors.length} errors`, + e, + ); + }); + // return; + } + + if (messages.warnings.length) { + logger.warn( + `Failed to compile with ${messages.warnings.length} warnings`, + ); + messages.warnings.forEach((w) => logger.log(w)); + } + }); + + compiler.plugin('invalid', (params) => { + WEBPACK_DONE = false; + if (!WEBPACK_COMPILING) { + if (!this.verbose) { + clearConsole(); + } + logger.start('Compiling...'); + WEBPACK_COMPILING = true; + } + }); + } +} + +module.exports = WebpackErrorsPlugin; diff --git a/packages/volto-razzle-dev-utils/README.md b/packages/volto-razzle-dev-utils/README.md new file mode 100644 index 00000000000..69e1899d751 --- /dev/null +++ b/packages/volto-razzle-dev-utils/README.md @@ -0,0 +1,89 @@ +> [!IMPORTANT] +> This package is a maintained fork of the original [razzle-dev-utils](https://github.com/jaredpalmer/razzle/tree/master/packages/razzle-dev-utils). +> The upstream project is currently unmaintained, so we forked it into the Volto monorepo to keep its dependencies updated and address security issues. +> All upstream attributions are preserved below. + +# @plone/razzle-dev-utils + +This package includes some utilities used by [Razzle](https://github.com/jaredpalmer/razzle) + +## Usage in Razzle Projects + +These utilities come by default with Razzle, which includes it by default. **You don’t need to install it separately in Razzle projects.** + +## Usage Outside of Razzle + +If you don’t use Razzle, you may keep using these utilities. Their development will be aligned with Razzle, so major versions of these utilities may come out relatively often. Feel free to fork or copy and paste them into your projects if you’d like to have more control over them, or feel free to use the old versions. + +### Entry Points + +There is no single entry point. You can only import individual top-level modules. + +#### `logger` + +- `logger.log(thing: any): void`: Log to console. = `console.log` +- `logger.start(text: string): void`: Log the start of a task to console +- `logger.done(text: string): void`: Log the end of task to console +- `logger.info(text: string, data: object): void`: Log information and data to console +- `logger.debug(text: string, data: object): void`: Log debug message and data to console +- `logger.warn(text: string, data: object): void`: Log a warning with message and data to console +- `logger.error(text: string, err: object): void`: Log a message and an error to console + +#### `new FriendlyErrorsWebpackPlugin({ verbose: boolean, onSuccessMessage: string, target: 'web' | 'server' })` + +This will pretty print webpack errors to your console. It is mean to be used with Razzle's double webpack setup, where you have two webpack instances running in parallel. Otherwise the output looks almost identical to `create-react-app's` as it uses the same error formatter under the hood. + +```js +const FriendlyErrorsPlugin = require('@plone/razzle-dev-utils/FriendlyErrorsPlugin'); + +module.exports = { + // ... + plugins: [ + new FriendlyErrorsPlugin({ + verbose: false, + target: 'web', + onSuccessMessage: `Your application is running at http://${process.env.HOST}:${process.env.PORT}`, + }), + // ... + ], + // ... +} +``` + +#### `printErrors(summary: string, errors: Error[])` + +Pretty print an array of errors with a message. Good for CI's. + +```js +const printErrors = require('@plone/razzle-dev-utils/printErrors'); + +try { + // do something +} catch (e) { + printErrors('Failed to compile.', [e]); +} +``` + +`makeLoaderFinder(loaderName: string): (rule: WebPackRule) => boolean;` + +Helper function to find a loader in the webpack config object. Used for writing Razzle Plugins, or razzle modify functions. + +Example: + +```js +// razzle.config.js +const loaderFinder = require('@plone/razzle-dev-utils/makeLoaderFinder'); + +module.exports = { + modify(config) { + // Makes a finder function, to search for babel-loader + const babelLoaderFinder = makeLoaderFinder('babel-loader'); + + // Finds the JS rule containing babel-loader using our function + const jsRule = config.module.rules.find(babelLoaderFinder); + + // Set cacheDirectory to true in our babel-loader + jsRule.use.find(babelLoaderFinder).options.cacheDirectory = true; + }, +}; +``` diff --git a/packages/volto-razzle-dev-utils/WebpackConfigHelpers.js b/packages/volto-razzle-dev-utils/WebpackConfigHelpers.js new file mode 100644 index 00000000000..6fcdc221300 --- /dev/null +++ b/packages/volto-razzle-dev-utils/WebpackConfigHelpers.js @@ -0,0 +1,193 @@ +'use strict'; + +const path = require('path'); + +/** + * WebpackConfigHelpers + * + * @class WebpackConfigHelpers + */ +class WebpackConfigHelpers { + constructor(cwd) { + this._cwd = cwd; + } + + /** + * Returns wrapper around all loaders from config. + * + * @param {object} config - [webpack config](https://webpack.js.org/configuration/#options). + * @returns {LoaderWrapper[]} + * + * @memberof WebpackConfigHelpers + */ + getLoaders(config) { + return this.getRules(config).map(({ rule, index }) => ({ + rule: rule, + ruleIndex: index, + loaders: rule.loaders || rule.use || rule.loader, + })); + } + + /** + * Returns wrapper around all rules from config. + * + * @param {object} config - [webpack config](https://webpack.js.org/configuration/#options). + * @returns {RuleWrapper[]} + * + * @memberof WebpackConfigHelpers + */ + getRules(config) { + return [ + ...(config.module.loaders || []), + ...(config.module.rules || []), + ].map((rule, index) => ({ index, rule })); + } + + /** + * Returns wrapper around all plugins from config. + * + * @param {object} config - [webpack config](https://webpack.js.org/configuration/#options). + * @returns {PluginWrapper[]} + * + * @memberof WebpackConfigHelpers + */ + getPlugins(config) { + return (config.plugins || []).map((plugin, index) => ({ index, plugin })); + } + + /** + * + * + * @param {object} config - [webpack config](https://webpack.js.org/configuration/#options). + * @param {string} file - path to test against loader. Resolved relatively to $PWD. + * @returns {RuleWrapper[]} + * + * @memberof WebpackConfigHelpers + */ + getRulesByMatchingFile(config, file) { + let filePath = path.resolve(this._cwd, file); + return this.getRules(config).filter( + (w) => w.rule.test && w.rule.test.exec(filePath), + ); + } + + /** + * Returns loaders that match provided name. + * + * @example + * helpers.getLoadersByName(config, 'less-loader') + * @param {object} config - [webpack config](https://webpack.js.org/configuration/#options). + * @param {string} name - name of loader. + * @returns {LoaderWrapper[]} + * + * @memberof WebpackConfigHelpers + */ + getLoadersByName(config, name) { + return this.getLoaders(config) + .map(({ rule, ruleIndex, loaders }) => + Array.isArray(loaders) + ? loaders.map((loader, loaderIndex) => ({ + rule, + ruleIndex, + loader, + loaderIndex, + })) + : [{ rule, ruleIndex, loader: loaders, loaderIndex: -1 }], + ) + .reduce((arr, loaders) => arr.concat(loaders), []) + .filter( + ({ loader }) => loader === name || (loader && loader.loader === name), + ); + } + + /** + * Returns plugins that match provided name. + * + * @example + * helpers.getPluginsByName(config, 'HtmlWebpackPlugin') + * @param {object} config - [webpack config](https://webpack.js.org/configuration/#options). + * @param {string} name - name of loader. + * @returns {PluginWrapper[]} + * + * @memberof WebpackConfigHelpers + */ + getPluginsByName(config, name) { + return this.getPlugins(config).filter( + (w) => + w.plugin && w.plugin.constructor && w.plugin.constructor.name === name, + ); + } + + /** + * Returns plugins that match provided type. + * + * @example + * helpers.getPluginsByType(config, webpack.optimize.CommonsChunkPlugin) + * @param {object} config - [webpack config](https://webpack.js.org/configuration/#options). + * @param {any} type - type of plugin. + * @returns {PluginWrapper[]} + * + * @memberof WebpackConfigHelpers + */ + getPluginsByType(config, type) { + return this.getPlugins(config).filter((w) => w.plugin instanceof type); + } + + getResolveExtensions(config) { + return config.resolve.extensions; + } + + addResolveExtensions(config, ext) { + return config.resolve.extensions.concat(ext); + } + + makeLoaderFinder(loaderName) { + return function findLoader(rule) { + // i.e.: /eslint-loader/ + const loaderRegex = new RegExp(`[/\\\\]${loaderName}[/\\\\]`); + + // Checks if there's a loader string in rule.loader matching loaderRegex. + const inLoaderString = + typeof rule.loader === 'string' && rule.loader.match(loaderRegex); + + // Checks if there is an object inside rule.use with loader matching loaderRegex, OR + const inUseArray = + Array.isArray(rule.use) && + rule.use.find( + (loader) => + typeof loader.loader === 'string' && + loader.loader.match(loaderRegex), + ); + + return inUseArray || inLoaderString; + }; + } +} + +/** + * Wrapper around webpack's [loader entry](https://webpack.js.org/configuration/module/#useentry). + * + * @typedef {object} LoaderWrapper + * @property {object} rule - [rule entry](https://webpack.js.org/configuration/module/#module-rules). + * @property {number} ruleIndex - index of rule in config. + * @property {object} loader - [loader entry](https://webpack.js.org/configuration/module/#useentry). + * @property {number} loaderIndex - index of loader in rule. + */ + +/** + * Wrapper around webpack's [rule](https://webpack.js.org/configuration/module/#module-rules). + * + * @typedef {object} RuleWrapper + * @property {object} rule - [rule entry](https://webpack.js.org/configuration/module/#module-rules). + * @property {number} index - index of rule in config. + */ + +/** + * Wrapper around webpack's [plugin](https://webpack.js.org/configuration/plugins/#plugins). + * + * @typedef {object} PluginWrapper + * @property {object} plugin - [plugin entry](https://webpack.js.org/configuration/plugins/#plugins). + * @property {number} index - index of plugin in config. + */ + +module.exports = WebpackConfigHelpers; diff --git a/packages/volto-razzle-dev-utils/devServerMajor.js b/packages/volto-razzle-dev-utils/devServerMajor.js new file mode 100644 index 00000000000..52e087f05ba --- /dev/null +++ b/packages/volto-razzle-dev-utils/devServerMajor.js @@ -0,0 +1,5 @@ +'use strict'; + +const devserverPkg = require('webpack-dev-server/package.json'); + +module.exports = devserverPkg.version ? parseInt(devserverPkg.version[0]) : 3; diff --git a/packages/volto-razzle-dev-utils/formatWebpackMessages.js b/packages/volto-razzle-dev-utils/formatWebpackMessages.js new file mode 100644 index 00000000000..8283e621c7b --- /dev/null +++ b/packages/volto-razzle-dev-utils/formatWebpackMessages.js @@ -0,0 +1,22 @@ +'use strict'; + +const formatWebpackMessages = require('react-dev-utils/formatWebpackMessages'); + +function razzleFormatWebpackMessages(messages) { + return process.env.WEBPACK_VERSION === 5 + ? formatWebpackMessages( + ['errors', 'warnings'].reduce( + function (result, item) { + result[item] = result[item].concat( + messages[item].map(function (stat) { + return stat.message; + }), + ); + return result; + }, + { errors: [], warnings: [] }, + ), + ) + : formatWebpackMessages(messages); +} +module.exports = razzleFormatWebpackMessages; diff --git a/packages/volto-razzle-dev-utils/logger.js b/packages/volto-razzle-dev-utils/logger.js new file mode 100644 index 00000000000..76e69b1ab18 --- /dev/null +++ b/packages/volto-razzle-dev-utils/logger.js @@ -0,0 +1,107 @@ +'use strict'; + +const chalk = require('chalk'); + +const logTypes = { + warn: { + bg: 'bgYellow', + msg: ' WARNING ', + text: 'yellow', + }, + debug: { + bg: 'bgMagenta', + msg: ' DEBUG ', + text: 'magenta', + }, + info: { + bg: 'bgCyan', + msg: ' INFO ', + text: 'cyan', + }, + error: { + bg: 'bgRed', + msg: ' ERROR ', + text: 'red', + }, + start: { + bg: 'bgBlue', + msg: ' WAIT ', + text: 'blue', + }, + done: { + bg: 'bgGreen', + msg: ' DONE ', + text: 'green', + }, +}; + +const write = (type, text, verbose) => { + let textToLog = ''; + let logObject = false; + + const logType = logTypes[type]; + + textToLog += + chalk[logType.bg].black(logType.msg) + ' ' + chalk[logType.text](text); + + // Adds optional verbose output + if (verbose) { + if (typeof verbose === 'object') { + logObject = true; + } else { + textToLog += `\n\n${verbose}`; + } + } + + console.log(textToLog); + if (['start', 'done', 'error'].indexOf(type) > -1) { + console.log(); + } + + if (logObject) console.dir(verbose, { depth: 15 }); +}; + +// Printing any statements +const log = (text = '') => console.log(text); + +// Starting a process +const start = (text) => { + write('start', text); +}; + +// Ending a process +const done = (text) => { + write('done', text); +}; + +// Info about a process task +const info = (text) => { + write('info', text); +}; + +// Verbose output +// takes optional data +const debug = (text, data) => { + write('debug', text, data); +}; + +// Warn output +const warn = (text, data) => { + write('warn', text, data); +}; + +// Error output +// takes an optional error +const error = (text, err) => { + write('error', text, err); +}; + +module.exports = { + log, + info, + debug, + warn, + error, + start, + done, +}; diff --git a/packages/volto-razzle-dev-utils/makeLoaderFinder.js b/packages/volto-razzle-dev-utils/makeLoaderFinder.js new file mode 100644 index 00000000000..faa1d355a3d --- /dev/null +++ b/packages/volto-razzle-dev-utils/makeLoaderFinder.js @@ -0,0 +1,28 @@ +'use strict'; + +const makeLoaderFinder = (loaderName) => (rule) => { + // i.e.: /eslint-loader/ + const loaderRegex = new RegExp(`[/\\\\]${loaderName}[/\\\\]`); + + // Checks if there's a loader string in rule.loader matching loaderRegex. + const inLoaderString = + typeof rule.loader === 'string' && + (rule.loader.match(loaderRegex) || rule.loader === loaderName); + + // Checks if there is an object inside rule.use with loader matching loaderRegex, OR + // Checks another condition, if rule is not an object, but pure string (ex: "style-loader", etc) + const inUseArray = + Array.isArray(rule.use) && + rule.use.find( + (loader) => + (typeof loader.loader === 'string' && + loader.loader.match(loaderRegex)) || + rule.loader === loaderName || + (typeof loader === 'string' && + (loader.match(loaderRegex) || loader === loaderName)), + ); + + return inUseArray || inLoaderString; +}; + +module.exports = makeLoaderFinder; diff --git a/packages/volto-razzle-dev-utils/news/.gitkeep b/packages/volto-razzle-dev-utils/news/.gitkeep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/packages/volto-razzle-dev-utils/news/7973.internal b/packages/volto-razzle-dev-utils/news/7973.internal new file mode 100644 index 00000000000..3a4434c2935 --- /dev/null +++ b/packages/volto-razzle-dev-utils/news/7973.internal @@ -0,0 +1 @@ +Initial release of `@plone/razzle-dev-utils`, a maintained fork of the original `razzle-dev-utils`. See the package README for background and usage details. @wesleybl diff --git a/packages/volto-razzle-dev-utils/package.json b/packages/volto-razzle-dev-utils/package.json new file mode 100644 index 00000000000..f59d805111c --- /dev/null +++ b/packages/volto-razzle-dev-utils/package.json @@ -0,0 +1,53 @@ +{ + "name": "@plone/razzle-dev-utils", + "version": "1.0.0-alpha.0", + "description": "A Volto fork of razzle-dev-utils - Utilities and helpers for Razzle", + "author": "Jared Palmer ", + "repository": { + "type": "git", + "url": "https://github.com/plone/volto.git", + "directory": "packages/volto-razzle-dev-utils" + }, + "license": "MIT", + "files": [ + "logger.js", + "printErrors.js", + "printWarnings.js", + "FriendlyErrorsPlugin.js", + "FileSizeReporter.js", + "webpackHotDevClient.js", + "webpackHotDevClientV4.js", + "setPorts.js", + "makeLoaderFinder.js", + "WebpackConfigHelpers.js", + "prettyNodeErrors.js", + "resolveRequest.js", + "webpackMajor.js", + "formatWebpackMessages.js", + "devServerMajor.js" + ], + "dependencies": { + "@babel/code-frame": "^7.8.3", + "chalk": "^4.1.0", + "filesize": "^6.1.0", + "gzip-size": "^6.0.0", + "jest-message-util": "^26.3.0", + "react-dev-utils": "^11.0.4", + "release-it": "^19.0.4", + "react-error-overlay": "^6.0.7", + "recursive-readdir": "^2.2.2", + "resolve": "^1.17.0", + "sockjs-client": "~1.4.0", + "strip-ansi": "^6.0.0" + }, + "peerDependencies": { + "webpack": "~4||~5", + "webpack-dev-server": "~3||~4" + }, + "scripts": { + "dry-release": "release-it --dry-run", + "release": "release-it", + "release-major-alpha": "release-it major --preRelease=alpha", + "release-alpha": "release-it --preRelease=alpha" + } +} diff --git a/packages/volto-razzle-dev-utils/prettyNodeErrors.js b/packages/volto-razzle-dev-utils/prettyNodeErrors.js new file mode 100644 index 00000000000..e46bcbf7c8c --- /dev/null +++ b/packages/volto-razzle-dev-utils/prettyNodeErrors.js @@ -0,0 +1,51 @@ +const fs = require('fs'); +const { + getTopFrame, + getStackTraceLines, + separateMessageFromStack, +} = require('jest-message-util'); +const { codeFrameColumns } = require('@babel/code-frame'); + +function pretty(error) { + const { message, stack } = error; + const lines = getStackTraceLines(stack); + const topFrame = getTopFrame(lines); + const fallback = `${message}${stack}`; + + if (!topFrame) { + return fallback; + } + + const { file, line } = topFrame; + try { + const result = codeFrameColumns( + fs.readFileSync(file, 'utf8'), + { start: { line } }, + { highlightCode: true }, + ); + return `\n${message}\n\n${result}\n${stack}\n`; + } catch (error) { + return fallback; + } +} + +function usePrettyErrors(transform) { + const { prepareStackTrace } = Error; + + Error.prepareStackTrace = (error, trace) => { + const prepared = prepareStackTrace + ? separateMessageFromStack(prepareStackTrace(error, trace)) + : error; + const transformed = transform ? transform(prepared) : prepared; + return pretty(transformed); + }; +} + +// Clean up Webpack's sourcemap namespacing in error stacks +// @see https://github.com/facebook/create-react-app/blob/next/packages/react-dev-utils/formatWebpackMessages.js#L112 +const stackTransform = ({ stack = '', ...rest }) => ({ + stack: stack.replace('/build/webpack:', ''), + ...rest, +}); + +usePrettyErrors(stackTransform); diff --git a/packages/volto-razzle-dev-utils/printErrors.js b/packages/volto-razzle-dev-utils/printErrors.js new file mode 100644 index 00000000000..00cf2c703a4 --- /dev/null +++ b/packages/volto-razzle-dev-utils/printErrors.js @@ -0,0 +1,32 @@ +'use strict'; + +const webpackMajor = require('./webpackMajor'); +const chalk = require('chalk'); + +/** + * Print an array of errors to console. + * + * @param {string} summary Summary of error + * @param {Array} errors Array of Errors + */ +function printErrors(summary, errors, verbose) { + console.log(chalk.red(summary)); + console.log(); + errors.forEach((err) => { + if (webpackMajor < 5) { + // webpack 4 format + console.error(err); + } else { + if (err.message) { + console.error(err.message); + } + console.error(err.stack || err); + if (err.details) { + console.error(err.details); + } + } + console.log(); + }); +} + +module.exports = printErrors; diff --git a/packages/volto-razzle-dev-utils/printWarnings.js b/packages/volto-razzle-dev-utils/printWarnings.js new file mode 100644 index 00000000000..a3034f5d63a --- /dev/null +++ b/packages/volto-razzle-dev-utils/printWarnings.js @@ -0,0 +1,34 @@ +'use strict'; + +const webpackMajor = require('./webpackMajor'); +const chalk = require('chalk'); + +/** + * Print an array of warnings to console. + * + * @param {string} summary Summary of error + * @param {Array} warnings Array of Warningss + */ +function printWarnings(summary, warnings, verbose) { + console.log(chalk.yellow(summary)); + console.log(); + warnings.forEach((wrn) => { + if (webpackMajor < 5) { + // webpack 4 + console.warn(wrn); + } else { + if (wrn.message) { + console.warn(wrn.message); + } + if (verbose) { + console.warn(wrn.stack || wrn); + } + if (wrn.details) { + console.warn(wrn.details); + } + } + console.log(); + }); +} + +module.exports = printWarnings; diff --git a/packages/volto-razzle-dev-utils/resolveRequest.js b/packages/volto-razzle-dev-utils/resolveRequest.js new file mode 100644 index 00000000000..74e9ca336ca --- /dev/null +++ b/packages/volto-razzle-dev-utils/resolveRequest.js @@ -0,0 +1,12 @@ +const resolve = require('resolve'); +const path = require('path'); + +function resolveRequest(req, issuer) { + const basedir = + issuer.endsWith(path.posix.sep) || issuer.endsWith(path.win32.sep) + ? issuer + : path.dirname(issuer); + return resolve.sync(req, { basedir }); +} + +module.exports = resolveRequest; diff --git a/packages/volto-razzle-dev-utils/setPorts.js b/packages/volto-razzle-dev-utils/setPorts.js new file mode 100644 index 00000000000..4e1c765be5f --- /dev/null +++ b/packages/volto-razzle-dev-utils/setPorts.js @@ -0,0 +1,20 @@ +const { choosePort } = require('react-dev-utils/WebpackDevServerUtils'); + +// Checks if PORT and PORT_DEV are available and suggests alternatives if not +module.exports = (clientOnly) => { + return new Promise(async (resolve) => { + const port = (process.env.PORT && parseInt(process.env.PORT, 10)) || 3000; + const portDev = + (process.env.PORT_DEV && parseInt(process.env.PORT_DEV, 10)) || + (clientOnly && port) || + port + 1; + + const actualPort = await choosePort(process.env.HOST, port); + const actualPortDev = await choosePort(process.env.HOST, portDev); + + process.env.PORT = actualPort; + process.env.PORT_DEV = actualPortDev; + + resolve(); + }); +}; diff --git a/packages/volto-razzle-dev-utils/towncrier.toml b/packages/volto-razzle-dev-utils/towncrier.toml new file mode 100644 index 00000000000..3ef721f3785 --- /dev/null +++ b/packages/volto-razzle-dev-utils/towncrier.toml @@ -0,0 +1,33 @@ +[tool.towncrier] +filename = "CHANGELOG.md" +directory = "news/" +title_format = "## {version} ({project_date})" +underlines = ["", "", ""] +template = "../scripts/templates/towncrier_template.jinja" +start_string = "\n" +issue_format = "[#{issue}](https://github.com/plone/volto/issues/{issue})" + +[[tool.towncrier.type]] +directory = "breaking" +name = "Breaking" +showcontent = true + +[[tool.towncrier.type]] +directory = "feature" +name = "Feature" +showcontent = true + +[[tool.towncrier.type]] +directory = "bugfix" +name = "Bugfix" +showcontent = true + +[[tool.towncrier.type]] +directory = "internal" +name = "Internal" +showcontent = true + +[[tool.towncrier.type]] +directory = "documentation" +name = "Documentation" +showcontent = true diff --git a/packages/volto-razzle-dev-utils/webpackHotDevClient.js b/packages/volto-razzle-dev-utils/webpackHotDevClient.js new file mode 100644 index 00000000000..e580e4efc14 --- /dev/null +++ b/packages/volto-razzle-dev-utils/webpackHotDevClient.js @@ -0,0 +1,290 @@ +'use strict'; + +// This alternative WebpackDevServer combines the functionality of: +// https://github.com/webpack/webpack-dev-server/blob/webpack-1/client/index.js +// https://github.com/webpack/webpack/blob/webpack-1/hot/dev-server.js + +// It only supports their simplest configuration (hot updates on same server). +// It makes some opinionated choices on top, like adding a syntax error overlay +// that looks similar to our console output. The error overlay is inspired by: +// https://github.com/glenjamin/webpack-hot-middleware + +// HACK ALERT: Most of this file is identical to the webpackHotDevClientV4.js file with the exception of the code blocks +// denoted with //--- START Unique code --- and //--- END Unique code +// This was done to avoid getting a warning about the `createSocketURL` vs `createSocketUrl` file names +// You must keep the code in these two files in sync + +var SockJS = require('sockjs-client'); +var stripAnsi = require('strip-ansi'); +var url = require('url'); +var launchEditorEndpoint = require('react-dev-utils/launchEditorEndpoint'); +var formatWebpackMessages = require('./formatWebpackMessages'); +var ErrorOverlay = require('react-error-overlay'); + +//--- START Unique code --- +// This code is unique to webpack-dev-server v3 +var createSocketUrl = require('webpack-dev-server/client/utils/createSocketUrl'); +var socketUrl = createSocketUrl(); +//--- END Unique code --- + +var parsedSocketUrl = url.parse(socketUrl); + +ErrorOverlay.setEditorHandler(function editorHandler(errorLocation) { + // Keep this sync with errorOverlayMiddleware.js + fetch( + url.format({ + protocol: parsedSocketUrl.protocol, + hostname: parsedSocketUrl.hostname, + port: parsedSocketUrl.port, + pathname: launchEditorEndpoint, + search: + '?fileName=' + + window.encodeURIComponent(errorLocation.fileName) + + '&lineNumber=' + + window.encodeURIComponent(errorLocation.lineNumber || 1) + + '&colNumber=' + + window.encodeURIComponent(errorLocation.colNumber || 1), + }), + { mode: 'no-cors' }, + ); +}); + +// We need to keep track of if there has been a runtime error. +// Essentially, we cannot guarantee application state was not corrupted by the +// runtime error. To prevent confusing behavior, we forcibly reload the entire +// application. This is handled below when we are notified of a compile (code +// change). +// See https://github.com/facebookincubator/create-react-app/issues/3096 +var hadRuntimeError = false; +ErrorOverlay.startReportingRuntimeErrors({ + onError: function () { + hadRuntimeError = true; + }, + filename: process.env.REACT_BUNDLE_PATH || '/static/js/bundle.js', +}); + +if (module.hot && typeof module.hot.dispose === 'function') { + module.hot.dispose(function () { + // TODO: why do we need this? + ErrorOverlay.stopReportingRuntimeErrors(); + }); +} + +//--- START Unique code --- +// This code is unique to webpack-dev-server v3 +var connection = new SockJS(socketUrl); +//--- END Unique code --- + +// Unlike WebpackDevServer client, we won't try to reconnect +// to avoid spamming the console. Disconnect usually happens +// when developer stops the server. +connection.onclose = function () { + if (typeof console !== 'undefined' && typeof console.info === 'function') { + console.info( + 'The development server has disconnected.\nRefresh the page if necessary.', + ); + } +}; + +// Remember some state related to hot module replacement. +var isFirstCompilation = true; +var mostRecentCompilationHash = null; +var hasCompileErrors = false; + +function clearOutdatedErrors() { + // Clean up outdated compile errors, if any. + if (typeof console !== 'undefined' && typeof console.clear === 'function') { + if (hasCompileErrors) { + console.clear(); + } + } +} + +// Successful compilation. +function handleSuccess() { + clearOutdatedErrors(); + + var isHotUpdate = !isFirstCompilation; + isFirstCompilation = false; + hasCompileErrors = false; + + // Attempt to apply hot updates or reload. + if (isHotUpdate) { + tryApplyUpdates(function onHotUpdateSuccess() { + // Only dismiss it when we're sure it's a hot update. + // Otherwise it would flicker right before the reload. + tryDismissErrorOverlay(); + }); + } +} + +// Compilation with warnings (e.g. ESLint). +function handleWarnings(warnings) { + clearOutdatedErrors(); + + var isHotUpdate = !isFirstCompilation; + isFirstCompilation = false; + hasCompileErrors = false; + + function printWarnings() { + // Print warnings to the console. + var formatted = formatWebpackMessages({ + warnings: warnings, + errors: [], + }); + + if (typeof console !== 'undefined' && typeof console.warn === 'function') { + for (var i = 0; i < formatted.warnings.length; i++) { + if (i === 5) { + console.warn( + 'There were more warnings in other files.\n' + + 'You can find a complete log in the terminal.', + ); + break; + } + console.warn(stripAnsi(formatted.warnings[i])); + } + } + } + + // Attempt to apply hot updates or reload. + if (isHotUpdate) { + tryApplyUpdates(function onSuccessfulHotUpdate() { + // Only print warnings if we aren't refreshing the page. + // Otherwise they'll disappear right away anyway. + printWarnings(); + // Only dismiss it when we're sure it's a hot update. + // Otherwise it would flicker right before the reload. + tryDismissErrorOverlay(); + }); + } else { + // Print initial warnings immediately. + printWarnings(); + } +} + +// Compilation with errors (e.g. syntax error or missing modules). +function handleErrors(errors) { + clearOutdatedErrors(); + + isFirstCompilation = false; + hasCompileErrors = true; + + // "Massage" webpack messages. + var formatted = formatWebpackMessages({ + errors: errors, + warnings: [], + }); + + // Only show the first error. + ErrorOverlay.reportBuildError(formatted.errors[0]); + + // Also log them to the console. + if (typeof console !== 'undefined' && typeof console.error === 'function') { + for (var i = 0; i < formatted.errors.length; i++) { + console.error(stripAnsi(formatted.errors[i])); + } + } + + // Do not attempt to reload now. + // We will reload on next success instead. +} + +function tryDismissErrorOverlay() { + if (!hasCompileErrors) { + ErrorOverlay.dismissBuildError(); + } +} + +// There is a newer version of the code available. +function handleAvailableHash(hash) { + // Update last known compilation hash. + mostRecentCompilationHash = hash; +} + +// Handle messages from the server. +connection.onmessage = function (e) { + var message = JSON.parse(e.data); + switch (message.type) { + case 'hash': + handleAvailableHash(message.data); + break; + case 'still-ok': + case 'ok': + handleSuccess(); + break; + case 'content-changed': + // Triggered when a file from `contentBase` changed. + window.location.reload(); + break; + case 'warnings': + handleWarnings(message.data); + break; + case 'errors': + handleErrors(message.data); + break; + default: + // Do nothing. + } +}; + +// Is there a newer version of this code available? +function isUpdateAvailable() { + /* globals __webpack_hash__ */ + // __webpack_hash__ is the hash of the current compilation. + // It's a global variable injected by Webpack. + return mostRecentCompilationHash !== __webpack_hash__; +} + +// Webpack disallows updates in other states. +function canApplyUpdates() { + return module.hot.status() === 'idle'; +} + +// Attempt to update code on the fly, fall back to a hard reload. +function tryApplyUpdates(onHotUpdateSuccess) { + if (!module.hot) { + // HotModuleReplacementPlugin is not in Webpack configuration. + window.location.reload(); + return; + } + + if (!isUpdateAvailable() || !canApplyUpdates()) { + return; + } + + function handleApplyUpdates(err, updatedModules) { + const hasReactRefresh = process.env.FAST_REFRESH; + const wantsForcedReload = err || !updatedModules || hadRuntimeError; + // React refresh can handle hot-reloading over errors. + if (!hasReactRefresh && wantsForcedReload) { + window.location.reload(); + return; + } + + if (typeof onHotUpdateSuccess === 'function') { + // Maybe we want to do something. + onHotUpdateSuccess(); + } + + if (isUpdateAvailable()) { + // While we were updating, there was a new update! Do it again. + tryApplyUpdates(); + } + } + + // https://webpack.github.io/docs/hot-module-replacement.html#check + var result = module.hot.check(/* autoApply */ true, handleApplyUpdates); + + // // Webpack 2 returns a Promise instead of invoking a callback + if (result && result.then) { + result.then( + function (updatedModules) { + handleApplyUpdates(null, updatedModules); + }, + function (err) { + handleApplyUpdates(err, null); + }, + ); + } +} diff --git a/packages/volto-razzle-dev-utils/webpackHotDevClientV4.js b/packages/volto-razzle-dev-utils/webpackHotDevClientV4.js new file mode 100644 index 00000000000..f9d20b6a5f4 --- /dev/null +++ b/packages/volto-razzle-dev-utils/webpackHotDevClientV4.js @@ -0,0 +1,293 @@ +'use strict'; + +// This alternative WebpackDevServer combines the functionality of: +// https://github.com/webpack/webpack-dev-server/blob/webpack-1/client/index.js +// https://github.com/webpack/webpack/blob/webpack-1/hot/dev-server.js + +// It only supports their simplest configuration (hot updates on same server). +// It makes some opinionated choices on top, like adding a syntax error overlay +// that looks similar to our console output. The error overlay is inspired by: +// https://github.com/glenjamin/webpack-hot-middleware + +// HACK ALERT: Most of this file is identical to the webpackHotDevClient.js file with the exception of the code blocks +// denoted with //--- START Unique code --- and //--- END Unique code +// This was done to avoid getting a warning about the `createSocketURL` vs `createSocketUrl` file names +// You must keep the code in these two files in sync + +var stripAnsi = require('strip-ansi'); +var url = require('url'); +var launchEditorEndpoint = require('react-dev-utils/launchEditorEndpoint'); +var formatWebpackMessages = require('./formatWebpackMessages'); +var ErrorOverlay = require('react-error-overlay'); + +//--- START Unique code --- +// This code is unique to webpack-dev-server v4 +// The single API changed to 2 APIs in v4, first you parse the URL, then you create the socket URL from the parsed data +// These APIs are accessible from the `default` context +var parseURL = require('webpack-dev-server/client/utils/parseURL').default; +var createSocketUrl = + require('webpack-dev-server/client/utils/createSocketURL').default; +var socketUrl = createSocketUrl(parseURL()); +//--- START Unique code --- + +var parsedSocketUrl = url.parse(socketUrl); + +ErrorOverlay.setEditorHandler(function editorHandler(errorLocation) { + // Keep this sync with errorOverlayMiddleware.js + fetch( + url.format({ + protocol: parsedSocketUrl.protocol, + hostname: parsedSocketUrl.hostname, + port: parsedSocketUrl.port, + pathname: launchEditorEndpoint, + search: + '?fileName=' + + window.encodeURIComponent(errorLocation.fileName) + + '&lineNumber=' + + window.encodeURIComponent(errorLocation.lineNumber || 1) + + '&colNumber=' + + window.encodeURIComponent(errorLocation.colNumber || 1), + }), + { mode: 'no-cors' }, + ); +}); + +// We need to keep track of if there has been a runtime error. +// Essentially, we cannot guarantee application state was not corrupted by the +// runtime error. To prevent confusing behavior, we forcibly reload the entire +// application. This is handled below when we are notified of a compile (code +// change). +// See https://github.com/facebookincubator/create-react-app/issues/3096 +var hadRuntimeError = false; +ErrorOverlay.startReportingRuntimeErrors({ + onError: function () { + hadRuntimeError = true; + }, + filename: process.env.REACT_BUNDLE_PATH || '/static/js/bundle.js', +}); + +if (module.hot && typeof module.hot.dispose === 'function') { + module.hot.dispose(function () { + // TODO: why do we need this? + ErrorOverlay.stopReportingRuntimeErrors(); + }); +} + +//--- START Unique code --- +// This code is unique to webpack-dev-server v4 +var connection = new WebSocket(socketUrl); +//--- END Unique code --- + +// Unlike WebpackDevServer client, we won't try to reconnect +// to avoid spamming the console. Disconnect usually happens +// when developer stops the server. +connection.onclose = function () { + if (typeof console !== 'undefined' && typeof console.info === 'function') { + console.info( + 'The development server has disconnected.\nRefresh the page if necessary.', + ); + } +}; + +// Remember some state related to hot module replacement. +var isFirstCompilation = true; +var mostRecentCompilationHash = null; +var hasCompileErrors = false; + +function clearOutdatedErrors() { + // Clean up outdated compile errors, if any. + if (typeof console !== 'undefined' && typeof console.clear === 'function') { + if (hasCompileErrors) { + console.clear(); + } + } +} + +// Successful compilation. +function handleSuccess() { + clearOutdatedErrors(); + + var isHotUpdate = !isFirstCompilation; + isFirstCompilation = false; + hasCompileErrors = false; + + // Attempt to apply hot updates or reload. + if (isHotUpdate) { + tryApplyUpdates(function onHotUpdateSuccess() { + // Only dismiss it when we're sure it's a hot update. + // Otherwise it would flicker right before the reload. + tryDismissErrorOverlay(); + }); + } +} + +// Compilation with warnings (e.g. ESLint). +function handleWarnings(warnings) { + clearOutdatedErrors(); + + var isHotUpdate = !isFirstCompilation; + isFirstCompilation = false; + hasCompileErrors = false; + + function printWarnings() { + // Print warnings to the console. + var formatted = formatWebpackMessages({ + warnings: warnings, + errors: [], + }); + + if (typeof console !== 'undefined' && typeof console.warn === 'function') { + for (var i = 0; i < formatted.warnings.length; i++) { + if (i === 5) { + console.warn( + 'There were more warnings in other files.\n' + + 'You can find a complete log in the terminal.', + ); + break; + } + console.warn(stripAnsi(formatted.warnings[i])); + } + } + } + + // Attempt to apply hot updates or reload. + if (isHotUpdate) { + tryApplyUpdates(function onSuccessfulHotUpdate() { + // Only print warnings if we aren't refreshing the page. + // Otherwise they'll disappear right away anyway. + printWarnings(); + // Only dismiss it when we're sure it's a hot update. + // Otherwise it would flicker right before the reload. + tryDismissErrorOverlay(); + }); + } else { + // Print initial warnings immediately. + printWarnings(); + } +} + +// Compilation with errors (e.g. syntax error or missing modules). +function handleErrors(errors) { + clearOutdatedErrors(); + + isFirstCompilation = false; + hasCompileErrors = true; + + // "Massage" webpack messages. + var formatted = formatWebpackMessages({ + errors: errors, + warnings: [], + }); + + // Only show the first error. + ErrorOverlay.reportBuildError(formatted.errors[0]); + + // Also log them to the console. + if (typeof console !== 'undefined' && typeof console.error === 'function') { + for (var i = 0; i < formatted.errors.length; i++) { + console.error(stripAnsi(formatted.errors[i])); + } + } + + // Do not attempt to reload now. + // We will reload on next success instead. +} + +function tryDismissErrorOverlay() { + if (!hasCompileErrors) { + ErrorOverlay.dismissBuildError(); + } +} + +// There is a newer version of the code available. +function handleAvailableHash(hash) { + // Update last known compilation hash. + mostRecentCompilationHash = hash; +} + +// Handle messages from the server. +connection.onmessage = function (e) { + var message = JSON.parse(e.data); + switch (message.type) { + case 'hash': + handleAvailableHash(message.data); + break; + case 'still-ok': + case 'ok': + handleSuccess(); + break; + case 'content-changed': + // Triggered when a file from `contentBase` changed. + window.location.reload(); + break; + case 'warnings': + handleWarnings(message.data); + break; + case 'errors': + handleErrors(message.data); + break; + default: + // Do nothing. + } +}; + +// Is there a newer version of this code available? +function isUpdateAvailable() { + /* globals __webpack_hash__ */ + // __webpack_hash__ is the hash of the current compilation. + // It's a global variable injected by Webpack. + return mostRecentCompilationHash !== __webpack_hash__; +} + +// Webpack disallows updates in other states. +function canApplyUpdates() { + return module.hot.status() === 'idle'; +} + +// Attempt to update code on the fly, fall back to a hard reload. +function tryApplyUpdates(onHotUpdateSuccess) { + if (!module.hot) { + // HotModuleReplacementPlugin is not in Webpack configuration. + window.location.reload(); + return; + } + + if (!isUpdateAvailable() || !canApplyUpdates()) { + return; + } + + function handleApplyUpdates(err, updatedModules) { + const hasReactRefresh = process.env.FAST_REFRESH; + const wantsForcedReload = err || !updatedModules || hadRuntimeError; + // React refresh can handle hot-reloading over errors. + if (!hasReactRefresh && wantsForcedReload) { + window.location.reload(); + return; + } + + if (typeof onHotUpdateSuccess === 'function') { + // Maybe we want to do something. + onHotUpdateSuccess(); + } + + if (isUpdateAvailable()) { + // While we were updating, there was a new update! Do it again. + tryApplyUpdates(); + } + } + + // https://webpack.github.io/docs/hot-module-replacement.html#check + var result = module.hot.check(/* autoApply */ true, handleApplyUpdates); + + // // Webpack 2 returns a Promise instead of invoking a callback + if (result && result.then) { + result.then( + function (updatedModules) { + handleApplyUpdates(null, updatedModules); + }, + function (err) { + handleApplyUpdates(err, null); + }, + ); + } +} diff --git a/packages/volto-razzle-dev-utils/webpackMajor.js b/packages/volto-razzle-dev-utils/webpackMajor.js new file mode 100644 index 00000000000..13024458cf7 --- /dev/null +++ b/packages/volto-razzle-dev-utils/webpackMajor.js @@ -0,0 +1,5 @@ +'use strict'; + +const webpack = require('webpack'); + +module.exports = webpack.version ? parseInt(webpack.version[0]) : 3; diff --git a/packages/volto-razzle/config/createConfigAsync.js b/packages/volto-razzle/config/createConfigAsync.js index a6c7296674e..eaee375d10b 100644 --- a/packages/volto-razzle/config/createConfigAsync.js +++ b/packages/volto-razzle/config/createConfigAsync.js @@ -19,12 +19,12 @@ const CopyPlugin = require('copy-webpack-plugin'); const PnpWebpackPlugin = require('pnp-webpack-plugin'); const modules = require('./modules'); const postcssLoadConfig = require('postcss-load-config'); -const resolveRequest = require('razzle-dev-utils/resolveRequest'); -const logger = require('razzle-dev-utils/logger'); +const resolveRequest = require('@plone/razzle-dev-utils/resolveRequest'); +const logger = require('@plone/razzle-dev-utils/logger'); const razzlePaths = require('./paths'); const getCacheIdentifier = require('react-dev-utils/getCacheIdentifier'); -const webpackMajor = require('razzle-dev-utils/webpackMajor'); -const devServerMajorVersion = require('razzle-dev-utils/devServerMajor'); +const webpackMajor = require('@plone/razzle-dev-utils/webpackMajor'); +const devServerMajorVersion = require('@plone/razzle-dev-utils/devServerMajor'); const hasPostCssConfigTest = () => { try { @@ -39,11 +39,11 @@ const hasPostCssConfig = hasPostCssConfigTest(); let webpackDevClientEntry; if (devServerMajorVersion > 3) { webpackDevClientEntry = require.resolve( - 'razzle-dev-utils/webpackHotDevClientV4', + '@plone/razzle-dev-utils/webpackHotDevClientV4', ); } else { webpackDevClientEntry = require.resolve( - 'razzle-dev-utils/webpackHotDevClient', + '@plone/razzle-dev-utils/webpackHotDevClient', ); } @@ -753,7 +753,7 @@ module.exports = ( // Pretty format server errors config.entry.server.unshift( - require.resolve('razzle-dev-utils/prettyNodeErrors'), + require.resolve('@plone/razzle-dev-utils/prettyNodeErrors'), ); config.plugins = [ diff --git a/packages/volto-razzle/config/createJestConfig.js b/packages/volto-razzle/config/createJestConfig.js index 781c4b07e49..3beb8211b5f 100644 --- a/packages/volto-razzle/config/createJestConfig.js +++ b/packages/volto-razzle/config/createJestConfig.js @@ -2,7 +2,7 @@ const fs = require('fs'); const clearConsole = require('react-dev-utils/clearConsole'); -const logger = require('razzle-dev-utils/logger'); +const logger = require('@plone/razzle-dev-utils/logger'); // first search for setupTests.ts file // if .ts file not exists then looks for setupTests.js diff --git a/packages/volto-razzle/config/loadRazzleConfig.js b/packages/volto-razzle/config/loadRazzleConfig.js index 0be85383ecc..ef044328c8b 100644 --- a/packages/volto-razzle/config/loadRazzleConfig.js +++ b/packages/volto-razzle/config/loadRazzleConfig.js @@ -1,7 +1,7 @@ const fs = require('fs-extra'); const merge = require('deepmerge'); const clearConsole = require('react-dev-utils/clearConsole'); -const logger = require('razzle-dev-utils/logger'); +const logger = require('@plone/razzle-dev-utils/logger'); const defaultPaths = require('./paths'); const defaultRazzleOptions = require('./defaultOptions'); diff --git a/packages/volto-razzle/config/modules.js b/packages/volto-razzle/config/modules.js index 865fad97379..a8972980ba6 100644 --- a/packages/volto-razzle/config/modules.js +++ b/packages/volto-razzle/config/modules.js @@ -3,7 +3,7 @@ const fs = require('fs'); const path = require('path'); const resolve = require('resolve'); -const logger = require('razzle-dev-utils/logger'); +const logger = require('@plone/razzle-dev-utils/logger'); function getAdditionalModulePaths(options = {}, paths) { const baseUrl = options.baseUrl; diff --git a/packages/volto-razzle/config/paths.js b/packages/volto-razzle/config/paths.js index 9a9fd10c582..c187b50057c 100644 --- a/packages/volto-razzle/config/paths.js +++ b/packages/volto-razzle/config/paths.js @@ -4,7 +4,7 @@ const path = require('path'); const fs = require('fs'); const url = require('url'); const clearConsole = require('react-dev-utils/clearConsole'); -const logger = require('razzle-dev-utils/logger'); +const logger = require('@plone/razzle-dev-utils/logger'); // Make sure any symlinks in the project folder are resolved: // https://github.com/facebookincubator/create-react-app/issues/637 diff --git a/packages/volto-razzle/news/7973.breaking b/packages/volto-razzle/news/7973.breaking new file mode 100644 index 00000000000..520b89d09a0 --- /dev/null +++ b/packages/volto-razzle/news/7973.breaking @@ -0,0 +1 @@ +Fork `razzle-dev-utils` into `@plone/razzle-dev-utils`. @wesleybl diff --git a/packages/volto-razzle/package.json b/packages/volto-razzle/package.json index c0eddb8471b..d35bc96ba1e 100644 --- a/packages/volto-razzle/package.json +++ b/packages/volto-razzle/package.json @@ -69,7 +69,7 @@ "@plone/babel-preset-razzle": "workspace:*", "html-webpack-plugin": "~4||~5", "mini-css-extract-plugin": "2.7.2", - "razzle-dev-utils": "4.2.18", + "@plone/razzle-dev-utils": "workspace:*", "webpack": "~4||~5", "webpack-dev-server": "^3.11.0||~4" }, diff --git a/packages/volto-razzle/scripts/build.js b/packages/volto-razzle/scripts/build.js index a0334f69b7f..a9275d8bd37 100755 --- a/packages/volto-razzle/scripts/build.js +++ b/packages/volto-razzle/scripts/build.js @@ -20,12 +20,12 @@ const inquirer = require('inquirer'); const chalk = require('chalk'); const createConfig = require('../config/createConfigAsync'); const loadRazzleConfig = require('../config/loadRazzleConfig'); -const printErrors = require('razzle-dev-utils/printErrors'); -const printWarnings = require('razzle-dev-utils/printWarnings'); +const printErrors = require('@plone/razzle-dev-utils/printErrors'); +const printWarnings = require('@plone/razzle-dev-utils/printWarnings'); const clearConsole = require('react-dev-utils/clearConsole'); -const logger = require('razzle-dev-utils/logger'); -const FileSizeReporter = require('razzle-dev-utils/FileSizeReporter'); -const formatWebpackMessages = require('razzle-dev-utils/formatWebpackMessages'); +const logger = require('@plone/razzle-dev-utils/logger'); +const FileSizeReporter = require('@plone/razzle-dev-utils/FileSizeReporter'); +const formatWebpackMessages = require('@plone/razzle-dev-utils/formatWebpackMessages'); const measureFileSizesBeforeBuild = FileSizeReporter.measureFileSizesBeforeBuild; const printFileSizesAfterBuild = FileSizeReporter.printFileSizesAfterBuild; diff --git a/packages/volto-razzle/scripts/export.js b/packages/volto-razzle/scripts/export.js index df3f1eca592..ce8bbc4aedd 100644 --- a/packages/volto-razzle/scripts/export.js +++ b/packages/volto-razzle/scripts/export.js @@ -11,8 +11,8 @@ const chalk = require('chalk'); const asyncPool = require('tiny-async-pool'); const loadRazzleConfig = require('../config/loadRazzleConfig'); const clearConsole = require('react-dev-utils/clearConsole'); -const logger = require('razzle-dev-utils/logger'); -const FileSizeReporter = require('razzle-dev-utils/FileSizeReporter'); +const logger = require('@plone/razzle-dev-utils/logger'); +const FileSizeReporter = require('@plone/razzle-dev-utils/FileSizeReporter'); const measureFileSizesBeforeBuild = FileSizeReporter.measureFileSizesBeforeBuild; const printFileSizesAfterBuild = FileSizeReporter.printFileSizesAfterBuild; diff --git a/packages/volto-razzle/scripts/start.js b/packages/volto-razzle/scripts/start.js index a6157c14927..bb5c2890add 100755 --- a/packages/volto-razzle/scripts/start.js +++ b/packages/volto-razzle/scripts/start.js @@ -8,13 +8,13 @@ const webpack = require('webpack'); const createConfig = require('../config/createConfigAsync'); const loadRazzleConfig = require('../config/loadRazzleConfig'); const devServer = require('../config/razzleDevServer'); -const printErrors = require('razzle-dev-utils/printErrors'); +const printErrors = require('@plone/razzle-dev-utils/printErrors'); const clearConsole = require('react-dev-utils/clearConsole'); -const logger = require('razzle-dev-utils/logger'); -const setPorts = require('razzle-dev-utils/setPorts'); +const logger = require('@plone/razzle-dev-utils/logger'); +const setPorts = require('@plone/razzle-dev-utils/setPorts'); const chalk = require('chalk'); const terminate = require('terminate'); -const devServerMajorVersion = require('razzle-dev-utils/devServerMajor'); +const devServerMajorVersion = require('@plone/razzle-dev-utils/devServerMajor'); let verbose = false; diff --git a/packages/volto-razzle/scripts/test.js b/packages/volto-razzle/scripts/test.js index d353ad79e53..fb2122162a2 100755 --- a/packages/volto-razzle/scripts/test.js +++ b/packages/volto-razzle/scripts/test.js @@ -41,7 +41,7 @@ const path = require('path'); const fs = require('fs-extra'); const defaultPaths = require('../config/paths'); const clearConsole = require('react-dev-utils/clearConsole'); -const logger = require('razzle-dev-utils/logger'); +const logger = require('@plone/razzle-dev-utils/logger'); // Makes the script crash on unhandled rejections instead of silently // ignoring them. In the future, promise rejections that are not handled will diff --git a/packages/volto/news/7973.breaking b/packages/volto/news/7973.breaking new file mode 100644 index 00000000000..520b89d09a0 --- /dev/null +++ b/packages/volto/news/7973.breaking @@ -0,0 +1 @@ +Fork `razzle-dev-utils` into `@plone/razzle-dev-utils`. @wesleybl diff --git a/packages/volto/package.json b/packages/volto/package.json index fc54644ce8f..cd5f85d7805 100644 --- a/packages/volto/package.json +++ b/packages/volto/package.json @@ -311,7 +311,7 @@ "postcss-loader": "7.0.2", "postcss-overrides": "3.1.4", "postcss-scss": "4.0.6", - "razzle-dev-utils": "4.2.18", + "@plone/razzle-dev-utils": "workspace:*", "react-docgen-typescript-plugin": "^1.0.5", "react-error-overlay": "6.0.9", "react-is": "^18.2.0", diff --git a/packages/volto/razzle.config.js b/packages/volto/razzle.config.js index 866c77ede99..164e844a6f2 100644 --- a/packages/volto/razzle.config.js +++ b/packages/volto/razzle.config.js @@ -1,6 +1,6 @@ /* eslint no-console: 0 */ const path = require('path'); -const makeLoaderFinder = require('razzle-dev-utils/makeLoaderFinder'); +const makeLoaderFinder = require('@plone/razzle-dev-utils/makeLoaderFinder'); const nodeExternals = require('webpack-node-externals'); const LoadablePlugin = require('@loadable/webpack-plugin'); const LodashModuleReplacementPlugin = require('lodash-webpack-plugin'); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 47c40f9653e..2c0cb01c47a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -85,10 +85,10 @@ importers: version: 9.0.8 '@vitejs/plugin-react': specifier: ^4.1.0 - version: 4.7.0(vite@6.4.1(@types/node@24.12.0)(jiti@2.6.1)(less@3.11.1)(lightningcss@1.31.1)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2)) + version: 4.7.0(vite@6.4.1(@types/node@24.12.0)(jiti@2.6.1)(less@3.11.1)(lightningcss@1.32.0)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2)) '@vitest/coverage-v8': specifier: ^1.3.1 - version: 1.6.1(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.12.0)(jiti@2.6.1)(jsdom@21.1.2)(less@3.11.1)(lightningcss@1.31.1)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2)) + version: 1.6.1(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.12.0)(jiti@2.6.1)(jsdom@21.1.2)(less@3.11.1)(lightningcss@1.32.0)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2)) jsdom: specifier: ^21.1.1 version: 21.1.2 @@ -106,7 +106,7 @@ importers: version: 9.0.1 vitest: specifier: 'catalog:' - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.12.0)(jiti@2.6.1)(jsdom@21.1.2)(less@3.11.1)(lightningcss@1.31.1)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.12.0)(jiti@2.6.1)(jsdom@21.1.2)(less@3.11.1)(lightningcss@1.32.0)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2) wait-on: specifier: ^7.2.0 version: 7.2.0(debug@4.3.4) @@ -167,10 +167,10 @@ importers: version: 8.1.0(@svgr/core@8.1.0(typescript@5.9.3))(typescript@5.9.3) '@tailwindcss/vite': specifier: ^4.1.4 - version: 4.2.1(vite@6.4.1(@types/node@24.12.0)(jiti@2.6.1)(less@3.11.1)(lightningcss@1.31.1)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2)) + version: 4.2.1(vite@6.4.1(@types/node@24.12.0)(jiti@2.6.1)(less@3.11.1)(lightningcss@1.32.0)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2)) '@testing-library/jest-dom': specifier: 6.4.2 - version: 6.4.2(@types/jest@30.0.0)(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.12.0)(jiti@2.6.1)(jsdom@22.1.0)(less@3.11.1)(lightningcss@1.31.1)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2)) + version: 6.4.2(@types/jest@30.0.0)(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.12.0)(jiti@2.6.1)(jsdom@22.1.0)(less@3.11.1)(lightningcss@1.32.0)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2)) '@testing-library/react': specifier: ^16.3.0 version: 16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -185,10 +185,10 @@ importers: version: 18.3.7(@types/react@18.3.28) '@vitejs/plugin-react': specifier: ^5.0.2 - version: 5.1.4(vite@6.4.1(@types/node@24.12.0)(jiti@2.6.1)(less@3.11.1)(lightningcss@1.31.1)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2)) + version: 5.1.4(vite@6.4.1(@types/node@24.12.0)(jiti@2.6.1)(less@3.11.1)(lightningcss@1.32.0)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2)) '@vitest/coverage-v8': specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.12.0)(jiti@2.6.1)(jsdom@22.1.0)(less@3.11.1)(lightningcss@1.31.1)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2)) + version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.12.0)(jiti@2.6.1)(jsdom@22.1.0)(less@3.11.1)(lightningcss@1.32.0)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2)) browserslist: specifier: ^4.23.0 version: 4.28.1 @@ -200,10 +200,10 @@ importers: version: 22.1.0 lightningcss: specifier: ^1.29.0 - version: 1.31.1 + version: 1.32.0 lightningcss-cli: specifier: ^1.29.1 - version: 1.31.1 + version: 1.32.0 release-it: specifier: ^19.0.5 version: 19.2.4(@types/node@24.12.0)(magicast@0.3.5) @@ -218,19 +218,19 @@ importers: version: 5.9.3 vite: specifier: ^6.3.3 - version: 6.4.1(@types/node@24.12.0)(jiti@2.6.1)(less@3.11.1)(lightningcss@1.31.1)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2) + version: 6.4.1(@types/node@24.12.0)(jiti@2.6.1)(less@3.11.1)(lightningcss@1.32.0)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2) vite-plugin-svgr: specifier: ^4.3.0 - version: 4.5.0(rollup@4.59.0)(typescript@5.9.3)(vite@6.4.1(@types/node@24.12.0)(jiti@2.6.1)(less@3.11.1)(lightningcss@1.31.1)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2)) + version: 4.5.0(rollup@4.59.0)(typescript@5.9.3)(vite@6.4.1(@types/node@24.12.0)(jiti@2.6.1)(less@3.11.1)(lightningcss@1.32.0)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2)) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.3)(vite@6.4.1(@types/node@24.12.0)(jiti@2.6.1)(less@3.11.1)(lightningcss@1.31.1)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2)) + version: 5.1.4(typescript@5.9.3)(vite@6.4.1(@types/node@24.12.0)(jiti@2.6.1)(less@3.11.1)(lightningcss@1.32.0)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2)) vitest: specifier: 'catalog:' - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.12.0)(jiti@2.6.1)(jsdom@22.1.0)(less@3.11.1)(lightningcss@1.31.1)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.12.0)(jiti@2.6.1)(jsdom@22.1.0)(less@3.11.1)(lightningcss@1.32.0)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2) vitest-axe: specifier: ^0.1.0 - version: 0.1.0(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.12.0)(jiti@2.6.1)(jsdom@22.1.0)(less@3.11.1)(lightningcss@1.31.1)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2)) + version: 0.1.0(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.12.0)(jiti@2.6.1)(jsdom@22.1.0)(less@3.11.1)(lightningcss@1.32.0)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2)) packages/coresandbox: dependencies: @@ -336,10 +336,10 @@ importers: version: 5.9.3 vite: specifier: ^5.4.16 - version: 5.4.21(@types/node@24.12.0)(less@3.11.1)(lightningcss@1.31.1)(sass@1.58.0)(terser@5.46.0) + version: 5.4.21(@types/node@24.12.0)(less@3.11.1)(lightningcss@1.32.0)(sass@1.58.0)(terser@5.46.0) vitest: specifier: 'catalog:' - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.12.0)(jiti@2.6.1)(jsdom@22.1.0)(less@3.11.1)(lightningcss@1.31.1)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.12.0)(jiti@2.6.1)(jsdom@22.1.0)(less@3.11.1)(lightningcss@1.32.0)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2) packages/scripts: dependencies: @@ -750,6 +750,9 @@ importers: '@plone/razzle': specifier: workspace:* version: link:../volto-razzle + '@plone/razzle-dev-utils': + specifier: workspace:* + version: link:../volto-razzle-dev-utils '@plone/types': specifier: workspace:* version: link:../types @@ -842,7 +845,7 @@ importers: version: 7.18.0(eslint@8.57.1)(typescript@5.9.3) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.7.0(vite@6.4.1(@types/node@24.12.0)(jiti@2.6.1)(less@3.11.1)(lightningcss@1.31.1)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2)) + version: 4.7.0(vite@6.4.1(@types/node@24.12.0)(jiti@2.6.1)(less@3.11.1)(lightningcss@1.32.0)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2)) '@vitest/ui': specifier: ^2.1.8 version: 2.1.9(vitest@3.2.4) @@ -975,9 +978,6 @@ importers: postcss-scss: specifier: 4.0.6 version: 4.0.6(postcss@8.4.31) - razzle-dev-utils: - specifier: 4.2.18 - version: 4.2.18(eslint@8.57.1)(typescript@5.9.3)(webpack-dev-server@4.11.1(debug@4.3.4)(webpack@5.105.4(esbuild@0.25.12)))(webpack@5.105.4(esbuild@0.25.12)) react-docgen-typescript-plugin: specifier: ^1.0.5 version: 1.0.8(typescript@5.9.3)(webpack@5.105.4(esbuild@0.25.12)) @@ -1043,7 +1043,7 @@ importers: version: 1.3.2 vitest: specifier: ^3.0.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.12.0)(@vitest/ui@2.1.9)(jiti@2.6.1)(jsdom@16.7.0)(less@3.11.1)(lightningcss@1.31.1)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.12.0)(@vitest/ui@2.1.9)(jiti@2.6.1)(jsdom@16.7.0)(less@3.11.1)(lightningcss@1.32.0)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2) wait-on: specifier: 6.0.0 version: 6.0.0(debug@4.3.4) @@ -1108,6 +1108,9 @@ importers: '@plone/babel-preset-razzle': specifier: workspace:* version: link:../volto-babel-preset-razzle + '@plone/razzle-dev-utils': + specifier: workspace:* + version: link:../volto-razzle-dev-utils '@pmmmwh/react-refresh-webpack-plugin': specifier: 0.5.11 version: 0.5.11(react-refresh@0.14.0)(sockjs-client@1.4.0)(type-fest@2.19.0)(webpack-dev-server@4.11.1(webpack@5.105.4(esbuild@0.25.12)))(webpack-hot-middleware@2.26.1)(webpack@5.105.4(esbuild@0.25.12)) @@ -1137,7 +1140,7 @@ importers: version: 5.2.7(webpack@5.105.4(esbuild@0.25.12)) css-minimizer-webpack-plugin: specifier: ^7.0.4 - version: 7.0.4(clean-css@5.3.3)(esbuild@0.25.12)(lightningcss@1.31.1)(webpack@5.105.4(esbuild@0.25.12)) + version: 7.0.4(clean-css@5.3.3)(esbuild@0.25.12)(lightningcss@1.32.0)(webpack@5.105.4(esbuild@0.25.12)) deepmerge: specifier: ^4.2.2 version: 4.3.1 @@ -1186,9 +1189,6 @@ importers: process: specifier: ^0.11.10 version: 0.11.10 - razzle-dev-utils: - specifier: 4.2.18 - version: 4.2.18(eslint@8.57.1)(typescript@5.9.3)(webpack-dev-server@4.11.1(webpack@5.105.4(esbuild@0.25.12)))(webpack@5.105.4(esbuild@0.25.12)) razzle-start-server-webpack-plugin: specifier: 4.2.18 version: 4.2.18(webpack@5.105.4(esbuild@0.25.12)) @@ -1246,7 +1246,52 @@ importers: version: 16.7.0 vitest: specifier: ^3.0.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.12.0)(@vitest/ui@2.1.9)(jiti@2.6.1)(jsdom@16.7.0)(less@3.11.1)(lightningcss@1.31.1)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.12.0)(@vitest/ui@2.1.9)(jiti@2.6.1)(jsdom@16.7.0)(less@3.11.1)(lightningcss@1.32.0)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2) + + packages/volto-razzle-dev-utils: + dependencies: + '@babel/code-frame': + specifier: ^7.8.3 + version: 7.29.0 + chalk: + specifier: ^4.1.0 + version: 4.1.2 + filesize: + specifier: ^6.1.0 + version: 6.4.0 + gzip-size: + specifier: ^6.0.0 + version: 6.0.0 + jest-message-util: + specifier: ^26.3.0 + version: 26.6.2 + react-dev-utils: + specifier: ^11.0.4 + version: 11.0.4(eslint@8.57.1)(typescript@5.9.3)(webpack@5.105.4) + react-error-overlay: + specifier: ^6.0.7 + version: 6.0.9 + recursive-readdir: + specifier: ^2.2.2 + version: 2.2.3 + release-it: + specifier: ^19.0.4 + version: 19.2.4(@types/node@24.12.0)(magicast@0.3.5) + resolve: + specifier: ^1.17.0 + version: 1.22.11 + sockjs-client: + specifier: ~1.4.0 + version: 1.4.0 + strip-ansi: + specifier: ^6.0.0 + version: 6.0.1 + webpack: + specifier: ~4||~5 + version: 5.105.4 + webpack-dev-server: + specifier: ~3||~4 + version: 4.11.1(webpack@5.105.4) packages/volto-slate: dependencies: @@ -2866,12 +2911,12 @@ packages: resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} engines: {node: '>=8'} - '@jest/diff-sequences@30.0.1': - resolution: {integrity: sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==} + '@jest/diff-sequences@30.3.0': + resolution: {integrity: sha512-cG51MVnLq1ecVUaQ3fr6YuuAOitHK1S4WUJHnsPFE/quQr33ADUx1FfrTCpMCRxvy0Yr9BThKpDjSlcTi91tMA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/expect-utils@30.2.0': - resolution: {integrity: sha512-1JnRfhqpD8HGpOmQp180Fo9Zt69zNtC+9lR+kT7NVL05tNXIi+QC8Csz7lfidMoVLPD3FnOtcmp0CEFnxExGEA==} + '@jest/expect-utils@30.3.0': + resolution: {integrity: sha512-j0+W5iQQ8hBh7tHZkTQv3q2Fh/M7Je72cIsYqC4OaktgtO7v1So9UTjp6uPBHIaB6beoF/RRsCgMJKvti0wADA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} '@jest/get-type@30.1.0': @@ -2894,8 +2939,8 @@ packages: resolution: {integrity: sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==} engines: {node: '>= 10.14.2'} - '@jest/types@30.2.0': - resolution: {integrity: sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==} + '@jest/types@30.3.0': + resolution: {integrity: sha512-JHm87k7bA33hpBngtU8h6UBub/fqqA9uXfw+21j5Hmk7ooPHlboRNxHq0JcMtC+n8VJGP1mcfnD3Mk+XKe1oSw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} '@jridgewell/gen-mapping@0.3.13': @@ -7201,8 +7246,8 @@ packages: resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} engines: {node: '>=12.0.0'} - expect@30.2.0: - resolution: {integrity: sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw==} + expect@30.3.0: + resolution: {integrity: sha512-1zQrciTiQfRdo7qJM1uG4navm8DayFa2TgCSRlzUyNkhcJ6XUZF3hjnpkyr3VhAqPH7i/9GkG7Tv5abz6fqz0Q==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} express@4.19.2: @@ -7394,8 +7439,8 @@ packages: flat-cache@6.1.20: resolution: {integrity: sha512-AhHYqwvN62NVLp4lObVXGVluiABTHapoB57EyegZVmazN+hhGhLTn3uZbOofoTw4DSDvVCadzzyChXhOAvy8uQ==} - flatted@3.3.4: - resolution: {integrity: sha512-3+mMldrTAPdta5kjX2G2J7iX4zxtnwpdA8Tr2ZSjkyPSanvbZAcy6flmtnXbEybHrDcU9641lxrMfFuUxVz9vA==} + flatted@3.4.1: + resolution: {integrity: sha512-IxfVbRFVlV8V/yRaGzk0UVIcsKKHMSfYw66T/u4nTwlWteQePsxe//LjudR1AMX4tZW3WFCh3Zqa/sjlqpbURQ==} follow-redirects@1.15.11: resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} @@ -8429,8 +8474,8 @@ packages: resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-diff@30.2.0: - resolution: {integrity: sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==} + jest-diff@30.3.0: + resolution: {integrity: sha512-n3q4PDQjS4LrKxfWB3Z5KNk1XjXtZTBwQp71OP0Jo03Z6V60x++K5L8k6ZrW8MY8pOFylZvHM0zsjS1RqlHJZQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-get-type@29.6.3: @@ -8441,36 +8486,36 @@ packages: resolution: {integrity: sha512-4DkJ1sDPT+UX2MR7Y3od6KtvRi9Im1ZGLGgdLFLm4lPexbTaCgJW5NN3IOXlQHF7NSHY/VHhflQ+WoKtD/vyCw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-matcher-utils@30.2.0: - resolution: {integrity: sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg==} + jest-matcher-utils@30.3.0: + resolution: {integrity: sha512-HEtc9uFQgaUHkC7nLSlQL3Tph4Pjxt/yiPvkIrrDCt9jhoLIgxaubo1G+CFOnmHYMxHwwdaSN7mkIFs6ZK8OhA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-message-util@26.6.2: resolution: {integrity: sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==} engines: {node: '>= 10.14.2'} - jest-message-util@30.2.0: - resolution: {integrity: sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw==} + jest-message-util@30.3.0: + resolution: {integrity: sha512-Z/j4Bo+4ySJ+JPJN3b2Qbl9hDq3VrXmnjjGEWD/x0BCXeOXPTV1iZYYzl2X8c1MaCOL+ewMyNBcm88sboE6YWw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-mock@30.2.0: - resolution: {integrity: sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw==} + jest-mock@30.3.0: + resolution: {integrity: sha512-OTzICK8CpE+t4ndhKrwlIdbM6Pn8j00lvmSmq5ejiO+KxukbLjgOflKWMn3KE34EZdQm5RqTuKj+5RIEniYhog==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-regex-util@30.0.1: resolution: {integrity: sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-util@30.2.0: - resolution: {integrity: sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==} + jest-util@30.3.0: + resolution: {integrity: sha512-/jZDa00a3Sz7rdyu55NLrQCIrbyIkbBxareejQI315f/i8HjYN+ZWsDLLpoQSiUIEIyZF/R8fDg3BmB8AtHttg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-worker@27.5.1: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} - jest-worker@30.2.0: - resolution: {integrity: sha512-0Q4Uk8WF7BUwqXHuAjc23vmopWJw5WH7w2tqBoUOZpOjW/ZnR44GXXd1r82RvnmI2GZge3ivrYXk/BE2+VtW2g==} + jest-worker@30.3.0: + resolution: {integrity: sha512-DrCKkaQwHexjRUFTmPzs7sHQe0TSj9nvDALKGdwmK5mW9v7j90BudWirKAJHt3QQ9Dhrg1F7DogPzhChppkJpQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jiti@1.21.7: @@ -8708,74 +8753,80 @@ packages: cpu: [arm64] os: [android] - lightningcss-cli-android-arm64@1.31.1: - resolution: {integrity: sha512-Zcy4xfNcmavuwdf+/OYy6GJFLSD5EMtliPRiYhqzif3ACJlkGSaCj3hF5/u6SjnCzr1Unr/LKmetzBlG8QLg0w==} + lightningcss-android-arm64@1.32.0: + resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [android] - lightningcss-cli-darwin-arm64@1.31.1: - resolution: {integrity: sha512-PM9U3fcZOxnvlBlpiNplh/tgJ3fHEBkg1Lp0yHEXZ3P5g0kyaaWfFPH9l9Br3ejLr3rLsvUR6JL3zQiuy/pF6w==} + lightningcss-cli-android-arm64@1.32.0: + resolution: {integrity: sha512-4O3QY+VdgpBZLIq4crcKOEPVAXX0p7zDoykuTVstRtyolg9XU8CntdtbxcMPSC4SkzAuM/W4KsnPAzmv6Jb5LA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + + lightningcss-cli-darwin-arm64@1.32.0: + resolution: {integrity: sha512-Xx+zeD7bDKJZwbd1N63TJfIUHEtYspf+tqObdnQEJEvZAwmGfA4iEGrkCRT8R57tDRBDSXg3XHMDDvo/cq7gBQ==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [darwin] - lightningcss-cli-darwin-x64@1.31.1: - resolution: {integrity: sha512-RJPNiU+gOlHtVFtOjcWY2R71jkS5mC91T2g7AYxx44RqlaC72qXrZBYInWYI7Y4wwzEtNrGS593xKmtHNi4kpA==} + lightningcss-cli-darwin-x64@1.32.0: + resolution: {integrity: sha512-fYWANZ8RJDpI0tBcPQ7oBOYihfXmgDBHR4lZ6d4z7rcRLlZAOeI00mTO0IXAKfSm/UgnatjM4aBuNlLh8L9noA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [darwin] - lightningcss-cli-freebsd-x64@1.31.1: - resolution: {integrity: sha512-ofUzhxh9tF9zNccwh3jWRmPG2X5NJB/EZbWAYIzWiv/+QZy4++xt9sncv2KAGDan7HuLEwy1C3/T0Hv370P90w==} + lightningcss-cli-freebsd-x64@1.32.0: + resolution: {integrity: sha512-TJm7z1Ghvo9FKAza2KvfkFgH/9rcV1xAhCYQZlLrV0CiuTZ17uzLobBWb9oelGWUG+wTnEs6XEl4h/ve61YySg==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [freebsd] - lightningcss-cli-linux-arm-gnueabihf@1.31.1: - resolution: {integrity: sha512-Q204c6nl6RbptCKnK7kQ9PgpW25TKrCNGrAnJ/6zV5mNSevlqqgq4+YBFLIcfl5Pwt4PcasJdk5mHs7hP1nvlg==} + lightningcss-cli-linux-arm-gnueabihf@1.32.0: + resolution: {integrity: sha512-/jS9L5p3eexs5QJvARiDGxibz1umKJmmtff86fWXl3r7RbEUFrMAD4q1WhAR7DurRFgc1YWld6r0mX1YHEYttA==} engines: {node: '>= 12.0.0'} cpu: [arm] os: [linux] - lightningcss-cli-linux-arm64-gnu@1.31.1: - resolution: {integrity: sha512-/87G5NR8p+CLZIvZYt3c9h4jtDSpfhm6JAdF084LRalxOOD1mS506rlcB+nFWCyqnx6hlKGsq+OaDZ+kwHR2/g==} + lightningcss-cli-linux-arm64-gnu@1.32.0: + resolution: {integrity: sha512-PSdjwcRtSrJpsaqnY3ebnCfDOJ5ePi8s/0ItL3CX1b1Eu0iy44xo7MjgES1ZOQ2ntOthPRqaGsbAiVBLbgFLYQ==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] - lightningcss-cli-linux-arm64-musl@1.31.1: - resolution: {integrity: sha512-o+fRZtX4iFkTMhSXHzWYkLuCdd8ofKwlRWf8srb/xCq6ir74DZ+S+U3TKuJX0PO/qf+7wnFTMVjUUt/u+wKn6Q==} + lightningcss-cli-linux-arm64-musl@1.32.0: + resolution: {integrity: sha512-t6DdpXFtEdonZHzRgH8cmqhC2o4tl0KrD33cDBBniJz5TmWS20MJxb4YEr4WqBLksqW8GE399HJo+g8/YVuKcA==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] - lightningcss-cli-linux-x64-gnu@1.31.1: - resolution: {integrity: sha512-ODSKAllCrnNEtKPadEr96u8Ch2XJLiB7mLWu6q5dpUNqW0MUNNyGm5cL2boZXTWZea40W9Ga3kg7xOF6Nekeig==} + lightningcss-cli-linux-x64-gnu@1.32.0: + resolution: {integrity: sha512-QMQllbHYkbkQ4N+v8OGExQlGHBc3YZIcKlVkYucQQj66thkFQsRjmv8p5q3iCB0inNsCoSZ8lBspugkU1iPlPg==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] - lightningcss-cli-linux-x64-musl@1.31.1: - resolution: {integrity: sha512-j0HDWml30CrgZoNtIjUmnun3kaRT31bAn/L3xE1giq7C0ic3JyRCNPCt+XUXySjVHcUwoLotk0SPa14mvJ4aTg==} + lightningcss-cli-linux-x64-musl@1.32.0: + resolution: {integrity: sha512-dMSWdk4kMAi5f+J1xetxRCDQOvPix2whT0UdjuwP8r/5Xcdl2SQU/c80MQzu1S82kVDEANs1vHVEHp/+26LUnA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] - lightningcss-cli-win32-arm64-msvc@1.31.1: - resolution: {integrity: sha512-JPCfe3mAt666yHvPnFlmxKSgOy9qHagi8idWTIvEY8NAfAc833lrtPbTc7exfyz5IPQS3oALjt2qaRw911EApg==} + lightningcss-cli-win32-arm64-msvc@1.32.0: + resolution: {integrity: sha512-MJo22OqSp9FLV10nTRDJQhP6zkEBFqBFQe9mnjfCs+G1Ft+QimIPmC+gBqZHFXveOBOsjFLzU72q0FPvRWFmZQ==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [win32] - lightningcss-cli-win32-x64-msvc@1.31.1: - resolution: {integrity: sha512-BQ80Jy/sadx/Gj0esQrtDPnL5UwXQuk/gEmh75j6aN8+VvNOSo3Mwc17O8d2+mNuQSorwgxUXXaEmGeTVYBlxQ==} + lightningcss-cli-win32-x64-msvc@1.32.0: + resolution: {integrity: sha512-nOBHLPeePXZpGR4Ptp+gkOIkr9pxlq2dFmO954ol5zBi/iOKxuD1hUTIQ7aG+ldKIx4eH9jwoTfZ6owUkm1paA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [win32] - lightningcss-cli@1.31.1: - resolution: {integrity: sha512-RPaBnXyAW4dSNbhw/wrErQI3Kizn9tDu9zlRX+PoUC8l9uYXfdQeca9gc7ud8QvAou8AnepqmSgp0kH+hIF0hQ==} + lightningcss-cli@1.32.0: + resolution: {integrity: sha512-IFb/ChmSEbeWU3xeRybR6WFlJXCvfDS84//PUzLrRACgvoWrwRJBmcPS9azSo7LMh5QqEuyKanPBByhKM5z01Q==} engines: {node: '>= 12.0.0'} hasBin: true @@ -8785,64 +8836,128 @@ packages: cpu: [arm64] os: [darwin] + lightningcss-darwin-arm64@1.32.0: + resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + lightningcss-darwin-x64@1.31.1: resolution: {integrity: sha512-1ObhyoCY+tGxtsz1lSx5NXCj3nirk0Y0kB/g8B8DT+sSx4G9djitg9ejFnjb3gJNWo7qXH4DIy2SUHvpoFwfTA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [darwin] + lightningcss-darwin-x64@1.32.0: + resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + lightningcss-freebsd-x64@1.31.1: resolution: {integrity: sha512-1RINmQKAItO6ISxYgPwszQE1BrsVU5aB45ho6O42mu96UiZBxEXsuQ7cJW4zs4CEodPUioj/QrXW1r9pLUM74A==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [freebsd] + lightningcss-freebsd-x64@1.32.0: + resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + lightningcss-linux-arm-gnueabihf@1.31.1: resolution: {integrity: sha512-OOCm2//MZJ87CdDK62rZIu+aw9gBv4azMJuA8/KB74wmfS3lnC4yoPHm0uXZ/dvNNHmnZnB8XLAZzObeG0nS1g==} engines: {node: '>= 12.0.0'} cpu: [arm] os: [linux] + lightningcss-linux-arm-gnueabihf@1.32.0: + resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + lightningcss-linux-arm64-gnu@1.31.1: resolution: {integrity: sha512-WKyLWztD71rTnou4xAD5kQT+982wvca7E6QoLpoawZ1gP9JM0GJj4Tp5jMUh9B3AitHbRZ2/H3W5xQmdEOUlLg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + lightningcss-linux-arm64-gnu@1.32.0: + resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + lightningcss-linux-arm64-musl@1.31.1: resolution: {integrity: sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + lightningcss-linux-arm64-musl@1.32.0: + resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + lightningcss-linux-x64-gnu@1.31.1: resolution: {integrity: sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + lightningcss-linux-x64-gnu@1.32.0: + resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + lightningcss-linux-x64-musl@1.31.1: resolution: {integrity: sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + lightningcss-linux-x64-musl@1.32.0: + resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + lightningcss-win32-arm64-msvc@1.31.1: resolution: {integrity: sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [win32] + lightningcss-win32-arm64-msvc@1.32.0: + resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + lightningcss-win32-x64-msvc@1.31.1: resolution: {integrity: sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [win32] + lightningcss-win32-x64-msvc@1.32.0: + resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + lightningcss@1.31.1: resolution: {integrity: sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ==} engines: {node: '>= 12.0.0'} + lightningcss@1.32.0: + resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} + engines: {node: '>= 12.0.0'} + lilconfig@2.1.0: resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} engines: {node: '>=10'} @@ -10108,8 +10223,8 @@ packages: resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - pretty-format@30.2.0: - resolution: {integrity: sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==} + pretty-format@30.3.0: + resolution: {integrity: sha512-oG4T3wCbfeuvljnyAzhBvpN45E8iOTXCU/TD3zXW80HA3dQ4ahdqMkWGiPWZvjpQwlbyHrPTWUAqUzGzv4l1JQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} pretty-ms@9.3.0: @@ -10259,12 +10374,6 @@ packages: resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} engines: {node: '>= 0.8'} - razzle-dev-utils@4.2.18: - resolution: {integrity: sha512-WOXpAUAJaR3JJYhhb6iQKa+i25Ab2lAGiJXdbkDAXWDFRikpnojoUaZ2VuoNluSo0Xd7OKeaX8Ge29LW4mjEEg==} - peerDependencies: - webpack: ~4||~5 - webpack-dev-server: ~3||~4 - razzle-start-server-webpack-plugin@4.2.18: resolution: {integrity: sha512-yR86/T7hmfseBFOQYZDiDfLNxIvws7wBvRoQNz7aw4cT6cX8JFDPpMDHQQNdnESRDencDozMtFLX0jECJJi/CA==} peerDependencies: @@ -11147,8 +11256,8 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - simple-git@3.32.3: - resolution: {integrity: sha512-56a5oxFdWlsGygOXHWrG+xjj5w9ZIt2uQbzqiIGdR/6i5iococ7WQ/bNPzWxCJdEUGUCmyMH0t9zMpRJTaKxmw==} + simple-git@3.33.0: + resolution: {integrity: sha512-D4V/tGC2sjsoNhoMybKyGoE+v8A60hRawKQ1iFRA1zwuDgGZCBJ4ByOzZ5J8joBbi4Oam0qiPH+GhzmSBwbJng==} sirv@2.0.4: resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==} @@ -11658,8 +11767,8 @@ packages: resolution: {integrity: sha512-bcbjJEg0wY5nuJXvGxxHfmoEPkyHLCctUKO6suwtxy7jVSgGcgPeGwpbLDLELFhIaxCGRr3dPvyNg1yuz2V0eg==} engines: {node: '>=12'} - terser-webpack-plugin@5.3.17: - resolution: {integrity: sha512-YR7PtUp6GMU91BgSJmlaX/rS2lGDbAF7D+Wtq7hRO+MiljNmodYvqslzCFiYVAgW+Qoaaia/QUIP4lGXufjdZw==} + terser-webpack-plugin@5.3.6: + resolution: {integrity: sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==} engines: {node: '>= 10.13.0'} peerDependencies: '@swc/core': '*' @@ -11674,8 +11783,8 @@ packages: uglify-js: optional: true - terser-webpack-plugin@5.3.6: - resolution: {integrity: sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==} + terser-webpack-plugin@5.4.0: + resolution: {integrity: sha512-Bn5vxm48flOIfkdl5CaD2+1CiUVbonWQ3KQPyP7/EuIl9Gbzq/gQFOzaMFUEgVjB1396tcK0SG8XcNJ/2kDH8g==} engines: {node: '>= 10.13.0'} peerDependencies: '@swc/core': '*' @@ -14259,9 +14368,9 @@ snapshots: '@istanbuljs/schema@0.1.3': {} - '@jest/diff-sequences@30.0.1': {} + '@jest/diff-sequences@30.3.0': {} - '@jest/expect-utils@30.2.0': + '@jest/expect-utils@30.3.0': dependencies: '@jest/get-type': 30.1.0 @@ -14288,7 +14397,7 @@ snapshots: '@types/yargs': 15.0.20 chalk: 4.1.2 - '@jest/types@30.2.0': + '@jest/types@30.3.0': dependencies: '@jest/pattern': 30.0.1 '@jest/schemas': 30.0.5 @@ -16342,12 +16451,12 @@ snapshots: '@tailwindcss/oxide-win32-arm64-msvc': 4.2.1 '@tailwindcss/oxide-win32-x64-msvc': 4.2.1 - '@tailwindcss/vite@4.2.1(vite@6.4.1(@types/node@24.12.0)(jiti@2.6.1)(less@3.11.1)(lightningcss@1.31.1)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2))': + '@tailwindcss/vite@4.2.1(vite@6.4.1(@types/node@24.12.0)(jiti@2.6.1)(less@3.11.1)(lightningcss@1.32.0)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2))': dependencies: '@tailwindcss/node': 4.2.1 '@tailwindcss/oxide': 4.2.1 tailwindcss: 4.2.1 - vite: 6.4.1(@types/node@24.12.0)(jiti@2.6.1)(less@3.11.1)(lightningcss@1.31.1)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2) + vite: 6.4.1(@types/node@24.12.0)(jiti@2.6.1)(less@3.11.1)(lightningcss@1.32.0)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2) '@testing-library/cypress@10.1.0(cypress@15.5.0)': dependencies: @@ -16400,7 +16509,7 @@ snapshots: lodash: 4.17.23 redent: 3.0.0 - '@testing-library/jest-dom@6.4.2(@types/jest@30.0.0)(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.12.0)(jiti@2.6.1)(jsdom@22.1.0)(less@3.11.1)(lightningcss@1.31.1)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2))': + '@testing-library/jest-dom@6.4.2(@types/jest@30.0.0)(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.12.0)(jiti@2.6.1)(jsdom@22.1.0)(less@3.11.1)(lightningcss@1.32.0)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2))': dependencies: '@adobe/css-tools': 4.4.4 '@babel/runtime': 7.28.6 @@ -16412,7 +16521,7 @@ snapshots: redent: 3.0.0 optionalDependencies: '@types/jest': 30.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.12.0)(jiti@2.6.1)(jsdom@22.1.0)(less@3.11.1)(lightningcss@1.31.1)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.12.0)(jiti@2.6.1)(jsdom@22.1.0)(less@3.11.1)(lightningcss@1.32.0)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2) '@testing-library/jest-dom@6.4.2(@types/jest@30.0.0)(vitest@3.2.4)': dependencies: @@ -16426,7 +16535,7 @@ snapshots: redent: 3.0.0 optionalDependencies: '@types/jest': 30.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.12.0)(@vitest/ui@2.1.9)(jiti@2.6.1)(jsdom@16.7.0)(less@3.11.1)(lightningcss@1.31.1)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.12.0)(@vitest/ui@2.1.9)(jiti@2.6.1)(jsdom@16.7.0)(less@3.11.1)(lightningcss@1.32.0)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2) '@testing-library/jest-dom@6.5.0': dependencies: @@ -16613,8 +16722,8 @@ snapshots: '@types/jest@30.0.0': dependencies: - expect: 30.2.0 - pretty-format: 30.2.0 + expect: 30.3.0 + pretty-format: 30.3.0 '@types/json-schema@7.0.15': {} @@ -17000,7 +17109,7 @@ snapshots: '@unrs/resolver-binding-win32-x64-msvc@1.11.1': optional: true - '@vitejs/plugin-react@4.7.0(vite@6.4.1(@types/node@24.12.0)(jiti@2.6.1)(less@3.11.1)(lightningcss@1.31.1)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2))': + '@vitejs/plugin-react@4.7.0(vite@6.4.1(@types/node@24.12.0)(jiti@2.6.1)(less@3.11.1)(lightningcss@1.32.0)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2))': dependencies: '@babel/core': 7.29.0 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.29.0) @@ -17008,11 +17117,11 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.27 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 6.4.1(@types/node@24.12.0)(jiti@2.6.1)(less@3.11.1)(lightningcss@1.31.1)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2) + vite: 6.4.1(@types/node@24.12.0)(jiti@2.6.1)(less@3.11.1)(lightningcss@1.32.0)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2) transitivePeerDependencies: - supports-color - '@vitejs/plugin-react@5.1.4(vite@6.4.1(@types/node@24.12.0)(jiti@2.6.1)(less@3.11.1)(lightningcss@1.31.1)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2))': + '@vitejs/plugin-react@5.1.4(vite@6.4.1(@types/node@24.12.0)(jiti@2.6.1)(less@3.11.1)(lightningcss@1.32.0)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2))': dependencies: '@babel/core': 7.29.0 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.29.0) @@ -17020,11 +17129,11 @@ snapshots: '@rolldown/pluginutils': 1.0.0-rc.3 '@types/babel__core': 7.20.5 react-refresh: 0.18.0 - vite: 6.4.1(@types/node@24.12.0)(jiti@2.6.1)(less@3.11.1)(lightningcss@1.31.1)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2) + vite: 6.4.1(@types/node@24.12.0)(jiti@2.6.1)(less@3.11.1)(lightningcss@1.32.0)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2) transitivePeerDependencies: - supports-color - '@vitest/coverage-v8@1.6.1(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.12.0)(jiti@2.6.1)(jsdom@21.1.2)(less@3.11.1)(lightningcss@1.31.1)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2))': + '@vitest/coverage-v8@1.6.1(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.12.0)(jiti@2.6.1)(jsdom@21.1.2)(less@3.11.1)(lightningcss@1.32.0)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 0.2.3 @@ -17039,11 +17148,11 @@ snapshots: std-env: 3.10.0 strip-literal: 2.1.1 test-exclude: 6.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.12.0)(jiti@2.6.1)(jsdom@21.1.2)(less@3.11.1)(lightningcss@1.31.1)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.12.0)(jiti@2.6.1)(jsdom@21.1.2)(less@3.11.1)(lightningcss@1.32.0)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2) transitivePeerDependencies: - supports-color - '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.12.0)(jiti@2.6.1)(jsdom@22.1.0)(less@3.11.1)(lightningcss@1.31.1)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2))': + '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.12.0)(jiti@2.6.1)(jsdom@22.1.0)(less@3.11.1)(lightningcss@1.32.0)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 @@ -17058,7 +17167,7 @@ snapshots: std-env: 3.10.0 test-exclude: 7.0.2 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.12.0)(jiti@2.6.1)(jsdom@22.1.0)(less@3.11.1)(lightningcss@1.31.1)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.12.0)(jiti@2.6.1)(jsdom@22.1.0)(less@3.11.1)(lightningcss@1.32.0)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2) transitivePeerDependencies: - supports-color @@ -17077,13 +17186,13 @@ snapshots: chai: 5.3.3 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(vite@6.4.1(@types/node@24.12.0)(jiti@2.6.1)(less@3.11.1)(lightningcss@1.31.1)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2))': + '@vitest/mocker@3.2.4(vite@6.4.1(@types/node@24.12.0)(jiti@2.6.1)(less@3.11.1)(lightningcss@1.32.0)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 6.4.1(@types/node@24.12.0)(jiti@2.6.1)(less@3.11.1)(lightningcss@1.31.1)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2) + vite: 6.4.1(@types/node@24.12.0)(jiti@2.6.1)(less@3.11.1)(lightningcss@1.32.0)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2) '@vitest/pretty-format@2.0.5': dependencies: @@ -17121,12 +17230,12 @@ snapshots: dependencies: '@vitest/utils': 2.1.9 fflate: 0.8.2 - flatted: 3.3.4 + flatted: 3.4.1 pathe: 1.1.2 sirv: 3.0.2 tinyglobby: 0.2.15 tinyrainbow: 1.2.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.12.0)(@vitest/ui@2.1.9)(jiti@2.6.1)(jsdom@16.7.0)(less@3.11.1)(lightningcss@1.31.1)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.12.0)(@vitest/ui@2.1.9)(jiti@2.6.1)(jsdom@16.7.0)(less@3.11.1)(lightningcss@1.32.0)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2) '@vitest/utils@2.0.5': dependencies: @@ -18543,11 +18652,11 @@ snapshots: optionalDependencies: webpack: 5.105.4(esbuild@0.25.12) - css-minimizer-webpack-plugin@7.0.4(clean-css@5.3.3)(esbuild@0.25.12)(lightningcss@1.31.1)(webpack@5.105.4(esbuild@0.25.12)): + css-minimizer-webpack-plugin@7.0.4(clean-css@5.3.3)(esbuild@0.25.12)(lightningcss@1.32.0)(webpack@5.105.4(esbuild@0.25.12)): dependencies: '@jridgewell/trace-mapping': 0.3.31 cssnano: 7.1.3(postcss@8.5.8) - jest-worker: 30.2.0 + jest-worker: 30.3.0 postcss: 8.5.8 schema-utils: 4.3.3 serialize-javascript: 6.0.2 @@ -18555,7 +18664,7 @@ snapshots: optionalDependencies: clean-css: 5.3.3 esbuild: 0.25.12 - lightningcss: 1.31.1 + lightningcss: 1.32.0 css-select@4.3.0: dependencies: @@ -19796,14 +19905,14 @@ snapshots: expect-type@1.3.0: {} - expect@30.2.0: + expect@30.3.0: dependencies: - '@jest/expect-utils': 30.2.0 + '@jest/expect-utils': 30.3.0 '@jest/get-type': 30.1.0 - jest-matcher-utils: 30.2.0 - jest-message-util: 30.2.0 - jest-mock: 30.2.0 - jest-util: 30.2.0 + jest-matcher-utils: 30.3.0 + jest-message-util: 30.3.0 + jest-mock: 30.3.0 + jest-util: 30.3.0 express@4.19.2: dependencies: @@ -20046,17 +20155,17 @@ snapshots: flat-cache@3.2.0: dependencies: - flatted: 3.3.4 + flatted: 3.4.1 keyv: 4.5.4 rimraf: 3.0.2 flat-cache@6.1.20: dependencies: cacheable: 2.3.3 - flatted: 3.3.4 + flatted: 3.4.1 hookified: 1.15.1 - flatted@3.3.4: {} + flatted@3.4.1: {} follow-redirects@1.15.11(debug@4.3.2): optionalDependencies: @@ -20081,7 +20190,7 @@ snapshots: fork-ts-checker-webpack-plugin@4.1.6(eslint@8.57.1)(typescript@5.9.3)(webpack@5.105.4(esbuild@0.25.12)): dependencies: - '@babel/code-frame': 7.29.0 + '@babel/code-frame': 7.10.4 chalk: 2.4.2 micromatch: 3.1.10 minimatch: 3.1.5 @@ -20095,6 +20204,22 @@ snapshots: transitivePeerDependencies: - supports-color + fork-ts-checker-webpack-plugin@4.1.6(eslint@8.57.1)(typescript@5.9.3)(webpack@5.105.4): + dependencies: + '@babel/code-frame': 7.10.4 + chalk: 2.4.2 + micromatch: 3.1.10 + minimatch: 3.1.5 + semver: 5.7.2 + tapable: 1.1.3 + typescript: 5.9.3 + webpack: 5.105.4 + worker-rpc: 0.1.1 + optionalDependencies: + eslint: 8.57.1 + transitivePeerDependencies: + - supports-color + fork-ts-checker-webpack-plugin@8.0.0(typescript@5.9.3)(webpack@5.105.4(esbuild@0.25.12)): dependencies: '@babel/code-frame': 7.29.0 @@ -20839,7 +20964,7 @@ snapshots: cli-width: 4.1.0 external-editor: 3.1.0 figures: 3.2.0 - lodash: 4.17.23 + lodash: 4.17.21 mute-stream: 1.0.0 ora: 5.4.1 run-async: 3.0.0 @@ -21220,12 +21345,12 @@ snapshots: jest-get-type: 29.6.3 pretty-format: 29.7.0 - jest-diff@30.2.0: + jest-diff@30.3.0: dependencies: - '@jest/diff-sequences': 30.0.1 + '@jest/diff-sequences': 30.3.0 '@jest/get-type': 30.1.0 chalk: 4.1.2 - pretty-format: 30.2.0 + pretty-format: 30.3.0 jest-get-type@29.6.3: {} @@ -21236,12 +21361,12 @@ snapshots: jest-get-type: 29.6.3 pretty-format: 29.7.0 - jest-matcher-utils@30.2.0: + jest-matcher-utils@30.3.0: dependencies: '@jest/get-type': 30.1.0 chalk: 4.1.2 - jest-diff: 30.2.0 - pretty-format: 30.2.0 + jest-diff: 30.3.0 + pretty-format: 30.3.0 jest-message-util@26.6.2: dependencies: @@ -21255,29 +21380,29 @@ snapshots: slash: 3.0.0 stack-utils: 2.0.6 - jest-message-util@30.2.0: + jest-message-util@30.3.0: dependencies: '@babel/code-frame': 7.29.0 - '@jest/types': 30.2.0 + '@jest/types': 30.3.0 '@types/stack-utils': 2.0.3 chalk: 4.1.2 graceful-fs: 4.2.11 - micromatch: 4.0.8 - pretty-format: 30.2.0 + picomatch: 4.0.3 + pretty-format: 30.3.0 slash: 3.0.0 stack-utils: 2.0.6 - jest-mock@30.2.0: + jest-mock@30.3.0: dependencies: - '@jest/types': 30.2.0 + '@jest/types': 30.3.0 '@types/node': 24.12.0 - jest-util: 30.2.0 + jest-util: 30.3.0 jest-regex-util@30.0.1: {} - jest-util@30.2.0: + jest-util@30.3.0: dependencies: - '@jest/types': 30.2.0 + '@jest/types': 30.3.0 '@types/node': 24.12.0 chalk: 4.1.2 ci-info: 4.4.0 @@ -21290,11 +21415,11 @@ snapshots: merge-stream: 2.0.0 supports-color: 8.1.1 - jest-worker@30.2.0: + jest-worker@30.3.0: dependencies: '@types/node': 24.12.0 '@ungap/structured-clone': 1.3.0 - jest-util: 30.2.0 + jest-util: 30.3.0 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -21589,85 +21714,118 @@ snapshots: lightningcss-android-arm64@1.31.1: optional: true - lightningcss-cli-android-arm64@1.31.1: + lightningcss-android-arm64@1.32.0: optional: true - lightningcss-cli-darwin-arm64@1.31.1: + lightningcss-cli-android-arm64@1.32.0: optional: true - lightningcss-cli-darwin-x64@1.31.1: + lightningcss-cli-darwin-arm64@1.32.0: optional: true - lightningcss-cli-freebsd-x64@1.31.1: + lightningcss-cli-darwin-x64@1.32.0: optional: true - lightningcss-cli-linux-arm-gnueabihf@1.31.1: + lightningcss-cli-freebsd-x64@1.32.0: optional: true - lightningcss-cli-linux-arm64-gnu@1.31.1: + lightningcss-cli-linux-arm-gnueabihf@1.32.0: optional: true - lightningcss-cli-linux-arm64-musl@1.31.1: + lightningcss-cli-linux-arm64-gnu@1.32.0: optional: true - lightningcss-cli-linux-x64-gnu@1.31.1: + lightningcss-cli-linux-arm64-musl@1.32.0: optional: true - lightningcss-cli-linux-x64-musl@1.31.1: + lightningcss-cli-linux-x64-gnu@1.32.0: optional: true - lightningcss-cli-win32-arm64-msvc@1.31.1: + lightningcss-cli-linux-x64-musl@1.32.0: optional: true - lightningcss-cli-win32-x64-msvc@1.31.1: + lightningcss-cli-win32-arm64-msvc@1.32.0: optional: true - lightningcss-cli@1.31.1: + lightningcss-cli-win32-x64-msvc@1.32.0: + optional: true + + lightningcss-cli@1.32.0: dependencies: detect-libc: 2.1.2 optionalDependencies: - lightningcss-cli-android-arm64: 1.31.1 - lightningcss-cli-darwin-arm64: 1.31.1 - lightningcss-cli-darwin-x64: 1.31.1 - lightningcss-cli-freebsd-x64: 1.31.1 - lightningcss-cli-linux-arm-gnueabihf: 1.31.1 - lightningcss-cli-linux-arm64-gnu: 1.31.1 - lightningcss-cli-linux-arm64-musl: 1.31.1 - lightningcss-cli-linux-x64-gnu: 1.31.1 - lightningcss-cli-linux-x64-musl: 1.31.1 - lightningcss-cli-win32-arm64-msvc: 1.31.1 - lightningcss-cli-win32-x64-msvc: 1.31.1 + lightningcss-cli-android-arm64: 1.32.0 + lightningcss-cli-darwin-arm64: 1.32.0 + lightningcss-cli-darwin-x64: 1.32.0 + lightningcss-cli-freebsd-x64: 1.32.0 + lightningcss-cli-linux-arm-gnueabihf: 1.32.0 + lightningcss-cli-linux-arm64-gnu: 1.32.0 + lightningcss-cli-linux-arm64-musl: 1.32.0 + lightningcss-cli-linux-x64-gnu: 1.32.0 + lightningcss-cli-linux-x64-musl: 1.32.0 + lightningcss-cli-win32-arm64-msvc: 1.32.0 + lightningcss-cli-win32-x64-msvc: 1.32.0 lightningcss-darwin-arm64@1.31.1: optional: true + lightningcss-darwin-arm64@1.32.0: + optional: true + lightningcss-darwin-x64@1.31.1: optional: true + lightningcss-darwin-x64@1.32.0: + optional: true + lightningcss-freebsd-x64@1.31.1: optional: true + lightningcss-freebsd-x64@1.32.0: + optional: true + lightningcss-linux-arm-gnueabihf@1.31.1: optional: true + lightningcss-linux-arm-gnueabihf@1.32.0: + optional: true + lightningcss-linux-arm64-gnu@1.31.1: optional: true + lightningcss-linux-arm64-gnu@1.32.0: + optional: true + lightningcss-linux-arm64-musl@1.31.1: optional: true + lightningcss-linux-arm64-musl@1.32.0: + optional: true + lightningcss-linux-x64-gnu@1.31.1: optional: true + lightningcss-linux-x64-gnu@1.32.0: + optional: true + lightningcss-linux-x64-musl@1.31.1: optional: true + lightningcss-linux-x64-musl@1.32.0: + optional: true + lightningcss-win32-arm64-msvc@1.31.1: optional: true + lightningcss-win32-arm64-msvc@1.32.0: + optional: true + lightningcss-win32-x64-msvc@1.31.1: optional: true + lightningcss-win32-x64-msvc@1.32.0: + optional: true + lightningcss@1.31.1: dependencies: detect-libc: 2.1.2 @@ -21684,6 +21842,22 @@ snapshots: lightningcss-win32-arm64-msvc: 1.31.1 lightningcss-win32-x64-msvc: 1.31.1 + lightningcss@1.32.0: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.32.0 + lightningcss-darwin-arm64: 1.32.0 + lightningcss-darwin-x64: 1.32.0 + lightningcss-freebsd-x64: 1.32.0 + lightningcss-linux-arm-gnueabihf: 1.32.0 + lightningcss-linux-arm64-gnu: 1.32.0 + lightningcss-linux-arm64-musl: 1.32.0 + lightningcss-linux-x64-gnu: 1.32.0 + lightningcss-linux-x64-musl: 1.32.0 + lightningcss-win32-arm64-msvc: 1.32.0 + lightningcss-win32-x64-msvc: 1.32.0 + lilconfig@2.1.0: {} lilconfig@3.1.3: {} @@ -22063,7 +22237,7 @@ snapshots: dependencies: async: 3.2.6 chalk: 2.4.2 - simple-git: 3.32.3 + simple-git: 3.33.0 transitivePeerDependencies: - supports-color @@ -22487,7 +22661,7 @@ snapshots: got: 12.6.1 registry-auth-token: 5.1.1 registry-url: 6.0.1 - semver: 7.7.4 + semver: 7.6.0 param-case@3.0.4: dependencies: @@ -22946,7 +23120,7 @@ snapshots: ansi-styles: 5.2.0 react-is: 18.3.1 - pretty-format@30.2.0: + pretty-format@30.3.0: dependencies: '@jest/schemas': 30.0.5 ansi-styles: 5.2.0 @@ -23131,48 +23305,6 @@ snapshots: iconv-lite: 0.4.24 unpipe: 1.0.0 - razzle-dev-utils@4.2.18(eslint@8.57.1)(typescript@5.9.3)(webpack-dev-server@4.11.1(debug@4.3.4)(webpack@5.105.4(esbuild@0.25.12)))(webpack@5.105.4(esbuild@0.25.12)): - dependencies: - '@babel/code-frame': 7.29.0 - chalk: 4.1.2 - filesize: 6.4.0 - gzip-size: 6.0.0 - jest-message-util: 26.6.2 - react-dev-utils: 11.0.4(eslint@8.57.1)(typescript@5.9.3)(webpack@5.105.4(esbuild@0.25.12)) - react-error-overlay: 6.0.9 - recursive-readdir: 2.2.3 - resolve: 1.22.11 - sockjs-client: 1.4.0 - strip-ansi: 6.0.1 - webpack: 5.105.4(esbuild@0.25.12) - webpack-dev-server: 4.11.1(debug@4.3.4)(webpack@5.105.4(esbuild@0.25.12)) - transitivePeerDependencies: - - eslint - - supports-color - - typescript - - vue-template-compiler - - razzle-dev-utils@4.2.18(eslint@8.57.1)(typescript@5.9.3)(webpack-dev-server@4.11.1(webpack@5.105.4(esbuild@0.25.12)))(webpack@5.105.4(esbuild@0.25.12)): - dependencies: - '@babel/code-frame': 7.29.0 - chalk: 4.1.2 - filesize: 6.4.0 - gzip-size: 6.0.0 - jest-message-util: 26.6.2 - react-dev-utils: 11.0.4(eslint@8.57.1)(typescript@5.9.3)(webpack@5.105.4(esbuild@0.25.12)) - react-error-overlay: 6.0.9 - recursive-readdir: 2.2.3 - resolve: 1.22.11 - sockjs-client: 1.4.0 - strip-ansi: 6.0.1 - webpack: 5.105.4(esbuild@0.25.12) - webpack-dev-server: 4.11.1(webpack@5.105.4(esbuild@0.25.12)) - transitivePeerDependencies: - - eslint - - supports-color - - typescript - - vue-template-compiler - razzle-start-server-webpack-plugin@4.2.18(webpack@5.105.4(esbuild@0.25.12)): dependencies: webpack: 5.105.4(esbuild@0.25.12) @@ -23415,6 +23547,40 @@ snapshots: - supports-color - vue-template-compiler + react-dev-utils@11.0.4(eslint@8.57.1)(typescript@5.9.3)(webpack@5.105.4): + dependencies: + '@babel/code-frame': 7.10.4 + address: 1.1.2 + browserslist: 4.14.2 + chalk: 2.4.2 + cross-spawn: 7.0.3 + detect-port-alt: 1.1.6 + escape-string-regexp: 2.0.0 + filesize: 6.1.0 + find-up: 4.1.0 + fork-ts-checker-webpack-plugin: 4.1.6(eslint@8.57.1)(typescript@5.9.3)(webpack@5.105.4) + global-modules: 2.0.0 + globby: 11.0.1 + gzip-size: 5.1.1 + immer: 10.1.3 + is-root: 2.1.0 + loader-utils: 2.0.0 + open: 7.4.2 + pkg-up: 3.1.0 + prompts: 2.4.0 + react-error-overlay: 6.0.9 + recursive-readdir: 2.2.2 + shell-quote: 1.7.2 + strip-ansi: 6.0.0 + text-table: 0.2.0 + webpack: 5.105.4 + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - eslint + - supports-color + - vue-template-compiler + react-dnd-html5-backend@5.0.1: dependencies: autobind-decorator: 2.4.0 @@ -24350,7 +24516,7 @@ snapshots: semver-diff@4.0.0: dependencies: - semver: 7.7.4 + semver: 7.6.0 semver@5.7.2: {} @@ -24500,7 +24666,7 @@ snapshots: signal-exit@4.1.0: {} - simple-git@3.32.3: + simple-git@3.33.0: dependencies: '@kwsites/file-exists': 1.1.1 '@kwsites/promise-deferred': 1.1.1 @@ -25141,27 +25307,35 @@ snapshots: dependencies: ps-tree: 1.2.0 - terser-webpack-plugin@5.3.17(esbuild@0.25.12)(webpack@5.105.4(esbuild@0.25.12)): + terser-webpack-plugin@5.3.6(esbuild@0.25.12)(webpack@5.105.4(esbuild@0.25.12)): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 - schema-utils: 4.3.3 + schema-utils: 3.3.0 + serialize-javascript: 6.0.2 terser: 5.46.0 webpack: 5.105.4(esbuild@0.25.12) optionalDependencies: esbuild: 0.25.12 - terser-webpack-plugin@5.3.6(esbuild@0.25.12)(webpack@5.105.4(esbuild@0.25.12)): + terser-webpack-plugin@5.4.0(esbuild@0.25.12)(webpack@5.105.4(esbuild@0.25.12)): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 - schema-utils: 3.3.0 - serialize-javascript: 6.0.2 + schema-utils: 4.3.3 terser: 5.46.0 webpack: 5.105.4(esbuild@0.25.12) optionalDependencies: esbuild: 0.25.12 + terser-webpack-plugin@5.4.0(webpack@5.105.4): + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + jest-worker: 27.5.1 + schema-utils: 4.3.3 + terser: 5.46.0 + webpack: 5.105.4 + terser@5.46.0: dependencies: '@jridgewell/source-map': 0.3.11 @@ -25578,7 +25752,7 @@ snapshots: is-yarn-global: 0.4.1 latest-version: 7.0.0 pupa: 3.3.0 - semver: 7.7.4 + semver: 7.5.4 semver-diff: 4.0.0 xdg-basedir: 5.1.0 @@ -25593,7 +25767,7 @@ snapshots: is-npm: 6.1.0 latest-version: 7.0.0 pupa: 3.3.0 - semver: 7.7.4 + semver: 7.6.0 semver-diff: 4.0.0 xdg-basedir: 5.1.0 @@ -25680,13 +25854,13 @@ snapshots: core-util-is: 1.0.2 extsprintf: 1.3.0 - vite-node@3.2.4(@types/node@24.12.0)(jiti@2.6.1)(less@3.11.1)(lightningcss@1.31.1)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2): + vite-node@3.2.4(@types/node@24.12.0)(jiti@2.6.1)(less@3.11.1)(lightningcss@1.32.0)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2): dependencies: cac: 6.7.14 debug: 4.4.3 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 6.4.1(@types/node@24.12.0)(jiti@2.6.1)(less@3.11.1)(lightningcss@1.31.1)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2) + vite: 6.4.1(@types/node@24.12.0)(jiti@2.6.1)(less@3.11.1)(lightningcss@1.32.0)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2) transitivePeerDependencies: - '@types/node' - jiti @@ -25701,29 +25875,29 @@ snapshots: - tsx - yaml - vite-plugin-svgr@4.5.0(rollup@4.59.0)(typescript@5.9.3)(vite@6.4.1(@types/node@24.12.0)(jiti@2.6.1)(less@3.11.1)(lightningcss@1.31.1)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2)): + vite-plugin-svgr@4.5.0(rollup@4.59.0)(typescript@5.9.3)(vite@6.4.1(@types/node@24.12.0)(jiti@2.6.1)(less@3.11.1)(lightningcss@1.32.0)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2)): dependencies: '@rollup/pluginutils': 5.3.0(rollup@4.59.0) '@svgr/core': 8.1.0(typescript@5.9.3) '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.9.3)) - vite: 6.4.1(@types/node@24.12.0)(jiti@2.6.1)(less@3.11.1)(lightningcss@1.31.1)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2) + vite: 6.4.1(@types/node@24.12.0)(jiti@2.6.1)(less@3.11.1)(lightningcss@1.32.0)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2) transitivePeerDependencies: - rollup - supports-color - typescript - vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@6.4.1(@types/node@24.12.0)(jiti@2.6.1)(less@3.11.1)(lightningcss@1.31.1)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2)): + vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@6.4.1(@types/node@24.12.0)(jiti@2.6.1)(less@3.11.1)(lightningcss@1.32.0)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2)): dependencies: debug: 4.3.4(supports-color@8.1.1) globrex: 0.1.2 tsconfck: 3.1.6(typescript@5.9.3) optionalDependencies: - vite: 6.4.1(@types/node@24.12.0)(jiti@2.6.1)(less@3.11.1)(lightningcss@1.31.1)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2) + vite: 6.4.1(@types/node@24.12.0)(jiti@2.6.1)(less@3.11.1)(lightningcss@1.32.0)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2) transitivePeerDependencies: - supports-color - typescript - vite@5.4.21(@types/node@24.12.0)(less@3.11.1)(lightningcss@1.31.1)(sass@1.58.0)(terser@5.46.0): + vite@5.4.21(@types/node@24.12.0)(less@3.11.1)(lightningcss@1.32.0)(sass@1.58.0)(terser@5.46.0): dependencies: esbuild: 0.21.5 postcss: 8.5.8 @@ -25732,11 +25906,11 @@ snapshots: '@types/node': 24.12.0 fsevents: 2.3.3 less: 3.11.1 - lightningcss: 1.31.1 + lightningcss: 1.32.0 sass: 1.58.0 terser: 5.46.0 - vite@6.4.1(@types/node@24.12.0)(jiti@2.6.1)(less@3.11.1)(lightningcss@1.31.1)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2): + vite@6.4.1(@types/node@24.12.0)(jiti@2.6.1)(less@3.11.1)(lightningcss@1.32.0)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2): dependencies: esbuild: 0.25.12 fdir: 6.5.0(picomatch@4.0.3) @@ -25749,12 +25923,12 @@ snapshots: fsevents: 2.3.3 jiti: 2.6.1 less: 3.11.1 - lightningcss: 1.31.1 + lightningcss: 1.32.0 sass: 1.58.0 terser: 5.46.0 yaml: 2.8.2 - vitest-axe@0.1.0(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.12.0)(jiti@2.6.1)(jsdom@22.1.0)(less@3.11.1)(lightningcss@1.31.1)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2)): + vitest-axe@0.1.0(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.12.0)(jiti@2.6.1)(jsdom@22.1.0)(less@3.11.1)(lightningcss@1.32.0)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2)): dependencies: aria-query: 5.3.2 axe-core: 4.4.2 @@ -25762,13 +25936,13 @@ snapshots: dom-accessibility-api: 0.5.16 lodash-es: 4.17.23 redent: 3.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.12.0)(jiti@2.6.1)(jsdom@22.1.0)(less@3.11.1)(lightningcss@1.31.1)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.12.0)(jiti@2.6.1)(jsdom@22.1.0)(less@3.11.1)(lightningcss@1.32.0)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2) - vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.12.0)(@vitest/ui@2.1.9)(jiti@2.6.1)(jsdom@16.7.0)(less@3.11.1)(lightningcss@1.31.1)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2): + vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.12.0)(@vitest/ui@2.1.9)(jiti@2.6.1)(jsdom@16.7.0)(less@3.11.1)(lightningcss@1.32.0)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2): dependencies: '@types/chai': 5.2.3 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@6.4.1(@types/node@24.12.0)(jiti@2.6.1)(less@3.11.1)(lightningcss@1.31.1)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2)) + '@vitest/mocker': 3.2.4(vite@6.4.1(@types/node@24.12.0)(jiti@2.6.1)(less@3.11.1)(lightningcss@1.32.0)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -25786,8 +25960,8 @@ snapshots: tinyglobby: 0.2.15 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 6.4.1(@types/node@24.12.0)(jiti@2.6.1)(less@3.11.1)(lightningcss@1.31.1)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2) - vite-node: 3.2.4(@types/node@24.12.0)(jiti@2.6.1)(less@3.11.1)(lightningcss@1.31.1)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2) + vite: 6.4.1(@types/node@24.12.0)(jiti@2.6.1)(less@3.11.1)(lightningcss@1.32.0)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2) + vite-node: 3.2.4(@types/node@24.12.0)(jiti@2.6.1)(less@3.11.1)(lightningcss@1.32.0)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 @@ -25808,11 +25982,11 @@ snapshots: - tsx - yaml - vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.12.0)(jiti@2.6.1)(jsdom@21.1.2)(less@3.11.1)(lightningcss@1.31.1)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2): + vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.12.0)(jiti@2.6.1)(jsdom@21.1.2)(less@3.11.1)(lightningcss@1.32.0)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2): dependencies: '@types/chai': 5.2.3 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@6.4.1(@types/node@24.12.0)(jiti@2.6.1)(less@3.11.1)(lightningcss@1.31.1)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2)) + '@vitest/mocker': 3.2.4(vite@6.4.1(@types/node@24.12.0)(jiti@2.6.1)(less@3.11.1)(lightningcss@1.32.0)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -25830,8 +26004,8 @@ snapshots: tinyglobby: 0.2.15 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 6.4.1(@types/node@24.12.0)(jiti@2.6.1)(less@3.11.1)(lightningcss@1.31.1)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2) - vite-node: 3.2.4(@types/node@24.12.0)(jiti@2.6.1)(less@3.11.1)(lightningcss@1.31.1)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2) + vite: 6.4.1(@types/node@24.12.0)(jiti@2.6.1)(less@3.11.1)(lightningcss@1.32.0)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2) + vite-node: 3.2.4(@types/node@24.12.0)(jiti@2.6.1)(less@3.11.1)(lightningcss@1.32.0)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 @@ -25851,11 +26025,11 @@ snapshots: - tsx - yaml - vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.12.0)(jiti@2.6.1)(jsdom@22.1.0)(less@3.11.1)(lightningcss@1.31.1)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2): + vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.12.0)(jiti@2.6.1)(jsdom@22.1.0)(less@3.11.1)(lightningcss@1.32.0)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2): dependencies: '@types/chai': 5.2.3 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@6.4.1(@types/node@24.12.0)(jiti@2.6.1)(less@3.11.1)(lightningcss@1.31.1)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2)) + '@vitest/mocker': 3.2.4(vite@6.4.1(@types/node@24.12.0)(jiti@2.6.1)(less@3.11.1)(lightningcss@1.32.0)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -25873,8 +26047,8 @@ snapshots: tinyglobby: 0.2.15 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 6.4.1(@types/node@24.12.0)(jiti@2.6.1)(less@3.11.1)(lightningcss@1.31.1)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2) - vite-node: 3.2.4(@types/node@24.12.0)(jiti@2.6.1)(less@3.11.1)(lightningcss@1.31.1)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2) + vite: 6.4.1(@types/node@24.12.0)(jiti@2.6.1)(less@3.11.1)(lightningcss@1.32.0)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2) + vite-node: 3.2.4(@types/node@24.12.0)(jiti@2.6.1)(less@3.11.1)(lightningcss@1.32.0)(sass@1.58.0)(terser@5.46.0)(yaml@2.8.2) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 @@ -26003,6 +26177,15 @@ snapshots: schema-utils: 4.3.3 webpack: 5.105.4(esbuild@0.25.12) + webpack-dev-middleware@5.3.4(webpack@5.105.4): + dependencies: + colorette: 2.0.20 + memfs: 3.5.3 + mime-types: 2.1.35 + range-parser: 1.2.1 + schema-utils: 4.3.3 + webpack: 5.105.4 + webpack-dev-middleware@6.1.3(webpack@5.105.4(esbuild@0.25.12)): dependencies: colorette: 2.0.20 @@ -26089,6 +26272,44 @@ snapshots: - supports-color - utf-8-validate + webpack-dev-server@4.11.1(webpack@5.105.4): + dependencies: + '@types/bonjour': 3.5.13 + '@types/connect-history-api-fallback': 1.5.4 + '@types/express': 4.17.25 + '@types/serve-index': 1.9.4 + '@types/serve-static': 1.15.10 + '@types/sockjs': 0.3.36 + '@types/ws': 8.18.1 + ansi-html-community: 0.0.8 + bonjour-service: 1.3.0 + chokidar: 3.6.0 + colorette: 2.0.20 + compression: 1.8.1 + connect-history-api-fallback: 2.0.0 + default-gateway: 6.0.3 + express: 4.19.2 + graceful-fs: 4.2.11 + html-entities: 2.6.0 + http-proxy-middleware: 2.0.9(@types/express@4.17.25) + ipaddr.js: 2.3.0 + open: 8.4.2 + p-retry: 4.6.2 + rimraf: 3.0.2 + schema-utils: 4.3.3 + selfsigned: 2.4.1 + serve-index: 1.9.2 + sockjs: 0.3.24 + spdy: 4.0.2 + webpack: 5.105.4 + webpack-dev-middleware: 5.3.4(webpack@5.105.4) + ws: 8.19.0 + transitivePeerDependencies: + - bufferutil + - debug + - supports-color + - utf-8-validate + webpack-hot-middleware@2.26.1: dependencies: ansi-html-community: 0.0.8 @@ -26112,6 +26333,38 @@ snapshots: webpack-virtual-modules@0.6.2: {} + webpack@5.105.4: + dependencies: + '@types/eslint-scope': 3.7.7 + '@types/estree': 1.0.8 + '@types/json-schema': 7.0.15 + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/wasm-edit': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + acorn: 8.16.0 + acorn-import-phases: 1.0.4(acorn@8.16.0) + browserslist: 4.28.1 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.20.0 + es-module-lexer: 2.0.0 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.1 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 4.3.3 + tapable: 2.3.0 + terser-webpack-plugin: 5.4.0(webpack@5.105.4) + watchpack: 2.5.1 + webpack-sources: 3.3.4 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + webpack@5.105.4(esbuild@0.25.12): dependencies: '@types/eslint-scope': 3.7.7 @@ -26136,7 +26389,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.0 - terser-webpack-plugin: 5.3.17(esbuild@0.25.12)(webpack@5.105.4(esbuild@0.25.12)) + terser-webpack-plugin: 5.4.0(esbuild@0.25.12)(webpack@5.105.4(esbuild@0.25.12)) watchpack: 2.5.1 webpack-sources: 3.3.4 transitivePeerDependencies: