@depup/webpack 5.111.1-depup.1 → 5.112.0-depup.0
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 +4 -7
- package/changes.json +3 -15
- package/lib/Chunk.js +3 -966
- package/lib/Compilation.js +224 -106
- package/lib/Compiler.js +19 -19
- 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 +8 -8
- package/lib/asset/AssetBytesParser.js +3 -3
- package/lib/asset/AssetGenerator.js +36 -22
- package/lib/asset/AssetModule.js +2 -2
- package/lib/asset/AssetModulesPlugin.js +6 -9
- package/lib/asset/AssetParser.js +3 -3
- package/lib/asset/AssetSourceGenerator.js +8 -8
- package/lib/asset/AssetSourceParser.js +3 -3
- package/lib/asset/RawDataUrlModule.js +17 -10
- package/lib/asset/WebManifestGenerator.js +7 -7
- package/lib/asset/WebManifestParser.js +5 -5
- package/lib/async-modules/AsyncModuleHelpers.js +6 -5
- package/lib/async-modules/AwaitDependenciesInitFragment.js +4 -4
- package/lib/async-modules/InferAsyncModulesPlugin.js +4 -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} +5 -5
- 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 +8 -10
- package/lib/cache/ResolverCachePlugin.js +8 -4
- 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} +217 -200
- package/lib/{WebpackOptionsDefaulter.js → config/WebpackOptionsDefaulter.js} +3 -3
- package/lib/config/browserslistTargetHandler.js +1 -1
- package/lib/{cli.js → config/cli.js} +5 -158
- package/lib/config/defaults.js +144 -48
- package/lib/config/getClaimedAssetTypes.js +21 -13
- package/lib/config/normalization.js +18 -7
- package/lib/config/target.js +10 -0
- 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 +36 -25
- package/lib/context/ContextModuleFactory.js +13 -10
- package/lib/context/ContextReplacementPlugin.js +3 -3
- package/lib/css/CssGenerator.js +38 -31
- package/lib/css/CssInjectStyleRuntimeModule.js +36 -30
- package/lib/css/CssLoadingRuntimeModule.js +77 -44
- package/lib/css/CssModule.js +27 -29
- package/lib/css/CssModulesPlugin.js +128 -44
- package/lib/css/CssParser.js +682 -291
- package/lib/css/CssServerStylesRuntimeModule.js +3 -3
- package/lib/css/cssMinify.js +110 -37
- package/lib/css/data.js +6985 -5125
- package/lib/css/syntax-parser.js +19873 -0
- package/lib/css/syntax-printer.js +6037 -0
- package/lib/css/syntax.js +37 -18686
- package/lib/debug/ProfilingPlugin.js +52 -19
- package/lib/{DefinePlugin.js → define/DefinePlugin.js} +407 -41
- package/lib/{DotenvPlugin.js → define/DotenvPlugin.js} +9 -9
- package/lib/{EnvironmentPlugin.js → define/EnvironmentPlugin.js} +2 -2
- 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 -10
- 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} +10 -10
- 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 -33
- package/lib/dependencies/{CommonJsExportsDependency.js → commonjs/CommonJsExportsDependency.js} +15 -14
- package/lib/dependencies/{CommonJsExportsParserPlugin.js → commonjs/CommonJsExportsParserPlugin.js} +138 -61
- package/lib/dependencies/{CommonJsFullRequireDependency.js → commonjs/CommonJsFullRequireDependency.js} +32 -24
- package/lib/dependencies/{CommonJsImportsParserPlugin.js → commonjs/CommonJsImportsParserPlugin.js} +35 -30
- package/lib/dependencies/{CommonJsObjectExportDependency.js → commonjs/CommonJsObjectExportDependency.js} +13 -12
- package/lib/dependencies/{CommonJsPlugin.js → commonjs/CommonJsPlugin.js} +47 -35
- 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} +5 -5
- 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} +9 -9
- 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} +4 -4
- package/lib/dependencies/{ImportMetaGlobHelpers.js → context/ImportMetaGlobHelpers.js} +9 -9
- 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} +12 -11
- 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} +369 -92
- package/lib/dependencies/{CssIcssImportDependency.js → css/CssIcssImportDependency.js} +23 -16
- 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} +23 -16
- 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} +19 -17
- 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} +133 -118
- package/lib/dependencies/{HarmonyExportInitFragment.js → esm/ESMExportInitFragment.js} +48 -30
- package/lib/dependencies/{HarmonyExportSpecifierDependency.js → esm/ESMExportSpecifierDependency.js} +60 -36
- package/lib/dependencies/{HarmonyExports.js → esm/ESMExports.js} +4 -4
- package/lib/dependencies/{HarmonyImportBareSideEffectDependency.js → esm/ESMImportBareSideEffectDependency.js} +21 -13
- package/lib/dependencies/{HarmonyImportDependency.js → esm/ESMImportDependency.js} +74 -71
- package/lib/dependencies/{HarmonyImportDependencyParserPlugin.js → esm/ESMImportDependencyParserPlugin.js} +99 -84
- package/lib/dependencies/{HarmonyImportGuard.js → esm/ESMImportGuard.js} +26 -29
- package/lib/dependencies/{HarmonyImportSideEffectDependency.js → esm/ESMImportSideEffectDependency.js} +83 -39
- package/lib/dependencies/{HarmonyImportSpecifierDependency.js → esm/ESMImportSpecifierDependency.js} +94 -59
- package/lib/dependencies/esm/ESMModulesPlugin.js +207 -0
- package/lib/dependencies/{HarmonyTopLevelThisParserPlugin.js → esm/ESMTopLevelThisParserPlugin.js} +7 -7
- package/lib/dependencies/{TopLevelAwaitDependency.js → esm/TopLevelAwaitDependency.js} +12 -11
- package/lib/dependencies/{DynamicExports.js → helpers/DynamicExports.js} +2 -2
- 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} +51 -141
- package/lib/dependencies/{HtmlInlineHtmlDependency.js → html/HtmlInlineHtmlDependency.js} +13 -12
- package/lib/dependencies/{HtmlInlineScriptDependency.js → html/HtmlInlineScriptDependency.js} +69 -19
- package/lib/dependencies/{HtmlInlineStyleDependency.js → html/HtmlInlineStyleDependency.js} +50 -15
- 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} +20 -20
- 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} +119 -98
- 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 +16 -18
- 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} +31 -33
- 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} +154 -26
- 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 +20 -18
- 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 +11 -9
- package/lib/dll/DllModuleFactory.js +3 -3
- package/lib/dll/DllPlugin.js +18 -6
- package/lib/dll/DllReferencePlugin.js +102 -26
- 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/{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} +7 -5
- package/lib/errors/ExternalStarReexportError.js +2 -2
- package/lib/{library → errors}/FalseIIFEUmdWarning.js +1 -1
- package/lib/errors/HookWebpackError.js +4 -4
- package/lib/errors/IgnoreErrorModuleFactory.js +3 -3
- package/lib/errors/InvalidDependenciesModuleWarning.js +1 -1
- 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 +12 -3
- package/lib/esm/ExportWebpackRequireRuntimeModule.js +2 -2
- package/lib/esm/ModuleChunkFormatPlugin.js +19 -19
- package/lib/esm/ModuleChunkLoadingPlugin.js +3 -3
- package/lib/esm/ModuleChunkLoadingRuntimeModule.js +8 -8
- package/lib/{ExternalModule.js → externals/ExternalModule.js} +79 -55
- package/lib/{ExternalModuleFactoryPlugin.js → externals/ExternalModuleFactoryPlugin.js} +41 -39
- 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} +187 -80
- package/lib/{ChunkGroup.js → graph/ChunkGroup.js} +11 -3
- package/lib/{DependenciesBlock.js → graph/DependenciesBlock.js} +16 -4
- package/lib/graph/Dependency.js +628 -0
- package/lib/graph/Entrypoint.js +136 -0
- package/lib/{ExportsInfo.js → graph/ExportsInfo.js} +130 -82
- package/lib/{HotUpdateChunk.js → graph/HotUpdateChunk.js} +8 -0
- package/lib/{ModuleGraph.js → graph/ModuleGraph.js} +30 -30
- package/lib/{ModuleGraphConnection.js → graph/ModuleGraphConnection.js} +2 -2
- package/lib/{buildChunkGraph.js → graph/buildChunkGraph.js} +152 -57
- package/lib/{util → graph}/findGraphRoots.js +14 -8
- package/lib/graph/isDependencyKind.js +23 -0
- package/lib/hmr/HotModuleReplacement.runtime.js +2 -2
- package/lib/{HotModuleReplacementPlugin.js → hmr/HotModuleReplacementPlugin.js} +47 -47
- package/lib/hmr/HotModuleReplacementRuntimeModule.js +3 -3
- package/lib/hmr/JavascriptHotModuleReplacement.runtime.js +10 -8
- package/lib/hmr/JavascriptHotModuleReplacementHelper.js +2 -2
- package/lib/hmr/LazyCompilationPlugin.js +31 -21
- package/lib/html/HtmlGenerator.js +107 -43
- package/lib/html/HtmlModule.js +6 -2
- package/lib/html/HtmlModulesPlugin.js +172 -76
- package/lib/html/HtmlParser.js +503 -153
- package/lib/html/builtinEmbeddedRenderer.js +60 -13
- package/lib/html/data.js +2 -1
- package/lib/html/htmlMinify.js +111 -41
- package/lib/html/syntax-parser.js +15796 -0
- package/lib/html/syntax-printer.js +1034 -0
- package/lib/html/syntax.js +37 -13952
- package/lib/html/xmlMinify.js +67 -0
- package/lib/ids/ChunkModuleIdRangePlugin.js +2 -2
- package/lib/ids/DeterministicModuleIdsPlugin.js +1 -1
- package/lib/ids/HashedModuleIdsPlugin.js +31 -4
- 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 +303 -97
- package/lib/{APIPlugin.js → javascript/APIPlugin.js} +25 -25
- package/lib/javascript/ArrayPushCallbackChunkFormatPlugin.js +4 -5
- package/lib/javascript/BasicEvaluatedExpression.js +4 -4
- package/lib/javascript/ChunkHelpers.js +64 -4
- package/lib/javascript/CommonJsChunkFormatPlugin.js +4 -7
- package/lib/{CompatibilityPlugin.js → javascript/CompatibilityPlugin.js} +7 -7
- package/lib/{ConstPlugin.js → javascript/ConstPlugin.js} +74 -7
- package/lib/{ExportsInfoApiPlugin.js → javascript/ExportsInfoApiPlugin.js} +5 -5
- package/lib/{dependencies → javascript}/ExportsInfoDependency.js +10 -9
- package/lib/javascript/JavascriptGenerator.js +17 -17
- package/lib/{JavascriptMetaInfoPlugin.js → javascript/JavascriptMetaInfoPlugin.js} +7 -7
- package/lib/javascript/JavascriptModule.js +4 -3
- package/lib/javascript/JavascriptModulesPlugin.js +440 -211
- package/lib/javascript/JavascriptParser.js +220 -134
- package/lib/javascript/JavascriptParserHelpers.js +1 -1
- package/lib/javascript/MergedEntryExports.js +196 -0
- package/lib/javascript/ScopeAnalyzer.js +3840 -5
- package/lib/javascript/StartupHelpers.js +6 -6
- package/lib/{UseStrictPlugin.js → javascript/UseStrictPlugin.js} +12 -15
- 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 +18561 -0
- package/lib/javascript/syntax-printer-data.js +933 -0
- package/lib/javascript/syntax-printer.js +47106 -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 +10 -10
- package/lib/json/JsonModule.js +2 -2
- package/lib/json/JsonModulesPlugin.js +1 -1
- package/lib/json/JsonParser.js +5 -5
- 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 +27 -11
- package/lib/library/EnableLibraryPlugin.js +1 -1
- package/lib/library/ExportPropertyLibraryPlugin.js +4 -4
- package/lib/library/JsonpLibraryPlugin.js +1 -1
- package/lib/library/LibraryTemplatePlugin.js +53 -0
- package/lib/library/ModuleLibraryPlugin.js +160 -166
- 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 +31 -21
- package/lib/{LoaderTargetPlugin.js → loaders/LoaderTargetPlugin.js} +2 -2
- 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} +16 -14
- package/lib/{Module.js → module/Module.js} +119 -51
- package/lib/{ModuleFactory.js → module/ModuleFactory.js} +3 -3
- package/lib/module/NormalModule.js +2348 -0
- package/lib/{NormalModuleFactory.js → module/NormalModuleFactory.js} +53 -54
- package/lib/module/NullFactory.js +29 -0
- package/lib/{Parser.js → module/Parser.js} +3 -3
- package/lib/module/RawModule.js +208 -0
- package/lib/{SelfModuleFactory.js → module/SelfModuleFactory.js} +1 -1
- package/lib/{util → module}/extractSourceMap.js +2 -2
- package/lib/{util → module}/findCaseMismatch.js +2 -2
- package/lib/node/CommonJsChunkLoadingPlugin.js +3 -3
- package/lib/{dependencies → node}/ExternalModuleDependency.js +8 -7
- package/lib/{dependencies → node}/ExternalModuleInitFragment.js +6 -5
- 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 +9 -7
- package/lib/node/ReadFileCompileWasmPlugin.js +7 -5
- package/lib/node/RequireChunkLoadingRuntimeModule.js +7 -7
- package/lib/node/nodeConsole.js +2 -4
- package/lib/optimize/AggressiveMergingPlugin.js +2 -2
- package/lib/optimize/AggressiveSplittingPlugin.js +12 -8
- package/lib/{CircularModulesPlugin.js → optimize/CircularModulesPlugin.js} +13 -13
- package/lib/optimize/ConcatenatedModule.js +229 -214
- 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} +17 -17
- package/lib/{FlagDependencyUsagePlugin.js → optimize/FlagDependencyUsagePlugin.js} +17 -17
- package/lib/{FlagEntryExportAsUsedPlugin.js → optimize/FlagEntryExportAsUsedPlugin.js} +2 -2
- package/lib/optimize/FlagIncludedChunksPlugin.js +2 -2
- package/lib/optimize/InlineExports.js +11 -3
- package/lib/optimize/InnerGraph.js +5 -13
- package/lib/optimize/InnerGraphPlugin.js +10 -10
- package/lib/optimize/LazyBarrels.js +584 -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 +20 -12
- package/lib/{dependencies → optimize}/PureExpressionDependency.js +11 -10
- package/lib/optimize/RealContentHashPlugin.js +16 -7
- package/lib/optimize/RemoveEmptyChunksPlugin.js +2 -2
- package/lib/optimize/RemoveParentModulesPlugin.js +4 -4
- package/lib/optimize/SideEffectsFlagPlugin.js +18 -18
- package/lib/optimize/SplitChunksPlugin.js +713 -155
- 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} +66 -24
- package/lib/{CopyPlugin.js → output/CopyPlugin.js} +142 -67
- 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 +3 -3
- package/lib/performance/HotspotsPlugin.js +11 -10
- 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 +3 -3
- 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 +8 -7
- 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 +65 -44
- 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 +14 -13
- 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/RuleSetCompiler.js +27 -46
- package/lib/runtime/AsyncModuleGeneratorRuntimeModule.js +2 -2
- package/lib/runtime/AsyncModuleRuntimeModule.js +7 -4
- 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 +6 -6
- 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} +18 -1
- package/lib/runtime/RuntimeIdRuntimeModule.js +4 -4
- package/lib/{RuntimeModule.js → runtime/RuntimeModule.js} +36 -21
- package/lib/{RuntimePlugin.js → runtime/RuntimePlugin.js} +48 -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 +67 -11
- package/lib/schemes/VirtualUrlPlugin.js +50 -16
- package/lib/serialization/AggregateErrorSerializer.js +2 -2
- package/lib/serialization/FileMiddleware.js +3 -3
- package/lib/serialization/ObjectMiddleware.js +47 -16
- package/lib/serialization/SerializerMiddleware.js +2 -2
- 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 +22 -19
- package/lib/stats/DefaultStatsPresetPlugin.js +1 -1
- package/lib/stats/DefaultStatsPrinterPlugin.js +3 -3
- package/lib/{MultiStats.js → stats/MultiStats.js} +4 -4
- package/lib/{Stats.js → stats/Stats.js} +4 -4
- package/lib/stats/StatsFactory.js +14 -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} +145 -63
- package/lib/{Template.js → template/Template.js} +13 -11
- 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 +349 -44
- package/lib/util/TupleSet.js +27 -27
- package/lib/util/WeakTupleMap.js +10 -12
- package/lib/util/buildDiagnostics.js +2 -2
- package/lib/util/comparators.js +10 -10
- package/lib/util/concatenate.js +28 -147
- package/lib/util/createMappings.js +111 -0
- package/lib/util/dataURL.js +94 -15
- package/lib/util/deprecation.js +1 -1
- package/lib/util/extractComments.js +118 -0
- package/lib/util/formatLocation.js +1 -1
- package/lib/util/globUtils.js +197 -16
- 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 +294 -102
- package/lib/util/magicComment.js +12 -7
- package/lib/util/makeSerializable.js +23 -4
- package/lib/util/parseJson.js +1 -1
- 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 +4 -1
- 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 +9 -5
- package/lib/{wasm-async → wasm}/AsyncWebAssemblyGenerator.js +5 -5
- package/lib/{wasm-async → wasm}/AsyncWebAssemblyJavascriptGenerator.js +11 -10
- package/lib/{wasm-async → wasm}/AsyncWebAssemblyModulesPlugin.js +26 -10
- package/lib/{wasm-async → wasm}/AsyncWebAssemblyParser.js +8 -8
- package/lib/wasm/EnableWasmLoadingPlugin.js +1 -1
- package/lib/{wasm-async → wasm}/UniversalCompileAsyncWasmPlugin.js +9 -7
- package/lib/wasm/wasmModuleFilename.js +2 -2
- package/lib/wasm-sync/SyncWasmModule.js +3 -3
- package/lib/wasm-sync/WasmChunkLoadingRuntimeModule.js +8 -8
- package/lib/wasm-sync/WasmFinalizeExportsPlugin.js +3 -3
- package/lib/wasm-sync/WebAssemblyGenerator.js +9 -8
- package/lib/wasm-sync/WebAssemblyJavascriptGenerator.js +14 -15
- package/lib/wasm-sync/WebAssemblyModulesPlugin.js +9 -7
- package/lib/wasm-sync/WebAssemblyParser.js +6 -6
- 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 +8 -6
- package/lib/web/FetchCompileWasmPlugin.js +6 -4
- 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 +49 -38
- package/schemas/WebpackOptions.check.js +2 -1
- package/schemas/WebpackOptions.d.json.ts +2 -0
- package/schemas/WebpackOptions.json +294 -74
- package/schemas/plugins/BannerPlugin.check.js +2 -1
- package/schemas/plugins/BannerPlugin.json +29 -2
- package/schemas/plugins/HtmlGeneratorOptions.check.js +1 -0
- package/schemas/plugins/HtmlParserOptions.check.js +2 -1
- package/schemas/plugins/IgnorePlugin.check.js +1 -0
- package/schemas/plugins/IgnorePlugin.d.json.ts +2 -0
- package/schemas/plugins/IgnorePlugin.json +1 -1
- package/schemas/plugins/LoaderOptionsPlugin.check.js +1 -0
- package/schemas/plugins/ManifestPlugin.check.js +1 -0
- package/schemas/plugins/ManifestPlugin.json +3 -3
- package/schemas/plugins/ProgressPlugin.check.js +2 -1
- 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 +2 -1
- package/schemas/plugins/SourceMapDevToolPlugin.json +44 -12
- package/schemas/plugins/WatchIgnorePlugin.check.js +2 -1
- package/schemas/plugins/WatchIgnorePlugin.json +12 -3
- package/schemas/plugins/asset/AssetGeneratorOptions.check.js +1 -0
- package/schemas/plugins/asset/AssetInlineGeneratorOptions.check.js +1 -0
- package/schemas/plugins/asset/AssetParserOptions.check.js +1 -0
- package/schemas/plugins/asset/AssetResourceGeneratorOptions.check.js +1 -0
- package/schemas/plugins/container/ContainerPlugin.check.js +2 -1
- package/schemas/plugins/container/ContainerPlugin.json +8 -0
- package/schemas/plugins/container/ContainerReferencePlugin.check.js +1 -0
- package/schemas/plugins/container/ExternalsType.check.js +1 -0
- package/schemas/plugins/container/ModuleFederationPlugin.check.js +2 -1
- package/schemas/plugins/container/ModuleFederationPlugin.json +40 -0
- package/schemas/plugins/css/CssAutoOrModuleParserOptions.check.js +1 -0
- package/schemas/plugins/css/CssGeneratorOptions.check.js +1 -0
- package/schemas/plugins/css/CssModuleGeneratorOptions.check.js +1 -0
- package/schemas/plugins/css/CssModuleParserOptions.check.js +1 -0
- package/schemas/plugins/css/CssParserOptions.check.js +1 -0
- package/schemas/plugins/debug/ProfilingPlugin.check.js +1 -0
- package/schemas/plugins/dll/DllPlugin.check.js +1 -0
- package/schemas/plugins/dll/DllReferencePlugin.check.js +2 -1
- package/schemas/plugins/dll/DllReferencePlugin.json +3 -18
- package/schemas/plugins/ids/HashedModuleIdsPlugin.check.js +1 -0
- package/schemas/plugins/ids/OccurrenceChunkIdsPlugin.check.js +1 -0
- package/schemas/plugins/ids/OccurrenceModuleIdsPlugin.check.js +1 -0
- package/schemas/plugins/json/JsonModulesPluginGenerator.check.js +1 -0
- package/schemas/plugins/json/JsonModulesPluginParser.check.js +1 -0
- package/schemas/plugins/optimize/AggressiveSplittingPlugin.check.js +1 -0
- package/schemas/plugins/optimize/LimitChunkCountPlugin.check.js +1 -0
- package/schemas/plugins/optimize/MergeDuplicateChunksPlugin.check.js +1 -0
- package/schemas/plugins/optimize/MinChunkSizePlugin.check.js +1 -0
- package/schemas/plugins/schemes/HttpUriPlugin.check.js +1 -0
- package/schemas/plugins/schemes/VirtualUrlPlugin.check.js +1 -0
- package/schemas/plugins/sharing/ConsumeSharedPlugin.check.js +2 -1
- package/schemas/plugins/sharing/ConsumeSharedPlugin.json +32 -0
- package/schemas/plugins/sharing/ProvideSharedPlugin.check.js +2 -1
- package/schemas/plugins/sharing/ProvideSharedPlugin.json +32 -0
- package/schemas/plugins/sharing/SharePlugin.check.js +2 -1
- package/schemas/plugins/sharing/SharePlugin.json +32 -0
- package/types.d.ts +19355 -13873
- 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}/conventions.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.
|
|
@@ -513,19 +541,41 @@ const normalizeChunksFilter = (chunks) => {
|
|
|
513
541
|
}
|
|
514
542
|
};
|
|
515
543
|
|
|
544
|
+
/**
|
|
545
|
+
* A cache group source a module can only match or not, and what decides it.
|
|
546
|
+
* @typedef {object} StaticCacheGroupSource
|
|
547
|
+
* @property {CacheGroupSource} source the normalized source
|
|
548
|
+
* @property {OptimizationSplitChunksCacheGroup["test"]} test the modules it accepts
|
|
549
|
+
*/
|
|
550
|
+
|
|
551
|
+
/**
|
|
552
|
+
* The normalized cache groups, and what is known about them without a module.
|
|
553
|
+
* @typedef {object} NormalizedCacheGroups
|
|
554
|
+
* @property {GetCacheGroups} getCacheGroups a function to get the cache groups
|
|
555
|
+
* @property {StaticCacheGroupSource[]} staticSources the sources a module can only match or not
|
|
556
|
+
* @property {boolean} hasDynamicSources true when a callback builds sources per module
|
|
557
|
+
*/
|
|
558
|
+
|
|
516
559
|
/**
|
|
517
560
|
* Normalizes cache groups.
|
|
518
561
|
* @param {undefined | GetCacheGroups | Record<string, false | string | RegExp | RawGetCacheGroups | OptimizationSplitChunksCacheGroup>} cacheGroups the cache group options
|
|
519
562
|
* @param {DefaultSizeTypes} defaultSizeTypes the default size types
|
|
520
|
-
* @returns {
|
|
563
|
+
* @returns {NormalizedCacheGroups} the normalized cache groups
|
|
521
564
|
*/
|
|
522
565
|
const normalizeCacheGroups = (cacheGroups, defaultSizeTypes) => {
|
|
523
566
|
if (typeof cacheGroups === "function") {
|
|
524
|
-
return
|
|
567
|
+
return {
|
|
568
|
+
getCacheGroups: cacheGroups,
|
|
569
|
+
staticSources: [],
|
|
570
|
+
hasDynamicSources: true
|
|
571
|
+
};
|
|
525
572
|
}
|
|
526
573
|
if (typeof cacheGroups === "object" && cacheGroups !== null) {
|
|
527
574
|
/** @type {((module: Module, context: CacheGroupsContext, results: CacheGroupSource[]) => void)[]} */
|
|
528
575
|
const handlers = [];
|
|
576
|
+
/** @type {StaticCacheGroupSource[]} */
|
|
577
|
+
const staticSources = [];
|
|
578
|
+
let hasDynamicSources = false;
|
|
529
579
|
for (const key of Object.keys(cacheGroups)) {
|
|
530
580
|
const option = cacheGroups[key];
|
|
531
581
|
if (option === false) {
|
|
@@ -533,6 +583,7 @@ const normalizeCacheGroups = (cacheGroups, defaultSizeTypes) => {
|
|
|
533
583
|
}
|
|
534
584
|
if (typeof option === "string" || option instanceof RegExp) {
|
|
535
585
|
const source = createCacheGroupSource({}, key, defaultSizeTypes);
|
|
586
|
+
staticSources.push({ source, test: option });
|
|
536
587
|
handlers.push((module, context, results) => {
|
|
537
588
|
if (checkTest(option, module, context)) {
|
|
538
589
|
results.push(source);
|
|
@@ -541,6 +592,7 @@ const normalizeCacheGroups = (cacheGroups, defaultSizeTypes) => {
|
|
|
541
592
|
} else if (typeof option === "function") {
|
|
542
593
|
/** @type {WeakMap<OptimizationSplitChunksCacheGroup, CacheGroupSource>} */
|
|
543
594
|
const cache = new WeakMap();
|
|
595
|
+
hasDynamicSources = true;
|
|
544
596
|
handlers.push((module, context, results) => {
|
|
545
597
|
const result = option(module);
|
|
546
598
|
if (result) {
|
|
@@ -563,6 +615,7 @@ const normalizeCacheGroups = (cacheGroups, defaultSizeTypes) => {
|
|
|
563
615
|
});
|
|
564
616
|
} else {
|
|
565
617
|
const source = createCacheGroupSource(option, key, defaultSizeTypes);
|
|
618
|
+
staticSources.push({ source, test: option.test });
|
|
566
619
|
handlers.push((module, context, results) => {
|
|
567
620
|
if (
|
|
568
621
|
checkTest(option.test, module, context) &&
|
|
@@ -588,9 +641,13 @@ const normalizeCacheGroups = (cacheGroups, defaultSizeTypes) => {
|
|
|
588
641
|
}
|
|
589
642
|
return results;
|
|
590
643
|
};
|
|
591
|
-
return fn;
|
|
644
|
+
return { getCacheGroups: fn, staticSources, hasDynamicSources };
|
|
592
645
|
}
|
|
593
|
-
return
|
|
646
|
+
return {
|
|
647
|
+
getCacheGroups: () => null,
|
|
648
|
+
staticSources: [],
|
|
649
|
+
hasDynamicSources: false
|
|
650
|
+
};
|
|
594
651
|
};
|
|
595
652
|
|
|
596
653
|
/** @typedef {(module: Module, context: CacheGroupsContext) => boolean} CheckTestFn */
|
|
@@ -616,9 +673,36 @@ const checkTest = (test, module, context) => {
|
|
|
616
673
|
const name = module.nameForCondition();
|
|
617
674
|
return name ? test.test(name) : false;
|
|
618
675
|
}
|
|
676
|
+
if (typeof test === "object") {
|
|
677
|
+
return getMatchModuleGlobCondition()(test, module);
|
|
678
|
+
}
|
|
619
679
|
return false;
|
|
620
680
|
};
|
|
621
681
|
|
|
682
|
+
/**
|
|
683
|
+
* Whether a module matches a test that decides it without running user code.
|
|
684
|
+
* A callback or a test naming no modules is treated as matching, so a module it
|
|
685
|
+
* might take is never taken for one it cannot.
|
|
686
|
+
* @param {OptimizationSplitChunksCacheGroup["test"]} test test option
|
|
687
|
+
* @param {Module} module the module
|
|
688
|
+
* @returns {boolean} true, if the module may be selected
|
|
689
|
+
*/
|
|
690
|
+
const matchesStaticTest = (test, module) => {
|
|
691
|
+
if (typeof test === "string") {
|
|
692
|
+
const name = module.nameForCondition();
|
|
693
|
+
return name ? name.startsWith(test) : false;
|
|
694
|
+
}
|
|
695
|
+
if (test instanceof RegExp) {
|
|
696
|
+
const name = module.nameForCondition();
|
|
697
|
+
return name ? test.test(name) : false;
|
|
698
|
+
}
|
|
699
|
+
if (typeof test === "object") {
|
|
700
|
+
return getMatchModuleGlobCondition()(test, module);
|
|
701
|
+
}
|
|
702
|
+
if (typeof test === "boolean") return test;
|
|
703
|
+
return true;
|
|
704
|
+
};
|
|
705
|
+
|
|
622
706
|
/** @typedef {(type: string) => boolean} CheckModuleTypeFn */
|
|
623
707
|
|
|
624
708
|
/**
|
|
@@ -724,6 +808,16 @@ class SplitChunksPlugin {
|
|
|
724
808
|
* @param {OptimizationSplitChunksOptions=} options plugin options
|
|
725
809
|
*/
|
|
726
810
|
constructor(options = {}) {
|
|
811
|
+
if (
|
|
812
|
+
options.dedupDepth !== undefined &&
|
|
813
|
+
(!Number.isInteger(options.dedupDepth) ||
|
|
814
|
+
options.dedupDepth < 0 ||
|
|
815
|
+
options.dedupDepth > 0xffffffff)
|
|
816
|
+
) {
|
|
817
|
+
throw new WebpackError(
|
|
818
|
+
'"optimization.splitChunks.dedupDepth" must be an integer between 0 and 4294967295.'
|
|
819
|
+
);
|
|
820
|
+
}
|
|
727
821
|
const defaultSizeTypes = options.defaultSizeTypes || [
|
|
728
822
|
"javascript",
|
|
729
823
|
"unknown"
|
|
@@ -735,9 +829,12 @@ class SplitChunksPlugin {
|
|
|
735
829
|
defaultSizeTypes
|
|
736
830
|
);
|
|
737
831
|
const maxSize = normalizeSizes(options.maxSize, defaultSizeTypes);
|
|
832
|
+
const { getCacheGroups, staticSources, hasDynamicSources } =
|
|
833
|
+
normalizeCacheGroups(options.cacheGroups, defaultSizeTypes);
|
|
738
834
|
|
|
739
835
|
/** @type {SplitChunksOptions} */
|
|
740
836
|
this.options = {
|
|
837
|
+
dedupDepth: options.dedupDepth,
|
|
741
838
|
chunksFilter:
|
|
742
839
|
/** @type {ChunkFilterFn} */
|
|
743
840
|
(normalizeChunksFilter(options.chunks || "all")),
|
|
@@ -765,10 +862,7 @@ class SplitChunksPlugin {
|
|
|
765
862
|
maxInitialRequests: options.maxInitialRequests || 1,
|
|
766
863
|
hidePathInfo: options.hidePathInfo || false,
|
|
767
864
|
filename: options.filename || undefined,
|
|
768
|
-
getCacheGroups
|
|
769
|
-
options.cacheGroups,
|
|
770
|
-
defaultSizeTypes
|
|
771
|
-
),
|
|
865
|
+
getCacheGroups,
|
|
772
866
|
getName: options.name
|
|
773
867
|
? /** @type {GetNameFn} */ (normalizeName(options.name))
|
|
774
868
|
: defaultGetName,
|
|
@@ -807,6 +901,64 @@ class SplitChunksPlugin {
|
|
|
807
901
|
|
|
808
902
|
/** @type {WeakMap<CacheGroupSource, CacheGroup>} */
|
|
809
903
|
this._cacheGroupCache = new WeakMap();
|
|
904
|
+
/** @type {StaticCacheGroupSource[]} */
|
|
905
|
+
this._staticCacheGroupSources = staticSources;
|
|
906
|
+
this._hasDynamicCacheGroups = hasDynamicSources;
|
|
907
|
+
}
|
|
908
|
+
|
|
909
|
+
/**
|
|
910
|
+
* Settings for the intersections a chunk set discovers, or `undefined` when no
|
|
911
|
+
* cache group would take one.
|
|
912
|
+
* @param {boolean} usedExports true for the sets grouped by used exports
|
|
913
|
+
* @param {number} dedupDepth rounds of discovery this compilation allows
|
|
914
|
+
* @returns {IntersectionSettings | undefined} the settings, when discovery applies
|
|
915
|
+
*/
|
|
916
|
+
_getIntersectionSettings(usedExports, dedupDepth) {
|
|
917
|
+
if (dedupDepth === 0) return undefined;
|
|
918
|
+
// A callback builds its cache groups per module, so neither what they take
|
|
919
|
+
// nor what they ask of it is known here: discover for the widest of them,
|
|
920
|
+
// and bound nothing.
|
|
921
|
+
if (this._hasDynamicCacheGroups) {
|
|
922
|
+
return { minSize: 0, minMembers: 1, groups: undefined };
|
|
923
|
+
}
|
|
924
|
+
/** @type {IntersectionCacheGroup[]} */
|
|
925
|
+
const groups = [];
|
|
926
|
+
let minMembers = Number.POSITIVE_INFINITY;
|
|
927
|
+
/** @type {number | undefined} */
|
|
928
|
+
let minSize;
|
|
929
|
+
for (const { source, test } of this._staticCacheGroupSources) {
|
|
930
|
+
const cacheGroup = this._getCacheGroup(source);
|
|
931
|
+
if (
|
|
932
|
+
cacheGroup.usedExports !== usedExports ||
|
|
933
|
+
cacheGroup.getName !== defaultGetName ||
|
|
934
|
+
(!cacheGroup._validateSize && !cacheGroup._validateSizeReduction)
|
|
935
|
+
) {
|
|
936
|
+
continue;
|
|
937
|
+
}
|
|
938
|
+
groups.push({ test, minSize: cacheGroup.minSize });
|
|
939
|
+
minMembers = Math.min(minMembers, Math.max(1, cacheGroup.minChunks));
|
|
940
|
+
if (minSize === 0) continue;
|
|
941
|
+
// A chunk filter can map two intersections onto the same selected
|
|
942
|
+
// chunks, where only the modules of both together reach `minSize`, so
|
|
943
|
+
// a bound holds only for groups taking the chunks as they are.
|
|
944
|
+
|
|
945
|
+
// TODO intersect what a filter selects, where every group shares one,
|
|
946
|
+
// so a filtered build is bounded as well
|
|
947
|
+
if (
|
|
948
|
+
cacheGroup.chunksFilter !== ALL_CHUNK_FILTER ||
|
|
949
|
+
!cacheGroup._validateSize
|
|
950
|
+
) {
|
|
951
|
+
minSize = 0;
|
|
952
|
+
continue;
|
|
953
|
+
}
|
|
954
|
+
for (const size of Object.values(cacheGroup.minSize)) {
|
|
955
|
+
if (size > 0 && (minSize === undefined || size < minSize)) {
|
|
956
|
+
minSize = size;
|
|
957
|
+
}
|
|
958
|
+
}
|
|
959
|
+
}
|
|
960
|
+
if (groups.length === 0) return undefined;
|
|
961
|
+
return { minSize: minSize || 0, minMembers, groups };
|
|
810
962
|
}
|
|
811
963
|
|
|
812
964
|
/**
|
|
@@ -890,6 +1042,7 @@ class SplitChunksPlugin {
|
|
|
890
1042
|
: cacheGroupSource.key,
|
|
891
1043
|
reuseExistingChunk: cacheGroupSource.reuseExistingChunk || false,
|
|
892
1044
|
_validateSize: hasNonZeroSizes(minSize),
|
|
1045
|
+
_validateSizeReduction: hasNonZeroSizes(minSizeReduction),
|
|
893
1046
|
_validateRemainingSize: hasNonZeroSizes(minRemainingSize),
|
|
894
1047
|
_minSizeForMaxSize: mergeSizes(
|
|
895
1048
|
cacheGroupSource.minSize,
|
|
@@ -941,24 +1094,50 @@ class SplitChunksPlugin {
|
|
|
941
1094
|
logger.time("prepare");
|
|
942
1095
|
const chunkGraph = compilation.chunkGraph;
|
|
943
1096
|
const moduleGraph = compilation.moduleGraph;
|
|
1097
|
+
// Rounds of discovery: what the option says, or what the defaults
|
|
1098
|
+
// of the next major imply, as a plugin constructed by hand reads
|
|
1099
|
+
// no defaults of its own
|
|
1100
|
+
const dedupDepth =
|
|
1101
|
+
this.options.dedupDepth === undefined
|
|
1102
|
+
? compiler.options.experiments.futureDefaults
|
|
1103
|
+
? 1
|
|
1104
|
+
: 0
|
|
1105
|
+
: this.options.dedupDepth;
|
|
1106
|
+
const intersectionSettings = this._getIntersectionSettings(
|
|
1107
|
+
false,
|
|
1108
|
+
dedupDepth
|
|
1109
|
+
);
|
|
1110
|
+
const exportsIntersectionSettings = this._getIntersectionSettings(
|
|
1111
|
+
true,
|
|
1112
|
+
dedupDepth
|
|
1113
|
+
);
|
|
1114
|
+
// Chunks in the index intersection discovery works in, built only
|
|
1115
|
+
// when a cache group would take an intersection
|
|
1116
|
+
/** @type {Chunk[] | undefined} */
|
|
1117
|
+
const intersectionChunks =
|
|
1118
|
+
intersectionSettings === undefined &&
|
|
1119
|
+
exportsIntersectionSettings === undefined
|
|
1120
|
+
? undefined
|
|
1121
|
+
: [];
|
|
1122
|
+
// The index of each of those chunks
|
|
1123
|
+
/** @type {Map<Chunk, number>} */
|
|
1124
|
+
const intersectionChunkIndices = new Map();
|
|
944
1125
|
// Give each selected chunk an index (to create strings from chunks)
|
|
945
1126
|
/** @type {Map<Chunk, bigint>} */
|
|
946
1127
|
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
1128
|
const ZERO = BigInt("0");
|
|
952
1129
|
const ONE = BigInt("1");
|
|
953
1130
|
const START = ONE << BigInt("31");
|
|
954
1131
|
let index = START;
|
|
955
|
-
let denseIndex = 0;
|
|
956
1132
|
for (const chunk of chunks) {
|
|
957
1133
|
chunkIndexMap.set(
|
|
958
1134
|
chunk,
|
|
959
1135
|
index | BigInt((Math.random() * 0x7fffffff) | 0)
|
|
960
1136
|
);
|
|
961
|
-
|
|
1137
|
+
if (intersectionChunks !== undefined) {
|
|
1138
|
+
intersectionChunkIndices.set(chunk, intersectionChunks.length);
|
|
1139
|
+
intersectionChunks.push(chunk);
|
|
1140
|
+
}
|
|
962
1141
|
index <<= ONE;
|
|
963
1142
|
}
|
|
964
1143
|
/**
|
|
@@ -992,11 +1171,61 @@ class SplitChunksPlugin {
|
|
|
992
1171
|
return /** @type {bigint} */ (chunkIndexMap.get(key)).toString(16);
|
|
993
1172
|
};
|
|
994
1173
|
|
|
1174
|
+
/**
|
|
1175
|
+
* Most a module can weigh towards an intersection of these cache groups, `0`
|
|
1176
|
+
* when none of them takes it and `Infinity` when a size of it is unknown or
|
|
1177
|
+
* bounded by nothing.
|
|
1178
|
+
* @param {Module} module the module
|
|
1179
|
+
* @param {IntersectionCacheGroup[]} groups the cache groups taking the intersections
|
|
1180
|
+
* @returns {number} the bound
|
|
1181
|
+
*/
|
|
1182
|
+
const getModuleSizeBound = (module, groups) => {
|
|
1183
|
+
// A native test is exact, so a module no group accepts weighs nothing. A
|
|
1184
|
+
// callback stays a possible match rather than being called a second time.
|
|
1185
|
+
if (!groups.some(({ test }) => matchesStaticTest(test, module))) {
|
|
1186
|
+
return 0;
|
|
1187
|
+
}
|
|
1188
|
+
let bound = 0;
|
|
1189
|
+
let types = 0;
|
|
1190
|
+
for (const type of module.getSourceTypes()) {
|
|
1191
|
+
types++;
|
|
1192
|
+
for (const { minSize } of groups) {
|
|
1193
|
+
// Without a threshold on this type, arbitrarily few bytes of it survive
|
|
1194
|
+
// minSize, so nothing about this module bounds anything
|
|
1195
|
+
if (!(minSize[type] > 0)) return Number.POSITIVE_INFINITY;
|
|
1196
|
+
}
|
|
1197
|
+
const size = module.size(type);
|
|
1198
|
+
if (!(size >= 0) || size === Number.POSITIVE_INFINITY) {
|
|
1199
|
+
return Number.POSITIVE_INFINITY;
|
|
1200
|
+
}
|
|
1201
|
+
bound += size;
|
|
1202
|
+
}
|
|
1203
|
+
return types === 0 ? Number.POSITIVE_INFINITY : bound;
|
|
1204
|
+
};
|
|
1205
|
+
|
|
1206
|
+
/** Whether discovery of these sets prunes by size. */
|
|
1207
|
+
const boundsChunkSetSizes =
|
|
1208
|
+
intersectionSettings !== undefined &&
|
|
1209
|
+
intersectionSettings.minSize > 0;
|
|
1210
|
+
const boundsExportsChunkSetSizes =
|
|
1211
|
+
exportsIntersectionSettings !== undefined &&
|
|
1212
|
+
exportsIntersectionSettings.minSize > 0;
|
|
1213
|
+
|
|
995
1214
|
const getChunkSetsInGraph = memoize(() => {
|
|
996
1215
|
/** @type {Map<bigint, ChunkSet>} */
|
|
997
1216
|
const chunkSetsInGraph = new Map();
|
|
998
1217
|
/** @type {ChunkSet} */
|
|
999
1218
|
const singleChunkSets = new Set();
|
|
1219
|
+
// Only what a chunk set's own modules weigh, and only where a bound on it
|
|
1220
|
+
// can reject an intersection
|
|
1221
|
+
/** @type {Map<bigint | Chunk, number> | undefined} */
|
|
1222
|
+
const sizeByKey = boundsChunkSetSizes ? new Map() : undefined;
|
|
1223
|
+
const groups = boundsChunkSetSizes
|
|
1224
|
+
? /** @type {IntersectionCacheGroup[]} */ (
|
|
1225
|
+
/** @type {IntersectionSettings} */ (intersectionSettings)
|
|
1226
|
+
.groups
|
|
1227
|
+
)
|
|
1228
|
+
: undefined;
|
|
1000
1229
|
for (const module of compilation.modules) {
|
|
1001
1230
|
const chunks = chunkGraph.getModuleChunksIterable(module);
|
|
1002
1231
|
const chunksKey = getKey(chunks);
|
|
@@ -1007,8 +1236,18 @@ class SplitChunksPlugin {
|
|
|
1007
1236
|
} else {
|
|
1008
1237
|
singleChunkSets.add(chunksKey);
|
|
1009
1238
|
}
|
|
1239
|
+
if (sizeByKey !== undefined) {
|
|
1240
|
+
sizeByKey.set(
|
|
1241
|
+
chunksKey,
|
|
1242
|
+
(sizeByKey.get(chunksKey) || 0) +
|
|
1243
|
+
getModuleSizeBound(
|
|
1244
|
+
module,
|
|
1245
|
+
/** @type {IntersectionCacheGroup[]} */ (groups)
|
|
1246
|
+
)
|
|
1247
|
+
);
|
|
1248
|
+
}
|
|
1010
1249
|
}
|
|
1011
|
-
return { chunkSetsInGraph, singleChunkSets };
|
|
1250
|
+
return { chunkSetsInGraph, singleChunkSets, sizeByKey };
|
|
1012
1251
|
});
|
|
1013
1252
|
|
|
1014
1253
|
/**
|
|
@@ -1032,127 +1271,355 @@ class SplitChunksPlugin {
|
|
|
1032
1271
|
return groupedByUsedExports.values();
|
|
1033
1272
|
};
|
|
1034
1273
|
|
|
1035
|
-
/** @type {Map<Module,
|
|
1274
|
+
/** @type {Map<Module, Chunk[][]>} */
|
|
1036
1275
|
const groupedByExportsMap = new Map();
|
|
1037
1276
|
|
|
1038
|
-
/** @typedef {Map<bigint
|
|
1277
|
+
/** @typedef {Map<bigint, ChunkSet>} ChunkSetsInGraph */
|
|
1039
1278
|
|
|
1040
1279
|
const getExportsChunkSetsInGraph = memoize(() => {
|
|
1041
1280
|
/** @type {ChunkSetsInGraph} */
|
|
1042
1281
|
const chunkSetsInGraph = new Map();
|
|
1043
1282
|
/** @type {ChunkSet} */
|
|
1044
1283
|
const singleChunkSets = new Set();
|
|
1284
|
+
// A module counts towards every group it appears in, which can only
|
|
1285
|
+
// overstate a group, never hide an intersection worth splitting
|
|
1286
|
+
/** @type {Map<bigint | Chunk, number> | undefined} */
|
|
1287
|
+
const sizeByKey = boundsExportsChunkSetSizes
|
|
1288
|
+
? new Map()
|
|
1289
|
+
: undefined;
|
|
1290
|
+
const groups = boundsExportsChunkSetSizes
|
|
1291
|
+
? /** @type {IntersectionCacheGroup[]} */ (
|
|
1292
|
+
/** @type {IntersectionSettings} */ (
|
|
1293
|
+
exportsIntersectionSettings
|
|
1294
|
+
).groups
|
|
1295
|
+
)
|
|
1296
|
+
: undefined;
|
|
1045
1297
|
for (const module of compilation.modules) {
|
|
1046
1298
|
const groupedChunks = [...groupChunksByExports(module)];
|
|
1047
1299
|
groupedByExportsMap.set(module, groupedChunks);
|
|
1048
1300
|
for (const chunks of groupedChunks) {
|
|
1301
|
+
const chunksKey = getKey(chunks);
|
|
1049
1302
|
if (chunks.length === 1) {
|
|
1050
1303
|
singleChunkSets.add(chunks[0]);
|
|
1051
1304
|
} else {
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1305
|
+
// More than one chunk, so the key is the bigint of their ids
|
|
1306
|
+
const setKey = /** @type {bigint} */ (chunksKey);
|
|
1307
|
+
if (!chunkSetsInGraph.has(setKey)) {
|
|
1308
|
+
chunkSetsInGraph.set(setKey, new Set(chunks));
|
|
1055
1309
|
}
|
|
1056
1310
|
}
|
|
1311
|
+
if (sizeByKey !== undefined) {
|
|
1312
|
+
sizeByKey.set(
|
|
1313
|
+
chunksKey,
|
|
1314
|
+
(sizeByKey.get(chunksKey) || 0) +
|
|
1315
|
+
getModuleSizeBound(
|
|
1316
|
+
module,
|
|
1317
|
+
/** @type {IntersectionCacheGroup[]} */ (groups)
|
|
1318
|
+
)
|
|
1319
|
+
);
|
|
1320
|
+
}
|
|
1057
1321
|
}
|
|
1058
1322
|
}
|
|
1059
|
-
return { chunkSetsInGraph, singleChunkSets };
|
|
1323
|
+
return { chunkSetsInGraph, singleChunkSets, sizeByKey };
|
|
1060
1324
|
});
|
|
1061
1325
|
|
|
1062
1326
|
/**
|
|
1063
|
-
*
|
|
1064
|
-
*
|
|
1065
|
-
* @typedef {object}
|
|
1066
|
-
* @property {ChunkSet[]} sets the chunk sets
|
|
1067
|
-
* @property {
|
|
1327
|
+
* The chunk sets a combination can be taken from, in the order they are
|
|
1328
|
+
* combined in, indexed by the chunk fewest of them hold.
|
|
1329
|
+
* @typedef {object} ChunkSetIndex
|
|
1330
|
+
* @property {ChunkSet[]} sets the chunk sets, smaller counts first
|
|
1331
|
+
* @property {Map<Chunk, number[]>} setsByRarestChunk what to try for a chunk
|
|
1332
|
+
* @property {Map<Chunk, number>} singleOrder order of the single chunk sets
|
|
1068
1333
|
*/
|
|
1069
1334
|
|
|
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
1335
|
/**
|
|
1076
|
-
*
|
|
1077
|
-
*
|
|
1078
|
-
*
|
|
1079
|
-
* @param {
|
|
1080
|
-
* @
|
|
1336
|
+
* Indexes chunk sets for the subsets of a set to be found without walking all
|
|
1337
|
+
* of them: a subset holds the chunk fewest sets hold of it, so only the sets
|
|
1338
|
+
* indexed under a chunk of the superset can be one.
|
|
1339
|
+
* @param {IterableIterator<ChunkSet>} chunkSets set of sets of chunks
|
|
1340
|
+
* @param {ChunkSet} singleChunkSets the chunks holding modules of their own
|
|
1341
|
+
* @returns {ChunkSetIndex} the sets, and where to look for a subset
|
|
1081
1342
|
*/
|
|
1082
|
-
const
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1343
|
+
const indexChunkSets = (chunkSets, singleChunkSets) => {
|
|
1344
|
+
// Grouped by count, as only a smaller set can be a proper subset, and
|
|
1345
|
+
// combined in that order
|
|
1346
|
+
/** @type {Map<CountOfChunk, ChunkSet[]>} */
|
|
1347
|
+
const setsByCount = new Map();
|
|
1348
|
+
/** @type {Map<Chunk, number>} */
|
|
1349
|
+
const holders = new Map();
|
|
1350
|
+
for (const chunksSet of chunkSets) {
|
|
1351
|
+
const group = setsByCount.get(chunksSet.size);
|
|
1352
|
+
if (group === undefined) {
|
|
1353
|
+
setsByCount.set(chunksSet.size, [chunksSet]);
|
|
1354
|
+
} else {
|
|
1355
|
+
group.push(chunksSet);
|
|
1356
|
+
}
|
|
1357
|
+
for (const chunk of chunksSet) {
|
|
1358
|
+
holders.set(chunk, (holders.get(chunk) || 0) + 1);
|
|
1359
|
+
}
|
|
1360
|
+
}
|
|
1361
|
+
/** @type {ChunkSet[]} */
|
|
1362
|
+
const sets = [];
|
|
1363
|
+
for (const group of setsByCount.values()) {
|
|
1364
|
+
for (const chunksSet of group) sets.push(chunksSet);
|
|
1090
1365
|
}
|
|
1366
|
+
/** @type {Map<Chunk, number[]>} */
|
|
1367
|
+
const setsByRarestChunk = new Map();
|
|
1368
|
+
for (let i = 0; i < sets.length; i++) {
|
|
1369
|
+
/** @type {Chunk | undefined} */
|
|
1370
|
+
let rarest;
|
|
1371
|
+
let fewest = 0;
|
|
1372
|
+
for (const chunk of sets[i]) {
|
|
1373
|
+
const count = /** @type {number} */ (holders.get(chunk));
|
|
1374
|
+
if (rarest === undefined || count < fewest) {
|
|
1375
|
+
rarest = chunk;
|
|
1376
|
+
fewest = count;
|
|
1377
|
+
}
|
|
1378
|
+
}
|
|
1379
|
+
if (rarest === undefined) continue;
|
|
1380
|
+
const indices = setsByRarestChunk.get(rarest);
|
|
1381
|
+
if (indices === undefined) setsByRarestChunk.set(rarest, [i]);
|
|
1382
|
+
else indices.push(i);
|
|
1383
|
+
}
|
|
1384
|
+
/** @type {Map<Chunk, number>} */
|
|
1385
|
+
const singleOrder = new Map();
|
|
1386
|
+
for (const chunk of singleChunkSets) {
|
|
1387
|
+
singleOrder.set(chunk, singleOrder.size);
|
|
1388
|
+
}
|
|
1389
|
+
return { sets, setsByRarestChunk, singleOrder };
|
|
1091
1390
|
};
|
|
1391
|
+
const getChunkSetIndex = memoize(() => {
|
|
1392
|
+
const { chunkSetsInGraph, singleChunkSets } = getChunkSetsInGraph();
|
|
1393
|
+
return indexChunkSets(chunkSetsInGraph.values(), singleChunkSets);
|
|
1394
|
+
});
|
|
1395
|
+
const getExportsChunkSetIndex = memoize(() => {
|
|
1396
|
+
const { chunkSetsInGraph, singleChunkSets } =
|
|
1397
|
+
getExportsChunkSetsInGraph();
|
|
1398
|
+
return indexChunkSets(chunkSetsInGraph.values(), singleChunkSets);
|
|
1399
|
+
});
|
|
1092
1400
|
|
|
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
1401
|
/**
|
|
1097
|
-
*
|
|
1098
|
-
*
|
|
1099
|
-
* @
|
|
1402
|
+
* Discovers the intersections of the chunk sets that are not chunk sets
|
|
1403
|
+
* themselves, and groups them by the sets holding all of their chunks.
|
|
1404
|
+
* @param {ChunkSetsInGraph} chunkSets the chunk sets in the graph
|
|
1405
|
+
* @param {ChunkSet} singleChunkSets the chunks holding modules of their own
|
|
1406
|
+
* @param {Map<bigint | Chunk, number> | undefined} sizeByKey size of the modules behind each chunk set
|
|
1407
|
+
* @param {IntersectionSettings} settings what the cache groups taking them allow
|
|
1408
|
+
* @returns {Map<bigint | Chunk, ChunkSet[]>} intersections by the key of each set holding them
|
|
1100
1409
|
*/
|
|
1101
|
-
const
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
|
|
1410
|
+
const discoverChunkSetIntersections = (
|
|
1411
|
+
chunkSets,
|
|
1412
|
+
singleChunkSets,
|
|
1413
|
+
sizeByKey,
|
|
1414
|
+
settings
|
|
1415
|
+
) => {
|
|
1416
|
+
/** @type {Map<bigint | Chunk, ChunkSet[]>} */
|
|
1417
|
+
const result = new Map();
|
|
1418
|
+
if (chunkSets.size < 2) return result;
|
|
1419
|
+
// Widest sets first, so a limit keeps the intersections reaching the most
|
|
1420
|
+
// chunks, and by key after that, so no module order reaches the result
|
|
1421
|
+
/** @type {(bigint | Chunk)[]} */
|
|
1422
|
+
const keys = [...chunkSets.keys()].sort((a, b) => {
|
|
1423
|
+
const countDiff =
|
|
1424
|
+
/** @type {ChunkSet} */ (chunkSets.get(b)).size -
|
|
1425
|
+
/** @type {ChunkSet} */ (chunkSets.get(a)).size;
|
|
1426
|
+
if (countDiff !== 0) return countDiff;
|
|
1427
|
+
return a < b ? -1 : 1;
|
|
1428
|
+
});
|
|
1429
|
+
// A chunk of its own is keyed by the chunk, so what holds both is wider
|
|
1430
|
+
// than what the graph's chunk sets are keyed by
|
|
1431
|
+
let memberCount = 0;
|
|
1432
|
+
for (const set of chunkSets.values()) memberCount += set.size;
|
|
1433
|
+
// A one chunk intersection holds only what a chunk of its own already holds,
|
|
1434
|
+
// so those sets are inputs for what they weigh and the sets holding them
|
|
1435
|
+
const multiSetCount = keys.length;
|
|
1436
|
+
if (settings.minMembers < 2) {
|
|
1437
|
+
for (const chunk of singleChunkSets) keys.push(chunk);
|
|
1438
|
+
memberCount += keys.length - multiSetCount;
|
|
1439
|
+
}
|
|
1440
|
+
const setCount = keys.length;
|
|
1441
|
+
const offsets = new Int32Array(setCount + 1);
|
|
1442
|
+
const members = new Int32Array(memberCount);
|
|
1443
|
+
const sizes =
|
|
1444
|
+
sizeByKey === undefined ? undefined : new Float64Array(setCount);
|
|
1445
|
+
let cursor = 0;
|
|
1446
|
+
for (let i = 0; i < setCount; i++) {
|
|
1447
|
+
const key = keys[i];
|
|
1448
|
+
if (sizes !== undefined) {
|
|
1449
|
+
sizes[i] =
|
|
1450
|
+
/** @type {Map<bigint | Chunk, number>} */ (sizeByKey).get(
|
|
1451
|
+
key
|
|
1452
|
+
) || 0;
|
|
1453
|
+
}
|
|
1454
|
+
offsets[i] = cursor;
|
|
1455
|
+
if (i < multiSetCount) {
|
|
1456
|
+
for (const chunk of /** @type {ChunkSet} */ (
|
|
1457
|
+
chunkSets.get(/** @type {bigint} */ (key))
|
|
1458
|
+
)) {
|
|
1459
|
+
members[cursor++] = /** @type {number} */ (
|
|
1460
|
+
intersectionChunkIndices.get(chunk)
|
|
1461
|
+
);
|
|
1462
|
+
}
|
|
1463
|
+
} else {
|
|
1464
|
+
members[cursor++] = /** @type {number} */ (
|
|
1465
|
+
intersectionChunkIndices.get(/** @type {Chunk} */ (key))
|
|
1466
|
+
);
|
|
1110
1467
|
}
|
|
1111
|
-
|
|
1468
|
+
offsets[i + 1] = cursor;
|
|
1112
1469
|
}
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1470
|
+
const { intersections, capped } = discoverIntersections({
|
|
1471
|
+
setCount,
|
|
1472
|
+
memberCount: intersectionChunkIndices.size,
|
|
1473
|
+
offsets,
|
|
1474
|
+
members,
|
|
1475
|
+
depth: dedupDepth,
|
|
1476
|
+
minMembers: settings.minMembers,
|
|
1477
|
+
sizes,
|
|
1478
|
+
minSize: settings.minSize,
|
|
1479
|
+
maxIntersections: MAX_INTERSECTIONS,
|
|
1480
|
+
maxWork: MAX_INTERSECTION_WORK
|
|
1481
|
+
});
|
|
1482
|
+
if (capped) {
|
|
1483
|
+
logger.warn(
|
|
1484
|
+
`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.`
|
|
1485
|
+
);
|
|
1486
|
+
}
|
|
1487
|
+
const chunkList = /** @type {Chunk[]} */ (intersectionChunks);
|
|
1488
|
+
for (const { members: chunkIndices, support } of intersections) {
|
|
1489
|
+
/** @type {ChunkSet} */
|
|
1490
|
+
const intersection = new Set();
|
|
1491
|
+
for (const index of chunkIndices) {
|
|
1492
|
+
intersection.add(chunkList[index]);
|
|
1493
|
+
}
|
|
1494
|
+
for (const set of support) {
|
|
1495
|
+
// The one intersection a single chunk could hold is that chunk, which
|
|
1496
|
+
// is a combination of its modules already
|
|
1497
|
+
if (set >= multiSetCount) continue;
|
|
1498
|
+
const key = keys[set];
|
|
1499
|
+
const held = result.get(key);
|
|
1500
|
+
if (held === undefined) result.set(key, [intersection]);
|
|
1501
|
+
else held.push(intersection);
|
|
1118
1502
|
}
|
|
1119
|
-
group.signatures = signatures;
|
|
1120
1503
|
}
|
|
1121
|
-
return
|
|
1504
|
+
return result;
|
|
1122
1505
|
};
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
|
|
1126
|
-
|
|
1127
|
-
);
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1506
|
+
|
|
1507
|
+
// How many combinations of each chunk set are chunk sets in the graph, for the
|
|
1508
|
+
// cache groups that take no intersections. Missing means all of them.
|
|
1509
|
+
/** @type {Map<Combinations, number>} */
|
|
1510
|
+
const originalCombinationCounts = new Map();
|
|
1511
|
+
/** @type {Map<Combinations, number>} */
|
|
1512
|
+
const originalExportsCombinationCounts = new Map();
|
|
1513
|
+
|
|
1514
|
+
// TODO rebuild the candidates per cache group priority, from the
|
|
1515
|
+
// module chunk edges the priorities before it left, as rspack does
|
|
1516
|
+
const getIntersectionsByChunkSetKey = memoize(() => {
|
|
1517
|
+
const { chunkSetsInGraph, singleChunkSets, sizeByKey } =
|
|
1518
|
+
getChunkSetsInGraph();
|
|
1519
|
+
return discoverChunkSetIntersections(
|
|
1520
|
+
chunkSetsInGraph,
|
|
1521
|
+
singleChunkSets,
|
|
1522
|
+
sizeByKey,
|
|
1523
|
+
/** @type {IntersectionSettings} */ (intersectionSettings)
|
|
1524
|
+
);
|
|
1525
|
+
});
|
|
1526
|
+
const getExportsIntersectionsByChunkSetKey = memoize(() => {
|
|
1527
|
+
const { chunkSetsInGraph, singleChunkSets, sizeByKey } =
|
|
1528
|
+
getExportsChunkSetsInGraph();
|
|
1529
|
+
return discoverChunkSetIntersections(
|
|
1530
|
+
chunkSetsInGraph,
|
|
1531
|
+
singleChunkSets,
|
|
1532
|
+
sizeByKey,
|
|
1533
|
+
/** @type {IntersectionSettings} */ (exportsIntersectionSettings)
|
|
1534
|
+
);
|
|
1535
|
+
});
|
|
1133
1536
|
|
|
1134
1537
|
/** @typedef {(ChunkSet | Chunk)[]} Combinations */
|
|
1135
1538
|
|
|
1539
|
+
/**
|
|
1540
|
+
* Where a chunk set's own combinations end, for a cache group that
|
|
1541
|
+
* takes no intersection.
|
|
1542
|
+
* @param {Combinations} combinations the combinations
|
|
1543
|
+
* @param {boolean} withIntersections whether the group takes the intersections too
|
|
1544
|
+
* @param {Map<Combinations, number>} originalCounts how many of them are chunk sets themselves
|
|
1545
|
+
* @returns {number} where to stop
|
|
1546
|
+
*/
|
|
1547
|
+
const originalCombinationCount = (
|
|
1548
|
+
combinations,
|
|
1549
|
+
withIntersections,
|
|
1550
|
+
originalCounts
|
|
1551
|
+
) => {
|
|
1552
|
+
if (withIntersections || originalCounts.size === 0) {
|
|
1553
|
+
return combinations.length;
|
|
1554
|
+
}
|
|
1555
|
+
const originals = originalCounts.get(combinations);
|
|
1556
|
+
return originals === undefined ? combinations.length : originals;
|
|
1557
|
+
};
|
|
1558
|
+
|
|
1559
|
+
/**
|
|
1560
|
+
* Appends the intersections a chunk set holds to its combinations.
|
|
1561
|
+
* @param {bigint | Chunk} key key of the chunk set
|
|
1562
|
+
* @param {Combinations} combinations its combinations
|
|
1563
|
+
* @param {() => Map<bigint | Chunk, ChunkSet[]>} getIntersectionsByKey takes the intersections held by each chunk set
|
|
1564
|
+
* @param {Map<Combinations, number>} originalCounts takes how many of them are chunk sets themselves
|
|
1565
|
+
* @returns {void}
|
|
1566
|
+
*/
|
|
1567
|
+
const appendIntersections = (
|
|
1568
|
+
key,
|
|
1569
|
+
combinations,
|
|
1570
|
+
getIntersectionsByKey,
|
|
1571
|
+
originalCounts
|
|
1572
|
+
) => {
|
|
1573
|
+
// The chunk sets stay in front, so a cache group taking no
|
|
1574
|
+
// intersection reads only up to their count
|
|
1575
|
+
originalCounts.set(combinations, combinations.length);
|
|
1576
|
+
const intersections = getIntersectionsByKey().get(key);
|
|
1577
|
+
if (intersections === undefined) return;
|
|
1578
|
+
for (const intersection of intersections) {
|
|
1579
|
+
combinations.push(intersection);
|
|
1580
|
+
}
|
|
1581
|
+
};
|
|
1582
|
+
|
|
1136
1583
|
// Create a list of possible combinations
|
|
1137
1584
|
/**
|
|
1138
1585
|
* Creates a get combinations.
|
|
1139
1586
|
* @param {ChunkSetsInGraph} chunkSets chunk sets
|
|
1140
|
-
* @param {
|
|
1141
|
-
* @param {
|
|
1142
|
-
* @
|
|
1587
|
+
* @param {ChunkSetIndex} index the chunk sets a combination is taken from
|
|
1588
|
+
* @param {(() => Map<bigint | Chunk, ChunkSet[]>) | undefined} getIntersectionsByKey takes the intersections held by each chunk set, on the first cache group asking for them
|
|
1589
|
+
* @param {Map<Combinations, number>} originalCounts takes how many of a chunk set's combinations are chunk sets themselves
|
|
1590
|
+
* @returns {(key: bigint | Chunk, withIntersections: boolean) => Combinations} combinations
|
|
1143
1591
|
*/
|
|
1144
1592
|
const createGetCombinations = (
|
|
1145
1593
|
chunkSets,
|
|
1146
|
-
|
|
1147
|
-
|
|
1594
|
+
index,
|
|
1595
|
+
getIntersectionsByKey,
|
|
1596
|
+
originalCounts
|
|
1148
1597
|
) => {
|
|
1598
|
+
const { sets, setsByRarestChunk, singleOrder } = index;
|
|
1149
1599
|
/** @type {Map<bigint | Chunk, Combinations>} */
|
|
1150
1600
|
const combinationsCache = new Map();
|
|
1151
1601
|
|
|
1152
|
-
return (key) => {
|
|
1602
|
+
return (key, withIntersections) => {
|
|
1153
1603
|
const cacheEntry = combinationsCache.get(key);
|
|
1154
|
-
if (cacheEntry !== undefined)
|
|
1155
|
-
|
|
1604
|
+
if (cacheEntry !== undefined) {
|
|
1605
|
+
// Nothing is discovered until a cache group that takes the
|
|
1606
|
+
// intersections reaches a chunk set of more than one chunk
|
|
1607
|
+
if (
|
|
1608
|
+
withIntersections &&
|
|
1609
|
+
getIntersectionsByKey !== undefined &&
|
|
1610
|
+
cacheEntry[0] instanceof Set &&
|
|
1611
|
+
!originalCounts.has(cacheEntry)
|
|
1612
|
+
) {
|
|
1613
|
+
appendIntersections(
|
|
1614
|
+
key,
|
|
1615
|
+
cacheEntry,
|
|
1616
|
+
getIntersectionsByKey,
|
|
1617
|
+
originalCounts
|
|
1618
|
+
);
|
|
1619
|
+
}
|
|
1620
|
+
return cacheEntry;
|
|
1621
|
+
}
|
|
1622
|
+
if (typeof key !== "bigint") {
|
|
1156
1623
|
const result = [key];
|
|
1157
1624
|
combinationsCache.set(key, result);
|
|
1158
1625
|
return result;
|
|
@@ -1162,72 +1629,90 @@ class SplitChunksPlugin {
|
|
|
1162
1629
|
(chunkSets.get(key));
|
|
1163
1630
|
/** @type {Combinations} */
|
|
1164
1631
|
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
|
-
}
|
|
1632
|
+
// A subset holds the chunk fewest sets hold of it, so only the sets
|
|
1633
|
+
// indexed under a chunk of this one can be one
|
|
1634
|
+
/** @type {number[]} */
|
|
1635
|
+
const subsets = [];
|
|
1636
|
+
for (const chunk of chunksSet) {
|
|
1637
|
+
const indices = setsByRarestChunk.get(chunk);
|
|
1638
|
+
if (indices === undefined) continue;
|
|
1639
|
+
for (const candidate of indices) {
|
|
1640
|
+
const set = sets[candidate];
|
|
1641
|
+
// "equal" is not needed because they would have been merge in the first step
|
|
1642
|
+
if (set.size < chunksSet.size && isSubset(chunksSet, set)) {
|
|
1643
|
+
subsets.push(candidate);
|
|
1186
1644
|
}
|
|
1187
1645
|
}
|
|
1188
1646
|
}
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
|
|
1647
|
+
// Combined in the order they were indexed in, smaller counts first
|
|
1648
|
+
if (subsets.length > 1) subsets.sort((a, b) => a - b);
|
|
1649
|
+
for (const candidate of subsets) array.push(sets[candidate]);
|
|
1650
|
+
/** @type {Chunk[]} */
|
|
1651
|
+
const singles = [];
|
|
1652
|
+
for (const chunk of chunksSet) {
|
|
1653
|
+
if (singleOrder.has(chunk)) singles.push(chunk);
|
|
1193
1654
|
}
|
|
1655
|
+
if (singles.length > 1) {
|
|
1656
|
+
singles.sort(
|
|
1657
|
+
(a, b) =>
|
|
1658
|
+
/** @type {number} */ (singleOrder.get(a)) -
|
|
1659
|
+
/** @type {number} */ (singleOrder.get(b))
|
|
1660
|
+
);
|
|
1661
|
+
}
|
|
1662
|
+
for (const chunk of singles) array.push(chunk);
|
|
1194
1663
|
combinationsCache.set(key, array);
|
|
1664
|
+
if (withIntersections && getIntersectionsByKey !== undefined) {
|
|
1665
|
+
appendIntersections(
|
|
1666
|
+
key,
|
|
1667
|
+
array,
|
|
1668
|
+
getIntersectionsByKey,
|
|
1669
|
+
originalCounts
|
|
1670
|
+
);
|
|
1671
|
+
}
|
|
1195
1672
|
return array;
|
|
1196
1673
|
};
|
|
1197
1674
|
};
|
|
1198
1675
|
|
|
1199
1676
|
const getCombinationsFactory = memoize(() => {
|
|
1200
|
-
const { chunkSetsInGraph
|
|
1677
|
+
const { chunkSetsInGraph } = getChunkSetsInGraph();
|
|
1201
1678
|
return createGetCombinations(
|
|
1202
1679
|
chunkSetsInGraph,
|
|
1203
|
-
|
|
1204
|
-
|
|
1680
|
+
getChunkSetIndex(),
|
|
1681
|
+
intersectionSettings === undefined
|
|
1682
|
+
? undefined
|
|
1683
|
+
: getIntersectionsByChunkSetKey,
|
|
1684
|
+
originalCombinationCounts
|
|
1205
1685
|
);
|
|
1206
1686
|
});
|
|
1207
1687
|
|
|
1208
1688
|
/**
|
|
1209
1689
|
* Returns combinations by key.
|
|
1210
1690
|
* @param {bigint | Chunk} key key
|
|
1691
|
+
* @param {boolean} withIntersections whether to take the intersections of the chunk sets too
|
|
1211
1692
|
* @returns {Combinations} combinations by key
|
|
1212
1693
|
*/
|
|
1213
|
-
const getCombinations = (key) =>
|
|
1694
|
+
const getCombinations = (key, withIntersections) =>
|
|
1695
|
+
getCombinationsFactory()(key, withIntersections);
|
|
1214
1696
|
|
|
1215
1697
|
const getExportsCombinationsFactory = memoize(() => {
|
|
1216
|
-
const { chunkSetsInGraph
|
|
1217
|
-
getExportsChunkSetsInGraph();
|
|
1698
|
+
const { chunkSetsInGraph } = getExportsChunkSetsInGraph();
|
|
1218
1699
|
return createGetCombinations(
|
|
1219
1700
|
chunkSetsInGraph,
|
|
1220
|
-
|
|
1221
|
-
|
|
1701
|
+
getExportsChunkSetIndex(),
|
|
1702
|
+
exportsIntersectionSettings === undefined
|
|
1703
|
+
? undefined
|
|
1704
|
+
: getExportsIntersectionsByChunkSetKey,
|
|
1705
|
+
originalExportsCombinationCounts
|
|
1222
1706
|
);
|
|
1223
1707
|
});
|
|
1224
1708
|
/**
|
|
1225
1709
|
* Gets exports combinations.
|
|
1226
1710
|
* @param {bigint | Chunk} key key
|
|
1711
|
+
* @param {boolean} withIntersections whether to take the intersections of the chunk sets too
|
|
1227
1712
|
* @returns {Combinations} exports combinations by key
|
|
1228
1713
|
*/
|
|
1229
|
-
const getExportsCombinations = (key) =>
|
|
1230
|
-
getExportsCombinationsFactory()(key);
|
|
1714
|
+
const getExportsCombinations = (key, withIntersections) =>
|
|
1715
|
+
getExportsCombinationsFactory()(key, withIntersections);
|
|
1231
1716
|
|
|
1232
1717
|
/**
|
|
1233
1718
|
* Defines the selected chunks result type used by this module.
|
|
@@ -1260,7 +1745,7 @@ class SplitChunksPlugin {
|
|
|
1260
1745
|
if (entry2 === undefined) {
|
|
1261
1746
|
/** @type {Chunk[]} */
|
|
1262
1747
|
const selectedChunks = [];
|
|
1263
|
-
if (chunks instanceof
|
|
1748
|
+
if (!(chunks instanceof Set)) {
|
|
1264
1749
|
if (chunkFilter(chunks)) selectedChunks.push(chunks);
|
|
1265
1750
|
} else {
|
|
1266
1751
|
for (const chunk of chunks) {
|
|
@@ -1438,32 +1923,77 @@ class SplitChunksPlugin {
|
|
|
1438
1923
|
/**
|
|
1439
1924
|
* Returns combinations of the chunks the module is in.
|
|
1440
1925
|
* @param {Module} module the module
|
|
1926
|
+
* @param {boolean} withIntersections whether to take the intersections of the chunk sets too
|
|
1441
1927
|
* @returns {Combinations} chunk combinations
|
|
1442
1928
|
*/
|
|
1443
|
-
const computeCombinations = (module) =>
|
|
1444
|
-
getCombinations(
|
|
1929
|
+
const computeCombinations = (module, withIntersections) =>
|
|
1930
|
+
getCombinations(
|
|
1931
|
+
getKey(chunkGraph.getModuleChunksIterable(module)),
|
|
1932
|
+
withIntersections
|
|
1933
|
+
);
|
|
1445
1934
|
|
|
1446
1935
|
/**
|
|
1447
|
-
* Returns combinations of the module's chunks grouped by used exports.
|
|
1936
|
+
* Returns combinations of the module's chunks grouped by used exports. A
|
|
1937
|
+
* module whose chunks all use the same exports takes the combinations of that
|
|
1938
|
+
* one group as they are, without a copy to merge into.
|
|
1448
1939
|
* @param {Module} module the module
|
|
1449
|
-
* @
|
|
1940
|
+
* @param {boolean} withIntersections whether to take the intersections of the chunk sets too
|
|
1941
|
+
* @returns {Combinations} chunk combinations
|
|
1450
1942
|
*/
|
|
1451
|
-
const computeCombinationsByUsedExports = (
|
|
1943
|
+
const computeCombinationsByUsedExports = (
|
|
1944
|
+
module,
|
|
1945
|
+
withIntersections
|
|
1946
|
+
) => {
|
|
1452
1947
|
// fill the groupedByExportsMap
|
|
1453
1948
|
getExportsChunkSetsInGraph();
|
|
1454
|
-
/** @type {Set<ChunkSet | Chunk>} */
|
|
1455
|
-
const set = new Set();
|
|
1456
1949
|
const groupedByUsedExports =
|
|
1457
|
-
/** @type {
|
|
1950
|
+
/** @type {Chunk[][]} */
|
|
1458
1951
|
(groupedByExportsMap.get(module));
|
|
1952
|
+
if (groupedByUsedExports.length === 1) {
|
|
1953
|
+
return getExportsCombinations(
|
|
1954
|
+
getKey(groupedByUsedExports[0]),
|
|
1955
|
+
withIntersections
|
|
1956
|
+
);
|
|
1957
|
+
}
|
|
1958
|
+
/** @type {Combinations} */
|
|
1959
|
+
const array = [];
|
|
1960
|
+
/** @type {Set<ChunkSet | Chunk>} */
|
|
1961
|
+
const seen = new Set();
|
|
1459
1962
|
for (const chunks of groupedByUsedExports) {
|
|
1460
|
-
|
|
1461
|
-
|
|
1963
|
+
const combinations = getExportsCombinations(
|
|
1964
|
+
getKey(chunks),
|
|
1965
|
+
withIntersections
|
|
1966
|
+
);
|
|
1967
|
+
const end = originalCombinationCount(
|
|
1968
|
+
combinations,
|
|
1969
|
+
withIntersections,
|
|
1970
|
+
originalExportsCombinationCounts
|
|
1971
|
+
);
|
|
1972
|
+
for (let i = 0; i < end; i++) {
|
|
1973
|
+
const combination = combinations[i];
|
|
1974
|
+
const known = seen.size;
|
|
1975
|
+
seen.add(combination);
|
|
1976
|
+
if (seen.size !== known) array.push(combination);
|
|
1462
1977
|
}
|
|
1463
1978
|
}
|
|
1464
|
-
return
|
|
1979
|
+
return array;
|
|
1465
1980
|
};
|
|
1466
1981
|
|
|
1982
|
+
/**
|
|
1983
|
+
* Whether a cache group puts the intersections of the chunk sets to use. Only
|
|
1984
|
+
* one naming its chunk after the modules it takes, and holding out for a size,
|
|
1985
|
+
* can group modules that no chunk set holds together.
|
|
1986
|
+
* @param {CacheGroup} cacheGroup the cache group
|
|
1987
|
+
* @returns {boolean} true when it takes them
|
|
1988
|
+
*/
|
|
1989
|
+
const takesIntersections = (cacheGroup) =>
|
|
1990
|
+
intersectionChunks !== undefined &&
|
|
1991
|
+
(cacheGroup.usedExports
|
|
1992
|
+
? exportsIntersectionSettings
|
|
1993
|
+
: intersectionSettings) !== undefined &&
|
|
1994
|
+
cacheGroup.getName === defaultGetName &&
|
|
1995
|
+
(cacheGroup._validateSize || cacheGroup._validateSizeReduction);
|
|
1996
|
+
|
|
1467
1997
|
logger.timeEnd("prepare");
|
|
1468
1998
|
|
|
1469
1999
|
logger.time("modules");
|
|
@@ -1479,31 +2009,59 @@ class SplitChunksPlugin {
|
|
|
1479
2009
|
// Computed at most once per module, on first use by a cache group
|
|
1480
2010
|
/** @type {Combinations | undefined} */
|
|
1481
2011
|
let combsCache;
|
|
1482
|
-
|
|
2012
|
+
let combsCacheHasIntersections = false;
|
|
2013
|
+
/** @type {(Combinations | undefined)[] | undefined} */
|
|
1483
2014
|
let combsByUsedExportsCache;
|
|
1484
2015
|
|
|
1485
2016
|
let cacheGroupIndex = 0;
|
|
1486
2017
|
for (const cacheGroupSource of cacheGroups) {
|
|
1487
2018
|
const cacheGroup = this._getCacheGroup(cacheGroupSource);
|
|
1488
|
-
|
|
2019
|
+
const withIntersections = takesIntersections(cacheGroup);
|
|
2020
|
+
/** @type {Combinations} */
|
|
1489
2021
|
let combs;
|
|
2022
|
+
let end;
|
|
1490
2023
|
if (cacheGroup.usedExports) {
|
|
1491
2024
|
if (combsByUsedExportsCache === undefined) {
|
|
1492
|
-
combsByUsedExportsCache =
|
|
1493
|
-
computeCombinationsByUsedExports(module);
|
|
2025
|
+
combsByUsedExportsCache = [];
|
|
1494
2026
|
}
|
|
1495
|
-
|
|
2027
|
+
const index = withIntersections ? 1 : 0;
|
|
2028
|
+
let cached = combsByUsedExportsCache[index];
|
|
2029
|
+
if (cached === undefined) {
|
|
2030
|
+
cached = computeCombinationsByUsedExports(
|
|
2031
|
+
module,
|
|
2032
|
+
withIntersections
|
|
2033
|
+
);
|
|
2034
|
+
combsByUsedExportsCache[index] = cached;
|
|
2035
|
+
}
|
|
2036
|
+
combs = cached;
|
|
2037
|
+
// The intersections trail the chunk sets, so a cache group that takes
|
|
2038
|
+
// none of them stops where they begin
|
|
2039
|
+
end = originalCombinationCount(
|
|
2040
|
+
combs,
|
|
2041
|
+
withIntersections,
|
|
2042
|
+
originalExportsCombinationCounts
|
|
2043
|
+
);
|
|
1496
2044
|
} else {
|
|
1497
|
-
if (
|
|
1498
|
-
combsCache
|
|
2045
|
+
if (
|
|
2046
|
+
combsCache === undefined ||
|
|
2047
|
+
(withIntersections && !combsCacheHasIntersections)
|
|
2048
|
+
) {
|
|
2049
|
+
combsCache = computeCombinations(module, withIntersections);
|
|
2050
|
+
combsCacheHasIntersections = withIntersections;
|
|
1499
2051
|
}
|
|
1500
2052
|
combs = combsCache;
|
|
2053
|
+
end = originalCombinationCount(
|
|
2054
|
+
combs,
|
|
2055
|
+
withIntersections,
|
|
2056
|
+
originalCombinationCounts
|
|
2057
|
+
);
|
|
1501
2058
|
}
|
|
1502
2059
|
// For all combination of chunk selection
|
|
1503
|
-
for (
|
|
2060
|
+
for (let i = 0; i < end; i++) {
|
|
2061
|
+
const chunkCombination = combs[i];
|
|
1504
2062
|
// Break if minimum number of chunks is not reached
|
|
1505
2063
|
const count =
|
|
1506
|
-
chunkCombination instanceof
|
|
2064
|
+
chunkCombination instanceof Set ? chunkCombination.size : 1;
|
|
1507
2065
|
if (count < cacheGroup.minChunks) continue;
|
|
1508
2066
|
// Select chunks by configuration
|
|
1509
2067
|
const { chunks: selectedChunks, key: selectedChunksKey } =
|