webpack 5.108.3 → 5.109.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/lib/APIPlugin.js +48 -29
- package/lib/CacheFacade.js +8 -0
- package/lib/ChunkGroup.js +1 -0
- package/lib/CompatibilityPlugin.js +31 -29
- package/lib/Compilation.js +50 -8
- package/lib/ConstPlugin.js +11 -11
- package/lib/ContextModule.js +239 -6
- package/lib/ContextModuleFactory.js +139 -14
- package/lib/DefinePlugin.js +396 -101
- package/lib/Entrypoint.js +1 -1
- package/lib/ExportsInfoApiPlugin.js +2 -2
- package/lib/ExternalModule.js +107 -5
- package/lib/ExternalModuleFactoryPlugin.js +20 -1
- package/lib/FileSystemInfo.js +130 -74
- package/lib/FlagDependencyExportsPlugin.js +55 -8
- package/lib/HotModuleReplacementPlugin.js +18 -15
- package/lib/LazyBarrel.js +30 -3
- package/lib/Module.js +3 -0
- package/lib/ModuleFilenameHelpers.js +2 -2
- package/lib/ModuleTypeConstants.js +8 -1
- package/lib/MultiCompiler.js +13 -2
- package/lib/MultiWatching.js +1 -0
- package/lib/NodeStuffPlugin.js +51 -33
- package/lib/NormalModule.js +169 -405
- package/lib/NormalModuleFactory.js +76 -2
- package/lib/ProgressPlugin.js +211 -119
- package/lib/ProvidePlugin.js +2 -2
- package/lib/RuntimeGlobals.js +47 -0
- package/lib/RuntimePlugin.js +33 -0
- package/lib/RuntimeTemplate.js +304 -16
- package/lib/UseStrictPlugin.js +1 -1
- package/lib/WebpackIsIncludedPlugin.js +1 -1
- package/lib/WebpackOptionsApply.js +24 -19
- package/lib/asset/AssetGenerator.js +110 -28
- package/lib/asset/AssetModulesPlugin.js +92 -2
- package/lib/asset/WebManifestGenerator.js +164 -0
- package/lib/asset/WebManifestParser.js +130 -0
- package/lib/async-modules/AwaitDependenciesInitFragment.js +14 -4
- package/lib/async-modules/isGeneratorLowered.js +26 -0
- package/lib/cache/PackFileCacheStrategy.js +9 -3
- package/lib/config/browserslistTargetHandler.js +40 -0
- package/lib/config/defaults.js +222 -32
- package/lib/config/normalization.js +26 -0
- package/lib/config/target.js +9 -1
- package/lib/css/CssGenerator.js +73 -73
- package/lib/css/CssLoadingRuntimeModule.js +5 -1
- package/lib/css/CssModulesPlugin.js +92 -53
- package/lib/css/CssParser.js +843 -302
- package/lib/css/syntax.js +1219 -483
- package/lib/dependencies/AMDDefineDependencyParserPlugin.js +6 -6
- package/lib/dependencies/AMDPlugin.js +2 -2
- package/lib/dependencies/AMDRequireDependenciesBlockParserPlugin.js +13 -13
- package/lib/dependencies/CommonJsDependencyHelpers.js +39 -0
- package/lib/dependencies/CommonJsExportsDependency.js +47 -2
- package/lib/dependencies/CommonJsExportsParserPlugin.js +10 -10
- package/lib/dependencies/CommonJsImportsParserPlugin.js +18 -18
- package/lib/dependencies/CommonJsPlugin.js +2 -2
- package/lib/dependencies/CommonJsRequireDependency.js +26 -1
- package/lib/dependencies/CommonJsSelfReferenceDependency.js +32 -1
- package/lib/dependencies/ContextDependencyHelpers.js +3 -3
- package/lib/dependencies/CreateRequireParserPlugin.js +6 -6
- package/lib/dependencies/CssIcssExportDependency.js +190 -87
- package/lib/dependencies/CssUrlDependency.js +35 -4
- package/lib/dependencies/ExternalModuleInitFragmentDependency.js +2 -2
- package/lib/dependencies/HarmonyCompatibilityDependency.js +32 -14
- package/lib/dependencies/HarmonyDetectionParserPlugin.js +43 -13
- package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +7 -19
- package/lib/dependencies/HarmonyImportDependency.js +12 -1
- package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +34 -107
- package/lib/dependencies/HarmonyImportGuard.js +192 -20
- package/lib/dependencies/HarmonyModulesPlugin.js +6 -0
- package/lib/dependencies/HarmonyTopLevelThisParserPlugin.js +1 -1
- package/lib/dependencies/HtmlEntryDependency.js +797 -172
- package/lib/dependencies/HtmlSourceDependency.js +26 -0
- package/lib/dependencies/ImportDependency.js +43 -1
- package/lib/dependencies/ImportMetaContextDependencyParserPlugin.js +31 -18
- package/lib/dependencies/ImportMetaContextPlugin.js +38 -7
- package/lib/dependencies/ImportMetaGlobDependency.js +81 -0
- package/lib/dependencies/ImportMetaGlobDependencyParserPlugin.js +78 -0
- package/lib/dependencies/ImportMetaGlobHelpers.js +660 -0
- package/lib/dependencies/ImportMetaPlugin.js +532 -180
- package/lib/dependencies/ImportMetaResolveDependency.js +90 -0
- package/lib/dependencies/ImportParserPlugin.js +87 -26
- package/lib/dependencies/ImportPhase.js +10 -8
- package/lib/dependencies/LoaderPlugin.js +5 -1
- package/lib/dependencies/RequireContextDependencyParserPlugin.js +1 -1
- package/lib/dependencies/RequireEnsureDependenciesBlockParserPlugin.js +3 -6
- package/lib/dependencies/RequireIncludeDependencyParserPlugin.js +4 -11
- package/lib/dependencies/SystemPlugin.js +2 -4
- package/lib/dependencies/TopLevelAwaitDependency.js +93 -0
- package/lib/dependencies/URLDependency.js +141 -21
- package/lib/dependencies/{WorkerPlugin.js → WorkerAndWorkletPlugin.js} +324 -112
- package/lib/dependencies/WorkerDependency.js +86 -18
- package/lib/dependencies/WorkletDependency.js +278 -0
- package/lib/dll/DelegatedModuleFactoryPlugin.js +19 -0
- package/lib/errors/EnvironmentNotSupportAsyncWarning.js +1 -1
- package/lib/errors/LoaderLoadingError.js +20 -0
- package/lib/errors/ModuleParseError.js +39 -22
- package/lib/errors/NodeStuffInWebError.js +1 -1
- package/lib/esm/ModuleChunkFormatPlugin.js +47 -14
- package/lib/esm/ModuleChunkLoadingPlugin.js +8 -1
- package/lib/esm/ModuleChunkLoadingRuntimeModule.js +29 -1
- package/lib/hmr/lazyCompilationBackend.js +32 -8
- package/lib/html/HtmlGenerator.js +940 -91
- package/lib/html/HtmlModule.js +3 -2
- package/lib/html/HtmlModulesPlugin.js +625 -170
- package/lib/html/HtmlParser.js +812 -340
- package/lib/html/favicon.svg +1 -0
- package/lib/html/syntax.js +2116 -834
- package/lib/ids/IdHelpers.js +1 -1
- package/lib/index.js +6 -0
- package/lib/javascript/ArrayPushCallbackChunkFormatPlugin.js +4 -5
- package/lib/javascript/BasicEvaluatedExpression.js +366 -48
- package/lib/javascript/JavascriptGenerator.js +197 -49
- package/lib/javascript/JavascriptModulesPlugin.js +178 -24
- package/lib/javascript/JavascriptParser.js +711 -355
- package/lib/javascript/JavascriptParserHelpers.js +3 -6
- package/lib/javascript/syntax.js +4380 -0
- package/lib/library/ModuleLibraryPlugin.js +38 -1
- package/lib/loaders/LoaderRunner.js +714 -0
- package/lib/loaders/loadLoader.js +100 -0
- package/lib/node/ReadFileCompileAsyncWasmPlugin.js +19 -0
- package/lib/node/ReadFileCompileWasmPlugin.js +14 -0
- package/lib/optimize/ConcatenatedModule.js +120 -16
- package/lib/optimize/FlagIncludedChunksPlugin.js +13 -3
- package/lib/optimize/InnerGraphPlugin.js +50 -30
- package/lib/optimize/ModuleConcatenationPlugin.js +69 -3
- package/lib/optimize/SideEffectsFlagPlugin.js +86 -43
- package/lib/prefetch/ChunkPrefetchPreloadPlugin.js +15 -0
- package/lib/prefetch/ChunkPreloadTriggerRuntimeModule.js +24 -13
- package/lib/prefetch/ResourceHintPlugin.js +663 -0
- package/lib/prefetch/ResourceHintRuntimeModule.js +149 -0
- package/lib/prefetch/StartupAssetHintRuntimeModule.js +210 -0
- package/lib/prefetch/parseResourceHintOptions.js +103 -0
- package/lib/rules/RuleSetCompiler.js +114 -0
- package/lib/runtime/AsyncModuleGeneratorRuntimeModule.js +56 -0
- package/lib/runtime/AsyncModuleRuntimeModule.js +24 -8
- package/lib/runtime/AutoPublicPathRuntimeModule.js +7 -1
- package/lib/runtime/CommonJsWrapRuntimeModule.js +37 -0
- package/lib/runtime/GetWorkletBootstrapRuntimeModule.js +59 -0
- package/lib/runtime/MakeDeferredNamespaceObjectRuntime.js +204 -8
- package/lib/runtime/SetAnonymousDefaultNameRuntimeModule.js +4 -1
- package/lib/schemes/HttpUriPlugin.js +40 -1
- package/lib/schemes/VirtualUrlPlugin.js +1 -2
- package/lib/serialization/FileMiddleware.js +29 -3
- package/lib/stats/DefaultStatsFactoryPlugin.js +32 -3
- package/lib/stats/DefaultStatsPresetPlugin.js +2 -0
- package/lib/stats/DefaultStatsPrinterPlugin.js +12 -2
- package/lib/stats/StatsFactory.js +15 -8
- package/lib/url/URLParserPlugin.js +98 -19
- package/lib/util/AsyncQueue.js +122 -72
- package/lib/util/LocConverter.js +9 -8
- package/lib/util/SetHelpers.js +1 -1
- package/lib/util/SourceProcessor.js +41 -28
- package/lib/util/StackedMap.js +122 -48
- package/lib/util/binarySearchBounds.js +2 -2
- package/lib/util/concatenate.js +40 -14
- package/lib/util/createHooksRegistry.js +13 -5
- package/lib/util/dataURL.js +2 -2
- package/lib/util/deterministicGrouping.js +7 -5
- package/lib/util/formatSize.js +6 -2
- package/lib/util/globUtils.js +710 -0
- package/lib/util/identifier.js +23 -6
- package/lib/util/implicitTypeLoaderFallback.js +62 -0
- package/lib/util/internalSerializables.js +88 -71
- package/lib/util/magicComment.js +121 -25
- package/lib/util/numberHash.js +2 -2
- package/lib/wasm-async/AsyncWasmCompileRuntimeModule.js +24 -18
- package/lib/wasm-async/AsyncWasmLoadingRuntimeModule.js +33 -22
- package/lib/wasm-sync/WasmChunkLoadingRuntimeModule.js +79 -16
- package/lib/web/FetchCompileAsyncWasmPlugin.js +19 -0
- package/lib/web/FetchCompileWasmPlugin.js +14 -0
- package/lib/web/JsonpChunkLoadingRuntimeModule.js +2 -0
- package/lib/webpack.js +65 -0
- package/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js +3 -0
- package/module.d.ts +21 -0
- package/package.json +14 -13
- package/schemas/WebpackOptions.check.js +1 -1
- package/schemas/WebpackOptions.json +759 -36
- package/schemas/plugins/HtmlParserOptions.check.js +1 -1
- package/schemas/plugins/ProgressPlugin.check.js +1 -1
- package/schemas/plugins/ProgressPlugin.json +17 -1
- package/schemas/plugins/container/ContainerReferencePlugin.check.js +1 -1
- package/schemas/plugins/container/ContainerReferencePlugin.json +1 -0
- package/schemas/plugins/container/ExternalsType.check.js +1 -1
- package/schemas/plugins/container/ModuleFederationPlugin.check.js +1 -1
- package/schemas/plugins/container/ModuleFederationPlugin.json +1 -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 +1300 -325
|
@@ -10,10 +10,16 @@ const EnvironmentNotSupportAsyncWarning = require("../errors/EnvironmentNotSuppo
|
|
|
10
10
|
const DynamicExports = require("./DynamicExports");
|
|
11
11
|
const HarmonyCompatibilityDependency = require("./HarmonyCompatibilityDependency");
|
|
12
12
|
const HarmonyExports = require("./HarmonyExports");
|
|
13
|
-
const {
|
|
13
|
+
const {
|
|
14
|
+
IMPORT_META_NAMES,
|
|
15
|
+
IMPORT_META_STAGE_ESM_DETECTION
|
|
16
|
+
} = require("./ImportMetaPlugin");
|
|
17
|
+
const TopLevelAwaitDependency = require("./TopLevelAwaitDependency");
|
|
14
18
|
|
|
19
|
+
/** @typedef {import("../Module").BuildInfo} BuildInfo */
|
|
15
20
|
/** @typedef {import("../Module").BuildMeta} BuildMeta */
|
|
16
21
|
/** @typedef {import("../javascript/JavascriptParser")} JavascriptParser */
|
|
22
|
+
/** @typedef {import("../javascript/JavascriptParser").Range} Range */
|
|
17
23
|
|
|
18
24
|
const PLUGIN_NAME = "HarmonyDetectionParserPlugin";
|
|
19
25
|
|
|
@@ -68,34 +74,58 @@ module.exports = class HarmonyDetectionParserPlugin {
|
|
|
68
74
|
}
|
|
69
75
|
});
|
|
70
76
|
|
|
71
|
-
parser.hooks.topLevelAwait.tap(PLUGIN_NAME, () => {
|
|
77
|
+
parser.hooks.topLevelAwait.tap(PLUGIN_NAME, (node) => {
|
|
72
78
|
const module = parser.state.module;
|
|
73
79
|
enableHarmony(false);
|
|
74
80
|
/** @type {BuildMeta} */
|
|
75
81
|
(module.buildMeta).async = true;
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
82
|
+
const buildInfo = /** @type {BuildInfo} */ (module.buildInfo);
|
|
83
|
+
if (node.type === "AwaitExpression") {
|
|
84
|
+
// Record for a possible `await` -> `(yield …)` rewrite when the module
|
|
85
|
+
// is lowered to a generator (target without `async`/`await`).
|
|
86
|
+
module.addPresentationalDependency(
|
|
87
|
+
new TopLevelAwaitDependency(
|
|
88
|
+
/** @type {Range} */ (node.range),
|
|
89
|
+
/** @type {Range} */ (node.argument.range)
|
|
90
|
+
)
|
|
91
|
+
);
|
|
92
|
+
} else {
|
|
93
|
+
// `for await…of` can't be expressed as a generator; never lower it.
|
|
94
|
+
buildInfo.usesTopLevelAwaitForOf = true;
|
|
95
|
+
}
|
|
96
|
+
const { runtimeTemplate } = parser.state.compilation;
|
|
97
|
+
if (
|
|
98
|
+
!runtimeTemplate.supportsAsyncFunction() &&
|
|
99
|
+
(!runtimeTemplate.supportsGenerator() ||
|
|
100
|
+
buildInfo.usesTopLevelAwaitForOf)
|
|
101
|
+
) {
|
|
102
|
+
module.addWarning(
|
|
103
|
+
new EnvironmentNotSupportAsyncWarning(module, "topLevelAwait")
|
|
104
|
+
);
|
|
105
|
+
}
|
|
81
106
|
});
|
|
82
107
|
|
|
83
108
|
// Using `import.meta` only parses as a module, so it marks the module ESM.
|
|
84
|
-
// Non-bailing
|
|
85
|
-
// unknown members go
|
|
109
|
+
// Non-bailing; staged before the bailing DefinePlugin and ImportMetaPlugin
|
|
110
|
+
// replacement taps so it observes every access; unknown members go
|
|
111
|
+
// through `unhandledExpressionMemberChain`.
|
|
86
112
|
const onImportMeta = () => {
|
|
87
113
|
enableHarmony(false);
|
|
88
114
|
};
|
|
115
|
+
const earlyTapOptions = {
|
|
116
|
+
name: PLUGIN_NAME,
|
|
117
|
+
stage: IMPORT_META_STAGE_ESM_DETECTION
|
|
118
|
+
};
|
|
89
119
|
for (const name of IMPORT_META_NAMES) {
|
|
90
|
-
parser.hooks.expression.for(name).tap(
|
|
91
|
-
parser.hooks.typeof.for(name).tap(
|
|
120
|
+
parser.hooks.expression.for(name).tap(earlyTapOptions, onImportMeta);
|
|
121
|
+
parser.hooks.typeof.for(name).tap(earlyTapOptions, onImportMeta);
|
|
92
122
|
}
|
|
93
123
|
parser.hooks.expressionMemberChain
|
|
94
124
|
.for("import.meta")
|
|
95
|
-
.tap(
|
|
125
|
+
.tap(earlyTapOptions, onImportMeta);
|
|
96
126
|
parser.hooks.unhandledExpressionMemberChain
|
|
97
127
|
.for("import.meta")
|
|
98
|
-
.tap(
|
|
128
|
+
.tap(earlyTapOptions, onImportMeta);
|
|
99
129
|
|
|
100
130
|
/**
|
|
101
131
|
* Returns true if in harmony.
|
|
@@ -70,10 +70,7 @@ module.exports = class HarmonyExportDependencyParserPlugin {
|
|
|
70
70
|
),
|
|
71
71
|
/** @type {Range} */ (statement.range)
|
|
72
72
|
);
|
|
73
|
-
dep.setLocWithIndex(
|
|
74
|
-
/** @type {DependencyLocation} */ (statement.loc),
|
|
75
|
-
-1
|
|
76
|
-
);
|
|
73
|
+
dep.setLocWithIndex(parser.getLocation(statement), -1);
|
|
77
74
|
parser.state.module.addPresentationalDependency(dep);
|
|
78
75
|
return true;
|
|
79
76
|
});
|
|
@@ -84,10 +81,7 @@ module.exports = class HarmonyExportDependencyParserPlugin {
|
|
|
84
81
|
"",
|
|
85
82
|
/** @type {Range} */ (statement.range)
|
|
86
83
|
);
|
|
87
|
-
clearDep.setLocWithIndex(
|
|
88
|
-
/** @type {DependencyLocation} */ (statement.loc),
|
|
89
|
-
-1
|
|
90
|
-
);
|
|
84
|
+
clearDep.setLocWithIndex(parser.getLocation(statement), -1);
|
|
91
85
|
parser.state.module.addPresentationalDependency(clearDep);
|
|
92
86
|
|
|
93
87
|
const phase = getImportPhase(parser, statement);
|
|
@@ -95,7 +89,7 @@ module.exports = class HarmonyExportDependencyParserPlugin {
|
|
|
95
89
|
const error = new WebpackError(
|
|
96
90
|
"Deferred re-export (`export defer * as namespace from '...'`) is not a part of the Import Defer proposal.\nUse the following code instead:\n import defer * as namespace from '...';\n export { namespace };"
|
|
97
91
|
);
|
|
98
|
-
error.loc = statement
|
|
92
|
+
error.loc = parser.getLocation(statement) || undefined;
|
|
99
93
|
parser.state.current.addError(error);
|
|
100
94
|
}
|
|
101
95
|
const sideEffectDep = new HarmonyImportSideEffectDependency(
|
|
@@ -104,10 +98,7 @@ module.exports = class HarmonyExportDependencyParserPlugin {
|
|
|
104
98
|
phase,
|
|
105
99
|
getImportAttributes(statement)
|
|
106
100
|
);
|
|
107
|
-
sideEffectDep.setLocWithIndex(
|
|
108
|
-
/** @type {DependencyLocation} */ (statement.loc),
|
|
109
|
-
-1
|
|
110
|
-
);
|
|
101
|
+
sideEffectDep.setLocWithIndex(parser.getLocation(statement), -1);
|
|
111
102
|
// lazy barrel: defer at parse time when the importing module is side-effect-free
|
|
112
103
|
const moduleFactoryMeta = parser.state.module.factoryMeta;
|
|
113
104
|
if (moduleFactoryMeta !== undefined && moduleFactoryMeta.sideEffectFree) {
|
|
@@ -168,10 +159,7 @@ module.exports = class HarmonyExportDependencyParserPlugin {
|
|
|
168
159
|
node.type === "ClassDeclaration" ||
|
|
169
160
|
node.type === "ClassExpression") &&
|
|
170
161
|
!node.id));
|
|
171
|
-
dep.setLocWithIndex(
|
|
172
|
-
/** @type {DependencyLocation} */ (statement.loc),
|
|
173
|
-
-1
|
|
174
|
-
);
|
|
162
|
+
dep.setLocWithIndex(parser.getLocation(statement), -1);
|
|
175
163
|
parser.state.current.addDependency(dep);
|
|
176
164
|
getInnerGraphUtils(parser.state.compilation).addVariableUsage(
|
|
177
165
|
parser,
|
|
@@ -241,7 +229,7 @@ module.exports = class HarmonyExportDependencyParserPlugin {
|
|
|
241
229
|
dep.setLazy(true);
|
|
242
230
|
}
|
|
243
231
|
dep.setLocWithIndex(
|
|
244
|
-
|
|
232
|
+
parser.getLocation(statement),
|
|
245
233
|
/** @type {number} */ (idx)
|
|
246
234
|
);
|
|
247
235
|
const isAsiSafe = !parser.isAsiPosition(
|
|
@@ -296,7 +284,7 @@ module.exports = class HarmonyExportDependencyParserPlugin {
|
|
|
296
284
|
dep.setLazy(true);
|
|
297
285
|
}
|
|
298
286
|
dep.setLocWithIndex(
|
|
299
|
-
|
|
287
|
+
parser.getLocation(statement),
|
|
300
288
|
/** @type {number} */ (idx)
|
|
301
289
|
);
|
|
302
290
|
const isAsiSafe = !parser.isAsiPosition(
|
|
@@ -10,6 +10,7 @@ const Dependency = require("../Dependency");
|
|
|
10
10
|
const InitFragment = require("../InitFragment");
|
|
11
11
|
const Template = require("../Template");
|
|
12
12
|
const AwaitDependenciesInitFragment = require("../async-modules/AwaitDependenciesInitFragment");
|
|
13
|
+
const isGeneratorLowered = require("../async-modules/isGeneratorLowered");
|
|
13
14
|
const { filterRuntime, mergeRuntime } = require("../util/runtime");
|
|
14
15
|
const HarmonyLinkingError = require("./HarmonyLinkingError");
|
|
15
16
|
const { ImportPhase, ImportPhaseUtils } = require("./ImportPhase");
|
|
@@ -475,8 +476,18 @@ HarmonyImportDependency.Template = class HarmonyImportDependencyTemplate extends
|
|
|
475
476
|
)
|
|
476
477
|
);
|
|
477
478
|
const importVar = dep.getImportVar(templateContext.moduleGraph);
|
|
479
|
+
// When the consuming module is emitted as a generator (target without
|
|
480
|
+
// `async`/`await`), the dependency `await` must become `yield`.
|
|
481
|
+
const generatorLowered = isGeneratorLowered(
|
|
482
|
+
/** @type {Module} */ (module),
|
|
483
|
+
moduleGraph,
|
|
484
|
+
templateContext.runtimeTemplate
|
|
485
|
+
);
|
|
478
486
|
templateContext.initFragments.push(
|
|
479
|
-
new AwaitDependenciesInitFragment(
|
|
487
|
+
new AwaitDependenciesInitFragment(
|
|
488
|
+
new Map([[importVar, importVar]]),
|
|
489
|
+
generatorLowered
|
|
490
|
+
)
|
|
480
491
|
);
|
|
481
492
|
templateContext.initFragments.push(
|
|
482
493
|
new ConditionalInitFragment(
|
|
@@ -12,7 +12,6 @@ const {
|
|
|
12
12
|
getImportAttributes
|
|
13
13
|
} = require("../javascript/JavascriptParser");
|
|
14
14
|
const { getInnerGraphUtils } = require("../optimize/InnerGraph");
|
|
15
|
-
const memoize = require("../util/memoize");
|
|
16
15
|
const ConstDependency = require("./ConstDependency");
|
|
17
16
|
const HarmonyAcceptDependency = require("./HarmonyAcceptDependency");
|
|
18
17
|
const HarmonyAcceptImportDependency = require("./HarmonyAcceptImportDependency");
|
|
@@ -22,6 +21,10 @@ const {
|
|
|
22
21
|
ExportPresenceModes,
|
|
23
22
|
getNonOptionalPart
|
|
24
23
|
} = require("./HarmonyImportDependency");
|
|
24
|
+
const {
|
|
25
|
+
attachDependencyGuards,
|
|
26
|
+
isPresentByGuards
|
|
27
|
+
} = require("./HarmonyImportGuard");
|
|
25
28
|
const HarmonyImportSideEffectDependency = require("./HarmonyImportSideEffectDependency");
|
|
26
29
|
const HarmonyImportSpecifierDependency = require("./HarmonyImportSpecifierDependency");
|
|
27
30
|
const { ImportPhaseUtils, createGetImportPhase } = require("./ImportPhase");
|
|
@@ -46,10 +49,6 @@ const { ImportPhaseUtils, createGetImportPhase } = require("./ImportPhase");
|
|
|
46
49
|
/** @typedef {import("./ImportPhase").ImportPhaseType} ImportPhaseType */
|
|
47
50
|
/** @typedef {import("./HarmonyImportGuard").GuardFrame} GuardFrame */
|
|
48
51
|
|
|
49
|
-
/** @typedef {Map<string, Set<string>>} Guards Map of import root to guarded member keys */
|
|
50
|
-
|
|
51
|
-
const getHarmonyImportGuard = memoize(() => require("./HarmonyImportGuard"));
|
|
52
|
-
|
|
53
52
|
const harmonySpecifierTag = Symbol("harmony import");
|
|
54
53
|
|
|
55
54
|
// Shared placeholder: plain specifier references have no member ranges, so they
|
|
@@ -137,6 +136,12 @@ const findImportSpecifier = (parser, node) => {
|
|
|
137
136
|
parser,
|
|
138
137
|
/** @type {Expression} */ (node.object)
|
|
139
138
|
);
|
|
139
|
+
case "BinaryExpression":
|
|
140
|
+
// `"x" in ns` presence guard
|
|
141
|
+
return (
|
|
142
|
+
node.operator === "in" &&
|
|
143
|
+
findImportSpecifier(parser, /** @type {Expression} */ (node.right))
|
|
144
|
+
);
|
|
140
145
|
default:
|
|
141
146
|
return false;
|
|
142
147
|
}
|
|
@@ -175,21 +180,18 @@ module.exports = class HarmonyImportDependencyParserPlugin {
|
|
|
175
180
|
);
|
|
176
181
|
if (!harmonySettings) return this.exportPresenceMode;
|
|
177
182
|
|
|
183
|
+
if (this.exportPresenceMode === ExportPresenceModes.NONE) {
|
|
184
|
+
return this.exportPresenceMode;
|
|
185
|
+
}
|
|
186
|
+
|
|
178
187
|
const stack = /** @type {GuardFrame[] | undefined} */ (
|
|
179
188
|
parser.state.guardStack
|
|
180
189
|
);
|
|
181
|
-
if (
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
if (presence !== undefined) {
|
|
187
|
-
const members = presence.get(name);
|
|
188
|
-
if (members !== undefined && members.has(member)) {
|
|
189
|
-
return ExportPresenceModes.NONE;
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
}
|
|
190
|
+
if (
|
|
191
|
+
stack !== undefined &&
|
|
192
|
+
isPresentByGuards(parser, stack, harmonySettings.name, ids[0])
|
|
193
|
+
) {
|
|
194
|
+
return ExportPresenceModes.NONE;
|
|
193
195
|
}
|
|
194
196
|
|
|
195
197
|
return this.exportPresenceMode;
|
|
@@ -235,7 +237,7 @@ module.exports = class HarmonyImportDependencyParserPlugin {
|
|
|
235
237
|
: "",
|
|
236
238
|
/** @type {Range} */ (statement.range)
|
|
237
239
|
);
|
|
238
|
-
clearDep.loc =
|
|
240
|
+
clearDep.loc = parser.getLocation(statement);
|
|
239
241
|
parser.state.module.addPresentationalDependency(clearDep);
|
|
240
242
|
parser.unsetAsiPosition(/** @type {Range} */ (statement.range)[1]);
|
|
241
243
|
const attributes = getImportAttributes(statement);
|
|
@@ -248,7 +250,7 @@ module.exports = class HarmonyImportDependencyParserPlugin {
|
|
|
248
250
|
const error = new WebpackError(
|
|
249
251
|
"Deferred import can only be used with `import * as namespace from '...'` syntax."
|
|
250
252
|
);
|
|
251
|
-
error.loc = statement
|
|
253
|
+
error.loc = parser.getLocation(statement) || undefined;
|
|
252
254
|
parser.state.current.addError(error);
|
|
253
255
|
}
|
|
254
256
|
|
|
@@ -258,7 +260,7 @@ module.exports = class HarmonyImportDependencyParserPlugin {
|
|
|
258
260
|
phase,
|
|
259
261
|
attributes
|
|
260
262
|
);
|
|
261
|
-
sideEffectDep.loc =
|
|
263
|
+
sideEffectDep.loc = parser.getLocation(statement);
|
|
262
264
|
parser.state.module.addDependency(sideEffectDep);
|
|
263
265
|
return true;
|
|
264
266
|
});
|
|
@@ -305,7 +307,7 @@ module.exports = class HarmonyImportDependencyParserPlugin {
|
|
|
305
307
|
dep.asiSafe = !parser.isAsiPosition(
|
|
306
308
|
/** @type {Range} */ (expression.range)[0]
|
|
307
309
|
);
|
|
308
|
-
dep.loc =
|
|
310
|
+
dep.loc = parser.getLocation(expression);
|
|
309
311
|
parser.state.module.addDependency(dep);
|
|
310
312
|
getInnerGraphUtils(parser.state.compilation).onUsage(
|
|
311
313
|
parser.state,
|
|
@@ -351,10 +353,10 @@ module.exports = class HarmonyImportDependencyParserPlugin {
|
|
|
351
353
|
dep.asiSafe = !parser.isAsiPosition(
|
|
352
354
|
/** @type {Range} */ (expr.range)[0]
|
|
353
355
|
);
|
|
354
|
-
dep.loc =
|
|
356
|
+
dep.loc = parser.getLocation(expr);
|
|
355
357
|
dep.call = parser.scope.inTaggedTemplateTag;
|
|
356
358
|
parser.state.module.addDependency(dep);
|
|
357
|
-
|
|
359
|
+
attachDependencyGuards(parser, dep);
|
|
358
360
|
getInnerGraphUtils(parser.state.compilation).onUsage(
|
|
359
361
|
parser.state,
|
|
360
362
|
(e) => (dep.usedByExports = e)
|
|
@@ -404,9 +406,9 @@ module.exports = class HarmonyImportDependencyParserPlugin {
|
|
|
404
406
|
/** @type {Range} */
|
|
405
407
|
(expr.range)[0]
|
|
406
408
|
);
|
|
407
|
-
dep.loc =
|
|
409
|
+
dep.loc = parser.getLocation(expr);
|
|
408
410
|
parser.state.module.addDependency(dep);
|
|
409
|
-
|
|
411
|
+
attachDependencyGuards(parser, dep);
|
|
410
412
|
getInnerGraphUtils(parser.state.compilation).onUsage(
|
|
411
413
|
parser.state,
|
|
412
414
|
(e) => (dep.usedByExports = e)
|
|
@@ -461,9 +463,9 @@ module.exports = class HarmonyImportDependencyParserPlugin {
|
|
|
461
463
|
dep.namespaceObjectAsContext =
|
|
462
464
|
members.length > 0 &&
|
|
463
465
|
/** @type {boolean} */ (this.strictThisContextOnImports);
|
|
464
|
-
dep.loc =
|
|
466
|
+
dep.loc = parser.getLocation(expr);
|
|
465
467
|
parser.state.module.addDependency(dep);
|
|
466
|
-
|
|
468
|
+
attachDependencyGuards(parser, dep);
|
|
467
469
|
if (args) parser.walkExpressions(args);
|
|
468
470
|
getInnerGraphUtils(parser.state.compilation).onUsage(
|
|
469
471
|
parser.state,
|
|
@@ -502,7 +504,7 @@ module.exports = class HarmonyImportDependencyParserPlugin {
|
|
|
502
504
|
}
|
|
503
505
|
const dependencies = requests.map((request) => {
|
|
504
506
|
const dep = new HarmonyAcceptImportDependency(request);
|
|
505
|
-
dep.loc =
|
|
507
|
+
dep.loc = parser.getLocation(expr);
|
|
506
508
|
parser.state.module.addDependency(dep);
|
|
507
509
|
return dep;
|
|
508
510
|
});
|
|
@@ -513,7 +515,7 @@ module.exports = class HarmonyImportDependencyParserPlugin {
|
|
|
513
515
|
dependencies,
|
|
514
516
|
true
|
|
515
517
|
);
|
|
516
|
-
dep.loc =
|
|
518
|
+
dep.loc = parser.getLocation(expr);
|
|
517
519
|
parser.state.module.addDependency(dep);
|
|
518
520
|
}
|
|
519
521
|
});
|
|
@@ -524,7 +526,7 @@ module.exports = class HarmonyImportDependencyParserPlugin {
|
|
|
524
526
|
}
|
|
525
527
|
const dependencies = requests.map((request) => {
|
|
526
528
|
const dep = new HarmonyAcceptImportDependency(request);
|
|
527
|
-
dep.loc =
|
|
529
|
+
dep.loc = parser.getLocation(expr);
|
|
528
530
|
parser.state.module.addDependency(dep);
|
|
529
531
|
return dep;
|
|
530
532
|
});
|
|
@@ -535,7 +537,7 @@ module.exports = class HarmonyImportDependencyParserPlugin {
|
|
|
535
537
|
dependencies,
|
|
536
538
|
false
|
|
537
539
|
);
|
|
538
|
-
dep.loc =
|
|
540
|
+
dep.loc = parser.getLocation(expr);
|
|
539
541
|
parser.state.module.addDependency(dep);
|
|
540
542
|
}
|
|
541
543
|
});
|
|
@@ -543,90 +545,15 @@ module.exports = class HarmonyImportDependencyParserPlugin {
|
|
|
543
545
|
parser.hooks.collectGuards.tap(PLUGIN_NAME, (expression) => {
|
|
544
546
|
if (parser.scope.isAsmJs) return;
|
|
545
547
|
|
|
546
|
-
// Presence guards: `"x" in ns` checks that suppress export-presence errors
|
|
547
|
-
// (consequent only).
|
|
548
|
-
/** @type {Guards | undefined} */
|
|
549
|
-
let presence;
|
|
550
|
-
if (this.exportPresenceMode !== ExportPresenceModes.NONE) {
|
|
551
|
-
/** @type {Guards} */
|
|
552
|
-
const guards = new Map();
|
|
553
|
-
|
|
554
|
-
/**
|
|
555
|
-
* Processes the provided expression.
|
|
556
|
-
* @param {Expression} expression expression
|
|
557
|
-
* @param {boolean} needTruthy need to be truthy
|
|
558
|
-
*/
|
|
559
|
-
const collect = (expression, needTruthy) => {
|
|
560
|
-
if (
|
|
561
|
-
expression.type === "UnaryExpression" &&
|
|
562
|
-
expression.operator === "!"
|
|
563
|
-
) {
|
|
564
|
-
collect(expression.argument, !needTruthy);
|
|
565
|
-
return;
|
|
566
|
-
} else if (expression.type === "LogicalExpression" && needTruthy) {
|
|
567
|
-
if (expression.operator === "&&") {
|
|
568
|
-
collect(expression.left, true);
|
|
569
|
-
collect(expression.right, true);
|
|
570
|
-
} else if (expression.operator === "||") {
|
|
571
|
-
const leftEvaluation = parser.evaluateExpression(expression.left);
|
|
572
|
-
const leftBool = leftEvaluation.asBool();
|
|
573
|
-
if (leftBool === false) {
|
|
574
|
-
collect(expression.right, true);
|
|
575
|
-
}
|
|
576
|
-
} else if (expression.operator === "??") {
|
|
577
|
-
const leftEvaluation = parser.evaluateExpression(expression.left);
|
|
578
|
-
const leftNullish = leftEvaluation.asNullish();
|
|
579
|
-
if (leftNullish === true) {
|
|
580
|
-
collect(expression.right, true);
|
|
581
|
-
}
|
|
582
|
-
}
|
|
583
|
-
return;
|
|
584
|
-
}
|
|
585
|
-
if (!needTruthy) return;
|
|
586
|
-
|
|
587
|
-
// Direct `"x" in ns` guards
|
|
588
|
-
if (
|
|
589
|
-
expression.type === "BinaryExpression" &&
|
|
590
|
-
expression.operator === "in"
|
|
591
|
-
) {
|
|
592
|
-
if (expression.right.type !== "Identifier") {
|
|
593
|
-
return;
|
|
594
|
-
}
|
|
595
|
-
const info = getInOperatorHarmonyImportInfo(
|
|
596
|
-
parser,
|
|
597
|
-
expression.left,
|
|
598
|
-
expression.right
|
|
599
|
-
);
|
|
600
|
-
if (!info) return;
|
|
601
|
-
|
|
602
|
-
const { settings, leftPart, members } = info;
|
|
603
|
-
// Only direct namespace guards
|
|
604
|
-
if (members.length > 0) return;
|
|
605
|
-
const guarded = guards.get(settings.name);
|
|
606
|
-
if (guarded) {
|
|
607
|
-
guarded.add(leftPart);
|
|
608
|
-
return;
|
|
609
|
-
}
|
|
610
|
-
|
|
611
|
-
guards.set(settings.name, new Set([leftPart]));
|
|
612
|
-
}
|
|
613
|
-
};
|
|
614
|
-
|
|
615
|
-
collect(expression, true);
|
|
616
|
-
|
|
617
|
-
if (guards.size > 0) presence = guards;
|
|
618
|
-
}
|
|
619
|
-
|
|
620
548
|
const hasSpecifier = findImportSpecifier(parser, expression);
|
|
621
549
|
const depStart = hasSpecifier
|
|
622
550
|
? /** @type {Module} */ (parser.state.module).dependencies.length
|
|
623
551
|
: undefined;
|
|
624
552
|
|
|
625
|
-
if (
|
|
553
|
+
if (depStart === undefined) return;
|
|
626
554
|
|
|
627
555
|
/** @type {GuardFrame} */
|
|
628
556
|
const consequent = {
|
|
629
|
-
presence,
|
|
630
557
|
test: expression,
|
|
631
558
|
depStart,
|
|
632
559
|
condition: true
|