1 |
|
2 |
|
3 |
|
4 |
|
5 | "use strict";
|
6 |
|
7 | const path = require("path");
|
8 |
|
9 | module.exports = class MainFieldPlugin {
|
10 | constructor(source, options, target) {
|
11 | this.source = source;
|
12 | this.options = options;
|
13 | this.target = target;
|
14 | }
|
15 |
|
16 | apply(resolver) {
|
17 | const target = resolver.ensureHook(this.target);
|
18 | resolver.getHook(this.source).tapAsync("MainFieldPlugin", (request, resolveContext, callback) => {
|
19 | if(request.path !== request.descriptionFileRoot) return callback();
|
20 | const content = request.descriptionFileData;
|
21 | const filename = path.basename(request.descriptionFilePath);
|
22 | let mainModule;
|
23 | const field = this.options.name;
|
24 | if(Array.isArray(field)) {
|
25 | let current = content;
|
26 | for(let j = 0; j < field.length; j++) {
|
27 | if(current === null || typeof current !== "object") {
|
28 | current = null;
|
29 | break;
|
30 | }
|
31 | current = current[field[j]];
|
32 | }
|
33 | if(typeof current === "string") {
|
34 | mainModule = current;
|
35 | }
|
36 | } else {
|
37 | if(typeof content[field] === "string") {
|
38 | mainModule = content[field];
|
39 | }
|
40 | }
|
41 | if(!mainModule) return callback();
|
42 | if(this.options.forceRelative && !/^\.\.?\//.test(mainModule))
|
43 | mainModule = "./" + mainModule;
|
44 | const obj = Object.assign({}, request, {
|
45 | request: mainModule
|
46 | });
|
47 | return resolver.doResolve(target, obj, "use " + mainModule + " from " + this.options.name + " in " + filename, resolveContext, callback);
|
48 | });
|
49 | }
|
50 | };
|