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