1 |
|
2 |
|
3 |
|
4 |
|
5 | "use strict";
|
6 |
|
7 | const forEachBail = require("./forEachBail");
|
8 | const getPaths = require("./getPaths");
|
9 |
|
10 | module.exports = class ModulesInHierachicDirectoriesPlugin {
|
11 | constructor(source, directories, target) {
|
12 | this.source = source;
|
13 | this.directories = [].concat(directories);
|
14 | this.target = target;
|
15 | }
|
16 |
|
17 | apply(resolver) {
|
18 | const target = resolver.ensureHook(this.target);
|
19 | resolver.getHook(this.source).tapAsync("ModulesInHierachicDirectoriesPlugin", (request, resolveContext, callback) => {
|
20 | const fs = resolver.fileSystem;
|
21 | const addrs = getPaths(request.path).paths.map(p => {
|
22 | return this.directories.map(d => resolver.join(p, d));
|
23 | }).reduce((array, p) => {
|
24 | array.push.apply(array, p);
|
25 | return array;
|
26 | }, []);
|
27 | forEachBail(addrs, (addr, callback) => {
|
28 | fs.stat(addr, (err, stat) => {
|
29 | if(!err && stat && stat.isDirectory()) {
|
30 | const obj = Object.assign({}, request, {
|
31 | path: addr,
|
32 | request: "./" + request.request
|
33 | });
|
34 | const message = "looking for modules in " + addr;
|
35 | return resolver.doResolve(target, obj, message, resolveContext, callback);
|
36 | }
|
37 | if(resolveContext.log) resolveContext.log(addr + " doesn't exist or is not a directory");
|
38 | if(resolveContext.missing) resolveContext.missing.add(addr);
|
39 | return callback();
|
40 | });
|
41 | }, callback);
|
42 | });
|
43 | }
|
44 | };
|