| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 | /*	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);								}							);						}					);				}			);	}};
 |