@depup/webpack 5.110.3-depup.0 → 5.111.1-depup.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -8
- package/changes.json +7 -11
- package/lib/APIPlugin.js +26 -11
- package/lib/AutomaticPrefetchPlugin.js +1 -1
- package/lib/Cache.js +8 -3
- package/lib/CacheFacade.js +1 -1
- package/lib/CircularModulesPlugin.js +157 -55
- package/lib/CleanPlugin.js +2 -2
- package/lib/CompatibilityPlugin.js +3 -4
- package/lib/Compilation.js +336 -337
- package/lib/Compiler.js +213 -51
- package/lib/ConstPlugin.js +16 -132
- package/lib/CopyPlugin.js +1054 -0
- package/lib/DefinePlugin.js +24 -8
- package/lib/DependencyTemplate.js +2 -1
- package/lib/DotenvPlugin.js +24 -28
- package/lib/ErrorHelpers.js +113 -0
- package/lib/ExportsInfo.js +20 -16
- package/lib/ExternalModule.js +47 -22
- package/lib/FileSystemInfo.js +17 -14
- package/lib/FlagDependencyExportsPlugin.js +53 -34
- package/lib/FlagDependencyUsagePlugin.js +9 -13
- package/lib/Generator.js +24 -2
- package/lib/HotModuleReplacementPlugin.js +55 -7
- package/lib/IgnorePlugin.js +1 -1
- package/lib/JavascriptMetaInfoPlugin.js +5 -3
- package/lib/LoaderOptionsPlugin.js +1 -1
- package/lib/MainTemplate.js +5 -1
- package/lib/Module.js +19 -10
- package/lib/ModuleGraph.js +6 -9
- package/lib/MultiCompiler.js +7 -17
- package/lib/MultiWatching.js +1 -1
- package/lib/NormalModule.js +135 -50
- package/lib/NormalModuleFactory.js +1 -1
- package/lib/RuntimeGlobals.js +21 -7
- package/lib/RuntimeModule.js +28 -12
- package/lib/RuntimePlugin.js +30 -3
- package/lib/RuntimeTemplate.js +813 -518
- package/lib/SourceMapDevToolPlugin.js +54 -104
- package/lib/TemplatedPathPlugin.js +16 -59
- package/lib/Watching.js +9 -0
- package/lib/WebpackOptionsApply.js +84 -91
- package/lib/asset/AssetBytesGenerator.js +7 -1
- package/lib/asset/AssetGenerator.js +50 -24
- package/lib/asset/AssetModule.js +3 -0
- package/lib/asset/AssetSourceGenerator.js +7 -1
- package/lib/asset/WebManifestParser.js +7 -5
- package/lib/buildChunkGraph.js +11 -15
- package/lib/cache/AddBuildDependenciesPlugin.js +33 -4
- package/lib/cache/IdleFileCachePlugin.js +2 -2
- package/lib/cache/MemoryCachePlugin.js +4 -4
- package/lib/cache/MemoryWithGcCachePlugin.js +7 -8
- package/lib/cache/PackFileCacheStrategy.js +17 -19
- package/lib/cache/getLazyHashedEtag.js +3 -5
- package/lib/config/browserslistTargetHandler.js +17 -4
- package/lib/config/defaults.js +138 -128
- package/lib/config/getClaimedAssetTypes.js +10 -11
- package/lib/config/normalization.js +82 -12
- package/lib/config/target.js +13 -4
- package/lib/container/ContainerReferencePlugin.js +6 -0
- package/lib/container/RemoteRuntimeModule.js +9 -0
- package/lib/container/declaredRemotes.js +39 -0
- package/lib/{ContextExclusionPlugin.js → context/ContextExclusionPlugin.js} +1 -1
- package/lib/{ContextModule.js → context/ContextModule.js} +54 -115
- package/lib/{ContextModuleFactory.js → context/ContextModuleFactory.js} +19 -21
- package/lib/{ContextReplacementPlugin.js → context/ContextReplacementPlugin.js} +4 -4
- package/lib/css/CssGenerator.js +27 -11
- package/lib/css/CssInjectStyleRuntimeModule.js +9 -0
- package/lib/css/CssLoadingRuntimeModule.js +94 -36
- package/lib/css/CssModule.js +1 -1
- package/lib/css/CssModulesPlugin.js +7 -6
- package/lib/css/CssParser.js +162 -31
- package/lib/css/CssServerStylesRuntimeModule.js +9 -0
- package/lib/css/cssMinify.js +43 -32
- package/lib/css/data.js +3514 -869
- package/lib/css/syntax.js +6370 -1220
- package/lib/debug/ProfilingPlugin.js +7 -4
- package/lib/dependencies/AMDDefineDependencyParserPlugin.js +6 -3
- package/lib/dependencies/AMDRuntimeModules.js +18 -0
- package/lib/dependencies/CommonJsExportRequireDependency.js +13 -12
- package/lib/dependencies/CommonJsExportsParserPlugin.js +12 -13
- package/lib/dependencies/CommonJsImportsParserPlugin.js +5 -5
- package/lib/dependencies/CommonJsPlugin.js +19 -3
- package/lib/dependencies/CommonJsRequireDependency.js +14 -5
- package/lib/dependencies/CommonJsSelfReferenceDependency.js +2 -4
- package/lib/dependencies/ContextDependency.js +1 -1
- package/lib/dependencies/ContextDependencyHelpers.js +3 -9
- package/lib/dependencies/ContextElementDependency.js +1 -1
- package/lib/dependencies/CssIcssExportDependency.js +13 -9
- package/lib/dependencies/CssIcssImportDependency.js +3 -6
- package/lib/dependencies/CssUrlDependency.js +3 -5
- package/lib/dependencies/HarmonyCompatibilityDependency.js +67 -22
- package/lib/dependencies/HarmonyDetectionParserPlugin.js +3 -4
- package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +10 -7
- package/lib/dependencies/HarmonyExportExpressionDependency.js +47 -33
- package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +74 -17
- package/lib/dependencies/HarmonyExportInitFragment.js +110 -23
- package/lib/dependencies/HarmonyExportSpecifierDependency.js +25 -58
- package/lib/dependencies/HarmonyImportBareSideEffectDependency.js +59 -0
- package/lib/dependencies/HarmonyImportDependency.js +6 -1
- package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +111 -17
- package/lib/dependencies/HarmonyImportSideEffectDependency.js +3 -4
- package/lib/dependencies/HarmonyImportSpecifierDependency.js +40 -3
- package/lib/dependencies/HarmonyModulesPlugin.js +20 -0
- package/lib/dependencies/HtmlEntryDependency.js +124 -102
- package/lib/dependencies/HtmlInlineScriptDependency.js +3 -4
- package/lib/dependencies/HtmlInlineStyleDependency.js +3 -4
- package/lib/dependencies/ImportMetaContextDependencyParserPlugin.js +1 -1
- package/lib/dependencies/ImportMetaGlobHelpers.js +1 -1
- package/lib/dependencies/ImportMetaMainDependency.js +104 -0
- package/lib/dependencies/ImportMetaPlugin.js +67 -25
- package/lib/dependencies/ImportParserPlugin.js +1 -1
- package/lib/dependencies/LoaderPlugin.js +26 -1
- package/lib/dependencies/RequireContextDependencyParserPlugin.js +1 -1
- package/lib/dependencies/SystemRuntimeModule.js +9 -0
- package/lib/dependencies/URLContextDependency.js +1 -1
- package/lib/dependencies/URLDependency.js +6 -5
- package/lib/dependencies/WorkerAndWorkletPlugin.js +15 -21
- package/lib/dependencies/WorkerDependency.js +7 -7
- package/lib/dependencies/WorkletDependency.js +7 -11
- package/lib/dll/DelegatedModule.js +18 -1
- package/lib/dll/DllReferencePlugin.js +11 -8
- package/lib/dll/LibManifestPlugin.js +1 -1
- package/lib/errors/AnalyzableBailoutsWarning.js +41 -0
- package/lib/errors/DuplicateModulesWarning.js +12 -7
- package/lib/errors/EmptyCopyPatternWarning.js +26 -0
- package/lib/errors/ExternalStarReexportError.js +44 -0
- package/lib/errors/HookWebpackError.js +3 -2
- package/lib/errors/MissingSourceMapsWarning.js +36 -0
- package/lib/errors/ModuleParseError.js +2 -1
- package/lib/errors/UnusedAssetsWarning.js +36 -0
- package/lib/errors/UnusedFederationWarning.js +35 -0
- package/lib/errors/UnusedModulesWarning.js +38 -0
- package/lib/esm/ExportWebpackRequireRuntimeModule.js +9 -0
- package/lib/esm/ModuleChunkFormatPlugin.js +28 -3
- package/lib/esm/ModuleChunkLoadingPlugin.js +30 -11
- package/lib/esm/ModuleChunkLoadingRuntimeModule.js +92 -60
- package/lib/hmr/HotModuleReplacement.runtime.js +8 -2
- package/lib/hmr/HotModuleReplacementRuntimeModule.js +9 -0
- package/lib/hmr/LazyCompilationPlugin.js +3 -5
- package/lib/html/HtmlGenerator.js +72 -87
- package/lib/html/HtmlModulesPlugin.js +418 -200
- package/lib/html/HtmlParser.js +110 -147
- package/lib/html/builtinEmbeddedRenderer.js +107 -0
- package/lib/html/data.js +142 -7
- package/lib/html/htmlMinify.js +92 -122
- package/lib/html/syntax.js +1618 -1391
- package/lib/ids/HashedModuleIdsPlugin.js +2 -1
- package/lib/index.js +49 -3
- package/lib/javascript/ChunkFormatHelpers.js +4 -3
- package/lib/javascript/JavascriptGenerator.js +8 -1
- package/lib/javascript/JavascriptModule.js +1 -0
- package/lib/javascript/JavascriptModulesPlugin.js +73 -72
- package/lib/javascript/JavascriptParser.js +1970 -900
- package/lib/javascript/StartupHelpers.js +27 -3
- package/lib/javascript/data.js +172 -0
- package/lib/javascript/grammar.js +5546 -0
- package/lib/javascript/parser.js +1500 -0
- package/lib/javascript/regexp.js +1762 -0
- package/lib/javascript/regexpData.js +51 -0
- package/lib/javascript/syntax.js +9061 -5262
- package/lib/json/JsonGenerator.js +7 -1
- package/lib/library/ModuleLibraryPlugin.js +171 -132
- package/lib/loaders/LoaderRunner.js +137 -9
- package/lib/node/NodeWatchFileSystem.js +3 -9
- package/lib/node/ReadFileChunkLoadingRuntimeModule.js +22 -0
- package/lib/node/RequireChunkLoadingRuntimeModule.js +22 -0
- package/lib/optimize/AggressiveMergingPlugin.js +3 -5
- package/lib/optimize/ConcatenatedModule.js +178 -120
- package/lib/optimize/ConstExportsPlugin.js +50 -39
- package/lib/optimize/FlagIncludedChunksPlugin.js +3 -11
- package/lib/optimize/InlineExports.js +20 -123
- package/lib/optimize/InnerGraphPlugin.js +7 -13
- package/lib/optimize/LimitChunkCountPlugin.js +5 -8
- package/lib/optimize/MangleExportsPlugin.js +13 -4
- package/lib/optimize/ModuleConcatenationPlugin.js +27 -5
- package/lib/optimize/RealContentHashPlugin.js +68 -9
- package/lib/optimize/SideEffectsFlagPlugin.js +24 -28
- package/lib/optimize/SplitChunksPlugin.js +2 -4
- package/lib/performance/AnalyzableBailoutsPlugin.js +115 -0
- package/lib/performance/BroadContextsPlugin.js +1 -1
- package/lib/performance/CacheEffectivenessPlugin.js +7 -7
- package/lib/performance/DuplicateModulesPlugin.js +57 -13
- package/lib/performance/EvalUsagePlugin.js +5 -2
- package/lib/performance/MissingSourceMapsPlugin.js +115 -0
- package/lib/performance/PureAnnotationsPlugin.js +6 -3
- package/lib/performance/SizeLimitsPlugin.js +2 -4
- package/lib/performance/TopLevelThisPlugin.js +5 -4
- package/lib/performance/UnusedAssetsPlugin.js +109 -0
- package/lib/performance/UnusedFederationPlugin.js +147 -0
- package/lib/performance/UnusedModulesPlugin.js +141 -0
- package/lib/performance/UnusedReexportsPlugin.js +1 -55
- package/lib/performance/isOnlyReexported.js +65 -0
- package/lib/prefetch/ChunkPrefetchFunctionRuntimeModule.js +25 -5
- package/lib/prefetch/ChunkPrefetchPreloadPlugin.js +8 -8
- package/lib/prefetch/ChunkPrefetchStartupRuntimeModule.js +9 -0
- package/lib/prefetch/ChunkPrefetchTriggerRuntimeModule.js +9 -0
- package/lib/prefetch/ChunkPreloadTriggerRuntimeModule.js +9 -0
- package/lib/prefetch/ResourceHintPlugin.js +18 -23
- package/lib/prefetch/ResourceHintRuntimeModule.js +9 -0
- package/lib/prefetch/StartupAssetHintRuntimeModule.js +16 -10
- package/lib/rules/RuleSetCompiler.js +211 -4
- package/lib/runtime/AsyncModuleRuntimeModule.js +98 -66
- package/lib/runtime/AutoPublicPathRuntimeModule.js +9 -0
- package/lib/runtime/BaseUriRuntimeModule.js +9 -0
- package/lib/runtime/ChunkNameRuntimeModule.js +9 -0
- package/lib/runtime/EnsureChunkRuntimeModule.js +35 -16
- package/lib/runtime/GetChunkFilenameRuntimeModule.js +12 -4
- package/lib/runtime/GetFullHashRuntimeModule.js +9 -0
- package/lib/runtime/GetMainFilenameRuntimeModule.js +9 -0
- package/lib/runtime/GetWorkletBootstrapRuntimeModule.js +9 -0
- package/lib/runtime/GlobalRuntimeModule.js +11 -4
- package/lib/runtime/HasOwnPropertyRuntimeModule.js +9 -0
- package/lib/runtime/HelperRuntimeModule.js +10 -0
- package/lib/runtime/MakeDeferredNamespaceObjectRuntime.js +305 -224
- package/lib/runtime/NonceRuntimeModule.js +9 -0
- package/lib/runtime/OnChunksLoadedRuntimeModule.js +67 -20
- package/lib/runtime/PublicPathRuntimeModule.js +9 -0
- package/lib/runtime/RuntimeIdRuntimeModule.js +9 -0
- package/lib/runtime/SpecNamespaceObjectRuntimeModule.js +90 -0
- package/lib/runtime/StartupChunkDependenciesRuntimeModule.js +9 -0
- package/lib/runtime/StartupEntrypointRuntimeModule.js +9 -0
- package/lib/runtime/SystemContextRuntimeModule.js +9 -0
- package/lib/runtime/ToBinaryRuntimeModule.js +9 -0
- package/lib/schemes/DataUriPlugin.js +3 -6
- package/lib/schemes/VirtualUrlPlugin.js +1 -1
- package/lib/serialization/BinaryMiddleware.js +9 -9
- package/lib/serialization/FileMiddleware.js +16 -16
- package/lib/serialization/ObjectMiddleware.js +168 -139
- package/lib/sharing/ConsumeSharedPlugin.js +12 -0
- package/lib/sharing/ConsumeSharedRuntimeModule.js +11 -0
- package/lib/sharing/ShareRuntimeModule.js +9 -0
- package/lib/sharing/declaredShared.js +47 -0
- package/lib/stats/DefaultStatsFactoryPlugin.js +6 -5
- package/lib/stats/DefaultStatsPrinterPlugin.js +3 -0
- package/lib/typescript/TypeScriptPlugin.js +2 -3
- package/lib/url/URLParserPlugin.js +6 -8
- package/lib/util/LocConverter.js +4 -7
- package/lib/util/SourceProcessor.js +91 -91
- package/lib/util/async.js +292 -0
- package/lib/util/buildDiagnostics.js +69 -0
- package/lib/util/chainedImports.js +3 -4
- package/lib/util/concatenate.js +4 -4
- package/lib/util/createHooksRegistry.js +1 -2
- package/lib/util/dataURL.js +2 -3
- package/lib/util/deterministicGrouping.js +8 -13
- package/lib/util/findGraphRoots.js +6 -13
- package/lib/util/fs.js +27 -1
- package/lib/util/globUtils.js +1 -1
- package/lib/util/handlerKeys.js +40 -0
- package/lib/util/hash/wasm-hash.js +3 -4
- package/lib/util/identifier.js +20 -0
- package/lib/util/internalSerializables.js +5 -1
- package/lib/util/registerExternalSerializer.js +6 -45
- package/lib/util/semver.js +5 -3
- package/lib/wasm-async/AsyncWasmCompileRuntimeModule.js +9 -0
- package/lib/wasm-async/AsyncWasmLoadingRuntimeModule.js +9 -0
- package/lib/wasm-async/AsyncWebAssemblyGenerator.js +6 -1
- package/lib/wasm-async/AsyncWebAssemblyJavascriptGenerator.js +5 -1
- package/lib/wasm-sync/WasmChunkLoadingRuntimeModule.js +12 -4
- package/lib/wasm-sync/WebAssemblyGenerator.js +6 -1
- package/lib/wasm-sync/WebAssemblyJavascriptGenerator.js +5 -1
- package/lib/wasm-sync/WebAssemblyUtils.js +2 -4
- package/lib/web/JsonpChunkLoadingRuntimeModule.js +36 -0
- package/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js +19 -0
- package/package.json +55 -46
- package/schemas/WebpackOptions.check.js +1 -1
- package/schemas/WebpackOptions.json +379 -66
- package/schemas/plugins/LoaderOptionsPlugin.check.js +1 -1
- package/schemas/plugins/ManifestPlugin.check.js +1 -1
- package/schemas/plugins/SourceMapDevToolPlugin.check.js +1 -1
- package/schemas/plugins/asset/AssetGeneratorOptions.check.js +1 -1
- package/schemas/plugins/asset/AssetResourceGeneratorOptions.check.js +1 -1
- package/schemas/plugins/container/ContainerPlugin.check.js +1 -1
- package/schemas/plugins/container/ModuleFederationPlugin.check.js +1 -1
- package/schemas/plugins/debug/ProfilingPlugin.check.js +1 -1
- package/schemas/plugins/dll/DllReferencePlugin.check.js +1 -1
- package/schemas/plugins/ids/HashedModuleIdsPlugin.check.js +1 -1
- package/schemas/plugins/schemes/HttpUriPlugin.check.js +1 -1
- package/types.d.ts +1723 -604
- package/lib/dependencies/ExportBindingInitFragment.js +0 -191
- package/lib/errors/EntrypointOverlapWarning.js +0 -45
- package/lib/performance/EntrypointOverlapPlugin.js +0 -122
|
@@ -5,13 +5,13 @@
|
|
|
5
5
|
|
|
6
6
|
"use strict";
|
|
7
7
|
|
|
8
|
-
const asyncLib = require("neo-async");
|
|
9
8
|
const { ConcatSource, RawSource } = require("webpack-sources");
|
|
10
9
|
const Compilation = require("./Compilation");
|
|
11
10
|
const ModuleFilenameHelpers = require("./ModuleFilenameHelpers");
|
|
12
11
|
const ProgressPlugin = require("./ProgressPlugin");
|
|
13
12
|
const SourceMapDevToolModuleOptionsPlugin = require("./SourceMapDevToolModuleOptionsPlugin");
|
|
14
13
|
const { getPresentKinds } = require("./TemplatedPathPlugin");
|
|
14
|
+
const asyncLib = require("./util/async");
|
|
15
15
|
const createHash = require("./util/createHash");
|
|
16
16
|
const { dirname, relative } = require("./util/fs");
|
|
17
17
|
const generateDebugId = require("./util/generateDebugId");
|
|
@@ -152,11 +152,9 @@ const extractSourceAndMap = (file, asset, options, registry) => {
|
|
|
152
152
|
if (!registry.has(file)) registry.set(file, asset);
|
|
153
153
|
return { source, sourceMap, mapSource: asset };
|
|
154
154
|
}
|
|
155
|
-
// The current asset
|
|
156
|
-
//
|
|
157
|
-
//
|
|
158
|
-
// `source` from the current asset so that any prior wrappers (e.g.
|
|
159
|
-
// appended sourceMappingURL comments) are preserved.
|
|
155
|
+
// The current asset, typically a `RawSource` an earlier instance left, has no
|
|
156
|
+
// internal map, so re-extract one from the pinned original. `source` still
|
|
157
|
+
// comes from the current asset, preserving any wrappers it gained.
|
|
160
158
|
const original = registry.get(file);
|
|
161
159
|
if (!original) return;
|
|
162
160
|
sourceMap = original.sourceAndMap
|
|
@@ -262,12 +260,9 @@ class SourceMapDevToolPlugin {
|
|
|
262
260
|
this.namespace = options.namespace || "";
|
|
263
261
|
/** @type {SourceMapDevToolPluginOptions} */
|
|
264
262
|
this.options = options;
|
|
265
|
-
//
|
|
266
|
-
//
|
|
267
|
-
//
|
|
268
|
-
// `JSON.stringify` rather than a homemade separator so that any
|
|
269
|
-
// special characters (e.g. `|` inside a publicPath or sourceRoot)
|
|
270
|
-
// can't accidentally make two different option sets collide.
|
|
263
|
+
// Salt from the output-affecting options, so two instances on the same asset
|
|
264
|
+
// never share a cache entry. Serialized with `JSON.stringify` rather than a
|
|
265
|
+
// separator, which a `|` in a publicPath could collide through.
|
|
271
266
|
/** @type {string} */
|
|
272
267
|
this._cacheSalt = JSON.stringify([
|
|
273
268
|
toCacheKeyValue(options.filename),
|
|
@@ -326,12 +321,9 @@ class SourceMapDevToolPlugin {
|
|
|
326
321
|
compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation) => {
|
|
327
322
|
new SourceMapDevToolModuleOptionsPlugin(options).apply(compilation);
|
|
328
323
|
|
|
329
|
-
//
|
|
330
|
-
//
|
|
331
|
-
//
|
|
332
|
-
// has replaced the asset with a `RawSource`. The registry lives on a
|
|
333
|
-
// module-scoped `WeakMap` keyed by compilation so it is released
|
|
334
|
-
// automatically and never pollutes the compilation object.
|
|
324
|
+
// Every instance on a compilation shares this registry of pristine
|
|
325
|
+
// sources, so a later one still recovers the original map after the first
|
|
326
|
+
// replaced the asset. Keyed by compilation, so it releases on its own.
|
|
335
327
|
const originalSources = getOriginalSourceRegistry(compilation);
|
|
336
328
|
|
|
337
329
|
compilation.hooks.processAssets.tapAsync(
|
|
@@ -372,23 +364,12 @@ class SourceMapDevToolPlugin {
|
|
|
372
364
|
const tasks = [];
|
|
373
365
|
let fileIndex = 0;
|
|
374
366
|
|
|
375
|
-
//
|
|
376
|
-
//
|
|
377
|
-
//
|
|
378
|
-
//
|
|
379
|
-
//
|
|
380
|
-
//
|
|
381
|
-
// caches, churning allocations (measured: +700 MB peak RSS,
|
|
382
|
-
// +6 s wall time on a 50×1000 synthetic build).
|
|
383
|
-
//
|
|
384
|
-
// Sharing one set lets each shared subtree be walked exactly
|
|
385
|
-
// once. The trade-off is that subsequent chunks' `sourceAndMap`
|
|
386
|
-
// calls can repopulate a shared module's `_cachedMaps` after
|
|
387
|
-
// its own clear was skipped (because the module is already in
|
|
388
|
-
// the visited set), leaving at most one populated cache entry
|
|
389
|
-
// per shared module at the end of the run — bounded to a few
|
|
390
|
-
// MB even at the scale of #20961. That's strictly preferable
|
|
391
|
-
// to the alternative's hundreds of MB of transient peak RSS.
|
|
367
|
+
// WHY: chunks share module-level `CachedSource` instances, so a
|
|
368
|
+
// per-call set re-walks each shared subtree once per chunk and every
|
|
369
|
+
// `sourceAndMap` then recomputes the cleared caches — measured at
|
|
370
|
+
// +700 MB peak RSS and +6 s on a 50×1000 build. One shared set walks
|
|
371
|
+
// each subtree once, at the cost of leaving at most one populated
|
|
372
|
+
// cache entry per shared module, a few MB even at #20961's scale.
|
|
392
373
|
const clearCacheVisited = new WeakSet();
|
|
393
374
|
|
|
394
375
|
asyncLib.each(
|
|
@@ -403,14 +384,12 @@ class SourceMapDevToolPlugin {
|
|
|
403
384
|
chunk
|
|
404
385
|
});
|
|
405
386
|
|
|
406
|
-
//
|
|
407
|
-
//
|
|
408
|
-
//
|
|
409
|
-
//
|
|
410
|
-
//
|
|
411
|
-
//
|
|
412
|
-
// in an asset filename can't be spoofed to collide with the
|
|
413
|
-
// salt portion of the identifier.
|
|
387
|
+
// WHY: the cache item identifier carries the per-instance salt, or
|
|
388
|
+
// two SourceMapDevToolPlugin instances targeting the same `file`
|
|
389
|
+
// would write different content to one key and invalidate every pack
|
|
390
|
+
// on each build. `JSON.stringify` encodes it, so a special character
|
|
391
|
+
// such as `|` in an asset filename cannot be spoofed to collide with
|
|
392
|
+
// the salt portion.
|
|
414
393
|
const cacheItem = cache.getItemCache(
|
|
415
394
|
JSON.stringify([file, this._cacheSalt]),
|
|
416
395
|
cache.mergeEtags(
|
|
@@ -427,12 +406,9 @@ class SourceMapDevToolPlugin {
|
|
|
427
406
|
* If presented in cache, reassigns assets. Cache assets already have source maps.
|
|
428
407
|
*/
|
|
429
408
|
if (cacheEntry) {
|
|
430
|
-
// Pin the still-unwrapped
|
|
431
|
-
//
|
|
432
|
-
//
|
|
433
|
-
// it lets a subsequent SourceMapDevToolPlugin instance
|
|
434
|
-
// extract the original map on demand even though the
|
|
435
|
-
// persistent cache hit lets us skip processing here.
|
|
409
|
+
// Pin the still-unwrapped source before `updateAsset` replaces
|
|
410
|
+
// it — a pointer assignment, no extraction — so a later
|
|
411
|
+
// instance can still reach the original map past this cache hit.
|
|
436
412
|
if (!originalSources.has(file)) {
|
|
437
413
|
originalSources.set(file, asset.source);
|
|
438
414
|
}
|
|
@@ -489,33 +465,21 @@ class SourceMapDevToolPlugin {
|
|
|
489
465
|
originalSources
|
|
490
466
|
);
|
|
491
467
|
|
|
492
|
-
//
|
|
493
|
-
//
|
|
494
|
-
//
|
|
495
|
-
// `
|
|
496
|
-
//
|
|
497
|
-
//
|
|
498
|
-
// spike on builds with thousands of chunks
|
|
499
|
-
// (webpack#20961). Keep `source` since downstream
|
|
500
|
-
// consumers reading the original asset still need it;
|
|
501
|
-
// `hash`/`size` default to retained because they're
|
|
502
|
-
// cheap to keep but expensive to rebuild.
|
|
503
|
-
// `clearCacheVisited` is shared across every call (see
|
|
504
|
-
// its declaration above for the rationale).
|
|
468
|
+
// WHY: the map `sourceAndMap` just composed otherwise sits on
|
|
469
|
+
// the CachedSource and every shared child until phase 2
|
|
470
|
+
// replaces the asset, which is the OOM spike of webpack#20961
|
|
471
|
+
// on builds with thousands of chunks. `source` is kept for
|
|
472
|
+
// downstream consumers, `hash` and `size` because they are
|
|
473
|
+
// cheap to hold and expensive to rebuild.
|
|
505
474
|
//
|
|
506
|
-
//
|
|
507
|
-
//
|
|
508
|
-
//
|
|
509
|
-
//
|
|
510
|
-
|
|
511
|
-
//
|
|
512
|
-
//
|
|
513
|
-
//
|
|
514
|
-
// `webpack-sources` 3.5, but `compilation.assets` may
|
|
515
|
-
// hold `Source`-like instances from a third-party
|
|
516
|
-
// plugin built against an older copy of
|
|
517
|
-
// `webpack-sources` (or a hand-rolled implementation).
|
|
518
|
-
// Calling it unconditionally would throw on those.
|
|
475
|
+
// `task.mapSource`, not `asset.source`: where the fallback to
|
|
476
|
+
// the pinned original ran — the current asset being a
|
|
477
|
+
// `RawSource` an earlier instance left — the original's caches
|
|
478
|
+
// are the ones `extractSourceAndMap` populated.
|
|
479
|
+
|
|
480
|
+
// Feature-detected, since `clearCache` landed in
|
|
481
|
+
// `webpack-sources` 3.5 and a third-party plugin may hand us a
|
|
482
|
+
// `Source` built against an older copy.
|
|
519
483
|
if (task && typeof task.mapSource.clearCache === "function") {
|
|
520
484
|
task.mapSource.clearCache(
|
|
521
485
|
{
|
|
@@ -660,14 +624,9 @@ class SourceMapDevToolPlugin {
|
|
|
660
624
|
const moduleFilenames =
|
|
661
625
|
/** @type {string[]} */
|
|
662
626
|
(modules.map((m) => moduleToSourceNameMapping.get(m)));
|
|
663
|
-
//
|
|
664
|
-
//
|
|
665
|
-
//
|
|
666
|
-
// object (webpack-sources keeps it cached). A second
|
|
667
|
-
// `SourceMapDevToolPlugin` instance that reads the original
|
|
668
|
-
// source through the registry would otherwise see our
|
|
669
|
-
// rewrites. Instead we build a fresh `outputSourceMap` for
|
|
670
|
-
// the .map file and leave the original alone.
|
|
627
|
+
// `sourceMap` is never mutated in place: the reference may be
|
|
628
|
+
// the same object a `SourceMapSource` has cached, so a second
|
|
629
|
+
// instance reading through the registry would see the rewrites.
|
|
671
630
|
/** @type {number[] | undefined} */
|
|
672
631
|
let ignoreList;
|
|
673
632
|
if (options.ignoreList) {
|
|
@@ -736,10 +695,9 @@ class SourceMapDevToolPlugin {
|
|
|
736
695
|
} else if (
|
|
737
696
|
typeof currentSourceMappingURLComment === "function"
|
|
738
697
|
) {
|
|
739
|
-
// Wrap the user's append function so the debug-id
|
|
740
|
-
//
|
|
741
|
-
//
|
|
742
|
-
// and lose its dynamic behavior.
|
|
698
|
+
// Wrap the user's append function so the debug-id comment is
|
|
699
|
+
// prepended at call time; concatenating would coerce the
|
|
700
|
+
// function to a string and lose its behavior.
|
|
743
701
|
const wrappedFn = currentSourceMappingURLComment;
|
|
744
702
|
currentSourceMappingURLComment = (pathData, assetInfo) =>
|
|
745
703
|
`${debugIdComment}${wrappedFn(pathData, assetInfo)}`;
|
|
@@ -766,14 +724,9 @@ class SourceMapDevToolPlugin {
|
|
|
766
724
|
}
|
|
767
725
|
|
|
768
726
|
if (sourceMapFilename) {
|
|
769
|
-
//
|
|
770
|
-
//
|
|
771
|
-
//
|
|
772
|
-
// `compilation.assets` until the build finishes — so
|
|
773
|
-
// storing the bytes off the V8 heap (where Buffers
|
|
774
|
-
// live, accounted as `external` memory) avoids keeping
|
|
775
|
-
// a large V8 string alive for the rest of the build
|
|
776
|
-
// and reduces heap pressure on `--max-old-space-size`.
|
|
727
|
+
// Hold the serialized map as a `Buffer`, which `RawSource`
|
|
728
|
+
// takes directly: the asset lives in `compilation.assets`
|
|
729
|
+
// until the build ends, and these bytes stay off the V8 heap.
|
|
777
730
|
const sourceMapBuffer = Buffer.from(
|
|
778
731
|
JSON.stringify(outputSourceMap),
|
|
779
732
|
"utf8"
|
|
@@ -820,10 +773,9 @@ class SourceMapDevToolPlugin {
|
|
|
820
773
|
})
|
|
821
774
|
);
|
|
822
775
|
}
|
|
823
|
-
// Preserve
|
|
824
|
-
//
|
|
825
|
-
//
|
|
826
|
-
// info (the schema allows string or string[]).
|
|
776
|
+
// Preserve the `related.sourceMap` entries earlier runs left on
|
|
777
|
+
// this asset, so every generated map stays discoverable; the
|
|
778
|
+
// schema allows a string or an array.
|
|
827
779
|
const existingSourceMap =
|
|
828
780
|
task.assetInfo.related &&
|
|
829
781
|
task.assetInfo.related.sourceMap;
|
|
@@ -879,11 +831,9 @@ class SourceMapDevToolPlugin {
|
|
|
879
831
|
`${PLUGIN_NAME}: append can't be a function when no filename is provided`
|
|
880
832
|
);
|
|
881
833
|
}
|
|
882
|
-
// Inline data-URL form: `[map]`
|
|
883
|
-
//
|
|
884
|
-
//
|
|
885
|
-
// than one `[url]` placeholder would otherwise re-encode
|
|
886
|
-
// the same JSON per match. Pre-compute both once.
|
|
834
|
+
// Inline data-URL form: `[map]` takes the raw JSON and `[url]`
|
|
835
|
+
// the same base64-encoded. Both are precomputed, or a template
|
|
836
|
+
// with two `[url]`s would re-encode per match.
|
|
887
837
|
const sourceMapString = JSON.stringify(outputSourceMap);
|
|
888
838
|
const sourceMapBase64 = Buffer.from(
|
|
889
839
|
sourceMapString,
|
|
@@ -77,10 +77,9 @@ const getPresentKinds = (path) => {
|
|
|
77
77
|
return kinds;
|
|
78
78
|
};
|
|
79
79
|
|
|
80
|
-
// `[fullhash:<
|
|
81
|
-
//
|
|
82
|
-
//
|
|
83
|
-
// to be inlined instead.
|
|
80
|
+
// In `[fullhash:<arg>]` a non-numeric argument names a digest, a numeric one just
|
|
81
|
+
// a length. A digest re-encodes the hash rather than reading it, so no stand-in
|
|
82
|
+
// can stand for it and the settled value must be inlined.
|
|
84
83
|
const FULL_HASH_DIGEST_REGEXP = /\[(?:fullhash|hash):(?!\d+\])\w/;
|
|
85
84
|
|
|
86
85
|
/**
|
|
@@ -408,11 +407,9 @@ const interpolate = (path, data, assetInfo) => {
|
|
|
408
407
|
return path;
|
|
409
408
|
}
|
|
410
409
|
|
|
411
|
-
//
|
|
412
|
-
//
|
|
413
|
-
//
|
|
414
|
-
// when a replacer is invoked, which happens for present kinds), so this is
|
|
415
|
-
// output-identical.
|
|
410
|
+
// Build replacers only for the placeholders a template uses, since most use a
|
|
411
|
+
// handful. Construction has no side effects — those fire on invocation — so
|
|
412
|
+
// the output is identical either way.
|
|
416
413
|
const presentKinds = getPresentKinds(path);
|
|
417
414
|
|
|
418
415
|
const chunkGraph = data.chunkGraph;
|
|
@@ -422,21 +419,9 @@ const interpolate = (path, data, assetInfo) => {
|
|
|
422
419
|
/** @type {Map<string, Replacer>} */
|
|
423
420
|
const replacements = new Map();
|
|
424
421
|
|
|
425
|
-
// Filename context
|
|
426
|
-
//
|
|
427
|
-
//
|
|
428
|
-
//
|
|
429
|
-
// for /some/path/file.js?query#fragment:
|
|
430
|
-
// [file] - /some/path/file.js
|
|
431
|
-
// [query] - ?query
|
|
432
|
-
// [fragment] - #fragment
|
|
433
|
-
// [base] - file.js
|
|
434
|
-
// [path] - /some/path/
|
|
435
|
-
// [name] - file
|
|
436
|
-
// [ext] - .js
|
|
437
|
-
//
|
|
438
|
-
// [containedfile] and [containedpath] are [file] and [path] kept inside
|
|
439
|
-
// `output.path`
|
|
422
|
+
// Filename context. Of `/some/path/file.js?query#fragment`, `[file]` is the
|
|
423
|
+
// path without query or fragment, `[base]` its basename, `[path]` its
|
|
424
|
+
// directory, `[name]`/`[ext]` its halves; `contained*` stay under `output.path`.
|
|
440
425
|
if (
|
|
441
426
|
typeof data.filename === "string" &&
|
|
442
427
|
(presentKinds.has("file") ||
|
|
@@ -534,15 +519,7 @@ const interpolate = (path, data, assetInfo) => {
|
|
|
534
519
|
}
|
|
535
520
|
}
|
|
536
521
|
|
|
537
|
-
// Compilation context
|
|
538
|
-
//
|
|
539
|
-
// Placeholders
|
|
540
|
-
//
|
|
541
|
-
// [fullhash] - data.hash (3a4b5c6e7f)
|
|
542
|
-
//
|
|
543
|
-
// Legacy Placeholders
|
|
544
|
-
//
|
|
545
|
-
// [hash] - data.hash (3a4b5c6e7f)
|
|
522
|
+
// Compilation context: `[fullhash]`, with `[hash]` as its legacy spelling.
|
|
546
523
|
if (data.hash && (presentKinds.has("fullhash") || presentKinds.has("hash"))) {
|
|
547
524
|
const hashReplacer = hashLength(
|
|
548
525
|
replacer(data.hash),
|
|
@@ -574,14 +551,8 @@ const interpolate = (path, data, assetInfo) => {
|
|
|
574
551
|
}
|
|
575
552
|
}
|
|
576
553
|
|
|
577
|
-
// Chunk
|
|
578
|
-
//
|
|
579
|
-
// Placeholders
|
|
580
|
-
//
|
|
581
|
-
// [id] - chunk.id (0.js)
|
|
582
|
-
// [name] - chunk.name (app.js)
|
|
583
|
-
// [chunkhash] - chunk.hash (7823t4t4.js)
|
|
584
|
-
// [contenthash] - chunk.contentHash[type] (3256u3zg.js)
|
|
554
|
+
// Chunk context: `[id]`, `[name]`, `[chunkhash]`, and `[contenthash]` for the
|
|
555
|
+
// chunk's content hash of the requested type.
|
|
585
556
|
if (data.chunk) {
|
|
586
557
|
const chunk = data.chunk;
|
|
587
558
|
|
|
@@ -638,17 +609,8 @@ const interpolate = (path, data, assetInfo) => {
|
|
|
638
609
|
}
|
|
639
610
|
}
|
|
640
611
|
|
|
641
|
-
// Module
|
|
642
|
-
//
|
|
643
|
-
// Placeholders
|
|
644
|
-
//
|
|
645
|
-
// [id] - module.id (2.png)
|
|
646
|
-
// [hash] - module.hash (6237543873.png)
|
|
647
|
-
//
|
|
648
|
-
// Legacy Placeholders
|
|
649
|
-
//
|
|
650
|
-
// [moduleid] - module.id (2.png)
|
|
651
|
-
// [modulehash] - module.hash (6237543873.png)
|
|
612
|
+
// Module context: `[id]` and `[hash]`, with `[moduleid]` and `[modulehash]` as
|
|
613
|
+
// their legacy spellings.
|
|
652
614
|
if (data.module) {
|
|
653
615
|
const module = data.module;
|
|
654
616
|
const needId = presentKinds.has("id");
|
|
@@ -739,13 +701,8 @@ const interpolate = (path, data, assetInfo) => {
|
|
|
739
701
|
}
|
|
740
702
|
}
|
|
741
703
|
|
|
742
|
-
//
|
|
743
|
-
//
|
|
744
|
-
// Placeholders
|
|
745
|
-
//
|
|
746
|
-
// [url] - data.url
|
|
747
|
-
// [uniqueName] - data.uniqueName (output.uniqueName)
|
|
748
|
-
// [uniquename] - alias of [uniqueName]
|
|
704
|
+
// Everything else: `[url]`, and `[uniqueName]` from `output.uniqueName`, which
|
|
705
|
+
// `[uniquename]` aliases.
|
|
749
706
|
if (data.url && presentKinds.has("url")) {
|
|
750
707
|
replacements.set("url", replacer(data.url));
|
|
751
708
|
}
|
package/lib/Watching.js
CHANGED
|
@@ -307,6 +307,7 @@ class Watching {
|
|
|
307
307
|
logger.time("storeBuildDependencies");
|
|
308
308
|
this.compiler.cache.storeBuildDependencies(
|
|
309
309
|
compilation.buildDependencies,
|
|
310
|
+
compilation.optionalBuildDependencies,
|
|
310
311
|
(err) => {
|
|
311
312
|
logger.timeEnd("storeBuildDependencies");
|
|
312
313
|
if (err) return handleError(err);
|
|
@@ -338,6 +339,8 @@ class Watching {
|
|
|
338
339
|
this.compiler.cache.storeBuildDependencies(
|
|
339
340
|
/** @type {Compilation} */
|
|
340
341
|
(compilation).buildDependencies,
|
|
342
|
+
/** @type {Compilation} */
|
|
343
|
+
(compilation).optionalBuildDependencies,
|
|
341
344
|
(err) => {
|
|
342
345
|
logger.timeEnd("storeBuildDependencies");
|
|
343
346
|
if (err) return handleError(err, cbs);
|
|
@@ -359,6 +362,11 @@ class Watching {
|
|
|
359
362
|
});
|
|
360
363
|
for (const cb of cbs) cb(null);
|
|
361
364
|
this.compiler.hooks.afterDone.call(/** @type {Stats} */ (stats));
|
|
365
|
+
// A watch run goes idle here rather than closing, so seal-only
|
|
366
|
+
// data would be held until the next build starts.
|
|
367
|
+
this.compiler._releaseUnusedCompilationData(
|
|
368
|
+
/** @type {Compilation} */ (compilation)
|
|
369
|
+
);
|
|
362
370
|
}
|
|
363
371
|
);
|
|
364
372
|
});
|
|
@@ -518,6 +526,7 @@ class Watching {
|
|
|
518
526
|
logger.time("storeBuildDependencies");
|
|
519
527
|
this.compiler.cache.storeBuildDependencies(
|
|
520
528
|
compilation.buildDependencies,
|
|
529
|
+
compilation.optionalBuildDependencies,
|
|
521
530
|
(err2) => {
|
|
522
531
|
logger.timeEnd("storeBuildDependencies");
|
|
523
532
|
shutdown(err || err2);
|