Blame view

天文台pc/tianwentai-ui/node_modules/enhanced-resolve/lib/RootsPlugin.js 1.62 KB
bc518174   王天杨   提交两个项目文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
  /*
  	MIT License http://www.opensource.org/licenses/mit-license.php
  	Author Ivan Kopeykin @vankop
  */
  
  "use strict";
  
  const forEachBail = require("./forEachBail");
  
  /** @typedef {import("./Resolver")} Resolver */
  /** @typedef {import("./Resolver").ResolveRequest} ResolveRequest */
  /** @typedef {import("./Resolver").ResolveStepHook} ResolveStepHook */
  
  class RootsPlugin {
  	/**
  	 * @param {string | ResolveStepHook} source source hook
  	 * @param {Set<string>} roots roots
  	 * @param {string | ResolveStepHook} target target hook
  	 */
  	constructor(source, roots, target) {
  		this.roots = [...roots];
  		this.source = source;
  		this.target = target;
  	}
  
  	/**
  	 * @param {Resolver} resolver the resolver
  	 * @returns {void}
  	 */
  	apply(resolver) {
  		const target = resolver.ensureHook(this.target);
  
  		resolver
  			.getHook(this.source)
  			.tapAsync("RootsPlugin", (request, resolveContext, callback) => {
  				const req = request.request;
  				if (!req) return callback();
  				if (!req.startsWith("/")) return callback();
  
  				forEachBail(
  					this.roots,
  					/**
  					 * @param {string} root root
  					 * @param {(err?: null | Error, result?: null | ResolveRequest) => void} callback callback
  					 * @returns {void}
  					 */
  					(root, callback) => {
  						const path = resolver.join(root, req.slice(1));
  						/** @type {ResolveRequest} */
  						const obj = {
  							...request,
  							path,
  							relativePath: request.relativePath && path,
  						};
  						resolver.doResolve(
  							target,
  							obj,
  							`root path ${root}`,
  							resolveContext,
  							callback,
  						);
  					},
  					callback,
  				);
  			});
  	}
  }
  
  module.exports = RootsPlugin;