UNPKG

1.49 kBJavaScriptView Raw
1/*
2 MIT License http://www.opensource.org/licenses/mit-license.php
3 Author Tobias Koppers @sokra
4*/
5"use strict";
6
7const forEachBail = require("./forEachBail");
8const getPaths = require("./getPaths");
9
10module.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};