@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
|
@@ -0,0 +1,115 @@
|
|
|
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 EvalUsageWarning = require("../errors/EvalUsageWarning");
|
|
14
|
+
const { compareStrings } = require("../util/comparators");
|
|
15
|
+
|
|
16
|
+
/** @import { PerformanceOptions } from "../../declarations/WebpackOptions" */
|
|
17
|
+
/** @import Compiler from "../Compiler" */
|
|
18
|
+
/** @import { BuildInfo } from "../Module" */
|
|
19
|
+
/** @import JavascriptParser from "../javascript/JavascriptParser" */
|
|
20
|
+
|
|
21
|
+
const PLUGIN_NAME = "EvalUsagePlugin";
|
|
22
|
+
|
|
23
|
+
// Enough to name the offenders without listing the graph.
|
|
24
|
+
const MAX_REPORTED_MODULES = 5;
|
|
25
|
+
|
|
26
|
+
class EvalUsagePlugin {
|
|
27
|
+
/**
|
|
28
|
+
* Creates an instance of EvalUsagePlugin.
|
|
29
|
+
* @param {PerformanceOptions} options the plugin options
|
|
30
|
+
*/
|
|
31
|
+
constructor(options) {
|
|
32
|
+
/** @type {PerformanceOptions["hints"]} */
|
|
33
|
+
this.hints = options.hints;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Applies the plugin by registering its hooks on the compiler.
|
|
38
|
+
* @param {Compiler} compiler the compiler instance
|
|
39
|
+
* @returns {void}
|
|
40
|
+
*/
|
|
41
|
+
apply(compiler) {
|
|
42
|
+
const hints = this.hints;
|
|
43
|
+
|
|
44
|
+
if (!hints) return;
|
|
45
|
+
|
|
46
|
+
compiler.hooks.compilation.tap(
|
|
47
|
+
PLUGIN_NAME,
|
|
48
|
+
(compilation, { normalModuleFactory }) => {
|
|
49
|
+
/**
|
|
50
|
+
* @param {JavascriptParser} parser the parser
|
|
51
|
+
*/
|
|
52
|
+
const handler = (parser) => {
|
|
53
|
+
// Only a call of the name itself is a direct eval; `(0, eval)()` and
|
|
54
|
+
// `globalThis.eval()` run in global scope and reach no local name.
|
|
55
|
+
parser.hooks.call.for("eval").tap(PLUGIN_NAME, () => {
|
|
56
|
+
// Kept on the module rather than in a map here, so a module the
|
|
57
|
+
// filesystem cache restores rather than parses still reports.
|
|
58
|
+
const buildInfo = /** @type {BuildInfo} */ (
|
|
59
|
+
parser.state.module.buildInfo
|
|
60
|
+
);
|
|
61
|
+
|
|
62
|
+
buildInfo.usesEval = true;
|
|
63
|
+
});
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
normalModuleFactory.hooks.parser
|
|
67
|
+
.for(JAVASCRIPT_MODULE_TYPE_AUTO)
|
|
68
|
+
.tap(PLUGIN_NAME, handler);
|
|
69
|
+
normalModuleFactory.hooks.parser
|
|
70
|
+
.for(JAVASCRIPT_MODULE_TYPE_ESM)
|
|
71
|
+
.tap(PLUGIN_NAME, handler);
|
|
72
|
+
normalModuleFactory.hooks.parser
|
|
73
|
+
.for(JAVASCRIPT_MODULE_TYPE_DYNAMIC)
|
|
74
|
+
.tap(PLUGIN_NAME, handler);
|
|
75
|
+
|
|
76
|
+
// `afterSeal` is past the hash, which folds every message into it — a
|
|
77
|
+
// hint reported earlier would change the build's identity.
|
|
78
|
+
compilation.hooks.afterSeal.tap(PLUGIN_NAME, () => {
|
|
79
|
+
const { requestShortener } = compilation;
|
|
80
|
+
/** @type {string[]} */
|
|
81
|
+
const callers = [];
|
|
82
|
+
|
|
83
|
+
for (const module of compilation.modules) {
|
|
84
|
+
// Every built module carries one, so only the field is in question.
|
|
85
|
+
const buildInfo = /** @type {BuildInfo} */ (module.buildInfo);
|
|
86
|
+
|
|
87
|
+
if (!buildInfo.usesEval) continue;
|
|
88
|
+
|
|
89
|
+
callers.push(module.readableIdentifier(requestShortener));
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
if (callers.length === 0) return;
|
|
93
|
+
|
|
94
|
+
// Sorted by name: module order is not stable across runs.
|
|
95
|
+
callers.sort(compareStrings);
|
|
96
|
+
|
|
97
|
+
const warning = new EvalUsageWarning(
|
|
98
|
+
callers.slice(0, MAX_REPORTED_MODULES),
|
|
99
|
+
callers.length
|
|
100
|
+
);
|
|
101
|
+
|
|
102
|
+
if (hints === "error") {
|
|
103
|
+
compilation.errors.push(warning);
|
|
104
|
+
} else if (hints === "stats") {
|
|
105
|
+
compilation.hints.push(warning);
|
|
106
|
+
} else {
|
|
107
|
+
compilation.warnings.push(warning);
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
module.exports = EvalUsagePlugin;
|
|
@@ -0,0 +1,296 @@
|
|
|
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 NormalModule = require("../NormalModule");
|
|
9
|
+
const HotspotsWarning = require("../errors/HotspotsWarning");
|
|
10
|
+
const { LOADER_TIMING } = require("../loaders/LoaderRunner");
|
|
11
|
+
const { compareStrings } = require("../util/comparators");
|
|
12
|
+
const { contextify } = require("../util/identifier");
|
|
13
|
+
|
|
14
|
+
/** @typedef {import("tapable").FullTap} FullTap */
|
|
15
|
+
/** @typedef {import("../../declarations/WebpackOptions").PerformanceOptions} PerformanceOptions */
|
|
16
|
+
/** @typedef {import("../Compiler")} Compiler */
|
|
17
|
+
/** @typedef {import("../errors/HotspotsWarning").HookDetails} HookDetails */
|
|
18
|
+
/** @typedef {import("../errors/HotspotsWarning").HotspotDetails} HotspotDetails */
|
|
19
|
+
|
|
20
|
+
const PLUGIN_NAME = "HotspotsPlugin";
|
|
21
|
+
|
|
22
|
+
// Enough to name the offenders without listing the whole build.
|
|
23
|
+
const MAX_REPORTED_HOTSPOTS = 5;
|
|
24
|
+
const MAX_REPORTED_HOOKS = 3;
|
|
25
|
+
|
|
26
|
+
// Below this nothing is waiting on it, and naming it would bury what is.
|
|
27
|
+
const MIN_REPORTED_MS = 100;
|
|
28
|
+
|
|
29
|
+
// Ahead of every other `compilation` tap: the counters are reset there, and
|
|
30
|
+
// anything measured before that reset would be thrown away by it.
|
|
31
|
+
const INTERCEPT_STAGE = -10000;
|
|
32
|
+
|
|
33
|
+
const NS_PER_MS = 1e6;
|
|
34
|
+
const MS_PER_SECOND = 1000;
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* @param {[number, number]} start what `process.hrtime()` returned
|
|
38
|
+
* @returns {number} milliseconds since then
|
|
39
|
+
*/
|
|
40
|
+
const msSince = (start) => {
|
|
41
|
+
const [seconds, nanoseconds] = process.hrtime(start);
|
|
42
|
+
|
|
43
|
+
return seconds * MS_PER_SECOND + nanoseconds / NS_PER_MS;
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* @param {Map<string, { ms: number, runs: number }>} map where the time is kept
|
|
48
|
+
* @param {string} key what ran
|
|
49
|
+
* @param {number} ms how long its own code took
|
|
50
|
+
* @returns {void}
|
|
51
|
+
*/
|
|
52
|
+
const charge = (map, key, ms) => {
|
|
53
|
+
const spent = map.get(key);
|
|
54
|
+
|
|
55
|
+
if (spent === undefined) {
|
|
56
|
+
map.set(key, { ms, runs: 1 });
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
spent.ms += ms;
|
|
61
|
+
spent.runs++;
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
class HotspotsPlugin {
|
|
65
|
+
/**
|
|
66
|
+
* Creates an instance of HotspotsPlugin.
|
|
67
|
+
* @param {PerformanceOptions} options the plugin options
|
|
68
|
+
*/
|
|
69
|
+
constructor(options) {
|
|
70
|
+
/** @type {PerformanceOptions["hints"]} */
|
|
71
|
+
this.hints = options.hints;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Applies the plugin by registering its hooks on the compiler.
|
|
76
|
+
* @param {Compiler} compiler the compiler instance
|
|
77
|
+
* @returns {void}
|
|
78
|
+
*/
|
|
79
|
+
apply(compiler) {
|
|
80
|
+
const hints = this.hints;
|
|
81
|
+
|
|
82
|
+
if (!hints) return;
|
|
83
|
+
|
|
84
|
+
/** @typedef {{ ms: number, runs: number }} Spent */
|
|
85
|
+
// Kept per kind: a loader and a plugin could otherwise share a name and
|
|
86
|
+
// have their runs counted together.
|
|
87
|
+
/** @type {Map<string, Spent>} */
|
|
88
|
+
const pluginTime = new Map();
|
|
89
|
+
/** @type {Map<string, Spent>} */
|
|
90
|
+
const loaderTime = new Map();
|
|
91
|
+
/** @type {Map<string, number>} */
|
|
92
|
+
const hookTime = new Map();
|
|
93
|
+
// One frame per thing currently running, innermost last. Only the innermost
|
|
94
|
+
// is charged, so whatever calls out to something else is not billed for it.
|
|
95
|
+
/** @type {{ child: number }[]} */
|
|
96
|
+
const running = [];
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Runs one loader or tap, charging it its own work alone.
|
|
100
|
+
* @template T
|
|
101
|
+
* @param {Map<string, { ms: number, runs: number }>} map where its time is kept
|
|
102
|
+
* @param {string} name what is running
|
|
103
|
+
* @param {string | undefined} hookName the hook it runs under, if any
|
|
104
|
+
* @param {() => T} run the work, already bound to its arguments
|
|
105
|
+
* @returns {T} whatever it returned
|
|
106
|
+
*/
|
|
107
|
+
const measure = (map, name, hookName, run) => {
|
|
108
|
+
const frame = { child: 0 };
|
|
109
|
+
|
|
110
|
+
running.push(frame);
|
|
111
|
+
|
|
112
|
+
const start = process.hrtime();
|
|
113
|
+
|
|
114
|
+
try {
|
|
115
|
+
return run();
|
|
116
|
+
} finally {
|
|
117
|
+
const elapsed = msSince(start);
|
|
118
|
+
const own = elapsed - frame.child;
|
|
119
|
+
|
|
120
|
+
running.pop();
|
|
121
|
+
charge(map, name, own);
|
|
122
|
+
|
|
123
|
+
if (hookName !== undefined) {
|
|
124
|
+
hookTime.set(hookName, (hookTime.get(hookName) || 0) + own);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
if (running.length > 0) {
|
|
128
|
+
running[running.length - 1].child += elapsed;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* @param {string} hookName the hook being tapped
|
|
135
|
+
* @returns {(tapInfo: FullTap) => FullTap} an interceptor for it
|
|
136
|
+
*/
|
|
137
|
+
const registerFor = (hookName) => (tapInfo) => {
|
|
138
|
+
const { name, type, fn } = tapInfo;
|
|
139
|
+
|
|
140
|
+
if (name === PLUGIN_NAME) return tapInfo;
|
|
141
|
+
|
|
142
|
+
if (type === "async") {
|
|
143
|
+
return {
|
|
144
|
+
...tapInfo,
|
|
145
|
+
/**
|
|
146
|
+
* @param {EXPECTED_ANY[]} args the tap's arguments, callback last
|
|
147
|
+
* @returns {EXPECTED_ANY} whatever the tap returned
|
|
148
|
+
*/
|
|
149
|
+
fn: (...args) => {
|
|
150
|
+
const callback = args.pop();
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* @param {EXPECTED_ANY[]} result what the tap reported
|
|
154
|
+
* @returns {EXPECTED_ANY} whatever the callback returned
|
|
155
|
+
*/
|
|
156
|
+
const finish = (...result) =>
|
|
157
|
+
measure(pluginTime, name, hookName, () => callback(...result));
|
|
158
|
+
|
|
159
|
+
// The completion callback is the plugin's own code as well, so it
|
|
160
|
+
// is charged to the plugin rather than to whoever resumed it.
|
|
161
|
+
return measure(pluginTime, name, hookName, () =>
|
|
162
|
+
/** @type {EXPECTED_FUNCTION} */ (fn)(...args, finish)
|
|
163
|
+
);
|
|
164
|
+
}
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
return {
|
|
169
|
+
...tapInfo,
|
|
170
|
+
/**
|
|
171
|
+
* @param {EXPECTED_ANY[]} args the tap's arguments
|
|
172
|
+
* @returns {EXPECTED_ANY} whatever the tap returned
|
|
173
|
+
*/
|
|
174
|
+
fn: (...args) =>
|
|
175
|
+
measure(pluginTime, name, hookName, () =>
|
|
176
|
+
/** @type {EXPECTED_FUNCTION} */ (fn)(...args)
|
|
177
|
+
)
|
|
178
|
+
};
|
|
179
|
+
};
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* @param {EXPECTED_ANY} instance anything carrying tapable hooks
|
|
183
|
+
* @returns {void}
|
|
184
|
+
*/
|
|
185
|
+
const interceptAll = (instance) => {
|
|
186
|
+
for (const hookName of Object.keys(instance.hooks)) {
|
|
187
|
+
const descriptor = Object.getOwnPropertyDescriptor(
|
|
188
|
+
instance.hooks,
|
|
189
|
+
hookName
|
|
190
|
+
);
|
|
191
|
+
|
|
192
|
+
// A hook kept only as an alias for one that moved is an accessor, and
|
|
193
|
+
// reading it is what prints the deprecation — so it is never read.
|
|
194
|
+
if (!descriptor || descriptor.get) continue;
|
|
195
|
+
|
|
196
|
+
const hook = descriptor.value;
|
|
197
|
+
|
|
198
|
+
// A deprecated hook kept as a stand-in throws when intercepted.
|
|
199
|
+
if (hook && !hook._fakeHook && typeof hook.intercept === "function") {
|
|
200
|
+
hook.intercept({ register: registerFor(hookName) });
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
};
|
|
204
|
+
|
|
205
|
+
interceptAll(compiler);
|
|
206
|
+
|
|
207
|
+
compiler.hooks.compilation.tap(
|
|
208
|
+
{ name: PLUGIN_NAME, stage: INTERCEPT_STAGE },
|
|
209
|
+
(compilation, { normalModuleFactory, contextModuleFactory }) => {
|
|
210
|
+
// Each build reports its own time. Watching keeps the compiler, so
|
|
211
|
+
// without this every rebuild would add to the one before it.
|
|
212
|
+
pluginTime.clear();
|
|
213
|
+
loaderTime.clear();
|
|
214
|
+
hookTime.clear();
|
|
215
|
+
running.length = 0;
|
|
216
|
+
|
|
217
|
+
interceptAll(compilation);
|
|
218
|
+
interceptAll(normalModuleFactory);
|
|
219
|
+
interceptAll(contextModuleFactory);
|
|
220
|
+
|
|
221
|
+
const context = compiler.context;
|
|
222
|
+
|
|
223
|
+
// Loaders are not taps, so they are measured where they run instead.
|
|
224
|
+
NormalModule.getCompilationHooks(compilation).loader.tap(
|
|
225
|
+
PLUGIN_NAME,
|
|
226
|
+
(loaderContext) => {
|
|
227
|
+
/** @type {EXPECTED_ANY} */
|
|
228
|
+
(loaderContext)[LOADER_TIMING] =
|
|
229
|
+
/**
|
|
230
|
+
* @param {{ path: string }} loader the loader about to run
|
|
231
|
+
* @param {() => EXPECTED_ANY} run its own execution
|
|
232
|
+
* @returns {EXPECTED_ANY} whatever it returned
|
|
233
|
+
*/
|
|
234
|
+
(loader, run) =>
|
|
235
|
+
measure(
|
|
236
|
+
loaderTime,
|
|
237
|
+
contextify(context, loader.path, compiler.root),
|
|
238
|
+
undefined,
|
|
239
|
+
run
|
|
240
|
+
);
|
|
241
|
+
}
|
|
242
|
+
);
|
|
243
|
+
}
|
|
244
|
+
);
|
|
245
|
+
|
|
246
|
+
compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation) => {
|
|
247
|
+
// `afterSeal` is past the hash, which folds every message into it — a
|
|
248
|
+
// hint reported earlier would change the build's identity.
|
|
249
|
+
compilation.hooks.afterSeal.tap(PLUGIN_NAME, () => {
|
|
250
|
+
/** @type {HotspotDetails[]} */
|
|
251
|
+
const hotspots = [];
|
|
252
|
+
|
|
253
|
+
// Loaders and plugins never name the same thing, so one ranking over
|
|
254
|
+
// both double counts nothing.
|
|
255
|
+
for (const [kind, map] of /** @type {const} */ ([
|
|
256
|
+
["loader", loaderTime],
|
|
257
|
+
["plugin", pluginTime]
|
|
258
|
+
])) {
|
|
259
|
+
for (const [name, spent] of map) {
|
|
260
|
+
if (spent.ms < MIN_REPORTED_MS) continue;
|
|
261
|
+
|
|
262
|
+
hotspots.push({ kind, name, ms: spent.ms, runs: spent.runs });
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
if (hotspots.length === 0) return;
|
|
267
|
+
|
|
268
|
+
// Ties break by name, though two rarely take the same time.
|
|
269
|
+
hotspots.sort((a, b) => b.ms - a.ms || compareStrings(a.name, b.name));
|
|
270
|
+
|
|
271
|
+
/** @type {HookDetails[]} */
|
|
272
|
+
const hooks = [...hookTime]
|
|
273
|
+
.filter(([, ms]) => ms >= MIN_REPORTED_MS)
|
|
274
|
+
.map(([name, ms]) => ({ name, ms }))
|
|
275
|
+
.sort((a, b) => b.ms - a.ms || compareStrings(a.name, b.name))
|
|
276
|
+
.slice(0, MAX_REPORTED_HOOKS);
|
|
277
|
+
|
|
278
|
+
const warning = new HotspotsWarning(
|
|
279
|
+
hotspots.slice(0, MAX_REPORTED_HOTSPOTS),
|
|
280
|
+
hotspots.length,
|
|
281
|
+
hooks
|
|
282
|
+
);
|
|
283
|
+
|
|
284
|
+
if (hints === "error") {
|
|
285
|
+
compilation.errors.push(warning);
|
|
286
|
+
} else if (hints === "stats") {
|
|
287
|
+
compilation.hints.push(warning);
|
|
288
|
+
} else {
|
|
289
|
+
compilation.warnings.push(warning);
|
|
290
|
+
}
|
|
291
|
+
});
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
module.exports = HotspotsPlugin;
|
|
@@ -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 InlinedAssetsWarning = require("../errors/InlinedAssetsWarning");
|
|
9
|
+
const { compareStrings } = require("../util/comparators");
|
|
10
|
+
const getModuleSize = require("./getModuleSize");
|
|
11
|
+
|
|
12
|
+
/** @import { AssetModuleBuildInfo } from "../asset/AssetModule" */
|
|
13
|
+
/** @import { PerformanceOptions } from "../../declarations/WebpackOptions" */
|
|
14
|
+
/** @import Compiler from "../Compiler" */
|
|
15
|
+
/** @import { InlinedAssetDetails } from "../errors/InlinedAssetsWarning" */
|
|
16
|
+
|
|
17
|
+
const PLUGIN_NAME = "InlinedAssetsPlugin";
|
|
18
|
+
|
|
19
|
+
// Enough to name the offenders without listing every icon.
|
|
20
|
+
const MAX_REPORTED_ASSETS = 5;
|
|
21
|
+
|
|
22
|
+
// What the asset modules default `dataUrlCondition.maxSize` is: below it,
|
|
23
|
+
// inlining saves a request for less than it costs in bytes.
|
|
24
|
+
const DEFAULT_MAX_SIZE = 8096;
|
|
25
|
+
|
|
26
|
+
class InlinedAssetsPlugin {
|
|
27
|
+
/**
|
|
28
|
+
* Creates an instance of InlinedAssetsPlugin.
|
|
29
|
+
* @param {PerformanceOptions} options the plugin options
|
|
30
|
+
*/
|
|
31
|
+
constructor(options) {
|
|
32
|
+
/** @type {PerformanceOptions["hints"]} */
|
|
33
|
+
this.hints = options.hints;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Applies the plugin by registering its hooks on the compiler.
|
|
38
|
+
* @param {Compiler} compiler the compiler instance
|
|
39
|
+
* @returns {void}
|
|
40
|
+
*/
|
|
41
|
+
apply(compiler) {
|
|
42
|
+
const hints = this.hints;
|
|
43
|
+
|
|
44
|
+
if (!hints) return;
|
|
45
|
+
|
|
46
|
+
compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation) => {
|
|
47
|
+
// `afterSeal` is past the hash, which folds every message into it — a
|
|
48
|
+
// hint reported earlier would change the build's identity.
|
|
49
|
+
compilation.hooks.afterSeal.tap(PLUGIN_NAME, () => {
|
|
50
|
+
/** @type {InlinedAssetDetails[]} */
|
|
51
|
+
const assets = [];
|
|
52
|
+
let total = 0;
|
|
53
|
+
|
|
54
|
+
for (const module of compilation.modules) {
|
|
55
|
+
// The parser records whether it inlined, so this asks rather than
|
|
56
|
+
// deciding from the module's type what it must have done.
|
|
57
|
+
const buildInfo =
|
|
58
|
+
/** @type {AssetModuleBuildInfo} */
|
|
59
|
+
(module.buildInfo);
|
|
60
|
+
|
|
61
|
+
if (!buildInfo.dataUrl) continue;
|
|
62
|
+
|
|
63
|
+
// Module sizes are estimates and come back fractional.
|
|
64
|
+
const size = Math.round(getModuleSize(module));
|
|
65
|
+
|
|
66
|
+
if (size <= DEFAULT_MAX_SIZE) continue;
|
|
67
|
+
|
|
68
|
+
total += size;
|
|
69
|
+
assets.push({
|
|
70
|
+
name: module.readableIdentifier(compilation.requestShortener),
|
|
71
|
+
size
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
if (assets.length === 0) return;
|
|
76
|
+
|
|
77
|
+
// Largest first; ties break by name, module order is not stable.
|
|
78
|
+
assets.sort(
|
|
79
|
+
(a, b) => b.size - a.size || compareStrings(a.name, b.name)
|
|
80
|
+
);
|
|
81
|
+
|
|
82
|
+
const warning = new InlinedAssetsWarning(
|
|
83
|
+
assets.slice(0, MAX_REPORTED_ASSETS),
|
|
84
|
+
total
|
|
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 = InlinedAssetsPlugin;
|
|
@@ -0,0 +1,126 @@
|
|
|
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 LargeModulesWarning = require("../errors/LargeModulesWarning");
|
|
9
|
+
const { compareStrings } = require("../util/comparators");
|
|
10
|
+
const getModuleSize = require("./getModuleSize");
|
|
11
|
+
const getSourceModules = require("./getSourceModules");
|
|
12
|
+
|
|
13
|
+
/** @typedef {import("../../declarations/WebpackOptions").PerformanceOptions} PerformanceOptions */
|
|
14
|
+
/** @typedef {import("../Compiler")} Compiler */
|
|
15
|
+
/** @typedef {import("../Module")} Module */
|
|
16
|
+
/** @typedef {import("../errors/LargeModulesWarning").LargeModuleDetails} LargeModuleDetails */
|
|
17
|
+
|
|
18
|
+
const PLUGIN_NAME = "LargeModulesPlugin";
|
|
19
|
+
|
|
20
|
+
// Enough to name the offenders without listing the module graph.
|
|
21
|
+
const MAX_REPORTED_MODULES = 5;
|
|
22
|
+
|
|
23
|
+
// Half of a chunk in a single module is where the chunk really is that module.
|
|
24
|
+
// Below it the weight is spread around and there is nothing single to act on.
|
|
25
|
+
const DOMINANT_SHARE = 0.5;
|
|
26
|
+
|
|
27
|
+
// Scaled to the asset budget rather than fixed, so raising `maxAssetSize`
|
|
28
|
+
// raises what counts as big enough to be worth naming.
|
|
29
|
+
const MIN_SHARE_OF_ASSET_LIMIT = 0.2;
|
|
30
|
+
|
|
31
|
+
class LargeModulesPlugin {
|
|
32
|
+
/**
|
|
33
|
+
* Creates an instance of LargeModulesPlugin.
|
|
34
|
+
* @param {PerformanceOptions} options the plugin options
|
|
35
|
+
*/
|
|
36
|
+
constructor(options) {
|
|
37
|
+
/** @type {PerformanceOptions["hints"]} */
|
|
38
|
+
this.hints = options.hints;
|
|
39
|
+
/** @type {PerformanceOptions["maxAssetSize"]} */
|
|
40
|
+
this.maxAssetSize = options.maxAssetSize;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Applies the plugin by registering its hooks on the compiler.
|
|
45
|
+
* @param {Compiler} compiler the compiler instance
|
|
46
|
+
* @returns {void}
|
|
47
|
+
*/
|
|
48
|
+
apply(compiler) {
|
|
49
|
+
const hints = this.hints;
|
|
50
|
+
|
|
51
|
+
if (!hints) return;
|
|
52
|
+
|
|
53
|
+
const minSize =
|
|
54
|
+
/** @type {number} */ (this.maxAssetSize) * MIN_SHARE_OF_ASSET_LIMIT;
|
|
55
|
+
|
|
56
|
+
compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation) => {
|
|
57
|
+
// `afterSeal` is past the hash, which folds every message into it — a
|
|
58
|
+
// hint reported earlier would change the build's identity.
|
|
59
|
+
compilation.hooks.afterSeal.tap(PLUGIN_NAME, () => {
|
|
60
|
+
const { chunkGraph, requestShortener } = compilation;
|
|
61
|
+
/** @type {Map<Module, LargeModuleDetails>} */
|
|
62
|
+
const worst = new Map();
|
|
63
|
+
|
|
64
|
+
for (const chunk of compilation.chunks) {
|
|
65
|
+
const chunkName = chunk.name || `${chunk.id}`;
|
|
66
|
+
/** @type {Map<Module, number>} */
|
|
67
|
+
const sizes = new Map();
|
|
68
|
+
let chunkSize = 0;
|
|
69
|
+
|
|
70
|
+
for (const module of chunkGraph.getChunkModulesIterable(chunk)) {
|
|
71
|
+
// Through scope hoisting one module stands for the several it
|
|
72
|
+
// absorbed, and it is those the report has to name.
|
|
73
|
+
for (const inner of getSourceModules(module)) {
|
|
74
|
+
const size = getModuleSize(inner);
|
|
75
|
+
|
|
76
|
+
sizes.set(inner, (sizes.get(inner) || 0) + size);
|
|
77
|
+
chunkSize += size;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
for (const [module, size] of sizes) {
|
|
82
|
+
if (size < minSize) continue;
|
|
83
|
+
if (size < chunkSize * DOMINANT_SHARE) continue;
|
|
84
|
+
|
|
85
|
+
const previous = worst.get(module);
|
|
86
|
+
|
|
87
|
+
// A module weighs the same in every chunk holding it, so the one
|
|
88
|
+
// named is the first by name — chunk order is not stable.
|
|
89
|
+
if (previous && compareStrings(previous.chunk, chunkName) <= 0) {
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
worst.set(module, {
|
|
94
|
+
name: module.readableIdentifier(requestShortener),
|
|
95
|
+
chunk: chunkName,
|
|
96
|
+
size,
|
|
97
|
+
chunkSize
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
if (worst.size === 0) return;
|
|
103
|
+
|
|
104
|
+
const large = [...worst.values()];
|
|
105
|
+
|
|
106
|
+
// Ties break by name: chunk iteration order is not stable.
|
|
107
|
+
large.sort((a, b) => b.size - a.size || compareStrings(a.name, b.name));
|
|
108
|
+
|
|
109
|
+
const warning = new LargeModulesWarning(
|
|
110
|
+
large.slice(0, MAX_REPORTED_MODULES),
|
|
111
|
+
large.length
|
|
112
|
+
);
|
|
113
|
+
|
|
114
|
+
if (hints === "error") {
|
|
115
|
+
compilation.errors.push(warning);
|
|
116
|
+
} else if (hints === "stats") {
|
|
117
|
+
compilation.hints.push(warning);
|
|
118
|
+
} else {
|
|
119
|
+
compilation.warnings.push(warning);
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
module.exports = LargeModulesPlugin;
|