1- import { ensureFile } from '@neodx/fs'
1+ import { ensureDir } from '@neodx/fs'
22import { hasOwn , isEmpty , isObject } from '@neodx/std'
33import { Inject } from '@nestjs/common'
4+ import { execaCommand } from 'execa'
45import { Command , CommandRunner , Option } from 'nest-commander'
5- import { dirname , resolve } from 'node:path'
6+ import { dirname } from 'node:path'
67import { buildTargetInfoPrompt } from '@/commands/run/run.prompts'
8+ import { createIndependentTargetCommand } from '@/commands/run/utils/independent-target-command'
79import { LoggerService } from '@/logger'
810import type { AbstractPackageManager } from '@/pkg-manager'
911import { InjectPackageManager } from '@/pkg-manager'
1012import { PackageManager , ROOT_PROJECT } from '@/pkg-manager/pkg-manager.consts'
11- import type { PackageJson } from '@/shared/json '
12- import { readJson } from '@/shared/json '
13+ import { ResolverService } from '@/resolver/resolver.service '
14+ import type { AnyTarget } from '@/resolver/targets/targets-resolver.schema '
1315import { invariant } from '@/shared/misc'
1416
1517export interface BaseInitOptions {
@@ -26,7 +28,8 @@ export interface BaseInitOptions {
2628export class RunCommand extends CommandRunner {
2729 constructor (
2830 @InjectPackageManager ( ) private readonly manager : AbstractPackageManager ,
29- @Inject ( LoggerService ) private readonly logger : LoggerService
31+ @Inject ( LoggerService ) private readonly logger : LoggerService ,
32+ @Inject ( ResolverService ) private readonly resolver : ResolverService
3033 ) {
3134 super ( )
3235 }
@@ -36,14 +39,14 @@ export class RunCommand extends CommandRunner {
3639 await this . manager . computeWorkspaceProjects ( )
3740 }
3841
39- const [ target , project = 'root' ] = isEmpty ( params )
42+ const [ target , project = ROOT_PROJECT ] = isEmpty ( params )
4043 ? await buildTargetInfoPrompt ( this . manager . projects )
4144 : params
4245
4346 invariant ( target , 'Please specify a target. It cannot be empty.' )
4447
4548 const timeEnd = this . logger . time ( )
46- let packageJsonPath = resolve ( process . cwd ( ) , 'package.json' )
49+ let projectCwd = process . cwd ( )
4750
4851 if ( project ) {
4952 const projectMeta = this . manager . projects . find (
@@ -55,43 +58,57 @@ export class RunCommand extends CommandRunner {
5558 `Project ${ project } not found. Please ensure it exists.`
5659 )
5760
58- packageJsonPath = resolve ( projectMeta . location , 'package.json' )
61+ projectCwd = projectMeta . location
5962 }
6063
61- await ensureFile ( packageJsonPath )
64+ await ensureDir ( projectCwd )
6265
63- const pkg = await readJson < PackageJson > ( packageJsonPath )
64- const projectName = project ?? ROOT_PROJECT
66+ const { targets , type : targetType } =
67+ await this . resolver . resolveProjectTargets ( projectCwd )
6568
6669 invariant (
67- isObject ( pkg . scripts ) && hasOwn ( pkg . scripts , target ) ,
68- `Could not find target ${ target } in project ${ projectName } .`
70+ isObject ( targets ) && hasOwn ( targets , target ) ,
71+ `Could not find target ${ target } in project ${ project } .`
6972 )
7073
71- const command = this . manager . createRunCommand ( {
72- target,
73- project,
74- packageJsonPath,
75- args : options . args
76- } )
77-
78- try {
79- // https://github.com/oven-sh/bun/issues/6386
80- const cwd =
81- this . manager . agent === PackageManager . BUN
82- ? dirname ( packageJsonPath )
83- : process . cwd ( )
84-
85- await this . manager . exec ( command , { stdio : 'inherit' , cwd } )
86- } catch ( error ) {
87- this . logger . error (
88- `Error occurred while executing a command via ${ this . manager . agent } agent.`
74+ if ( targetType === 'package-scripts' ) {
75+ const command = this . manager . createRunCommand ( {
76+ target,
77+ project,
78+ packageJsonPath : projectCwd ,
79+ args : options . args
80+ } )
81+
82+ try {
83+ // https://github.com/oven-sh/bun/issues/6386
84+ const cwd =
85+ this . manager . agent === PackageManager . BUN
86+ ? dirname ( projectCwd )
87+ : process . cwd ( )
88+
89+ await this . manager . exec ( command , { stdio : 'inherit' , cwd } )
90+ } catch ( error ) {
91+ this . logger . error (
92+ `Error occurred while executing a command via ${ this . manager . agent } agent.`
93+ )
94+ this . logger . error ( error )
95+ return
96+ }
97+ }
98+
99+ if ( targetType === 'targets' ) {
100+ const { command, env, cwd, args } = createIndependentTargetCommand (
101+ targets [ target ] as AnyTarget ,
102+ { defaultArgs : options . args , projectCwd }
89103 )
90- this . logger . error ( error )
91- return
104+
105+ await execaCommand ( `${ command } ${ args } ` , {
106+ cwd,
107+ env
108+ } )
92109 }
93110
94- timeEnd ( `Successfully ran target ${ target } for project ${ projectName } ` )
111+ timeEnd ( `Successfully ran target ${ target } for project ${ project } ` )
95112 }
96113
97114 @Option ( {
0 commit comments