|
2 | 2 | MIT License http://www.opensource.org/licenses/mit-license.php |
3 | 3 | Author Tobias Koppers @sokra |
4 | 4 | */ |
5 | | -var asyncLib = require("async"); |
6 | | -var path = require("path"); |
7 | | - |
8 | | -var Tapable = require("tapable"); |
9 | | -var ContextModule = require("./ContextModule"); |
10 | | -var ContextElementDependency = require("./dependencies/ContextElementDependency"); |
11 | | - |
12 | | -function ContextModuleFactory(resolvers) { |
13 | | - Tapable.call(this); |
14 | | - this.resolvers = resolvers; |
15 | | -} |
16 | | -module.exports = ContextModuleFactory; |
17 | | - |
18 | | -ContextModuleFactory.prototype = Object.create(Tapable.prototype); |
19 | | -ContextModuleFactory.prototype.constructor = ContextModuleFactory; |
20 | | - |
21 | | -ContextModuleFactory.prototype.create = function(data, callback) { |
22 | | - var module = this; |
23 | | - var context = data.context; |
24 | | - var dependencies = data.dependencies; |
25 | | - var dependency = dependencies[0]; |
26 | | - this.applyPluginsAsyncWaterfall("before-resolve", { |
27 | | - context: context, |
28 | | - request: dependency.request, |
29 | | - recursive: dependency.recursive, |
30 | | - regExp: dependency.regExp, |
31 | | - async: dependency.async, |
32 | | - dependencies: dependencies |
33 | | - }, function(err, result) { |
34 | | - if(err) return callback(err); |
35 | | - |
36 | | - // Ignored |
37 | | - if(!result) return callback(); |
38 | | - |
39 | | - var context = result.context; |
40 | | - var request = result.request; |
41 | | - var recursive = result.recursive; |
42 | | - var regExp = result.regExp; |
43 | | - var asyncContext = result.async; |
44 | | - var dependencies = result.dependencies; |
45 | | - |
46 | | - var loaders, resource, loadersPrefix = ""; |
47 | | - var idx = request.lastIndexOf("!"); |
48 | | - if(idx >= 0) { |
49 | | - loaders = request.substr(0, idx + 1); |
50 | | - for(var i = 0; i < loaders.length && loaders[i] === "!"; i++) { |
51 | | - loadersPrefix += "!"; |
| 5 | +"use strict"; |
| 6 | + |
| 7 | +const asyncLib = require("async"); |
| 8 | +const path = require("path"); |
| 9 | + |
| 10 | +const Tapable = require("tapable"); |
| 11 | +const ContextModule = require("./ContextModule"); |
| 12 | +const ContextElementDependency = require("./dependencies/ContextElementDependency"); |
| 13 | + |
| 14 | +module.exports = class ContextModuleFactory extends Tapable { |
| 15 | + constructor(resolvers) { |
| 16 | + super(); |
| 17 | + this.resolvers = resolvers; |
| 18 | + } |
| 19 | + |
| 20 | + create(data, callback) { |
| 21 | + const module = this; |
| 22 | + const context = data.context; |
| 23 | + const dependencies = data.dependencies; |
| 24 | + const dependency = dependencies[0]; |
| 25 | + this.applyPluginsAsyncWaterfall("before-resolve", { |
| 26 | + context: context, |
| 27 | + request: dependency.request, |
| 28 | + recursive: dependency.recursive, |
| 29 | + regExp: dependency.regExp, |
| 30 | + async: dependency.async, |
| 31 | + dependencies: dependencies |
| 32 | + }, (err, result) => { |
| 33 | + if(err) return callback(err); |
| 34 | + |
| 35 | + // Ignored |
| 36 | + if(!result) return callback(); |
| 37 | + |
| 38 | + const context = result.context; |
| 39 | + const request = result.request; |
| 40 | + const recursive = result.recursive; |
| 41 | + const regExp = result.regExp; |
| 42 | + const asyncContext = result.async; |
| 43 | + const dependencies = result.dependencies; |
| 44 | + |
| 45 | + let loaders, resource, loadersPrefix = ""; |
| 46 | + const idx = request.lastIndexOf("!"); |
| 47 | + if(idx >= 0) { |
| 48 | + loaders = request.substr(0, idx + 1); |
| 49 | + let i; |
| 50 | + for(i = 0; i < loaders.length && loaders[i] === "!"; i++) { |
| 51 | + loadersPrefix += "!"; |
| 52 | + } |
| 53 | + loaders = loaders.substr(i).replace(/!+$/, "").replace(/!!+/g, "!"); |
| 54 | + if(loaders === "") loaders = []; |
| 55 | + else loaders = loaders.split("!"); |
| 56 | + resource = request.substr(idx + 1); |
| 57 | + } else { |
| 58 | + loaders = []; |
| 59 | + resource = request; |
52 | 60 | } |
53 | | - loaders = loaders.substr(i).replace(/!+$/, "").replace(/!!+/g, "!"); |
54 | | - if(loaders === "") loaders = []; |
55 | | - else loaders = loaders.split("!"); |
56 | | - resource = request.substr(idx + 1); |
57 | | - } else { |
58 | | - loaders = []; |
59 | | - resource = request; |
60 | | - } |
61 | | - |
62 | | - var resolvers = module.resolvers; |
63 | | - |
64 | | - asyncLib.parallel([ |
65 | | - function(callback) { |
66 | | - resolvers.context.resolve({}, context, resource, function(err, result) { |
67 | | - if(err) return callback(err); |
68 | | - callback(null, result); |
69 | | - }); |
70 | | - }, |
71 | | - function(callback) { |
72 | | - asyncLib.map(loaders, function(loader, callback) { |
73 | | - resolvers.loader.resolve({}, context, loader, function(err, result) { |
| 61 | + |
| 62 | + const resolvers = module.resolvers; |
| 63 | + |
| 64 | + asyncLib.parallel([ |
| 65 | + function(callback) { |
| 66 | + resolvers.context.resolve({}, context, resource, function(err, result) { |
74 | 67 | if(err) return callback(err); |
75 | 68 | callback(null, result); |
76 | 69 | }); |
77 | | - }, callback); |
78 | | - } |
79 | | - ], function(err, result) { |
80 | | - if(err) return callback(err); |
81 | | - |
82 | | - module.applyPluginsAsyncWaterfall("after-resolve", { |
83 | | - loaders: loadersPrefix + result[1].join("!") + (result[1].length > 0 ? "!" : ""), |
84 | | - resource: result[0], |
85 | | - recursive: recursive, |
86 | | - regExp: regExp, |
87 | | - async: asyncContext, |
88 | | - dependencies: dependencies, |
89 | | - resolveDependencies: module.resolveDependencies.bind(module) |
90 | | - }, function(err, result) { |
| 70 | + }, |
| 71 | + function(callback) { |
| 72 | + asyncLib.map(loaders, function(loader, callback) { |
| 73 | + resolvers.loader.resolve({}, context, loader, function(err, result) { |
| 74 | + if(err) return callback(err); |
| 75 | + callback(null, result); |
| 76 | + }); |
| 77 | + }, callback); |
| 78 | + } |
| 79 | + ], (err, result) => { |
91 | 80 | if(err) return callback(err); |
92 | 81 |
|
93 | | - // Ignored |
94 | | - if(!result) return callback(); |
| 82 | + module.applyPluginsAsyncWaterfall("after-resolve", { |
| 83 | + loaders: loadersPrefix + result[1].join("!") + (result[1].length > 0 ? "!" : ""), |
| 84 | + resource: result[0], |
| 85 | + recursive: recursive, |
| 86 | + regExp: regExp, |
| 87 | + async: asyncContext, |
| 88 | + dependencies: dependencies, |
| 89 | + resolveDependencies: module.resolveDependencies.bind(module) |
| 90 | + }, function(err, result) { |
| 91 | + if(err) return callback(err); |
| 92 | + |
| 93 | + // Ignored |
| 94 | + if(!result) return callback(); |
95 | 95 |
|
96 | | - return callback(null, new ContextModule(result.resolveDependencies, result.resource, result.recursive, result.regExp, result.loaders, result.async, dependency.chunkName)); |
| 96 | + return callback(null, new ContextModule(result.resolveDependencies, result.resource, result.recursive, result.regExp, result.loaders, result.async, dependency.chunkName)); |
| 97 | + }); |
97 | 98 | }); |
98 | 99 | }); |
99 | | - }); |
100 | | -}; |
| 100 | + } |
101 | 101 |
|
102 | | -ContextModuleFactory.prototype.resolveDependencies = function resolveDependencies(fs, resource, recursive, regExp, callback) { |
103 | | - if(!regExp || !resource) |
104 | | - return callback(null, []); |
105 | | - (function addDirectory(directory, callback) { |
106 | | - fs.readdir(directory, function(err, files) { |
107 | | - if(err) return callback(err); |
108 | | - if(!files || files.length === 0) return callback(null, []); |
109 | | - asyncLib.map(files.filter(function(p) { |
110 | | - return p.indexOf(".") !== 0; |
111 | | - }), function(seqment, callback) { |
| 102 | + resolveDependencies(fs, resource, recursive, regExp, callback) { |
| 103 | + if(!regExp || !resource) |
| 104 | + return callback(null, []); |
| 105 | + (function addDirectory(directory, callback) { |
| 106 | + fs.readdir(directory, function(err, files) { |
| 107 | + if(err) return callback(err); |
| 108 | + if(!files || files.length === 0) return callback(null, []); |
| 109 | + asyncLib.map(files.filter(function(p) { |
| 110 | + return p.indexOf(".") !== 0; |
| 111 | + }), function(seqment, callback) { |
112 | 112 |
|
113 | | - var subResource = path.join(directory, seqment); |
| 113 | + const subResource = path.join(directory, seqment); |
114 | 114 |
|
115 | | - fs.stat(subResource, function(err, stat) { |
116 | | - if(err) return callback(err); |
| 115 | + fs.stat(subResource, function(err, stat) { |
| 116 | + if(err) return callback(err); |
117 | 117 |
|
118 | | - if(stat.isDirectory()) { |
| 118 | + if(stat.isDirectory()) { |
119 | 119 |
|
120 | | - if(!recursive) return callback(); |
121 | | - addDirectory.call(this, subResource, callback); |
| 120 | + if(!recursive) return callback(); |
| 121 | + addDirectory.call(this, subResource, callback); |
122 | 122 |
|
123 | | - } else if(stat.isFile()) { |
| 123 | + } else if(stat.isFile()) { |
124 | 124 |
|
125 | | - var obj = { |
126 | | - context: resource, |
127 | | - request: "." + subResource.substr(resource.length).replace(/\\/g, "/") |
128 | | - }; |
| 125 | + const obj = { |
| 126 | + context: resource, |
| 127 | + request: "." + subResource.substr(resource.length).replace(/\\/g, "/") |
| 128 | + }; |
129 | 129 |
|
130 | | - this.applyPluginsAsyncWaterfall("alternatives", [obj], function(err, alternatives) { |
131 | | - if(err) return callback(err); |
132 | | - alternatives = alternatives.filter(function(obj) { |
133 | | - return regExp.test(obj.request); |
134 | | - }).map(function(obj) { |
135 | | - var dep = new ContextElementDependency(obj.request); |
136 | | - dep.optional = true; |
137 | | - return dep; |
| 130 | + this.applyPluginsAsyncWaterfall("alternatives", [obj], (err, alternatives) => { |
| 131 | + if(err) return callback(err); |
| 132 | + alternatives = alternatives.filter(function(obj) { |
| 133 | + return regExp.test(obj.request); |
| 134 | + }).map(function(obj) { |
| 135 | + const dep = new ContextElementDependency(obj.request); |
| 136 | + dep.optional = true; |
| 137 | + return dep; |
| 138 | + }); |
| 139 | + callback(null, alternatives); |
138 | 140 | }); |
139 | | - callback(null, alternatives); |
140 | | - }); |
141 | 141 |
|
142 | | - } else callback(); |
| 142 | + } else callback(); |
143 | 143 |
|
144 | | - }.bind(this)); |
| 144 | + }.bind(this)); |
145 | 145 |
|
146 | | - }.bind(this), function(err, result) { |
147 | | - if(err) return callback(err); |
| 146 | + }.bind(this), (err, result) => { |
| 147 | + if(err) return callback(err); |
148 | 148 |
|
149 | | - if(!result) return callback(null, []); |
| 149 | + if(!result) return callback(null, []); |
150 | 150 |
|
151 | | - callback(null, result.filter(function(i) { |
152 | | - return !!i; |
153 | | - }).reduce(function(a, i) { |
154 | | - return a.concat(i); |
155 | | - }, [])); |
156 | | - }); |
157 | | - }.bind(this)); |
158 | | - }.call(this, resource, callback)); |
| 151 | + callback(null, result.filter(function(i) { |
| 152 | + return !!i; |
| 153 | + }).reduce(function(a, i) { |
| 154 | + return a.concat(i); |
| 155 | + }, [])); |
| 156 | + }); |
| 157 | + }.bind(this)); |
| 158 | + }.call(this, resource, callback)); |
| 159 | + } |
159 | 160 | }; |
0 commit comments