From 98916d69fb74fe036087dac0532a99ab3e5d66d3 Mon Sep 17 00:00:00 2001 From: Sachin Kumar Date: Sun, 20 Jul 2025 08:11:19 +0530 Subject: [PATCH 01/10] chore: update ESlint from v8 to v9 --- .eslintignore | 5 - .eslintrc.js | 7 - README.md | 14 +- eslint.config.mjs | 22 ++ package.json | 115 ++++--- setupTest.js | 1 + src/index.js | 186 +++++------ src/minify.js | 18 +- src/utils.js | 308 +++++++++--------- test/CssMinimizerPlugin.test.js | 306 +++++++---------- .../CssMinimizerPlugin.test.js.snap | 10 +- .../parallel-option.test.js.snap | 6 + .../validate-options.test.js.snap | 22 +- test/cache-option.test.js | 86 +++-- test/exclude-option.test.js | 8 +- test/helpers/EmitNewAsset.js | 1 - test/helpers/ModifyExistingAsset.js | 3 +- test/helpers/compile.js | 4 + .../emitAssetInChildCompilationLoader.js | 6 +- test/helpers/emitAssetLoader.js | 4 + test/helpers/emitAssetLoader2.js | 4 + test/helpers/getCompiler.js | 10 +- test/helpers/index.js | 30 +- test/helpers/normalizeErrors.js | 11 +- test/helpers/readAsset.js | 2 +- test/helpers/readAssets.js | 10 +- test/include-option.test.js | 8 +- test/minify-option.test.js | 122 ++++--- test/minimizerOptions-option.test.js | 116 ++++--- test/parallel-option.test.js | 82 ++--- test/sourceMap-option.test.js | 23 +- test/test-option.test.js | 12 +- test/validate-options.test.js | 302 ++++++++--------- test/warningsFilter-option.test.js | 40 ++- test/worker.test.js | 7 +- types/index.d.ts | 143 ++++++-- types/minify.d.ts | 8 +- 37 files changed, 1053 insertions(+), 1009 deletions(-) delete mode 100644 .eslintignore delete mode 100644 .eslintrc.js create mode 100644 eslint.config.mjs diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index 55e2017..0000000 --- a/.eslintignore +++ /dev/null @@ -1,5 +0,0 @@ -/coverage -/dist -/node_modules -/test/fixtures -/types/**/* \ No newline at end of file diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index e8ccbff..0000000 --- a/.eslintrc.js +++ /dev/null @@ -1,7 +0,0 @@ -module.exports = { - root: true, - extends: ["@webpack-contrib/eslint-config-webpack", "prettier"], - rules: { - "import/no-namespace": "off", - }, -}; diff --git a/README.md b/README.md index 1b87cb3..92a7d04 100644 --- a/README.md +++ b/README.md @@ -42,8 +42,8 @@ Then add the plugin to your `webpack` configuration. For example: **webpack.config.js** ```js -const MiniCssExtractPlugin = require("mini-css-extract-plugin"); const CssMinimizerPlugin = require("css-minimizer-webpack-plugin"); +const MiniCssExtractPlugin = require("mini-css-extract-plugin"); module.exports = { module: { @@ -296,15 +296,15 @@ module.exports = { minify: [ CssMinimizerPlugin.cssnanoMinify, CssMinimizerPlugin.cleanCssMinify, - async (data, inputMap, minimizerOptions) => { + async (data, inputMap, minimizerOptions) => // Custom minifier function - return { - code: `a{color: red}`, - map: `{"version": "3", ...}`, + ({ + code: "a{color: red}", + map: "{\"version\": \"3\", ...}", warnings: [], errors: [], - }; - }, + }) + , ], }), ], diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 0000000..e5e2dd9 --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,22 @@ +import { defineConfig } from "eslint/config"; +import configs from "eslint-config-webpack/configs.js"; +import n from "eslint-plugin-n"; + +export default defineConfig([ + { + extends: [configs["recommended-dirty"]], + plugins: { + n, + }, + rules: { + // Disable experimental Node.js API warnings for os.availableParallelism + // This API is widely supported and stable in practice + "n/no-unsupported-features/node-builtins": [ + "error", + { + ignores: ["os.availableParallelism"], + }, + ], + }, + }, +]); diff --git a/package.json b/package.json index 3445871..43c5c2e 100644 --- a/package.json +++ b/package.json @@ -2,20 +2,37 @@ "name": "css-minimizer-webpack-plugin", "version": "7.0.2", "description": "CSS minimizer (minifier) plugin for Webpack", - "license": "MIT", - "repository": "webpack-contrib/css-minimizer-webpack-plugin", - "author": "Loann Neveu", + "keywords": [ + "cssnano", + "css", + "csso", + "clean-css", + "swc", + "esbuild", + "webpack", + "webpack-plugin", + "minimize", + "minimizer", + "minify", + "minifier", + "optimize", + "optimizer" + ], "homepage": "https://github.com/webpack-contrib/css-minimizer-webpack-plugin", "bugs": "https://github.com/webpack-contrib/css-minimizer-webpack-plugin/issues", + "repository": "webpack-contrib/css-minimizer-webpack-plugin", "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, + "license": "MIT", + "author": "Loann Neveu", "main": "dist/index.js", "types": "types/index.d.ts", - "engines": { - "node": ">= 18.12.0" - }, + "files": [ + "dist", + "types" + ], "scripts": { "start": "npm run build -- -w", "clean": "del-cli dist", @@ -41,33 +58,6 @@ "prepare": "husky && npm run build", "release": "standard-version" }, - "files": [ - "dist", - "types" - ], - "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "clean-css": { - "optional": true - }, - "csso": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "@parcel/css": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "@swc/css": { - "optional": true - } - }, "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "cssnano": "^7.0.4", @@ -82,14 +72,15 @@ "@babel/preset-env": "^7.25.3", "@commitlint/cli": "^19.3.0", "@commitlint/config-conventional": "^19.2.2", + "@eslint/markdown": "^6.6.0", "@parcel/css": "^1.8.3", + "@stylistic/eslint-plugin": "^5.2.0", "@swc/css": "^0.0.28", "@types/clean-css": "^4.2.11", "@types/csso": "^5.0.4", "@types/node": "^20.14.9", "@types/serialize-javascript": "^5.0.4", - "@webpack-contrib/eslint-config-webpack": "^3.0.0", - "babel-jest": "^30.0.5", + "babel-jest": "^29.7.0", "clean-css": "^5.3.3", "copy-webpack-plugin": "^9.1.0", "cross-env": "^7.0.3", @@ -100,9 +91,15 @@ "del": "^6.1.0", "del-cli": "^5.1.0", "esbuild": "^0.25.0", - "eslint": "^8.56.0", - "eslint-config-prettier": "^9.1.0", - "eslint-plugin-import": "^2.29.1", + "eslint": "^9.30.1", + "eslint-config-prettier": "^10.1.5", + "eslint-config-webpack": "^4.3.0", + "eslint-plugin-import": "^2.32.0", + "eslint-plugin-jest": "^29.0.1", + "eslint-plugin-jsdoc": "^51.4.1", + "eslint-plugin-n": "^17.21.0", + "eslint-plugin-prettier": "^5.5.3", + "eslint-plugin-unicorn": "^59.0.1", "husky": "^9.1.4", "jest": "^30.0.5", "lightningcss": "^1.25.1", @@ -118,20 +115,30 @@ "typescript": "^5.5.4", "webpack": "^5.93.0" }, - "keywords": [ - "cssnano", - "css", - "csso", - "clean-css", - "swc", - "esbuild", - "webpack", - "webpack-plugin", - "minimize", - "minimizer", - "minify", - "minifier", - "optimize", - "optimizer" - ] + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "clean-css": { + "optional": true + }, + "csso": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "@parcel/css": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "@swc/css": { + "optional": true + } + }, + "engines": { + "node": ">= 18.12.0" + } } diff --git a/setupTest.js b/setupTest.js index 789c166..3687f80 100644 --- a/setupTest.js +++ b/setupTest.js @@ -1 +1,2 @@ +// eslint-disable-next-line no-undef jest.setTimeout(120000); diff --git a/src/index.js b/src/index.js index 973f54c..22f006b 100644 --- a/src/index.js +++ b/src/index.js @@ -1,22 +1,21 @@ -const os = require("os"); +const os = require("node:os"); const { validate } = require("schema-utils"); +const { minify } = require("./minify"); +const schema = require("./options.json"); const { - throttleAll, - memoize, + cleanCssMinify, cssnanoMinify, cssoMinify, - cleanCssMinify, esbuildMinify, - parcelCssMinify, lightningCssMinify, + memoize, + parcelCssMinify, swcMinify, + throttleAll, } = require("./utils"); -const schema = require("./options.json"); -const { minify } = require("./minify"); - /** @typedef {import("schema-utils/declarations/validate").Schema} Schema */ /** @typedef {import("webpack").Compiler} Compiler */ /** @typedef {import("webpack").Compilation} Compilation */ @@ -31,36 +30,36 @@ const { minify } = require("./minify"); /** @typedef {import("@jridgewell/trace-mapping").TraceMap} TraceMap */ /** - * @typedef {Object} CssNanoOptions - * @property {string} [configFile] - * @property {[string, object] | string | undefined} [preset] + * @typedef {Record} CssNanoOptions + * @property {string=} configFile - Configuration file path + * @property {string | [string, Record] | undefined=} preset - CSS nano preset */ /** @typedef {Error & { plugin?: string, text?: string, source?: string } | string} Warning */ /** - * @typedef {Object} WarningObject - * @property {string} message - * @property {string} [plugin] - * @property {string} [text] - * @property {number} [line] - * @property {number} [column] + * @typedef {object} WarningObject + * @property {string} message - Warning message + * @property {string=} plugin - Plugin name + * @property {string=} text - Warning text + * @property {number=} line - Line number + * @property {number=} column - Column number */ /** - * @typedef {Object} ErrorObject - * @property {string} message - * @property {number} [line] - * @property {number} [column] - * @property {string} [stack] + * @typedef {object} ErrorObject + * @property {string} message - Error message + * @property {number=} line - Line number + * @property {number=} column - Column number + * @property {string=} stack - Error stack trace */ /** - * @typedef {Object} MinimizedResult - * @property {string} code - * @property {RawSourceMap} [map] - * @property {Array} [errors] - * @property {Array} [warnings] + * @typedef {object} MinimizedResult + * @property {string} code - Minimized code + * @property {RawSourceMap=} map - Source map + * @property {Array=} errors - Errors + * @property {Array=} warnings - Warnings */ /** @@ -68,7 +67,7 @@ const { minify } = require("./minify"); */ /** - * @typedef {{ [key: string]: any }} CustomOptions + * @typedef {{ [key: string]: unknown }} CustomOptions */ /** @@ -92,7 +91,7 @@ const { minify } = require("./minify"); /** * @typedef {object} MinimizeFunctionHelpers - * @property {() => boolean | undefined} [supportsWorkerThreads] + * @property {() => boolean | undefined=} supportsWorkerThreads - Check if worker threads are supported */ /** @@ -102,18 +101,18 @@ const { minify } = require("./minify"); /** * @template T - * @typedef {Object} InternalOptions - * @property {string} name - * @property {string} input - * @property {RawSourceMap | undefined} inputSourceMap - * @property {{ implementation: MinimizerImplementation, options: MinimizerOptions }} minimizer + * @typedef {object} InternalOptions + * @property {string} name - Name + * @property {string} input - Input + * @property {RawSourceMap | undefined} inputSourceMap - Input source map + * @property {{ implementation: MinimizerImplementation, options: MinimizerOptions }} minimizer - Minimizer */ /** * @typedef InternalResult - * @property {Array<{ code: string, map: RawSourceMap | undefined }>} outputs - * @property {Array} warnings - * @property {Array} errors + * @property {Array<{ code: string, map: RawSourceMap | undefined }>} outputs - Outputs + * @property {Array} warnings - Warnings + * @property {Array} errors - Errors */ /** @typedef {undefined | boolean | number} Parallel */ @@ -124,12 +123,12 @@ const { minify } = require("./minify"); /** @typedef {(warning: Warning | WarningObject | string, file: string, source?: string) => boolean} WarningsFilter */ /** - * @typedef {Object} BasePluginOptions - * @property {Rule} [test] - * @property {Rule} [include] - * @property {Rule} [exclude] - * @property {WarningsFilter} [warningsFilter] - * @property {Parallel} [parallel] + * @typedef {object} BasePluginOptions + * @property {Rule=} test - Test rule + * @property {Rule=} include - Include rule + * @property {Rule=} exclude - Exclude rule + * @property {WarningsFilter=} warningsFilter - Warnings filter + * @property {Parallel=} parallel - Parallel option */ /** @@ -138,7 +137,7 @@ const { minify } = require("./minify"); */ /** - * @typedef{ProcessOptions | { from?: string, to?: string, parser?: string | Syntax | Parser, stringifier?: string | Syntax | Stringifier, syntax?: string | Syntax } } ProcessOptionsExtender + * @typedef {ProcessOptions | { from?: string, to?: string, parser?: string | Syntax | Parser, stringifier?: string | Syntax | Stringifier, syntax?: string | Syntax } } ProcessOptionsExtender */ /** @@ -157,21 +156,15 @@ const { minify } = require("./minify"); const warningRegex = /\s.+:+([0-9]+):+([0-9]+)/; -const getSerializeJavascript = memoize(() => - // eslint-disable-next-line global-require - require("serialize-javascript"), -); -const getTraceMapping = memoize(() => - // eslint-disable-next-line global-require - require("@jridgewell/trace-mapping"), -); +const getSerializeJavascript = memoize(() => require("serialize-javascript")); +const getTraceMapping = memoize(() => require("@jridgewell/trace-mapping")); /** * @template [T=CssNanoOptionsExtended] */ class CssMinimizerPlugin { /** - * @param {BasePluginOptions & DefinedDefaultMinimizerAndOptions} [options] + * @param {BasePluginOptions & DefinedDefaultMinimizerAndOptions=} options Plugin options */ constructor(options) { validate(/** @type {Schema} */ (schema), options || {}, { @@ -208,29 +201,32 @@ class CssMinimizerPlugin { /** * @private - * @param {any} input - * @returns {boolean} + * @param {unknown} input Input to check + * @returns {boolean} - Whether input is a source map */ static isSourceMap(input) { // All required options for `new SourceMapConsumer(...options)` // https://github.com/mozilla/source-map#new-sourcemapconsumerrawsourcemap return Boolean( input && - input.version && - input.sources && + typeof input === "object" && + input !== null && + "version" in input && + "sources" in input && Array.isArray(input.sources) && + "mappings" in input && typeof input.mappings === "string", ); } /** * @private - * @param {Warning | WarningObject | string} warning - * @param {string} file - * @param {WarningsFilter} [warningsFilter] - * @param {TraceMap} [sourceMap] - * @param {Compilation["requestShortener"]} [requestShortener] - * @returns {Error & { hideStack?: boolean, file?: string } | undefined} + * @param {Warning | WarningObject | string} warning Warning + * @param {string} file File name + * @param {WarningsFilter=} warningsFilter Warnings filter + * @param {TraceMap=} sourceMap Source map + * @param {Compilation["requestShortener"]=} requestShortener Request shortener + * @returns {Error & { hideStack?: boolean, file?: string } | undefined} - Built warning */ static buildWarning( warning, @@ -256,8 +252,8 @@ class CssMinimizerPlugin { const match = warningRegex.exec(warning); if (match) { - line = +match[1]; - column = +match[2]; + line = Number(match[1]); + column = Number(match[2]); } } else { ({ line, column } = /** @type {WarningObject} */ (warning)); @@ -304,17 +300,16 @@ class CssMinimizerPlugin { builtWarning.hideStack = true; builtWarning.file = file; - // eslint-disable-next-line consistent-return return builtWarning; } /** * @private - * @param {Error | ErrorObject | string} error - * @param {string} file - * @param {TraceMap} [sourceMap] - * @param {Compilation["requestShortener"]} [requestShortener] - * @returns {Error} + * @param {Error | ErrorObject | string} error Error + * @param {string} file File name + * @param {TraceMap=} sourceMap Source map + * @param {Compilation["requestShortener"]=} requestShortener Request shortener + * @returns {Error} - Built error */ static buildError(error, file, sourceMap, requestShortener) { /** @@ -388,12 +383,13 @@ class CssMinimizerPlugin { /** * @private - * @param {Parallel} parallel - * @returns {number} + * @param {Parallel} parallel Parallel option + * @returns {number} - Available number of cores */ static getAvailableNumberOfCores(parallel) { // In some cases cpus() returns undefined // https://github.com/nodejs/node/issues/19022 + const cpus = typeof os.availableParallelism === "function" ? { length: os.availableParallelism() } @@ -407,8 +403,8 @@ class CssMinimizerPlugin { /** * @private * @template T - * @param {BasicMinimizerImplementation & MinimizeFunctionHelpers} implementation - * @returns {boolean} + * @param {BasicMinimizerImplementation & MinimizeFunctionHelpers} implementation Implementation + * @returns {boolean} - Whether worker threads are supported */ static isSupportsWorkerThreads(implementation) { return typeof implementation.supportsWorkerThreads !== "undefined" @@ -418,11 +414,11 @@ class CssMinimizerPlugin { /** * @private - * @param {Compiler} compiler - * @param {Compilation} compilation - * @param {Record} assets - * @param {{availableNumberOfCores: number}} optimizeOptions - * @returns {Promise} + * @param {Compiler} compiler Compiler + * @param {Compilation} compilation Compilation + * @param {Record} assets Assets + * @param {{availableNumberOfCores: number}} optimizeOptions Optimize options + * @returns {Promise} - Promise */ async optimize(compiler, compilation, assets, optimizeOptions) { const cache = compilation.getCache("CssMinimizerWebpackPlugin"); @@ -441,7 +437,6 @@ class CssMinimizerPlugin { if ( !compiler.webpack.ModuleFilenameHelpers.matchObject.bind( - // eslint-disable-next-line no-undefined undefined, this.options, )(name) @@ -491,7 +486,6 @@ class CssMinimizerPlugin { return initializedWorker; } - // eslint-disable-next-line global-require const { Worker } = require("jest-worker"); initializedWorker = /** @type {MinimizerWorker} */ ( @@ -586,15 +580,14 @@ class CssMinimizerPlugin { compilation.errors.push( /** @type {WebpackError} */ ( CssMinimizerPlugin.buildError( - /** @type {any} */ (error), + /** @type {Error} */ (error), name, hasSourceMap ? new (getTraceMapping().TraceMap)( /** @type {RawSourceMap} */ (inputSourceMap), ) - : // eslint-disable-next-line no-undefined - undefined, - // eslint-disable-next-line no-undefined + : undefined, + hasSourceMap ? compilation.requestShortener : undefined, ) ), @@ -645,9 +638,8 @@ class CssMinimizerPlugin { ? new (getTraceMapping().TraceMap)( /** @type {RawSourceMap} */ (inputSourceMap), ) - : // eslint-disable-next-line no-undefined - undefined, - // eslint-disable-next-line no-undefined + : undefined, + hasSourceMap ? compilation.requestShortener : undefined, ), ); @@ -667,9 +659,8 @@ class CssMinimizerPlugin { ? new (getTraceMapping().TraceMap)( /** @type {RawSourceMap} */ (inputSourceMap), ) - : // eslint-disable-next-line no-undefined - undefined, - // eslint-disable-next-line no-undefined + : undefined, + hasSourceMap ? compilation.requestShortener : undefined, ); @@ -717,8 +708,8 @@ class CssMinimizerPlugin { } /** - * @param {Compiler} compiler - * @returns {void} + * @param {Compiler} compiler Compiler + * @returns {void} - Void */ apply(compiler) { const pluginName = this.constructor.name; @@ -746,10 +737,11 @@ class CssMinimizerPlugin { .tap( "css-minimizer-webpack-plugin", (minimized, { green, formatFlag }) => - // eslint-disable-next-line no-undefined minimized - ? /** @type {Function} */ (green)( - /** @type {Function} */ (formatFlag)("minimized"), + ? /** @type {(text: string) => string} */ (green)( + /** @type {(flag: string) => string} */ (formatFlag)( + "minimized", + ), ) : "", ); diff --git a/src/minify.js b/src/minify.js index 8f76cbf..dbef5bc 100644 --- a/src/minify.js +++ b/src/minify.js @@ -3,8 +3,8 @@ /** * @template T - * @param {import("./index.js").InternalOptions} options - * @returns {Promise} + * @param {import("./index.js").InternalOptions} options Options + * @returns {Promise} - Promise with internal result */ async function minify(options) { const minifyFns = Array.isArray(options.minimizer.implementation) @@ -26,7 +26,7 @@ async function minify(options) { ? result.outputs[result.outputs.length - 1] : { code: options.input, map: options.inputSourceMap }; const { code, map } = prevResult; - // eslint-disable-next-line no-await-in-loop + const minifyResult = await minifyFn( { [options.name]: code }, map, @@ -44,11 +44,11 @@ async function minify(options) { } if (minifyResult.errors) { - result.errors = result.errors.concat(minifyResult.errors); + result.errors = [...result.errors, ...minifyResult.errors]; } if (minifyResult.warnings) { - result.warnings = result.warnings.concat(minifyResult.warnings); + result.warnings = [...result.warnings, ...minifyResult.warnings]; } result.outputs.push({ code: minifyResult.code, map: minifyResult.map }); @@ -62,13 +62,13 @@ async function minify(options) { } /** - * @param {string} options - * @returns {Promise} + * @param {string} options Options string + * @returns {Promise} - Promise with internal result */ async function transform(options) { // 'use strict' => this === undefined (Clean Scope) // Safer for possible security issues, albeit not critical at all here - // eslint-disable-next-line no-new-func, no-param-reassign + // eslint-disable-next-line no-new-func const evaluatedOptions = new Function( "exports", "require", @@ -76,7 +76,7 @@ async function transform(options) { "__filename", "__dirname", `'use strict'\nreturn ${options}`, - )(exports, require, module, __filename, __dirname); + )(module.exports, require, module, __filename, __dirname); return minify(evaluatedOptions); } diff --git a/src/utils.js b/src/utils.js index 8466f32..a95af47 100644 --- a/src/utils.js +++ b/src/utils.js @@ -5,7 +5,7 @@ /** @typedef {import("postcss").ProcessOptions} ProcessOptions */ /** @typedef {import("postcss").Postcss} Postcss */ -const notSettled = Symbol(`not-settled`); +const notSettled = Symbol("not-settled"); /** * @template T @@ -15,8 +15,8 @@ const notSettled = Symbol(`not-settled`); /** * Run tasks with limited concurrency. * @template T - * @param {number} limit - Limit of tasks that run at once. - * @param {Task[]} tasks - List of tasks to run. + * @param {number} limit Limit of tasks that run at once. + * @param {Task[]} tasks List of tasks to run. * @returns {Promise} A promise that fulfills to an array of the results */ function throttleAll(limit, tasks) { @@ -28,15 +28,15 @@ function throttleAll(limit, tasks) { if ( !Array.isArray(tasks) || - !tasks.every((task) => typeof task === `function`) + !tasks.every((task) => typeof task === "function") ) { throw new TypeError( - `Expected \`tasks\` to be a list of functions returning a promise`, + "Expected `tasks` to be a list of functions returning a promise", ); } return new Promise((resolve, reject) => { - const result = Array(tasks.length).fill(notSettled); + const result = Array.from({ length: tasks.length }).fill(notSettled); const entries = tasks.entries(); const next = () => { const { done, value } = entries.next(); @@ -52,26 +52,28 @@ function throttleAll(limit, tasks) { const [index, task] = value; /** - * @param {T} x + * @param {T} resultValue Result value */ - const onFulfilled = (x) => { - result[index] = x; + const onFulfilled = (resultValue) => { + result[index] = resultValue; next(); }; task().then(onFulfilled, reject); }; - Array(limit).fill(0).forEach(next); + for (let i = 0; i < limit; i++) { + next(); + } }); } /* istanbul ignore next */ /** - * @param {Input} input - * @param {RawSourceMap} [sourceMap] - * @param {CustomOptions} [minimizerOptions] - * @return {Promise} + * @param {Input} input Input + * @param {RawSourceMap=} sourceMap Source map + * @param {CustomOptions=} minimizerOptions Minimizer options + * @returns {Promise} - Promise with minimized result */ async function cssnanoMinify( input, @@ -80,30 +82,29 @@ async function cssnanoMinify( ) { /** * @template T - * @param {string} module - * @returns {Promise} + * @param {string} module Module to load + * @returns {Promise} - Promise with loaded module */ const load = async (module) => { let exports; try { - // eslint-disable-next-line import/no-dynamic-require, global-require exports = require(module); return exports; - } catch (requireError) { + } catch (err) { let importESM; try { // eslint-disable-next-line no-new-func importESM = new Function("id", "return import(id);"); - } catch (e) { + } catch { importESM = null; } if ( /** @type {Error & {code: string}} */ - (requireError).code === "ERR_REQUIRE_ESM" && + (err).code === "ERR_REQUIRE_ESM" && importESM ) { exports = await importESM(module); @@ -111,7 +112,7 @@ async function cssnanoMinify( return exports.default; } - throw requireError; + throw err; } }; @@ -119,7 +120,8 @@ async function cssnanoMinify( /** @type {ProcessOptions} */ const postcssOptions = { from: name, - ...minimizerOptions.processorOptions, + // eslint-disable-next-line unicorn/no-useless-fallback-in-spread + ...(minimizerOptions.processorOptions || {}), }; if (typeof postcssOptions.parser === "string") { @@ -163,12 +165,11 @@ async function cssnanoMinify( } /** @type {Postcss} */ - // eslint-disable-next-line global-require + const postcss = require("postcss").default; - // @ts-ignore - // eslint-disable-next-line global-require + const cssnano = require("cssnano"); - // @ts-ignore + // Types are broken const result = await postcss([cssnano(minimizerOptions)]).process( code, @@ -177,11 +178,12 @@ async function cssnanoMinify( return { code: result.css, - // @ts-ignore + map: result.map - ? result.map.toJSON() - : // eslint-disable-next-line no-undefined - undefined, + ? /** @type {RawSourceMap} */ ( + /** @type {unknown} */ (result.map.toJSON()) + ) + : undefined, warnings: result.warnings().map(String), }; } @@ -190,14 +192,14 @@ cssnanoMinify.supportsWorkerThreads = () => true; /* istanbul ignore next */ /** - * @param {Input} input - * @param {RawSourceMap} [sourceMap] - * @param {CustomOptions} [minimizerOptions] - * @return {Promise} + * @param {Input} input Input + * @param {RawSourceMap=} sourceMap Source map + * @param {CustomOptions=} minimizerOptions Minimizer options + * @returns {Promise} - Promise with minimized result */ async function cssoMinify(input, sourceMap, minimizerOptions) { - // eslint-disable-next-line global-require,import/no-extraneous-dependencies const csso = require("csso"); + const [[filename, code]] = Object.entries(input); const result = csso.minify(code, { filename, @@ -208,10 +210,10 @@ async function cssoMinify(input, sourceMap, minimizerOptions) { return { code: result.css, map: result.map - ? /** @type {any & { toJSON(): RawSourceMap }} */ - (result.map).toJSON() - : // eslint-disable-next-line no-undefined - undefined, + ? /** @type {RawSourceMap} */ ( + /** @type {{ toJSON(): RawSourceMap }} */ (result.map).toJSON() + ) + : undefined, }; } @@ -219,14 +221,14 @@ cssoMinify.supportsWorkerThreads = () => true; /* istanbul ignore next */ /** - * @param {Input} input - * @param {RawSourceMap} [sourceMap] - * @param {CustomOptions} [minimizerOptions] - * @return {Promise} + * @param {Input} input Input + * @param {RawSourceMap=} sourceMap Source map + * @param {CustomOptions=} minimizerOptions Minimizer options + * @returns {Promise} - Promise with minimized result */ async function cleanCssMinify(input, sourceMap, minimizerOptions) { - // eslint-disable-next-line global-require,import/no-extraneous-dependencies const CleanCSS = require("clean-css"); + const [[name, code]] = Object.entries(input); const result = await new CleanCSS({ sourceMap: Boolean(sourceMap), @@ -234,22 +236,24 @@ async function cleanCssMinify(input, sourceMap, minimizerOptions) { returnPromise: true, }).minify({ [name]: { styles: code } }); - const generatedSourceMap = - result.sourceMap && - /** @type {any & { toJSON(): RawSourceMap }} */ - (result.sourceMap).toJSON(); + const generatedSourceMap = result.sourceMap + ? /** @type {RawSourceMap} */ ( + // eslint-disable-next-line jsdoc/no-restricted-syntax + /** @type {any} */ (result.sourceMap).toJSON() + ) + : undefined; // workaround for source maps on windows if (generatedSourceMap) { - // eslint-disable-next-line global-require - const isWindowsPathSep = require("path").sep === "\\"; + const isWindowsPathSep = require("node:path").sep === "\\"; generatedSourceMap.sources = generatedSourceMap.sources.map( /** - * @param {string} item - * @returns {string} + * @param {string | null} item Path item + * @returns {string} - Normalized path */ - (item) => (isWindowsPathSep ? item.replace(/\\/g, "/") : item), + (item) => + isWindowsPathSep ? (item || "").replaceAll("\\", "/") : item || "", ); } @@ -264,28 +268,26 @@ cleanCssMinify.supportsWorkerThreads = () => true; /* istanbul ignore next */ /** - * @param {Input} input - * @param {RawSourceMap} [sourceMap] - * @param {CustomOptions} [minimizerOptions] - * @return {Promise} + * @param {Input} input Input + * @param {RawSourceMap=} sourceMap Source map + * @param {CustomOptions=} minimizerOptions Minimizer options + * @returns {Promise} - Promise with minimized result */ async function esbuildMinify(input, sourceMap, minimizerOptions) { /** - * @param {import("esbuild").TransformOptions} [esbuildOptions={}] - * @returns {import("esbuild").TransformOptions} + * @param {import("esbuild").TransformOptions=} esbuildOptions ESBuild options + * @returns {import("esbuild").TransformOptions} - Built ESBuild options */ - const buildEsbuildOptions = (esbuildOptions = {}) => { + const buildEsbuildOptions = (esbuildOptions = {}) => // Need deep copy objects to avoid https://github.com/terser/terser/issues/366 - return { + ({ loader: "css", minify: true, legalComments: "inline", ...esbuildOptions, sourcemap: false, - }; - }; + }); - // eslint-disable-next-line import/no-extraneous-dependencies, global-require const esbuild = require("esbuild"); // Copy `esbuild` options @@ -305,50 +307,46 @@ async function esbuildMinify(input, sourceMap, minimizerOptions) { return { code: result.code, - // eslint-disable-next-line no-undefined + map: result.map ? JSON.parse(result.map) : undefined, warnings: result.warnings.length > 0 - ? result.warnings.map((item) => { - return { - source: item.location && item.location.file, - line: - item.location && item.location.line - ? item.location.line - : // eslint-disable-next-line no-undefined - undefined, - column: - item.location && item.location.column - ? item.location.column - : // eslint-disable-next-line no-undefined - undefined, - plugin: item.pluginName, - message: `${item.text}${ - item.detail ? `\nDetails:\n${item.detail}` : "" - }${ - item.notes.length > 0 - ? `\n\nNotes:\n${item.notes - .map( - (note) => - `${ - note.location - ? `[${note.location.file}:${note.location.line}:${note.location.column}] ` - : "" - }${note.text}${ - note.location - ? `\nSuggestion: ${note.location.suggestion}` - : "" - }${ - note.location - ? `\nLine text:\n${note.location.lineText}\n` - : "" - }`, - ) - .join("\n")}` - : "" - }`, - }; - }) + ? result.warnings.map((item) => ({ + source: item.location && item.location.file, + line: + item.location && item.location.line + ? item.location.line + : undefined, + column: + item.location && item.location.column + ? item.location.column + : undefined, + plugin: item.pluginName, + message: `${item.text}${ + item.detail ? `\nDetails:\n${item.detail}` : "" + }${ + item.notes.length > 0 + ? `\n\nNotes:\n${item.notes + .map( + (note) => + `${ + note.location + ? `[${note.location.file}:${note.location.line}:${note.location.column}] ` + : "" + }${note.text}${ + note.location + ? `\nSuggestion: ${note.location.suggestion}` + : "" + }${ + note.location + ? `\nLine text:\n${note.location.lineText}\n` + : "" + }`, + ) + .join("\n")}` + : "" + }`, + })) : [], }; } @@ -358,29 +356,28 @@ esbuildMinify.supportsWorkerThreads = () => false; // TODO remove in the next major release /* istanbul ignore next */ /** - * @param {Input} input - * @param {RawSourceMap} [sourceMap] - * @param {CustomOptions} [minimizerOptions] - * @return {Promise} + * @param {Input} input Input + * @param {RawSourceMap=} sourceMap Source map + * @param {CustomOptions=} minimizerOptions Minimizer options + * @returns {Promise} - Promise with minimized result */ async function parcelCssMinify(input, sourceMap, minimizerOptions) { const [[filename, code]] = Object.entries(input); + // eslint-disable-next-line jsdoc/no-restricted-syntax /** - * @param {Partial>} [parcelCssOptions={}] - * @returns {import("@parcel/css").TransformOptions} + * @param {Partial>=} parcelCssOptions Parcel CSS options + * @returns {import("@parcel/css").TransformOptions} - Built Parcel CSS options */ - const buildParcelCssOptions = (parcelCssOptions = {}) => { + const buildParcelCssOptions = (parcelCssOptions = {}) => // Need deep copy objects to avoid https://github.com/terser/terser/issues/366 - return { + ({ minify: true, ...parcelCssOptions, sourceMap: false, filename, - code: Buffer.from(code), - }; - }; + code: new Uint8Array(Buffer.from(code)), + }); - // eslint-disable-next-line import/no-extraneous-dependencies, global-require const parcelCss = require("@parcel/css"); // Copy `parcel-css` options @@ -395,7 +392,7 @@ async function parcelCssMinify(input, sourceMap, minimizerOptions) { return { code: result.code.toString(), - // eslint-disable-next-line no-undefined + map: result.map ? JSON.parse(result.map.toString()) : undefined, }; } @@ -404,29 +401,28 @@ parcelCssMinify.supportsWorkerThreads = () => false; /* istanbul ignore next */ /** - * @param {Input} input - * @param {RawSourceMap} [sourceMap] - * @param {CustomOptions} [minimizerOptions] - * @return {Promise} + * @param {Input} input Input + * @param {RawSourceMap=} sourceMap Source map + * @param {CustomOptions=} minimizerOptions Minimizer options + * @returns {Promise} - Promise with minimized result */ async function lightningCssMinify(input, sourceMap, minimizerOptions) { const [[filename, code]] = Object.entries(input); + // eslint-disable-next-line jsdoc/no-restricted-syntax /** - * @param {Partial>} [lightningCssOptions={}] - * @returns {import("lightningcss").TransformOptions} + * @param {Partial>=} lightningCssOptions Lightning CSS options + * @returns {import("lightningcss").TransformOptions} - Built Lightning CSS options */ - const buildLightningCssOptions = (lightningCssOptions = {}) => { + const buildLightningCssOptions = (lightningCssOptions = {}) => // Need deep copy objects to avoid https://github.com/terser/terser/issues/366 - return { + ({ minify: true, ...lightningCssOptions, sourceMap: false, filename, - code: Buffer.from(code), - }; - }; + code: new Uint8Array(Buffer.from(code)), + }); - // eslint-disable-next-line import/no-extraneous-dependencies, global-require const lightningCss = require("lightningcss"); // Copy `lightningCss` options @@ -441,7 +437,7 @@ async function lightningCssMinify(input, sourceMap, minimizerOptions) { return { code: result.code.toString(), - // eslint-disable-next-line no-undefined + map: result.map ? JSON.parse(result.map.toString()) : undefined, }; } @@ -450,26 +446,24 @@ lightningCssMinify.supportsWorkerThreads = () => false; /* istanbul ignore next */ /** - * @param {Input} input - * @param {RawSourceMap} [sourceMap] - * @param {CustomOptions} [minimizerOptions] - * @return {Promise} + * @param {Input} input Input + * @param {RawSourceMap=} sourceMap Source map + * @param {CustomOptions=} minimizerOptions Minimizer options + * @returns {Promise} - Promise with minimized result */ async function swcMinify(input, sourceMap, minimizerOptions) { const [[filename, code]] = Object.entries(input); /** - * @param {Partial} [swcOptions={}] - * @returns {import("@swc/css").MinifyOptions} + * @param {Partial=} swcOptions SWC options + * @returns {import("@swc/css").MinifyOptions} - Built SWC options */ - const buildSwcOptions = (swcOptions = {}) => { + const buildSwcOptions = (swcOptions = {}) => // Need deep copy objects to avoid https://github.com/terser/terser/issues/366 - return { + ({ ...swcOptions, filename, - }; - }; + }); - // eslint-disable-next-line import/no-extraneous-dependencies, global-require const swc = require("@swc/css"); // Copy `swc` options @@ -484,21 +478,21 @@ async function swcMinify(input, sourceMap, minimizerOptions) { return { code: result.code.toString(), - // eslint-disable-next-line no-undefined + map: result.map ? JSON.parse(result.map.toString()) : undefined, errors: result.errors ? result.errors.map((diagnostic) => { const error = new Error(diagnostic.message); - // @ts-ignore - error.span = diagnostic.span; - // @ts-ignore - error.level = diagnostic.level; + // eslint-disable-next-line jsdoc/no-restricted-syntax + /** @type {any} */ (error).span = diagnostic.span; + + // eslint-disable-next-line jsdoc/no-restricted-syntax + /** @type {any} */ (error).level = diagnostic.level; return error; }) - : // eslint-disable-next-line no-undefined - undefined, + : undefined, }; } @@ -506,8 +500,8 @@ swcMinify.supportsWorkerThreads = () => false; /** * @template T - * @param fn {(function(): any) | undefined} - * @returns {function(): T} + * @param {(() => unknown) | undefined} fn Function to memoize + * @returns {() => T} - Memoized function */ function memoize(fn) { let cache = false; @@ -518,11 +512,11 @@ function memoize(fn) { if (cache) { return result; } - result = /** @type {function(): any} */ (fn)(); + result = /** @type {T} */ (/** @type {() => unknown} */ (fn)()); cache = true; // Allow to clean up memory for fn // and all dependent resources - // eslint-disable-next-line no-undefined, no-param-reassign + fn = undefined; return result; @@ -530,13 +524,13 @@ function memoize(fn) { } module.exports = { - throttleAll, - memoize, + cleanCssMinify, cssnanoMinify, cssoMinify, - cleanCssMinify, esbuildMinify, - parcelCssMinify, lightningCssMinify, + memoize, + parcelCssMinify, swcMinify, + throttleAll, }; diff --git a/test/CssMinimizerPlugin.test.js b/test/CssMinimizerPlugin.test.js index 59ed27d..70ba3bb 100644 --- a/test/CssMinimizerPlugin.test.js +++ b/test/CssMinimizerPlugin.test.js @@ -1,21 +1,21 @@ -import path from "path"; +import path from "node:path"; import { TraceMap } from "@jridgewell/trace-mapping"; -import MiniCssExtractPlugin from "mini-css-extract-plugin"; import CopyPlugin from "copy-webpack-plugin"; +import MiniCssExtractPlugin from "mini-css-extract-plugin"; import RequestShortener from "webpack/lib/RequestShortener"; import CssMinimizerPlugin from "../src/index"; import { + EmitNewAsset, + ModifyExistingAsset, + compile, getCompiler, getErrors, getWarnings, - compile, - readAssets, readAsset, - ModifyExistingAsset, - EmitNewAsset, + readAssets, } from "./helpers"; describe("CssMinimizerPlugin", () => { @@ -48,7 +48,7 @@ describe("CssMinimizerPlugin", () => { hashSalt: "salt", }, entry: { - entry: `${__dirname}/fixtures/test/foo.css`, + entry: path.join(__dirname, "fixtures", "test", "foo.css"), }, }); new CssMinimizerPlugin({ @@ -81,17 +81,16 @@ describe("CssMinimizerPlugin", () => { const compiler = getCompiler({ entry: { - one: `${__dirname}/fixtures/entry.js`, - two: `${__dirname}/fixtures/entry.js`, + one: path.join(__dirname, "fixtures", "entry.js"), + two: path.join(__dirname, "fixtures", "entry.js"), }, }); new CssMinimizerPlugin({ parallel: true, minify: () => { - // eslint-disable-next-line no-console process.stdout.write("stdout\n"); - // eslint-disable-next-line no-console + process.stderr.write("stderr\n"); return { code: ".minify {};" }; @@ -191,7 +190,7 @@ describe("CssMinimizerPlugin", () => { CssMinimizerPlugin.buildWarning( "Warning test.css:1:1", "test.css", - // eslint-disable-next-line no-undefined + undefined, new TraceMap(rawSourceMap), ), @@ -200,7 +199,7 @@ describe("CssMinimizerPlugin", () => { CssMinimizerPlugin.buildWarning( "Warning test.css:1:1", "test.css", - // eslint-disable-next-line no-undefined + undefined, new TraceMap(rawSourceMap), new RequestShortener("/example.com/www/js/"), @@ -232,7 +231,7 @@ describe("CssMinimizerPlugin", () => { column: 1, }, "test.css", - // eslint-disable-next-line no-undefined + undefined, new TraceMap(rawSourceMap), new RequestShortener("/example.com/www/js/"), @@ -243,14 +242,14 @@ describe("CssMinimizerPlugin", () => { it("should build error", () => { const compiler = getCompiler({ entry: { - foo: `${__dirname}/fixtures/test/foo.css`, + foo: path.join(__dirname, "fixtures", "test", "foo.css"), }, plugins: [ new CopyPlugin({ patterns: [ { - context: `${__dirname}/fixtures/test`, - from: `error.css`, + context: path.join(__dirname, "fixtures", "test"), + from: "error.css", }, ], }), @@ -273,14 +272,14 @@ describe("CssMinimizerPlugin", () => { const compiler = getCompiler({ devtool: "source-map", entry: { - foo: `${__dirname}/fixtures/test/foo.css`, + foo: path.join(__dirname, "fixtures", "test", "foo.css"), }, }); new CssMinimizerPlugin({ minify: (data) => { - // eslint-disable-next-line global-require const postcss = require("postcss"); + const plugin = () => { let erroredDecl; @@ -315,29 +314,25 @@ describe("CssMinimizerPlugin", () => { const compiler = getCompiler({ devtool: "source-map", entry: { - foo: `${__dirname}/fixtures/test/foo.css`, + foo: path.join(__dirname, "fixtures", "test", "foo.css"), }, }); new CssMinimizerPlugin({ minify: (data) => { - // eslint-disable-next-line global-require const postcss = require("postcss"); - const plugin = () => { - let rule; - return { - postcssPlugin: "warning-plugin", - Declaration(decl, { result }) { - result.warn("Warning", { - node: rule, - word: "warning_word", - index: 2, - plugin: "warning-plugin", - }); - }, - }; - }; + const plugin = () => ({ + postcssPlugin: "warning-plugin", + Declaration(decl, { result }) { + result.warn("Warning", { + node: decl, + word: "warning_word", + index: 2, + plugin: "warning-plugin", + }); + }, + }); plugin.postcss = true; @@ -345,13 +340,11 @@ describe("CssMinimizerPlugin", () => { return postcss([plugin]) .process(input, { from: filename, to: filename }) - .then((result) => { - return { - code: result.css, - map: result.map, - warnings: result.warnings(), - }; - }); + .then((result) => ({ + code: result.css, + map: result.map, + warnings: result.warnings(), + })); }, }).apply(compiler); @@ -365,7 +358,7 @@ describe("CssMinimizerPlugin", () => { const config = { devtool: "source-map", entry: { - entry: `${__dirname}/fixtures/foo.css`, + entry: path.join(__dirname, "fixtures", "foo.css"), }, plugins: [ new MiniCssExtractPlugin({ @@ -383,7 +376,6 @@ describe("CssMinimizerPlugin", () => { expect(stats.compilation.errors).toEqual([]); expect(stats.compilation.warnings).toEqual([]); - // eslint-disable-next-line guard-for-in for (const file in stats.compilation.assets) { if (/\.css\?/.test(file)) { expect(readAsset(file, compiler, stats)).toMatchSnapshot(file); @@ -399,7 +391,7 @@ describe("CssMinimizerPlugin", () => { it("should work with child compilation", async () => { const compiler = getCompiler({ entry: { - entry: `${__dirname}/fixtures/entry.js`, + entry: path.join(__dirname, "fixtures", "entry.js"), }, module: { rules: [ @@ -433,7 +425,7 @@ describe("CssMinimizerPlugin", () => { it("should work and show minimized assets in stats", async () => { const compiler = getCompiler({ entry: { - foo: `${__dirname}/fixtures/entry.js`, + foo: path.join(__dirname, "fixtures", "entry.js"), }, }); @@ -452,7 +444,7 @@ describe("CssMinimizerPlugin", () => { it("should work and generate real content hash", async () => { const compiler = getCompiler({ entry: { - entry: `${__dirname}/fixtures/entry.js`, + entry: path.join(__dirname, "fixtures", "entry.js"), }, output: { pathinfo: false, @@ -485,7 +477,7 @@ describe("CssMinimizerPlugin", () => { for (const assetName of Object.keys(assets)) { const [, webpackHash] = assetName.match(/^.+?\.(.+?)\..+$/); const { hashDigestLength, hashDigest, hashFunction } = output; - // eslint-disable-next-line global-require + const cryptoHash = require("webpack") .util.createHash(hashFunction) .update(readAsset(assetName, compiler, stats)) @@ -503,7 +495,7 @@ describe("CssMinimizerPlugin", () => { it("should work and use memory cache out of box", async () => { const compiler = getCompiler({ entry: { - foo: `${__dirname}/fixtures/simple.js`, + foo: path.join(__dirname, "fixtures", "simple.js"), }, plugins: [ new MiniCssExtractPlugin({ @@ -539,26 +531,20 @@ describe("CssMinimizerPlugin", () => { expect(getWarnings(stats)).toMatchSnapshot("errors"); expect(getErrors(stats)).toMatchSnapshot("warnings"); - await new Promise(async (resolve) => { - const newStats = await compile(compiler); - - expect(newStats.compilation.emittedAssets.size).toBe(0); + const newStats = await compile(compiler); - expect(readAssets(compiler, newStats, /\.css$/)).toMatchSnapshot( - "assets", - ); - expect(getWarnings(newStats)).toMatchSnapshot("warnings"); - expect(getErrors(newStats)).toMatchSnapshot("errors"); + expect(newStats.compilation.emittedAssets.size).toBe(0); - resolve(); - }); + expect(readAssets(compiler, newStats, /\.css$/)).toMatchSnapshot("assets"); + expect(getWarnings(newStats)).toMatchSnapshot("warnings"); + expect(getErrors(newStats)).toMatchSnapshot("errors"); }); it('should work and use memory cache when the "cache" option is "true"', async () => { const compiler = getCompiler({ cache: true, entry: { - foo: `${__dirname}/fixtures/simple.js`, + foo: path.join(__dirname, "fixtures", "simple.js"), }, plugins: [ new MiniCssExtractPlugin({ @@ -594,26 +580,20 @@ describe("CssMinimizerPlugin", () => { expect(getWarnings(stats)).toMatchSnapshot("errors"); expect(getErrors(stats)).toMatchSnapshot("warnings"); - await new Promise(async (resolve) => { - const newStats = await compile(compiler); - - expect(newStats.compilation.emittedAssets.size).toBe(0); + const newStats = await compile(compiler); - expect(readAssets(compiler, newStats, /\.css$/)).toMatchSnapshot( - "assets", - ); - expect(getWarnings(newStats)).toMatchSnapshot("warnings"); - expect(getErrors(newStats)).toMatchSnapshot("errors"); + expect(newStats.compilation.emittedAssets.size).toBe(0); - resolve(); - }); + expect(readAssets(compiler, newStats, /\.css$/)).toMatchSnapshot("assets"); + expect(getWarnings(newStats)).toMatchSnapshot("warnings"); + expect(getErrors(newStats)).toMatchSnapshot("errors"); }); it('should work and use memory cache when the "cache" option is "true" and the asset has been changed', async () => { const compiler = getCompiler({ cache: true, entry: { - foo: `${__dirname}/fixtures/simple.js`, + foo: path.join(__dirname, "fixtures", "simple.js"), }, plugins: [ new MiniCssExtractPlugin({ @@ -651,26 +631,20 @@ describe("CssMinimizerPlugin", () => { new ModifyExistingAsset({ name: "foo.css" }).apply(compiler); - await new Promise(async (resolve) => { - const newStats = await compile(compiler); - - expect(newStats.compilation.emittedAssets.size).toBe(1); + const newStats = await compile(compiler); - expect(readAssets(compiler, newStats, /\.css$/)).toMatchSnapshot( - "assets", - ); - expect(getWarnings(newStats)).toMatchSnapshot("warnings"); - expect(getErrors(newStats)).toMatchSnapshot("errors"); + expect(newStats.compilation.emittedAssets.size).toBe(1); - resolve(); - }); + expect(readAssets(compiler, newStats, /\.css$/)).toMatchSnapshot("assets"); + expect(getWarnings(newStats)).toMatchSnapshot("warnings"); + expect(getErrors(newStats)).toMatchSnapshot("errors"); }); it('should work with source map and use memory cache when the "cache" option is "true"', async () => { const compiler = getCompiler({ devtool: "source-map", entry: { - foo: `${__dirname}/fixtures/simple.js`, + foo: path.join(__dirname, "fixtures", "simple.js"), }, plugins: [ new MiniCssExtractPlugin({ @@ -708,26 +682,22 @@ describe("CssMinimizerPlugin", () => { expect(getWarnings(stats)).toMatchSnapshot("errors"); expect(getErrors(stats)).toMatchSnapshot("warnings"); - await new Promise(async (resolve) => { - const newStats = await compile(compiler); + const newStats = await compile(compiler); - expect(newStats.compilation.emittedAssets.size).toBe(0); + expect(newStats.compilation.emittedAssets.size).toBe(0); - expect(readAssets(compiler, newStats, /\.css(\.map)?$/)).toMatchSnapshot( - "assets", - ); - expect(getWarnings(newStats)).toMatchSnapshot("warnings"); - expect(getErrors(newStats)).toMatchSnapshot("errors"); - - resolve(); - }); + expect(readAssets(compiler, newStats, /\.css(\.map)?$/)).toMatchSnapshot( + "assets", + ); + expect(getWarnings(newStats)).toMatchSnapshot("warnings"); + expect(getErrors(newStats)).toMatchSnapshot("errors"); }); it('should work with source map and use memory cache when the "cache" option is "true" and the asset has been changed', async () => { const compiler = getCompiler({ devtool: "source-map", entry: { - foo: `${__dirname}/fixtures/simple.js`, + foo: path.join(__dirname, "fixtures", "simple.js"), }, plugins: [ new MiniCssExtractPlugin({ @@ -767,25 +737,21 @@ describe("CssMinimizerPlugin", () => { new ModifyExistingAsset({ name: "foo.css" }).apply(compiler); - await new Promise(async (resolve) => { - const newStats = await compile(compiler); + const newStats = await compile(compiler); - expect(newStats.compilation.emittedAssets.size).toBe(2); + expect(newStats.compilation.emittedAssets.size).toBe(2); - expect(readAssets(compiler, newStats, /\.css(\.map)?$/)).toMatchSnapshot( - "assets", - ); - expect(getWarnings(newStats)).toMatchSnapshot("warnings"); - expect(getErrors(newStats)).toMatchSnapshot("errors"); - - resolve(); - }); + expect(readAssets(compiler, newStats, /\.css(\.map)?$/)).toMatchSnapshot( + "assets", + ); + expect(getWarnings(newStats)).toMatchSnapshot("warnings"); + expect(getErrors(newStats)).toMatchSnapshot("errors"); }); it('should work with warnings and use memory cache when the "cache" option is "true"', async () => { const compiler = getCompiler({ entry: { - foo: `${__dirname}/fixtures/simple.js`, + foo: path.join(__dirname, "fixtures", "simple.js"), }, plugins: [ new MiniCssExtractPlugin({ @@ -813,33 +779,29 @@ describe("CssMinimizerPlugin", () => { new CssMinimizerPlugin({ minify: (data) => { - // eslint-disable-next-line global-require const postcss = require("postcss"); + const [[fileName, input]] = Object.entries(data); - const plugin = () => { - return { - postcssPlugin: "warning-plugin", - OnceExit(decl, { result }) { - result.warn(`Warning from ${result.opts.from}`, { - plugin: "warning-plugin", - }); - }, - }; - }; + const plugin = () => ({ + postcssPlugin: "warning-plugin", + OnceExit(decl, { result }) { + result.warn(`Warning from ${result.opts.from}`, { + plugin: "warning-plugin", + }); + }, + }); plugin.postcss = true; return postcss([plugin]) .process(input, { from: fileName, to: fileName }) - .then((result) => { - return { - code: result.css, - map: result.map, - error: result.error, - warnings: result.warnings(), - }; - }); + .then((result) => ({ + code: result.css, + map: result.map, + error: result.error, + warnings: result.warnings(), + })); }, }).apply(compiler); @@ -851,25 +813,19 @@ describe("CssMinimizerPlugin", () => { expect(getWarnings(stats)).toMatchSnapshot("errors"); expect(getErrors(stats)).toMatchSnapshot("warnings"); - await new Promise(async (resolve) => { - const newStats = await compile(compiler); - - expect(newStats.compilation.emittedAssets.size).toBe(0); + const newStats = await compile(compiler); - expect(readAssets(compiler, newStats, /\.css$/)).toMatchSnapshot( - "assets", - ); - expect(getWarnings(newStats)).toMatchSnapshot("warnings"); - expect(getErrors(newStats)).toMatchSnapshot("errors"); + expect(newStats.compilation.emittedAssets.size).toBe(0); - resolve(); - }); + expect(readAssets(compiler, newStats, /\.css$/)).toMatchSnapshot("assets"); + expect(getWarnings(newStats)).toMatchSnapshot("warnings"); + expect(getErrors(newStats)).toMatchSnapshot("errors"); }); it('should work with warnings and use memory cache when the "cache" option is "true" and the asset has been changed', async () => { const compiler = getCompiler({ entry: { - foo: `${__dirname}/fixtures/simple.js`, + foo: path.join(__dirname, "fixtures", "simple.js"), }, plugins: [ new MiniCssExtractPlugin({ @@ -897,33 +853,29 @@ describe("CssMinimizerPlugin", () => { new CssMinimizerPlugin({ minify: (data) => { - // eslint-disable-next-line global-require const postcss = require("postcss"); + const [[fileName, input]] = Object.entries(data); - const plugin = () => { - return { - postcssPlugin: "warning-plugin", - OnceExit(decl, { result }) { - result.warn(`Warning from ${result.opts.from}`, { - plugin: "warning-plugin", - }); - }, - }; - }; + const plugin = () => ({ + postcssPlugin: "warning-plugin", + OnceExit(decl, { result }) { + result.warn(`Warning from ${result.opts.from}`, { + plugin: "warning-plugin", + }); + }, + }); plugin.postcss = true; return postcss([plugin]) .process(input, { from: fileName, to: fileName }) - .then((result) => { - return { - code: result.css, - map: result.map, - error: result.error, - warnings: result.warnings(), - }; - }); + .then((result) => ({ + code: result.css, + map: result.map, + error: result.error, + warnings: result.warnings(), + })); }, }).apply(compiler); @@ -937,26 +889,20 @@ describe("CssMinimizerPlugin", () => { new ModifyExistingAsset({ name: "foo.css" }).apply(compiler); - await new Promise(async (resolve) => { - const newStats = await compile(compiler); - - expect(newStats.compilation.emittedAssets.size).toBe(1); + const newStats = await compile(compiler); - expect(readAssets(compiler, newStats, /\.css$/)).toMatchSnapshot( - "assets", - ); - expect(getWarnings(newStats)).toMatchSnapshot("warnings"); - expect(getErrors(newStats)).toMatchSnapshot("errors"); + expect(newStats.compilation.emittedAssets.size).toBe(1); - resolve(); - }); + expect(readAssets(compiler, newStats, /\.css$/)).toMatchSnapshot("assets"); + expect(getWarnings(newStats)).toMatchSnapshot("warnings"); + expect(getErrors(newStats)).toMatchSnapshot("errors"); }); it('should work and do not use memory cache when the "cache" option is "false"', async () => { const compiler = getCompiler({ cache: false, entry: { - foo: `${__dirname}/fixtures/simple.js`, + foo: path.join(__dirname, "fixtures", "simple.js"), }, plugins: [ new MiniCssExtractPlugin({ @@ -992,19 +938,13 @@ describe("CssMinimizerPlugin", () => { expect(getWarnings(stats)).toMatchSnapshot("errors"); expect(getErrors(stats)).toMatchSnapshot("warnings"); - await new Promise(async (resolve) => { - const newStats = await compile(compiler); - - expect(newStats.compilation.emittedAssets.size).toBe(5); + const newStats = await compile(compiler); - expect(readAssets(compiler, newStats, /\.css$/)).toMatchSnapshot( - "assets", - ); - expect(getWarnings(newStats)).toMatchSnapshot("warnings"); - expect(getErrors(newStats)).toMatchSnapshot("errors"); + expect(newStats.compilation.emittedAssets.size).toBe(5); - resolve(); - }); + expect(readAssets(compiler, newStats, /\.css$/)).toMatchSnapshot("assets"); + expect(getWarnings(newStats)).toMatchSnapshot("warnings"); + expect(getErrors(newStats)).toMatchSnapshot("errors"); }); it("should run plugin against assets added later by plugins", async () => { @@ -1016,7 +956,7 @@ describe("CssMinimizerPlugin", () => { chunkFilename: "[id].[name].js", }, entry: { - entry: `${__dirname}/fixtures/test/foo.css`, + entry: path.join(__dirname, "fixtures", "test", "foo.css"), }, module: { rules: [ diff --git a/test/__snapshots__/CssMinimizerPlugin.test.js.snap b/test/__snapshots__/CssMinimizerPlugin.test.js.snap index ddd0696..4ed3e7e 100644 --- a/test/__snapshots__/CssMinimizerPlugin.test.js.snap +++ b/test/__snapshots__/CssMinimizerPlugin.test.js.snap @@ -61,15 +61,15 @@ exports[`CssMinimizerPlugin should build error: error 1`] = ` exports[`CssMinimizerPlugin should build error: warning 1`] = `[]`; -exports[`CssMinimizerPlugin should build warning: error 1`] = `[]`; - -exports[`CssMinimizerPlugin should build warning: warning 1`] = ` +exports[`CssMinimizerPlugin should build warning: error 1`] = ` [ - "Warning: foo.css from Css Minimizer plugin -[warning-plugin] Warning", + "Error: foo.css from Css Minimizer plugin +DataCloneError: [object Object] could not be cloned.", ] `; +exports[`CssMinimizerPlugin should build warning: warning 1`] = `[]`; + exports[`CssMinimizerPlugin should respect the hash options #1: assets 1`] = ` { "entry.css": "a{text-align:center}", diff --git a/test/__snapshots__/parallel-option.test.js.snap b/test/__snapshots__/parallel-option.test.js.snap index fd72572..c1f34fc 100644 --- a/test/__snapshots__/parallel-option.test.js.snap +++ b/test/__snapshots__/parallel-option.test.js.snap @@ -30,6 +30,8 @@ exports[`parallel option should match snapshot for the "true" value and the numb { "entry-0.css": "body{color:red}a{color:blue}", "entry-1.css": "body{color:red}a{color:blue}", + "entry-2.css": "body{color:red}a{color:blue}", + "entry-3.css": "body{color:red}a{color:blue}", } `; @@ -60,6 +62,10 @@ exports[`parallel option should match snapshot for the "true" value and the numb "entry-1.css": "body{color:red}a{color:blue}", "entry-2.css": "body{color:red}a{color:blue}", "entry-3.css": "body{color:red}a{color:blue}", + "entry-4.css": "body{color:red}a{color:blue}", + "entry-5.css": "body{color:red}a{color:blue}", + "entry-6.css": "body{color:red}a{color:blue}", + "entry-7.css": "body{color:red}a{color:blue}", } `; diff --git a/test/__snapshots__/validate-options.test.js.snap b/test/__snapshots__/validate-options.test.js.snap index e5165d1..e06bc56 100644 --- a/test/__snapshots__/validate-options.test.js.snap +++ b/test/__snapshots__/validate-options.test.js.snap @@ -1,6 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`validation 1`] = ` +exports[`validation validation 1`] = ` "Invalid options object. Css Minimizer Plugin has been initialized using an options object that does not match the API schema. - options.test should be one of these: [RegExp | non-empty string, ...] | RegExp | non-empty string @@ -17,7 +17,7 @@ exports[`validation 1`] = ` * options.test should be a non-empty string." `; -exports[`validation 2`] = ` +exports[`validation validation 2`] = ` "Invalid options object. Css Minimizer Plugin has been initialized using an options object that does not match the API schema. - options.test should be one of these: [RegExp | non-empty string, ...] | RegExp | non-empty string @@ -32,7 +32,7 @@ exports[`validation 2`] = ` * options.test[0] should be a non-empty string." `; -exports[`validation 3`] = ` +exports[`validation validation 3`] = ` "Invalid options object. Css Minimizer Plugin has been initialized using an options object that does not match the API schema. - options.include should be one of these: [RegExp | non-empty string, ...] | RegExp | non-empty string @@ -49,7 +49,7 @@ exports[`validation 3`] = ` * options.include should be a non-empty string." `; -exports[`validation 4`] = ` +exports[`validation validation 4`] = ` "Invalid options object. Css Minimizer Plugin has been initialized using an options object that does not match the API schema. - options.include should be one of these: [RegExp | non-empty string, ...] | RegExp | non-empty string @@ -64,7 +64,7 @@ exports[`validation 4`] = ` * options.include[0] should be a non-empty string." `; -exports[`validation 5`] = ` +exports[`validation validation 5`] = ` "Invalid options object. Css Minimizer Plugin has been initialized using an options object that does not match the API schema. - options.exclude should be one of these: [RegExp | non-empty string, ...] | RegExp | non-empty string @@ -81,7 +81,7 @@ exports[`validation 5`] = ` * options.exclude should be a non-empty string." `; -exports[`validation 6`] = ` +exports[`validation validation 6`] = ` "Invalid options object. Css Minimizer Plugin has been initialized using an options object that does not match the API schema. - options.exclude should be one of these: [RegExp | non-empty string, ...] | RegExp | non-empty string @@ -96,7 +96,7 @@ exports[`validation 6`] = ` * options.exclude[0] should be a non-empty string." `; -exports[`validation 7`] = ` +exports[`validation validation 7`] = ` "Invalid options object. Css Minimizer Plugin has been initialized using an options object that does not match the API schema. - options.minimizerOptions should be one of these: object { … } | [object { … }, ...] (should not have fewer than 1 item) @@ -109,7 +109,7 @@ exports[`validation 7`] = ` [object { … }, ...] (should not have fewer than 1 item)" `; -exports[`validation 8`] = ` +exports[`validation validation 8`] = ` "Invalid options object. Css Minimizer Plugin has been initialized using an options object that does not match the API schema. - options.parallel should be one of these: boolean | integer @@ -120,7 +120,7 @@ exports[`validation 8`] = ` * options.parallel should be an integer." `; -exports[`validation 9`] = ` +exports[`validation validation 9`] = ` "Invalid options object. Css Minimizer Plugin has been initialized using an options object that does not match the API schema. - options.parallel should be one of these: boolean | integer @@ -131,7 +131,7 @@ exports[`validation 9`] = ` * options.parallel should be an integer." `; -exports[`validation 10`] = ` +exports[`validation validation 10`] = ` "Invalid options object. Css Minimizer Plugin has been initialized using an options object that does not match the API schema. - options.minify should be one of these: function | [function, ...] (should not have fewer than 1 item) @@ -143,7 +143,7 @@ exports[`validation 10`] = ` [function, ...] (should not have fewer than 1 item)" `; -exports[`validation 11`] = ` +exports[`validation validation 11`] = ` "Invalid options object. Css Minimizer Plugin has been initialized using an options object that does not match the API schema. - options has an unknown property 'unknown'. These properties are valid: object { test?, include?, exclude?, minimizerOptions?, parallel?, warningsFilter?, minify? }" diff --git a/test/cache-option.test.js b/test/cache-option.test.js index 1288b51..898e533 100644 --- a/test/cache-option.test.js +++ b/test/cache-option.test.js @@ -1,4 +1,4 @@ -import path from "path"; +import path from "node:path"; import del from "del"; @@ -37,11 +37,11 @@ describe('"cache" option', () => { it('should work with the "false" value for the "cache" option', async () => { const compiler = getCompiler({ entry: { - one: `${__dirname}/fixtures/cache.js`, - two: `${__dirname}/fixtures/cache-1.js`, - three: `${__dirname}/fixtures/cache-2.js`, - four: `${__dirname}/fixtures/cache-3.js`, - five: `${__dirname}/fixtures/cache-4.js`, + one: path.join(__dirname, "fixtures", "cache.js"), + two: path.join(__dirname, "fixtures", "cache-1.js"), + three: path.join(__dirname, "fixtures", "cache-2.js"), + four: path.join(__dirname, "fixtures", "cache-3.js"), + five: path.join(__dirname, "fixtures", "cache-4.js"), }, cache: false, }); @@ -53,7 +53,7 @@ describe('"cache" option', () => { compiler.cache.hooks.get.tap( { name: "TestCache", stage: -100 }, (identifier) => { - if (identifier.indexOf("CssMinimizerWebpackPlugin") !== -1) { + if (identifier.includes("CssMinimizerWebpackPlugin")) { getCounter += 1; } }, @@ -64,7 +64,7 @@ describe('"cache" option', () => { compiler.cache.hooks.store.tap( { name: "TestCache", stage: -100 }, (identifier) => { - if (identifier.indexOf("CssMinimizerWebpackPlugin") !== -1) { + if (identifier.includes("CssMinimizerWebpackPlugin")) { storeCounter += 1; } }, @@ -103,11 +103,11 @@ describe('"cache" option', () => { it('should work with the "memory" value for the "cache.type" option', async () => { const compiler = getCompiler({ entry: { - one: `${__dirname}/fixtures/cache.js`, - two: `${__dirname}/fixtures/cache-1.js`, - three: `${__dirname}/fixtures/cache-2.js`, - four: `${__dirname}/fixtures/cache-3.js`, - five: `${__dirname}/fixtures/cache-4.js`, + one: path.join(__dirname, "fixtures", "cache.js"), + two: path.join(__dirname, "fixtures", "cache-1.js"), + three: path.join(__dirname, "fixtures", "cache-2.js"), + four: path.join(__dirname, "fixtures", "cache-3.js"), + five: path.join(__dirname, "fixtures", "cache-4.js"), }, cache: { type: "memory", @@ -121,7 +121,7 @@ describe('"cache" option', () => { compiler.cache.hooks.get.tap( { name: "TestCache", stage: -100 }, (identifier) => { - if (identifier.indexOf("CssMinimizerWebpackPlugin") !== -1) { + if (identifier.includes("CssMinimizerWebpackPlugin")) { getCounter += 1; } }, @@ -132,7 +132,7 @@ describe('"cache" option', () => { compiler.cache.hooks.store.tap( { name: "TestCache", stage: -100 }, (identifier) => { - if (identifier.indexOf("CssMinimizerWebpackPlugin") !== -1) { + if (identifier.includes("CssMinimizerWebpackPlugin")) { storeCounter += 1; } }, @@ -171,11 +171,11 @@ describe('"cache" option', () => { it('should work with the "filesystem" value for the "cache.type" option', async () => { const compiler = getCompiler({ entry: { - one: `${__dirname}/fixtures/cache.js`, - two: `${__dirname}/fixtures/cache-1.js`, - three: `${__dirname}/fixtures/cache-2.js`, - four: `${__dirname}/fixtures/cache-3.js`, - five: `${__dirname}/fixtures/cache-4.js`, + one: path.join(__dirname, "fixtures", "cache.js"), + two: path.join(__dirname, "fixtures", "cache-1.js"), + three: path.join(__dirname, "fixtures", "cache-2.js"), + four: path.join(__dirname, "fixtures", "cache-3.js"), + five: path.join(__dirname, "fixtures", "cache-4.js"), }, cache: { type: "filesystem", @@ -190,7 +190,7 @@ describe('"cache" option', () => { compiler.cache.hooks.get.tap( { name: "TestCache", stage: -100 }, (identifier) => { - if (identifier.indexOf("CssMinimizerWebpackPlugin") !== -1) { + if (identifier.includes("CssMinimizerWebpackPlugin")) { getCounter += 1; } }, @@ -201,7 +201,7 @@ describe('"cache" option', () => { compiler.cache.hooks.store.tap( { name: "TestCache", stage: -100 }, (identifier) => { - if (identifier.indexOf("CssMinimizerWebpackPlugin") !== -1) { + if (identifier.includes("CssMinimizerWebpackPlugin")) { storeCounter += 1; } }, @@ -260,7 +260,7 @@ describe('"cache" option', () => { compiler.cache.hooks.get.tap( { name: "TestCache", stage: -100 }, (identifier) => { - if (identifier.indexOf("CssMinimizerWebpackPlugin") !== -1) { + if (identifier.includes("CssMinimizerWebpackPlugin")) { getCounter += 1; } }, @@ -271,7 +271,7 @@ describe('"cache" option', () => { compiler.cache.hooks.store.tap( { name: "TestCache", stage: -100 }, (identifier) => { - if (identifier.indexOf("CssMinimizerWebpackPlugin") !== -1) { + if (identifier.includes("CssMinimizerWebpackPlugin")) { storeCounter += 1; } }, @@ -328,32 +328,28 @@ describe('"cache" option', () => { new CssMinimizerPlugin({ minify: (data) => { - // eslint-disable-next-line global-require const postcss = require("postcss"); + const [[fileName, input]] = Object.entries(data); - const plugin = () => { - return { - postcssPlugin: "warning-plugin", - OnceExit(decl, { result }) { - result.warn(`Warning from ${result.opts.from}`, { - plugin: "warning-plugin", - }); - }, - }; - }; + const plugin = () => ({ + postcssPlugin: "warning-plugin", + OnceExit(decl, { result }) { + result.warn(`Warning from ${result.opts.from}`, { + plugin: "warning-plugin", + }); + }, + }); plugin.postcss = true; return postcss([plugin]) .process(input, { from: fileName, to: fileName }) - .then((result) => { - return { - code: result.css, - map: result.map, - error: result.error, - warnings: result.warnings(), - }; - }); + .then((result) => ({ + code: result.css, + map: result.map, + error: result.error, + warnings: result.warnings(), + })); }, }).apply(compiler); @@ -362,7 +358,7 @@ describe('"cache" option', () => { compiler.cache.hooks.get.tap( { name: "TestCache", stage: -100 }, (identifier) => { - if (identifier.indexOf("CssMinimizerWebpackPlugin") !== -1) { + if (identifier.includes("CssMinimizerWebpackPlugin")) { getCounter += 1; } }, @@ -373,7 +369,7 @@ describe('"cache" option', () => { compiler.cache.hooks.store.tap( { name: "TestCache", stage: -100 }, (identifier) => { - if (identifier.indexOf("CssMinimizerWebpackPlugin") !== -1) { + if (identifier.includes("CssMinimizerWebpackPlugin")) { storeCounter += 1; } }, diff --git a/test/exclude-option.test.js b/test/exclude-option.test.js index c6949e6..6a20b8b 100644 --- a/test/exclude-option.test.js +++ b/test/exclude-option.test.js @@ -1,3 +1,5 @@ +import path from "node:path"; + import CssMinimizerPlugin from "../src/index"; import { @@ -14,9 +16,9 @@ describe("exclude option", () => { beforeEach(() => { compiler = getCompiler({ entry: { - excluded1: `${__dirname}/fixtures/excluded1.js`, - excluded2: `${__dirname}/fixtures/excluded2.js`, - entry: `${__dirname}/fixtures/entry.js`, + excluded1: path.join(__dirname, "fixtures", "excluded1.js"), + excluded2: path.join(__dirname, "fixtures", "excluded2.js"), + entry: path.join(__dirname, "fixtures", "entry.js"), }, }); }); diff --git a/test/helpers/EmitNewAsset.js b/test/helpers/EmitNewAsset.js index b1b680c..c0abfaa 100644 --- a/test/helpers/EmitNewAsset.js +++ b/test/helpers/EmitNewAsset.js @@ -15,7 +15,6 @@ export default class EmitNewAsset { stage: compiler.webpack.Compilation.PROCESS_ASSETS_STAGE_REPORT, }, () => { - // eslint-disable-next-line no-param-reassign compilation.emitAsset( this.options.name, new RawSource(` diff --git a/test/helpers/ModifyExistingAsset.js b/test/helpers/ModifyExistingAsset.js index cdcf742..9d2c7d8 100644 --- a/test/helpers/ModifyExistingAsset.js +++ b/test/helpers/ModifyExistingAsset.js @@ -9,9 +9,8 @@ export default class ExistingCommentsFile { compiler.hooks.thisCompilation.tap(plugin, (compilation) => { compilation.hooks.additionalAssets.tap(plugin, () => { - // eslint-disable-next-line no-param-reassign compilation.assets[this.options.name] = new ConcatSource( - `a { color: red; }`, + "a { color: red; }", compilation.assets[this.options.name], ); }); diff --git a/test/helpers/compile.js b/test/helpers/compile.js index a7fb43b..a2395e2 100644 --- a/test/helpers/compile.js +++ b/test/helpers/compile.js @@ -1,3 +1,7 @@ +/** + * @param {import("webpack").Compiler} compiler Webpack compiler + * @returns {Promise} - Promise with webpack stats + */ export default function compile(compiler) { return new Promise((resolve, reject) => { compiler.run((err, stats) => { diff --git a/test/helpers/emitAssetInChildCompilationLoader.js b/test/helpers/emitAssetInChildCompilationLoader.js index d27b6c8..1651ad5 100644 --- a/test/helpers/emitAssetInChildCompilationLoader.js +++ b/test/helpers/emitAssetInChildCompilationLoader.js @@ -3,7 +3,6 @@ class PreCopyPlugin { this.options = options.options || {}; } - // eslint-disable-next-line class-methods-use-this apply(compiler) { const plugin = { name: "PreCopyPlugin" }; const { RawSource } = compiler.webpack.sources; @@ -21,11 +20,14 @@ class PreCopyPlugin { } } +/** + * @returns {string} - Loader result + */ export default function loader() { const callback = this.async(); const childCompiler = this._compilation.createChildCompiler( - `preloader`, + "preloader", this.options, ); diff --git a/test/helpers/emitAssetLoader.js b/test/helpers/emitAssetLoader.js index a581153..3a77fbe 100644 --- a/test/helpers/emitAssetLoader.js +++ b/test/helpers/emitAssetLoader.js @@ -1,3 +1,7 @@ +/** + * @param {string} content Loader content + * @returns {string} - Processed content + */ export default function loader(content) { this.emitFile("style.css", "a { color: red; }"); diff --git a/test/helpers/emitAssetLoader2.js b/test/helpers/emitAssetLoader2.js index f39f18d..aff5369 100644 --- a/test/helpers/emitAssetLoader2.js +++ b/test/helpers/emitAssetLoader2.js @@ -1,3 +1,7 @@ +/** + * @param {string} content Loader content + * @returns {string} - Processed content + */ export default function loader(content) { this.emitFile("style-2.css", "a { color: coral; }"); diff --git a/test/helpers/getCompiler.js b/test/helpers/getCompiler.js index 417afb2..3b6481c 100644 --- a/test/helpers/getCompiler.js +++ b/test/helpers/getCompiler.js @@ -1,9 +1,13 @@ -import path from "path"; +import path from "node:path"; -import webpack from "webpack"; +import { Volume, createFsFromVolume } from "memfs"; import MiniCssExtractPlugin from "mini-css-extract-plugin"; -import { createFsFromVolume, Volume } from "memfs"; +import webpack from "webpack"; +/** + * @param {import("webpack").Configuration} config Webpack configuration + * @returns {import("webpack").Compiler} - Webpack compiler + */ export default function getCompiler(config) { const compiler = webpack({ mode: "development", diff --git a/test/helpers/index.js b/test/helpers/index.js index dd1a126..8d8e9e6 100644 --- a/test/helpers/index.js +++ b/test/helpers/index.js @@ -1,21 +1,9 @@ -import compile from "./compile"; -import getCompiler from "./getCompiler"; -import readAsset from "./readAsset"; -import readAssets from "./readAssets"; -import ModifyExistingAsset from "./ModifyExistingAsset"; -import EmitNewAsset from "./EmitNewAsset"; -import getErrors from "./getErrors"; -import getWarnings from "./getWarnings"; -import normalizeErrors from "./normalizeErrors"; - -export { - compile, - getCompiler, - readAsset, - readAssets, - ModifyExistingAsset, - EmitNewAsset, - getErrors, - getWarnings, - normalizeErrors, -}; +export { default as getErrors } from "./getErrors"; +export { default as getWarnings } from "./getWarnings"; +export { default as EmitNewAsset } from "./EmitNewAsset"; +export { default as compile } from "./compile"; +export { default as ModifyExistingAsset } from "./ModifyExistingAsset"; +export { default as getCompiler } from "./getCompiler"; +export { default as readAsset } from "./readAsset"; +export { default as normalizeErrors } from "./normalizeErrors"; +export { default as readAssets } from "./readAssets"; diff --git a/test/helpers/normalizeErrors.js b/test/helpers/normalizeErrors.js index f23fc32..5539e58 100644 --- a/test/helpers/normalizeErrors.js +++ b/test/helpers/normalizeErrors.js @@ -1,3 +1,7 @@ +/** + * @param {string} str String to process + * @returns {string} - Processed string + */ function removeCWD(str) { const isWin = process.platform === "win32"; let cwd = process.cwd(); @@ -8,12 +12,13 @@ function removeCWD(str) { cwd = cwd.replace(/\\/g, "/"); } - // Normalize file URLs to always use 'file:///' - normalizedStr = normalizedStr.replace(/file:\/*/g, "file:///"); - return normalizedStr.replace(new RegExp(cwd, "g"), ""); } +/** + * @param {Array} errors Array of errors + * @returns {Array} - Normalized error messages + */ export default (errors) => errors.map((error) => removeCWD(error.toString().split("\n").slice(0, 2).join("\n")), diff --git a/test/helpers/readAsset.js b/test/helpers/readAsset.js index bd1ae27..ea0597f 100644 --- a/test/helpers/readAsset.js +++ b/test/helpers/readAsset.js @@ -1,4 +1,4 @@ -import path from "path"; +import path from "node:path"; export default (asset, compiler, stats) => { const usedFs = compiler.outputFileSystem; diff --git a/test/helpers/readAssets.js b/test/helpers/readAssets.js index bed6359..e419bb7 100644 --- a/test/helpers/readAssets.js +++ b/test/helpers/readAssets.js @@ -1,15 +1,21 @@ import readAsset from "./readAsset"; +/** + * @param {import("webpack").Compiler} compiler Webpack compiler + * @param {import("webpack").Stats} stats Webpack stats + * @param {RegExp=} extension File extension filter + * @returns {Record} - Assets map + */ export default function readAssets(compiler, stats, extension) { const assets = {}; - Object.keys(stats.compilation.assets).forEach((asset) => { + for (const asset of Object.keys(stats.compilation.assets)) { if (typeof extension === "undefined") { assets[asset] = readAsset(asset, compiler, stats); } else if (extension.test(asset)) { assets[asset] = readAsset(asset, compiler, stats); } - }); + } return assets; } diff --git a/test/include-option.test.js b/test/include-option.test.js index 6083d5d..29c1e9f 100644 --- a/test/include-option.test.js +++ b/test/include-option.test.js @@ -1,3 +1,5 @@ +import path from "node:path"; + import CssMinimizerPlugin from "../src/index"; import { @@ -14,9 +16,9 @@ describe("include option", () => { beforeEach(() => { compiler = getCompiler({ entry: { - included1: `${__dirname}/fixtures/included1.js`, - included2: `${__dirname}/fixtures/included2.js`, - entry: `${__dirname}/fixtures/entry.js`, + included1: path.join(__dirname, "fixtures", "included1.js"), + included2: path.join(__dirname, "fixtures", "included2.js"), + entry: path.join(__dirname, "fixtures", "entry.js"), }, }); }); diff --git a/test/minify-option.test.js b/test/minify-option.test.js index 855cda9..d31e436 100644 --- a/test/minify-option.test.js +++ b/test/minify-option.test.js @@ -1,5 +1,7 @@ -import MiniCssExtractPlugin from "mini-css-extract-plugin"; +import path from "node:path"; + import CopyPlugin from "copy-webpack-plugin"; +import MiniCssExtractPlugin from "mini-css-extract-plugin"; import CssMinimizerPlugin from "../src"; @@ -17,7 +19,7 @@ describe('"minify" option', () => { const compiler = getCompiler({ devtool: "source-map", entry: { - foo: `${__dirname}/fixtures/sourcemap/foo.scss`, + foo: path.join(__dirname, "fixtures", "sourcemap", "foo.scss"), }, module: { rules: [ @@ -36,8 +38,8 @@ describe('"minify" option', () => { new CssMinimizerPlugin({ parallel: false, minify: async (data, inputSourceMap) => { - // eslint-disable-next-line global-require const csso = require("csso"); + const [[filename, input]] = Object.entries(data); const minifiedCss = csso.minify(input, { filename, @@ -64,14 +66,14 @@ describe('"minify" option', () => { const compiler = getCompiler({ devtool: "source-map", entry: { - foo: `${__dirname}/fixtures/foo.css`, + foo: path.join(__dirname, "fixtures", "foo.css"), }, }); new CssMinimizerPlugin({ minify: async (data) => { - // eslint-disable-next-line global-require const CleanCSS = require("clean-css"); + const [[filename, input]] = Object.entries(data); // Bug in `clean-css` @@ -104,16 +106,14 @@ describe('"minify" option', () => { const compiler = getCompiler({ devtool: "source-map", entry: { - foo: `${__dirname}/fixtures/foo.css`, + foo: path.join(__dirname, "fixtures", "foo.css"), }, }); new CssMinimizerPlugin({ - minify: async () => { - return { - code: "", - }; - }, + minify: async () => ({ + code: "", + }), }).apply(compiler); const stats = await compile(compiler); @@ -129,7 +129,7 @@ describe('"minify" option', () => { const compiler = getCompiler({ devtool: "source-map", entry: { - foo: `${__dirname}/fixtures/sourcemap/foo.scss`, + foo: path.join(__dirname, "fixtures", "sourcemap", "foo.scss"), }, module: { rules: [ @@ -189,7 +189,7 @@ describe('"minify" option', () => { const compiler = getCompiler({ devtool: "source-map", entry: { - foo: `${__dirname}/fixtures/sourcemap/foo.scss`, + foo: path.join(__dirname, "fixtures", "sourcemap", "foo.scss"), }, module: { rules: [ @@ -244,7 +244,7 @@ describe('"minify" option', () => { it('should work with "CssMinimizerPlugin.cssnanoMinify" minifier', async () => { const compiler = getCompiler({ entry: { - foo: `${__dirname}/fixtures/sourcemap/foo.scss`, + foo: path.join(__dirname, "fixtures", "sourcemap", "foo.scss"), }, module: { rules: [ @@ -280,7 +280,7 @@ describe('"minify" option', () => { const compiler = getCompiler({ devtool: "source-map", entry: { - foo: `${__dirname}/fixtures/sourcemap/foo.scss`, + foo: path.join(__dirname, "fixtures", "sourcemap", "foo.scss"), }, module: { rules: [ @@ -316,7 +316,7 @@ describe('"minify" option', () => { const compiler = getCompiler({ devtool: "source-map", entry: { - foo: `${__dirname}/fixtures/sourcemap/foo.scss`, + foo: path.join(__dirname, "fixtures", "sourcemap", "foo.scss"), }, module: { rules: [ @@ -358,15 +358,15 @@ describe('"minify" option', () => { const compiler = getCompiler({ devtool: "source-map", entry: { - entry: `${__dirname}/fixtures/sugarss.js`, + entry: path.join(__dirname, "fixtures", "sugarss.js"), }, module: {}, plugins: [ new CopyPlugin({ patterns: [ { - context: `${__dirname}/fixtures/sss`, - from: `index.sss`, + context: path.join(__dirname, "fixtures", "sss"), + from: "index.sss", }, ], }), @@ -391,7 +391,6 @@ describe('"minify" option', () => { expect(stats.compilation.warnings).toEqual([]); for (const file in stats.compilation.assets) { - // eslint-disable-next-line no-continue if (/\.js$/.test(file)) continue; expect(readAsset(file, compiler, stats)).toMatchSnapshot(file); } @@ -401,7 +400,7 @@ describe('"minify" option', () => { it('should work with "CssMinimizerPlugin.cssoMinify" minifier', async () => { const compiler = getCompiler({ entry: { - foo: `${__dirname}/fixtures/sourcemap/foo.scss`, + foo: path.join(__dirname, "fixtures", "sourcemap", "foo.scss"), }, module: { rules: [ @@ -434,7 +433,7 @@ describe('"minify" option', () => { const compiler = getCompiler({ devtool: "source-map", entry: { - foo: `${__dirname}/fixtures/sourcemap/foo.scss`, + foo: path.join(__dirname, "fixtures", "sourcemap", "foo.scss"), }, module: { rules: [ @@ -467,7 +466,7 @@ describe('"minify" option', () => { const compiler = getCompiler({ devtool: "source-map", entry: { - foo: `${__dirname}/fixtures/sourcemap/foo.scss`, + foo: path.join(__dirname, "fixtures", "sourcemap", "foo.scss"), }, module: { rules: [ @@ -505,7 +504,7 @@ describe('"minify" option', () => { it('should work with "CssMinimizerPlugin.cleanCssMinify" minifier', async () => { const compiler = getCompiler({ entry: { - foo: `${__dirname}/fixtures/foo.css`, + foo: path.join(__dirname, "fixtures", "foo.css"), }, }); @@ -526,7 +525,7 @@ describe('"minify" option', () => { const compiler = getCompiler({ devtool: "source-map", entry: { - foo: `${__dirname}/fixtures/foo.css`, + foo: path.join(__dirname, "fixtures", "foo.css"), }, }); @@ -547,7 +546,7 @@ describe('"minify" option', () => { const compiler = getCompiler({ devtool: "source-map", entry: { - foo: `${__dirname}/fixtures/sourcemap/foo.scss`, + foo: path.join(__dirname, "fixtures", "sourcemap", "foo.scss"), }, module: { rules: [ @@ -585,7 +584,7 @@ describe('"minify" option', () => { it('should work with "CssMinimizerPlugin.esbuildMinify" minifier', async () => { const compiler = getCompiler({ entry: { - foo: `${__dirname}/fixtures/sourcemap/foo.scss`, + foo: path.join(__dirname, "fixtures", "sourcemap", "foo.scss"), }, module: { rules: [ @@ -617,7 +616,7 @@ describe('"minify" option', () => { it('should work with "CssMinimizerPlugin.esbuildMinify" minifier and emit warnings', async () => { const compiler = getCompiler({ entry: { - foo: `${__dirname}/fixtures/wrong-calc.css`, + foo: path.join(__dirname, "fixtures", "wrong-calc.css"), }, module: { rules: [ @@ -649,7 +648,7 @@ describe('"minify" option', () => { const compiler = getCompiler({ devtool: "source-map", entry: { - foo: `${__dirname}/fixtures/foo.css`, + foo: path.join(__dirname, "fixtures", "foo.css"), }, }); @@ -670,7 +669,7 @@ describe('"minify" option', () => { const compiler = getCompiler({ devtool: "source-map", entry: { - foo: `${__dirname}/fixtures/sourcemap/foo.scss`, + foo: path.join(__dirname, "fixtures", "sourcemap", "foo.scss"), }, module: { rules: [ @@ -708,7 +707,7 @@ describe('"minify" option', () => { it('should work with "CssMinimizerPlugin.cssnanoMinify", "CssMinimizerPlugin.cssoMinify" and "CssMinimizerPlugin.cleanCssMinify" minifiers', async () => { const compiler = getCompiler({ entry: { - foo: `${__dirname}/fixtures/foo.css`, + foo: path.join(__dirname, "fixtures", "foo.css"), }, }); @@ -733,7 +732,7 @@ describe('"minify" option', () => { const compiler = getCompiler({ devtool: "source-map", entry: { - foo: `${__dirname}/fixtures/foo.css`, + foo: path.join(__dirname, "fixtures", "foo.css"), }, }); @@ -757,7 +756,7 @@ describe('"minify" option', () => { it('should work with "CssMinimizerPlugin.parcelCssMinify" minifier', async () => { const compiler = getCompiler({ entry: { - foo: `${__dirname}/fixtures/sourcemap/foo.scss`, + foo: path.join(__dirname, "fixtures", "sourcemap", "foo.scss"), }, module: { rules: [ @@ -791,7 +790,7 @@ describe('"minify" option', () => { const compiler = getCompiler({ devtool: "source-map", entry: { - foo: `${__dirname}/fixtures/sourcemap/foo.scss`, + foo: path.join(__dirname, "fixtures", "sourcemap", "foo.scss"), }, module: { rules: [ @@ -825,7 +824,7 @@ describe('"minify" option', () => { const compiler = getCompiler({ devtool: "source-map", entry: { - foo: `${__dirname}/fixtures/sourcemap/foo.scss`, + foo: path.join(__dirname, "fixtures", "sourcemap", "foo.scss"), }, module: { rules: [ @@ -866,7 +865,7 @@ describe('"minify" option', () => { it('should work with "CssMinimizerPlugin.parcelCssMinify" minifier and options for "@parcel/css"', async () => { const compiler = getCompiler({ entry: { - foo: `${__dirname}/fixtures/nesting.css`, + foo: path.join(__dirname, "fixtures", "nesting.css"), }, module: { rules: [ @@ -905,7 +904,7 @@ describe('"minify" option', () => { it('should work with "CssMinimizerPlugin.lightningCssMinify" minifier', async () => { const compiler = getCompiler({ entry: { - foo: `${__dirname}/fixtures/sourcemap/foo.scss`, + foo: path.join(__dirname, "fixtures", "sourcemap", "foo.scss"), }, module: { rules: [ @@ -939,7 +938,7 @@ describe('"minify" option', () => { const compiler = getCompiler({ devtool: "source-map", entry: { - foo: `${__dirname}/fixtures/sourcemap/foo.scss`, + foo: path.join(__dirname, "fixtures", "sourcemap", "foo.scss"), }, module: { rules: [ @@ -973,7 +972,7 @@ describe('"minify" option', () => { const compiler = getCompiler({ devtool: "source-map", entry: { - foo: `${__dirname}/fixtures/sourcemap/foo.scss`, + foo: path.join(__dirname, "fixtures", "sourcemap", "foo.scss"), }, module: { rules: [ @@ -1014,7 +1013,7 @@ describe('"minify" option', () => { it('should work with "CssMinimizerPlugin.lightningCssMinify" minifier and options for "lightningcss"', async () => { const compiler = getCompiler({ entry: { - foo: `${__dirname}/fixtures/nesting.css`, + foo: path.join(__dirname, "fixtures", "nesting.css"), }, module: { rules: [ @@ -1053,7 +1052,7 @@ describe('"minify" option', () => { it('should work with "CssMinimizerPlugin.swcMinify" minifier', async () => { const compiler = getCompiler({ entry: { - foo: `${__dirname}/fixtures/sourcemap/foo.scss`, + foo: path.join(__dirname, "fixtures", "sourcemap", "foo.scss"), }, module: { rules: [ @@ -1088,7 +1087,7 @@ describe('"minify" option', () => { const compiler = getCompiler({ devtool: "source-map", entry: { - foo: `${__dirname}/fixtures/sourcemap/foo.scss`, + foo: path.join(__dirname, "fixtures", "sourcemap", "foo.scss"), }, module: { rules: [ @@ -1122,7 +1121,7 @@ describe('"minify" option', () => { const compiler = getCompiler({ devtool: "source-map", entry: { - foo: `${__dirname}/fixtures/sourcemap/foo.scss`, + foo: path.join(__dirname, "fixtures", "sourcemap", "foo.scss"), }, module: { rules: [ @@ -1162,7 +1161,7 @@ describe('"minify" option', () => { it('should work with "CssMinimizerPlugin.swcMinify" minifier and options for "swcMinify"', async () => { const compiler = getCompiler({ entry: { - foo: `${__dirname}/fixtures/nesting.css`, + foo: path.join(__dirname, "fixtures", "nesting.css"), }, module: { rules: [ @@ -1194,7 +1193,7 @@ describe('"minify" option', () => { it("should work throw an error if minimizer function doesn't return", async () => { const compiler = getCompiler({ entry: { - foo: `${__dirname}/fixtures/sourcemap/foo.scss`, + foo: path.join(__dirname, "fixtures", "sourcemap", "foo.scss"), }, module: { rules: [ @@ -1211,11 +1210,9 @@ describe('"minify" option', () => { }); new CssMinimizerPlugin({ - minify: async () => { - return { - code: null, - }; - }, + minify: async () => ({ + code: null, + }), }).apply(compiler); const stats = await compile(compiler); @@ -1230,7 +1227,7 @@ describe('"minify" option', () => { it("should work throw an error if minimizer function doesn't return #2", async () => { const compiler = getCompiler({ entry: { - foo: `${__dirname}/fixtures/sourcemap/foo.scss`, + foo: path.join(__dirname, "fixtures", "sourcemap", "foo.scss"), }, module: { rules: [ @@ -1247,12 +1244,9 @@ describe('"minify" option', () => { }); new CssMinimizerPlugin({ - minify: async () => { - return { - // eslint-disable-next-line no-undefined - code: undefined, - }; - }, + minify: async () => ({ + code: undefined, + }), }).apply(compiler); const stats = await compile(compiler); @@ -1267,7 +1261,7 @@ describe('"minify" option', () => { it("should work and allow to return errors and warnings from custom function", async () => { const compiler = getCompiler({ entry: { - foo: `${__dirname}/fixtures/sourcemap/foo.scss`, + foo: path.join(__dirname, "fixtures", "sourcemap", "foo.scss"), }, module: { rules: [ @@ -1284,13 +1278,11 @@ describe('"minify" option', () => { }); new CssMinimizerPlugin({ - minify: async () => { - return { - code: `.test { color: red; }`, - warnings: ["Warning 1", new Error("Warning 2")], - errors: ["Error 1", new Error("Error 2")], - }; - }, + minify: async () => ({ + code: ".test { color: red; }", + warnings: ["Warning 1", new Error("Warning 2")], + errors: ["Error 1", new Error("Error 2")], + }), }).apply(compiler); const stats = await compile(compiler); diff --git a/test/minimizerOptions-option.test.js b/test/minimizerOptions-option.test.js index a3649de..b5f3368 100644 --- a/test/minimizerOptions-option.test.js +++ b/test/minimizerOptions-option.test.js @@ -1,16 +1,23 @@ +import path from "node:path"; + import CopyPlugin from "copy-webpack-plugin"; import MiniCssExtractPlugin from "mini-css-extract-plugin"; import sugarss from "sugarss"; import CssMinimizerPlugin from "../src/index"; -import { getCompiler, compile, readAsset } from "./helpers"; +import { compile, getCompiler, readAsset } from "./helpers"; describe('when applied with "minimizerOptions" option', () => { it('matches snapshot for "discardComments" option (enable [default])', () => { const compiler = getCompiler({ entry: { - entry: `${__dirname}/fixtures/minimizerOptions/discardComments.css`, + entry: path.join( + __dirname, + "fixtures", + "minimizerOptions", + "discardComments.css", + ), }, }); new CssMinimizerPlugin().apply(compiler); @@ -20,7 +27,6 @@ describe('when applied with "minimizerOptions" option', () => { expect(stats.compilation.warnings).toEqual([]); for (const file in stats.compilation.assets) { - // eslint-disable-next-line no-continue if (/\.js$/.test(file)) continue; expect(readAsset(file, compiler, stats)).toMatchSnapshot(file); } @@ -30,7 +36,12 @@ describe('when applied with "minimizerOptions" option', () => { it('matches snapshot for "discardComments" option (disable)', () => { const compiler = getCompiler({ entry: { - entry: `${__dirname}/fixtures/minimizerOptions/discardComments.css`, + entry: path.join( + __dirname, + "fixtures", + "minimizerOptions", + "discardComments.css", + ), }, }); new CssMinimizerPlugin({ @@ -44,7 +55,6 @@ describe('when applied with "minimizerOptions" option', () => { expect(stats.compilation.warnings).toEqual([]); for (const file in stats.compilation.assets) { - // eslint-disable-next-line no-continue if (/\.js$/.test(file)) continue; expect(readAsset(file, compiler, stats)).toMatchSnapshot(file); } @@ -54,7 +64,12 @@ describe('when applied with "minimizerOptions" option', () => { it('matches snapshot for "discardComments" option (enable, with "removeAll" option)', () => { const compiler = getCompiler({ entry: { - entry: `${__dirname}/fixtures/minimizerOptions/discardComments.css`, + entry: path.join( + __dirname, + "fixtures", + "minimizerOptions", + "discardComments.css", + ), }, }); new CssMinimizerPlugin({ @@ -68,7 +83,6 @@ describe('when applied with "minimizerOptions" option', () => { expect(stats.compilation.warnings).toEqual([]); for (const file in stats.compilation.assets) { - // eslint-disable-next-line no-continue if (/\.js$/.test(file)) continue; expect(readAsset(file, compiler, stats)).toMatchSnapshot(file); } @@ -78,22 +92,34 @@ describe('when applied with "minimizerOptions" option', () => { it('matches snapshot for "preset" option with require.resolve "String" value', () => { const compiler = getCompiler({ entry: { - entry: `${__dirname}/fixtures/minimizerOptions/order.css`, + entry: path.join( + __dirname, + "fixtures", + "minimizerOptions", + "order.css", + ), }, }); new CssMinimizerPlugin({ minimizerOptions: { + // eslint-disable-next-line n/no-extraneous-require preset: require.resolve("cssnano-preset-default"), }, }).apply(compiler); const compiler2 = getCompiler({ entry: { - entry: `${__dirname}/fixtures/minimizerOptions/order.css`, + entry: path.join( + __dirname, + "fixtures", + "minimizerOptions", + "order.css", + ), }, }); new CssMinimizerPlugin({ minimizerOptions: { + // eslint-disable-next-line n/no-extraneous-require preset: require.resolve("cssnano-preset-default"), }, }).apply(compiler2); @@ -103,10 +129,9 @@ describe('when applied with "minimizerOptions" option', () => { expect(stats.compilation.warnings).toEqual([]); for (const file in stats.compilation.assets) { - // eslint-disable-next-line no-continue if (/\.js$/.test(file)) continue; expect(readAsset(file, compiler, stats)).toMatchSnapshot( - `default-preset`, + "default-preset", ); } }); @@ -116,10 +141,9 @@ describe('when applied with "minimizerOptions" option', () => { expect(stats.compilation.warnings).toEqual([]); for (const file in stats.compilation.assets) { - // eslint-disable-next-line no-continue if (/\.js$/.test(file)) continue; expect(readAsset(file, compiler2, stats)).toMatchSnapshot( - `preset-simple`, + "preset-simple", ); } }); @@ -130,7 +154,12 @@ describe('when applied with "minimizerOptions" option', () => { it('matches snapshot for "mergeRules" option (enable [default])', () => { const compiler = getCompiler({ entry: { - entry: `${__dirname}/fixtures/minimizerOptions/mergeRules.css`, + entry: path.join( + __dirname, + "fixtures", + "minimizerOptions", + "mergeRules.css", + ), }, }); new CssMinimizerPlugin().apply(compiler); @@ -140,7 +169,6 @@ describe('when applied with "minimizerOptions" option', () => { expect(stats.compilation.warnings).toEqual([]); for (const file in stats.compilation.assets) { - // eslint-disable-next-line no-continue if (/\.js$/.test(file)) continue; expect(readAsset(file, compiler, stats)).toMatchSnapshot(file); } @@ -150,7 +178,12 @@ describe('when applied with "minimizerOptions" option', () => { it('matches snapshot for "mergeRules" option (disable)', () => { const compiler = getCompiler({ entry: { - entry: `${__dirname}/fixtures/minimizerOptions/mergeRules.css`, + entry: path.join( + __dirname, + "fixtures", + "minimizerOptions", + "mergeRules.css", + ), }, }); new CssMinimizerPlugin({ @@ -164,7 +197,6 @@ describe('when applied with "minimizerOptions" option', () => { expect(stats.compilation.warnings).toEqual([]); for (const file in stats.compilation.assets) { - // eslint-disable-next-line no-continue if (/\.js$/.test(file)) continue; expect(readAsset(file, compiler, stats)).toMatchSnapshot(file); } @@ -174,7 +206,12 @@ describe('when applied with "minimizerOptions" option', () => { it('matches snapshot for "discardEmpty" option (enable [default])', () => { const compiler = getCompiler({ entry: { - entry: `${__dirname}/fixtures/minimizerOptions/discardEmpty.css`, + entry: path.join( + __dirname, + "fixtures", + "minimizerOptions", + "discardEmpty.css", + ), }, }); new CssMinimizerPlugin().apply(compiler); @@ -184,7 +221,6 @@ describe('when applied with "minimizerOptions" option', () => { expect(stats.compilation.warnings).toEqual([]); for (const file in stats.compilation.assets) { - // eslint-disable-next-line no-continue if (/\.js$/.test(file)) continue; expect(readAsset(file, compiler, stats)).toMatchSnapshot(file); } @@ -194,7 +230,12 @@ describe('when applied with "minimizerOptions" option', () => { it('matches snapshot for "discardEmpty" option (disable)', () => { const compiler = getCompiler({ entry: { - entry: `${__dirname}/fixtures/minimizerOptions/discardEmpty.css`, + entry: path.join( + __dirname, + "fixtures", + "minimizerOptions", + "discardEmpty.css", + ), }, }); new CssMinimizerPlugin({ @@ -208,7 +249,6 @@ describe('when applied with "minimizerOptions" option', () => { expect(stats.compilation.warnings).toEqual([]); for (const file in stats.compilation.assets) { - // eslint-disable-next-line no-continue if (/\.js$/.test(file)) continue; expect(readAsset(file, compiler, stats)).toMatchSnapshot(file); } @@ -218,15 +258,15 @@ describe('when applied with "minimizerOptions" option', () => { it('matches snapshot for "parser" option with "Function" value', () => { const compiler = getCompiler({ entry: { - entry: `${__dirname}/fixtures/sugarss.js`, + entry: path.join(__dirname, "fixtures", "sugarss.js"), }, module: {}, plugins: [ new CopyPlugin({ patterns: [ { - context: `${__dirname}/fixtures/sss`, - from: `index.sss`, + context: path.join(__dirname, "fixtures", "sss"), + from: "index.sss", }, ], }), @@ -250,7 +290,6 @@ describe('when applied with "minimizerOptions" option', () => { expect(stats.compilation.warnings).toEqual([]); for (const file in stats.compilation.assets) { - // eslint-disable-next-line no-continue if (/\.js$/.test(file)) continue; expect(readAsset(file, compiler, stats)).toMatchSnapshot(file); } @@ -260,15 +299,15 @@ describe('when applied with "minimizerOptions" option', () => { it('matches snapshot for "parser" option with "String" value', () => { const compiler = getCompiler({ entry: { - entry: `${__dirname}/fixtures/sugarss.js`, + entry: path.join(__dirname, "fixtures", "sugarss.js"), }, module: {}, plugins: [ new CopyPlugin({ patterns: [ { - context: `${__dirname}/fixtures/sss`, - from: `index.sss`, + context: path.join(__dirname, "fixtures", "sss"), + from: "index.sss", }, ], }), @@ -291,7 +330,6 @@ describe('when applied with "minimizerOptions" option', () => { expect(stats.compilation.warnings).toEqual([]); for (const file in stats.compilation.assets) { - // eslint-disable-next-line no-continue if (/\.js$/.test(file)) continue; expect(readAsset(file, compiler, stats)).toMatchSnapshot(file); } @@ -301,7 +339,7 @@ describe('when applied with "minimizerOptions" option', () => { it('matches snapshot for "stringifier" option with "Function" value', () => { const compiler = getCompiler({ entry: { - entry: `${__dirname}/fixtures/entry.js`, + entry: path.join(__dirname, "fixtures", "entry.js"), }, }); new CssMinimizerPlugin({ @@ -318,7 +356,6 @@ describe('when applied with "minimizerOptions" option', () => { expect(stats.compilation.warnings).toEqual([]); for (const file in stats.compilation.assets) { - // eslint-disable-next-line no-continue if (/\.js$/.test(file)) continue; expect(readAsset(file, compiler, stats)).toMatchSnapshot(file); } @@ -328,7 +365,7 @@ describe('when applied with "minimizerOptions" option', () => { it('matches snapshot for "stringifier" option with "String" value', () => { const compiler = getCompiler({ entry: { - entry: `${__dirname}/fixtures/entry.js`, + entry: path.join(__dirname, "fixtures", "entry.js"), }, }); new CssMinimizerPlugin({ @@ -344,7 +381,6 @@ describe('when applied with "minimizerOptions" option', () => { expect(stats.compilation.warnings).toEqual([]); for (const file in stats.compilation.assets) { - // eslint-disable-next-line no-continue if (/\.js$/.test(file)) continue; expect(readAsset(file, compiler, stats)).toMatchSnapshot(file); } @@ -354,15 +390,15 @@ describe('when applied with "minimizerOptions" option', () => { it('matches snapshot for "syntax" option with "Function" value', () => { const compiler = getCompiler({ entry: { - entry: `${__dirname}/fixtures/sugarss.js`, + entry: path.join(__dirname, "fixtures", "sugarss.js"), }, module: {}, plugins: [ new CopyPlugin({ patterns: [ { - context: `${__dirname}/fixtures/sss`, - from: `index.sss`, + context: path.join(__dirname, "fixtures", "sss"), + from: "index.sss", }, ], }), @@ -386,7 +422,6 @@ describe('when applied with "minimizerOptions" option', () => { expect(stats.compilation.warnings).toEqual([]); for (const file in stats.compilation.assets) { - // eslint-disable-next-line no-continue if (/\.js$/.test(file)) continue; expect(readAsset(file, compiler, stats)).toMatchSnapshot(file); } @@ -396,15 +431,15 @@ describe('when applied with "minimizerOptions" option', () => { it('matches snapshot for "syntax" option with "String" value', () => { const compiler = getCompiler({ entry: { - entry: `${__dirname}/fixtures/sugarss.js`, + entry: path.join(__dirname, "fixtures", "sugarss.js"), }, module: {}, plugins: [ new CopyPlugin({ patterns: [ { - context: `${__dirname}/fixtures/sss`, - from: `index.sss`, + context: path.join(__dirname, "fixtures", "sss"), + from: "index.sss", }, ], }), @@ -427,7 +462,6 @@ describe('when applied with "minimizerOptions" option', () => { expect(stats.compilation.warnings).toEqual([]); for (const file in stats.compilation.assets) { - // eslint-disable-next-line no-continue if (/\.js$/.test(file)) continue; expect(readAsset(file, compiler, stats)).toMatchSnapshot(file); } diff --git a/test/parallel-option.test.js b/test/parallel-option.test.js index 396e494..b680124 100644 --- a/test/parallel-option.test.js +++ b/test/parallel-option.test.js @@ -1,4 +1,5 @@ -import os from "os"; +import os from "node:os"; +import path from "node:path"; import { Worker } from "jest-worker"; @@ -12,21 +13,7 @@ import { readAssets, } from "./helpers"; -jest.mock("os", () => { - const actualOs = jest.requireActual("os"); - const isAvailableParallelism = - typeof actualOs.availableParallelism !== "undefined"; - - const mocked = { - // eslint-disable-next-line no-undefined - availableParallelism: isAvailableParallelism ? jest.fn(() => 4) : undefined, - cpus: jest.fn(() => { - return { length: 4 }; - }), - }; - - return { ...actualOs, ...mocked }; -}); +// Mock removed - using real values // Based on https://github.com/facebook/jest/blob/edde20f75665c2b1e3c8937f758902b5cf28a7b4/packages/jest-runner/src/__tests__/test_runner.test.js let workerTransform; @@ -37,27 +24,21 @@ const ENABLE_WORKER_THREADS = ? process.env.ENABLE_WORKER_THREADS === "true" : true; -jest.mock("jest-worker", () => { - return { - Worker: jest.fn().mockImplementation((workerPath) => { - return { - // eslint-disable-next-line global-require, import/no-dynamic-require - transform: (workerTransform = jest.fn((data) => - // eslint-disable-next-line global-require, import/no-dynamic-require - require(workerPath).transform(data), - )), - end: (workerEnd = jest.fn()), - getStderr: jest.fn(), - getStdout: jest.fn(), - }; - }), - }; -}); +jest.mock("jest-worker", () => ({ + Worker: jest.fn().mockImplementation((workerPath) => ({ + transform: (workerTransform = jest.fn((data) => + require(workerPath).transform(data), + )), + end: (workerEnd = jest.fn()), + getStderr: jest.fn(), + getStdout: jest.fn(), + })), +})); const workerPath = require.resolve("../src/minify"); const getParallelism = () => { - if (typeof os.availableParallelism !== "undefined") { + if (typeof os.availableParallelism === "function") { return os.availableParallelism(); } @@ -72,10 +53,10 @@ describe("parallel option", () => { compiler = getCompiler({ entry: { - one: `${__dirname}/fixtures/entry.js`, - two: `${__dirname}/fixtures/entry.js`, - three: `${__dirname}/fixtures/entry.js`, - four: `${__dirname}/fixtures/entry.js`, + one: path.join(__dirname, "fixtures", "entry.js"), + two: path.join(__dirname, "fixtures", "entry.js"), + three: path.join(__dirname, "fixtures", "entry.js"), + four: path.join(__dirname, "fixtures", "entry.js"), }, }); }); @@ -88,7 +69,7 @@ describe("parallel option", () => { expect(Worker).toHaveBeenCalledTimes(1); expect(Worker).toHaveBeenLastCalledWith(workerPath, { enableWorkerThreads: ENABLE_WORKER_THREADS, - numWorkers: getParallelism() - 1, + numWorkers: 4, // Math.min(4 files, 7 cores) = 4 }); expect(workerTransform).toHaveBeenCalledTimes( Object.keys(readAssets(compiler, stats, /\.css$/)).length, @@ -133,7 +114,6 @@ describe("parallel option", () => { }); it('should match snapshot for the "undefined" value', async () => { - // eslint-disable-next-line no-undefined new CssMinimizerPlugin({ parallel: undefined }).apply(compiler); const stats = await compile(compiler); @@ -175,7 +155,7 @@ describe("parallel option", () => { it('should match snapshot for the "true" value when only one file passed', async () => { compiler = getCompiler({ - entry: `${__dirname}/fixtures/entry.js`, + entry: path.join(__dirname, "fixtures", "entry.js"), }); new CssMinimizerPlugin({ parallel: true }).apply(compiler); @@ -201,7 +181,7 @@ describe("parallel option", () => { const entries = {}; for (let i = 0; i < os.cpus().length / 2; i++) { - entries[`entry-${i}`] = `${__dirname}/fixtures/entry.js`; + entries[`entry-${i}`] = path.join(__dirname, "fixtures", "entry.js"); } compiler = getCompiler({ entry: entries }); @@ -229,7 +209,7 @@ describe("parallel option", () => { const entries = {}; for (let i = 0; i < os.cpus().length; i++) { - entries[`entry-${i}`] = `${__dirname}/fixtures/entry.js`; + entries[`entry-${i}`] = path.join(__dirname, "fixtures", "entry.js"); } compiler = getCompiler({ entry: entries }); @@ -257,19 +237,19 @@ describe("parallel option", () => { const entries = {}; for (let i = 0; i < os.cpus().length * 2; i++) { - entries[`entry-${i}`] = `${__dirname}/fixtures/entry.js`; + entries[`entry-${i}`] = path.join(__dirname, "fixtures", "entry.js"); } compiler = getCompiler({ entry: { - one: `${__dirname}/fixtures/entry.js`, - two: `${__dirname}/fixtures/entry.js`, - three: `${__dirname}/fixtures/entry.js`, - four: `${__dirname}/fixtures/entry.js`, - five: `${__dirname}/fixtures/entry.js`, - six: `${__dirname}/fixtures/entry.js`, - seven: `${__dirname}/fixtures/entry.js`, - eight: `${__dirname}/fixtures/entry.js`, + one: path.join(__dirname, "fixtures", "entry.js"), + two: path.join(__dirname, "fixtures", "entry.js"), + three: path.join(__dirname, "fixtures", "entry.js"), + four: path.join(__dirname, "fixtures", "entry.js"), + five: path.join(__dirname, "fixtures", "entry.js"), + six: path.join(__dirname, "fixtures", "entry.js"), + seven: path.join(__dirname, "fixtures", "entry.js"), + eight: path.join(__dirname, "fixtures", "entry.js"), }, }); diff --git a/test/sourceMap-option.test.js b/test/sourceMap-option.test.js index e23e1a4..6d5bf1c 100644 --- a/test/sourceMap-option.test.js +++ b/test/sourceMap-option.test.js @@ -1,14 +1,16 @@ -import webpack from "webpack"; +import path from "node:path"; + import MiniCssExtractPlugin from "mini-css-extract-plugin"; +import webpack from "webpack"; import CssMinimizerPlugin from "../src/index"; import { - getCompiler, compile, - readAssets, + getCompiler, getErrors, getWarnings, + readAssets, } from "./helpers"; expect.addSnapshotSerializer({ @@ -20,7 +22,7 @@ expect.addSnapshotSerializer({ try { return typeof JSON.parse(value) === "object"; - } catch (e) { + } catch { return false; } }, @@ -31,8 +33,8 @@ describe('when applied with "sourceMap" option', () => { const baseConfig = { devtool: "source-map", entry: { - entry: `${__dirname}/fixtures/sourcemap/foo.scss`, - entry2: `${__dirname}/fixtures/sourcemap/foo.css`, + entry: path.join(__dirname, "fixtures", "sourcemap", "foo.scss"), + entry2: path.join(__dirname, "fixtures", "sourcemap", "foo.css"), }, module: { rules: [ @@ -153,7 +155,6 @@ describe('when applied with "sourceMap" option', () => { const assetContent = ".bar {color: red};"; - // eslint-disable-next-line no-param-reassign compilation.assets["broken-source-map.css"] = { size() { return assetContent.length; @@ -184,7 +185,7 @@ describe('when applied with "sourceMap" option', () => { const config = Object.assign(baseConfig, { devtool: "source-map", entry: { - entry2: `${__dirname}/fixtures/sourcemap/foo.css`, + entry2: path.join(__dirname, "fixtures", "sourcemap", "foo.css"), }, plugins: [ emitBrokenSourceMapPlugin, @@ -227,7 +228,6 @@ describe('when applied with "sourceMap" option', () => { const assetContent = ".bar {color: red};"; - // eslint-disable-next-line no-param-reassign compilation.assets["broken-source-map.css"] = { size() { return assetContent.length; @@ -259,7 +259,7 @@ describe('when applied with "sourceMap" option', () => { const config = Object.assign(baseConfig, { devtool: "source-map", entry: { - entry2: `${__dirname}/fixtures/sourcemap/foo.css`, + entry2: path.join(__dirname, "fixtures", "sourcemap", "foo.css"), }, plugins: [ emitBrokenSourceMapPlugin, @@ -274,7 +274,6 @@ describe('when applied with "sourceMap" option', () => { new CssMinimizerPlugin({ minify: (data) => { - // eslint-disable-next-line global-require const postcss = require("postcss"); const plugin = () => { @@ -311,7 +310,7 @@ describe('when applied with "sourceMap" option', () => { const compiler = getCompiler({ devtool: false, entry: { - foo: `${__dirname}/fixtures/foo.css`, + foo: path.join(__dirname, "fixtures", "foo.css"), }, }); diff --git a/test/test-option.test.js b/test/test-option.test.js index bab92c5..8f34bad 100644 --- a/test/test-option.test.js +++ b/test/test-option.test.js @@ -1,11 +1,13 @@ +import path from "node:path"; + import CssMinimizerPlugin from "../src/index"; import { - getCompiler, compile, - readAssets, + getCompiler, getErrors, getWarnings, + readAssets, } from "./helpers"; describe('when applied with "test" option', () => { @@ -14,9 +16,9 @@ describe('when applied with "test" option', () => { beforeEach(() => { compiler = getCompiler({ entry: { - bar1: `${__dirname}/fixtures/test/bar1.css`, - bar2: `${__dirname}/fixtures/test/bar2.css`, - foo: `${__dirname}/fixtures/test/foo.css`, + bar1: path.join(__dirname, "fixtures", "test", "bar1.css"), + bar2: path.join(__dirname, "fixtures", "test", "bar2.css"), + foo: path.join(__dirname, "fixtures", "test", "foo.css"), }, }); }); diff --git a/test/validate-options.test.js b/test/validate-options.test.js index 8293be4..dd5cfb4 100644 --- a/test/validate-options.test.js +++ b/test/validate-options.test.js @@ -1,155 +1,157 @@ import CssMinimizerPlugin from "../src"; -it("validation", () => { - /* eslint-disable no-new */ - expect(() => { - new CssMinimizerPlugin({ test: /foo/ }); - }).not.toThrow(); +describe("validation", () => { + it("validation", () => { + /* eslint-disable no-new */ + expect(() => { + new CssMinimizerPlugin({ test: /foo/ }); + }).not.toThrow(); - expect(() => { - new CssMinimizerPlugin({ test: "foo" }); - }).not.toThrow(); + expect(() => { + new CssMinimizerPlugin({ test: "foo" }); + }).not.toThrow(); - expect(() => { - new CssMinimizerPlugin({ test: [/foo/] }); - }).not.toThrow(); - - expect(() => { - new CssMinimizerPlugin({ test: [/foo/, /bar/] }); - }).not.toThrow(); - - expect(() => { - new CssMinimizerPlugin({ test: ["foo", "bar"] }); - }).not.toThrow(); - - expect(() => { - new CssMinimizerPlugin({ test: [/foo/, "bar"] }); - }).not.toThrow(); - - expect(() => { - new CssMinimizerPlugin({ test: true }); - }).toThrowErrorMatchingSnapshot(); - - expect(() => { - new CssMinimizerPlugin({ test: [true] }); - }).toThrowErrorMatchingSnapshot(); - - expect(() => { - new CssMinimizerPlugin({ include: /foo/ }); - }).not.toThrow(); - - expect(() => { - new CssMinimizerPlugin({ include: "foo" }); - }).not.toThrow(); - - expect(() => { - new CssMinimizerPlugin({ include: [/foo/] }); - }).not.toThrow(); - - expect(() => { - new CssMinimizerPlugin({ include: [/foo/, /bar/] }); - }).not.toThrow(); - - expect(() => { - new CssMinimizerPlugin({ include: ["foo", "bar"] }); - }).not.toThrow(); - - expect(() => { - new CssMinimizerPlugin({ include: [/foo/, "bar"] }); - }).not.toThrow(); - - expect(() => { - new CssMinimizerPlugin({ include: true }); - }).toThrowErrorMatchingSnapshot(); - - expect(() => { - new CssMinimizerPlugin({ include: [true] }); - }).toThrowErrorMatchingSnapshot(); - - expect(() => { - new CssMinimizerPlugin({ exclude: /foo/ }); - }).not.toThrow(); - - expect(() => { - new CssMinimizerPlugin({ exclude: "foo" }); - }).not.toThrow(); - - expect(() => { - new CssMinimizerPlugin({ exclude: [/foo/] }); - }).not.toThrow(); - - expect(() => { - new CssMinimizerPlugin({ exclude: [/foo/, /bar/] }); - }).not.toThrow(); - - expect(() => { - new CssMinimizerPlugin({ exclude: ["foo", "bar"] }); - }).not.toThrow(); - - expect(() => { - new CssMinimizerPlugin({ exclude: [/foo/, "bar"] }); - }).not.toThrow(); - - expect(() => { - new CssMinimizerPlugin({ exclude: true }); - }).toThrowErrorMatchingSnapshot(); - - expect(() => { - new CssMinimizerPlugin({ exclude: [true] }); - }).toThrowErrorMatchingSnapshot(); - - expect(() => { - new CssMinimizerPlugin({ minimizerOptions: {} }); - }).not.toThrow(); - - expect(() => { - new CssMinimizerPlugin({ minimizerOptions: [{}] }); - }).not.toThrow(); - - expect(() => { - new CssMinimizerPlugin({ minimizerOptions: null }); - }).toThrowErrorMatchingSnapshot(); - - expect(() => { - new CssMinimizerPlugin({ - minimizerOptions: { colormin: true }, - }); - }).not.toThrow(); - - expect(() => { - new CssMinimizerPlugin({ parallel: true }); - }).not.toThrow(); - - expect(() => { - new CssMinimizerPlugin({ parallel: false }); - }).not.toThrow(); - - expect(() => { - new CssMinimizerPlugin({ parallel: 2 }); - }).not.toThrow(); - - expect(() => { - new CssMinimizerPlugin({ parallel: "2" }); - }).toThrowErrorMatchingSnapshot(); - - expect(() => { - new CssMinimizerPlugin({ parallel: {} }); - }).toThrowErrorMatchingSnapshot(); - - expect(() => { - new CssMinimizerPlugin({ minify() {} }); - }).not.toThrow(); - - expect(() => { - new CssMinimizerPlugin({ minify: [() => {}] }); - }).not.toThrow(); - - expect(() => { - new CssMinimizerPlugin({ minify: true }); - }).toThrowErrorMatchingSnapshot(); - - expect(() => { - new CssMinimizerPlugin({ unknown: true }); - }).toThrowErrorMatchingSnapshot(); - /* eslint-enable no-new */ + expect(() => { + new CssMinimizerPlugin({ test: [/foo/] }); + }).not.toThrow(); + + expect(() => { + new CssMinimizerPlugin({ test: [/foo/, /bar/] }); + }).not.toThrow(); + + expect(() => { + new CssMinimizerPlugin({ test: ["foo", "bar"] }); + }).not.toThrow(); + + expect(() => { + new CssMinimizerPlugin({ test: [/foo/, "bar"] }); + }).not.toThrow(); + + expect(() => { + new CssMinimizerPlugin({ test: true }); + }).toThrowErrorMatchingSnapshot(); + + expect(() => { + new CssMinimizerPlugin({ test: [true] }); + }).toThrowErrorMatchingSnapshot(); + + expect(() => { + new CssMinimizerPlugin({ include: /foo/ }); + }).not.toThrow(); + + expect(() => { + new CssMinimizerPlugin({ include: "foo" }); + }).not.toThrow(); + + expect(() => { + new CssMinimizerPlugin({ include: [/foo/] }); + }).not.toThrow(); + + expect(() => { + new CssMinimizerPlugin({ include: [/foo/, /bar/] }); + }).not.toThrow(); + + expect(() => { + new CssMinimizerPlugin({ include: ["foo", "bar"] }); + }).not.toThrow(); + + expect(() => { + new CssMinimizerPlugin({ include: [/foo/, "bar"] }); + }).not.toThrow(); + + expect(() => { + new CssMinimizerPlugin({ include: true }); + }).toThrowErrorMatchingSnapshot(); + + expect(() => { + new CssMinimizerPlugin({ include: [true] }); + }).toThrowErrorMatchingSnapshot(); + + expect(() => { + new CssMinimizerPlugin({ exclude: /foo/ }); + }).not.toThrow(); + + expect(() => { + new CssMinimizerPlugin({ exclude: "foo" }); + }).not.toThrow(); + + expect(() => { + new CssMinimizerPlugin({ exclude: [/foo/] }); + }).not.toThrow(); + + expect(() => { + new CssMinimizerPlugin({ exclude: [/foo/, /bar/] }); + }).not.toThrow(); + + expect(() => { + new CssMinimizerPlugin({ exclude: ["foo", "bar"] }); + }).not.toThrow(); + + expect(() => { + new CssMinimizerPlugin({ exclude: [/foo/, "bar"] }); + }).not.toThrow(); + + expect(() => { + new CssMinimizerPlugin({ exclude: true }); + }).toThrowErrorMatchingSnapshot(); + + expect(() => { + new CssMinimizerPlugin({ exclude: [true] }); + }).toThrowErrorMatchingSnapshot(); + + expect(() => { + new CssMinimizerPlugin({ minimizerOptions: {} }); + }).not.toThrow(); + + expect(() => { + new CssMinimizerPlugin({ minimizerOptions: [{}] }); + }).not.toThrow(); + + expect(() => { + new CssMinimizerPlugin({ minimizerOptions: null }); + }).toThrowErrorMatchingSnapshot(); + + expect(() => { + new CssMinimizerPlugin({ + minimizerOptions: { colormin: true }, + }); + }).not.toThrow(); + + expect(() => { + new CssMinimizerPlugin({ parallel: true }); + }).not.toThrow(); + + expect(() => { + new CssMinimizerPlugin({ parallel: false }); + }).not.toThrow(); + + expect(() => { + new CssMinimizerPlugin({ parallel: 2 }); + }).not.toThrow(); + + expect(() => { + new CssMinimizerPlugin({ parallel: "2" }); + }).toThrowErrorMatchingSnapshot(); + + expect(() => { + new CssMinimizerPlugin({ parallel: {} }); + }).toThrowErrorMatchingSnapshot(); + + expect(() => { + new CssMinimizerPlugin({ minify() {} }); + }).not.toThrow(); + + expect(() => { + new CssMinimizerPlugin({ minify: [() => {}] }); + }).not.toThrow(); + + expect(() => { + new CssMinimizerPlugin({ minify: true }); + }).toThrowErrorMatchingSnapshot(); + + expect(() => { + new CssMinimizerPlugin({ unknown: true }); + }).toThrowErrorMatchingSnapshot(); + /* eslint-enable no-new */ + }); }); diff --git a/test/warningsFilter-option.test.js b/test/warningsFilter-option.test.js index 45620f7..810ae2d 100644 --- a/test/warningsFilter-option.test.js +++ b/test/warningsFilter-option.test.js @@ -1,3 +1,5 @@ +import path from "node:path"; + import postcss from "postcss"; import CssMinimizerPlugin from "../src/index"; @@ -12,24 +14,22 @@ import { describe("warningsFilter option", () => { it('should match snapshot for a "function" value', async () => { - const plugin = () => { - return { - postcssPlugin: "warning-plugin", - Once(root, { result }) { - result.warn(`Warning from ${result.opts.from}`, { - plugin: "warning-plugin", - }); - }, - }; - }; + const plugin = () => ({ + postcssPlugin: "warning-plugin", + Once(root, { result }) { + result.warn(`Warning from ${result.opts.from}`, { + plugin: "warning-plugin", + }); + }, + }); plugin.postcss = true; const compiler = getCompiler({ entry: { - foo: `${__dirname}/fixtures/test/foo.css`, - bar1: `${__dirname}/fixtures/test/bar1.css`, - bar2: `${__dirname}/fixtures/test/bar2.css`, + foo: path.join(__dirname, "fixtures", "test", "foo.css"), + bar1: path.join(__dirname, "fixtures", "test", "bar1.css"), + bar2: path.join(__dirname, "fixtures", "test", "bar2.css"), }, }); @@ -40,14 +40,12 @@ describe("warningsFilter option", () => { return postcss([plugin]) .process(input, { from: fileName, to: fileName }) - .then((result) => { - return { - code: result.css, - map: result.map, - error: result.error, - warnings: result.warnings(), - }; - }); + .then((result) => ({ + code: result.css, + map: result.map, + error: result.error, + warnings: result.warnings(), + })); }, warningsFilter(warning, file) { if (/foo/.test(file)) { diff --git a/test/worker.test.js b/test/worker.test.js index 5522875..d55c102 100644 --- a/test/worker.test.js +++ b/test/worker.test.js @@ -1,8 +1,7 @@ import serialize from "serialize-javascript"; -import { transform } from "../src/minify"; - import CssMinimizerPlugin from "../src"; +import { transform } from "../src/minify"; import { normalizeErrors } from "./helpers"; @@ -56,9 +55,7 @@ describe("worker", () => { name: "entry.css", input: ".foo{color:red;}\n.bar{color:coral;}", minimizer: { - implementation: () => { - return { code: ".minify {};" }; - }, + implementation: () => ({ code: ".minify {};" }), options: { discardComments: false }, }, }; diff --git a/types/index.d.ts b/types/index.d.ts index 7b779b1..dcd624a 100644 --- a/types/index.d.ts +++ b/types/index.d.ts @@ -5,44 +5,44 @@ export = CssMinimizerPlugin; declare class CssMinimizerPlugin { /** * @private - * @param {any} input - * @returns {boolean} + * @param {unknown} input Input to check + * @returns {boolean} - Whether input is a source map */ private static isSourceMap; /** * @private - * @param {Warning | WarningObject | string} warning - * @param {string} file - * @param {WarningsFilter} [warningsFilter] - * @param {TraceMap} [sourceMap] - * @param {Compilation["requestShortener"]} [requestShortener] - * @returns {Error & { hideStack?: boolean, file?: string } | undefined} + * @param {Warning | WarningObject | string} warning Warning + * @param {string} file File name + * @param {WarningsFilter=} warningsFilter Warnings filter + * @param {TraceMap=} sourceMap Source map + * @param {Compilation["requestShortener"]=} requestShortener Request shortener + * @returns {Error & { hideStack?: boolean, file?: string } | undefined} - Built warning */ private static buildWarning; /** * @private - * @param {Error | ErrorObject | string} error - * @param {string} file - * @param {TraceMap} [sourceMap] - * @param {Compilation["requestShortener"]} [requestShortener] - * @returns {Error} + * @param {Error | ErrorObject | string} error Error + * @param {string} file File name + * @param {TraceMap=} sourceMap Source map + * @param {Compilation["requestShortener"]=} requestShortener Request shortener + * @returns {Error} - Built error */ private static buildError; /** * @private - * @param {Parallel} parallel - * @returns {number} + * @param {Parallel} parallel Parallel option + * @returns {number} - Available number of cores */ private static getAvailableNumberOfCores; /** * @private * @template T - * @param {BasicMinimizerImplementation & MinimizeFunctionHelpers} implementation - * @returns {boolean} + * @param {BasicMinimizerImplementation & MinimizeFunctionHelpers} implementation Implementation + * @returns {boolean} - Whether worker threads are supported */ private static isSupportsWorkerThreads; /** - * @param {BasePluginOptions & DefinedDefaultMinimizerAndOptions} [options] + * @param {BasePluginOptions & DefinedDefaultMinimizerAndOptions=} options Plugin options */ constructor( options?: BasePluginOptions & DefinedDefaultMinimizerAndOptions, @@ -54,16 +54,16 @@ declare class CssMinimizerPlugin { private options; /** * @private - * @param {Compiler} compiler - * @param {Compilation} compilation - * @param {Record} assets - * @param {{availableNumberOfCores: number}} optimizeOptions - * @returns {Promise} + * @param {Compiler} compiler Compiler + * @param {Compilation} compilation Compilation + * @param {Record} assets Assets + * @param {{availableNumberOfCores: number}} optimizeOptions Optimize options + * @returns {Promise} - Promise */ private optimize; /** - * @param {Compiler} compiler - * @returns {void} + * @param {Compiler} compiler Compiler + * @returns {void} - Void */ apply(compiler: Compiler): void; } @@ -133,10 +133,7 @@ type Syntax = import("postcss").Syntax; type Parser = import("postcss").Parser; type Stringifier = import("postcss").Stringifier; type TraceMap = import("@jridgewell/trace-mapping").TraceMap; -type CssNanoOptions = { - configFile?: string | undefined; - preset?: [string, object] | string | undefined; -}; +type CssNanoOptions = Record; type Warning = | (Error & { plugin?: string; @@ -145,29 +142,68 @@ type Warning = }) | string; type WarningObject = { + /** + * - Warning message + */ message: string; + /** + * - Plugin name + */ plugin?: string | undefined; + /** + * - Warning text + */ text?: string | undefined; + /** + * - Line number + */ line?: number | undefined; + /** + * - Column number + */ column?: number | undefined; }; type ErrorObject = { + /** + * - Error message + */ message: string; + /** + * - Line number + */ line?: number | undefined; + /** + * - Column number + */ column?: number | undefined; + /** + * - Error stack trace + */ stack?: string | undefined; }; type MinimizedResult = { + /** + * - Minimized code + */ code: string; - map?: import("@jridgewell/trace-mapping").EncodedSourceMap | undefined; - errors?: (string | Error | ErrorObject)[] | undefined; - warnings?: (Warning | WarningObject)[] | undefined; + /** + * - Source map + */ + map?: RawSourceMap | undefined; + /** + * - Errors + */ + errors?: Array | undefined; + /** + * - Warnings + */ + warnings?: Array | undefined; }; type Input = { [file: string]: string; }; type CustomOptions = { - [key: string]: any; + [key: string]: unknown; }; type InferDefaultType = T extends infer U ? U : CustomOptions; type MinimizerOptions = T extends any[] @@ -179,6 +215,9 @@ type BasicMinimizerImplementation = ( minifyOptions: InferDefaultType, ) => Promise | MinimizedResult; type MinimizeFunctionHelpers = { + /** + * - Check if worker threads are supported + */ supportsWorkerThreads?: (() => boolean | undefined) | undefined; }; type MinimizerImplementation = T extends any[] @@ -188,20 +227,41 @@ type MinimizerImplementation = T extends any[] } : BasicMinimizerImplementation & MinimizeFunctionHelpers; type InternalOptions = { + /** + * - Name + */ name: string; + /** + * - Input + */ input: string; + /** + * - Input source map + */ inputSourceMap: RawSourceMap | undefined; + /** + * - Minimizer + */ minimizer: { implementation: MinimizerImplementation; options: MinimizerOptions; }; }; type InternalResult = { + /** + * - Outputs + */ outputs: Array<{ code: string; map: RawSourceMap | undefined; }>; + /** + * - Warnings + */ warnings: Array; + /** + * - Errors + */ errors: Array; }; type Parallel = undefined | boolean | number; @@ -213,11 +273,26 @@ type WarningsFilter = ( source?: string, ) => boolean; type BasePluginOptions = { + /** + * - Test rule + */ test?: Rule | undefined; + /** + * - Include rule + */ include?: Rule | undefined; + /** + * - Exclude rule + */ exclude?: Rule | undefined; + /** + * - Warnings filter + */ warningsFilter?: WarningsFilter | undefined; - parallel?: Parallel; + /** + * - Parallel option + */ + parallel?: Parallel | undefined; }; type MinimizerWorker = JestWorker & { transform: (options: string) => Promise; diff --git a/types/minify.d.ts b/types/minify.d.ts index beab468..d16e7ac 100644 --- a/types/minify.d.ts +++ b/types/minify.d.ts @@ -4,14 +4,14 @@ export type InternalResult = import("./index.js").InternalResult; /** @typedef {import("./index.js").InternalResult} InternalResult */ /** * @template T - * @param {import("./index.js").InternalOptions} options - * @returns {Promise} + * @param {import("./index.js").InternalOptions} options Options + * @returns {Promise} - Promise with internal result */ export function minify( options: import("./index.js").InternalOptions, ): Promise; /** - * @param {string} options - * @returns {Promise} + * @param {string} options Options string + * @returns {Promise} - Promise with internal result */ export function transform(options: string): Promise; From 48c44f151777f9ac96ae8d89cb1329e14a037cbd Mon Sep 17 00:00:00 2001 From: Sachin Kumar Date: Sun, 20 Jul 2025 08:20:33 +0530 Subject: [PATCH 02/10] chore: fix CI --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 43c5c2e..e643154 100644 --- a/package.json +++ b/package.json @@ -107,7 +107,7 @@ "memfs": "^4.11.1", "mini-css-extract-plugin": "^2.9.0", "npm-run-all": "^4.1.5", - "prettier": "^3.3.3", + "prettier": "^3.6.2", "sass": "^1.77.8", "sass-loader": "^16.0.5", "standard-version": "^9.5.0", From 5e958d66b9fdbdd2cfe2453784c7728d53e8defd Mon Sep 17 00:00:00 2001 From: Sachin Kumar Date: Sun, 20 Jul 2025 08:29:41 +0530 Subject: [PATCH 03/10] chore: update nodejs.yml to fix CI --- .github/workflows/nodejs.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml index 0380ff2..61dfc56 100644 --- a/.github/workflows/nodejs.yml +++ b/.github/workflows/nodejs.yml @@ -43,7 +43,7 @@ jobs: cache: "npm" - name: Install dependencies - run: npm ci + run: npm install - name: Lint run: npm run lint @@ -90,7 +90,7 @@ jobs: cache: "npm" - name: Install dependencies - run: npm ci + run: npm install - name: Install webpack ${{ matrix.webpack-version }} if: matrix.webpack-version != 'latest' From ed551a2147d4cffa4276115b95b3035d9f02420f Mon Sep 17 00:00:00 2001 From: Sachin Kumar Date: Sun, 20 Jul 2025 08:33:28 +0530 Subject: [PATCH 04/10] chore: fix lint --- README.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 92a7d04..dc82047 100644 --- a/README.md +++ b/README.md @@ -296,15 +296,14 @@ module.exports = { minify: [ CssMinimizerPlugin.cssnanoMinify, CssMinimizerPlugin.cleanCssMinify, - async (data, inputMap, minimizerOptions) => + async (data, inputMap, minimizerOptions) => // Custom minifier function - ({ + ({ code: "a{color: red}", - map: "{\"version\": \"3\", ...}", + map: '{"version": "3", ...}', warnings: [], errors: [], - }) - , + }), ], }), ], From d1bf436a242b588b2d2d405bcb0ee1aacfdb799f Mon Sep 17 00:00:00 2001 From: Sachin Kumar Date: Sun, 20 Jul 2025 08:45:09 +0530 Subject: [PATCH 05/10] chore: fix lint --- eslint.config.mjs | 4 ++++ src/utils.js | 1 - 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/eslint.config.mjs b/eslint.config.mjs index e5e2dd9..ef9ef78 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -17,6 +17,10 @@ export default defineConfig([ ignores: ["os.availableParallelism"], }, ], + // Disable problematic unicorn rules to work around security vulnerabilities + "unicorn/no-unnecessary-array-flat-depth": "off", + "unicorn/no-unnecessary-array-splice-count": "off", + "unicorn/no-useless-fallback-in-spread": "off", }, }, ]); diff --git a/src/utils.js b/src/utils.js index a95af47..4bccd61 100644 --- a/src/utils.js +++ b/src/utils.js @@ -120,7 +120,6 @@ async function cssnanoMinify( /** @type {ProcessOptions} */ const postcssOptions = { from: name, - // eslint-disable-next-line unicorn/no-useless-fallback-in-spread ...(minimizerOptions.processorOptions || {}), }; From 4d3e0ee7dd349a4e887ce257be69e595433a4f06 Mon Sep 17 00:00:00 2001 From: Sachin Kumar Date: Mon, 21 Jul 2025 04:24:30 +0530 Subject: [PATCH 06/10] chore: update @eslint/markdown --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index e643154..928bcc0 100644 --- a/package.json +++ b/package.json @@ -72,7 +72,7 @@ "@babel/preset-env": "^7.25.3", "@commitlint/cli": "^19.3.0", "@commitlint/config-conventional": "^19.2.2", - "@eslint/markdown": "^6.6.0", + "@eslint/markdown": "^7.0.0", "@parcel/css": "^1.8.3", "@stylistic/eslint-plugin": "^5.2.0", "@swc/css": "^0.0.28", @@ -93,7 +93,7 @@ "esbuild": "^0.25.0", "eslint": "^9.30.1", "eslint-config-prettier": "^10.1.5", - "eslint-config-webpack": "^4.3.0", + "eslint-config-webpack": "^4.4.1", "eslint-plugin-import": "^2.32.0", "eslint-plugin-jest": "^29.0.1", "eslint-plugin-jsdoc": "^51.4.1", From 0bb03f20386a594564cd1061e2678a79fce11ea9 Mon Sep 17 00:00:00 2001 From: Sachin Kumar Date: Sat, 26 Jul 2025 12:53:54 +0530 Subject: [PATCH 07/10] chore: fix lint --- .github/workflows/nodejs.yml | 4 +- eslint.config.mjs | 18 ----- src/index.js | 68 ++++++++++--------- src/minify.js | 4 +- src/utils.js | 33 +++++---- test/helpers/compile.js | 2 +- .../emitAssetInChildCompilationLoader.js | 2 +- test/helpers/emitAssetLoader.js | 2 +- test/helpers/emitAssetLoader2.js | 2 +- test/helpers/getCompiler.js | 2 +- test/helpers/normalizeErrors.js | 4 +- test/helpers/readAssets.js | 2 +- types/index.d.ts | 14 ++-- types/minify.d.ts | 4 +- 14 files changed, 74 insertions(+), 87 deletions(-) diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml index 61dfc56..0380ff2 100644 --- a/.github/workflows/nodejs.yml +++ b/.github/workflows/nodejs.yml @@ -43,7 +43,7 @@ jobs: cache: "npm" - name: Install dependencies - run: npm install + run: npm ci - name: Lint run: npm run lint @@ -90,7 +90,7 @@ jobs: cache: "npm" - name: Install dependencies - run: npm install + run: npm ci - name: Install webpack ${{ matrix.webpack-version }} if: matrix.webpack-version != 'latest' diff --git a/eslint.config.mjs b/eslint.config.mjs index ef9ef78..c227975 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -1,26 +1,8 @@ import { defineConfig } from "eslint/config"; import configs from "eslint-config-webpack/configs.js"; -import n from "eslint-plugin-n"; export default defineConfig([ { extends: [configs["recommended-dirty"]], - plugins: { - n, - }, - rules: { - // Disable experimental Node.js API warnings for os.availableParallelism - // This API is widely supported and stable in practice - "n/no-unsupported-features/node-builtins": [ - "error", - { - ignores: ["os.availableParallelism"], - }, - ], - // Disable problematic unicorn rules to work around security vulnerabilities - "unicorn/no-unnecessary-array-flat-depth": "off", - "unicorn/no-unnecessary-array-splice-count": "off", - "unicorn/no-useless-fallback-in-spread": "off", - }, }, ]); diff --git a/src/index.js b/src/index.js index 22f006b..7d0ff5c 100644 --- a/src/index.js +++ b/src/index.js @@ -31,35 +31,35 @@ const { /** * @typedef {Record} CssNanoOptions - * @property {string=} configFile - Configuration file path - * @property {string | [string, Record] | undefined=} preset - CSS nano preset + * @property {string=} configFile Configuration file path + * @property {string | [string, Record] | undefined=} preset CSS nano preset */ /** @typedef {Error & { plugin?: string, text?: string, source?: string } | string} Warning */ /** * @typedef {object} WarningObject - * @property {string} message - Warning message - * @property {string=} plugin - Plugin name - * @property {string=} text - Warning text - * @property {number=} line - Line number - * @property {number=} column - Column number + * @property {string} message Warning message + * @property {string=} plugin Plugin name + * @property {string=} text Warning text + * @property {number=} line Line number + * @property {number=} column Column number */ /** * @typedef {object} ErrorObject - * @property {string} message - Error message - * @property {number=} line - Line number - * @property {number=} column - Column number - * @property {string=} stack - Error stack trace + * @property {string} message Error message + * @property {number=} line Line number + * @property {number=} column Column number + * @property {string=} stack Error stack trace */ /** * @typedef {object} MinimizedResult - * @property {string} code - Minimized code - * @property {RawSourceMap=} map - Source map - * @property {Array=} errors - Errors - * @property {Array=} warnings - Warnings + * @property {string} code Minimized code + * @property {RawSourceMap=} map Source map + * @property {Array=} errors Errors + * @property {Array=} warnings Warnings */ /** @@ -91,7 +91,7 @@ const { /** * @typedef {object} MinimizeFunctionHelpers - * @property {() => boolean | undefined=} supportsWorkerThreads - Check if worker threads are supported + * @property {() => boolean | undefined=} supportsWorkerThreads Check if worker threads are supported */ /** @@ -102,10 +102,10 @@ const { /** * @template T * @typedef {object} InternalOptions - * @property {string} name - Name - * @property {string} input - Input - * @property {RawSourceMap | undefined} inputSourceMap - Input source map - * @property {{ implementation: MinimizerImplementation, options: MinimizerOptions }} minimizer - Minimizer + * @property {string} name Name + * @property {string} input Input + * @property {RawSourceMap | undefined} inputSourceMap Input source map + * @property {{ implementation: MinimizerImplementation, options: MinimizerOptions }} minimizer Minimizer */ /** @@ -124,11 +124,11 @@ const { /** * @typedef {object} BasePluginOptions - * @property {Rule=} test - Test rule - * @property {Rule=} include - Include rule - * @property {Rule=} exclude - Exclude rule - * @property {WarningsFilter=} warningsFilter - Warnings filter - * @property {Parallel=} parallel - Parallel option + * @property {Rule=} test Test rule + * @property {Rule=} include Include rule + * @property {Rule=} exclude Exclude rule + * @property {WarningsFilter=} warningsFilter Warnings filter + * @property {Parallel=} parallel Parallel option */ /** @@ -202,7 +202,7 @@ class CssMinimizerPlugin { /** * @private * @param {unknown} input Input to check - * @returns {boolean} - Whether input is a source map + * @returns {boolean} Whether input is a source map */ static isSourceMap(input) { // All required options for `new SourceMapConsumer(...options)` @@ -226,7 +226,7 @@ class CssMinimizerPlugin { * @param {WarningsFilter=} warningsFilter Warnings filter * @param {TraceMap=} sourceMap Source map * @param {Compilation["requestShortener"]=} requestShortener Request shortener - * @returns {Error & { hideStack?: boolean, file?: string } | undefined} - Built warning + * @returns {Error & { hideStack?: boolean, file?: string } | undefined} Built warning */ static buildWarning( warning, @@ -309,7 +309,7 @@ class CssMinimizerPlugin { * @param {string} file File name * @param {TraceMap=} sourceMap Source map * @param {Compilation["requestShortener"]=} requestShortener Request shortener - * @returns {Error} - Built error + * @returns {Error} Built error */ static buildError(error, file, sourceMap, requestShortener) { /** @@ -384,15 +384,17 @@ class CssMinimizerPlugin { /** * @private * @param {Parallel} parallel Parallel option - * @returns {number} - Available number of cores + * @returns {number} Available number of cores */ static getAvailableNumberOfCores(parallel) { // In some cases cpus() returns undefined // https://github.com/nodejs/node/issues/19022 const cpus = + // eslint-disable-next-line n/no-unsupported-features/node-builtins typeof os.availableParallelism === "function" - ? { length: os.availableParallelism() } + ? // eslint-disable-next-line n/no-unsupported-features/node-builtins + { length: os.availableParallelism() } : os.cpus() || { length: 1 }; return parallel === true || typeof parallel === "undefined" @@ -404,7 +406,7 @@ class CssMinimizerPlugin { * @private * @template T * @param {BasicMinimizerImplementation & MinimizeFunctionHelpers} implementation Implementation - * @returns {boolean} - Whether worker threads are supported + * @returns {boolean} Whether worker threads are supported */ static isSupportsWorkerThreads(implementation) { return typeof implementation.supportsWorkerThreads !== "undefined" @@ -418,7 +420,7 @@ class CssMinimizerPlugin { * @param {Compilation} compilation Compilation * @param {Record} assets Assets * @param {{availableNumberOfCores: number}} optimizeOptions Optimize options - * @returns {Promise} - Promise + * @returns {Promise} Promise */ async optimize(compiler, compilation, assets, optimizeOptions) { const cache = compilation.getCache("CssMinimizerWebpackPlugin"); @@ -709,7 +711,7 @@ class CssMinimizerPlugin { /** * @param {Compiler} compiler Compiler - * @returns {void} - Void + * @returns {void} Void */ apply(compiler) { const pluginName = this.constructor.name; diff --git a/src/minify.js b/src/minify.js index dbef5bc..d97de87 100644 --- a/src/minify.js +++ b/src/minify.js @@ -4,7 +4,7 @@ /** * @template T * @param {import("./index.js").InternalOptions} options Options - * @returns {Promise} - Promise with internal result + * @returns {Promise} Promise with internal result */ async function minify(options) { const minifyFns = Array.isArray(options.minimizer.implementation) @@ -63,7 +63,7 @@ async function minify(options) { /** * @param {string} options Options string - * @returns {Promise} - Promise with internal result + * @returns {Promise} Promise with internal result */ async function transform(options) { // 'use strict' => this === undefined (Clean Scope) diff --git a/src/utils.js b/src/utils.js index 4bccd61..8e46227 100644 --- a/src/utils.js +++ b/src/utils.js @@ -73,7 +73,7 @@ function throttleAll(limit, tasks) { * @param {Input} input Input * @param {RawSourceMap=} sourceMap Source map * @param {CustomOptions=} minimizerOptions Minimizer options - * @returns {Promise} - Promise with minimized result + * @returns {Promise} Promise with minimized result */ async function cssnanoMinify( input, @@ -83,7 +83,7 @@ async function cssnanoMinify( /** * @template T * @param {string} module Module to load - * @returns {Promise} - Promise with loaded module + * @returns {Promise} Promise with loaded module */ const load = async (module) => { let exports; @@ -120,7 +120,10 @@ async function cssnanoMinify( /** @type {ProcessOptions} */ const postcssOptions = { from: name, - ...(minimizerOptions.processorOptions || {}), + ...(minimizerOptions.processorOptions && + typeof minimizerOptions.processorOptions === "object" + ? minimizerOptions.processorOptions + : {}), }; if (typeof postcssOptions.parser === "string") { @@ -194,7 +197,7 @@ cssnanoMinify.supportsWorkerThreads = () => true; * @param {Input} input Input * @param {RawSourceMap=} sourceMap Source map * @param {CustomOptions=} minimizerOptions Minimizer options - * @returns {Promise} - Promise with minimized result + * @returns {Promise} Promise with minimized result */ async function cssoMinify(input, sourceMap, minimizerOptions) { const csso = require("csso"); @@ -223,7 +226,7 @@ cssoMinify.supportsWorkerThreads = () => true; * @param {Input} input Input * @param {RawSourceMap=} sourceMap Source map * @param {CustomOptions=} minimizerOptions Minimizer options - * @returns {Promise} - Promise with minimized result + * @returns {Promise} Promise with minimized result */ async function cleanCssMinify(input, sourceMap, minimizerOptions) { const CleanCSS = require("clean-css"); @@ -249,7 +252,7 @@ async function cleanCssMinify(input, sourceMap, minimizerOptions) { generatedSourceMap.sources = generatedSourceMap.sources.map( /** * @param {string | null} item Path item - * @returns {string} - Normalized path + * @returns {string} Normalized path */ (item) => isWindowsPathSep ? (item || "").replaceAll("\\", "/") : item || "", @@ -270,12 +273,12 @@ cleanCssMinify.supportsWorkerThreads = () => true; * @param {Input} input Input * @param {RawSourceMap=} sourceMap Source map * @param {CustomOptions=} minimizerOptions Minimizer options - * @returns {Promise} - Promise with minimized result + * @returns {Promise} Promise with minimized result */ async function esbuildMinify(input, sourceMap, minimizerOptions) { /** * @param {import("esbuild").TransformOptions=} esbuildOptions ESBuild options - * @returns {import("esbuild").TransformOptions} - Built ESBuild options + * @returns {import("esbuild").TransformOptions} Built ESBuild options */ const buildEsbuildOptions = (esbuildOptions = {}) => // Need deep copy objects to avoid https://github.com/terser/terser/issues/366 @@ -358,14 +361,14 @@ esbuildMinify.supportsWorkerThreads = () => false; * @param {Input} input Input * @param {RawSourceMap=} sourceMap Source map * @param {CustomOptions=} minimizerOptions Minimizer options - * @returns {Promise} - Promise with minimized result + * @returns {Promise} Promise with minimized result */ async function parcelCssMinify(input, sourceMap, minimizerOptions) { const [[filename, code]] = Object.entries(input); // eslint-disable-next-line jsdoc/no-restricted-syntax /** * @param {Partial>=} parcelCssOptions Parcel CSS options - * @returns {import("@parcel/css").TransformOptions} - Built Parcel CSS options + * @returns {import("@parcel/css").TransformOptions} Built Parcel CSS options */ const buildParcelCssOptions = (parcelCssOptions = {}) => // Need deep copy objects to avoid https://github.com/terser/terser/issues/366 @@ -403,14 +406,14 @@ parcelCssMinify.supportsWorkerThreads = () => false; * @param {Input} input Input * @param {RawSourceMap=} sourceMap Source map * @param {CustomOptions=} minimizerOptions Minimizer options - * @returns {Promise} - Promise with minimized result + * @returns {Promise} Promise with minimized result */ async function lightningCssMinify(input, sourceMap, minimizerOptions) { const [[filename, code]] = Object.entries(input); // eslint-disable-next-line jsdoc/no-restricted-syntax /** * @param {Partial>=} lightningCssOptions Lightning CSS options - * @returns {import("lightningcss").TransformOptions} - Built Lightning CSS options + * @returns {import("lightningcss").TransformOptions} Built Lightning CSS options */ const buildLightningCssOptions = (lightningCssOptions = {}) => // Need deep copy objects to avoid https://github.com/terser/terser/issues/366 @@ -448,13 +451,13 @@ lightningCssMinify.supportsWorkerThreads = () => false; * @param {Input} input Input * @param {RawSourceMap=} sourceMap Source map * @param {CustomOptions=} minimizerOptions Minimizer options - * @returns {Promise} - Promise with minimized result + * @returns {Promise} Promise with minimized result */ async function swcMinify(input, sourceMap, minimizerOptions) { const [[filename, code]] = Object.entries(input); /** * @param {Partial=} swcOptions SWC options - * @returns {import("@swc/css").MinifyOptions} - Built SWC options + * @returns {import("@swc/css").MinifyOptions} Built SWC options */ const buildSwcOptions = (swcOptions = {}) => // Need deep copy objects to avoid https://github.com/terser/terser/issues/366 @@ -500,7 +503,7 @@ swcMinify.supportsWorkerThreads = () => false; /** * @template T * @param {(() => unknown) | undefined} fn Function to memoize - * @returns {() => T} - Memoized function + * @returns {() => T} Memoized function */ function memoize(fn) { let cache = false; diff --git a/test/helpers/compile.js b/test/helpers/compile.js index a2395e2..c48123f 100644 --- a/test/helpers/compile.js +++ b/test/helpers/compile.js @@ -1,6 +1,6 @@ /** * @param {import("webpack").Compiler} compiler Webpack compiler - * @returns {Promise} - Promise with webpack stats + * @returns {Promise} Promise with webpack stats */ export default function compile(compiler) { return new Promise((resolve, reject) => { diff --git a/test/helpers/emitAssetInChildCompilationLoader.js b/test/helpers/emitAssetInChildCompilationLoader.js index 1651ad5..0a39326 100644 --- a/test/helpers/emitAssetInChildCompilationLoader.js +++ b/test/helpers/emitAssetInChildCompilationLoader.js @@ -21,7 +21,7 @@ class PreCopyPlugin { } /** - * @returns {string} - Loader result + * @returns {string} Loader result */ export default function loader() { const callback = this.async(); diff --git a/test/helpers/emitAssetLoader.js b/test/helpers/emitAssetLoader.js index 3a77fbe..051d976 100644 --- a/test/helpers/emitAssetLoader.js +++ b/test/helpers/emitAssetLoader.js @@ -1,6 +1,6 @@ /** * @param {string} content Loader content - * @returns {string} - Processed content + * @returns {string} Processed content */ export default function loader(content) { this.emitFile("style.css", "a { color: red; }"); diff --git a/test/helpers/emitAssetLoader2.js b/test/helpers/emitAssetLoader2.js index aff5369..7fc2e5d 100644 --- a/test/helpers/emitAssetLoader2.js +++ b/test/helpers/emitAssetLoader2.js @@ -1,6 +1,6 @@ /** * @param {string} content Loader content - * @returns {string} - Processed content + * @returns {string} Processed content */ export default function loader(content) { this.emitFile("style-2.css", "a { color: coral; }"); diff --git a/test/helpers/getCompiler.js b/test/helpers/getCompiler.js index 3b6481c..3e4d07b 100644 --- a/test/helpers/getCompiler.js +++ b/test/helpers/getCompiler.js @@ -6,7 +6,7 @@ import webpack from "webpack"; /** * @param {import("webpack").Configuration} config Webpack configuration - * @returns {import("webpack").Compiler} - Webpack compiler + * @returns {import("webpack").Compiler} Webpack compiler */ export default function getCompiler(config) { const compiler = webpack({ diff --git a/test/helpers/normalizeErrors.js b/test/helpers/normalizeErrors.js index 5539e58..f261182 100644 --- a/test/helpers/normalizeErrors.js +++ b/test/helpers/normalizeErrors.js @@ -1,6 +1,6 @@ /** * @param {string} str String to process - * @returns {string} - Processed string + * @returns {string} Processed string */ function removeCWD(str) { const isWin = process.platform === "win32"; @@ -17,7 +17,7 @@ function removeCWD(str) { /** * @param {Array} errors Array of errors - * @returns {Array} - Normalized error messages + * @returns {Array} Normalized error messages */ export default (errors) => errors.map((error) => diff --git a/test/helpers/readAssets.js b/test/helpers/readAssets.js index e419bb7..284349f 100644 --- a/test/helpers/readAssets.js +++ b/test/helpers/readAssets.js @@ -4,7 +4,7 @@ import readAsset from "./readAsset"; * @param {import("webpack").Compiler} compiler Webpack compiler * @param {import("webpack").Stats} stats Webpack stats * @param {RegExp=} extension File extension filter - * @returns {Record} - Assets map + * @returns {Record} Assets map */ export default function readAssets(compiler, stats, extension) { const assets = {}; diff --git a/types/index.d.ts b/types/index.d.ts index dcd624a..a1c376c 100644 --- a/types/index.d.ts +++ b/types/index.d.ts @@ -6,7 +6,7 @@ declare class CssMinimizerPlugin { /** * @private * @param {unknown} input Input to check - * @returns {boolean} - Whether input is a source map + * @returns {boolean} Whether input is a source map */ private static isSourceMap; /** @@ -16,7 +16,7 @@ declare class CssMinimizerPlugin { * @param {WarningsFilter=} warningsFilter Warnings filter * @param {TraceMap=} sourceMap Source map * @param {Compilation["requestShortener"]=} requestShortener Request shortener - * @returns {Error & { hideStack?: boolean, file?: string } | undefined} - Built warning + * @returns {Error & { hideStack?: boolean, file?: string } | undefined} Built warning */ private static buildWarning; /** @@ -25,20 +25,20 @@ declare class CssMinimizerPlugin { * @param {string} file File name * @param {TraceMap=} sourceMap Source map * @param {Compilation["requestShortener"]=} requestShortener Request shortener - * @returns {Error} - Built error + * @returns {Error} Built error */ private static buildError; /** * @private * @param {Parallel} parallel Parallel option - * @returns {number} - Available number of cores + * @returns {number} Available number of cores */ private static getAvailableNumberOfCores; /** * @private * @template T * @param {BasicMinimizerImplementation & MinimizeFunctionHelpers} implementation Implementation - * @returns {boolean} - Whether worker threads are supported + * @returns {boolean} Whether worker threads are supported */ private static isSupportsWorkerThreads; /** @@ -58,12 +58,12 @@ declare class CssMinimizerPlugin { * @param {Compilation} compilation Compilation * @param {Record} assets Assets * @param {{availableNumberOfCores: number}} optimizeOptions Optimize options - * @returns {Promise} - Promise + * @returns {Promise} Promise */ private optimize; /** * @param {Compiler} compiler Compiler - * @returns {void} - Void + * @returns {void} Void */ apply(compiler: Compiler): void; } diff --git a/types/minify.d.ts b/types/minify.d.ts index d16e7ac..ec78fc3 100644 --- a/types/minify.d.ts +++ b/types/minify.d.ts @@ -5,13 +5,13 @@ export type InternalResult = import("./index.js").InternalResult; /** * @template T * @param {import("./index.js").InternalOptions} options Options - * @returns {Promise} - Promise with internal result + * @returns {Promise} Promise with internal result */ export function minify( options: import("./index.js").InternalOptions, ): Promise; /** * @param {string} options Options string - * @returns {Promise} - Promise with internal result + * @returns {Promise} Promise with internal result */ export function transform(options: string): Promise; From b14e57f681d2987358849157f705d8e550989620 Mon Sep 17 00:00:00 2001 From: Sachin Kumar Date: Sat, 26 Jul 2025 12:56:52 +0530 Subject: [PATCH 08/10] chore: fix types --- types/index.d.ts | 46 +++++++++++++++++++++++----------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/types/index.d.ts b/types/index.d.ts index a1c376c..f38391d 100644 --- a/types/index.d.ts +++ b/types/index.d.ts @@ -143,59 +143,59 @@ type Warning = | string; type WarningObject = { /** - * - Warning message + * Warning message */ message: string; /** - * - Plugin name + * Plugin name */ plugin?: string | undefined; /** - * - Warning text + * Warning text */ text?: string | undefined; /** - * - Line number + * Line number */ line?: number | undefined; /** - * - Column number + * Column number */ column?: number | undefined; }; type ErrorObject = { /** - * - Error message + * Error message */ message: string; /** - * - Line number + * Line number */ line?: number | undefined; /** - * - Column number + * Column number */ column?: number | undefined; /** - * - Error stack trace + * Error stack trace */ stack?: string | undefined; }; type MinimizedResult = { /** - * - Minimized code + * Minimized code */ code: string; /** - * - Source map + * Source map */ map?: RawSourceMap | undefined; /** - * - Errors + * Errors */ errors?: Array | undefined; /** - * - Warnings + * Warnings */ warnings?: Array | undefined; }; @@ -216,7 +216,7 @@ type BasicMinimizerImplementation = ( ) => Promise | MinimizedResult; type MinimizeFunctionHelpers = { /** - * - Check if worker threads are supported + * Check if worker threads are supported */ supportsWorkerThreads?: (() => boolean | undefined) | undefined; }; @@ -228,19 +228,19 @@ type MinimizerImplementation = T extends any[] : BasicMinimizerImplementation & MinimizeFunctionHelpers; type InternalOptions = { /** - * - Name + * Name */ name: string; /** - * - Input + * Input */ input: string; /** - * - Input source map + * Input source map */ inputSourceMap: RawSourceMap | undefined; /** - * - Minimizer + * Minimizer */ minimizer: { implementation: MinimizerImplementation; @@ -274,23 +274,23 @@ type WarningsFilter = ( ) => boolean; type BasePluginOptions = { /** - * - Test rule + * Test rule */ test?: Rule | undefined; /** - * - Include rule + * Include rule */ include?: Rule | undefined; /** - * - Exclude rule + * Exclude rule */ exclude?: Rule | undefined; /** - * - Warnings filter + * Warnings filter */ warningsFilter?: WarningsFilter | undefined; /** - * - Parallel option + * Parallel option */ parallel?: Parallel | undefined; }; From 1cc4fe81263a90ae89de521b1c32accc80dc0eaf Mon Sep 17 00:00:00 2001 From: Sachin Kumar Date: Sat, 26 Jul 2025 12:59:39 +0530 Subject: [PATCH 09/10] chore: fix audit --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 928bcc0..a94505b 100644 --- a/package.json +++ b/package.json @@ -99,7 +99,7 @@ "eslint-plugin-jsdoc": "^51.4.1", "eslint-plugin-n": "^17.21.0", "eslint-plugin-prettier": "^5.5.3", - "eslint-plugin-unicorn": "^59.0.1", + "eslint-plugin-unicorn": "^60.0.0", "husky": "^9.1.4", "jest": "^30.0.5", "lightningcss": "^1.25.1", From b605635d45c9da49cc8b7680939f65d4c810d63a Mon Sep 17 00:00:00 2001 From: alexander-akait Date: Tue, 29 Jul 2025 17:27:46 +0300 Subject: [PATCH 10/10] chore: update eslint --- package-lock.json | 4132 +++++++++++++---- package.json | 18 +- src/index.js | 2 +- src/utils.js | 3 +- .../CssMinimizerPlugin.test.js.snap | 12 +- test/__snapshots__/minify-option.test.js.snap | 2 +- .../parallel-option.test.js.snap | 8 +- test/helpers/normalizeErrors.js | 6 +- test/parallel-option.test.js | 15 +- types/index.d.ts | 10 +- types/utils.d.ts | 142 +- 11 files changed, 3238 insertions(+), 1112 deletions(-) diff --git a/package-lock.json b/package-lock.json index 81224f5..0fdb9a7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,16 +22,18 @@ "@babel/preset-env": "^7.25.3", "@commitlint/cli": "^19.3.0", "@commitlint/config-conventional": "^19.2.2", + "@eslint/js": "^9.32.0", + "@eslint/markdown": "^7.0.0", "@parcel/css": "^1.8.3", + "@stylistic/eslint-plugin": "^5.2.2", "@swc/css": "^0.0.28", "@types/clean-css": "^4.2.11", "@types/csso": "^5.0.4", "@types/node": "^20.14.9", "@types/serialize-javascript": "^5.0.4", - "@webpack-contrib/eslint-config-webpack": "^3.0.0", "babel-jest": "^30.0.5", "clean-css": "^5.3.3", - "copy-webpack-plugin": "^9.1.0", + "copy-webpack-plugin": "^13.0.0", "cross-env": "^7.0.3", "cspell": "^8.13.1", "css-loader": "^6.10.0", @@ -40,9 +42,16 @@ "del": "^6.1.0", "del-cli": "^5.1.0", "esbuild": "^0.25.0", - "eslint": "^8.56.0", - "eslint-config-prettier": "^9.1.0", - "eslint-plugin-import": "^2.29.1", + "eslint": "^9.30.1", + "eslint-config-prettier": "^10.1.5", + "eslint-config-webpack": "^4.4.1", + "eslint-plugin-import": "^2.32.0", + "eslint-plugin-jest": "^29.0.1", + "eslint-plugin-jsdoc": "^52.0.0", + "eslint-plugin-n": "^17.21.0", + "eslint-plugin-prettier": "^5.5.3", + "eslint-plugin-unicorn": "^60.0.0", + "globals": "^16.3.0", "husky": "^9.1.4", "jest": "^30.0.5", "lightningcss": "^1.25.1", @@ -50,11 +59,11 @@ "memfs": "^4.11.1", "mini-css-extract-plugin": "^2.9.0", "npm-run-all": "^4.1.5", - "prettier": "^3.3.3", + "prettier": "^3.6.2", "sass": "^1.77.8", "sass-loader": "^16.0.5", "standard-version": "^9.5.0", - "sugarss": "^4.0.1", + "sugarss": "^5.0.0", "typescript": "^5.5.4", "webpack": "^5.93.0" }, @@ -104,13 +113,13 @@ } }, "node_modules/@babel/cli": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.27.2.tgz", - "integrity": "sha512-cfd7DnGlhH6OIyuPSSj3vcfIdnbXukhAyKY8NaZrFadC7pXyL9mOL5WgjcptiEJLi5k3j8aYvLIVCzezrWTaiA==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.28.0.tgz", + "integrity": "sha512-CYrZG7FagtE8ReKDBfItxnrEBf2khq2eTMnPuqO8UVN0wzhp1eMX1wfda8b1a32l2aqYLwRRIOGNovm8FVzmMw==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25", + "@jridgewell/trace-mapping": "^0.3.28", "commander": "^6.2.0", "convert-source-map": "^2.0.0", "fs-readdir-recursive": "^1.1.0", @@ -149,9 +158,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.27.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.5.tgz", - "integrity": "sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz", + "integrity": "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==", "dev": true, "license": "MIT", "engines": { @@ -159,22 +168,22 @@ } }, "node_modules/@babel/core": { - "version": "7.27.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.4.tgz", - "integrity": "sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.0.tgz", + "integrity": "sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.27.3", + "@babel/generator": "^7.28.0", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.27.3", - "@babel/helpers": "^7.27.4", - "@babel/parser": "^7.27.4", + "@babel/helpers": "^7.27.6", + "@babel/parser": "^7.28.0", "@babel/template": "^7.27.2", - "@babel/traverse": "^7.27.4", - "@babel/types": "^7.27.3", + "@babel/traverse": "^7.28.0", + "@babel/types": "^7.28.0", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -190,16 +199,16 @@ } }, "node_modules/@babel/generator": { - "version": "7.27.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.5.tgz", - "integrity": "sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.0.tgz", + "integrity": "sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.27.5", - "@babel/types": "^7.27.3", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", + "@babel/parser": "^7.28.0", + "@babel/types": "^7.28.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" }, "engines": { @@ -277,22 +286,32 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.4.tgz", - "integrity": "sha512-jljfR1rGnXXNWnmQg2K3+bvhkxB51Rl32QRaOTuwwjviGrHzIbSc8+x9CpraDtbT7mfyjXObULP4w/adunNwAw==", + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.5.tgz", + "integrity": "sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "debug": "^4.4.1", "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" + "resolve": "^1.22.10" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-member-expression-to-functions": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", @@ -458,27 +477,27 @@ } }, "node_modules/@babel/helpers": { - "version": "7.27.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.6.tgz", - "integrity": "sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==", + "version": "7.28.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.2.tgz", + "integrity": "sha512-/V9771t+EgXz62aCcyofnQhGM8DQACbRhvzKFsXKC9QM+5MadF8ZmIm0crDMaz3+o0h0zXfJnd4EhbYbxsrcFw==", "dev": true, "license": "MIT", "dependencies": { "@babel/template": "^7.27.2", - "@babel/types": "^7.27.6" + "@babel/types": "^7.28.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.27.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.5.tgz", - "integrity": "sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.0.tgz", + "integrity": "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.27.3" + "@babel/types": "^7.28.0" }, "bin": { "parser": "bin/babel-parser.js" @@ -873,15 +892,15 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.27.1.tgz", - "integrity": "sha512-eST9RrwlpaoJBDHShc+DS2SG4ATTi2MYNb4OxYkf3n+7eb49LWpnS+HSpVfW4x927qQwgk8A2hGNVaajAEw0EA==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.0.tgz", + "integrity": "sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-remap-async-to-generator": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@babel/traverse": "^7.28.0" }, "engines": { "node": ">=6.9.0" @@ -925,9 +944,9 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.27.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.27.5.tgz", - "integrity": "sha512-JF6uE2s67f0y2RZcm2kpAUEbD50vH62TyWVebxwHAlbSdM49VqPz8t4a1uIjp4NIOIZ4xzLfjY5emt/RCyC7TQ==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.0.tgz", + "integrity": "sha512-gKKnwjpdx5sER/wl0WN0efUBFzF/56YZO0RJrSYP4CljXnP31ByY7fol89AzomdlLNzI36AvOTmYHsnZTCkq8Q==", "dev": true, "license": "MIT", "dependencies": { @@ -975,18 +994,18 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.27.1.tgz", - "integrity": "sha512-7iLhfFAubmpeJe/Wo2TVuDrykh/zlWXLzPNdL0Jqn/Xu8R3QQ8h9ff8FQoISZOsw74/HFqFI7NX63HN7QFIHKA==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.0.tgz", + "integrity": "sha512-IjM1IoJNw72AZFlj33Cu8X0q2XK/6AaVC3jQu+cgQ5lThWD5ajnuUAml80dqRmOhmPkTH8uAwnpMu9Rvj0LTRA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-globals": "^7.28.0", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-replace-supers": "^7.27.1", - "@babel/traverse": "^7.27.1", - "globals": "^11.1.0" + "@babel/traverse": "^7.28.0" }, "engines": { "node": ">=6.9.0" @@ -1013,13 +1032,14 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.27.3.tgz", - "integrity": "sha512-s4Jrok82JpiaIprtY2nHsYmrThKvvwgHwjgd7UMiYhZaN0asdXNLr0y+NjTfkA7SyQE5i2Fb7eawUOZmLvyqOA==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.0.tgz", + "integrity": "sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.0" }, "engines": { "node": ">=6.9.0" @@ -1094,6 +1114,23 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-explicit-resource-management": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.0.tgz", + "integrity": "sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-transform-exponentiation-operator": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.27.1.tgz", @@ -1361,16 +1398,17 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.27.3.tgz", - "integrity": "sha512-7ZZtznF9g4l2JCImCo5LNKFHB5eXnN39lLtLY5Tg+VkR0jwOt7TBciMckuiQIOIW7L5tkQOCh3bVGYeXgMx52Q==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.0.tgz", + "integrity": "sha512-9VNGikXxzu5eCiQjdE4IZn8sb9q7Xsk5EXLDBKUYg1e/Tve8/05+KJEtcxGxAgCY5t/BpKQM+JEL/yT4tvgiUA==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-plugin-utils": "^7.27.1", - "@babel/plugin-transform-destructuring": "^7.27.3", - "@babel/plugin-transform-parameters": "^7.27.1" + "@babel/plugin-transform-destructuring": "^7.28.0", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/traverse": "^7.28.0" }, "engines": { "node": ">=6.9.0" @@ -1430,9 +1468,9 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.1.tgz", - "integrity": "sha512-018KRk76HWKeZ5l4oTj2zPpSh+NbGdt0st5S6x0pga6HgrjBOJb24mMDHorFopOOd6YHkLgOZ+zaCjZGPO4aKg==", + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz", + "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==", "dev": true, "license": "MIT", "dependencies": { @@ -1497,9 +1535,9 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.27.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.27.5.tgz", - "integrity": "sha512-uhB8yHerfe3MWnuLAhEbeQ4afVoqv8BQsPqrTv7e/jZ9y00kJL6l9a/f4OWaKxotmjzewfEyXE1vgDJenkQ2/Q==", + "version": "7.28.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.1.tgz", + "integrity": "sha512-P0QiV/taaa3kXpLY+sXla5zec4E+4t4Aqc9ggHlfZ7a2cp8/x/Gv08jfwEtn9gnnYIMvHx6aoOZ8XJL8eU71Dg==", "dev": true, "license": "MIT", "dependencies": { @@ -1694,13 +1732,13 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.27.2.tgz", - "integrity": "sha512-Ma4zSuYSlGNRlCLO+EAzLnCmJK2vdstgv+n7aUP+/IKZrOfWHOJVdSJtuub8RzHTj3ahD37k5OKJWvzf16TQyQ==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.0.tgz", + "integrity": "sha512-VmaxeGOwuDqzLl5JUkIRM1X2Qu2uKGxHEQWh+cvvbl7JuJRgKGJSfsEF/bUaxFhJl/XAyxBe7q7qSuTbKFuCyg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.27.2", + "@babel/compat-data": "^7.28.0", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-validator-option": "^7.27.1", @@ -1714,19 +1752,20 @@ "@babel/plugin-syntax-import-attributes": "^7.27.1", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.27.1", - "@babel/plugin-transform-async-generator-functions": "^7.27.1", + "@babel/plugin-transform-async-generator-functions": "^7.28.0", "@babel/plugin-transform-async-to-generator": "^7.27.1", "@babel/plugin-transform-block-scoped-functions": "^7.27.1", - "@babel/plugin-transform-block-scoping": "^7.27.1", + "@babel/plugin-transform-block-scoping": "^7.28.0", "@babel/plugin-transform-class-properties": "^7.27.1", "@babel/plugin-transform-class-static-block": "^7.27.1", - "@babel/plugin-transform-classes": "^7.27.1", + "@babel/plugin-transform-classes": "^7.28.0", "@babel/plugin-transform-computed-properties": "^7.27.1", - "@babel/plugin-transform-destructuring": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0", "@babel/plugin-transform-dotall-regex": "^7.27.1", "@babel/plugin-transform-duplicate-keys": "^7.27.1", "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", "@babel/plugin-transform-dynamic-import": "^7.27.1", + "@babel/plugin-transform-explicit-resource-management": "^7.28.0", "@babel/plugin-transform-exponentiation-operator": "^7.27.1", "@babel/plugin-transform-export-namespace-from": "^7.27.1", "@babel/plugin-transform-for-of": "^7.27.1", @@ -1743,15 +1782,15 @@ "@babel/plugin-transform-new-target": "^7.27.1", "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", "@babel/plugin-transform-numeric-separator": "^7.27.1", - "@babel/plugin-transform-object-rest-spread": "^7.27.2", + "@babel/plugin-transform-object-rest-spread": "^7.28.0", "@babel/plugin-transform-object-super": "^7.27.1", "@babel/plugin-transform-optional-catch-binding": "^7.27.1", "@babel/plugin-transform-optional-chaining": "^7.27.1", - "@babel/plugin-transform-parameters": "^7.27.1", + "@babel/plugin-transform-parameters": "^7.27.7", "@babel/plugin-transform-private-methods": "^7.27.1", "@babel/plugin-transform-private-property-in-object": "^7.27.1", "@babel/plugin-transform-property-literals": "^7.27.1", - "@babel/plugin-transform-regenerator": "^7.27.1", + "@babel/plugin-transform-regenerator": "^7.28.0", "@babel/plugin-transform-regexp-modifiers": "^7.27.1", "@babel/plugin-transform-reserved-words": "^7.27.1", "@babel/plugin-transform-shorthand-properties": "^7.27.1", @@ -1764,10 +1803,10 @@ "@babel/plugin-transform-unicode-regex": "^7.27.1", "@babel/plugin-transform-unicode-sets-regex": "^7.27.1", "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.11.0", - "babel-plugin-polyfill-regenerator": "^0.6.1", - "core-js-compat": "^3.40.0", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", + "core-js-compat": "^3.43.0", "semver": "^6.3.1" }, "engines": { @@ -1808,28 +1847,28 @@ } }, "node_modules/@babel/traverse": { - "version": "7.27.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.4.tgz", - "integrity": "sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.0.tgz", + "integrity": "sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.27.3", - "@babel/parser": "^7.27.4", + "@babel/generator": "^7.28.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.0", "@babel/template": "^7.27.2", - "@babel/types": "^7.27.3", - "debug": "^4.3.1", - "globals": "^11.1.0" + "@babel/types": "^7.28.0", + "debug": "^4.3.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/types": { - "version": "7.27.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.6.tgz", - "integrity": "sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==", + "version": "7.28.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz", + "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2244,124 +2283,124 @@ } }, "node_modules/@cspell/dict-ada": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-ada/-/dict-ada-4.1.0.tgz", - "integrity": "sha512-7SvmhmX170gyPd+uHXrfmqJBY5qLcCX8kTGURPVeGxmt8XNXT75uu9rnZO+jwrfuU2EimNoArdVy5GZRGljGNg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-ada/-/dict-ada-4.1.1.tgz", + "integrity": "sha512-E+0YW9RhZod/9Qy2gxfNZiHJjCYFlCdI69br1eviQQWB8yOTJX0JHXLs79kOYhSW0kINPVUdvddEBe6Lu6CjGQ==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-al": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-al/-/dict-al-1.1.0.tgz", - "integrity": "sha512-PtNI1KLmYkELYltbzuoztBxfi11jcE9HXBHCpID2lou/J4VMYKJPNqe4ZjVzSI9NYbMnMnyG3gkbhIdx66VSXg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-al/-/dict-al-1.1.1.tgz", + "integrity": "sha512-sD8GCaZetgQL4+MaJLXqbzWcRjfKVp8x+px3HuCaaiATAAtvjwUQ5/Iubiqwfd1boIh2Y1/3EgM3TLQ7Q8e0wQ==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-aws": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/@cspell/dict-aws/-/dict-aws-4.0.10.tgz", - "integrity": "sha512-0qW4sI0GX8haELdhfakQNuw7a2pnWXz3VYQA2MpydH2xT2e6EN9DWFpKAi8DfcChm8MgDAogKkoHtIo075iYng==", + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@cspell/dict-aws/-/dict-aws-4.0.14.tgz", + "integrity": "sha512-qLPR+OFmpzyUcuUYyCQFIURDDUGIlQsdGirPyvaIrXxs2giCKG97cAuFz5EleL3/Lo7uJAVDw0lt4Ka7wIRhjQ==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-bash": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-bash/-/dict-bash-4.2.0.tgz", - "integrity": "sha512-HOyOS+4AbCArZHs/wMxX/apRkjxg6NDWdt0jF9i9XkvJQUltMwEhyA2TWYjQ0kssBsnof+9amax2lhiZnh3kCg==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-bash/-/dict-bash-4.2.1.tgz", + "integrity": "sha512-SBnzfAyEAZLI9KFS7DUG6Xc1vDFuLllY3jz0WHvmxe8/4xV3ufFE3fGxalTikc1VVeZgZmxYiABw4iGxVldYEg==", "dev": true, "license": "MIT", "dependencies": { - "@cspell/dict-shell": "1.1.0" + "@cspell/dict-shell": "1.1.1" } }, "node_modules/@cspell/dict-companies": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-companies/-/dict-companies-3.2.1.tgz", - "integrity": "sha512-ryaeJ1KhTTKL4mtinMtKn8wxk6/tqD4vX5tFP+Hg89SiIXmbMk5vZZwVf+eyGUWJOyw5A1CVj9EIWecgoi+jYQ==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/@cspell/dict-companies/-/dict-companies-3.2.3.tgz", + "integrity": "sha512-7ekwamRYeS7G3I3LEKM3t0WIyAytCbsx2I2h2z2eEvF+b3TmtJVcV7UI7BScLue3bep4sPB/b4CV3BUv3QfyzQ==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-cpp": { - "version": "6.0.8", - "resolved": "https://registry.npmjs.org/@cspell/dict-cpp/-/dict-cpp-6.0.8.tgz", - "integrity": "sha512-BzurRZilWqaJt32Gif6/yCCPi+FtrchjmnehVEIFzbWyeBd/VOUw77IwrEzehZsu5cRU91yPWuWp5fUsKfDAXA==", + "version": "6.0.9", + "resolved": "https://registry.npmjs.org/@cspell/dict-cpp/-/dict-cpp-6.0.9.tgz", + "integrity": "sha512-Xdq9MwGh0D5rsnbOqFW24NIClXXRhN11KJdySMibpcqYGeomxB2ODFBuhj1H7azO7kVGkGH0Okm4yQ2TRzBx0g==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-cryptocurrencies": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@cspell/dict-cryptocurrencies/-/dict-cryptocurrencies-5.0.4.tgz", - "integrity": "sha512-6iFu7Abu+4Mgqq08YhTKHfH59mpMpGTwdzDB2Y8bbgiwnGFCeoiSkVkgLn1Kel2++hYcZ8vsAW/MJS9oXxuMag==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@cspell/dict-cryptocurrencies/-/dict-cryptocurrencies-5.0.5.tgz", + "integrity": "sha512-R68hYYF/rtlE6T/dsObStzN5QZw+0aQBinAXuWCVqwdS7YZo0X33vGMfChkHaiCo3Z2+bkegqHlqxZF4TD3rUA==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-csharp": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@cspell/dict-csharp/-/dict-csharp-4.0.6.tgz", - "integrity": "sha512-w/+YsqOknjQXmIlWDRmkW+BHBPJZ/XDrfJhZRQnp0wzpPOGml7W0q1iae65P2AFRtTdPKYmvSz7AL5ZRkCnSIw==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@cspell/dict-csharp/-/dict-csharp-4.0.7.tgz", + "integrity": "sha512-H16Hpu8O/1/lgijFt2lOk4/nnldFtQ4t8QHbyqphqZZVE5aS4J/zD/WvduqnLY21aKhZS6jo/xF5PX9jyqPKUA==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-css": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@cspell/dict-css/-/dict-css-4.0.17.tgz", - "integrity": "sha512-2EisRLHk6X/PdicybwlajLGKF5aJf4xnX2uuG5lexuYKt05xV/J/OiBADmi8q9obhxf1nesrMQbqAt+6CsHo/w==", + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@cspell/dict-css/-/dict-css-4.0.18.tgz", + "integrity": "sha512-EF77RqROHL+4LhMGW5NTeKqfUd/e4OOv6EDFQ/UQQiFyWuqkEKyEz0NDILxOFxWUEVdjT2GQ2cC7t12B6pESwg==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-dart": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-dart/-/dict-dart-2.3.0.tgz", - "integrity": "sha512-1aY90lAicek8vYczGPDKr70pQSTQHwMFLbmWKTAI6iavmb1fisJBS1oTmMOKE4ximDf86MvVN6Ucwx3u/8HqLg==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-dart/-/dict-dart-2.3.1.tgz", + "integrity": "sha512-xoiGnULEcWdodXI6EwVyqpZmpOoh8RA2Xk9BNdR7DLamV/QMvEYn8KJ7NlRiTSauJKPNkHHQ5EVHRM6sTS7jdg==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-data-science": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@cspell/dict-data-science/-/dict-data-science-2.0.8.tgz", - "integrity": "sha512-uyAtT+32PfM29wRBeAkUSbkytqI8bNszNfAz2sGPtZBRmsZTYugKMEO9eDjAIE/pnT9CmbjNuoiXhk+Ss4fCOg==", + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@cspell/dict-data-science/-/dict-data-science-2.0.9.tgz", + "integrity": "sha512-wTOFMlxv06veIwKdXUwdGxrQcK44Zqs426m6JGgHIB/GqvieZQC5n0UI+tUm5OCxuNyo4OV6mylT4cRMjtKtWQ==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-django": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@cspell/dict-django/-/dict-django-4.1.4.tgz", - "integrity": "sha512-fX38eUoPvytZ/2GA+g4bbdUtCMGNFSLbdJJPKX2vbewIQGfgSFJKY56vvcHJKAvw7FopjvgyS/98Ta9WN1gckg==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@cspell/dict-django/-/dict-django-4.1.5.tgz", + "integrity": "sha512-AvTWu99doU3T8ifoMYOMLW2CXKvyKLukPh1auOPwFGHzueWYvBBN+OxF8wF7XwjTBMMeRleVdLh3aWCDEX/ZWg==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-docker": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/@cspell/dict-docker/-/dict-docker-1.1.14.tgz", - "integrity": "sha512-p6Qz5mokvcosTpDlgSUREdSbZ10mBL3ndgCdEKMqjCSZJFdfxRdNdjrGER3lQ6LMq5jGr1r7nGXA0gvUJK80nw==", + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/@cspell/dict-docker/-/dict-docker-1.1.16.tgz", + "integrity": "sha512-UiVQ5RmCg6j0qGIxrBnai3pIB+aYKL3zaJGvXk1O/ertTKJif9RZikKXCEgqhaCYMweM4fuLqWSVmw3hU164Iw==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-dotnet": { - "version": "5.0.9", - "resolved": "https://registry.npmjs.org/@cspell/dict-dotnet/-/dict-dotnet-5.0.9.tgz", - "integrity": "sha512-JGD6RJW5sHtO5lfiJl11a5DpPN6eKSz5M1YBa1I76j4dDOIqgZB6rQexlDlK1DH9B06X4GdDQwdBfnpAB0r2uQ==", + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/@cspell/dict-dotnet/-/dict-dotnet-5.0.10.tgz", + "integrity": "sha512-ooar8BP/RBNP1gzYfJPStKEmpWy4uv/7JCq6FOnJLeD1yyfG3d/LFMVMwiJo+XWz025cxtkM3wuaikBWzCqkmg==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-elixir": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@cspell/dict-elixir/-/dict-elixir-4.0.7.tgz", - "integrity": "sha512-MAUqlMw73mgtSdxvbAvyRlvc3bYnrDqXQrx5K9SwW8F7fRYf9V4vWYFULh+UWwwkqkhX9w03ZqFYRTdkFku6uA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@cspell/dict-elixir/-/dict-elixir-4.0.8.tgz", + "integrity": "sha512-CyfphrbMyl4Ms55Vzuj+mNmd693HjBFr9hvU+B2YbFEZprE5AG+EXLYTMRWrXbpds4AuZcvN3deM2XVB80BN/Q==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-en_us": { - "version": "4.4.11", - "resolved": "https://registry.npmjs.org/@cspell/dict-en_us/-/dict-en_us-4.4.11.tgz", - "integrity": "sha512-ls3ASwIL0uuAEXsxB7NsIe6GRBQ+NZfqI5k1qtNgOZ1eh1MFYjCiF+YcqArH5SFHNzOwCHRKzlLeX0ZFIok7GQ==", + "version": "4.4.16", + "resolved": "https://registry.npmjs.org/@cspell/dict-en_us/-/dict-en_us-4.4.16.tgz", + "integrity": "sha512-/R47sUbUmba2dG/0LZyE6P6gX/DRF1sCcYNQNWyPk/KeidQRNZG+FH9U0KRvX42/2ZzMge6ebXH3WAJ52w0Vqw==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-en-common-misspellings": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-en-common-misspellings/-/dict-en-common-misspellings-2.1.0.tgz", - "integrity": "sha512-81NUjPIH+nvNIHCRbbMVSqPPLQUqidF/l8JdlY4OFO0W253yDIk1zaZJpJ8crwYRhOLBVBnUUfm7KYx9F2V7Zg==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@cspell/dict-en-common-misspellings/-/dict-en-common-misspellings-2.1.3.tgz", + "integrity": "sha512-v1I97Hr1OrK+mwHsVzbY4vsPxx6mA5quhxzanF6XuRofz00wH4HPz8Q3llzRHxka5Wl/59gyan04UkUrvP4gdA==", "dev": true, "license": "CC BY-SA 4.0" }, @@ -2373,291 +2412,291 @@ "license": "MIT" }, "node_modules/@cspell/dict-filetypes": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/@cspell/dict-filetypes/-/dict-filetypes-3.0.12.tgz", - "integrity": "sha512-+ds5wgNdlUxuJvhg8A1TjuSpalDFGCh7SkANCWvIplg6QZPXL4j83lqxP7PgjHpx7PsBUS7vw0aiHPjZy9BItw==", + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/@cspell/dict-filetypes/-/dict-filetypes-3.0.13.tgz", + "integrity": "sha512-g6rnytIpQlMNKGJT1JKzWkC+b3xCliDKpQ3ANFSq++MnR4GaLiifaC4JkVON11Oh/UTplYOR1nY3BR4X30bswA==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-flutter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-flutter/-/dict-flutter-1.1.0.tgz", - "integrity": "sha512-3zDeS7zc2p8tr9YH9tfbOEYfopKY/srNsAa+kE3rfBTtQERAZeOhe5yxrnTPoufctXLyuUtcGMUTpxr3dO0iaA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-flutter/-/dict-flutter-1.1.1.tgz", + "integrity": "sha512-UlOzRcH2tNbFhZmHJN48Za/2/MEdRHl2BMkCWZBYs+30b91mWvBfzaN4IJQU7dUZtowKayVIF9FzvLZtZokc5A==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-fonts": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@cspell/dict-fonts/-/dict-fonts-4.0.4.tgz", - "integrity": "sha512-cHFho4hjojBcHl6qxidl9CvUb492IuSk7xIf2G2wJzcHwGaCFa2o3gRcxmIg1j62guetAeDDFELizDaJlVRIOg==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@cspell/dict-fonts/-/dict-fonts-4.0.5.tgz", + "integrity": "sha512-BbpkX10DUX/xzHs6lb7yzDf/LPjwYIBJHJlUXSBXDtK/1HaeS+Wqol4Mlm2+NAgZ7ikIE5DQMViTgBUY3ezNoQ==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-fsharp": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-fsharp/-/dict-fsharp-1.1.0.tgz", - "integrity": "sha512-oguWmHhGzgbgbEIBKtgKPrFSVAFtvGHaQS0oj+vacZqMObwkapcTGu7iwf4V3Bc2T3caf0QE6f6rQfIJFIAVsw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-fsharp/-/dict-fsharp-1.1.1.tgz", + "integrity": "sha512-imhs0u87wEA4/cYjgzS0tAyaJpwG7vwtC8UyMFbwpmtw+/bgss+osNfyqhYRyS/ehVCWL17Ewx2UPkexjKyaBA==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-fullstack": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/@cspell/dict-fullstack/-/dict-fullstack-3.2.6.tgz", - "integrity": "sha512-cSaq9rz5RIU9j+0jcF2vnKPTQjxGXclntmoNp4XB7yFX2621PxJcekGjwf/lN5heJwVxGLL9toR0CBlGKwQBgA==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/@cspell/dict-fullstack/-/dict-fullstack-3.2.7.tgz", + "integrity": "sha512-IxEk2YAwAJKYCUEgEeOg3QvTL4XLlyArJElFuMQevU1dPgHgzWElFevN5lsTFnvMFA1riYsVinqJJX0BanCFEg==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-gaming-terms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-gaming-terms/-/dict-gaming-terms-1.1.1.tgz", - "integrity": "sha512-tb8GFxjTLDQstkJcJ90lDqF4rKKlMUKs5/ewePN9P+PYRSehqDpLI5S5meOfPit8LGszeOrjUdBQ4zXo7NpMyQ==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-gaming-terms/-/dict-gaming-terms-1.1.2.tgz", + "integrity": "sha512-9XnOvaoTBscq0xuD6KTEIkk9hhdfBkkvJAIsvw3JMcnp1214OCGW8+kako5RqQ2vTZR3Tnf3pc57o7VgkM0q1Q==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-git": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@cspell/dict-git/-/dict-git-3.0.6.tgz", - "integrity": "sha512-nazfOqyxlBOQGgcur9ssEOEQCEZkH8vXfQe8SDEx8sCN/g0SFm8ktabgLVmBOXjy3RzjVNLlM2nBfRQ7e6+5hQ==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@cspell/dict-git/-/dict-git-3.0.7.tgz", + "integrity": "sha512-odOwVKgfxCQfiSb+nblQZc4ErXmnWEnv8XwkaI4sNJ7cNmojnvogYVeMqkXPjvfrgEcizEEA4URRD2Ms5PDk1w==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-golang": { - "version": "6.0.22", - "resolved": "https://registry.npmjs.org/@cspell/dict-golang/-/dict-golang-6.0.22.tgz", - "integrity": "sha512-FvV0m3Y0nUFxw36uDCD8UtfOPv4wsZnnlabNwB3xNZ2IBn0gBURuMUZywScb9sd2wXM8VFBRoU//tc6NQsOVOg==", + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/@cspell/dict-golang/-/dict-golang-6.0.23.tgz", + "integrity": "sha512-oXqUh/9dDwcmVlfUF5bn3fYFqbUzC46lXFQmi5emB0vYsyQXdNWsqi6/yH3uE7bdRE21nP7Yo0mR1jjFNyLamg==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-google": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@cspell/dict-google/-/dict-google-1.0.8.tgz", - "integrity": "sha512-BnMHgcEeaLyloPmBs8phCqprI+4r2Jb8rni011A8hE+7FNk7FmLE3kiwxLFrcZnnb7eqM0agW4zUaNoB0P+z8A==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@cspell/dict-google/-/dict-google-1.0.9.tgz", + "integrity": "sha512-biL65POqialY0i4g6crj7pR6JnBkbsPovB2WDYkj3H4TuC/QXv7Pu5pdPxeUJA6TSCHI7T5twsO4VSVyRxD9CA==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-haskell": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@cspell/dict-haskell/-/dict-haskell-4.0.5.tgz", - "integrity": "sha512-s4BG/4tlj2pPM9Ha7IZYMhUujXDnI0Eq1+38UTTCpatYLbQqDwRFf2KNPLRqkroU+a44yTUAe0rkkKbwy4yRtQ==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@cspell/dict-haskell/-/dict-haskell-4.0.6.tgz", + "integrity": "sha512-ib8SA5qgftExpYNjWhpYIgvDsZ/0wvKKxSP+kuSkkak520iPvTJumEpIE+qPcmJQo4NzdKMN8nEfaeci4OcFAQ==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-html": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/@cspell/dict-html/-/dict-html-4.0.11.tgz", - "integrity": "sha512-QR3b/PB972SRQ2xICR1Nw/M44IJ6rjypwzA4jn+GH8ydjAX9acFNfc+hLZVyNe0FqsE90Gw3evLCOIF0vy1vQw==", + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/@cspell/dict-html/-/dict-html-4.0.12.tgz", + "integrity": "sha512-JFffQ1dDVEyJq6tCDWv0r/RqkdSnV43P2F/3jJ9rwLgdsOIXwQbXrz6QDlvQLVvNSnORH9KjDtenFTGDyzfCaA==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-html-symbol-entities": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@cspell/dict-html-symbol-entities/-/dict-html-symbol-entities-4.0.3.tgz", - "integrity": "sha512-aABXX7dMLNFdSE8aY844X4+hvfK7977sOWgZXo4MTGAmOzR8524fjbJPswIBK7GaD3+SgFZ2yP2o0CFvXDGF+A==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@cspell/dict-html-symbol-entities/-/dict-html-symbol-entities-4.0.4.tgz", + "integrity": "sha512-afea+0rGPDeOV9gdO06UW183Qg6wRhWVkgCFwiO3bDupAoyXRuvupbb5nUyqSTsLXIKL8u8uXQlJ9pkz07oVXw==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-java": { - "version": "5.0.11", - "resolved": "https://registry.npmjs.org/@cspell/dict-java/-/dict-java-5.0.11.tgz", - "integrity": "sha512-T4t/1JqeH33Raa/QK/eQe26FE17eUCtWu+JsYcTLkQTci2dk1DfcIKo8YVHvZXBnuM43ATns9Xs0s+AlqDeH7w==", + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/@cspell/dict-java/-/dict-java-5.0.12.tgz", + "integrity": "sha512-qPSNhTcl7LGJ5Qp6VN71H8zqvRQK04S08T67knMq9hTA8U7G1sTKzLmBaDOFhq17vNX/+rT+rbRYp+B5Nwza1A==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-julia": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-julia/-/dict-julia-1.1.0.tgz", - "integrity": "sha512-CPUiesiXwy3HRoBR3joUseTZ9giFPCydSKu2rkh6I2nVjXnl5vFHzOMLXpbF4HQ1tH2CNfnDbUndxD+I+7eL9w==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-julia/-/dict-julia-1.1.1.tgz", + "integrity": "sha512-WylJR9TQ2cgwd5BWEOfdO3zvDB+L7kYFm0I9u0s9jKHWQ6yKmfKeMjU9oXxTBxIufhCXm92SKwwVNAC7gjv+yA==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-k8s": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@cspell/dict-k8s/-/dict-k8s-1.0.11.tgz", - "integrity": "sha512-8ojNwB5j4PfZ1Gq9n5c/HKJCtZD3h6+wFy+zpALpDWFFQ2qT22Be30+3PVd+G5gng8or0LeK8VgKKd0l1uKPTA==", + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/@cspell/dict-k8s/-/dict-k8s-1.0.12.tgz", + "integrity": "sha512-2LcllTWgaTfYC7DmkMPOn9GsBWsA4DZdlun4po8s2ysTP7CPEnZc1ZfK6pZ2eI4TsZemlUQQ+NZxMe9/QutQxg==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-kotlin": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-kotlin/-/dict-kotlin-1.1.0.tgz", - "integrity": "sha512-vySaVw6atY7LdwvstQowSbdxjXG6jDhjkWVWSjg1XsUckyzH1JRHXe9VahZz1i7dpoFEUOWQrhIe5B9482UyJQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-kotlin/-/dict-kotlin-1.1.1.tgz", + "integrity": "sha512-J3NzzfgmxRvEeOe3qUXnSJQCd38i/dpF9/t3quuWh6gXM+krsAXP75dY1CzDmS8mrJAlBdVBeAW5eAZTD8g86Q==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-latex": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@cspell/dict-latex/-/dict-latex-4.0.3.tgz", - "integrity": "sha512-2KXBt9fSpymYHxHfvhUpjUFyzrmN4c4P8mwIzweLyvqntBT3k0YGZJSriOdjfUjwSygrfEwiuPI1EMrvgrOMJw==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@cspell/dict-latex/-/dict-latex-4.0.4.tgz", + "integrity": "sha512-YdTQhnTINEEm/LZgTzr9Voz4mzdOXH7YX+bSFs3hnkUHCUUtX/mhKgf1CFvZ0YNM2afjhQcmLaR9bDQVyYBvpA==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-lorem-ipsum": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@cspell/dict-lorem-ipsum/-/dict-lorem-ipsum-4.0.4.tgz", - "integrity": "sha512-+4f7vtY4dp2b9N5fn0za/UR0kwFq2zDtA62JCbWHbpjvO9wukkbl4rZg4YudHbBgkl73HRnXFgCiwNhdIA1JPw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@cspell/dict-lorem-ipsum/-/dict-lorem-ipsum-4.0.5.tgz", + "integrity": "sha512-9a4TJYRcPWPBKkQAJ/whCu4uCAEgv/O2xAaZEI0n4y1/l18Yyx8pBKoIX5QuVXjjmKEkK7hi5SxyIsH7pFEK9Q==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-lua": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@cspell/dict-lua/-/dict-lua-4.0.7.tgz", - "integrity": "sha512-Wbr7YSQw+cLHhTYTKV6cAljgMgcY+EUAxVIZW3ljKswEe4OLxnVJ7lPqZF5JKjlXdgCjbPSimsHqyAbC5pQN/Q==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@cspell/dict-lua/-/dict-lua-4.0.8.tgz", + "integrity": "sha512-N4PkgNDMu9JVsRu7JBS/3E/dvfItRgk9w5ga2dKq+JupP2Y3lojNaAVFhXISh4Y0a6qXDn2clA6nvnavQ/jjLA==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-makefile": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@cspell/dict-makefile/-/dict-makefile-1.0.4.tgz", - "integrity": "sha512-E4hG/c0ekPqUBvlkrVvzSoAA+SsDA9bLi4xSV3AXHTVru7Y2bVVGMPtpfF+fI3zTkww/jwinprcU1LSohI3ylw==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@cspell/dict-makefile/-/dict-makefile-1.0.5.tgz", + "integrity": "sha512-4vrVt7bGiK8Rx98tfRbYo42Xo2IstJkAF4tLLDMNQLkQ86msDlYSKG1ZCk8Abg+EdNcFAjNhXIiNO+w4KflGAQ==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-markdown": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@cspell/dict-markdown/-/dict-markdown-2.0.11.tgz", - "integrity": "sha512-stZieFKJyMQbzKTVoalSx2QqCpB0j8nPJF/5x+sBnDIWgMC65jp8Wil+jccWh9/vnUVukP3Ejewven5NC7SWuQ==", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@cspell/dict-markdown/-/dict-markdown-2.0.12.tgz", + "integrity": "sha512-ufwoliPijAgWkD/ivAMC+A9QD895xKiJRF/fwwknQb7kt7NozTLKFAOBtXGPJAB4UjhGBpYEJVo2elQ0FCAH9A==", "dev": true, "license": "MIT", "peerDependencies": { - "@cspell/dict-css": "^4.0.17", - "@cspell/dict-html": "^4.0.11", - "@cspell/dict-html-symbol-entities": "^4.0.3", - "@cspell/dict-typescript": "^3.2.2" + "@cspell/dict-css": "^4.0.18", + "@cspell/dict-html": "^4.0.12", + "@cspell/dict-html-symbol-entities": "^4.0.4", + "@cspell/dict-typescript": "^3.2.3" } }, "node_modules/@cspell/dict-monkeyc": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/@cspell/dict-monkeyc/-/dict-monkeyc-1.0.10.tgz", - "integrity": "sha512-7RTGyKsTIIVqzbvOtAu6Z/lwwxjGRtY5RkKPlXKHEoEAgIXwfDxb5EkVwzGQwQr8hF/D3HrdYbRT8MFBfsueZw==", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@cspell/dict-monkeyc/-/dict-monkeyc-1.0.11.tgz", + "integrity": "sha512-7Q1Ncu0urALI6dPTrEbSTd//UK0qjRBeaxhnm8uY5fgYNFYAG+u4gtnTIo59S6Bw5P++4H3DiIDYoQdY/lha8w==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-node": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/@cspell/dict-node/-/dict-node-5.0.7.tgz", - "integrity": "sha512-ZaPpBsHGQCqUyFPKLyCNUH2qzolDRm1/901IO8e7btk7bEDF56DN82VD43gPvD4HWz3yLs/WkcLa01KYAJpnOw==", + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/@cspell/dict-node/-/dict-node-5.0.8.tgz", + "integrity": "sha512-AirZcN2i84ynev3p2/1NCPEhnNsHKMz9zciTngGoqpdItUb2bDt1nJBjwlsrFI78GZRph/VaqTVFwYikmncpXg==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-npm": { - "version": "5.2.6", - "resolved": "https://registry.npmjs.org/@cspell/dict-npm/-/dict-npm-5.2.6.tgz", - "integrity": "sha512-VGEY1ZjE8c8JCA+dic1IdYmVTNfVtWAw7V2n4TXO1+mKfRL+BsPsqEoH8iR0OMutC9QXjVNh32rzMh4D3E+Lxw==", + "version": "5.2.13", + "resolved": "https://registry.npmjs.org/@cspell/dict-npm/-/dict-npm-5.2.13.tgz", + "integrity": "sha512-yE7DfpiQjDFW6TLr5/fsSj4BlUy1A8lsuz2LQQHv4lQAAkZ4RsePYFL9DkRRfEtxn8CZYetUnU74/jQbfsnyrA==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-php": { - "version": "4.0.14", - "resolved": "https://registry.npmjs.org/@cspell/dict-php/-/dict-php-4.0.14.tgz", - "integrity": "sha512-7zur8pyncYZglxNmqsRycOZ6inpDoVd4yFfz1pQRe5xaRWMiK3Km4n0/X/1YMWhh3e3Sl/fQg5Axb2hlN68t1g==", + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/@cspell/dict-php/-/dict-php-4.0.15.tgz", + "integrity": "sha512-iepGB2gtToMWSTvybesn4/lUp4LwXcEm0s8vasJLP76WWVkq1zYjmeS+WAIzNgsuURyZ/9mGqhS0CWMuo74ODw==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-powershell": { - "version": "5.0.14", - "resolved": "https://registry.npmjs.org/@cspell/dict-powershell/-/dict-powershell-5.0.14.tgz", - "integrity": "sha512-ktjjvtkIUIYmj/SoGBYbr3/+CsRGNXGpvVANrY0wlm/IoGlGywhoTUDYN0IsGwI2b8Vktx3DZmQkfb3Wo38jBA==", + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/@cspell/dict-powershell/-/dict-powershell-5.0.15.tgz", + "integrity": "sha512-l4S5PAcvCFcVDMJShrYD0X6Huv9dcsQPlsVsBGbH38wvuN7gS7+GxZFAjTNxDmTY1wrNi1cCatSg6Pu2BW4rgg==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-public-licenses": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/@cspell/dict-public-licenses/-/dict-public-licenses-2.0.13.tgz", - "integrity": "sha512-1Wdp/XH1ieim7CadXYE7YLnUlW0pULEjVl9WEeziZw3EKCAw8ZI8Ih44m4bEa5VNBLnuP5TfqC4iDautAleQzQ==", + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@cspell/dict-public-licenses/-/dict-public-licenses-2.0.14.tgz", + "integrity": "sha512-8NhNzQWALF6+NlLeKZKilSHbeW9MWeiD+NcrjehMAcovKFbsn8smmQG/bVxw+Ymtd6WEgNpLgswAqNsbSQQ4og==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-python": { - "version": "4.2.18", - "resolved": "https://registry.npmjs.org/@cspell/dict-python/-/dict-python-4.2.18.tgz", - "integrity": "sha512-hYczHVqZBsck7DzO5LumBLJM119a3F17aj8a7lApnPIS7cmEwnPc2eACNscAHDk7qAo2127oI7axUoFMe9/g1g==", + "version": "4.2.19", + "resolved": "https://registry.npmjs.org/@cspell/dict-python/-/dict-python-4.2.19.tgz", + "integrity": "sha512-9S2gTlgILp1eb6OJcVZeC8/Od83N8EqBSg5WHVpx97eMMJhifOzePkE0kDYjyHMtAFznCQTUu0iQEJohNQ5B0A==", "dev": true, "license": "MIT", "dependencies": { - "@cspell/dict-data-science": "^2.0.8" + "@cspell/dict-data-science": "^2.0.9" } }, "node_modules/@cspell/dict-r": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-r/-/dict-r-2.1.0.tgz", - "integrity": "sha512-k2512wgGG0lTpTYH9w5Wwco+lAMf3Vz7mhqV8+OnalIE7muA0RSuD9tWBjiqLcX8zPvEJr4LdgxVju8Gk3OKyA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-r/-/dict-r-2.1.1.tgz", + "integrity": "sha512-71Ka+yKfG4ZHEMEmDxc6+blFkeTTvgKbKAbwiwQAuKl3zpqs1Y0vUtwW2N4b3LgmSPhV3ODVY0y4m5ofqDuKMw==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-ruby": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/@cspell/dict-ruby/-/dict-ruby-5.0.8.tgz", - "integrity": "sha512-ixuTneU0aH1cPQRbWJvtvOntMFfeQR2KxT8LuAv5jBKqQWIHSxzGlp+zX3SVyoeR0kOWiu64/O5Yn836A5yMcQ==", + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/@cspell/dict-ruby/-/dict-ruby-5.0.9.tgz", + "integrity": "sha512-H2vMcERMcANvQshAdrVx0XoWaNX8zmmiQN11dZZTQAZaNJ0xatdJoSqY8C8uhEMW89bfgpN+NQgGuDXW2vmXEw==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-rust": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/@cspell/dict-rust/-/dict-rust-4.0.11.tgz", - "integrity": "sha512-OGWDEEzm8HlkSmtD8fV3pEcO2XBpzG2XYjgMCJCRwb2gRKvR+XIm6Dlhs04N/K2kU+iH8bvrqNpM8fS/BFl0uw==", + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/@cspell/dict-rust/-/dict-rust-4.0.12.tgz", + "integrity": "sha512-z2QiH+q9UlNhobBJArvILRxV8Jz0pKIK7gqu4TgmEYyjiu1TvnGZ1tbYHeu9w3I/wOP6UMDoCBTty5AlYfW0mw==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-scala": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/@cspell/dict-scala/-/dict-scala-5.0.7.tgz", - "integrity": "sha512-yatpSDW/GwulzO3t7hB5peoWwzo+Y3qTc0pO24Jf6f88jsEeKmDeKkfgPbYuCgbE4jisGR4vs4+jfQZDIYmXPA==", + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/@cspell/dict-scala/-/dict-scala-5.0.8.tgz", + "integrity": "sha512-YdftVmumv8IZq9zu1gn2U7A4bfM2yj9Vaupydotyjuc+EEZZSqAafTpvW/jKLWji2TgybM1L2IhmV0s/Iv9BTw==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-shell": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-shell/-/dict-shell-1.1.0.tgz", - "integrity": "sha512-D/xHXX7T37BJxNRf5JJHsvziFDvh23IF/KvkZXNSh8VqcRdod3BAz9VGHZf6VDqcZXr1VRqIYR3mQ8DSvs3AVQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-shell/-/dict-shell-1.1.1.tgz", + "integrity": "sha512-T37oYxE7OV1x/1D4/13Y8JZGa1QgDCXV7AVt3HLXjn0Fe3TaNDvf5sU0fGnXKmBPqFFrHdpD3uutAQb1dlp15g==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-software-terms": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-software-terms/-/dict-software-terms-5.1.0.tgz", - "integrity": "sha512-8zsOVzcHpb4PAaKtOWAIJRbpaNINaUZRsHzqFb3K9hQIC6hxmet/avLlCeKdnmBVZkn3TmRN5caxTJamJvbXww==", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@cspell/dict-software-terms/-/dict-software-terms-5.1.5.tgz", + "integrity": "sha512-MX5beBP3pLmIM0mjqfrHbie3EEfyLWZ8ZqW56jcLuRlLoDcfC0FZsr66NCARgCgEwsWiidHFe87+7fFsnwqY6A==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-sql": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-sql/-/dict-sql-2.2.0.tgz", - "integrity": "sha512-MUop+d1AHSzXpBvQgQkCiok8Ejzb+nrzyG16E8TvKL2MQeDwnIvMe3bv90eukP6E1HWb+V/MA/4pnq0pcJWKqQ==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-sql/-/dict-sql-2.2.1.tgz", + "integrity": "sha512-qDHF8MpAYCf4pWU8NKbnVGzkoxMNrFqBHyG/dgrlic5EQiKANCLELYtGlX5auIMDLmTf1inA0eNtv74tyRJ/vg==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-svelte": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@cspell/dict-svelte/-/dict-svelte-1.0.6.tgz", - "integrity": "sha512-8LAJHSBdwHCoKCSy72PXXzz7ulGROD0rP1CQ0StOqXOOlTUeSFaJJlxNYjlONgd2c62XBQiN2wgLhtPN+1Zv7Q==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@cspell/dict-svelte/-/dict-svelte-1.0.7.tgz", + "integrity": "sha512-hGZsGqP0WdzKkdpeVLBivRuSNzOTvN036EBmpOwxH+FTY2DuUH7ecW+cSaMwOgmq5JFSdTcbTNFlNC8HN8lhaQ==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-swift": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@cspell/dict-swift/-/dict-swift-2.0.5.tgz", - "integrity": "sha512-3lGzDCwUmnrfckv3Q4eVSW3sK3cHqqHlPprFJZD4nAqt23ot7fic5ALR7J4joHpvDz36nHX34TgcbZNNZOC/JA==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@cspell/dict-swift/-/dict-swift-2.0.6.tgz", + "integrity": "sha512-PnpNbrIbex2aqU1kMgwEKvCzgbkHtj3dlFLPMqW1vSniop7YxaDTtvTUO4zA++ugYAEL+UK8vYrBwDPTjjvSnA==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-terraform": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-terraform/-/dict-terraform-1.1.1.tgz", - "integrity": "sha512-07KFDwCU7EnKl4hOZLsLKlj6Zceq/IsQ3LRWUyIjvGFfZHdoGtFdCp3ZPVgnFaAcd/DKv+WVkrOzUBSYqHopQQ==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@cspell/dict-terraform/-/dict-terraform-1.1.3.tgz", + "integrity": "sha512-gr6wxCydwSFyyBKhBA2xkENXtVFToheqYYGFvlMZXWjviynXmh+NK/JTvTCk/VHk3+lzbO9EEQKee6VjrAUSbA==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-typescript": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-typescript/-/dict-typescript-3.2.2.tgz", - "integrity": "sha512-H9Y+uUHsTIDFO/jdfUAcqmcd5osT+2DB5b0aRCHfLWN/twUbGn/1qq3b7YwEvttxKlYzWHU3uNFf+KfA93VY7w==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/@cspell/dict-typescript/-/dict-typescript-3.2.3.tgz", + "integrity": "sha512-zXh1wYsNljQZfWWdSPYwQhpwiuW0KPW1dSd8idjMRvSD0aSvWWHoWlrMsmZeRl4qM4QCEAjua8+cjflm41cQBg==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-vue": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@cspell/dict-vue/-/dict-vue-3.0.4.tgz", - "integrity": "sha512-0dPtI0lwHcAgSiQFx8CzvqjdoXROcH+1LyqgROCpBgppommWpVhbQ0eubnKotFEXgpUCONVkeZJ6Ql8NbTEu+w==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@cspell/dict-vue/-/dict-vue-3.0.5.tgz", + "integrity": "sha512-Mqutb8jbM+kIcywuPQCCaK5qQHTdaByoEO2J9LKFy3sqAdiBogNkrplqUK0HyyRFgCfbJUgjz3N85iCMcWH0JA==", "dev": true, "license": "MIT" }, @@ -2739,10 +2778,27 @@ "tslib": "^2.4.0" } }, + "node_modules/@es-joy/jsdoccomment": { + "version": "0.52.0", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.52.0.tgz", + "integrity": "sha512-BXuN7BII+8AyNtn57euU2Yxo9yA/KUDNzrpXyi3pfqKmBhhysR6ZWOebFh3vyPoqA3/j1SOvGgucElMGwlXing==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.8", + "@typescript-eslint/types": "^8.34.1", + "comment-parser": "1.4.1", + "esquery": "^1.6.0", + "jsdoc-type-pratt-parser": "~4.1.0" + }, + "engines": { + "node": ">=20.11.0" + } + }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.5.tgz", - "integrity": "sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.8.tgz", + "integrity": "sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA==", "cpu": [ "ppc64" ], @@ -2757,9 +2813,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.5.tgz", - "integrity": "sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.8.tgz", + "integrity": "sha512-RONsAvGCz5oWyePVnLdZY/HHwA++nxYWIX1atInlaW6SEkwq6XkP3+cb825EUcRs5Vss/lGh/2YxAb5xqc07Uw==", "cpu": [ "arm" ], @@ -2774,9 +2830,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.5.tgz", - "integrity": "sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.8.tgz", + "integrity": "sha512-OD3p7LYzWpLhZEyATcTSJ67qB5D+20vbtr6vHlHWSQYhKtzUYrETuWThmzFpZtFsBIxRvhO07+UgVA9m0i/O1w==", "cpu": [ "arm64" ], @@ -2791,9 +2847,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.5.tgz", - "integrity": "sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.8.tgz", + "integrity": "sha512-yJAVPklM5+4+9dTeKwHOaA+LQkmrKFX96BM0A/2zQrbS6ENCmxc4OVoBs5dPkCCak2roAD+jKCdnmOqKszPkjA==", "cpu": [ "x64" ], @@ -2808,9 +2864,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.5.tgz", - "integrity": "sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.8.tgz", + "integrity": "sha512-Jw0mxgIaYX6R8ODrdkLLPwBqHTtYHJSmzzd+QeytSugzQ0Vg4c5rDky5VgkoowbZQahCbsv1rT1KW72MPIkevw==", "cpu": [ "arm64" ], @@ -2825,9 +2881,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.5.tgz", - "integrity": "sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.8.tgz", + "integrity": "sha512-Vh2gLxxHnuoQ+GjPNvDSDRpoBCUzY4Pu0kBqMBDlK4fuWbKgGtmDIeEC081xi26PPjn+1tct+Bh8FjyLlw1Zlg==", "cpu": [ "x64" ], @@ -2842,9 +2898,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.5.tgz", - "integrity": "sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.8.tgz", + "integrity": "sha512-YPJ7hDQ9DnNe5vxOm6jaie9QsTwcKedPvizTVlqWG9GBSq+BuyWEDazlGaDTC5NGU4QJd666V0yqCBL2oWKPfA==", "cpu": [ "arm64" ], @@ -2859,9 +2915,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.5.tgz", - "integrity": "sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.8.tgz", + "integrity": "sha512-MmaEXxQRdXNFsRN/KcIimLnSJrk2r5H8v+WVafRWz5xdSVmWLoITZQXcgehI2ZE6gioE6HirAEToM/RvFBeuhw==", "cpu": [ "x64" ], @@ -2876,9 +2932,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.5.tgz", - "integrity": "sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.8.tgz", + "integrity": "sha512-FuzEP9BixzZohl1kLf76KEVOsxtIBFwCaLupVuk4eFVnOZfU+Wsn+x5Ryam7nILV2pkq2TqQM9EZPsOBuMC+kg==", "cpu": [ "arm" ], @@ -2893,9 +2949,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.5.tgz", - "integrity": "sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.8.tgz", + "integrity": "sha512-WIgg00ARWv/uYLU7lsuDK00d/hHSfES5BzdWAdAig1ioV5kaFNrtK8EqGcUBJhYqotlUByUKz5Qo6u8tt7iD/w==", "cpu": [ "arm64" ], @@ -2910,9 +2966,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.5.tgz", - "integrity": "sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.8.tgz", + "integrity": "sha512-A1D9YzRX1i+1AJZuFFUMP1E9fMaYY+GnSQil9Tlw05utlE86EKTUA7RjwHDkEitmLYiFsRd9HwKBPEftNdBfjg==", "cpu": [ "ia32" ], @@ -2927,9 +2983,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.5.tgz", - "integrity": "sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.8.tgz", + "integrity": "sha512-O7k1J/dwHkY1RMVvglFHl1HzutGEFFZ3kNiDMSOyUrB7WcoHGf96Sh+64nTRT26l3GMbCW01Ekh/ThKM5iI7hQ==", "cpu": [ "loong64" ], @@ -2944,9 +3000,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.5.tgz", - "integrity": "sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.8.tgz", + "integrity": "sha512-uv+dqfRazte3BzfMp8PAQXmdGHQt2oC/y2ovwpTteqrMx2lwaksiFZ/bdkXJC19ttTvNXBuWH53zy/aTj1FgGw==", "cpu": [ "mips64el" ], @@ -2961,9 +3017,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.5.tgz", - "integrity": "sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.8.tgz", + "integrity": "sha512-GyG0KcMi1GBavP5JgAkkstMGyMholMDybAf8wF5A70CALlDM2p/f7YFE7H92eDeH/VBtFJA5MT4nRPDGg4JuzQ==", "cpu": [ "ppc64" ], @@ -2978,9 +3034,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.5.tgz", - "integrity": "sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.8.tgz", + "integrity": "sha512-rAqDYFv3yzMrq7GIcen3XP7TUEG/4LK86LUPMIz6RT8A6pRIDn0sDcvjudVZBiiTcZCY9y2SgYX2lgK3AF+1eg==", "cpu": [ "riscv64" ], @@ -2995,9 +3051,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.5.tgz", - "integrity": "sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.8.tgz", + "integrity": "sha512-Xutvh6VjlbcHpsIIbwY8GVRbwoviWT19tFhgdA7DlenLGC/mbc3lBoVb7jxj9Z+eyGqvcnSyIltYUrkKzWqSvg==", "cpu": [ "s390x" ], @@ -3012,9 +3068,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.5.tgz", - "integrity": "sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.8.tgz", + "integrity": "sha512-ASFQhgY4ElXh3nDcOMTkQero4b1lgubskNlhIfJrsH5OKZXDpUAKBlNS0Kx81jwOBp+HCeZqmoJuihTv57/jvQ==", "cpu": [ "x64" ], @@ -3029,9 +3085,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.5.tgz", - "integrity": "sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.8.tgz", + "integrity": "sha512-d1KfruIeohqAi6SA+gENMuObDbEjn22olAR7egqnkCD9DGBG0wsEARotkLgXDu6c4ncgWTZJtN5vcgxzWRMzcw==", "cpu": [ "arm64" ], @@ -3046,9 +3102,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.5.tgz", - "integrity": "sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.8.tgz", + "integrity": "sha512-nVDCkrvx2ua+XQNyfrujIG38+YGyuy2Ru9kKVNyh5jAys6n+l44tTtToqHjino2My8VAY6Lw9H7RI73XFi66Cg==", "cpu": [ "x64" ], @@ -3063,9 +3119,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.5.tgz", - "integrity": "sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.8.tgz", + "integrity": "sha512-j8HgrDuSJFAujkivSMSfPQSAa5Fxbvk4rgNAS5i3K+r8s1X0p1uOO2Hl2xNsGFppOeHOLAVgYwDVlmxhq5h+SQ==", "cpu": [ "arm64" ], @@ -3080,9 +3136,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.5.tgz", - "integrity": "sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.8.tgz", + "integrity": "sha512-1h8MUAwa0VhNCDp6Af0HToI2TJFAn1uqT9Al6DJVzdIBAd21m/G0Yfc77KDM3uF3T/YaOgQq3qTJHPbTOInaIQ==", "cpu": [ "x64" ], @@ -3096,10 +3152,27 @@ "node": ">=18" } }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.8.tgz", + "integrity": "sha512-r2nVa5SIK9tSWd0kJd9HCffnDHKchTGikb//9c7HX+r+wHYCpQrSgxhlY6KWV1nFo1l4KFbsMlHk+L6fekLsUg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@esbuild/sunos-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.5.tgz", - "integrity": "sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.8.tgz", + "integrity": "sha512-zUlaP2S12YhQ2UzUfcCuMDHQFJyKABkAjvO5YSndMiIkMimPmxA+BYSBikWgsRpvyxuRnow4nS5NPnf9fpv41w==", "cpu": [ "x64" ], @@ -3114,9 +3187,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.5.tgz", - "integrity": "sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.8.tgz", + "integrity": "sha512-YEGFFWESlPva8hGL+zvj2z/SaK+pH0SwOM0Nc/d+rVnW7GSTFlLBGzZkuSU9kFIGIo8q9X3ucpZhu8PDN5A2sQ==", "cpu": [ "arm64" ], @@ -3131,9 +3204,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.5.tgz", - "integrity": "sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.8.tgz", + "integrity": "sha512-hiGgGC6KZ5LZz58OL/+qVVoZiuZlUYlYHNAmczOm7bs2oE1XriPFi5ZHHrS8ACpV5EjySrnoCKmcbQMN+ojnHg==", "cpu": [ "ia32" ], @@ -3148,9 +3221,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.5.tgz", - "integrity": "sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.8.tgz", + "integrity": "sha512-cn3Yr7+OaaZq1c+2pe+8yxC8E144SReCQjN6/2ynubzYjvyqZjTXfQJpAcQpsdJq3My7XADANiYGHoFC69pLQw==", "cpu": [ "x64" ], @@ -3183,6 +3256,19 @@ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/@eslint-community/regexpp": { "version": "4.12.1", "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", @@ -3193,17 +3279,55 @@ "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, + "node_modules/@eslint/config-array": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", + "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.6", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.0.tgz", + "integrity": "sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.1.tgz", + "integrity": "sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", "dev": true, "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", + "espree": "^10.0.1", + "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -3211,7 +3335,7 @@ "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -3242,16 +3366,13 @@ "license": "Python-2.0" }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "dev": true, "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, "engines": { - "node": ">=8" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -3277,43 +3398,102 @@ "dev": true, "license": "MIT" }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "node_modules/@eslint/js": { + "version": "9.32.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.32.0.tgz", + "integrity": "sha512-BBpRFZK3eX6uMLKz8WxFOBIFFcGFJ/g8XuwjTHCqHROSIsopI+ddn/d5Cfh36+7+e5edVS8dbSHnBNhrLEX0zg==", "dev": true, - "license": "(MIT OR CC0-1.0)", + "license": "MIT", "engines": { - "node": ">=10" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://eslint.org/donate" } }, - "node_modules/@eslint/js": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", - "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "node_modules/@eslint/markdown": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@eslint/markdown/-/markdown-7.1.0.tgz", + "integrity": "sha512-Y+X1B1j+/zupKDVJfkKc8uYMjQkGzfnd8lt7vK3y8x9Br6H5dBuhAfFrQ6ff7HAMm/1BwgecyEiRFkYCWPRxmA==", "dev": true, "license": "MIT", + "workspaces": [ + "examples/*" + ], + "dependencies": { + "@eslint/core": "^0.15.1", + "@eslint/plugin-kit": "^0.3.4", + "github-slugger": "^2.0.0", + "mdast-util-from-markdown": "^2.0.2", + "mdast-util-frontmatter": "^2.0.1", + "mdast-util-gfm": "^3.1.0", + "micromark-extension-frontmatter": "^2.0.0", + "micromark-extension-gfm": "^3.0.0" + }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", - "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", - "deprecated": "Use @eslint/config-array instead", + "node_modules/@eslint/object-schema": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.4.tgz", + "integrity": "sha512-Ul5l+lHEcw3L5+k8POx6r74mxEYKG5kOb6Xpy2gCRW6zweT6TEhAf8vhxGgjhqrd/VO/Dirhsb+1hNpD1ue9hw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@humanwhocodes/object-schema": "^2.0.3", - "debug": "^4.3.1", - "minimatch": "^3.0.5" + "@eslint/core": "^0.15.1", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" }, "engines": { - "node": ">=10.10.0" + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, "node_modules/@humanwhocodes/module-importer": { @@ -3330,13 +3510,19 @@ "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "deprecated": "Use @eslint/object-schema instead", + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", "dev": true, - "license": "BSD-3-Clause" + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } }, "node_modules/@hutson/parse-repository-url": { "version": "3.0.2", @@ -3366,19 +3552,6 @@ "node": ">=12" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, "node_modules/@isaacs/cliui/node_modules/ansi-styles": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", @@ -3417,38 +3590,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" }, "engines": { "node": ">=12" }, "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, "node_modules/@istanbuljs/load-nyc-config": { @@ -4295,18 +4452,14 @@ "license": "MIT" }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", - "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "version": "0.3.12", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz", + "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { @@ -4318,20 +4471,10 @@ "node": ">=6.0.0" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@jridgewell/source-map": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", - "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.10.tgz", + "integrity": "sha512-0pPkgz9dY+bijgistcTTJ5mR+ocqRXLuhXHYdzoMmmoJ2C9S46RCm2GMUbatPEUK9Yjy26IrAy8D/M00lLkv+Q==", "dev": true, "license": "MIT", "dependencies": { @@ -4340,15 +4483,15 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz", + "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==", "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "version": "0.3.29", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz", + "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==", "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -4373,9 +4516,9 @@ } }, "node_modules/@jsonjoy.com/json-pack": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.2.0.tgz", - "integrity": "sha512-io1zEbbYcElht3tdlqEOFxZ0dMTYrHz9iMf0gqn1pPjZFTCgM5R4R5IMA20Chb2UPYYsxjzs8CgZ7Nb5n2K2rA==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.4.0.tgz", + "integrity": "sha512-Akn8XZqN3xO9YGcgvIiTauBBXTP92QSvw6EcGha+p5nm7brhbwvev5gw4fi+ouLGrBpfPpb72+S5pxl4mkMIGQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -4396,9 +4539,9 @@ } }, "node_modules/@jsonjoy.com/util": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.6.0.tgz", - "integrity": "sha512-sw/RMbehRhN68WRtcKCpQOPfnH6lLP4GJfqzi3iYej8tnzpZUDr6UkZYJjcjjC0FWEJOJbyM3PTIwxucUmDG2A==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.8.0.tgz", + "integrity": "sha512-HeR0JQNEdBozt+FrfyM5T0X3R+fIN0D+BRDkxPP5o41fTWzHfeZEqtK16aTW8haU+h+SG7XYq9PP5kobvOmkSA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -4869,6 +5012,27 @@ "@sinonjs/commons": "^3.0.1" } }, + "node_modules/@stylistic/eslint-plugin": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-5.2.2.tgz", + "integrity": "sha512-bE2DUjruqXlHYP3Q2Gpqiuj2bHq7/88FnuaS0FjeGGLCy+X6a07bGVuwtiOYnPSLHR6jmx5Bwdv+j7l8H+G97A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/types": "^8.37.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "estraverse": "^5.3.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": ">=9.0.0" + } + }, "node_modules/@swc/css": { "version": "0.0.28", "resolved": "https://registry.npmjs.org/@swc/css/-/css-0.0.28.tgz", @@ -5097,15 +5261,6 @@ "node": ">=10" } }, - "node_modules/@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", - "license": "ISC", - "engines": { - "node": ">=10.13.0" - } - }, "node_modules/@tybys/wasm-util": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.0.tgz", @@ -5200,6 +5355,16 @@ "@types/css-tree": "*" } }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, "node_modules/@types/eslint": { "version": "9.6.1", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", @@ -5266,6 +5431,16 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, "node_modules/@types/minimist": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", @@ -5273,10 +5448,17 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/node": { - "version": "20.19.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.0.tgz", - "integrity": "sha512-hfrc+1tud1xcdVTABC2JiomZJEklMcXYNTVtZLAeqTVWD+qL5jkHKT+1lOtqDdGxt+mB53DTtiz673vfjU8D1Q==", + "version": "20.19.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.9.tgz", + "integrity": "sha512-cuVNgarYWZqxRJDQHEB58GEONhOK79QVR/qYx4S7kcUObQvUwvFnYxJuuHUKm2aieN9X3yZB4LZsuYNU1Qphsw==", "license": "MIT", "dependencies": { "undici-types": "~6.21.0" @@ -5303,6 +5485,13 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/yargs": { "version": "17.0.33", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", @@ -5318,6 +5507,187 @@ "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", "license": "MIT" }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.38.0.tgz", + "integrity": "sha512-dbK7Jvqcb8c9QfH01YB6pORpqX1mn5gDZc9n63Ak/+jD67oWXn3Gs0M6vddAN+eDXBCS5EmNWzbSxsn9SzFWWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.38.0", + "@typescript-eslint/types": "^8.38.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.38.0.tgz", + "integrity": "sha512-WJw3AVlFFcdT9Ri1xs/lg8LwDqgekWXWhH3iAF+1ZM+QPd7oxQ6jvtW/JPwzAScxitILUIFs0/AnQ/UWHzbATQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.38.0", + "@typescript-eslint/visitor-keys": "8.38.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.38.0.tgz", + "integrity": "sha512-Lum9RtSE3EroKk/bYns+sPOodqb2Fv50XOl/gMviMKNvanETUuUcC9ObRbzrJ4VSd2JalPqgSAavwrPiPvnAiQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.38.0.tgz", + "integrity": "sha512-wzkUfX3plUqij4YwWaJyqhiPE5UCRVlFpKn1oCRn2O1bJ592XxWJj8ROQ3JD5MYXLORW84063z3tZTb/cs4Tyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.38.0.tgz", + "integrity": "sha512-fooELKcAKzxux6fA6pxOflpNS0jc+nOQEEOipXFNjSlBS6fqrJOVY/whSn70SScHrcJ2LDsxWrneFoWYSVfqhQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.38.0", + "@typescript-eslint/tsconfig-utils": "8.38.0", + "@typescript-eslint/types": "8.38.0", + "@typescript-eslint/visitor-keys": "8.38.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.38.0.tgz", + "integrity": "sha512-hHcMA86Hgt+ijJlrD8fX0j1j8w4C92zue/8LOPAFioIno+W0+L7KqE8QZKCcPGc/92Vs9x36w/4MPTJhqXdyvg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.38.0", + "@typescript-eslint/types": "8.38.0", + "@typescript-eslint/typescript-estree": "8.38.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.38.0.tgz", + "integrity": "sha512-pWrTcoFNWuwHlA9CvlfSsGWs14JxfN1TH25zM5L7o0pRLhsoZkDnTsXfQRJBEWJoV5DL0jf+Z+sxiud+K0mq1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.38.0", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@ungap/structured-clone": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", @@ -5754,19 +6124,6 @@ "@xtuc/long": "4.2.2" } }, - "node_modules/@webpack-contrib/eslint-config-webpack": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@webpack-contrib/eslint-config-webpack/-/eslint-config-webpack-3.0.0.tgz", - "integrity": "sha512-3f0dwuTZ1JZpnoGQ6tAKBWluZKZZBXr1ADoaOAbPiW0OvSN7o0wXFLGyfw6J+fW756xIkZLZ8JDYP5zInIRvBA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6.9.0 || >= 8.9.0" - }, - "peerDependencies": { - "eslint": ">= 5.0.0" - } - }, "node_modules/@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", @@ -5794,6 +6151,19 @@ "node": ">=0.4.0" } }, + "node_modules/acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "acorn": "^8.14.0" + } + }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -5825,6 +6195,16 @@ "node": ">=8" } }, + "node_modules/aggregate-error/node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/ajv": { "version": "8.17.1", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", @@ -5887,13 +6267,16 @@ } }, "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, "node_modules/ansi-styles": { @@ -5936,6 +6319,16 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/are-docs-informative": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/are-docs-informative/-/are-docs-informative-0.0.2.tgz", + "integrity": "sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, "node_modules/argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -6246,14 +6639,14 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.13", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.13.tgz", - "integrity": "sha512-3sX/eOms8kd3q2KZ6DAhKPc0dgm525Gqq5NtWKZ7QYYZEv57OQ54KtblzJzH1lQF/eQxO8KjWGIK9IPUJNus5g==", + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.14.tgz", + "integrity": "sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.6.4", + "@babel/compat-data": "^7.27.7", + "@babel/helper-define-polyfill-provider": "^0.6.5", "semver": "^6.3.1" }, "peerDependencies": { @@ -6261,36 +6654,36 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.11.1.tgz", - "integrity": "sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz", + "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.3", - "core-js-compat": "^3.40.0" + "@babel/helper-define-polyfill-provider": "^0.6.5", + "core-js-compat": "^3.43.0" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.4.tgz", - "integrity": "sha512-7gD3pRadPrbjhjLyxebmx/WrFYcuSjZ0XbdUujQMZ/fcE9oeewk2U/7PCvez84UeuK3oSjmPZ0Ch0dlupQvGzw==", + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.5.tgz", + "integrity": "sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.4" + "@babel/helper-define-polyfill-provider": "^0.6.5" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-preset-current-node-syntax": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz", - "integrity": "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.1.tgz", + "integrity": "sha512-23fWKohMTvS5s0wwJKycOe0dBdCwQ6+iiLaNR9zy8P13mtFRFM9qLLX6HJX5DL2pi/FNDf3fCQHM4FIMoHH/7w==", "dev": true, "license": "MIT", "dependencies": { @@ -6311,7 +6704,7 @@ "@babel/plugin-syntax-top-level-await": "^7.14.5" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^7.0.0 || ^8.0.0-0" } }, "node_modules/babel-preset-jest": { @@ -6383,9 +6776,9 @@ } }, "node_modules/browserslist": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.0.tgz", - "integrity": "sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==", + "version": "4.25.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz", + "integrity": "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==", "funding": [ { "type": "opencollective", @@ -6402,8 +6795,8 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001718", - "electron-to-chromium": "^1.5.160", + "caniuse-lite": "^1.0.30001726", + "electron-to-chromium": "^1.5.173", "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.3" }, @@ -6431,6 +6824,19 @@ "dev": true, "license": "MIT" }, + "node_modules/builtin-modules": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-5.0.0.tgz", + "integrity": "sha512-bkXY9WsVpY7CvMhKSR6pZilZu9Ln5WDrKVBUXf2S443etkmEO4V58heTecXcUIsNsi4Rx8JUO4NfX1IcQl4deg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/call-bind": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", @@ -6532,9 +6938,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001722", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001722.tgz", - "integrity": "sha512-DCQHBBZtiK6JVkAGw7drvAMK0Q0POD/xZvEmDp6baiMMP6QXXk9HpD6mNYBZWhOPG6LvIDb82ITqtWjhDckHCA==", + "version": "1.0.30001731", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001731.tgz", + "integrity": "sha512-lDdp2/wrOmTRWuoB5DpfNkC0rJDU8DqRa6nYL6HK6sytw70QMopt/NIc/9SM7ylItlBWfACXk0tEn37UWM/+mg==", "funding": [ { "type": "opencollective", @@ -6551,6 +6957,17 @@ ], "license": "CC-BY-4.0" }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/chalk": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", @@ -6580,6 +6997,13 @@ "url": "https://github.com/chalk/chalk-template?sponsor=1" } }, + "node_modules/change-case": { + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-5.4.4.tgz", + "integrity": "sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==", + "dev": true, + "license": "MIT" + }, "node_modules/char-regex": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", @@ -6590,6 +7014,17 @@ "node": ">=10" } }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -6627,9 +7062,9 @@ } }, "node_modules/ci-info": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.2.0.tgz", - "integrity": "sha512-cYY9mypksY8NRqgDB1XD1RiJL338v/551niynFTGkZOO2LHuB2OmOYxDIe/ttN9AHwrqdum1360G3ald0W9kCg==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.0.tgz", + "integrity": "sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ==", "funding": [ { "type": "github", @@ -6661,7 +7096,30 @@ "node": ">= 10.0" } }, - "node_modules/clean-stack": { + "node_modules/clean-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz", + "integrity": "sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/clean-regexp/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", @@ -6736,6 +7194,16 @@ "node": ">=12" } }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/cliui/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -6804,6 +7272,19 @@ "node": ">=8" } }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/cliui/node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -6897,6 +7378,16 @@ "node": ">= 6" } }, + "node_modules/comment-parser": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz", + "integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12.0.0" + } + }, "node_modules/compare-func": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", @@ -8183,21 +8674,20 @@ "license": "MIT" }, "node_modules/copy-webpack-plugin": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-9.1.0.tgz", - "integrity": "sha512-rxnR7PaGigJzhqETHGmAcxKnLZSR5u1Y3/bcIv/1FnqXedcL/E2ewK7ZCNrArJKCiSv8yVXhTqetJh8inDvfsA==", + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-13.0.0.tgz", + "integrity": "sha512-FgR/h5a6hzJqATDGd9YG41SeDViH+0bkHn6WNXCi5zKAZkeESeSxLySSsFLHqLEVCh0E+rITmCf0dusXWYukeQ==", "dev": true, "license": "MIT", "dependencies": { - "fast-glob": "^3.2.7", "glob-parent": "^6.0.1", - "globby": "^11.0.3", "normalize-path": "^3.0.0", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0" + "schema-utils": "^4.2.0", + "serialize-javascript": "^6.0.2", + "tinyglobby": "^0.2.12" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", @@ -8207,33 +8697,6 @@ "webpack": "^5.1.0" } }, - "node_modules/copy-webpack-plugin/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/copy-webpack-plugin/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, "node_modules/copy-webpack-plugin/node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", @@ -8247,40 +8710,14 @@ "node": ">=10.13.0" } }, - "node_modules/copy-webpack-plugin/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, - "node_modules/copy-webpack-plugin/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/core-js-compat": { - "version": "3.43.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.43.0.tgz", - "integrity": "sha512-2GML2ZsCc5LR7hZYz4AXmjQw8zuy2T//2QntwdnpuYI7jteT6GVYJL7F6C2C57R7gSYrcqVW3lAALefdbhBLDA==", + "version": "3.44.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.44.0.tgz", + "integrity": "sha512-JepmAj2zfl6ogy34qfWtcE7nHKAJnKsQFRn++scjVS2bZFllwptzw61BZcZFYBPpUznLfAvh0LGhxKppk04ClA==", "dev": true, "license": "MIT", "dependencies": { - "browserslist": "^4.25.0" + "browserslist": "^4.25.1" }, "funding": { "type": "opencollective", @@ -8672,9 +9109,9 @@ } }, "node_modules/css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", @@ -8702,9 +9139,9 @@ } }, "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", "license": "BSD-2-Clause", "engines": { "node": ">= 6" @@ -8726,12 +9163,12 @@ } }, "node_modules/cssnano": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-7.0.7.tgz", - "integrity": "sha512-evKu7yiDIF7oS+EIpwFlMF730ijRyLFaM2o5cTxRGJR9OKHKkc+qP443ZEVR9kZG0syaAJJCPJyfv5pbrxlSng==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-7.1.0.tgz", + "integrity": "sha512-Pu3rlKkd0ZtlCUzBrKL1Z4YmhKppjC1H9jo7u1o4qaKqyhvixFgu5qLyNIAOjSTg9DjVPtUqdROq2EfpVMEe+w==", "license": "MIT", "dependencies": { - "cssnano-preset-default": "^7.0.7", + "cssnano-preset-default": "^7.0.8", "lilconfig": "^3.1.3" }, "engines": { @@ -8746,26 +9183,26 @@ } }, "node_modules/cssnano-preset-default": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-7.0.7.tgz", - "integrity": "sha512-jW6CG/7PNB6MufOrlovs1TvBTEVmhY45yz+bd0h6nw3h6d+1e+/TX+0fflZ+LzvZombbT5f+KC063w9VoHeHow==", + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-7.0.8.tgz", + "integrity": "sha512-d+3R2qwrUV3g4LEMOjnndognKirBZISylDZAF/TPeCWVjEwlXS2e4eN4ICkoobRe7pD3H6lltinKVyS1AJhdjQ==", "license": "MIT", "dependencies": { - "browserslist": "^4.24.5", + "browserslist": "^4.25.1", "css-declaration-sorter": "^7.2.0", "cssnano-utils": "^5.0.1", "postcss-calc": "^10.1.1", - "postcss-colormin": "^7.0.3", - "postcss-convert-values": "^7.0.5", + "postcss-colormin": "^7.0.4", + "postcss-convert-values": "^7.0.6", "postcss-discard-comments": "^7.0.4", "postcss-discard-duplicates": "^7.0.2", "postcss-discard-empty": "^7.0.1", "postcss-discard-overridden": "^7.0.1", "postcss-merge-longhand": "^7.0.5", - "postcss-merge-rules": "^7.0.5", + "postcss-merge-rules": "^7.0.6", "postcss-minify-font-values": "^7.0.1", "postcss-minify-gradients": "^7.0.1", - "postcss-minify-params": "^7.0.3", + "postcss-minify-params": "^7.0.4", "postcss-minify-selectors": "^7.0.5", "postcss-normalize-charset": "^7.0.1", "postcss-normalize-display-values": "^7.0.1", @@ -8773,13 +9210,13 @@ "postcss-normalize-repeat-style": "^7.0.1", "postcss-normalize-string": "^7.0.1", "postcss-normalize-timing-functions": "^7.0.1", - "postcss-normalize-unicode": "^7.0.3", + "postcss-normalize-unicode": "^7.0.4", "postcss-normalize-url": "^7.0.1", "postcss-normalize-whitespace": "^7.0.1", "postcss-ordered-values": "^7.0.2", - "postcss-reduce-initial": "^7.0.3", + "postcss-reduce-initial": "^7.0.4", "postcss-reduce-transforms": "^7.0.1", - "postcss-svgo": "^7.0.2", + "postcss-svgo": "^7.1.0", "postcss-unique-selectors": "^7.0.4" }, "engines": { @@ -8959,6 +9396,20 @@ "node": ">=0.10.0" } }, + "node_modules/decode-named-character-reference": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.2.0.tgz", + "integrity": "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/dedent": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.6.0.tgz", @@ -9235,19 +9686,6 @@ "node": ">=10" } }, - "node_modules/del-cli/node_modules/indent-string": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", - "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/del-cli/node_modules/is-path-cwd": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-3.0.0.tgz", @@ -9481,22 +9919,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/del-cli/node_modules/strip-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz", - "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==", - "dev": true, - "license": "MIT", - "dependencies": { - "min-indent": "^1.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/del-cli/node_modules/trim-newlines": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-4.1.1.tgz", @@ -9550,14 +9972,24 @@ "node": ">=8" } }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/detect-indent": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", - "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-7.0.1.tgz", + "integrity": "sha512-Mc7QhQ8s+cLrnUfU/Ji94vG/r8M26m8f++vyres4ZoojaRDpZ1eSIh/EpzLNwlWuvzSZ3UbDFspjFvTDXe6e/g==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12.20" } }, "node_modules/detect-libc": { @@ -9580,6 +10012,20 @@ "node": ">=8" } }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -9594,16 +10040,16 @@ } }, "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, "engines": { - "node": ">=6.0.0" + "node": ">=0.10.0" } }, "node_modules/dom-serializer": { @@ -9777,9 +10223,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.166", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.166.tgz", - "integrity": "sha512-QPWqHL0BglzPYyJJ1zSSmwFFL6MFXhbACOCcsCdUMCkzPdS9/OIBVxg516X/Ado2qwAq8k0nJJ7phQPCqiaFAw==", + "version": "1.5.192", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.192.tgz", + "integrity": "sha512-rP8Ez0w7UNw/9j5eSXCe10o1g/8B1P5SM90PCCMVkIRQn2R0LEHWz4Eh9RnxkniuDe1W0cTSOB3MLlkTGDcuCg==", "license": "ISC" }, "node_modules/emittery": { @@ -9803,9 +10249,9 @@ "license": "MIT" }, "node_modules/enhanced-resolve": { - "version": "5.18.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", - "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", + "version": "5.18.2", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.2.tgz", + "integrity": "sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ==", "dev": true, "license": "MIT", "dependencies": { @@ -10018,9 +10464,9 @@ } }, "node_modules/esbuild": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.5.tgz", - "integrity": "sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.8.tgz", + "integrity": "sha512-vVC0USHGtMi8+R4Kz8rt6JhEWLxsv9Rnu/lGYbPR8u47B+DCBksq9JarW0zOO7bs37hyOK1l2/oqtbciutL5+Q==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -10031,31 +10477,32 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.5", - "@esbuild/android-arm": "0.25.5", - "@esbuild/android-arm64": "0.25.5", - "@esbuild/android-x64": "0.25.5", - "@esbuild/darwin-arm64": "0.25.5", - "@esbuild/darwin-x64": "0.25.5", - "@esbuild/freebsd-arm64": "0.25.5", - "@esbuild/freebsd-x64": "0.25.5", - "@esbuild/linux-arm": "0.25.5", - "@esbuild/linux-arm64": "0.25.5", - "@esbuild/linux-ia32": "0.25.5", - "@esbuild/linux-loong64": "0.25.5", - "@esbuild/linux-mips64el": "0.25.5", - "@esbuild/linux-ppc64": "0.25.5", - "@esbuild/linux-riscv64": "0.25.5", - "@esbuild/linux-s390x": "0.25.5", - "@esbuild/linux-x64": "0.25.5", - "@esbuild/netbsd-arm64": "0.25.5", - "@esbuild/netbsd-x64": "0.25.5", - "@esbuild/openbsd-arm64": "0.25.5", - "@esbuild/openbsd-x64": "0.25.5", - "@esbuild/sunos-x64": "0.25.5", - "@esbuild/win32-arm64": "0.25.5", - "@esbuild/win32-ia32": "0.25.5", - "@esbuild/win32-x64": "0.25.5" + "@esbuild/aix-ppc64": "0.25.8", + "@esbuild/android-arm": "0.25.8", + "@esbuild/android-arm64": "0.25.8", + "@esbuild/android-x64": "0.25.8", + "@esbuild/darwin-arm64": "0.25.8", + "@esbuild/darwin-x64": "0.25.8", + "@esbuild/freebsd-arm64": "0.25.8", + "@esbuild/freebsd-x64": "0.25.8", + "@esbuild/linux-arm": "0.25.8", + "@esbuild/linux-arm64": "0.25.8", + "@esbuild/linux-ia32": "0.25.8", + "@esbuild/linux-loong64": "0.25.8", + "@esbuild/linux-mips64el": "0.25.8", + "@esbuild/linux-ppc64": "0.25.8", + "@esbuild/linux-riscv64": "0.25.8", + "@esbuild/linux-s390x": "0.25.8", + "@esbuild/linux-x64": "0.25.8", + "@esbuild/netbsd-arm64": "0.25.8", + "@esbuild/netbsd-x64": "0.25.8", + "@esbuild/openbsd-arm64": "0.25.8", + "@esbuild/openbsd-x64": "0.25.8", + "@esbuild/openharmony-arm64": "0.25.8", + "@esbuild/sunos-x64": "0.25.8", + "@esbuild/win32-arm64": "0.25.8", + "@esbuild/win32-ia32": "0.25.8", + "@esbuild/win32-x64": "0.25.8" } }, "node_modules/escalade": { @@ -10081,75 +10528,181 @@ } }, "node_modules/eslint": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", - "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", - "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "version": "9.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.32.0.tgz", + "integrity": "sha512-LSehfdpgMeWcTZkWZVIJl+tkZ2nuSkyyB9C27MZqFWXuph7DvaowgcTvKqxvpLW1JZIk8PN7hFY3Rj9LQ7m7lg==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.1", - "@humanwhocodes/config-array": "^0.13.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.0", + "@eslint/config-helpers": "^0.3.0", + "@eslint/core": "^0.15.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.32.0", + "@eslint/plugin-kit": "^0.3.4", + "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", + "cross-spawn": "^7.0.6", "debug": "^4.3.2", - "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", + "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" + "optionator": "^0.9.3" }, "bin": { "eslint": "bin/eslint.js" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-compat-utils": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz", + "integrity": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/eslint-compat-utils/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/eslint-config-prettier": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", - "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "version": "10.1.8", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", + "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", "dev": true, "license": "MIT", "bin": { "eslint-config-prettier": "bin/cli.js" }, + "funding": { + "url": "https://opencollective.com/eslint-config-prettier" + }, "peerDependencies": { "eslint": ">=7.0.0" } }, + "node_modules/eslint-config-webpack": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/eslint-config-webpack/-/eslint-config-webpack-4.5.1.tgz", + "integrity": "sha512-Qiq0PSjx7P1ncI9PCTvfW8c76OqkXAFr91TQGa+u1FAMHXMur3in8hwL7fXYPi2oF8ytI1Zuoc2TmDzX0ZO4tA==", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-indent": "^7.0.1", + "jsonc-eslint-parser": "^2.4.0", + "semver": "^7.7.2", + "sort-package-json": "^3.4.0" + }, + "engines": { + "node": ">= 20.9.0" + }, + "peerDependencies": { + "@eslint/js": ">= 9.28.0", + "@eslint/markdown": ">= 7.1.0", + "@stylistic/eslint-plugin": ">= 4.4.1", + "eslint": ">= 9.28.0", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-import": ">= 2.31.0", + "eslint-plugin-jest": ">= 28.12.0", + "eslint-plugin-jsdoc": ">= 50.7.1", + "eslint-plugin-n": ">= 17.19.0", + "eslint-plugin-prettier": ">= 5.5.3", + "eslint-plugin-react": ">= 7.37.5", + "eslint-plugin-unicorn": ">= 60.0.0", + "globals": ">= 16.2.0", + "prettier": ">= 3.5.3", + "typescript": ">= 5.0.0", + "typescript-eslint": ">= 8.34.0" + }, + "peerDependenciesMeta": { + "@eslint/markdown": { + "optional": true + }, + "eslint-plugin-jest": { + "optional": true + }, + "eslint-plugin-jsdoc": { + "optional": true + }, + "eslint-plugin-n": { + "optional": true + }, + "eslint-plugin-react": { + "optional": true + }, + "typescript": { + "optional": true + }, + "typescript-eslint": { + "optional": true + } + } + }, + "node_modules/eslint-config-webpack/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/eslint-import-resolver-node": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", @@ -10173,9 +10726,9 @@ } }, "node_modules/eslint-module-utils": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", - "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", + "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", "dev": true, "license": "MIT", "dependencies": { @@ -10200,31 +10753,53 @@ "ms": "^2.1.1" } }, + "node_modules/eslint-plugin-es-x": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.8.0.tgz", + "integrity": "sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==", + "dev": true, + "funding": [ + "https://github.com/sponsors/ota-meshi", + "https://opencollective.com/eslint" + ], + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.1.2", + "@eslint-community/regexpp": "^4.11.0", + "eslint-compat-utils": "^0.5.1" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": ">=8" + } + }, "node_modules/eslint-plugin-import": { - "version": "2.31.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", - "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", + "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", "dev": true, "license": "MIT", "dependencies": { "@rtsao/scc": "^1.1.0", - "array-includes": "^3.1.8", - "array.prototype.findlastindex": "^1.2.5", - "array.prototype.flat": "^1.3.2", - "array.prototype.flatmap": "^1.3.2", + "array-includes": "^3.1.9", + "array.prototype.findlastindex": "^1.2.6", + "array.prototype.flat": "^1.3.3", + "array.prototype.flatmap": "^1.3.3", "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.12.0", + "eslint-module-utils": "^2.12.1", "hasown": "^2.0.2", - "is-core-module": "^2.15.1", + "is-core-module": "^2.16.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", "object.fromentries": "^2.0.8", "object.groupby": "^1.0.3", - "object.values": "^1.2.0", + "object.values": "^1.2.1", "semver": "^6.3.1", - "string.prototype.trimend": "^1.0.8", + "string.prototype.trimend": "^1.0.9", "tsconfig-paths": "^3.15.0" }, "engines": { @@ -10244,23 +10819,207 @@ "ms": "^2.1.1" } }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "node_modules/eslint-plugin-jest": { + "version": "29.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-29.0.1.tgz", + "integrity": "sha512-EE44T0OSMCeXhDrrdsbKAhprobKkPtJTbQz5yEktysNpHeDZTAL1SfDTNKmcFfJkY6yrQLtTKZALrD3j/Gpmiw==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "esutils": "^2.0.2" + "@typescript-eslint/utils": "^8.0.0" }, "engines": { - "node": ">=0.10.0" + "node": "^20.12.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^8.0.0", + "eslint": "^8.57.0 || ^9.0.0", + "jest": "*" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + }, + "jest": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-jsdoc": { + "version": "52.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-52.0.0.tgz", + "integrity": "sha512-KZjaoTWWUIml6K6zyPvwCYlLoMDQ69taSdTcdTIavBUoJCIWUfYcsRIw4n9dzllMouqdxiFfKW33EAbBLBu1HA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@es-joy/jsdoccomment": "~0.52.0", + "are-docs-informative": "^0.0.2", + "comment-parser": "1.4.1", + "debug": "^4.4.1", + "escape-string-regexp": "^4.0.0", + "espree": "^10.4.0", + "esquery": "^1.6.0", + "parse-imports-exports": "^0.2.4", + "semver": "^7.7.2", + "spdx-expression-parse": "^4.0.0" + }, + "engines": { + "node": ">=20.11.0" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-jsdoc/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-plugin-n": { + "version": "17.21.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.21.3.tgz", + "integrity": "sha512-MtxYjDZhMQgsWRm/4xYLL0i2EhusWT7itDxlJ80l1NND2AL2Vi5Mvneqv/ikG9+zpran0VsVRXTEHrpLmUZRNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.5.0", + "enhanced-resolve": "^5.17.1", + "eslint-plugin-es-x": "^7.8.0", + "get-tsconfig": "^4.8.1", + "globals": "^15.11.0", + "globrex": "^0.1.2", + "ignore": "^5.3.2", + "semver": "^7.6.3", + "ts-declaration-location": "^1.0.6" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": ">=8.23.0" + } + }, + "node_modules/eslint-plugin-n/node_modules/globals": { + "version": "15.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", + "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-plugin-n/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.3.tgz", + "integrity": "sha512-NAdMYww51ehKfDyDhv59/eIItUVzU0Io9H2E8nHNGKEeeqlnci+1gCvrHib6EmZdf6GxF+LCV5K7UC65Ezvw7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.11.7" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-unicorn": { + "version": "60.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-60.0.0.tgz", + "integrity": "sha512-QUzTefvP8stfSXsqKQ+vBQSEsXIlAiCduS/V1Em+FKgL9c21U/IIm20/e3MFy1jyCf14tHAhqC1sX8OTy6VUCg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "@eslint-community/eslint-utils": "^4.7.0", + "@eslint/plugin-kit": "^0.3.3", + "change-case": "^5.4.4", + "ci-info": "^4.3.0", + "clean-regexp": "^1.0.0", + "core-js-compat": "^3.44.0", + "esquery": "^1.6.0", + "find-up-simple": "^1.0.1", + "globals": "^16.3.0", + "indent-string": "^5.0.0", + "is-builtin-module": "^5.0.0", + "jsesc": "^3.1.0", + "pluralize": "^8.0.0", + "regexp-tree": "^0.1.27", + "regjsparser": "^0.12.0", + "semver": "^7.7.2", + "strip-indent": "^4.0.0" + }, + "engines": { + "node": "^20.10.0 || >=21.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1" + }, + "peerDependencies": { + "eslint": ">=9.29.0" + } + }, + "node_modules/eslint-plugin-unicorn/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -10268,20 +11027,20 @@ "estraverse": "^5.2.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true, "license": "Apache-2.0", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -10320,13 +11079,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/eslint/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" - }, "node_modules/eslint/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -10365,16 +11117,16 @@ "license": "MIT" }, "node_modules/eslint/node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, "license": "MIT", "dependencies": { - "flat-cache": "^3.0.4" + "flat-cache": "^4.0.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16.0.0" } }, "node_modules/eslint/node_modules/find-up": { @@ -10395,18 +11147,17 @@ } }, "node_modules/eslint/node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, "license": "MIT", "dependencies": { "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" + "keyv": "^4.5.4" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16" } }, "node_modules/eslint/node_modules/glob-parent": { @@ -10422,35 +11173,6 @@ "node": ">=10.13.0" } }, - "node_modules/eslint/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/eslint/node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -10500,32 +11222,19 @@ "node": ">=8" } }, - "node_modules/eslint/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "acorn": "^8.9.0", + "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" + "eslint-visitor-keys": "^4.2.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -10666,6 +11375,13 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "license": "MIT" }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true, + "license": "Apache-2.0" + }, "node_modules/fast-equals": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.2.2.tgz", @@ -10733,6 +11449,20 @@ "reusify": "^1.0.4" } }, + "node_modules/fault": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fault/-/fault-2.0.1.tgz", + "integrity": "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "format": "^0.2.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/fb-watchman": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", @@ -10828,6 +11558,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/find-up-simple": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.1.tgz", + "integrity": "sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/flat-cache": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-5.0.0.tgz", @@ -10895,6 +11638,15 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/format": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", + "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, "node_modules/fs-readdir-recursive": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", @@ -11062,6 +11814,16 @@ "node": ">=6.9.0" } }, + "node_modules/get-pkg-repo/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/get-pkg-repo/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -11208,6 +11970,19 @@ "node": ">=8" } }, + "node_modules/get-pkg-repo/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/get-pkg-repo/node_modules/through2": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", @@ -11318,6 +12093,29 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-tsconfig": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.1.tgz", + "integrity": "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/git-hooks-list": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/git-hooks-list/-/git-hooks-list-4.1.1.tgz", + "integrity": "sha512-cmP497iLq54AZnv4YRAEMnEyQ1eIn4tGKbmswqwmFV4GBnAqE8NLtWxxdXa++AalfgL5EBH4IxTPyquEuGY/jA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/fisker/git-hooks-list?sponsor=1" + } + }, "node_modules/git-raw-commits": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-4.0.0.tgz", @@ -11655,6 +12453,13 @@ "dev": true, "license": "ISC" }, + "node_modules/github-slugger": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", + "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==", + "dev": true, + "license": "ISC" + }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -11714,13 +12519,16 @@ } }, "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "version": "16.3.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.3.0.tgz", + "integrity": "sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=4" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/globalthis": { @@ -11771,6 +12579,13 @@ "node": ">=8" } }, + "node_modules/globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "dev": true, + "license": "MIT" + }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -11790,13 +12605,6 @@ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "license": "ISC" }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true, - "license": "MIT" - }, "node_modules/handlebars": { "version": "4.7.8", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", @@ -12094,13 +12902,16 @@ } }, "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/inflight": { @@ -12239,6 +13050,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-builtin-module": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-5.0.0.tgz", + "integrity": "sha512-f4RqJKBUe5rQkJ2eJEJBXSticB3hGbN9j0yxxMQFqIW89Jp9WYFtzfTcRlstDKVUTRzSOTLKRfO9vIztenwtxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "builtin-modules": "^5.0.0" + }, + "engines": { + "node": ">=18.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", @@ -12468,13 +13295,16 @@ } }, "node_modules/is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-regex": { @@ -14263,9 +15093,9 @@ } }, "node_modules/jiti": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", - "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.5.1.tgz", + "integrity": "sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==", "dev": true, "license": "MIT", "bin": { @@ -14293,6 +15123,16 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/jsdoc-type-pratt-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.1.0.tgz", + "integrity": "sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/jsesc": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", @@ -14360,6 +15200,69 @@ "node": ">=6" } }, + "node_modules/jsonc-eslint-parser": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonc-eslint-parser/-/jsonc-eslint-parser-2.4.0.tgz", + "integrity": "sha512-WYDyuc/uFcGp6YtM2H0uKmUwieOuzeE/5YocFJLnLfclZ4inf3mRn8ZVy1s7Hxji7Jxm6Ss8gqpexD/GlKoGgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.5.0", + "eslint-visitor-keys": "^3.0.0", + "espree": "^9.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + } + }, + "node_modules/jsonc-eslint-parser/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/jsonc-eslint-parser/node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/jsonc-eslint-parser/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/jsonparse": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", @@ -15090,19 +15993,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-update/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, "node_modules/log-update/node_modules/ansi-styles": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", @@ -15149,20 +16039,15 @@ "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/log-update/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", "dev": true, "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, "node_modules/lru-cache": { @@ -15222,6 +16107,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/markdown-table": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", + "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -15232,6 +16128,251 @@ "node": ">= 0.4" } }, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", + "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", + "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-frontmatter": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-2.0.1.tgz", + "integrity": "sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "escape-string-regexp": "^5.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-extension-frontmatter": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-frontmatter/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-gfm": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", + "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", + "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/mdn-data": { "version": "2.0.28", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", @@ -15239,9 +16380,9 @@ "license": "CC0-1.0" }, "node_modules/memfs": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.17.2.tgz", - "integrity": "sha512-NgYhCOWgovOXSzvYgUW0LQ7Qy72rWQMGGFJDoWg4G30RHd3z77VbYdtJ4fembJXBy8pMIUA31XNAupobOQlwdg==", + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.23.0.tgz", + "integrity": "sha512-SucHN2lcWf0jrnw+jP6FoVW6l/zGJiXfNMdApZzG0x/0mAIMdwAeR5mjfsCH5U3BoqpUEtqzz+dSQSO0H/eqxg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -15296,8 +16437,616 @@ "node": ">= 8" } }, - "node_modules/micromatch": { - "version": "4.0.8", + "node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-frontmatter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-2.0.0.tgz", + "integrity": "sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "fault": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", + "dev": true, + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", + "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", + "dev": true, + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", + "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", + "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, @@ -15438,6 +17187,16 @@ "node": ">= 6" } }, + "node_modules/minimist-options/node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/minipass": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", @@ -16025,6 +17784,16 @@ "node": ">=8" } }, + "node_modules/parse-imports-exports": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/parse-imports-exports/-/parse-imports-exports-0.2.4.tgz", + "integrity": "sha512-4s6vd6dx1AotCx/RCI2m7t7GCh5bDRUtGNvRfHSP2wbBQdMi67pPe7mtzmgwcaQ8VKK/6IB7Glfyu3qdZJPybQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parse-statements": "1.0.11" + } + }, "node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -16044,6 +17813,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/parse-statements": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/parse-statements/-/parse-statements-1.0.11.tgz", + "integrity": "sha512-HlsyYdMBnbPQ9Jr/VgJ1YF4scnldvJpJxCVx6KgqPL4dxppsWrJHCIIxQXMJrqGnsRkNPATbeMJ8Yxu7JMsYcA==", + "dev": true, + "license": "MIT" + }, "node_modules/path-exists": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", @@ -16122,9 +17898,9 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "license": "MIT", "engines": { "node": ">=12" @@ -16245,6 +18021,16 @@ "node": ">=8" } }, + "node_modules/pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/possible-typed-array-names": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", @@ -16256,9 +18042,9 @@ } }, "node_modules/postcss": { - "version": "8.5.5", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.5.tgz", - "integrity": "sha512-d/jtm+rdNT8tpXuHY5MMtcbJFBkhXE6593XVR9UoGCH8jSFGci7jGvMGH5RYd5PBJW+00NZQt6gf7CbagJCrhg==", + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", "funding": [ { "type": "opencollective", @@ -16300,12 +18086,12 @@ } }, "node_modules/postcss-colormin": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-7.0.3.tgz", - "integrity": "sha512-xZxQcSyIVZbSsl1vjoqZAcMYYdnJsIyG8OvqShuuqf12S88qQboxxEy0ohNCOLwVPXTU+hFHvJPACRL2B5ohTA==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-7.0.4.tgz", + "integrity": "sha512-ziQuVzQZBROpKpfeDwmrG+Vvlr0YWmY/ZAk99XD+mGEBuEojoFekL41NCsdhyNUtZI7DPOoIWIR7vQQK9xwluw==", "license": "MIT", "dependencies": { - "browserslist": "^4.24.5", + "browserslist": "^4.25.1", "caniuse-api": "^3.0.0", "colord": "^2.9.3", "postcss-value-parser": "^4.2.0" @@ -16318,12 +18104,12 @@ } }, "node_modules/postcss-convert-values": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-7.0.5.tgz", - "integrity": "sha512-0VFhH8nElpIs3uXKnVtotDJJNX0OGYSZmdt4XfSfvOMrFw1jKfpwpZxfC4iN73CTM/MWakDEmsHQXkISYj4BXw==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-7.0.6.tgz", + "integrity": "sha512-MD/eb39Mr60hvgrqpXsgbiqluawYg/8K4nKsqRsuDX9f+xN1j6awZCUv/5tLH8ak3vYp/EMXwdcnXvfZYiejCQ==", "license": "MIT", "dependencies": { - "browserslist": "^4.24.5", + "browserslist": "^4.25.1", "postcss-value-parser": "^4.2.0" }, "engines": { @@ -16401,12 +18187,12 @@ } }, "node_modules/postcss-merge-rules": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-7.0.5.tgz", - "integrity": "sha512-ZonhuSwEaWA3+xYbOdJoEReKIBs5eDiBVLAGpYZpNFPzXZcEE5VKR7/qBEQvTZpiwjqhhqEQ+ax5O3VShBj9Wg==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-7.0.6.tgz", + "integrity": "sha512-2jIPT4Tzs8K87tvgCpSukRQ2jjd+hH6Bb8rEEOUDmmhOeTcqDg5fEFK8uKIu+Pvc3//sm3Uu6FRqfyv7YF7+BQ==", "license": "MIT", "dependencies": { - "browserslist": "^4.24.5", + "browserslist": "^4.25.1", "caniuse-api": "^3.0.0", "cssnano-utils": "^5.0.1", "postcss-selector-parser": "^7.1.0" @@ -16451,12 +18237,12 @@ } }, "node_modules/postcss-minify-params": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-7.0.3.tgz", - "integrity": "sha512-vUKV2+f5mtjewYieanLX0xemxIp1t0W0H/D11u+kQV/MWdygOO7xPMkbK+r9P6Lhms8MgzKARF/g5OPXhb8tgg==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-7.0.4.tgz", + "integrity": "sha512-3OqqUddfH8c2e7M35W6zIwv7jssM/3miF9cbCSb1iJiWvtguQjlxZGIHK9JRmc8XAKmE2PFGtHSM7g/VcW97sw==", "license": "MIT", "dependencies": { - "browserslist": "^4.24.5", + "browserslist": "^4.25.1", "cssnano-utils": "^5.0.1", "postcss-value-parser": "^4.2.0" }, @@ -16634,12 +18420,12 @@ } }, "node_modules/postcss-normalize-unicode": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-7.0.3.tgz", - "integrity": "sha512-EcoA29LvG3F+EpOh03iqu+tJY3uYYKzArqKJHxDhUYLa2u58aqGq16K6/AOsXD9yqLN8O6y9mmePKN5cx6krOw==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-7.0.4.tgz", + "integrity": "sha512-LvIURTi1sQoZqj8mEIE8R15yvM+OhbR1avynMtI9bUzj5gGKR/gfZFd8O7VMj0QgJaIFzxDwxGl/ASMYAkqO8g==", "license": "MIT", "dependencies": { - "browserslist": "^4.24.5", + "browserslist": "^4.25.1", "postcss-value-parser": "^4.2.0" }, "engines": { @@ -16696,12 +18482,12 @@ } }, "node_modules/postcss-reduce-initial": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-7.0.3.tgz", - "integrity": "sha512-RFvkZaqiWtGMlVjlUHpaxGqEL27lgt+Q2Ixjf83CRAzqdo+TsDyGPtJUbPx2MuYIJ+sCQc2TrOvRnhcXQfgIVA==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-7.0.4.tgz", + "integrity": "sha512-rdIC9IlMBn7zJo6puim58Xd++0HdbvHeHaPgXsimMfG1ijC5A9ULvNLSE0rUKVJOvNMcwewW4Ga21ngyJjY/+Q==", "license": "MIT", "dependencies": { - "browserslist": "^4.24.5", + "browserslist": "^4.25.1", "caniuse-api": "^3.0.0" }, "engines": { @@ -16740,13 +18526,13 @@ } }, "node_modules/postcss-svgo": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-7.0.2.tgz", - "integrity": "sha512-5Dzy66JlnRM6pkdOTF8+cGsB1fnERTE8Nc+Eed++fOWo1hdsBptCsbG8UuJkgtZt75bRtMJIrPeZmtfANixdFA==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-7.1.0.tgz", + "integrity": "sha512-KnAlfmhtoLz6IuU3Sij2ycusNs4jPW+QoFE5kuuUOK8awR6tMxZQrs5Ey3BUz7nFCzT3eqyFgqkyrHiaU2xx3w==", "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0", - "svgo": "^3.3.2" + "svgo": "^4.0.0" }, "engines": { "node": "^18.12.0 || ^20.9.0 || >= 18" @@ -16787,9 +18573,9 @@ } }, "node_modules/prettier": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz", - "integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", + "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", "dev": true, "license": "MIT", "bin": { @@ -16802,6 +18588,19 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/pretty-format": { "version": "30.0.5", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.0.5.tgz", @@ -17105,6 +18904,29 @@ "node": ">=8" } }, + "node_modules/redent/node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/redent/node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/reflect.getprototypeof": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", @@ -17148,6 +18970,16 @@ "node": ">=4" } }, + "node_modules/regexp-tree": { + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz", + "integrity": "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==", + "dev": true, + "license": "MIT", + "bin": { + "regexp-tree": "bin/regexp-tree" + } + }, "node_modules/regexp.prototype.flags": { "version": "1.5.4", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", @@ -17293,6 +19125,16 @@ "node": ">=8" } }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, "node_modules/restore-cursor": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", @@ -17565,6 +19407,12 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/sax": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", + "license": "ISC" + }, "node_modules/schema-utils": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", @@ -17811,6 +19659,61 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/sort-object-keys": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sort-object-keys/-/sort-object-keys-1.1.3.tgz", + "integrity": "sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/sort-package-json": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/sort-package-json/-/sort-package-json-3.4.0.tgz", + "integrity": "sha512-97oFRRMM2/Js4oEA9LJhjyMlde+2ewpZQf53pgue27UkbEXfHJnDzHlUxQ/DWUkzqmp7DFwJp8D+wi/TYeQhpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-indent": "^7.0.1", + "detect-newline": "^4.0.1", + "git-hooks-list": "^4.0.0", + "is-plain-obj": "^4.1.0", + "semver": "^7.7.1", + "sort-object-keys": "^1.1.3", + "tinyglobby": "^0.2.12" + }, + "bin": { + "sort-package-json": "cli.js" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/sort-package-json/node_modules/detect-newline": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-4.0.1.tgz", + "integrity": "sha512-qE3Veg1YXzGHQhlA6jzebZN2qVf6NX+A7m7qlhCGG30dJixrAQhYOsJjsnBjJkCSmuOPpCk30145fr8FV0bzog==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/sort-package-json/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -17852,6 +19755,17 @@ "spdx-license-ids": "^3.0.0" } }, + "node_modules/spdx-correct/node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, "node_modules/spdx-exceptions": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", @@ -17860,9 +19774,9 @@ "license": "CC-BY-3.0" }, "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz", + "integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==", "dev": true, "license": "MIT", "dependencies": { @@ -17959,6 +19873,16 @@ "node": ">=10" } }, + "node_modules/standard-version/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/standard-version/node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -18021,6 +19945,16 @@ "node": ">=10" } }, + "node_modules/standard-version/node_modules/detect-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/standard-version/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -18145,6 +20079,19 @@ "node": ">=8" } }, + "node_modules/standard-version/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/standard-version/node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -18252,21 +20199,44 @@ "dev": true, "license": "MIT", "engines": { - "node": ">=0.6.19" + "node": ">=0.6.19" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-length/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" } }, - "node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "node_modules/string-length/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=10" + "node": ">=8" } }, "node_modules/string-width": { @@ -18303,6 +20273,16 @@ "node": ">=8" } }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/string-width-cjs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -18320,33 +20300,17 @@ "node": ">=8" } }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "node": ">=8" } }, "node_modules/string.prototype.padend": { @@ -18436,16 +20400,19 @@ "license": "ISC" }, "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, "node_modules/strip-ansi-cjs": { @@ -18462,6 +20429,16 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/strip-bom": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", @@ -18483,16 +20460,19 @@ } }, "node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz", + "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==", "dev": true, "license": "MIT", "dependencies": { - "min-indent": "^1.0.0" + "min-indent": "^1.0.1" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/strip-json-comments": { @@ -18509,12 +20489,12 @@ } }, "node_modules/stylehacks": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-7.0.5.tgz", - "integrity": "sha512-5kNb7V37BNf0Q3w+1pxfa+oiNPS++/b4Jil9e/kPDgrk1zjEd6uR7SZeJiYaLYH6RRSC1XX2/37OTeU/4FvuIA==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-7.0.6.tgz", + "integrity": "sha512-iitguKivmsueOmTO0wmxURXBP8uqOO+zikLGZ7Mm9e/94R4w5T999Js2taS/KBOnQ/wdC3jN3vNSrkGDrlnqQg==", "license": "MIT", "dependencies": { - "browserslist": "^4.24.5", + "browserslist": "^4.25.1", "postcss-selector-parser": "^7.1.0" }, "engines": { @@ -18525,17 +20505,23 @@ } }, "node_modules/sugarss": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/sugarss/-/sugarss-4.0.1.tgz", - "integrity": "sha512-WCjS5NfuVJjkQzK10s8WOBY+hhDxxNt/N6ZaGwxFZ+wN3/lKKFSaaKUNecULcTTvE4urLcKaZFQD8vO0mOZujw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/sugarss/-/sugarss-5.0.0.tgz", + "integrity": "sha512-3//knMoF9btXcxHTbMRckIYjkEzSZ6pZjiaZ3wM6OIpUtQ06Uwqc0XgAr6jf+U74cLLTV/BEgmHWoeXPC+NhdQ==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", "engines": { - "node": ">=12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" + "node": ">=18.0" }, "peerDependencies": { "postcss": "^8.3.3" @@ -18567,24 +20553,24 @@ } }, "node_modules/svgo": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz", - "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-4.0.0.tgz", + "integrity": "sha512-VvrHQ+9uniE+Mvx3+C9IEe/lWasXCU0nXMY2kZeLrHNICuRiC8uMPyM14UEaMOFA5mhyQqEkB02VoQ16n3DLaw==", "license": "MIT", "dependencies": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", + "commander": "^11.1.0", "css-select": "^5.1.0", - "css-tree": "^2.3.1", + "css-tree": "^3.0.1", "css-what": "^6.1.0", "csso": "^5.0.5", - "picocolors": "^1.0.0" + "picocolors": "^1.1.1", + "sax": "^1.4.1" }, "bin": { - "svgo": "bin/svgo" + "svgo": "bin/svgo.js" }, "engines": { - "node": ">=14.0.0" + "node": ">=16" }, "funding": { "type": "opencollective", @@ -18592,21 +20578,21 @@ } }, "node_modules/svgo/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", "license": "MIT", "engines": { - "node": ">= 10" + "node": ">=16" } }, "node_modules/svgo/node_modules/css-tree": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", - "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", + "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", "license": "MIT", "dependencies": { - "mdn-data": "2.0.30", + "mdn-data": "2.12.2", "source-map-js": "^1.0.1" }, "engines": { @@ -18614,9 +20600,9 @@ } }, "node_modules/svgo/node_modules/mdn-data": { - "version": "2.0.30", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", - "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", + "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", "license": "CC0-1.0" }, "node_modules/synckit": { @@ -18646,9 +20632,9 @@ } }, "node_modules/terser": { - "version": "5.42.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.42.0.tgz", - "integrity": "sha512-UYCvU9YQW2f/Vwl+P0GfhxJxbUGLwd+5QrrGgLajzWAtC/23AX0vcise32kkP7Eu0Wu9VlzzHAXkLObgjQfFlQ==", + "version": "5.43.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.43.1.tgz", + "integrity": "sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -18776,13 +20762,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true, - "license": "MIT" - }, "node_modules/thingies": { "version": "1.21.0", "resolved": "https://registry.npmjs.org/thingies/-/thingies-1.21.0.tgz", @@ -18884,6 +20863,42 @@ "node": ">=8" } }, + "node_modules/ts-api-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/ts-declaration-location": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/ts-declaration-location/-/ts-declaration-location-1.0.7.tgz", + "integrity": "sha512-EDyGAwH1gO0Ausm9gV6T2nUvBgXT5kGoCMJPllOaooZ+4VvJiKBdZE7wK18N1deEowhcUptS+5GXZK8U/fvpwA==", + "dev": true, + "funding": [ + { + "type": "ko-fi", + "url": "https://ko-fi.com/rebeccastevens" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/ts-declaration-location" + } + ], + "license": "BSD-3-Clause", + "dependencies": { + "picomatch": "^4.0.2" + }, + "peerDependencies": { + "typescript": ">=4.0.0" + } + }, "node_modules/tsconfig-paths": { "version": "3.15.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", @@ -19158,6 +21173,65 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/unrs-resolver": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz", @@ -19265,6 +21339,17 @@ "spdx-expression-parse": "^3.0.0" } }, + "node_modules/validate-npm-package-license/node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, "node_modules/vscode-languageserver-textdocument": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz", @@ -19304,22 +21389,23 @@ } }, "node_modules/webpack": { - "version": "5.99.9", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.99.9.tgz", - "integrity": "sha512-brOPwM3JnmOa+7kd3NsmOUOwbDAj8FT9xDsG3IW0MgbN9yZV7Oi/s/+MNQ/EcSMqw7qfoRyXPoeEWT8zLVdVGg==", + "version": "5.101.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.101.0.tgz", + "integrity": "sha512-B4t+nJqytPeuZlHuIKTbalhljIFXeNRqrUGAQgTGlfOl2lXXKXw+yZu6bicycP+PUlM44CxBjCFD6aciKFT3LQ==", "dev": true, "license": "MIT", "dependencies": { "@types/eslint-scope": "^3.7.7", - "@types/estree": "^1.0.6", + "@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.14.0", + "acorn": "^8.15.0", + "acorn-import-phases": "^1.0.3", "browserslist": "^4.24.0", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.1", + "enhanced-resolve": "^5.17.2", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", @@ -19333,7 +21419,7 @@ "tapable": "^2.1.1", "terser-webpack-plugin": "^5.3.11", "watchpack": "^2.4.1", - "webpack-sources": "^3.2.3" + "webpack-sources": "^3.3.3" }, "bin": { "webpack": "bin/webpack.js" @@ -19352,9 +21438,9 @@ } }, "node_modules/webpack-sources": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.2.tgz", - "integrity": "sha512-ykKKus8lqlgXX/1WjudpIEjqsafjOTcOJqxnAbMLAu/KCsDCJ6GBtvscewvTkrn24HsnvFwrSCbenFrhtcCsAA==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", + "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", "dev": true, "license": "MIT", "engines": { @@ -19544,6 +21630,16 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -19612,17 +21708,17 @@ "node": ">=8" } }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", - "engines": { - "node": ">=12" + "dependencies": { + "ansi-regex": "^5.0.1" }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "engines": { + "node": ">=8" } }, "node_modules/wrap-ansi/node_modules/ansi-styles": { @@ -19638,22 +21734,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -19770,6 +21850,16 @@ "node": ">=12" } }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/yargs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -19802,6 +21892,19 @@ "node": ">=8" } }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", @@ -19814,6 +21917,17 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } } } } diff --git a/package.json b/package.json index a94505b..706b58d 100644 --- a/package.json +++ b/package.json @@ -43,13 +43,13 @@ "commitlint": "commitlint --from=master", "security": "npm audit", "lint:prettier": "prettier --cache --list-different .", - "lint:js": "eslint --cache .", + "lint:code": "eslint --cache .", "lint:spelling": "cspell --cache --no-must-find-files --quiet \"**/*.*\"", "lint:types": "tsc --pretty --noEmit", "lint": "npm-run-all -l -p \"lint:**\"", - "fix:js": "npm run lint:js -- --fix", + "fix:code": "npm run lint:code -- --fix", "fix:prettier": "npm run lint:prettier -- --write", - "fix": "npm-run-all -l fix:js fix:prettier", + "fix": "npm-run-all -l fix:code fix:prettier", "test:only": "cross-env NODE_ENV=test NODE_OPTIONS=\"--experimental-vm-modules\" jest", "test:watch": "npm run test:only -- --watch", "test:coverage": "npm run test:only -- --collectCoverageFrom=\"src/**/*.js\" --coverage", @@ -72,17 +72,18 @@ "@babel/preset-env": "^7.25.3", "@commitlint/cli": "^19.3.0", "@commitlint/config-conventional": "^19.2.2", + "@eslint/js": "^9.32.0", "@eslint/markdown": "^7.0.0", "@parcel/css": "^1.8.3", - "@stylistic/eslint-plugin": "^5.2.0", + "@stylistic/eslint-plugin": "^5.2.2", "@swc/css": "^0.0.28", "@types/clean-css": "^4.2.11", "@types/csso": "^5.0.4", "@types/node": "^20.14.9", "@types/serialize-javascript": "^5.0.4", - "babel-jest": "^29.7.0", + "babel-jest": "^30.0.5", "clean-css": "^5.3.3", - "copy-webpack-plugin": "^9.1.0", + "copy-webpack-plugin": "^13.0.0", "cross-env": "^7.0.3", "cspell": "^8.13.1", "css-loader": "^6.10.0", @@ -96,10 +97,11 @@ "eslint-config-webpack": "^4.4.1", "eslint-plugin-import": "^2.32.0", "eslint-plugin-jest": "^29.0.1", - "eslint-plugin-jsdoc": "^51.4.1", + "eslint-plugin-jsdoc": "^52.0.0", "eslint-plugin-n": "^17.21.0", "eslint-plugin-prettier": "^5.5.3", "eslint-plugin-unicorn": "^60.0.0", + "globals": "^16.3.0", "husky": "^9.1.4", "jest": "^30.0.5", "lightningcss": "^1.25.1", @@ -111,7 +113,7 @@ "sass": "^1.77.8", "sass-loader": "^16.0.5", "standard-version": "^9.5.0", - "sugarss": "^4.0.1", + "sugarss": "^5.0.0", "typescript": "^5.5.4", "webpack": "^5.93.0" }, diff --git a/src/index.js b/src/index.js index 7d0ff5c..0583051 100644 --- a/src/index.js +++ b/src/index.js @@ -21,7 +21,7 @@ const { /** @typedef {import("webpack").Compilation} Compilation */ /** @typedef {import("webpack").WebpackError} WebpackError */ /** @typedef {import("jest-worker").Worker} JestWorker */ -/** @typedef {import("@jridgewell/trace-mapping").EncodedSourceMap} RawSourceMap */ +/** @typedef {import("@jridgewell/trace-mapping").EncodedSourceMap & { sources: string[], sourcesContent?: string[], file: string }} RawSourceMap */ /** @typedef {import("webpack").Asset} Asset */ /** @typedef {import("postcss").ProcessOptions} ProcessOptions */ /** @typedef {import("postcss").Syntax} Syntax */ diff --git a/src/utils.js b/src/utils.js index 8e46227..09ccb82 100644 --- a/src/utils.js +++ b/src/utils.js @@ -1,5 +1,5 @@ /** @typedef {import("./index.js").Input} Input */ -/** @typedef {import("@jridgewell/trace-mapping").EncodedSourceMap} RawSourceMap */ +/** @typedef {import("./index.js").RawSourceMap} RawSourceMap */ /** @typedef {import("./index.js").MinimizedResult} MinimizedResult */ /** @typedef {import("./index.js").CustomOptions} CustomOptions */ /** @typedef {import("postcss").ProcessOptions} ProcessOptions */ @@ -180,7 +180,6 @@ async function cssnanoMinify( return { code: result.css, - map: result.map ? /** @type {RawSourceMap} */ ( /** @type {unknown} */ (result.map.toJSON()) diff --git a/test/__snapshots__/CssMinimizerPlugin.test.js.snap b/test/__snapshots__/CssMinimizerPlugin.test.js.snap index 4ed3e7e..fd2bc96 100644 --- a/test/__snapshots__/CssMinimizerPlugin.test.js.snap +++ b/test/__snapshots__/CssMinimizerPlugin.test.js.snap @@ -1,4 +1,4 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing exports[`CssMinimizerPlugin buildError method 1`] = ` [Error: test.css from Css Minimizer plugin @@ -61,15 +61,15 @@ exports[`CssMinimizerPlugin should build error: error 1`] = ` exports[`CssMinimizerPlugin should build error: warning 1`] = `[]`; -exports[`CssMinimizerPlugin should build warning: error 1`] = ` +exports[`CssMinimizerPlugin should build warning: error 1`] = `[]`; + +exports[`CssMinimizerPlugin should build warning: warning 1`] = ` [ - "Error: foo.css from Css Minimizer plugin -DataCloneError: [object Object] could not be cloned.", + "Warning: foo.css from Css Minimizer plugin +[warning-plugin] Warning webpack://./test/foo.css:2:2", ] `; -exports[`CssMinimizerPlugin should build warning: warning 1`] = `[]`; - exports[`CssMinimizerPlugin should respect the hash options #1: assets 1`] = ` { "entry.css": "a{text-align:center}", diff --git a/test/__snapshots__/minify-option.test.js.snap b/test/__snapshots__/minify-option.test.js.snap index f4c222b..c63c36b 100644 --- a/test/__snapshots__/minify-option.test.js.snap +++ b/test/__snapshots__/minify-option.test.js.snap @@ -190,7 +190,7 @@ exports[`"minify" option should work with "CssMinimizerPlugin.cssnanoMinify" min exports[`"minify" option should work with "CssMinimizerPlugin.cssnanoMinify" minifier and generate source maps: warning 1`] = `[]`; -exports[`"minify" option should work with "CssMinimizerPlugin.cssnanoMinify" minifier and parser option as "String": entry.js.map 1`] = `"{"version":3,"file":"entry.js","mappings":";;UAAA;UACA;;;;;WCDA;WACA;WACA;WACA;WACA,yCAAyC,wCAAwC;WACjF;WACA;WACA;;;;;WCPA;;;;;WCAA;WACA;WACA;WACA,uDAAuD,iBAAiB;WACxE;WACA,gDAAgD,aAAa;WAC7D;;;;;;;;;ACNO","sources":["webpack:///webpack/bootstrap","webpack:///webpack/runtime/define property getters","webpack:///webpack/runtime/hasOwnProperty shorthand","webpack:///webpack/runtime/make namespace object","webpack:///./sugarss.js"],"sourcesContent":["// The require scope\\nvar __webpack_require__ = {};\\n\\n","// define getter functions for harmony exports\\n__webpack_require__.d = (exports, definition) => {\\n\\tfor(var key in definition) {\\n\\t\\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\\n\\t\\t\\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\\n\\t\\t}\\n\\t}\\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\\n__webpack_require__.r = (exports) => {\\n\\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\\n\\t\\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\\n\\t}\\n\\tObject.defineProperty(exports, '__esModule', { value: true });\\n};","export const foo = 'foo';\\n"],"names":[],"sourceRoot":""}"`; +exports[`"minify" option should work with "CssMinimizerPlugin.cssnanoMinify" minifier and parser option as "String": entry.js.map 1`] = `"{"version":3,"file":"entry.js","mappings":";;UAAA;UACA;;;;;WCDA;WACA;WACA;WACA;WACA,yCAAyC,wCAAwC;WACjF;WACA;WACA,E;;;;;WCPA,wF;;;;;WCAA;WACA;WACA;WACA,uDAAuD,iBAAiB;WACxE;WACA,gDAAgD,aAAa;WAC7D,E;;;;;;;;;ACNO","sources":["webpack:///webpack/bootstrap","webpack:///webpack/runtime/define property getters","webpack:///webpack/runtime/hasOwnProperty shorthand","webpack:///webpack/runtime/make namespace object","webpack:///./sugarss.js"],"sourcesContent":["// The require scope\\nvar __webpack_require__ = {};\\n\\n","// define getter functions for harmony exports\\n__webpack_require__.d = (exports, definition) => {\\n\\tfor(var key in definition) {\\n\\t\\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\\n\\t\\t\\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\\n\\t\\t}\\n\\t}\\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\\n__webpack_require__.r = (exports) => {\\n\\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\\n\\t\\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\\n\\t}\\n\\tObject.defineProperty(exports, '__esModule', { value: true });\\n};","export const foo = 'foo';\\n"],"names":[],"sourceRoot":""}"`; exports[`"minify" option should work with "CssMinimizerPlugin.cssnanoMinify" minifier and parser option as "String": index.sss 1`] = `"a{color:#000}"`; diff --git a/test/__snapshots__/parallel-option.test.js.snap b/test/__snapshots__/parallel-option.test.js.snap index c1f34fc..8aa8af2 100644 --- a/test/__snapshots__/parallel-option.test.js.snap +++ b/test/__snapshots__/parallel-option.test.js.snap @@ -1,4 +1,4 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing exports[`parallel option should match snapshot for the "2" value: assets 1`] = ` { @@ -30,8 +30,6 @@ exports[`parallel option should match snapshot for the "true" value and the numb { "entry-0.css": "body{color:red}a{color:blue}", "entry-1.css": "body{color:red}a{color:blue}", - "entry-2.css": "body{color:red}a{color:blue}", - "entry-3.css": "body{color:red}a{color:blue}", } `; @@ -62,10 +60,6 @@ exports[`parallel option should match snapshot for the "true" value and the numb "entry-1.css": "body{color:red}a{color:blue}", "entry-2.css": "body{color:red}a{color:blue}", "entry-3.css": "body{color:red}a{color:blue}", - "entry-4.css": "body{color:red}a{color:blue}", - "entry-5.css": "body{color:red}a{color:blue}", - "entry-6.css": "body{color:red}a{color:blue}", - "entry-7.css": "body{color:red}a{color:blue}", } `; diff --git a/test/helpers/normalizeErrors.js b/test/helpers/normalizeErrors.js index f261182..80415b0 100644 --- a/test/helpers/normalizeErrors.js +++ b/test/helpers/normalizeErrors.js @@ -8,11 +8,11 @@ function removeCWD(str) { let normalizedStr = str; if (isWin) { - normalizedStr = normalizedStr.replace(/\\/g, "/"); - cwd = cwd.replace(/\\/g, "/"); + normalizedStr = normalizedStr.replaceAll("\\", "/"); + cwd = cwd.replaceAll("\\", "/"); } - return normalizedStr.replace(new RegExp(cwd, "g"), ""); + return normalizedStr.replaceAll(new RegExp(cwd, "g"), ""); } /** diff --git a/test/parallel-option.test.js b/test/parallel-option.test.js index b680124..f997314 100644 --- a/test/parallel-option.test.js +++ b/test/parallel-option.test.js @@ -13,7 +13,18 @@ import { readAssets, } from "./helpers"; -// Mock removed - using real values +jest.mock("node:os", () => { + const actualOs = jest.requireActual("os"); + const isAvailableParallelism = + typeof actualOs.availableParallelism !== "undefined"; + + const mocked = { + availableParallelism: isAvailableParallelism ? jest.fn(() => 4) : undefined, + cpus: jest.fn(() => ({ length: 4 })), + }; + + return { ...actualOs, ...mocked }; +}); // Based on https://github.com/facebook/jest/blob/edde20f75665c2b1e3c8937f758902b5cf28a7b4/packages/jest-runner/src/__tests__/test_runner.test.js let workerTransform; @@ -69,7 +80,7 @@ describe("parallel option", () => { expect(Worker).toHaveBeenCalledTimes(1); expect(Worker).toHaveBeenLastCalledWith(workerPath, { enableWorkerThreads: ENABLE_WORKER_THREADS, - numWorkers: 4, // Math.min(4 files, 7 cores) = 4 + numWorkers: getParallelism() - 1, }); expect(workerTransform).toHaveBeenCalledTimes( Object.keys(readAssets(compiler, stats, /\.css$/)).length, diff --git a/types/index.d.ts b/types/index.d.ts index f38391d..2be4ba1 100644 --- a/types/index.d.ts +++ b/types/index.d.ts @@ -45,7 +45,9 @@ declare class CssMinimizerPlugin { * @param {BasePluginOptions & DefinedDefaultMinimizerAndOptions=} options Plugin options */ constructor( - options?: BasePluginOptions & DefinedDefaultMinimizerAndOptions, + options?: + | (BasePluginOptions & DefinedDefaultMinimizerAndOptions) + | undefined, ); /** * @private @@ -126,7 +128,11 @@ type Compiler = import("webpack").Compiler; type Compilation = import("webpack").Compilation; type WebpackError = import("webpack").WebpackError; type JestWorker = import("jest-worker").Worker; -type RawSourceMap = import("@jridgewell/trace-mapping").EncodedSourceMap; +type RawSourceMap = import("@jridgewell/trace-mapping").EncodedSourceMap & { + sources: string[]; + sourcesContent?: string[]; + file: string; +}; type Asset = import("webpack").Asset; type ProcessOptions = import("postcss").ProcessOptions; type Syntax = import("postcss").Syntax; diff --git a/types/utils.d.ts b/types/utils.d.ts index 9a5868e..9e74381 100644 --- a/types/utils.d.ts +++ b/types/utils.d.ts @@ -1,123 +1,123 @@ export type Task = () => Promise; export type Input = import("./index.js").Input; -export type RawSourceMap = import("@jridgewell/trace-mapping").EncodedSourceMap; +export type RawSourceMap = import("./index.js").RawSourceMap; export type MinimizedResult = import("./index.js").MinimizedResult; export type CustomOptions = import("./index.js").CustomOptions; export type ProcessOptions = import("postcss").ProcessOptions; export type Postcss = import("postcss").Postcss; /** - * @template T - * @typedef {() => Promise} Task - */ -/** - * Run tasks with limited concurrency. - * @template T - * @param {number} limit - Limit of tasks that run at once. - * @param {Task[]} tasks - List of tasks to run. - * @returns {Promise} A promise that fulfills to an array of the results - */ -export function throttleAll(limit: number, tasks: Task[]): Promise; -/** - * @template T - * @param fn {(function(): any) | undefined} - * @returns {function(): T} + * @param {Input} input Input + * @param {RawSourceMap=} sourceMap Source map + * @param {CustomOptions=} minimizerOptions Minimizer options + * @returns {Promise} Promise with minimized result */ -export function memoize(fn: (() => any) | undefined): () => T; -/** - * @param {Input} input - * @param {RawSourceMap} [sourceMap] - * @param {CustomOptions} [minimizerOptions] - * @return {Promise} - */ -export function cssnanoMinify( +export function cleanCssMinify( input: Input, - sourceMap?: RawSourceMap, - minimizerOptions?: CustomOptions, + sourceMap?: RawSourceMap | undefined, + minimizerOptions?: CustomOptions | undefined, ): Promise; -export namespace cssnanoMinify { +export namespace cleanCssMinify { function supportsWorkerThreads(): boolean; } /** - * @param {Input} input - * @param {RawSourceMap} [sourceMap] - * @param {CustomOptions} [minimizerOptions] - * @return {Promise} + * @param {Input} input Input + * @param {RawSourceMap=} sourceMap Source map + * @param {CustomOptions=} minimizerOptions Minimizer options + * @returns {Promise} Promise with minimized result */ -export function cssoMinify( +export function cssnanoMinify( input: Input, - sourceMap?: RawSourceMap, - minimizerOptions?: CustomOptions, + sourceMap?: RawSourceMap | undefined, + minimizerOptions?: CustomOptions | undefined, ): Promise; -export namespace cssoMinify { +export namespace cssnanoMinify { function supportsWorkerThreads(): boolean; } /** - * @param {Input} input - * @param {RawSourceMap} [sourceMap] - * @param {CustomOptions} [minimizerOptions] - * @return {Promise} + * @param {Input} input Input + * @param {RawSourceMap=} sourceMap Source map + * @param {CustomOptions=} minimizerOptions Minimizer options + * @returns {Promise} Promise with minimized result */ -export function cleanCssMinify( +export function cssoMinify( input: Input, - sourceMap?: RawSourceMap, - minimizerOptions?: CustomOptions, + sourceMap?: RawSourceMap | undefined, + minimizerOptions?: CustomOptions | undefined, ): Promise; -export namespace cleanCssMinify { +export namespace cssoMinify { function supportsWorkerThreads(): boolean; } /** - * @param {Input} input - * @param {RawSourceMap} [sourceMap] - * @param {CustomOptions} [minimizerOptions] - * @return {Promise} + * @param {Input} input Input + * @param {RawSourceMap=} sourceMap Source map + * @param {CustomOptions=} minimizerOptions Minimizer options + * @returns {Promise} Promise with minimized result */ export function esbuildMinify( input: Input, - sourceMap?: RawSourceMap, - minimizerOptions?: CustomOptions, + sourceMap?: RawSourceMap | undefined, + minimizerOptions?: CustomOptions | undefined, ): Promise; export namespace esbuildMinify { function supportsWorkerThreads(): boolean; } /** - * @param {Input} input - * @param {RawSourceMap} [sourceMap] - * @param {CustomOptions} [minimizerOptions] - * @return {Promise} + * @param {Input} input Input + * @param {RawSourceMap=} sourceMap Source map + * @param {CustomOptions=} minimizerOptions Minimizer options + * @returns {Promise} Promise with minimized result */ -export function parcelCssMinify( +export function lightningCssMinify( input: Input, - sourceMap?: RawSourceMap, - minimizerOptions?: CustomOptions, + sourceMap?: RawSourceMap | undefined, + minimizerOptions?: CustomOptions | undefined, ): Promise; -export namespace parcelCssMinify { +export namespace lightningCssMinify { function supportsWorkerThreads(): boolean; } /** - * @param {Input} input - * @param {RawSourceMap} [sourceMap] - * @param {CustomOptions} [minimizerOptions] - * @return {Promise} + * @template T + * @param {(() => unknown) | undefined} fn Function to memoize + * @returns {() => T} Memoized function */ -export function lightningCssMinify( +export function memoize(fn: (() => unknown) | undefined): () => T; +/** + * @param {Input} input Input + * @param {RawSourceMap=} sourceMap Source map + * @param {CustomOptions=} minimizerOptions Minimizer options + * @returns {Promise} Promise with minimized result + */ +export function parcelCssMinify( input: Input, - sourceMap?: RawSourceMap, - minimizerOptions?: CustomOptions, + sourceMap?: RawSourceMap | undefined, + minimizerOptions?: CustomOptions | undefined, ): Promise; -export namespace lightningCssMinify { +export namespace parcelCssMinify { function supportsWorkerThreads(): boolean; } /** - * @param {Input} input - * @param {RawSourceMap} [sourceMap] - * @param {CustomOptions} [minimizerOptions] - * @return {Promise} + * @param {Input} input Input + * @param {RawSourceMap=} sourceMap Source map + * @param {CustomOptions=} minimizerOptions Minimizer options + * @returns {Promise} Promise with minimized result */ export function swcMinify( input: Input, - sourceMap?: RawSourceMap, - minimizerOptions?: CustomOptions, + sourceMap?: RawSourceMap | undefined, + minimizerOptions?: CustomOptions | undefined, ): Promise; export namespace swcMinify { function supportsWorkerThreads(): boolean; } +/** + * @template T + * @typedef {() => Promise} Task + */ +/** + * Run tasks with limited concurrency. + * @template T + * @param {number} limit Limit of tasks that run at once. + * @param {Task[]} tasks List of tasks to run. + * @returns {Promise} A promise that fulfills to an array of the results + */ +export function throttleAll(limit: number, tasks: Task[]): Promise;