1eeffdb10STomasz Sapetaimport chalk from 'chalk';
2eeffdb10STomasz Sapeta
3eeffdb10STomasz Sapetaimport logger from '../Logger';
4*a272999eSBartosz Kaszubowskiimport { Package } from '../Packages';
5*a272999eSBartosz Kaszubowskiimport { spawnAsync } from '../Utils';
6eeffdb10STomasz Sapeta
7eeffdb10STomasz Sapetaconst { cyan, gray, red, reset } = chalk;
8eeffdb10STomasz Sapeta
9eeffdb10STomasz Sapeta/**
10eeffdb10STomasz Sapeta * Executes the specified script (defined in package.json under "scripts") on the given package.
11eeffdb10STomasz Sapeta */
12eeffdb10STomasz Sapetaexport default async function runPackageScriptAsync(
13eeffdb10STomasz Sapeta  pkg: Package,
14eeffdb10STomasz Sapeta  scriptName: string,
15eeffdb10STomasz Sapeta  args: string[] = []
16eeffdb10STomasz Sapeta): Promise<void> {
17eeffdb10STomasz Sapeta  if (!pkg.scripts[scriptName]) {
18eeffdb10STomasz Sapeta    // Package doesn't have such script.
19eeffdb10STomasz Sapeta    logger.debug(`��‍♂️ ${cyan(scriptName)} script not found`);
20eeffdb10STomasz Sapeta    return;
21eeffdb10STomasz Sapeta  }
22eeffdb10STomasz Sapeta  const spawnArgs = [scriptName, ...args];
23eeffdb10STomasz Sapeta
24eeffdb10STomasz Sapeta  logger.log(`��‍♀️ Running ${cyan.italic(`yarn ${spawnArgs.join(' ')}`)}`);
25eeffdb10STomasz Sapeta
26eeffdb10STomasz Sapeta  try {
27eeffdb10STomasz Sapeta    await spawnAsync('yarn', spawnArgs, {
28eeffdb10STomasz Sapeta      stdio: 'pipe',
29eeffdb10STomasz Sapeta      cwd: pkg.path,
30eeffdb10STomasz Sapeta    });
31eeffdb10STomasz Sapeta  } catch (error) {
32eeffdb10STomasz Sapeta    logger.error(`${cyan(scriptName)} script failed, see process output:`);
33eeffdb10STomasz Sapeta    consoleErrorOutput(error.stdout, 'stdout >', reset);
34eeffdb10STomasz Sapeta    consoleErrorOutput(error.stderr, 'stderr >', red);
35eeffdb10STomasz Sapeta
36eeffdb10STomasz Sapeta    // Rethrow error so we can count how many checks failed
37eeffdb10STomasz Sapeta    throw error;
38eeffdb10STomasz Sapeta  }
39eeffdb10STomasz Sapeta}
40eeffdb10STomasz Sapeta
41eeffdb10STomasz Sapetafunction consoleErrorOutput(output: string, label: string, color: (string) => string): void {
42eeffdb10STomasz Sapeta  const lines = output.trim().split(/\r\n?|\n/g);
43eeffdb10STomasz Sapeta  logger.log(lines.map((line) => `${gray(label)} ${color(line)}`).join('\n'));
44eeffdb10STomasz Sapeta}
45