@@ -19,6 +19,10 @@ function isObject(value: unknown): value is JsonObject {
1919 return typeof value === 'object' && value !== null && ! Array . isArray ( value ) ;
2020}
2121
22+ function isNonEmptyString ( value : unknown ) : value is string {
23+ return typeof value === 'string' && value . trim ( ) . length > 0 ;
24+ }
25+
2226// Cross-provider settings derived from the schema source of truth in targets.ts.
2327// Adding a field to COMMON_TARGET_SETTINGS automatically makes it valid here.
2428const COMMON_SETTINGS = new Set < string > ( COMMON_TARGET_SETTINGS ) ;
@@ -320,9 +324,11 @@ export async function validateTargetsFile(filePath: string): Promise<ValidationR
320324 const absolutePath = path . resolve ( filePath ) ;
321325
322326 let parsed : unknown ;
327+ let rawParsed : unknown ;
323328 try {
324329 const content = await readFile ( absolutePath , 'utf8' ) ;
325- parsed = interpolateEnv ( parseYamlValue ( content ) , process . env ) ;
330+ rawParsed = parseYamlValue ( content ) ;
331+ parsed = interpolateEnv ( rawParsed , process . env ) ;
326332 } catch ( error ) {
327333 errors . push ( {
328334 severity : 'error' ,
@@ -484,6 +490,8 @@ export async function validateTargetsFile(filePath: string): Promise<ValidationR
484490
485491 // Validate targets array
486492 const targets = parsed . targets ;
493+ const rawTargets =
494+ isObject ( rawParsed ) && Array . isArray ( rawParsed . targets ) ? rawParsed . targets : [ ] ;
487495 if ( ! Array . isArray ( targets ) ) {
488496 errors . push ( {
489497 severity : 'error' ,
@@ -542,8 +550,9 @@ export async function validateTargetsFile(filePath: string): Promise<ValidationR
542550
543551 // Required field: provider
544552 const provider = target . provider ;
545- const hasUseTarget =
546- typeof target . use_target === 'string' && target . use_target . trim ( ) . length > 0 ;
553+ const rawTarget = rawTargets [ i ] ;
554+ const rawUseTarget = isObject ( rawTarget ) ? rawTarget . use_target : undefined ;
555+ const hasUseTarget = isNonEmptyString ( target . use_target ) || isNonEmptyString ( rawUseTarget ) ;
547556 const providerValue = typeof provider === 'string' ? provider . trim ( ) . toLowerCase ( ) : undefined ;
548557 const isTemplated = typeof provider === 'string' && / ^ \$ \{ \{ .+ \} \} $ / . test ( provider . trim ( ) ) ;
549558 if ( ! hasUseTarget && ( typeof provider !== 'string' || provider . trim ( ) . length === 0 ) ) {
0 commit comments