Skip to content

Commit a29a823

Browse files
committed
added loader support
1 parent be306cf commit a29a823

19 files changed

Lines changed: 505 additions & 140 deletions

lib/buildDeps.js

Lines changed: 130 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -77,108 +77,147 @@ function addModule(depTree, context, module, options, reason, callback) {
7777
reasons: [reason]
7878
};
7979
depTree.modulesById[module.id] = module;
80-
fs.readFile(filename, "utf-8", function(err, source) {
80+
var filenameWithLoaders = filename;
81+
var loaders = filename.split(/!/g);
82+
filename = loaders.pop();
83+
fs.readFile(filename, "utf-8", function(err, content) {
8184
if(err) {
8285
callback(err);
8386
return;
8487
}
85-
var deps;
86-
try {
87-
deps = parse(source, options.parse);
88-
} catch(e) {
89-
callback("File \"" + filename + "\" parsing failed: " + e);
90-
return;
88+
if(loaders.length === 0)
89+
processJs(content);
90+
else {
91+
var loaderFunctions = [];
92+
try {
93+
loaders.forEach(function(name) {
94+
var loader = require(name);
95+
loaderFunctions.push(loader);
96+
});
97+
} catch(e) {
98+
callback(e);
99+
return;
100+
}
101+
function nextLoader(err, content) {
102+
if(err) {
103+
callback(err);
104+
return;
105+
}
106+
if(loaderFunctions.length > 0) {
107+
try {
108+
loaderFunctions.pop()([content], {
109+
request: filenameWithLoaders,
110+
filename: filename
111+
}, nextLoader);
112+
} catch(e) {
113+
callback(err);
114+
return;
115+
}
116+
} else {
117+
processJs(content);
118+
}
119+
}
120+
nextLoader(null, content);
91121
}
92-
module.requires = deps.requires || [];
93-
module.asyncs = deps.asyncs || [];
94-
module.contexts = deps.contexts || [];
95-
module.source = source;
122+
function processJs(source) {
123+
var deps;
124+
try {
125+
deps = parse(source, options.parse);
126+
} catch(e) {
127+
callback("File \"" + filenameWithLoaders + "\" parsing failed: " + e);
128+
return;
129+
}
130+
module.requires = deps.requires || [];
131+
module.asyncs = deps.asyncs || [];
132+
module.contexts = deps.contexts || [];
133+
module.source = source;
96134

97-
var requires = {}, directRequire = {};
98-
var contexts = [], directContexts = {};
99-
function add(r) {
100-
requires[r.name] = requires[r.name] || [];
101-
requires[r.name].push(r);
102-
}
103-
function addContext(m) {
104-
return function(c) {
105-
contexts.push({context: c, module: m});
135+
var requires = {}, directRequire = {};
136+
var contexts = [], directContexts = {};
137+
function add(r) {
138+
requires[r.name] = requires[r.name] || [];
139+
requires[r.name].push(r);
106140
}
107-
}
108-
if(module.requires) {
109-
module.requires.forEach(add);
110-
module.requires.forEach(function(r) {
111-
directRequire[r.name] = true;
112-
});
113-
}
114-
if(module.contexts) {
115-
module.contexts.forEach(addContext(module));
116-
module.contexts.forEach(function(c) {
117-
directContexts[c.name] = true;
118-
});
119-
}
120-
if(module.asyncs)
121-
module.asyncs.forEach(function addAsync(c) {
122-
if(c.requires)
123-
c.requires.forEach(add);
124-
if(c.asyncs)
125-
c.asyncs.forEach(addAsync);
126-
if(c.contexts)
127-
c.contexts.forEach(addContext(c));
128-
});
129-
requiresNames = Object.keys(requires);
130-
var count = requiresNames.length + contexts.length + 1;
131-
var errors = [];
132-
if(requiresNames.length)
133-
requiresNames.forEach(function(moduleName) {
134-
var reason = {
135-
type: directRequire[moduleName] ? "require" : "async require",
136-
count: requires[moduleName].length,
137-
filename: filename
138-
};
139-
addModule(depTree, path.dirname(filename), moduleName, options, reason, function(err, moduleId) {
140-
if(err) {
141-
depTree.warnings.push("Cannot find module '" + moduleName + "'\n " + err +
142-
"\n @ " + filename + " (line " + requires[moduleName][0].line + ", column " + requires[moduleName][0].column + ")");
143-
} else {
144-
requires[moduleName].forEach(function(requireItem) {
145-
requireItem.id = moduleId;
146-
});
141+
function addContext(m) {
142+
return function(c) {
143+
contexts.push({context: c, module: m});
144+
}
145+
}
146+
if(module.requires) {
147+
module.requires.forEach(add);
148+
module.requires.forEach(function(r) {
149+
directRequire[r.name] = true;
150+
});
151+
}
152+
if(module.contexts) {
153+
module.contexts.forEach(addContext(module));
154+
module.contexts.forEach(function(c) {
155+
directContexts[c.name] = true;
156+
});
157+
}
158+
if(module.asyncs)
159+
module.asyncs.forEach(function addAsync(c) {
160+
if(c.requires)
161+
c.requires.forEach(add);
162+
if(c.asyncs)
163+
c.asyncs.forEach(addAsync);
164+
if(c.contexts)
165+
c.contexts.forEach(addContext(c));
166+
});
167+
requiresNames = Object.keys(requires);
168+
var count = requiresNames.length + contexts.length + 1;
169+
var errors = [];
170+
if(requiresNames.length)
171+
requiresNames.forEach(function(moduleName) {
172+
var reason = {
173+
type: directRequire[moduleName] ? "require" : "async require",
174+
count: requires[moduleName].length,
175+
filename: filename
176+
};
177+
addModule(depTree, path.dirname(filename), moduleName, options, reason, function(err, moduleId) {
178+
if(err) {
179+
depTree.warnings.push("Cannot find module '" + moduleName + "'\n " + err +
180+
"\n @ " + filename + " (line " + requires[moduleName][0].line + ", column " + requires[moduleName][0].column + ")");
181+
} else {
182+
requires[moduleName].forEach(function(requireItem) {
183+
requireItem.id = moduleId;
184+
});
185+
}
186+
endOne();
187+
});
188+
});
189+
if(contexts) {
190+
contexts.forEach(function(contextObj) {
191+
var context = contextObj.context;
192+
var module = contextObj.module;
193+
var reason = {
194+
type: directContexts[context.name] ? "context" : "async context",
195+
filename: filename
196+
};
197+
addContextModule(depTree, path.dirname(filename), context.name, options, reason, function(err, contextModuleId) {
198+
if(err) {
199+
errors.push(err+"\n @ " + filename + " (line " + context.line + ", column " + context.column + ")");
200+
} else {
201+
context.id = contextModuleId;
202+
module.requires.push({id: context.id});
203+
}
204+
endOne();
205+
});
206+
if(context.warn) {
207+
depTree.warnings.push(filename + " (line " + context.line + ", column " + context.column + "): " +
208+
"implicit use of require.context(\".\") is not recommended.");
147209
}
148-
endOne();
149210
});
150-
});
151-
if(contexts) {
152-
contexts.forEach(function(contextObj) {
153-
var context = contextObj.context;
154-
var module = contextObj.module;
155-
var reason = {
156-
type: directContexts[context.name] ? "context" : "async context",
157-
filename: filename
158-
};
159-
addContextModule(depTree, path.dirname(filename), context.name, options, reason, function(err, contextModuleId) {
160-
if(err) {
161-
errors.push(err+"\n @ " + filename + " (line " + context.line + ", column " + context.column + ")");
211+
}
212+
endOne();
213+
function endOne() {
214+
count--;
215+
if(count === 0) {
216+
if(errors.length) {
217+
callback(errors.join("\n"));
162218
} else {
163-
context.id = contextModuleId;
164-
module.requires.push({id: context.id});
219+
callback(null, module.id);
165220
}
166-
endOne();
167-
});
168-
if(context.warn) {
169-
depTree.warnings.push(filename + " (line " + context.line + ", column " + context.column + "): " +
170-
"implicit use of require.context(\".\") is not recommended.");
171-
}
172-
});
173-
}
174-
endOne();
175-
function endOne() {
176-
count--;
177-
if(count === 0) {
178-
if(errors.length) {
179-
callback(errors.join("\n"));
180-
} else {
181-
callback(null, module.id);
182221
}
183222
}
184223
}

0 commit comments

Comments
 (0)