@depup/webpack 5.109.2-depup.0 → 5.110.3-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 +46 -35
- 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 +107 -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 +91 -26
- 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 +111 -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 +40 -49
- 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 +152 -103
- 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 +335 -169
- package/lib/RuntimeTemplate.js +2761 -316
- 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 +12 -6
- 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 +270 -78
- package/lib/config/defineConfig.js +10 -2
- package/lib/config/getClaimedAssetTypes.js +65 -0
- package/lib/config/normalization.js +46 -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 +84 -32
- package/lib/css/CssModule.js +10 -7
- package/lib/css/CssModulesPlugin.js +172 -100
- 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 +5334 -0
- package/lib/css/syntax.js +9647 -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 +170 -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 +24 -11
- 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 +23 -14
- package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +80 -12
- package/lib/dependencies/HarmonyExportExpressionDependency.js +23 -18
- package/lib/dependencies/HarmonyExportHeaderDependency.js +7 -7
- package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +286 -80
- 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 +121 -60
- package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +124 -38
- package/lib/dependencies/HarmonyImportGuard.js +20 -30
- package/lib/dependencies/HarmonyImportSideEffectDependency.js +152 -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 +49 -31
- 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 +45 -5
- package/lib/dependencies/ImportDependency.js +33 -50
- 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 +73 -49
- 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 +50 -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 +47 -28
- package/lib/dependencies/WorkerDependency.js +22 -22
- package/lib/dependencies/WorkletDependency.js +18 -21
- package/lib/dependencies/getFunctionExpression.js +8 -4
- package/lib/dependencies/importOptionsCheck.js +47 -0
- 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/DotenvFileError.js +29 -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/ImportedBindingAssignmentError.js +30 -0
- 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 +86 -51
- package/lib/esm/ModuleChunkLoadingRuntimeModule.js +161 -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 +366 -200
- 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 +6034 -1384
- 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 +103 -123
- 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 +47 -6
- 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 +65 -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 +1030 -476
- package/lib/optimize/ConstExportsPlugin.js +16 -7
- package/lib/optimize/EnsureChunkConditionsPlugin.js +3 -3
- package/lib/optimize/FlagIncludedChunksPlugin.js +3 -4
- package/lib/optimize/InlineExports.js +130 -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 +121 -41
- 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 -79
- 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 +6 -2
- 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 +34 -7
- 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 +46 -20
- 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 +22 -9
- 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 +20 -24
- package/lib/url/URLParserPlugin.js +26 -13
- package/lib/util/ArrayQueue.js +3 -3
- 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 +1066 -24
- package/lib/util/StringXor.js +1 -1
- package/lib/util/URLAbsoluteSpecifier.js +3 -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 +10 -2
- package/lib/util/createHash.js +2 -2
- package/lib/util/createHooksRegistry.js +8 -10
- package/lib/util/createMappings.js +25 -3
- 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 +8 -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/removeBOM.js +82 -1
- 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 +43 -21
- package/lib/wasm-async/AsyncWasmLoadingRuntimeModule.js +45 -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 +29 -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 +105 -19
- package/lib/web/FetchCompileWasmPlugin.js +48 -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 +667 -34
- 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 +3223 -465
- package/lib/runtime/CommonJsWrapRuntimeModule.js +0 -37
|
@@ -5,24 +5,40 @@
|
|
|
5
5
|
|
|
6
6
|
"use strict";
|
|
7
7
|
|
|
8
|
+
const RuntimeGlobals = require("../RuntimeGlobals");
|
|
9
|
+
const RuntimeModule = require("../RuntimeModule");
|
|
8
10
|
const { find } = require("../util/SetHelpers");
|
|
11
|
+
const { compareStrings } = require("../util/comparators");
|
|
9
12
|
const AssetsOverSizeLimitWarning = require("./AssetsOverSizeLimitWarning");
|
|
10
13
|
const EntrypointsOverSizeLimitWarning = require("./EntrypointsOverSizeLimitWarning");
|
|
11
14
|
const NoAsyncChunksWarning = require("./NoAsyncChunksWarning");
|
|
15
|
+
const RuntimeInLargeChunkWarning = require("./RuntimeInLargeChunkWarning");
|
|
16
|
+
const getModuleSize = require("./getModuleSize");
|
|
12
17
|
|
|
13
|
-
/** @
|
|
14
|
-
/** @
|
|
15
|
-
/** @
|
|
16
|
-
/** @
|
|
17
|
-
/** @
|
|
18
|
-
/** @
|
|
19
|
-
/** @
|
|
18
|
+
/** @import { Source } from "webpack-sources" */
|
|
19
|
+
/** @import { PerformanceOptions } from "../../declarations/WebpackOptions" */
|
|
20
|
+
/** @import Chunk from "../Chunk" */
|
|
21
|
+
/** @import ChunkGraph from "../ChunkGraph" */
|
|
22
|
+
/** @import ChunkGroup from "../ChunkGroup" */
|
|
23
|
+
/** @import Compilation, { Asset } from "../Compilation" */
|
|
24
|
+
/** @import Compiler from "../Compiler" */
|
|
25
|
+
/** @import Module from "../Module" */
|
|
26
|
+
/** @import Entrypoint from "../Entrypoint" */
|
|
27
|
+
/** @import WebpackError from "../errors/WebpackError" */
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Defines the module details type used by this module.
|
|
31
|
+
* @typedef {object} ModuleDetails
|
|
32
|
+
* @property {string} name
|
|
33
|
+
* @property {number} size
|
|
34
|
+
*/
|
|
20
35
|
|
|
21
36
|
/**
|
|
22
37
|
* Defines the asset details type used by this module.
|
|
23
38
|
* @typedef {object} AssetDetails
|
|
24
39
|
* @property {string} name
|
|
25
40
|
* @property {number} size
|
|
41
|
+
* @property {ModuleDetails[]=} modules
|
|
26
42
|
*/
|
|
27
43
|
|
|
28
44
|
/**
|
|
@@ -41,6 +57,108 @@ const isOverSizeLimitSet = new WeakSet();
|
|
|
41
57
|
/** @type {AssetFilter} */
|
|
42
58
|
const excludeSourceMap = (name, source, info) => !info.development;
|
|
43
59
|
|
|
60
|
+
// Runtime globals whose generated code describes the other chunks, so the chunk
|
|
61
|
+
// holding them is rewritten whenever anything else in the build changes.
|
|
62
|
+
const BUILD_WIDE_RUNTIME_GLOBALS = [
|
|
63
|
+
RuntimeGlobals.getChunkScriptFilename,
|
|
64
|
+
RuntimeGlobals.getChunkCssFilename,
|
|
65
|
+
RuntimeGlobals.getChunkUpdateScriptFilename,
|
|
66
|
+
RuntimeGlobals.getFullHash,
|
|
67
|
+
RuntimeGlobals.getUpdateManifestFilename
|
|
68
|
+
];
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Tells whether an entrypoint ships its runtime inside a chunk that also carries
|
|
72
|
+
* modules, and that runtime describes the rest of the build. Only then does
|
|
73
|
+
* `optimization.runtimeChunk` win anything.
|
|
74
|
+
* @param {ChunkGraph} chunkGraph the chunk graph
|
|
75
|
+
* @param {Entrypoint} entrypoint an entrypoint
|
|
76
|
+
* @returns {boolean} true when splitting the runtime off would keep the chunk stable
|
|
77
|
+
*/
|
|
78
|
+
const hasEmbeddedRuntime = (chunkGraph, entrypoint) => {
|
|
79
|
+
const runtimeChunk = entrypoint.getRuntimeChunk();
|
|
80
|
+
if (!runtimeChunk) return false;
|
|
81
|
+
// A chunk of its own carries the runtime modules and nothing else. Asking each
|
|
82
|
+
// module beats counting, which depends on runtime modules being counted twice.
|
|
83
|
+
let carriesCode = false;
|
|
84
|
+
for (const module of chunkGraph.getChunkModulesIterable(runtimeChunk)) {
|
|
85
|
+
if (!(module instanceof RuntimeModule)) {
|
|
86
|
+
carriesCode = true;
|
|
87
|
+
break;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
if (!carriesCode) return false;
|
|
91
|
+
// The tree requirements are the ones the emitted runtime modules answer to.
|
|
92
|
+
const runtimeRequirements =
|
|
93
|
+
chunkGraph.getTreeRuntimeRequirements(runtimeChunk);
|
|
94
|
+
// A global nothing here names stays silent, so a new one costs a hint, not a wrong one.
|
|
95
|
+
return BUILD_WIDE_RUNTIME_GLOBALS.some((runtimeGlobal) =>
|
|
96
|
+
runtimeRequirements.has(runtimeGlobal)
|
|
97
|
+
);
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
// Enough to point at the culprit without turning the hint into a report.
|
|
101
|
+
const MAX_REPORTED_MODULES = 3;
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Names the largest modules inside each oversized asset. "This file is too big"
|
|
105
|
+
* is only actionable once you know what fills it.
|
|
106
|
+
* @param {Compilation} compilation the compilation
|
|
107
|
+
* @param {AssetDetails[]} assetsOverSizeLimit the oversized assets, annotated in place
|
|
108
|
+
* @returns {void}
|
|
109
|
+
*/
|
|
110
|
+
const addLargestModules = (compilation, assetsOverSizeLimit) => {
|
|
111
|
+
const { chunkGraph, requestShortener } = compilation;
|
|
112
|
+
/** @type {Map<string, Chunk[]>} */
|
|
113
|
+
const chunksByFile = new Map();
|
|
114
|
+
|
|
115
|
+
for (const chunk of compilation.chunks) {
|
|
116
|
+
// A chunk emitting several files (javascript plus extracted css, …) gives
|
|
117
|
+
// no way to tell which module ended up in which, so it names none.
|
|
118
|
+
if (chunk.files.size !== 1) continue;
|
|
119
|
+
|
|
120
|
+
for (const file of chunk.files) {
|
|
121
|
+
const chunks = chunksByFile.get(file);
|
|
122
|
+
|
|
123
|
+
if (chunks === undefined) {
|
|
124
|
+
chunksByFile.set(file, [chunk]);
|
|
125
|
+
} else {
|
|
126
|
+
chunks.push(chunk);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
for (const asset of assetsOverSizeLimit) {
|
|
132
|
+
const chunks = chunksByFile.get(asset.name);
|
|
133
|
+
|
|
134
|
+
// An asset a loader or plugin emitted belongs to no chunk, so nothing
|
|
135
|
+
// describes its contents; likewise one whose chunk emits several files.
|
|
136
|
+
if (chunks === undefined) continue;
|
|
137
|
+
|
|
138
|
+
/** @type {Set<Module>} */
|
|
139
|
+
const seen = new Set();
|
|
140
|
+
/** @type {ModuleDetails[]} */
|
|
141
|
+
const modules = [];
|
|
142
|
+
|
|
143
|
+
for (const chunk of chunks) {
|
|
144
|
+
for (const module of chunkGraph.getChunkModulesIterable(chunk)) {
|
|
145
|
+
if (seen.has(module)) continue;
|
|
146
|
+
seen.add(module);
|
|
147
|
+
modules.push({
|
|
148
|
+
name: module.readableIdentifier(requestShortener),
|
|
149
|
+
size: getModuleSize(module)
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
if (modules.length === 0) continue;
|
|
155
|
+
|
|
156
|
+
// Ties break by name: which modules finish first is not stable.
|
|
157
|
+
modules.sort((a, b) => b.size - a.size || compareStrings(a.name, b.name));
|
|
158
|
+
asset.modules = modules.slice(0, MAX_REPORTED_MODULES);
|
|
159
|
+
}
|
|
160
|
+
};
|
|
161
|
+
|
|
44
162
|
const PLUGIN_NAME = "SizeLimitsPlugin";
|
|
45
163
|
|
|
46
164
|
module.exports = class SizeLimitsPlugin {
|
|
@@ -132,6 +250,8 @@ module.exports = class SizeLimitsPlugin {
|
|
|
132
250
|
|
|
133
251
|
/** @type {EntrypointDetails[]} */
|
|
134
252
|
const entrypointsOverLimit = [];
|
|
253
|
+
/** @type {string[]} */
|
|
254
|
+
const entrypointsWithEmbeddedRuntime = [];
|
|
135
255
|
for (const [name, entry] of compilation.entrypoints) {
|
|
136
256
|
const size = getEntrypointSize(entry);
|
|
137
257
|
|
|
@@ -142,6 +262,9 @@ module.exports = class SizeLimitsPlugin {
|
|
|
142
262
|
files: entry.getFiles().filter(fileFilter)
|
|
143
263
|
});
|
|
144
264
|
isOverSizeLimitSet.add(entry);
|
|
265
|
+
if (hasEmbeddedRuntime(compilation.chunkGraph, entry)) {
|
|
266
|
+
entrypointsWithEmbeddedRuntime.push(name);
|
|
267
|
+
}
|
|
145
268
|
}
|
|
146
269
|
}
|
|
147
270
|
|
|
@@ -151,6 +274,7 @@ module.exports = class SizeLimitsPlugin {
|
|
|
151
274
|
// 3. No Async Chunks
|
|
152
275
|
// if !1, then 2, if !2 return
|
|
153
276
|
if (assetsOverSizeLimit.length > 0) {
|
|
277
|
+
addLargestModules(compilation, assetsOverSizeLimit);
|
|
154
278
|
warnings.push(
|
|
155
279
|
new AssetsOverSizeLimitWarning(
|
|
156
280
|
assetsOverSizeLimit,
|
|
@@ -177,8 +301,16 @@ module.exports = class SizeLimitsPlugin {
|
|
|
177
301
|
warnings.push(new NoAsyncChunksWarning());
|
|
178
302
|
}
|
|
179
303
|
|
|
304
|
+
if (entrypointsWithEmbeddedRuntime.length > 0) {
|
|
305
|
+
warnings.push(
|
|
306
|
+
new RuntimeInLargeChunkWarning(entrypointsWithEmbeddedRuntime)
|
|
307
|
+
);
|
|
308
|
+
}
|
|
309
|
+
|
|
180
310
|
if (hints === "error") {
|
|
181
311
|
compilation.errors.push(...warnings);
|
|
312
|
+
} else if (hints === "stats") {
|
|
313
|
+
compilation.hints.push(...warnings);
|
|
182
314
|
} else {
|
|
183
315
|
compilation.warnings.push(...warnings);
|
|
184
316
|
}
|
|
@@ -0,0 +1,99 @@
|
|
|
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 SplitChunksCappedWarning = require("../errors/SplitChunksCappedWarning");
|
|
9
|
+
const { getCappedSplits } = require("../optimize/SplitChunksPlugin");
|
|
10
|
+
const { compareStrings } = require("../util/comparators");
|
|
11
|
+
|
|
12
|
+
/** @import { PerformanceOptions } from "../../declarations/WebpackOptions" */
|
|
13
|
+
/** @import Compiler from "../Compiler" */
|
|
14
|
+
/** @import { CappedSplitDetails } from "../errors/SplitChunksCappedWarning" */
|
|
15
|
+
|
|
16
|
+
const PLUGIN_NAME = "SplitChunksCappedPlugin";
|
|
17
|
+
|
|
18
|
+
// Enough to name the offenders without printing the chunk graph.
|
|
19
|
+
const MAX_REPORTED_SPLITS = 5;
|
|
20
|
+
|
|
21
|
+
class SplitChunksCappedPlugin {
|
|
22
|
+
/**
|
|
23
|
+
* Creates an instance of SplitChunksCappedPlugin.
|
|
24
|
+
* @param {PerformanceOptions} options the plugin options
|
|
25
|
+
*/
|
|
26
|
+
constructor(options) {
|
|
27
|
+
/** @type {PerformanceOptions["hints"]} */
|
|
28
|
+
this.hints = options.hints;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Applies the plugin by registering its hooks on the compiler.
|
|
33
|
+
* @param {Compiler} compiler the compiler instance
|
|
34
|
+
* @returns {void}
|
|
35
|
+
*/
|
|
36
|
+
apply(compiler) {
|
|
37
|
+
const hints = this.hints;
|
|
38
|
+
|
|
39
|
+
if (!hints) return;
|
|
40
|
+
|
|
41
|
+
compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation) => {
|
|
42
|
+
compilation.hooks.afterSeal.tap(PLUGIN_NAME, () => {
|
|
43
|
+
const recorded = getCappedSplits(compilation);
|
|
44
|
+
|
|
45
|
+
if (recorded === undefined || recorded.length === 0) return;
|
|
46
|
+
|
|
47
|
+
/** @type {Map<string, CappedSplitDetails>} */
|
|
48
|
+
const splits = new Map();
|
|
49
|
+
|
|
50
|
+
for (const split of recorded) {
|
|
51
|
+
// Chunk ids only exist after seal, and the queue reconsiders a
|
|
52
|
+
// refused split, so the same one is recorded several times.
|
|
53
|
+
const chunk = split.chunk.name || `${split.chunk.id}`;
|
|
54
|
+
const key = `${split.cacheGroup} ${chunk} ${split.limit}`;
|
|
55
|
+
const previous = splits.get(key);
|
|
56
|
+
|
|
57
|
+
if (previous !== undefined && previous.modules >= split.modules) {
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
splits.set(key, {
|
|
62
|
+
cacheGroup: split.cacheGroup,
|
|
63
|
+
chunk,
|
|
64
|
+
limit: split.limit,
|
|
65
|
+
maxRequests: split.maxRequests,
|
|
66
|
+
modules: split.modules
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// Held only to be reported: nothing needs the chunks after this.
|
|
71
|
+
recorded.length = 0;
|
|
72
|
+
|
|
73
|
+
const details = [...splits.values()];
|
|
74
|
+
|
|
75
|
+
// Ties break by name: the order splits are refused in is not stable.
|
|
76
|
+
details.sort(
|
|
77
|
+
(a, b) =>
|
|
78
|
+
b.modules - a.modules ||
|
|
79
|
+
compareStrings(a.cacheGroup, b.cacheGroup) ||
|
|
80
|
+
compareStrings(a.chunk, b.chunk)
|
|
81
|
+
);
|
|
82
|
+
|
|
83
|
+
const warning = new SplitChunksCappedWarning(
|
|
84
|
+
details.slice(0, MAX_REPORTED_SPLITS)
|
|
85
|
+
);
|
|
86
|
+
|
|
87
|
+
if (hints === "error") {
|
|
88
|
+
compilation.errors.push(warning);
|
|
89
|
+
} else if (hints === "stats") {
|
|
90
|
+
compilation.hints.push(warning);
|
|
91
|
+
} else {
|
|
92
|
+
compilation.warnings.push(warning);
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
module.exports = SplitChunksCappedPlugin;
|
|
@@ -0,0 +1,128 @@
|
|
|
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 TinyChunksWarning = require("../errors/TinyChunksWarning");
|
|
9
|
+
const { compareStrings } = require("../util/comparators");
|
|
10
|
+
|
|
11
|
+
/** @import { PerformanceOptions } from "../../declarations/WebpackOptions" */
|
|
12
|
+
/** @import Compiler from "../Compiler" */
|
|
13
|
+
/** @import { TinyChunkDetails } from "../errors/TinyChunksWarning" */
|
|
14
|
+
|
|
15
|
+
const PLUGIN_NAME = "TinyChunksPlugin";
|
|
16
|
+
|
|
17
|
+
// Enough to name the offenders without printing the chunk graph.
|
|
18
|
+
const MAX_REPORTED_CHUNKS = 5;
|
|
19
|
+
|
|
20
|
+
// One small chunk is a lazy route; a crowd of them is a request pattern, and
|
|
21
|
+
// only then does grouping them save more than it costs.
|
|
22
|
+
const MIN_REPORTED_CHUNKS = 10;
|
|
23
|
+
|
|
24
|
+
// What `splitChunks.minSize` falls back to when it is absent or given per
|
|
25
|
+
// source type rather than as one number.
|
|
26
|
+
const DEFAULT_MIN_SIZE = 20000;
|
|
27
|
+
|
|
28
|
+
class TinyChunksPlugin {
|
|
29
|
+
/**
|
|
30
|
+
* Creates an instance of TinyChunksPlugin.
|
|
31
|
+
* @param {PerformanceOptions} options the plugin options
|
|
32
|
+
*/
|
|
33
|
+
constructor(options) {
|
|
34
|
+
/** @type {PerformanceOptions["hints"]} */
|
|
35
|
+
this.hints = options.hints;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Applies the plugin by registering its hooks on the compiler.
|
|
40
|
+
* @param {Compiler} compiler the compiler instance
|
|
41
|
+
* @returns {void}
|
|
42
|
+
*/
|
|
43
|
+
apply(compiler) {
|
|
44
|
+
const hints = this.hints;
|
|
45
|
+
|
|
46
|
+
if (!hints) return;
|
|
47
|
+
|
|
48
|
+
const { splitChunks } = compiler.options.optimization;
|
|
49
|
+
const configured = splitChunks && splitChunks.minSize;
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Read from `splitChunks.minSize`, so raising the size worth splitting
|
|
53
|
+
* raises what counts as too small. Either one number or one per type.
|
|
54
|
+
* @param {string} sourceType the type in question
|
|
55
|
+
* @returns {number} the floor below which a chunk of it is too small
|
|
56
|
+
*/
|
|
57
|
+
const minSizeFor = (sourceType) => {
|
|
58
|
+
if (typeof configured === "number") return configured;
|
|
59
|
+
|
|
60
|
+
if (configured) {
|
|
61
|
+
const forType = configured[sourceType];
|
|
62
|
+
|
|
63
|
+
if (typeof forType === "number") return forType;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
return DEFAULT_MIN_SIZE;
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation) => {
|
|
70
|
+
// `afterSeal` is past the hash, which folds every message into it — a
|
|
71
|
+
// hint reported earlier would change the build's identity.
|
|
72
|
+
compilation.hooks.afterSeal.tap(PLUGIN_NAME, () => {
|
|
73
|
+
const { chunkGraph } = compilation;
|
|
74
|
+
/** @type {TinyChunkDetails[]} */
|
|
75
|
+
const tiny = [];
|
|
76
|
+
let totalSize = 0;
|
|
77
|
+
|
|
78
|
+
for (const chunk of compilation.chunks) {
|
|
79
|
+
// An initial chunk is downloaded whatever its size; only one fetched
|
|
80
|
+
// on demand costs a request of its own.
|
|
81
|
+
if (chunk.canBeInitial()) continue;
|
|
82
|
+
|
|
83
|
+
const sizes = chunkGraph.getChunkModulesSizes(chunk);
|
|
84
|
+
const types = Object.keys(sizes);
|
|
85
|
+
|
|
86
|
+
if (types.length === 0) continue;
|
|
87
|
+
|
|
88
|
+
// Under its own floor for every type it carries: a chunk holding
|
|
89
|
+
// enough of any one of them is worth the request it costs.
|
|
90
|
+
let size = 0;
|
|
91
|
+
let small = true;
|
|
92
|
+
|
|
93
|
+
for (const type of types) {
|
|
94
|
+
size += sizes[type];
|
|
95
|
+
|
|
96
|
+
if (sizes[type] >= minSizeFor(type)) small = false;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
if (!small) continue;
|
|
100
|
+
|
|
101
|
+
totalSize += size;
|
|
102
|
+
tiny.push({ name: chunk.name || `${chunk.id}`, size });
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
if (tiny.length < MIN_REPORTED_CHUNKS) return;
|
|
106
|
+
|
|
107
|
+
// Smallest first, and ties break by name: chunk order is not stable.
|
|
108
|
+
tiny.sort((a, b) => a.size - b.size || compareStrings(a.name, b.name));
|
|
109
|
+
|
|
110
|
+
const warning = new TinyChunksWarning(
|
|
111
|
+
tiny.slice(0, MAX_REPORTED_CHUNKS),
|
|
112
|
+
tiny.length,
|
|
113
|
+
totalSize
|
|
114
|
+
);
|
|
115
|
+
|
|
116
|
+
if (hints === "error") {
|
|
117
|
+
compilation.errors.push(warning);
|
|
118
|
+
} else if (hints === "stats") {
|
|
119
|
+
compilation.hints.push(warning);
|
|
120
|
+
} else {
|
|
121
|
+
compilation.warnings.push(warning);
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
module.exports = TinyChunksPlugin;
|
|
@@ -0,0 +1,208 @@
|
|
|
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 {
|
|
9
|
+
JAVASCRIPT_MODULE_TYPE_AUTO,
|
|
10
|
+
JAVASCRIPT_MODULE_TYPE_DYNAMIC,
|
|
11
|
+
JAVASCRIPT_MODULE_TYPE_ESM
|
|
12
|
+
} = require("../ModuleTypeConstants");
|
|
13
|
+
const TopLevelThisWarning = require("../errors/TopLevelThisWarning");
|
|
14
|
+
const { compareStrings } = require("../util/comparators");
|
|
15
|
+
const getSourceModules = require("./getSourceModules");
|
|
16
|
+
|
|
17
|
+
/** @import { Program } from "estree" */
|
|
18
|
+
/** @import { PerformanceOptions } from "../../declarations/WebpackOptions" */
|
|
19
|
+
/** @import Compiler from "../Compiler" */
|
|
20
|
+
/** @import Module from "../Module" */
|
|
21
|
+
/** @import { BuildInfo } from "../Module" */
|
|
22
|
+
/** @import JavascriptParser from "../javascript/JavascriptParser" */
|
|
23
|
+
/** @import { TopLevelThisDetails } from "../errors/TopLevelThisWarning" */
|
|
24
|
+
|
|
25
|
+
const PLUGIN_NAME = "TopLevelThisPlugin";
|
|
26
|
+
|
|
27
|
+
// Enough to name the offenders without listing every module.
|
|
28
|
+
const MAX_REPORTED_MODULES = 5;
|
|
29
|
+
|
|
30
|
+
// Bodies that rebind `this`; everything else keeps the enclosing one, so an
|
|
31
|
+
// arrow function at the top level still reads the module's `this`.
|
|
32
|
+
const REBINDS_THIS = new Set(["FunctionDeclaration", "FunctionExpression"]);
|
|
33
|
+
|
|
34
|
+
// A class rebinds `this` in its body, but its heritage clause and computed
|
|
35
|
+
// keys are evaluated where the class is written.
|
|
36
|
+
const CLASS_TYPES = new Set(["ClassDeclaration", "ClassExpression"]);
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Counts the reads of `this` that reach the top level of a program.
|
|
40
|
+
* @param {Program} ast the program
|
|
41
|
+
* @returns {number} how many there are
|
|
42
|
+
*/
|
|
43
|
+
const countTopLevelThis = (ast) => {
|
|
44
|
+
let count = 0;
|
|
45
|
+
/** @type {unknown[]} */
|
|
46
|
+
const queue = [ast];
|
|
47
|
+
|
|
48
|
+
while (queue.length > 0) {
|
|
49
|
+
const node = queue.pop();
|
|
50
|
+
|
|
51
|
+
if (!node || typeof node !== "object") continue;
|
|
52
|
+
|
|
53
|
+
if (Array.isArray(node)) {
|
|
54
|
+
for (const item of /** @type {unknown[]} */ (node)) queue.push(item);
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// Walked structurally rather than per node type, so a node the estree
|
|
59
|
+
// types do not name is still reached.
|
|
60
|
+
const fields = /** @type {Record<string, unknown>} */ (node);
|
|
61
|
+
const { type } = fields;
|
|
62
|
+
|
|
63
|
+
if (typeof type !== "string") continue;
|
|
64
|
+
if (REBINDS_THIS.has(type)) continue;
|
|
65
|
+
|
|
66
|
+
if (type === "ThisExpression") {
|
|
67
|
+
count++;
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
if (CLASS_TYPES.has(type)) {
|
|
72
|
+
queue.push(fields.superClass);
|
|
73
|
+
|
|
74
|
+
const body = /** @type {EXPECTED_ANY} */ (fields.body);
|
|
75
|
+
|
|
76
|
+
for (const element of (body && body.body) || []) {
|
|
77
|
+
if (element.computed) queue.push(element.key);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
for (const key of Object.keys(fields)) {
|
|
84
|
+
if (key !== "range" && key !== "loc") queue.push(fields[key]);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
return count;
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
class TopLevelThisPlugin {
|
|
92
|
+
/**
|
|
93
|
+
* Creates an instance of TopLevelThisPlugin.
|
|
94
|
+
* @param {PerformanceOptions} options the plugin options
|
|
95
|
+
*/
|
|
96
|
+
constructor(options) {
|
|
97
|
+
/** @type {PerformanceOptions["hints"]} */
|
|
98
|
+
this.hints = options.hints;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Applies the plugin by registering its hooks on the compiler.
|
|
103
|
+
* @param {Compiler} compiler the compiler instance
|
|
104
|
+
* @returns {void}
|
|
105
|
+
*/
|
|
106
|
+
apply(compiler) {
|
|
107
|
+
const hints = this.hints;
|
|
108
|
+
|
|
109
|
+
if (!hints) return;
|
|
110
|
+
|
|
111
|
+
compiler.hooks.compilation.tap(
|
|
112
|
+
PLUGIN_NAME,
|
|
113
|
+
(compilation, { normalModuleFactory }) => {
|
|
114
|
+
/**
|
|
115
|
+
* @param {JavascriptParser} parser the parser
|
|
116
|
+
* @returns {void}
|
|
117
|
+
*/
|
|
118
|
+
const handler = (parser) => {
|
|
119
|
+
parser.hooks.program.tap(PLUGIN_NAME, (ast) => {
|
|
120
|
+
// Only ES modules: in CommonJS `this` is `module.exports`, which
|
|
121
|
+
// is what the code reading it means.
|
|
122
|
+
const buildMeta = parser.state.module.buildMeta;
|
|
123
|
+
|
|
124
|
+
if (!buildMeta || buildMeta.exportsType !== "namespace") return;
|
|
125
|
+
|
|
126
|
+
const count = countTopLevelThis(ast);
|
|
127
|
+
|
|
128
|
+
if (count === 0) return;
|
|
129
|
+
|
|
130
|
+
// Kept on the module rather than in a map here, so a module the
|
|
131
|
+
// filesystem cache restores rather than parses still reports.
|
|
132
|
+
const buildInfo =
|
|
133
|
+
/** @type {BuildInfo} */
|
|
134
|
+
(parser.state.module.buildInfo);
|
|
135
|
+
|
|
136
|
+
buildInfo.topLevelThis = count;
|
|
137
|
+
});
|
|
138
|
+
};
|
|
139
|
+
|
|
140
|
+
normalModuleFactory.hooks.parser
|
|
141
|
+
.for(JAVASCRIPT_MODULE_TYPE_AUTO)
|
|
142
|
+
.tap(PLUGIN_NAME, handler);
|
|
143
|
+
normalModuleFactory.hooks.parser
|
|
144
|
+
.for(JAVASCRIPT_MODULE_TYPE_ESM)
|
|
145
|
+
.tap(PLUGIN_NAME, handler);
|
|
146
|
+
normalModuleFactory.hooks.parser
|
|
147
|
+
.for(JAVASCRIPT_MODULE_TYPE_DYNAMIC)
|
|
148
|
+
.tap(PLUGIN_NAME, handler);
|
|
149
|
+
|
|
150
|
+
// `afterSeal` is past the hash, which folds every message into it — a
|
|
151
|
+
// hint reported earlier would change the build's identity.
|
|
152
|
+
compilation.hooks.afterSeal.tap(PLUGIN_NAME, () => {
|
|
153
|
+
/** @type {TopLevelThisDetails[]} */
|
|
154
|
+
const modules = [];
|
|
155
|
+
let total = 0;
|
|
156
|
+
|
|
157
|
+
// A module can be reached both on its own and inside a
|
|
158
|
+
// concatenation, so it is only counted the first time.
|
|
159
|
+
/** @type {Set<Module>} */
|
|
160
|
+
const seen = new Set();
|
|
161
|
+
|
|
162
|
+
for (const parent of compilation.modules) {
|
|
163
|
+
// Scope hoisting makes several modules into one, and the evidence
|
|
164
|
+
// sits on the ones that were parsed.
|
|
165
|
+
for (const module of getSourceModules(parent)) {
|
|
166
|
+
if (seen.has(module)) continue;
|
|
167
|
+
|
|
168
|
+
seen.add(module);
|
|
169
|
+
|
|
170
|
+
const buildInfo = /** @type {BuildInfo} */ (module.buildInfo);
|
|
171
|
+
const count = buildInfo.topLevelThis;
|
|
172
|
+
|
|
173
|
+
if (!count) continue;
|
|
174
|
+
|
|
175
|
+
total += count;
|
|
176
|
+
modules.push({
|
|
177
|
+
name: module.readableIdentifier(compilation.requestShortener),
|
|
178
|
+
count
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
if (modules.length === 0) return;
|
|
184
|
+
|
|
185
|
+
// Most first; ties break by name, module order is not stable.
|
|
186
|
+
modules.sort(
|
|
187
|
+
(a, b) => b.count - a.count || compareStrings(a.name, b.name)
|
|
188
|
+
);
|
|
189
|
+
|
|
190
|
+
const warning = new TopLevelThisWarning(
|
|
191
|
+
modules.slice(0, MAX_REPORTED_MODULES),
|
|
192
|
+
total
|
|
193
|
+
);
|
|
194
|
+
|
|
195
|
+
if (hints === "error") {
|
|
196
|
+
compilation.errors.push(warning);
|
|
197
|
+
} else if (hints === "stats") {
|
|
198
|
+
compilation.hints.push(warning);
|
|
199
|
+
} else {
|
|
200
|
+
compilation.warnings.push(warning);
|
|
201
|
+
}
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
module.exports = TopLevelThisPlugin;
|