@depup/webpack 5.109.2-depup.0 → 5.110.1-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 +5 -5
- package/changes.json +7 -7
- package/lib/APIPlugin.js +123 -17
- package/lib/AsyncDependenciesBlock.js +10 -7
- package/lib/AutomaticPrefetchPlugin.js +1 -1
- package/lib/BannerPlugin.js +10 -6
- package/lib/CacheFacade.js +6 -6
- package/lib/Chunk.js +14 -11
- package/lib/ChunkGraph.js +26 -17
- package/lib/ChunkGroup.js +7 -7
- package/lib/ChunkTemplate.js +35 -44
- package/lib/CircularModulesPlugin.js +205 -28
- package/lib/CleanPlugin.js +4 -7
- package/lib/CodeGenerationResults.js +11 -8
- package/lib/CompatibilityPlugin.js +7 -7
- package/lib/Compilation.js +688 -409
- package/lib/Compiler.js +53 -38
- package/lib/ConcatenationScope.js +117 -8
- package/lib/ConditionalInitFragment.js +3 -3
- package/lib/ConstPlugin.js +13 -11
- package/lib/ContextExclusionPlugin.js +1 -1
- package/lib/ContextModule.js +146 -54
- package/lib/ContextModuleFactory.js +46 -14
- package/lib/ContextReplacementPlugin.js +12 -14
- package/lib/DefinePlugin.js +121 -37
- package/lib/DependenciesBlock.js +9 -6
- package/lib/Dependency.js +36 -16
- package/lib/DependencyTemplate.js +11 -12
- package/lib/DependencyTemplates.js +3 -3
- package/lib/DotenvPlugin.js +50 -13
- package/lib/DynamicEntryPlugin.js +8 -4
- package/lib/EntryOptionPlugin.js +8 -4
- package/lib/EntryPlugin.js +2 -2
- package/lib/Entrypoint.js +6 -2
- package/lib/EnvironmentPlugin.js +2 -2
- package/lib/EvalDevToolModulePlugin.js +8 -4
- package/lib/EvalSourceMapDevToolPlugin.js +15 -8
- package/lib/ExportsInfo.js +101 -14
- package/lib/ExportsInfoApiPlugin.js +2 -4
- package/lib/ExternalModule.js +232 -77
- package/lib/ExternalModuleFactoryPlugin.js +97 -38
- package/lib/ExternalsPlugin.js +10 -6
- package/lib/FileSystemInfo.js +44 -70
- package/lib/FlagAllModulesAsUsedPlugin.js +2 -3
- package/lib/FlagDependencyExportsPlugin.js +76 -19
- package/lib/FlagDependencyUsagePlugin.js +32 -47
- package/lib/FlagEntryExportAsUsedPlugin.js +1 -1
- package/lib/Generator.js +36 -15
- package/lib/HotModuleReplacementPlugin.js +16 -44
- package/lib/IgnorePlugin.js +8 -4
- package/lib/IgnoreWarningsPlugin.js +2 -2
- package/lib/InitFragment.js +8 -4
- package/lib/JavascriptMetaInfoPlugin.js +35 -4
- package/lib/LazyBarrel.js +3 -4
- package/lib/LibraryTemplatePlugin.js +10 -6
- package/lib/LoaderOptionsPlugin.js +7 -3
- package/lib/LoaderTargetPlugin.js +1 -1
- package/lib/MainTemplate.js +49 -42
- package/lib/ManifestPlugin.js +12 -11
- package/lib/Module.js +62 -33
- package/lib/ModuleFactory.js +3 -3
- package/lib/ModuleFilenameHelpers.js +9 -4
- package/lib/ModuleGraph.js +195 -21
- package/lib/ModuleGraphConnection.js +6 -13
- package/lib/ModuleInfoHeaderPlugin.js +8 -10
- package/lib/ModuleTemplate.js +62 -63
- package/lib/MultiCompiler.js +130 -64
- package/lib/MultiStats.js +40 -9
- package/lib/MultiWatching.js +3 -3
- package/lib/NoEmitOnErrorsPlugin.js +1 -1
- package/lib/NodeStuffPlugin.js +29 -19
- package/lib/NormalModule.js +141 -85
- package/lib/NormalModuleFactory.js +555 -110
- package/lib/NormalModuleReplacementPlugin.js +5 -8
- package/lib/NullFactory.js +6 -2
- package/lib/OptionsApply.js +7 -3
- package/lib/Parser.js +7 -3
- package/lib/PlatformPlugin.js +2 -2
- package/lib/PrefetchPlugin.js +1 -1
- package/lib/ProgressPlugin.js +16 -13
- package/lib/ProvidePlugin.js +3 -5
- package/lib/RawModule.js +25 -17
- package/lib/RecordIdsPlugin.js +3 -3
- package/lib/RequestShortener.js +1 -1
- package/lib/ResolverFactory.js +2 -2
- package/lib/RuntimeGlobals.js +22 -10
- package/lib/RuntimeModule.js +29 -19
- package/lib/RuntimePlugin.js +332 -169
- package/lib/RuntimeTemplate.js +2792 -352
- package/lib/SelfModuleFactory.js +7 -3
- package/lib/SourceMapDevToolModuleOptionsPlugin.js +6 -2
- package/lib/SourceMapDevToolPlugin.js +30 -20
- package/lib/Stats.js +3 -4
- package/lib/Template.js +32 -22
- package/lib/TemplatedPathPlugin.js +96 -14
- package/lib/UseStrictPlugin.js +4 -6
- package/lib/WarnCaseSensitiveModulesPlugin.js +4 -4
- package/lib/WarnDeprecatedOptionPlugin.js +1 -1
- package/lib/WarnNoModeSetPlugin.js +1 -1
- package/lib/WatchIgnorePlugin.js +8 -6
- package/lib/Watching.js +8 -8
- package/lib/WebpackIsIncludedPlugin.js +2 -4
- package/lib/WebpackOptionsApply.js +308 -18
- package/lib/WebpackOptionsDefaulter.js +6 -2
- package/lib/asset/AssetBytesGenerator.js +12 -10
- package/lib/asset/AssetBytesParser.js +2 -4
- package/lib/asset/AssetGenerator.js +188 -95
- package/lib/asset/AssetModule.js +7 -3
- package/lib/asset/AssetModulesPlugin.js +110 -38
- package/lib/asset/AssetParser.js +9 -7
- package/lib/asset/AssetSourceGenerator.js +60 -13
- package/lib/asset/AssetSourceParser.js +2 -4
- package/lib/asset/RawDataUrlModule.js +24 -16
- package/lib/asset/WebManifestGenerator.js +8 -10
- package/lib/asset/WebManifestParser.js +24 -10
- package/lib/async-modules/AsyncModuleHelpers.js +2 -2
- package/lib/async-modules/AwaitDependenciesInitFragment.js +2 -2
- package/lib/async-modules/InferAsyncModulesPlugin.js +2 -2
- package/lib/async-modules/isGeneratorLowered.js +4 -4
- package/lib/buildChunkGraph.js +36 -27
- package/lib/bun/BunTargetPlugin.js +1 -1
- package/lib/cache/AddBuildDependenciesPlugin.js +1 -1
- package/lib/cache/AddManagedPathsPlugin.js +1 -1
- package/lib/cache/IdleFileCachePlugin.js +2 -2
- package/lib/cache/MemoryCachePlugin.js +18 -10
- package/lib/cache/MemoryWithGcCachePlugin.js +34 -22
- package/lib/cache/PackFileCacheStrategy.js +30 -23
- package/lib/cache/ResolverCachePlugin.js +38 -18
- package/lib/cache/getLazyHashedEtag.js +1 -2
- package/lib/cache/mergeEtags.js +1 -1
- package/lib/cli.js +1 -3
- package/lib/config/browserslistTargetHandler.js +41 -5
- package/lib/config/defaults.js +261 -79
- package/lib/config/defineConfig.js +10 -2
- package/lib/config/getClaimedAssetTypes.js +65 -0
- package/lib/config/normalization.js +36 -16
- package/lib/config/target.js +46 -3
- package/lib/container/ContainerEntryDependency.js +1 -1
- package/lib/container/ContainerEntryModule.js +24 -15
- package/lib/container/ContainerEntryModuleFactory.js +7 -3
- package/lib/container/ContainerPlugin.js +9 -10
- package/lib/container/ContainerReferencePlugin.js +6 -2
- package/lib/container/FallbackDependency.js +1 -1
- package/lib/container/FallbackModule.js +24 -17
- package/lib/container/FallbackModuleFactory.js +7 -3
- package/lib/container/HoistContainerReferencesPlugin.js +6 -11
- package/lib/container/ModuleFederationPlugin.js +7 -24
- package/lib/container/RemoteModule.js +27 -19
- package/lib/container/RemoteRuntimeModule.js +10 -8
- package/lib/container/moduleFederationHooks.js +32 -0
- package/lib/css/CssGenerator.js +171 -43
- package/lib/css/CssInjectStyleRuntimeModule.js +7 -5
- package/lib/css/CssLoadingRuntimeModule.js +57 -24
- package/lib/css/CssModule.js +10 -7
- package/lib/css/CssModulesPlugin.js +168 -88
- package/lib/css/CssParser.js +1113 -568
- package/lib/css/CssServerStylesRuntimeModule.js +54 -0
- package/lib/css/cssMinify.js +168 -0
- package/lib/css/data.js +5324 -0
- package/lib/css/syntax.js +9579 -232
- package/lib/debug/ProfilingPlugin.js +14 -9
- package/lib/deno/DenoTargetPlugin.js +1 -1
- package/lib/dependencies/AMDDefineDependency.js +112 -87
- package/lib/dependencies/AMDDefineDependencyParserPlugin.js +30 -17
- package/lib/dependencies/AMDPlugin.js +9 -7
- package/lib/dependencies/AMDRequireArrayDependency.js +5 -5
- package/lib/dependencies/AMDRequireContextDependency.js +2 -2
- package/lib/dependencies/AMDRequireDependenciesBlock.js +1 -1
- package/lib/dependencies/AMDRequireDependenciesBlockParserPlugin.js +25 -14
- package/lib/dependencies/AMDRequireDependency.js +8 -7
- package/lib/dependencies/AMDRequireItemDependency.js +1 -1
- package/lib/dependencies/AMDRuntimeModules.js +21 -1
- package/lib/dependencies/BuildTimeConstDependency.js +102 -0
- package/lib/dependencies/CachedConstDependency.js +11 -8
- package/lib/dependencies/CommonJsDependencyHelpers.js +67 -46
- package/lib/dependencies/CommonJsExportRequireDependency.js +121 -45
- package/lib/dependencies/CommonJsExportsDependency.js +53 -49
- package/lib/dependencies/CommonJsExportsParserPlugin.js +207 -25
- package/lib/dependencies/CommonJsFullRequireDependency.js +119 -34
- package/lib/dependencies/CommonJsImportsParserPlugin.js +100 -50
- package/lib/dependencies/CommonJsObjectExportDependency.js +188 -0
- package/lib/dependencies/CommonJsPlugin.js +35 -6
- package/lib/dependencies/CommonJsRequireContextDependency.js +5 -6
- package/lib/dependencies/CommonJsRequireDependency.js +156 -27
- package/lib/dependencies/CommonJsSelfReferenceDependency.js +63 -38
- package/lib/dependencies/ConstDependency.js +8 -9
- package/lib/dependencies/ContextDependency.js +12 -8
- package/lib/dependencies/ContextDependencyHelpers.js +14 -9
- package/lib/dependencies/ContextDependencyTemplateAsId.js +4 -4
- package/lib/dependencies/ContextDependencyTemplateAsRequireCall.js +4 -4
- package/lib/dependencies/ContextElementDependency.js +31 -12
- package/lib/dependencies/CreateRequireParserPlugin.js +12 -7
- package/lib/dependencies/CreateScriptUrlDependency.js +4 -4
- package/lib/dependencies/CssIcssExportDependency.js +56 -28
- package/lib/dependencies/CssIcssImportDependency.js +17 -13
- package/lib/dependencies/CssIcssSymbolDependency.js +9 -10
- package/lib/dependencies/CssImportDependency.js +18 -9
- package/lib/dependencies/CssUrlDependency.js +17 -13
- package/lib/dependencies/DllEntryDependency.js +1 -1
- package/lib/dependencies/DynamicExports.js +2 -2
- package/lib/dependencies/ExportBindingInitFragment.js +36 -9
- package/lib/dependencies/ExportsInfoDependency.js +7 -8
- package/lib/dependencies/ExternalModuleDependency.js +9 -5
- package/lib/dependencies/ExternalModuleInitFragment.js +2 -2
- package/lib/dependencies/ExternalModuleInitFragmentDependency.js +8 -5
- package/lib/dependencies/HarmonyAcceptDependency.js +5 -5
- package/lib/dependencies/HarmonyCompatibilityDependency.js +52 -17
- package/lib/dependencies/HarmonyDetectionParserPlugin.js +11 -7
- package/lib/dependencies/HarmonyEvaluatedImportSpecifierDependency.js +13 -10
- package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +78 -12
- package/lib/dependencies/HarmonyExportExpressionDependency.js +23 -18
- package/lib/dependencies/HarmonyExportHeaderDependency.js +7 -7
- package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +143 -63
- package/lib/dependencies/HarmonyExportInitFragment.js +18 -6
- package/lib/dependencies/HarmonyExportSpecifierDependency.js +51 -14
- package/lib/dependencies/HarmonyExports.js +7 -4
- package/lib/dependencies/HarmonyImportDependency.js +27 -19
- package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +31 -24
- package/lib/dependencies/HarmonyImportGuard.js +20 -30
- package/lib/dependencies/HarmonyImportSideEffectDependency.js +38 -9
- package/lib/dependencies/HarmonyImportSpecifierDependency.js +97 -49
- package/lib/dependencies/HarmonyModulesPlugin.js +7 -3
- package/lib/dependencies/HarmonyTopLevelThisParserPlugin.js +1 -3
- package/lib/dependencies/HtmlEntryDependency.js +37 -29
- package/lib/dependencies/HtmlInlineHtmlDependency.js +7 -8
- package/lib/dependencies/HtmlInlineScriptDependency.js +11 -8
- package/lib/dependencies/HtmlInlineStyleDependency.js +7 -10
- package/lib/dependencies/HtmlSourceDependency.js +22 -14
- package/lib/dependencies/ImportContextDependency.js +2 -2
- package/lib/dependencies/ImportDependency.js +24 -20
- package/lib/dependencies/ImportEagerDependency.js +6 -9
- package/lib/dependencies/ImportMetaContextDependency.js +2 -2
- package/lib/dependencies/ImportMetaContextDependencyParserPlugin.js +14 -13
- package/lib/dependencies/ImportMetaContextPlugin.js +7 -3
- package/lib/dependencies/ImportMetaGlobDependency.js +2 -2
- package/lib/dependencies/ImportMetaGlobDependencyParserPlugin.js +2 -3
- package/lib/dependencies/ImportMetaGlobHelpers.js +19 -22
- package/lib/dependencies/ImportMetaHotAcceptDependency.js +1 -1
- package/lib/dependencies/ImportMetaHotDeclineDependency.js +1 -1
- package/lib/dependencies/ImportMetaPlugin.js +154 -71
- package/lib/dependencies/ImportMetaResolveDependency.js +3 -4
- package/lib/dependencies/ImportParserPlugin.js +49 -35
- package/lib/dependencies/ImportPhase.js +12 -5
- package/lib/dependencies/ImportPlugin.js +7 -3
- package/lib/dependencies/ImportWeakDependency.js +6 -9
- package/lib/dependencies/JsonExportsDependency.js +11 -7
- package/lib/dependencies/LoaderDependency.js +2 -2
- package/lib/dependencies/LoaderImportDependency.js +2 -2
- package/lib/dependencies/LoaderPlugin.js +11 -7
- package/lib/dependencies/LocalModuleDependency.js +5 -5
- package/lib/dependencies/LocalModulesHelpers.js +1 -1
- package/lib/dependencies/ModuleDecoratorDependency.js +6 -7
- package/lib/dependencies/ModuleDependency.js +9 -6
- package/lib/dependencies/ModuleDependencyTemplateAsId.js +4 -4
- package/lib/dependencies/ModuleDependencyTemplateAsRequireId.js +3 -3
- package/lib/dependencies/ModuleHotAcceptDependency.js +1 -1
- package/lib/dependencies/ModuleHotDeclineDependency.js +1 -1
- package/lib/dependencies/ModuleInitFragmentDependency.js +24 -10
- package/lib/dependencies/NullDependency.js +3 -3
- package/lib/dependencies/ProvidedDependency.js +14 -10
- package/lib/dependencies/PureExpressionDependency.js +9 -10
- package/lib/dependencies/RequireContextDependency.js +2 -2
- package/lib/dependencies/RequireContextDependencyParserPlugin.js +2 -4
- package/lib/dependencies/RequireContextPlugin.js +8 -4
- package/lib/dependencies/RequireEnsureDependenciesBlock.js +2 -2
- package/lib/dependencies/RequireEnsureDependenciesBlockParserPlugin.js +5 -8
- package/lib/dependencies/RequireEnsureDependency.js +8 -7
- package/lib/dependencies/RequireEnsurePlugin.js +7 -3
- package/lib/dependencies/RequireHeaderDependency.js +51 -12
- package/lib/dependencies/RequireIncludeDependency.js +6 -6
- package/lib/dependencies/RequireIncludeDependencyParserPlugin.js +2 -3
- package/lib/dependencies/RequireIncludePlugin.js +7 -3
- package/lib/dependencies/RequireJsStuffPlugin.js +7 -3
- package/lib/dependencies/RequireResolveContextDependency.js +2 -2
- package/lib/dependencies/RequireResolveDependency.js +4 -4
- package/lib/dependencies/RequireResolveHeaderDependency.js +4 -4
- package/lib/dependencies/RuntimeRequirementsDependency.js +5 -6
- package/lib/dependencies/StaticExportsDependency.js +2 -2
- package/lib/dependencies/SystemPlugin.js +10 -6
- package/lib/dependencies/SystemRuntimeModule.js +10 -0
- package/lib/dependencies/TopLevelAwaitDependency.js +11 -7
- package/lib/dependencies/URLContextDependency.js +2 -2
- package/lib/dependencies/URLDependency.js +110 -64
- package/lib/dependencies/URLPlugin.js +7 -3
- package/lib/dependencies/UnsupportedDependency.js +4 -4
- package/lib/dependencies/WebAssemblyExportImportedDependency.js +3 -4
- package/lib/dependencies/WebAssemblyImportDependency.js +5 -5
- package/lib/dependencies/WebpackIsIncludedDependency.js +6 -6
- package/lib/dependencies/WorkerAndWorkletPlugin.js +46 -28
- package/lib/dependencies/WorkerDependency.js +28 -22
- package/lib/dependencies/WorkletDependency.js +15 -14
- package/lib/dependencies/getFunctionExpression.js +8 -4
- package/lib/dependencies/processExportInfo.js +5 -5
- package/lib/dll/DelegatedModule.js +34 -22
- package/lib/dll/DelegatedModuleFactoryPlugin.js +15 -7
- package/lib/dll/DelegatedPlugin.js +2 -2
- package/lib/dll/DllEntryPlugin.js +2 -2
- package/lib/dll/DllModule.js +22 -15
- package/lib/dll/DllModuleFactory.js +7 -3
- package/lib/dll/DllPlugin.js +7 -5
- package/lib/dll/DllReferencePlugin.js +10 -7
- package/lib/dll/LibManifestPlugin.js +5 -5
- package/lib/electron/ElectronTargetPlugin.js +53 -49
- package/lib/errors/AsyncChunkWaterfallWarning.js +36 -0
- package/lib/errors/AsyncDependencyToInitialChunkError.js +2 -2
- package/lib/errors/BroadContextsWarning.js +43 -0
- package/lib/errors/BuildCycleError.js +1 -1
- package/lib/errors/CacheEffectivenessWarning.js +55 -0
- package/lib/errors/ChunkRenderError.js +1 -1
- package/lib/errors/CircularDependenciesWarning.js +38 -0
- package/lib/errors/CodeGenerationError.js +1 -1
- package/lib/errors/CommentCompilationWarning.js +1 -1
- package/lib/errors/ConflictingResourceHintsWarning.js +35 -0
- package/lib/errors/DuplicateModulesWarning.js +45 -0
- package/lib/errors/DynamicExportsWarning.js +30 -0
- package/lib/errors/EmbeddedSourceMapsWarning.js +25 -0
- package/lib/errors/EntrypointOverlapWarning.js +45 -0
- package/lib/errors/EnvironmentNotSupportAsyncWarning.js +2 -2
- package/lib/errors/EvalUsageWarning.js +28 -0
- package/lib/errors/HookWebpackError.js +5 -5
- package/lib/errors/HotspotsWarning.js +57 -0
- package/lib/errors/IgnoreErrorModuleFactory.js +7 -3
- package/lib/errors/InlinedAssetsWarning.js +36 -0
- package/lib/errors/InvalidDependenciesModuleWarning.js +1 -1
- package/lib/errors/LargeModulesWarning.js +45 -0
- package/lib/errors/LegacyJavascriptWarning.js +48 -0
- package/lib/errors/MissingSideEffectsWarning.js +36 -0
- package/lib/errors/MixedExportsWarning.js +41 -0
- package/lib/errors/ModuleDependencyError.js +13 -16
- package/lib/errors/ModuleDependencyWarning.js +5 -15
- package/lib/errors/ModuleHashingError.js +1 -1
- package/lib/errors/ModuleNotFoundError.js +2 -2
- package/lib/errors/ModuleParseError.js +1 -2
- package/lib/errors/ModuleRestoreError.js +1 -1
- package/lib/errors/ModuleStoreError.js +1 -1
- package/lib/errors/NodeStuffInWebError.js +1 -1
- package/lib/errors/OsDependentRuleWarning.js +31 -0
- package/lib/errors/PureAnnotationsWarning.js +36 -0
- package/lib/errors/RedundantDynamicImportWarning.js +31 -0
- package/lib/errors/ScopeHoistingBailoutsWarning.js +41 -0
- package/lib/errors/SplitChunksCappedWarning.js +41 -0
- package/lib/errors/TinyChunksWarning.js +40 -0
- package/lib/errors/TopLevelThisWarning.js +34 -0
- package/lib/errors/UnsplitVendorsWarning.js +42 -0
- package/lib/errors/UnsupportedFeatureWarning.js +1 -1
- package/lib/errors/UnusedAliasesWarning.js +29 -0
- package/lib/errors/UnusedDefinesWarning.js +29 -0
- package/lib/errors/UnusedExternalsWarning.js +29 -0
- package/lib/errors/UnusedReexportsWarning.js +42 -0
- package/lib/errors/UnusedRuleWarning.js +29 -0
- package/lib/errors/WebpackError.js +9 -5
- package/lib/errors/deriveStackFromNestedError.js +90 -0
- package/lib/esm/ExportWebpackRequireRuntimeModule.js +2 -0
- package/lib/esm/ModuleChunkFormatPlugin.js +37 -19
- package/lib/esm/ModuleChunkLoadingPlugin.js +89 -51
- package/lib/esm/ModuleChunkLoadingRuntimeModule.js +155 -62
- package/lib/hmr/HotModuleReplacement.runtime.js +24 -5
- package/lib/hmr/HotModuleReplacementRuntimeModule.js +1 -1
- package/lib/hmr/LazyCompilationPlugin.js +45 -24
- package/lib/hmr/lazyCompilationBackend.js +9 -6
- package/lib/hmr/parserHooks.js +56 -0
- package/lib/html/HtmlGenerator.js +277 -77
- package/lib/html/HtmlModule.js +7 -3
- package/lib/html/HtmlModulesPlugin.js +282 -162
- package/lib/html/HtmlParser.js +31 -86
- package/lib/html/data.js +1928 -0
- package/lib/html/htmlMinify.js +288 -0
- package/lib/html/syntax.js +5557 -1155
- package/lib/ids/ChunkModuleIdRangePlugin.js +3 -3
- package/lib/ids/DeterministicChunkIdsPlugin.js +1 -1
- package/lib/ids/DeterministicModuleIdsPlugin.js +2 -2
- package/lib/ids/HashedModuleIdsPlugin.js +6 -2
- package/lib/ids/IdHelpers.js +7 -8
- package/lib/ids/NamedChunkIdsPlugin.js +1 -1
- package/lib/ids/NamedModuleIdsPlugin.js +1 -1
- package/lib/ids/NaturalChunkIdsPlugin.js +2 -2
- package/lib/ids/NaturalModuleIdsPlugin.js +1 -1
- package/lib/ids/OccurrenceChunkIdsPlugin.js +7 -3
- package/lib/ids/OccurrenceModuleIdsPlugin.js +7 -3
- package/lib/ids/SyncModuleIdsPlugin.js +4 -4
- package/lib/index.js +10 -0
- package/lib/javascript/ArrayPushCallbackChunkFormatPlugin.js +3 -3
- package/lib/javascript/BasicEvaluatedExpression.js +18 -14
- package/lib/javascript/ChunkFormatHelpers.js +6 -6
- package/lib/javascript/ChunkHelpers.js +1 -1
- package/lib/javascript/CommonJsChunkFormatPlugin.js +11 -5
- package/lib/javascript/EnableChunkLoadingPlugin.js +2 -2
- package/lib/javascript/JavascriptGenerator.js +65 -165
- package/lib/javascript/JavascriptModule.js +9 -3
- package/lib/javascript/JavascriptModulesPlugin.js +98 -113
- package/lib/javascript/JavascriptParser.js +242 -99
- package/lib/javascript/JavascriptParserHelpers.js +10 -7
- package/lib/javascript/ScopeAnalyzer.js +1094 -0
- package/lib/javascript/StartupHelpers.js +55 -9
- package/lib/javascript/syntax.js +2678 -232
- package/lib/json/JsonData.js +8 -4
- package/lib/json/JsonGenerator.js +38 -16
- package/lib/json/JsonModule.js +7 -3
- package/lib/json/JsonModulesPlugin.js +1 -1
- package/lib/json/JsonParser.js +5 -6
- package/lib/library/AbstractLibraryPlugin.js +20 -14
- package/lib/library/AmdLibraryPlugin.js +11 -7
- package/lib/library/AssignLibraryPlugin.js +19 -13
- package/lib/library/EnableLibraryPlugin.js +2 -2
- package/lib/library/ExportPropertyLibraryPlugin.js +15 -8
- package/lib/library/JsonpLibraryPlugin.js +11 -7
- package/lib/library/ModuleLibraryPlugin.js +256 -64
- package/lib/library/SystemLibraryPlugin.js +12 -8
- package/lib/library/UmdLibraryPlugin.js +62 -25
- package/lib/loaders/LoaderRunner.js +14 -1
- package/lib/loaders/loadLoader.js +8 -4
- package/lib/logging/createConsoleLogger.js +7 -4
- package/lib/node/CommonJsChunkLoadingPlugin.js +36 -22
- package/lib/node/NodeEnvironmentPlugin.js +17 -3
- package/lib/node/NodeSourcePlugin.js +1 -1
- package/lib/node/NodeTargetPlugin.js +4 -3
- package/lib/node/NodeTemplatePlugin.js +1 -1
- package/lib/node/NodeWatchFileSystem.js +70 -9
- package/lib/node/ReadFileChunkLoadingRuntimeModule.js +35 -38
- package/lib/node/ReadFileCompileAsyncWasmPlugin.js +72 -19
- package/lib/node/ReadFileCompileWasmPlugin.js +28 -16
- package/lib/node/RequireChunkLoadingRuntimeModule.js +35 -38
- package/lib/node/nodeConsole.js +7 -3
- package/lib/optimize/AggressiveMergingPlugin.js +2 -2
- package/lib/optimize/AggressiveSplittingPlugin.js +9 -6
- package/lib/optimize/ConcatenatedModule.js +985 -470
- package/lib/optimize/ConstExportsPlugin.js +11 -7
- package/lib/optimize/EnsureChunkConditionsPlugin.js +3 -3
- package/lib/optimize/FlagIncludedChunksPlugin.js +3 -4
- package/lib/optimize/InlineExports.js +9 -5
- package/lib/optimize/InnerGraph.js +28 -12
- package/lib/optimize/InnerGraphPlugin.js +23 -18
- package/lib/optimize/LimitChunkCountPlugin.js +7 -3
- package/lib/optimize/MangleExportsPlugin.js +7 -8
- package/lib/optimize/MergeDuplicateChunksPlugin.js +7 -3
- package/lib/optimize/MinChunkSizePlugin.js +7 -3
- package/lib/optimize/ModuleConcatenationPlugin.js +51 -35
- package/lib/optimize/RealContentHashPlugin.js +10 -6
- package/lib/optimize/RemoveEmptyChunksPlugin.js +2 -2
- package/lib/optimize/RemoveParentModulesPlugin.js +4 -4
- package/lib/optimize/RuntimeChunkPlugin.js +2 -2
- package/lib/optimize/SideEffectsFlagPlugin.js +262 -39
- package/lib/optimize/SplitChunksPlugin.js +86 -24
- package/lib/performance/AssetsOverSizeLimitWarning.js +10 -2
- package/lib/performance/AsyncChunkWaterfallsPlugin.js +136 -0
- package/lib/performance/BroadContextsPlugin.js +142 -0
- package/lib/performance/CacheEffectivenessPlugin.js +125 -0
- package/lib/performance/ConflictingResourceHintsPlugin.js +99 -0
- package/lib/performance/DuplicateModulesPlugin.js +93 -0
- package/lib/performance/DuplicatePackagesPlugin.js +119 -0
- package/lib/performance/DuplicatePackagesWarning.js +84 -0
- package/lib/performance/DynamicExportsPlugin.js +120 -0
- package/lib/performance/EmbeddedSourceMapsPlugin.js +71 -0
- package/lib/performance/EntrypointOverlapPlugin.js +122 -0
- package/lib/performance/EntrypointsOverSizeLimitWarning.js +1 -1
- package/lib/performance/EvalUsagePlugin.js +115 -0
- package/lib/performance/HotspotsPlugin.js +296 -0
- package/lib/performance/InlinedAssetsPlugin.js +99 -0
- package/lib/performance/LargeModulesPlugin.js +126 -0
- package/lib/performance/LegacyJavascriptPlugin.js +139 -0
- package/lib/performance/MissingSideEffectsPlugin.js +138 -0
- package/lib/performance/MixedExportsPlugin.js +136 -0
- package/lib/performance/OsDependentRuleWarningPlugin.js +178 -0
- package/lib/performance/PureAnnotationsPlugin.js +219 -0
- package/lib/performance/RedundantDynamicImportsPlugin.js +225 -0
- package/lib/performance/RuntimeInLargeChunkWarning.js +27 -0
- package/lib/performance/ScopeHoistingBailoutsPlugin.js +164 -0
- package/lib/performance/SizeLimitsPlugin.js +139 -7
- package/lib/performance/SplitChunksCappedPlugin.js +99 -0
- package/lib/performance/TinyChunksPlugin.js +128 -0
- package/lib/performance/TopLevelThisPlugin.js +208 -0
- package/lib/performance/UnsplitVendorsPlugin.js +112 -0
- package/lib/performance/UnusedAliasesPlugin.js +253 -0
- package/lib/performance/UnusedDefinesPlugin.js +87 -0
- package/lib/performance/UnusedExternalsPlugin.js +110 -0
- package/lib/performance/UnusedReexportsPlugin.js +159 -0
- package/lib/performance/UnusedRuleWarningPlugin.js +105 -0
- package/lib/performance/getModuleSize.js +22 -0
- package/lib/performance/getSourceModules.js +22 -0
- package/lib/performance/hasOnlyUnusedExports.js +40 -0
- package/lib/prefetch/ChunkPrefetchFunctionRuntimeModule.js +24 -10
- package/lib/prefetch/ChunkPrefetchPreloadPlugin.js +63 -46
- package/lib/prefetch/ChunkPrefetchStartupRuntimeModule.js +2 -3
- package/lib/prefetch/ChunkPrefetchTriggerRuntimeModule.js +2 -2
- package/lib/prefetch/ChunkPreloadTriggerRuntimeModule.js +2 -2
- package/lib/prefetch/ResourceHintPlugin.js +295 -78
- package/lib/prefetch/ResourceHintRuntimeModule.js +1 -21
- package/lib/prefetch/StartupAssetHintRuntimeModule.js +10 -133
- package/lib/prefetch/parseResourceHintOptions.js +31 -4
- package/lib/rules/BasicEffectRulePlugin.js +2 -2
- package/lib/rules/BasicMatcherRulePlugin.js +8 -4
- package/lib/rules/GlobMatcherRulePlugin.js +68 -0
- package/lib/rules/ObjectMatcherRulePlugin.js +12 -5
- package/lib/rules/RuleSetCompiler.js +146 -12
- package/lib/rules/UseEffectRulePlugin.js +18 -11
- package/lib/runtime/AsyncModuleGeneratorRuntimeModule.js +11 -1
- package/lib/runtime/AsyncModuleRuntimeModule.js +1 -1
- package/lib/runtime/AutoPublicPathRuntimeModule.js +15 -20
- package/lib/runtime/BaseUriRuntimeModule.js +33 -7
- package/lib/runtime/ChunkNameRuntimeModule.js +10 -0
- package/lib/runtime/CompatGetDefaultExportRuntimeModule.js +11 -1
- package/lib/runtime/CompatRuntimeModule.js +5 -3
- package/lib/runtime/ConcatenationWrapRuntimeModule.js +90 -0
- package/lib/runtime/ConstructRequireRuntimeModule.js +52 -0
- package/lib/runtime/CreateFakeNamespaceObjectRuntimeModule.js +8 -6
- package/lib/runtime/CreateScriptRuntimeModule.js +11 -1
- package/lib/runtime/CreateScriptUrlRuntimeModule.js +11 -1
- package/lib/runtime/DefinePropertyGettersRuntimeModule.js +56 -38
- package/lib/runtime/EnsureChunkRuntimeModule.js +18 -2
- package/lib/runtime/GetChunkFilenameRuntimeModule.js +62 -37
- package/lib/runtime/GetFullHashRuntimeModule.js +12 -2
- package/lib/runtime/GetMainFilenameRuntimeModule.js +12 -2
- package/lib/runtime/GetTrustedTypesPolicyRuntimeModule.js +2 -2
- package/lib/runtime/GetWorkletBootstrapRuntimeModule.js +16 -3
- package/lib/runtime/GlobalRuntimeModule.js +18 -0
- package/lib/runtime/HasOwnPropertyRuntimeModule.js +12 -2
- package/lib/runtime/LoadScriptRuntimeModule.js +2 -2
- package/lib/runtime/MakeDeferredNamespaceObjectRuntime.js +23 -6
- package/lib/runtime/MakeNamespaceObjectRuntimeModule.js +22 -6
- package/lib/runtime/NonceRuntimeModule.js +10 -0
- package/lib/runtime/OnChunksLoadedRuntimeModule.js +5 -3
- package/lib/runtime/PublicPathRuntimeModule.js +12 -2
- package/lib/runtime/RelativeUrlRuntimeModule.js +11 -1
- package/lib/runtime/RuntimeIdRuntimeModule.js +12 -2
- package/lib/runtime/SetAnonymousDefaultNameRuntimeModule.js +11 -1
- package/lib/runtime/StartupChunkDependenciesPlugin.js +18 -9
- package/lib/runtime/StartupChunkDependenciesRuntimeModule.js +3 -3
- package/lib/runtime/StartupEntrypointRuntimeModule.js +21 -4
- package/lib/runtime/SystemContextRuntimeModule.js +10 -0
- package/lib/runtime/ToBinaryRuntimeModule.js +1 -1
- package/lib/runtime/WorkerRuntimeModule.js +11 -1
- package/lib/runtime/baseUri.js +63 -0
- package/lib/schemes/DataUriPlugin.js +1 -1
- package/lib/schemes/FileUriPlugin.js +1 -1
- package/lib/schemes/HttpUriPlugin.js +24 -15
- package/lib/schemes/VirtualUrlPlugin.js +13 -7
- package/lib/serialization/AggregateErrorSerializer.js +1 -1
- package/lib/serialization/BinaryMiddleware.js +4 -4
- package/lib/serialization/ErrorObjectSerializer.js +1 -1
- package/lib/serialization/FileMiddleware.js +7 -7
- package/lib/serialization/ObjectMiddleware.js +139 -114
- package/lib/serialization/PlainObjectSerializer.js +19 -16
- package/lib/sharing/ConsumeSharedModule.js +30 -21
- package/lib/sharing/ConsumeSharedPlugin.js +18 -10
- package/lib/sharing/ConsumeSharedRuntimeModule.js +6 -9
- package/lib/sharing/ProvideSharedModule.js +25 -16
- package/lib/sharing/ProvideSharedModuleFactory.js +7 -3
- package/lib/sharing/ProvideSharedPlugin.js +8 -4
- package/lib/sharing/SharePlugin.js +17 -5
- package/lib/sharing/ShareRuntimeModule.js +4 -4
- package/lib/sharing/resolveMatchedConfigs.js +9 -6
- package/lib/sharing/utils.js +1 -3
- package/lib/stats/DefaultStatsFactoryPlugin.js +50 -29
- package/lib/stats/DefaultStatsPresetPlugin.js +17 -8
- package/lib/stats/DefaultStatsPrinterPlugin.js +36 -26
- package/lib/stats/StatsFactory.js +25 -26
- package/lib/stats/StatsPrinter.js +16 -12
- package/lib/typescript/TypeScriptPlugin.js +12 -14
- package/lib/url/URLParserPlugin.js +26 -13
- package/lib/util/AsyncQueue.js +4 -3
- package/lib/util/Hash.js +5 -1
- package/lib/util/LazySet.js +35 -22
- package/lib/util/LocConverter.js +36 -13
- package/lib/util/SourceProcessor.js +1050 -24
- package/lib/util/StringXor.js +1 -1
- package/lib/util/chainedImports.js +9 -5
- package/lib/util/cleverMerge.js +1 -1
- package/lib/util/comparators.js +45 -14
- package/lib/util/concatenate.js +203 -77
- package/lib/util/conventions.js +5 -1
- package/lib/util/createHash.js +2 -2
- package/lib/util/createHooksRegistry.js +8 -10
- package/lib/util/dataURL.js +225 -1
- package/lib/util/extractSourceMap.js +4 -3
- package/lib/util/findCaseMismatch.js +139 -0
- package/lib/util/formatLocation.js +1 -2
- package/lib/util/fs.js +22 -5
- package/lib/util/globUtils.js +298 -24
- package/lib/util/hash/BatchedHash.js +5 -1
- package/lib/util/hash/BulkUpdateHash.js +5 -1
- package/lib/util/hash/DebugHash.js +5 -1
- package/lib/util/hash/hash-digest.js +6 -2
- package/lib/util/identifier.js +4 -0
- package/lib/util/implicitTypeLoaderFallback.js +1 -1
- package/lib/util/internalSerializables.js +6 -0
- package/lib/util/lazyModule.js +56 -0
- package/lib/util/makeSerializable.js +7 -3
- package/lib/util/matchAlias.js +25 -0
- package/lib/util/mimeTypes.js +11 -5
- package/lib/util/nonNumericOnlyHash.js +4 -3
- package/lib/util/parseJson.js +5 -3
- package/lib/util/preloadModuleType.js +32 -0
- package/lib/util/registerExternalSerializer.js +7 -5
- package/lib/util/runtime.js +2 -2
- package/lib/util/semver.js +1 -1
- package/lib/util/serialization.js +28 -28
- package/lib/util/source.js +2 -2
- package/lib/util/traverseDestructuringAssignmentProperties.js +6 -2
- package/lib/wasm/EnableWasmLoadingPlugin.js +10 -8
- package/lib/wasm/wasmModuleFilename.js +54 -0
- package/lib/wasm-async/AsyncWasmCompileRuntimeModule.js +41 -21
- package/lib/wasm-async/AsyncWasmLoadingRuntimeModule.js +43 -21
- package/lib/wasm-async/AsyncWasmModule.js +3 -3
- package/lib/wasm-async/AsyncWebAssemblyGenerator.js +4 -5
- package/lib/wasm-async/AsyncWebAssemblyJavascriptGenerator.js +57 -17
- package/lib/wasm-async/AsyncWebAssemblyModulesPlugin.js +34 -18
- package/lib/wasm-async/AsyncWebAssemblyParser.js +9 -8
- package/lib/wasm-async/UniversalCompileAsyncWasmPlugin.js +34 -8
- package/lib/wasm-sync/SyncWasmModule.js +2 -2
- package/lib/wasm-sync/WasmChunkLoadingRuntimeModule.js +18 -13
- package/lib/wasm-sync/WasmFinalizeExportsPlugin.js +4 -5
- package/lib/wasm-sync/WebAssemblyGenerator.js +18 -17
- package/lib/wasm-sync/WebAssemblyInInitialChunkError.js +4 -4
- package/lib/wasm-sync/WebAssemblyJavascriptGenerator.js +7 -7
- package/lib/wasm-sync/WebAssemblyModulesPlugin.js +24 -11
- package/lib/wasm-sync/WebAssemblyParser.js +4 -6
- package/lib/wasm-sync/WebAssemblyUtils.js +2 -2
- package/lib/web/FetchCompileAsyncWasmPlugin.js +101 -19
- package/lib/web/FetchCompileWasmPlugin.js +46 -16
- package/lib/web/JsonpChunkLoadingPlugin.js +47 -23
- package/lib/web/JsonpChunkLoadingRuntimeModule.js +50 -20
- package/lib/web/JsonpTemplatePlugin.js +2 -2
- package/lib/webpack.js +22 -11
- package/lib/webworker/ImportScriptsChunkLoadingPlugin.js +60 -26
- package/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js +30 -32
- package/lib/webworker/WebWorkerTemplatePlugin.js +1 -1
- package/module.d.ts +1 -0
- package/package.json +32 -25
- package/schemas/WebpackOptions.check.js +1 -1
- package/schemas/WebpackOptions.json +670 -36
- package/schemas/plugins/HtmlParserOptions.check.js +1 -1
- package/schemas/plugins/container/ContainerPlugin.check.js +1 -1
- package/schemas/plugins/container/ContainerPlugin.json +10 -0
- package/schemas/plugins/container/ModuleFederationPlugin.check.js +1 -1
- package/schemas/plugins/container/ModuleFederationPlugin.json +10 -0
- package/schemas/plugins/css/CssAutoOrModuleParserOptions.check.js +1 -1
- package/schemas/plugins/css/CssModuleParserOptions.check.js +1 -1
- package/schemas/plugins/css/CssParserOptions.check.js +1 -1
- package/types.d.ts +3144 -454
- package/lib/runtime/CommonJsWrapRuntimeModule.js +0 -37
|
@@ -5,7 +5,6 @@
|
|
|
5
5
|
|
|
6
6
|
"use strict";
|
|
7
7
|
|
|
8
|
-
const glob2regexp = require("watchpack").util.globToRegExp;
|
|
9
8
|
const {
|
|
10
9
|
JAVASCRIPT_MODULE_TYPE_AUTO,
|
|
11
10
|
JAVASCRIPT_MODULE_TYPE_DYNAMIC,
|
|
@@ -17,26 +16,41 @@ const HarmonyImportDependency = require("../dependencies/HarmonyImportDependency
|
|
|
17
16
|
const HarmonyImportSpecifierDependency = require("../dependencies/HarmonyImportSpecifierDependency");
|
|
18
17
|
const { ImportPhaseUtils } = require("../dependencies/ImportPhase");
|
|
19
18
|
const formatLocation = require("../util/formatLocation");
|
|
19
|
+
const { dirname, join, readJson, relative } = require("../util/fs");
|
|
20
|
+
const { getGlobToRegExpSource } = require("../util/globUtils");
|
|
21
|
+
const {
|
|
22
|
+
NODE_MODULES_REGEXP,
|
|
23
|
+
WINDOWS_PATH_SEPARATOR_REGEXP,
|
|
24
|
+
relativePathToRequest
|
|
25
|
+
} = require("../util/identifier");
|
|
20
26
|
const { CompilerHintNotationRegExp } = require("../util/magicComment");
|
|
21
27
|
|
|
22
|
-
/**
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
/** @
|
|
32
|
-
/** @
|
|
33
|
-
/**
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
/** @
|
|
39
|
-
/** @
|
|
28
|
+
/**
|
|
29
|
+
* @import {
|
|
30
|
+
* MaybeNamedClassDeclaration,
|
|
31
|
+
* MaybeNamedFunctionDeclaration,
|
|
32
|
+
* ModuleDeclaration,
|
|
33
|
+
* Statement,
|
|
34
|
+
* CallExpression
|
|
35
|
+
* } from "estree"
|
|
36
|
+
*/
|
|
37
|
+
/** @import Compiler from "../Compiler" */
|
|
38
|
+
/** @import Module, { BuildMeta } from "../Module" */
|
|
39
|
+
/**
|
|
40
|
+
* @import {
|
|
41
|
+
* JavascriptModuleBuildInfo
|
|
42
|
+
* } from "../javascript/JavascriptModule"
|
|
43
|
+
*/
|
|
44
|
+
/** @import ModuleGraphConnection from "../ModuleGraphConnection" */
|
|
45
|
+
/** @import { ExportInfo, TargetItemWithConnection } from "../ExportsInfo" */
|
|
46
|
+
/** @import JavascriptParser, { Range } from "../javascript/JavascriptParser" */
|
|
47
|
+
/** @import { InputFileSystem } from "../util/fs" */
|
|
48
|
+
/** @import { CreateData, ResolveData } from "../NormalModuleFactory" */
|
|
49
|
+
/**
|
|
50
|
+
* @import {
|
|
51
|
+
* JavascriptParserOptions
|
|
52
|
+
* } from "../../declarations/WebpackOptions"
|
|
53
|
+
*/
|
|
40
54
|
|
|
41
55
|
/**
|
|
42
56
|
* Defines the export in module type used by this module.
|
|
@@ -46,10 +60,35 @@ const { CompilerHintNotationRegExp } = require("../util/magicComment");
|
|
|
46
60
|
* @property {boolean} checked if the export is conditional
|
|
47
61
|
*/
|
|
48
62
|
|
|
63
|
+
/** @typedef {NonNullable<CreateData["resourceResolveData"]>} ResourceResolveData */
|
|
64
|
+
|
|
49
65
|
/** @typedef {string | boolean | string[] | undefined} SideEffectsFlagValue */
|
|
50
66
|
|
|
51
67
|
/** @typedef {Map<string, RegExp>} CacheItem */
|
|
52
68
|
|
|
69
|
+
/**
|
|
70
|
+
* @typedef {object} ResolvedSideEffectsFlag
|
|
71
|
+
* @property {SideEffectsFlagValue} sideEffects package.json sideEffects value
|
|
72
|
+
* @property {string} relativePath path relative to the owning package root
|
|
73
|
+
*/
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* @typedef {object} OwningSideEffectsFlag
|
|
77
|
+
* @property {SideEffectsFlagValue} sideEffects package.json sideEffects value
|
|
78
|
+
* @property {string} packageRoot directory of the declaring package.json
|
|
79
|
+
*/
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* A finished ancestor walk, kept per descriptionFileRoot. The package.json
|
|
83
|
+
* paths it consulted are replayed as dependencies for every module reusing it.
|
|
84
|
+
* @typedef {object} OwningSideEffectsFlagWalk
|
|
85
|
+
* @property {OwningSideEffectsFlag | null} owning declaring package, `null` when the walk found none
|
|
86
|
+
* @property {string[]} read package.json files the walk read
|
|
87
|
+
* @property {string[]} missing package.json files the walk did not find
|
|
88
|
+
*/
|
|
89
|
+
|
|
90
|
+
/** @typedef {Map<string, OwningSideEffectsFlagWalk>} OwningSideEffectsFlagCache */
|
|
91
|
+
|
|
53
92
|
/**
|
|
54
93
|
* Whether a resolved re-export target is reached through an `import defer` edge.
|
|
55
94
|
* Such edges must not be collapsed by the side-effect-free barrel optimization:
|
|
@@ -67,6 +106,21 @@ const isDeferredTargetConnection = (connection) =>
|
|
|
67
106
|
/** @type {WeakMap<Compiler, CacheItem>} */
|
|
68
107
|
const globToRegexpCache = new WeakMap();
|
|
69
108
|
|
|
109
|
+
/** @type {WeakMap<Compiler, OwningSideEffectsFlagCache>} */
|
|
110
|
+
const owningSideEffectsFlagCache = new WeakMap();
|
|
111
|
+
|
|
112
|
+
/** @type {WeakMap<Partial<CreateData>, ResolvedSideEffectsFlag>} */
|
|
113
|
+
const resolvedSideEffectsFlags = new WeakMap();
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Whether a failed ancestor package.json read means nothing is there, as
|
|
117
|
+
* opposed to something being there that cannot be used.
|
|
118
|
+
* @param {NodeJS.ErrnoException | SyntaxError | Error} err error from readJson
|
|
119
|
+
* @returns {boolean} true when no file was found at that path
|
|
120
|
+
*/
|
|
121
|
+
const isMissingPackageJsonError = (err) =>
|
|
122
|
+
"code" in err && err.code === "ENOENT";
|
|
123
|
+
|
|
70
124
|
/**
|
|
71
125
|
* Returns a regular expression.
|
|
72
126
|
* @param {string} glob the pattern
|
|
@@ -79,7 +133,7 @@ const globToRegexp = (glob, cache) => {
|
|
|
79
133
|
if (!glob.includes("/")) {
|
|
80
134
|
glob = `**/${glob}`;
|
|
81
135
|
}
|
|
82
|
-
const regexpSource =
|
|
136
|
+
const regexpSource = getGlobToRegExpSource()(glob);
|
|
83
137
|
const regexp = new RegExp(`^(\\./)?${regexpSource}$`);
|
|
84
138
|
cache.set(glob, regexp);
|
|
85
139
|
return regexp;
|
|
@@ -110,6 +164,144 @@ const notSideEffectsTag = Symbol("NoSideEffects");
|
|
|
110
164
|
/** @type {(target: { module: Module }) => boolean} */
|
|
111
165
|
const RETURNS_FALSE = () => false;
|
|
112
166
|
|
|
167
|
+
/**
|
|
168
|
+
* Resolve sideEffects from the package that declares it, inheriting past a nested
|
|
169
|
+
* package.json that declares none. Globs are rebased on the declaring package root,
|
|
170
|
+
* and each package.json the walk consults becomes a dependency of the resolve.
|
|
171
|
+
* @param {InputFileSystem} fs file system
|
|
172
|
+
* @param {ResolveData} resolveData resolve data
|
|
173
|
+
* @param {string} descriptionFileRoot root directory of the nearest description file
|
|
174
|
+
* @param {OwningSideEffectsFlagCache} owningCache walk cache keyed by descriptionFileRoot
|
|
175
|
+
* @param {(result?: ResolvedSideEffectsFlag) => void} callback callback
|
|
176
|
+
* @returns {void}
|
|
177
|
+
*/
|
|
178
|
+
const resolveSideEffectsFlag = (
|
|
179
|
+
fs,
|
|
180
|
+
resolveData,
|
|
181
|
+
descriptionFileRoot,
|
|
182
|
+
owningCache,
|
|
183
|
+
callback
|
|
184
|
+
) => {
|
|
185
|
+
const resolveInfo = /** @type {ResourceResolveData} */ (
|
|
186
|
+
resolveData.createData.resourceResolveData
|
|
187
|
+
);
|
|
188
|
+
const descriptionFileData =
|
|
189
|
+
/** @type {NonNullable<ResourceResolveData["descriptionFileData"]>} */ (
|
|
190
|
+
resolveInfo.descriptionFileData
|
|
191
|
+
);
|
|
192
|
+
const relativePath = /** @type {string} */ (resolveInfo.relativePath);
|
|
193
|
+
if (descriptionFileData.sideEffects !== undefined) {
|
|
194
|
+
return callback({
|
|
195
|
+
sideEffects: /** @type {SideEffectsFlagValue} */ (
|
|
196
|
+
descriptionFileData.sideEffects
|
|
197
|
+
),
|
|
198
|
+
relativePath
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
// Named package with no sideEffects: do not inherit from outside.
|
|
202
|
+
if (descriptionFileData.name !== undefined) {
|
|
203
|
+
return callback();
|
|
204
|
+
}
|
|
205
|
+
// Only inherit for a file living under node_modules; app-local nests keep shadowing.
|
|
206
|
+
// Read the resolved path so a symlinked package flags all of its files alike.
|
|
207
|
+
if (
|
|
208
|
+
typeof resolveInfo.path !== "string" ||
|
|
209
|
+
!NODE_MODULES_REGEXP.test(resolveInfo.path)
|
|
210
|
+
) {
|
|
211
|
+
return callback();
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
// stays in descriptionFileRoot's space, which is the space packageRoot is found in
|
|
215
|
+
const resourcePath = join(fs, descriptionFileRoot, relativePath);
|
|
216
|
+
|
|
217
|
+
/**
|
|
218
|
+
* @param {OwningSideEffectsFlagWalk} walk finished walk
|
|
219
|
+
* @returns {void}
|
|
220
|
+
*/
|
|
221
|
+
const finishFromWalk = (walk) => {
|
|
222
|
+
for (const file of walk.read) resolveData.fileDependencies.add(file);
|
|
223
|
+
for (const file of walk.missing) resolveData.missingDependencies.add(file);
|
|
224
|
+
const owning = walk.owning;
|
|
225
|
+
if (owning === null) return callback();
|
|
226
|
+
const ancestorRelative = relative(
|
|
227
|
+
fs,
|
|
228
|
+
owning.packageRoot,
|
|
229
|
+
resourcePath
|
|
230
|
+
).replace(WINDOWS_PATH_SEPARATOR_REGEXP, "/");
|
|
231
|
+
return callback({
|
|
232
|
+
sideEffects: owning.sideEffects,
|
|
233
|
+
relativePath: relativePathToRequest(ancestorRelative)
|
|
234
|
+
});
|
|
235
|
+
};
|
|
236
|
+
|
|
237
|
+
const cached = owningCache.get(descriptionFileRoot);
|
|
238
|
+
if (cached !== undefined) {
|
|
239
|
+
return finishFromWalk(cached);
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/** @type {string[]} */
|
|
243
|
+
const read = [];
|
|
244
|
+
/** @type {string[]} */
|
|
245
|
+
const missing = [];
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
* @param {OwningSideEffectsFlag | null} owning declaring package or null
|
|
249
|
+
* @returns {void}
|
|
250
|
+
*/
|
|
251
|
+
const done = (owning) => {
|
|
252
|
+
/** @type {OwningSideEffectsFlagWalk} */
|
|
253
|
+
const walk = { owning, read, missing };
|
|
254
|
+
owningCache.set(descriptionFileRoot, walk);
|
|
255
|
+
return finishFromWalk(walk);
|
|
256
|
+
};
|
|
257
|
+
|
|
258
|
+
let dir = dirname(fs, descriptionFileRoot);
|
|
259
|
+
|
|
260
|
+
const next = () => {
|
|
261
|
+
const parent = dirname(fs, dir);
|
|
262
|
+
if (!parent || parent === dir) return done(null);
|
|
263
|
+
const baseName = relative(fs, parent, dir).replace(
|
|
264
|
+
WINDOWS_PATH_SEPARATOR_REGEXP,
|
|
265
|
+
"/"
|
|
266
|
+
);
|
|
267
|
+
// Do not inherit an application's sideEffects across an install boundary.
|
|
268
|
+
if (baseName === "node_modules") return done(null);
|
|
269
|
+
|
|
270
|
+
const packageJsonPath = join(fs, dir, "package.json");
|
|
271
|
+
|
|
272
|
+
readJson(fs, packageJsonPath, (err, data) => {
|
|
273
|
+
if (err) {
|
|
274
|
+
if (!isMissingPackageJsonError(err)) {
|
|
275
|
+
// it is there but unreadable, so what it declares is unknown:
|
|
276
|
+
// decline rather than let an outer flag speak for it
|
|
277
|
+
read.push(packageJsonPath);
|
|
278
|
+
return done(null);
|
|
279
|
+
}
|
|
280
|
+
missing.push(packageJsonPath);
|
|
281
|
+
dir = parent;
|
|
282
|
+
return next();
|
|
283
|
+
}
|
|
284
|
+
read.push(packageJsonPath);
|
|
285
|
+
if (!data || typeof data !== "object" || Array.isArray(data)) {
|
|
286
|
+
dir = parent;
|
|
287
|
+
return next();
|
|
288
|
+
}
|
|
289
|
+
if (data.sideEffects !== undefined) {
|
|
290
|
+
return done({
|
|
291
|
+
sideEffects: /** @type {SideEffectsFlagValue} */ (data.sideEffects),
|
|
292
|
+
packageRoot: dir
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
// An unnamed manifest deeper in the package keeps the walk going; a named one
|
|
296
|
+
// is a package of its own, and its silence is its answer.
|
|
297
|
+
if (data.name !== undefined) return done(null);
|
|
298
|
+
dir = parent;
|
|
299
|
+
next();
|
|
300
|
+
});
|
|
301
|
+
};
|
|
302
|
+
next();
|
|
303
|
+
};
|
|
304
|
+
|
|
113
305
|
/**
|
|
114
306
|
* Detects if the module is "pure single-star passthrough": one whose entire export
|
|
115
307
|
* surface is exactly one `export * from "x"` (no named/local/default-bearing
|
|
@@ -159,31 +351,62 @@ class SideEffectsFlagPlugin {
|
|
|
159
351
|
cache = new Map();
|
|
160
352
|
globToRegexpCache.set(compiler.root, cache);
|
|
161
353
|
}
|
|
354
|
+
let owningCache = owningSideEffectsFlagCache.get(compiler.root);
|
|
355
|
+
if (owningCache === undefined) {
|
|
356
|
+
owningCache = new Map();
|
|
357
|
+
owningSideEffectsFlagCache.set(compiler.root, owningCache);
|
|
358
|
+
}
|
|
162
359
|
compiler.hooks.compilation.tap(
|
|
163
360
|
PLUGIN_NAME,
|
|
164
361
|
(compilation, { normalModuleFactory }) => {
|
|
165
362
|
const moduleGraph = compilation.moduleGraph;
|
|
166
|
-
normalModuleFactory.hooks.
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
resolveData
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
363
|
+
normalModuleFactory.hooks.afterResolve.tapAsync(
|
|
364
|
+
PLUGIN_NAME,
|
|
365
|
+
(resolveData, callback) => {
|
|
366
|
+
const inputFileSystem = compiler.inputFileSystem;
|
|
367
|
+
if (!inputFileSystem) return callback();
|
|
368
|
+
const { createData } = resolveData;
|
|
369
|
+
const resolveInfo = createData.resourceResolveData;
|
|
370
|
+
if (
|
|
371
|
+
!resolveInfo ||
|
|
372
|
+
!resolveInfo.descriptionFileData ||
|
|
373
|
+
!resolveInfo.relativePath
|
|
374
|
+
) {
|
|
375
|
+
return callback();
|
|
376
|
+
}
|
|
377
|
+
const descriptionFileRoot =
|
|
378
|
+
resolveInfo.descriptionFileRoot ||
|
|
379
|
+
(resolveInfo.descriptionFilePath
|
|
380
|
+
? dirname(inputFileSystem, resolveInfo.descriptionFilePath)
|
|
381
|
+
: undefined);
|
|
382
|
+
if (descriptionFileRoot === undefined) return callback();
|
|
383
|
+
resolveSideEffectsFlag(
|
|
384
|
+
inputFileSystem,
|
|
385
|
+
resolveData,
|
|
386
|
+
descriptionFileRoot,
|
|
387
|
+
owningCache,
|
|
388
|
+
(resolved) => {
|
|
389
|
+
if (resolved !== undefined) {
|
|
390
|
+
resolvedSideEffectsFlags.set(createData, resolved);
|
|
391
|
+
}
|
|
392
|
+
callback();
|
|
177
393
|
}
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
394
|
+
);
|
|
395
|
+
}
|
|
396
|
+
);
|
|
397
|
+
normalModuleFactory.hooks.module.tap(PLUGIN_NAME, (module, data) => {
|
|
398
|
+
const resolved = resolvedSideEffectsFlags.get(data);
|
|
399
|
+
if (resolved !== undefined) {
|
|
400
|
+
if (module.factoryMeta === undefined) {
|
|
401
|
+
module.factoryMeta = {};
|
|
184
402
|
}
|
|
403
|
+
const hasSideEffects = SideEffectsFlagPlugin.moduleHasSideEffects(
|
|
404
|
+
resolved.relativePath,
|
|
405
|
+
resolved.sideEffects,
|
|
406
|
+
/** @type {CacheItem} */ (cache)
|
|
407
|
+
);
|
|
408
|
+
module.factoryMeta.sideEffectFree = !hasSideEffects;
|
|
185
409
|
}
|
|
186
|
-
|
|
187
410
|
return module;
|
|
188
411
|
});
|
|
189
412
|
normalModuleFactory.hooks.module.tap(PLUGIN_NAME, (module, data) => {
|
|
@@ -529,7 +752,7 @@ class SideEffectsFlagPlugin {
|
|
|
529
752
|
// Re-export resolution is idempotent within a pass, so cache it
|
|
530
753
|
// per export info: a shared barrel imported by many modules
|
|
531
754
|
// resolves each name once instead of once per consumer.
|
|
532
|
-
/** @type {Map<ExportInfo
|
|
755
|
+
/** @type {Map<InstanceType<ExportInfo>, TargetItemWithConnection | null>} */
|
|
533
756
|
const reexportTargetCache = new Map();
|
|
534
757
|
|
|
535
758
|
// Dependencies don't change within the pass, so the passthrough
|
|
@@ -21,21 +21,28 @@ const { makePathsRelative } = require("../util/identifier");
|
|
|
21
21
|
const memoize = require("../util/memoize");
|
|
22
22
|
const MinMaxSizeWarning = require("./MinMaxSizeWarning");
|
|
23
23
|
|
|
24
|
-
/**
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
24
|
+
/**
|
|
25
|
+
* @import {
|
|
26
|
+
* OptimizationSplitChunksCacheGroup,
|
|
27
|
+
* OptimizationSplitChunksOptions,
|
|
28
|
+
* OptimizationSplitChunksSizes
|
|
29
|
+
* } from "../../declarations/WebpackOptions"
|
|
30
|
+
*/
|
|
31
|
+
/**
|
|
32
|
+
* @import {
|
|
33
|
+
* OutputNormalizedWithDefaults as OutputOptions
|
|
34
|
+
* } from "../config/defaults"
|
|
35
|
+
*/
|
|
36
|
+
/** @import { ChunkName, ChunkFilenameTemplate } from "../Chunk" */
|
|
37
|
+
/** @import ChunkGraph from "../ChunkGraph" */
|
|
38
|
+
/** @import ChunkGroup from "../ChunkGroup" */
|
|
39
|
+
/** @import Compilation from "../Compilation" */
|
|
40
|
+
/** @import Compiler from "../Compiler" */
|
|
41
|
+
/** @import Module, { SourceType } from "../Module" */
|
|
42
|
+
/** @import ModuleGraph from "../ModuleGraph" */
|
|
36
43
|
/** @typedef {import("../util/deterministicGrouping").GroupedItems<Module>} DeterministicGroupingGroupedItemsForModule */
|
|
37
44
|
/** @typedef {import("../util/deterministicGrouping").Options<Module>} DeterministicGroupingOptionsForModule */
|
|
38
|
-
/** @
|
|
45
|
+
/** @import { Sizes } from "../util/deterministicGrouping" */
|
|
39
46
|
|
|
40
47
|
/**
|
|
41
48
|
* Defines the chunk filter fn callback.
|
|
@@ -212,6 +219,27 @@ const hashFilename = (name, outputOptions) => {
|
|
|
212
219
|
return digest.slice(0, 8);
|
|
213
220
|
};
|
|
214
221
|
|
|
222
|
+
/**
|
|
223
|
+
* A split `maxInitialRequests`/`maxAsyncRequests` refused, recorded for
|
|
224
|
+
* `performance.splitChunksCapped`.
|
|
225
|
+
* @typedef {object} CappedSplit
|
|
226
|
+
* @property {string} cacheGroup the cache group whose split was refused
|
|
227
|
+
* @property {Chunk} chunk the chunk it would have been taken out of
|
|
228
|
+
* @property {"maxAsyncRequests" | "maxInitialRequests"} limit the option that refused it
|
|
229
|
+
* @property {number} maxRequests the value that option had
|
|
230
|
+
* @property {number} modules how many modules the split would have moved
|
|
231
|
+
*/
|
|
232
|
+
|
|
233
|
+
/** @type {WeakMap<Compilation, CappedSplit[]>} */
|
|
234
|
+
const CAPPED_SPLITS = new WeakMap();
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* Reads back the splits a request cap refused during this compilation.
|
|
238
|
+
* @param {Compilation} compilation the compilation
|
|
239
|
+
* @returns {CappedSplit[] | undefined} the refused splits, or `undefined` when nothing recorded them
|
|
240
|
+
*/
|
|
241
|
+
const getCappedSplits = (compilation) => CAPPED_SPLITS.get(compilation);
|
|
242
|
+
|
|
215
243
|
/**
|
|
216
244
|
* Returns the number of requests.
|
|
217
245
|
* @param {Chunk} chunk the chunk
|
|
@@ -690,7 +718,7 @@ const createCacheGroupSource = (options, key, defaultSizeTypes) => {
|
|
|
690
718
|
|
|
691
719
|
const PLUGIN_NAME = "SplitChunksPlugin";
|
|
692
720
|
|
|
693
|
-
|
|
721
|
+
class SplitChunksPlugin {
|
|
694
722
|
/**
|
|
695
723
|
* Creates an instance of SplitChunksPlugin.
|
|
696
724
|
* @param {OptimizationSplitChunksOptions=} options plugin options
|
|
@@ -897,6 +925,19 @@ module.exports = class SplitChunksPlugin {
|
|
|
897
925
|
(chunks) => {
|
|
898
926
|
if (alreadyOptimized) return;
|
|
899
927
|
alreadyOptimized = true;
|
|
928
|
+
const { performance } = compilation.options;
|
|
929
|
+
// Mirrors both of `SplitChunksCappedPlugin`'s gates: a build that
|
|
930
|
+
// would not report records nothing and allocates nothing.
|
|
931
|
+
/** @type {CappedSplit[] | undefined} */
|
|
932
|
+
let cappedSplits;
|
|
933
|
+
if (
|
|
934
|
+
performance !== false &&
|
|
935
|
+
performance.splitChunksCapped === true &&
|
|
936
|
+
Boolean(performance.hints)
|
|
937
|
+
) {
|
|
938
|
+
cappedSplits = [];
|
|
939
|
+
CAPPED_SPLITS.set(compilation, cappedSplits);
|
|
940
|
+
}
|
|
900
941
|
logger.time("prepare");
|
|
901
942
|
const chunkGraph = compilation.chunkGraph;
|
|
902
943
|
const moduleGraph = compilation.moduleGraph;
|
|
@@ -1644,19 +1685,36 @@ module.exports = class SplitChunksPlugin {
|
|
|
1644
1685
|
Number.isFinite(item.cacheGroup.maxAsyncRequests))
|
|
1645
1686
|
) {
|
|
1646
1687
|
for (const chunk of usedChunks) {
|
|
1647
|
-
// respect max requests
|
|
1648
|
-
|
|
1649
|
-
|
|
1650
|
-
|
|
1651
|
-
|
|
1652
|
-
|
|
1653
|
-
|
|
1654
|
-
)
|
|
1655
|
-
|
|
1688
|
+
// respect max requests: a chunk that is both initial and
|
|
1689
|
+
// async answers to the stricter of the two caps
|
|
1690
|
+
const isOnlyInitial = chunk.isOnlyInitial();
|
|
1691
|
+
const byAsyncRequests =
|
|
1692
|
+
!isOnlyInitial &&
|
|
1693
|
+
(!chunk.canBeInitial() ||
|
|
1694
|
+
item.cacheGroup.maxAsyncRequests <
|
|
1695
|
+
item.cacheGroup.maxInitialRequests);
|
|
1696
|
+
const maxRequests = byAsyncRequests
|
|
1697
|
+
? item.cacheGroup.maxAsyncRequests
|
|
1698
|
+
: item.cacheGroup.maxInitialRequests;
|
|
1656
1699
|
if (
|
|
1657
1700
|
Number.isFinite(maxRequests) &&
|
|
1658
1701
|
getRequests(chunk) >= maxRequests
|
|
1659
1702
|
) {
|
|
1703
|
+
if (cappedSplits !== undefined) {
|
|
1704
|
+
cappedSplits.push({
|
|
1705
|
+
cacheGroup: item.cacheGroup.key,
|
|
1706
|
+
chunk,
|
|
1707
|
+
// which cap it was cannot be read back off the value:
|
|
1708
|
+
// the two are equal by default in production
|
|
1709
|
+
limit: byAsyncRequests
|
|
1710
|
+
? "maxAsyncRequests"
|
|
1711
|
+
: "maxInitialRequests",
|
|
1712
|
+
maxRequests:
|
|
1713
|
+
/** @type {number} */
|
|
1714
|
+
(maxRequests),
|
|
1715
|
+
modules: item.modules.size
|
|
1716
|
+
});
|
|
1717
|
+
}
|
|
1660
1718
|
usedChunks.delete(chunk);
|
|
1661
1719
|
}
|
|
1662
1720
|
}
|
|
@@ -1983,4 +2041,8 @@ module.exports = class SplitChunksPlugin {
|
|
|
1983
2041
|
);
|
|
1984
2042
|
});
|
|
1985
2043
|
}
|
|
1986
|
-
}
|
|
2044
|
+
}
|
|
2045
|
+
|
|
2046
|
+
SplitChunksPlugin.getCappedSplits = getCappedSplits;
|
|
2047
|
+
|
|
2048
|
+
module.exports = SplitChunksPlugin;
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
const WebpackError = require("../errors/WebpackError");
|
|
9
9
|
const formatSize = require("../util/formatSize");
|
|
10
10
|
|
|
11
|
-
/** @
|
|
11
|
+
/** @import { AssetDetails } from "./SizeLimitsPlugin" */
|
|
12
12
|
|
|
13
13
|
class AssetsOverSizeLimitWarning extends WebpackError {
|
|
14
14
|
/**
|
|
@@ -18,7 +18,15 @@ class AssetsOverSizeLimitWarning extends WebpackError {
|
|
|
18
18
|
*/
|
|
19
19
|
constructor(assetsOverSizeLimit, assetLimit) {
|
|
20
20
|
const assetLists = assetsOverSizeLimit
|
|
21
|
-
.map((asset) =>
|
|
21
|
+
.map((asset) => {
|
|
22
|
+
const largest = asset.modules
|
|
23
|
+
? `\n Largest modules: ${asset.modules
|
|
24
|
+
.map((module) => `${module.name} (${formatSize(module.size)})`)
|
|
25
|
+
.join(", ")}`
|
|
26
|
+
: "";
|
|
27
|
+
|
|
28
|
+
return `\n ${asset.name} (${formatSize(asset.size)})${largest}`;
|
|
29
|
+
})
|
|
22
30
|
.join("");
|
|
23
31
|
|
|
24
32
|
super(`asset size limit: The following asset(s) exceed the recommended size limit (${formatSize(
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/*
|
|
2
|
+
MIT License http://www.opensource.org/licenses/mit-license.php
|
|
3
|
+
Author Alexander Akait @alexander-akait
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
"use strict";
|
|
7
|
+
|
|
8
|
+
const AsyncChunkWaterfallWarning = require("../errors/AsyncChunkWaterfallWarning");
|
|
9
|
+
|
|
10
|
+
/** @import { PerformanceOptions } from "../../declarations/WebpackOptions" */
|
|
11
|
+
/** @import ChunkGroup from "../ChunkGroup" */
|
|
12
|
+
/** @import Compiler from "../Compiler" */
|
|
13
|
+
/** @import { WaterfallDetails } from "../errors/AsyncChunkWaterfallWarning" */
|
|
14
|
+
|
|
15
|
+
const PLUGIN_NAME = "AsyncChunkWaterfallsPlugin";
|
|
16
|
+
|
|
17
|
+
// Enough to name the offenders without printing the whole chunk graph.
|
|
18
|
+
const MAX_REPORTED_WATERFALLS = 5;
|
|
19
|
+
|
|
20
|
+
// Two levels is the shape `import()` is for — a route that loads its own data.
|
|
21
|
+
// Three is where the round trips start outweighing what splitting saved.
|
|
22
|
+
const MIN_REPORTED_DEPTH = 3;
|
|
23
|
+
|
|
24
|
+
class AsyncChunkWaterfallsPlugin {
|
|
25
|
+
/**
|
|
26
|
+
* Creates an instance of AsyncChunkWaterfallsPlugin.
|
|
27
|
+
* @param {PerformanceOptions} options the plugin options
|
|
28
|
+
*/
|
|
29
|
+
constructor(options) {
|
|
30
|
+
/** @type {PerformanceOptions["hints"]} */
|
|
31
|
+
this.hints = options.hints;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Applies the plugin by registering its hooks on the compiler.
|
|
36
|
+
* @param {Compiler} compiler the compiler instance
|
|
37
|
+
* @returns {void}
|
|
38
|
+
*/
|
|
39
|
+
apply(compiler) {
|
|
40
|
+
const hints = this.hints;
|
|
41
|
+
|
|
42
|
+
if (!hints) return;
|
|
43
|
+
|
|
44
|
+
compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation) => {
|
|
45
|
+
// `afterSeal` is past the hash, which folds every message into it — a
|
|
46
|
+
// hint reported earlier would change the build's identity.
|
|
47
|
+
compilation.hooks.afterSeal.tap(PLUGIN_NAME, () => {
|
|
48
|
+
const { chunkGraph } = compilation;
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* The name to print for a group; ids exist by `afterSeal`.
|
|
52
|
+
* @param {ChunkGroup} group the group
|
|
53
|
+
* @returns {string} what to call it
|
|
54
|
+
*/
|
|
55
|
+
const nameOf = (group) => {
|
|
56
|
+
if (group.name) return group.name;
|
|
57
|
+
|
|
58
|
+
const [chunk] = group.chunks;
|
|
59
|
+
|
|
60
|
+
return chunk && chunk.id !== null ? `${chunk.id}` : "(unnamed)";
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
// Breadth-first from the initial groups, so the depth recorded for a
|
|
64
|
+
// group is the fewest requests a client makes to reach it.
|
|
65
|
+
/** @type {Map<ChunkGroup, ChunkGroup[]>} */
|
|
66
|
+
const pathTo = new Map();
|
|
67
|
+
/** @type {ChunkGroup[]} */
|
|
68
|
+
const queue = [];
|
|
69
|
+
|
|
70
|
+
for (const group of compilation.chunkGroups) {
|
|
71
|
+
if (!group.isInitial()) continue;
|
|
72
|
+
|
|
73
|
+
pathTo.set(group, []);
|
|
74
|
+
queue.push(group);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/** @type {WaterfallDetails[]} */
|
|
78
|
+
const waterfalls = [];
|
|
79
|
+
let deepest = 0;
|
|
80
|
+
|
|
81
|
+
for (let i = 0; i < queue.length; i++) {
|
|
82
|
+
const group = queue[i];
|
|
83
|
+
const path = /** @type {ChunkGroup[]} */ (pathTo.get(group));
|
|
84
|
+
|
|
85
|
+
for (const child of group.getChildren()) {
|
|
86
|
+
if (pathTo.has(child)) continue;
|
|
87
|
+
|
|
88
|
+
const childPath = [...path, child];
|
|
89
|
+
|
|
90
|
+
pathTo.set(child, childPath);
|
|
91
|
+
queue.push(child);
|
|
92
|
+
|
|
93
|
+
if (childPath.length < MIN_REPORTED_DEPTH) continue;
|
|
94
|
+
|
|
95
|
+
// Only the end of a chain is reported: every prefix of it is a
|
|
96
|
+
// waterfall too, and naming them all says the same thing N times.
|
|
97
|
+
if (child.getNumberOfChildren() > 0) continue;
|
|
98
|
+
|
|
99
|
+
let size = 0;
|
|
100
|
+
|
|
101
|
+
for (const step of childPath) {
|
|
102
|
+
for (const chunk of step.chunks) {
|
|
103
|
+
size += chunkGraph.getChunkSize(chunk);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
deepest = Math.max(deepest, childPath.length);
|
|
108
|
+
waterfalls.push({ chain: childPath.map(nameOf), size });
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
if (waterfalls.length === 0) return;
|
|
113
|
+
|
|
114
|
+
// Deepest first, then largest: the worst round-trip cost leads.
|
|
115
|
+
waterfalls.sort(
|
|
116
|
+
(a, b) => b.chain.length - a.chain.length || b.size - a.size
|
|
117
|
+
);
|
|
118
|
+
|
|
119
|
+
const warning = new AsyncChunkWaterfallWarning(
|
|
120
|
+
waterfalls.slice(0, MAX_REPORTED_WATERFALLS),
|
|
121
|
+
deepest
|
|
122
|
+
);
|
|
123
|
+
|
|
124
|
+
if (hints === "error") {
|
|
125
|
+
compilation.errors.push(warning);
|
|
126
|
+
} else if (hints === "stats") {
|
|
127
|
+
compilation.hints.push(warning);
|
|
128
|
+
} else {
|
|
129
|
+
compilation.warnings.push(warning);
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
module.exports = AsyncChunkWaterfallsPlugin;
|