webpack 5.102.1 → 5.103.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 +121 -134
- package/lib/CompatibilityPlugin.js +25 -2
- package/lib/Compilation.js +25 -2
- package/lib/ConcatenationScope.js +0 -15
- package/lib/CssModule.js +6 -1
- package/lib/DefinePlugin.js +11 -11
- package/lib/Dependency.js +8 -1
- package/lib/DependencyTemplate.js +1 -0
- package/lib/DotenvPlugin.js +457 -0
- package/lib/EnvironmentPlugin.js +19 -16
- package/lib/EvalSourceMapDevToolPlugin.js +16 -0
- package/lib/ExportsInfo.js +6 -2
- package/lib/ExternalModule.js +20 -28
- package/lib/ExternalModuleFactoryPlugin.js +10 -8
- package/lib/ExternalsPlugin.js +2 -1
- package/lib/ManifestPlugin.js +235 -0
- package/lib/Module.js +3 -0
- package/lib/ModuleGraph.js +2 -1
- package/lib/ModuleSourceTypesConstants.js +0 -6
- package/lib/MultiCompiler.js +1 -1
- package/lib/NodeStuffPlugin.js +419 -121
- package/lib/NormalModule.js +17 -16
- package/lib/RuntimeGlobals.js +22 -4
- package/lib/RuntimePlugin.js +27 -6
- package/lib/RuntimeTemplate.js +115 -56
- package/lib/SourceMapDevToolPlugin.js +20 -0
- package/lib/WebpackOptionsApply.js +33 -9
- package/lib/asset/AssetBytesGenerator.js +1 -1
- package/lib/asset/AssetGenerator.js +1 -2
- package/lib/asset/AssetSourceGenerator.js +1 -1
- package/lib/config/browserslistTargetHandler.js +5 -0
- package/lib/config/defaults.js +98 -18
- package/lib/config/normalization.js +2 -1
- package/lib/config/target.js +6 -0
- package/lib/css/CssGenerator.js +283 -57
- package/lib/css/CssLoadingRuntimeModule.js +2 -0
- package/lib/css/CssMergeStyleSheetsRuntimeModule.js +56 -0
- package/lib/css/CssModulesPlugin.js +84 -34
- package/lib/css/CssParser.js +1174 -667
- package/lib/css/walkCssTokens.js +97 -0
- package/lib/dependencies/CommonJsImportsParserPlugin.js +0 -9
- package/lib/dependencies/CommonJsPlugin.js +12 -0
- package/lib/dependencies/CssIcssExportDependency.js +247 -8
- package/lib/dependencies/CssIcssFromIdentifierDependency.js +124 -0
- package/lib/dependencies/CssIcssGlobalIdentifierDependency.js +48 -0
- package/lib/dependencies/CssIcssImportDependency.js +60 -54
- package/lib/dependencies/CssIcssLocalIdentifierDependency.js +61 -0
- package/lib/dependencies/{CssSelfLocalIdentifierDependency.js → CssIcssSelfLocalIdentifierDependency.js} +88 -10
- package/lib/dependencies/CssIcssSymbolDependency.js +31 -29
- package/lib/dependencies/CssImportDependency.js +15 -5
- package/lib/dependencies/ExternalModuleInitFragment.js +1 -1
- package/lib/dependencies/ExternalModuleInitFragmentDependency.js +95 -0
- package/lib/dependencies/HarmonyAcceptDependency.js +6 -1
- package/lib/dependencies/HarmonyAcceptImportDependency.js +2 -1
- package/lib/dependencies/HarmonyEvaluatedImportSpecifierDependency.js +12 -1
- package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +32 -21
- package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +12 -8
- package/lib/dependencies/HarmonyImportDependency.js +23 -27
- package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +28 -69
- package/lib/dependencies/HarmonyImportSideEffectDependency.js +4 -3
- package/lib/dependencies/HarmonyImportSpecifierDependency.js +10 -8
- package/lib/dependencies/ImportDependency.js +8 -2
- package/lib/dependencies/ImportEagerDependency.js +6 -3
- package/lib/dependencies/ImportMetaPlugin.js +97 -9
- package/lib/dependencies/ImportParserPlugin.js +19 -21
- package/lib/dependencies/ImportPhase.js +121 -0
- package/lib/dependencies/ImportWeakDependency.js +6 -3
- package/lib/dependencies/ModuleDependency.js +5 -1
- package/lib/dependencies/ModuleHotAcceptDependency.js +1 -1
- package/lib/esm/ExportWebpackRequireRuntimeModule.js +1 -8
- package/lib/hmr/LazyCompilationPlugin.js +1 -0
- package/lib/ids/IdHelpers.js +4 -1
- package/lib/index.js +6 -0
- package/lib/javascript/ChunkHelpers.js +16 -5
- package/lib/javascript/JavascriptGenerator.js +101 -101
- package/lib/javascript/JavascriptModulesPlugin.js +23 -13
- package/lib/javascript/JavascriptParser.js +142 -38
- package/lib/json/JsonParser.js +7 -1
- package/lib/library/ModuleLibraryPlugin.js +0 -10
- package/lib/library/SystemLibraryPlugin.js +4 -0
- package/lib/library/UmdLibraryPlugin.js +1 -1
- package/lib/node/NodeTargetPlugin.js +9 -1
- package/lib/node/ReadFileCompileWasmPlugin.js +0 -2
- package/lib/optimize/ConcatenatedModule.js +161 -135
- package/lib/runtime/AsyncModuleRuntimeModule.js +28 -18
- package/lib/runtime/AutoPublicPathRuntimeModule.js +8 -3
- package/lib/runtime/MakeDeferredNamespaceObjectRuntime.js +89 -55
- package/lib/util/comparators.js +4 -3
- package/lib/util/internalSerializables.js +4 -4
- package/lib/util/jsonParseEvenBetterErrors.js +10 -0
- package/lib/wasm/EnableWasmLoadingPlugin.js +10 -4
- package/lib/wasm-async/AsyncWebAssemblyJavascriptGenerator.js +8 -5
- package/lib/wasm-sync/WebAssemblyJavascriptGenerator.js +8 -4
- package/lib/web/FetchCompileWasmPlugin.js +0 -2
- package/lib/webpack.js +85 -82
- package/module.d.ts +5 -0
- package/package.json +16 -14
- package/schemas/WebpackOptions.check.js +1 -1
- package/schemas/WebpackOptions.json +109 -27
- package/schemas/plugins/ManifestPlugin.check.d.ts +7 -0
- package/schemas/plugins/ManifestPlugin.check.js +6 -0
- package/schemas/plugins/ManifestPlugin.json +98 -0
- package/schemas/plugins/SourceMapDevToolPlugin.check.js +1 -1
- package/schemas/plugins/SourceMapDevToolPlugin.json +16 -3
- package/schemas/plugins/container/ContainerReferencePlugin.check.js +1 -1
- package/schemas/plugins/container/ContainerReferencePlugin.json +4 -1
- package/schemas/plugins/container/ExternalsType.check.js +1 -1
- package/schemas/plugins/container/ModuleFederationPlugin.check.js +1 -1
- package/schemas/plugins/container/ModuleFederationPlugin.json +4 -1
- package/schemas/plugins/css/CssAutoParserOptions.check.js +1 -1
- package/schemas/plugins/css/CssGlobalGeneratorOptions.check.js +1 -1
- package/schemas/plugins/css/CssGlobalParserOptions.check.js +1 -1
- package/schemas/plugins/css/CssModuleGeneratorOptions.check.js +1 -1
- package/schemas/plugins/css/CssModuleParserOptions.check.js +1 -1
- package/schemas/plugins/css/CssParserOptions.check.js +1 -1
- package/schemas/plugins/json/JsonModulesPluginParser.check.js +1 -1
- package/types.d.ts +560 -293
- package/lib/dependencies/CssLocalIdentifierDependency.js +0 -250
|
@@ -9,6 +9,7 @@ const Template = require("../Template");
|
|
|
9
9
|
const AwaitDependenciesInitFragment = require("../async-modules/AwaitDependenciesInitFragment");
|
|
10
10
|
const makeSerializable = require("../util/makeSerializable");
|
|
11
11
|
const HarmonyImportDependency = require("./HarmonyImportDependency");
|
|
12
|
+
const { ImportPhaseUtils } = require("./ImportPhase");
|
|
12
13
|
const NullDependency = require("./NullDependency");
|
|
13
14
|
|
|
14
15
|
/** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */
|
|
@@ -120,7 +121,11 @@ HarmonyAcceptDependency.Template = class HarmonyAcceptDependencyTemplate extends
|
|
|
120
121
|
for (const d of module.dependencies) {
|
|
121
122
|
if (deferDependency && noDeferredDependency) break;
|
|
122
123
|
if (isRelatedHarmonyImportDependency(dependency, d)) {
|
|
123
|
-
if (
|
|
124
|
+
if (
|
|
125
|
+
ImportPhaseUtils.isDefer(
|
|
126
|
+
/** @type {HarmonyImportDependency} */ (d).phase
|
|
127
|
+
)
|
|
128
|
+
) {
|
|
124
129
|
deferDependency = /** @type {HarmonyImportDependency} */ (d);
|
|
125
130
|
} else {
|
|
126
131
|
noDeferredDependency = /** @type {HarmonyImportDependency} */ (d);
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
const makeSerializable = require("../util/makeSerializable");
|
|
9
9
|
const HarmonyImportDependency = require("./HarmonyImportDependency");
|
|
10
|
+
const { ImportPhase } = require("./ImportPhase");
|
|
10
11
|
const NullDependency = require("./NullDependency");
|
|
11
12
|
|
|
12
13
|
class HarmonyAcceptImportDependency extends HarmonyImportDependency {
|
|
@@ -14,7 +15,7 @@ class HarmonyAcceptImportDependency extends HarmonyImportDependency {
|
|
|
14
15
|
* @param {string} request the request string
|
|
15
16
|
*/
|
|
16
17
|
constructor(request) {
|
|
17
|
-
super(request,
|
|
18
|
+
super(request, Infinity, ImportPhase.Evaluation);
|
|
18
19
|
this.weak = true;
|
|
19
20
|
}
|
|
20
21
|
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
const makeSerializable = require("../util/makeSerializable");
|
|
9
9
|
const HarmonyImportSpecifierDependency = require("./HarmonyImportSpecifierDependency");
|
|
10
|
+
const { ImportPhase } = require("./ImportPhase");
|
|
10
11
|
|
|
11
12
|
/** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */
|
|
12
13
|
/** @typedef {import("../Dependency")} Dependency */
|
|
@@ -37,7 +38,17 @@ class HarmonyEvaluatedImportSpecifierDependency extends HarmonyImportSpecifierDe
|
|
|
37
38
|
* @param {string} operator operator
|
|
38
39
|
*/
|
|
39
40
|
constructor(request, sourceOrder, ids, name, range, attributes, operator) {
|
|
40
|
-
super(
|
|
41
|
+
super(
|
|
42
|
+
request,
|
|
43
|
+
sourceOrder,
|
|
44
|
+
ids,
|
|
45
|
+
name,
|
|
46
|
+
range,
|
|
47
|
+
false,
|
|
48
|
+
ImportPhase.Evaluation,
|
|
49
|
+
attributes,
|
|
50
|
+
[]
|
|
51
|
+
);
|
|
41
52
|
this.operator = operator;
|
|
42
53
|
}
|
|
43
54
|
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
"use strict";
|
|
7
7
|
|
|
8
|
+
const CompatibilityPlugin = require("../CompatibilityPlugin");
|
|
8
9
|
const WebpackError = require("../WebpackError");
|
|
9
10
|
const { getImportAttributes } = require("../javascript/JavascriptParser");
|
|
10
11
|
const InnerGraph = require("../optimize/InnerGraph");
|
|
@@ -15,10 +16,10 @@ const HarmonyExportImportedSpecifierDependency = require("./HarmonyExportImporte
|
|
|
15
16
|
const HarmonyExportSpecifierDependency = require("./HarmonyExportSpecifierDependency");
|
|
16
17
|
const { ExportPresenceModes } = require("./HarmonyImportDependency");
|
|
17
18
|
const {
|
|
18
|
-
getImportMode,
|
|
19
19
|
harmonySpecifierTag
|
|
20
20
|
} = require("./HarmonyImportDependencyParserPlugin");
|
|
21
21
|
const HarmonyImportSideEffectDependency = require("./HarmonyImportSideEffectDependency");
|
|
22
|
+
const { ImportPhaseUtils, createGetImportPhase } = require("./ImportPhase");
|
|
22
23
|
|
|
23
24
|
/** @typedef {import("../Dependency").DependencyLocation} DependencyLocation */
|
|
24
25
|
/** @typedef {import("../javascript/JavascriptParser")} JavascriptParser */
|
|
@@ -26,6 +27,7 @@ const HarmonyImportSideEffectDependency = require("./HarmonyImportSideEffectDepe
|
|
|
26
27
|
/** @typedef {import("../javascript/JavascriptParser").FunctionDeclaration} FunctionDeclaration */
|
|
27
28
|
/** @typedef {import("../javascript/JavascriptParser").Range} Range */
|
|
28
29
|
/** @typedef {import("./HarmonyImportDependencyParserPlugin").HarmonySettings} HarmonySettings */
|
|
30
|
+
/** @typedef {import("../CompatibilityPlugin").CompatibilitySettings} CompatibilitySettings */
|
|
29
31
|
|
|
30
32
|
const { HarmonyStarExportsList } = HarmonyExportImportedSpecifierDependency;
|
|
31
33
|
|
|
@@ -36,6 +38,7 @@ module.exports = class HarmonyExportDependencyParserPlugin {
|
|
|
36
38
|
* @param {import("../../declarations/WebpackOptions").JavascriptParserOptions} options options
|
|
37
39
|
*/
|
|
38
40
|
constructor(options) {
|
|
41
|
+
this.options = options;
|
|
39
42
|
this.exportPresenceMode =
|
|
40
43
|
options.reexportExportsPresence !== undefined
|
|
41
44
|
? ExportPresenceModes.fromUserOption(options.reexportExportsPresence)
|
|
@@ -44,7 +47,6 @@ module.exports = class HarmonyExportDependencyParserPlugin {
|
|
|
44
47
|
: options.strictExportPresence
|
|
45
48
|
? ExportPresenceModes.ERROR
|
|
46
49
|
: ExportPresenceModes.AUTO;
|
|
47
|
-
this.deferImport = options.deferImport;
|
|
48
50
|
}
|
|
49
51
|
|
|
50
52
|
/**
|
|
@@ -53,6 +55,8 @@ module.exports = class HarmonyExportDependencyParserPlugin {
|
|
|
53
55
|
*/
|
|
54
56
|
apply(parser) {
|
|
55
57
|
const { exportPresenceMode } = this;
|
|
58
|
+
const getImportPhase = createGetImportPhase(this.options.deferImport);
|
|
59
|
+
|
|
56
60
|
parser.hooks.export.tap(PLUGIN_NAME, (statement) => {
|
|
57
61
|
const dep = new HarmonyExportHeaderDependency(
|
|
58
62
|
/** @type {Range | false} */ (
|
|
@@ -77,22 +81,20 @@ module.exports = class HarmonyExportDependencyParserPlugin {
|
|
|
77
81
|
clearDep.loc = /** @type {DependencyLocation} */ (statement.loc);
|
|
78
82
|
clearDep.loc.index = -1;
|
|
79
83
|
parser.state.module.addPresentationalDependency(clearDep);
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
parser.state.current.addError(error);
|
|
89
|
-
}
|
|
84
|
+
|
|
85
|
+
const phase = getImportPhase(parser, statement);
|
|
86
|
+
if (phase && ImportPhaseUtils.isDefer(phase)) {
|
|
87
|
+
const error = new WebpackError(
|
|
88
|
+
"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 };"
|
|
89
|
+
);
|
|
90
|
+
error.loc = statement.loc || undefined;
|
|
91
|
+
parser.state.current.addError(error);
|
|
90
92
|
}
|
|
91
93
|
const sideEffectDep = new HarmonyImportSideEffectDependency(
|
|
92
94
|
/** @type {string} */ (source),
|
|
93
95
|
parser.state.lastHarmonyImportOrder,
|
|
94
|
-
|
|
95
|
-
|
|
96
|
+
phase,
|
|
97
|
+
getImportAttributes(statement)
|
|
96
98
|
);
|
|
97
99
|
sideEffectDep.loc = Object.create(
|
|
98
100
|
/** @type {DependencyLocation} */ (statement.loc)
|
|
@@ -157,6 +159,18 @@ module.exports = class HarmonyExportDependencyParserPlugin {
|
|
|
157
159
|
parser.hooks.exportSpecifier.tap(
|
|
158
160
|
PLUGIN_NAME,
|
|
159
161
|
(statement, id, name, idx) => {
|
|
162
|
+
// CompatibilityPlugin may change exports name
|
|
163
|
+
// not handle re-export or import then export situation as current CompatibilityPlugin only
|
|
164
|
+
// rename symbol in declaration module, not change exported symbol
|
|
165
|
+
const variable = parser.getTagData(
|
|
166
|
+
id,
|
|
167
|
+
CompatibilityPlugin.nestedWebpackIdentifierTag
|
|
168
|
+
);
|
|
169
|
+
if (variable && /** @type {CompatibilitySettings} */ (variable).name) {
|
|
170
|
+
// CompatibilityPlugin changes exports to a new name, should updates exports name
|
|
171
|
+
id = /** @type {CompatibilitySettings} */ (variable).name;
|
|
172
|
+
}
|
|
173
|
+
|
|
160
174
|
const settings =
|
|
161
175
|
/** @type {HarmonySettings} */
|
|
162
176
|
(parser.getTagData(id, harmonySpecifierTag));
|
|
@@ -174,8 +188,8 @@ module.exports = class HarmonyExportDependencyParserPlugin {
|
|
|
174
188
|
null,
|
|
175
189
|
exportPresenceMode,
|
|
176
190
|
null,
|
|
177
|
-
settings.
|
|
178
|
-
settings.
|
|
191
|
+
settings.phase,
|
|
192
|
+
settings.attributes
|
|
179
193
|
)
|
|
180
194
|
: new HarmonyExportSpecifierDependency(id, name);
|
|
181
195
|
dep.loc = Object.create(
|
|
@@ -207,9 +221,6 @@ module.exports = class HarmonyExportDependencyParserPlugin {
|
|
|
207
221
|
parser.state.harmonyStarExports || new HarmonyStarExportsList();
|
|
208
222
|
}
|
|
209
223
|
const attributes = getImportAttributes(statement);
|
|
210
|
-
const defer = this.deferImport
|
|
211
|
-
? getImportMode(parser, statement).defer
|
|
212
|
-
: false;
|
|
213
224
|
const dep = new HarmonyExportImportedSpecifierDependency(
|
|
214
225
|
/** @type {string} */
|
|
215
226
|
(source),
|
|
@@ -221,8 +232,8 @@ module.exports = class HarmonyExportDependencyParserPlugin {
|
|
|
221
232
|
harmonyStarExports && harmonyStarExports.slice(),
|
|
222
233
|
exportPresenceMode,
|
|
223
234
|
harmonyStarExports,
|
|
224
|
-
|
|
225
|
-
|
|
235
|
+
getImportPhase(parser, statement),
|
|
236
|
+
attributes
|
|
226
237
|
);
|
|
227
238
|
if (harmonyStarExports) {
|
|
228
239
|
harmonyStarExports.push(dep);
|
|
@@ -27,6 +27,7 @@ const {
|
|
|
27
27
|
} = require("../util/runtime");
|
|
28
28
|
const HarmonyExportInitFragment = require("./HarmonyExportInitFragment");
|
|
29
29
|
const HarmonyImportDependency = require("./HarmonyImportDependency");
|
|
30
|
+
const { ImportPhaseUtils } = require("./ImportPhase");
|
|
30
31
|
const processExportInfo = require("./processExportInfo");
|
|
31
32
|
|
|
32
33
|
/** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */
|
|
@@ -57,6 +58,7 @@ const processExportInfo = require("./processExportInfo");
|
|
|
57
58
|
/** @typedef {import("../util/runtime").RuntimeSpec} RuntimeSpec */
|
|
58
59
|
/** @typedef {import("./HarmonyImportDependency").Ids} Ids */
|
|
59
60
|
/** @typedef {import("./HarmonyImportDependency").ExportPresenceMode} ExportPresenceMode */
|
|
61
|
+
/** @typedef {import("../dependencies/ImportPhase").ImportPhaseType} ImportPhaseType */
|
|
60
62
|
|
|
61
63
|
/** @typedef {"missing"|"unused"|"empty-star"|"reexport-dynamic-default"|"reexport-named-default"|"reexport-namespace-object"|"reexport-fake-namespace-object"|"reexport-undefined"|"normal-reexport"|"dynamic-reexport"} ExportModeType */
|
|
62
64
|
|
|
@@ -376,8 +378,8 @@ class HarmonyExportImportedSpecifierDependency extends HarmonyImportDependency {
|
|
|
376
378
|
* @param {ReadonlyArray<HarmonyExportImportedSpecifierDependency> | null} otherStarExports other star exports in the module before this import
|
|
377
379
|
* @param {ExportPresenceMode} exportPresenceMode mode of checking export names
|
|
378
380
|
* @param {HarmonyStarExportsList | null} allStarExports all star exports in the module
|
|
381
|
+
* @param {ImportPhaseType} phase import phase
|
|
379
382
|
* @param {ImportAttributes=} attributes import attributes
|
|
380
|
-
* @param {boolean=} defer is defer phase
|
|
381
383
|
*/
|
|
382
384
|
constructor(
|
|
383
385
|
request,
|
|
@@ -388,10 +390,10 @@ class HarmonyExportImportedSpecifierDependency extends HarmonyImportDependency {
|
|
|
388
390
|
otherStarExports,
|
|
389
391
|
exportPresenceMode,
|
|
390
392
|
allStarExports,
|
|
391
|
-
|
|
392
|
-
|
|
393
|
+
phase,
|
|
394
|
+
attributes
|
|
393
395
|
) {
|
|
394
|
-
super(request, sourceOrder,
|
|
396
|
+
super(request, sourceOrder, phase, attributes);
|
|
395
397
|
|
|
396
398
|
this.ids = ids;
|
|
397
399
|
this.name = name;
|
|
@@ -1050,12 +1052,14 @@ HarmonyExportImportedSpecifierDependency.Template = class HarmonyExportImportedS
|
|
|
1050
1052
|
) {
|
|
1051
1053
|
const importedModule = /** @type {Module} */ (moduleGraph.getModule(dep));
|
|
1052
1054
|
const importVar = dep.getImportVar(moduleGraph);
|
|
1055
|
+
const isDeferred =
|
|
1056
|
+
ImportPhaseUtils.isDefer(dep.phase) &&
|
|
1057
|
+
!(/** @type {BuildMeta} */ (importedModule.buildMeta).async);
|
|
1053
1058
|
|
|
1054
1059
|
if (
|
|
1055
1060
|
(mode.type === "reexport-namespace-object" ||
|
|
1056
1061
|
mode.type === "reexport-fake-namespace-object") &&
|
|
1057
|
-
|
|
1058
|
-
!moduleGraph.isAsync(importedModule)
|
|
1062
|
+
isDeferred
|
|
1059
1063
|
) {
|
|
1060
1064
|
initFragments.push(
|
|
1061
1065
|
...this.getReexportDeferredNamespaceObjectFragments(
|
|
@@ -1200,7 +1204,7 @@ HarmonyExportImportedSpecifierDependency.Template = class HarmonyExportImportedS
|
|
|
1200
1204
|
moduleGraph.isAsync(importedModule)
|
|
1201
1205
|
? InitFragment.STAGE_ASYNC_HARMONY_IMPORTS
|
|
1202
1206
|
: InitFragment.STAGE_HARMONY_IMPORTS,
|
|
1203
|
-
dep.sourceOrder,
|
|
1207
|
+
/** @type {number} */ (dep.sourceOrder),
|
|
1204
1208
|
key,
|
|
1205
1209
|
runtimeCondition
|
|
1206
1210
|
)
|
|
@@ -1261,7 +1265,7 @@ HarmonyExportImportedSpecifierDependency.Template = class HarmonyExportImportedS
|
|
|
1261
1265
|
moduleGraph.isAsync(importedModule)
|
|
1262
1266
|
? InitFragment.STAGE_ASYNC_HARMONY_IMPORTS
|
|
1263
1267
|
: InitFragment.STAGE_HARMONY_IMPORTS,
|
|
1264
|
-
dep.sourceOrder
|
|
1268
|
+
/** @type {number} */ (dep.sourceOrder)
|
|
1265
1269
|
)
|
|
1266
1270
|
);
|
|
1267
1271
|
break;
|
|
@@ -12,6 +12,7 @@ const InitFragment = require("../InitFragment");
|
|
|
12
12
|
const Template = require("../Template");
|
|
13
13
|
const AwaitDependenciesInitFragment = require("../async-modules/AwaitDependenciesInitFragment");
|
|
14
14
|
const { filterRuntime, mergeRuntime } = require("../util/runtime");
|
|
15
|
+
const { ImportPhaseUtils } = require("./ImportPhase");
|
|
15
16
|
const ModuleDependency = require("./ModuleDependency");
|
|
16
17
|
|
|
17
18
|
/** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */
|
|
@@ -23,6 +24,7 @@ const ModuleDependency = require("./ModuleDependency");
|
|
|
23
24
|
/** @typedef {import("../ModuleGraph")} ModuleGraph */
|
|
24
25
|
/** @typedef {import("../WebpackError")} WebpackError */
|
|
25
26
|
/** @typedef {import("../javascript/JavascriptParser").ImportAttributes} ImportAttributes */
|
|
27
|
+
/** @typedef {import("./ImportPhase").ImportPhaseType} ImportPhaseType */
|
|
26
28
|
/** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
|
|
27
29
|
/** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
|
|
28
30
|
/** @typedef {import("../util/runtime").RuntimeSpec} RuntimeSpec */
|
|
@@ -60,14 +62,13 @@ class HarmonyImportDependency extends ModuleDependency {
|
|
|
60
62
|
/**
|
|
61
63
|
* @param {string} request request string
|
|
62
64
|
* @param {number} sourceOrder source order
|
|
65
|
+
* @param {ImportPhaseType} phase import phase
|
|
63
66
|
* @param {ImportAttributes=} attributes import attributes
|
|
64
|
-
* @param {boolean=} defer import attributes
|
|
65
67
|
*/
|
|
66
|
-
constructor(request, sourceOrder,
|
|
67
|
-
super(request);
|
|
68
|
-
this.
|
|
68
|
+
constructor(request, sourceOrder, phase, attributes) {
|
|
69
|
+
super(request, sourceOrder);
|
|
70
|
+
this.phase = phase;
|
|
69
71
|
this.attributes = attributes;
|
|
70
|
-
this.defer = defer;
|
|
71
72
|
}
|
|
72
73
|
|
|
73
74
|
get category() {
|
|
@@ -79,7 +80,7 @@ class HarmonyImportDependency extends ModuleDependency {
|
|
|
79
80
|
*/
|
|
80
81
|
getResourceIdentifier() {
|
|
81
82
|
let str = super.getResourceIdentifier();
|
|
82
|
-
if (this.
|
|
83
|
+
if (ImportPhaseUtils.isDefer(this.phase)) {
|
|
83
84
|
str += "|defer";
|
|
84
85
|
}
|
|
85
86
|
if (this.attributes) {
|
|
@@ -104,10 +105,14 @@ class HarmonyImportDependency extends ModuleDependency {
|
|
|
104
105
|
*/
|
|
105
106
|
getImportVar(moduleGraph) {
|
|
106
107
|
const module = /** @type {Module} */ (moduleGraph.getParentModule(this));
|
|
108
|
+
const importedModule = /** @type {Module} */ (moduleGraph.getModule(this));
|
|
107
109
|
const meta = moduleGraph.getMeta(module);
|
|
108
|
-
const defer = this.defer;
|
|
109
110
|
|
|
110
|
-
const
|
|
111
|
+
const isDeferred =
|
|
112
|
+
ImportPhaseUtils.isDefer(this.phase) &&
|
|
113
|
+
!(/** @type {BuildMeta} */ (importedModule.buildMeta).async);
|
|
114
|
+
|
|
115
|
+
const metaKey = isDeferred ? "deferredImportVarMap" : "importVarMap";
|
|
111
116
|
let importVarMap = meta[metaKey];
|
|
112
117
|
if (!importVarMap) {
|
|
113
118
|
meta[metaKey] = importVarMap =
|
|
@@ -115,19 +120,12 @@ class HarmonyImportDependency extends ModuleDependency {
|
|
|
115
120
|
(new Map());
|
|
116
121
|
}
|
|
117
122
|
|
|
118
|
-
let importVar = importVarMap.get(
|
|
119
|
-
/** @type {Module} */
|
|
120
|
-
(moduleGraph.getModule(this))
|
|
121
|
-
);
|
|
123
|
+
let importVar = importVarMap.get(importedModule);
|
|
122
124
|
if (importVar) return importVar;
|
|
123
125
|
importVar = `${Template.toIdentifier(
|
|
124
126
|
`${this.userRequest}`
|
|
125
|
-
)}__WEBPACK_${
|
|
126
|
-
importVarMap.set(
|
|
127
|
-
/** @type {Module} */
|
|
128
|
-
(moduleGraph.getModule(this)),
|
|
129
|
-
importVar
|
|
130
|
-
);
|
|
127
|
+
)}__WEBPACK_${isDeferred ? "DEFERRED_" : ""}IMPORTED_MODULE_${importVarMap.size}__`;
|
|
128
|
+
importVarMap.set(importedModule, importVar);
|
|
131
129
|
return importVar;
|
|
132
130
|
}
|
|
133
131
|
|
|
@@ -167,7 +165,7 @@ class HarmonyImportDependency extends ModuleDependency {
|
|
|
167
165
|
request: this.request,
|
|
168
166
|
originModule: module,
|
|
169
167
|
runtimeRequirements,
|
|
170
|
-
|
|
168
|
+
dependency: this
|
|
171
169
|
});
|
|
172
170
|
}
|
|
173
171
|
|
|
@@ -289,9 +287,8 @@ class HarmonyImportDependency extends ModuleDependency {
|
|
|
289
287
|
*/
|
|
290
288
|
serialize(context) {
|
|
291
289
|
const { write } = context;
|
|
292
|
-
write(this.sourceOrder);
|
|
293
290
|
write(this.attributes);
|
|
294
|
-
write(this.
|
|
291
|
+
write(this.phase);
|
|
295
292
|
super.serialize(context);
|
|
296
293
|
}
|
|
297
294
|
|
|
@@ -300,9 +297,8 @@ class HarmonyImportDependency extends ModuleDependency {
|
|
|
300
297
|
*/
|
|
301
298
|
deserialize(context) {
|
|
302
299
|
const { read } = context;
|
|
303
|
-
this.sourceOrder = read();
|
|
304
300
|
this.attributes = read();
|
|
305
|
-
this.
|
|
301
|
+
this.phase = read();
|
|
306
302
|
super.deserialize(context);
|
|
307
303
|
}
|
|
308
304
|
}
|
|
@@ -344,7 +340,7 @@ HarmonyImportDependency.Template = class HarmonyImportDependencyTemplate extends
|
|
|
344
340
|
const moduleKey = referencedModule
|
|
345
341
|
? referencedModule.identifier()
|
|
346
342
|
: dep.request;
|
|
347
|
-
const key = `${dep.
|
|
343
|
+
const key = `${ImportPhaseUtils.isDefer(dep.phase) ? "deferred " : ""}harmony import ${moduleKey}`;
|
|
348
344
|
|
|
349
345
|
const runtimeCondition = dep.weak
|
|
350
346
|
? false
|
|
@@ -382,7 +378,7 @@ HarmonyImportDependency.Template = class HarmonyImportDependencyTemplate extends
|
|
|
382
378
|
new ConditionalInitFragment(
|
|
383
379
|
importStatement[0],
|
|
384
380
|
InitFragment.STAGE_HARMONY_IMPORTS,
|
|
385
|
-
dep.sourceOrder,
|
|
381
|
+
/** @type {number} */ (dep.sourceOrder),
|
|
386
382
|
key,
|
|
387
383
|
runtimeCondition
|
|
388
384
|
)
|
|
@@ -395,7 +391,7 @@ HarmonyImportDependency.Template = class HarmonyImportDependencyTemplate extends
|
|
|
395
391
|
new ConditionalInitFragment(
|
|
396
392
|
importStatement[1],
|
|
397
393
|
InitFragment.STAGE_ASYNC_HARMONY_IMPORTS,
|
|
398
|
-
dep.sourceOrder,
|
|
394
|
+
/** @type {number} */ (dep.sourceOrder),
|
|
399
395
|
`${key} compat`,
|
|
400
396
|
runtimeCondition
|
|
401
397
|
)
|
|
@@ -405,7 +401,7 @@ HarmonyImportDependency.Template = class HarmonyImportDependencyTemplate extends
|
|
|
405
401
|
new ConditionalInitFragment(
|
|
406
402
|
importStatement[0] + importStatement[1],
|
|
407
403
|
InitFragment.STAGE_HARMONY_IMPORTS,
|
|
408
|
-
dep.sourceOrder,
|
|
404
|
+
/** @type {number} */ (dep.sourceOrder),
|
|
409
405
|
key,
|
|
410
406
|
runtimeCondition
|
|
411
407
|
)
|
|
@@ -5,7 +5,6 @@
|
|
|
5
5
|
|
|
6
6
|
"use strict";
|
|
7
7
|
|
|
8
|
-
const CommentCompilationWarning = require("../CommentCompilationWarning");
|
|
9
8
|
const HotModuleReplacementPlugin = require("../HotModuleReplacementPlugin");
|
|
10
9
|
const WebpackError = require("../WebpackError");
|
|
11
10
|
const {
|
|
@@ -21,6 +20,7 @@ const HarmonyExports = require("./HarmonyExports");
|
|
|
21
20
|
const { ExportPresenceModes } = require("./HarmonyImportDependency");
|
|
22
21
|
const HarmonyImportSideEffectDependency = require("./HarmonyImportSideEffectDependency");
|
|
23
22
|
const HarmonyImportSpecifierDependency = require("./HarmonyImportSpecifierDependency");
|
|
23
|
+
const { ImportPhaseUtils, createGetImportPhase } = require("./ImportPhase");
|
|
24
24
|
|
|
25
25
|
/** @typedef {import("estree").Expression} Expression */
|
|
26
26
|
/** @typedef {import("estree").Identifier} Identifier */
|
|
@@ -36,6 +36,7 @@ const HarmonyImportSpecifierDependency = require("./HarmonyImportSpecifierDepend
|
|
|
36
36
|
/** @typedef {import("../javascript/JavascriptParser").Members} Members */
|
|
37
37
|
/** @typedef {import("../javascript/JavascriptParser").MembersOptionals} MembersOptionals */
|
|
38
38
|
/** @typedef {import("./HarmonyImportDependency").Ids} Ids */
|
|
39
|
+
/** @typedef {import("./ImportPhase").ImportPhaseType} ImportPhaseType */
|
|
39
40
|
|
|
40
41
|
const harmonySpecifierTag = Symbol("harmony import");
|
|
41
42
|
|
|
@@ -47,7 +48,7 @@ const harmonySpecifierTag = Symbol("harmony import");
|
|
|
47
48
|
* @property {string} name
|
|
48
49
|
* @property {boolean} await
|
|
49
50
|
* @property {ImportAttributes=} attributes
|
|
50
|
-
* @property {
|
|
51
|
+
* @property {ImportPhaseType} phase
|
|
51
52
|
*/
|
|
52
53
|
|
|
53
54
|
const PLUGIN_NAME = "HarmonyImportDependencyParserPlugin";
|
|
@@ -57,6 +58,7 @@ module.exports = class HarmonyImportDependencyParserPlugin {
|
|
|
57
58
|
* @param {JavascriptParserOptions} options options
|
|
58
59
|
*/
|
|
59
60
|
constructor(options) {
|
|
61
|
+
this.options = options;
|
|
60
62
|
this.exportPresenceMode =
|
|
61
63
|
options.importExportsPresence !== undefined
|
|
62
64
|
? ExportPresenceModes.fromUserOption(options.importExportsPresence)
|
|
@@ -66,7 +68,6 @@ module.exports = class HarmonyImportDependencyParserPlugin {
|
|
|
66
68
|
? ExportPresenceModes.ERROR
|
|
67
69
|
: ExportPresenceModes.AUTO;
|
|
68
70
|
this.strictThisContextOnImports = options.strictThisContextOnImports;
|
|
69
|
-
this.deferImport = options.deferImport;
|
|
70
71
|
}
|
|
71
72
|
|
|
72
73
|
/**
|
|
@@ -76,6 +77,8 @@ module.exports = class HarmonyImportDependencyParserPlugin {
|
|
|
76
77
|
apply(parser) {
|
|
77
78
|
const { exportPresenceMode } = this;
|
|
78
79
|
|
|
80
|
+
const getImportPhase = createGetImportPhase(this.options.deferImport);
|
|
81
|
+
|
|
79
82
|
/**
|
|
80
83
|
* @param {Members} members members
|
|
81
84
|
* @param {MembersOptionals} membersOptionals members Optionals
|
|
@@ -119,26 +122,24 @@ module.exports = class HarmonyImportDependencyParserPlugin {
|
|
|
119
122
|
parser.state.module.addPresentationalDependency(clearDep);
|
|
120
123
|
parser.unsetAsiPosition(/** @type {Range} */ (statement.range)[1]);
|
|
121
124
|
const attributes = getImportAttributes(statement);
|
|
122
|
-
|
|
123
|
-
if (
|
|
124
|
-
(
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
error.loc = statement.loc || undefined;
|
|
134
|
-
parser.state.current.addError(error);
|
|
135
|
-
}
|
|
125
|
+
const phase = getImportPhase(parser, statement);
|
|
126
|
+
if (
|
|
127
|
+
ImportPhaseUtils.isDefer(phase) &&
|
|
128
|
+
(statement.specifiers.length !== 1 ||
|
|
129
|
+
statement.specifiers[0].type !== "ImportNamespaceSpecifier")
|
|
130
|
+
) {
|
|
131
|
+
const error = new WebpackError(
|
|
132
|
+
"Deferred import can only be used with `import * as namespace from '...'` syntax."
|
|
133
|
+
);
|
|
134
|
+
error.loc = statement.loc || undefined;
|
|
135
|
+
parser.state.current.addError(error);
|
|
136
136
|
}
|
|
137
|
+
|
|
137
138
|
const sideEffectDep = new HarmonyImportSideEffectDependency(
|
|
138
139
|
/** @type {string} */ (source),
|
|
139
140
|
parser.state.lastHarmonyImportOrder,
|
|
140
|
-
|
|
141
|
-
|
|
141
|
+
phase,
|
|
142
|
+
attributes
|
|
142
143
|
);
|
|
143
144
|
sideEffectDep.loc = /** @type {DependencyLocation} */ (statement.loc);
|
|
144
145
|
parser.state.module.addDependency(sideEffectDep);
|
|
@@ -148,9 +149,7 @@ module.exports = class HarmonyImportDependencyParserPlugin {
|
|
|
148
149
|
PLUGIN_NAME,
|
|
149
150
|
(statement, source, id, name) => {
|
|
150
151
|
const ids = id === null ? [] : [id];
|
|
151
|
-
const
|
|
152
|
-
? getImportMode(parser, statement).defer
|
|
153
|
-
: false;
|
|
152
|
+
const phase = getImportPhase(parser, statement);
|
|
154
153
|
parser.tagVariable(
|
|
155
154
|
name,
|
|
156
155
|
harmonySpecifierTag,
|
|
@@ -160,7 +159,7 @@ module.exports = class HarmonyImportDependencyParserPlugin {
|
|
|
160
159
|
ids,
|
|
161
160
|
sourceOrder: parser.state.lastHarmonyImportOrder,
|
|
162
161
|
attributes: getImportAttributes(statement),
|
|
163
|
-
|
|
162
|
+
phase
|
|
164
163
|
})
|
|
165
164
|
);
|
|
166
165
|
return true;
|
|
@@ -237,9 +236,9 @@ module.exports = class HarmonyImportDependencyParserPlugin {
|
|
|
237
236
|
/** @type {Range} */
|
|
238
237
|
(expr.range),
|
|
239
238
|
exportPresenceMode,
|
|
239
|
+
settings.phase,
|
|
240
240
|
settings.attributes,
|
|
241
|
-
[]
|
|
242
|
-
settings.defer
|
|
241
|
+
[]
|
|
243
242
|
);
|
|
244
243
|
dep.referencedPropertiesInDestructuring =
|
|
245
244
|
parser.destructuringAssignmentPropertiesFor(expr);
|
|
@@ -287,9 +286,9 @@ module.exports = class HarmonyImportDependencyParserPlugin {
|
|
|
287
286
|
/** @type {Range} */
|
|
288
287
|
(expr.range),
|
|
289
288
|
exportPresenceMode,
|
|
289
|
+
settings.phase,
|
|
290
290
|
settings.attributes,
|
|
291
|
-
ranges
|
|
292
|
-
settings.defer
|
|
291
|
+
ranges
|
|
293
292
|
);
|
|
294
293
|
dep.referencedPropertiesInDestructuring =
|
|
295
294
|
parser.destructuringAssignmentPropertiesFor(expr);
|
|
@@ -337,9 +336,9 @@ module.exports = class HarmonyImportDependencyParserPlugin {
|
|
|
337
336
|
settings.name,
|
|
338
337
|
/** @type {Range} */ (expr.range),
|
|
339
338
|
exportPresenceMode,
|
|
339
|
+
settings.phase,
|
|
340
340
|
settings.attributes,
|
|
341
|
-
ranges
|
|
342
|
-
settings.defer
|
|
341
|
+
ranges
|
|
343
342
|
);
|
|
344
343
|
dep.directImport = members.length === 0;
|
|
345
344
|
dep.call = true;
|
|
@@ -406,44 +405,4 @@ module.exports = class HarmonyImportDependencyParserPlugin {
|
|
|
406
405
|
}
|
|
407
406
|
};
|
|
408
407
|
|
|
409
|
-
/**
|
|
410
|
-
* @param {JavascriptParser} parser parser
|
|
411
|
-
* @param {ExportNamedDeclaration | ExportAllDeclaration | ImportDeclaration} node node
|
|
412
|
-
* @returns {{ defer: boolean }} import attributes
|
|
413
|
-
*/
|
|
414
|
-
function getImportMode(parser, node) {
|
|
415
|
-
const result = { defer: "phase" in node && node.phase === "defer" };
|
|
416
|
-
if (!node.range) {
|
|
417
|
-
return result;
|
|
418
|
-
}
|
|
419
|
-
const { options, errors } = parser.parseCommentOptions(node.range);
|
|
420
|
-
if (errors) {
|
|
421
|
-
for (const e of errors) {
|
|
422
|
-
const { comment } = e;
|
|
423
|
-
if (!comment.loc) continue;
|
|
424
|
-
parser.state.module.addWarning(
|
|
425
|
-
new CommentCompilationWarning(
|
|
426
|
-
`Compilation error while processing magic comment(-s): /*${comment.value}*/: ${e.message}`,
|
|
427
|
-
comment.loc
|
|
428
|
-
)
|
|
429
|
-
);
|
|
430
|
-
}
|
|
431
|
-
}
|
|
432
|
-
if (!options) return result;
|
|
433
|
-
if (options.webpackDefer) {
|
|
434
|
-
if (typeof options.webpackDefer === "boolean") {
|
|
435
|
-
result.defer = options.webpackDefer;
|
|
436
|
-
} else if (node.loc) {
|
|
437
|
-
parser.state.module.addWarning(
|
|
438
|
-
new CommentCompilationWarning(
|
|
439
|
-
"webpackDefer magic comment expected a boolean value.",
|
|
440
|
-
node.loc
|
|
441
|
-
)
|
|
442
|
-
);
|
|
443
|
-
}
|
|
444
|
-
}
|
|
445
|
-
return result;
|
|
446
|
-
}
|
|
447
|
-
|
|
448
|
-
module.exports.getImportMode = getImportMode;
|
|
449
408
|
module.exports.harmonySpecifierTag = harmonySpecifierTag;
|
|
@@ -16,16 +16,17 @@ const HarmonyImportDependency = require("./HarmonyImportDependency");
|
|
|
16
16
|
/** @typedef {import("../ModuleGraph")} ModuleGraph */
|
|
17
17
|
/** @typedef {import("../ModuleGraphConnection").ConnectionState} ConnectionState */
|
|
18
18
|
/** @typedef {import("../javascript/JavascriptParser").ImportAttributes} ImportAttributes */
|
|
19
|
+
/** @typedef {import("./ImportPhase").ImportPhaseType} ImportPhaseType */
|
|
19
20
|
|
|
20
21
|
class HarmonyImportSideEffectDependency extends HarmonyImportDependency {
|
|
21
22
|
/**
|
|
22
23
|
* @param {string} request the request string
|
|
23
24
|
* @param {number} sourceOrder source order
|
|
25
|
+
* @param {ImportPhaseType} phase import phase
|
|
24
26
|
* @param {ImportAttributes=} attributes import attributes
|
|
25
|
-
* @param {boolean=} defer is defer phase
|
|
26
27
|
*/
|
|
27
|
-
constructor(request, sourceOrder,
|
|
28
|
-
super(request, sourceOrder,
|
|
28
|
+
constructor(request, sourceOrder, phase, attributes) {
|
|
29
|
+
super(request, sourceOrder, phase, attributes);
|
|
29
30
|
}
|
|
30
31
|
|
|
31
32
|
get type() {
|