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.
96 lines
2.5 KiB
96 lines
2.5 KiB
/* |
|
MIT License http://www.opensource.org/licenses/mit-license.php |
|
Author Tobias Koppers @sokra |
|
*/ |
|
|
|
"use strict"; |
|
|
|
const DescriptionFileUtils = require("./DescriptionFileUtils"); |
|
|
|
/** @typedef {import("./Resolver")} Resolver */ |
|
/** @typedef {import("./Resolver").ResolveStepHook} ResolveStepHook */ |
|
|
|
module.exports = class DescriptionFilePlugin { |
|
/** |
|
* @param {string | ResolveStepHook} source source |
|
* @param {string[]} filenames filenames |
|
* @param {boolean} pathIsFile pathIsFile |
|
* @param {string | ResolveStepHook} target target |
|
*/ |
|
constructor(source, filenames, pathIsFile, target) { |
|
this.source = source; |
|
this.filenames = filenames; |
|
this.pathIsFile = pathIsFile; |
|
this.target = target; |
|
} |
|
|
|
/** |
|
* @param {Resolver} resolver the resolver |
|
* @returns {void} |
|
*/ |
|
apply(resolver) { |
|
const target = resolver.ensureHook(this.target); |
|
resolver |
|
.getHook(this.source) |
|
.tapAsync( |
|
"DescriptionFilePlugin", |
|
(request, resolveContext, callback) => { |
|
const path = request.path; |
|
if (!path) return callback(); |
|
const directory = this.pathIsFile |
|
? DescriptionFileUtils.cdUp(path) |
|
: path; |
|
if (!directory) return callback(); |
|
DescriptionFileUtils.loadDescriptionFile( |
|
resolver, |
|
directory, |
|
this.filenames, |
|
request.descriptionFilePath |
|
? { |
|
path: request.descriptionFilePath, |
|
content: request.descriptionFileData, |
|
directory: /** @type {string} */ (request.descriptionFileRoot) |
|
} |
|
: undefined, |
|
resolveContext, |
|
(err, result) => { |
|
if (err) return callback(err); |
|
if (!result) { |
|
if (resolveContext.log) |
|
resolveContext.log( |
|
`No description file found in ${directory} or above` |
|
); |
|
return callback(); |
|
} |
|
const relativePath = |
|
"." + path.substr(result.directory.length).replace(/\\/g, "/"); |
|
const obj = { |
|
...request, |
|
descriptionFilePath: result.path, |
|
descriptionFileData: result.content, |
|
descriptionFileRoot: result.directory, |
|
relativePath: relativePath |
|
}; |
|
resolver.doResolve( |
|
target, |
|
obj, |
|
"using description file: " + |
|
result.path + |
|
" (relative path: " + |
|
relativePath + |
|
")", |
|
resolveContext, |
|
(err, result) => { |
|
if (err) return callback(err); |
|
|
|
// Don't allow other processing |
|
if (result === undefined) return callback(null, null); |
|
callback(null, result); |
|
} |
|
); |
|
} |
|
); |
|
} |
|
); |
|
} |
|
};
|
|
|