1 | var assert = require('assert');
|
2 | var HappyRPCHandler = require('./HappyRPCHandler');
|
3 |
|
4 | function 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 |
|
31 |
|
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 |
|
48 | module.exports = HappyLoader;
|
49 |
|
50 | function isHappy(id) {
|
51 | return function(plugin) {
|
52 | return plugin.name === 'HappyPack' && plugin.id === id;
|
53 | };
|
54 | }
|
55 |
|
56 | function getId(queryString) {
|
57 | return (queryString.match(/id=([^!]+)/) || [0,'1'])[1];
|
58 | }
|