xref: /expo/tools/src/Workspace.ts (revision eeffdb10)
1*eeffdb10STomasz Sapetaimport path from 'path';
2*eeffdb10STomasz Sapeta
3*eeffdb10STomasz Sapetaimport { Package } from './Packages';
4*eeffdb10STomasz Sapetaimport { spawnAsync, spawnJSONCommandAsync } from './Utils';
5*eeffdb10STomasz Sapetaimport { EXPO_DIR } from './Constants';
6*eeffdb10STomasz Sapeta
7*eeffdb10STomasz Sapetaconst NATIVE_APPS_PATHS = [EXPO_DIR, path.join(EXPO_DIR, 'apps/bare-expo')];
8*eeffdb10STomasz Sapeta
9*eeffdb10STomasz Sapeta/**
10*eeffdb10STomasz Sapeta * Workspace info for the single project.
11*eeffdb10STomasz Sapeta */
12*eeffdb10STomasz Sapetaexport type WorkspaceProjectInfo = {
13*eeffdb10STomasz Sapeta  location: string;
14*eeffdb10STomasz Sapeta  workspaceDependencies: string[];
15*eeffdb10STomasz Sapeta  mismatchedWorkspaceDependencies: string[];
16*eeffdb10STomasz Sapeta};
17*eeffdb10STomasz Sapeta
18*eeffdb10STomasz Sapeta/**
19*eeffdb10STomasz Sapeta * An object with workspace's projects info.
20*eeffdb10STomasz Sapeta */
21*eeffdb10STomasz Sapetaexport type WorkspacesInfo = Record<string, WorkspaceProjectInfo>;
22*eeffdb10STomasz Sapeta
23*eeffdb10STomasz Sapeta/**
24*eeffdb10STomasz Sapeta * Returns an object containing info for all projects in the workspace.
25*eeffdb10STomasz Sapeta */
26*eeffdb10STomasz Sapetaexport async function getInfoAsync(): Promise<WorkspacesInfo> {
27*eeffdb10STomasz Sapeta  const info = await spawnJSONCommandAsync<{ data: string }>('yarn', [
28*eeffdb10STomasz Sapeta    '--json',
29*eeffdb10STomasz Sapeta    'workspaces',
30*eeffdb10STomasz Sapeta    'info',
31*eeffdb10STomasz Sapeta  ]);
32*eeffdb10STomasz Sapeta  return JSON.parse(info.data);
33*eeffdb10STomasz Sapeta}
34*eeffdb10STomasz Sapeta
35*eeffdb10STomasz Sapeta/**
36*eeffdb10STomasz Sapeta * Runs yarn in the root workspace directory.
37*eeffdb10STomasz Sapeta */
38*eeffdb10STomasz Sapetaexport async function installAsync(): Promise<void> {
39*eeffdb10STomasz Sapeta  await spawnAsync('yarn');
40*eeffdb10STomasz Sapeta}
41*eeffdb10STomasz Sapeta
42*eeffdb10STomasz Sapeta/**
43*eeffdb10STomasz Sapeta * Returns an array of workspace's native apps, like Expo Client or BareExpo.
44*eeffdb10STomasz Sapeta */
45*eeffdb10STomasz Sapetaexport function getNativeApps(): Package[] {
46*eeffdb10STomasz Sapeta  return NATIVE_APPS_PATHS.map((appPath) => new Package(appPath));
47*eeffdb10STomasz Sapeta}
48