/* MIT License http://www.opensource.org/licenses/mit-license.php Author Tobias Koppers @sokra */ "use strict"; const path = require("path"); module.exports = class MainFieldPlugin { constructor(source, options, target) { this.source = source; this.options = options; this.target = target; } apply(resolver) { const target = resolver.ensureHook(this.target); resolver.getHook(this.source).tapAsync("MainFieldPlugin", (request, resolveContext, callback) => { if(request.path !== request.descriptionFileRoot) return callback(); if(request.alreadyTriedMainField === request.descriptionFilePath) return callback(); const content = request.descriptionFileData; const filename = path.basename(request.descriptionFilePath); let mainModule; const field = this.options.name; if(Array.isArray(field)) { let current = content; for(let j = 0; j < field.length; j++) { if(current === null || typeof current !== "object") { current = null; break; } current = current[field[j]]; } if(typeof current === "string") { mainModule = current; } } else { if(typeof content[field] === "string") { mainModule = content[field]; } } if(!mainModule) return callback(); if(this.options.forceRelative && !/^\.\.?\//.test(mainModule)) mainModule = "./" + mainModule; const obj = Object.assign({}, request, { request: mainModule, alreadyTriedMainField: request.descriptionFilePath }); return resolver.doResolve(target, obj, "use " + mainModule + " from " + this.options.name + " in " + filename, resolveContext, callback); }); } };