| |
| |
| |
| |
| |
| "use strict"; |
|
|
| const DescriptionFileUtils = require("./DescriptionFileUtils"); |
| const getInnerRequest = require("./getInnerRequest"); |
|
|
| |
| |
| |
| |
|
|
| module.exports = class AliasFieldPlugin { |
| |
| |
| |
| |
| |
| constructor(source, field, target) { |
| this.source = source; |
| this.field = field; |
| this.target = target; |
| } |
|
|
| |
| |
| |
| |
| apply(resolver) { |
| const target = resolver.ensureHook(this.target); |
| resolver |
| .getHook(this.source) |
| .tapAsync("AliasFieldPlugin", (request, resolveContext, callback) => { |
| if (!request.descriptionFileData) return callback(); |
| const innerRequest = getInnerRequest(resolver, request); |
| if (!innerRequest) return callback(); |
| const fieldData = DescriptionFileUtils.getField( |
| request.descriptionFileData, |
| this.field, |
| ); |
| if (fieldData === null || typeof fieldData !== "object") { |
| if (resolveContext.log) { |
| resolveContext.log( |
| `Field '${this.field}' doesn't contain a valid alias configuration`, |
| ); |
| } |
| return callback(); |
| } |
| |
| const data = Object.prototype.hasOwnProperty.call( |
| fieldData, |
| innerRequest, |
| ) |
| ? (fieldData)[ |
| innerRequest |
| ] |
| : innerRequest.startsWith("./") |
| ? (fieldData)[ |
| innerRequest.slice(2) |
| ] |
| : undefined; |
| if (data === innerRequest) return callback(); |
| if (data === undefined) return callback(); |
| if (data === false) { |
| |
| const ignoreObj = { |
| ...request, |
| path: false, |
| }; |
| if (typeof resolveContext.yield === "function") { |
| resolveContext.yield(ignoreObj); |
| return callback(null, null); |
| } |
| return callback(null, ignoreObj); |
| } |
| |
| const obj = { |
| ...request, |
| path: (request.descriptionFileRoot), |
| request: (data), |
| fullySpecified: false, |
| }; |
| resolver.doResolve( |
| target, |
| obj, |
| `aliased from description file ${ |
| request.descriptionFilePath |
| } with mapping '${innerRequest}' to '${/** @type {string} */ data}'`, |
| resolveContext, |
| (err, result) => { |
| if (err) return callback(err); |
|
|
| |
| if (result === undefined) return callback(null, null); |
| callback(null, result); |
| }, |
| ); |
| }); |
| } |
| }; |
|
|