@depup/webpack 5.106.1-depup.0 → 5.109.2-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 +9 -11
- package/bin/webpack.js +12 -0
- package/changes.json +16 -24
- package/hot/dev-server.js +2 -0
- package/lib/APIPlugin.js +60 -35
- package/lib/AsyncDependenciesBlock.js +3 -0
- package/lib/AutomaticPrefetchPlugin.js +6 -1
- package/lib/BannerPlugin.js +13 -5
- package/lib/Cache.js +27 -5
- package/lib/CacheFacade.js +41 -0
- package/lib/Chunk.js +71 -25
- package/lib/ChunkGraph.js +153 -19
- package/lib/ChunkGroup.js +115 -28
- package/lib/ChunkTemplate.js +9 -0
- package/lib/CircularModulesPlugin.js +190 -0
- package/lib/CleanPlugin.js +27 -28
- package/lib/CodeGenerationResults.js +19 -0
- package/lib/CompatibilityPlugin.js +85 -37
- package/lib/Compilation.js +656 -112
- package/lib/Compiler.js +109 -35
- package/lib/ConcatenationScope.js +34 -4
- package/lib/ConditionalInitFragment.js +6 -0
- package/lib/ConstPlugin.js +15 -12
- package/lib/ContextExclusionPlugin.js +3 -1
- package/lib/ContextModule.js +345 -55
- package/lib/ContextModuleFactory.js +193 -51
- package/lib/ContextReplacementPlugin.js +8 -1
- package/lib/DefinePlugin.js +537 -139
- package/lib/DependenciesBlock.js +6 -1
- package/lib/Dependency.js +159 -11
- package/lib/DependencyTemplate.js +7 -1
- package/lib/DependencyTemplates.js +4 -0
- package/lib/DotenvPlugin.js +3 -0
- package/lib/DynamicEntryPlugin.js +3 -1
- package/lib/EntryOptionPlugin.js +42 -2
- package/lib/EntryPlugin.js +4 -1
- package/lib/Entrypoint.js +5 -1
- package/lib/EnvironmentPlugin.js +3 -2
- package/lib/ErrorHelpers.js +7 -0
- package/lib/EvalDevToolModulePlugin.js +3 -1
- package/lib/EvalSourceMapDevToolPlugin.js +11 -11
- package/lib/ExportsInfo.js +421 -113
- package/lib/ExportsInfoApiPlugin.js +4 -3
- package/lib/ExternalModule.js +381 -80
- package/lib/ExternalModuleFactoryPlugin.js +75 -3
- package/lib/ExternalsPlugin.js +3 -1
- package/lib/FileSystemInfo.js +701 -175
- package/lib/FlagAllModulesAsUsedPlugin.js +3 -6
- package/lib/FlagDependencyExportsPlugin.js +82 -9
- package/lib/FlagDependencyUsagePlugin.js +115 -8
- package/lib/FlagEntryExportAsUsedPlugin.js +4 -1
- package/lib/Generator.js +24 -3
- package/lib/HotModuleReplacementPlugin.js +110 -44
- package/lib/IgnorePlugin.js +5 -2
- package/lib/IgnoreWarningsPlugin.js +2 -1
- package/lib/InitFragment.js +33 -30
- package/lib/JavascriptMetaInfoPlugin.js +9 -6
- package/lib/LazyBarrel.js +389 -0
- package/lib/LibraryTemplatePlugin.js +2 -1
- package/lib/LoaderOptionsPlugin.js +3 -1
- package/lib/LoaderTargetPlugin.js +3 -1
- package/lib/MainTemplate.js +15 -0
- package/lib/ManifestPlugin.js +9 -2
- package/lib/Module.js +121 -57
- package/lib/ModuleFactory.js +6 -1
- package/lib/ModuleFilenameHelpers.js +18 -4
- package/lib/ModuleGraph.js +69 -2
- package/lib/ModuleGraphConnection.js +9 -0
- package/lib/ModuleInfoHeaderPlugin.js +5 -0
- package/lib/ModuleNotFoundError.js +3 -83
- package/lib/ModuleProfile.js +27 -1
- package/lib/ModuleSourceTypeConstants.js +52 -19
- package/lib/ModuleTemplate.js +10 -0
- package/lib/ModuleTypeConstants.js +20 -4
- package/lib/MultiCompiler.js +59 -4
- package/lib/MultiStats.js +9 -0
- package/lib/MultiWatching.js +6 -0
- package/lib/NoEmitOnErrorsPlugin.js +1 -1
- package/lib/NodeStuffPlugin.js +78 -46
- package/lib/NormalModule.js +519 -206
- package/lib/NormalModuleFactory.js +156 -31
- package/lib/NormalModuleReplacementPlugin.js +3 -1
- package/lib/NullFactory.js +1 -0
- package/lib/OptionsApply.js +1 -0
- package/lib/Parser.js +3 -1
- package/lib/PlatformPlugin.js +2 -1
- package/lib/PrefetchPlugin.js +4 -1
- package/lib/ProgressPlugin.js +351 -161
- package/lib/ProvidePlugin.js +6 -3
- package/lib/RawModule.js +32 -16
- package/lib/RecordIdsPlugin.js +9 -0
- package/lib/RequestShortener.js +8 -0
- package/lib/ResolverFactory.js +5 -0
- package/lib/RuntimeGlobals.js +58 -5
- package/lib/RuntimeModule.js +22 -7
- package/lib/RuntimePlugin.js +123 -118
- package/lib/RuntimeTemplate.js +616 -37
- package/lib/SelfModuleFactory.js +3 -0
- package/lib/SourceMapDevToolModuleOptionsPlugin.js +2 -0
- package/lib/SourceMapDevToolPlugin.js +341 -63
- package/lib/Stats.js +6 -0
- package/lib/Template.js +52 -6
- package/lib/TemplatedPathPlugin.js +505 -138
- package/lib/UseStrictPlugin.js +3 -2
- package/lib/WarnCaseSensitiveModulesPlugin.js +72 -3
- package/lib/WarnDeprecatedOptionPlugin.js +6 -2
- package/lib/WarnNoModeSetPlugin.js +18 -2
- package/lib/WatchIgnorePlugin.js +5 -1
- package/lib/Watching.js +25 -3
- package/lib/WebpackError.js +3 -74
- package/lib/WebpackIsIncludedPlugin.js +4 -2
- package/lib/WebpackOptionsApply.js +88 -25
- package/lib/WebpackOptionsDefaulter.js +1 -0
- package/lib/asset/AssetBytesGenerator.js +28 -10
- package/lib/asset/AssetBytesParser.js +1 -0
- package/lib/asset/AssetGenerator.js +199 -60
- package/lib/asset/AssetModule.js +47 -0
- package/lib/asset/AssetModulesPlugin.js +115 -24
- package/lib/asset/AssetParser.js +4 -2
- package/lib/asset/AssetSourceGenerator.js +26 -8
- package/lib/asset/AssetSourceParser.js +1 -0
- package/lib/asset/RawDataUrlModule.js +23 -13
- package/lib/asset/WebManifestGenerator.js +164 -0
- package/lib/asset/WebManifestParser.js +130 -0
- package/lib/async-modules/AsyncModuleHelpers.js +1 -0
- package/lib/async-modules/AwaitDependenciesInitFragment.js +18 -4
- package/lib/async-modules/InferAsyncModulesPlugin.js +1 -1
- package/lib/async-modules/isGeneratorLowered.js +26 -0
- package/lib/buildChunkGraph.js +107 -15
- package/lib/bun/BunTargetPlugin.js +42 -0
- package/lib/cache/AddBuildDependenciesPlugin.js +3 -1
- package/lib/cache/AddManagedPathsPlugin.js +5 -1
- package/lib/cache/IdleFileCachePlugin.js +6 -1
- package/lib/cache/MemoryCachePlugin.js +1 -1
- package/lib/cache/MemoryWithGcCachePlugin.js +4 -1
- package/lib/cache/PackFileCacheStrategy.js +302 -12
- package/lib/cache/ResolverCachePlugin.js +12 -1
- package/lib/cache/getLazyHashedEtag.js +13 -2
- package/lib/cache/mergeEtags.js +4 -0
- package/lib/cli.js +142 -20
- package/lib/config/browserslistTargetHandler.js +141 -0
- package/lib/config/defaults.js +612 -43
- package/lib/config/defineConfig.js +31 -0
- package/lib/config/normalization.js +46 -1
- package/lib/config/target.js +200 -2
- package/lib/container/ContainerEntryDependency.js +2 -0
- package/lib/container/ContainerEntryModule.js +27 -14
- package/lib/container/ContainerEntryModuleFactory.js +1 -0
- package/lib/container/ContainerExposedDependency.js +6 -2
- package/lib/container/ContainerPlugin.js +2 -1
- package/lib/container/ContainerReferencePlugin.js +3 -2
- package/lib/container/FallbackDependency.js +9 -7
- package/lib/container/FallbackItemDependency.js +1 -0
- package/lib/container/FallbackModule.js +22 -9
- package/lib/container/FallbackModuleFactory.js +1 -0
- package/lib/container/HoistContainerReferencesPlugin.js +47 -55
- package/lib/container/ModuleFederationPlugin.js +21 -29
- package/lib/container/RemoteModule.js +33 -10
- package/lib/container/RemoteRuntimeModule.js +15 -12
- package/lib/container/RemoteToExternalDependency.js +1 -0
- package/lib/container/options.js +7 -0
- package/lib/css/CssGenerator.js +540 -272
- package/lib/css/CssInjectStyleRuntimeModule.js +86 -70
- package/lib/css/CssLoadingRuntimeModule.js +173 -81
- package/lib/{CssModule.js → css/CssModule.js} +72 -37
- package/lib/css/CssModulesPlugin.js +371 -208
- package/lib/css/CssParser.js +3538 -1963
- package/lib/css/syntax.js +4155 -0
- package/lib/debug/ProfilingPlugin.js +33 -2
- package/lib/deno/DenoTargetPlugin.js +41 -0
- package/lib/dependencies/AMDDefineDependency.js +29 -17
- package/lib/dependencies/AMDDefineDependencyParserPlugin.js +19 -6
- package/lib/dependencies/AMDPlugin.js +6 -3
- package/lib/dependencies/AMDRequireArrayDependency.js +13 -11
- package/lib/dependencies/AMDRequireContextDependency.js +10 -11
- package/lib/dependencies/AMDRequireDependenciesBlock.js +1 -0
- package/lib/dependencies/AMDRequireDependenciesBlockParserPlugin.js +28 -14
- package/lib/dependencies/AMDRequireDependency.js +28 -20
- package/lib/dependencies/AMDRequireItemDependency.js +1 -0
- package/lib/dependencies/AMDRuntimeModules.js +3 -0
- package/lib/dependencies/CachedConstDependency.js +9 -1
- package/lib/dependencies/CommonJsDependencyHelpers.js +104 -0
- package/lib/dependencies/CommonJsExportRequireDependency.js +157 -38
- package/lib/dependencies/CommonJsExportsDependency.js +74 -20
- package/lib/dependencies/CommonJsExportsParserPlugin.js +246 -15
- package/lib/dependencies/CommonJsFullRequireDependency.js +91 -27
- package/lib/dependencies/CommonJsImportsParserPlugin.js +189 -24
- package/lib/dependencies/CommonJsPlugin.js +7 -4
- package/lib/dependencies/CommonJsRequireContextDependency.js +13 -13
- package/lib/dependencies/CommonJsRequireDependency.js +135 -13
- package/lib/dependencies/CommonJsSelfReferenceDependency.js +60 -16
- package/lib/dependencies/ConstDependency.js +22 -12
- package/lib/dependencies/ContextDependency.js +13 -2
- package/lib/dependencies/ContextDependencyHelpers.js +7 -4
- package/lib/dependencies/ContextDependencyTemplateAsId.js +2 -1
- package/lib/dependencies/ContextDependencyTemplateAsRequireCall.js +1 -0
- package/lib/dependencies/ContextElementDependency.js +27 -14
- package/lib/dependencies/CreateRequireParserPlugin.js +14 -7
- package/lib/dependencies/CreateScriptUrlDependency.js +9 -7
- package/lib/dependencies/CriticalDependencyWarning.js +3 -1
- package/lib/dependencies/CssIcssExportDependency.js +681 -367
- package/lib/dependencies/CssIcssImportDependency.js +62 -17
- package/lib/dependencies/CssIcssSymbolDependency.js +36 -17
- package/lib/dependencies/CssImportDependency.js +37 -1
- package/lib/dependencies/CssUrlDependency.js +87 -14
- package/lib/dependencies/DelegatedSourceDependency.js +1 -0
- package/lib/dependencies/DllEntryDependency.js +12 -13
- package/lib/dependencies/DynamicExports.js +5 -0
- package/lib/dependencies/EntryDependency.js +1 -0
- package/lib/dependencies/ExportBindingInitFragment.js +164 -0
- package/lib/dependencies/ExportsInfoDependency.js +18 -12
- package/lib/dependencies/ExternalModuleDependency.js +13 -5
- package/lib/dependencies/ExternalModuleInitFragment.js +10 -5
- package/lib/dependencies/ExternalModuleInitFragmentDependency.js +19 -12
- package/lib/dependencies/HarmonyAcceptDependency.js +24 -26
- package/lib/dependencies/HarmonyAcceptImportDependency.js +2 -0
- package/lib/dependencies/HarmonyCompatibilityDependency.js +33 -14
- package/lib/dependencies/HarmonyDetectionParserPlugin.js +108 -30
- package/lib/dependencies/HarmonyEvaluatedImportSpecifierDependency.js +34 -3
- package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +70 -33
- package/lib/dependencies/HarmonyExportExpressionDependency.js +133 -43
- package/lib/dependencies/HarmonyExportHeaderDependency.js +11 -9
- package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +268 -44
- package/lib/dependencies/HarmonyExportInitFragment.js +28 -20
- package/lib/dependencies/HarmonyExportSpecifierDependency.js +88 -18
- package/lib/dependencies/HarmonyExports.js +6 -1
- package/lib/dependencies/HarmonyImportDependency.js +60 -4
- package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +139 -146
- package/lib/dependencies/HarmonyImportGuard.js +427 -0
- package/lib/dependencies/HarmonyImportSideEffectDependency.js +22 -1
- package/lib/dependencies/HarmonyImportSpecifierDependency.js +146 -24
- package/lib/{HarmonyLinkingError.js → dependencies/HarmonyLinkingError.js} +6 -3
- package/lib/dependencies/HarmonyModulesPlugin.js +11 -1
- package/lib/dependencies/HarmonyTopLevelThisParserPlugin.js +2 -1
- package/lib/dependencies/HtmlEntryDependency.js +1295 -0
- package/lib/dependencies/HtmlInlineHtmlDependency.js +107 -0
- package/lib/dependencies/HtmlInlineScriptDependency.js +126 -0
- package/lib/dependencies/HtmlInlineStyleDependency.js +152 -0
- package/lib/dependencies/HtmlSourceDependency.js +172 -0
- package/lib/dependencies/ImportContextDependency.js +9 -9
- package/lib/dependencies/ImportDependency.js +92 -3
- package/lib/dependencies/ImportEagerDependency.js +2 -0
- package/lib/dependencies/ImportMetaContextDependency.js +1 -0
- package/lib/dependencies/ImportMetaContextDependencyParserPlugin.js +35 -19
- package/lib/dependencies/ImportMetaContextPlugin.js +40 -8
- package/lib/dependencies/ImportMetaGlobDependency.js +81 -0
- package/lib/dependencies/ImportMetaGlobDependencyParserPlugin.js +78 -0
- package/lib/dependencies/ImportMetaGlobHelpers.js +660 -0
- package/lib/dependencies/ImportMetaHotAcceptDependency.js +2 -0
- package/lib/dependencies/ImportMetaHotDeclineDependency.js +2 -0
- package/lib/dependencies/ImportMetaPlugin.js +595 -209
- package/lib/dependencies/ImportMetaResolveDependency.js +90 -0
- package/lib/dependencies/ImportParserPlugin.js +114 -27
- package/lib/dependencies/ImportPhase.js +17 -11
- package/lib/dependencies/ImportPlugin.js +2 -1
- package/lib/dependencies/ImportWeakDependency.js +3 -0
- package/lib/dependencies/JsonExportsDependency.js +15 -10
- package/lib/dependencies/LoaderDependency.js +2 -0
- package/lib/dependencies/LoaderImportDependency.js +3 -0
- package/lib/dependencies/LoaderPlugin.js +9 -2
- package/lib/dependencies/LocalModule.js +15 -12
- package/lib/dependencies/LocalModuleDependency.js +15 -13
- package/lib/dependencies/LocalModulesHelpers.js +3 -0
- package/lib/dependencies/ModuleDecoratorDependency.js +16 -10
- package/lib/dependencies/ModuleDependency.js +14 -0
- package/lib/dependencies/ModuleDependencyTemplateAsId.js +1 -0
- package/lib/dependencies/ModuleDependencyTemplateAsRequireId.js +1 -0
- package/lib/dependencies/ModuleHotAcceptDependency.js +2 -0
- package/lib/dependencies/ModuleHotDeclineDependency.js +2 -0
- package/lib/dependencies/ModuleInitFragmentDependency.js +19 -11
- package/lib/dependencies/NullDependency.js +2 -0
- package/lib/dependencies/PrefetchDependency.js +1 -0
- package/lib/dependencies/ProvidedDependency.js +36 -27
- package/lib/dependencies/PureExpressionDependency.js +14 -10
- package/lib/dependencies/RequireContextDependency.js +1 -0
- package/lib/dependencies/RequireContextDependencyParserPlugin.js +2 -1
- package/lib/dependencies/RequireContextPlugin.js +2 -1
- package/lib/dependencies/RequireEnsureDependenciesBlock.js +1 -0
- package/lib/dependencies/RequireEnsureDependenciesBlockParserPlugin.js +4 -6
- package/lib/dependencies/RequireEnsureDependency.js +16 -13
- package/lib/dependencies/RequireEnsureItemDependency.js +1 -0
- package/lib/dependencies/RequireEnsurePlugin.js +2 -1
- package/lib/dependencies/RequireHeaderDependency.js +7 -4
- package/lib/dependencies/RequireIncludeDependency.js +2 -0
- package/lib/dependencies/RequireIncludeDependencyParserPlugin.js +11 -12
- package/lib/dependencies/RequireIncludePlugin.js +2 -1
- package/lib/{RequireJsStuffPlugin.js → dependencies/RequireJsStuffPlugin.js} +9 -8
- package/lib/dependencies/RequireResolveContextDependency.js +10 -11
- package/lib/dependencies/RequireResolveDependency.js +2 -0
- package/lib/dependencies/RequireResolveHeaderDependency.js +8 -5
- package/lib/dependencies/RuntimeRequirementsDependency.js +11 -8
- package/lib/dependencies/StaticExportsDependency.js +13 -10
- package/lib/dependencies/SystemPlugin.js +9 -6
- package/lib/dependencies/SystemRuntimeModule.js +1 -0
- package/lib/dependencies/TopLevelAwaitDependency.js +93 -0
- package/lib/dependencies/URLContextDependency.js +8 -7
- package/lib/dependencies/URLDependency.js +157 -33
- package/lib/dependencies/URLPlugin.js +2 -0
- package/lib/dependencies/UnsupportedDependency.js +12 -13
- package/lib/dependencies/WebAssemblyExportImportedDependency.js +15 -16
- package/lib/dependencies/WebAssemblyImportDependency.js +19 -18
- package/lib/dependencies/WebpackIsIncludedDependency.js +3 -0
- package/lib/dependencies/{WorkerPlugin.js → WorkerAndWorkletPlugin.js} +364 -114
- package/lib/dependencies/WorkerDependency.js +111 -27
- package/lib/dependencies/WorkletDependency.js +278 -0
- package/lib/dependencies/getFunctionExpression.js +1 -0
- package/lib/dependencies/processExportInfo.js +14 -11
- package/lib/{DelegatedModule.js → dll/DelegatedModule.js} +71 -44
- package/lib/{DelegatedModuleFactoryPlugin.js → dll/DelegatedModuleFactoryPlugin.js} +27 -4
- package/lib/{DelegatedPlugin.js → dll/DelegatedPlugin.js} +5 -3
- package/lib/{DllEntryPlugin.js → dll/DllEntryPlugin.js} +9 -5
- package/lib/{DllModule.js → dll/DllModule.js} +36 -24
- package/lib/{DllModuleFactory.js → dll/DllModuleFactory.js} +5 -4
- package/lib/{DllPlugin.js → dll/DllPlugin.js} +24 -6
- package/lib/{DllReferencePlugin.js → dll/DllReferencePlugin.js} +26 -18
- package/lib/{LibManifestPlugin.js → dll/LibManifestPlugin.js} +14 -10
- package/lib/electron/ElectronTargetPlugin.js +24 -5
- package/lib/{AbstractMethodError.js → errors/AbstractMethodError.js} +10 -1
- package/lib/{AsyncDependencyToInitialChunkError.js → errors/AsyncDependencyToInitialChunkError.js} +8 -3
- package/lib/errors/BuildCycleError.js +1 -1
- package/lib/{ChunkRenderError.js → errors/ChunkRenderError.js} +1 -1
- package/lib/{CodeGenerationError.js → errors/CodeGenerationError.js} +1 -1
- package/lib/{CommentCompilationWarning.js → errors/CommentCompilationWarning.js} +9 -3
- package/lib/{ConcurrentCompilationError.js → errors/ConcurrentCompilationError.js} +5 -2
- package/lib/{EnvironmentNotSupportAsyncWarning.js → errors/EnvironmentNotSupportAsyncWarning.js} +5 -5
- package/lib/{HookWebpackError.js → errors/HookWebpackError.js} +20 -16
- package/lib/{IgnoreErrorModuleFactory.js → errors/IgnoreErrorModuleFactory.js} +7 -4
- package/lib/{InvalidDependenciesModuleWarning.js → errors/InvalidDependenciesModuleWarning.js} +6 -3
- package/lib/errors/JSONParseError.js +115 -0
- package/lib/errors/LoaderLoadingError.js +20 -0
- package/lib/{ModuleBuildError.js → errors/ModuleBuildError.js} +22 -16
- package/lib/{ModuleDependencyError.js → errors/ModuleDependencyError.js} +10 -3
- package/lib/{ModuleDependencyWarning.js → errors/ModuleDependencyWarning.js} +13 -5
- package/lib/{ModuleError.js → errors/ModuleError.js} +10 -14
- package/lib/{ModuleHashingError.js → errors/ModuleHashingError.js} +5 -1
- package/lib/errors/ModuleNotFoundError.js +94 -0
- package/lib/errors/ModuleParseError.js +141 -0
- package/lib/{ModuleRestoreError.js → errors/ModuleRestoreError.js} +4 -1
- package/lib/{ModuleStoreError.js → errors/ModuleStoreError.js} +5 -1
- package/lib/{ModuleWarning.js → errors/ModuleWarning.js} +13 -14
- package/lib/{NodeStuffInWebError.js → errors/NodeStuffInWebError.js} +7 -5
- package/lib/errors/NonErrorEmittedError.js +30 -0
- package/lib/{UnhandledSchemeError.js → errors/UnhandledSchemeError.js} +9 -2
- package/lib/{UnsupportedFeatureWarning.js → errors/UnsupportedFeatureWarning.js} +4 -3
- package/lib/errors/WebpackError.js +84 -0
- package/lib/esm/ExportWebpackRequireRuntimeModule.js +2 -0
- package/lib/esm/ModuleChunkFormatPlugin.js +52 -15
- package/lib/esm/ModuleChunkLoadingPlugin.js +11 -3
- package/lib/esm/ModuleChunkLoadingRuntimeModule.js +80 -52
- package/lib/hmr/HotModuleReplacement.runtime.js +175 -30
- package/lib/hmr/HotModuleReplacementRuntimeModule.js +8 -0
- package/lib/hmr/JavascriptHotModuleReplacement.runtime.js +173 -26
- package/lib/hmr/JavascriptHotModuleReplacementHelper.js +1 -0
- package/lib/hmr/LazyCompilationPlugin.js +154 -7
- package/lib/hmr/lazyCompilationBackend.js +53 -12
- package/lib/html/HtmlGenerator.js +1490 -0
- package/lib/html/HtmlModule.js +41 -0
- package/lib/html/HtmlModulesPlugin.js +1129 -0
- package/lib/html/HtmlParser.js +1970 -0
- package/lib/html/favicon.svg +1 -0
- package/lib/html/syntax.js +9106 -0
- package/lib/ids/ChunkModuleIdRangePlugin.js +3 -1
- package/lib/ids/DeterministicChunkIdsPlugin.js +3 -1
- package/lib/ids/DeterministicModuleIdsPlugin.js +3 -1
- package/lib/ids/HashedModuleIdsPlugin.js +2 -1
- package/lib/ids/IdHelpers.js +49 -12
- package/lib/ids/NamedChunkIdsPlugin.js +3 -1
- package/lib/ids/NamedModuleIdsPlugin.js +3 -1
- package/lib/ids/NaturalChunkIdsPlugin.js +1 -1
- package/lib/ids/NaturalModuleIdsPlugin.js +1 -1
- package/lib/ids/OccurrenceChunkIdsPlugin.js +2 -1
- package/lib/ids/OccurrenceModuleIdsPlugin.js +4 -1
- package/lib/ids/SyncModuleIdsPlugin.js +3 -1
- package/lib/index.js +66 -15
- package/lib/javascript/ArrayPushCallbackChunkFormatPlugin.js +5 -6
- package/lib/javascript/BasicEvaluatedExpression.js +370 -49
- package/lib/javascript/ChunkFormatHelpers.js +2 -1
- package/lib/javascript/ChunkHelpers.js +1 -0
- package/lib/javascript/CommonJsChunkFormatPlugin.js +1 -1
- package/lib/javascript/EnableChunkLoadingPlugin.js +6 -1
- package/lib/javascript/JavascriptGenerator.js +213 -51
- package/lib/javascript/JavascriptModule.js +54 -0
- package/lib/javascript/JavascriptModulesPlugin.js +628 -198
- package/lib/javascript/JavascriptParser.js +1334 -471
- package/lib/javascript/JavascriptParserHelpers.js +10 -7
- package/lib/javascript/StartupHelpers.js +5 -0
- package/lib/javascript/syntax.js +5037 -0
- package/lib/json/JsonData.js +5 -0
- package/lib/json/JsonGenerator.js +21 -0
- package/lib/json/JsonModule.js +40 -0
- package/lib/json/JsonModulesPlugin.js +8 -1
- package/lib/json/JsonParser.js +18 -27
- package/lib/library/AbstractLibraryPlugin.js +17 -2
- package/lib/library/AmdLibraryPlugin.js +8 -0
- package/lib/library/AssignLibraryPlugin.js +21 -3
- package/lib/library/EnableLibraryPlugin.js +8 -2
- package/lib/library/ExportPropertyLibraryPlugin.js +10 -0
- package/lib/{FalseIIFEUmdWarning.js → library/FalseIIFEUmdWarning.js} +2 -1
- package/lib/library/JsonpLibraryPlugin.js +8 -0
- package/lib/library/ModuleLibraryPlugin.js +154 -7
- package/lib/library/SystemLibraryPlugin.js +11 -3
- package/lib/library/UmdLibraryPlugin.js +16 -0
- package/lib/loaders/LoaderRunner.js +714 -0
- package/lib/loaders/loadLoader.js +100 -0
- package/lib/logging/Logger.js +17 -0
- package/lib/logging/createConsoleLogger.js +7 -0
- package/lib/logging/runtime.js +2 -0
- package/lib/logging/truncateArgs.js +2 -0
- package/lib/node/CommonJsChunkLoadingPlugin.js +5 -1
- package/lib/node/NodeEnvironmentPlugin.js +7 -3
- package/lib/node/NodeSourcePlugin.js +1 -1
- package/lib/node/NodeTargetPlugin.js +4 -63
- package/lib/node/NodeTemplatePlugin.js +3 -1
- package/lib/node/NodeWatchFileSystem.js +40 -22
- package/lib/node/ReadFileChunkLoadingRuntimeModule.js +13 -9
- package/lib/node/ReadFileCompileAsyncWasmPlugin.js +33 -3
- package/lib/node/ReadFileCompileWasmPlugin.js +28 -3
- package/lib/node/RequireChunkLoadingRuntimeModule.js +21 -16
- package/lib/node/nodeBuiltins.js +80 -0
- package/lib/node/nodeConsole.js +116 -64
- package/lib/optimize/AggressiveMergingPlugin.js +22 -16
- package/lib/optimize/AggressiveSplittingPlugin.js +6 -1
- package/lib/optimize/ConcatenatedModule.js +603 -130
- package/lib/optimize/ConstExportsPlugin.js +211 -0
- package/lib/optimize/EnsureChunkConditionsPlugin.js +2 -1
- package/lib/optimize/FlagIncludedChunksPlugin.js +15 -4
- package/lib/optimize/InlineExports.js +178 -0
- package/lib/optimize/InnerGraph.js +374 -262
- package/lib/optimize/InnerGraphPlugin.js +246 -117
- package/lib/optimize/LimitChunkCountPlugin.js +9 -0
- package/lib/optimize/MangleExportsPlugin.js +5 -1
- package/lib/optimize/MergeDuplicateChunksPlugin.js +2 -0
- package/lib/optimize/MinChunkSizePlugin.js +2 -1
- package/lib/optimize/MinMaxSizeWarning.js +5 -4
- package/lib/optimize/ModuleConcatenationPlugin.js +229 -55
- package/lib/optimize/RealContentHashPlugin.js +130 -52
- package/lib/optimize/RemoveEmptyChunksPlugin.js +2 -1
- package/lib/optimize/RemoveParentModulesPlugin.js +3 -1
- package/lib/optimize/RuntimeChunkPlugin.js +2 -1
- package/lib/optimize/SideEffectsFlagPlugin.js +381 -55
- package/lib/optimize/SplitChunksPlugin.js +200 -50
- package/lib/performance/AssetsOverSizeLimitWarning.js +3 -2
- package/lib/performance/EntrypointsOverSizeLimitWarning.js +3 -2
- package/lib/performance/NoAsyncChunksWarning.js +5 -3
- package/lib/performance/SizeLimitsPlugin.js +8 -2
- package/lib/prefetch/ChunkPrefetchFunctionRuntimeModule.js +1 -0
- package/lib/prefetch/ChunkPrefetchPreloadPlugin.js +21 -0
- package/lib/prefetch/ChunkPrefetchStartupRuntimeModule.js +1 -0
- package/lib/prefetch/ChunkPrefetchTriggerRuntimeModule.js +5 -1
- package/lib/prefetch/ChunkPreloadTriggerRuntimeModule.js +25 -13
- package/lib/prefetch/ResourceHintPlugin.js +687 -0
- package/lib/prefetch/ResourceHintRuntimeModule.js +149 -0
- package/lib/prefetch/StartupAssetHintRuntimeModule.js +210 -0
- package/lib/prefetch/parseResourceHintOptions.js +103 -0
- package/lib/rules/BasicEffectRulePlugin.js +3 -0
- package/lib/rules/BasicMatcherRulePlugin.js +3 -0
- package/lib/rules/ObjectMatcherRulePlugin.js +3 -0
- package/lib/rules/RuleSetCompiler.js +132 -0
- package/lib/rules/UseEffectRulePlugin.js +10 -3
- package/lib/runtime/AsyncModuleGeneratorRuntimeModule.js +56 -0
- package/lib/runtime/AsyncModuleRuntimeModule.js +52 -33
- package/lib/runtime/AutoPublicPathRuntimeModule.js +22 -9
- package/lib/runtime/BaseUriRuntimeModule.js +1 -0
- package/lib/runtime/ChunkNameRuntimeModule.js +1 -0
- package/lib/runtime/CommonJsWrapRuntimeModule.js +37 -0
- package/lib/runtime/CompatGetDefaultExportRuntimeModule.js +2 -1
- package/lib/runtime/CompatRuntimeModule.js +2 -0
- package/lib/runtime/CreateFakeNamespaceObjectRuntimeModule.js +7 -4
- package/lib/runtime/CreateScriptRuntimeModule.js +1 -0
- package/lib/runtime/CreateScriptUrlRuntimeModule.js +1 -0
- package/lib/runtime/DefinePropertyGettersRuntimeModule.js +34 -4
- package/lib/runtime/EnsureChunkRuntimeModule.js +1 -0
- package/lib/runtime/GetChunkFilenameRuntimeModule.js +88 -8
- package/lib/runtime/GetFullHashRuntimeModule.js +1 -0
- package/lib/runtime/GetMainFilenameRuntimeModule.js +1 -0
- package/lib/runtime/GetTrustedTypesPolicyRuntimeModule.js +2 -1
- package/lib/runtime/GetWorkletBootstrapRuntimeModule.js +59 -0
- package/lib/runtime/GlobalRuntimeModule.js +1 -0
- package/lib/runtime/HasOwnPropertyRuntimeModule.js +2 -1
- package/lib/runtime/HelperRuntimeModule.js +5 -0
- package/lib/runtime/LoadScriptRuntimeModule.js +28 -37
- package/lib/runtime/MakeDeferredNamespaceObjectRuntime.js +354 -37
- package/lib/runtime/MakeNamespaceObjectRuntimeModule.js +2 -1
- package/lib/runtime/NonceRuntimeModule.js +1 -0
- package/lib/runtime/OnChunksLoadedRuntimeModule.js +5 -4
- package/lib/runtime/PublicPathRuntimeModule.js +1 -0
- package/lib/runtime/RelativeUrlRuntimeModule.js +4 -2
- package/lib/runtime/RuntimeIdRuntimeModule.js +1 -0
- package/lib/runtime/SetAnonymousDefaultNameRuntimeModule.js +38 -0
- package/lib/runtime/StartupChunkDependenciesPlugin.js +13 -1
- package/lib/runtime/StartupChunkDependenciesRuntimeModule.js +2 -1
- package/lib/runtime/StartupEntrypointRuntimeModule.js +5 -3
- package/lib/runtime/SystemContextRuntimeModule.js +1 -0
- package/lib/runtime/ToBinaryRuntimeModule.js +1 -0
- package/lib/runtime/WorkerRuntimeModule.js +33 -0
- package/lib/schemes/DataUriPlugin.js +14 -2
- package/lib/schemes/FileUriPlugin.js +1 -1
- package/lib/schemes/HttpUriPlugin.js +86 -4
- package/lib/schemes/VirtualUrlPlugin.js +8 -4
- package/lib/serialization/AggregateErrorSerializer.js +9 -6
- package/lib/serialization/ArraySerializer.js +6 -8
- package/lib/serialization/BinaryMiddleware.js +427 -1006
- package/lib/serialization/DateObjectSerializer.js +4 -2
- package/lib/serialization/ErrorObjectSerializer.js +10 -6
- package/lib/serialization/FileMiddleware.js +345 -59
- package/lib/serialization/MapObjectSerializer.js +7 -9
- package/lib/serialization/NullPrototypeObjectSerializer.js +9 -9
- package/lib/serialization/ObjectMiddleware.js +73 -13
- package/lib/serialization/PlainObjectSerializer.js +16 -8
- package/lib/serialization/RegExpObjectSerializer.js +4 -2
- package/lib/serialization/Serializer.js +6 -0
- package/lib/serialization/SerializerMiddleware.js +14 -2
- package/lib/serialization/SetObjectSerializer.js +6 -8
- package/lib/serialization/SingleItemMiddleware.js +3 -0
- package/lib/sharing/ConsumeSharedFallbackDependency.js +1 -0
- package/lib/sharing/ConsumeSharedModule.js +21 -7
- package/lib/sharing/ConsumeSharedPlugin.js +11 -11
- package/lib/sharing/ConsumeSharedRuntimeModule.js +55 -45
- package/lib/sharing/ProvideForSharedDependency.js +1 -0
- package/lib/sharing/ProvideSharedDependency.js +34 -15
- package/lib/sharing/ProvideSharedModule.js +42 -12
- package/lib/sharing/ProvideSharedModuleFactory.js +1 -0
- package/lib/sharing/ProvideSharedPlugin.js +13 -8
- package/lib/sharing/SharePlugin.js +5 -1
- package/lib/sharing/ShareRuntimeModule.js +19 -16
- package/lib/sharing/resolveMatchedConfigs.js +6 -2
- package/lib/sharing/utils.js +9 -1
- package/lib/stats/DefaultStatsFactoryPlugin.js +289 -201
- package/lib/stats/DefaultStatsPresetPlugin.js +14 -2
- package/lib/stats/DefaultStatsPrinterPlugin.js +74 -170
- package/lib/stats/StatsFactory.js +70 -27
- package/lib/stats/StatsPrinter.js +16 -2
- package/lib/typescript/TypeScriptPlugin.js +210 -0
- package/lib/url/URLParserPlugin.js +111 -23
- package/lib/util/ArrayHelpers.js +1 -0
- package/lib/util/ArrayQueue.js +10 -5
- package/lib/util/AsyncQueue.js +154 -74
- package/lib/util/Hash.js +2 -2
- package/lib/util/IterableHelpers.js +3 -0
- package/lib/util/LazyBucketSortedSet.js +26 -0
- package/lib/util/LazySet.js +45 -4
- package/lib/util/LocConverter.js +64 -0
- package/lib/util/ParallelismFactorCalculator.js +1 -0
- package/lib/util/Queue.js +6 -3
- package/lib/util/Semaphore.js +15 -1
- package/lib/util/SetHelpers.js +4 -1
- package/lib/util/SortableSet.js +7 -1
- package/lib/util/SourceProcessor.js +119 -0
- package/lib/util/StackedCacheMap.js +20 -3
- package/lib/util/StackedMap.js +162 -43
- package/lib/util/StringXor.js +1 -1
- package/lib/util/TupleQueue.js +7 -3
- package/lib/util/TupleSet.js +14 -0
- package/lib/util/URLAbsoluteSpecifier.js +1 -0
- package/lib/util/WeakTupleMap.js +60 -1
- package/lib/util/binarySearchBounds.js +3 -2
- package/lib/util/chainedImports.js +3 -3
- package/lib/util/cleverMerge.js +19 -2
- package/lib/util/comparators.js +35 -4
- package/lib/util/compileBooleanMatcher.js +9 -0
- package/lib/util/concatenate.js +80 -24
- package/lib/util/conventions.js +46 -1
- package/lib/util/createHash.js +0 -1
- package/lib/util/createHooksRegistry.js +43 -0
- package/lib/util/createMappings.js +118 -0
- package/lib/util/dataURL.js +3 -2
- package/lib/util/deprecation.js +19 -0
- package/lib/util/deterministicGrouping.js +46 -17
- package/lib/util/extractSourceMap.js +2 -1
- package/lib/util/extractUrlAndGlobal.js +1 -0
- package/lib/util/findGraphRoots.js +7 -0
- package/lib/{formatLocation.js → util/formatLocation.js} +4 -2
- package/lib/{SizeFormatHelpers.js → util/formatSize.js} +10 -3
- package/lib/util/fs.js +87 -14
- package/lib/util/generateDebugId.js +1 -0
- package/lib/util/globUtils.js +710 -0
- package/lib/util/hash/BatchedHash.js +1 -0
- package/lib/util/hash/BulkUpdateHash.js +1 -0
- package/lib/util/hash/DebugHash.js +1 -0
- package/lib/util/hash/hash-digest.js +32 -15
- package/lib/util/hash/md4.js +1 -1
- package/lib/util/hash/wasm-hash.js +5 -0
- package/lib/util/hash/xxhash64.js +1 -1
- package/lib/util/identifier.js +118 -7
- package/lib/util/implicitTypeLoaderFallback.js +62 -0
- package/lib/util/internalSerializables.js +102 -60
- package/lib/util/magicComment.js +149 -7
- package/lib/util/makeSerializable.js +7 -0
- package/lib/util/memoize.js +2 -0
- package/lib/util/mimeTypes.js +176 -0
- package/lib/util/nonNumericOnlyHash.js +31 -1
- package/lib/util/numberHash.js +2 -2
- package/lib/util/parseJson.js +41 -0
- package/lib/util/processAsyncTree.js +8 -0
- package/lib/util/property.js +9 -2
- package/lib/util/publicPathPlaceholder.js +64 -0
- package/lib/util/registerExternalSerializer.js +24 -4
- package/lib/util/removeBOM.js +1 -0
- package/lib/util/runtime.js +32 -0
- package/lib/util/semver.js +15 -0
- package/lib/util/serialization.js +2 -0
- package/lib/util/smartGrouping.js +8 -0
- package/lib/util/source.js +23 -0
- package/lib/util/topologicalSort.js +69 -0
- package/lib/validateSchema.js +1 -0
- package/lib/wasm/EnableWasmLoadingPlugin.js +15 -1
- package/lib/wasm-async/AsyncWasmCompileRuntimeModule.js +25 -18
- package/lib/wasm-async/AsyncWasmLoadingRuntimeModule.js +34 -22
- package/lib/wasm-async/AsyncWasmModule.js +77 -0
- package/lib/wasm-async/AsyncWebAssemblyGenerator.js +6 -0
- package/lib/wasm-async/AsyncWebAssemblyJavascriptGenerator.js +6 -1
- package/lib/wasm-async/AsyncWebAssemblyModulesPlugin.js +22 -126
- package/lib/wasm-async/AsyncWebAssemblyParser.js +3 -2
- package/lib/wasm-async/UniversalCompileAsyncWasmPlugin.js +13 -2
- package/lib/wasm-sync/SyncWasmModule.js +39 -0
- package/lib/wasm-sync/UnsupportedWebAssemblyFeatureError.js +7 -3
- package/lib/wasm-sync/WasmChunkLoadingRuntimeModule.js +86 -19
- package/lib/wasm-sync/WasmFinalizeExportsPlugin.js +4 -3
- package/lib/wasm-sync/WebAssemblyGenerator.js +27 -1
- package/lib/wasm-sync/WebAssemblyInInitialChunkError.js +9 -3
- package/lib/wasm-sync/WebAssemblyJavascriptGenerator.js +4 -0
- package/lib/wasm-sync/WebAssemblyModulesPlugin.js +20 -1
- package/lib/wasm-sync/WebAssemblyParser.js +9 -3
- package/lib/wasm-sync/WebAssemblyUtils.js +2 -0
- package/lib/web/FetchCompileAsyncWasmPlugin.js +29 -1
- package/lib/web/FetchCompileWasmPlugin.js +27 -1
- package/lib/web/JsonpChunkLoadingPlugin.js +11 -1
- package/lib/web/JsonpChunkLoadingRuntimeModule.js +58 -64
- package/lib/web/JsonpTemplatePlugin.js +2 -1
- package/lib/webpack.js +78 -1
- package/lib/webworker/ImportScriptsChunkLoadingPlugin.js +10 -1
- package/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js +15 -10
- package/lib/webworker/WebWorkerTemplatePlugin.js +1 -1
- package/module.d.ts +21 -0
- package/package.json +79 -77
- package/schemas/WebpackOptions.check.js +1 -1
- package/schemas/WebpackOptions.json +1173 -80
- package/schemas/plugins/{DllPlugin.check.d.ts → HtmlGeneratorOptions.check.d.ts} +1 -1
- package/schemas/plugins/HtmlGeneratorOptions.check.js +6 -0
- package/schemas/plugins/HtmlGeneratorOptions.json +3 -0
- package/schemas/plugins/{DllReferencePlugin.check.d.ts → HtmlParserOptions.check.d.ts} +1 -1
- package/schemas/plugins/HtmlParserOptions.check.js +6 -0
- package/schemas/plugins/HtmlParserOptions.json +3 -0
- package/schemas/plugins/ProgressPlugin.check.js +1 -1
- package/schemas/plugins/ProgressPlugin.json +38 -0
- package/schemas/plugins/container/ContainerReferencePlugin.check.js +1 -1
- package/schemas/plugins/container/ContainerReferencePlugin.json +2 -0
- package/schemas/plugins/container/ExternalsType.check.js +1 -1
- package/schemas/plugins/container/ModuleFederationPlugin.check.js +1 -1
- package/schemas/plugins/container/ModuleFederationPlugin.json +2 -0
- package/schemas/plugins/css/CssAutoOrModuleParserOptions.check.d.ts +7 -0
- package/schemas/plugins/css/CssAutoOrModuleParserOptions.check.js +6 -0
- package/schemas/plugins/css/CssAutoOrModuleParserOptions.json +3 -0
- package/schemas/plugins/css/CssModuleParserOptions.check.js +1 -1
- package/schemas/plugins/css/CssParserOptions.check.js +1 -1
- package/schemas/plugins/dll/DllPlugin.check.d.ts +7 -0
- package/schemas/plugins/dll/DllReferencePlugin.check.d.ts +7 -0
- package/types.d.ts +11053 -3019
- package/lib/CaseSensitiveModulesWarning.js +0 -72
- package/lib/GraphHelpers.js +0 -46
- package/lib/ModuleParseError.js +0 -125
- package/lib/NoModeWarning.js +0 -23
- package/lib/css/CssMergeStyleSheetsRuntimeModule.js +0 -56
- package/lib/css/walkCssTokens.js +0 -1843
- package/lib/util/AppendOnlyStackedSet.js +0 -78
- /package/schemas/plugins/{DllPlugin.check.js → dll/DllPlugin.check.js} +0 -0
- /package/schemas/plugins/{DllPlugin.json → dll/DllPlugin.json} +0 -0
- /package/schemas/plugins/{DllReferencePlugin.check.js → dll/DllReferencePlugin.check.js} +0 -0
- /package/schemas/plugins/{DllReferencePlugin.json → dll/DllReferencePlugin.json} +0 -0
package/lib/ChunkGroup.js
CHANGED
|
@@ -24,9 +24,13 @@ const {
|
|
|
24
24
|
/** @typedef {{ module: Module | null, loc: DependencyLocation, request: string }} OriginRecord */
|
|
25
25
|
|
|
26
26
|
/**
|
|
27
|
+
* Describes the scheduling hints that can be attached to a chunk group.
|
|
28
|
+
* These values influence how child groups are ordered for preload/prefetch
|
|
29
|
+
* and how their fetch priority is exposed to runtime code.
|
|
27
30
|
* @typedef {object} RawChunkGroupOptions
|
|
28
31
|
* @property {number=} preloadOrder
|
|
29
32
|
* @property {number=} prefetchOrder
|
|
33
|
+
* @property {number=} cssPreloadOrder preload only the chunk's CSS (`as="style"`), not its JS
|
|
30
34
|
* @property {("low" | "high" | "auto")=} fetchPriority
|
|
31
35
|
*/
|
|
32
36
|
|
|
@@ -35,6 +39,8 @@ const {
|
|
|
35
39
|
let debugId = 5000;
|
|
36
40
|
|
|
37
41
|
/**
|
|
42
|
+
* Materializes a sortable set as an array without changing its current order.
|
|
43
|
+
* Used with `SortableSet` caches that expect a stable array result.
|
|
38
44
|
* @template T
|
|
39
45
|
* @param {SortableSet<T>} set set to convert to array.
|
|
40
46
|
* @returns {T[]} the array format of existing set
|
|
@@ -54,6 +60,8 @@ const sortById = (a, b) => {
|
|
|
54
60
|
};
|
|
55
61
|
|
|
56
62
|
/**
|
|
63
|
+
* Orders origin records by referencing module and then by source location.
|
|
64
|
+
* This keeps origin metadata deterministic for hashing and diagnostics.
|
|
57
65
|
* @param {OriginRecord} a the first comparator in sort
|
|
58
66
|
* @param {OriginRecord} b the second comparator in sort
|
|
59
67
|
* @returns {1 | -1 | 0} returns sorting order as index
|
|
@@ -66,9 +74,14 @@ const sortOrigin = (a, b) => {
|
|
|
66
74
|
return compareLocations(a.loc, b.loc);
|
|
67
75
|
};
|
|
68
76
|
|
|
77
|
+
/**
|
|
78
|
+
* Represents a connected group of chunks along with the parent/child
|
|
79
|
+
* relationships, async blocks, and traversal metadata webpack tracks for it.
|
|
80
|
+
*/
|
|
69
81
|
class ChunkGroup {
|
|
70
82
|
/**
|
|
71
|
-
* Creates
|
|
83
|
+
* Creates a chunk group and initializes the relationship sets and ordering
|
|
84
|
+
* metadata used while building and optimizing the chunk graph.
|
|
72
85
|
* @param {string | ChunkGroupOptions=} options chunk group options passed to chunkGroup
|
|
73
86
|
*/
|
|
74
87
|
constructor(options) {
|
|
@@ -113,7 +126,9 @@ class ChunkGroup {
|
|
|
113
126
|
}
|
|
114
127
|
|
|
115
128
|
/**
|
|
116
|
-
*
|
|
129
|
+
* Merges additional options into the chunk group.
|
|
130
|
+
* Order-based options are combined by taking the higher priority, while
|
|
131
|
+
* unsupported conflicts surface as an explicit error.
|
|
117
132
|
* @param {ChunkGroupOptions} options the chunkGroup options passed to addOptions
|
|
118
133
|
* @returns {void}
|
|
119
134
|
*/
|
|
@@ -146,7 +161,7 @@ class ChunkGroup {
|
|
|
146
161
|
}
|
|
147
162
|
|
|
148
163
|
/**
|
|
149
|
-
*
|
|
164
|
+
* Returns the configured name of the chunk group, if one was assigned.
|
|
150
165
|
* @returns {ChunkGroupOptions["name"]} returns the ChunkGroup name
|
|
151
166
|
*/
|
|
152
167
|
get name() {
|
|
@@ -154,7 +169,7 @@ class ChunkGroup {
|
|
|
154
169
|
}
|
|
155
170
|
|
|
156
171
|
/**
|
|
157
|
-
*
|
|
172
|
+
* Updates the configured name of the chunk group.
|
|
158
173
|
* @param {string | undefined} value the new name for ChunkGroup
|
|
159
174
|
* @returns {void}
|
|
160
175
|
*/
|
|
@@ -164,7 +179,8 @@ class ChunkGroup {
|
|
|
164
179
|
|
|
165
180
|
/* istanbul ignore next */
|
|
166
181
|
/**
|
|
167
|
-
*
|
|
182
|
+
* Returns a debug-only identifier derived from the group's member chunk
|
|
183
|
+
* debug ids. This is primarily useful in diagnostics and assertions.
|
|
168
184
|
* @returns {string} a unique concatenation of chunk debugId's
|
|
169
185
|
*/
|
|
170
186
|
get debugId() {
|
|
@@ -172,7 +188,8 @@ class ChunkGroup {
|
|
|
172
188
|
}
|
|
173
189
|
|
|
174
190
|
/**
|
|
175
|
-
*
|
|
191
|
+
* Returns an identifier derived from the ids of the chunks currently in
|
|
192
|
+
* the group.
|
|
176
193
|
* @returns {string} a unique concatenation of chunk ids
|
|
177
194
|
*/
|
|
178
195
|
get id() {
|
|
@@ -180,7 +197,8 @@ class ChunkGroup {
|
|
|
180
197
|
}
|
|
181
198
|
|
|
182
199
|
/**
|
|
183
|
-
*
|
|
200
|
+
* Moves a chunk to the front of the group or inserts it when it is not
|
|
201
|
+
* already present.
|
|
184
202
|
* @param {Chunk} chunk chunk being unshifted
|
|
185
203
|
* @returns {boolean} returns true if attempted chunk shift is accepted
|
|
186
204
|
*/
|
|
@@ -197,7 +215,8 @@ class ChunkGroup {
|
|
|
197
215
|
}
|
|
198
216
|
|
|
199
217
|
/**
|
|
200
|
-
*
|
|
218
|
+
* Inserts a chunk directly before another chunk that already belongs to the
|
|
219
|
+
* group, preserving the rest of the ordering.
|
|
201
220
|
* @param {Chunk} chunk Chunk being inserted
|
|
202
221
|
* @param {Chunk} before Placeholder/target chunk marking new chunk insertion point
|
|
203
222
|
* @returns {boolean} return true if insertion was successful
|
|
@@ -219,7 +238,7 @@ class ChunkGroup {
|
|
|
219
238
|
}
|
|
220
239
|
|
|
221
240
|
/**
|
|
222
|
-
*
|
|
241
|
+
* Appends a chunk to the group when it is not already a member.
|
|
223
242
|
* @param {Chunk} chunk chunk being pushed into ChunkGroupS
|
|
224
243
|
* @returns {boolean} returns true if chunk addition was successful.
|
|
225
244
|
*/
|
|
@@ -233,6 +252,8 @@ class ChunkGroup {
|
|
|
233
252
|
}
|
|
234
253
|
|
|
235
254
|
/**
|
|
255
|
+
* Replaces one member chunk with another while preserving the group's
|
|
256
|
+
* ordering and avoiding duplicates.
|
|
236
257
|
* @param {Chunk} oldChunk chunk to be replaced
|
|
237
258
|
* @param {Chunk} newChunk New chunk that will be replaced with
|
|
238
259
|
* @returns {boolean | undefined} returns true if the replacement was successful
|
|
@@ -256,6 +277,7 @@ class ChunkGroup {
|
|
|
256
277
|
}
|
|
257
278
|
|
|
258
279
|
/**
|
|
280
|
+
* Removes a chunk from this group.
|
|
259
281
|
* @param {Chunk} chunk chunk to remove
|
|
260
282
|
* @returns {boolean} returns true if chunk was removed
|
|
261
283
|
*/
|
|
@@ -269,6 +291,8 @@ class ChunkGroup {
|
|
|
269
291
|
}
|
|
270
292
|
|
|
271
293
|
/**
|
|
294
|
+
* Indicates whether this chunk group is loaded as part of the initial page
|
|
295
|
+
* load instead of being created lazily.
|
|
272
296
|
* @returns {boolean} true, when this chunk group will be loaded on initial page load
|
|
273
297
|
*/
|
|
274
298
|
isInitial() {
|
|
@@ -276,6 +300,7 @@ class ChunkGroup {
|
|
|
276
300
|
}
|
|
277
301
|
|
|
278
302
|
/**
|
|
303
|
+
* Adds a child chunk group to the current group.
|
|
279
304
|
* @param {ChunkGroup} group chunk group to add
|
|
280
305
|
* @returns {boolean} returns true if chunk group was added
|
|
281
306
|
*/
|
|
@@ -286,6 +311,7 @@ class ChunkGroup {
|
|
|
286
311
|
}
|
|
287
312
|
|
|
288
313
|
/**
|
|
314
|
+
* Returns the child chunk groups reachable from this group.
|
|
289
315
|
* @returns {ChunkGroup[]} returns the children of this group
|
|
290
316
|
*/
|
|
291
317
|
getChildren() {
|
|
@@ -301,6 +327,8 @@ class ChunkGroup {
|
|
|
301
327
|
}
|
|
302
328
|
|
|
303
329
|
/**
|
|
330
|
+
* Removes a child chunk group and clears the corresponding parent link on
|
|
331
|
+
* the removed child.
|
|
304
332
|
* @param {ChunkGroup} group the chunk group to remove
|
|
305
333
|
* @returns {boolean} returns true if the chunk group was removed
|
|
306
334
|
*/
|
|
@@ -315,6 +343,7 @@ class ChunkGroup {
|
|
|
315
343
|
}
|
|
316
344
|
|
|
317
345
|
/**
|
|
346
|
+
* Records a parent chunk group relationship.
|
|
318
347
|
* @param {ChunkGroup} parentChunk the parent group to be added into
|
|
319
348
|
* @returns {boolean} returns true if this chunk group was added to the parent group
|
|
320
349
|
*/
|
|
@@ -327,6 +356,7 @@ class ChunkGroup {
|
|
|
327
356
|
}
|
|
328
357
|
|
|
329
358
|
/**
|
|
359
|
+
* Returns the parent chunk groups that can lead to this group.
|
|
330
360
|
* @returns {ChunkGroup[]} returns the parents of this group
|
|
331
361
|
*/
|
|
332
362
|
getParents() {
|
|
@@ -338,6 +368,7 @@ class ChunkGroup {
|
|
|
338
368
|
}
|
|
339
369
|
|
|
340
370
|
/**
|
|
371
|
+
* Checks whether the provided group is registered as a parent.
|
|
341
372
|
* @param {ChunkGroup} parent the parent group
|
|
342
373
|
* @returns {boolean} returns true if the parent group contains this group
|
|
343
374
|
*/
|
|
@@ -350,6 +381,7 @@ class ChunkGroup {
|
|
|
350
381
|
}
|
|
351
382
|
|
|
352
383
|
/**
|
|
384
|
+
* Removes a parent chunk group and clears the reverse child relationship.
|
|
353
385
|
* @param {ChunkGroup} chunkGroup the parent group
|
|
354
386
|
* @returns {boolean} returns true if this group has been removed from the parent
|
|
355
387
|
*/
|
|
@@ -362,6 +394,7 @@ class ChunkGroup {
|
|
|
362
394
|
}
|
|
363
395
|
|
|
364
396
|
/**
|
|
397
|
+
* Registers an async entrypoint that is rooted in this chunk group.
|
|
365
398
|
* @param {Entrypoint} entrypoint entrypoint to add
|
|
366
399
|
* @returns {boolean} returns true if entrypoint was added
|
|
367
400
|
*/
|
|
@@ -376,6 +409,7 @@ class ChunkGroup {
|
|
|
376
409
|
}
|
|
377
410
|
|
|
378
411
|
/**
|
|
412
|
+
* Returns the async dependency blocks that create or reference this group.
|
|
379
413
|
* @returns {AsyncDependenciesBlock[]} an array containing the blocks
|
|
380
414
|
*/
|
|
381
415
|
getBlocks() {
|
|
@@ -387,6 +421,7 @@ class ChunkGroup {
|
|
|
387
421
|
}
|
|
388
422
|
|
|
389
423
|
/**
|
|
424
|
+
* Checks whether an async dependency block is associated with this group.
|
|
390
425
|
* @param {AsyncDependenciesBlock} block block
|
|
391
426
|
* @returns {boolean} true, if block exists
|
|
392
427
|
*/
|
|
@@ -395,6 +430,7 @@ class ChunkGroup {
|
|
|
395
430
|
}
|
|
396
431
|
|
|
397
432
|
/**
|
|
433
|
+
* Exposes the group's async dependency blocks as an iterable.
|
|
398
434
|
* @returns {Iterable<AsyncDependenciesBlock>} blocks
|
|
399
435
|
*/
|
|
400
436
|
get blocksIterable() {
|
|
@@ -402,6 +438,7 @@ class ChunkGroup {
|
|
|
402
438
|
}
|
|
403
439
|
|
|
404
440
|
/**
|
|
441
|
+
* Associates an async dependency block with this chunk group.
|
|
405
442
|
* @param {AsyncDependenciesBlock} block a block
|
|
406
443
|
* @returns {boolean} false, if block was already added
|
|
407
444
|
*/
|
|
@@ -414,6 +451,8 @@ class ChunkGroup {
|
|
|
414
451
|
}
|
|
415
452
|
|
|
416
453
|
/**
|
|
454
|
+
* Records where this chunk group originated from in user code.
|
|
455
|
+
* The origin is used for diagnostics, ordering, and reporting.
|
|
417
456
|
* @param {Module | null} module origin module
|
|
418
457
|
* @param {DependencyLocation} loc location of the reference in the origin module
|
|
419
458
|
* @param {string} request request name of the reference
|
|
@@ -428,6 +467,7 @@ class ChunkGroup {
|
|
|
428
467
|
}
|
|
429
468
|
|
|
430
469
|
/**
|
|
470
|
+
* Collects the emitted files produced by every chunk in the group.
|
|
431
471
|
* @returns {string[]} the files contained this chunk group
|
|
432
472
|
*/
|
|
433
473
|
getFiles() {
|
|
@@ -444,6 +484,9 @@ class ChunkGroup {
|
|
|
444
484
|
}
|
|
445
485
|
|
|
446
486
|
/**
|
|
487
|
+
* Disconnects this group from its parents, children, and chunks.
|
|
488
|
+
* Child groups are reconnected to this group's parents so the surrounding
|
|
489
|
+
* graph remains intact after removal.
|
|
447
490
|
* @returns {void}
|
|
448
491
|
*/
|
|
449
492
|
remove() {
|
|
@@ -503,6 +546,55 @@ class ChunkGroup {
|
|
|
503
546
|
}
|
|
504
547
|
|
|
505
548
|
/**
|
|
549
|
+
* Aggregates per-block `*Order` options for the blocks that bridge this
|
|
550
|
+
* chunk group to the given child chunk group. `*Order` options are tied to
|
|
551
|
+
* the originating `import()` call and must not be sourced from the child's
|
|
552
|
+
* shared options, otherwise a webpackPrefetch/Preload directive from one
|
|
553
|
+
* parent would leak into other parents that share the child by name.
|
|
554
|
+
* @param {ChunkGroup} childGroup the child chunk group
|
|
555
|
+
* @param {ChunkGraph} chunkGraph the chunk graph
|
|
556
|
+
* @returns {Record<string, number>} merged `*Order` options for the edge from this group to `childGroup`
|
|
557
|
+
*/
|
|
558
|
+
getChildOrderOptions(childGroup, chunkGraph) {
|
|
559
|
+
/** @type {Record<string, number>} */
|
|
560
|
+
const result = Object.create(null);
|
|
561
|
+
let bridged = false;
|
|
562
|
+
for (const block of childGroup.blocksIterable) {
|
|
563
|
+
const rootModule = /** @type {Module} */ (block.getRootBlock());
|
|
564
|
+
if (!chunkGraph.isModuleInChunkGroup(rootModule, this)) continue;
|
|
565
|
+
bridged = true;
|
|
566
|
+
const opts = block.groupOptions;
|
|
567
|
+
if (!opts) continue;
|
|
568
|
+
for (const key of Object.keys(opts)) {
|
|
569
|
+
if (!key.endsWith("Order")) continue;
|
|
570
|
+
const value =
|
|
571
|
+
/** @type {number} */
|
|
572
|
+
(opts[/** @type {keyof ChunkGroupOptions} */ (key)]);
|
|
573
|
+
if (typeof value !== "number") continue;
|
|
574
|
+
if (result[key] === undefined || value > result[key]) {
|
|
575
|
+
result[key] = value;
|
|
576
|
+
}
|
|
577
|
+
}
|
|
578
|
+
}
|
|
579
|
+
// Fall back to the child's own options only when no block bridges
|
|
580
|
+
// this edge (e.g. a chunk group created by APIs that don't go through
|
|
581
|
+
// an AsyncDependenciesBlock). Otherwise we'd reintroduce the leak.
|
|
582
|
+
if (!bridged) {
|
|
583
|
+
for (const key of Object.keys(childGroup.options)) {
|
|
584
|
+
if (!key.endsWith("Order")) continue;
|
|
585
|
+
const value =
|
|
586
|
+
childGroup.options[/** @type {keyof ChunkGroupOptions} */ (key)];
|
|
587
|
+
if (typeof value === "number") {
|
|
588
|
+
result[key] = value;
|
|
589
|
+
}
|
|
590
|
+
}
|
|
591
|
+
}
|
|
592
|
+
return result;
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
/**
|
|
596
|
+
* Groups child chunk groups by their `*Order` options and sorts each group
|
|
597
|
+
* by descending order and deterministic chunk-group comparison.
|
|
506
598
|
* @param {ModuleGraph} moduleGraph the module graph
|
|
507
599
|
* @param {ChunkGraph} chunkGraph the chunk graph
|
|
508
600
|
* @returns {Record<string, ChunkGroup[]>} mapping from children type to ordered list of ChunkGroups
|
|
@@ -511,22 +603,17 @@ class ChunkGroup {
|
|
|
511
603
|
/** @type {Map<string, { order: number, group: ChunkGroup }[]>} */
|
|
512
604
|
const lists = new Map();
|
|
513
605
|
for (const childGroup of this._children) {
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
}
|
|
521
|
-
list.push({
|
|
522
|
-
order:
|
|
523
|
-
/** @type {number} */
|
|
524
|
-
(
|
|
525
|
-
childGroup.options[/** @type {keyof ChunkGroupOptions} */ (key)]
|
|
526
|
-
),
|
|
527
|
-
group: childGroup
|
|
528
|
-
});
|
|
606
|
+
const edgeOptions = this.getChildOrderOptions(childGroup, chunkGraph);
|
|
607
|
+
for (const key of Object.keys(edgeOptions)) {
|
|
608
|
+
const name = key.slice(0, key.length - "Order".length);
|
|
609
|
+
let list = lists.get(name);
|
|
610
|
+
if (list === undefined) {
|
|
611
|
+
lists.set(name, (list = []));
|
|
529
612
|
}
|
|
613
|
+
list.push({
|
|
614
|
+
order: edgeOptions[key],
|
|
615
|
+
group: childGroup
|
|
616
|
+
});
|
|
530
617
|
}
|
|
531
618
|
}
|
|
532
619
|
/** @type {Record<string, ChunkGroup[]>} */
|
|
@@ -543,7 +630,7 @@ class ChunkGroup {
|
|
|
543
630
|
}
|
|
544
631
|
|
|
545
632
|
/**
|
|
546
|
-
*
|
|
633
|
+
* Stores the module's top-down traversal index within this group.
|
|
547
634
|
* @param {Module} module module for which the index should be set
|
|
548
635
|
* @param {number} index the index of the module
|
|
549
636
|
* @returns {void}
|
|
@@ -553,7 +640,7 @@ class ChunkGroup {
|
|
|
553
640
|
}
|
|
554
641
|
|
|
555
642
|
/**
|
|
556
|
-
*
|
|
643
|
+
* Returns the module's top-down traversal index within this group.
|
|
557
644
|
* @param {Module} module the module
|
|
558
645
|
* @returns {number | undefined} index
|
|
559
646
|
*/
|
|
@@ -562,7 +649,7 @@ class ChunkGroup {
|
|
|
562
649
|
}
|
|
563
650
|
|
|
564
651
|
/**
|
|
565
|
-
*
|
|
652
|
+
* Stores the module's bottom-up traversal index within this group.
|
|
566
653
|
* @param {Module} module module for which the index should be set
|
|
567
654
|
* @param {number} index the index of the module
|
|
568
655
|
* @returns {void}
|
|
@@ -572,7 +659,7 @@ class ChunkGroup {
|
|
|
572
659
|
}
|
|
573
660
|
|
|
574
661
|
/**
|
|
575
|
-
*
|
|
662
|
+
* Returns the module's bottom-up traversal index within this group.
|
|
576
663
|
* @param {Module} module the module
|
|
577
664
|
* @returns {number | undefined} index
|
|
578
665
|
*/
|
package/lib/ChunkTemplate.js
CHANGED
|
@@ -20,6 +20,7 @@ const memoize = require("./util/memoize");
|
|
|
20
20
|
/** @typedef {import("./ModuleTemplate")} ModuleTemplate */
|
|
21
21
|
/** @typedef {import("./javascript/JavascriptModulesPlugin").RenderContext} RenderContext */
|
|
22
22
|
/**
|
|
23
|
+
* Defines the if set type used by this module.
|
|
23
24
|
* @template T
|
|
24
25
|
* @typedef {import("tapable").IfSet<T>} IfSet
|
|
25
26
|
*/
|
|
@@ -31,6 +32,7 @@ const getJavascriptModulesPlugin = memoize(() =>
|
|
|
31
32
|
// TODO webpack 6 remove this class
|
|
32
33
|
class ChunkTemplate {
|
|
33
34
|
/**
|
|
35
|
+
* Creates an instance of ChunkTemplate.
|
|
34
36
|
* @param {OutputOptions} outputOptions output options
|
|
35
37
|
* @param {Compilation} compilation the compilation
|
|
36
38
|
*/
|
|
@@ -40,6 +42,7 @@ class ChunkTemplate {
|
|
|
40
42
|
renderManifest: {
|
|
41
43
|
tap: util.deprecate(
|
|
42
44
|
/**
|
|
45
|
+
* Handles the callback logic for this hook.
|
|
43
46
|
* @template AdditionalOptions
|
|
44
47
|
* @param {string | Tap & IfSet<AdditionalOptions>} options options
|
|
45
48
|
* @param {(renderManifestEntries: RenderManifestEntry[], renderManifestOptions: RenderManifestOptions) => RenderManifestEntry[]} fn function
|
|
@@ -60,6 +63,7 @@ class ChunkTemplate {
|
|
|
60
63
|
modules: {
|
|
61
64
|
tap: util.deprecate(
|
|
62
65
|
/**
|
|
66
|
+
* Handles the callback logic for this hook.
|
|
63
67
|
* @template AdditionalOptions
|
|
64
68
|
* @param {string | Tap & IfSet<AdditionalOptions>} options options
|
|
65
69
|
* @param {(source: Source, moduleTemplate: ModuleTemplate, renderContext: RenderContext) => Source} fn function
|
|
@@ -82,6 +86,7 @@ class ChunkTemplate {
|
|
|
82
86
|
render: {
|
|
83
87
|
tap: util.deprecate(
|
|
84
88
|
/**
|
|
89
|
+
* Handles the callback logic for this hook.
|
|
85
90
|
* @template AdditionalOptions
|
|
86
91
|
* @param {string | Tap & IfSet<AdditionalOptions>} options options
|
|
87
92
|
* @param {(source: Source, moduleTemplate: ModuleTemplate, renderContext: RenderContext) => Source} fn function
|
|
@@ -104,6 +109,7 @@ class ChunkTemplate {
|
|
|
104
109
|
renderWithEntry: {
|
|
105
110
|
tap: util.deprecate(
|
|
106
111
|
/**
|
|
112
|
+
* Handles the callback logic for this hook.
|
|
107
113
|
* @template AdditionalOptions
|
|
108
114
|
* @param {string | Tap & IfSet<AdditionalOptions>} options options
|
|
109
115
|
* @param {(source: Source, chunk: Chunk) => Source} fn function
|
|
@@ -130,6 +136,7 @@ class ChunkTemplate {
|
|
|
130
136
|
hash: {
|
|
131
137
|
tap: util.deprecate(
|
|
132
138
|
/**
|
|
139
|
+
* Handles the callback logic for this hook.
|
|
133
140
|
* @template AdditionalOptions
|
|
134
141
|
* @param {string | Tap & IfSet<AdditionalOptions>} options options
|
|
135
142
|
* @param {(hash: Hash) => void} fn function
|
|
@@ -144,6 +151,7 @@ class ChunkTemplate {
|
|
|
144
151
|
hashForChunk: {
|
|
145
152
|
tap: util.deprecate(
|
|
146
153
|
/**
|
|
154
|
+
* Handles the callback logic for this hook.
|
|
147
155
|
* @template AdditionalOptions
|
|
148
156
|
* @param {string | Tap & IfSet<AdditionalOptions>} options options
|
|
149
157
|
* @param {(hash: Hash, chunk: Chunk, chunkHashContext: ChunkHashContext) => void} fn function
|
|
@@ -167,6 +175,7 @@ class ChunkTemplate {
|
|
|
167
175
|
Object.defineProperty(ChunkTemplate.prototype, "outputOptions", {
|
|
168
176
|
get: util.deprecate(
|
|
169
177
|
/**
|
|
178
|
+
* Returns output options.
|
|
170
179
|
* @this {ChunkTemplate}
|
|
171
180
|
* @returns {OutputOptions} output options
|
|
172
181
|
*/
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
/*
|
|
2
|
+
MIT License http://www.opensource.org/licenses/mit-license.php
|
|
3
|
+
Author Natsu @xiaoxiaojx
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
"use strict";
|
|
7
|
+
|
|
8
|
+
/** @typedef {import("./Compiler")} Compiler */
|
|
9
|
+
/** @typedef {import("./ModuleGraph")} ModuleGraph */
|
|
10
|
+
/** @typedef {import("./Module")} Module */
|
|
11
|
+
/** @typedef {import("./Module").BuildInfo} BuildInfo */
|
|
12
|
+
|
|
13
|
+
const PLUGIN_NAME = "CircularModulesPlugin";
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Detects circular dependencies among synchronous module imports.
|
|
17
|
+
*
|
|
18
|
+
* Builds an adjacency layout from each module's synchronous outgoing
|
|
19
|
+
* connections (skipping weak and async-block edges), then runs an iterative
|
|
20
|
+
* SCC algorithm to find circular modules.
|
|
21
|
+
*
|
|
22
|
+
* Use the static `build()` method to create an instance. All intermediate data
|
|
23
|
+
* (adjacency layout, index mappings) is local to `build()` and released on
|
|
24
|
+
* return. The instance only holds the result.
|
|
25
|
+
*/
|
|
26
|
+
class CycleGraph {
|
|
27
|
+
/**
|
|
28
|
+
* @param {Set<Module>} circularModules modules involved in circular dependencies
|
|
29
|
+
*/
|
|
30
|
+
constructor(circularModules) {
|
|
31
|
+
/** @type {Set<Module>} */
|
|
32
|
+
this.circularModules = circularModules;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Builds a CycleGraph by constructing the synchronous outgoing-connection
|
|
37
|
+
* adjacency list and running iterative SCC to detect circular modules.
|
|
38
|
+
* @param {Iterable<Module>} modules the set of modules
|
|
39
|
+
* @param {ModuleGraph} moduleGraph the module graph
|
|
40
|
+
* @returns {CycleGraph} the result
|
|
41
|
+
*/
|
|
42
|
+
static build(modules, moduleGraph) {
|
|
43
|
+
/** @type {Module[]} */
|
|
44
|
+
const moduleList = [];
|
|
45
|
+
/** @type {Map<Module, number>} */
|
|
46
|
+
const moduleToIndex = new Map();
|
|
47
|
+
for (const module of modules) {
|
|
48
|
+
moduleToIndex.set(module, moduleList.length);
|
|
49
|
+
moduleList.push(module);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const size = moduleList.length;
|
|
53
|
+
if (size === 0) return new CycleGraph(new Set());
|
|
54
|
+
|
|
55
|
+
/** @type {number[][]} */
|
|
56
|
+
const edges = Array.from({ length: size });
|
|
57
|
+
/** @type {boolean[]} */
|
|
58
|
+
const selfLoops = Array.from({ length: size }, () => false);
|
|
59
|
+
|
|
60
|
+
for (let i = 0; i < size; i++) {
|
|
61
|
+
const module = moduleList[i];
|
|
62
|
+
/** @type {number[]} */
|
|
63
|
+
const deps = [];
|
|
64
|
+
for (const connection of moduleGraph.getOutgoingConnections(module)) {
|
|
65
|
+
const dep = connection.dependency;
|
|
66
|
+
if (!dep) continue;
|
|
67
|
+
const target = connection.module;
|
|
68
|
+
if (!target) continue;
|
|
69
|
+
// Weak references don't synchronously evaluate the target.
|
|
70
|
+
if (connection.weak) continue;
|
|
71
|
+
// Async edges (dynamic import & friends) live in AsyncDependenciesBlock,
|
|
72
|
+
// so a synchronous dep's parent block is the module itself.
|
|
73
|
+
if (moduleGraph.getParentBlock(dep) !== module) continue;
|
|
74
|
+
if (target === module) {
|
|
75
|
+
selfLoops[i] = true;
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
const targetIdx = moduleToIndex.get(target);
|
|
79
|
+
if (targetIdx !== undefined) {
|
|
80
|
+
deps.push(targetIdx);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
edges[i] = deps;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// Iterative SCC algorithm
|
|
87
|
+
/** @type {Set<Module>} */
|
|
88
|
+
const circular = new Set();
|
|
89
|
+
let nextIndex = 0;
|
|
90
|
+
const nodeIndex = new Int32Array(size).fill(-1);
|
|
91
|
+
const nodeLowLink = new Int32Array(size);
|
|
92
|
+
const nodeOnStack = new Uint8Array(size);
|
|
93
|
+
/** @type {number[]} */
|
|
94
|
+
const sccStack = [];
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* @typedef {object} Frame
|
|
98
|
+
* @property {number} node
|
|
99
|
+
* @property {number} edgeIdx
|
|
100
|
+
* @property {number} parent
|
|
101
|
+
*/
|
|
102
|
+
|
|
103
|
+
for (let root = 0; root < size; root++) {
|
|
104
|
+
if (nodeIndex[root] !== -1) continue;
|
|
105
|
+
|
|
106
|
+
nodeIndex[root] = nextIndex;
|
|
107
|
+
nodeLowLink[root] = nextIndex;
|
|
108
|
+
nextIndex++;
|
|
109
|
+
nodeOnStack[root] = 1;
|
|
110
|
+
sccStack.push(root);
|
|
111
|
+
|
|
112
|
+
/** @type {Frame[]} */
|
|
113
|
+
const callStack = [{ node: root, edgeIdx: 0, parent: -1 }];
|
|
114
|
+
|
|
115
|
+
while (callStack.length > 0) {
|
|
116
|
+
const frame = /** @type {Frame} */ (callStack[callStack.length - 1]);
|
|
117
|
+
const v = frame.node;
|
|
118
|
+
const vEdges = edges[v];
|
|
119
|
+
|
|
120
|
+
if (frame.edgeIdx < vEdges.length) {
|
|
121
|
+
const w = vEdges[frame.edgeIdx++];
|
|
122
|
+
if (nodeIndex[w] === -1) {
|
|
123
|
+
nodeIndex[w] = nextIndex;
|
|
124
|
+
nodeLowLink[w] = nextIndex;
|
|
125
|
+
nextIndex++;
|
|
126
|
+
nodeOnStack[w] = 1;
|
|
127
|
+
sccStack.push(w);
|
|
128
|
+
callStack.push({ node: w, edgeIdx: 0, parent: v });
|
|
129
|
+
} else if (nodeOnStack[w] && nodeIndex[w] < nodeLowLink[v]) {
|
|
130
|
+
nodeLowLink[v] = nodeIndex[w];
|
|
131
|
+
}
|
|
132
|
+
} else {
|
|
133
|
+
if (nodeLowLink[v] === nodeIndex[v]) {
|
|
134
|
+
/** @type {number[]} */
|
|
135
|
+
const component = [];
|
|
136
|
+
let w;
|
|
137
|
+
do {
|
|
138
|
+
w = /** @type {number} */ (sccStack.pop());
|
|
139
|
+
nodeOnStack[w] = 0;
|
|
140
|
+
component.push(w);
|
|
141
|
+
} while (w !== v);
|
|
142
|
+
|
|
143
|
+
if (component.length > 1 || selfLoops[v]) {
|
|
144
|
+
for (const idx of component) {
|
|
145
|
+
circular.add(moduleList[idx]);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
callStack.pop();
|
|
151
|
+
if (
|
|
152
|
+
frame.parent !== -1 &&
|
|
153
|
+
nodeLowLink[v] < nodeLowLink[frame.parent]
|
|
154
|
+
) {
|
|
155
|
+
nodeLowLink[frame.parent] = nodeLowLink[v];
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
return new CycleGraph(circular);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Detects circular dependencies and marks each circular module
|
|
167
|
+
* via buildInfo.isCircular for downstream consumers.
|
|
168
|
+
*/
|
|
169
|
+
class CircularModulesPlugin {
|
|
170
|
+
/**
|
|
171
|
+
* @param {Compiler} compiler the compiler instance
|
|
172
|
+
* @returns {void}
|
|
173
|
+
*/
|
|
174
|
+
apply(compiler) {
|
|
175
|
+
compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation) => {
|
|
176
|
+
compilation.hooks.optimizeModules.tap(PLUGIN_NAME, (modules) => {
|
|
177
|
+
const { circularModules } = CycleGraph.build(
|
|
178
|
+
modules,
|
|
179
|
+
compilation.moduleGraph
|
|
180
|
+
);
|
|
181
|
+
for (const m of modules) {
|
|
182
|
+
/** @type {BuildInfo} */
|
|
183
|
+
(m.buildInfo).isCircular = circularModules.has(m);
|
|
184
|
+
}
|
|
185
|
+
});
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
module.exports = CircularModulesPlugin;
|