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