UNPKG

1.59 kBJavaScriptView Raw
1var assert = require('assert');
2var HappyRPCHandler = require('./HappyRPCHandler');
3
4function HappyLoader(sourceCode, sourceMap) {
5 var callback = this.async();
6 var id = getId(this.query);
7 var remoteLoaderId = [ id, this.resource ].join(':');
8 var happyPlugin;
9
10 assert(callback, "HappyPack only works when asynchronous loaders are allowed!");
11
12 this.cacheable();
13
14 happyPlugin = this.options.plugins.filter(isHappy(id))[0];
15
16 assert(!!happyPlugin,
17 "HappyPack: plugin for the loader '" + id + "' could not be found! " +
18 "Did you forget to add it to the plugin list?"
19 );
20
21 HappyRPCHandler.registerActiveLoader(remoteLoaderId, this);
22
23 happyPlugin.compile({
24 remoteLoaderId: remoteLoaderId,
25 sourceCode: sourceCode,
26 sourceMap: sourceMap,
27
28 useSourceMap: this._module.useSourceMap,
29
30 // TODO: maybe too much data being pushed down the drain here? we can infer
31 // all of this from `this.request`
32 context: this.context,
33 request: happyPlugin.generateRequest(this.resource),
34 resource: this.resource,
35 resourcePath: this.resourcePath,
36 resourceQuery: this.resourceQuery,
37 }, function(err, outSourceCode, outSourceMap) {
38 HappyRPCHandler.unregisterActiveLoader(remoteLoaderId);
39
40 if (err) {
41 return callback(new Error(err));
42 }
43
44 callback(null, outSourceCode, outSourceMap);
45 });
46}
47
48module.exports = HappyLoader;
49
50function isHappy(id) {
51 return function(plugin) {
52 return plugin.name === 'HappyPack' && plugin.id === id;
53 };
54}
55
56function getId(queryString) {
57 return (queryString.match(/id=([^!]+)/) || [0,'1'])[1];
58}