import path from 'path'; import { WufError, ErrorKind } from '../errors'; const supportedExtensions = ['.js', '.jsx', '.ts', '.tsx']; const makeResolvableFiles = (modulePath: string): string[] => { const basename = path.basename(modulePath); return [ ...supportedExtensions.map((ext) => `index${ext}`), ...supportedExtensions.map((ext) => `${basename}${ext}`), ]; }; const requireResolve = async (p: string): Promise => new Promise((resolve, reject) => { try { resolve(require.resolve(p)); } catch (e) { reject(e); } }); const invert = (promise: Promise): Promise => new Promise((resolve, reject) => promise.then(reject).catch(resolve)); const first = (promises: Promise[]): Promise => invert(Promise.all(promises.map(invert))); export const resolveRequire = async (modulePath: string): Promise => { if (!modulePath) { throw new WufError({ name: 'ResolveRequire', kind: ErrorKind.UserError, message: 'missing required path argument', }); } try { return require.resolve(modulePath); } catch (e) { return first( makeResolvableFiles(modulePath).map((p: string) => requireResolve(path.join(modulePath, p)), ), ); } };