@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.
Files changed (117) hide show
  1. package/LICENSE.txt +21 -0
  2. package/README.md +143 -0
  3. package/dist/cjs/arguments/argument.d.ts +63 -0
  4. package/dist/cjs/arguments/argument.d.ts.map +1 -0
  5. package/dist/cjs/arguments/argument.js +3 -0
  6. package/dist/cjs/arguments/argument.js.map +1 -0
  7. package/dist/cjs/arguments/arrayValueArgument.d.ts +17 -0
  8. package/dist/cjs/arguments/arrayValueArgument.d.ts.map +1 -0
  9. package/dist/cjs/arguments/arrayValueArgument.js +38 -0
  10. package/dist/cjs/arguments/arrayValueArgument.js.map +1 -0
  11. package/dist/cjs/arguments/booleanArgument.d.ts +11 -0
  12. package/dist/cjs/arguments/booleanArgument.d.ts.map +1 -0
  13. package/dist/cjs/arguments/booleanArgument.js +25 -0
  14. package/dist/cjs/arguments/booleanArgument.js.map +1 -0
  15. package/dist/cjs/arguments/enumArgument.d.ts +20 -0
  16. package/dist/cjs/arguments/enumArgument.d.ts.map +1 -0
  17. package/dist/cjs/arguments/enumArgument.js +35 -0
  18. package/dist/cjs/arguments/enumArgument.js.map +1 -0
  19. package/dist/cjs/arguments/enumArrayArgument.d.ts +20 -0
  20. package/dist/cjs/arguments/enumArrayArgument.d.ts.map +1 -0
  21. package/dist/cjs/arguments/enumArrayArgument.js +43 -0
  22. package/dist/cjs/arguments/enumArrayArgument.js.map +1 -0
  23. package/dist/cjs/arguments/mapArgument.d.ts +20 -0
  24. package/dist/cjs/arguments/mapArgument.d.ts.map +1 -0
  25. package/dist/cjs/arguments/mapArgument.js +35 -0
  26. package/dist/cjs/arguments/mapArgument.js.map +1 -0
  27. package/dist/cjs/arguments/numberArguments.d.ts +17 -0
  28. package/dist/cjs/arguments/numberArguments.d.ts.map +1 -0
  29. package/dist/cjs/arguments/numberArguments.js +15 -0
  30. package/dist/cjs/arguments/numberArguments.js.map +1 -0
  31. package/dist/cjs/arguments/singleValueArgument.d.ts +17 -0
  32. package/dist/cjs/arguments/singleValueArgument.d.ts.map +1 -0
  33. package/dist/cjs/arguments/singleValueArgument.js +35 -0
  34. package/dist/cjs/arguments/singleValueArgument.js.map +1 -0
  35. package/dist/cjs/arguments/stringArguments.d.ts +17 -0
  36. package/dist/cjs/arguments/stringArguments.d.ts.map +1 -0
  37. package/dist/cjs/arguments/stringArguments.js +14 -0
  38. package/dist/cjs/arguments/stringArguments.js.map +1 -0
  39. package/dist/cjs/cli.d.ts +131 -0
  40. package/dist/cjs/cli.d.ts.map +1 -0
  41. package/dist/cjs/cli.js +499 -0
  42. package/dist/cjs/cli.js.map +1 -0
  43. package/dist/cjs/index.d.ts +13 -0
  44. package/dist/cjs/index.d.ts.map +1 -0
  45. package/dist/cjs/index.js +28 -0
  46. package/dist/cjs/index.js.map +1 -0
  47. package/dist/cjs/package.json +3 -0
  48. package/dist/cjs/readRelative.d.ts +35 -0
  49. package/dist/cjs/readRelative.d.ts.map +1 -0
  50. package/dist/cjs/readRelative.js +81 -0
  51. package/dist/cjs/readRelative.js.map +1 -0
  52. package/dist/cjs/stdin.d.ts +7 -0
  53. package/dist/cjs/stdin.d.ts.map +1 -0
  54. package/dist/cjs/stdin.js +38 -0
  55. package/dist/cjs/stdin.js.map +1 -0
  56. package/dist/cjs/utils.d.ts +14 -0
  57. package/dist/cjs/utils.d.ts.map +1 -0
  58. package/dist/cjs/utils.js +21 -0
  59. package/dist/cjs/utils.js.map +1 -0
  60. package/dist/esm/arguments/argument.d.ts +63 -0
  61. package/dist/esm/arguments/argument.d.ts.map +1 -0
  62. package/dist/esm/arguments/argument.js +2 -0
  63. package/dist/esm/arguments/argument.js.map +1 -0
  64. package/dist/esm/arguments/arrayValueArgument.d.ts +17 -0
  65. package/dist/esm/arguments/arrayValueArgument.d.ts.map +1 -0
  66. package/dist/esm/arguments/arrayValueArgument.js +36 -0
  67. package/dist/esm/arguments/arrayValueArgument.js.map +1 -0
  68. package/dist/esm/arguments/booleanArgument.d.ts +11 -0
  69. package/dist/esm/arguments/booleanArgument.d.ts.map +1 -0
  70. package/dist/esm/arguments/booleanArgument.js +23 -0
  71. package/dist/esm/arguments/booleanArgument.js.map +1 -0
  72. package/dist/esm/arguments/enumArgument.d.ts +20 -0
  73. package/dist/esm/arguments/enumArgument.d.ts.map +1 -0
  74. package/dist/esm/arguments/enumArgument.js +34 -0
  75. package/dist/esm/arguments/enumArgument.js.map +1 -0
  76. package/dist/esm/arguments/enumArrayArgument.d.ts +20 -0
  77. package/dist/esm/arguments/enumArrayArgument.d.ts.map +1 -0
  78. package/dist/esm/arguments/enumArrayArgument.js +42 -0
  79. package/dist/esm/arguments/enumArrayArgument.js.map +1 -0
  80. package/dist/esm/arguments/mapArgument.d.ts +20 -0
  81. package/dist/esm/arguments/mapArgument.d.ts.map +1 -0
  82. package/dist/esm/arguments/mapArgument.js +33 -0
  83. package/dist/esm/arguments/mapArgument.js.map +1 -0
  84. package/dist/esm/arguments/numberArguments.d.ts +17 -0
  85. package/dist/esm/arguments/numberArguments.d.ts.map +1 -0
  86. package/dist/esm/arguments/numberArguments.js +13 -0
  87. package/dist/esm/arguments/numberArguments.js.map +1 -0
  88. package/dist/esm/arguments/singleValueArgument.d.ts +17 -0
  89. package/dist/esm/arguments/singleValueArgument.d.ts.map +1 -0
  90. package/dist/esm/arguments/singleValueArgument.js +33 -0
  91. package/dist/esm/arguments/singleValueArgument.js.map +1 -0
  92. package/dist/esm/arguments/stringArguments.d.ts +17 -0
  93. package/dist/esm/arguments/stringArguments.d.ts.map +1 -0
  94. package/dist/esm/arguments/stringArguments.js +11 -0
  95. package/dist/esm/arguments/stringArguments.js.map +1 -0
  96. package/dist/esm/cli.d.ts +131 -0
  97. package/dist/esm/cli.d.ts.map +1 -0
  98. package/dist/esm/cli.js +494 -0
  99. package/dist/esm/cli.js.map +1 -0
  100. package/dist/esm/index.d.ts +13 -0
  101. package/dist/esm/index.d.ts.map +1 -0
  102. package/dist/esm/index.js +13 -0
  103. package/dist/esm/index.js.map +1 -0
  104. package/dist/esm/package.json +3 -0
  105. package/dist/esm/readRelative.d.ts +35 -0
  106. package/dist/esm/readRelative.d.ts.map +1 -0
  107. package/dist/esm/readRelative.js +74 -0
  108. package/dist/esm/readRelative.js.map +1 -0
  109. package/dist/esm/stdin.d.ts +7 -0
  110. package/dist/esm/stdin.d.ts.map +1 -0
  111. package/dist/esm/stdin.js +35 -0
  112. package/dist/esm/stdin.js.map +1 -0
  113. package/dist/esm/utils.d.ts +14 -0
  114. package/dist/esm/utils.d.ts.map +1 -0
  115. package/dist/esm/utils.js +18 -0
  116. package/dist/esm/utils.js.map +1 -0
  117. 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
+ [![NPM Version](https://img.shields.io/npm/v/@cloud-copilot/cli.svg?logo=nodedotjs)](https://www.npmjs.com/package/@cloud-copilot/cli) [![MIT License](https://img.shields.io/github/license/cloud-copilot/cli)](LICENSE.txt)
4
+
5
+ [![GuardDog](https://github.com/cloud-copilot/cli/actions/workflows/guarddog.yml/badge.svg)](https://github.com/cloud-copilot/cli/actions/workflows/guarddog.yml) [![Known Vulnerabilities](https://snyk.io/test/github/cloud-copilot/cli/badge.svg?targetFile=package.json&style=flat-square)](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,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=argument.js.map
@@ -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"}