Skip to content

Commit 4809421

Browse files
refactor(types): more
1 parent 1ab7cad commit 4809421

File tree

89 files changed

+520
-195
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

89 files changed

+520
-195
lines changed

lib/CompatibilityPlugin.js

+50-30
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,11 @@ const {
1313
const RuntimeGlobals = require("./RuntimeGlobals");
1414
const ConstDependency = require("./dependencies/ConstDependency");
1515

16+
/** @typedef {import("estree").CallExpression} CallExpression */
1617
/** @typedef {import("./Compiler")} Compiler */
18+
/** @typedef {import("./Dependency").DependencyLocation} DependencyLocation */
1719
/** @typedef {import("./javascript/JavascriptParser")} JavascriptParser */
20+
/** @typedef {import("./javascript/JavascriptParser").Range} Range */
1821

1922
const nestedWebpackIdentifierTag = Symbol("nested webpack identifier");
2023
const PLUGIN_NAME = "CompatibilityPlugin";
@@ -43,31 +46,41 @@ class CompatibilityPlugin {
4346
)
4447
return;
4548

46-
parser.hooks.call.for("require").tap(PLUGIN_NAME, expr => {
47-
// support for browserify style require delegator: "require(o, !0)"
48-
if (expr.arguments.length !== 2) return;
49-
const second = parser.evaluateExpression(expr.arguments[1]);
50-
if (!second.isBoolean()) return;
51-
if (second.asBool() !== true) return;
52-
const dep = new ConstDependency("require", expr.callee.range);
53-
dep.loc = expr.loc;
54-
if (parser.state.current.dependencies.length > 0) {
55-
const last =
56-
parser.state.current.dependencies[
57-
parser.state.current.dependencies.length - 1
58-
];
59-
if (
60-
last.critical &&
61-
last.options &&
62-
last.options.request === "." &&
63-
last.userRequest === "." &&
64-
last.options.recursive
65-
)
66-
parser.state.current.dependencies.pop();
49+
parser.hooks.call.for("require").tap(
50+
PLUGIN_NAME,
51+
/**
52+
* @param {CallExpression} expr call expression
53+
* @returns {boolean | void} true when need to handle
54+
*/
55+
expr => {
56+
// support for browserify style require delegator: "require(o, !0)"
57+
if (expr.arguments.length !== 2) return;
58+
const second = parser.evaluateExpression(expr.arguments[1]);
59+
if (!second.isBoolean()) return;
60+
if (second.asBool() !== true) return;
61+
const dep = new ConstDependency(
62+
"require",
63+
/** @type {Range} */ (expr.callee.range)
64+
);
65+
dep.loc = /** @type {DependencyLocation} */ (expr.loc);
66+
if (parser.state.current.dependencies.length > 0) {
67+
const last =
68+
parser.state.current.dependencies[
69+
parser.state.current.dependencies.length - 1
70+
];
71+
if (
72+
last.critical &&
73+
last.options &&
74+
last.options.request === "." &&
75+
last.userRequest === "." &&
76+
last.options.recursive
77+
)
78+
parser.state.current.dependencies.pop();
79+
}
80+
parser.state.module.addPresentationalDependency(dep);
81+
return true;
6782
}
68-
parser.state.module.addPresentationalDependency(dep);
69-
return true;
70-
});
83+
);
7184
});
7285

7386
/**
@@ -82,7 +95,9 @@ class CompatibilityPlugin {
8295
statement.id &&
8396
statement.id.name === RuntimeGlobals.require
8497
) {
85-
const newName = `__nested_webpack_require_${statement.range[0]}__`;
98+
const newName = `__nested_webpack_require_${
99+
/** @type {Range} */ (statement.range)[0]
100+
}__`;
86101
parser.tagVariable(
87102
statement.id.name,
88103
nestedWebpackIdentifierTag,
@@ -101,7 +116,9 @@ class CompatibilityPlugin {
101116
parser.hooks.pattern
102117
.for(RuntimeGlobals.require)
103118
.tap(PLUGIN_NAME, pattern => {
104-
const newName = `__nested_webpack_require_${pattern.range[0]}__`;
119+
const newName = `__nested_webpack_require_${
120+
/** @type {Range} */ (pattern.range)[0]
121+
}__`;
105122
parser.tagVariable(pattern.name, nestedWebpackIdentifierTag, {
106123
name: newName,
107124
declaration: {
@@ -135,8 +152,11 @@ class CompatibilityPlugin {
135152
parser.state.module.addPresentationalDependency(dep);
136153
declaration.updated = true;
137154
}
138-
const dep = new ConstDependency(name, expr.range);
139-
dep.loc = expr.loc;
155+
const dep = new ConstDependency(
156+
name,
157+
/** @type {Range} */ (expr.range)
158+
);
159+
dep.loc = /** @type {DependencyLocation} */ (expr.loc);
140160
parser.state.module.addPresentationalDependency(dep);
141161
return true;
142162
});
@@ -145,11 +165,11 @@ class CompatibilityPlugin {
145165
parser.hooks.program.tap(PLUGIN_NAME, (program, comments) => {
146166
if (comments.length === 0) return;
147167
const c = comments[0];
148-
if (c.type === "Line" && c.range[0] === 0) {
168+
if (c.type === "Line" && /** @type {Range} */ (c.range)[0] === 0) {
149169
if (parser.state.source.slice(0, 2).toString() !== "#!") return;
150170
// this is a hashbang comment
151171
const dep = new ConstDependency("//", 0);
152-
dep.loc = c.loc;
172+
dep.loc = /** @type {DependencyLocation} */ (c.loc);
153173
parser.state.module.addPresentationalDependency(dep);
154174
}
155175
});

lib/Compilation.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -3208,6 +3208,7 @@ Or do you want to use the entrypoints '${name}' and '${runtime}' independently o
32083208
const { chunkGraph, moduleGraph, dependencyTemplates, runtimeTemplate } =
32093209
this;
32103210
const results = this.codeGenerationResults;
3211+
/** @type {WebpackError[]} */
32113212
const errors = [];
32123213
/** @type {Set<Module> | undefined} */
32133214
let notCodeGeneratedModules = undefined;
@@ -3303,7 +3304,7 @@ Or do you want to use the entrypoints '${name}' and '${runtime}' independently o
33033304
* @param {RuntimeTemplate} runtimeTemplate runtimeTemplate
33043305
* @param {WebpackError[]} errors errors
33053306
* @param {CodeGenerationResults} results results
3306-
* @param {function(WebpackError=, boolean=): void} callback callback
3307+
* @param {function((WebpackError | null)=, boolean=): void} callback callback
33073308
*/
33083309
_codeGenerationModule(
33093310
module,

lib/DelegatedModule.js

+15-3
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,13 @@ const RUNTIME_REQUIREMENTS = new Set([
4242
]);
4343

4444
class DelegatedModule extends Module {
45+
/**
46+
* @param {string} sourceRequest source request
47+
* @param {TODO} data data
48+
* @param {"require" | "object"} type type
49+
* @param {string} userRequest user request
50+
* @param {string | Module} originalRequest original request
51+
*/
4552
constructor(sourceRequest, data, type, userRequest, originalRequest) {
4653
super(JAVASCRIPT_MODULE_TYPE_DYNAMIC, null);
4754

@@ -51,7 +58,7 @@ class DelegatedModule extends Module {
5158
this.delegationType = type;
5259
this.userRequest = userRequest;
5360
this.originalRequest = originalRequest;
54-
/** @type {ManifestModuleData} */
61+
/** @type {ManifestModuleData | undefined} */
5562
this.delegateData = data;
5663

5764
// Build info
@@ -110,15 +117,16 @@ class DelegatedModule extends Module {
110117
* @returns {void}
111118
*/
112119
build(options, compilation, resolver, fs, callback) {
113-
this.buildMeta = { ...this.delegateData.buildMeta };
120+
const delegateData = /** @type {ManifestModuleData} */ (this.delegateData);
121+
this.buildMeta = { ...delegateData.buildMeta };
114122
this.buildInfo = {};
115123
this.dependencies.length = 0;
116124
this.delegatedSourceDependency = new DelegatedSourceDependency(
117125
this.sourceRequest
118126
);
119127
this.addDependency(this.delegatedSourceDependency);
120128
this.addDependency(
121-
new StaticExportsDependency(this.delegateData.exports || true, false)
129+
new StaticExportsDependency(delegateData.exports || true, false)
122130
);
123131
callback();
124132
}
@@ -202,6 +210,10 @@ class DelegatedModule extends Module {
202210
super.serialize(context);
203211
}
204212

213+
/**
214+
* @param {ObjectDeserializerContext} context context\
215+
* @returns {DelegatedModule} DelegatedModule
216+
*/
205217
static deserialize(context) {
206218
const { read } = context;
207219
const obj = new DelegatedModule(

lib/DelegatedModuleFactoryPlugin.js

+6
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77

88
const DelegatedModule = require("./DelegatedModule");
99

10+
/** @typedef {import("./NormalModuleFactory")} NormalModuleFactory */
11+
1012
// options.source
1113
// options.type
1214
// options.context
@@ -20,6 +22,10 @@ class DelegatedModuleFactoryPlugin {
2022
options.extensions = options.extensions || ["", ".js", ".json", ".wasm"];
2123
}
2224

25+
/**
26+
* @param {NormalModuleFactory} normalModuleFactory the normal module factory
27+
* @returns {void}
28+
*/
2329
apply(normalModuleFactory) {
2430
const scope = this.options.scope;
2531
if (scope) {

lib/EvalSourceMapDevToolPlugin.js

+4
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,10 @@ class EvalSourceMapDevToolPlugin {
8282
return cachedSource;
8383
}
8484

85+
/**
86+
* @param {Source} r result
87+
* @returns {Source} result
88+
*/
8589
const result = r => {
8690
cache.set(source, r);
8791
return r;

lib/ExportsInfo.js

+17-3
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ const { forEachRuntime } = require("./util/runtime");
1414
/** @typedef {import("./Module")} Module */
1515
/** @typedef {import("./ModuleGraph")} ModuleGraph */
1616
/** @typedef {import("./ModuleGraphConnection")} ModuleGraphConnection */
17+
/** @typedef {import("./serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
18+
/** @typedef {import("./serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
1719
/** @typedef {import("./util/Hash")} Hash */
1820

1921
/** @typedef {typeof UsageState.OnlyPropertiesUsed | typeof UsageState.NoInfo | typeof UsageState.Unknown | typeof UsageState.Used} RuntimeUsageStateType */
@@ -44,13 +46,20 @@ class RestoreProvidedData {
4446
this.otherTerminalBinding = otherTerminalBinding;
4547
}
4648

49+
/**
50+
* @param {ObjectSerializerContext} context context
51+
*/
4752
serialize({ write }) {
4853
write(this.exports);
4954
write(this.otherProvided);
5055
write(this.otherCanMangleProvide);
5156
write(this.otherTerminalBinding);
5257
}
5358

59+
/**
60+
* @param {ObjectDeserializerContext} context context
61+
* @returns {RestoreProvidedData} RestoreProvidedData
62+
*/
5463
static deserialize({ read }) {
5564
return new RestoreProvidedData(read(), read(), read(), read());
5665
}
@@ -301,7 +310,12 @@ class ExportsInfo {
301310
changed = true;
302311
}
303312
if (targetKey) {
304-
exportInfo.setTarget(targetKey, targetModule, [exportInfo.name], -1);
313+
exportInfo.setTarget(
314+
targetKey,
315+
/** @type {ModuleGraphConnection} */ (targetModule),
316+
[exportInfo.name],
317+
-1
318+
);
305319
}
306320
}
307321
if (this._redirectTo !== undefined) {
@@ -331,7 +345,7 @@ class ExportsInfo {
331345
if (targetKey) {
332346
this._otherExportsInfo.setTarget(
333347
targetKey,
334-
targetModule,
348+
/** @type {ModuleGraphConnection} */ (targetModule),
335349
undefined,
336350
priority
337351
);
@@ -1226,7 +1240,7 @@ class ExportInfo {
12261240
/**
12271241
* @param {ModuleGraph} moduleGraph the module graph
12281242
* @param {function(Module): boolean} validTargetModuleFilter a valid target module
1229-
* @param {Set<ExportInfo> | undefined} alreadyVisited set of already visited export info to avoid circular references
1243+
* @param {Set<ExportInfo>} alreadyVisited set of already visited export info to avoid circular references
12301244
* @returns {{ module: Module, export: string[] | undefined } | undefined | false} the target, undefined when there is no target, false when no target is valid
12311245
*/
12321246
_findTarget(moduleGraph, validTargetModuleFilter, alreadyVisited) {

lib/ExportsInfoApiPlugin.js

+14-5
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@ const ConstDependency = require("./dependencies/ConstDependency");
1414
const ExportsInfoDependency = require("./dependencies/ExportsInfoDependency");
1515

1616
/** @typedef {import("./Compiler")} Compiler */
17+
/** @typedef {import("./Dependency").DependencyLocation} DependencyLocation */
1718
/** @typedef {import("./javascript/JavascriptParser")} JavascriptParser */
19+
/** @typedef {import("./javascript/JavascriptParser").Range} Range */
1820

1921
const PLUGIN_NAME = "ExportsInfoApiPlugin";
2022

@@ -43,20 +45,27 @@ class ExportsInfoApiPlugin {
4345
const dep =
4446
members.length >= 2
4547
? new ExportsInfoDependency(
46-
expr.range,
48+
/** @type {Range} */ (expr.range),
4749
members.slice(0, -1),
4850
members[members.length - 1]
4951
)
50-
: new ExportsInfoDependency(expr.range, null, members[0]);
51-
dep.loc = expr.loc;
52+
: new ExportsInfoDependency(
53+
/** @type {Range} */ (expr.range),
54+
null,
55+
members[0]
56+
);
57+
dep.loc = /** @type {DependencyLocation} */ (expr.loc);
5258
parser.state.module.addDependency(dep);
5359
return true;
5460
});
5561
parser.hooks.expression
5662
.for("__webpack_exports_info__")
5763
.tap(PLUGIN_NAME, expr => {
58-
const dep = new ConstDependency("true", expr.range);
59-
dep.loc = expr.loc;
64+
const dep = new ConstDependency(
65+
"true",
66+
/** @type {Range} */ (expr.range)
67+
);
68+
dep.loc = /** @type {DependencyLocation} */ (expr.loc);
6069
parser.state.module.addPresentationalDependency(dep);
6170
return true;
6271
});

lib/ExternalModule.js

+5
Original file line numberDiff line numberDiff line change
@@ -384,6 +384,11 @@ const getSourceForDefaultCase = (optional, request, runtimeTemplate) => {
384384
};
385385

386386
class ExternalModule extends Module {
387+
/**
388+
* @param {string | string[] | Record<string, string | string[]>} request request
389+
* @param {TODO} type type
390+
* @param {string} userRequest user request
391+
*/
387392
constructor(request, type, userRequest) {
388393
super(JAVASCRIPT_MODULE_TYPE_DYNAMIC, null);
389394

lib/FlagAllModulesAsUsedPlugin.js

+6-1
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,14 @@
88
const { getEntryRuntime, mergeRuntimeOwned } = require("./util/runtime");
99

1010
/** @typedef {import("./Compiler")} Compiler */
11+
/** @typedef {import("./Module").FactoryMeta} FactoryMeta */
1112
/** @typedef {import("./util/runtime").RuntimeSpec} RuntimeSpec */
1213

1314
const PLUGIN_NAME = "FlagAllModulesAsUsedPlugin";
1415
class FlagAllModulesAsUsedPlugin {
16+
/**
17+
* @param {string} explanation explanation
18+
*/
1519
constructor(explanation) {
1620
this.explanation = explanation;
1721
}
@@ -40,7 +44,8 @@ class FlagAllModulesAsUsedPlugin {
4044
if (module.factoryMeta === undefined) {
4145
module.factoryMeta = {};
4246
}
43-
module.factoryMeta.sideEffectFree = false;
47+
/** @type {FactoryMeta} */
48+
(module.factoryMeta).sideEffectFree = false;
4449
}
4550
});
4651
});

lib/HotModuleReplacementPlugin.js

+8
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,10 @@ class HotModuleReplacementPlugin {
189189
return true;
190190
};
191191

192+
/**
193+
* @param {JavascriptParser} parser the parser
194+
* @returns {void}
195+
*/
192196
const applyModuleHot = parser => {
193197
parser.hooks.evaluateIdentifier.for("module.hot").tap(
194198
{
@@ -221,6 +225,10 @@ class HotModuleReplacementPlugin {
221225
.tap(PLUGIN_NAME, createHMRExpressionHandler(parser));
222226
};
223227

228+
/**
229+
* @param {JavascriptParser} parser the parser
230+
* @returns {void}
231+
*/
224232
const applyImportMetaHot = parser => {
225233
parser.hooks.evaluateIdentifier
226234
.for("import.meta.webpackHot")

0 commit comments

Comments
 (0)