webpack 5.111.1 → 5.112.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/bin/webpack.js +13 -7
- package/lib/Chunk.js +3 -966
- package/lib/Compilation.js +373 -163
- package/lib/Compiler.js +31 -44
- package/lib/Dependency.js +3 -551
- package/lib/DependencyTemplate.js +3 -70
- package/lib/EntryPlugin.js +3 -68
- package/lib/Entrypoint.js +3 -121
- package/lib/ExternalsPlugin.js +3 -92
- package/lib/FileSystemInfo.js +3 -4629
- package/lib/InitFragment.js +3 -204
- package/lib/LibraryTemplatePlugin.js +3 -46
- package/lib/ModuleFilenameHelpers.js +3 -400
- package/lib/ModuleNotFoundError.js +2 -2
- package/lib/MultiCompiler.js +37 -8
- package/lib/NormalModule.js +3 -2242
- package/lib/NullFactory.js +3 -22
- package/lib/ProgressPlugin.js +3 -908
- package/lib/RawModule.js +3 -197
- package/lib/RequestShortener.js +3 -37
- package/lib/SingleEntryPlugin.js +1 -1
- package/lib/WebpackError.js +2 -2
- package/lib/asset/AssetBytesGenerator.js +21 -13
- package/lib/asset/AssetBytesParser.js +12 -10
- package/lib/asset/AssetGenerator.js +71 -69
- package/lib/asset/AssetModule.js +13 -2
- package/lib/asset/AssetModulesPlugin.js +10 -12
- package/lib/asset/AssetParser.js +10 -10
- package/lib/asset/AssetSourceGenerator.js +23 -15
- package/lib/asset/AssetSourceParser.js +12 -10
- package/lib/asset/RawDataUrlModule.js +17 -10
- package/lib/asset/WebManifestGenerator.js +17 -12
- package/lib/asset/WebManifestParser.js +8 -8
- package/lib/async-modules/AsyncModuleHelpers.js +12 -5
- package/lib/async-modules/AwaitDependenciesInitFragment.js +4 -4
- package/lib/async-modules/InferAsyncModulesPlugin.js +9 -3
- package/lib/async-modules/isGeneratorLowered.js +3 -3
- package/lib/bun/BunTargetPlugin.js +1 -1
- package/lib/cache/AddBuildDependenciesPlugin.js +2 -19
- package/lib/{Cache.js → cache/Cache.js} +1 -1
- package/lib/{CacheFacade.js → cache/CacheFacade.js} +6 -6
- package/lib/cache/IdleFileCachePlugin.js +2 -2
- package/lib/cache/MemoryCachePlugin.js +2 -2
- package/lib/cache/MemoryWithGcCachePlugin.js +2 -2
- package/lib/cache/PackFileCacheStrategy.js +13 -19
- package/lib/cache/ResolverCachePlugin.js +65 -11
- package/lib/cache/mergeEtags.js +1 -1
- package/lib/{OptionsApply.js → config/OptionsApply.js} +3 -3
- package/lib/{PlatformPlugin.js → config/PlatformPlugin.js} +2 -2
- package/lib/{WebpackOptionsApply.js → config/WebpackOptionsApply.js} +209 -212
- package/lib/{WebpackOptionsDefaulter.js → config/WebpackOptionsDefaulter.js} +3 -3
- package/lib/config/browserslistTargetHandler.js +1 -1
- package/lib/{cli.js → config/cli.js} +14 -164
- package/lib/config/defaults.js +166 -59
- package/lib/config/getClaimedAssetTypes.js +22 -14
- package/lib/config/normalization.js +18 -7
- package/lib/config/target.js +11 -1
- package/lib/container/ContainerEntryDependency.js +1 -1
- package/lib/container/ContainerEntryModule.js +13 -11
- package/lib/container/ContainerEntryModuleFactory.js +2 -2
- package/lib/container/ContainerExposedDependency.js +1 -1
- package/lib/container/ContainerPlugin.js +178 -5
- package/lib/container/ContainerReferencePlugin.js +75 -14
- package/lib/container/FallbackDependency.js +1 -1
- package/lib/container/FallbackItemDependency.js +1 -1
- package/lib/container/FallbackModule.js +12 -10
- package/lib/container/FallbackModuleFactory.js +2 -2
- package/lib/container/HoistContainerReferencesPlugin.js +10 -11
- package/lib/container/ModuleFederationPlugin.js +306 -7
- package/lib/container/RemoteModule.js +14 -10
- package/lib/container/RemoteRuntimeModule.js +5 -5
- package/lib/container/RemoteToExternalDependency.js +1 -1
- package/lib/container/moduleFederationHooks.js +1 -1
- package/lib/context/ContextModule.js +37 -26
- package/lib/context/ContextModuleFactory.js +14 -11
- package/lib/context/ContextReplacementPlugin.js +6 -12
- package/lib/css/CssGenerator.js +78 -68
- package/lib/css/CssInjectStyleRuntimeModule.js +36 -30
- package/lib/css/CssLoadingRuntimeModule.js +77 -44
- package/lib/css/CssModule.js +37 -29
- package/lib/css/CssModulesPlugin.js +129 -45
- package/lib/css/CssParser.js +714 -322
- package/lib/css/CssServerStylesRuntimeModule.js +3 -3
- package/lib/{util → css}/conventions.js +1 -1
- package/lib/css/cssMinify.js +110 -37
- package/lib/css/data.js +6990 -5125
- package/lib/css/syntax-parser.js +20734 -0
- package/lib/css/syntax-printer.js +6092 -0
- package/lib/css/syntax.js +37 -18686
- package/lib/debug/ProfilingPlugin.js +106 -51
- package/lib/{DefinePlugin.js → define/DefinePlugin.js} +416 -55
- package/lib/{DotenvPlugin.js → define/DotenvPlugin.js} +19 -15
- package/lib/{EnvironmentPlugin.js → define/EnvironmentPlugin.js} +6 -4
- package/lib/deno/DenoTargetPlugin.js +1 -1
- package/lib/dependencies/ConstDependency.js +3 -120
- package/lib/dependencies/ContextElementDependency.js +5 -172
- package/lib/dependencies/NullDependency.js +3 -37
- package/lib/dependencies/{AMDDefineDependency.js → amd/AMDDefineDependency.js} +12 -11
- package/lib/dependencies/{AMDDefineDependencyParserPlugin.js → amd/AMDDefineDependencyParserPlugin.js} +10 -11
- package/lib/dependencies/{AMDPlugin.js → amd/AMDPlugin.js} +11 -11
- package/lib/dependencies/{AMDRequireArrayDependency.js → amd/AMDRequireArrayDependency.js} +15 -13
- package/lib/dependencies/{AMDRequireContextDependency.js → amd/AMDRequireContextDependency.js} +11 -10
- package/lib/dependencies/{AMDRequireDependenciesBlock.js → amd/AMDRequireDependenciesBlock.js} +7 -6
- package/lib/dependencies/{AMDRequireDependenciesBlockParserPlugin.js → amd/AMDRequireDependenciesBlockParserPlugin.js} +14 -11
- package/lib/dependencies/{AMDRequireDependency.js → amd/AMDRequireDependency.js} +13 -12
- package/lib/dependencies/{AMDRequireItemDependency.js → amd/AMDRequireItemDependency.js} +8 -7
- package/lib/dependencies/{AMDRuntimeModules.js → amd/AMDRuntimeModules.js} +3 -3
- package/lib/dependencies/{LocalModule.js → amd/LocalModule.js} +8 -4
- package/lib/dependencies/{LocalModuleDependency.js → amd/LocalModuleDependency.js} +17 -10
- package/lib/dependencies/{LocalModulesHelpers.js → amd/LocalModulesHelpers.js} +1 -1
- package/lib/dependencies/{RequireJsStuffPlugin.js → amd/RequireJsStuffPlugin.js} +9 -9
- package/lib/dependencies/{UnsupportedDependency.js → amd/UnsupportedDependency.js} +11 -10
- package/lib/dependencies/{CommonJsDependencyHelpers.js → commonjs/CommonJsDependencyHelpers.js} +8 -9
- package/lib/dependencies/{CommonJsExportRequireDependency.js → commonjs/CommonJsExportRequireDependency.js} +166 -36
- package/lib/dependencies/{CommonJsExportsDependency.js → commonjs/CommonJsExportsDependency.js} +15 -14
- package/lib/dependencies/{CommonJsExportsParserPlugin.js → commonjs/CommonJsExportsParserPlugin.js} +154 -92
- package/lib/dependencies/{CommonJsFullRequireDependency.js → commonjs/CommonJsFullRequireDependency.js} +32 -24
- package/lib/dependencies/{CommonJsImportsParserPlugin.js → commonjs/CommonJsImportsParserPlugin.js} +36 -33
- package/lib/dependencies/{CommonJsObjectExportDependency.js → commonjs/CommonJsObjectExportDependency.js} +17 -16
- package/lib/dependencies/{CommonJsPlugin.js → commonjs/CommonJsPlugin.js} +48 -39
- package/lib/dependencies/{CommonJsRequireContextDependency.js → commonjs/CommonJsRequireContextDependency.js} +15 -14
- package/lib/dependencies/{CommonJsRequireDependency.js → commonjs/CommonJsRequireDependency.js} +33 -25
- package/lib/dependencies/{CommonJsSelfReferenceDependency.js → commonjs/CommonJsSelfReferenceDependency.js} +17 -16
- package/lib/dependencies/{ModuleDecoratorDependency.js → commonjs/ModuleDecoratorDependency.js} +16 -15
- package/lib/dependencies/{RequireEnsureDependenciesBlock.js → commonjs/RequireEnsureDependenciesBlock.js} +8 -7
- package/lib/dependencies/{RequireEnsureDependenciesBlockParserPlugin.js → commonjs/RequireEnsureDependenciesBlockParserPlugin.js} +9 -6
- package/lib/dependencies/{RequireEnsureDependency.js → commonjs/RequireEnsureDependency.js} +13 -12
- package/lib/dependencies/{RequireEnsureItemDependency.js → commonjs/RequireEnsureItemDependency.js} +7 -6
- package/lib/dependencies/{RequireEnsurePlugin.js → commonjs/RequireEnsurePlugin.js} +8 -8
- package/lib/dependencies/{RequireHeaderDependency.js → commonjs/RequireHeaderDependency.js} +14 -13
- package/lib/dependencies/{RequireIncludeDependency.js → commonjs/RequireIncludeDependency.js} +13 -12
- package/lib/dependencies/{RequireIncludeDependencyParserPlugin.js → commonjs/RequireIncludeDependencyParserPlugin.js} +3 -27
- package/lib/dependencies/{RequireIncludePlugin.js → commonjs/RequireIncludePlugin.js} +4 -4
- package/lib/dependencies/{RequireResolveContextDependency.js → commonjs/RequireResolveContextDependency.js} +11 -10
- package/lib/dependencies/{RequireResolveDependency.js → commonjs/RequireResolveDependency.js} +12 -11
- package/lib/dependencies/{RequireResolveHeaderDependency.js → commonjs/RequireResolveHeaderDependency.js} +13 -12
- package/lib/dependencies/commonjs/TopLevelThisParserPlugin.js +59 -0
- package/lib/dependencies/{ContextDependency.js → context/ContextDependency.js} +15 -14
- package/lib/dependencies/{ContextDependencyHelpers.js → context/ContextDependencyHelpers.js} +31 -9
- package/lib/dependencies/{ContextDependencyTemplateAsId.js → context/ContextDependencyTemplateAsId.js} +3 -3
- package/lib/dependencies/{ContextDependencyTemplateAsRequireCall.js → context/ContextDependencyTemplateAsRequireCall.js} +3 -3
- package/lib/dependencies/context/ContextElementDependency.js +198 -0
- package/lib/dependencies/{ImportMetaContextDependency.js → context/ImportMetaContextDependency.js} +7 -6
- package/lib/dependencies/{ImportMetaContextDependencyParserPlugin.js → context/ImportMetaContextDependencyParserPlugin.js} +10 -11
- package/lib/dependencies/{ImportMetaContextPlugin.js → context/ImportMetaContextPlugin.js} +5 -5
- package/lib/dependencies/{ImportMetaGlobDependency.js → context/ImportMetaGlobDependency.js} +7 -6
- package/lib/dependencies/{ImportMetaGlobDependencyParserPlugin.js → context/ImportMetaGlobDependencyParserPlugin.js} +7 -10
- package/lib/dependencies/{ImportMetaGlobHelpers.js → context/ImportMetaGlobHelpers.js} +17 -19
- package/lib/dependencies/{RequireContextDependency.js → context/RequireContextDependency.js} +7 -6
- package/lib/dependencies/{RequireContextDependencyParserPlugin.js → context/RequireContextDependencyParserPlugin.js} +2 -2
- package/lib/dependencies/{RequireContextPlugin.js → context/RequireContextPlugin.js} +5 -5
- package/lib/dependencies/{CachedConstDependency.js → core/CachedConstDependency.js} +21 -17
- package/lib/dependencies/core/ConstDependency.js +131 -0
- package/lib/dependencies/{ImportPhase.js → core/ImportPhase.js} +5 -4
- package/lib/dependencies/{ModuleDependency.js → core/ModuleDependency.js} +10 -7
- package/lib/dependencies/{ModuleDependencyTemplateAsId.js → core/ModuleDependencyTemplateAsId.js} +3 -3
- package/lib/dependencies/{ModuleDependencyTemplateAsRequireId.js → core/ModuleDependencyTemplateAsRequireId.js} +2 -2
- package/lib/dependencies/{ModuleInitFragmentDependency.js → core/ModuleInitFragmentDependency.js} +10 -9
- package/lib/dependencies/core/NullDependency.js +44 -0
- package/lib/dependencies/{RuntimeRequirementsDependency.js → core/RuntimeRequirementsDependency.js} +10 -9
- package/lib/dependencies/{StaticExportsDependency.js → core/StaticExportsDependency.js} +15 -8
- package/lib/dependencies/{CssIcssExportDependency.js → css/CssIcssExportDependency.js} +375 -99
- package/lib/dependencies/{CssIcssImportDependency.js → css/CssIcssImportDependency.js} +24 -19
- package/lib/dependencies/{CssIcssSymbolDependency.js → css/CssIcssSymbolDependency.js} +13 -12
- package/lib/dependencies/{CssImportDependency.js → css/CssImportDependency.js} +15 -11
- package/lib/dependencies/{CssUrlDependency.js → css/CssUrlDependency.js} +25 -22
- package/lib/dependencies/{CreateRequireParserPlugin.js → esm/CreateRequireParserPlugin.js} +9 -9
- package/lib/dependencies/{HarmonyAcceptDependency.js → esm/ESMAcceptDependency.js} +41 -38
- package/lib/dependencies/esm/ESMAcceptImportDependency.js +39 -0
- package/lib/dependencies/{HarmonyCompatibilityDependency.js → esm/ESMCompatibilityDependency.js} +29 -21
- package/lib/dependencies/{HarmonyDetectionParserPlugin.js → esm/ESMDetectionParserPlugin.js} +20 -20
- package/lib/dependencies/{HarmonyEvaluatedImportSpecifierDependency.js → esm/ESMEvaluatedImportSpecifierDependency.js} +33 -30
- package/lib/dependencies/{HarmonyExportDependencyParserPlugin.js → esm/ESMExportDependencyParserPlugin.js} +60 -89
- package/lib/dependencies/{HarmonyExportExpressionDependency.js → esm/ESMExportExpressionDependency.js} +80 -45
- package/lib/dependencies/{HarmonyExportHeaderDependency.js → esm/ESMExportHeaderDependency.js} +17 -15
- package/lib/dependencies/esm/ESMExportImportedSideEffectDependency.js +37 -0
- package/lib/dependencies/{HarmonyExportImportedSpecifierDependency.js → esm/ESMExportImportedSpecifierDependency.js} +146 -133
- package/lib/dependencies/{HarmonyExportInitFragment.js → esm/ESMExportInitFragment.js} +48 -30
- package/lib/dependencies/{HarmonyExportSpecifierDependency.js → esm/ESMExportSpecifierDependency.js} +78 -37
- package/lib/dependencies/{HarmonyExports.js → esm/ESMExports.js} +4 -12
- package/lib/dependencies/{HarmonyImportBareSideEffectDependency.js → esm/ESMImportBareSideEffectDependency.js} +21 -13
- package/lib/dependencies/{HarmonyImportDependency.js → esm/ESMImportDependency.js} +86 -68
- package/lib/dependencies/{HarmonyImportDependencyParserPlugin.js → esm/ESMImportDependencyParserPlugin.js} +104 -100
- package/lib/dependencies/{HarmonyImportGuard.js → esm/ESMImportGuard.js} +36 -51
- package/lib/dependencies/{HarmonyImportSideEffectDependency.js → esm/ESMImportSideEffectDependency.js} +83 -39
- package/lib/dependencies/{HarmonyImportSpecifierDependency.js → esm/ESMImportSpecifierDependency.js} +98 -60
- package/lib/dependencies/esm/ESMLiveExportDependency.js +311 -0
- package/lib/dependencies/esm/ESMLiveExportParserPlugin.js +862 -0
- package/lib/dependencies/esm/ESMModulesPlugin.js +205 -0
- package/lib/dependencies/{HarmonyTopLevelThisParserPlugin.js → esm/ESMTopLevelThisParserPlugin.js} +7 -7
- package/lib/dependencies/{TopLevelAwaitDependency.js → esm/TopLevelAwaitDependency.js} +12 -18
- package/lib/dependencies/{DynamicExports.js → helpers/DynamicExports.js} +5 -7
- package/lib/{util → dependencies/helpers}/chainedImports.js +5 -5
- package/lib/dependencies/{processExportInfo.js → helpers/processExportInfo.js} +4 -4
- package/lib/{util → dependencies/helpers}/traverseDestructuringAssignmentProperties.js +1 -1
- package/lib/dependencies/{ImportMetaHotAcceptDependency.js → hmr/ImportMetaHotAcceptDependency.js} +8 -7
- package/lib/dependencies/{ImportMetaHotDeclineDependency.js → hmr/ImportMetaHotDeclineDependency.js} +8 -7
- package/lib/dependencies/{ModuleHotAcceptDependency.js → hmr/ModuleHotAcceptDependency.js} +8 -7
- package/lib/dependencies/{ModuleHotDeclineDependency.js → hmr/ModuleHotDeclineDependency.js} +8 -7
- package/lib/dependencies/{HtmlEntryDependency.js → html/HtmlEntryDependency.js} +52 -151
- package/lib/dependencies/{HtmlInlineHtmlDependency.js → html/HtmlInlineHtmlDependency.js} +13 -15
- package/lib/dependencies/{HtmlInlineScriptDependency.js → html/HtmlInlineScriptDependency.js} +69 -23
- package/lib/dependencies/{HtmlInlineStyleDependency.js → html/HtmlInlineStyleDependency.js} +50 -18
- package/lib/dependencies/{HtmlSourceDependency.js → html/HtmlSourceDependency.js} +23 -16
- package/lib/dependencies/{ImportContextDependency.js → import/ImportContextDependency.js} +24 -10
- package/lib/dependencies/{ImportDependency.js → import/ImportDependency.js} +26 -18
- package/lib/dependencies/{ImportEagerDependency.js → import/ImportEagerDependency.js} +18 -10
- package/lib/dependencies/{ImportParserPlugin.js → import/ImportParserPlugin.js} +22 -25
- package/lib/dependencies/{ImportPlugin.js → import/ImportPlugin.js} +4 -4
- package/lib/dependencies/{ImportWeakDependency.js → import/ImportWeakDependency.js} +18 -10
- package/lib/dependencies/{importOptionsCheck.js → import/importOptionsCheck.js} +2 -2
- package/lib/dependencies/{BuildTimeConstDependency.js → import-meta/BuildTimeConstDependency.js} +12 -11
- package/lib/dependencies/{ImportMetaMainDependency.js → import-meta/ImportMetaMainDependency.js} +12 -11
- package/lib/dependencies/{ImportMetaPlugin.js → import-meta/ImportMetaPlugin.js} +122 -103
- package/lib/dependencies/{SystemPlugin.js → system/SystemPlugin.js} +11 -38
- package/lib/dependencies/{SystemRuntimeModule.js → system/SystemRuntimeModule.js} +3 -3
- package/lib/dependencies/{ImportMetaResolveDependency.js → url/ImportMetaResolveDependency.js} +9 -8
- package/lib/dependencies/{URLContextDependency.js → url/URLContextDependency.js} +11 -10
- package/lib/dependencies/{URLDependency.js → url/URLDependency.js} +28 -20
- package/lib/{url → dependencies/url}/URLParserPlugin.js +17 -19
- package/lib/dependencies/{URLPlugin.js → url/URLPlugin.js} +6 -7
- package/lib/dependencies/{WebAssemblyExportImportedDependency.js → wasm/WebAssemblyExportImportedDependency.js} +18 -11
- package/lib/dependencies/{WebAssemblyImportDependency.js → wasm/WebAssemblyImportDependency.js} +19 -12
- package/lib/dependencies/{CreateScriptUrlDependency.js → worker/CreateScriptUrlDependency.js} +12 -11
- package/lib/dependencies/{WorkerAndWorkletPlugin.js → worker/WorkerAndWorkletPlugin.js} +82 -53
- package/lib/dependencies/{WorkerDependency.js → worker/WorkerDependency.js} +22 -15
- package/lib/dependencies/{WorkletDependency.js → worker/WorkletDependency.js} +19 -18
- package/lib/{EvalDevToolModulePlugin.js → devtool/EvalDevToolModulePlugin.js} +20 -6
- package/lib/{EvalSourceMapDevToolPlugin.js → devtool/EvalSourceMapDevToolPlugin.js} +32 -24
- package/lib/devtool/ModuleFilenameHelpers.js +413 -0
- package/lib/{SourceMapDevToolModuleOptionsPlugin.js → devtool/SourceMapDevToolModuleOptionsPlugin.js} +10 -3
- package/lib/{SourceMapDevToolPlugin.js → devtool/SourceMapDevToolPlugin.js} +155 -27
- package/lib/{util → devtool}/generateDebugId.js +1 -1
- package/lib/{IgnoreWarningsPlugin.js → diagnostics/IgnoreWarningsPlugin.js} +2 -2
- package/lib/{NoEmitOnErrorsPlugin.js → diagnostics/NoEmitOnErrorsPlugin.js} +1 -1
- package/lib/diagnostics/WarnCaseSensitiveModulesPlugin.js +64 -0
- package/lib/{WarnDeprecatedOptionPlugin.js → diagnostics/WarnDeprecatedOptionPlugin.js} +2 -22
- package/lib/diagnostics/WarnNoModeSetPlugin.js +27 -0
- package/lib/dll/DelegatedModule.js +23 -21
- package/lib/dll/DelegatedModuleFactoryPlugin.js +2 -2
- package/lib/dll/DelegatedPlugin.js +1 -1
- package/lib/{dependencies → dll}/DelegatedSourceDependency.js +5 -4
- package/lib/{dependencies → dll}/DllEntryDependency.js +6 -5
- package/lib/dll/DllEntryPlugin.js +3 -3
- package/lib/dll/DllModule.js +14 -10
- package/lib/dll/DllModuleFactory.js +3 -3
- package/lib/dll/DllPlugin.js +18 -6
- package/lib/dll/DllReferencePlugin.js +103 -30
- package/lib/dll/LibManifestPlugin.js +9 -7
- package/lib/electron/ElectronTargetPlugin.js +2 -2
- package/lib/{DynamicEntryPlugin.js → entry/DynamicEntryPlugin.js} +3 -3
- package/lib/{dependencies → entry}/EntryDependency.js +11 -2
- package/lib/{EntryOptionPlugin.js → entry/EntryOptionPlugin.js} +6 -6
- package/lib/entry/EntryPlugin.js +75 -0
- package/lib/errors/AbstractMethodError.js +1 -1
- package/lib/{performance → errors}/AssetsOverSizeLimitWarning.js +2 -2
- package/lib/errors/AsyncDependencyToInitialChunkError.js +2 -2
- package/lib/errors/BuildCycleError.js +1 -1
- package/lib/{WarnCaseSensitiveModulesPlugin.js → errors/CaseSensitiveModulesWarning.js} +4 -56
- package/lib/errors/ChunkRenderError.js +1 -1
- package/lib/errors/CodeGenerationError.js +1 -1
- package/lib/errors/CommentCompilationWarning.js +1 -1
- package/lib/errors/ConflictingEntryExportsWarning.js +38 -0
- package/lib/{dependencies → errors}/CriticalDependencyWarning.js +4 -3
- package/lib/errors/DeprecatedOptionWarning.js +30 -0
- package/lib/errors/DllManifestError.js +26 -0
- package/lib/{performance → errors}/DuplicatePackagesWarning.js +6 -6
- package/lib/{dependencies/HarmonyLinkingError.js → errors/ESMLinkingError.js} +4 -4
- package/lib/{performance → errors}/EntrypointsOverSizeLimitWarning.js +2 -2
- package/lib/errors/EnvironmentNotSupportAsyncWarning.js +2 -2
- package/lib/{ErrorHelpers.js → errors/ErrorHelpers.js} +9 -6
- package/lib/errors/ExternalStarReexportError.js +2 -2
- package/lib/{library → errors}/FalseIIFEUmdWarning.js +1 -1
- package/lib/errors/HookWebpackError.js +6 -5
- package/lib/errors/IgnoreErrorModuleFactory.js +3 -3
- package/lib/errors/InvalidDependenciesModuleWarning.js +1 -1
- package/lib/errors/JSONParseError.js +4 -4
- package/lib/{optimize → errors}/MinMaxSizeWarning.js +1 -1
- package/lib/errors/ModuleBuildError.js +1 -1
- package/lib/errors/ModuleDependencyError.js +2 -2
- package/lib/errors/ModuleDependencyWarning.js +2 -2
- package/lib/errors/ModuleError.js +1 -1
- package/lib/errors/ModuleHashingError.js +1 -1
- package/lib/errors/ModuleNotFoundError.js +3 -3
- package/lib/errors/ModuleParseError.js +1 -1
- package/lib/errors/ModuleRestoreError.js +1 -1
- package/lib/errors/ModuleStoreError.js +1 -1
- package/lib/errors/ModuleWarning.js +1 -1
- package/lib/{performance → errors}/NoAsyncChunksWarning.js +1 -1
- package/lib/{WarnNoModeSetPlugin.js → errors/NoModeWarning.js} +2 -19
- package/lib/errors/NodeStuffInWebError.js +7 -2
- package/lib/errors/PathVariableError.js +31 -0
- package/lib/errors/RequireIncludeDeprecationWarning.js +40 -0
- package/lib/{performance → errors}/RuntimeInLargeChunkWarning.js +1 -1
- package/lib/errors/RuntimeModuleGenerationError.js +51 -0
- package/lib/errors/SSRManifestAutoPublicPathWarning.js +24 -0
- package/lib/errors/SystemImportDeprecationWarning.js +43 -0
- package/lib/errors/UnmergeableEntryExportsError.js +34 -0
- package/lib/errors/UnsupportedFeatureWarning.js +1 -1
- package/lib/{wasm-sync → errors}/UnsupportedWebAssemblyFeatureError.js +1 -1
- package/lib/{wasm-sync → errors}/WebAssemblyInInitialChunkError.js +7 -5
- package/lib/errors/WebpackError.js +13 -3
- package/lib/esm/ExportWebpackRequireRuntimeModule.js +2 -2
- package/lib/esm/ModuleChunkFormatPlugin.js +55 -20
- package/lib/esm/ModuleChunkLoadingPlugin.js +3 -3
- package/lib/esm/ModuleChunkLoadingRuntimeModule.js +8 -8
- package/lib/{ExternalModule.js → externals/ExternalModule.js} +90 -63
- package/lib/{ExternalModuleFactoryPlugin.js → externals/ExternalModuleFactoryPlugin.js} +42 -41
- package/lib/externals/ExternalsPlugin.js +99 -0
- package/lib/fs/FileSystemInfo.js +4642 -0
- package/lib/{util → fs}/fs.js +22 -9
- package/lib/{AsyncDependenciesBlock.js → graph/AsyncDependenciesBlock.js} +27 -4
- package/lib/graph/Chunk.js +985 -0
- package/lib/{ChunkGraph.js → graph/ChunkGraph.js} +192 -80
- package/lib/{ChunkGroup.js → graph/ChunkGroup.js} +11 -3
- package/lib/{DependenciesBlock.js → graph/DependenciesBlock.js} +16 -4
- package/lib/graph/Dependency.js +634 -0
- package/lib/graph/Entrypoint.js +136 -0
- package/lib/{ExportsInfo.js → graph/ExportsInfo.js} +131 -83
- package/lib/{HotUpdateChunk.js → graph/HotUpdateChunk.js} +8 -0
- package/lib/{ModuleGraph.js → graph/ModuleGraph.js} +44 -33
- package/lib/{ModuleGraphConnection.js → graph/ModuleGraphConnection.js} +2 -2
- package/lib/{buildChunkGraph.js → graph/buildChunkGraph.js} +169 -76
- package/lib/{util → graph}/findGraphRoots.js +15 -9
- package/lib/graph/isDependencyKind.js +23 -0
- package/lib/hmr/HotModuleReplacement.runtime.js +12 -11
- package/lib/{HotModuleReplacementPlugin.js → hmr/HotModuleReplacementPlugin.js} +51 -57
- package/lib/hmr/HotModuleReplacementRuntimeModule.js +3 -3
- package/lib/hmr/JavascriptHotModuleReplacement.runtime.js +25 -26
- package/lib/hmr/JavascriptHotModuleReplacementHelper.js +2 -2
- package/lib/hmr/LazyCompilationPlugin.js +32 -28
- package/lib/html/HtmlGenerator.js +132 -60
- package/lib/html/HtmlModule.js +16 -2
- package/lib/html/HtmlModulesPlugin.js +184 -87
- package/lib/html/HtmlParser.js +511 -160
- package/lib/html/builtinEmbeddedRenderer.js +70 -25
- package/lib/html/data.js +44 -22
- package/lib/html/htmlMinify.js +114 -41
- package/lib/html/syntax-parser.js +15795 -0
- package/lib/html/syntax-printer.js +1033 -0
- package/lib/html/syntax.js +37 -13952
- package/lib/html/xmlMinify.js +70 -0
- package/lib/ids/ChunkModuleIdRangePlugin.js +2 -2
- package/lib/ids/DeterministicModuleIdsPlugin.js +1 -1
- package/lib/ids/HashedModuleIdsPlugin.js +32 -5
- package/lib/ids/IdHelpers.js +4 -4
- package/lib/ids/NaturalChunkIdsPlugin.js +1 -1
- package/lib/ids/OccurrenceChunkIdsPlugin.js +6 -5
- package/lib/ids/OccurrenceModuleIdsPlugin.js +6 -5
- package/lib/{RecordIdsPlugin.js → ids/RecordIdsPlugin.js} +5 -5
- package/lib/ids/SyncModuleIdsPlugin.js +3 -3
- package/lib/{util → ids}/numberHash.js +1 -1
- package/lib/index.js +312 -105
- package/lib/{APIPlugin.js → javascript/APIPlugin.js} +31 -37
- package/lib/javascript/ArrayPushCallbackChunkFormatPlugin.js +4 -5
- package/lib/javascript/BasicEvaluatedExpression.js +9 -9
- package/lib/javascript/ChunkHelpers.js +64 -4
- package/lib/javascript/CommonJsChunkFormatPlugin.js +5 -13
- package/lib/{CompatibilityPlugin.js → javascript/CompatibilityPlugin.js} +7 -7
- package/lib/{ConstPlugin.js → javascript/ConstPlugin.js} +75 -8
- package/lib/{ExportsInfoApiPlugin.js → javascript/ExportsInfoApiPlugin.js} +5 -5
- package/lib/{dependencies → javascript}/ExportsInfoDependency.js +10 -9
- package/lib/javascript/JavascriptGenerator.js +32 -27
- package/lib/{JavascriptMetaInfoPlugin.js → javascript/JavascriptMetaInfoPlugin.js} +8 -20
- package/lib/javascript/JavascriptModule.js +14 -3
- package/lib/javascript/JavascriptModulesPlugin.js +441 -214
- package/lib/javascript/JavascriptParser.js +318 -144
- package/lib/javascript/JavascriptParserHelpers.js +1 -1
- package/lib/javascript/MergedEntryExports.js +196 -0
- package/lib/javascript/ScopeAnalyzer.js +3924 -13
- package/lib/javascript/StartupHelpers.js +6 -6
- package/lib/{UseStrictPlugin.js → javascript/UseStrictPlugin.js} +13 -19
- package/lib/{dependencies → javascript}/WebpackIsIncludedDependency.js +10 -9
- package/lib/{WebpackIsIncludedPlugin.js → javascript/WebpackIsIncludedPlugin.js} +8 -8
- package/lib/javascript/data.js +533 -122
- package/lib/javascript/jsMinify.js +272 -0
- package/lib/javascript/regexp.js +67 -32
- package/lib/javascript/syntax-parser.js +19169 -0
- package/lib/javascript/syntax-printer-data.js +1099 -0
- package/lib/javascript/syntax-printer.js +53878 -0
- package/lib/javascript/syntax.js +20 -11274
- package/lib/json/JsonData.js +1 -1
- package/lib/{dependencies → json}/JsonExportsDependency.js +8 -7
- package/lib/json/JsonGenerator.js +24 -16
- package/lib/json/JsonModule.js +13 -2
- package/lib/json/JsonModulesPlugin.js +1 -1
- package/lib/json/JsonParser.js +11 -10
- package/lib/json/jsonMinify.js +69 -0
- package/lib/library/AbstractLibraryPlugin.js +28 -15
- package/lib/library/AmdLibraryPlugin.js +4 -4
- package/lib/library/AssignLibraryPlugin.js +28 -12
- package/lib/library/EnableLibraryPlugin.js +1 -1
- package/lib/library/ExportPropertyLibraryPlugin.js +4 -4
- package/lib/library/JsonpLibraryPlugin.js +2 -2
- package/lib/library/LibraryTemplatePlugin.js +53 -0
- package/lib/library/ModuleLibraryPlugin.js +557 -187
- package/lib/library/SystemLibraryPlugin.js +6 -8
- package/lib/library/UmdLibraryPlugin.js +3 -4
- package/lib/{dependencies → loaders}/LoaderDependency.js +3 -3
- package/lib/{dependencies → loaders}/LoaderImportDependency.js +9 -3
- package/lib/{LoaderOptionsPlugin.js → loaders/LoaderOptionsPlugin.js} +30 -12
- package/lib/{dependencies → loaders}/LoaderPlugin.js +2 -2
- package/lib/loaders/LoaderRunner.js +94 -46
- package/lib/{LoaderTargetPlugin.js → loaders/LoaderTargetPlugin.js} +2 -2
- package/lib/loaders/loadLoader.js +16 -10
- package/lib/logging/Logger.js +7 -9
- package/lib/logging/ProgressPlugin.js +957 -0
- package/lib/{CodeGenerationResults.js → module/CodeGenerationResults.js} +7 -7
- package/lib/{Generator.js → module/Generator.js} +33 -23
- package/lib/{Module.js → module/Module.js} +121 -53
- package/lib/{ModuleFactory.js → module/ModuleFactory.js} +3 -3
- package/lib/module/NormalModule.js +2350 -0
- package/lib/{NormalModuleFactory.js → module/NormalModuleFactory.js} +64 -71
- package/lib/module/NullFactory.js +29 -0
- package/lib/{Parser.js → module/Parser.js} +12 -5
- package/lib/module/RawModule.js +208 -0
- package/lib/{SelfModuleFactory.js → module/SelfModuleFactory.js} +1 -1
- package/lib/{util → module}/extractSourceMap.js +71 -20
- package/lib/{util → module}/findCaseMismatch.js +4 -4
- package/lib/node/CommonJsChunkLoadingPlugin.js +3 -3
- package/lib/{dependencies → node}/ExternalModuleDependency.js +8 -7
- package/lib/{dependencies → node}/ExternalModuleInitFragment.js +7 -6
- package/lib/{dependencies → node}/ExternalModuleInitFragmentDependency.js +14 -9
- package/lib/node/NodeEnvironmentPlugin.js +11 -1
- package/lib/{NodeStuffPlugin.js → node/NodeStuffPlugin.js} +17 -17
- package/lib/node/NodeTargetPlugin.js +1 -1
- package/lib/node/NodeWatchFileSystem.js +58 -6
- package/lib/node/ReadFileChunkLoadingRuntimeModule.js +7 -7
- package/lib/node/ReadFileCompileAsyncWasmPlugin.js +13 -19
- package/lib/node/ReadFileCompileWasmPlugin.js +9 -11
- package/lib/node/RequireChunkLoadingRuntimeModule.js +7 -7
- package/lib/node/nodeConsole.js +6 -7
- package/lib/optimize/AggressiveMergingPlugin.js +2 -2
- package/lib/optimize/AggressiveSplittingPlugin.js +12 -8
- package/lib/{CircularModulesPlugin.js → optimize/CircularModulesPlugin.js} +14 -14
- package/lib/optimize/ConcatenatedModule.js +231 -220
- package/lib/{ConcatenationScope.js → optimize/ConcatenationScope.js} +39 -6
- package/lib/optimize/ConstExportsPlugin.js +7 -7
- package/lib/optimize/EnsureChunkConditionsPlugin.js +3 -3
- package/lib/{FlagAllModulesAsUsedPlugin.js → optimize/FlagAllModulesAsUsedPlugin.js} +3 -3
- package/lib/{FlagDependencyExportsPlugin.js → optimize/FlagDependencyExportsPlugin.js} +23 -28
- package/lib/{FlagDependencyUsagePlugin.js → optimize/FlagDependencyUsagePlugin.js} +44 -19
- package/lib/{FlagEntryExportAsUsedPlugin.js → optimize/FlagEntryExportAsUsedPlugin.js} +2 -2
- package/lib/optimize/FlagIncludedChunksPlugin.js +2 -2
- package/lib/optimize/InlineExports.js +12 -7
- package/lib/optimize/InnerGraph.js +5 -13
- package/lib/optimize/InnerGraphPlugin.js +10 -10
- package/lib/optimize/LazyBarrels.js +620 -0
- package/lib/{util → optimize}/LazyBucketSortedSet.js +2 -2
- package/lib/optimize/LimitChunkCountPlugin.js +16 -7
- package/lib/optimize/MangleExportsPlugin.js +5 -5
- package/lib/optimize/MergeDuplicateChunksPlugin.js +7 -6
- package/lib/optimize/MinChunkSizePlugin.js +9 -6
- package/lib/optimize/ModuleConcatenationPlugin.js +28 -22
- package/lib/{dependencies → optimize}/PureExpressionDependency.js +11 -10
- package/lib/optimize/RealContentHashPlugin.js +18 -13
- package/lib/optimize/RemoveEmptyChunksPlugin.js +2 -2
- package/lib/optimize/RemoveParentModulesPlugin.js +4 -4
- package/lib/optimize/SideEffectsFlagPlugin.js +24 -38
- package/lib/optimize/SplitChunksPlugin.js +719 -174
- package/lib/{util → optimize}/TupleQueue.js +9 -9
- package/lib/optimize/chunkSetIntersections.js +437 -0
- package/lib/{util → optimize}/deterministicGrouping.js +17 -17
- package/lib/{BannerPlugin.js → output/BannerPlugin.js} +82 -14
- package/lib/{CleanPlugin.js → output/CleanPlugin.js} +69 -25
- package/lib/{CopyPlugin.js → output/CopyPlugin.js} +144 -70
- package/lib/{ManifestPlugin.js → output/ManifestPlugin.js} +91 -17
- package/lib/output/SSRManifestPlugin.js +349 -0
- package/lib/performance/AnalyzableBailoutsPlugin.js +1 -1
- package/lib/performance/AsyncChunkWaterfallsPlugin.js +1 -1
- package/lib/performance/BroadContextsPlugin.js +4 -4
- package/lib/performance/CacheEffectivenessPlugin.js +2 -3
- package/lib/performance/ConflictingResourceHintsPlugin.js +1 -1
- package/lib/performance/DuplicateModulesPlugin.js +3 -4
- package/lib/performance/DuplicatePackagesPlugin.js +3 -3
- package/lib/performance/DynamicExportsPlugin.js +2 -2
- package/lib/performance/EvalUsagePlugin.js +4 -6
- package/lib/performance/HotspotsPlugin.js +39 -14
- package/lib/performance/LargeModulesPlugin.js +2 -3
- package/lib/performance/LegacyJavascriptPlugin.js +1 -2
- package/lib/performance/MissingSideEffectsPlugin.js +2 -3
- package/lib/performance/MissingSourceMapsPlugin.js +5 -6
- package/lib/performance/PureAnnotationsPlugin.js +19 -13
- package/lib/performance/RedundantDynamicImportsPlugin.js +6 -8
- package/lib/performance/ScopeHoistingBailoutsPlugin.js +2 -2
- package/lib/performance/SizeLimitsPlugin.js +11 -12
- package/lib/performance/TopLevelThisPlugin.js +22 -13
- package/lib/performance/UnsplitVendorsPlugin.js +1 -2
- package/lib/performance/UnusedAliasesPlugin.js +6 -7
- package/lib/performance/UnusedAssetsPlugin.js +5 -5
- package/lib/performance/UnusedDefinesPlugin.js +2 -2
- package/lib/performance/UnusedExternalsPlugin.js +3 -4
- package/lib/performance/UnusedFederationPlugin.js +2 -4
- package/lib/performance/UnusedModulesPlugin.js +5 -4
- package/lib/performance/getModuleSize.js +1 -1
- package/lib/performance/hasOnlyUnusedExports.js +4 -4
- package/lib/performance/isOnlyReexported.js +7 -6
- package/lib/{AutomaticPrefetchPlugin.js → prefetch/AutomaticPrefetchPlugin.js} +4 -5
- package/lib/prefetch/ChunkPrefetchFunctionRuntimeModule.js +2 -2
- package/lib/prefetch/ChunkPrefetchPreloadPlugin.js +1 -1
- package/lib/prefetch/ChunkPrefetchStartupRuntimeModule.js +4 -4
- package/lib/prefetch/ChunkPrefetchTriggerRuntimeModule.js +4 -4
- package/lib/prefetch/ChunkPreloadTriggerRuntimeModule.js +4 -4
- package/lib/{dependencies → prefetch}/PrefetchDependency.js +1 -1
- package/lib/{PrefetchPlugin.js → prefetch/PrefetchPlugin.js} +2 -2
- package/lib/prefetch/ResourceHintPlugin.js +66 -45
- package/lib/prefetch/ResourceHintRuntimeModule.js +3 -3
- package/lib/prefetch/StartupAssetHintRuntimeModule.js +3 -3
- package/lib/prefetch/parseResourceHintOptions.js +4 -3
- package/lib/{ProvidePlugin.js → provide/ProvidePlugin.js} +7 -7
- package/lib/{dependencies → provide}/ProvidedDependency.js +50 -17
- package/lib/{IgnorePlugin.js → resolve/IgnorePlugin.js} +30 -13
- package/lib/{NormalModuleReplacementPlugin.js → resolve/NormalModuleReplacementPlugin.js} +4 -4
- package/lib/{ResolverFactory.js → resolve/ResolverFactory.js} +18 -5
- package/lib/resolve/getResolveOptionsKey.js +59 -0
- package/lib/rules/BasicEffectRulePlugin.js +1 -1
- package/lib/rules/RuleSetCompiler.js +42 -51
- package/lib/rules/UseEffectRulePlugin.js +1 -3
- package/lib/runtime/AsyncModuleGeneratorRuntimeModule.js +2 -2
- package/lib/runtime/AsyncModuleRuntimeModule.js +14 -5
- package/lib/runtime/AutoPublicPathRuntimeModule.js +5 -5
- package/lib/runtime/BaseUriRuntimeModule.js +3 -3
- package/lib/runtime/ChunkNameRuntimeModule.js +2 -2
- package/lib/runtime/CompatGetDefaultExportRuntimeModule.js +2 -2
- package/lib/runtime/CompatRuntimeModule.js +4 -4
- package/lib/runtime/ConcatenationWrapRuntimeModule.js +2 -2
- package/lib/runtime/ConstructRequireRuntimeModule.js +2 -2
- package/lib/runtime/CreateFakeNamespaceObjectRuntimeModule.js +2 -2
- package/lib/runtime/CreateScriptRuntimeModule.js +2 -2
- package/lib/runtime/CreateScriptUrlRuntimeModule.js +2 -2
- package/lib/runtime/DefinePropertyGettersRuntimeModule.js +6 -6
- package/lib/runtime/EnsureChunkRuntimeModule.js +4 -4
- package/lib/runtime/GetChunkFilenameRuntimeModule.js +7 -11
- package/lib/runtime/GetFullHashRuntimeModule.js +2 -2
- package/lib/runtime/GetMainFilenameRuntimeModule.js +4 -4
- package/lib/runtime/GetTrustedTypesPolicyRuntimeModule.js +3 -3
- package/lib/runtime/GetWorkletBootstrapRuntimeModule.js +3 -3
- package/lib/runtime/GlobalRuntimeModule.js +3 -3
- package/lib/runtime/HasOwnPropertyRuntimeModule.js +3 -3
- package/lib/runtime/HelperRuntimeModule.js +16 -1
- package/lib/runtime/LoadScriptRuntimeModule.js +3 -3
- package/lib/runtime/MakeDeferredNamespaceObjectRuntime.js +80 -17
- package/lib/runtime/MakeNamespaceObjectRuntimeModule.js +2 -2
- package/lib/runtime/NonceRuntimeModule.js +2 -2
- package/lib/runtime/OnChunksLoadedRuntimeModule.js +4 -4
- package/lib/runtime/PublicPathRuntimeModule.js +2 -2
- package/lib/runtime/RelativeUrlRuntimeModule.js +2 -2
- package/lib/{RuntimeGlobals.js → runtime/RuntimeGlobals.js} +24 -1
- package/lib/runtime/RuntimeIdRuntimeModule.js +4 -4
- package/lib/{RuntimeModule.js → runtime/RuntimeModule.js} +36 -21
- package/lib/{RuntimePlugin.js → runtime/RuntimePlugin.js} +50 -50
- package/lib/runtime/SetAnonymousDefaultNameRuntimeModule.js +2 -2
- package/lib/runtime/SpecNamespaceObjectRuntimeModule.js +2 -2
- package/lib/runtime/StartupChunkDependenciesPlugin.js +2 -2
- package/lib/runtime/StartupChunkDependenciesRuntimeModule.js +5 -5
- package/lib/runtime/StartupEntrypointRuntimeModule.js +3 -3
- package/lib/runtime/SystemContextRuntimeModule.js +2 -2
- package/lib/runtime/ToBinaryRuntimeModule.js +3 -3
- package/lib/runtime/WorkerRuntimeModule.js +1 -1
- package/lib/runtime/baseUri.js +1 -1
- package/lib/schemes/DataUriPlugin.js +1 -1
- package/lib/schemes/HttpUriPlugin.js +68 -13
- package/lib/schemes/VirtualUrlPlugin.js +52 -16
- package/lib/serialization/AggregateErrorSerializer.js +4 -4
- package/lib/serialization/BinaryMiddleware.js +4 -1
- package/lib/serialization/ErrorObjectSerializer.js +2 -5
- package/lib/serialization/FileMiddleware.js +3 -3
- package/lib/serialization/ObjectMiddleware.js +62 -29
- package/lib/serialization/PlainObjectSerializer.js +3 -7
- package/lib/serialization/Serializer.js +21 -11
- package/lib/serialization/SerializerMiddleware.js +10 -8
- package/lib/serialization/SingleItemMiddleware.js +4 -2
- package/lib/sharing/ConsumeSharedFallbackDependency.js +9 -1
- package/lib/sharing/ConsumeSharedModule.js +18 -14
- package/lib/sharing/ConsumeSharedPlugin.js +148 -42
- package/lib/sharing/ConsumeSharedRuntimeModule.js +8 -8
- package/lib/sharing/ProvideForSharedDependency.js +9 -1
- package/lib/sharing/ProvideSharedDependency.js +1 -1
- package/lib/sharing/ProvideSharedModule.js +11 -9
- package/lib/sharing/ProvideSharedModuleFactory.js +2 -2
- package/lib/sharing/ProvideSharedPlugin.js +111 -20
- package/lib/sharing/SharePlugin.js +102 -9
- package/lib/sharing/ShareRuntimeModule.js +6 -6
- package/lib/sharing/resolveMatchedConfigs.js +1 -1
- package/lib/{util → sharing}/semver.js +14 -16
- package/lib/sharing/utils.js +59 -2
- package/lib/stats/DefaultStatsFactoryPlugin.js +57 -54
- package/lib/stats/DefaultStatsPresetPlugin.js +3 -7
- package/lib/stats/DefaultStatsPrinterPlugin.js +15 -14
- package/lib/{MultiStats.js → stats/MultiStats.js} +4 -4
- package/lib/{Stats.js → stats/Stats.js} +4 -4
- package/lib/stats/StatsFactory.js +208 -37
- package/lib/stats/StatsPrinter.js +126 -13
- package/lib/{ChunkTemplate.js → template/ChunkTemplate.js} +7 -7
- package/lib/{ConditionalInitFragment.js → template/ConditionalInitFragment.js} +3 -3
- package/lib/template/DependencyTemplate.js +77 -0
- package/lib/{DependencyTemplates.js → template/DependencyTemplates.js} +9 -4
- package/lib/template/InitFragment.js +223 -0
- package/lib/{MainTemplate.js → template/MainTemplate.js} +11 -11
- package/lib/{ModuleInfoHeaderPlugin.js → template/ModuleInfoHeaderPlugin.js} +30 -8
- package/lib/{ModuleTemplate.js → template/ModuleTemplate.js} +6 -6
- package/lib/{RuntimeTemplate.js → template/RuntimeTemplate.js} +158 -95
- package/lib/{Template.js → template/Template.js} +14 -12
- package/lib/{TemplatedPathPlugin.js → template/TemplatedPathPlugin.js} +19 -23
- package/lib/typescript/TypeScriptPlugin.js +3 -3
- package/lib/util/RequestShortener.js +44 -0
- package/lib/util/SortableSet.js +87 -22
- package/lib/util/SourceProcessor.js +439 -51
- package/lib/util/TupleSet.js +27 -27
- package/lib/util/WeakTupleMap.js +20 -16
- package/lib/util/buildDiagnostics.js +2 -2
- package/lib/util/cleverMerge.js +61 -33
- package/lib/util/comparators.js +19 -15
- package/lib/util/concatenate.js +28 -147
- package/lib/util/createMappings.js +111 -0
- package/lib/util/dataURL.js +96 -15
- package/lib/util/deprecation.js +5 -4
- package/lib/util/extractComments.js +118 -0
- package/lib/util/formatLocation.js +1 -1
- package/lib/util/globUtils.js +198 -20
- package/lib/util/haltVisitors.js +51 -0
- package/lib/util/handlerKeys.js +2 -2
- package/lib/util/identifier.js +117 -1
- package/lib/util/implicitTypeLoaderFallback.js +6 -4
- package/lib/util/internalSerializables.js +296 -102
- package/lib/util/magicComment.js +12 -7
- package/lib/util/makeSerializable.js +28 -7
- package/lib/util/memoize.js +1 -1
- package/lib/util/parseJson.js +2 -2
- package/lib/util/preloadModuleType.js +5 -2
- package/lib/util/registerExternalSerializer.js +2 -2
- package/lib/util/removeBOM.js +1 -1
- package/lib/util/runtime.js +1 -1
- package/lib/util/serialization.js +35 -28
- package/lib/util/source.js +2 -2
- package/lib/util/terminalColors.js +161 -0
- package/lib/{wasm-async → wasm}/AsyncWasmCompileRuntimeModule.js +5 -5
- package/lib/{wasm-async → wasm}/AsyncWasmLoadingRuntimeModule.js +5 -5
- package/lib/{wasm-async → wasm}/AsyncWasmModule.js +19 -5
- package/lib/{wasm-async → wasm}/AsyncWebAssemblyGenerator.js +17 -9
- package/lib/{wasm-async → wasm}/AsyncWebAssemblyJavascriptGenerator.js +24 -15
- package/lib/{wasm-async → wasm}/AsyncWebAssemblyModulesPlugin.js +26 -10
- package/lib/{wasm-async → wasm}/AsyncWebAssemblyParser.js +14 -12
- package/lib/wasm/EnableWasmLoadingPlugin.js +1 -1
- package/lib/{wasm-async → wasm}/UniversalCompileAsyncWasmPlugin.js +11 -13
- package/lib/wasm/wasmModuleFilename.js +2 -2
- package/lib/wasm-sync/SyncWasmModule.js +18 -3
- package/lib/wasm-sync/WasmChunkLoadingRuntimeModule.js +8 -8
- package/lib/wasm-sync/WasmFinalizeExportsPlugin.js +3 -3
- package/lib/wasm-sync/WebAssemblyGenerator.js +22 -16
- package/lib/wasm-sync/WebAssemblyJavascriptGenerator.js +28 -21
- package/lib/wasm-sync/WebAssemblyModulesPlugin.js +9 -7
- package/lib/wasm-sync/WebAssemblyParser.js +15 -17
- package/lib/wasm-sync/WebAssemblyUtils.js +6 -5
- package/lib/{MultiWatching.js → watch/MultiWatching.js} +3 -3
- package/lib/{WatchIgnorePlugin.js → watch/WatchIgnorePlugin.js} +43 -9
- package/lib/{Watching.js → watch/Watching.js} +8 -8
- package/lib/web/FetchCompileAsyncWasmPlugin.js +12 -18
- package/lib/web/FetchCompileWasmPlugin.js +8 -10
- package/lib/web/JsonpChunkLoadingPlugin.js +3 -3
- package/lib/web/JsonpChunkLoadingRuntimeModule.js +6 -6
- package/lib/web/JsonpTemplatePlugin.js +1 -1
- package/lib/webpack.js +27 -17
- package/lib/webworker/ImportScriptsChunkLoadingPlugin.js +3 -3
- package/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js +6 -6
- package/package.json +57 -36
- package/schemas/WebpackOptions.check.js +4 -3
- package/schemas/WebpackOptions.d.json.ts +2 -0
- package/schemas/WebpackOptions.json +295 -75
- package/schemas/plugins/BannerPlugin.check.js +4 -3
- package/schemas/plugins/BannerPlugin.json +29 -2
- package/schemas/plugins/HtmlGeneratorOptions.check.js +4 -3
- package/schemas/plugins/HtmlParserOptions.check.js +4 -3
- package/schemas/plugins/IgnorePlugin.check.js +4 -3
- package/schemas/plugins/IgnorePlugin.d.json.ts +2 -0
- package/schemas/plugins/IgnorePlugin.json +1 -1
- package/schemas/plugins/LoaderOptionsPlugin.check.js +4 -3
- package/schemas/plugins/ManifestPlugin.check.js +4 -3
- package/schemas/plugins/ManifestPlugin.json +3 -3
- package/schemas/plugins/ProgressPlugin.check.js +4 -3
- package/schemas/plugins/ProgressPlugin.json +2 -7
- package/schemas/plugins/SSRManifestPlugin.check.js +7 -0
- package/schemas/plugins/SSRManifestPlugin.json +20 -0
- package/schemas/plugins/SourceMapDevToolPlugin.check.js +4 -3
- package/schemas/plugins/SourceMapDevToolPlugin.json +44 -12
- package/schemas/plugins/WatchIgnorePlugin.check.js +4 -3
- package/schemas/plugins/WatchIgnorePlugin.json +12 -3
- package/schemas/plugins/asset/AssetGeneratorOptions.check.js +4 -3
- package/schemas/plugins/asset/AssetInlineGeneratorOptions.check.js +4 -3
- package/schemas/plugins/asset/AssetParserOptions.check.js +4 -3
- package/schemas/plugins/asset/AssetResourceGeneratorOptions.check.js +4 -3
- package/schemas/plugins/container/ContainerPlugin.check.js +4 -3
- package/schemas/plugins/container/ContainerPlugin.json +8 -0
- package/schemas/plugins/container/ContainerReferencePlugin.check.js +4 -3
- package/schemas/plugins/container/ExternalsType.check.js +4 -3
- package/schemas/plugins/container/ModuleFederationPlugin.check.js +4 -3
- package/schemas/plugins/container/ModuleFederationPlugin.json +40 -0
- package/schemas/plugins/css/CssAutoOrModuleParserOptions.check.js +4 -3
- package/schemas/plugins/css/CssGeneratorOptions.check.js +4 -3
- package/schemas/plugins/css/CssModuleGeneratorOptions.check.js +4 -3
- package/schemas/plugins/css/CssModuleParserOptions.check.js +4 -3
- package/schemas/plugins/css/CssParserOptions.check.js +4 -3
- package/schemas/plugins/debug/ProfilingPlugin.check.js +4 -3
- package/schemas/plugins/define/DotenvPluginOptions.check.js +7 -0
- package/schemas/plugins/define/DotenvPluginOptions.json +3 -0
- package/schemas/plugins/dll/DllPlugin.check.js +4 -3
- package/schemas/plugins/dll/DllReferencePlugin.check.js +4 -3
- package/schemas/plugins/dll/DllReferencePlugin.json +3 -18
- package/schemas/plugins/ids/HashedModuleIdsPlugin.check.js +4 -3
- package/schemas/plugins/ids/OccurrenceChunkIdsPlugin.check.js +4 -3
- package/schemas/plugins/ids/OccurrenceModuleIdsPlugin.check.js +4 -3
- package/schemas/plugins/json/JsonModulesPluginGenerator.check.js +4 -3
- package/schemas/plugins/json/JsonModulesPluginParser.check.js +4 -3
- package/schemas/plugins/optimize/AggressiveSplittingPlugin.check.js +4 -3
- package/schemas/plugins/optimize/LimitChunkCountPlugin.check.js +4 -3
- package/schemas/plugins/optimize/MergeDuplicateChunksPlugin.check.js +4 -3
- package/schemas/plugins/optimize/MinChunkSizePlugin.check.js +4 -3
- package/schemas/plugins/output/CleanOptions.check.js +7 -0
- package/schemas/plugins/output/CleanOptions.json +3 -0
- package/schemas/plugins/schemes/HttpUriPlugin.check.js +4 -3
- package/schemas/plugins/schemes/VirtualUrlPlugin.check.js +4 -3
- package/schemas/plugins/sharing/ConsumeSharedPlugin.check.js +4 -3
- package/schemas/plugins/sharing/ConsumeSharedPlugin.json +32 -0
- package/schemas/plugins/sharing/ProvideSharedPlugin.check.js +4 -3
- package/schemas/plugins/sharing/ProvideSharedPlugin.json +32 -0
- package/schemas/plugins/sharing/SharePlugin.check.js +4 -3
- package/schemas/plugins/sharing/SharePlugin.json +32 -0
- package/types.d.ts +20780 -14174
- package/lib/LazyBarrel.js +0 -388
- package/lib/dependencies/HarmonyAcceptImportDependency.js +0 -39
- package/lib/dependencies/HarmonyModulesPlugin.js +0 -192
- package/lib/javascript/ChunkFormatHelpers.js +0 -72
- package/lib/javascript/grammar.js +0 -5546
- package/lib/javascript/parser.js +0 -1500
- package/lib/javascript/regexpData.js +0 -51
- package/lib/performance/getSourceModules.js +0 -22
- package/lib/util/Semaphore.js +0 -65
- package/lib/util/objectToMap.js +0 -15
- package/schemas/WebpackOptions.check.d.ts +0 -7
- package/schemas/_container.json +0 -155
- package/schemas/_sharing.json +0 -118
- package/schemas/plugins/BannerPlugin.check.d.ts +0 -7
- package/schemas/plugins/HtmlGeneratorOptions.check.d.ts +0 -7
- package/schemas/plugins/HtmlParserOptions.check.d.ts +0 -7
- package/schemas/plugins/IgnorePlugin.check.d.ts +0 -7
- package/schemas/plugins/LoaderOptionsPlugin.check.d.ts +0 -7
- package/schemas/plugins/ManifestPlugin.check.d.ts +0 -7
- package/schemas/plugins/ProgressPlugin.check.d.ts +0 -7
- package/schemas/plugins/SourceMapDevToolPlugin.check.d.ts +0 -7
- package/schemas/plugins/WatchIgnorePlugin.check.d.ts +0 -7
- package/schemas/plugins/asset/AssetGeneratorOptions.check.d.ts +0 -7
- package/schemas/plugins/asset/AssetInlineGeneratorOptions.check.d.ts +0 -7
- package/schemas/plugins/asset/AssetParserOptions.check.d.ts +0 -7
- package/schemas/plugins/asset/AssetResourceGeneratorOptions.check.d.ts +0 -7
- package/schemas/plugins/container/ContainerPlugin.check.d.ts +0 -7
- package/schemas/plugins/container/ContainerReferencePlugin.check.d.ts +0 -7
- package/schemas/plugins/container/ExternalsType.check.d.ts +0 -7
- package/schemas/plugins/container/ModuleFederationPlugin.check.d.ts +0 -7
- package/schemas/plugins/css/CssAutoOrModuleParserOptions.check.d.ts +0 -7
- package/schemas/plugins/css/CssGeneratorOptions.check.d.ts +0 -7
- package/schemas/plugins/css/CssModuleGeneratorOptions.check.d.ts +0 -7
- package/schemas/plugins/css/CssModuleParserOptions.check.d.ts +0 -7
- package/schemas/plugins/css/CssParserOptions.check.d.ts +0 -7
- package/schemas/plugins/debug/ProfilingPlugin.check.d.ts +0 -7
- package/schemas/plugins/dll/DllPlugin.check.d.ts +0 -7
- package/schemas/plugins/dll/DllReferencePlugin.check.d.ts +0 -7
- package/schemas/plugins/ids/HashedModuleIdsPlugin.check.d.ts +0 -7
- package/schemas/plugins/ids/OccurrenceChunkIdsPlugin.check.d.ts +0 -7
- package/schemas/plugins/ids/OccurrenceModuleIdsPlugin.check.d.ts +0 -7
- package/schemas/plugins/json/JsonModulesPluginGenerator.check.d.ts +0 -7
- package/schemas/plugins/json/JsonModulesPluginParser.check.d.ts +0 -7
- package/schemas/plugins/optimize/AggressiveSplittingPlugin.check.d.ts +0 -7
- package/schemas/plugins/optimize/LimitChunkCountPlugin.check.d.ts +0 -7
- package/schemas/plugins/optimize/MergeDuplicateChunksPlugin.check.d.ts +0 -7
- package/schemas/plugins/optimize/MinChunkSizePlugin.check.d.ts +0 -7
- package/schemas/plugins/schemes/HttpUriPlugin.check.d.ts +0 -7
- package/schemas/plugins/schemes/VirtualUrlPlugin.check.d.ts +0 -7
- package/schemas/plugins/sharing/ConsumeSharedPlugin.check.d.ts +0 -7
- package/schemas/plugins/sharing/ProvideSharedPlugin.check.d.ts +0 -7
- package/schemas/plugins/sharing/SharePlugin.check.d.ts +0 -7
- /package/lib/{validateSchema.js → config/validateSchema.js} +0 -0
- /package/lib/{util → css}/topologicalSort.js +0 -0
- /package/lib/dependencies/{getFunctionExpression.js → helpers/getFunctionExpression.js} +0 -0
- /package/lib/{util → externals}/extractUrlAndGlobal.js +0 -0
- /package/lib/{util → fs}/StackedCacheMap.js +0 -0
- /package/lib/{util → javascript}/StackedMap.js +0 -0
- /package/lib/{ModuleProfile.js → module/ModuleProfile.js} +0 -0
- /package/lib/{ModuleSourceTypeConstants.js → module/ModuleSourceTypeConstants.js} +0 -0
- /package/lib/{ModuleTypeConstants.js → module/ModuleTypeConstants.js} +0 -0
- /package/lib/{OptimizationStages.js → optimize/OptimizationStages.js} +0 -0
- /package/lib/{util → optimize}/Queue.js +0 -0
- /package/lib/{util → stats}/smartGrouping.js +0 -0
|
@@ -5,8 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
"use strict";
|
|
7
7
|
|
|
8
|
-
const
|
|
9
|
-
const { STAGE_ADVANCED } = require("../OptimizationStages");
|
|
8
|
+
const MinMaxSizeWarning = require("../errors/MinMaxSizeWarning");
|
|
10
9
|
const WebpackError = require("../errors/WebpackError");
|
|
11
10
|
const { requestToId } = require("../ids/IdHelpers");
|
|
12
11
|
const { isSubset } = require("../util/SetHelpers");
|
|
@@ -16,10 +15,15 @@ const {
|
|
|
16
15
|
compareModulesByIdentifier
|
|
17
16
|
} = require("../util/comparators");
|
|
18
17
|
const createHash = require("../util/createHash");
|
|
19
|
-
const deterministicGrouping = require("../util/deterministicGrouping");
|
|
20
18
|
const { makePathsRelative } = require("../util/identifier");
|
|
21
19
|
const memoize = require("../util/memoize");
|
|
22
|
-
const
|
|
20
|
+
const { STAGE_ADVANCED } = require("./OptimizationStages");
|
|
21
|
+
const { discoverIntersections } = require("./chunkSetIntersections");
|
|
22
|
+
const deterministicGrouping = require("./deterministicGrouping");
|
|
23
|
+
|
|
24
|
+
const getMatchModuleGlobCondition = memoize(
|
|
25
|
+
() => require("../util/globUtils").matchModuleGlobCondition
|
|
26
|
+
);
|
|
23
27
|
|
|
24
28
|
/**
|
|
25
29
|
* @import {
|
|
@@ -33,16 +37,16 @@ const MinMaxSizeWarning = require("./MinMaxSizeWarning");
|
|
|
33
37
|
* OutputNormalizedWithDefaults as OutputOptions
|
|
34
38
|
* } from "../config/defaults"
|
|
35
39
|
*/
|
|
36
|
-
/** @import { ChunkName, ChunkFilenameTemplate } from "../Chunk" */
|
|
37
|
-
/** @import ChunkGraph from "../ChunkGraph" */
|
|
38
|
-
/** @import ChunkGroup from "../ChunkGroup" */
|
|
40
|
+
/** @import Chunk, { ChunkName, ChunkFilenameTemplate } from "../graph/Chunk" */
|
|
41
|
+
/** @import ChunkGraph from "../graph/ChunkGraph" */
|
|
42
|
+
/** @import ChunkGroup from "../graph/ChunkGroup" */
|
|
39
43
|
/** @import Compilation from "../Compilation" */
|
|
40
44
|
/** @import Compiler from "../Compiler" */
|
|
41
|
-
/** @import Module, { SourceType } from "../Module" */
|
|
42
|
-
/** @import ModuleGraph from "../ModuleGraph" */
|
|
43
|
-
/** @typedef {import("
|
|
44
|
-
/** @typedef {import("
|
|
45
|
-
/** @import { Sizes } from "
|
|
45
|
+
/** @import Module, { SourceType } from "../module/Module" */
|
|
46
|
+
/** @import ModuleGraph from "../graph/ModuleGraph" */
|
|
47
|
+
/** @typedef {import("./deterministicGrouping").GroupedItems<Module>} DeterministicGroupingGroupedItemsForModule */
|
|
48
|
+
/** @typedef {import("./deterministicGrouping").Options<Module>} DeterministicGroupingOptionsForModule */
|
|
49
|
+
/** @import { Sizes } from "./deterministicGrouping" */
|
|
46
50
|
|
|
47
51
|
/**
|
|
48
52
|
* Defines the chunk filter fn callback.
|
|
@@ -114,6 +118,7 @@ const MinMaxSizeWarning = require("./MinMaxSizeWarning");
|
|
|
114
118
|
* @property {boolean} reuseExistingChunk
|
|
115
119
|
* @property {boolean} usedExports
|
|
116
120
|
* @property {boolean} _validateSize
|
|
121
|
+
* @property {boolean} _validateSizeReduction
|
|
117
122
|
* @property {boolean} _validateRemainingSize
|
|
118
123
|
* @property {SplitChunksSizes} _minSizeForMaxSize
|
|
119
124
|
* @property {boolean} _conditionalEnforce
|
|
@@ -158,6 +163,7 @@ const MinMaxSizeWarning = require("./MinMaxSizeWarning");
|
|
|
158
163
|
/**
|
|
159
164
|
* Defines the split chunks options type used by this module.
|
|
160
165
|
* @typedef {object} SplitChunksOptions
|
|
166
|
+
* @property {number | undefined} dedupDepth
|
|
161
167
|
* @property {ChunkFilterFn} chunksFilter
|
|
162
168
|
* @property {DefaultSizeTypes} defaultSizeTypes
|
|
163
169
|
* @property {SplitChunksSizes} minSize
|
|
@@ -178,6 +184,22 @@ const MinMaxSizeWarning = require("./MinMaxSizeWarning");
|
|
|
178
184
|
* @property {FallbackCacheGroup} fallbackCacheGroup
|
|
179
185
|
*/
|
|
180
186
|
|
|
187
|
+
/**
|
|
188
|
+
* A cache group as intersection discovery reads it: what it takes, and how much
|
|
189
|
+
* the modules it would take have to weigh.
|
|
190
|
+
* @typedef {object} IntersectionCacheGroup
|
|
191
|
+
* @property {OptimizationSplitChunksCacheGroup["test"]} test the modules it accepts
|
|
192
|
+
* @property {SplitChunksSizes} minSize the size each of their types must reach
|
|
193
|
+
*/
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* What the cache groups taking intersections allow discovery to assume.
|
|
197
|
+
* @typedef {object} IntersectionSettings
|
|
198
|
+
* @property {number} minSize size an intersection's modules must reach, `0` when unbounded
|
|
199
|
+
* @property {number} minMembers fewest chunks an intersection is worth discovering with
|
|
200
|
+
* @property {IntersectionCacheGroup[] | undefined} groups the cache groups taking them, when every one of them is known
|
|
201
|
+
*/
|
|
202
|
+
|
|
181
203
|
/** @typedef {Set<Chunk>} ChunkSet */
|
|
182
204
|
|
|
183
205
|
/**
|
|
@@ -340,8 +362,14 @@ const ASYNC_CHUNK_FILTER = (chunk) => !chunk.canBeInitial();
|
|
|
340
362
|
*/
|
|
341
363
|
const ALL_CHUNK_FILTER = (_chunk) => true;
|
|
342
364
|
|
|
343
|
-
|
|
344
|
-
|
|
365
|
+
// What one compilation may spend looking for the intersections of its chunk
|
|
366
|
+
// sets: a word of every pair of them it reaches, and the intersections it keeps,
|
|
367
|
+
// bounding the worst case of chunk sets that each span most chunks.
|
|
368
|
+
|
|
369
|
+
// TODO raise or drop both once threads carry the search, as rspack needs no
|
|
370
|
+
// ceiling with rayon behind it
|
|
371
|
+
const MAX_INTERSECTION_WORK = 50000000;
|
|
372
|
+
const MAX_INTERSECTIONS = 10000;
|
|
345
373
|
|
|
346
374
|
/**
|
|
347
375
|
* Returns normalized representation.
|
|
@@ -381,7 +409,7 @@ const mergeSizes = (...sizes) => {
|
|
|
381
409
|
* @returns {boolean} true, if there are sizes > 0
|
|
382
410
|
*/
|
|
383
411
|
const hasNonZeroSizes = (sizes) => {
|
|
384
|
-
for (const key of
|
|
412
|
+
for (const key of Object.keys(sizes)) {
|
|
385
413
|
if (sizes[key] > 0) return true;
|
|
386
414
|
}
|
|
387
415
|
return false;
|
|
@@ -417,7 +445,7 @@ const combineSizes = (a, b, combine) => {
|
|
|
417
445
|
* @returns {boolean} true if there are sizes and all existing sizes are at least `minSize`
|
|
418
446
|
*/
|
|
419
447
|
const checkMinSize = (sizes, minSize) => {
|
|
420
|
-
for (const key of
|
|
448
|
+
for (const key of Object.keys(minSize)) {
|
|
421
449
|
const size = sizes[key];
|
|
422
450
|
if (size === undefined || size === 0) continue;
|
|
423
451
|
if (size < minSize[key]) return false;
|
|
@@ -433,9 +461,7 @@ const checkMinSize = (sizes, minSize) => {
|
|
|
433
461
|
* @returns {boolean} true if there are sizes and all existing sizes are at least `minSizeReduction`
|
|
434
462
|
*/
|
|
435
463
|
const checkMinSizeReduction = (sizes, minSizeReduction, chunkCount) => {
|
|
436
|
-
for (const key of
|
|
437
|
-
Object.keys(minSizeReduction)
|
|
438
|
-
)) {
|
|
464
|
+
for (const key of Object.keys(minSizeReduction)) {
|
|
439
465
|
const size = sizes[key];
|
|
440
466
|
if (size === undefined || size === 0) continue;
|
|
441
467
|
if (size * chunkCount < minSizeReduction[key]) return false;
|
|
@@ -452,7 +478,7 @@ const checkMinSizeReduction = (sizes, minSizeReduction, chunkCount) => {
|
|
|
452
478
|
const getViolatingMinSizes = (sizes, minSize) => {
|
|
453
479
|
/** @type {SourceTypes | undefined} */
|
|
454
480
|
let list;
|
|
455
|
-
for (const key of
|
|
481
|
+
for (const key of Object.keys(minSize)) {
|
|
456
482
|
const size = sizes[key];
|
|
457
483
|
if (size === undefined || size === 0) continue;
|
|
458
484
|
if (size < minSize[key]) {
|
|
@@ -470,7 +496,7 @@ const getViolatingMinSizes = (sizes, minSize) => {
|
|
|
470
496
|
*/
|
|
471
497
|
const totalSize = (sizes) => {
|
|
472
498
|
let size = 0;
|
|
473
|
-
for (const key of
|
|
499
|
+
for (const key of Object.keys(sizes)) {
|
|
474
500
|
size += sizes[key];
|
|
475
501
|
}
|
|
476
502
|
return size;
|
|
@@ -486,7 +512,7 @@ const normalizeName = (name) => {
|
|
|
486
512
|
return () => name;
|
|
487
513
|
}
|
|
488
514
|
if (typeof name === "function") {
|
|
489
|
-
return
|
|
515
|
+
return name;
|
|
490
516
|
}
|
|
491
517
|
};
|
|
492
518
|
|
|
@@ -513,19 +539,41 @@ const normalizeChunksFilter = (chunks) => {
|
|
|
513
539
|
}
|
|
514
540
|
};
|
|
515
541
|
|
|
542
|
+
/**
|
|
543
|
+
* A cache group source a module can only match or not, and what decides it.
|
|
544
|
+
* @typedef {object} StaticCacheGroupSource
|
|
545
|
+
* @property {CacheGroupSource} source the normalized source
|
|
546
|
+
* @property {OptimizationSplitChunksCacheGroup["test"]} test the modules it accepts
|
|
547
|
+
*/
|
|
548
|
+
|
|
549
|
+
/**
|
|
550
|
+
* The normalized cache groups, and what is known about them without a module.
|
|
551
|
+
* @typedef {object} NormalizedCacheGroups
|
|
552
|
+
* @property {GetCacheGroups} getCacheGroups a function to get the cache groups
|
|
553
|
+
* @property {StaticCacheGroupSource[]} staticSources the sources a module can only match or not
|
|
554
|
+
* @property {boolean} hasDynamicSources true when a callback builds sources per module
|
|
555
|
+
*/
|
|
556
|
+
|
|
516
557
|
/**
|
|
517
558
|
* Normalizes cache groups.
|
|
518
559
|
* @param {undefined | GetCacheGroups | Record<string, false | string | RegExp | RawGetCacheGroups | OptimizationSplitChunksCacheGroup>} cacheGroups the cache group options
|
|
519
560
|
* @param {DefaultSizeTypes} defaultSizeTypes the default size types
|
|
520
|
-
* @returns {
|
|
561
|
+
* @returns {NormalizedCacheGroups} the normalized cache groups
|
|
521
562
|
*/
|
|
522
563
|
const normalizeCacheGroups = (cacheGroups, defaultSizeTypes) => {
|
|
523
564
|
if (typeof cacheGroups === "function") {
|
|
524
|
-
return
|
|
565
|
+
return {
|
|
566
|
+
getCacheGroups: cacheGroups,
|
|
567
|
+
staticSources: [],
|
|
568
|
+
hasDynamicSources: true
|
|
569
|
+
};
|
|
525
570
|
}
|
|
526
571
|
if (typeof cacheGroups === "object" && cacheGroups !== null) {
|
|
527
572
|
/** @type {((module: Module, context: CacheGroupsContext, results: CacheGroupSource[]) => void)[]} */
|
|
528
573
|
const handlers = [];
|
|
574
|
+
/** @type {StaticCacheGroupSource[]} */
|
|
575
|
+
const staticSources = [];
|
|
576
|
+
let hasDynamicSources = false;
|
|
529
577
|
for (const key of Object.keys(cacheGroups)) {
|
|
530
578
|
const option = cacheGroups[key];
|
|
531
579
|
if (option === false) {
|
|
@@ -533,6 +581,7 @@ const normalizeCacheGroups = (cacheGroups, defaultSizeTypes) => {
|
|
|
533
581
|
}
|
|
534
582
|
if (typeof option === "string" || option instanceof RegExp) {
|
|
535
583
|
const source = createCacheGroupSource({}, key, defaultSizeTypes);
|
|
584
|
+
staticSources.push({ source, test: option });
|
|
536
585
|
handlers.push((module, context, results) => {
|
|
537
586
|
if (checkTest(option, module, context)) {
|
|
538
587
|
results.push(source);
|
|
@@ -541,6 +590,7 @@ const normalizeCacheGroups = (cacheGroups, defaultSizeTypes) => {
|
|
|
541
590
|
} else if (typeof option === "function") {
|
|
542
591
|
/** @type {WeakMap<OptimizationSplitChunksCacheGroup, CacheGroupSource>} */
|
|
543
592
|
const cache = new WeakMap();
|
|
593
|
+
hasDynamicSources = true;
|
|
544
594
|
handlers.push((module, context, results) => {
|
|
545
595
|
const result = option(module);
|
|
546
596
|
if (result) {
|
|
@@ -563,6 +613,7 @@ const normalizeCacheGroups = (cacheGroups, defaultSizeTypes) => {
|
|
|
563
613
|
});
|
|
564
614
|
} else {
|
|
565
615
|
const source = createCacheGroupSource(option, key, defaultSizeTypes);
|
|
616
|
+
staticSources.push({ source, test: option.test });
|
|
566
617
|
handlers.push((module, context, results) => {
|
|
567
618
|
if (
|
|
568
619
|
checkTest(option.test, module, context) &&
|
|
@@ -588,9 +639,13 @@ const normalizeCacheGroups = (cacheGroups, defaultSizeTypes) => {
|
|
|
588
639
|
}
|
|
589
640
|
return results;
|
|
590
641
|
};
|
|
591
|
-
return fn;
|
|
642
|
+
return { getCacheGroups: fn, staticSources, hasDynamicSources };
|
|
592
643
|
}
|
|
593
|
-
return
|
|
644
|
+
return {
|
|
645
|
+
getCacheGroups: () => null,
|
|
646
|
+
staticSources: [],
|
|
647
|
+
hasDynamicSources: false
|
|
648
|
+
};
|
|
594
649
|
};
|
|
595
650
|
|
|
596
651
|
/** @typedef {(module: Module, context: CacheGroupsContext) => boolean} CheckTestFn */
|
|
@@ -616,9 +671,36 @@ const checkTest = (test, module, context) => {
|
|
|
616
671
|
const name = module.nameForCondition();
|
|
617
672
|
return name ? test.test(name) : false;
|
|
618
673
|
}
|
|
674
|
+
if (typeof test === "object") {
|
|
675
|
+
return getMatchModuleGlobCondition()(test, module);
|
|
676
|
+
}
|
|
619
677
|
return false;
|
|
620
678
|
};
|
|
621
679
|
|
|
680
|
+
/**
|
|
681
|
+
* Whether a module matches a test that decides it without running user code.
|
|
682
|
+
* A callback or a test naming no modules is treated as matching, so a module it
|
|
683
|
+
* might take is never taken for one it cannot.
|
|
684
|
+
* @param {OptimizationSplitChunksCacheGroup["test"]} test test option
|
|
685
|
+
* @param {Module} module the module
|
|
686
|
+
* @returns {boolean} true, if the module may be selected
|
|
687
|
+
*/
|
|
688
|
+
const matchesStaticTest = (test, module) => {
|
|
689
|
+
if (typeof test === "string") {
|
|
690
|
+
const name = module.nameForCondition();
|
|
691
|
+
return name ? name.startsWith(test) : false;
|
|
692
|
+
}
|
|
693
|
+
if (test instanceof RegExp) {
|
|
694
|
+
const name = module.nameForCondition();
|
|
695
|
+
return name ? test.test(name) : false;
|
|
696
|
+
}
|
|
697
|
+
if (typeof test === "object") {
|
|
698
|
+
return getMatchModuleGlobCondition()(test, module);
|
|
699
|
+
}
|
|
700
|
+
if (typeof test === "boolean") return test;
|
|
701
|
+
return true;
|
|
702
|
+
};
|
|
703
|
+
|
|
622
704
|
/** @typedef {(type: string) => boolean} CheckModuleTypeFn */
|
|
623
705
|
|
|
624
706
|
/**
|
|
@@ -724,6 +806,16 @@ class SplitChunksPlugin {
|
|
|
724
806
|
* @param {OptimizationSplitChunksOptions=} options plugin options
|
|
725
807
|
*/
|
|
726
808
|
constructor(options = {}) {
|
|
809
|
+
if (
|
|
810
|
+
options.dedupDepth !== undefined &&
|
|
811
|
+
(!Number.isInteger(options.dedupDepth) ||
|
|
812
|
+
options.dedupDepth < 0 ||
|
|
813
|
+
options.dedupDepth > 0xffffffff)
|
|
814
|
+
) {
|
|
815
|
+
throw new WebpackError(
|
|
816
|
+
'"optimization.splitChunks.dedupDepth" must be an integer between 0 and 4294967295.'
|
|
817
|
+
);
|
|
818
|
+
}
|
|
727
819
|
const defaultSizeTypes = options.defaultSizeTypes || [
|
|
728
820
|
"javascript",
|
|
729
821
|
"unknown"
|
|
@@ -735,9 +827,12 @@ class SplitChunksPlugin {
|
|
|
735
827
|
defaultSizeTypes
|
|
736
828
|
);
|
|
737
829
|
const maxSize = normalizeSizes(options.maxSize, defaultSizeTypes);
|
|
830
|
+
const { getCacheGroups, staticSources, hasDynamicSources } =
|
|
831
|
+
normalizeCacheGroups(options.cacheGroups, defaultSizeTypes);
|
|
738
832
|
|
|
739
833
|
/** @type {SplitChunksOptions} */
|
|
740
834
|
this.options = {
|
|
835
|
+
dedupDepth: options.dedupDepth,
|
|
741
836
|
chunksFilter:
|
|
742
837
|
/** @type {ChunkFilterFn} */
|
|
743
838
|
(normalizeChunksFilter(options.chunks || "all")),
|
|
@@ -765,10 +860,7 @@ class SplitChunksPlugin {
|
|
|
765
860
|
maxInitialRequests: options.maxInitialRequests || 1,
|
|
766
861
|
hidePathInfo: options.hidePathInfo || false,
|
|
767
862
|
filename: options.filename || undefined,
|
|
768
|
-
getCacheGroups
|
|
769
|
-
options.cacheGroups,
|
|
770
|
-
defaultSizeTypes
|
|
771
|
-
),
|
|
863
|
+
getCacheGroups,
|
|
772
864
|
getName: options.name
|
|
773
865
|
? /** @type {GetNameFn} */ (normalizeName(options.name))
|
|
774
866
|
: defaultGetName,
|
|
@@ -807,6 +899,64 @@ class SplitChunksPlugin {
|
|
|
807
899
|
|
|
808
900
|
/** @type {WeakMap<CacheGroupSource, CacheGroup>} */
|
|
809
901
|
this._cacheGroupCache = new WeakMap();
|
|
902
|
+
/** @type {StaticCacheGroupSource[]} */
|
|
903
|
+
this._staticCacheGroupSources = staticSources;
|
|
904
|
+
this._hasDynamicCacheGroups = hasDynamicSources;
|
|
905
|
+
}
|
|
906
|
+
|
|
907
|
+
/**
|
|
908
|
+
* Settings for the intersections a chunk set discovers, or `undefined` when no
|
|
909
|
+
* cache group would take one.
|
|
910
|
+
* @param {boolean} usedExports true for the sets grouped by used exports
|
|
911
|
+
* @param {number} dedupDepth rounds of discovery this compilation allows
|
|
912
|
+
* @returns {IntersectionSettings | undefined} the settings, when discovery applies
|
|
913
|
+
*/
|
|
914
|
+
_getIntersectionSettings(usedExports, dedupDepth) {
|
|
915
|
+
if (dedupDepth === 0) return undefined;
|
|
916
|
+
// A callback builds its cache groups per module, so neither what they take
|
|
917
|
+
// nor what they ask of it is known here: discover for the widest of them,
|
|
918
|
+
// and bound nothing.
|
|
919
|
+
if (this._hasDynamicCacheGroups) {
|
|
920
|
+
return { minSize: 0, minMembers: 1, groups: undefined };
|
|
921
|
+
}
|
|
922
|
+
/** @type {IntersectionCacheGroup[]} */
|
|
923
|
+
const groups = [];
|
|
924
|
+
let minMembers = Number.POSITIVE_INFINITY;
|
|
925
|
+
/** @type {number | undefined} */
|
|
926
|
+
let minSize;
|
|
927
|
+
for (const { source, test } of this._staticCacheGroupSources) {
|
|
928
|
+
const cacheGroup = this._getCacheGroup(source);
|
|
929
|
+
if (
|
|
930
|
+
cacheGroup.usedExports !== usedExports ||
|
|
931
|
+
cacheGroup.getName !== defaultGetName ||
|
|
932
|
+
(!cacheGroup._validateSize && !cacheGroup._validateSizeReduction)
|
|
933
|
+
) {
|
|
934
|
+
continue;
|
|
935
|
+
}
|
|
936
|
+
groups.push({ test, minSize: cacheGroup.minSize });
|
|
937
|
+
minMembers = Math.min(minMembers, Math.max(1, cacheGroup.minChunks));
|
|
938
|
+
if (minSize === 0) continue;
|
|
939
|
+
// A chunk filter can map two intersections onto the same selected
|
|
940
|
+
// chunks, where only the modules of both together reach `minSize`, so
|
|
941
|
+
// a bound holds only for groups taking the chunks as they are.
|
|
942
|
+
|
|
943
|
+
// TODO intersect what a filter selects, where every group shares one,
|
|
944
|
+
// so a filtered build is bounded as well
|
|
945
|
+
if (
|
|
946
|
+
cacheGroup.chunksFilter !== ALL_CHUNK_FILTER ||
|
|
947
|
+
!cacheGroup._validateSize
|
|
948
|
+
) {
|
|
949
|
+
minSize = 0;
|
|
950
|
+
continue;
|
|
951
|
+
}
|
|
952
|
+
for (const size of Object.values(cacheGroup.minSize)) {
|
|
953
|
+
if (size > 0 && (minSize === undefined || size < minSize)) {
|
|
954
|
+
minSize = size;
|
|
955
|
+
}
|
|
956
|
+
}
|
|
957
|
+
}
|
|
958
|
+
if (groups.length === 0) return undefined;
|
|
959
|
+
return { minSize: minSize || 0, minMembers, groups };
|
|
810
960
|
}
|
|
811
961
|
|
|
812
962
|
/**
|
|
@@ -890,6 +1040,7 @@ class SplitChunksPlugin {
|
|
|
890
1040
|
: cacheGroupSource.key,
|
|
891
1041
|
reuseExistingChunk: cacheGroupSource.reuseExistingChunk || false,
|
|
892
1042
|
_validateSize: hasNonZeroSizes(minSize),
|
|
1043
|
+
_validateSizeReduction: hasNonZeroSizes(minSizeReduction),
|
|
893
1044
|
_validateRemainingSize: hasNonZeroSizes(minRemainingSize),
|
|
894
1045
|
_minSizeForMaxSize: mergeSizes(
|
|
895
1046
|
cacheGroupSource.minSize,
|
|
@@ -941,24 +1092,50 @@ class SplitChunksPlugin {
|
|
|
941
1092
|
logger.time("prepare");
|
|
942
1093
|
const chunkGraph = compilation.chunkGraph;
|
|
943
1094
|
const moduleGraph = compilation.moduleGraph;
|
|
1095
|
+
// Rounds of discovery: what the option says, or what the defaults
|
|
1096
|
+
// of the next major imply, as a plugin constructed by hand reads
|
|
1097
|
+
// no defaults of its own
|
|
1098
|
+
const dedupDepth =
|
|
1099
|
+
this.options.dedupDepth === undefined
|
|
1100
|
+
? compiler.options.experiments.futureDefaults
|
|
1101
|
+
? 1
|
|
1102
|
+
: 0
|
|
1103
|
+
: this.options.dedupDepth;
|
|
1104
|
+
const intersectionSettings = this._getIntersectionSettings(
|
|
1105
|
+
false,
|
|
1106
|
+
dedupDepth
|
|
1107
|
+
);
|
|
1108
|
+
const exportsIntersectionSettings = this._getIntersectionSettings(
|
|
1109
|
+
true,
|
|
1110
|
+
dedupDepth
|
|
1111
|
+
);
|
|
1112
|
+
// Chunks in the index intersection discovery works in, built only
|
|
1113
|
+
// when a cache group would take an intersection
|
|
1114
|
+
/** @type {Chunk[] | undefined} */
|
|
1115
|
+
const intersectionChunks =
|
|
1116
|
+
intersectionSettings === undefined &&
|
|
1117
|
+
exportsIntersectionSettings === undefined
|
|
1118
|
+
? undefined
|
|
1119
|
+
: [];
|
|
1120
|
+
// The index of each of those chunks
|
|
1121
|
+
/** @type {Map<Chunk, number>} */
|
|
1122
|
+
const intersectionChunkIndices = new Map();
|
|
944
1123
|
// Give each selected chunk an index (to create strings from chunks)
|
|
945
1124
|
/** @type {Map<Chunk, bigint>} */
|
|
946
1125
|
const chunkIndexMap = new Map();
|
|
947
|
-
// Dense per-chunk index, folded into the 64 bit membership
|
|
948
|
-
// signatures that reject non-subsets in getCombinations
|
|
949
|
-
/** @type {Map<Chunk, number>} */
|
|
950
|
-
const chunkSignatureBitMap = new Map();
|
|
951
1126
|
const ZERO = BigInt("0");
|
|
952
1127
|
const ONE = BigInt("1");
|
|
953
1128
|
const START = ONE << BigInt("31");
|
|
954
1129
|
let index = START;
|
|
955
|
-
let denseIndex = 0;
|
|
956
1130
|
for (const chunk of chunks) {
|
|
957
1131
|
chunkIndexMap.set(
|
|
958
1132
|
chunk,
|
|
959
1133
|
index | BigInt((Math.random() * 0x7fffffff) | 0)
|
|
960
1134
|
);
|
|
961
|
-
|
|
1135
|
+
if (intersectionChunks !== undefined) {
|
|
1136
|
+
intersectionChunkIndices.set(chunk, intersectionChunks.length);
|
|
1137
|
+
intersectionChunks.push(chunk);
|
|
1138
|
+
}
|
|
962
1139
|
index <<= ONE;
|
|
963
1140
|
}
|
|
964
1141
|
/**
|
|
@@ -992,11 +1169,60 @@ class SplitChunksPlugin {
|
|
|
992
1169
|
return /** @type {bigint} */ (chunkIndexMap.get(key)).toString(16);
|
|
993
1170
|
};
|
|
994
1171
|
|
|
1172
|
+
/**
|
|
1173
|
+
* Most a module can weigh towards an intersection of these cache groups, `0`
|
|
1174
|
+
* when none of them takes it and `Infinity` when a size of it is unknown or
|
|
1175
|
+
* bounded by nothing.
|
|
1176
|
+
* @param {Module} module the module
|
|
1177
|
+
* @param {IntersectionCacheGroup[]} groups the cache groups taking the intersections
|
|
1178
|
+
* @returns {number} the bound
|
|
1179
|
+
*/
|
|
1180
|
+
const getModuleSizeBound = (module, groups) => {
|
|
1181
|
+
// A native test is exact, so a module no group accepts weighs nothing. A
|
|
1182
|
+
// callback stays a possible match rather than being called a second time.
|
|
1183
|
+
if (!groups.some(({ test }) => matchesStaticTest(test, module))) {
|
|
1184
|
+
return 0;
|
|
1185
|
+
}
|
|
1186
|
+
let bound = 0;
|
|
1187
|
+
let types = 0;
|
|
1188
|
+
for (const type of module.getSourceTypes()) {
|
|
1189
|
+
types++;
|
|
1190
|
+
for (const { minSize } of groups) {
|
|
1191
|
+
// Without a threshold on this type, arbitrarily few bytes of it survive
|
|
1192
|
+
// minSize, so nothing about this module bounds anything
|
|
1193
|
+
if (!(minSize[type] > 0)) return Number.POSITIVE_INFINITY;
|
|
1194
|
+
}
|
|
1195
|
+
const size = module.size(type);
|
|
1196
|
+
if (!(size >= 0) || size === Number.POSITIVE_INFINITY) {
|
|
1197
|
+
return Number.POSITIVE_INFINITY;
|
|
1198
|
+
}
|
|
1199
|
+
bound += size;
|
|
1200
|
+
}
|
|
1201
|
+
return types === 0 ? Number.POSITIVE_INFINITY : bound;
|
|
1202
|
+
};
|
|
1203
|
+
|
|
1204
|
+
/** Whether discovery of these sets prunes by size. */
|
|
1205
|
+
const boundsChunkSetSizes =
|
|
1206
|
+
intersectionSettings !== undefined &&
|
|
1207
|
+
intersectionSettings.minSize > 0;
|
|
1208
|
+
const boundsExportsChunkSetSizes =
|
|
1209
|
+
exportsIntersectionSettings !== undefined &&
|
|
1210
|
+
exportsIntersectionSettings.minSize > 0;
|
|
1211
|
+
|
|
995
1212
|
const getChunkSetsInGraph = memoize(() => {
|
|
996
1213
|
/** @type {Map<bigint, ChunkSet>} */
|
|
997
1214
|
const chunkSetsInGraph = new Map();
|
|
998
1215
|
/** @type {ChunkSet} */
|
|
999
1216
|
const singleChunkSets = new Set();
|
|
1217
|
+
// Only what a chunk set's own modules weigh, and only where a bound on it
|
|
1218
|
+
// can reject an intersection
|
|
1219
|
+
/** @type {Map<bigint | Chunk, number> | undefined} */
|
|
1220
|
+
const sizeByKey = boundsChunkSetSizes ? new Map() : undefined;
|
|
1221
|
+
const groups = boundsChunkSetSizes
|
|
1222
|
+
? /** @type {IntersectionCacheGroup[]} */ (
|
|
1223
|
+
intersectionSettings.groups
|
|
1224
|
+
)
|
|
1225
|
+
: undefined;
|
|
1000
1226
|
for (const module of compilation.modules) {
|
|
1001
1227
|
const chunks = chunkGraph.getModuleChunksIterable(module);
|
|
1002
1228
|
const chunksKey = getKey(chunks);
|
|
@@ -1007,8 +1233,18 @@ class SplitChunksPlugin {
|
|
|
1007
1233
|
} else {
|
|
1008
1234
|
singleChunkSets.add(chunksKey);
|
|
1009
1235
|
}
|
|
1236
|
+
if (sizeByKey !== undefined) {
|
|
1237
|
+
sizeByKey.set(
|
|
1238
|
+
chunksKey,
|
|
1239
|
+
(sizeByKey.get(chunksKey) || 0) +
|
|
1240
|
+
getModuleSizeBound(
|
|
1241
|
+
module,
|
|
1242
|
+
/** @type {IntersectionCacheGroup[]} */ (groups)
|
|
1243
|
+
)
|
|
1244
|
+
);
|
|
1245
|
+
}
|
|
1010
1246
|
}
|
|
1011
|
-
return { chunkSetsInGraph, singleChunkSets };
|
|
1247
|
+
return { chunkSetsInGraph, singleChunkSets, sizeByKey };
|
|
1012
1248
|
});
|
|
1013
1249
|
|
|
1014
1250
|
/**
|
|
@@ -1032,127 +1268,353 @@ class SplitChunksPlugin {
|
|
|
1032
1268
|
return groupedByUsedExports.values();
|
|
1033
1269
|
};
|
|
1034
1270
|
|
|
1035
|
-
/** @type {Map<Module,
|
|
1271
|
+
/** @type {Map<Module, Chunk[][]>} */
|
|
1036
1272
|
const groupedByExportsMap = new Map();
|
|
1037
1273
|
|
|
1038
|
-
/** @typedef {Map<bigint
|
|
1274
|
+
/** @typedef {Map<bigint, ChunkSet>} ChunkSetsInGraph */
|
|
1039
1275
|
|
|
1040
1276
|
const getExportsChunkSetsInGraph = memoize(() => {
|
|
1041
1277
|
/** @type {ChunkSetsInGraph} */
|
|
1042
1278
|
const chunkSetsInGraph = new Map();
|
|
1043
1279
|
/** @type {ChunkSet} */
|
|
1044
1280
|
const singleChunkSets = new Set();
|
|
1281
|
+
// A module counts towards every group it appears in, which can only
|
|
1282
|
+
// overstate a group, never hide an intersection worth splitting
|
|
1283
|
+
/** @type {Map<bigint | Chunk, number> | undefined} */
|
|
1284
|
+
const sizeByKey = boundsExportsChunkSetSizes
|
|
1285
|
+
? new Map()
|
|
1286
|
+
: undefined;
|
|
1287
|
+
const groups = boundsExportsChunkSetSizes
|
|
1288
|
+
? /** @type {IntersectionCacheGroup[]} */ (
|
|
1289
|
+
exportsIntersectionSettings.groups
|
|
1290
|
+
)
|
|
1291
|
+
: undefined;
|
|
1045
1292
|
for (const module of compilation.modules) {
|
|
1046
1293
|
const groupedChunks = [...groupChunksByExports(module)];
|
|
1047
1294
|
groupedByExportsMap.set(module, groupedChunks);
|
|
1048
1295
|
for (const chunks of groupedChunks) {
|
|
1296
|
+
const chunksKey = getKey(chunks);
|
|
1049
1297
|
if (chunks.length === 1) {
|
|
1050
1298
|
singleChunkSets.add(chunks[0]);
|
|
1051
1299
|
} else {
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1300
|
+
// More than one chunk, so the key is the bigint of their ids
|
|
1301
|
+
const setKey = /** @type {bigint} */ (chunksKey);
|
|
1302
|
+
if (!chunkSetsInGraph.has(setKey)) {
|
|
1303
|
+
chunkSetsInGraph.set(setKey, new Set(chunks));
|
|
1055
1304
|
}
|
|
1056
1305
|
}
|
|
1306
|
+
if (sizeByKey !== undefined) {
|
|
1307
|
+
sizeByKey.set(
|
|
1308
|
+
chunksKey,
|
|
1309
|
+
(sizeByKey.get(chunksKey) || 0) +
|
|
1310
|
+
getModuleSizeBound(
|
|
1311
|
+
module,
|
|
1312
|
+
/** @type {IntersectionCacheGroup[]} */ (groups)
|
|
1313
|
+
)
|
|
1314
|
+
);
|
|
1315
|
+
}
|
|
1057
1316
|
}
|
|
1058
1317
|
}
|
|
1059
|
-
return { chunkSetsInGraph, singleChunkSets };
|
|
1318
|
+
return { chunkSetsInGraph, singleChunkSets, sizeByKey };
|
|
1060
1319
|
});
|
|
1061
1320
|
|
|
1062
1321
|
/**
|
|
1063
|
-
*
|
|
1064
|
-
*
|
|
1065
|
-
* @typedef {object}
|
|
1066
|
-
* @property {ChunkSet[]} sets the chunk sets
|
|
1067
|
-
* @property {
|
|
1322
|
+
* The chunk sets a combination can be taken from, in the order they are
|
|
1323
|
+
* combined in, indexed by the chunk fewest of them hold.
|
|
1324
|
+
* @typedef {object} ChunkSetIndex
|
|
1325
|
+
* @property {ChunkSet[]} sets the chunk sets, smaller counts first
|
|
1326
|
+
* @property {Map<Chunk, number[]>} setsByRarestChunk what to try for a chunk
|
|
1327
|
+
* @property {Map<Chunk, number>} singleOrder order of the single chunk sets
|
|
1068
1328
|
*/
|
|
1069
1329
|
|
|
1070
|
-
/** @typedef {Map<CountOfChunk, ChunkSetGroup>} ChunkSetsByCount */
|
|
1071
|
-
|
|
1072
|
-
// holds the signature of the set currently being combined; transient
|
|
1073
|
-
const signatureScratch = new Uint32Array(2);
|
|
1074
|
-
|
|
1075
1330
|
/**
|
|
1076
|
-
*
|
|
1077
|
-
*
|
|
1078
|
-
*
|
|
1079
|
-
* @param {
|
|
1080
|
-
* @
|
|
1331
|
+
* Indexes chunk sets for the subsets of a set to be found without walking all
|
|
1332
|
+
* of them: a subset holds the chunk fewest sets hold of it, so only the sets
|
|
1333
|
+
* indexed under a chunk of the superset can be one.
|
|
1334
|
+
* @param {IterableIterator<ChunkSet>} chunkSets set of sets of chunks
|
|
1335
|
+
* @param {ChunkSet} singleChunkSets the chunks holding modules of their own
|
|
1336
|
+
* @returns {ChunkSetIndex} the sets, and where to look for a subset
|
|
1081
1337
|
*/
|
|
1082
|
-
const
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1338
|
+
const indexChunkSets = (chunkSets, singleChunkSets) => {
|
|
1339
|
+
// Grouped by count, as only a smaller set can be a proper subset, and
|
|
1340
|
+
// combined in that order
|
|
1341
|
+
/** @type {Map<CountOfChunk, ChunkSet[]>} */
|
|
1342
|
+
const setsByCount = new Map();
|
|
1343
|
+
/** @type {Map<Chunk, number>} */
|
|
1344
|
+
const holders = new Map();
|
|
1345
|
+
for (const chunksSet of chunkSets) {
|
|
1346
|
+
const group = setsByCount.get(chunksSet.size);
|
|
1347
|
+
if (group === undefined) {
|
|
1348
|
+
setsByCount.set(chunksSet.size, [chunksSet]);
|
|
1349
|
+
} else {
|
|
1350
|
+
group.push(chunksSet);
|
|
1351
|
+
}
|
|
1352
|
+
for (const chunk of chunksSet) {
|
|
1353
|
+
holders.set(chunk, (holders.get(chunk) || 0) + 1);
|
|
1354
|
+
}
|
|
1355
|
+
}
|
|
1356
|
+
/** @type {ChunkSet[]} */
|
|
1357
|
+
const sets = [];
|
|
1358
|
+
for (const group of setsByCount.values()) {
|
|
1359
|
+
for (const chunksSet of group) sets.push(chunksSet);
|
|
1090
1360
|
}
|
|
1361
|
+
/** @type {Map<Chunk, number[]>} */
|
|
1362
|
+
const setsByRarestChunk = new Map();
|
|
1363
|
+
for (let i = 0; i < sets.length; i++) {
|
|
1364
|
+
/** @type {Chunk | undefined} */
|
|
1365
|
+
let rarest;
|
|
1366
|
+
let fewest = 0;
|
|
1367
|
+
for (const chunk of sets[i]) {
|
|
1368
|
+
const count = /** @type {number} */ (holders.get(chunk));
|
|
1369
|
+
if (rarest === undefined || count < fewest) {
|
|
1370
|
+
rarest = chunk;
|
|
1371
|
+
fewest = count;
|
|
1372
|
+
}
|
|
1373
|
+
}
|
|
1374
|
+
if (rarest === undefined) continue;
|
|
1375
|
+
const indices = setsByRarestChunk.get(rarest);
|
|
1376
|
+
if (indices === undefined) setsByRarestChunk.set(rarest, [i]);
|
|
1377
|
+
else indices.push(i);
|
|
1378
|
+
}
|
|
1379
|
+
/** @type {Map<Chunk, number>} */
|
|
1380
|
+
const singleOrder = new Map();
|
|
1381
|
+
for (const chunk of singleChunkSets) {
|
|
1382
|
+
singleOrder.set(chunk, singleOrder.size);
|
|
1383
|
+
}
|
|
1384
|
+
return { sets, setsByRarestChunk, singleOrder };
|
|
1091
1385
|
};
|
|
1386
|
+
const getChunkSetIndex = memoize(() => {
|
|
1387
|
+
const { chunkSetsInGraph, singleChunkSets } = getChunkSetsInGraph();
|
|
1388
|
+
return indexChunkSets(chunkSetsInGraph.values(), singleChunkSets);
|
|
1389
|
+
});
|
|
1390
|
+
const getExportsChunkSetIndex = memoize(() => {
|
|
1391
|
+
const { chunkSetsInGraph, singleChunkSets } =
|
|
1392
|
+
getExportsChunkSetsInGraph();
|
|
1393
|
+
return indexChunkSets(chunkSetsInGraph.values(), singleChunkSets);
|
|
1394
|
+
});
|
|
1092
1395
|
|
|
1093
|
-
// group these set of chunks by count
|
|
1094
|
-
// to allow to check less sets via isSubset
|
|
1095
|
-
// (only smaller sets can be subset)
|
|
1096
1396
|
/**
|
|
1097
|
-
*
|
|
1098
|
-
*
|
|
1099
|
-
* @
|
|
1397
|
+
* Discovers the intersections of the chunk sets that are not chunk sets
|
|
1398
|
+
* themselves, and groups them by the sets holding all of their chunks.
|
|
1399
|
+
* @param {ChunkSetsInGraph} chunkSets the chunk sets in the graph
|
|
1400
|
+
* @param {ChunkSet} singleChunkSets the chunks holding modules of their own
|
|
1401
|
+
* @param {Map<bigint | Chunk, number> | undefined} sizeByKey size of the modules behind each chunk set
|
|
1402
|
+
* @param {IntersectionSettings} settings what the cache groups taking them allow
|
|
1403
|
+
* @returns {Map<bigint | Chunk, ChunkSet[]>} intersections by the key of each set holding them
|
|
1100
1404
|
*/
|
|
1101
|
-
const
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
|
|
1405
|
+
const discoverChunkSetIntersections = (
|
|
1406
|
+
chunkSets,
|
|
1407
|
+
singleChunkSets,
|
|
1408
|
+
sizeByKey,
|
|
1409
|
+
settings
|
|
1410
|
+
) => {
|
|
1411
|
+
/** @type {Map<bigint | Chunk, ChunkSet[]>} */
|
|
1412
|
+
const result = new Map();
|
|
1413
|
+
if (chunkSets.size < 2) return result;
|
|
1414
|
+
// Widest sets first, so a limit keeps the intersections reaching the most
|
|
1415
|
+
// chunks, and by key after that, so no module order reaches the result
|
|
1416
|
+
/** @type {(bigint | Chunk)[]} */
|
|
1417
|
+
const keys = [...chunkSets.keys()].sort((a, b) => {
|
|
1418
|
+
const countDiff =
|
|
1419
|
+
/** @type {ChunkSet} */ (chunkSets.get(b)).size -
|
|
1420
|
+
/** @type {ChunkSet} */ (chunkSets.get(a)).size;
|
|
1421
|
+
if (countDiff !== 0) return countDiff;
|
|
1422
|
+
return a < b ? -1 : 1;
|
|
1423
|
+
});
|
|
1424
|
+
// A chunk of its own is keyed by the chunk, so what holds both is wider
|
|
1425
|
+
// than what the graph's chunk sets are keyed by
|
|
1426
|
+
let memberCount = 0;
|
|
1427
|
+
for (const set of chunkSets.values()) memberCount += set.size;
|
|
1428
|
+
// A one chunk intersection holds only what a chunk of its own already holds,
|
|
1429
|
+
// so those sets are inputs for what they weigh and the sets holding them
|
|
1430
|
+
const multiSetCount = keys.length;
|
|
1431
|
+
if (settings.minMembers < 2) {
|
|
1432
|
+
for (const chunk of singleChunkSets) keys.push(chunk);
|
|
1433
|
+
memberCount += keys.length - multiSetCount;
|
|
1434
|
+
}
|
|
1435
|
+
const setCount = keys.length;
|
|
1436
|
+
const offsets = new Int32Array(setCount + 1);
|
|
1437
|
+
const members = new Int32Array(memberCount);
|
|
1438
|
+
const sizes =
|
|
1439
|
+
sizeByKey === undefined ? undefined : new Float64Array(setCount);
|
|
1440
|
+
let cursor = 0;
|
|
1441
|
+
for (let i = 0; i < setCount; i++) {
|
|
1442
|
+
const key = keys[i];
|
|
1443
|
+
if (sizes !== undefined) {
|
|
1444
|
+
sizes[i] =
|
|
1445
|
+
/** @type {Map<bigint | Chunk, number>} */ (sizeByKey).get(
|
|
1446
|
+
key
|
|
1447
|
+
) || 0;
|
|
1110
1448
|
}
|
|
1111
|
-
|
|
1449
|
+
offsets[i] = cursor;
|
|
1450
|
+
if (i < multiSetCount) {
|
|
1451
|
+
for (const chunk of /** @type {ChunkSet} */ (
|
|
1452
|
+
chunkSets.get(/** @type {bigint} */ (key))
|
|
1453
|
+
)) {
|
|
1454
|
+
members[cursor++] = /** @type {number} */ (
|
|
1455
|
+
intersectionChunkIndices.get(chunk)
|
|
1456
|
+
);
|
|
1457
|
+
}
|
|
1458
|
+
} else {
|
|
1459
|
+
members[cursor++] = /** @type {number} */ (
|
|
1460
|
+
intersectionChunkIndices.get(/** @type {Chunk} */ (key))
|
|
1461
|
+
);
|
|
1462
|
+
}
|
|
1463
|
+
offsets[i + 1] = cursor;
|
|
1112
1464
|
}
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1465
|
+
const { intersections, capped } = discoverIntersections({
|
|
1466
|
+
setCount,
|
|
1467
|
+
memberCount: intersectionChunkIndices.size,
|
|
1468
|
+
offsets,
|
|
1469
|
+
members,
|
|
1470
|
+
depth: dedupDepth,
|
|
1471
|
+
minMembers: settings.minMembers,
|
|
1472
|
+
sizes,
|
|
1473
|
+
minSize: settings.minSize,
|
|
1474
|
+
maxIntersections: MAX_INTERSECTIONS,
|
|
1475
|
+
maxWork: MAX_INTERSECTION_WORK
|
|
1476
|
+
});
|
|
1477
|
+
if (capped) {
|
|
1478
|
+
logger.warn(
|
|
1479
|
+
`Stopped looking for chunk sets to share modules through at ${MAX_INTERSECTIONS} of them, or at the work of intersecting ${MAX_INTERSECTION_WORK} words. Some modules chunks share stay where they are. Lower "optimization.splitChunks.dedupDepth" to spend less on the search.`
|
|
1480
|
+
);
|
|
1481
|
+
}
|
|
1482
|
+
const chunkList = /** @type {Chunk[]} */ (intersectionChunks);
|
|
1483
|
+
for (const { members: chunkIndices, support } of intersections) {
|
|
1484
|
+
/** @type {ChunkSet} */
|
|
1485
|
+
const intersection = new Set();
|
|
1486
|
+
for (const index of chunkIndices) {
|
|
1487
|
+
intersection.add(chunkList[index]);
|
|
1488
|
+
}
|
|
1489
|
+
for (const set of support) {
|
|
1490
|
+
// The one intersection a single chunk could hold is that chunk, which
|
|
1491
|
+
// is a combination of its modules already
|
|
1492
|
+
if (set >= multiSetCount) continue;
|
|
1493
|
+
const key = keys[set];
|
|
1494
|
+
const held = result.get(key);
|
|
1495
|
+
if (held === undefined) result.set(key, [intersection]);
|
|
1496
|
+
else held.push(intersection);
|
|
1118
1497
|
}
|
|
1119
|
-
group.signatures = signatures;
|
|
1120
1498
|
}
|
|
1121
|
-
return
|
|
1499
|
+
return result;
|
|
1122
1500
|
};
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
|
|
1126
|
-
|
|
1127
|
-
);
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1501
|
+
|
|
1502
|
+
// How many combinations of each chunk set are chunk sets in the graph, for the
|
|
1503
|
+
// cache groups that take no intersections. Missing means all of them.
|
|
1504
|
+
/** @type {Map<Combinations, number>} */
|
|
1505
|
+
const originalCombinationCounts = new Map();
|
|
1506
|
+
/** @type {Map<Combinations, number>} */
|
|
1507
|
+
const originalExportsCombinationCounts = new Map();
|
|
1508
|
+
|
|
1509
|
+
// TODO rebuild the candidates per cache group priority, from the
|
|
1510
|
+
// module chunk edges the priorities before it left, as rspack does
|
|
1511
|
+
const getIntersectionsByChunkSetKey = memoize(() => {
|
|
1512
|
+
const { chunkSetsInGraph, singleChunkSets, sizeByKey } =
|
|
1513
|
+
getChunkSetsInGraph();
|
|
1514
|
+
return discoverChunkSetIntersections(
|
|
1515
|
+
chunkSetsInGraph,
|
|
1516
|
+
singleChunkSets,
|
|
1517
|
+
sizeByKey,
|
|
1518
|
+
/** @type {IntersectionSettings} */ (intersectionSettings)
|
|
1519
|
+
);
|
|
1520
|
+
});
|
|
1521
|
+
const getExportsIntersectionsByChunkSetKey = memoize(() => {
|
|
1522
|
+
const { chunkSetsInGraph, singleChunkSets, sizeByKey } =
|
|
1523
|
+
getExportsChunkSetsInGraph();
|
|
1524
|
+
return discoverChunkSetIntersections(
|
|
1525
|
+
chunkSetsInGraph,
|
|
1526
|
+
singleChunkSets,
|
|
1527
|
+
sizeByKey,
|
|
1528
|
+
/** @type {IntersectionSettings} */ (exportsIntersectionSettings)
|
|
1529
|
+
);
|
|
1530
|
+
});
|
|
1133
1531
|
|
|
1134
1532
|
/** @typedef {(ChunkSet | Chunk)[]} Combinations */
|
|
1135
1533
|
|
|
1534
|
+
/**
|
|
1535
|
+
* Where a chunk set's own combinations end, for a cache group that
|
|
1536
|
+
* takes no intersection.
|
|
1537
|
+
* @param {Combinations} combinations the combinations
|
|
1538
|
+
* @param {boolean} withIntersections whether the group takes the intersections too
|
|
1539
|
+
* @param {Map<Combinations, number>} originalCounts how many of them are chunk sets themselves
|
|
1540
|
+
* @returns {number} where to stop
|
|
1541
|
+
*/
|
|
1542
|
+
const originalCombinationCount = (
|
|
1543
|
+
combinations,
|
|
1544
|
+
withIntersections,
|
|
1545
|
+
originalCounts
|
|
1546
|
+
) => {
|
|
1547
|
+
if (withIntersections || originalCounts.size === 0) {
|
|
1548
|
+
return combinations.length;
|
|
1549
|
+
}
|
|
1550
|
+
const originals = originalCounts.get(combinations);
|
|
1551
|
+
return originals === undefined ? combinations.length : originals;
|
|
1552
|
+
};
|
|
1553
|
+
|
|
1554
|
+
/**
|
|
1555
|
+
* Appends the intersections a chunk set holds to its combinations.
|
|
1556
|
+
* @param {bigint | Chunk} key key of the chunk set
|
|
1557
|
+
* @param {Combinations} combinations its combinations
|
|
1558
|
+
* @param {() => Map<bigint | Chunk, ChunkSet[]>} getIntersectionsByKey takes the intersections held by each chunk set
|
|
1559
|
+
* @param {Map<Combinations, number>} originalCounts takes how many of them are chunk sets themselves
|
|
1560
|
+
* @returns {void}
|
|
1561
|
+
*/
|
|
1562
|
+
const appendIntersections = (
|
|
1563
|
+
key,
|
|
1564
|
+
combinations,
|
|
1565
|
+
getIntersectionsByKey,
|
|
1566
|
+
originalCounts
|
|
1567
|
+
) => {
|
|
1568
|
+
// The chunk sets stay in front, so a cache group taking no
|
|
1569
|
+
// intersection reads only up to their count
|
|
1570
|
+
originalCounts.set(combinations, combinations.length);
|
|
1571
|
+
const intersections = getIntersectionsByKey().get(key);
|
|
1572
|
+
if (intersections === undefined) return;
|
|
1573
|
+
for (const intersection of intersections) {
|
|
1574
|
+
combinations.push(intersection);
|
|
1575
|
+
}
|
|
1576
|
+
};
|
|
1577
|
+
|
|
1136
1578
|
// Create a list of possible combinations
|
|
1137
1579
|
/**
|
|
1138
1580
|
* Creates a get combinations.
|
|
1139
1581
|
* @param {ChunkSetsInGraph} chunkSets chunk sets
|
|
1140
|
-
* @param {
|
|
1141
|
-
* @param {
|
|
1142
|
-
* @
|
|
1582
|
+
* @param {ChunkSetIndex} index the chunk sets a combination is taken from
|
|
1583
|
+
* @param {(() => Map<bigint | Chunk, ChunkSet[]>) | undefined} getIntersectionsByKey takes the intersections held by each chunk set, on the first cache group asking for them
|
|
1584
|
+
* @param {Map<Combinations, number>} originalCounts takes how many of a chunk set's combinations are chunk sets themselves
|
|
1585
|
+
* @returns {(key: bigint | Chunk, withIntersections: boolean) => Combinations} combinations
|
|
1143
1586
|
*/
|
|
1144
1587
|
const createGetCombinations = (
|
|
1145
1588
|
chunkSets,
|
|
1146
|
-
|
|
1147
|
-
|
|
1589
|
+
index,
|
|
1590
|
+
getIntersectionsByKey,
|
|
1591
|
+
originalCounts
|
|
1148
1592
|
) => {
|
|
1593
|
+
const { sets, setsByRarestChunk, singleOrder } = index;
|
|
1149
1594
|
/** @type {Map<bigint | Chunk, Combinations>} */
|
|
1150
1595
|
const combinationsCache = new Map();
|
|
1151
1596
|
|
|
1152
|
-
return (key) => {
|
|
1597
|
+
return (key, withIntersections) => {
|
|
1153
1598
|
const cacheEntry = combinationsCache.get(key);
|
|
1154
|
-
if (cacheEntry !== undefined)
|
|
1155
|
-
|
|
1599
|
+
if (cacheEntry !== undefined) {
|
|
1600
|
+
// Nothing is discovered until a cache group that takes the
|
|
1601
|
+
// intersections reaches a chunk set of more than one chunk
|
|
1602
|
+
if (
|
|
1603
|
+
withIntersections &&
|
|
1604
|
+
getIntersectionsByKey !== undefined &&
|
|
1605
|
+
cacheEntry[0] instanceof Set &&
|
|
1606
|
+
!originalCounts.has(cacheEntry)
|
|
1607
|
+
) {
|
|
1608
|
+
appendIntersections(
|
|
1609
|
+
key,
|
|
1610
|
+
cacheEntry,
|
|
1611
|
+
getIntersectionsByKey,
|
|
1612
|
+
originalCounts
|
|
1613
|
+
);
|
|
1614
|
+
}
|
|
1615
|
+
return cacheEntry;
|
|
1616
|
+
}
|
|
1617
|
+
if (typeof key !== "bigint") {
|
|
1156
1618
|
const result = [key];
|
|
1157
1619
|
combinationsCache.set(key, result);
|
|
1158
1620
|
return result;
|
|
@@ -1162,72 +1624,90 @@ class SplitChunksPlugin {
|
|
|
1162
1624
|
(chunkSets.get(key));
|
|
1163
1625
|
/** @type {Combinations} */
|
|
1164
1626
|
const array = [chunksSet];
|
|
1165
|
-
|
|
1166
|
-
|
|
1167
|
-
|
|
1168
|
-
|
|
1169
|
-
|
|
1170
|
-
|
|
1171
|
-
|
|
1172
|
-
|
|
1173
|
-
|
|
1174
|
-
|
|
1175
|
-
|
|
1176
|
-
|
|
1177
|
-
(signatures[offset] & ~selfLow) !== 0 ||
|
|
1178
|
-
(signatures[offset + 1] & ~selfHigh) !== 0
|
|
1179
|
-
) {
|
|
1180
|
-
continue;
|
|
1181
|
-
}
|
|
1182
|
-
const set = sets[i];
|
|
1183
|
-
if (isSubset(chunksSet, set)) {
|
|
1184
|
-
array.push(set);
|
|
1185
|
-
}
|
|
1627
|
+
// A subset holds the chunk fewest sets hold of it, so only the sets
|
|
1628
|
+
// indexed under a chunk of this one can be one
|
|
1629
|
+
/** @type {number[]} */
|
|
1630
|
+
const subsets = [];
|
|
1631
|
+
for (const chunk of chunksSet) {
|
|
1632
|
+
const indices = setsByRarestChunk.get(chunk);
|
|
1633
|
+
if (indices === undefined) continue;
|
|
1634
|
+
for (const candidate of indices) {
|
|
1635
|
+
const set = sets[candidate];
|
|
1636
|
+
// "equal" is not needed because they would have been merge in the first step
|
|
1637
|
+
if (set.size < chunksSet.size && isSubset(chunksSet, set)) {
|
|
1638
|
+
subsets.push(candidate);
|
|
1186
1639
|
}
|
|
1187
1640
|
}
|
|
1188
1641
|
}
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
|
|
1642
|
+
// Combined in the order they were indexed in, smaller counts first
|
|
1643
|
+
if (subsets.length > 1) subsets.sort((a, b) => a - b);
|
|
1644
|
+
for (const candidate of subsets) array.push(sets[candidate]);
|
|
1645
|
+
/** @type {Chunk[]} */
|
|
1646
|
+
const singles = [];
|
|
1647
|
+
for (const chunk of chunksSet) {
|
|
1648
|
+
if (singleOrder.has(chunk)) singles.push(chunk);
|
|
1649
|
+
}
|
|
1650
|
+
if (singles.length > 1) {
|
|
1651
|
+
singles.sort(
|
|
1652
|
+
(a, b) =>
|
|
1653
|
+
/** @type {number} */ (singleOrder.get(a)) -
|
|
1654
|
+
/** @type {number} */ (singleOrder.get(b))
|
|
1655
|
+
);
|
|
1193
1656
|
}
|
|
1657
|
+
for (const chunk of singles) array.push(chunk);
|
|
1194
1658
|
combinationsCache.set(key, array);
|
|
1659
|
+
if (withIntersections && getIntersectionsByKey !== undefined) {
|
|
1660
|
+
appendIntersections(
|
|
1661
|
+
key,
|
|
1662
|
+
array,
|
|
1663
|
+
getIntersectionsByKey,
|
|
1664
|
+
originalCounts
|
|
1665
|
+
);
|
|
1666
|
+
}
|
|
1195
1667
|
return array;
|
|
1196
1668
|
};
|
|
1197
1669
|
};
|
|
1198
1670
|
|
|
1199
1671
|
const getCombinationsFactory = memoize(() => {
|
|
1200
|
-
const { chunkSetsInGraph
|
|
1672
|
+
const { chunkSetsInGraph } = getChunkSetsInGraph();
|
|
1201
1673
|
return createGetCombinations(
|
|
1202
1674
|
chunkSetsInGraph,
|
|
1203
|
-
|
|
1204
|
-
|
|
1675
|
+
getChunkSetIndex(),
|
|
1676
|
+
intersectionSettings === undefined
|
|
1677
|
+
? undefined
|
|
1678
|
+
: getIntersectionsByChunkSetKey,
|
|
1679
|
+
originalCombinationCounts
|
|
1205
1680
|
);
|
|
1206
1681
|
});
|
|
1207
1682
|
|
|
1208
1683
|
/**
|
|
1209
1684
|
* Returns combinations by key.
|
|
1210
1685
|
* @param {bigint | Chunk} key key
|
|
1686
|
+
* @param {boolean} withIntersections whether to take the intersections of the chunk sets too
|
|
1211
1687
|
* @returns {Combinations} combinations by key
|
|
1212
1688
|
*/
|
|
1213
|
-
const getCombinations = (key) =>
|
|
1689
|
+
const getCombinations = (key, withIntersections) =>
|
|
1690
|
+
getCombinationsFactory()(key, withIntersections);
|
|
1214
1691
|
|
|
1215
1692
|
const getExportsCombinationsFactory = memoize(() => {
|
|
1216
|
-
const { chunkSetsInGraph
|
|
1217
|
-
getExportsChunkSetsInGraph();
|
|
1693
|
+
const { chunkSetsInGraph } = getExportsChunkSetsInGraph();
|
|
1218
1694
|
return createGetCombinations(
|
|
1219
1695
|
chunkSetsInGraph,
|
|
1220
|
-
|
|
1221
|
-
|
|
1696
|
+
getExportsChunkSetIndex(),
|
|
1697
|
+
exportsIntersectionSettings === undefined
|
|
1698
|
+
? undefined
|
|
1699
|
+
: getExportsIntersectionsByChunkSetKey,
|
|
1700
|
+
originalExportsCombinationCounts
|
|
1222
1701
|
);
|
|
1223
1702
|
});
|
|
1224
1703
|
/**
|
|
1225
1704
|
* Gets exports combinations.
|
|
1226
1705
|
* @param {bigint | Chunk} key key
|
|
1706
|
+
* @param {boolean} withIntersections whether to take the intersections of the chunk sets too
|
|
1227
1707
|
* @returns {Combinations} exports combinations by key
|
|
1228
1708
|
*/
|
|
1229
|
-
const getExportsCombinations = (key) =>
|
|
1230
|
-
getExportsCombinationsFactory()(key);
|
|
1709
|
+
const getExportsCombinations = (key, withIntersections) =>
|
|
1710
|
+
getExportsCombinationsFactory()(key, withIntersections);
|
|
1231
1711
|
|
|
1232
1712
|
/**
|
|
1233
1713
|
* Defines the selected chunks result type used by this module.
|
|
@@ -1260,7 +1740,7 @@ class SplitChunksPlugin {
|
|
|
1260
1740
|
if (entry2 === undefined) {
|
|
1261
1741
|
/** @type {Chunk[]} */
|
|
1262
1742
|
const selectedChunks = [];
|
|
1263
|
-
if (chunks instanceof
|
|
1743
|
+
if (!(chunks instanceof Set)) {
|
|
1264
1744
|
if (chunkFilter(chunks)) selectedChunks.push(chunks);
|
|
1265
1745
|
} else {
|
|
1266
1746
|
for (const chunk of chunks) {
|
|
@@ -1438,32 +1918,77 @@ class SplitChunksPlugin {
|
|
|
1438
1918
|
/**
|
|
1439
1919
|
* Returns combinations of the chunks the module is in.
|
|
1440
1920
|
* @param {Module} module the module
|
|
1921
|
+
* @param {boolean} withIntersections whether to take the intersections of the chunk sets too
|
|
1441
1922
|
* @returns {Combinations} chunk combinations
|
|
1442
1923
|
*/
|
|
1443
|
-
const computeCombinations = (module) =>
|
|
1444
|
-
getCombinations(
|
|
1924
|
+
const computeCombinations = (module, withIntersections) =>
|
|
1925
|
+
getCombinations(
|
|
1926
|
+
getKey(chunkGraph.getModuleChunksIterable(module)),
|
|
1927
|
+
withIntersections
|
|
1928
|
+
);
|
|
1445
1929
|
|
|
1446
1930
|
/**
|
|
1447
|
-
* Returns combinations of the module's chunks grouped by used exports.
|
|
1931
|
+
* Returns combinations of the module's chunks grouped by used exports. A
|
|
1932
|
+
* module whose chunks all use the same exports takes the combinations of that
|
|
1933
|
+
* one group as they are, without a copy to merge into.
|
|
1448
1934
|
* @param {Module} module the module
|
|
1449
|
-
* @
|
|
1935
|
+
* @param {boolean} withIntersections whether to take the intersections of the chunk sets too
|
|
1936
|
+
* @returns {Combinations} chunk combinations
|
|
1450
1937
|
*/
|
|
1451
|
-
const computeCombinationsByUsedExports = (
|
|
1938
|
+
const computeCombinationsByUsedExports = (
|
|
1939
|
+
module,
|
|
1940
|
+
withIntersections
|
|
1941
|
+
) => {
|
|
1452
1942
|
// fill the groupedByExportsMap
|
|
1453
1943
|
getExportsChunkSetsInGraph();
|
|
1454
|
-
/** @type {Set<ChunkSet | Chunk>} */
|
|
1455
|
-
const set = new Set();
|
|
1456
1944
|
const groupedByUsedExports =
|
|
1457
|
-
/** @type {
|
|
1945
|
+
/** @type {Chunk[][]} */
|
|
1458
1946
|
(groupedByExportsMap.get(module));
|
|
1947
|
+
if (groupedByUsedExports.length === 1) {
|
|
1948
|
+
return getExportsCombinations(
|
|
1949
|
+
getKey(groupedByUsedExports[0]),
|
|
1950
|
+
withIntersections
|
|
1951
|
+
);
|
|
1952
|
+
}
|
|
1953
|
+
/** @type {Combinations} */
|
|
1954
|
+
const array = [];
|
|
1955
|
+
/** @type {Set<ChunkSet | Chunk>} */
|
|
1956
|
+
const seen = new Set();
|
|
1459
1957
|
for (const chunks of groupedByUsedExports) {
|
|
1460
|
-
|
|
1461
|
-
|
|
1958
|
+
const combinations = getExportsCombinations(
|
|
1959
|
+
getKey(chunks),
|
|
1960
|
+
withIntersections
|
|
1961
|
+
);
|
|
1962
|
+
const end = originalCombinationCount(
|
|
1963
|
+
combinations,
|
|
1964
|
+
withIntersections,
|
|
1965
|
+
originalExportsCombinationCounts
|
|
1966
|
+
);
|
|
1967
|
+
for (let i = 0; i < end; i++) {
|
|
1968
|
+
const combination = combinations[i];
|
|
1969
|
+
const known = seen.size;
|
|
1970
|
+
seen.add(combination);
|
|
1971
|
+
if (seen.size !== known) array.push(combination);
|
|
1462
1972
|
}
|
|
1463
1973
|
}
|
|
1464
|
-
return
|
|
1974
|
+
return array;
|
|
1465
1975
|
};
|
|
1466
1976
|
|
|
1977
|
+
/**
|
|
1978
|
+
* Whether a cache group puts the intersections of the chunk sets to use. Only
|
|
1979
|
+
* one naming its chunk after the modules it takes, and holding out for a size,
|
|
1980
|
+
* can group modules that no chunk set holds together.
|
|
1981
|
+
* @param {CacheGroup} cacheGroup the cache group
|
|
1982
|
+
* @returns {boolean} true when it takes them
|
|
1983
|
+
*/
|
|
1984
|
+
const takesIntersections = (cacheGroup) =>
|
|
1985
|
+
intersectionChunks !== undefined &&
|
|
1986
|
+
(cacheGroup.usedExports
|
|
1987
|
+
? exportsIntersectionSettings
|
|
1988
|
+
: intersectionSettings) !== undefined &&
|
|
1989
|
+
cacheGroup.getName === defaultGetName &&
|
|
1990
|
+
(cacheGroup._validateSize || cacheGroup._validateSizeReduction);
|
|
1991
|
+
|
|
1467
1992
|
logger.timeEnd("prepare");
|
|
1468
1993
|
|
|
1469
1994
|
logger.time("modules");
|
|
@@ -1479,39 +2004,63 @@ class SplitChunksPlugin {
|
|
|
1479
2004
|
// Computed at most once per module, on first use by a cache group
|
|
1480
2005
|
/** @type {Combinations | undefined} */
|
|
1481
2006
|
let combsCache;
|
|
1482
|
-
|
|
2007
|
+
let combsCacheHasIntersections = false;
|
|
2008
|
+
/** @type {(Combinations | undefined)[] | undefined} */
|
|
1483
2009
|
let combsByUsedExportsCache;
|
|
1484
2010
|
|
|
1485
2011
|
let cacheGroupIndex = 0;
|
|
1486
2012
|
for (const cacheGroupSource of cacheGroups) {
|
|
1487
2013
|
const cacheGroup = this._getCacheGroup(cacheGroupSource);
|
|
1488
|
-
|
|
2014
|
+
const withIntersections = takesIntersections(cacheGroup);
|
|
2015
|
+
/** @type {Combinations} */
|
|
1489
2016
|
let combs;
|
|
2017
|
+
let end;
|
|
1490
2018
|
if (cacheGroup.usedExports) {
|
|
1491
2019
|
if (combsByUsedExportsCache === undefined) {
|
|
1492
|
-
combsByUsedExportsCache =
|
|
1493
|
-
|
|
2020
|
+
combsByUsedExportsCache = [];
|
|
2021
|
+
}
|
|
2022
|
+
const index = withIntersections ? 1 : 0;
|
|
2023
|
+
let cached = combsByUsedExportsCache[index];
|
|
2024
|
+
if (cached === undefined) {
|
|
2025
|
+
cached = computeCombinationsByUsedExports(
|
|
2026
|
+
module,
|
|
2027
|
+
withIntersections
|
|
2028
|
+
);
|
|
2029
|
+
combsByUsedExportsCache[index] = cached;
|
|
1494
2030
|
}
|
|
1495
|
-
combs =
|
|
2031
|
+
combs = cached;
|
|
2032
|
+
// The intersections trail the chunk sets, so a cache group that takes
|
|
2033
|
+
// none of them stops where they begin
|
|
2034
|
+
end = originalCombinationCount(
|
|
2035
|
+
combs,
|
|
2036
|
+
withIntersections,
|
|
2037
|
+
originalExportsCombinationCounts
|
|
2038
|
+
);
|
|
1496
2039
|
} else {
|
|
1497
|
-
if (
|
|
1498
|
-
combsCache
|
|
2040
|
+
if (
|
|
2041
|
+
combsCache === undefined ||
|
|
2042
|
+
(withIntersections && !combsCacheHasIntersections)
|
|
2043
|
+
) {
|
|
2044
|
+
combsCache = computeCombinations(module, withIntersections);
|
|
2045
|
+
combsCacheHasIntersections = withIntersections;
|
|
1499
2046
|
}
|
|
1500
2047
|
combs = combsCache;
|
|
2048
|
+
end = originalCombinationCount(
|
|
2049
|
+
combs,
|
|
2050
|
+
withIntersections,
|
|
2051
|
+
originalCombinationCounts
|
|
2052
|
+
);
|
|
1501
2053
|
}
|
|
1502
2054
|
// For all combination of chunk selection
|
|
1503
|
-
for (
|
|
2055
|
+
for (let i = 0; i < end; i++) {
|
|
2056
|
+
const chunkCombination = combs[i];
|
|
1504
2057
|
// Break if minimum number of chunks is not reached
|
|
1505
2058
|
const count =
|
|
1506
|
-
chunkCombination instanceof
|
|
2059
|
+
chunkCombination instanceof Set ? chunkCombination.size : 1;
|
|
1507
2060
|
if (count < cacheGroup.minChunks) continue;
|
|
1508
2061
|
// Select chunks by configuration
|
|
1509
2062
|
const { chunks: selectedChunks, key: selectedChunksKey } =
|
|
1510
|
-
getSelectedChunks(
|
|
1511
|
-
chunkCombination,
|
|
1512
|
-
/** @type {ChunkFilterFn} */
|
|
1513
|
-
(cacheGroup.chunksFilter)
|
|
1514
|
-
);
|
|
2063
|
+
getSelectedChunks(chunkCombination, cacheGroup.chunksFilter);
|
|
1515
2064
|
|
|
1516
2065
|
addModuleToChunksInfoMap(
|
|
1517
2066
|
cacheGroup,
|
|
@@ -1707,9 +2256,7 @@ class SplitChunksPlugin {
|
|
|
1707
2256
|
limit: byAsyncRequests
|
|
1708
2257
|
? "maxAsyncRequests"
|
|
1709
2258
|
: "maxInitialRequests",
|
|
1710
|
-
maxRequests
|
|
1711
|
-
/** @type {number} */
|
|
1712
|
-
(maxRequests),
|
|
2259
|
+
maxRequests,
|
|
1713
2260
|
modules: item.modules.size
|
|
1714
2261
|
});
|
|
1715
2262
|
}
|
|
@@ -1938,9 +2485,7 @@ class SplitChunksPlugin {
|
|
|
1938
2485
|
if (Object.keys(maxSize).length === 0) {
|
|
1939
2486
|
continue;
|
|
1940
2487
|
}
|
|
1941
|
-
for (const key of
|
|
1942
|
-
Object.keys(maxSize)
|
|
1943
|
-
)) {
|
|
2488
|
+
for (const key of Object.keys(maxSize)) {
|
|
1944
2489
|
const maxSizeValue = maxSize[key];
|
|
1945
2490
|
const minSizeValue = minSize[key];
|
|
1946
2491
|
if (
|