UNPKG

1.55 kBJavaScriptView Raw
1/*
2 MIT License http://www.opensource.org/licenses/mit-license.php
3 Author Tobias Koppers @sokra
4*/
5"use strict";
6
7const path = require("path");
8
9module.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};