webpack 5.107.2 → 5.108.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/hot/dev-server.js +2 -0
- package/lib/APIPlugin.js +8 -4
- package/lib/CacheFacade.js +7 -0
- package/lib/Chunk.js +4 -0
- package/lib/ChunkGraph.js +30 -9
- package/lib/CircularModulesPlugin.js +190 -0
- package/lib/CleanPlugin.js +2 -1
- package/lib/Compilation.js +396 -65
- package/lib/Compiler.js +25 -11
- package/lib/ConcatenationScope.js +10 -3
- package/lib/ContextExclusionPlugin.js +1 -0
- package/lib/ContextModule.js +92 -47
- package/lib/ContextReplacementPlugin.js +4 -0
- package/lib/DefinePlugin.js +89 -15
- package/lib/Dependency.js +111 -7
- package/lib/EntryOptionPlugin.js +39 -2
- package/lib/EntryPlugin.js +2 -0
- package/lib/ExportsInfo.js +314 -73
- package/lib/ExternalModule.js +82 -34
- package/lib/ExternalModuleFactoryPlugin.js +1 -0
- package/lib/ExternalsPlugin.js +1 -0
- package/lib/FileSystemInfo.js +173 -23
- package/lib/FlagAllModulesAsUsedPlugin.js +1 -5
- package/lib/FlagDependencyExportsPlugin.js +23 -0
- package/lib/FlagDependencyUsagePlugin.js +87 -5
- package/lib/FlagEntryExportAsUsedPlugin.js +2 -0
- package/lib/Generator.js +8 -0
- package/lib/HotModuleReplacementPlugin.js +65 -28
- package/lib/IgnorePlugin.js +1 -0
- package/lib/InitFragment.js +5 -0
- package/lib/JavascriptMetaInfoPlugin.js +7 -5
- package/lib/LazyBarrel.js +361 -0
- package/lib/LoaderTargetPlugin.js +1 -0
- package/lib/Module.js +21 -42
- package/lib/ModuleGraph.js +3 -2
- package/lib/ModuleProfile.js +27 -1
- package/lib/ModuleTemplate.js +2 -0
- package/lib/MultiCompiler.js +2 -0
- package/lib/MultiStats.js +1 -0
- package/lib/MultiWatching.js +2 -0
- package/lib/NodeStuffPlugin.js +22 -17
- package/lib/NormalModule.js +142 -80
- package/lib/NormalModuleReplacementPlugin.js +2 -0
- package/lib/PrefetchPlugin.js +2 -0
- package/lib/ProgressPlugin.js +8 -0
- package/lib/ProvidePlugin.js +1 -0
- package/lib/RawModule.js +20 -16
- package/lib/RecordIdsPlugin.js +1 -0
- package/lib/RuntimeGlobals.js +5 -0
- package/lib/RuntimePlugin.js +58 -26
- package/lib/RuntimeTemplate.js +278 -21
- package/lib/SelfModuleFactory.js +1 -0
- package/lib/SourceMapDevToolPlugin.js +3 -5
- package/lib/Stats.js +1 -0
- package/lib/Template.js +8 -2
- package/lib/TemplatedPathPlugin.js +473 -131
- package/lib/WarnCaseSensitiveModulesPlugin.js +1 -0
- package/lib/WarnDeprecatedOptionPlugin.js +4 -0
- package/lib/WarnNoModeSetPlugin.js +1 -0
- package/lib/WatchIgnorePlugin.js +1 -0
- package/lib/Watching.js +9 -0
- package/lib/WebpackOptionsApply.js +50 -5
- package/lib/asset/AssetBytesGenerator.js +11 -3
- package/lib/asset/AssetGenerator.js +47 -22
- package/lib/asset/AssetModule.js +47 -0
- package/lib/asset/AssetModulesPlugin.js +14 -14
- package/lib/asset/AssetParser.js +2 -2
- package/lib/asset/AssetSourceGenerator.js +8 -0
- package/lib/asset/RawDataUrlModule.js +12 -13
- package/lib/buildChunkGraph.js +64 -7
- package/lib/bun/BunTargetPlugin.js +48 -0
- package/lib/cache/AddBuildDependenciesPlugin.js +1 -0
- package/lib/cache/AddManagedPathsPlugin.js +3 -0
- package/lib/cache/IdleFileCachePlugin.js +4 -0
- package/lib/cache/MemoryWithGcCachePlugin.js +1 -0
- package/lib/cache/PackFileCacheStrategy.js +1 -0
- package/lib/cache/ResolverCachePlugin.js +2 -0
- package/lib/cache/mergeEtags.js +2 -0
- package/lib/cli.js +109 -19
- package/lib/config/browserslistTargetHandler.js +99 -0
- package/lib/config/defaults.js +147 -7
- package/lib/config/defineConfig.js +31 -0
- package/lib/config/normalization.js +5 -0
- package/lib/config/target.js +181 -2
- package/lib/container/ContainerEntryModule.js +15 -14
- package/lib/container/ContainerExposedDependency.js +2 -2
- package/lib/container/ContainerReferencePlugin.js +1 -1
- package/lib/container/FallbackDependency.js +5 -7
- package/lib/container/FallbackModule.js +10 -9
- package/lib/container/RemoteModule.js +20 -10
- package/lib/container/RemoteRuntimeModule.js +14 -12
- package/lib/css/CssGenerator.js +353 -327
- package/lib/css/CssInjectStyleRuntimeModule.js +36 -8
- package/lib/css/CssLoadingRuntimeModule.js +118 -47
- package/lib/css/CssModule.js +52 -23
- package/lib/css/CssModulesPlugin.js +107 -124
- package/lib/css/CssParser.js +2759 -2205
- package/lib/css/syntax.js +2859 -0
- package/lib/debug/ProfilingPlugin.js +2 -0
- package/lib/deno/DenoTargetPlugin.js +47 -0
- package/lib/dependencies/AMDDefineDependency.js +22 -17
- package/lib/dependencies/AMDDefineDependencyParserPlugin.js +1 -0
- package/lib/dependencies/AMDRequireArrayDependency.js +7 -11
- package/lib/dependencies/AMDRequireContextDependency.js +7 -11
- package/lib/dependencies/AMDRequireDependenciesBlockParserPlugin.js +1 -0
- package/lib/dependencies/AMDRequireDependency.js +24 -20
- package/lib/dependencies/CachedConstDependency.js +3 -0
- package/lib/dependencies/CommonJsDependencyHelpers.js +1 -0
- package/lib/dependencies/CommonJsExportRequireDependency.js +79 -31
- package/lib/dependencies/CommonJsExportsDependency.js +21 -16
- package/lib/dependencies/CommonJsExportsParserPlugin.js +230 -7
- package/lib/dependencies/CommonJsFullRequireDependency.js +27 -19
- package/lib/dependencies/CommonJsImportsParserPlugin.js +51 -16
- package/lib/dependencies/CommonJsPlugin.js +1 -1
- package/lib/dependencies/CommonJsRequireContextDependency.js +10 -13
- package/lib/dependencies/CommonJsRequireDependency.js +42 -11
- package/lib/dependencies/CommonJsSelfReferenceDependency.js +22 -14
- package/lib/dependencies/ConstDependency.js +16 -11
- package/lib/dependencies/ContextDependency.js +4 -0
- package/lib/dependencies/ContextDependencyTemplateAsId.js +1 -1
- package/lib/dependencies/ContextElementDependency.js +23 -14
- package/lib/dependencies/CreateRequireParserPlugin.js +1 -0
- package/lib/dependencies/CreateScriptUrlDependency.js +5 -7
- package/lib/dependencies/CriticalDependencyWarning.js +1 -0
- package/lib/dependencies/CssIcssExportDependency.js +512 -574
- package/lib/dependencies/CssIcssImportDependency.js +9 -9
- package/lib/dependencies/CssIcssSymbolDependency.js +22 -15
- package/lib/dependencies/CssImportDependency.js +25 -1
- package/lib/dependencies/CssUrlDependency.js +23 -14
- package/lib/dependencies/DllEntryDependency.js +9 -13
- package/lib/dependencies/ExportBindingInitFragment.js +164 -0
- package/lib/dependencies/ExportsInfoDependency.js +12 -12
- package/lib/dependencies/ExternalModuleDependency.js +8 -5
- package/lib/dependencies/ExternalModuleInitFragment.js +7 -5
- package/lib/dependencies/ExternalModuleInitFragmentDependency.js +13 -10
- package/lib/dependencies/HarmonyAcceptDependency.js +11 -11
- package/lib/dependencies/HarmonyAcceptImportDependency.js +1 -0
- package/lib/dependencies/HarmonyDetectionParserPlugin.js +47 -22
- package/lib/dependencies/HarmonyEvaluatedImportSpecifierDependency.js +28 -2
- package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +46 -22
- package/lib/dependencies/HarmonyExportExpressionDependency.js +107 -30
- package/lib/dependencies/HarmonyExportHeaderDependency.js +7 -9
- package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +109 -31
- package/lib/dependencies/HarmonyExportInitFragment.js +18 -15
- package/lib/dependencies/HarmonyExportSpecifierDependency.js +83 -18
- package/lib/dependencies/HarmonyExports.js +4 -1
- package/lib/dependencies/HarmonyImportDependency.js +24 -0
- package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +110 -74
- package/lib/dependencies/HarmonyImportGuard.js +254 -0
- package/lib/dependencies/HarmonyImportSideEffectDependency.js +18 -1
- package/lib/dependencies/HarmonyImportSpecifierDependency.js +118 -14
- package/lib/dependencies/HarmonyLinkingError.js +1 -0
- package/lib/dependencies/HarmonyModulesPlugin.js +1 -0
- package/lib/dependencies/{HtmlScriptSrcDependency.js → HtmlEntryDependency.js} +261 -109
- package/lib/dependencies/HtmlInlineHtmlDependency.js +107 -0
- package/lib/dependencies/HtmlInlineScriptDependency.js +17 -13
- package/lib/dependencies/HtmlInlineStyleDependency.js +45 -11
- package/lib/dependencies/ImportContextDependency.js +5 -9
- package/lib/dependencies/ImportDependency.js +44 -2
- package/lib/dependencies/ImportMetaHotAcceptDependency.js +1 -0
- package/lib/dependencies/ImportMetaHotDeclineDependency.js +1 -0
- package/lib/dependencies/ImportMetaPlugin.js +74 -30
- package/lib/dependencies/ImportParserPlugin.js +19 -0
- package/lib/dependencies/ImportWeakDependency.js +1 -0
- package/lib/dependencies/JsonExportsDependency.js +9 -9
- package/lib/dependencies/LoaderImportDependency.js +1 -0
- package/lib/dependencies/LocalModule.js +11 -12
- package/lib/dependencies/LocalModuleDependency.js +11 -13
- package/lib/dependencies/ModuleDecoratorDependency.js +9 -9
- package/lib/dependencies/ModuleDependency.js +7 -0
- package/lib/dependencies/ModuleHotAcceptDependency.js +1 -0
- package/lib/dependencies/ModuleHotDeclineDependency.js +1 -0
- package/lib/dependencies/ModuleInitFragmentDependency.js +15 -11
- package/lib/dependencies/ProvidedDependency.js +31 -27
- package/lib/dependencies/PureExpressionDependency.js +7 -9
- package/lib/dependencies/RequireEnsureDependency.js +12 -13
- package/lib/dependencies/RequireHeaderDependency.js +3 -4
- package/lib/dependencies/RequireIncludeDependencyParserPlugin.js +3 -0
- package/lib/dependencies/RequireResolveContextDependency.js +7 -11
- package/lib/dependencies/RequireResolveDependency.js +1 -0
- package/lib/dependencies/RequireResolveHeaderDependency.js +3 -5
- package/lib/dependencies/RuntimeRequirementsDependency.js +6 -7
- package/lib/dependencies/StaticExportsDependency.js +10 -10
- package/lib/dependencies/SystemPlugin.js +2 -0
- package/lib/dependencies/URLContextDependency.js +5 -7
- package/lib/dependencies/URLDependency.js +14 -16
- package/lib/dependencies/UnsupportedDependency.js +8 -13
- package/lib/dependencies/WebAssemblyExportImportedDependency.js +11 -16
- package/lib/dependencies/WebAssemblyImportDependency.js +14 -16
- package/lib/dependencies/WebpackIsIncludedDependency.js +1 -0
- package/lib/dependencies/WorkerDependency.js +19 -8
- package/lib/dependencies/WorkerPlugin.js +22 -6
- package/lib/dependencies/processExportInfo.js +13 -11
- package/lib/dll/DelegatedModule.js +29 -15
- package/lib/dll/DelegatedModuleFactoryPlugin.js +1 -0
- package/lib/dll/DelegatedPlugin.js +1 -0
- package/lib/dll/DllEntryPlugin.js +3 -0
- package/lib/dll/DllModule.js +3 -2
- package/lib/dll/DllPlugin.js +16 -0
- package/lib/dll/DllReferencePlugin.js +3 -0
- package/lib/dll/LibManifestPlugin.js +1 -0
- package/lib/electron/ElectronTargetPlugin.js +22 -4
- package/lib/errors/ConcurrentCompilationError.js +1 -0
- package/lib/errors/HookWebpackError.js +11 -13
- package/lib/errors/IgnoreErrorModuleFactory.js +1 -0
- package/lib/errors/InvalidDependenciesModuleWarning.js +2 -0
- package/lib/errors/JSONParseError.js +9 -8
- package/lib/errors/ModuleBuildError.js +16 -13
- package/lib/errors/ModuleDependencyError.js +8 -1
- package/lib/errors/ModuleDependencyWarning.js +8 -1
- package/lib/errors/ModuleError.js +5 -11
- package/lib/errors/ModuleHashingError.js +4 -0
- package/lib/errors/ModuleNotFoundError.js +3 -0
- package/lib/errors/ModuleParseError.js +5 -11
- package/lib/errors/ModuleRestoreError.js +2 -0
- package/lib/errors/ModuleStoreError.js +3 -0
- package/lib/errors/ModuleWarning.js +7 -11
- package/lib/errors/NodeStuffInWebError.js +1 -0
- package/lib/errors/NonErrorEmittedError.js +2 -0
- package/lib/errors/UnhandledSchemeError.js +1 -0
- package/lib/esm/ModuleChunkLoadingPlugin.js +0 -1
- package/lib/esm/ModuleChunkLoadingRuntimeModule.js +28 -23
- package/lib/hmr/HotModuleReplacement.runtime.js +175 -30
- package/lib/hmr/HotModuleReplacementRuntimeModule.js +7 -0
- package/lib/hmr/JavascriptHotModuleReplacement.runtime.js +173 -26
- package/lib/hmr/LazyCompilationPlugin.js +30 -6
- package/lib/html/HtmlGenerator.js +217 -23
- package/lib/html/HtmlModule.js +40 -0
- package/lib/html/HtmlModulesPlugin.js +219 -55
- package/lib/html/HtmlParser.js +1108 -1099
- package/lib/html/{walkHtmlTokens.js → syntax.js} +4701 -212
- package/lib/ids/IdHelpers.js +4 -2
- package/lib/index.js +19 -0
- package/lib/javascript/BasicEvaluatedExpression.js +1 -0
- package/lib/javascript/EnableChunkLoadingPlugin.js +1 -0
- package/lib/javascript/JavascriptGenerator.js +6 -2
- package/lib/javascript/JavascriptModule.js +54 -0
- package/lib/javascript/JavascriptModulesPlugin.js +257 -102
- package/lib/javascript/JavascriptParser.js +285 -158
- package/lib/json/JsonModule.js +40 -0
- package/lib/json/JsonModulesPlugin.js +7 -0
- package/lib/json/JsonParser.js +4 -2
- package/lib/library/AssignLibraryPlugin.js +5 -3
- package/lib/library/ExportPropertyLibraryPlugin.js +1 -0
- package/lib/library/FalseIIFEUmdWarning.js +1 -0
- package/lib/library/ModuleLibraryPlugin.js +24 -5
- package/lib/library/SystemLibraryPlugin.js +3 -3
- package/lib/node/NodeTargetPlugin.js +1 -0
- package/lib/node/NodeWatchFileSystem.js +1 -0
- package/lib/node/ReadFileChunkLoadingRuntimeModule.js +10 -9
- package/lib/node/RequireChunkLoadingRuntimeModule.js +18 -16
- package/lib/optimize/ConcatenatedModule.js +395 -77
- package/lib/optimize/ConstExportsPlugin.js +211 -0
- package/lib/optimize/InlineExports.js +178 -0
- package/lib/optimize/InnerGraph.js +372 -275
- package/lib/optimize/InnerGraphPlugin.js +196 -99
- package/lib/optimize/ModuleConcatenationPlugin.js +56 -25
- package/lib/optimize/RealContentHashPlugin.js +14 -1
- package/lib/optimize/SideEffectsFlagPlugin.js +234 -64
- package/lib/runtime/AsyncModuleRuntimeModule.js +32 -30
- package/lib/runtime/AutoPublicPathRuntimeModule.js +11 -5
- package/lib/runtime/CompatGetDefaultExportRuntimeModule.js +1 -1
- package/lib/runtime/CreateFakeNamespaceObjectRuntimeModule.js +6 -4
- package/lib/runtime/DefinePropertyGettersRuntimeModule.js +33 -4
- package/lib/runtime/GetChunkFilenameRuntimeModule.js +82 -3
- package/lib/runtime/GetTrustedTypesPolicyRuntimeModule.js +1 -1
- package/lib/runtime/HasOwnPropertyRuntimeModule.js +1 -1
- package/lib/runtime/LoadScriptRuntimeModule.js +18 -13
- package/lib/runtime/MakeDeferredNamespaceObjectRuntime.js +39 -26
- package/lib/runtime/MakeNamespaceObjectRuntimeModule.js +1 -1
- package/lib/runtime/OnChunksLoadedRuntimeModule.js +4 -4
- package/lib/runtime/RelativeUrlRuntimeModule.js +3 -2
- package/lib/runtime/StartupChunkDependenciesRuntimeModule.js +1 -1
- package/lib/runtime/StartupEntrypointRuntimeModule.js +4 -3
- package/lib/runtime/WorkerRuntimeModule.js +33 -0
- package/lib/schemes/HttpUriPlugin.js +3 -2
- package/lib/serialization/AggregateErrorSerializer.js +7 -6
- package/lib/serialization/ArraySerializer.js +4 -8
- package/lib/serialization/BinaryMiddleware.js +538 -468
- package/lib/serialization/DateObjectSerializer.js +2 -2
- package/lib/serialization/ErrorObjectSerializer.js +7 -6
- package/lib/serialization/MapObjectSerializer.js +5 -9
- package/lib/serialization/NullPrototypeObjectSerializer.js +7 -9
- package/lib/serialization/ObjectMiddleware.js +50 -13
- package/lib/serialization/PlainObjectSerializer.js +9 -8
- package/lib/serialization/RegExpObjectSerializer.js +2 -2
- package/lib/serialization/Serializer.js +1 -0
- package/lib/serialization/SetObjectSerializer.js +4 -8
- package/lib/sharing/ConsumeSharedModule.js +6 -7
- package/lib/sharing/ConsumeSharedPlugin.js +1 -0
- package/lib/sharing/ConsumeSharedRuntimeModule.js +46 -41
- package/lib/sharing/ProvideSharedDependency.js +30 -15
- package/lib/sharing/ProvideSharedModule.js +30 -11
- package/lib/sharing/ProvideSharedPlugin.js +4 -2
- package/lib/sharing/SharePlugin.js +3 -0
- package/lib/sharing/ShareRuntimeModule.js +18 -16
- package/lib/sharing/resolveMatchedConfigs.js +2 -1
- package/lib/sharing/utils.js +1 -1
- package/lib/stats/DefaultStatsFactoryPlugin.js +4 -6
- package/lib/stats/DefaultStatsPrinterPlugin.js +14 -14
- package/lib/stats/StatsFactory.js +11 -9
- package/lib/stats/StatsPrinter.js +9 -2
- package/lib/url/URLParserPlugin.js +5 -2
- package/lib/util/AsyncQueue.js +10 -0
- package/lib/util/LazyBucketSortedSet.js +5 -0
- package/lib/util/LazySet.js +6 -4
- package/lib/util/LocConverter.js +11 -1
- package/lib/util/Semaphore.js +1 -0
- package/lib/util/SourceProcessor.js +106 -0
- package/lib/util/TupleSet.js +1 -0
- package/lib/util/WeakTupleMap.js +27 -1
- package/lib/util/chainedImports.js +3 -3
- package/lib/util/comparators.js +2 -2
- package/lib/util/concatenate.js +31 -7
- package/lib/util/createHash.js +0 -1
- package/lib/util/deterministicGrouping.js +19 -12
- package/lib/util/extractSourceMap.js +1 -1
- package/lib/util/findGraphRoots.js +2 -0
- package/lib/util/fs.js +10 -5
- package/lib/util/hash/DebugHash.js +1 -0
- package/lib/util/hash/hash-digest.js +24 -15
- package/lib/util/identifier.js +7 -0
- package/lib/util/internalSerializables.js +11 -2
- package/lib/util/magicComment.js +42 -0
- package/lib/util/makeSerializable.js +1 -0
- package/lib/util/nonNumericOnlyHash.js +30 -1
- package/lib/util/property.js +7 -1
- package/lib/util/publicPathPlaceholder.js +64 -0
- package/lib/util/registerExternalSerializer.js +4 -4
- package/lib/wasm-async/AsyncWasmModule.js +77 -0
- package/lib/wasm-async/AsyncWebAssemblyJavascriptGenerator.js +1 -1
- package/lib/wasm-async/AsyncWebAssemblyModulesPlugin.js +1 -96
- package/lib/wasm-async/AsyncWebAssemblyParser.js +1 -1
- package/lib/wasm-async/UniversalCompileAsyncWasmPlugin.js +1 -1
- package/lib/wasm-sync/SyncWasmModule.js +39 -0
- package/lib/wasm-sync/UnsupportedWebAssemblyFeatureError.js +1 -0
- package/lib/wasm-sync/WasmChunkLoadingRuntimeModule.js +6 -3
- package/lib/wasm-sync/WasmFinalizeExportsPlugin.js +2 -1
- package/lib/wasm-sync/WebAssemblyGenerator.js +1 -0
- package/lib/wasm-sync/WebAssemblyInInitialChunkError.js +2 -0
- package/lib/wasm-sync/WebAssemblyModulesPlugin.js +10 -0
- package/lib/wasm-sync/WebAssemblyParser.js +7 -3
- package/lib/web/JsonpChunkLoadingRuntimeModule.js +45 -39
- package/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js +11 -10
- package/package.json +35 -27
- package/schemas/WebpackOptions.check.js +1 -1
- package/schemas/WebpackOptions.json +212 -3
- package/schemas/plugins/HtmlGeneratorOptions.check.js +1 -1
- package/schemas/plugins/HtmlParserOptions.check.d.ts +7 -0
- package/schemas/plugins/HtmlParserOptions.check.js +6 -0
- package/schemas/plugins/HtmlParserOptions.json +3 -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 +1456 -290
- package/lib/css/walkCssTokens.js +0 -2020
- package/lib/util/AppendOnlyStackedSet.js +0 -93
package/lib/ExportsInfo.js
CHANGED
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
"use strict";
|
|
7
7
|
|
|
8
8
|
const { ImportPhaseUtils } = require("./dependencies/ImportPhase");
|
|
9
|
+
const { InlinedUsedName } = require("./optimize/InlineExports");
|
|
9
10
|
const { equals } = require("./util/ArrayHelpers");
|
|
10
11
|
const SortableSet = require("./util/SortableSet");
|
|
11
12
|
const makeSerializable = require("./util/makeSerializable");
|
|
@@ -19,8 +20,10 @@ const { forEachRuntime } = require("./util/runtime");
|
|
|
19
20
|
/** @typedef {import("./Module")} Module */
|
|
20
21
|
/** @typedef {import("./ModuleGraph")} ModuleGraph */
|
|
21
22
|
/** @typedef {import("./ModuleGraphConnection")} ModuleGraphConnection */
|
|
22
|
-
/** @typedef {import("./
|
|
23
|
-
/** @typedef {
|
|
23
|
+
/** @typedef {import("./optimize/InlineExports").InlinedValue} InlinedValue */
|
|
24
|
+
/** @typedef {[RestoreProvidedDataExports[], ExportInfo["provided"], ExportInfo["canMangleProvide"], ExportInfo["terminalBinding"]]} RestoreProvidedDataTuple */
|
|
25
|
+
/** @typedef {import("./serialization/ObjectMiddleware").ObjectDeserializerContext<RestoreProvidedDataTuple>} ObjectDeserializerContext */
|
|
26
|
+
/** @typedef {import("./serialization/ObjectMiddleware").ObjectSerializerContext<RestoreProvidedDataTuple>} ObjectSerializerContext */
|
|
24
27
|
/** @typedef {import("./util/Hash")} Hash */
|
|
25
28
|
|
|
26
29
|
/** @typedef {typeof UsageState.OnlyPropertiesUsed | typeof UsageState.NoInfo | typeof UsageState.Unknown | typeof UsageState.Used} RuntimeUsageStateType */
|
|
@@ -34,11 +37,11 @@ const { forEachRuntime } = require("./util/runtime");
|
|
|
34
37
|
/** @typedef {{ connection: ModuleGraphConnection, export: ExportInfoName[], priority: number }} TargetItem */
|
|
35
38
|
/** @typedef {Map<Dependency | undefined, TargetItem>} Target */
|
|
36
39
|
|
|
37
|
-
/** @typedef {string | null} ExportInfoUsedName */
|
|
40
|
+
/** @typedef {string | InlinedUsedName | null} ExportInfoUsedName */
|
|
38
41
|
/** @typedef {boolean | null} ExportInfoProvided */
|
|
39
42
|
|
|
40
43
|
/** @typedef {Map<ExportInfoName, ExportInfo>} Exports */
|
|
41
|
-
/** @typedef {string | string[] | false} UsedName */
|
|
44
|
+
/** @typedef {string | string[] | InlinedUsedName | false} UsedName */
|
|
42
45
|
/** @typedef {Set<ExportInfo>} AlreadyVisitedExportInfo */
|
|
43
46
|
|
|
44
47
|
/**
|
|
@@ -47,7 +50,9 @@ const { forEachRuntime } = require("./util/runtime");
|
|
|
47
50
|
* @property {ExportInfoName} name
|
|
48
51
|
* @property {ExportInfo["provided"]} provided
|
|
49
52
|
* @property {ExportInfo["canMangleProvide"]} canMangleProvide
|
|
53
|
+
* @property {ExportInfo["canInlineProvide"]=} canInlineProvide
|
|
50
54
|
* @property {ExportInfo["terminalBinding"]} terminalBinding
|
|
55
|
+
* @property {ExportInfo["pureProvide"]=} pureProvide
|
|
51
56
|
* @property {RestoreProvidedData | undefined} exportsInfo
|
|
52
57
|
*/
|
|
53
58
|
|
|
@@ -63,6 +68,12 @@ const RETURNS_TRUE = () => true;
|
|
|
63
68
|
|
|
64
69
|
const CIRCULAR = Symbol("circular target");
|
|
65
70
|
|
|
71
|
+
// bit layout of ExportInfo._inlineFlags
|
|
72
|
+
const INLINE_USE_TRUE = 1;
|
|
73
|
+
const INLINE_USE_FALSE = 2;
|
|
74
|
+
const INLINE_USE_MASK = 3;
|
|
75
|
+
const PURE_PROVIDE_FLAG = 4;
|
|
76
|
+
|
|
66
77
|
class RestoreProvidedData {
|
|
67
78
|
/**
|
|
68
79
|
* Creates an instance of RestoreProvidedData.
|
|
@@ -77,9 +88,13 @@ class RestoreProvidedData {
|
|
|
77
88
|
otherCanMangleProvide,
|
|
78
89
|
otherTerminalBinding
|
|
79
90
|
) {
|
|
91
|
+
/** @type {RestoreProvidedDataExports[]} */
|
|
80
92
|
this.exports = exports;
|
|
93
|
+
/** @type {ExportInfoProvided | undefined} */
|
|
81
94
|
this.otherProvided = otherProvided;
|
|
95
|
+
/** @type {boolean | undefined} */
|
|
82
96
|
this.otherCanMangleProvide = otherCanMangleProvide;
|
|
97
|
+
/** @type {boolean} */
|
|
83
98
|
this.otherTerminalBinding = otherTerminalBinding;
|
|
84
99
|
}
|
|
85
100
|
|
|
@@ -87,11 +102,12 @@ class RestoreProvidedData {
|
|
|
87
102
|
* Serializes this instance into the provided serializer context.
|
|
88
103
|
* @param {ObjectSerializerContext} context context
|
|
89
104
|
*/
|
|
90
|
-
serialize(
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
105
|
+
serialize(context) {
|
|
106
|
+
context
|
|
107
|
+
.write(this.exports)
|
|
108
|
+
.write(this.otherProvided)
|
|
109
|
+
.write(this.otherCanMangleProvide)
|
|
110
|
+
.write(this.otherTerminalBinding);
|
|
95
111
|
}
|
|
96
112
|
|
|
97
113
|
/**
|
|
@@ -99,8 +115,20 @@ class RestoreProvidedData {
|
|
|
99
115
|
* @param {ObjectDeserializerContext} context context
|
|
100
116
|
* @returns {RestoreProvidedData} RestoreProvidedData
|
|
101
117
|
*/
|
|
102
|
-
static deserialize(
|
|
103
|
-
|
|
118
|
+
static deserialize(context) {
|
|
119
|
+
const exports = context.read();
|
|
120
|
+
const c1 = context.rest;
|
|
121
|
+
const otherProvided = c1.read();
|
|
122
|
+
const c2 = c1.rest;
|
|
123
|
+
const otherCanMangleProvide = c2.read();
|
|
124
|
+
const c3 = c2.rest;
|
|
125
|
+
const otherTerminalBinding = c3.read();
|
|
126
|
+
return new RestoreProvidedData(
|
|
127
|
+
exports,
|
|
128
|
+
otherProvided,
|
|
129
|
+
otherCanMangleProvide,
|
|
130
|
+
otherTerminalBinding
|
|
131
|
+
);
|
|
104
132
|
}
|
|
105
133
|
}
|
|
106
134
|
|
|
@@ -137,6 +165,17 @@ class ExportsInfo {
|
|
|
137
165
|
this._exportsAreOrdered = false;
|
|
138
166
|
/** @type {ExportsInfo=} */
|
|
139
167
|
this._redirectTo = undefined;
|
|
168
|
+
// fast-path flag for hasInlinedUsedName; set by InlineExportsPlugin
|
|
169
|
+
/** @type {boolean} */
|
|
170
|
+
this._hasInlinedExports = false;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* Records that an owned export got an inlined used name.
|
|
175
|
+
* @returns {void}
|
|
176
|
+
*/
|
|
177
|
+
markInlinedExports() {
|
|
178
|
+
this._hasInlinedExports = true;
|
|
140
179
|
}
|
|
141
180
|
|
|
142
181
|
/**
|
|
@@ -326,10 +365,15 @@ class ExportsInfo {
|
|
|
326
365
|
* @returns {ExportInfo | undefined} export info for this name
|
|
327
366
|
*/
|
|
328
367
|
getReadOnlyExportInfoRecursive(name) {
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
368
|
+
/** @type {ExportsInfo} */
|
|
369
|
+
let exportsInfo = this;
|
|
370
|
+
const last = name.length - 1;
|
|
371
|
+
for (let i = 0; ; i++) {
|
|
372
|
+
const exportInfo = exportsInfo.getReadOnlyExportInfo(name[i]);
|
|
373
|
+
if (i === last) return exportInfo;
|
|
374
|
+
if (!exportInfo.exportsInfo) return;
|
|
375
|
+
exportsInfo = exportInfo.exportsInfo;
|
|
376
|
+
}
|
|
333
377
|
}
|
|
334
378
|
|
|
335
379
|
/**
|
|
@@ -339,9 +383,14 @@ class ExportsInfo {
|
|
|
339
383
|
*/
|
|
340
384
|
getNestedExportsInfo(name) {
|
|
341
385
|
if (Array.isArray(name) && name.length > 0) {
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
386
|
+
/** @type {ExportsInfo} */
|
|
387
|
+
let exportsInfo = this;
|
|
388
|
+
for (let i = 0; i < name.length; i++) {
|
|
389
|
+
const info = exportsInfo.getReadOnlyExportInfo(name[i]);
|
|
390
|
+
if (!info.exportsInfo) return;
|
|
391
|
+
exportsInfo = info.exportsInfo;
|
|
392
|
+
}
|
|
393
|
+
return exportsInfo;
|
|
345
394
|
}
|
|
346
395
|
return this;
|
|
347
396
|
}
|
|
@@ -657,11 +706,17 @@ class ExportsInfo {
|
|
|
657
706
|
*/
|
|
658
707
|
isExportProvided(name) {
|
|
659
708
|
if (Array.isArray(name)) {
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
709
|
+
/** @type {ExportsInfo} */
|
|
710
|
+
let exportsInfo = this;
|
|
711
|
+
const last = name.length - 1;
|
|
712
|
+
for (let i = 0; ; i++) {
|
|
713
|
+
const info = exportsInfo.getReadOnlyExportInfo(name[i]);
|
|
714
|
+
if (info.exportsInfo && i < last) {
|
|
715
|
+
exportsInfo = info.exportsInfo;
|
|
716
|
+
continue;
|
|
717
|
+
}
|
|
718
|
+
return info.provided ? i === last || undefined : info.provided;
|
|
663
719
|
}
|
|
664
|
-
return info.provided ? name.length === 1 || undefined : info.provided;
|
|
665
720
|
}
|
|
666
721
|
const info = this.getReadOnlyExportInfo(name);
|
|
667
722
|
return info.provided;
|
|
@@ -725,11 +780,15 @@ class ExportsInfo {
|
|
|
725
780
|
getUsed(name, runtime) {
|
|
726
781
|
if (Array.isArray(name)) {
|
|
727
782
|
if (name.length === 0) return this.otherExportsInfo.getUsed(runtime);
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
783
|
+
// Walk the nested path iteratively to avoid a `slice` per level
|
|
784
|
+
/** @type {ExportsInfo} */
|
|
785
|
+
let exportsInfo = this;
|
|
786
|
+
const last = name.length - 1;
|
|
787
|
+
for (let i = 0; ; i++) {
|
|
788
|
+
const info = exportsInfo.getReadOnlyExportInfo(name[i]);
|
|
789
|
+
if (i === last || !info.exportsInfo) return info.getUsed(runtime);
|
|
790
|
+
exportsInfo = info.exportsInfo;
|
|
731
791
|
}
|
|
732
|
-
return info.getUsed(runtime);
|
|
733
792
|
}
|
|
734
793
|
const info = this.getReadOnlyExportInfo(name);
|
|
735
794
|
return info.getUsed(runtime);
|
|
@@ -743,33 +802,95 @@ class ExportsInfo {
|
|
|
743
802
|
*/
|
|
744
803
|
getUsedName(name, runtime) {
|
|
745
804
|
if (Array.isArray(name)) {
|
|
746
|
-
// TODO improve this
|
|
747
805
|
if (name.length === 0) {
|
|
748
806
|
if (!this.isUsed(runtime)) return false;
|
|
749
807
|
return name;
|
|
750
808
|
}
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
809
|
+
// Walk the nested path once, collecting used names into a single array
|
|
810
|
+
// instead of slicing/spreading at every level.
|
|
811
|
+
/** @type {ExportsInfo} */
|
|
812
|
+
let exportsInfo = this;
|
|
813
|
+
/** @type {ExportInfoName[] | undefined} */
|
|
814
|
+
let result;
|
|
815
|
+
const last = name.length - 1;
|
|
816
|
+
for (let i = 0; ; i++) {
|
|
817
|
+
const info = exportsInfo.getReadOnlyExportInfo(name[i]);
|
|
818
|
+
const x = info.getUsedName(name[i], runtime);
|
|
819
|
+
if (x === false) return false;
|
|
820
|
+
if (x instanceof InlinedUsedName) {
|
|
821
|
+
// The inlined value replaces the prefix; trailing ids become its suffix
|
|
822
|
+
if (i === last) return x;
|
|
823
|
+
return new InlinedUsedName(x.value, [
|
|
824
|
+
...x.suffix,
|
|
825
|
+
...name.slice(i + 1)
|
|
826
|
+
]);
|
|
827
|
+
}
|
|
828
|
+
if (i === last) {
|
|
829
|
+
if (result === undefined) return x === name[i] ? name : [x];
|
|
830
|
+
result.push(x);
|
|
831
|
+
return result;
|
|
832
|
+
}
|
|
833
|
+
if (result === undefined) result = [];
|
|
834
|
+
result.push(x);
|
|
835
|
+
// Descend only while the parent is reached purely via property access
|
|
836
|
+
if (
|
|
837
|
+
info.exportsInfo &&
|
|
838
|
+
info.getUsed(runtime) === UsageState.OnlyPropertiesUsed
|
|
839
|
+
) {
|
|
840
|
+
exportsInfo = info.exportsInfo;
|
|
841
|
+
continue;
|
|
842
|
+
}
|
|
843
|
+
// Cannot descend further: keep the remaining ids unchanged
|
|
844
|
+
for (let j = i + 1; j <= last; j++) result.push(name[j]);
|
|
845
|
+
return result;
|
|
846
|
+
}
|
|
847
|
+
}
|
|
848
|
+
const info = this.getReadOnlyExportInfo(name);
|
|
849
|
+
return info.getUsedName(name, runtime);
|
|
850
|
+
}
|
|
851
|
+
|
|
852
|
+
/**
|
|
853
|
+
* Checks whether `getUsedName(name, runtime)` would return an `InlinedUsedName`,
|
|
854
|
+
* without allocating intermediate used-name arrays (hot path for connection conditions).
|
|
855
|
+
* @param {ExportInfoName[]} name the export name path
|
|
856
|
+
* @param {RuntimeSpec} runtime check usage for this runtime only
|
|
857
|
+
* @returns {boolean} true when the used name resolves to an inlined value
|
|
858
|
+
*/
|
|
859
|
+
hasInlinedUsedName(name, runtime) {
|
|
860
|
+
if (name.length === 0) return false;
|
|
861
|
+
/** @type {ExportsInfo} */
|
|
862
|
+
let exportsInfo = this;
|
|
863
|
+
const last = name.length - 1;
|
|
864
|
+
for (let i = 0; ; i++) {
|
|
865
|
+
// follow redirects for the fast-path flag; InlinedUsedName can only
|
|
866
|
+
// exist on a level whose (redirected) exportsInfo is marked
|
|
867
|
+
let hasInlined = false;
|
|
868
|
+
/** @type {ExportsInfo | undefined} */
|
|
869
|
+
let e = exportsInfo;
|
|
870
|
+
while (e !== undefined) {
|
|
871
|
+
if (e._hasInlinedExports) {
|
|
872
|
+
hasInlined = true;
|
|
873
|
+
break;
|
|
874
|
+
}
|
|
875
|
+
e = e._redirectTo;
|
|
876
|
+
}
|
|
877
|
+
if (!hasInlined && i === last) return false;
|
|
878
|
+
const info = exportsInfo.getReadOnlyExportInfo(name[i]);
|
|
879
|
+
if (hasInlined) {
|
|
880
|
+
const x = info.getUsedName(name[i], runtime);
|
|
881
|
+
if (x === false) return false;
|
|
882
|
+
if (x instanceof InlinedUsedName) return true;
|
|
883
|
+
if (i === last) return false;
|
|
759
884
|
}
|
|
760
885
|
if (
|
|
761
886
|
info.exportsInfo &&
|
|
762
887
|
info.getUsed(runtime) === UsageState.OnlyPropertiesUsed
|
|
763
888
|
) {
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
return [...arr, ...(Array.isArray(nested) ? nested : [nested])];
|
|
889
|
+
exportsInfo = info.exportsInfo;
|
|
890
|
+
continue;
|
|
767
891
|
}
|
|
768
|
-
return
|
|
892
|
+
return false;
|
|
769
893
|
}
|
|
770
|
-
const info = this.getReadOnlyExportInfo(name);
|
|
771
|
-
const usedName = info.getUsedName(name, runtime);
|
|
772
|
-
return usedName;
|
|
773
894
|
}
|
|
774
895
|
|
|
775
896
|
/**
|
|
@@ -790,18 +911,27 @@ class ExportsInfo {
|
|
|
790
911
|
* @returns {void}
|
|
791
912
|
*/
|
|
792
913
|
_updateHash(hash, runtime, alreadyVisitedExportsInfo) {
|
|
793
|
-
|
|
794
|
-
|
|
914
|
+
// add/delete keeps path semantics without copying the set per level
|
|
915
|
+
alreadyVisitedExportsInfo.add(this);
|
|
795
916
|
for (const exportInfo of this.orderedExports) {
|
|
796
917
|
if (exportInfo.hasInfo(this._otherExportsInfo, runtime)) {
|
|
797
|
-
exportInfo._updateHash(hash, runtime,
|
|
918
|
+
exportInfo._updateHash(hash, runtime, alreadyVisitedExportsInfo);
|
|
798
919
|
}
|
|
799
920
|
}
|
|
800
|
-
this._sideEffectsOnlyInfo._updateHash(
|
|
801
|
-
|
|
921
|
+
this._sideEffectsOnlyInfo._updateHash(
|
|
922
|
+
hash,
|
|
923
|
+
runtime,
|
|
924
|
+
alreadyVisitedExportsInfo
|
|
925
|
+
);
|
|
926
|
+
this._otherExportsInfo._updateHash(
|
|
927
|
+
hash,
|
|
928
|
+
runtime,
|
|
929
|
+
alreadyVisitedExportsInfo
|
|
930
|
+
);
|
|
802
931
|
if (this._redirectTo !== undefined) {
|
|
803
|
-
this._redirectTo._updateHash(hash, runtime,
|
|
932
|
+
this._redirectTo._updateHash(hash, runtime, alreadyVisitedExportsInfo);
|
|
804
933
|
}
|
|
934
|
+
alreadyVisitedExportsInfo.delete(this);
|
|
805
935
|
}
|
|
806
936
|
|
|
807
937
|
/**
|
|
@@ -815,22 +945,42 @@ class ExportsInfo {
|
|
|
815
945
|
/** @type {RestoreProvidedDataExports[]} */
|
|
816
946
|
const exports = [];
|
|
817
947
|
for (const exportInfo of this.orderedExports) {
|
|
948
|
+
const canInlineProvide = exportInfo.canInlineProvide;
|
|
949
|
+
const pureProvide = exportInfo.pureProvide;
|
|
950
|
+
// inline-exports data is only stored when present, so builds without the
|
|
951
|
+
// feature don't pay for it in the persistent cache
|
|
952
|
+
const hasInlineInfo =
|
|
953
|
+
canInlineProvide !== undefined || pureProvide !== undefined;
|
|
818
954
|
if (
|
|
819
955
|
exportInfo.provided !== otherProvided ||
|
|
820
956
|
exportInfo.canMangleProvide !== otherCanMangleProvide ||
|
|
821
957
|
exportInfo.terminalBinding !== otherTerminalBinding ||
|
|
958
|
+
hasInlineInfo ||
|
|
822
959
|
exportInfo.exportsInfoOwned
|
|
823
960
|
) {
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
?
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
961
|
+
const exportsInfo = exportInfo.exportsInfoOwned
|
|
962
|
+
? /** @type {NonNullable<ExportInfo["exportsInfo"]>} */
|
|
963
|
+
(exportInfo.exportsInfo).getRestoreProvidedData()
|
|
964
|
+
: undefined;
|
|
965
|
+
exports.push(
|
|
966
|
+
hasInlineInfo
|
|
967
|
+
? {
|
|
968
|
+
name: exportInfo.name,
|
|
969
|
+
provided: exportInfo.provided,
|
|
970
|
+
canMangleProvide: exportInfo.canMangleProvide,
|
|
971
|
+
canInlineProvide,
|
|
972
|
+
terminalBinding: exportInfo.terminalBinding,
|
|
973
|
+
pureProvide,
|
|
974
|
+
exportsInfo
|
|
975
|
+
}
|
|
976
|
+
: {
|
|
977
|
+
name: exportInfo.name,
|
|
978
|
+
provided: exportInfo.provided,
|
|
979
|
+
canMangleProvide: exportInfo.canMangleProvide,
|
|
980
|
+
terminalBinding: exportInfo.terminalBinding,
|
|
981
|
+
exportsInfo
|
|
982
|
+
}
|
|
983
|
+
);
|
|
834
984
|
}
|
|
835
985
|
}
|
|
836
986
|
return new RestoreProvidedData(
|
|
@@ -865,7 +1015,9 @@ class ExportsInfo {
|
|
|
865
1015
|
const exportInfo = this.getExportInfo(exp.name);
|
|
866
1016
|
exportInfo.provided = exp.provided;
|
|
867
1017
|
exportInfo.canMangleProvide = exp.canMangleProvide;
|
|
1018
|
+
exportInfo.canInlineProvide = exp.canInlineProvide;
|
|
868
1019
|
exportInfo.terminalBinding = exp.terminalBinding;
|
|
1020
|
+
exportInfo.pureProvide = exp.pureProvide;
|
|
869
1021
|
if (exp.exportsInfo) {
|
|
870
1022
|
const exportsInfo = exportInfo.createNestedExportsInfo();
|
|
871
1023
|
exportsInfo.restoreProvided(exp.exportsInfo);
|
|
@@ -929,6 +1081,14 @@ class ExportInfo {
|
|
|
929
1081
|
* @type {boolean | undefined}
|
|
930
1082
|
*/
|
|
931
1083
|
this.canMangleProvide = initFrom ? initFrom.canMangleProvide : undefined;
|
|
1084
|
+
// only specific export info can be inlined,
|
|
1085
|
+
// so _otherExportsInfo.canInlineProvide is always undefined
|
|
1086
|
+
/**
|
|
1087
|
+
* value slot for `canInlineProvide`
|
|
1088
|
+
* @private
|
|
1089
|
+
* @type {InlinedValue | undefined}
|
|
1090
|
+
*/
|
|
1091
|
+
this._inlinedValue = undefined;
|
|
932
1092
|
/**
|
|
933
1093
|
* true: it can be mangled
|
|
934
1094
|
* false: is can not be mangled
|
|
@@ -936,6 +1096,12 @@ class ExportInfo {
|
|
|
936
1096
|
* @type {boolean | undefined}
|
|
937
1097
|
*/
|
|
938
1098
|
this.canMangleUse = initFrom ? initFrom.canMangleUse : undefined;
|
|
1099
|
+
/**
|
|
1100
|
+
* bitfield backing `canInlineUse` and `pureProvide`
|
|
1101
|
+
* @private
|
|
1102
|
+
* @type {number}
|
|
1103
|
+
*/
|
|
1104
|
+
this._inlineFlags = 0;
|
|
939
1105
|
/** @type {boolean} */
|
|
940
1106
|
this.exportsInfoOwned = false;
|
|
941
1107
|
/** @type {ExportsInfo | undefined} */
|
|
@@ -956,6 +1122,57 @@ class ExportInfo {
|
|
|
956
1122
|
this._maxTarget = undefined;
|
|
957
1123
|
}
|
|
958
1124
|
|
|
1125
|
+
/**
|
|
1126
|
+
* defined: the export binds to a small primitive constant and may be inlined
|
|
1127
|
+
* undefined: not an inlined constant export
|
|
1128
|
+
* @returns {InlinedValue | undefined} inlined value
|
|
1129
|
+
*/
|
|
1130
|
+
get canInlineProvide() {
|
|
1131
|
+
return this._inlinedValue;
|
|
1132
|
+
}
|
|
1133
|
+
|
|
1134
|
+
set canInlineProvide(value) {
|
|
1135
|
+
this._inlinedValue = value;
|
|
1136
|
+
}
|
|
1137
|
+
|
|
1138
|
+
/**
|
|
1139
|
+
* true: at least one consumer accepts inlining, none rejected
|
|
1140
|
+
* false: at least one consumer rejected inlining
|
|
1141
|
+
* undefined: collecting; no consumer has decided yet
|
|
1142
|
+
* @returns {boolean | undefined} can inline use
|
|
1143
|
+
*/
|
|
1144
|
+
get canInlineUse() {
|
|
1145
|
+
switch (this._inlineFlags & INLINE_USE_MASK) {
|
|
1146
|
+
case INLINE_USE_TRUE:
|
|
1147
|
+
return true;
|
|
1148
|
+
case INLINE_USE_FALSE:
|
|
1149
|
+
return false;
|
|
1150
|
+
default:
|
|
1151
|
+
return undefined;
|
|
1152
|
+
}
|
|
1153
|
+
}
|
|
1154
|
+
|
|
1155
|
+
set canInlineUse(value) {
|
|
1156
|
+
this._inlineFlags =
|
|
1157
|
+
(this._inlineFlags & ~INLINE_USE_MASK) |
|
|
1158
|
+
(value === undefined ? 0 : value ? INLINE_USE_TRUE : INLINE_USE_FALSE);
|
|
1159
|
+
}
|
|
1160
|
+
|
|
1161
|
+
/**
|
|
1162
|
+
* Only specific export info can be pure, so other_export_info.pure is always undefined.
|
|
1163
|
+
* true: calling the export has no observable side effects
|
|
1164
|
+
* undefined: it was not determined whether the export is pure
|
|
1165
|
+
* @returns {boolean | undefined} pure provide
|
|
1166
|
+
*/
|
|
1167
|
+
get pureProvide() {
|
|
1168
|
+
return (this._inlineFlags & PURE_PROVIDE_FLAG) !== 0 ? true : undefined;
|
|
1169
|
+
}
|
|
1170
|
+
|
|
1171
|
+
set pureProvide(value) {
|
|
1172
|
+
if (value) this._inlineFlags |= PURE_PROVIDE_FLAG;
|
|
1173
|
+
else this._inlineFlags &= ~PURE_PROVIDE_FLAG;
|
|
1174
|
+
}
|
|
1175
|
+
|
|
959
1176
|
get canMangle() {
|
|
960
1177
|
switch (this.canMangleProvide) {
|
|
961
1178
|
case undefined:
|
|
@@ -977,6 +1194,15 @@ class ExportInfo {
|
|
|
977
1194
|
);
|
|
978
1195
|
}
|
|
979
1196
|
|
|
1197
|
+
/**
|
|
1198
|
+
* @returns {InlinedValue | undefined} the inlined value when both provide and use sides agree, otherwise undefined
|
|
1199
|
+
*/
|
|
1200
|
+
canInline() {
|
|
1201
|
+
return this.canInlineProvide !== undefined && this.canInlineUse === true
|
|
1202
|
+
? this.canInlineProvide
|
|
1203
|
+
: undefined;
|
|
1204
|
+
}
|
|
1205
|
+
|
|
980
1206
|
/**
|
|
981
1207
|
* Sets used in unknown way.
|
|
982
1208
|
* @param {RuntimeSpec} runtime only apply to this runtime
|
|
@@ -997,6 +1223,10 @@ class ExportInfo {
|
|
|
997
1223
|
this.canMangleUse = false;
|
|
998
1224
|
changed = true;
|
|
999
1225
|
}
|
|
1226
|
+
if (this.canInlineUse !== false) {
|
|
1227
|
+
this.canInlineUse = false;
|
|
1228
|
+
changed = true;
|
|
1229
|
+
}
|
|
1000
1230
|
return changed;
|
|
1001
1231
|
}
|
|
1002
1232
|
|
|
@@ -1014,6 +1244,10 @@ class ExportInfo {
|
|
|
1014
1244
|
this.canMangleUse = false;
|
|
1015
1245
|
changed = true;
|
|
1016
1246
|
}
|
|
1247
|
+
if (this.canInlineUse !== false) {
|
|
1248
|
+
this.canInlineUse = false;
|
|
1249
|
+
changed = true;
|
|
1250
|
+
}
|
|
1017
1251
|
return changed;
|
|
1018
1252
|
}
|
|
1019
1253
|
|
|
@@ -1242,10 +1476,10 @@ class ExportInfo {
|
|
|
1242
1476
|
}
|
|
1243
1477
|
|
|
1244
1478
|
/**
|
|
1245
|
-
* Returns used name.
|
|
1479
|
+
* Returns used name. May return InlinedUsedName when the export is inlined to a primitive.
|
|
1246
1480
|
* @param {string | undefined} fallbackName fallback name for used exports with no name
|
|
1247
1481
|
* @param {RuntimeSpec} runtime check usage for this runtime only
|
|
1248
|
-
* @returns {string | false} used name
|
|
1482
|
+
* @returns {string | InlinedUsedName | false} used name
|
|
1249
1483
|
*/
|
|
1250
1484
|
getUsedName(fallbackName, runtime) {
|
|
1251
1485
|
if (this._hasUseInRuntimeInfo) {
|
|
@@ -1257,14 +1491,17 @@ class ExportInfo {
|
|
|
1257
1491
|
if (!this._usedInRuntime.has(runtime)) {
|
|
1258
1492
|
return false;
|
|
1259
1493
|
}
|
|
1260
|
-
} else if (
|
|
1261
|
-
runtime
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
|
|
1266
|
-
|
|
1267
|
-
|
|
1494
|
+
} else if (runtime !== undefined) {
|
|
1495
|
+
// Unused unless at least one runtime in the set is used; loop avoids
|
|
1496
|
+
// allocating an array from the runtime set on this hot path.
|
|
1497
|
+
let anyUsed = false;
|
|
1498
|
+
for (const r of runtime) {
|
|
1499
|
+
if (this._usedInRuntime.has(r)) {
|
|
1500
|
+
anyUsed = true;
|
|
1501
|
+
break;
|
|
1502
|
+
}
|
|
1503
|
+
}
|
|
1504
|
+
if (!anyUsed) return false;
|
|
1268
1505
|
}
|
|
1269
1506
|
}
|
|
1270
1507
|
}
|
|
@@ -1282,7 +1519,7 @@ class ExportInfo {
|
|
|
1282
1519
|
|
|
1283
1520
|
/**
|
|
1284
1521
|
* Updates used name using the provided name.
|
|
1285
|
-
* @param {string} name the new name
|
|
1522
|
+
* @param {string | InlinedUsedName} name the new name
|
|
1286
1523
|
* @returns {void}
|
|
1287
1524
|
*/
|
|
1288
1525
|
setUsedName(name) {
|
|
@@ -1512,7 +1749,7 @@ class ExportInfo {
|
|
|
1512
1749
|
* Move the target forward as long resolveTargetFilter is fulfilled
|
|
1513
1750
|
* @param {ModuleGraph} moduleGraph the module graph
|
|
1514
1751
|
* @param {ResolveTargetFilter} resolveTargetFilter filter function to further resolve target
|
|
1515
|
-
* @param {(target: TargetItemWithConnection) => ModuleGraphConnection=} updateOriginalConnection updates the original connection instead of using the target connection
|
|
1752
|
+
* @param {((target: TargetItemWithConnection) => ModuleGraphConnection | undefined)=} updateOriginalConnection updates the original connection instead of using the target connection
|
|
1516
1753
|
* @returns {TargetItemWithConnection | undefined} the resolved target when moved
|
|
1517
1754
|
*/
|
|
1518
1755
|
moveTarget(moduleGraph, resolveTargetFilter, updateOriginalConnection) {
|
|
@@ -1536,7 +1773,7 @@ class ExportInfo {
|
|
|
1536
1773
|
/** @type {Target} */
|
|
1537
1774
|
(this._target).set(undefined, {
|
|
1538
1775
|
connection: updateOriginalConnection
|
|
1539
|
-
? updateOriginalConnection(target)
|
|
1776
|
+
? updateOriginalConnection(target) || target.connection
|
|
1540
1777
|
: target.connection,
|
|
1541
1778
|
export: /** @type {NonNullable<TargetItemWithConnection["export"]>} */ (
|
|
1542
1779
|
target.export
|
|
@@ -1600,10 +1837,14 @@ class ExportInfo {
|
|
|
1600
1837
|
* @param {Set<ExportsInfo>} alreadyVisitedExportsInfo for circular references
|
|
1601
1838
|
*/
|
|
1602
1839
|
_updateHash(hash, runtime, alreadyVisitedExportsInfo) {
|
|
1840
|
+
const usedNameHash =
|
|
1841
|
+
this._usedName instanceof InlinedUsedName
|
|
1842
|
+
? `inlined:${this._usedName.render("")}`
|
|
1843
|
+
: this._usedName || this.name;
|
|
1603
1844
|
hash.update(
|
|
1604
|
-
`${
|
|
1845
|
+
`${usedNameHash}${this.getUsed(runtime)}${this.provided}${
|
|
1605
1846
|
this.terminalBinding
|
|
1606
|
-
}`
|
|
1847
|
+
}${this.pureProvide ? "P" : ""}`
|
|
1607
1848
|
);
|
|
1608
1849
|
if (this.exportsInfo && !alreadyVisitedExportsInfo.has(this.exportsInfo)) {
|
|
1609
1850
|
this.exportsInfo._updateHash(hash, runtime, alreadyVisitedExportsInfo);
|