You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
81 lines
2.1 KiB
81 lines
2.1 KiB
/* |
|
MIT License http://www.opensource.org/licenses/mit-license.php |
|
Author Tobias Koppers @sokra |
|
*/ |
|
|
|
"use strict"; |
|
|
|
const path = require("path"); |
|
const DescriptionFileUtils = require("./DescriptionFileUtils"); |
|
|
|
/** @typedef {import("./Resolver")} Resolver */ |
|
/** @typedef {import("./Resolver").ResolveStepHook} ResolveStepHook */ |
|
/** @typedef {{name: string|Array<string>, forceRelative: boolean}} MainFieldOptions */ |
|
|
|
const alreadyTriedMainField = Symbol("alreadyTriedMainField"); |
|
|
|
module.exports = class MainFieldPlugin { |
|
/** |
|
* @param {string | ResolveStepHook} source source |
|
* @param {MainFieldOptions} options options |
|
* @param {string | ResolveStepHook} target target |
|
*/ |
|
constructor(source, options, target) { |
|
this.source = source; |
|
this.options = options; |
|
this.target = target; |
|
} |
|
|
|
/** |
|
* @param {Resolver} resolver the resolver |
|
* @returns {void} |
|
*/ |
|
apply(resolver) { |
|
const target = resolver.ensureHook(this.target); |
|
resolver |
|
.getHook(this.source) |
|
.tapAsync("MainFieldPlugin", (request, resolveContext, callback) => { |
|
if ( |
|
request.path !== request.descriptionFileRoot || |
|
request[alreadyTriedMainField] === request.descriptionFilePath || |
|
!request.descriptionFilePath |
|
) |
|
return callback(); |
|
const filename = path.basename(request.descriptionFilePath); |
|
let mainModule = DescriptionFileUtils.getField( |
|
request.descriptionFileData, |
|
this.options.name |
|
); |
|
|
|
if ( |
|
!mainModule || |
|
typeof mainModule !== "string" || |
|
mainModule === "." || |
|
mainModule === "./" |
|
) { |
|
return callback(); |
|
} |
|
if (this.options.forceRelative && !/^\.\.?\//.test(mainModule)) |
|
mainModule = "./" + mainModule; |
|
const obj = { |
|
...request, |
|
request: mainModule, |
|
module: false, |
|
directory: mainModule.endsWith("/"), |
|
[alreadyTriedMainField]: request.descriptionFilePath |
|
}; |
|
return resolver.doResolve( |
|
target, |
|
obj, |
|
"use " + |
|
mainModule + |
|
" from " + |
|
this.options.name + |
|
" in " + |
|
filename, |
|
resolveContext, |
|
callback |
|
); |
|
}); |
|
} |
|
};
|
|
|