@@ -22,6 +22,7 @@ function addCommand(cli: CAC | Command, name: string, option: CLIOption<any>) {
2222 `Expected a single value for option "${ command } ", received [${ received } ]` ,
2323 )
2424 }
25+ value = removeQuotes ( value )
2526 if ( option . transform ) {
2627 return option . transform ( value )
2728 }
@@ -196,11 +197,36 @@ export function createCLI(options: CliParseOptions = {}): CAC {
196197 return cli
197198}
198199
200+ function removeQuotes < T > ( str : T ) : T {
201+ if ( typeof str !== 'string' ) {
202+ if ( Array . isArray ( str ) ) {
203+ return str . map ( removeQuotes ) as unknown as T
204+ }
205+ return str
206+ }
207+ if ( str . startsWith ( '"' ) && str . endsWith ( '"' ) ) {
208+ return str . slice ( 1 , - 1 ) as unknown as T
209+ }
210+ if ( str . startsWith ( `'` ) && str . endsWith ( `'` ) ) {
211+ return str . slice ( 1 , - 1 ) as unknown as T
212+ }
213+ return str
214+ }
215+
216+ function splitArgv ( argv : string ) : string [ ] {
217+ const reg = / ( [ ' " ] ) (?: (? ! \1) .) + \1/ g
218+ argv = argv . replace ( reg , match => match . replace ( / \s / g, '\x00' ) )
219+ return argv . split ( ' ' ) . map ( ( arg : string ) => {
220+ arg = arg . replace ( / \0 / g, ' ' )
221+ return removeQuotes ( arg )
222+ } )
223+ }
224+
199225export function parseCLI ( argv : string | string [ ] , config : CliParseOptions = { } ) : {
200226 filter : string [ ]
201227 options : CliOptions
202228} {
203- const arrayArgs = typeof argv === 'string' ? argv . split ( ' ' ) : argv
229+ const arrayArgs = typeof argv === 'string' ? splitArgv ( argv ) : argv
204230 if ( arrayArgs [ 0 ] !== 'vitest' ) {
205231 throw new Error ( `Expected "vitest" as the first argument, received "${ arrayArgs [ 0 ] } "` )
206232 }
0 commit comments