|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
"use strict"; |
|
|
|
|
|
const DescriptionFileUtils = require("./DescriptionFileUtils"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
module.exports = class DescriptionFilePlugin { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
constructor(source, filenames, pathIsFile, target) { |
|
|
this.source = source; |
|
|
this.filenames = filenames; |
|
|
this.pathIsFile = pathIsFile; |
|
|
this.target = target; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
apply(resolver) { |
|
|
const target = resolver.ensureHook(this.target); |
|
|
resolver |
|
|
.getHook(this.source) |
|
|
.tapAsync( |
|
|
"DescriptionFilePlugin", |
|
|
(request, resolveContext, callback) => { |
|
|
const { path } = request; |
|
|
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: |
|
|
|
|
|
(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 |
|
|
.slice(result.directory.length) |
|
|
.replace(/\\/g, "/")}`; |
|
|
|
|
|
const obj = { |
|
|
...request, |
|
|
descriptionFilePath: result.path, |
|
|
descriptionFileData: result.content, |
|
|
descriptionFileRoot: result.directory, |
|
|
relativePath, |
|
|
}; |
|
|
resolver.doResolve( |
|
|
target, |
|
|
obj, |
|
|
`using description file: ${result.path} (relative path: ${relativePath})`, |
|
|
resolveContext, |
|
|
(err, result) => { |
|
|
if (err) return callback(err); |
|
|
|
|
|
|
|
|
if (result === undefined) return callback(null, null); |
|
|
callback(null, result); |
|
|
}, |
|
|
); |
|
|
}, |
|
|
); |
|
|
}, |
|
|
); |
|
|
} |
|
|
}; |
|
|
|