@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,219 @@
|
|
|
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 PureAnnotationsWarning = require("../errors/PureAnnotationsWarning");
|
|
14
|
+
const { compareStrings } = require("../util/comparators");
|
|
15
|
+
const { CompilerHintNotationRegExp } = require("../util/magicComment");
|
|
16
|
+
|
|
17
|
+
/** @import { PerformanceOptions } from "../../declarations/WebpackOptions" */
|
|
18
|
+
/** @import Compiler from "../Compiler" */
|
|
19
|
+
/** @import { Program } from "estree" */
|
|
20
|
+
/** @import { BuildInfo } from "../Module" */
|
|
21
|
+
/** @import JavascriptParser from "../javascript/JavascriptParser" */
|
|
22
|
+
/** @import { PureAnnotationDetails } from "../errors/PureAnnotationsWarning" */
|
|
23
|
+
|
|
24
|
+
const PLUGIN_NAME = "PureAnnotationsPlugin";
|
|
25
|
+
|
|
26
|
+
// Enough to name the offenders without listing every module.
|
|
27
|
+
const MAX_REPORTED_MODULES = 5;
|
|
28
|
+
|
|
29
|
+
// The only three the parser reads the annotation for; before anything else it
|
|
30
|
+
// is just a comment. Kept in step with `JavascriptParser.isPure`.
|
|
31
|
+
const ANNOTATED_TYPES = new Set([
|
|
32
|
+
"CallExpression",
|
|
33
|
+
"NewExpression",
|
|
34
|
+
"TaggedTemplateExpression"
|
|
35
|
+
]);
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Collects where every node starts, and which of those starts carry a node the
|
|
39
|
+
* annotation is read for.
|
|
40
|
+
* @param {Program} ast the program
|
|
41
|
+
* @returns {{ starts: number[], annotated: Set<number> }} the two of them
|
|
42
|
+
*/
|
|
43
|
+
const collectStarts = (ast) => {
|
|
44
|
+
/** @type {number[]} */
|
|
45
|
+
const starts = [];
|
|
46
|
+
/** @type {Set<number>} */
|
|
47
|
+
const annotated = new Set();
|
|
48
|
+
/** @type {unknown[]} */
|
|
49
|
+
const queue = [ast];
|
|
50
|
+
|
|
51
|
+
while (queue.length > 0) {
|
|
52
|
+
const node = queue.pop();
|
|
53
|
+
|
|
54
|
+
if (!node || typeof node !== "object") continue;
|
|
55
|
+
|
|
56
|
+
if (Array.isArray(node)) {
|
|
57
|
+
for (const item of /** @type {unknown[]} */ (node)) queue.push(item);
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Walked structurally rather than per node type, so a node the estree
|
|
62
|
+
// types do not name is still reached.
|
|
63
|
+
const fields = /** @type {Record<string, unknown>} */ (node);
|
|
64
|
+
const { type, range } = fields;
|
|
65
|
+
|
|
66
|
+
const start = Array.isArray(range)
|
|
67
|
+
? /** @type {unknown[]} */ (range)[0]
|
|
68
|
+
: undefined;
|
|
69
|
+
|
|
70
|
+
if (typeof type === "string" && typeof start === "number") {
|
|
71
|
+
starts.push(start);
|
|
72
|
+
|
|
73
|
+
if (ANNOTATED_TYPES.has(type)) annotated.add(start);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
for (const key of Object.keys(fields)) {
|
|
77
|
+
if (key !== "range" && key !== "loc") queue.push(fields[key]);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Sorted so each annotation can binary-search for the node after it rather
|
|
82
|
+
// than walking every start, which is quadratic on a generated file.
|
|
83
|
+
starts.sort((a, b) => a - b);
|
|
84
|
+
|
|
85
|
+
return { starts, annotated };
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
class PureAnnotationsPlugin {
|
|
89
|
+
/**
|
|
90
|
+
* Creates an instance of PureAnnotationsPlugin.
|
|
91
|
+
* @param {PerformanceOptions} options the plugin options
|
|
92
|
+
*/
|
|
93
|
+
constructor(options) {
|
|
94
|
+
/** @type {PerformanceOptions["hints"]} */
|
|
95
|
+
this.hints = options.hints;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Applies the plugin by registering its hooks on the compiler.
|
|
100
|
+
* @param {Compiler} compiler the compiler instance
|
|
101
|
+
* @returns {void}
|
|
102
|
+
*/
|
|
103
|
+
apply(compiler) {
|
|
104
|
+
const hints = this.hints;
|
|
105
|
+
|
|
106
|
+
if (!hints) return;
|
|
107
|
+
|
|
108
|
+
compiler.hooks.compilation.tap(
|
|
109
|
+
PLUGIN_NAME,
|
|
110
|
+
(compilation, { normalModuleFactory }) => {
|
|
111
|
+
/**
|
|
112
|
+
* @param {JavascriptParser} parser the parser
|
|
113
|
+
*/
|
|
114
|
+
const handler = (parser) => {
|
|
115
|
+
parser.hooks.program.tap(PLUGIN_NAME, (ast, comments) => {
|
|
116
|
+
const pure = comments.filter((comment) =>
|
|
117
|
+
CompilerHintNotationRegExp.Pure.test(comment.value)
|
|
118
|
+
);
|
|
119
|
+
|
|
120
|
+
if (pure.length === 0) return;
|
|
121
|
+
|
|
122
|
+
const { starts, annotated } = collectStarts(ast);
|
|
123
|
+
let wasted = 0;
|
|
124
|
+
|
|
125
|
+
for (const comment of pure) {
|
|
126
|
+
const range = /** @type {[number, number]} */ (comment.range);
|
|
127
|
+
const after = range[1];
|
|
128
|
+
|
|
129
|
+
// Comments are outside every node's range, so the node the
|
|
130
|
+
// annotation applies to is whichever starts first after it.
|
|
131
|
+
let low = 0;
|
|
132
|
+
let high = starts.length;
|
|
133
|
+
|
|
134
|
+
while (low < high) {
|
|
135
|
+
const middle = (low + high) >> 1;
|
|
136
|
+
|
|
137
|
+
if (starts[middle] < after) {
|
|
138
|
+
low = middle + 1;
|
|
139
|
+
} else {
|
|
140
|
+
high = middle;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
if (low === starts.length || !annotated.has(starts[low])) {
|
|
145
|
+
wasted++;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
if (wasted === 0) return;
|
|
150
|
+
|
|
151
|
+
// Kept on the module rather than in a map here, so a module the
|
|
152
|
+
// filesystem cache restores rather than parses still reports.
|
|
153
|
+
const buildInfo = /** @type {BuildInfo} */ (
|
|
154
|
+
parser.state.module.buildInfo
|
|
155
|
+
);
|
|
156
|
+
|
|
157
|
+
buildInfo.ineffectivePureAnnotations = wasted;
|
|
158
|
+
});
|
|
159
|
+
};
|
|
160
|
+
|
|
161
|
+
normalModuleFactory.hooks.parser
|
|
162
|
+
.for(JAVASCRIPT_MODULE_TYPE_AUTO)
|
|
163
|
+
.tap(PLUGIN_NAME, handler);
|
|
164
|
+
normalModuleFactory.hooks.parser
|
|
165
|
+
.for(JAVASCRIPT_MODULE_TYPE_ESM)
|
|
166
|
+
.tap(PLUGIN_NAME, handler);
|
|
167
|
+
normalModuleFactory.hooks.parser
|
|
168
|
+
.for(JAVASCRIPT_MODULE_TYPE_DYNAMIC)
|
|
169
|
+
.tap(PLUGIN_NAME, handler);
|
|
170
|
+
|
|
171
|
+
// `afterSeal` is past the hash, which folds every message into it — a
|
|
172
|
+
// hint reported earlier would change the build's identity.
|
|
173
|
+
compilation.hooks.afterSeal.tap(PLUGIN_NAME, () => {
|
|
174
|
+
const { requestShortener } = compilation;
|
|
175
|
+
/** @type {PureAnnotationDetails[]} */
|
|
176
|
+
const wasteful = [];
|
|
177
|
+
let total = 0;
|
|
178
|
+
|
|
179
|
+
for (const module of compilation.modules) {
|
|
180
|
+
// Every built module carries one, so only the field is in question.
|
|
181
|
+
const buildInfo = /** @type {BuildInfo} */ (module.buildInfo);
|
|
182
|
+
|
|
183
|
+
if (!buildInfo.ineffectivePureAnnotations) continue;
|
|
184
|
+
|
|
185
|
+
const count = buildInfo.ineffectivePureAnnotations;
|
|
186
|
+
|
|
187
|
+
total += count;
|
|
188
|
+
wasteful.push({
|
|
189
|
+
name: module.readableIdentifier(requestShortener),
|
|
190
|
+
count
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
if (wasteful.length === 0) return;
|
|
195
|
+
|
|
196
|
+
// Ties break by name: module order is not stable across runs.
|
|
197
|
+
wasteful.sort(
|
|
198
|
+
(a, b) => b.count - a.count || compareStrings(a.name, b.name)
|
|
199
|
+
);
|
|
200
|
+
|
|
201
|
+
const warning = new PureAnnotationsWarning(
|
|
202
|
+
wasteful.slice(0, MAX_REPORTED_MODULES),
|
|
203
|
+
total
|
|
204
|
+
);
|
|
205
|
+
|
|
206
|
+
if (hints === "error") {
|
|
207
|
+
compilation.errors.push(warning);
|
|
208
|
+
} else if (hints === "stats") {
|
|
209
|
+
compilation.hints.push(warning);
|
|
210
|
+
} else {
|
|
211
|
+
compilation.warnings.push(warning);
|
|
212
|
+
}
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
module.exports = PureAnnotationsPlugin;
|
|
@@ -0,0 +1,225 @@
|
|
|
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 AsyncDependenciesBlock = require("../AsyncDependenciesBlock");
|
|
9
|
+
const Entrypoint = require("../Entrypoint");
|
|
10
|
+
const RedundantDynamicImportWarning = require("../errors/RedundantDynamicImportWarning");
|
|
11
|
+
const { compareStrings } = require("../util/comparators");
|
|
12
|
+
const formatLocation = require("../util/formatLocation");
|
|
13
|
+
|
|
14
|
+
/** @import { PerformanceOptions } from "../../declarations/WebpackOptions" */
|
|
15
|
+
/** @import Chunk from "../Chunk" */
|
|
16
|
+
/** @import ChunkGroup from "../ChunkGroup" */
|
|
17
|
+
/** @import Compiler from "../Compiler" */
|
|
18
|
+
/** @import DependenciesBlock from "../DependenciesBlock" */
|
|
19
|
+
/** @import Module from "../Module" */
|
|
20
|
+
|
|
21
|
+
const PLUGIN_NAME = "RedundantDynamicImportsPlugin";
|
|
22
|
+
|
|
23
|
+
// Enough to name the offenders without printing every call site.
|
|
24
|
+
const MAX_REPORTED_IMPORTS = 5;
|
|
25
|
+
|
|
26
|
+
class RedundantDynamicImportsPlugin {
|
|
27
|
+
/**
|
|
28
|
+
* Creates an instance of RedundantDynamicImportsPlugin.
|
|
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
|
+
compilation.hooks.afterSeal.tap(PLUGIN_NAME, () => {
|
|
48
|
+
const { chunkGraph, moduleGraph, requestShortener } = compilation;
|
|
49
|
+
/** @type {string[]} */
|
|
50
|
+
const descriptions = [];
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* The chunks certain to be loaded when `chunk` runs: itself, plus what
|
|
54
|
+
* every entrypoint able to reach it brings. Entrypoints are alternative
|
|
55
|
+
* load paths, so they are intersected — one that carries the target says
|
|
56
|
+
* nothing about a page that loads another. A shared runtime name is not
|
|
57
|
+
* enough either: with `runtimeChunk: "single"` two entrypoints share one
|
|
58
|
+
* runtime while neither loads the other's initial chunks.
|
|
59
|
+
* @param {Chunk} chunk the chunk the importer runs in
|
|
60
|
+
* @returns {Set<Chunk>} the chunks loaded before it runs
|
|
61
|
+
*/
|
|
62
|
+
const computeLoadedChunks = (chunk) => {
|
|
63
|
+
const chunks = new Set([chunk]);
|
|
64
|
+
/** @type {Set<ChunkGroup>} */
|
|
65
|
+
const entrypoints = new Set();
|
|
66
|
+
/** @type {Set<ChunkGroup>} */
|
|
67
|
+
const queue = new Set(chunk.groupsIterable);
|
|
68
|
+
|
|
69
|
+
for (const group of queue) {
|
|
70
|
+
// An entrypoint is a load path in itself and carries nothing of
|
|
71
|
+
// what reaches it: an async one — a worker — starts from its own
|
|
72
|
+
// chunks, however much the module spawning it had loaded.
|
|
73
|
+
if (group.isInitial() || group instanceof Entrypoint) {
|
|
74
|
+
entrypoints.add(group);
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// Only initial chunks are certain: an async ancestor is loaded on
|
|
79
|
+
// the path taken, and a group can be reached by several.
|
|
80
|
+
for (const parent of group.getParents()) queue.add(parent);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
if (entrypoints.size === 0) return chunks;
|
|
84
|
+
|
|
85
|
+
/** @type {Set<Chunk> | undefined} */
|
|
86
|
+
let common;
|
|
87
|
+
|
|
88
|
+
for (const entrypoint of entrypoints) {
|
|
89
|
+
/** @type {Set<Chunk>} */
|
|
90
|
+
const loaded = new Set();
|
|
91
|
+
/** @type {Set<ChunkGroup>} */
|
|
92
|
+
const chain = new Set([entrypoint]);
|
|
93
|
+
|
|
94
|
+
// An entrypoint reached through `dependOn` is loaded first too, so
|
|
95
|
+
// within one path they add up rather than cancel each other out.
|
|
96
|
+
for (const group of chain) {
|
|
97
|
+
for (const member of group.chunks) loaded.add(member);
|
|
98
|
+
for (const parent of group.getParents()) chain.add(parent);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
if (common === undefined) {
|
|
102
|
+
common = loaded;
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
for (const member of common) {
|
|
107
|
+
if (!loaded.has(member)) common.delete(member);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
for (const member of /** @type {Set<Chunk>} */ (common)) {
|
|
112
|
+
chunks.add(member);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
return chunks;
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
// The answer depends on the chunk alone, and every module sharing one
|
|
119
|
+
// asks the same question. Dropped with the hook it is built in.
|
|
120
|
+
/** @type {Map<Chunk, Set<Chunk>>} */
|
|
121
|
+
const loadedChunks = new Map();
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* @param {Chunk} chunk the chunk the importer runs in
|
|
125
|
+
* @returns {Set<Chunk>} the chunks loaded before it runs
|
|
126
|
+
*/
|
|
127
|
+
const getLoadedChunks = (chunk) => {
|
|
128
|
+
let loaded = loadedChunks.get(chunk);
|
|
129
|
+
|
|
130
|
+
if (loaded === undefined) {
|
|
131
|
+
loaded = computeLoadedChunks(chunk);
|
|
132
|
+
loadedChunks.set(chunk, loaded);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
return loaded;
|
|
136
|
+
};
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* @param {DependenciesBlock} block the block to walk
|
|
140
|
+
* @param {Module} importer the module the block belongs to
|
|
141
|
+
* @param {Set<Chunk>[]} contexts what is loaded in each place it runs
|
|
142
|
+
* @returns {void}
|
|
143
|
+
*/
|
|
144
|
+
const walk = (block, importer, contexts) => {
|
|
145
|
+
for (const nested of block.blocks) {
|
|
146
|
+
if (nested instanceof AsyncDependenciesBlock) {
|
|
147
|
+
for (const dependency of nested.dependencies) {
|
|
148
|
+
const target = moduleGraph.getModule(dependency);
|
|
149
|
+
|
|
150
|
+
if (!target) continue;
|
|
151
|
+
|
|
152
|
+
// Redundant only where it is redundant everywhere: a shared
|
|
153
|
+
// importer still defers for an entry that lacks the target.
|
|
154
|
+
let redundant = true;
|
|
155
|
+
|
|
156
|
+
for (const loaded of contexts) {
|
|
157
|
+
let present = false;
|
|
158
|
+
|
|
159
|
+
for (const chunk of chunkGraph.getModuleChunksIterable(
|
|
160
|
+
target
|
|
161
|
+
)) {
|
|
162
|
+
if (loaded.has(chunk)) {
|
|
163
|
+
present = true;
|
|
164
|
+
break;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
if (!present) {
|
|
169
|
+
redundant = false;
|
|
170
|
+
break;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
if (!redundant) continue;
|
|
175
|
+
|
|
176
|
+
descriptions.push(
|
|
177
|
+
`${importer.readableIdentifier(requestShortener)}${
|
|
178
|
+
nested.loc ? ` ${formatLocation(nested.loc)}` : ""
|
|
179
|
+
} imports ${target.readableIdentifier(requestShortener)}`
|
|
180
|
+
);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
walk(nested, importer, contexts);
|
|
185
|
+
}
|
|
186
|
+
};
|
|
187
|
+
|
|
188
|
+
for (const module of compilation.modules) {
|
|
189
|
+
if (module.blocks.length === 0) continue;
|
|
190
|
+
|
|
191
|
+
/** @type {Set<Chunk>[]} */
|
|
192
|
+
const contexts = [];
|
|
193
|
+
|
|
194
|
+
for (const chunk of chunkGraph.getModuleChunksIterable(module)) {
|
|
195
|
+
contexts.push(getLoadedChunks(chunk));
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
if (contexts.length === 0) continue;
|
|
199
|
+
|
|
200
|
+
walk(module, module, contexts);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
if (descriptions.length === 0) return;
|
|
204
|
+
|
|
205
|
+
// Module order is not stable across runtimes, so the reported subset
|
|
206
|
+
// would otherwise differ between them.
|
|
207
|
+
descriptions.sort(compareStrings);
|
|
208
|
+
|
|
209
|
+
const warning = new RedundantDynamicImportWarning(
|
|
210
|
+
descriptions.slice(0, MAX_REPORTED_IMPORTS)
|
|
211
|
+
);
|
|
212
|
+
|
|
213
|
+
if (hints === "error") {
|
|
214
|
+
compilation.errors.push(warning);
|
|
215
|
+
} else if (hints === "stats") {
|
|
216
|
+
compilation.hints.push(warning);
|
|
217
|
+
} else {
|
|
218
|
+
compilation.warnings.push(warning);
|
|
219
|
+
}
|
|
220
|
+
});
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
module.exports = RedundantDynamicImportsPlugin;
|
|
@@ -0,0 +1,27 @@
|
|
|
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 WebpackError = require("../errors/WebpackError");
|
|
9
|
+
|
|
10
|
+
class RuntimeInLargeChunkWarning extends WebpackError {
|
|
11
|
+
/**
|
|
12
|
+
* Creates an instance of RuntimeInLargeChunkWarning.
|
|
13
|
+
* @param {string[]} entrypoints names of the entrypoints carrying the runtime
|
|
14
|
+
*/
|
|
15
|
+
constructor(entrypoints) {
|
|
16
|
+
super(
|
|
17
|
+
`webpack performance recommendations: \nThe runtime is part of the initial chunk of ${entrypoints.join(
|
|
18
|
+
", "
|
|
19
|
+
)}. It describes every other chunk, so a change anywhere in the build rewrites these assets and clients download them again.\nSet 'optimization.runtimeChunk' to emit the runtime as its own chunk.\nFor more info visit https://webpack.js.org/configuration/optimization/#optimizationruntimechunk`
|
|
20
|
+
);
|
|
21
|
+
|
|
22
|
+
/** @type {string} */
|
|
23
|
+
this.name = "RuntimeInLargeChunkWarning";
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
module.exports = RuntimeInLargeChunkWarning;
|
|
@@ -0,0 +1,164 @@
|
|
|
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 ScopeHoistingBailoutsWarning = require("../errors/ScopeHoistingBailoutsWarning");
|
|
9
|
+
const {
|
|
10
|
+
BAILOUT_PREFIX,
|
|
11
|
+
REJECTED_PREFIX
|
|
12
|
+
} = require("../optimize/ModuleConcatenationPlugin");
|
|
13
|
+
const { compareStrings } = require("../util/comparators");
|
|
14
|
+
const getModuleSize = require("./getModuleSize");
|
|
15
|
+
|
|
16
|
+
/** @import { PerformanceOptions } from "../../declarations/WebpackOptions" */
|
|
17
|
+
/** @import Compiler from "../Compiler" */
|
|
18
|
+
/** @import Module from "../Module" */
|
|
19
|
+
/** @import RequestShortener from "../RequestShortener" */
|
|
20
|
+
/**
|
|
21
|
+
* @import {
|
|
22
|
+
* ScopeHoistingBailoutGroup
|
|
23
|
+
* } from "../errors/ScopeHoistingBailoutsWarning"
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
const PLUGIN_NAME = "ScopeHoistingBailoutsPlugin";
|
|
27
|
+
|
|
28
|
+
// Reasons repeat far more than they differ, so a few name the problem.
|
|
29
|
+
const MAX_REPORTED_REASONS = 5;
|
|
30
|
+
|
|
31
|
+
// Enough per reason to recognize the offenders without listing every module.
|
|
32
|
+
const MAX_REPORTED_NAMES = 3;
|
|
33
|
+
|
|
34
|
+
// A source position makes two identical reasons look like two problems.
|
|
35
|
+
const POSITION_REGEXP = / at \d+:\d+-\d+$/;
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* The module's own reasons for staying out of a scope, without the ones it
|
|
39
|
+
* only carries because something it imports bailed out.
|
|
40
|
+
* @param {(string | ((requestShortener: RequestShortener) => string))[]} bailouts what the module graph recorded
|
|
41
|
+
* @param {RequestShortener} requestShortener the request shortener
|
|
42
|
+
* @returns {string[]} the reasons, stripped of their prefix and position
|
|
43
|
+
*/
|
|
44
|
+
const getOwnReasons = (bailouts, requestShortener) => {
|
|
45
|
+
/** @type {string[]} */
|
|
46
|
+
const reasons = [];
|
|
47
|
+
|
|
48
|
+
for (const bailout of bailouts) {
|
|
49
|
+
const message =
|
|
50
|
+
typeof bailout === "function" ? bailout(requestShortener) : bailout;
|
|
51
|
+
|
|
52
|
+
if (!message.startsWith(BAILOUT_PREFIX)) continue;
|
|
53
|
+
|
|
54
|
+
const reason = message.slice(BAILOUT_PREFIX.length);
|
|
55
|
+
|
|
56
|
+
// One root lists every module it could not take in; each of those
|
|
57
|
+
// modules reports the same problem itself.
|
|
58
|
+
if (reason.startsWith(REJECTED_PREFIX)) continue;
|
|
59
|
+
|
|
60
|
+
reasons.push(reason.replace(POSITION_REGEXP, ""));
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
return reasons;
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
class ScopeHoistingBailoutsPlugin {
|
|
67
|
+
/**
|
|
68
|
+
* Creates an instance of ScopeHoistingBailoutsPlugin.
|
|
69
|
+
* @param {PerformanceOptions} options the plugin options
|
|
70
|
+
*/
|
|
71
|
+
constructor(options) {
|
|
72
|
+
/** @type {PerformanceOptions["hints"]} */
|
|
73
|
+
this.hints = options.hints;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Applies the plugin by registering its hooks on the compiler.
|
|
78
|
+
* @param {Compiler} compiler the compiler instance
|
|
79
|
+
* @returns {void}
|
|
80
|
+
*/
|
|
81
|
+
apply(compiler) {
|
|
82
|
+
const hints = this.hints;
|
|
83
|
+
|
|
84
|
+
if (!hints) return;
|
|
85
|
+
|
|
86
|
+
compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation) => {
|
|
87
|
+
// After seal: a module that was hoisted is gone from `modules` by now,
|
|
88
|
+
// absorbed into the concatenation that took it.
|
|
89
|
+
compilation.hooks.afterSeal.tap(PLUGIN_NAME, () => {
|
|
90
|
+
const { chunkGraph, moduleGraph, requestShortener } = compilation;
|
|
91
|
+
/** @type {Map<string, { size: number, name: string }[]>} */
|
|
92
|
+
const byReason = new Map();
|
|
93
|
+
/** @type {Set<Module>} */
|
|
94
|
+
const affected = new Set();
|
|
95
|
+
|
|
96
|
+
for (const module of compilation.modules) {
|
|
97
|
+
// One webpack left out was never a candidate.
|
|
98
|
+
if (chunkGraph.getNumberOfModuleChunks(module) === 0) continue;
|
|
99
|
+
|
|
100
|
+
const reasons = getOwnReasons(
|
|
101
|
+
moduleGraph.getOptimizationBailout(module),
|
|
102
|
+
requestShortener
|
|
103
|
+
);
|
|
104
|
+
|
|
105
|
+
if (reasons.length === 0) continue;
|
|
106
|
+
|
|
107
|
+
affected.add(module);
|
|
108
|
+
|
|
109
|
+
const entry = {
|
|
110
|
+
name: module.readableIdentifier(requestShortener),
|
|
111
|
+
size: getModuleSize(module)
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
for (const reason of new Set(reasons)) {
|
|
115
|
+
const modules = byReason.get(reason);
|
|
116
|
+
|
|
117
|
+
if (modules === undefined) {
|
|
118
|
+
byReason.set(reason, [entry]);
|
|
119
|
+
} else {
|
|
120
|
+
modules.push(entry);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
if (affected.size === 0) return;
|
|
126
|
+
|
|
127
|
+
/** @type {ScopeHoistingBailoutGroup[]} */
|
|
128
|
+
const groups = [];
|
|
129
|
+
|
|
130
|
+
for (const [reason, modules] of byReason) {
|
|
131
|
+
// Ties break by name: module order is not stable across runtimes.
|
|
132
|
+
modules.sort(
|
|
133
|
+
(a, b) => b.size - a.size || compareStrings(a.name, b.name)
|
|
134
|
+
);
|
|
135
|
+
|
|
136
|
+
groups.push({
|
|
137
|
+
reason,
|
|
138
|
+
count: modules.length,
|
|
139
|
+
names: modules.slice(0, MAX_REPORTED_NAMES).map((m) => m.name)
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
groups.sort(
|
|
144
|
+
(a, b) => b.count - a.count || compareStrings(a.reason, b.reason)
|
|
145
|
+
);
|
|
146
|
+
|
|
147
|
+
const warning = new ScopeHoistingBailoutsWarning(
|
|
148
|
+
groups.slice(0, MAX_REPORTED_REASONS),
|
|
149
|
+
affected.size
|
|
150
|
+
);
|
|
151
|
+
|
|
152
|
+
if (hints === "error") {
|
|
153
|
+
compilation.errors.push(warning);
|
|
154
|
+
} else if (hints === "stats") {
|
|
155
|
+
compilation.hints.push(warning);
|
|
156
|
+
} else {
|
|
157
|
+
compilation.warnings.push(warning);
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
module.exports = ScopeHoistingBailoutsPlugin;
|