1 |
|
2 |
|
3 |
|
4 |
|
5 | "use strict";
|
6 |
|
7 | const DelegatedModule = require("./DelegatedModule");
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 | class DelegatedModuleFactoryPlugin {
|
15 | constructor(options) {
|
16 | this.options = options;
|
17 | options.type = options.type || "require";
|
18 | options.extensions = options.extensions || [
|
19 | "",
|
20 | ".wasm",
|
21 | ".mjs",
|
22 | ".js",
|
23 | ".json"
|
24 | ];
|
25 | }
|
26 |
|
27 | apply(normalModuleFactory) {
|
28 | const scope = this.options.scope;
|
29 | if (scope) {
|
30 | normalModuleFactory.hooks.factory.tap(
|
31 | "DelegatedModuleFactoryPlugin",
|
32 | factory => (data, callback) => {
|
33 | const dependency = data.dependencies[0];
|
34 | const request = dependency.request;
|
35 | if (request && request.indexOf(scope + "/") === 0) {
|
36 | const innerRequest = "." + request.substr(scope.length);
|
37 | let resolved;
|
38 | if (innerRequest in this.options.content) {
|
39 | resolved = this.options.content[innerRequest];
|
40 | return callback(
|
41 | null,
|
42 | new DelegatedModule(
|
43 | this.options.source,
|
44 | resolved,
|
45 | this.options.type,
|
46 | innerRequest,
|
47 | request
|
48 | )
|
49 | );
|
50 | }
|
51 | for (let i = 0; i < this.options.extensions.length; i++) {
|
52 | const extension = this.options.extensions[i];
|
53 | const requestPlusExt = innerRequest + extension;
|
54 | if (requestPlusExt in this.options.content) {
|
55 | resolved = this.options.content[requestPlusExt];
|
56 | return callback(
|
57 | null,
|
58 | new DelegatedModule(
|
59 | this.options.source,
|
60 | resolved,
|
61 | this.options.type,
|
62 | requestPlusExt,
|
63 | request + extension
|
64 | )
|
65 | );
|
66 | }
|
67 | }
|
68 | }
|
69 | return factory(data, callback);
|
70 | }
|
71 | );
|
72 | } else {
|
73 | normalModuleFactory.hooks.module.tap(
|
74 | "DelegatedModuleFactoryPlugin",
|
75 | module => {
|
76 | if (module.libIdent) {
|
77 | const request = module.libIdent(this.options);
|
78 | if (request && request in this.options.content) {
|
79 | const resolved = this.options.content[request];
|
80 | return new DelegatedModule(
|
81 | this.options.source,
|
82 | resolved,
|
83 | this.options.type,
|
84 | request,
|
85 | module
|
86 | );
|
87 | }
|
88 | }
|
89 | return module;
|
90 | }
|
91 | );
|
92 | }
|
93 | }
|
94 | }
|
95 | module.exports = DelegatedModuleFactoryPlugin;
|