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('WEBPACK_IMPORT', `Missing package "${moduleId}" in the project at: ${projectRoot}`); 11 } 12} 13 14function resolveFromProject(projectRoot: string, moduleId: string) { 15 const resolvedPath = resolveFrom.silent(projectRoot, moduleId); 16 if (!resolvedPath) { 17 throw new WebpackImportError(projectRoot, moduleId); 18 } 19 return resolvedPath; 20} 21 22function importFromProject(projectRoot: string, moduleId: string) { 23 return require(resolveFromProject(projectRoot, moduleId)); 24} 25 26/** Import `webpack` from the project. */ 27export function importWebpackFromProject(projectRoot: string): typeof import('webpack') { 28 return importFromProject(projectRoot, 'webpack').default; 29} 30 31/** Import `@expo/webpack-config` from the project. */ 32export function importExpoWebpackConfigFromProject( 33 projectRoot: string 34): typeof import('@expo/webpack-config') { 35 return importFromProject(projectRoot, '@expo/webpack-config'); 36} 37 38/** Import `webpack-dev-server` from the project. */ 39export function importWebpackDevServerFromProject( 40 projectRoot: string 41): typeof import('webpack-dev-server') { 42 return importFromProject(projectRoot, 'webpack-dev-server').default; 43} 44