in src/js/builtins/BundlerPlugin.ts [194:296]
export function runOnResolvePlugins(this: BundlerPlugin, specifier, inputNamespace, importer, internalID, kindId) {
// Must be kept in sync with ImportRecord.label
const kind = $ImportKindIdToLabel[kindId];
var promiseResult: any = (async (inputPath, inputNamespace, importer, kind) => {
var { onResolve, onLoad } = this;
var results = onResolve.$get(inputNamespace);
if (!results) {
this.onResolveAsync(internalID, null, null, null);
return null;
}
for (let [filter, callback] of results) {
if (filter.test(inputPath)) {
var result = callback({
path: inputPath,
importer,
namespace: inputNamespace,
// resolveDir
kind,
// pluginData
});
while (
result &&
$isPromise(result) &&
($getPromiseInternalField(result, $promiseFieldFlags) & $promiseStateMask) === $promiseStateFulfilled
) {
result = $getPromiseInternalField(result, $promiseFieldReactionsOrResult);
}
if (result && $isPromise(result)) {
result = await result;
}
if (!result || !$isObject(result)) {
continue;
}
var { path, namespace: userNamespace = inputNamespace, external } = result;
if (!(typeof path === "string") || !(typeof userNamespace === "string")) {
throw new TypeError("onResolve plugins must return an object with a string 'path' and string 'loader' field");
}
if (!path) {
continue;
}
if (!userNamespace) {
userNamespace = inputNamespace;
}
if (typeof external !== "boolean" && !$isUndefinedOrNull(external)) {
throw new TypeError('onResolve plugins "external" field must be boolean or unspecified');
}
if (!external) {
if (userNamespace === "file") {
if (process.platform !== "win32") {
if (path[0] !== "/" || path.includes("..")) {
throw new TypeError('onResolve plugin "path" must be absolute when the namespace is "file"');
}
} else {
if (require("node:path").isAbsolute(path) === false || path.includes("..")) {
throw new TypeError('onResolve plugin "path" must be absolute when the namespace is "file"');
}
}
}
if (userNamespace === "dataurl") {
if (!path.startsWith("data:")) {
throw new TypeError('onResolve plugin "path" must start with "data:" when the namespace is "dataurl"');
}
}
if (userNamespace && userNamespace !== "file" && (!onLoad || !onLoad.$has(userNamespace))) {
throw new TypeError(`Expected onLoad plugin for namespace ${userNamespace} to exist`);
}
}
this.onResolveAsync(internalID, path, userNamespace, external);
return null;
}
}
this.onResolveAsync(internalID, null, null, null);
return null;
})(specifier, inputNamespace, importer, kind);
while (
promiseResult &&
$isPromise(promiseResult) &&
($getPromiseInternalField(promiseResult, $promiseFieldFlags) & $promiseStateMask) === $promiseStateFulfilled
) {
promiseResult = $getPromiseInternalField(promiseResult, $promiseFieldReactionsOrResult);
}
if (promiseResult && $isPromise(promiseResult)) {
promiseResult.then(
() => {},
e => {
this.addError(internalID, e, 0);
},
);
}
}