From c94b26bd659ab90b22726db29e61524eb07add7b Mon Sep 17 00:00:00 2001 From: XLor Date: Sun, 26 Feb 2023 05:21:29 +0800 Subject: [PATCH] feat(breadc): support no- boolean option --- packages/breadc/src/option.ts | 14 +++++++++++--- packages/breadc/test/breadc.test.ts | 6 ++++-- packages/breadc/test/command.test.ts | 1 + packages/breadc/test/parse.test.ts | 20 ++++++++++++++++++++ 4 files changed, 36 insertions(+), 5 deletions(-) diff --git a/packages/breadc/src/option.ts b/packages/breadc/src/option.ts index e1dca1d3..3779b207 100644 --- a/packages/breadc/src/option.ts +++ b/packages/breadc/src/option.ts @@ -17,15 +17,16 @@ export function makeOption< const match = OptionRE.exec(format); if (match) { name = match[2]; - if (name.startsWith('no-')) { - throw new BreadcError(`Can not parse option format (${format})`); - } if (match[1]) { short = match[1][1]; } if (match[3]) { + if (name.startsWith('no-')) { + throw new BreadcError(`Can not parse option format (${format})`); + } + const initial = config.default ?? ''; return >{ format, @@ -39,10 +40,17 @@ export function makeOption< cast: config.cast }; } else { + if (name.startsWith('no-')) { + name = name.slice(3); + // @ts-ignore + config.default = true; + } + const initial = config.default === undefined || config.default === null ? false : config.default; + return >{ format, type: 'boolean', diff --git a/packages/breadc/test/breadc.test.ts b/packages/breadc/test/breadc.test.ts index a2e0fbff..8a40c6b5 100644 --- a/packages/breadc/test/breadc.test.ts +++ b/packages/breadc/test/breadc.test.ts @@ -279,8 +279,10 @@ describe('Breadc Error', () => { ).toThrowErrorMatchingInlineSnapshot( '"Can not parse option format (--root <...files>)"' ); - expect(() => cli.option('--no-root')).toThrowErrorMatchingInlineSnapshot( - '"Can not parse option format (--no-root)"' + expect(() => + cli.option('--no-root ') + ).toThrowErrorMatchingInlineSnapshot( + '"Can not parse option format (--no-root )"' ); }); }); diff --git a/packages/breadc/test/command.test.ts b/packages/breadc/test/command.test.ts index 08dfda10..7cbc5e87 100644 --- a/packages/breadc/test/command.test.ts +++ b/packages/breadc/test/command.test.ts @@ -205,6 +205,7 @@ describe('Help command', () => { const cli = breadc('cli'); cli.option('--host ', { description: 'Host address' }); cli.option('-r, --remote', { description: 'Enable remote' }); + cli.option('--no-open', { description: 'Open page' }); expect(await cli.run(['-h'])).toMatchInlineSnapshot(` "cli/unknown diff --git a/packages/breadc/test/parse.test.ts b/packages/breadc/test/parse.test.ts index 89451818..3c909d4e 100644 --- a/packages/breadc/test/parse.test.ts +++ b/packages/breadc/test/parse.test.ts @@ -407,6 +407,26 @@ describe('Option Parser', () => { `); }); + it('should parse negtive boolean option', async () => { + const cli = breadc('cli'); + cli.option('--no-open'); + cli.command('').action((o) => o); + + expect(await cli.run(['--open'])).toMatchInlineSnapshot(` + { + "--": [], + "open": true, + } + `); + + expect(await cli.run(['--no-open'])).toMatchInlineSnapshot(` + { + "--": [], + "open": false, + } + `); + }); + it('should parse string option', async () => { const cli = breadc('cli'); cli.option('--flag');