Files
orca/src/shared/command-option-occurrence.ts
T
Jinjing f873aaac5b Fix duplicate session option flags and preserve argument values (#25382)
* Fix duplicate session option flags and preserve argument values

* improve tests
2026-10-04 21:57:55 -07:00

44 lines
1.4 KiB
TypeScript

function matchesOption(token: string, aliases: readonly string[]): boolean {
return aliases.some(
(alias) =>
token === alias ||
(alias !== '--' && token.startsWith(`${alias}=`)) ||
(alias.startsWith('-') &&
!alias.startsWith('--') &&
token.startsWith(alias) &&
token.length > alias.length)
)
}
export function findOptionOccurrence(
tokens: readonly string[],
aliases: readonly string[],
stopAtTerminator: boolean,
valueOptions: readonly string[] = []
): { index: number; consumed: number; value?: string } | null {
for (let index = 0; index < tokens.length; index += 1) {
const token = tokens[index]
if (stopAtTerminator && token === '--') {
break
}
if (!matchesOption(token, aliases)) {
// Required option values can look like flags, including `--`.
if (valueOptions.includes(token)) {
index += 1
}
continue
}
const nextToken = tokens[index + 1]
const consumesNext =
aliases.includes(token) && nextToken !== undefined && !nextToken.startsWith('-')
const alias = aliases.find((name) => matchesOption(token, [name]))
const value = consumesNext
? nextToken
: alias && token !== alias
? token.slice(alias.length + (token[alias.length] === '=' ? 1 : 0))
: undefined
return { index, consumed: consumesNext ? 2 : 1, value }
}
return null
}