diff --git a/src/concurrency.ts b/src/concurrency.ts index 61c78efb..e3ca73a2 100644 --- a/src/concurrency.ts +++ b/src/concurrency.ts @@ -22,6 +22,7 @@ export function createCommand( const command = new CommandParser(pkg, pkg.root) .parse(cmd) .setCwd(pkg.root) + .setPackageName(pkg.name) command.name = `${chalk.cyanBright(pkg.name)} at ${chalk.grey( relative(workspace.root, pkg.root) )}` diff --git a/src/formatter.ts b/src/formatter.ts index 2ab53c6a..39ec376b 100644 --- a/src/formatter.ts +++ b/src/formatter.ts @@ -13,7 +13,8 @@ export class CommandFormatter { public cmd: string, public level: number, public spinner: Spinner | undefined, - public options: RunnerOptions + public options: RunnerOptions, + public packageName?: string ) {} private format(prefix: string, text: string) { @@ -32,7 +33,9 @@ export class CommandFormatter { write(data: string) { if (!this.options.pretty) { - const prefix = `${chalk.grey.dim(`[${basename(this.cmd)}]`)} ` + let cmdName = basename(this.cmd) + if (this.packageName) cmdName = `${this.packageName}::${cmdName}` + const prefix = `${chalk.grey.dim(`[${cmdName}]`)} ` data = prefix + this.format(prefix, data) this.output += `${data}\n` if (!this.options.silent) console.log(data) diff --git a/src/parser.ts b/src/parser.ts index 2771a405..0ca32283 100644 --- a/src/parser.ts +++ b/src/parser.ts @@ -18,6 +18,8 @@ export class Command { children: Command[] = [] concurrent = false cwd?: string + packageName?: string + // eslint-disable-next-line @typescript-eslint/require-await beforeRun = async () => { return @@ -50,6 +52,14 @@ export class Command { return this } + setPackageName(name: string) { + this.packageName = name + for (const c of this.children) { + c.setPackageName(name) + } + return this + } + debug(showConcurrent = false): DebugCommand { const args = this.args.slice(1).join(" ") let cmd = `${this.type}:${this.name}${args.length ? ` ${args}` : ""}` diff --git a/src/runner.ts b/src/runner.ts index 4e34e0b5..6aa9bad3 100644 --- a/src/runner.ts +++ b/src/runner.ts @@ -28,8 +28,11 @@ export class Runner { if (this.options.raw) return const title = this.formatCommand(cmd) if (!this.options.pretty) { - if (cmd.type == CommandType.script) console.log(`❯ ${title}`) - else console.log(title) + const prefix = cmd.packageName + ? `${chalk.grey.dim(` (${cmd.packageName})`)}` + : "" + if (cmd.type == CommandType.script) console.log(`❯ ${title}${prefix}`) + else console.log(title + prefix) } else return this.spinner.start(title, level, parentSpinner) } @@ -62,12 +65,18 @@ export class Runner { const cmdSpinner = this.formatStart(cmd, level, parentSpinner) try { if (!this.options.dryRun) { + const formatter = new CommandFormatter( + args[0], + level, + cmdSpinner, + this.options, + cmd.packageName + ) await this.spawn( args[0], args.slice(1), - level, + formatter, cmd.cwd, - cmdSpinner, cmd.env ) } @@ -87,7 +96,8 @@ export class Runner { cmd.name, level, spinner, - this.options + this.options, + cmd.packageName ) if (isBuildScript) { @@ -149,13 +159,11 @@ export class Runner { spawn( cmd: string, args: string[], - level: number, + formatter: CommandFormatter, cwd?: string, - spinner?: Spinner, env?: Record ) { const spawner = new Spawner(cmd, args, cwd, env) - const formatter = new CommandFormatter(cmd, level, spinner, this.options) if (this.options.pretty) spawner.onData = (line: string) => formatter.write(line)