From 819d0ac21b97be3493863f1d092d408684a4bbec Mon Sep 17 00:00:00 2001 From: Chris Arnesen Date: Sat, 30 Oct 2021 09:58:36 -0500 Subject: [PATCH] Allow readonly string array choices for CliStringChoicesArgGroupOptions Fixes #193 --- main/changelog.md | 7 +++++ main/package-lock.json | 2 +- main/scripts/build-docs.sh | 6 +++- .../cli-string-choice-arg-group.test.ts | 2 +- .../cli-string-choice-arg-group.ts | 29 ++++++++++--------- 5 files changed, 29 insertions(+), 17 deletions(-) diff --git a/main/changelog.md b/main/changelog.md index b3a51b2..d3c75fc 100644 --- a/main/changelog.md +++ b/main/changelog.md @@ -1,8 +1,15 @@ # **@carnesen/cli** changelog +## Upcoming + +### Fixes + +- CliStringChoicesArgGroup factory should allow readonly string array choices [#193](https://github.com/carnesen/cli/issues/193) + ## 0.5.1 - 2020-02-06 ### Fixes + - Unexpected handling of exception with numeric "code" property (https://github.com/carnesen/cli/issues/166) ## 0.5.0 - 2020-09-12 diff --git a/main/package-lock.json b/main/package-lock.json index 276cac6..4b7984a 100644 --- a/main/package-lock.json +++ b/main/package-lock.json @@ -1,6 +1,6 @@ { "name": "@carnesen/cli", - "version": "0.5.0", + "version": "0.5.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/main/scripts/build-docs.sh b/main/scripts/build-docs.sh index f0fdc40..e763bb8 100755 --- a/main/scripts/build-docs.sh +++ b/main/scripts/build-docs.sh @@ -1,6 +1,10 @@ #!/usr/bin/env bash -# This script generates the documentation package contents from the source code +# This script generates the documentation package contents from the source code. +# It uses TypeDoc in "library mode", which was released in an 0.20 beta but +# didn't make it into the actual release since --mode was removed. For more +# information see https://github.com/TypeStrong/typedoc/pull/1184 and +# https://github.com/TypeStrong/typedoc/releases/tag/v0.20.0 set -eo pipefail SCRIPT_PATH="${BASH_SOURCE[0]}" diff --git a/main/src/arg-group-factories/__tests__/cli-string-choice-arg-group.test.ts b/main/src/arg-group-factories/__tests__/cli-string-choice-arg-group.test.ts index 369d695..4c07030 100644 --- a/main/src/arg-group-factories/__tests__/cli-string-choice-arg-group.test.ts +++ b/main/src/arg-group-factories/__tests__/cli-string-choice-arg-group.test.ts @@ -8,7 +8,7 @@ const placeholder = ''; const required = false; const argGroup = CliStringChoiceArgGroup({ - choices: ['foo', 'bar'], + choices: ['foo', 'bar'] as const, description, hidden, placeholder, diff --git a/main/src/arg-group-factories/cli-string-choice-arg-group.ts b/main/src/arg-group-factories/cli-string-choice-arg-group.ts index 04d7396..21c0ab1 100644 --- a/main/src/arg-group-factories/cli-string-choice-arg-group.ts +++ b/main/src/arg-group-factories/cli-string-choice-arg-group.ts @@ -1,15 +1,19 @@ import { ICliArgGroup } from '../cli-arg-group'; import { CliUsageError } from '../cli-usage-error'; +export type CliStringChoices = string[] | readonly string[]; + /** * Options for [[`CliStringChoiceArgGroup`]] * @typeParam TChoices Type of the "choices" option */ -export interface ICliStringChoiceArgGroupOptions { +export interface ICliStringChoiceArgGroupOptions< + TChoices extends CliStringChoices +> { /** * Choices for this argument. For strict typing do e.g. * - * choices: ['foo' as const, 'bar' as const] + * choices: ['foo', 'bar'] as const * * */ choices: TChoices; @@ -29,26 +33,23 @@ export interface ICliStringChoiceArgGroupOptions { } /** - * A factory for required [[`ICliArgGroup`]]s whose value is one of the choices - * provided - * @typeParam TChoices Type of the provided choices + * A factory for [[`ICliArgGroup`]]s whose value is one of the choices provided + * @typeParam TChoices Type of the provided choices. * */ -function CliStringChoiceArgGroup( + +// required = true overload +function CliStringChoiceArgGroup( options: ICliStringChoiceArgGroupOptions & { required: true }, ): ICliArgGroup; -/** - * A factory for optional [[`ICliArgGroup`]]s whose value is one of the choices - * provided - * @typeParam TChoices Type of the provided choices - * */ -function CliStringChoiceArgGroup( +// required = false overload +function CliStringChoiceArgGroup( options: ICliStringChoiceArgGroupOptions, ): ICliArgGroup; // Implementation function CliStringChoiceArgGroup( - options: ICliStringChoiceArgGroupOptions, + options: ICliStringChoiceArgGroupOptions, ): ICliArgGroup { const valuesString = options.choices.join(', '); const { @@ -85,7 +86,7 @@ function CliStringChoiceArgGroup( if (args.length > 0) { return []; } - return options.choices; + return options.choices as string[]; }, }; return argGroup;