1import resolveFrom from 'resolve-from'; 2 3import { CommandError } from '../../../utils/errors'; 4 5// These resolvers enable us to test the CLI in older projects. 6// We may be able to get rid of this in the future. 7// TODO: Maybe combine with AsyncResolver? 8class WebpackImportError extends CommandError { 9 constructor(projectRoot: string, moduleId: string) { 10 super( 11 'WEBPACK_IMPORT', 12 `Missing package "${moduleId}" in the project. Try running the command again. (cwd: ${projectRoot})` 13 ); 14 } 15} 16 17function resolveFromProject(projectRoot: string, moduleId: string) { 18 const resolvedPath = resolveFrom.silent(projectRoot, moduleId); 19 if (!resolvedPath) { 20 throw new WebpackImportError(projectRoot, moduleId); 21 } 22 return resolvedPath; 23} 24 25function importFromProject(projectRoot: string, moduleId: string) { 26 return require(resolveFromProject(projectRoot, moduleId)); 27} 28 29/** Import `webpack` from the project. */ 30export function importWebpackFromProject(projectRoot: string): typeof import('webpack') { 31 return importFromProject(projectRoot, 'webpack'); 32} 33 34/** Import `@expo/webpack-config` from the project. */ 35export function importExpoWebpackConfigFromProject( 36 projectRoot: string 37): typeof import('@expo/webpack-config') { 38 return importFromProject(projectRoot, '@expo/webpack-config'); 39} 40 41/** Import `webpack-dev-server` from the project. */ 42export function importWebpackDevServerFromProject( 43 projectRoot: string 44): typeof import('webpack-dev-server') { 45 return importFromProject(projectRoot, 'webpack-dev-server'); 46} 47