@@ -231,23 +231,28 @@ export function interpolateArgsIntoCommand(
231
231
> ,
232
232
forwardAllArgs : boolean
233
233
) : string {
234
+ if ( command . indexOf ( '{args.' ) > - 1 && command . indexOf ( '{args}' ) > - 1 ) {
235
+ throw new Error (
236
+ 'Command should not contain both {args} and {args.*} values. Please choose one to use.'
237
+ ) ;
238
+ }
234
239
if ( command . indexOf ( '{args.' ) > - 1 ) {
235
240
const regex = / { a r g s \. ( [ ^ } ] + ) } / g;
236
241
return command . replace ( regex , ( _ , group : string ) =>
237
242
opts . parsedArgs [ group ] !== undefined ? opts . parsedArgs [ group ] : ''
238
243
) ;
244
+ } else if ( command . indexOf ( '{args}' ) > - 1 ) {
245
+ const regex = / { a r g s } / g;
246
+ const args = [
247
+ ...unknownOptionsToArgsArray ( opts ) ,
248
+ ...unparsedOptionsToArgsArray ( opts ) ,
249
+ ] ;
250
+ const argsString = `${ args . join ( ' ' ) } ${ opts . args ?? '' } ` ;
251
+ return command . replace ( regex , argsString ) ;
239
252
} else if ( forwardAllArgs ) {
240
253
let args = '' ;
241
254
if ( Object . keys ( opts . unknownOptions ?? { } ) . length > 0 ) {
242
- const unknownOptionsArgs = Object . keys ( opts . unknownOptions )
243
- . filter (
244
- ( k ) =>
245
- typeof opts . unknownOptions [ k ] !== 'object' &&
246
- opts . parsedArgs [ k ] === opts . unknownOptions [ k ]
247
- )
248
- . map ( ( k ) => `--${ k } =${ opts . unknownOptions [ k ] } ` )
249
- . map ( wrapArgIntoQuotesIfNeeded )
250
- . join ( ' ' ) ;
255
+ const unknownOptionsArgs = unknownOptionsToArgsArray ( opts ) . join ( ' ' ) ;
251
256
if ( unknownOptionsArgs ) {
252
257
args += ` ${ unknownOptionsArgs } ` ;
253
258
}
@@ -256,14 +261,9 @@ export function interpolateArgsIntoCommand(
256
261
args += ` ${ opts . args } ` ;
257
262
}
258
263
if ( opts . __unparsed__ ?. length > 0 ) {
259
- const filteredParsedOptions = filterPropKeysFromUnParsedOptions (
260
- opts . __unparsed__ ,
261
- opts . parsedArgs
262
- ) ;
264
+ const filteredParsedOptions = unparsedOptionsToArgsArray ( opts ) ;
263
265
if ( filteredParsedOptions . length > 0 ) {
264
- args += ` ${ filteredParsedOptions
265
- . map ( wrapArgIntoQuotesIfNeeded )
266
- . join ( ' ' ) } `;
266
+ args += ` ${ filteredParsedOptions . join ( ' ' ) } ` ;
267
267
}
268
268
}
269
269
return `${ command } ${ args } ` ;
@@ -272,6 +272,46 @@ export function interpolateArgsIntoCommand(
272
272
}
273
273
}
274
274
275
+ function unknownOptionsToArgsArray (
276
+ opts : Pick <
277
+ NormalizedRunCommandsOptions ,
278
+ | 'args'
279
+ | 'parsedArgs'
280
+ | '__unparsed__'
281
+ | 'unknownOptions'
282
+ | 'unparsedCommandArgs'
283
+ >
284
+ ) {
285
+ return Object . keys ( opts . unknownOptions ?? { } )
286
+ . filter (
287
+ ( k ) =>
288
+ typeof opts . unknownOptions [ k ] !== 'object' &&
289
+ opts . parsedArgs [ k ] === opts . unknownOptions [ k ]
290
+ )
291
+ . map ( ( k ) => `--${ k } =${ opts . unknownOptions [ k ] } ` )
292
+ . map ( wrapArgIntoQuotesIfNeeded ) ;
293
+ }
294
+
295
+ function unparsedOptionsToArgsArray (
296
+ opts : Pick <
297
+ NormalizedRunCommandsOptions ,
298
+ | 'args'
299
+ | 'parsedArgs'
300
+ | '__unparsed__'
301
+ | 'unknownOptions'
302
+ | 'unparsedCommandArgs'
303
+ >
304
+ ) {
305
+ const filteredParsedOptions = filterPropKeysFromUnParsedOptions (
306
+ opts . __unparsed__ ,
307
+ opts . parsedArgs
308
+ ) ;
309
+ if ( filteredParsedOptions . length > 0 ) {
310
+ return filteredParsedOptions . map ( wrapArgIntoQuotesIfNeeded ) ;
311
+ }
312
+ return [ ] ;
313
+ }
314
+
275
315
function parseArgs (
276
316
unparsedCommandArgs : { [ k : string ] : string } ,
277
317
unknownOptions : { [ k : string ] : string } ,
0 commit comments