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