@actsecurity/cli 0.2.66
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.txt +21 -0
- package/README.md +143 -0
- package/dist/cjs/arguments/argument.d.ts +63 -0
- package/dist/cjs/arguments/argument.d.ts.map +1 -0
- package/dist/cjs/arguments/argument.js +3 -0
- package/dist/cjs/arguments/argument.js.map +1 -0
- package/dist/cjs/arguments/arrayValueArgument.d.ts +17 -0
- package/dist/cjs/arguments/arrayValueArgument.d.ts.map +1 -0
- package/dist/cjs/arguments/arrayValueArgument.js +38 -0
- package/dist/cjs/arguments/arrayValueArgument.js.map +1 -0
- package/dist/cjs/arguments/booleanArgument.d.ts +11 -0
- package/dist/cjs/arguments/booleanArgument.d.ts.map +1 -0
- package/dist/cjs/arguments/booleanArgument.js +25 -0
- package/dist/cjs/arguments/booleanArgument.js.map +1 -0
- package/dist/cjs/arguments/enumArgument.d.ts +20 -0
- package/dist/cjs/arguments/enumArgument.d.ts.map +1 -0
- package/dist/cjs/arguments/enumArgument.js +35 -0
- package/dist/cjs/arguments/enumArgument.js.map +1 -0
- package/dist/cjs/arguments/enumArrayArgument.d.ts +20 -0
- package/dist/cjs/arguments/enumArrayArgument.d.ts.map +1 -0
- package/dist/cjs/arguments/enumArrayArgument.js +43 -0
- package/dist/cjs/arguments/enumArrayArgument.js.map +1 -0
- package/dist/cjs/arguments/mapArgument.d.ts +20 -0
- package/dist/cjs/arguments/mapArgument.d.ts.map +1 -0
- package/dist/cjs/arguments/mapArgument.js +35 -0
- package/dist/cjs/arguments/mapArgument.js.map +1 -0
- package/dist/cjs/arguments/numberArguments.d.ts +17 -0
- package/dist/cjs/arguments/numberArguments.d.ts.map +1 -0
- package/dist/cjs/arguments/numberArguments.js +15 -0
- package/dist/cjs/arguments/numberArguments.js.map +1 -0
- package/dist/cjs/arguments/singleValueArgument.d.ts +17 -0
- package/dist/cjs/arguments/singleValueArgument.d.ts.map +1 -0
- package/dist/cjs/arguments/singleValueArgument.js +35 -0
- package/dist/cjs/arguments/singleValueArgument.js.map +1 -0
- package/dist/cjs/arguments/stringArguments.d.ts +17 -0
- package/dist/cjs/arguments/stringArguments.d.ts.map +1 -0
- package/dist/cjs/arguments/stringArguments.js +14 -0
- package/dist/cjs/arguments/stringArguments.js.map +1 -0
- package/dist/cjs/cli.d.ts +131 -0
- package/dist/cjs/cli.d.ts.map +1 -0
- package/dist/cjs/cli.js +499 -0
- package/dist/cjs/cli.js.map +1 -0
- package/dist/cjs/index.d.ts +13 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +28 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/readRelative.d.ts +35 -0
- package/dist/cjs/readRelative.d.ts.map +1 -0
- package/dist/cjs/readRelative.js +81 -0
- package/dist/cjs/readRelative.js.map +1 -0
- package/dist/cjs/stdin.d.ts +7 -0
- package/dist/cjs/stdin.d.ts.map +1 -0
- package/dist/cjs/stdin.js +38 -0
- package/dist/cjs/stdin.js.map +1 -0
- package/dist/cjs/utils.d.ts +14 -0
- package/dist/cjs/utils.d.ts.map +1 -0
- package/dist/cjs/utils.js +21 -0
- package/dist/cjs/utils.js.map +1 -0
- package/dist/esm/arguments/argument.d.ts +63 -0
- package/dist/esm/arguments/argument.d.ts.map +1 -0
- package/dist/esm/arguments/argument.js +2 -0
- package/dist/esm/arguments/argument.js.map +1 -0
- package/dist/esm/arguments/arrayValueArgument.d.ts +17 -0
- package/dist/esm/arguments/arrayValueArgument.d.ts.map +1 -0
- package/dist/esm/arguments/arrayValueArgument.js +36 -0
- package/dist/esm/arguments/arrayValueArgument.js.map +1 -0
- package/dist/esm/arguments/booleanArgument.d.ts +11 -0
- package/dist/esm/arguments/booleanArgument.d.ts.map +1 -0
- package/dist/esm/arguments/booleanArgument.js +23 -0
- package/dist/esm/arguments/booleanArgument.js.map +1 -0
- package/dist/esm/arguments/enumArgument.d.ts +20 -0
- package/dist/esm/arguments/enumArgument.d.ts.map +1 -0
- package/dist/esm/arguments/enumArgument.js +34 -0
- package/dist/esm/arguments/enumArgument.js.map +1 -0
- package/dist/esm/arguments/enumArrayArgument.d.ts +20 -0
- package/dist/esm/arguments/enumArrayArgument.d.ts.map +1 -0
- package/dist/esm/arguments/enumArrayArgument.js +42 -0
- package/dist/esm/arguments/enumArrayArgument.js.map +1 -0
- package/dist/esm/arguments/mapArgument.d.ts +20 -0
- package/dist/esm/arguments/mapArgument.d.ts.map +1 -0
- package/dist/esm/arguments/mapArgument.js +33 -0
- package/dist/esm/arguments/mapArgument.js.map +1 -0
- package/dist/esm/arguments/numberArguments.d.ts +17 -0
- package/dist/esm/arguments/numberArguments.d.ts.map +1 -0
- package/dist/esm/arguments/numberArguments.js +13 -0
- package/dist/esm/arguments/numberArguments.js.map +1 -0
- package/dist/esm/arguments/singleValueArgument.d.ts +17 -0
- package/dist/esm/arguments/singleValueArgument.d.ts.map +1 -0
- package/dist/esm/arguments/singleValueArgument.js +33 -0
- package/dist/esm/arguments/singleValueArgument.js.map +1 -0
- package/dist/esm/arguments/stringArguments.d.ts +17 -0
- package/dist/esm/arguments/stringArguments.d.ts.map +1 -0
- package/dist/esm/arguments/stringArguments.js +11 -0
- package/dist/esm/arguments/stringArguments.js.map +1 -0
- package/dist/esm/cli.d.ts +131 -0
- package/dist/esm/cli.d.ts.map +1 -0
- package/dist/esm/cli.js +494 -0
- package/dist/esm/cli.js.map +1 -0
- package/dist/esm/index.d.ts +13 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +13 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/package.json +3 -0
- package/dist/esm/readRelative.d.ts +35 -0
- package/dist/esm/readRelative.d.ts.map +1 -0
- package/dist/esm/readRelative.js +74 -0
- package/dist/esm/readRelative.js.map +1 -0
- package/dist/esm/stdin.d.ts +7 -0
- package/dist/esm/stdin.d.ts.map +1 -0
- package/dist/esm/stdin.js +35 -0
- package/dist/esm/stdin.js.map +1 -0
- package/dist/esm/utils.d.ts +14 -0
- package/dist/esm/utils.d.ts.map +1 -0
- package/dist/esm/utils.js +18 -0
- package/dist/esm/utils.js.map +1 -0
- package/package.json +114 -0
package/LICENSE.txt
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Cloud Copilot
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
# CLI
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/@cloud-copilot/cli) [](LICENSE.txt)
|
|
4
|
+
|
|
5
|
+
[](https://github.com/cloud-copilot/cli/actions/workflows/guarddog.yml) [](https://snyk.io/test/github/cloud-copilot/cli?targetFile=package.json)
|
|
6
|
+
|
|
7
|
+
Utilities for standardizing working CLIs in Typescript.
|
|
8
|
+
|
|
9
|
+
- Standardizes the way subcommands, arguments, and operands are parsed and validated
|
|
10
|
+
- Includes "prefix matching" of subcommands and arguments, so users can provide partial names if they match only one subcommand or argument
|
|
11
|
+
- Allows users to default arguments with environment variables
|
|
12
|
+
- Automatically generates a help text for the user
|
|
13
|
+
- Provides a type safe response of the parsed arguments
|
|
14
|
+
- Has zero dependencies
|
|
15
|
+
- Built-in argument types for string, number, boolean, enum, array, and map types
|
|
16
|
+
- Easy custom argument types to create your own argument types with validation
|
|
17
|
+
- Async argument validation and version checking
|
|
18
|
+
- Automatic version checking for updates to your CLI
|
|
19
|
+
|
|
20
|
+
I wrote this because I'm building several CLI applications and want to have a standard parsing of arguments that users can rely on across all of them.
|
|
21
|
+
|
|
22
|
+
I was inspired by https://github.com/lirantal/nodejs-cli-apps-best-practices and https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap12.html to follow best practices for accepting arguments and environment variables while keeping my scope extremely limited and having no dependencies.
|
|
23
|
+
|
|
24
|
+
## Table of Contents
|
|
25
|
+
|
|
26
|
+
- [Example](#example)
|
|
27
|
+
- [Installation](#installation)
|
|
28
|
+
- [Documentation](#documentation)
|
|
29
|
+
- [Core Guides](#core-guides)
|
|
30
|
+
- [Examples](#examples)
|
|
31
|
+
|
|
32
|
+
## Documentation
|
|
33
|
+
|
|
34
|
+
### Core Guides
|
|
35
|
+
|
|
36
|
+
- **[Getting Started](docs/GettingStarted.md)** - Complete tutorial for new users
|
|
37
|
+
- **[Parsing Reference](docs/ParsingReference.md)** - Detailed parsing rules and mechanics
|
|
38
|
+
- **[Operands Guide](docs/OperandsGuide.md)** - Working with positional arguments and expectOperands
|
|
39
|
+
- **[Subcommands Guide](docs/SubcommandsGuide.md)** - Building CLIs with subcommands
|
|
40
|
+
- **[Custom Arguments](docs/CustomArguments.md)** - Creating custom argument types with validation
|
|
41
|
+
- **[Environment Variables](docs/EnvironmentVariables.md)** - Environment variable integration
|
|
42
|
+
- **[Version Handling](docs/VersionHandling.md)** - Version management and update checking
|
|
43
|
+
- **[API Reference](docs/APIReference.md)** - API documentation
|
|
44
|
+
|
|
45
|
+
### [Examples](src/demo/README.md)
|
|
46
|
+
|
|
47
|
+
- **[Basic CLI](src/demo/basic.ts)** - Minimal CLI setup with version handling
|
|
48
|
+
- **[Arguments Demo](src/demo/arguments.ts)** - All argument types including custom date arguments
|
|
49
|
+
- **[Operands Demo](src/demo/operands.ts)** - Working with positional arguments (operands)
|
|
50
|
+
- **[No Operands Demo](src/demo/noOperands.ts)** - CLIs that only accept flags and options
|
|
51
|
+
- **[Subcommands Demo](src/demo/subcommands.ts)** - CLI with multiple subcommands and arguments
|
|
52
|
+
- **[Version Handling](src/demo/version.ts)** - Version checking and update notifications
|
|
53
|
+
- **[Reading from stdin](src/demo/stdin.ts)** - Processing input from stdin
|
|
54
|
+
|
|
55
|
+
## Example
|
|
56
|
+
|
|
57
|
+
```typescript
|
|
58
|
+
import {
|
|
59
|
+
parseCliArguments,
|
|
60
|
+
stringArgument,
|
|
61
|
+
stringArrayArgument,
|
|
62
|
+
booleanArgument,
|
|
63
|
+
numberArgument,
|
|
64
|
+
enumArgument
|
|
65
|
+
} from '@cloud-copilot/cli'
|
|
66
|
+
|
|
67
|
+
const cli = await parseCliArguments(
|
|
68
|
+
'my-command',
|
|
69
|
+
// optional subcommands
|
|
70
|
+
{
|
|
71
|
+
init: {
|
|
72
|
+
description: 'Initialize the project',
|
|
73
|
+
// Subcommand Specific Arguments
|
|
74
|
+
arguments: {
|
|
75
|
+
s3: booleanArgument({
|
|
76
|
+
description: 'Use S3 as the storage',
|
|
77
|
+
character: 's'
|
|
78
|
+
}),
|
|
79
|
+
language: enumArgument({
|
|
80
|
+
description: 'The language to use',
|
|
81
|
+
validValues: ['typescript', 'javascript']
|
|
82
|
+
})
|
|
83
|
+
}
|
|
84
|
+
},
|
|
85
|
+
download: {
|
|
86
|
+
description: 'Download a file',
|
|
87
|
+
// Subcommand Specific Arguments
|
|
88
|
+
arguments: {
|
|
89
|
+
url: stringArgument({
|
|
90
|
+
description: 'The URL to download from'
|
|
91
|
+
})
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
},
|
|
95
|
+
// Global Arguments that apply to all subcommands
|
|
96
|
+
{
|
|
97
|
+
regions: stringArrayArgument({
|
|
98
|
+
description: 'Regions to deploy to'
|
|
99
|
+
}),
|
|
100
|
+
account: stringArgument({
|
|
101
|
+
description: 'AWS account to deploy to'
|
|
102
|
+
}),
|
|
103
|
+
ssl: booleanArgument({
|
|
104
|
+
description: 'Enable SSL',
|
|
105
|
+
character: 's'
|
|
106
|
+
}),
|
|
107
|
+
port: numberArgument({
|
|
108
|
+
description: 'Port to use'
|
|
109
|
+
})
|
|
110
|
+
},
|
|
111
|
+
{}
|
|
112
|
+
)
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
This will automatically pull in the arguments from the command line and validate them. If any arguments are not valid, it will throw an error with the message of what is wrong. If all arguments and subcommands are valid, it will return an object with a type safe response.
|
|
116
|
+
|
|
117
|
+
```typescript
|
|
118
|
+
cli.subcommand // 'init' | 'download' | undefined
|
|
119
|
+
cli.args.regions // string[] | undefined
|
|
120
|
+
cli.args.account // string | undefined
|
|
121
|
+
cli.args.ssl // boolean
|
|
122
|
+
cli.args.port // number | undefined
|
|
123
|
+
|
|
124
|
+
cli.anyValues // boolean, whether any values were provided on the CLI
|
|
125
|
+
|
|
126
|
+
if (cli.subcommand === 'init') {
|
|
127
|
+
// Type Checked command specific arguments only in the return type if the subcommand is selected
|
|
128
|
+
cli.args.s3 // boolean
|
|
129
|
+
cli.args.language // 'typescript' | 'javascript' | undefined
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
if (cli.subcommand === 'download') {
|
|
133
|
+
cli.args.url // string | undefined
|
|
134
|
+
}
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
If the user provides `--help` a help message will be printed out with the available subcommands and arguments.
|
|
138
|
+
|
|
139
|
+
## Installation
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
npm install @cloud-copilot/cli
|
|
143
|
+
```
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
export type ValidValue<T> = {
|
|
2
|
+
valid: true;
|
|
3
|
+
value: T;
|
|
4
|
+
};
|
|
5
|
+
export type InvalidValue = {
|
|
6
|
+
valid: false;
|
|
7
|
+
message: string;
|
|
8
|
+
};
|
|
9
|
+
export type ValidatedValues<T> = ValidValue<T> | InvalidValue;
|
|
10
|
+
export type Argument<ArgumentType> = {
|
|
11
|
+
/**
|
|
12
|
+
* A description of the argument, used in help text.
|
|
13
|
+
*/
|
|
14
|
+
description: string;
|
|
15
|
+
/**
|
|
16
|
+
* The default value of the argument, if any.
|
|
17
|
+
* If not provided, the argument will be undefined until a value is provided.
|
|
18
|
+
*/
|
|
19
|
+
defaultValue: ArgumentType;
|
|
20
|
+
/**
|
|
21
|
+
* Validate all values passed to the argument at once.
|
|
22
|
+
* @param currentValue the current value of the argument
|
|
23
|
+
* @param values the array of strings passed to the argument
|
|
24
|
+
* @param isCurrentlyDefaulted true if the current value has not been set by the user and is still the default value
|
|
25
|
+
* @returns if the value is invalid, returns { valid: false, message: string } and message will be shown to the user.
|
|
26
|
+
* if the value is valid, returns { valid: true, values`: ArgumentType[] } where value is the parsed value.
|
|
27
|
+
*/
|
|
28
|
+
validateValues: (currentValue: ArgumentType, values: string[], isCurrentlyDefaulted: boolean) => Promise<ValidValue<ArgumentType> | InvalidValue> | ValidValue<ArgumentType> | InvalidValue;
|
|
29
|
+
/**
|
|
30
|
+
* Reduces the current value and a new values into a single value.
|
|
31
|
+
*
|
|
32
|
+
* @param current the current value of the argument, can be undefined if there is no default value
|
|
33
|
+
* @param newValues the new values being added as parsed by validateValues
|
|
34
|
+
* @param isCurrentlyDefaulted true if the current value has not been set by the user and is still the default value
|
|
35
|
+
* @returns the new value of the argument
|
|
36
|
+
*/
|
|
37
|
+
reduceValues: (currentValue: ArgumentType, newValues: NonNullable<ArgumentType>, isCurrentlyDefaulted: boolean) => Promise<ArgumentType> | ArgumentType;
|
|
38
|
+
/**
|
|
39
|
+
* If this callback is provided, it will be called when the argument is present
|
|
40
|
+
*
|
|
41
|
+
* @param currentValue the current value of the argument
|
|
42
|
+
* @returns the value to set the argument to
|
|
43
|
+
*/
|
|
44
|
+
present?(currentValue: ArgumentType): Promise<ArgumentType> | ArgumentType;
|
|
45
|
+
/**
|
|
46
|
+
* If this function is provided, it will be called to determine if the argument
|
|
47
|
+
* can accept multiple values.
|
|
48
|
+
*
|
|
49
|
+
* If not provided, the argument will only accept a single value.
|
|
50
|
+
*
|
|
51
|
+
* @returns true if the argument can accept multiple values, false otherwise
|
|
52
|
+
*/
|
|
53
|
+
acceptMultipleValues?(): boolean;
|
|
54
|
+
/**
|
|
55
|
+
* A single-character alias for the argument, e.g. 'f' for --foo
|
|
56
|
+
*
|
|
57
|
+
* This is only valid if the argument does not take a value (e.g. boolean flags).
|
|
58
|
+
*/
|
|
59
|
+
character?: string;
|
|
60
|
+
};
|
|
61
|
+
export type PerArgumentArgs = Pick<Argument<any>, 'description'>;
|
|
62
|
+
export type CustomArgument<ArgumentType> = Omit<Argument<ArgumentType>, 'character'>;
|
|
63
|
+
//# sourceMappingURL=argument.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"argument.d.ts","sourceRoot":"","sources":["../../../src/arguments/argument.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI;IAAE,KAAK,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,CAAC,CAAA;CAAE,CAAA;AACrD,MAAM,MAAM,YAAY,GAAG;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAA;AAC5D,MAAM,MAAM,eAAe,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,GAAG,YAAY,CAAA;AAE7D,MAAM,MAAM,QAAQ,CAAC,YAAY,IAAI;IACnC;;OAEG;IACH,WAAW,EAAE,MAAM,CAAA;IAEnB;;;OAGG;IACH,YAAY,EAAE,YAAY,CAAA;IAE1B;;;;;;;OAOG;IACH,cAAc,EAAE,CACd,YAAY,EAAE,YAAY,EAC1B,MAAM,EAAE,MAAM,EAAE,EAChB,oBAAoB,EAAE,OAAO,KAC1B,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,GAAG,YAAY,CAAC,GAAG,UAAU,CAAC,YAAY,CAAC,GAAG,YAAY,CAAA;IAE/F;;;;;;;OAOG;IACH,YAAY,EAAE,CACZ,YAAY,EAAE,YAAY,EAC1B,SAAS,EAAE,WAAW,CAAC,YAAY,CAAC,EACpC,oBAAoB,EAAE,OAAO,KAC1B,OAAO,CAAC,YAAY,CAAC,GAAG,YAAY,CAAA;IAEzC;;;;;OAKG;IACH,OAAO,CAAC,CAAC,YAAY,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,GAAG,YAAY,CAAA;IAE1E;;;;;;;OAOG;IACH,oBAAoB,CAAC,IAAI,OAAO,CAAA;IAEhC;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAA;AAED,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,aAAa,CAAC,CAAA;AAChE,MAAM,MAAM,cAAc,CAAC,YAAY,IAAI,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,WAAW,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"argument.js","sourceRoot":"","sources":["../../../src/arguments/argument.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type Argument, type PerArgumentArgs, type ValidatedValues } from './argument.js';
|
|
2
|
+
type ArrayValueValidator<ValueType> = (rawValue: string) => Promise<ValidatedValues<ValueType>> | ValidatedValues<ValueType>;
|
|
3
|
+
type ArrayWithDefault<ValueType> = {
|
|
4
|
+
defaultValue: ValueType[];
|
|
5
|
+
} & PerArgumentArgs;
|
|
6
|
+
type ArrayWithoutDefault<ValueType> = {
|
|
7
|
+
defaultValue?: undefined;
|
|
8
|
+
} & PerArgumentArgs;
|
|
9
|
+
/**
|
|
10
|
+
* Creates an array value argument factory for a specific type
|
|
11
|
+
*/
|
|
12
|
+
export declare function arrayValueArgument<ValueType>(validator: ArrayValueValidator<ValueType>, descriptionSuffix?: string): {
|
|
13
|
+
(options: ArrayWithDefault<ValueType>): Argument<ValueType[]>;
|
|
14
|
+
(options: ArrayWithoutDefault<ValueType>): Argument<ValueType[] | undefined>;
|
|
15
|
+
};
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=arrayValueArgument.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arrayValueArgument.d.ts","sourceRoot":"","sources":["../../../src/arguments/arrayValueArgument.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,eAAe,EAAE,KAAK,eAAe,EAAE,MAAM,eAAe,CAAA;AAEzF,KAAK,mBAAmB,CAAC,SAAS,IAAI,CACpC,QAAQ,EAAE,MAAM,KACb,OAAO,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,GAAG,eAAe,CAAC,SAAS,CAAC,CAAA;AAErE,KAAK,gBAAgB,CAAC,SAAS,IAAI;IAAE,YAAY,EAAE,SAAS,EAAE,CAAA;CAAE,GAAG,eAAe,CAAA;AAClF,KAAK,mBAAmB,CAAC,SAAS,IAAI;IAAE,YAAY,CAAC,EAAE,SAAS,CAAA;CAAE,GAAG,eAAe,CAAA;AAKpF;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAC1C,SAAS,EAAE,mBAAmB,CAAC,SAAS,CAAC,EACzC,iBAAiB,GAAE,MAAW;cAEG,gBAAgB,CAAC,SAAS,CAAC,GAAG,QAAQ,CAAC,SAAS,EAAE,CAAC;cAEzE,mBAAmB,CAAC,SAAS,CAAC,GACtC,QAAQ,CAAC,SAAS,EAAE,GAAG,SAAS,CAAC;EA2CrC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.arrayValueArgument = arrayValueArgument;
|
|
4
|
+
/**
|
|
5
|
+
* Creates an array value argument factory for a specific type
|
|
6
|
+
*/
|
|
7
|
+
function arrayValueArgument(validator, descriptionSuffix = '') {
|
|
8
|
+
function createArgument(options) {
|
|
9
|
+
return {
|
|
10
|
+
description: options.description + descriptionSuffix,
|
|
11
|
+
validateValues: async (current, values, isCurrentlyDefaulted) => {
|
|
12
|
+
if (values.length === 0) {
|
|
13
|
+
return { valid: false, message: 'at least one value is required' };
|
|
14
|
+
}
|
|
15
|
+
const validatedValues = [];
|
|
16
|
+
for (const rawValue of values) {
|
|
17
|
+
const result = await validator(rawValue);
|
|
18
|
+
if (!result.valid) {
|
|
19
|
+
return result;
|
|
20
|
+
}
|
|
21
|
+
validatedValues.push(result.value);
|
|
22
|
+
}
|
|
23
|
+
return { valid: true, value: validatedValues };
|
|
24
|
+
},
|
|
25
|
+
reduceValues: async (current, newValues, isCurrentlyDefaulted) => {
|
|
26
|
+
if (isCurrentlyDefaulted || !current) {
|
|
27
|
+
return newValues;
|
|
28
|
+
}
|
|
29
|
+
current.push(...newValues);
|
|
30
|
+
return current;
|
|
31
|
+
},
|
|
32
|
+
defaultValue: options.defaultValue,
|
|
33
|
+
acceptMultipleValues: () => true
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
return createArgument;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=arrayValueArgument.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arrayValueArgument.js","sourceRoot":"","sources":["../../../src/arguments/arrayValueArgument.ts"],"names":[],"mappings":";;AAeA,gDAkDC;AArDD;;GAEG;AACH,SAAgB,kBAAkB,CAChC,SAAyC,EACzC,oBAA4B,EAAE;IAM9B,SAAS,cAAc,CACrB,OAA4C;QAE5C,OAAO;YACL,WAAW,EAAE,OAAO,CAAC,WAAW,GAAG,iBAAiB;YACpD,cAAc,EAAE,KAAK,EACnB,OAAgC,EAChC,MAAgB,EAChB,oBAA6B,EACU,EAAE;gBACzC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACxB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,gCAAgC,EAAE,CAAA;gBACpE,CAAC;gBAED,MAAM,eAAe,GAAgB,EAAE,CAAA;gBACvC,KAAK,MAAM,QAAQ,IAAI,MAAM,EAAE,CAAC;oBAC9B,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,CAAA;oBACxC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;wBAClB,OAAO,MAAM,CAAA;oBACf,CAAC;oBACD,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;gBACpC,CAAC;gBAED,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,eAAe,EAAE,CAAA;YAChD,CAAC;YACD,YAAY,EAAE,KAAK,EACjB,OAAgC,EAChC,SAAsB,EACtB,oBAA8B,EAC9B,EAAE;gBACF,IAAI,oBAAoB,IAAI,CAAC,OAAO,EAAE,CAAC;oBACrC,OAAO,SAAS,CAAA;gBAClB,CAAC;gBACD,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,CAAA;gBAC1B,OAAO,OAAO,CAAA;YAChB,CAAC;YACD,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,oBAAoB,EAAE,GAAG,EAAE,CAAC,IAAI;SACjC,CAAA;IACH,CAAC;IAED,OAAO,cAAc,CAAA;AACvB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type Argument, type PerArgumentArgs } from './argument.js';
|
|
2
|
+
/**
|
|
3
|
+
* Creates a boolean argument that is false by default and true if present.
|
|
4
|
+
*
|
|
5
|
+
* @param options the description and the single character that can be used to set the value to true
|
|
6
|
+
* @returns a boolean argument
|
|
7
|
+
*/
|
|
8
|
+
export declare function booleanArgument(options: {
|
|
9
|
+
character: string;
|
|
10
|
+
} & PerArgumentArgs): Argument<boolean>;
|
|
11
|
+
//# sourceMappingURL=booleanArgument.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"booleanArgument.d.ts","sourceRoot":"","sources":["../../../src/arguments/booleanArgument.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,eAAe,EAAwB,MAAM,eAAe,CAAA;AAEzF;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,eAAe,GAC/C,QAAQ,CAAC,OAAO,CAAC,CAkBnB"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.booleanArgument = booleanArgument;
|
|
4
|
+
/**
|
|
5
|
+
* Creates a boolean argument that is false by default and true if present.
|
|
6
|
+
*
|
|
7
|
+
* @param options the description and the single character that can be used to set the value to true
|
|
8
|
+
* @returns a boolean argument
|
|
9
|
+
*/
|
|
10
|
+
function booleanArgument(options) {
|
|
11
|
+
return {
|
|
12
|
+
description: options.description,
|
|
13
|
+
character: options.character,
|
|
14
|
+
validateValues: (currentValue, value, isCurrentlyDefaulted) => {
|
|
15
|
+
if (value.length == 0) {
|
|
16
|
+
return { valid: true, value: true };
|
|
17
|
+
}
|
|
18
|
+
return { valid: false, message: `does not accept values but received ${value.join(', ')}` };
|
|
19
|
+
},
|
|
20
|
+
reduceValues: (current, newValue, isCurrentlyDefaulted) => current,
|
|
21
|
+
present: (currentValue) => true,
|
|
22
|
+
defaultValue: false
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=booleanArgument.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"booleanArgument.js","sourceRoot":"","sources":["../../../src/arguments/booleanArgument.ts"],"names":[],"mappings":";;AAQA,0CAoBC;AA1BD;;;;;GAKG;AACH,SAAgB,eAAe,CAC7B,OAAgD;IAEhD,OAAO;QACL,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,cAAc,EAAE,CACd,YAAqB,EACrB,KAAe,EACf,oBAA6B,EACH,EAAE;YAC5B,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;gBACtB,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAA;YACrC,CAAC;YACD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,uCAAuC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAA;QAC7F,CAAC;QACD,YAAY,EAAE,CAAC,OAAgB,EAAE,QAAiB,EAAE,oBAA6B,EAAE,EAAE,CAAC,OAAO;QAC7F,OAAO,EAAE,CAAC,YAAqB,EAAE,EAAE,CAAC,IAAI;QACxC,YAAY,EAAE,KAAK;KACpB,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type NoExtraKeys } from '../utils.js';
|
|
2
|
+
import { type Argument, type PerArgumentArgs } from './argument.js';
|
|
3
|
+
type EnumType<T extends {
|
|
4
|
+
validValues: string[];
|
|
5
|
+
defaultValue?: string | undefined;
|
|
6
|
+
}> = T['defaultValue'] extends string ? T['validValues'][number] | T['defaultValue'] : T['validValues'][number];
|
|
7
|
+
type EnumOptions = {
|
|
8
|
+
defaultValue?: string;
|
|
9
|
+
validValues: string[];
|
|
10
|
+
} & PerArgumentArgs;
|
|
11
|
+
export declare function enumArgument<const O extends {
|
|
12
|
+
defaultValue: string;
|
|
13
|
+
validValues: string[];
|
|
14
|
+
} & PerArgumentArgs>(options: NoExtraKeys<O, EnumOptions>): Argument<EnumType<O>>;
|
|
15
|
+
export declare function enumArgument<const O extends {
|
|
16
|
+
defaultValue?: undefined;
|
|
17
|
+
validValues: string[];
|
|
18
|
+
} & PerArgumentArgs>(options: NoExtraKeys<O, EnumOptions>): Argument<EnumType<O> | undefined>;
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=enumArgument.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enumArgument.d.ts","sourceRoot":"","sources":["../../../src/arguments/enumArgument.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,eAAe,EAAwB,MAAM,eAAe,CAAA;AAEzF,KAAK,QAAQ,CAAC,CAAC,SAAS;IAAE,WAAW,EAAE,MAAM,EAAE,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,IAClF,CAAC,CAAC,cAAc,CAAC,SAAS,MAAM,GAC5B,CAAC,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,cAAc,CAAC,GAC5C,CAAC,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,CAAA;AAE9B,KAAK,WAAW,GAAG;IAAE,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,eAAe,CAAA;AAErF,wBAAgB,YAAY,CAC1B,KAAK,CAAC,CAAC,SAAS;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,eAAe,EACjF,OAAO,EAAE,WAAW,CAAC,CAAC,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;AAC9D,wBAAgB,YAAY,CAC1B,KAAK,CAAC,CAAC,SAAS;IAAE,YAAY,CAAC,EAAE,SAAS,CAAC;IAAC,WAAW,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,eAAe,EACrF,OAAO,EAAE,WAAW,CAAC,CAAC,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAA"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.enumArgument = enumArgument;
|
|
4
|
+
function enumArgument(options) {
|
|
5
|
+
return {
|
|
6
|
+
description: options.description +
|
|
7
|
+
`. One value required, valid values are: ${options.validValues.join(', ')}`,
|
|
8
|
+
validateValues: (currentValue, values, isCurrentlyDefaulted) => {
|
|
9
|
+
if (values.length == 0) {
|
|
10
|
+
return { valid: false, message: 'a value is required' };
|
|
11
|
+
}
|
|
12
|
+
if (currentValue != options.defaultValue) {
|
|
13
|
+
return { valid: false, message: 'expects a single value but was set multiple times' };
|
|
14
|
+
}
|
|
15
|
+
if (values.length > 1) {
|
|
16
|
+
return {
|
|
17
|
+
valid: false,
|
|
18
|
+
message: 'expects a single value but received ' + values.join(', ')
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
const value = values[0];
|
|
22
|
+
const match = options.validValues.find((v) => v.toLowerCase() === value.toLowerCase());
|
|
23
|
+
if (!match) {
|
|
24
|
+
return {
|
|
25
|
+
valid: false,
|
|
26
|
+
message: `${value} is not one of the allowed values: ${options.validValues.join(', ')}`
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
return { valid: true, value: match };
|
|
30
|
+
},
|
|
31
|
+
reduceValues: (current, newValue, isCurrentlyDefaulted) => newValue,
|
|
32
|
+
defaultValue: options.defaultValue
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=enumArgument.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enumArgument.js","sourceRoot":"","sources":["../../../src/arguments/enumArgument.ts"],"names":[],"mappings":";;AAgBA,oCA0CC;AA1CD,SAAgB,YAAY,CAE1B,OAAoC;IACpC,OAAO;QACL,WAAW,EACT,OAAO,CAAC,WAAW;YACnB,2CAA2C,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QAC7E,cAAc,EAAE,CACd,YAAqC,EACrC,MAAgB,EAChB,oBAA6B,EACC,EAAE;YAChC,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;gBACvB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,qBAAqB,EAAE,CAAA;YACzD,CAAC;YACD,IAAI,YAAY,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;gBACzC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,mDAAmD,EAAE,CAAA;YACvF,CAAC;YACD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtB,OAAO;oBACL,KAAK,EAAE,KAAK;oBACZ,OAAO,EAAE,sCAAsC,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;iBACpE,CAAA;YACH,CAAC;YACD,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;YACvB,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,WAAW,EAAE,CAAC,CAAA;YACtF,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO;oBACL,KAAK,EAAE,KAAK;oBACZ,OAAO,EAAE,GAAG,KAAK,sCAAsC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;iBACxF,CAAA;YACH,CAAC;YAED,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAoB,EAAE,CAAA;QACrD,CAAC;QACD,YAAY,EAAE,CACZ,OAAgC,EAChC,QAAqB,EACrB,oBAA6B,EAC7B,EAAE,CAAC,QAAQ;QACb,YAAY,EAAE,OAAO,CAAC,YAAY;KACnC,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type NoExtraKeys } from '../utils.js';
|
|
2
|
+
import { type Argument, type PerArgumentArgs } from './argument.js';
|
|
3
|
+
type EnumArrayType<T extends {
|
|
4
|
+
validValues: string[];
|
|
5
|
+
defaultValue?: string[] | undefined;
|
|
6
|
+
}> = T['defaultValue'] extends string[] ? T['validValues'][number] | T['defaultValue'][number] : T['validValues'][number];
|
|
7
|
+
type EnumArrayOptions = {
|
|
8
|
+
defaultValue?: string[];
|
|
9
|
+
validValues: string[];
|
|
10
|
+
} & PerArgumentArgs;
|
|
11
|
+
export declare function enumArrayArgument<const O extends {
|
|
12
|
+
defaultValue: string[];
|
|
13
|
+
validValues: string[];
|
|
14
|
+
} & PerArgumentArgs>(options: NoExtraKeys<O, EnumArrayOptions>): Argument<EnumArrayType<O>[]>;
|
|
15
|
+
export declare function enumArrayArgument<const O extends {
|
|
16
|
+
defaultValue?: undefined;
|
|
17
|
+
validValues: string[];
|
|
18
|
+
} & PerArgumentArgs>(options: NoExtraKeys<O, EnumArrayOptions>): Argument<EnumArrayType<O>[] | undefined>;
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=enumArrayArgument.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enumArrayArgument.d.ts","sourceRoot":"","sources":["../../../src/arguments/enumArrayArgument.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,eAAe,EAAwB,MAAM,eAAe,CAAA;AAEzF,KAAK,aAAa,CAAC,CAAC,SAAS;IAAE,WAAW,EAAE,MAAM,EAAE,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAA;CAAE,IACzF,CAAC,CAAC,cAAc,CAAC,SAAS,MAAM,EAAE,GAC9B,CAAC,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,GACpD,CAAC,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,CAAA;AAE9B,KAAK,gBAAgB,GAAG;IAAE,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,WAAW,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,eAAe,CAAA;AAE5F,wBAAgB,iBAAiB,CAC/B,KAAK,CAAC,CAAC,SAAS;IAAE,YAAY,EAAE,MAAM,EAAE,CAAC;IAAC,WAAW,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,eAAe,EACnF,OAAO,EAAE,WAAW,CAAC,CAAC,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;AAC1E,wBAAgB,iBAAiB,CAC/B,KAAK,CAAC,CAAC,SAAS;IAAE,YAAY,CAAC,EAAE,SAAS,CAAC;IAAC,WAAW,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,eAAe,EACrF,OAAO,EAAE,WAAW,CAAC,CAAC,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,GAAG,SAAS,CAAC,CAAA"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.enumArrayArgument = enumArrayArgument;
|
|
4
|
+
function enumArrayArgument(options) {
|
|
5
|
+
return {
|
|
6
|
+
description: options.description +
|
|
7
|
+
`. One or more values required, valid values are: ${options.validValues.join(', ')}`,
|
|
8
|
+
validateValues: async (currentValue, values, isCurrentlyDefaulted) => {
|
|
9
|
+
if (values.length == 0) {
|
|
10
|
+
return { valid: false, message: 'At least one value is required' };
|
|
11
|
+
}
|
|
12
|
+
const invalidValues = [];
|
|
13
|
+
const validValues = [];
|
|
14
|
+
for (const value of values) {
|
|
15
|
+
const match = options.validValues.find((v) => v.toLowerCase() === value.toLowerCase());
|
|
16
|
+
if (!match) {
|
|
17
|
+
invalidValues.push(value);
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
validValues.push(match);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
if (invalidValues.length > 0) {
|
|
24
|
+
return {
|
|
25
|
+
valid: false,
|
|
26
|
+
message: `${invalidValues.map((v) => `${v}`).join(', ')} is not one of the allowed values: ${options.validValues.join(', ')}`
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
return { valid: true, value: validValues };
|
|
30
|
+
},
|
|
31
|
+
reduceValues: async (current, newValues, isCurrentlyDefaulted) => {
|
|
32
|
+
if (isCurrentlyDefaulted || !current) {
|
|
33
|
+
// If the current value is the default or undefined, replace it entirely
|
|
34
|
+
return newValues;
|
|
35
|
+
}
|
|
36
|
+
current.push(...newValues);
|
|
37
|
+
return current;
|
|
38
|
+
},
|
|
39
|
+
defaultValue: options.defaultValue,
|
|
40
|
+
acceptMultipleValues: () => true
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=enumArrayArgument.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enumArrayArgument.js","sourceRoot":"","sources":["../../../src/arguments/enumArrayArgument.ts"],"names":[],"mappings":";;AAgBA,8CAoDC;AApDD,SAAgB,iBAAiB,CAG/B,OAAyC;IAEzC,OAAO;QACL,WAAW,EACT,OAAO,CAAC,WAAW;YACnB,oDAAoD,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QACtF,cAAc,EAAE,KAAK,EACnB,YAA4C,EAC5C,MAAgB,EAChB,oBAA6B,EACiB,EAAE;YAChD,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;gBACvB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,gCAAgC,EAAE,CAAA;YACpE,CAAC;YACD,MAAM,aAAa,GAAa,EAAE,CAAA;YAClC,MAAM,WAAW,GAAuB,EAAE,CAAA;YAC1C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAC3B,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,WAAW,EAAE,CAAC,CAAA;gBACtF,IAAI,CAAC,KAAK,EAAE,CAAC;oBACX,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;gBAC3B,CAAC;qBAAM,CAAC;oBACN,WAAW,CAAC,IAAI,CAAC,KAAyB,CAAC,CAAA;gBAC7C,CAAC;YACH,CAAC;YAED,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7B,OAAO;oBACL,KAAK,EAAE,KAAK;oBACZ,OAAO,EAAE,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,sCAAsC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;iBAC9H,CAAA;YACH,CAAC;YAED,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,CAAA;QAC5C,CAAC;QACD,YAAY,EAAE,KAAK,EACjB,OAAuC,EACvC,SAA6B,EAC7B,oBAA8B,EAC9B,EAAE;YACF,IAAI,oBAAoB,IAAI,CAAC,OAAO,EAAE,CAAC;gBACrC,wEAAwE;gBACxE,OAAO,SAAS,CAAA;YAClB,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,CAAA;YAC1B,OAAO,OAAO,CAAA;QAChB,CAAC;QACD,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,oBAAoB,EAAE,GAAG,EAAE,CAAC,IAAI;KACjC,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type Argument, type PerArgumentArgs } from './argument.js';
|
|
2
|
+
type MapResult = Record<string, string[]>;
|
|
3
|
+
type MapWithDefault = {
|
|
4
|
+
defaultValue: MapResult;
|
|
5
|
+
} & PerArgumentArgs;
|
|
6
|
+
type MapWithoutDefault = {
|
|
7
|
+
defaultValue?: undefined;
|
|
8
|
+
} & PerArgumentArgs;
|
|
9
|
+
/**
|
|
10
|
+
* Creates a map argument where the first value is the key and the rest are values.
|
|
11
|
+
*
|
|
12
|
+
* --arg-name key1 key1Value1 key1Value2 --arg-name key2 key2Value1 key2Value2
|
|
13
|
+
*
|
|
14
|
+
* @param options the description and optional default value
|
|
15
|
+
* @returns a map argument
|
|
16
|
+
*/
|
|
17
|
+
export declare function mapArgument(options: MapWithDefault): Argument<MapResult>;
|
|
18
|
+
export declare function mapArgument(options: MapWithoutDefault): Argument<MapResult | undefined>;
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=mapArgument.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mapArgument.d.ts","sourceRoot":"","sources":["../../../src/arguments/mapArgument.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,eAAe,EAAwB,MAAM,eAAe,CAAA;AAEzF,KAAK,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;AAEzC,KAAK,cAAc,GAAG;IAAE,YAAY,EAAE,SAAS,CAAA;CAAE,GAAG,eAAe,CAAA;AACnE,KAAK,iBAAiB,GAAG;IAAE,YAAY,CAAC,EAAE,SAAS,CAAA;CAAE,GAAG,eAAe,CAAA;AAGvE;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,cAAc,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAA;AACzE,wBAAgB,WAAW,CAAC,OAAO,EAAE,iBAAiB,GAAG,QAAQ,CAAC,SAAS,GAAG,SAAS,CAAC,CAAA"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.mapArgument = mapArgument;
|
|
4
|
+
function mapArgument(options) {
|
|
5
|
+
return {
|
|
6
|
+
description: options.description + `. Each instance requires a key and at least one value.`,
|
|
7
|
+
validateValues: async (currentValue, values, isCurrentlyDefaulted) => {
|
|
8
|
+
const [first, ...rest] = values;
|
|
9
|
+
if (!first) {
|
|
10
|
+
return { valid: false, message: 'a key is required and at least one value is required' };
|
|
11
|
+
}
|
|
12
|
+
if (rest.length < 1) {
|
|
13
|
+
return { valid: false, message: `${first} requires at least one value` };
|
|
14
|
+
}
|
|
15
|
+
if (!isCurrentlyDefaulted && currentValue && first in currentValue) {
|
|
16
|
+
return { valid: false, message: `${first} is set multiple times` };
|
|
17
|
+
}
|
|
18
|
+
return {
|
|
19
|
+
valid: true,
|
|
20
|
+
value: {
|
|
21
|
+
[first]: rest
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
},
|
|
25
|
+
reduceValues: async (current, newValue, isCurrentlyDefaulted) => {
|
|
26
|
+
if (isCurrentlyDefaulted || !current) {
|
|
27
|
+
return { ...newValue };
|
|
28
|
+
}
|
|
29
|
+
return { ...current, ...newValue };
|
|
30
|
+
},
|
|
31
|
+
defaultValue: options.defaultValue,
|
|
32
|
+
acceptMultipleValues: () => true
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=mapArgument.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mapArgument.js","sourceRoot":"","sources":["../../../src/arguments/mapArgument.ts"],"names":[],"mappings":";;AAkBA,kCAwCC;AAxCD,SAAgB,WAAW,CACzB,OAA+B;IAE/B,OAAO;QACL,WAAW,EAAE,OAAO,CAAC,WAAW,GAAG,wDAAwD;QAC3F,cAAc,EAAE,KAAK,EACnB,YAAmC,EACnC,MAAgB,EAChB,oBAA6B,EACQ,EAAE;YACvC,MAAM,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,GAAG,MAAM,CAAA;YAC/B,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,sDAAsD,EAAE,CAAA;YAC1F,CAAC;YACD,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACpB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,KAAK,8BAA8B,EAAE,CAAA;YAC1E,CAAC;YACD,IAAI,CAAC,oBAAoB,IAAI,YAAY,IAAI,KAAK,IAAI,YAAY,EAAE,CAAC;gBACnE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,KAAK,wBAAwB,EAAE,CAAA;YACpE,CAAC;YACD,OAAO;gBACL,KAAK,EAAE,IAAI;gBACX,KAAK,EAAE;oBACL,CAAC,KAAK,CAAC,EAAE,IAAI;iBACd;aACF,CAAA;QACH,CAAC;QACD,YAAY,EAAE,KAAK,EACjB,OAA8B,EAC9B,QAAmB,EACnB,oBAA6B,EAC7B,EAAE;YACF,IAAI,oBAAoB,IAAI,CAAC,OAAO,EAAE,CAAC;gBACrC,OAAO,EAAE,GAAG,QAAQ,EAAE,CAAA;YACxB,CAAC;YACD,OAAO,EAAE,GAAG,OAAO,EAAE,GAAG,QAAQ,EAAE,CAAA;QACpC,CAAC;QACD,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,oBAAoB,EAAE,GAAG,EAAE,CAAC,IAAI;KACjC,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export declare const numberArgument: {
|
|
2
|
+
(options: {
|
|
3
|
+
defaultValue: number;
|
|
4
|
+
} & import("./argument.js").PerArgumentArgs): import("./argument.js").Argument<number>;
|
|
5
|
+
(options: {
|
|
6
|
+
defaultValue?: undefined;
|
|
7
|
+
} & import("./argument.js").PerArgumentArgs): import("./argument.js").Argument<number | undefined>;
|
|
8
|
+
};
|
|
9
|
+
export declare const numberArrayArgument: {
|
|
10
|
+
(options: {
|
|
11
|
+
defaultValue: number[];
|
|
12
|
+
} & import("./argument.js").PerArgumentArgs): import("./argument.js").Argument<number[]>;
|
|
13
|
+
(options: {
|
|
14
|
+
defaultValue?: undefined;
|
|
15
|
+
} & import("./argument.js").PerArgumentArgs): import("./argument.js").Argument<number[] | undefined>;
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=numberArguments.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"numberArguments.d.ts","sourceRoot":"","sources":["../../../src/arguments/numberArguments.ts"],"names":[],"mappings":"AAYA,eAAO,MAAM,cAAc;;;;;;;CAAwE,CAAA;AAEnG,eAAO,MAAM,mBAAmB;;;;;;;CAG/B,CAAA"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.numberArrayArgument = exports.numberArgument = void 0;
|
|
4
|
+
const arrayValueArgument_js_1 = require("./arrayValueArgument.js");
|
|
5
|
+
const singleValueArgument_js_1 = require("./singleValueArgument.js");
|
|
6
|
+
function validateNumber(rawValue) {
|
|
7
|
+
const num = Number(rawValue);
|
|
8
|
+
if (isNaN(num)) {
|
|
9
|
+
return { valid: false, message: `expects a number but received ${rawValue}` };
|
|
10
|
+
}
|
|
11
|
+
return { valid: true, value: num };
|
|
12
|
+
}
|
|
13
|
+
exports.numberArgument = (0, singleValueArgument_js_1.singleValueArgument)(validateNumber, '. One number required.');
|
|
14
|
+
exports.numberArrayArgument = (0, arrayValueArgument_js_1.arrayValueArgument)(validateNumber, '. One or more numbers required.');
|
|
15
|
+
//# sourceMappingURL=numberArguments.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"numberArguments.js","sourceRoot":"","sources":["../../../src/arguments/numberArguments.ts"],"names":[],"mappings":";;;AACA,mEAA4D;AAC5D,qEAA8D;AAE9D,SAAS,cAAc,CAAC,QAAgB;IACtC,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAA;IAC5B,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACf,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,iCAAiC,QAAQ,EAAE,EAAE,CAAA;IAC/E,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,CAAA;AACpC,CAAC;AAEY,QAAA,cAAc,GAAG,IAAA,4CAAmB,EAAS,cAAc,EAAE,wBAAwB,CAAC,CAAA;AAEtF,QAAA,mBAAmB,GAAG,IAAA,0CAAkB,EACnD,cAAc,EACd,iCAAiC,CAClC,CAAA"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type Argument, type PerArgumentArgs, type ValidatedValues } from './argument.js';
|
|
2
|
+
type SingleValueValidator<ValueType> = (rawValue: string) => Promise<ValidatedValues<ValueType>> | ValidatedValues<ValueType>;
|
|
3
|
+
type ArgumentWithDefault<ValueType> = {
|
|
4
|
+
defaultValue: ValueType;
|
|
5
|
+
} & PerArgumentArgs;
|
|
6
|
+
type ArgumentWithoutDefault<ValueType> = {
|
|
7
|
+
defaultValue?: undefined;
|
|
8
|
+
} & PerArgumentArgs;
|
|
9
|
+
/**
|
|
10
|
+
* Creates a single value argument factory for a specific type
|
|
11
|
+
*/
|
|
12
|
+
export declare function singleValueArgument<ValueType>(validator: SingleValueValidator<ValueType>, descriptionSuffix?: string): {
|
|
13
|
+
(options: ArgumentWithDefault<ValueType>): Argument<ValueType>;
|
|
14
|
+
(options: ArgumentWithoutDefault<ValueType>): Argument<ValueType | undefined>;
|
|
15
|
+
};
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=singleValueArgument.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"singleValueArgument.d.ts","sourceRoot":"","sources":["../../../src/arguments/singleValueArgument.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,eAAe,EAAE,KAAK,eAAe,EAAE,MAAM,eAAe,CAAA;AAEzF,KAAK,oBAAoB,CAAC,SAAS,IAAI,CACrC,QAAQ,EAAE,MAAM,KACb,OAAO,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,GAAG,eAAe,CAAC,SAAS,CAAC,CAAA;AAErE,KAAK,mBAAmB,CAAC,SAAS,IAAI;IAAE,YAAY,EAAE,SAAS,CAAA;CAAE,GAAG,eAAe,CAAA;AACnF,KAAK,sBAAsB,CAAC,SAAS,IAAI;IAAE,YAAY,CAAC,EAAE,SAAS,CAAA;CAAE,GAAG,eAAe,CAAA;AAKvF;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAC3C,SAAS,EAAE,oBAAoB,CAAC,SAAS,CAAC,EAC1C,iBAAiB,GAAE,MAAW;cAEG,mBAAmB,CAAC,SAAS,CAAC,GAAG,QAAQ,CAAC,SAAS,CAAC;cAE1E,sBAAsB,CAAC,SAAS,CAAC,GACzC,QAAQ,CAAC,SAAS,GAAG,SAAS,CAAC;EAuCnC"}
|