1'use strict'; 2const path = require('path'); 3const Module = require('module'); 4const fs = require('fs'); 5 6const resolveFrom = (fromDir, moduleId, silent) => { 7 if (typeof fromDir !== 'string') { 8 throw new TypeError(`Expected \`fromDir\` to be of type \`string\`, got \`${typeof fromDir}\``); 9 } 10 11 if (typeof moduleId !== 'string') { 12 throw new TypeError(`Expected \`moduleId\` to be of type \`string\`, got \`${typeof moduleId}\``); 13 } 14 15 try { 16 fromDir = fs.realpathSync(fromDir); 17 } catch (err) { 18 if (err.code === 'ENOENT') { 19 fromDir = path.resolve(fromDir); 20 } else if (silent) { 21 return null; 22 } else { 23 throw err; 24 } 25 } 26 27 const fromFile = path.join(fromDir, 'noop.js'); 28 29 const resolveFileName = () => Module._resolveFilename(moduleId, { 30 id: fromFile, 31 filename: fromFile, 32 paths: Module._nodeModulePaths(fromDir) 33 }); 34 35 if (silent) { 36 try { 37 return resolveFileName(); 38 } catch (err) { 39 return null; 40 } 41 } 42 43 return resolveFileName(); 44}; 45 46module.exports = (fromDir, moduleId) => resolveFrom(fromDir, moduleId); 47module.exports.silent = (fromDir, moduleId) => resolveFrom(fromDir, moduleId, true); 48