| |
| |
| |
| |
| |
| "use strict"; |
|
|
| |
| |
| |
|
|
| module.exports = class ParsePlugin { |
| |
| |
| |
| |
| |
| constructor(source, requestOptions, target) { |
| this.source = source; |
| this.requestOptions = requestOptions; |
| this.target = target; |
| } |
|
|
| |
| |
| |
| |
| apply(resolver) { |
| const target = resolver.ensureHook(this.target); |
| resolver |
| .getHook(this.source) |
| .tapAsync("ParsePlugin", (request, resolveContext, callback) => { |
| const parsed = resolver.parse( (request.request)); |
| |
| const obj = { ...request, ...parsed, ...this.requestOptions }; |
| if (request.query && !parsed.query) { |
| obj.query = request.query; |
| } |
| if (request.fragment && !parsed.fragment) { |
| obj.fragment = request.fragment; |
| } |
| if (parsed && resolveContext.log) { |
| if (parsed.module) resolveContext.log("Parsed request is a module"); |
| if (parsed.directory) { |
| resolveContext.log("Parsed request is a directory"); |
| } |
| } |
| |
| if (obj.request && !obj.query && obj.fragment) { |
| const directory = obj.fragment.endsWith("/"); |
| |
| const alternative = { |
| ...obj, |
| directory, |
| request: |
| obj.request + |
| (obj.directory ? "/" : "") + |
| (directory ? obj.fragment.slice(0, -1) : obj.fragment), |
| fragment: "", |
| }; |
| resolver.doResolve( |
| target, |
| alternative, |
| null, |
| resolveContext, |
| (err, result) => { |
| if (err) return callback(err); |
| if (result) return callback(null, result); |
| resolver.doResolve(target, obj, null, resolveContext, callback); |
| }, |
| ); |
| return; |
| } |
| resolver.doResolve(target, obj, null, resolveContext, callback); |
| }); |
| } |
| }; |
|
|