1 |
|
2 |
|
3 |
|
4 |
|
5 | var loaderUtils = require("loader-utils");
|
6 | var baseRegex = "\\s*[@#]\\s*sourceMappingURL=data:[^;\n]+;base64,([^\\s]*)",
|
7 |
|
8 | regex1 = new RegExp("/\\*"+baseRegex+"\\s*\\*/$"),
|
9 |
|
10 | regex2 = new RegExp("//"+baseRegex+".*$");
|
11 | module.exports = function(input) {
|
12 | if(!this.query) throw new Error("Pass a module name as query to the transform-loader.");
|
13 | var query = loaderUtils.getOptions(this) || {};
|
14 | var callback = this.async();
|
15 | var resource = this.resource;
|
16 | var loaderContext = this;
|
17 | var q = Object.keys(query)[0];
|
18 | if(/^[0-9]+$/.test(q)) {
|
19 | next(this.options.transforms[+q]);
|
20 | } else {
|
21 | this.resolve(this.context, q, function(err, module) {
|
22 | if(err) return callback(err);
|
23 | next(require(module));
|
24 | });
|
25 | }
|
26 | function next(transformFn) {
|
27 | var stream = transformFn(resource);
|
28 | var bufs = [];
|
29 | var done = false;
|
30 | stream.on("data", function(b) {
|
31 | bufs.push(Buffer.isBuffer(b) ? b : new Buffer(b));
|
32 | });
|
33 | stream.on("end", function() {
|
34 | if(done) return;
|
35 | var b = Buffer.concat(bufs).toString();
|
36 | var match = b.match(regex1) || b.match(regex2);
|
37 | try {
|
38 | var map = match && JSON.parse((new Buffer(match[1], "base64")).toString());
|
39 | } catch(e) {
|
40 | var map = null;
|
41 | }
|
42 | done = true;
|
43 | callback(null, map ? b.replace(match[0], "") : b, map);
|
44 | });
|
45 | stream.on("error", function(err) {
|
46 | if(done) return;
|
47 | done = true;
|
48 | callback(err);
|
49 | });
|
50 | stream.write(input);
|
51 | stream.end();
|
52 | }
|
53 | };
|
54 | module.exports.raw = true;
|