diff --git a/README.md b/README.md index fd63f076505..a4b1440cbef 100644 --- a/README.md +++ b/README.md @@ -252,6 +252,18 @@ you full control of what is loaded initially and what is loaded at runtime through code splitting. It can also make your code chunks **cache friendly** by using hashes. +### Developer Tools + +If you're working on webpack itself, or building advanced plugins or integrations, the tools below can help you explore internal mechanics, debug plugin life-cycles, and build custom tooling. + +#### Instrumentation + +| Name | Status | Description | +| --------------------------------------------------------- | --------------------- | --------------------------------------------------------------------------------------------------------------------------------- | +| [tapable-tracer](https://github.com/ertgl/tapable-tracer) | ![tapable-tracer-npm] | Traces tapable hook execution in real-time and collects structured stack frames. Can export to UML for generating visualizations. | + +[tapable-tracer-npm]: https://img.shields.io/npm/v/tapable-tracer.svg +

Contributing

**We want contributing to webpack to be fun, enjoyable, and educational for anyone, and everyone.** We have a [vibrant ecosystem](https://medium.com/webpack/contributors-guide/home) that spans beyond this single repo. We welcome you to check out any of the repositories in [our organization](https://github.com/webpack) or [webpack-contrib organization](https://github.com/webpack-contrib) which houses all of our loaders and plugins. diff --git a/lib/ConcatenationScope.js b/lib/ConcatenationScope.js index 76b0a1dde56..e14add3899f 100644 --- a/lib/ConcatenationScope.js +++ b/lib/ConcatenationScope.js @@ -30,8 +30,9 @@ class ConcatenationScope { /** * @param {ModuleInfo[] | Map} modulesMap all module info by module * @param {ConcatenatedModuleInfo} currentModule the current module info + * @param {Set} usedNames all used names */ - constructor(modulesMap, currentModule) { + constructor(modulesMap, currentModule, usedNames) { this._currentModule = currentModule; if (Array.isArray(modulesMap)) { const map = new Map(); @@ -40,6 +41,7 @@ class ConcatenationScope { } modulesMap = map; } + this.usedNames = usedNames; this._modulesMap = modulesMap; } @@ -77,6 +79,30 @@ class ConcatenationScope { } } + /** + * @param {string} exportName name of the export + * @returns {string | undefined} the expression of the export + */ + getRawExport(exportName) { + if (!this._currentModule.rawExportMap) { + return undefined; + } + return this._currentModule.rawExportMap.get(exportName); + } + + /** + * @param {string} exportName name of the export + * @param {string} expression expression to be used + */ + setRawExportMap(exportName, expression) { + if (!this._currentModule.rawExportMap) { + this._currentModule.rawExportMap = new Map(); + } + if (this._currentModule.rawExportMap.has(exportName)) { + this._currentModule.rawExportMap.set(exportName, expression); + } + } + /** * @param {string} symbol identifier of the export in source code */ @@ -84,6 +110,18 @@ class ConcatenationScope { this._currentModule.namespaceExportSymbol = symbol; } + /** + * @param {string} symbol identifier of the export in source code + * @returns {boolean} registered success + */ + registerUsedName(symbol) { + if (this.usedNames.has(symbol)) { + return false; + } + this.usedNames.add(symbol); + return true; + } + /** * @param {Module} module the referenced module * @param {Partial} options options diff --git a/lib/ExternalModule.js b/lib/ExternalModule.js index ced3598d3f7..de7b38919fe 100644 --- a/lib/ExternalModule.js +++ b/lib/ExternalModule.js @@ -75,8 +75,11 @@ const { register } = require("./util/serialization"); * @property {string} expression * @property {InitFragment[]=} chunkInitFragments * @property {ReadOnlyRuntimeRequirements=} runtimeRequirements + * @property {[string, string][]=} specifiers */ +/** @typedef {true | [string, string][]} Imported */ + const RUNTIME_REQUIREMENTS = new Set([RuntimeGlobals.module]); const RUNTIME_REQUIREMENTS_FOR_SCRIPT = new Set([RuntimeGlobals.loadScript]); const RUNTIME_REQUIREMENTS_FOR_MODULE = new Set([ @@ -220,10 +223,9 @@ const getSourceForImportExternal = ( }; /** - * @template {{ [key: string]: string }} T - * @param {keyof T} key key - * @param {T[keyof T]} value value - * @returns {undefined | T[keyof T]} replaced value + * @param {string} key key + * @param {ImportAttributes | string | boolean | undefined} value value + * @returns {ImportAttributes | string | boolean | undefined} replaced value */ const importAssertionReplacer = (key, value) => { if (key === "_isLegacyAssert") { @@ -234,17 +236,19 @@ const importAssertionReplacer = (key, value) => { }; /** - * @extends {InitFragment} + * @extends {InitFragment} */ class ModuleExternalInitFragment extends InitFragment { /** * @param {string} request import source + * @param {Imported} imported the imported specifiers * @param {string=} ident recomputed ident * @param {ImportDependencyMeta=} dependencyMeta the dependency meta * @param {HashFunction=} hashFunction the hash function to use */ constructor( request, + imported, ident, dependencyMeta, hashFunction = DEFAULTS.HASH_FUNCTION @@ -258,28 +262,78 @@ class ModuleExternalInitFragment extends InitFragment { .slice(0, 8)}`; } } + const identifier = `__WEBPACK_EXTERNAL_MODULE_${ident}__`; super( - `import * as ${identifier} from ${JSON.stringify(request)}${ - dependencyMeta && dependencyMeta.attributes - ? dependencyMeta.attributes._isLegacyAssert - ? ` assert ${JSON.stringify( - dependencyMeta.attributes, - importAssertionReplacer - )}` - : ` with ${JSON.stringify(dependencyMeta.attributes)}` - : "" - };\n`, + "", InitFragment.STAGE_HARMONY_IMPORTS, 0, - `external module import ${ident}` + `external module import ${ident} ${imported === true ? imported : imported.join(" ")}` ); this._ident = ident; this._request = request; - this._dependencyMeta = request; + this._dependencyMeta = dependencyMeta; + this._imported = imported; this._identifier = identifier; } + /** + * @returns {Imported} imported + */ + getImported() { + return this._imported; + } + + /** + * @param {Imported} imported imported + */ + setImported(imported) { + this._imported = imported; + } + + /** + * @param {GenerateContext} context context + * @returns {string | Source | undefined} the source code that will be included as initialization code + */ + getContent(context) { + const { + _dependencyMeta: dependencyMeta, + _imported: imported, + _request: request, + _identifier: identifier + } = this; + const attributes = + dependencyMeta && dependencyMeta.attributes + ? dependencyMeta.attributes._isLegacyAssert && + dependencyMeta.attributes._isLegacyAssert + ? ` assert ${JSON.stringify( + dependencyMeta.attributes, + importAssertionReplacer + )}` + : ` with ${JSON.stringify(dependencyMeta.attributes)}` + : ""; + let content = ""; + if (imported === true) { + // namespace + content = `import * as ${identifier} from ${JSON.stringify(request)}${ + attributes + };\n`; + } else if (imported.length === 0) { + // just import, no use + content = `import ${JSON.stringify(request)}${attributes};\n`; + } else { + content = `import { ${imported + .map(([name, finalName]) => { + if (name !== finalName) { + return `${name} as ${finalName}`; + } + return name; + }) + .join(", ")} } from ${JSON.stringify(request)}${attributes};\n`; + } + return content; + } + getNamespaceIdentifier() { return this._identifier; } @@ -292,11 +346,12 @@ register( { serialize(obj, { write }) { write(obj._request); + write(obj._imported); write(obj._ident); write(obj._dependencyMeta); }, deserialize({ read }) { - return new ModuleExternalInitFragment(read(), read(), read()); + return new ModuleExternalInitFragment(read(), read(), read(), read()); } } ); @@ -348,6 +403,7 @@ const generateModuleRemapping = ( * @param {RuntimeSpec} runtime the runtime * @param {RuntimeTemplate} runtimeTemplate the runtime template * @param {ImportDependencyMeta} dependencyMeta the dependency meta + * @param {ConcatenationScope=} concatenationScope concatenationScope * @returns {SourceData} the generated source */ const getSourceForModuleExternal = ( @@ -355,28 +411,71 @@ const getSourceForModuleExternal = ( exportsInfo, runtime, runtimeTemplate, - dependencyMeta + dependencyMeta, + concatenationScope ) => { if (!Array.isArray(moduleAndSpecifiers)) { moduleAndSpecifiers = [moduleAndSpecifiers]; } + + /** @type {Imported} */ + let imported = true; + if (concatenationScope) { + const usedExports = exportsInfo.getUsedExports(runtime); + switch (usedExports) { + case true: + case null: + // unknown exports + imported = true; + break; + case false: + // no used exports + imported = []; + break; + default: + imported = []; + if (exportsInfo.isUsed(runtime) === false) { + // no used, only + } + for (const [name] of usedExports.entries()) { + let counter = 0; + let finalName = name; + + if (concatenationScope) { + while (!concatenationScope.registerUsedName(finalName)) { + finalName = `${name}_${counter++}`; + } + } + imported.push([name, finalName]); + } + } + } + const initFragment = new ModuleExternalInitFragment( moduleAndSpecifiers[0], + imported, undefined, dependencyMeta, runtimeTemplate.outputOptions.hashFunction ); + const specifiers = imported === true ? undefined : imported; const baseAccess = `${initFragment.getNamespaceIdentifier()}${propertyAccess( moduleAndSpecifiers, 1 )}`; - const moduleRemapping = generateModuleRemapping( - baseAccess, - exportsInfo, - runtime, - runtimeTemplate - ); - const expression = moduleRemapping || baseAccess; + let expression = baseAccess; + + const useNamespace = imported === true; + let moduleRemapping; + if (useNamespace) { + moduleRemapping = generateModuleRemapping( + baseAccess, + exportsInfo, + runtime, + runtimeTemplate + ); + expression = moduleRemapping || baseAccess; + } return { expression, init: moduleRemapping @@ -388,10 +487,13 @@ const getSourceForModuleExternal = ( "x" )}` : undefined, + specifiers, runtimeRequirements: moduleRemapping ? RUNTIME_REQUIREMENTS_FOR_MODULE : undefined, - chunkInitFragments: [initFragment] + chunkInitFragments: [ + /** @type {InitFragment} */ (initFragment) + ] }; }; @@ -738,6 +840,7 @@ class ExternalModule extends Module { * @param {ChunkGraph} chunkGraph the chunk graph * @param {RuntimeSpec} runtime the runtime * @param {DependencyMeta | undefined} dependencyMeta the dependency meta + * @param {ConcatenationScope=} concatenationScope concatenationScope * @returns {SourceData} the source data */ _getSourceData( @@ -747,7 +850,8 @@ class ExternalModule extends Module { moduleGraph, chunkGraph, runtime, - dependencyMeta + dependencyMeta, + concatenationScope ) { switch (externalType) { case "this": @@ -817,7 +921,8 @@ class ExternalModule extends Module { moduleGraph.getExportsInfo(this), runtime, runtimeTemplate, - /** @type {ImportDependencyMeta} */ (dependencyMeta) + /** @type {ImportDependencyMeta} */ (dependencyMeta), + concatenationScope ); } case "var": @@ -897,14 +1002,24 @@ class ExternalModule extends Module { moduleGraph, chunkGraph, runtime, - this.dependencyMeta + this.dependencyMeta, + concatenationScope ); + // sourceString can be empty str only when there is concatenationScope let sourceString = sourceData.expression; if (sourceData.iife) { sourceString = `(function() { return ${sourceString}; }())`; } - if (concatenationScope) { + + const specifiers = sourceData.specifiers; + if (specifiers) { + sourceString = ""; + const scope = /** @type {ConcatenationScope} */ (concatenationScope); + for (const [specifier, finalName] of specifiers) { + scope.registerRawExport(specifier, finalName); + } + } else if (concatenationScope) { sourceString = `${ runtimeTemplate.supportsConst() ? "const" : "var" } ${ConcatenationScope.NAMESPACE_OBJECT_EXPORT} = ${sourceString};`; @@ -1010,3 +1125,4 @@ class ExternalModule extends Module { makeSerializable(ExternalModule, "webpack/lib/ExternalModule"); module.exports = ExternalModule; +module.exports.ModuleExternalInitFragment = ModuleExternalInitFragment; diff --git a/lib/ExternalsPlugin.js b/lib/ExternalsPlugin.js index 87b692e7fed..b713357ec3c 100644 --- a/lib/ExternalsPlugin.js +++ b/lib/ExternalsPlugin.js @@ -5,10 +5,13 @@ "use strict"; +const { ModuleExternalInitFragment } = require("./ExternalModule"); const ExternalModuleFactoryPlugin = require("./ExternalModuleFactoryPlugin"); +const ConcatenatedModule = require("./optimize/ConcatenatedModule"); /** @typedef {import("../declarations/WebpackOptions").Externals} Externals */ /** @typedef {import("./Compiler")} Compiler */ +/** @typedef {import("./optimize/ConcatenatedModule").ConcatenatedModuleInfo} ConcatenatedModuleInfo */ const PLUGIN_NAME = "ExternalsPlugin"; @@ -33,6 +36,48 @@ class ExternalsPlugin { normalModuleFactory ); }); + + compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation) => { + const { concatenatedModuleInfo } = + ConcatenatedModule.getCompilationHooks(compilation); + concatenatedModuleInfo.tap(PLUGIN_NAME, (updatedInfo, moduleInfo) => { + const rawExportMap = + /** @type {ConcatenatedModuleInfo} */ updatedInfo.rawExportMap; + + if (!rawExportMap) { + return; + } + + const chunkInitFragments = + /** @type {ConcatenatedModuleInfo} */ moduleInfo.chunkInitFragments; + const moduleExternalInitFragments = chunkInitFragments + ? chunkInitFragments.filter( + (fragment) => fragment instanceof ModuleExternalInitFragment + ) + : []; + + let initFragmentChanged = false; + + for (const fragment of moduleExternalInitFragments) { + const imported = fragment.getImported(); + + if (Array.isArray(imported)) { + const newImported = imported.map(([specifier, finalName]) => [ + specifier, + rawExportMap.has(specifier) + ? rawExportMap.get(specifier) + : finalName + ]); + fragment.setImported(newImported); + initFragmentChanged = true; + } + } + + if (initFragmentChanged) { + return true; + } + }); + }); } } diff --git a/lib/FileSystemInfo.js b/lib/FileSystemInfo.js index 88b1e246638..8ae2f7ffc20 100644 --- a/lib/FileSystemInfo.js +++ b/lib/FileSystemInfo.js @@ -15,6 +15,7 @@ const StackedCacheMap = require("./util/StackedCacheMap"); const createHash = require("./util/createHash"); const { dirname, join, lstatReadlinkAbsolute, relative } = require("./util/fs"); const makeSerializable = require("./util/makeSerializable"); +const memoize = require("./util/memoize"); const processAsyncTree = require("./util/processAsyncTree"); /** @typedef {import("enhanced-resolve").Resolver} Resolver */ @@ -1039,6 +1040,8 @@ const addAll = (source, target) => { for (const key of source) target.add(key); }; +const getEsModuleLexer = memoize(() => require("es-module-lexer")); + /** @typedef {Set} LoggedPaths */ /** @typedef {FileSystemInfoEntry | "ignore" | null} FileTimestamp */ @@ -1935,7 +1938,7 @@ class FileSystemInfo { this._warnAboutExperimentalEsmTracking = true; } - const lexer = require("es-module-lexer"); + const lexer = getEsModuleLexer(); lexer.init.then(() => { this.fs.readFile(path, (err, content) => { diff --git a/lib/InitFragment.js b/lib/InitFragment.js index 228f592a4ff..e06f8e906b6 100644 --- a/lib/InitFragment.js +++ b/lib/InitFragment.js @@ -173,6 +173,12 @@ makeSerializable(InitFragment, "webpack/lib/InitFragment"); InitFragment.prototype.merge = /** @type {TODO} */ (undefined); +InitFragment.prototype.getImported = + /** @type {TODO} */ + (undefined); +InitFragment.prototype.setImported = + /** @type {TODO} */ + (undefined); InitFragment.STAGE_CONSTANTS = 10; InitFragment.STAGE_ASYNC_BOUNDARY = 20; diff --git a/lib/ModuleGraph.js b/lib/ModuleGraph.js index 2ebcebd61b7..20bf162c142 100644 --- a/lib/ModuleGraph.js +++ b/lib/ModuleGraph.js @@ -11,6 +11,7 @@ const ModuleGraphConnection = require("./ModuleGraphConnection"); const SortableSet = require("./util/SortableSet"); const WeakTupleMap = require("./util/WeakTupleMap"); const { sortWithSourceOrder } = require("./util/comparators"); +const memoize = require("./util/memoize"); /** @typedef {import("./Compilation").ModuleMemCaches} ModuleMemCaches */ /** @typedef {import("./DependenciesBlock")} DependenciesBlock */ @@ -24,6 +25,10 @@ const { sortWithSourceOrder } = require("./util/comparators"); /** @typedef {import("./dependencies/HarmonyImportSpecifierDependency")} HarmonyImportSpecifierDependency */ /** @typedef {import("./util/comparators").DependencySourceOrder} DependencySourceOrder */ +const getCommonJsSelfReferenceDependency = memoize(() => + require("./dependencies/CommonJsSelfReferenceDependency") +); + /** * @callback OptimizationBailoutFunction * @param {RequestShortener} requestShortener @@ -840,8 +845,7 @@ class ModuleGraph { for (const connection of connections) { if ( !connection.dependency || - connection.dependency instanceof - require("./dependencies/CommonJsSelfReferenceDependency") + connection.dependency instanceof getCommonJsSelfReferenceDependency() ) { continue; } diff --git a/lib/RuntimeGlobals.js b/lib/RuntimeGlobals.js index 753d6891ea4..26178a0e5df 100644 --- a/lib/RuntimeGlobals.js +++ b/lib/RuntimeGlobals.js @@ -109,6 +109,26 @@ module.exports.ensureChunkIncludeEntries = */ module.exports.entryModuleId = "__webpack_require__.s"; +/** + * esm module id + */ +module.exports.esmId = "__webpack_esm_id__"; + +/** + * esm module ids + */ +module.exports.esmIds = "__webpack_esm_ids__"; + +/** + * esm modules + */ +module.exports.esmModules = "__webpack_esm_modules__"; + +/** + * esm runtime + */ +module.exports.esmRuntime = "__webpack_esm_runtime__"; + /** * the internal exports object */ diff --git a/lib/config/defaults.js b/lib/config/defaults.js index 0c07d87424f..05cda8c4f53 100644 --- a/lib/config/defaults.js +++ b/lib/config/defaults.js @@ -384,6 +384,7 @@ const applyExperimentsDefaults = ( D(experiments, "lazyCompilation", undefined); D(experiments, "buildHttp", undefined); D(experiments, "cacheUnaffected", experiments.futureDefaults); + D(experiments, "deferImport", false); F(experiments, "css", () => (experiments.futureDefaults ? true : undefined)); // TODO webpack 6: remove this. topLevelAwait should be enabled by default diff --git a/lib/css/CssGenerator.js b/lib/css/CssGenerator.js index 97ce9f34592..56cbc5d607f 100644 --- a/lib/css/CssGenerator.js +++ b/lib/css/CssGenerator.js @@ -18,6 +18,7 @@ const { } = require("../ModuleSourceTypesConstants"); const RuntimeGlobals = require("../RuntimeGlobals"); const Template = require("../Template"); +const memoize = require("../util/memoize"); /** @typedef {import("webpack-sources").Source} Source */ /** @typedef {import("../../declarations/WebpackOptions").CssAutoGeneratorOptions} CssAutoGeneratorOptions */ @@ -37,6 +38,8 @@ const Template = require("../Template"); /** @typedef {import("../NormalModule")} NormalModule */ /** @typedef {import("../util/Hash")} Hash */ +const getPropertyName = memoize(() => require("../util/propertyName")); + class CssGenerator extends Generator { /** * @param {CssAutoGeneratorOptions | CssGlobalGeneratorOptions | CssModuleGeneratorOptions} options options @@ -147,6 +150,7 @@ class CssGenerator extends Generator { if (generateContext.concatenationScope) { const source = new ConcatSource(); const usedIdentifiers = new Set(); + const { RESERVED_IDENTIFIER } = getPropertyName(); for (const [name, v] of cssData.exports) { const usedName = generateContext.moduleGraph .getExportInfo(module, name) @@ -156,8 +160,6 @@ class CssGenerator extends Generator { } let identifier = Template.toIdentifier(usedName); - const { RESERVED_IDENTIFIER } = require("../util/propertyName"); - if (RESERVED_IDENTIFIER.has(identifier)) { identifier = `_${identifier}`; } diff --git a/lib/dependencies/HarmonyExportDependencyParserPlugin.js b/lib/dependencies/HarmonyExportDependencyParserPlugin.js index dfb9f54639f..eb6162d366e 100644 --- a/lib/dependencies/HarmonyExportDependencyParserPlugin.js +++ b/lib/dependencies/HarmonyExportDependencyParserPlugin.js @@ -77,13 +77,16 @@ module.exports = class HarmonyExportDependencyParserPlugin { clearDep.loc = /** @type {DependencyLocation} */ (statement.loc); clearDep.loc.index = -1; parser.state.module.addPresentationalDependency(clearDep); - const { defer } = getImportMode(parser, statement); - if (defer) { - const error = new WebpackError( - "Deferred re-export (`export defer * as namespace from '...'`) is not a part of the Import Defer proposal.\nUse the following code instead:\n import defer * as namespace from '...';\n export { namespace };" - ); - error.loc = statement.loc || undefined; - parser.state.current.addError(error); + let defer = false; + if (this.deferImport) { + ({ defer } = getImportMode(parser, statement)); + if (defer) { + const error = new WebpackError( + "Deferred re-export (`export defer * as namespace from '...'`) is not a part of the Import Defer proposal.\nUse the following code instead:\n import defer * as namespace from '...';\n export { namespace };" + ); + error.loc = statement.loc || undefined; + parser.state.current.addError(error); + } } const sideEffectDep = new HarmonyImportSideEffectDependency( /** @type {string} */ (source), @@ -202,7 +205,9 @@ module.exports = class HarmonyExportDependencyParserPlugin { parser.state.harmonyStarExports || new HarmonyStarExportsList(); } const attributes = getImportAttributes(statement); - const { defer } = getImportMode(parser, statement); + const defer = this.deferImport + ? getImportMode(parser, statement).defer + : false; const dep = new HarmonyExportImportedSpecifierDependency( /** @type {string} */ (source), diff --git a/lib/dependencies/HarmonyImportDependencyParserPlugin.js b/lib/dependencies/HarmonyImportDependencyParserPlugin.js index 4e131dda382..45a230c23c9 100644 --- a/lib/dependencies/HarmonyImportDependencyParserPlugin.js +++ b/lib/dependencies/HarmonyImportDependencyParserPlugin.js @@ -124,17 +124,20 @@ module.exports = class HarmonyImportDependencyParserPlugin { parser.state.module.addPresentationalDependency(clearDep); parser.unsetAsiPosition(/** @type {Range} */ (statement.range)[1]); const attributes = getImportAttributes(statement); - const { defer } = getImportMode(parser, statement); - if ( - defer && - (statement.specifiers.length !== 1 || - statement.specifiers[0].type !== "ImportNamespaceSpecifier") - ) { - const error = new WebpackError( - "Deferred import can only be used with `import * as namespace from '...'` syntax." - ); - error.loc = statement.loc || undefined; - parser.state.current.addError(error); + let defer = false; + if (this.deferImport) { + ({ defer } = getImportMode(parser, statement)); + if ( + defer && + (statement.specifiers.length !== 1 || + statement.specifiers[0].type !== "ImportNamespaceSpecifier") + ) { + const error = new WebpackError( + "Deferred import can only be used with `import * as namespace from '...'` syntax." + ); + error.loc = statement.loc || undefined; + parser.state.current.addError(error); + } } const sideEffectDep = new HarmonyImportSideEffectDependency( /** @type {string} */ (source), @@ -150,7 +153,9 @@ module.exports = class HarmonyImportDependencyParserPlugin { PLUGIN_NAME, (statement, source, id, name) => { const ids = id === null ? [] : [id]; - const { defer } = getImportMode(parser, statement); + const defer = this.deferImport + ? getImportMode(parser, statement).defer + : false; parser.tagVariable(name, harmonySpecifierTag, { name, source, @@ -391,7 +396,7 @@ module.exports = class HarmonyImportDependencyParserPlugin { /** * @param {JavascriptParser} parser parser * @param {ExportNamedDeclaration | ExportAllDeclaration | ImportDeclaration} node node - * @returns {{defer: boolean}} import attributes + * @returns {{ defer: boolean }} import attributes */ function getImportMode(parser, node) { const result = { defer: "phase" in node && node.phase === "defer" }; diff --git a/lib/esm/ModuleChunkFormatPlugin.js b/lib/esm/ModuleChunkFormatPlugin.js index f6a6331b4f2..8d26a4314b8 100644 --- a/lib/esm/ModuleChunkFormatPlugin.js +++ b/lib/esm/ModuleChunkFormatPlugin.js @@ -196,17 +196,17 @@ class ModuleChunkFormatPlugin { const hotUpdateChunk = chunk instanceof HotUpdateChunk ? chunk : null; const source = new ConcatSource(); source.add( - `export const __webpack_id__ = ${JSON.stringify(chunk.id)};\n` + `export const ${RuntimeGlobals.esmId} = ${JSON.stringify(chunk.id)};\n` ); source.add( - `export const __webpack_ids__ = ${JSON.stringify(chunk.ids)};\n` + `export const ${RuntimeGlobals.esmIds} = ${JSON.stringify(chunk.ids)};\n` ); - source.add("export const __webpack_modules__ = "); + source.add(`export const ${RuntimeGlobals.esmModules} = `); source.add(modules); source.add(";\n"); const runtimeModules = chunkGraph.getChunkRuntimeModulesInOrder(chunk); if (runtimeModules.length > 0) { - source.add("export const __webpack_runtime__ =\n"); + source.add(`export const ${RuntimeGlobals.esmRuntime} =\n`); source.add( Template.renderChunkRuntimeModules(runtimeModules, renderContext) ); diff --git a/lib/esm/ModuleChunkLoadingRuntimeModule.js b/lib/esm/ModuleChunkLoadingRuntimeModule.js index cd2b8e61b37..3df1e1e3a95 100644 --- a/lib/esm/ModuleChunkLoadingRuntimeModule.js +++ b/lib/esm/ModuleChunkLoadingRuntimeModule.js @@ -168,29 +168,33 @@ class ModuleChunkLoadingRuntimeModule extends RuntimeModule { withLoading || withExternalInstallChunk ? `var installChunk = ${runtimeTemplate.basicFunction("data", [ runtimeTemplate.destructureObject( - ["__webpack_ids__", "__webpack_modules__", "__webpack_runtime__"], + [ + RuntimeGlobals.esmIds, + RuntimeGlobals.esmModules, + RuntimeGlobals.esmRuntime + ], "data" ), '// add "modules" to the modules object,', '// then flag all "ids" as loaded and fire callback', "var moduleId, chunkId, i = 0;", - "for(moduleId in __webpack_modules__) {", + `for(moduleId in ${RuntimeGlobals.esmModules}) {`, Template.indent([ - `if(${RuntimeGlobals.hasOwnProperty}(__webpack_modules__, moduleId)) {`, + `if(${RuntimeGlobals.hasOwnProperty}(${RuntimeGlobals.esmModules}, moduleId)) {`, Template.indent( - `${RuntimeGlobals.moduleFactories}[moduleId] = __webpack_modules__[moduleId];` + `${RuntimeGlobals.moduleFactories}[moduleId] = ${RuntimeGlobals.esmModules}[moduleId];` ), "}" ]), "}", - `if(__webpack_runtime__) __webpack_runtime__(${RuntimeGlobals.require});`, - "for(;i < __webpack_ids__.length; i++) {", + `if(${RuntimeGlobals.esmRuntime}) ${RuntimeGlobals.esmRuntime}(${RuntimeGlobals.require});`, + `for(;i < ${RuntimeGlobals.esmIds}.length; i++) {`, Template.indent([ - "chunkId = __webpack_ids__[i];", + `chunkId = ${RuntimeGlobals.esmIds}[i];`, `if(${RuntimeGlobals.hasOwnProperty}(installedChunks, chunkId) && installedChunks[chunkId]) {`, Template.indent("installedChunks[chunkId][0]();"), "}", - "installedChunks[__webpack_ids__[i]] = 0;" + `installedChunks[${RuntimeGlobals.esmIds}[i]] = 0;` ]), "}", withOnChunkLoad ? `${RuntimeGlobals.onChunksLoaded}();` : "" @@ -365,8 +369,8 @@ class ModuleChunkLoadingRuntimeModule extends RuntimeModule { "// start update chunk loading", `var url = ${RuntimeGlobals.publicPath} + ${RuntimeGlobals.getChunkUpdateScriptFilename}(chunkId);`, `var onResolve = ${runtimeTemplate.basicFunction("obj", [ - "var updatedModules = obj.__webpack_modules__;", - "var updatedRuntime = obj.__webpack_runtime__;", + `var updatedModules = obj.${RuntimeGlobals.esmModules};`, + `var updatedRuntime = obj.${RuntimeGlobals.esmRuntime};`, "if(updatedRuntime) currentUpdateRuntime.push(updatedRuntime);", "for(var moduleId in updatedModules) {", Template.indent([ diff --git a/lib/optimize/ConcatenatedModule.js b/lib/optimize/ConcatenatedModule.js index 417f025a95f..f1703343e2e 100644 --- a/lib/optimize/ConcatenatedModule.js +++ b/lib/optimize/ConcatenatedModule.js @@ -66,6 +66,7 @@ const { /** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */ /** @typedef {import("../DependencyTemplates")} DependencyTemplates */ /** @typedef {import("../ExportsInfo").ExportInfo} ExportInfo */ +/** @typedef {import("../ExternalModule")} ExternalModule */ /** @typedef {import("../Module").BuildCallback} BuildCallback */ /** @typedef {import("../Module").BuildInfo} BuildInfo */ /** @typedef {import("../Module").BuildMeta} BuildMeta */ @@ -94,7 +95,6 @@ const { /** @typedef {import("../util/fs").InputFileSystem} InputFileSystem */ /** @typedef {import("../util/identifier").AssociatedObjectForCache} AssociatedObjectForCache */ /** @typedef {import("../util/runtime").RuntimeSpec} RuntimeSpec */ - /** * @template T * @typedef {import("../InitFragment")} InitFragment @@ -159,6 +159,7 @@ if (!ReferencerClass.prototype.PropertyDefinition) { * @property {Map | undefined} rawExportMap * @property {string=} namespaceExportSymbol * @property {string | undefined} namespaceObjectName + * @property {ConcatenationScope | undefined} concatenationScope * @property {boolean} interopNamespaceObjectUsed "default-with-named" namespace * @property {string | undefined} interopNamespaceObjectName "default-with-named" namespace * @property {boolean} interopNamespaceObject2Used "default-only" namespace @@ -668,6 +669,7 @@ const getFinalName = ( /** * @typedef {object} ConcatenateModuleHooks * @property {SyncBailHook<[Record, ConcatenatedModule], boolean | void>} exportsDefinitions + * @property {SyncBailHook<[Partial, ConcatenatedModuleInfo], boolean | void>} concatenatedModuleInfo */ /** @type {WeakMap} */ @@ -714,7 +716,11 @@ class ConcatenatedModule extends Module { let hooks = compilationHooksMap.get(compilation); if (hooks === undefined) { hooks = { - exportsDefinitions: new SyncBailHook(["definitions", "module"]) + exportsDefinitions: new SyncBailHook(["definitions", "module"]), + concatenatedModuleInfo: new SyncBailHook([ + "updatedInfo", + "concatenatedModuleInfo" + ]) }; compilationHooksMap.set(compilation, hooks); } @@ -945,7 +951,8 @@ class ConcatenatedModule extends Module { /** @type {Map} */ const existingEntries = new Map(); const deferEnabled = - this.compilation && this.compilation.options.experiments.deferImport; + /** @type {Compilation} */ + (this.compilation).options.experiments.deferImport; /** * @param {Module} module a module @@ -1180,6 +1187,10 @@ class ConcatenatedModule extends Module { runtime: generationRuntime, codeGenerationResults }) { + const { concatenatedModuleInfo } = ConcatenatedModule.getCompilationHooks( + /** @type {Compilation} */ (this.compilation) + ); + /** @type {RuntimeRequirements} */ const runtimeRequirements = new Set(); const runtime = intersectRuntime(generationRuntime, this._runtime); @@ -1195,6 +1206,9 @@ class ConcatenatedModule extends Module { /** @type {Set} */ const neededNamespaceObjects = new Set(); + // List of all used names to avoid conflicts + const allUsedNames = new Set(RESERVED_NAMES); + // Generate source code and analyse scopes // Prepare a ReplaceSource for the final source for (const info of moduleToInfoMap.values()) { @@ -1207,12 +1221,11 @@ class ConcatenatedModule extends Module { chunkGraph, runtime, /** @type {CodeGenerationResults} */ - (codeGenerationResults) + (codeGenerationResults), + allUsedNames ); } - // List of all used names to avoid conflicts - const allUsedNames = new Set(RESERVED_NAMES); // Updated Top level declarations are created by renaming /** @type {Set} */ const topLevelDeclarations = new Set(); @@ -1321,6 +1334,75 @@ class ConcatenatedModule extends Module { } } + /** + * @param {string} name the name to find a new name for + * @param {ConcatenatedModuleInfo} info the info of the module + * @param {Reference[]} references the references to the name + * @returns {string|undefined} the new name or undefined if the name is not found + */ + const _findNewName = (name, info, references) => { + const { usedNames, alreadyCheckedScopes } = getUsedNamesInScopeInfo( + usedNamesInScopeInfo, + info.module.identifier(), + name + ); + if (allUsedNames.has(name) || usedNames.has(name)) { + for (const ref of references) { + addScopeSymbols( + ref.from, + usedNames, + alreadyCheckedScopes, + ignoredScopes + ); + } + const newName = findNewName( + name, + allUsedNames, + usedNames, + info.module.readableIdentifier(requestShortener) + ); + allUsedNames.add(newName); + info.internalNames.set(name, newName); + topLevelDeclarations.add(newName); + return newName; + } + }; + + /** + * @param {string} name the name to find a new name for + * @param {ConcatenatedModuleInfo} info the info of the module + * @param {Reference[]} references the references to the name + * @returns {string|undefined} the new name or undefined if the name is not found + */ + const _findNewNameForSpecifier = (name, info, references) => { + const { usedNames: moduleUsedNames, alreadyCheckedScopes } = + getUsedNamesInScopeInfo( + usedNamesInScopeInfo, + info.module.identifier(), + name + ); + const referencesUsedNames = new Set(); + for (const ref of references) { + addScopeSymbols( + ref.from, + referencesUsedNames, + alreadyCheckedScopes, + ignoredScopes + ); + } + if (moduleUsedNames.has(name) || referencesUsedNames.has(name)) { + const newName = findNewName( + name, + allUsedNames, + new Set([...moduleUsedNames, ...referencesUsedNames]), + info.module.readableIdentifier(requestShortener) + ); + allUsedNames.add(newName); + topLevelDeclarations.add(newName); + return newName; + } + }; + // generate names for symbols for (const info of moduleToInfoMap.values()) { const { usedNames: namespaceObjectUsedNames } = getUsedNamesInScopeInfo( @@ -1333,30 +1415,9 @@ class ConcatenatedModule extends Module { const variables = /** @type {Scope} */ (info.moduleScope).variables; for (const variable of variables) { const name = variable.name; - const { usedNames, alreadyCheckedScopes } = getUsedNamesInScopeInfo( - usedNamesInScopeInfo, - info.module.identifier(), - name - ); - if (allUsedNames.has(name) || usedNames.has(name)) { - const references = getAllReferences(variable); - for (const ref of references) { - addScopeSymbols( - ref.from, - usedNames, - alreadyCheckedScopes, - ignoredScopes - ); - } - const newName = findNewName( - name, - allUsedNames, - usedNames, - info.module.readableIdentifier(requestShortener) - ); - allUsedNames.add(newName); - info.internalNames.set(name, newName); - topLevelDeclarations.add(newName); + const references = getAllReferences(variable); + const newName = _findNewName(name, info, references); + if (newName) { const source = /** @type {ReplaceSource} */ (info.source); const allIdentifiers = new Set([ ...references.map((r) => r.identifier), @@ -1493,14 +1554,48 @@ class ConcatenatedModule extends Module { for (const info of moduleToInfoMap.values()) { if (info.type === "concatenated") { const globalScope = /** @type {Scope} */ (info.globalScope); + // group references by name + const referencesByName = new Map(); for (const reference of globalScope.through) { const name = reference.identifier.name; + if (!referencesByName.has(name)) { + referencesByName.set(name, []); + } + referencesByName.get(name).push(reference); + } + for (const [name, references] of referencesByName) { const match = ConcatenationScope.matchModuleReference(name); if (match) { const referencedInfo = modulesWithInfo[match.index]; if (referencedInfo.type === "reference") { throw new Error("Module reference can't point to a reference"); } + const concatenationScope = /** @type {ConcatenatedModuleInfo} */ ( + referencedInfo + ).concatenationScope; + const exportId = match.ids[0]; + const specifier = + concatenationScope && concatenationScope.getRawExport(exportId); + if (specifier) { + const newName = _findNewNameForSpecifier( + specifier, + info, + references + ); + const initFragmentChanged = + newName && + concatenatedModuleInfo.call( + { + rawExportMap: new Map([ + [exportId, /** @type {string} */ (newName)] + ]) + }, + /** @type {ConcatenatedModuleInfo} */ (referencedInfo) + ); + if (initFragmentChanged) { + concatenationScope.setRawExportMap(exportId, newName); + } + } const finalName = getFinalName( moduleGraph, referencedInfo, @@ -1517,10 +1612,13 @@ class ConcatenatedModule extends Module { (info.module.buildMeta).strictHarmonyModule, match.asiSafe ); - const r = /** @type {Range} */ (reference.identifier.range); - const source = /** @type {ReplaceSource} */ (info.source); - // range is extended by 2 chars to cover the appended "._" - source.replace(r[0], r[1] + 1, finalName); + + for (const reference of references) { + const r = /** @type {Range} */ (reference.identifier.range); + const source = /** @type {ReplaceSource} */ (info.source); + // range is extended by 2 chars to cover the appended "._" + source.replace(r[0], r[1] + 1, finalName); + } } } } @@ -1712,7 +1810,8 @@ ${defineGetters}` /** @type {InitFragment[]} */ const chunkInitFragments = []; const deferEnabled = - this.compilation && this.compilation.options.experiments.deferImport; + /** @type {Compilation} */ + (this.compilation).options.experiments.deferImport; // evaluate modules in order for (const rawInfo of modulesWithInfo) { @@ -1788,18 +1887,19 @@ ${defineGetters}` runtimeTemplate, info.module.getExportsType( moduleGraph, - this.rootModule.buildMeta && - this.rootModule.buildMeta.strictHarmonyModule + /** @type {BuildMeta} */ + (this.rootModule.buildMeta).strictHarmonyModule ), moduleId, // an async module will opt-out of the concat module optimization. [] ); result.add(`var ${info.deferredName} = ${loader};`); + name = info.deferredName; } else { result.add(`var ${info.name} = __webpack_require__(${moduleId});`); + name = info.name; } - name = info.name; break; } default: @@ -1866,6 +1966,7 @@ ${defineGetters}` * @param {ChunkGraph} chunkGraph chunkGraph * @param {RuntimeSpec} runtime runtime * @param {CodeGenerationResults} codeGenerationResults codeGenerationResults + * @param {Set} usedNames used names */ _analyseModule( modulesMap, @@ -1875,13 +1976,18 @@ ${defineGetters}` moduleGraph, chunkGraph, runtime, - codeGenerationResults + codeGenerationResults, + usedNames ) { if (info.type === "concatenated") { const m = info.module; try { // Create a concatenation scope to track and capture information - const concatenationScope = new ConcatenationScope(modulesMap, info); + const concatenationScope = new ConcatenationScope( + modulesMap, + info, + usedNames + ); // TODO cache codeGeneration results const codeGenResult = m.codeGeneration({ @@ -1941,6 +2047,7 @@ ${defineGetters}` info.chunkInitFragments = chunkInitFragments; info.globalScope = globalScope; info.moduleScope = moduleScope; + info.concatenationScope = concatenationScope; } catch (err) { /** @type {Error} */ (err).message += @@ -1989,7 +2096,8 @@ ${defineGetters}` interopNamespaceObject2Used: false, interopNamespaceObject2Name: undefined, interopDefaultAccessUsed: false, - interopDefaultAccessName: undefined + interopDefaultAccessName: undefined, + concatenationScope: undefined }; break; case "external": diff --git a/lib/optimize/ModuleConcatenationPlugin.js b/lib/optimize/ModuleConcatenationPlugin.js index 559b0d32ac1..8d9618df01b 100644 --- a/lib/optimize/ModuleConcatenationPlugin.js +++ b/lib/optimize/ModuleConcatenationPlugin.js @@ -149,6 +149,7 @@ class ModuleConcatenationPlugin { chunkGraph, moduleGraph }; + const deferEnabled = compilation.options.experiments.deferImport; logger.time("select relevant modules"); for (const module of modules) { let canBeRoot = true; @@ -223,7 +224,7 @@ class ModuleConcatenationPlugin { canBeInner = false; } - if (moduleGraph.isDeferred(module)) { + if (deferEnabled && moduleGraph.isDeferred(module)) { setInnerBailoutReason(module, "Module is deferred"); canBeInner = false; } diff --git a/lib/util/magicComment.js b/lib/util/magicComment.js index 6abac1ed0b4..173dfe53f86 100644 --- a/lib/util/magicComment.js +++ b/lib/util/magicComment.js @@ -5,9 +5,13 @@ "use strict"; +const memoize = require("./memoize"); + +const getVm = memoize(() => require("vm")); + // regexp to match at least one "magic comment" module.exports.createMagicCommentContext = () => - require("vm").createContext(undefined, { + getVm().createContext(undefined, { name: "Webpack Magic Comment Parser", codeGeneration: { strings: false, wasm: false } }); diff --git a/package.json b/package.json index 641fba83850..50492bfd4e9 100644 --- a/package.json +++ b/package.json @@ -112,13 +112,13 @@ "@babel/preset-react": "^7.27.1", "@codspeed/core": "^4.0.1", "@eslint/js": "^9.29.0", - "@eslint/markdown": "^7.0.0", - "@stylistic/eslint-plugin": "^5.0.0", + "@eslint/markdown": "^7.1.0", + "@stylistic/eslint-plugin": "^5.2.2", "@types/glob-to-regexp": "^0.4.4", "@types/graceful-fs": "^4.1.9", "@types/jest": "^30.0.0", "@types/mime-types": "^2.1.4", - "@types/node": "^24.0.13", + "@types/node": "^24.1.0", "@types/xxhashjs": "^0.2.4", "assemblyscript": "^0.28.2", "babel-loader": "^10.0.0", @@ -133,24 +133,24 @@ "es6-promise-polyfill": "^1.2.0", "eslint": "^9.29.0", "eslint-config-prettier": "^10.1.1", - "eslint-config-webpack": "^4.4.1", + "eslint-config-webpack": "^4.5.1", "eslint-plugin-import": "^2.32.0", "eslint-plugin-jest": "^29.0.1", "eslint-plugin-jsdoc": "^51.2.3", "eslint-plugin-n": "^17.21.0", "eslint-plugin-prettier": "^5.5.0", - "eslint-plugin-unicorn": "^59.0.1", + "eslint-plugin-unicorn": "^60.0.0", "file-loader": "^6.0.0", "fork-ts-checker-webpack-plugin": "^9.0.2", "globals": "^16.0.0", "hash-wasm": "^4.9.0", "husky": "^9.0.11", "istanbul": "^0.4.5", - "jest": "^30.0.3", - "jest-circus": "^30.0.3", - "jest-cli": "^30.0.3", - "jest-diff": "^30.0.3", - "jest-environment-node": "^30.0.2", + "jest": "^30.0.5", + "jest-circus": "^30.0.5", + "jest-cli": "^30.0.5", + "jest-diff": "^30.0.5", + "jest-environment-node": "^30.0.5", "jest-junit": "^16.0.0", "json-loader": "^0.5.7", "json5": "^2.1.3", @@ -167,7 +167,7 @@ "open-cli": "^8.0.0", "prettier": "^3.6.0", "prettier-2": "npm:prettier@^2", - "pretty-format": "^30.0.2", + "pretty-format": "^30.0.5", "pug": "^3.0.3", "pug-loader": "^2.4.0", "raw-loader": "^4.0.1", diff --git a/test/Defaults.unittest.js b/test/Defaults.unittest.js index d92a9c7b14e..f9c3f9c3cf0 100644 --- a/test/Defaults.unittest.js +++ b/test/Defaults.unittest.js @@ -97,6 +97,7 @@ describe("snapshots", () => { "buildHttp": undefined, "cacheUnaffected": false, "css": undefined, + "deferImport": false, "futureDefaults": false, "layers": false, "lazyCompilation": undefined, @@ -1804,15 +1805,15 @@ describe("snapshots", () => { { optimization: { runtimeChunk: "single" } }, (e) => e.toMatchInlineSnapshot(` - - Expected - + Received - - @@ ... @@ - - "runtimeChunk": false, - + "runtimeChunk": Object { - + "name": [Function name], - + }, - `) + - Expected + + Received + + @@ ... @@ + - "runtimeChunk": false, + + "runtimeChunk": Object { + + "name": [Function name], + + }, + `) ); test( @@ -2025,9 +2026,10 @@ describe("snapshots", () => { @@ ... @@ - "cacheUnaffected": false, - "css": undefined, - - "futureDefaults": false, + "cacheUnaffected": true, + "css": true, + @@ ... @@ + - "futureDefaults": false, + "futureDefaults": true, @@ ... @@ + }, @@ -2491,9 +2493,10 @@ describe("snapshots", () => { @@ ... @@ - "cacheUnaffected": false, - "css": undefined, - - "futureDefaults": false, + "cacheUnaffected": true, + "css": true, + @@ ... @@ + - "futureDefaults": false, + "futureDefaults": true, @@ ... @@ + }, @@ -2637,9 +2640,10 @@ describe("snapshots", () => { @@ ... @@ - "cacheUnaffected": false, - "css": undefined, - - "futureDefaults": false, + "cacheUnaffected": true, + "css": false, + @@ ... @@ + - "futureDefaults": false, + "futureDefaults": true, @@ ... @@ + }, diff --git a/test/__snapshots__/ConfigCacheTestCases.longtest.js.snap b/test/__snapshots__/ConfigCacheTestCases.longtest.js.snap index f38dbd5ef75..2d22d508fc2 100644 --- a/test/__snapshots__/ConfigCacheTestCases.longtest.js.snap +++ b/test/__snapshots__/ConfigCacheTestCases.longtest.js.snap @@ -10148,3 +10148,1095 @@ exports[`ConfigCacheTestCases css webpack-ignore exported tests should compile 1 " `; + +exports[`ConfigCacheTestCases library concatenate-modules-named-import-externals concatenate-modules-named-import-externals should compile 1`] = ` +"import { HomeLayout as lib_HomeLayout_0, a } from \\"externals0\\"; +import { HomeLayout as HomeLayout_0, a as a_0 } from \\"externals1\\"; +import { default as default_0 } from \\"externals2\\"; +import * as __WEBPACK_EXTERNAL_MODULE_externals3__ from \\"externals3\\"; +import \\"externals4\\"; +/*!*****************************!*\\\\ + !*** ./test.js + 6 modules ***! + \\\\*****************************/ + +;// external \\"externals0\\" + +;// external \\"externals1\\" + +;// external \\"externals2\\" + +;// external \\"externals3\\" +const external_externals3_namespaceObject = __WEBPACK_EXTERNAL_MODULE_externals3__; +;// external \\"externals4\\" + +;// ./lib.js + + +const { HomeLayout: lib_HomeLayout = 123 } = {}; +console.log({ HomeLayout: lib_HomeLayout }); +{ + const { HomeLayout = lib_HomeLayout_0 } = {}; + console.log({ HomeLayout }); +} +(() => { + { + const { HomeLayout = lib_HomeLayout_0 } = {}; + console.log({ HomeLayout }); + } +})() + +{ + const { external_externals3_namespaceObject = \\"111\\" } = {} + console.log({ external_externals3_namespaceObject }); +} + + +;// ./test.js +// re export + + +// named import +; + + +// default import + + +// namespace import + + +// side effect only import + + + + +{ + const HomeLayout_0 = 'HomeLayout_0'; + HomeLayout_0; +} +HomeLayout_0; +a; +a_0; +default_0; +external_externals3_namespaceObject; +export { lib_HomeLayout as HomeLayout, a }; +" +`; + +exports[`ConfigCacheTestCases library concatenate-modules-named-import-externals concatenate-modules-named-import-externals should compile 2`] = ` +"import { HomeLayout as lib_HomeLayout_0, a } from \\"externals0\\"; +import { HomeLayout as HomeLayout_0, a as a_0 } from \\"externals1\\"; +import { default as default_0 } from \\"externals2\\"; +import * as __WEBPACK_EXTERNAL_MODULE_externals3__ from \\"externals3\\"; +import \\"externals4\\"; +/*!*****************************!*\\\\ + !*** ./test.js + 6 modules ***! + \\\\*****************************/ + +;// external \\"externals0\\" + +;// external \\"externals1\\" + +;// external \\"externals2\\" + +;// external \\"externals3\\" +const external_externals3_namespaceObject = __WEBPACK_EXTERNAL_MODULE_externals3__; +;// external \\"externals4\\" + +;// ./lib.js + + +const { HomeLayout: lib_HomeLayout = 123 } = {}; +console.log({ HomeLayout: lib_HomeLayout }); +{ + const { HomeLayout = lib_HomeLayout_0 } = {}; + console.log({ HomeLayout }); +} +(() => { + { + const { HomeLayout = lib_HomeLayout_0 } = {}; + console.log({ HomeLayout }); + } +})() + +{ + const { external_externals3_namespaceObject = \\"111\\" } = {} + console.log({ external_externals3_namespaceObject }); +} + + +;// ./test.js +// re export + + +// named import +; + + +// default import + + +// namespace import + + +// side effect only import + + + + +{ + const HomeLayout_0 = 'HomeLayout_0'; + HomeLayout_0; +} +HomeLayout_0; +a; +a_0; +default_0; +external_externals3_namespaceObject; +export { lib_HomeLayout as HomeLayout, a }; +" +`; + +exports[`ConfigCacheTestCases library concatenate-modules-named-import-externals concatenate-modules-named-import-externals should pre-compile to fill disk cache (1st) 1`] = ` +"import { HomeLayout as lib_HomeLayout_0, a } from \\"externals0\\"; +import { HomeLayout as HomeLayout_0, a as a_0 } from \\"externals1\\"; +import { default as default_0 } from \\"externals2\\"; +import * as __WEBPACK_EXTERNAL_MODULE_externals3__ from \\"externals3\\"; +import \\"externals4\\"; +/*!*****************************!*\\\\ + !*** ./test.js + 6 modules ***! + \\\\*****************************/ + +;// external \\"externals0\\" + +;// external \\"externals1\\" + +;// external \\"externals2\\" + +;// external \\"externals3\\" +const external_externals3_namespaceObject = __WEBPACK_EXTERNAL_MODULE_externals3__; +;// external \\"externals4\\" + +;// ./lib.js + + +const { HomeLayout: lib_HomeLayout = 123 } = {}; +console.log({ HomeLayout: lib_HomeLayout }); +{ + const { HomeLayout = lib_HomeLayout_0 } = {}; + console.log({ HomeLayout }); +} +(() => { + { + const { HomeLayout = lib_HomeLayout_0 } = {}; + console.log({ HomeLayout }); + } +})() + +{ + const { external_externals3_namespaceObject = \\"111\\" } = {} + console.log({ external_externals3_namespaceObject }); +} + + +;// ./test.js +// re export + + +// named import +; + + +// default import + + +// namespace import + + +// side effect only import + + + + +{ + const HomeLayout_0 = 'HomeLayout_0'; + HomeLayout_0; +} +HomeLayout_0; +a; +a_0; +default_0; +external_externals3_namespaceObject; +export { lib_HomeLayout as HomeLayout, a }; +" +`; + +exports[`ConfigCacheTestCases library concatenate-modules-named-import-externals concatenate-modules-named-import-externals should pre-compile to fill disk cache (2nd) 1`] = ` +"import { HomeLayout as lib_HomeLayout_0, a } from \\"externals0\\"; +import { HomeLayout as HomeLayout_0, a as a_0 } from \\"externals1\\"; +import { default as default_0 } from \\"externals2\\"; +import * as __WEBPACK_EXTERNAL_MODULE_externals3__ from \\"externals3\\"; +import \\"externals4\\"; +/*!*****************************!*\\\\ + !*** ./test.js + 6 modules ***! + \\\\*****************************/ + +;// external \\"externals0\\" + +;// external \\"externals1\\" + +;// external \\"externals2\\" + +;// external \\"externals3\\" +const external_externals3_namespaceObject = __WEBPACK_EXTERNAL_MODULE_externals3__; +;// external \\"externals4\\" + +;// ./lib.js + + +const { HomeLayout: lib_HomeLayout = 123 } = {}; +console.log({ HomeLayout: lib_HomeLayout }); +{ + const { HomeLayout = lib_HomeLayout_0 } = {}; + console.log({ HomeLayout }); +} +(() => { + { + const { HomeLayout = lib_HomeLayout_0 } = {}; + console.log({ HomeLayout }); + } +})() + +{ + const { external_externals3_namespaceObject = \\"111\\" } = {} + console.log({ external_externals3_namespaceObject }); +} + + +;// ./test.js +// re export + + +// named import +; + + +// default import + + +// namespace import + + +// side effect only import + + + + +{ + const HomeLayout_0 = 'HomeLayout_0'; + HomeLayout_0; +} +HomeLayout_0; +a; +a_0; +default_0; +external_externals3_namespaceObject; +export { lib_HomeLayout as HomeLayout, a }; +" +`; + +exports[`ConfigCacheTestCases library modern-module-named-import-externals modern-module-named-import-externals should compile 1`] = ` +"import * as __WEBPACK_EXTERNAL_MODULE_externals0__ from \\"externals0\\"; +import * as __WEBPACK_EXTERNAL_MODULE_externals1__ from \\"externals1\\"; +import * as __WEBPACK_EXTERNAL_MODULE_externals2__ from \\"externals2\\"; +import * as __WEBPACK_EXTERNAL_MODULE_externals3__ from \\"externals3\\"; +import * as __WEBPACK_EXTERNAL_MODULE_externals4__ from \\"externals4\\"; +/******/ var __webpack_modules__ = ([ +/* 0 */, +/* 1 */, +/* 2 */ +/*!*****************************!*\\\\ + !*** external \\"externals0\\" ***! + \\\\*****************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var x = (y) => { + var x = {}; __webpack_require__.d(x, y); return x +} +var y = (x) => (() => (x)) +module.exports = x({ [\\"HomeLayout\\"]: () => (__WEBPACK_EXTERNAL_MODULE_externals0__.HomeLayout), [\\"a\\"]: () => (__WEBPACK_EXTERNAL_MODULE_externals0__.a) }); + +/***/ }), +/* 3 */ +/*!*****************************!*\\\\ + !*** external \\"externals1\\" ***! + \\\\*****************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var x = (y) => { + var x = {}; __webpack_require__.d(x, y); return x +} +var y = (x) => (() => (x)) +module.exports = x({ [\\"HomeLayout\\"]: () => (__WEBPACK_EXTERNAL_MODULE_externals1__.HomeLayout), [\\"a\\"]: () => (__WEBPACK_EXTERNAL_MODULE_externals1__.a) }); + +/***/ }), +/* 4 */ +/*!*****************************!*\\\\ + !*** external \\"externals2\\" ***! + \\\\*****************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var x = (y) => { + var x = {}; __webpack_require__.d(x, y); return x +} +var y = (x) => (() => (x)) +module.exports = x({ [\\"default\\"]: () => (__WEBPACK_EXTERNAL_MODULE_externals2__[\\"default\\"]) }); + +/***/ }), +/* 5 */ +/*!*****************************!*\\\\ + !*** external \\"externals3\\" ***! + \\\\*****************************/ +/***/ ((module) => { + +module.exports = __WEBPACK_EXTERNAL_MODULE_externals3__; + +/***/ }), +/* 6 */ +/*!*****************************!*\\\\ + !*** external \\"externals4\\" ***! + \\\\*****************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var x = (y) => { + var x = {}; __webpack_require__.d(x, y); return x +} +var y = (x) => (() => (x)) +module.exports = x({ }); + +/***/ }), +/* 7 */ +/*!****************!*\\\\ + !*** ./lib.js ***! + \\\\****************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ HomeLayout: () => (/* binding */ HomeLayout) +/* harmony export */ }); +/* harmony import */ var externals0__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! externals0 */ 2); + + +const { HomeLayout = externals0__WEBPACK_IMPORTED_MODULE_0__.HomeLayout } = {}; +console.log({ HomeLayout }); +{ + const { HomeLayout = externals0__WEBPACK_IMPORTED_MODULE_0__.HomeLayout } = {}; + console.log({ HomeLayout }); +} +(() => { + { + const { HomeLayout = externals0__WEBPACK_IMPORTED_MODULE_0__.HomeLayout } = {}; + console.log({ HomeLayout }); + } +})() + +{ + const { external_externals3_namespaceObject = \\"111\\" } = {} + console.log({ external_externals3_namespaceObject }); +} + + + +/***/ }) +/******/ ]); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/************************************************************************/ +var __webpack_exports__ = {}; +// This entry needs to be wrapped in an IIFE because it needs to be isolated against other modules in the chunk. +(() => { +/*!*****************!*\\\\ + !*** ./test.js ***! + \\\\*****************/ +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ HomeLayout: () => (/* reexport safe */ _lib__WEBPACK_IMPORTED_MODULE_5__.HomeLayout), +/* harmony export */ a: () => (/* reexport safe */ externals0__WEBPACK_IMPORTED_MODULE_0__.a) +/* harmony export */ }); +/* harmony import */ var externals0__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! externals0 */ 2); +/* harmony import */ var externals1__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! externals1 */ 3); +/* harmony import */ var externals2__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! externals2 */ 4); +/* harmony import */ var externals3__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! externals3 */ 5); +/* harmony import */ var externals4__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! externals4 */ 6); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./lib */ 7); +// re export + + +// named import +; + + +// default import + + +// namespace import + + +// side effect only import + + + + +{ + const HomeLayout_0 = 'HomeLayout_0'; + HomeLayout_0; +} +externals1__WEBPACK_IMPORTED_MODULE_1__.HomeLayout; +externals0__WEBPACK_IMPORTED_MODULE_0__.a; +externals1__WEBPACK_IMPORTED_MODULE_1__.a; +externals2__WEBPACK_IMPORTED_MODULE_2__[\\"default\\"]; +externals3__WEBPACK_IMPORTED_MODULE_3__; +})(); + +const __webpack_exports__HomeLayout = __webpack_exports__.HomeLayout; +const __webpack_exports__a = __webpack_exports__.a; +export { __webpack_exports__HomeLayout as HomeLayout, __webpack_exports__a as a }; +" +`; + +exports[`ConfigCacheTestCases library modern-module-named-import-externals modern-module-named-import-externals should compile 2`] = ` +"import * as __WEBPACK_EXTERNAL_MODULE_externals0__ from \\"externals0\\"; +import * as __WEBPACK_EXTERNAL_MODULE_externals1__ from \\"externals1\\"; +import * as __WEBPACK_EXTERNAL_MODULE_externals2__ from \\"externals2\\"; +import * as __WEBPACK_EXTERNAL_MODULE_externals3__ from \\"externals3\\"; +import * as __WEBPACK_EXTERNAL_MODULE_externals4__ from \\"externals4\\"; +/******/ var __webpack_modules__ = ([ +/* 0 */, +/* 1 */, +/* 2 */ +/*!*****************************!*\\\\ + !*** external \\"externals0\\" ***! + \\\\*****************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var x = (y) => { + var x = {}; __webpack_require__.d(x, y); return x +} +var y = (x) => (() => (x)) +module.exports = x({ [\\"HomeLayout\\"]: () => (__WEBPACK_EXTERNAL_MODULE_externals0__.HomeLayout), [\\"a\\"]: () => (__WEBPACK_EXTERNAL_MODULE_externals0__.a) }); + +/***/ }), +/* 3 */ +/*!*****************************!*\\\\ + !*** external \\"externals1\\" ***! + \\\\*****************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var x = (y) => { + var x = {}; __webpack_require__.d(x, y); return x +} +var y = (x) => (() => (x)) +module.exports = x({ [\\"HomeLayout\\"]: () => (__WEBPACK_EXTERNAL_MODULE_externals1__.HomeLayout), [\\"a\\"]: () => (__WEBPACK_EXTERNAL_MODULE_externals1__.a) }); + +/***/ }), +/* 4 */ +/*!*****************************!*\\\\ + !*** external \\"externals2\\" ***! + \\\\*****************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var x = (y) => { + var x = {}; __webpack_require__.d(x, y); return x +} +var y = (x) => (() => (x)) +module.exports = x({ [\\"default\\"]: () => (__WEBPACK_EXTERNAL_MODULE_externals2__[\\"default\\"]) }); + +/***/ }), +/* 5 */ +/*!*****************************!*\\\\ + !*** external \\"externals3\\" ***! + \\\\*****************************/ +/***/ ((module) => { + +module.exports = __WEBPACK_EXTERNAL_MODULE_externals3__; + +/***/ }), +/* 6 */ +/*!*****************************!*\\\\ + !*** external \\"externals4\\" ***! + \\\\*****************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var x = (y) => { + var x = {}; __webpack_require__.d(x, y); return x +} +var y = (x) => (() => (x)) +module.exports = x({ }); + +/***/ }), +/* 7 */ +/*!****************!*\\\\ + !*** ./lib.js ***! + \\\\****************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ HomeLayout: () => (/* binding */ HomeLayout) +/* harmony export */ }); +/* harmony import */ var externals0__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! externals0 */ 2); + + +const { HomeLayout = externals0__WEBPACK_IMPORTED_MODULE_0__.HomeLayout } = {}; +console.log({ HomeLayout }); +{ + const { HomeLayout = externals0__WEBPACK_IMPORTED_MODULE_0__.HomeLayout } = {}; + console.log({ HomeLayout }); +} +(() => { + { + const { HomeLayout = externals0__WEBPACK_IMPORTED_MODULE_0__.HomeLayout } = {}; + console.log({ HomeLayout }); + } +})() + +{ + const { external_externals3_namespaceObject = \\"111\\" } = {} + console.log({ external_externals3_namespaceObject }); +} + + + +/***/ }) +/******/ ]); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/************************************************************************/ +var __webpack_exports__ = {}; +// This entry needs to be wrapped in an IIFE because it needs to be isolated against other modules in the chunk. +(() => { +/*!*****************!*\\\\ + !*** ./test.js ***! + \\\\*****************/ +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ HomeLayout: () => (/* reexport safe */ _lib__WEBPACK_IMPORTED_MODULE_5__.HomeLayout), +/* harmony export */ a: () => (/* reexport safe */ externals0__WEBPACK_IMPORTED_MODULE_0__.a) +/* harmony export */ }); +/* harmony import */ var externals0__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! externals0 */ 2); +/* harmony import */ var externals1__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! externals1 */ 3); +/* harmony import */ var externals2__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! externals2 */ 4); +/* harmony import */ var externals3__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! externals3 */ 5); +/* harmony import */ var externals4__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! externals4 */ 6); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./lib */ 7); +// re export + + +// named import +; + + +// default import + + +// namespace import + + +// side effect only import + + + + +{ + const HomeLayout_0 = 'HomeLayout_0'; + HomeLayout_0; +} +externals1__WEBPACK_IMPORTED_MODULE_1__.HomeLayout; +externals0__WEBPACK_IMPORTED_MODULE_0__.a; +externals1__WEBPACK_IMPORTED_MODULE_1__.a; +externals2__WEBPACK_IMPORTED_MODULE_2__[\\"default\\"]; +externals3__WEBPACK_IMPORTED_MODULE_3__; +})(); + +const __webpack_exports__HomeLayout = __webpack_exports__.HomeLayout; +const __webpack_exports__a = __webpack_exports__.a; +export { __webpack_exports__HomeLayout as HomeLayout, __webpack_exports__a as a }; +" +`; + +exports[`ConfigCacheTestCases library modern-module-named-import-externals modern-module-named-import-externals should pre-compile to fill disk cache (1st) 1`] = ` +"import * as __WEBPACK_EXTERNAL_MODULE_externals0__ from \\"externals0\\"; +import * as __WEBPACK_EXTERNAL_MODULE_externals1__ from \\"externals1\\"; +import * as __WEBPACK_EXTERNAL_MODULE_externals2__ from \\"externals2\\"; +import * as __WEBPACK_EXTERNAL_MODULE_externals3__ from \\"externals3\\"; +import * as __WEBPACK_EXTERNAL_MODULE_externals4__ from \\"externals4\\"; +/******/ var __webpack_modules__ = ([ +/* 0 */, +/* 1 */, +/* 2 */ +/*!*****************************!*\\\\ + !*** external \\"externals0\\" ***! + \\\\*****************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var x = (y) => { + var x = {}; __webpack_require__.d(x, y); return x +} +var y = (x) => (() => (x)) +module.exports = x({ [\\"HomeLayout\\"]: () => (__WEBPACK_EXTERNAL_MODULE_externals0__.HomeLayout), [\\"a\\"]: () => (__WEBPACK_EXTERNAL_MODULE_externals0__.a) }); + +/***/ }), +/* 3 */ +/*!*****************************!*\\\\ + !*** external \\"externals1\\" ***! + \\\\*****************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var x = (y) => { + var x = {}; __webpack_require__.d(x, y); return x +} +var y = (x) => (() => (x)) +module.exports = x({ [\\"HomeLayout\\"]: () => (__WEBPACK_EXTERNAL_MODULE_externals1__.HomeLayout), [\\"a\\"]: () => (__WEBPACK_EXTERNAL_MODULE_externals1__.a) }); + +/***/ }), +/* 4 */ +/*!*****************************!*\\\\ + !*** external \\"externals2\\" ***! + \\\\*****************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var x = (y) => { + var x = {}; __webpack_require__.d(x, y); return x +} +var y = (x) => (() => (x)) +module.exports = x({ [\\"default\\"]: () => (__WEBPACK_EXTERNAL_MODULE_externals2__[\\"default\\"]) }); + +/***/ }), +/* 5 */ +/*!*****************************!*\\\\ + !*** external \\"externals3\\" ***! + \\\\*****************************/ +/***/ ((module) => { + +module.exports = __WEBPACK_EXTERNAL_MODULE_externals3__; + +/***/ }), +/* 6 */ +/*!*****************************!*\\\\ + !*** external \\"externals4\\" ***! + \\\\*****************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var x = (y) => { + var x = {}; __webpack_require__.d(x, y); return x +} +var y = (x) => (() => (x)) +module.exports = x({ }); + +/***/ }), +/* 7 */ +/*!****************!*\\\\ + !*** ./lib.js ***! + \\\\****************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ HomeLayout: () => (/* binding */ HomeLayout) +/* harmony export */ }); +/* harmony import */ var externals0__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! externals0 */ 2); + + +const { HomeLayout = externals0__WEBPACK_IMPORTED_MODULE_0__.HomeLayout } = {}; +console.log({ HomeLayout }); +{ + const { HomeLayout = externals0__WEBPACK_IMPORTED_MODULE_0__.HomeLayout } = {}; + console.log({ HomeLayout }); +} +(() => { + { + const { HomeLayout = externals0__WEBPACK_IMPORTED_MODULE_0__.HomeLayout } = {}; + console.log({ HomeLayout }); + } +})() + +{ + const { external_externals3_namespaceObject = \\"111\\" } = {} + console.log({ external_externals3_namespaceObject }); +} + + + +/***/ }) +/******/ ]); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/************************************************************************/ +var __webpack_exports__ = {}; +// This entry needs to be wrapped in an IIFE because it needs to be isolated against other modules in the chunk. +(() => { +/*!*****************!*\\\\ + !*** ./test.js ***! + \\\\*****************/ +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ HomeLayout: () => (/* reexport safe */ _lib__WEBPACK_IMPORTED_MODULE_5__.HomeLayout), +/* harmony export */ a: () => (/* reexport safe */ externals0__WEBPACK_IMPORTED_MODULE_0__.a) +/* harmony export */ }); +/* harmony import */ var externals0__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! externals0 */ 2); +/* harmony import */ var externals1__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! externals1 */ 3); +/* harmony import */ var externals2__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! externals2 */ 4); +/* harmony import */ var externals3__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! externals3 */ 5); +/* harmony import */ var externals4__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! externals4 */ 6); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./lib */ 7); +// re export + + +// named import +; + + +// default import + + +// namespace import + + +// side effect only import + + + + +{ + const HomeLayout_0 = 'HomeLayout_0'; + HomeLayout_0; +} +externals1__WEBPACK_IMPORTED_MODULE_1__.HomeLayout; +externals0__WEBPACK_IMPORTED_MODULE_0__.a; +externals1__WEBPACK_IMPORTED_MODULE_1__.a; +externals2__WEBPACK_IMPORTED_MODULE_2__[\\"default\\"]; +externals3__WEBPACK_IMPORTED_MODULE_3__; +})(); + +const __webpack_exports__HomeLayout = __webpack_exports__.HomeLayout; +const __webpack_exports__a = __webpack_exports__.a; +export { __webpack_exports__HomeLayout as HomeLayout, __webpack_exports__a as a }; +" +`; + +exports[`ConfigCacheTestCases library modern-module-named-import-externals modern-module-named-import-externals should pre-compile to fill disk cache (2nd) 1`] = ` +"import * as __WEBPACK_EXTERNAL_MODULE_externals0__ from \\"externals0\\"; +import * as __WEBPACK_EXTERNAL_MODULE_externals1__ from \\"externals1\\"; +import * as __WEBPACK_EXTERNAL_MODULE_externals2__ from \\"externals2\\"; +import * as __WEBPACK_EXTERNAL_MODULE_externals3__ from \\"externals3\\"; +import * as __WEBPACK_EXTERNAL_MODULE_externals4__ from \\"externals4\\"; +/******/ var __webpack_modules__ = ([ +/* 0 */, +/* 1 */, +/* 2 */ +/*!*****************************!*\\\\ + !*** external \\"externals0\\" ***! + \\\\*****************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var x = (y) => { + var x = {}; __webpack_require__.d(x, y); return x +} +var y = (x) => (() => (x)) +module.exports = x({ [\\"HomeLayout\\"]: () => (__WEBPACK_EXTERNAL_MODULE_externals0__.HomeLayout), [\\"a\\"]: () => (__WEBPACK_EXTERNAL_MODULE_externals0__.a) }); + +/***/ }), +/* 3 */ +/*!*****************************!*\\\\ + !*** external \\"externals1\\" ***! + \\\\*****************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var x = (y) => { + var x = {}; __webpack_require__.d(x, y); return x +} +var y = (x) => (() => (x)) +module.exports = x({ [\\"HomeLayout\\"]: () => (__WEBPACK_EXTERNAL_MODULE_externals1__.HomeLayout), [\\"a\\"]: () => (__WEBPACK_EXTERNAL_MODULE_externals1__.a) }); + +/***/ }), +/* 4 */ +/*!*****************************!*\\\\ + !*** external \\"externals2\\" ***! + \\\\*****************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var x = (y) => { + var x = {}; __webpack_require__.d(x, y); return x +} +var y = (x) => (() => (x)) +module.exports = x({ [\\"default\\"]: () => (__WEBPACK_EXTERNAL_MODULE_externals2__[\\"default\\"]) }); + +/***/ }), +/* 5 */ +/*!*****************************!*\\\\ + !*** external \\"externals3\\" ***! + \\\\*****************************/ +/***/ ((module) => { + +module.exports = __WEBPACK_EXTERNAL_MODULE_externals3__; + +/***/ }), +/* 6 */ +/*!*****************************!*\\\\ + !*** external \\"externals4\\" ***! + \\\\*****************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var x = (y) => { + var x = {}; __webpack_require__.d(x, y); return x +} +var y = (x) => (() => (x)) +module.exports = x({ }); + +/***/ }), +/* 7 */ +/*!****************!*\\\\ + !*** ./lib.js ***! + \\\\****************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ HomeLayout: () => (/* binding */ HomeLayout) +/* harmony export */ }); +/* harmony import */ var externals0__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! externals0 */ 2); + + +const { HomeLayout = externals0__WEBPACK_IMPORTED_MODULE_0__.HomeLayout } = {}; +console.log({ HomeLayout }); +{ + const { HomeLayout = externals0__WEBPACK_IMPORTED_MODULE_0__.HomeLayout } = {}; + console.log({ HomeLayout }); +} +(() => { + { + const { HomeLayout = externals0__WEBPACK_IMPORTED_MODULE_0__.HomeLayout } = {}; + console.log({ HomeLayout }); + } +})() + +{ + const { external_externals3_namespaceObject = \\"111\\" } = {} + console.log({ external_externals3_namespaceObject }); +} + + + +/***/ }) +/******/ ]); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/************************************************************************/ +var __webpack_exports__ = {}; +// This entry needs to be wrapped in an IIFE because it needs to be isolated against other modules in the chunk. +(() => { +/*!*****************!*\\\\ + !*** ./test.js ***! + \\\\*****************/ +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ HomeLayout: () => (/* reexport safe */ _lib__WEBPACK_IMPORTED_MODULE_5__.HomeLayout), +/* harmony export */ a: () => (/* reexport safe */ externals0__WEBPACK_IMPORTED_MODULE_0__.a) +/* harmony export */ }); +/* harmony import */ var externals0__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! externals0 */ 2); +/* harmony import */ var externals1__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! externals1 */ 3); +/* harmony import */ var externals2__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! externals2 */ 4); +/* harmony import */ var externals3__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! externals3 */ 5); +/* harmony import */ var externals4__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! externals4 */ 6); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./lib */ 7); +// re export + + +// named import +; + + +// default import + + +// namespace import + + +// side effect only import + + + + +{ + const HomeLayout_0 = 'HomeLayout_0'; + HomeLayout_0; +} +externals1__WEBPACK_IMPORTED_MODULE_1__.HomeLayout; +externals0__WEBPACK_IMPORTED_MODULE_0__.a; +externals1__WEBPACK_IMPORTED_MODULE_1__.a; +externals2__WEBPACK_IMPORTED_MODULE_2__[\\"default\\"]; +externals3__WEBPACK_IMPORTED_MODULE_3__; +})(); + +const __webpack_exports__HomeLayout = __webpack_exports__.HomeLayout; +const __webpack_exports__a = __webpack_exports__.a; +export { __webpack_exports__HomeLayout as HomeLayout, __webpack_exports__a as a }; +" +`; diff --git a/test/__snapshots__/ConfigTestCases.basictest.js.snap b/test/__snapshots__/ConfigTestCases.basictest.js.snap index 3542d2527fa..c281a612f2a 100644 --- a/test/__snapshots__/ConfigTestCases.basictest.js.snap +++ b/test/__snapshots__/ConfigTestCases.basictest.js.snap @@ -10148,3 +10148,276 @@ exports[`ConfigTestCases css webpack-ignore exported tests should compile 1`] = " `; + +exports[`ConfigTestCases library concatenate-modules-named-import-externals concatenate-modules-named-import-externals should compile 1`] = ` +"import { HomeLayout as lib_HomeLayout_0, a } from \\"externals0\\"; +import { HomeLayout as HomeLayout_0, a as a_0 } from \\"externals1\\"; +import { default as default_0 } from \\"externals2\\"; +import * as __WEBPACK_EXTERNAL_MODULE_externals3__ from \\"externals3\\"; +import \\"externals4\\"; +/*!*****************************!*\\\\ + !*** ./test.js + 6 modules ***! + \\\\*****************************/ + +;// external \\"externals0\\" + +;// external \\"externals1\\" + +;// external \\"externals2\\" + +;// external \\"externals3\\" +const external_externals3_namespaceObject = __WEBPACK_EXTERNAL_MODULE_externals3__; +;// external \\"externals4\\" + +;// ./lib.js + + +const { HomeLayout: lib_HomeLayout = 123 } = {}; +console.log({ HomeLayout: lib_HomeLayout }); +{ + const { HomeLayout = lib_HomeLayout_0 } = {}; + console.log({ HomeLayout }); +} +(() => { + { + const { HomeLayout = lib_HomeLayout_0 } = {}; + console.log({ HomeLayout }); + } +})() + +{ + const { external_externals3_namespaceObject = \\"111\\" } = {} + console.log({ external_externals3_namespaceObject }); +} + + +;// ./test.js +// re export + + +// named import +; + + +// default import + + +// namespace import + + +// side effect only import + + + + +{ + const HomeLayout_0 = 'HomeLayout_0'; + HomeLayout_0; +} +HomeLayout_0; +a; +a_0; +default_0; +external_externals3_namespaceObject; +export { lib_HomeLayout as HomeLayout, a }; +" +`; + +exports[`ConfigTestCases library modern-module-named-import-externals modern-module-named-import-externals should compile 1`] = ` +"import * as __WEBPACK_EXTERNAL_MODULE_externals0__ from \\"externals0\\"; +import * as __WEBPACK_EXTERNAL_MODULE_externals1__ from \\"externals1\\"; +import * as __WEBPACK_EXTERNAL_MODULE_externals2__ from \\"externals2\\"; +import * as __WEBPACK_EXTERNAL_MODULE_externals3__ from \\"externals3\\"; +import * as __WEBPACK_EXTERNAL_MODULE_externals4__ from \\"externals4\\"; +/******/ var __webpack_modules__ = ([ +/* 0 */, +/* 1 */, +/* 2 */ +/*!*****************************!*\\\\ + !*** external \\"externals0\\" ***! + \\\\*****************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var x = (y) => { + var x = {}; __webpack_require__.d(x, y); return x +} +var y = (x) => (() => (x)) +module.exports = x({ [\\"HomeLayout\\"]: () => (__WEBPACK_EXTERNAL_MODULE_externals0__.HomeLayout), [\\"a\\"]: () => (__WEBPACK_EXTERNAL_MODULE_externals0__.a) }); + +/***/ }), +/* 3 */ +/*!*****************************!*\\\\ + !*** external \\"externals1\\" ***! + \\\\*****************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var x = (y) => { + var x = {}; __webpack_require__.d(x, y); return x +} +var y = (x) => (() => (x)) +module.exports = x({ [\\"HomeLayout\\"]: () => (__WEBPACK_EXTERNAL_MODULE_externals1__.HomeLayout), [\\"a\\"]: () => (__WEBPACK_EXTERNAL_MODULE_externals1__.a) }); + +/***/ }), +/* 4 */ +/*!*****************************!*\\\\ + !*** external \\"externals2\\" ***! + \\\\*****************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var x = (y) => { + var x = {}; __webpack_require__.d(x, y); return x +} +var y = (x) => (() => (x)) +module.exports = x({ [\\"default\\"]: () => (__WEBPACK_EXTERNAL_MODULE_externals2__[\\"default\\"]) }); + +/***/ }), +/* 5 */ +/*!*****************************!*\\\\ + !*** external \\"externals3\\" ***! + \\\\*****************************/ +/***/ ((module) => { + +module.exports = __WEBPACK_EXTERNAL_MODULE_externals3__; + +/***/ }), +/* 6 */ +/*!*****************************!*\\\\ + !*** external \\"externals4\\" ***! + \\\\*****************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var x = (y) => { + var x = {}; __webpack_require__.d(x, y); return x +} +var y = (x) => (() => (x)) +module.exports = x({ }); + +/***/ }), +/* 7 */ +/*!****************!*\\\\ + !*** ./lib.js ***! + \\\\****************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ HomeLayout: () => (/* binding */ HomeLayout) +/* harmony export */ }); +/* harmony import */ var externals0__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! externals0 */ 2); + + +const { HomeLayout = externals0__WEBPACK_IMPORTED_MODULE_0__.HomeLayout } = {}; +console.log({ HomeLayout }); +{ + const { HomeLayout = externals0__WEBPACK_IMPORTED_MODULE_0__.HomeLayout } = {}; + console.log({ HomeLayout }); +} +(() => { + { + const { HomeLayout = externals0__WEBPACK_IMPORTED_MODULE_0__.HomeLayout } = {}; + console.log({ HomeLayout }); + } +})() + +{ + const { external_externals3_namespaceObject = \\"111\\" } = {} + console.log({ external_externals3_namespaceObject }); +} + + + +/***/ }) +/******/ ]); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/************************************************************************/ +var __webpack_exports__ = {}; +// This entry needs to be wrapped in an IIFE because it needs to be isolated against other modules in the chunk. +(() => { +/*!*****************!*\\\\ + !*** ./test.js ***! + \\\\*****************/ +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ HomeLayout: () => (/* reexport safe */ _lib__WEBPACK_IMPORTED_MODULE_5__.HomeLayout), +/* harmony export */ a: () => (/* reexport safe */ externals0__WEBPACK_IMPORTED_MODULE_0__.a) +/* harmony export */ }); +/* harmony import */ var externals0__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! externals0 */ 2); +/* harmony import */ var externals1__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! externals1 */ 3); +/* harmony import */ var externals2__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! externals2 */ 4); +/* harmony import */ var externals3__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! externals3 */ 5); +/* harmony import */ var externals4__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! externals4 */ 6); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./lib */ 7); +// re export + + +// named import +; + + +// default import + + +// namespace import + + +// side effect only import + + + + +{ + const HomeLayout_0 = 'HomeLayout_0'; + HomeLayout_0; +} +externals1__WEBPACK_IMPORTED_MODULE_1__.HomeLayout; +externals0__WEBPACK_IMPORTED_MODULE_0__.a; +externals1__WEBPACK_IMPORTED_MODULE_1__.a; +externals2__WEBPACK_IMPORTED_MODULE_2__[\\"default\\"]; +externals3__WEBPACK_IMPORTED_MODULE_3__; +})(); + +const __webpack_exports__HomeLayout = __webpack_exports__.HomeLayout; +const __webpack_exports__a = __webpack_exports__.a; +export { __webpack_exports__HomeLayout as HomeLayout, __webpack_exports__a as a }; +" +`; diff --git a/test/cases/parsing/context/templates/templateLoader.js b/test/cases/parsing/context/templates/templateLoader.js index e2b1e898947..e541d7ec4e4 100644 --- a/test/cases/parsing/context/templates/templateLoader.js +++ b/test/cases/parsing/context/templates/templateLoader.js @@ -1,3 +1,6 @@ +/** + * @param {string} name + */ module.exports = function(name) { return require(name); } \ No newline at end of file diff --git a/test/cases/parsing/context/templates/templateLoaderIndirect.js b/test/cases/parsing/context/templates/templateLoaderIndirect.js index 89035fe1744..c7753680c55 100644 --- a/test/cases/parsing/context/templates/templateLoaderIndirect.js +++ b/test/cases/parsing/context/templates/templateLoaderIndirect.js @@ -1,3 +1,6 @@ +/** + * @param {string} name + */ module.exports = function(name) { var a = load(require, name); var r = require; @@ -6,6 +9,10 @@ module.exports = function(name) { return a; } +/** + * @param {Function} requireFunction + * @param {string} name + */ function load(requireFunction, name) { return requireFunction(name); } \ No newline at end of file diff --git a/test/configCases/externals/module-import/a.js b/test/configCases/externals/module-import/a.js index d923fc87a03..1440a3c5c9b 100644 --- a/test/configCases/externals/module-import/a.js +++ b/test/configCases/externals/module-import/a.js @@ -4,4 +4,11 @@ const external2 = require("external2"); // node-commonjs import external3_1 from "external3"; // module const external3_2 = import("external3"); // import +// Trigger concatenation +import { internalHelper, internalConstant } from "./lib-to-concat"; + console.log(external0, external1, external3_1, external3_2); +console.log(internalHelper(), internalConstant); + +// ESM export ensures module concatenation +export { external0, internalHelper }; diff --git a/test/configCases/externals/module-import/index.js b/test/configCases/externals/module-import/index.js index af64c4613b0..90246878f29 100644 --- a/test/configCases/externals/module-import/index.js +++ b/test/configCases/externals/module-import/index.js @@ -3,7 +3,7 @@ const path = require("path"); it("module-import should correctly get fallback type", function() { const content = fs.readFileSync(path.resolve(__dirname, "a.js"), "utf-8"); - expect(content).toContain(`import * as __WEBPACK_EXTERNAL_MODULE_external0__ from "external0"`); // module + expect(content).toContain(`import { default as default_0 } from "external0"`); // module expect(content).toContain(`import * as __WEBPACK_EXTERNAL_MODULE_external1__ from "external1"`); // module expect(content).toContain(`module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("external2")`); // node-commonjs expect(content).toContain(`import * as __WEBPACK_EXTERNAL_MODULE_external3__ from "external3"`); // module diff --git a/test/configCases/externals/module-import/lib-to-concat.js b/test/configCases/externals/module-import/lib-to-concat.js new file mode 100644 index 00000000000..ab5a2e2fcdf --- /dev/null +++ b/test/configCases/externals/module-import/lib-to-concat.js @@ -0,0 +1,6 @@ +// Trigger concatenation with a.js +export function internalHelper() { + return "internal"; +} + +export const internalConstant = 100; \ No newline at end of file diff --git a/test/configCases/externals/module-import/webpack.config.js b/test/configCases/externals/module-import/webpack.config.js index ddf3515be93..941efedc194 100644 --- a/test/configCases/externals/module-import/webpack.config.js +++ b/test/configCases/externals/module-import/webpack.config.js @@ -16,7 +16,8 @@ module.exports = { main: "./index" }, optimization: { - concatenateModules: true + concatenateModules: true, + usedExports: true }, experiments: { outputModule: true diff --git a/test/configCases/inner-graph/_helpers/testModuleLoader.js b/test/configCases/inner-graph/_helpers/testModuleLoader.js index b6d54748dda..7f3a64f7ac6 100644 --- a/test/configCases/inner-graph/_helpers/testModuleLoader.js +++ b/test/configCases/inner-graph/_helpers/testModuleLoader.js @@ -3,8 +3,8 @@ module.exports = function () { const usedExports = JSON.parse(this.query.slice(1)); return [ `import { ${usedExports - .map(x => `${x} as export_${x}`) + .map((/** @type {string} */ x) => `${x} as export_${x}`) .join(", ")} } from "./module";`, - `export default [${usedExports.map(x => `export_${x}`).join(", ")}];` + `export default [${usedExports.map((/** @type {string} */ x) => `export_${x}`).join(", ")}];` ].join("\n"); }; diff --git a/test/configCases/library/concatenate-modules-named-import-externals/index.js b/test/configCases/library/concatenate-modules-named-import-externals/index.js new file mode 100644 index 00000000000..f6e48fad94d --- /dev/null +++ b/test/configCases/library/concatenate-modules-named-import-externals/index.js @@ -0,0 +1,7 @@ + +it('should compile', () => {}); + +it('should handle external modules with concatenation and caching', () => { + // This test ensures serialization works with caching enabled + expect(true).toBe(true); +}); diff --git a/test/configCases/library/concatenate-modules-named-import-externals/lib.js b/test/configCases/library/concatenate-modules-named-import-externals/lib.js new file mode 100644 index 00000000000..d484730bb89 --- /dev/null +++ b/test/configCases/library/concatenate-modules-named-import-externals/lib.js @@ -0,0 +1,21 @@ +import { HomeLayout as aaa } from 'externals0'; + +const { HomeLayout = 123 } = {}; +console.log({ HomeLayout }); +{ + const { HomeLayout = aaa } = {}; + console.log({ HomeLayout }); +} +(() => { + { + const { HomeLayout = aaa } = {}; + console.log({ HomeLayout }); + } +})() + +{ + const { external_externals3_namespaceObject = "111" } = {} + console.log({ external_externals3_namespaceObject }); +} + +export { HomeLayout } \ No newline at end of file diff --git a/test/configCases/library/concatenate-modules-named-import-externals/test.config.js b/test/configCases/library/concatenate-modules-named-import-externals/test.config.js new file mode 100644 index 00000000000..a8755bed92f --- /dev/null +++ b/test/configCases/library/concatenate-modules-named-import-externals/test.config.js @@ -0,0 +1,7 @@ +"use strict"; + +module.exports = { + findBundle() { + return ["main.js"]; + } +}; diff --git a/test/configCases/library/concatenate-modules-named-import-externals/test.js b/test/configCases/library/concatenate-modules-named-import-externals/test.js new file mode 100644 index 00000000000..eddb63f953d --- /dev/null +++ b/test/configCases/library/concatenate-modules-named-import-externals/test.js @@ -0,0 +1,27 @@ +// re export +export { a } from 'externals0' + +// named import +import { a as a_2, HomeLayout as aaa } from 'externals1' +import { a as a_0 } from 'externals0' + +// default import +import defaultValue from 'externals2' + +// namespace import +import * as namespace from 'externals3' + +// side effect only import +import 'externals4' + +export { HomeLayout } from './lib' + +{ + const HomeLayout_0 = 'HomeLayout_0'; + HomeLayout_0; +} +aaa; +a_0; +a_2; +defaultValue; +namespace; \ No newline at end of file diff --git a/test/configCases/library/concatenate-modules-named-import-externals/webpack.config.js b/test/configCases/library/concatenate-modules-named-import-externals/webpack.config.js new file mode 100644 index 00000000000..af204eb0536 --- /dev/null +++ b/test/configCases/library/concatenate-modules-named-import-externals/webpack.config.js @@ -0,0 +1,56 @@ +"use strict"; + +/** @type {import("../../../../types").Configuration} */ +module.exports = { + cache: { + type: "memory" // Enable memory cache to test serialization + }, + mode: "none", + entry: { main: "./index.js", test: "./test.js" }, + output: { + module: true, + library: { + type: "modern-module" + }, + filename: "[name].js", + chunkFormat: "module" + }, + experiments: { + outputModule: true + }, + resolve: { + extensions: [".js"] + }, + externalsType: "module", + externals: [ + "externals0", + "externals1", + "externals2", + "externals3", + "externals4" + ], + optimization: { + concatenateModules: true, + usedExports: true + }, + plugins: [ + (compiler) => { + compiler.hooks.compilation.tap( + "testcase", + ( + /** @type {import("../../../../types").Compilation} */ compilation + ) => { + compilation.hooks.afterProcessAssets.tap( + "testcase", + ( + /** @type {Record} */ assets + ) => { + const source = assets["test.js"].source(); + expect(source).toMatchSnapshot(); + } + ); + } + ); + } + ] +}; diff --git a/test/configCases/library/modern-module-named-import-externals/index.js b/test/configCases/library/modern-module-named-import-externals/index.js new file mode 100644 index 00000000000..f6e48fad94d --- /dev/null +++ b/test/configCases/library/modern-module-named-import-externals/index.js @@ -0,0 +1,7 @@ + +it('should compile', () => {}); + +it('should handle external modules with concatenation and caching', () => { + // This test ensures serialization works with caching enabled + expect(true).toBe(true); +}); diff --git a/test/configCases/library/modern-module-named-import-externals/lib.js b/test/configCases/library/modern-module-named-import-externals/lib.js new file mode 100644 index 00000000000..650825e2bc7 --- /dev/null +++ b/test/configCases/library/modern-module-named-import-externals/lib.js @@ -0,0 +1,21 @@ +import { HomeLayout as aaa } from 'externals0'; + +const { HomeLayout = aaa } = {}; +console.log({ HomeLayout }); +{ + const { HomeLayout = aaa } = {}; + console.log({ HomeLayout }); +} +(() => { + { + const { HomeLayout = aaa } = {}; + console.log({ HomeLayout }); + } +})() + +{ + const { external_externals3_namespaceObject = "111" } = {} + console.log({ external_externals3_namespaceObject }); +} + +export { HomeLayout } \ No newline at end of file diff --git a/test/configCases/library/modern-module-named-import-externals/test.config.js b/test/configCases/library/modern-module-named-import-externals/test.config.js new file mode 100644 index 00000000000..a8755bed92f --- /dev/null +++ b/test/configCases/library/modern-module-named-import-externals/test.config.js @@ -0,0 +1,7 @@ +"use strict"; + +module.exports = { + findBundle() { + return ["main.js"]; + } +}; diff --git a/test/configCases/library/modern-module-named-import-externals/test.js b/test/configCases/library/modern-module-named-import-externals/test.js new file mode 100644 index 00000000000..eddb63f953d --- /dev/null +++ b/test/configCases/library/modern-module-named-import-externals/test.js @@ -0,0 +1,27 @@ +// re export +export { a } from 'externals0' + +// named import +import { a as a_2, HomeLayout as aaa } from 'externals1' +import { a as a_0 } from 'externals0' + +// default import +import defaultValue from 'externals2' + +// namespace import +import * as namespace from 'externals3' + +// side effect only import +import 'externals4' + +export { HomeLayout } from './lib' + +{ + const HomeLayout_0 = 'HomeLayout_0'; + HomeLayout_0; +} +aaa; +a_0; +a_2; +defaultValue; +namespace; \ No newline at end of file diff --git a/test/configCases/library/modern-module-named-import-externals/webpack.config.js b/test/configCases/library/modern-module-named-import-externals/webpack.config.js new file mode 100644 index 00000000000..5b088d90a24 --- /dev/null +++ b/test/configCases/library/modern-module-named-import-externals/webpack.config.js @@ -0,0 +1,56 @@ +"use strict"; + +/** @type {import("../../../../types").Configuration} */ +module.exports = { + cache: { + type: "memory" // Enable memory cache to test serialization + }, + mode: "none", + entry: { main: "./index.js", test: "./test.js" }, + output: { + module: true, + library: { + type: "modern-module" + }, + filename: "[name].js", + chunkFormat: "module" + }, + experiments: { + outputModule: true + }, + resolve: { + extensions: [".js"] + }, + externalsType: "module", + externals: [ + "externals0", + "externals1", + "externals2", + "externals3", + "externals4" + ], + optimization: { + concatenateModules: false, + usedExports: true + }, + plugins: [ + (compiler) => { + compiler.hooks.compilation.tap( + "testcase", + ( + /** @type {import("../../../../types").Compilation} */ compilation + ) => { + compilation.hooks.afterProcessAssets.tap( + "testcase", + ( + /** @type {Record} */ assets + ) => { + const source = assets["test.js"].source(); + expect(source).toMatchSnapshot(); + } + ); + } + ); + } + ] +}; diff --git a/test/configCases/library/module-named-import-externals/index.js b/test/configCases/library/module-named-import-externals/index.js new file mode 100644 index 00000000000..15879c481b1 --- /dev/null +++ b/test/configCases/library/module-named-import-externals/index.js @@ -0,0 +1,21 @@ +import { readFileSync, writeFileSync as aaa } from 'fs' +import * as path from 'path' +import * as fs from 'fs' + +const { writeFileSync = aaa } = {} +console.log({ writeFileSync }); + + +{ + const { writeFileSync = aaa } = {} + console.log({ writeFileSync }); +} + +it('should handle external modules with concatenation and caching', () => { + expect(typeof readFileSync).toBe('function'); + const { writeFileSync = aaa } = {} + expect(typeof writeFileSync).toBe('function'); + expect(typeof path.join).toBe('function'); +}); + +export { readFileSync, writeFileSync, path, fs } \ No newline at end of file diff --git a/test/configCases/library/module-named-import-externals/test.config.js b/test/configCases/library/module-named-import-externals/test.config.js new file mode 100644 index 00000000000..9100dc59963 --- /dev/null +++ b/test/configCases/library/module-named-import-externals/test.config.js @@ -0,0 +1,7 @@ +"use strict"; + +module.exports = { + findBundle() { + return ["main.mjs"]; + } +}; diff --git a/test/configCases/library/module-named-import-externals/webpack.config.js b/test/configCases/library/module-named-import-externals/webpack.config.js new file mode 100644 index 00000000000..78ca1e13e7a --- /dev/null +++ b/test/configCases/library/module-named-import-externals/webpack.config.js @@ -0,0 +1,26 @@ +"use strict"; + +/** @type {import("../../../../types").Configuration} */ +module.exports = { + entry: { main: "./index.js" }, + output: { + module: true, + library: { + type: "module" + }, + filename: "[name].mjs", + chunkFormat: "module" + }, + experiments: { + outputModule: true + }, + resolve: { + extensions: [".js"] + }, + externals: ["fs", "path"], + externalsType: "module", + optimization: { + concatenateModules: true, + usedExports: true + } +}; diff --git a/test/configCases/split-chunks/asnyc-entries/webpack.config.js b/test/configCases/split-chunks/asnyc-entries/webpack.config.js index 668c6ba5e78..d45fc7ec296 100644 --- a/test/configCases/split-chunks/asnyc-entries/webpack.config.js +++ b/test/configCases/split-chunks/asnyc-entries/webpack.config.js @@ -2,6 +2,9 @@ module.exports = { output: { - filename: "[name].js" + filename: "[name].js", + environment: { + nodePrefixForCoreModules: false + } } }; diff --git a/types.d.ts b/types.d.ts index 01ac4e67f25..7e422d489db 100644 --- a/types.d.ts +++ b/types.d.ts @@ -2751,6 +2751,7 @@ declare interface ConcatenatedModuleInfo { rawExportMap?: Map; namespaceExportSymbol?: string; namespaceObjectName?: string; + concatenationScope?: ConcatenationScope; /** * "default-with-named" namespace @@ -2796,12 +2797,17 @@ declare interface ConcatenationBailoutReasonContext { declare class ConcatenationScope { constructor( modulesMap: ModuleInfo[] | Map, - currentModule: ConcatenatedModuleInfo + currentModule: ConcatenatedModuleInfo, + usedNames: Set ); + usedNames: Set; isModuleInScope(module: Module): boolean; registerExport(exportName: string, symbol: string): void; registerRawExport(exportName: string, expression: string): void; + getRawExport(exportName: string): undefined | string; + setRawExportMap(exportName: string, expression: string): void; registerNamespaceExport(symbol: string): void; + registerUsedName(symbol: string): boolean; createModuleReference( module: Module, __1: Partial @@ -5230,6 +5236,7 @@ declare class ExternalModule extends Module { unsafeCacheData: UnsafeCacheData, normalModuleFactory: NormalModuleFactory ): void; + static ModuleExternalInitFragment: typeof ModuleExternalInitFragment; } declare interface ExternalModuleInfo { type: "external"; @@ -6276,6 +6283,7 @@ type ImportSource = | SimpleLiteral | RegExpLiteral | BigIntLiteral; +type Imported = true | [string, string][]; /** * Options for infrastructure level logging. @@ -6338,6 +6346,8 @@ declare class InitFragment { serialize(context: ObjectSerializerContext): void; deserialize(context: ObjectDeserializerContext): void; merge: any; + getImported: any; + setImported: any; static addToSource( source: Source, initFragments: InitFragment[], @@ -9809,6 +9819,28 @@ declare class ModuleDependency extends Dependency { static EXPORTS_OBJECT_REFERENCED: string[][]; static TRANSITIVE: typeof TRANSITIVE; } +declare class ModuleExternalInitFragment extends InitFragment { + constructor( + request: string, + imported: Imported, + ident?: string, + dependencyMeta?: ImportDependencyMeta, + hashFunction?: string | typeof Hash + ); + getNamespaceIdentifier(): string; + static addToSource( + source: Source, + initFragments: InitFragment[], + context: Context + ): Source; + static STAGE_CONSTANTS: number; + static STAGE_ASYNC_BOUNDARY: number; + static STAGE_HARMONY_EXPORTS: number; + static STAGE_HARMONY_IMPORTS: number; + static STAGE_PROVIDES: number; + static STAGE_ASYNC_DEPENDENCIES: number; + static STAGE_ASYNC_HARMONY_IMPORTS: number; +} declare abstract class ModuleFactory { create( data: ModuleFactoryCreateData, @@ -17585,6 +17617,10 @@ declare namespace exports { export let ensureChunkHandlers: "__webpack_require__.f"; export let ensureChunkIncludeEntries: "__webpack_require__.f (include entries)"; export let entryModuleId: "__webpack_require__.s"; + export let esmId: "__webpack_esm_id__"; + export let esmIds: "__webpack_esm_ids__"; + export let esmModules: "__webpack_esm_modules__"; + export let esmRuntime: "__webpack_esm_runtime__"; export let exports: "__webpack_exports__"; export let externalInstallChunk: "__webpack_require__.C"; export let getChunkCssFilename: "__webpack_require__.k"; diff --git a/yarn.lock b/yarn.lock index b5e16e9545f..a685a44b689 100644 --- a/yarn.lock +++ b/yarn.lock @@ -116,7 +116,7 @@ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz#54da796097ab19ce67ed9f88b47bb2ec49367687" integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA== -"@babel/helper-validator-identifier@^7.25.9", "@babel/helper-validator-identifier@^7.27.1": +"@babel/helper-validator-identifier@^7.27.1": version "7.27.1" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz#a7054dcc145a967dd4dc8fee845a57c1316c9df8" integrity sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow== @@ -798,7 +798,7 @@ esquery "^1.6.0" jsdoc-type-pratt-parser "~4.1.0" -"@eslint-community/eslint-utils@^4.1.2", "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.5.0", "@eslint-community/eslint-utils@^4.5.1", "@eslint-community/eslint-utils@^4.7.0": +"@eslint-community/eslint-utils@^4.1.2", "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.5.0", "@eslint-community/eslint-utils@^4.7.0": version "4.7.0" resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz#607084630c6c033992a082de6e6fbc1a8b52175a" integrity sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw== @@ -824,20 +824,6 @@ resolved "https://registry.yarnpkg.com/@eslint/config-helpers/-/config-helpers-0.3.0.tgz#3e09a90dfb87e0005c7694791e58e97077271286" integrity sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw== -"@eslint/core@^0.13.0": - version "0.13.0" - resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.13.0.tgz#bf02f209846d3bf996f9e8009db62df2739b458c" - integrity sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw== - dependencies: - "@types/json-schema" "^7.0.15" - -"@eslint/core@^0.14.0": - version "0.14.0" - resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.14.0.tgz#326289380968eaf7e96f364e1e4cf8f3adf2d003" - integrity sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg== - dependencies: - "@types/json-schema" "^7.0.15" - "@eslint/core@^0.15.0", "@eslint/core@^0.15.1": version "0.15.1" resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.15.1.tgz#d530d44209cbfe2f82ef86d6ba08760196dd3b60" @@ -860,22 +846,22 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@9.31.0", "@eslint/js@^9.29.0": - version "9.31.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.31.0.tgz#adb1f39953d8c475c4384b67b67541b0d7206ed8" - integrity sha512-LOm5OVt7D4qiKCqoiPbA7LWmI+tbw1VbTUowBcUMgQSuM6poJufkFkYDcQpo5KfgD39TnNySV26QjOh7VFpSyw== +"@eslint/js@9.32.0", "@eslint/js@^9.29.0": + version "9.32.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.32.0.tgz#a02916f58bd587ea276876cb051b579a3d75d091" + integrity sha512-BBpRFZK3eX6uMLKz8WxFOBIFFcGFJ/g8XuwjTHCqHROSIsopI+ddn/d5Cfh36+7+e5edVS8dbSHnBNhrLEX0zg== -"@eslint/markdown@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@eslint/markdown/-/markdown-7.0.0.tgz#e5711a23fd69764a31f4abfd1612de05f14ac3c3" - integrity sha512-0WNH6pSFHNlWSlNaIFQP0sLHpMUJw1FaJtyqapvGqOt0ISRgTUkTLVT0hT/zekDA1QlP2TT8pwjPkqYTu2s8yg== +"@eslint/markdown@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@eslint/markdown/-/markdown-7.1.0.tgz#c35be3f16d9e74077ca238ceca184ded0bac74bc" + integrity sha512-Y+X1B1j+/zupKDVJfkKc8uYMjQkGzfnd8lt7vK3y8x9Br6H5dBuhAfFrQ6ff7HAMm/1BwgecyEiRFkYCWPRxmA== dependencies: - "@eslint/core" "^0.14.0" - "@eslint/plugin-kit" "^0.3.1" + "@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.0.0" + mdast-util-gfm "^3.1.0" micromark-extension-frontmatter "^2.0.0" micromark-extension-gfm "^3.0.0" @@ -884,18 +870,10 @@ resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.6.tgz#58369ab5b5b3ca117880c0f6c0b0f32f6950f24f" integrity sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA== -"@eslint/plugin-kit@^0.2.7": - version "0.2.8" - resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.2.8.tgz#47488d8f8171b5d4613e833313f3ce708e3525f8" - integrity sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA== - dependencies: - "@eslint/core" "^0.13.0" - levn "^0.4.1" - -"@eslint/plugin-kit@^0.3.1": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.3.3.tgz#32926b59bd407d58d817941e48b2a7049359b1fd" - integrity sha512-1+WqvgNMhmlAambTvT3KPtCl/Ibr68VldY2XY40SL1CE0ZXiakFR/cbTspaF5HsnpDMvcYYoJHfl4980NBjGag== +"@eslint/plugin-kit@^0.3.3", "@eslint/plugin-kit@^0.3.4": + version "0.3.4" + resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.3.4.tgz#c6b9f165e94bf4d9fdd493f1c028a94aaf5fc1cc" + integrity sha512-Ul5l+lHEcw3L5+k8POx6r74mxEYKG5kOb6Xpy2gCRW6zweT6TEhAf8vhxGgjhqrd/VO/Dirhsb+1hNpD1ue9hw== dependencies: "@eslint/core" "^0.15.1" levn "^0.4.1" @@ -963,50 +941,50 @@ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== -"@jest/console@30.0.4": - version "30.0.4" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-30.0.4.tgz#943a62c3c8e3f495290f2e2c3749b7b4516c3e93" - integrity sha512-tMLCDvBJBwPqMm4OAiuKm2uF5y5Qe26KgcMn+nrDSWpEW+eeFmqA0iO4zJfL16GP7gE3bUUQ3hIuUJ22AqVRnw== +"@jest/console@30.0.5": + version "30.0.5" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-30.0.5.tgz#d7d027c2db5c64c20a973b7f3e57b49956d6c335" + integrity sha512-xY6b0XiL0Nav3ReresUarwl2oIz1gTnxGbGpho9/rbUWsLH0f1OD/VT84xs8c7VmH7MChnLb0pag6PhZhAdDiA== dependencies: - "@jest/types" "30.0.1" + "@jest/types" "30.0.5" "@types/node" "*" chalk "^4.1.2" - jest-message-util "30.0.2" - jest-util "30.0.2" + jest-message-util "30.0.5" + jest-util "30.0.5" slash "^3.0.0" -"@jest/core@30.0.4": - version "30.0.4" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-30.0.4.tgz#a8fc7fcdc8a650f50f33dd585d774a1f683e9e59" - integrity sha512-MWScSO9GuU5/HoWjpXAOBs6F/iobvK1XlioelgOM9St7S0Z5WTI9kjCQLPeo4eQRRYusyLW25/J7J5lbFkrYXw== +"@jest/core@30.0.5": + version "30.0.5" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-30.0.5.tgz#b5778922d2928f676636e3ec199829554e61e452" + integrity sha512-fKD0OulvRsXF1hmaFgHhVJzczWzA1RXMMo9LTPuFXo9q/alDbME3JIyWYqovWsUBWSoBcsHaGPSLF9rz4l9Qeg== dependencies: - "@jest/console" "30.0.4" + "@jest/console" "30.0.5" "@jest/pattern" "30.0.1" - "@jest/reporters" "30.0.4" - "@jest/test-result" "30.0.4" - "@jest/transform" "30.0.4" - "@jest/types" "30.0.1" + "@jest/reporters" "30.0.5" + "@jest/test-result" "30.0.5" + "@jest/transform" "30.0.5" + "@jest/types" "30.0.5" "@types/node" "*" ansi-escapes "^4.3.2" chalk "^4.1.2" ci-info "^4.2.0" exit-x "^0.2.2" graceful-fs "^4.2.11" - jest-changed-files "30.0.2" - jest-config "30.0.4" - jest-haste-map "30.0.2" - jest-message-util "30.0.2" + jest-changed-files "30.0.5" + jest-config "30.0.5" + jest-haste-map "30.0.5" + jest-message-util "30.0.5" jest-regex-util "30.0.1" - jest-resolve "30.0.2" - jest-resolve-dependencies "30.0.4" - jest-runner "30.0.4" - jest-runtime "30.0.4" - jest-snapshot "30.0.4" - jest-util "30.0.2" - jest-validate "30.0.2" - jest-watcher "30.0.4" + jest-resolve "30.0.5" + jest-resolve-dependencies "30.0.5" + jest-runner "30.0.5" + jest-runtime "30.0.5" + jest-snapshot "30.0.5" + jest-util "30.0.5" + jest-validate "30.0.5" + jest-watcher "30.0.5" micromatch "^4.0.8" - pretty-format "30.0.2" + pretty-format "30.0.5" slash "^3.0.0" "@jest/diff-sequences@30.0.1": @@ -1014,57 +992,57 @@ resolved "https://registry.yarnpkg.com/@jest/diff-sequences/-/diff-sequences-30.0.1.tgz#0ededeae4d071f5c8ffe3678d15f3a1be09156be" integrity sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw== -"@jest/environment@30.0.4": - version "30.0.4" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-30.0.4.tgz#fb0deafd8a3cbb06cd9ce0b52c6bcaf342778428" - integrity sha512-5NT+sr7ZOb8wW7C4r7wOKnRQ8zmRWQT2gW4j73IXAKp5/PX1Z8MCStBLQDYfIG3n1Sw0NRfYGdp0iIPVooBAFQ== +"@jest/environment@30.0.5": + version "30.0.5" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-30.0.5.tgz#eaaae0403c7d3f8414053c2224acc3011e1c3a1b" + integrity sha512-aRX7WoaWx1oaOkDQvCWImVQ8XNtdv5sEWgk4gxR6NXb7WBUnL5sRak4WRzIQRZ1VTWPvV4VI4mgGjNL9TeKMYA== dependencies: - "@jest/fake-timers" "30.0.4" - "@jest/types" "30.0.1" + "@jest/fake-timers" "30.0.5" + "@jest/types" "30.0.5" "@types/node" "*" - jest-mock "30.0.2" + jest-mock "30.0.5" -"@jest/expect-utils@30.0.4": - version "30.0.4" - resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-30.0.4.tgz#0512fb2588c7fc463ce26fb38c0d47814266d965" - integrity sha512-EgXecHDNfANeqOkcak0DxsoVI4qkDUsR7n/Lr2vtmTBjwLPBnnPOF71S11Q8IObWzxm2QgQoY6f9hzrRD3gHRA== +"@jest/expect-utils@30.0.5": + version "30.0.5" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-30.0.5.tgz#9d42e4b8bc80367db30abc6c42b2cb14073f66fc" + integrity sha512-F3lmTT7CXWYywoVUGTCmom0vXq3HTTkaZyTAzIy+bXSBizB7o5qzlC9VCtq0arOa8GqmNsbg/cE9C6HLn7Szew== dependencies: "@jest/get-type" "30.0.1" -"@jest/expect@30.0.4": - version "30.0.4" - resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-30.0.4.tgz#de25549873ccc0302faeef96044acae464f50997" - integrity sha512-Z/DL7t67LBHSX4UzDyeYKqOxE/n7lbrrgEwWM3dGiH5Dgn35nk+YtgzKudmfIrBI8DRRrKYY5BCo3317HZV1Fw== +"@jest/expect@30.0.5": + version "30.0.5" + resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-30.0.5.tgz#2bbd101df4869f5d171c3cfee881f810f1525005" + integrity sha512-6udac8KKrtTtC+AXZ2iUN/R7dp7Ydry+Fo6FPFnDG54wjVMnb6vW/XNlf7Xj8UDjAE3aAVAsR4KFyKk3TCXmTA== dependencies: - expect "30.0.4" - jest-snapshot "30.0.4" + expect "30.0.5" + jest-snapshot "30.0.5" -"@jest/fake-timers@30.0.4": - version "30.0.4" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-30.0.4.tgz#fdd4552541a99826e488fc01afdb7626d6ad46cd" - integrity sha512-qZ7nxOcL5+gwBO6LErvwVy5k06VsX/deqo2XnVUSTV0TNC9lrg8FC3dARbi+5lmrr5VyX5drragK+xLcOjvjYw== +"@jest/fake-timers@30.0.5": + version "30.0.5" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-30.0.5.tgz#c028a9465a44b7744cb2368196bed89ce13c7054" + integrity sha512-ZO5DHfNV+kgEAeP3gK3XlpJLL4U3Sz6ebl/n68Uwt64qFFs5bv4bfEEjyRGK5uM0C90ewooNgFuKMdkbEoMEXw== dependencies: - "@jest/types" "30.0.1" + "@jest/types" "30.0.5" "@sinonjs/fake-timers" "^13.0.0" "@types/node" "*" - jest-message-util "30.0.2" - jest-mock "30.0.2" - jest-util "30.0.2" + jest-message-util "30.0.5" + jest-mock "30.0.5" + jest-util "30.0.5" "@jest/get-type@30.0.1": version "30.0.1" resolved "https://registry.yarnpkg.com/@jest/get-type/-/get-type-30.0.1.tgz#0d32f1bbfba511948ad247ab01b9007724fc9f52" integrity sha512-AyYdemXCptSRFirI5EPazNxyPwAL0jXt3zceFjaj8NFiKP9pOi0bfXonf6qkf82z2t3QWPeLCWWw4stPBzctLw== -"@jest/globals@30.0.4": - version "30.0.4" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-30.0.4.tgz#8650aa24c587fae830915b5c3518e82bd2ac5e60" - integrity sha512-avyZuxEHF2EUhFF6NEWVdxkRRV6iXXcIES66DLhuLlU7lXhtFG/ySq/a8SRZmEJSsLkNAFX6z6mm8KWyXe9OEA== +"@jest/globals@30.0.5": + version "30.0.5" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-30.0.5.tgz#ca70e0ac08ab40417cf8cd92bcb76116c2ccca63" + integrity sha512-7oEJT19WW4oe6HR7oLRvHxwlJk2gev0U9px3ufs8sX9PoD1Eza68KF0/tlN7X0dq/WVsBScXQGgCldA1V9Y/jA== dependencies: - "@jest/environment" "30.0.4" - "@jest/expect" "30.0.4" - "@jest/types" "30.0.1" - jest-mock "30.0.2" + "@jest/environment" "30.0.5" + "@jest/expect" "30.0.5" + "@jest/types" "30.0.5" + jest-mock "30.0.5" "@jest/pattern@30.0.1": version "30.0.1" @@ -1074,16 +1052,16 @@ "@types/node" "*" jest-regex-util "30.0.1" -"@jest/reporters@30.0.4": - version "30.0.4" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-30.0.4.tgz#8ff5939713f643f788b48d3edcf15f2c06a00a63" - integrity sha512-6ycNmP0JSJEEys1FbIzHtjl9BP0tOZ/KN6iMeAKrdvGmUsa1qfRdlQRUDKJ4P84hJ3xHw1yTqJt4fvPNHhyE+g== +"@jest/reporters@30.0.5": + version "30.0.5" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-30.0.5.tgz#b83585e6448d390a8d92a641c567f1655976d5c6" + integrity sha512-mafft7VBX4jzED1FwGC1o/9QUM2xebzavImZMeqnsklgcyxBto8mV4HzNSzUrryJ+8R9MFOM3HgYuDradWR+4g== dependencies: "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "30.0.4" - "@jest/test-result" "30.0.4" - "@jest/transform" "30.0.4" - "@jest/types" "30.0.1" + "@jest/console" "30.0.5" + "@jest/test-result" "30.0.5" + "@jest/transform" "30.0.5" + "@jest/types" "30.0.5" "@jridgewell/trace-mapping" "^0.3.25" "@types/node" "*" chalk "^4.1.2" @@ -1096,26 +1074,26 @@ istanbul-lib-report "^3.0.0" istanbul-lib-source-maps "^5.0.0" istanbul-reports "^3.1.3" - jest-message-util "30.0.2" - jest-util "30.0.2" - jest-worker "30.0.2" + jest-message-util "30.0.5" + jest-util "30.0.5" + jest-worker "30.0.5" slash "^3.0.0" string-length "^4.0.2" v8-to-istanbul "^9.0.1" -"@jest/schemas@30.0.1": - version "30.0.1" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-30.0.1.tgz#27c00d707d480ece0c19126af97081a1af3bc46e" - integrity sha512-+g/1TKjFuGrf1Hh0QPCv0gISwBxJ+MQSNXmG9zjHy7BmFhtoJ9fdNhWJp3qUKRi93AOZHXtdxZgJ1vAtz6z65w== +"@jest/schemas@30.0.5": + version "30.0.5" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-30.0.5.tgz#7bdf69fc5a368a5abdb49fd91036c55225846473" + integrity sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA== dependencies: "@sinclair/typebox" "^0.34.0" -"@jest/snapshot-utils@30.0.4": - version "30.0.4" - resolved "https://registry.yarnpkg.com/@jest/snapshot-utils/-/snapshot-utils-30.0.4.tgz#cd5b3d21e19255106b12350d55c1b9bf613fbcfa" - integrity sha512-BEpX8M/Y5lG7MI3fmiO+xCnacOrVsnbqVrcDZIT8aSGkKV1w2WwvRQxSWw5SIS8ozg7+h8tSj5EO1Riqqxcdag== +"@jest/snapshot-utils@30.0.5": + version "30.0.5" + resolved "https://registry.yarnpkg.com/@jest/snapshot-utils/-/snapshot-utils-30.0.5.tgz#e23a0e786f174e8cff7f150c1cfbdc9cb7cc81a4" + integrity sha512-XcCQ5qWHLvi29UUrowgDFvV4t7ETxX91CbDczMnoqXPOIcZOxyNdSjm6kV5XMc8+HkxfRegU/MUmnTbJRzGrUQ== dependencies: - "@jest/types" "30.0.1" + "@jest/types" "30.0.5" chalk "^4.1.2" graceful-fs "^4.2.11" natural-compare "^1.4.0" @@ -1129,54 +1107,54 @@ callsites "^3.1.0" graceful-fs "^4.2.11" -"@jest/test-result@30.0.4": - version "30.0.4" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-30.0.4.tgz#0b1c4e8256e3f9ebb9452ede22d4b04b31ea54fe" - integrity sha512-Mfpv8kjyKTHqsuu9YugB6z1gcdB3TSSOaKlehtVaiNlClMkEHY+5ZqCY2CrEE3ntpBMlstX/ShDAf84HKWsyIw== +"@jest/test-result@30.0.5": + version "30.0.5" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-30.0.5.tgz#064c5210c24d5ea192fb02ceddad3be1cfa557c8" + integrity sha512-wPyztnK0gbDMQAJZ43tdMro+qblDHH1Ru/ylzUo21TBKqt88ZqnKKK2m30LKmLLoKtR2lxdpCC/P3g1vfKcawQ== dependencies: - "@jest/console" "30.0.4" - "@jest/types" "30.0.1" + "@jest/console" "30.0.5" + "@jest/types" "30.0.5" "@types/istanbul-lib-coverage" "^2.0.6" collect-v8-coverage "^1.0.2" -"@jest/test-sequencer@30.0.4": - version "30.0.4" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-30.0.4.tgz#4ef749c994beca340e274e67a4c90f0154482e5f" - integrity sha512-bj6ePmqi4uxAE8EHE0Slmk5uBYd9Vd/PcVt06CsBxzH4bbA8nGsI1YbXl/NH+eii4XRtyrRx+Cikub0x8H4vDg== +"@jest/test-sequencer@30.0.5": + version "30.0.5" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-30.0.5.tgz#c6dba8fc3c386dd793c087626e8508ff1ead19f4" + integrity sha512-Aea/G1egWoIIozmDD7PBXUOxkekXl7ueGzrsGGi1SbeKgQqCYCIf+wfbflEbf2LiPxL8j2JZGLyrzZagjvW4YQ== dependencies: - "@jest/test-result" "30.0.4" + "@jest/test-result" "30.0.5" graceful-fs "^4.2.11" - jest-haste-map "30.0.2" + jest-haste-map "30.0.5" slash "^3.0.0" -"@jest/transform@30.0.4": - version "30.0.4" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-30.0.4.tgz#a06f8c6fc2a04985241b483096f821bafb99cc93" - integrity sha512-atvy4hRph/UxdCIBp+UB2jhEA/jJiUeGZ7QPgBi9jUUKNgi3WEoMXGNG7zbbELG2+88PMabUNCDchmqgJy3ELg== +"@jest/transform@30.0.5": + version "30.0.5" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-30.0.5.tgz#f8ca2e9f7466b77b406807d3bef1f6790dd384e4" + integrity sha512-Vk8amLQCmuZyy6GbBht1Jfo9RSdBtg7Lks+B0PecnjI8J+PCLQPGh7uI8Q/2wwpW2gLdiAfiHNsmekKlywULqg== dependencies: "@babel/core" "^7.27.4" - "@jest/types" "30.0.1" + "@jest/types" "30.0.5" "@jridgewell/trace-mapping" "^0.3.25" babel-plugin-istanbul "^7.0.0" chalk "^4.1.2" convert-source-map "^2.0.0" fast-json-stable-stringify "^2.1.0" graceful-fs "^4.2.11" - jest-haste-map "30.0.2" + jest-haste-map "30.0.5" jest-regex-util "30.0.1" - jest-util "30.0.2" + jest-util "30.0.5" micromatch "^4.0.8" pirates "^4.0.7" slash "^3.0.0" write-file-atomic "^5.0.1" -"@jest/types@30.0.1": - version "30.0.1" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-30.0.1.tgz#a46df6a99a416fa685740ac4264b9f9cd7da1598" - integrity sha512-HGwoYRVF0QSKJu1ZQX0o5ZrUrrhj0aOOFA8hXrumD7SIzjouevhawbTjmXdwOmURdGluU9DM/XvGm3NyFoiQjw== +"@jest/types@30.0.5": + version "30.0.5" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-30.0.5.tgz#29a33a4c036e3904f1cfd94f6fe77f89d2e1cc05" + integrity sha512-aREYa3aku9SSnea4aX6bhKn4bgv3AXkgijoQgbYV3yvbiGt6z+MQ85+6mIhx9DsKW2BuB/cLR/A+tcMThx+KLQ== dependencies: "@jest/pattern" "30.0.1" - "@jest/schemas" "30.0.1" + "@jest/schemas" "30.0.5" "@types/istanbul-lib-coverage" "^2.0.6" "@types/istanbul-reports" "^3.0.4" "@types/node" "*" @@ -1336,10 +1314,10 @@ dependencies: "@sinonjs/commons" "^3.0.1" -"@stylistic/eslint-plugin@^5.0.0": - version "5.2.0" - resolved "https://registry.yarnpkg.com/@stylistic/eslint-plugin/-/eslint-plugin-5.2.0.tgz#fd664d2c81544cbe12c35d4af6d79b42814fc57f" - integrity sha512-RCEdbREv9EBiToUBQTlRhVYKG093I6ZnnQ990j08eJ6uRZh71DXkOnoxtTLfDQ6utVCVQzrhZFHZP0zfrfOIjA== +"@stylistic/eslint-plugin@^5.2.2": + version "5.2.2" + resolved "https://registry.yarnpkg.com/@stylistic/eslint-plugin/-/eslint-plugin-5.2.2.tgz#a1cb24f17263e1dcb2d5c94069dc3ae7af1eb9ce" + integrity sha512-bE2DUjruqXlHYP3Q2Gpqiuj2bHq7/88FnuaS0FjeGGLCy+X6a07bGVuwtiOYnPSLHR6jmx5Bwdv+j7l8H+G97A== dependencies: "@eslint-community/eslint-utils" "^4.7.0" "@typescript-eslint/types" "^8.37.0" @@ -1487,10 +1465,10 @@ resolved "https://registry.yarnpkg.com/@types/ms/-/ms-2.1.0.tgz#052aa67a48eccc4309d7f0191b7e41434b90bb78" integrity sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA== -"@types/node@*", "@types/node@^24.0.13": - version "24.0.15" - resolved "https://registry.yarnpkg.com/@types/node/-/node-24.0.15.tgz#f34fbc973e7d64217106e0c59ed8761e6b51381e" - integrity sha512-oaeTSbCef7U/z7rDeJA138xpG3NuKc64/rZ2qmUFkFJmnMsAPaluIifqyWd8hSSMxyP9oie3dLAqYPblag9KgA== +"@types/node@*", "@types/node@^24.1.0": + version "24.1.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-24.1.0.tgz#0993f7dc31ab5cc402d112315b463e383d68a49c" + integrity sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w== dependencies: undici-types "~7.8.0" @@ -2146,12 +2124,12 @@ axios@^1.4.0: form-data "^4.0.4" proxy-from-env "^1.1.0" -babel-jest@30.0.4: - version "30.0.4" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-30.0.4.tgz#63945c1b27227312fc687689073124dba5b28282" - integrity sha512-UjG2j7sAOqsp2Xua1mS/e+ekddkSu3wpf4nZUSvXNHuVWdaOUXQ77+uyjJLDE9i0atm5x4kds8K9yb5lRsRtcA== +babel-jest@30.0.5: + version "30.0.5" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-30.0.5.tgz#7cc7dd03d0d613125d458521f635b8c2361e89cc" + integrity sha512-mRijnKimhGDMsizTvBTWotwNpzrkHr+VvZUQBof2AufXKB8NXrL1W69TG20EvOz7aevx6FTJIaBuBkYxS8zolg== dependencies: - "@jest/transform" "30.0.4" + "@jest/transform" "30.0.5" "@types/babel__core" "^7.20.5" babel-plugin-istanbul "^7.0.0" babel-preset-jest "30.0.1" @@ -2417,6 +2395,11 @@ chalk@^5.2.0, chalk@^5.4.1: resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.4.1.tgz#1b48bf0963ec158dce2aacf69c093ae2dd2092d8" integrity sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w== +change-case@^5.4.4: + version "5.4.4" + resolved "https://registry.yarnpkg.com/change-case/-/change-case-5.4.4.tgz#0d52b507d8fb8f204343432381d1a6d7bff97a02" + integrity sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w== + char-regex@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" @@ -2451,7 +2434,7 @@ chrome-trace-event@^1.0.2: resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz#05bffd7ff928465093314708c93bdfa9bd1f0f5b" integrity sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ== -ci-info@^4.2.0: +ci-info@^4.2.0, ci-info@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-4.3.0.tgz#c39b1013f8fdbd28cd78e62318357d02da160cd7" integrity sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ== @@ -2658,7 +2641,7 @@ copy-anything@^2.0.1: dependencies: is-what "^3.14.1" -core-js-compat@^3.41.0: +core-js-compat@^3.44.0: version "3.44.0" resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.44.0.tgz#62b9165b97e4cbdb8bca16b14818e67428b4a0f8" integrity sha512-JepmAj2zfl6ogy34qfWtcE7nHKAJnKsQFRn++scjVS2bZFllwptzw61BZcZFYBPpUznLfAvh0LGhxKppk04ClA== @@ -3311,15 +3294,15 @@ eslint-config-prettier@^10.1.1: resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz#15734ce4af8c2778cc32f0b01b37b0b5cd1ecb97" integrity sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w== -eslint-config-webpack@^4.4.1: - version "4.4.1" - resolved "https://registry.yarnpkg.com/eslint-config-webpack/-/eslint-config-webpack-4.4.1.tgz#cfcb77c3295c8f1c3fcbd523d71e2ccc7092e16a" - integrity sha512-IPerJYT5ErPUbrVUCNVQF5RmCUrnA1Am8D1wJufetmEu4hsZXzigy4wP6uroLv8s9GBpiEPM5NZ0PHmao4tUMw== +eslint-config-webpack@^4.5.1: + version "4.5.1" + resolved "https://registry.yarnpkg.com/eslint-config-webpack/-/eslint-config-webpack-4.5.1.tgz#553f591d027bb9a869059ed1d328b6cee104483a" + integrity sha512-Qiq0PSjx7P1ncI9PCTvfW8c76OqkXAFr91TQGa+u1FAMHXMur3in8hwL7fXYPi2oF8ytI1Zuoc2TmDzX0ZO4tA== dependencies: detect-indent "^7.0.1" jsonc-eslint-parser "^2.4.0" semver "^7.7.2" - sort-package-json "^3.3.1" + sort-package-json "^3.4.0" eslint-import-resolver-node@^0.3.9: version "0.3.9" @@ -3417,27 +3400,28 @@ eslint-plugin-prettier@^5.5.0: prettier-linter-helpers "^1.0.0" synckit "^0.11.7" -eslint-plugin-unicorn@^59.0.1: - version "59.0.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-unicorn/-/eslint-plugin-unicorn-59.0.1.tgz#e76ca18f6b92633440973e5442923a36544a1422" - integrity sha512-EtNXYuWPUmkgSU2E7Ttn57LbRREQesIP1BiLn7OZLKodopKfDXfBUkC/0j6mpw2JExwf43Uf3qLSvrSvppgy8Q== +eslint-plugin-unicorn@^60.0.0: + version "60.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-unicorn/-/eslint-plugin-unicorn-60.0.0.tgz#68f712bcb17e94bd176cce7312647ba1d1409c3c" + integrity sha512-QUzTefvP8stfSXsqKQ+vBQSEsXIlAiCduS/V1Em+FKgL9c21U/IIm20/e3MFy1jyCf14tHAhqC1sX8OTy6VUCg== dependencies: - "@babel/helper-validator-identifier" "^7.25.9" - "@eslint-community/eslint-utils" "^4.5.1" - "@eslint/plugin-kit" "^0.2.7" - ci-info "^4.2.0" + "@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.41.0" + core-js-compat "^3.44.0" esquery "^1.6.0" find-up-simple "^1.0.1" - globals "^16.0.0" + 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.1" + semver "^7.7.2" strip-indent "^4.0.0" eslint-scope@5.1.1: @@ -3467,9 +3451,9 @@ eslint-visitor-keys@^4.2.1: integrity sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ== eslint@^9.29.0: - version "9.31.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.31.0.tgz#9a488e6da75bbe05785cd62e43c5ea99356d21ba" - integrity sha512-QldCVh/ztyKJJZLr4jXNUByx3gR+TDYZCRXEktiZoUR3PGy4qCmSbkxcIle8GEwGpb5JBZazlaJ/CxLidXdEbQ== + version "9.32.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.32.0.tgz#4ea28df4a8dbc454e1251e0f3aed4bcf4ce50a47" + integrity sha512-LSehfdpgMeWcTZkWZVIJl+tkZ2nuSkyyB9C27MZqFWXuph7DvaowgcTvKqxvpLW1JZIk8PN7hFY3Rj9LQ7m7lg== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@eslint-community/regexpp" "^4.12.1" @@ -3477,8 +3461,8 @@ eslint@^9.29.0: "@eslint/config-helpers" "^0.3.0" "@eslint/core" "^0.15.0" "@eslint/eslintrc" "^3.3.1" - "@eslint/js" "9.31.0" - "@eslint/plugin-kit" "^0.3.1" + "@eslint/js" "9.32.0" + "@eslint/plugin-kit" "^0.3.4" "@humanfs/node" "^0.16.6" "@humanwhocodes/module-importer" "^1.0.1" "@humanwhocodes/retry" "^0.4.2" @@ -3622,17 +3606,17 @@ exit-x@^0.2.2: resolved "https://registry.yarnpkg.com/exit-x/-/exit-x-0.2.2.tgz#1f9052de3b8d99a696b10dad5bced9bdd5c3aa64" integrity sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ== -expect@30.0.4, expect@^30.0.0: - version "30.0.4" - resolved "https://registry.yarnpkg.com/expect/-/expect-30.0.4.tgz#23ce0eaa9a1dcd72fcb78a228b9babdbcf9ddeca" - integrity sha512-dDLGjnP2cKbEppxVICxI/Uf4YemmGMPNy0QytCbfafbpYk9AFQsxb8Uyrxii0RPK7FWgLGlSem+07WirwS3cFQ== +expect@30.0.5, expect@^30.0.0: + version "30.0.5" + resolved "https://registry.yarnpkg.com/expect/-/expect-30.0.5.tgz#c23bf193c5e422a742bfd2990ad990811de41a5a" + integrity sha512-P0te2pt+hHI5qLJkIR+iMvS+lYUZml8rKKsohVHAGY+uClp9XVbdyYNJOIjSRpHVp8s8YqxJCiHUkSYZGr8rtQ== dependencies: - "@jest/expect-utils" "30.0.4" + "@jest/expect-utils" "30.0.5" "@jest/get-type" "30.0.1" - jest-matcher-utils "30.0.4" - jest-message-util "30.0.2" - jest-mock "30.0.2" - jest-util "30.0.2" + jest-matcher-utils "30.0.5" + jest-message-util "30.0.5" + jest-mock "30.0.5" + jest-util "30.0.5" exponential-backoff@^3.1.1: version "3.1.2" @@ -4096,7 +4080,7 @@ globals@^15.11.0: resolved "https://registry.yarnpkg.com/globals/-/globals-15.15.0.tgz#7c4761299d41c32b075715a4ce1ede7897ff72a8" integrity sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg== -globals@^16.0.0: +globals@^16.0.0, globals@^16.3.0: version "16.3.0" resolved "https://registry.yarnpkg.com/globals/-/globals-16.3.0.tgz#66118e765ddaf9e2d880f7e17658543f93f1f667" integrity sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ== @@ -4745,96 +4729,96 @@ jackspeak@^3.1.2: optionalDependencies: "@pkgjs/parseargs" "^0.11.0" -jest-changed-files@30.0.2: - version "30.0.2" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-30.0.2.tgz#2c275263037f8f291b71cbb0a4f639c519ab7eb8" - integrity sha512-Ius/iRST9FKfJI+I+kpiDh8JuUlAISnRszF9ixZDIqJF17FckH5sOzKC8a0wd0+D+8em5ADRHA5V5MnfeDk2WA== +jest-changed-files@30.0.5: + version "30.0.5" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-30.0.5.tgz#ec448f83bd9caa894dd7da8707f207c356a19924" + integrity sha512-bGl2Ntdx0eAwXuGpdLdVYVr5YQHnSZlQ0y9HVDu565lCUAe9sj6JOtBbMmBBikGIegne9piDDIOeiLVoqTkz4A== dependencies: execa "^5.1.1" - jest-util "30.0.2" + jest-util "30.0.5" p-limit "^3.1.0" -jest-circus@30.0.4, jest-circus@^30.0.3: - version "30.0.4" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-30.0.4.tgz#7bdfc5951eb883283bf0336cc4d624222f09851e" - integrity sha512-o6UNVfbXbmzjYgmVPtSQrr5xFZCtkDZGdTlptYvGFSN80RuOOlTe73djvMrs+QAuSERZWcHBNIOMH+OEqvjWuw== +jest-circus@30.0.5, jest-circus@^30.0.5: + version "30.0.5" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-30.0.5.tgz#9b4d44feb56c7ffe14411ad7fc08af188c5d4da7" + integrity sha512-h/sjXEs4GS+NFFfqBDYT7y5Msfxh04EwWLhQi0F8kuWpe+J/7tICSlswU8qvBqumR3kFgHbfu7vU6qruWWBPug== dependencies: - "@jest/environment" "30.0.4" - "@jest/expect" "30.0.4" - "@jest/test-result" "30.0.4" - "@jest/types" "30.0.1" + "@jest/environment" "30.0.5" + "@jest/expect" "30.0.5" + "@jest/test-result" "30.0.5" + "@jest/types" "30.0.5" "@types/node" "*" chalk "^4.1.2" co "^4.6.0" dedent "^1.6.0" is-generator-fn "^2.1.0" - jest-each "30.0.2" - jest-matcher-utils "30.0.4" - jest-message-util "30.0.2" - jest-runtime "30.0.4" - jest-snapshot "30.0.4" - jest-util "30.0.2" + jest-each "30.0.5" + jest-matcher-utils "30.0.5" + jest-message-util "30.0.5" + jest-runtime "30.0.5" + jest-snapshot "30.0.5" + jest-util "30.0.5" p-limit "^3.1.0" - pretty-format "30.0.2" + pretty-format "30.0.5" pure-rand "^7.0.0" slash "^3.0.0" stack-utils "^2.0.6" -jest-cli@30.0.4, jest-cli@^30.0.3: - version "30.0.4" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-30.0.4.tgz#85510c5ebffc4ed31b571b3e166bca3febe7ba4a" - integrity sha512-3dOrP3zqCWBkjoVG1zjYJpD9143N9GUCbwaF2pFF5brnIgRLHmKcCIw+83BvF1LxggfMWBA0gxkn6RuQVuRhIQ== +jest-cli@30.0.5, jest-cli@^30.0.5: + version "30.0.5" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-30.0.5.tgz#c3fbfdabd1a5c428429476f915a1ba6d0774cc50" + integrity sha512-Sa45PGMkBZzF94HMrlX4kUyPOwUpdZasaliKN3mifvDmkhLYqLLg8HQTzn6gq7vJGahFYMQjXgyJWfYImKZzOw== dependencies: - "@jest/core" "30.0.4" - "@jest/test-result" "30.0.4" - "@jest/types" "30.0.1" + "@jest/core" "30.0.5" + "@jest/test-result" "30.0.5" + "@jest/types" "30.0.5" chalk "^4.1.2" exit-x "^0.2.2" import-local "^3.2.0" - jest-config "30.0.4" - jest-util "30.0.2" - jest-validate "30.0.2" + jest-config "30.0.5" + jest-util "30.0.5" + jest-validate "30.0.5" yargs "^17.7.2" -jest-config@30.0.4: - version "30.0.4" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-30.0.4.tgz#a710897373ae2b0ad8db027cb7a06e6d4a903c41" - integrity sha512-3dzbO6sh34thAGEjJIW0fgT0GA0EVlkski6ZzMcbW6dzhenylXAE/Mj2MI4HonroWbkKc6wU6bLVQ8dvBSZ9lA== +jest-config@30.0.5: + version "30.0.5" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-30.0.5.tgz#567cf39b595229b786506a496c22e222d5e8d480" + integrity sha512-aIVh+JNOOpzUgzUnPn5FLtyVnqc3TQHVMupYtyeURSb//iLColiMIR8TxCIDKyx9ZgjKnXGucuW68hCxgbrwmA== dependencies: "@babel/core" "^7.27.4" "@jest/get-type" "30.0.1" "@jest/pattern" "30.0.1" - "@jest/test-sequencer" "30.0.4" - "@jest/types" "30.0.1" - babel-jest "30.0.4" + "@jest/test-sequencer" "30.0.5" + "@jest/types" "30.0.5" + babel-jest "30.0.5" chalk "^4.1.2" ci-info "^4.2.0" deepmerge "^4.3.1" glob "^10.3.10" graceful-fs "^4.2.11" - jest-circus "30.0.4" + jest-circus "30.0.5" jest-docblock "30.0.1" - jest-environment-node "30.0.4" + jest-environment-node "30.0.5" jest-regex-util "30.0.1" - jest-resolve "30.0.2" - jest-runner "30.0.4" - jest-util "30.0.2" - jest-validate "30.0.2" + jest-resolve "30.0.5" + jest-runner "30.0.5" + jest-util "30.0.5" + jest-validate "30.0.5" micromatch "^4.0.8" parse-json "^5.2.0" - pretty-format "30.0.2" + pretty-format "30.0.5" slash "^3.0.0" strip-json-comments "^3.1.1" -jest-diff@30.0.4, jest-diff@^30.0.3: - version "30.0.4" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-30.0.4.tgz#f6e71d19ed6e8f5c7f1bead9ac406c0dd6abce5a" - integrity sha512-TSjceIf6797jyd+R64NXqicttROD+Qf98fex7CowmlSn7f8+En0da1Dglwr1AXxDtVizoxXYZBlUQwNhoOXkNw== +jest-diff@30.0.5, jest-diff@^30.0.5: + version "30.0.5" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-30.0.5.tgz#b40f81e0c0d13e5b81c4d62b0d0dfa6a524ee0fd" + integrity sha512-1UIqE9PoEKaHcIKvq2vbibrCog4Y8G0zmOxgQUVEiTqwR5hJVMCoDsN1vFvI5JvwD37hjueZ1C4l2FyGnfpE0A== dependencies: "@jest/diff-sequences" "30.0.1" "@jest/get-type" "30.0.1" chalk "^4.1.2" - pretty-format "30.0.2" + pretty-format "30.0.5" jest-docblock@30.0.1: version "30.0.1" @@ -4843,43 +4827,43 @@ jest-docblock@30.0.1: dependencies: detect-newline "^3.1.0" -jest-each@30.0.2: - version "30.0.2" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-30.0.2.tgz#402e189784715f5c76f1bb97c29842e79abe99a1" - integrity sha512-ZFRsTpe5FUWFQ9cWTMguCaiA6kkW5whccPy9JjD1ezxh+mJeqmz8naL8Fl/oSbNJv3rgB0x87WBIkA5CObIUZQ== +jest-each@30.0.5: + version "30.0.5" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-30.0.5.tgz#5962264ff246cd757ba44db096c1bc5b4835173e" + integrity sha512-dKjRsx1uZ96TVyejD3/aAWcNKy6ajMaN531CwWIsrazIqIoXI9TnnpPlkrEYku/8rkS3dh2rbH+kMOyiEIv0xQ== dependencies: "@jest/get-type" "30.0.1" - "@jest/types" "30.0.1" + "@jest/types" "30.0.5" chalk "^4.1.2" - jest-util "30.0.2" - pretty-format "30.0.2" + jest-util "30.0.5" + pretty-format "30.0.5" -jest-environment-node@30.0.4, jest-environment-node@^30.0.2: - version "30.0.4" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-30.0.4.tgz#080f2d6e438ef35a4701a09207fd2cfa030cd4a3" - integrity sha512-p+rLEzC2eThXqiNh9GHHTC0OW5Ca4ZfcURp7scPjYBcmgpR9HG6750716GuUipYf2AcThU3k20B31USuiaaIEg== +jest-environment-node@30.0.5, jest-environment-node@^30.0.5: + version "30.0.5" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-30.0.5.tgz#6a98dd80e0384ead67ed05643381395f6cda93c9" + integrity sha512-ppYizXdLMSvciGsRsMEnv/5EFpvOdXBaXRBzFUDPWrsfmog4kYrOGWXarLllz6AXan6ZAA/kYokgDWuos1IKDA== dependencies: - "@jest/environment" "30.0.4" - "@jest/fake-timers" "30.0.4" - "@jest/types" "30.0.1" + "@jest/environment" "30.0.5" + "@jest/fake-timers" "30.0.5" + "@jest/types" "30.0.5" "@types/node" "*" - jest-mock "30.0.2" - jest-util "30.0.2" - jest-validate "30.0.2" + jest-mock "30.0.5" + jest-util "30.0.5" + jest-validate "30.0.5" -jest-haste-map@30.0.2: - version "30.0.2" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-30.0.2.tgz#83826e7e352fa139dc95100337aff4de58c99453" - integrity sha512-telJBKpNLeCb4MaX+I5k496556Y2FiKR/QLZc0+MGBYl4k3OO0472drlV2LUe7c1Glng5HuAu+5GLYp//GpdOQ== +jest-haste-map@30.0.5: + version "30.0.5" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-30.0.5.tgz#fdd0daa322b02eb34267854cff2859fae21e92a6" + integrity sha512-dkmlWNlsTSR0nH3nRfW5BKbqHefLZv0/6LCccG0xFCTWcJu8TuEwG+5Cm75iBfjVoockmO6J35o5gxtFSn5xeg== dependencies: - "@jest/types" "30.0.1" + "@jest/types" "30.0.5" "@types/node" "*" anymatch "^3.1.3" fb-watchman "^2.0.2" graceful-fs "^4.2.11" jest-regex-util "30.0.1" - jest-util "30.0.2" - jest-worker "30.0.2" + jest-util "30.0.5" + jest-worker "30.0.5" micromatch "^4.0.8" walker "^1.0.8" optionalDependencies: @@ -4895,47 +4879,47 @@ jest-junit@^16.0.0: uuid "^8.3.2" xml "^1.0.1" -jest-leak-detector@30.0.2: - version "30.0.2" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-30.0.2.tgz#da4df660615d170136d2b468af3bf1c9bff0137e" - integrity sha512-U66sRrAYdALq+2qtKffBLDWsQ/XoNNs2Lcr83sc9lvE/hEpNafJlq2lXCPUBMNqamMECNxSIekLfe69qg4KMIQ== +jest-leak-detector@30.0.5: + version "30.0.5" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-30.0.5.tgz#00cfd2b323f48d8f4416b0a3e05fcf4c51f18864" + integrity sha512-3Uxr5uP8jmHMcsOtYMRB/zf1gXN3yUIc+iPorhNETG54gErFIiUhLvyY/OggYpSMOEYqsmRxmuU4ZOoX5jpRFg== dependencies: "@jest/get-type" "30.0.1" - pretty-format "30.0.2" + pretty-format "30.0.5" -jest-matcher-utils@30.0.4: - version "30.0.4" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-30.0.4.tgz#1aab71eb7ba401f81d9ef7231feb88392e4a6e54" - integrity sha512-ubCewJ54YzeAZ2JeHHGVoU+eDIpQFsfPQs0xURPWoNiO42LGJ+QGgfSf+hFIRplkZDkhH5MOvuxHKXRTUU3dUQ== +jest-matcher-utils@30.0.5: + version "30.0.5" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-30.0.5.tgz#dff3334be58faea4a5e1becc228656fbbfc2467d" + integrity sha512-uQgGWt7GOrRLP1P7IwNWwK1WAQbq+m//ZY0yXygyfWp0rJlksMSLQAA4wYQC3b6wl3zfnchyTx+k3HZ5aPtCbQ== dependencies: "@jest/get-type" "30.0.1" chalk "^4.1.2" - jest-diff "30.0.4" - pretty-format "30.0.2" + jest-diff "30.0.5" + pretty-format "30.0.5" -jest-message-util@30.0.2: - version "30.0.2" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-30.0.2.tgz#9dfdc37570d172f0ffdc42a0318036ff4008837f" - integrity sha512-vXywcxmr0SsKXF/bAD7t7nMamRvPuJkras00gqYeB1V0WllxZrbZ0paRr3XqpFU2sYYjD0qAaG2fRyn/CGZ0aw== +jest-message-util@30.0.5: + version "30.0.5" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-30.0.5.tgz#dd12ffec91dd3fa6a59cbd538a513d8e239e070c" + integrity sha512-NAiDOhsK3V7RU0Aa/HnrQo+E4JlbarbmI3q6Pi4KcxicdtjV82gcIUrejOtczChtVQR4kddu1E1EJlW6EN9IyA== dependencies: "@babel/code-frame" "^7.27.1" - "@jest/types" "30.0.1" + "@jest/types" "30.0.5" "@types/stack-utils" "^2.0.3" chalk "^4.1.2" graceful-fs "^4.2.11" micromatch "^4.0.8" - pretty-format "30.0.2" + pretty-format "30.0.5" slash "^3.0.0" stack-utils "^2.0.6" -jest-mock@30.0.2: - version "30.0.2" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-30.0.2.tgz#5e4245f25f6f9532714906cab10a2b9e39eb2183" - integrity sha512-PnZOHmqup/9cT/y+pXIVbbi8ID6U1XHRmbvR7MvUy4SLqhCbwpkmXhLbsWbGewHrV5x/1bF7YDjs+x24/QSvFA== +jest-mock@30.0.5: + version "30.0.5" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-30.0.5.tgz#ef437e89212560dd395198115550085038570bdd" + integrity sha512-Od7TyasAAQX/6S+QCbN6vZoWOMwlTtzzGuxJku1GhGanAjz9y+QsQkpScDmETvdc9aSXyJ/Op4rhpMYBWW91wQ== dependencies: - "@jest/types" "30.0.1" + "@jest/types" "30.0.5" "@types/node" "*" - jest-util "30.0.2" + jest-util "30.0.5" jest-pnp-resolver@^1.2.3: version "1.2.3" @@ -4947,157 +4931,157 @@ jest-regex-util@30.0.1: resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-30.0.1.tgz#f17c1de3958b67dfe485354f5a10093298f2a49b" integrity sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA== -jest-resolve-dependencies@30.0.4: - version "30.0.4" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-30.0.4.tgz#54decdedec040ec0b5b717af43a0b538d638d395" - integrity sha512-EQBYow19B/hKr4gUTn+l8Z+YLlP2X0IoPyp0UydOtrcPbIOYzJ8LKdFd+yrbwztPQvmlBFUwGPPEzHH1bAvFAw== +jest-resolve-dependencies@30.0.5: + version "30.0.5" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-30.0.5.tgz#53be4c51d296c84a0e75608e7b77b6fe92dbac29" + integrity sha512-/xMvBR4MpwkrHW4ikZIWRttBBRZgWK4d6xt3xW1iRDSKt4tXzYkMkyPfBnSCgv96cpkrctfXs6gexeqMYqdEpw== dependencies: jest-regex-util "30.0.1" - jest-snapshot "30.0.4" + jest-snapshot "30.0.5" -jest-resolve@30.0.2: - version "30.0.2" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-30.0.2.tgz#4b7c826a35e9657189568e4dafc0ba5f05868cf2" - integrity sha512-q/XT0XQvRemykZsvRopbG6FQUT6/ra+XV6rPijyjT6D0msOyCvR2A5PlWZLd+fH0U8XWKZfDiAgrUNDNX2BkCw== +jest-resolve@30.0.5: + version "30.0.5" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-30.0.5.tgz#f52f91600070b7073db465dc553eee5471ea8e06" + integrity sha512-d+DjBQ1tIhdz91B79mywH5yYu76bZuE96sSbxj8MkjWVx5WNdt1deEFRONVL4UkKLSrAbMkdhb24XN691yDRHg== dependencies: chalk "^4.1.2" graceful-fs "^4.2.11" - jest-haste-map "30.0.2" + jest-haste-map "30.0.5" jest-pnp-resolver "^1.2.3" - jest-util "30.0.2" - jest-validate "30.0.2" + jest-util "30.0.5" + jest-validate "30.0.5" slash "^3.0.0" unrs-resolver "^1.7.11" -jest-runner@30.0.4: - version "30.0.4" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-30.0.4.tgz#3647eeb04f2d0b2c0a5769dd73cd861ebc5853f4" - integrity sha512-mxY0vTAEsowJwvFJo5pVivbCpuu6dgdXRmt3v3MXjBxFly7/lTk3Td0PaMyGOeNQUFmSuGEsGYqhbn7PA9OekQ== +jest-runner@30.0.5: + version "30.0.5" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-30.0.5.tgz#5cbaaf85964246da4f65d697f186846f23cd9b5a" + integrity sha512-JcCOucZmgp+YuGgLAXHNy7ualBx4wYSgJVWrYMRBnb79j9PD0Jxh0EHvR5Cx/r0Ce+ZBC4hCdz2AzFFLl9hCiw== dependencies: - "@jest/console" "30.0.4" - "@jest/environment" "30.0.4" - "@jest/test-result" "30.0.4" - "@jest/transform" "30.0.4" - "@jest/types" "30.0.1" + "@jest/console" "30.0.5" + "@jest/environment" "30.0.5" + "@jest/test-result" "30.0.5" + "@jest/transform" "30.0.5" + "@jest/types" "30.0.5" "@types/node" "*" chalk "^4.1.2" emittery "^0.13.1" exit-x "^0.2.2" graceful-fs "^4.2.11" jest-docblock "30.0.1" - jest-environment-node "30.0.4" - jest-haste-map "30.0.2" - jest-leak-detector "30.0.2" - jest-message-util "30.0.2" - jest-resolve "30.0.2" - jest-runtime "30.0.4" - jest-util "30.0.2" - jest-watcher "30.0.4" - jest-worker "30.0.2" + jest-environment-node "30.0.5" + jest-haste-map "30.0.5" + jest-leak-detector "30.0.5" + jest-message-util "30.0.5" + jest-resolve "30.0.5" + jest-runtime "30.0.5" + jest-util "30.0.5" + jest-watcher "30.0.5" + jest-worker "30.0.5" p-limit "^3.1.0" source-map-support "0.5.13" -jest-runtime@30.0.4: - version "30.0.4" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-30.0.4.tgz#100f31a5f6c4a6586c2ce91a936a10f1aca64749" - integrity sha512-tUQrZ8+IzoZYIHoPDQEB4jZoPyzBjLjq7sk0KVyd5UPRjRDOsN7o6UlvaGF8ddpGsjznl9PW+KRgWqCNO+Hn7w== +jest-runtime@30.0.5: + version "30.0.5" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-30.0.5.tgz#d6a7e22687264240d1786d6f7682ac6a2872e552" + integrity sha512-7oySNDkqpe4xpX5PPiJTe5vEa+Ak/NnNz2bGYZrA1ftG3RL3EFlHaUkA1Cjx+R8IhK0Vg43RML5mJedGTPNz3A== dependencies: - "@jest/environment" "30.0.4" - "@jest/fake-timers" "30.0.4" - "@jest/globals" "30.0.4" + "@jest/environment" "30.0.5" + "@jest/fake-timers" "30.0.5" + "@jest/globals" "30.0.5" "@jest/source-map" "30.0.1" - "@jest/test-result" "30.0.4" - "@jest/transform" "30.0.4" - "@jest/types" "30.0.1" + "@jest/test-result" "30.0.5" + "@jest/transform" "30.0.5" + "@jest/types" "30.0.5" "@types/node" "*" chalk "^4.1.2" cjs-module-lexer "^2.1.0" collect-v8-coverage "^1.0.2" glob "^10.3.10" graceful-fs "^4.2.11" - jest-haste-map "30.0.2" - jest-message-util "30.0.2" - jest-mock "30.0.2" + jest-haste-map "30.0.5" + jest-message-util "30.0.5" + jest-mock "30.0.5" jest-regex-util "30.0.1" - jest-resolve "30.0.2" - jest-snapshot "30.0.4" - jest-util "30.0.2" + jest-resolve "30.0.5" + jest-snapshot "30.0.5" + jest-util "30.0.5" slash "^3.0.0" strip-bom "^4.0.0" -jest-snapshot@30.0.4: - version "30.0.4" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-30.0.4.tgz#21fdc1d944bc077a58f5eda88ef77a26dee4c3ee" - integrity sha512-S/8hmSkeUib8WRUq9pWEb5zMfsOjiYWDWzFzKnjX7eDyKKgimsu9hcmsUEg8a7dPAw8s/FacxsXquq71pDgPjQ== +jest-snapshot@30.0.5: + version "30.0.5" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-30.0.5.tgz#6600716eef2e6d8ea1dd788ae4385f3a2791b11f" + integrity sha512-T00dWU/Ek3LqTp4+DcW6PraVxjk28WY5Ua/s+3zUKSERZSNyxTqhDXCWKG5p2HAJ+crVQ3WJ2P9YVHpj1tkW+g== dependencies: "@babel/core" "^7.27.4" "@babel/generator" "^7.27.5" "@babel/plugin-syntax-jsx" "^7.27.1" "@babel/plugin-syntax-typescript" "^7.27.1" "@babel/types" "^7.27.3" - "@jest/expect-utils" "30.0.4" + "@jest/expect-utils" "30.0.5" "@jest/get-type" "30.0.1" - "@jest/snapshot-utils" "30.0.4" - "@jest/transform" "30.0.4" - "@jest/types" "30.0.1" + "@jest/snapshot-utils" "30.0.5" + "@jest/transform" "30.0.5" + "@jest/types" "30.0.5" babel-preset-current-node-syntax "^1.1.0" chalk "^4.1.2" - expect "30.0.4" + expect "30.0.5" graceful-fs "^4.2.11" - jest-diff "30.0.4" - jest-matcher-utils "30.0.4" - jest-message-util "30.0.2" - jest-util "30.0.2" - pretty-format "30.0.2" + jest-diff "30.0.5" + jest-matcher-utils "30.0.5" + jest-message-util "30.0.5" + jest-util "30.0.5" + pretty-format "30.0.5" semver "^7.7.2" synckit "^0.11.8" -jest-util@30.0.2: - version "30.0.2" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-30.0.2.tgz#1bd8411f81e6f5e2ca8b31bb2534ebcd7cbac065" - integrity sha512-8IyqfKS4MqprBuUpZNlFB5l+WFehc8bfCe1HSZFHzft2mOuND8Cvi9r1musli+u6F3TqanCZ/Ik4H4pXUolZIg== +jest-util@30.0.5: + version "30.0.5" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-30.0.5.tgz#035d380c660ad5f1748dff71c4105338e05f8669" + integrity sha512-pvyPWssDZR0FlfMxCBoc0tvM8iUEskaRFALUtGQYzVEAqisAztmy+R8LnU14KT4XA0H/a5HMVTXat1jLne010g== dependencies: - "@jest/types" "30.0.1" + "@jest/types" "30.0.5" "@types/node" "*" chalk "^4.1.2" ci-info "^4.2.0" graceful-fs "^4.2.11" picomatch "^4.0.2" -jest-validate@30.0.2: - version "30.0.2" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-30.0.2.tgz#f62a2f0e014dac94747509ba8c2bcd5d48215b7f" - integrity sha512-noOvul+SFER4RIvNAwGn6nmV2fXqBq67j+hKGHKGFCmK4ks/Iy1FSrqQNBLGKlu4ZZIRL6Kg1U72N1nxuRCrGQ== +jest-validate@30.0.5: + version "30.0.5" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-30.0.5.tgz#d26fd218b8d566bff48fd98880b8ea94fd0d8456" + integrity sha512-ouTm6VFHaS2boyl+k4u+Qip4TSH7Uld5tyD8psQ8abGgt2uYYB8VwVfAHWHjHc0NWmGGbwO5h0sCPOGHHevefw== dependencies: "@jest/get-type" "30.0.1" - "@jest/types" "30.0.1" + "@jest/types" "30.0.5" camelcase "^6.3.0" chalk "^4.1.2" leven "^3.1.0" - pretty-format "30.0.2" + pretty-format "30.0.5" -jest-watcher@30.0.4: - version "30.0.4" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-30.0.4.tgz#f51b9870760d917851bb5b871e95b3c5f021cb86" - integrity sha512-YESbdHDs7aQOCSSKffG8jXqOKFqw4q4YqR+wHYpR5GWEQioGvL0BfbcjvKIvPEM0XGfsfJrka7jJz3Cc3gI4VQ== +jest-watcher@30.0.5: + version "30.0.5" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-30.0.5.tgz#90db6e3f582b88085bde58f7555cbdd3a1beb10d" + integrity sha512-z9slj/0vOwBDBjN3L4z4ZYaA+pG56d6p3kTUhFRYGvXbXMWhXmb/FIxREZCD06DYUwDKKnj2T80+Pb71CQ0KEg== dependencies: - "@jest/test-result" "30.0.4" - "@jest/types" "30.0.1" + "@jest/test-result" "30.0.5" + "@jest/types" "30.0.5" "@types/node" "*" ansi-escapes "^4.3.2" chalk "^4.1.2" emittery "^0.13.1" - jest-util "30.0.2" + jest-util "30.0.5" string-length "^4.0.2" -jest-worker@30.0.2: - version "30.0.2" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-30.0.2.tgz#e67bd7debbc9d8445907a17067a89359acedc8c5" - integrity sha512-RN1eQmx7qSLFA+o9pfJKlqViwL5wt+OL3Vff/A+/cPsmuw7NPwfgl33AP+/agRmHzPOFgXviRycR9kYwlcRQXg== +jest-worker@30.0.5: + version "30.0.5" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-30.0.5.tgz#0b85cbab10610303e8d84e214f94d8f052c3cd04" + integrity sha512-ojRXsWzEP16NdUuBw/4H/zkZdHOa7MMYCk4E430l+8fELeLg/mqmMlRhjL7UNZvQrDmnovWZV4DxX03fZF48fQ== dependencies: "@types/node" "*" "@ungap/structured-clone" "^1.3.0" - jest-util "30.0.2" + jest-util "30.0.5" merge-stream "^2.0.0" supports-color "^8.1.1" @@ -5110,15 +5094,15 @@ jest-worker@^27.4.5: merge-stream "^2.0.0" supports-color "^8.0.0" -jest@^30.0.3: - version "30.0.4" - resolved "https://registry.yarnpkg.com/jest/-/jest-30.0.4.tgz#4596879f2af0560d9b1e588b252531cf10148947" - integrity sha512-9QE0RS4WwTj/TtTC4h/eFVmFAhGNVerSB9XpJh8sqaXlP73ILcPcZ7JWjjEtJJe2m8QyBLKKfPQuK+3F+Xij/g== +jest@^30.0.5: + version "30.0.5" + resolved "https://registry.yarnpkg.com/jest/-/jest-30.0.5.tgz#ee62729fb77829790d67c660d852350fbde315ce" + integrity sha512-y2mfcJywuTUkvLm2Lp1/pFX8kTgMO5yyQGq/Sk/n2mN7XWYp4JsCZ/QXW34M8YScgk8bPZlREH04f6blPnoHnQ== dependencies: - "@jest/core" "30.0.4" - "@jest/types" "30.0.1" + "@jest/core" "30.0.5" + "@jest/types" "30.0.5" import-local "^3.2.0" - jest-cli "30.0.4" + jest-cli "30.0.5" js-stringify@^1.0.2: version "1.0.2" @@ -5609,7 +5593,7 @@ mdast-util-gfm-task-list-item@^2.0.0: mdast-util-from-markdown "^2.0.0" mdast-util-to-markdown "^2.0.0" -mdast-util-gfm@^3.0.0: +mdast-util-gfm@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz#2cdf63b92c2a331406b0fb0db4c077c1b0331751" integrity sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ== @@ -6705,12 +6689,12 @@ prettier@^3.6.0: resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.6.2.tgz#ccda02a1003ebbb2bfda6f83a074978f608b9393" integrity sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ== -pretty-format@30.0.2, pretty-format@^30.0.0, pretty-format@^30.0.2: - version "30.0.2" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-30.0.2.tgz#54717b6aa2b4357a2e6d83868e10a2ea8dd647c7" - integrity sha512-yC5/EBSOrTtqhCKfLHqoUIAXVRZnukHPwWBJWR7h84Q3Be1DRQZLncwcfLoPA5RPQ65qfiCMqgYwdUuQ//eVpg== +pretty-format@30.0.5, pretty-format@^30.0.0, pretty-format@^30.0.5: + version "30.0.5" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-30.0.5.tgz#e001649d472800396c1209684483e18a4d250360" + integrity sha512-D1tKtYvByrBkFLe2wHJl2bwMJIiT8rW+XA+TiataH79/FszLQMrpGEvzUVkzPau7OCO0Qnrhpe87PqtOAIB8Yw== dependencies: - "@jest/schemas" "30.0.1" + "@jest/schemas" "30.0.5" ansi-styles "^5.2.0" react-is "^18.3.1" @@ -7361,7 +7345,7 @@ sort-object-keys@^1.1.3: resolved "https://registry.yarnpkg.com/sort-object-keys/-/sort-object-keys-1.1.3.tgz#bff833fe85cab147b34742e45863453c1e190b45" integrity sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg== -sort-package-json@^3.3.1: +sort-package-json@^3.4.0: version "3.4.0" resolved "https://registry.yarnpkg.com/sort-package-json/-/sort-package-json-3.4.0.tgz#98e42b78848c517736b069f8aa4fa322fae56677" integrity sha512-97oFRRMM2/Js4oEA9LJhjyMlde+2ewpZQf53pgue27UkbEXfHJnDzHlUxQ/DWUkzqmp7DFwJp8D+wi/TYeQhpA==