18d307f52SEvan Baconimport resolveFrom from 'resolve-from';
28d307f52SEvan Bacon
38d307f52SEvan Baconimport { CommandError } from '../../../utils/errors';
48d307f52SEvan Bacon
58d307f52SEvan Bacon// These resolvers enable us to test the CLI in older projects.
68d307f52SEvan Bacon// We may be able to get rid of this in the future.
78d307f52SEvan Bacon// TODO: Maybe combine with AsyncResolver?
88d307f52SEvan Baconclass WebpackImportError extends CommandError {
98d307f52SEvan Bacon  constructor(projectRoot: string, moduleId: string) {
10*d04463cbSEvan Bacon    super(
11*d04463cbSEvan Bacon      'WEBPACK_IMPORT',
12*d04463cbSEvan Bacon      `Missing package "${moduleId}" in the project. Try running the command again. (cwd: ${projectRoot})`
13*d04463cbSEvan Bacon    );
148d307f52SEvan Bacon  }
158d307f52SEvan Bacon}
168d307f52SEvan Bacon
178d307f52SEvan Baconfunction resolveFromProject(projectRoot: string, moduleId: string) {
188d307f52SEvan Bacon  const resolvedPath = resolveFrom.silent(projectRoot, moduleId);
198d307f52SEvan Bacon  if (!resolvedPath) {
208d307f52SEvan Bacon    throw new WebpackImportError(projectRoot, moduleId);
218d307f52SEvan Bacon  }
228d307f52SEvan Bacon  return resolvedPath;
238d307f52SEvan Bacon}
248d307f52SEvan Bacon
258d307f52SEvan Baconfunction importFromProject(projectRoot: string, moduleId: string) {
268d307f52SEvan Bacon  return require(resolveFromProject(projectRoot, moduleId));
278d307f52SEvan Bacon}
288d307f52SEvan Bacon
298d307f52SEvan Bacon/** Import `webpack` from the project. */
308d307f52SEvan Baconexport function importWebpackFromProject(projectRoot: string): typeof import('webpack') {
31*d04463cbSEvan Bacon  return importFromProject(projectRoot, 'webpack');
328d307f52SEvan Bacon}
338d307f52SEvan Bacon
348d307f52SEvan Bacon/** Import `@expo/webpack-config` from the project. */
358d307f52SEvan Baconexport function importExpoWebpackConfigFromProject(
368d307f52SEvan Bacon  projectRoot: string
378d307f52SEvan Bacon): typeof import('@expo/webpack-config') {
388d307f52SEvan Bacon  return importFromProject(projectRoot, '@expo/webpack-config');
398d307f52SEvan Bacon}
408d307f52SEvan Bacon
418d307f52SEvan Bacon/** Import `webpack-dev-server` from the project. */
428d307f52SEvan Baconexport function importWebpackDevServerFromProject(
438d307f52SEvan Bacon  projectRoot: string
448d307f52SEvan Bacon): typeof import('webpack-dev-server') {
45*d04463cbSEvan Bacon  return importFromProject(projectRoot, 'webpack-dev-server');
468d307f52SEvan Bacon}
47