Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletions src/utils/extract-template-option-flags.ts
Original file line number Diff line number Diff line change
Expand Up @@ -62,13 +62,16 @@ function findKnownOption(command: Command, arg: string) {
const shortFlag = arg.startsWith('-') && !arg.startsWith('--') ? arg.slice(0, 2) : undefined
return command.options.find(
(option) =>
(longFlag !== undefined && option.long === longFlag) || (shortFlag !== undefined && option.short === shortFlag),
(longFlag !== undefined && (option.long === longFlag || option.short === longFlag)) ||
(shortFlag !== undefined && option.short === shortFlag),
)
}

function hasInlineValue(longFlag: string | undefined, shortFlag: string | undefined, arg: string): boolean {
if (longFlag !== undefined && arg.startsWith('--')) {
return arg.startsWith(`${longFlag}=`)
// The arg may use a long alias (e.g. `--pm`) whose token differs from the
// option's canonical long, so detect the inline value on the arg itself.
return arg.includes('=')
}
return shortFlag !== undefined && arg.startsWith(shortFlag) && arg !== shortFlag
}
25 changes: 25 additions & 0 deletions test/extract-template-option-flags.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -59,4 +59,29 @@ describe('extractTemplateOptionFlags', () => {
extractTemplateOptionFlags(command(), ['node', 'create-solana-dapp', 'my-app', '--engine=ollama']),
).toThrow('Template options must be boolean long flags')
})

it('preserves a long alias flag and its space-separated value', () => {
// Commander stores the alias of a two-long-token option
// (`--pm, --package-manager`) in `option.short`, so the alias must still be
// recognised as a known option rather than treated as a template flag.
const commandWithPm = () =>
new Command().argument('[name]').option('--pm, --package-manager <package-manager>').option('--skip-install')
const argv = ['node', 'create-solana-dapp', 'my-app', '--pm', 'pnpm']

expect(extractTemplateOptionFlags(commandWithPm(), argv)).toEqual({
argv: ['node', 'create-solana-dapp', 'my-app', '--pm', 'pnpm'],
templateOptions: [],
})
})

it('detects an inline value written with a long alias flag', () => {
const commandWithPm = () =>
new Command().argument('[name]').option('--pm, --package-manager <package-manager>').option('--skip-install')
const argv = ['node', 'create-solana-dapp', 'my-app', '--pm=pnpm', '--ollama']

expect(extractTemplateOptionFlags(commandWithPm(), argv)).toEqual({
argv: ['node', 'create-solana-dapp', 'my-app', '--pm=pnpm'],
templateOptions: ['ollama'],
})
})
})
Loading