jackspeak 3.0.0 → 3.1.0
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/README.md +3 -0
- package/dist/commonjs/index.d.ts +22 -16
- package/dist/commonjs/index.d.ts.map +1 -1
- package/dist/commonjs/index.js +127 -24
- package/dist/commonjs/index.js.map +1 -1
- package/dist/esm/index.d.ts +22 -16
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +127 -24
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/parse-args.js +2 -2
- package/dist/esm/parse-args.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -155,6 +155,9 @@ Options:
|
|
|
155
155
|
in the usage output, like `--option=<hint>`
|
|
156
156
|
- `validate` A function that returns false (or throws) if an
|
|
157
157
|
option value is invalid.
|
|
158
|
+
- `validOptions` An array of strings or numbers that define the
|
|
159
|
+
valid values that can be set. This is not allowed on `boolean`
|
|
160
|
+
(flag) options. May be used along with a `validate()` method.
|
|
158
161
|
- `default` A default value for the field. Note that this may be
|
|
159
162
|
overridden by an environment variable, if present.
|
|
160
163
|
|
package/dist/commonjs/index.d.ts
CHANGED
|
@@ -9,7 +9,7 @@ import { inspect, InspectOptions } from 'node:util';
|
|
|
9
9
|
* Defines the type of value that is valid, given a config definition's
|
|
10
10
|
* {@link ConfigType} and boolean multiple setting
|
|
11
11
|
*/
|
|
12
|
-
export type ValidValue<T extends ConfigType, M extends boolean> = [
|
|
12
|
+
export type ValidValue<T extends ConfigType = ConfigType, M extends boolean = boolean> = [
|
|
13
13
|
T,
|
|
14
14
|
M
|
|
15
15
|
] extends ['number', true] ? number[] : [T, M] extends ['string', true] ? string[] : [T, M] extends ['boolean', true] ? boolean[] : [T, M] extends ['number', false] ? number : [T, M] extends ['string', false] ? string : [T, M] extends ['boolean', false] ? boolean : [T, M] extends ['string', boolean] ? string | string[] : [T, M] extends ['boolean', boolean] ? boolean | boolean[] : [T, M] extends ['number', boolean] ? number | number[] : [T, M] extends [ConfigType, false] ? string | number | boolean : [T, M] extends [ConfigType, true] ? string[] | number[] | boolean[] : string | number | boolean | string[] | number[] | boolean[];
|
|
@@ -17,17 +17,21 @@ export type ValidValue<T extends ConfigType, M extends boolean> = [
|
|
|
17
17
|
* The meta information for a config option definition, when the
|
|
18
18
|
* type and multiple values can be inferred by the method being used
|
|
19
19
|
*/
|
|
20
|
-
export type ConfigOptionMeta<T extends ConfigType, M extends boolean> = {
|
|
21
|
-
default?: ValidValue<T, M> |
|
|
20
|
+
export type ConfigOptionMeta<T extends ConfigType, M extends boolean = boolean, O extends undefined | (T extends 'boolean' ? never : T extends 'string' ? string[] : T extends 'number' ? number[] : number[] | string[]) = undefined | (T extends 'boolean' ? never : T extends 'string' ? string[] : T extends 'number' ? number[] : number[] | string[])> = {
|
|
21
|
+
default?: undefined | (ValidValue<T, M> & (O extends number[] | string[] ? M extends false ? O[number] : O[number][] : unknown));
|
|
22
|
+
validOptions?: O;
|
|
22
23
|
description?: string;
|
|
23
|
-
validate?: ((v:
|
|
24
|
+
validate?: ((v: unknown) => v is ValidValue<T, M>) | ((v: unknown) => boolean);
|
|
24
25
|
short?: string | undefined;
|
|
25
26
|
type?: T;
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
}
|
|
29
|
-
multiple?:
|
|
30
|
-
|
|
27
|
+
hint?: T extends 'boolean' ? never : string;
|
|
28
|
+
delim?: M extends true ? string : never;
|
|
29
|
+
} & (M extends false ? {
|
|
30
|
+
multiple?: false | undefined;
|
|
31
|
+
} : M extends true ? {
|
|
32
|
+
multiple: true;
|
|
33
|
+
} : {
|
|
34
|
+
multiple?: boolean;
|
|
31
35
|
});
|
|
32
36
|
/**
|
|
33
37
|
* A set of {@link ConfigOptionMeta} fields, referenced by their longOption
|
|
@@ -60,13 +64,14 @@ export type MultiType<M extends boolean> = M extends true ? {
|
|
|
60
64
|
/**
|
|
61
65
|
* A config field definition, in its full representation.
|
|
62
66
|
*/
|
|
63
|
-
export type ConfigOptionBase<T extends ConfigType, M extends boolean> = {
|
|
67
|
+
export type ConfigOptionBase<T extends ConfigType, M extends boolean = boolean> = {
|
|
64
68
|
type: T;
|
|
65
69
|
short?: string | undefined;
|
|
66
70
|
default?: ValidValue<T, M> | undefined;
|
|
67
71
|
description?: string;
|
|
68
72
|
hint?: T extends 'boolean' ? undefined : string | undefined;
|
|
69
|
-
validate?: (v:
|
|
73
|
+
validate?: (v: unknown) => v is ValidValue<T, M>;
|
|
74
|
+
validOptions?: T extends 'boolean' ? undefined : T extends 'string' ? readonly string[] : T extends 'number' ? readonly number[] : readonly number[] | readonly string[];
|
|
70
75
|
} & MultiType<M>;
|
|
71
76
|
export declare const isConfigType: (t: string) => t is ConfigType;
|
|
72
77
|
export declare const isConfigOption: <T extends ConfigType, M extends boolean>(o: any, type: T, multi: M) => o is ConfigOptionBase<T, M>;
|
|
@@ -75,13 +80,13 @@ export declare const isConfigOption: <T extends ConfigType, M extends boolean>(o
|
|
|
75
80
|
* string values.
|
|
76
81
|
*/
|
|
77
82
|
export type ConfigSet = {
|
|
78
|
-
[longOption: string]: ConfigOptionBase<ConfigType
|
|
83
|
+
[longOption: string]: ConfigOptionBase<ConfigType>;
|
|
79
84
|
};
|
|
80
85
|
/**
|
|
81
86
|
* The 'values' field returned by {@link Jack#parse}
|
|
82
87
|
*/
|
|
83
88
|
export type OptionsResults<T extends ConfigSet> = {
|
|
84
|
-
[k in keyof T]?: T[k] extends ConfigOptionBase<'string', false> ? string : T[k] extends ConfigOptionBase<'string', true> ? string[] : T[k] extends ConfigOptionBase<'number', false> ? number : T[k] extends ConfigOptionBase<'number', true> ? number[] : T[k] extends ConfigOptionBase<'boolean', false> ? boolean : T[k] extends ConfigOptionBase<'boolean', true> ? boolean[] : never;
|
|
89
|
+
[k in keyof T]?: T[k]['validOptions'] extends string[] | number[] ? T[k] extends ConfigOptionBase<'string' | 'number', false> ? T[k]['validOptions'][number] : T[k] extends ConfigOptionBase<'string' | 'number', true> ? T[k]['validOptions'][number][] : never : T[k] extends ConfigOptionBase<'string', false> ? string : T[k] extends ConfigOptionBase<'string', true> ? string[] : T[k] extends ConfigOptionBase<'number', false> ? number : T[k] extends ConfigOptionBase<'number', true> ? number[] : T[k] extends ConfigOptionBase<'boolean', false> ? boolean : T[k] extends ConfigOptionBase<'boolean', true> ? boolean[] : never;
|
|
85
90
|
};
|
|
86
91
|
/**
|
|
87
92
|
* The object retured by {@link Jack#parse}
|
|
@@ -140,7 +145,7 @@ export type TextRow = Heading | Description;
|
|
|
140
145
|
export type UsageField = TextRow | {
|
|
141
146
|
type: 'config';
|
|
142
147
|
name: string;
|
|
143
|
-
value: ConfigOptionBase<ConfigType
|
|
148
|
+
value: ConfigOptionBase<ConfigType>;
|
|
144
149
|
};
|
|
145
150
|
/**
|
|
146
151
|
* Options provided to the {@link Jack} constructor
|
|
@@ -215,7 +220,7 @@ export declare class Jack<C extends ConfigSet = {}> {
|
|
|
215
220
|
* Validate that any arbitrary object is a valid configuration `values`
|
|
216
221
|
* object. Useful when loading config files or other sources.
|
|
217
222
|
*/
|
|
218
|
-
validate(o:
|
|
223
|
+
validate(o: unknown): asserts o is Parsed<C>['values'];
|
|
219
224
|
/**
|
|
220
225
|
* Add a heading to the usage output banner
|
|
221
226
|
*/
|
|
@@ -272,7 +277,8 @@ export declare class Jack<C extends ConfigSet = {}> {
|
|
|
272
277
|
toJSON(): {
|
|
273
278
|
[k: string]: {
|
|
274
279
|
default?: string | number | boolean | string[] | number[] | boolean[] | undefined;
|
|
275
|
-
|
|
280
|
+
validOptions?: readonly number[] | readonly string[] | undefined;
|
|
281
|
+
validate?: ((v: unknown) => v is string | number | boolean | string[] | number[] | boolean[]) | undefined;
|
|
276
282
|
description?: string | undefined;
|
|
277
283
|
short?: string | undefined;
|
|
278
284
|
delim?: string | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAA;AAExD;;GAEG;AACH,MAAM,MAAM,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;AAE3D,OAAO,EAAE,OAAO,EAAE,cAAc,EAAmB,MAAM,WAAW,CAAA;AA2DpE;;;GAGG;AACH,MAAM,MAAM,UAAU,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAA;AAExD;;GAEG;AACH,MAAM,MAAM,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;AAE3D,OAAO,EAAE,OAAO,EAAE,cAAc,EAAmB,MAAM,WAAW,CAAA;AA2DpE;;;GAGG;AACH,MAAM,MAAM,UAAU,CACpB,CAAC,SAAS,UAAU,GAAG,UAAU,EACjC,CAAC,SAAS,OAAO,GAAG,OAAO,IAE3B;IAAC,CAAC;IAAE,CAAC;CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,MAAM,EAAE,GACxC,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,MAAM,EAAE,GAC1C,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,OAAO,EAAE,GAC5C,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,GAAG,MAAM,GACzC,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,GAAG,MAAM,GACzC,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC,GAAG,OAAO,GAC3C,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,MAAM,EAAE,GACtD,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,SAAS,EAAE,OAAO,CAAC,GAAG,OAAO,GAAG,OAAO,EAAE,GACzD,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,MAAM,EAAE,GACtD,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,UAAU,EAAE,KAAK,CAAC,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAC9D,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,GAAG,OAAO,EAAE,GACnE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,GAAG,OAAO,EAAE,CAAA;AAE/D;;;GAGG;AACH,MAAM,MAAM,gBAAgB,CAC1B,CAAC,SAAS,UAAU,EACpB,CAAC,SAAS,OAAO,GAAG,OAAO,EAC3B,CAAC,SACG,SAAS,GACT,CAAC,CAAC,SAAS,SAAS,GAAG,KAAK,GAC1B,CAAC,SAAS,QAAQ,GAAG,MAAM,EAAE,GAC7B,CAAC,SAAS,QAAQ,GAAG,MAAM,EAAE,GAC7B,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,GACtB,SAAS,GACT,CAAC,CAAC,SAAS,SAAS,GAAG,KAAK,GAC1B,CAAC,SAAS,QAAQ,GAAG,MAAM,EAAE,GAC7B,CAAC,SAAS,QAAQ,GAAG,MAAM,EAAE,GAC7B,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,IACxB;IACF,OAAO,CAAC,EACJ,SAAS,GACT,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,GACf,CAAC,CAAC,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,GAC5B,CAAC,SAAS,KAAK,GACb,CAAC,CAAC,MAAM,CAAC,GACT,CAAC,CAAC,MAAM,CAAC,EAAE,GACb,OAAO,CAAC,CAAC,CAAA;IACjB,YAAY,CAAC,EAAE,CAAC,CAAA;IAChB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EACL,CAAC,CAAC,CAAC,EAAE,OAAO,KAAK,CAAC,IAAI,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GACvC,CAAC,CAAC,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,CAAA;IAC7B,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC1B,IAAI,CAAC,EAAE,CAAC,CAAA;IACR,IAAI,CAAC,EAAE,CAAC,SAAS,SAAS,GAAG,KAAK,GAAG,MAAM,CAAA;IAC3C,KAAK,CAAC,EAAE,CAAC,SAAS,IAAI,GAAG,MAAM,GAAG,KAAK,CAAA;CACxC,GAAG,CAAC,CAAC,SAAS,KAAK,GAAG;IAAE,QAAQ,CAAC,EAAE,KAAK,GAAG,SAAS,CAAA;CAAE,GACrD,CAAC,SAAS,IAAI,GAAG;IAAE,QAAQ,EAAE,IAAI,CAAA;CAAE,GACnC;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,CAAA;AAEzB;;;GAGG;AACH,MAAM,MAAM,aAAa,CAAC,CAAC,SAAS,UAAU,EAAE,CAAC,SAAS,OAAO,IAAI;IACnE,CAAC,UAAU,EAAE,MAAM,GAAG,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;CAC7C,CAAA;AAED;;GAEG;AACH,MAAM,MAAM,oBAAoB,CAC9B,CAAC,SAAS,UAAU,EACpB,CAAC,SAAS,OAAO,EACjB,CAAC,SAAS,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,IAC3B;KACD,UAAU,IAAI,MAAM,CAAC,GAAG,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC;CAChD,CAAA;AAED;;;;GAIG;AACH,MAAM,MAAM,SAAS,CAAC,CAAC,SAAS,OAAO,IACrC,CAAC,SAAS,IAAI,GACZ;IACE,QAAQ,EAAE,IAAI,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAC3B,GACD,CAAC,SAAS,KAAK,GACf;IACE,QAAQ,CAAC,EAAE,KAAK,GAAG,SAAS,CAAA;IAC5B,KAAK,CAAC,EAAE,SAAS,CAAA;CAClB,GACD;IACE,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;IAC9B,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAC3B,CAAA;AAEL;;GAEG;AACH,MAAM,MAAM,gBAAgB,CAC1B,CAAC,SAAS,UAAU,EACpB,CAAC,SAAS,OAAO,GAAG,OAAO,IACzB;IACF,IAAI,EAAE,CAAC,CAAA;IACP,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC1B,OAAO,CAAC,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,SAAS,CAAA;IACtC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,IAAI,CAAC,EAAE,CAAC,SAAS,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAAA;IAC3D,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,CAAC,IAAI,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IAChD,YAAY,CAAC,EAAE,CAAC,SAAS,SAAS,GAAG,SAAS,GAC5C,CAAC,SAAS,QAAQ,GAAG,SAAS,MAAM,EAAE,GACtC,CAAC,SAAS,QAAQ,GAAG,SAAS,MAAM,EAAE,GACtC,SAAS,MAAM,EAAE,GAAG,SAAS,MAAM,EAAE,CAAA;CACxC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAA;AAEhB,eAAO,MAAM,YAAY,MAAO,MAAM,oBAEiB,CAAA;AA8CvD,eAAO,MAAM,cAAc,+CACtB,GAAG,QACA,CAAC,SACA,CAAC,gCAcc,CAAA;AAExB;;;GAGG;AACH,MAAM,MAAM,SAAS,GAAG;IACtB,CAAC,UAAU,EAAE,MAAM,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAA;CACnD,CAAA;AAED;;GAEG;AACH,MAAM,MAAM,cAAc,CAAC,CAAC,SAAS,SAAS,IAAI;KAC/C,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,GAC/D,CAAC,CAAC,CAAC,CAAC,SAAS,gBAAgB,CAAC,QAAQ,GAAG,QAAQ,EAAE,KAAK,CAAC,GACvD,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,GAC5B,CAAC,CAAC,CAAC,CAAC,SAAS,gBAAgB,CAAC,QAAQ,GAAG,QAAQ,EAAE,IAAI,CAAC,GACxD,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,EAAE,GAC9B,KAAK,GACP,CAAC,CAAC,CAAC,CAAC,SAAS,gBAAgB,CAAC,QAAQ,EAAE,KAAK,CAAC,GAAG,MAAM,GACvD,CAAC,CAAC,CAAC,CAAC,SAAS,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,MAAM,EAAE,GACxD,CAAC,CAAC,CAAC,CAAC,SAAS,gBAAgB,CAAC,QAAQ,EAAE,KAAK,CAAC,GAAG,MAAM,GACvD,CAAC,CAAC,CAAC,CAAC,SAAS,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,MAAM,EAAE,GACxD,CAAC,CAAC,CAAC,CAAC,SAAS,gBAAgB,CAAC,SAAS,EAAE,KAAK,CAAC,GAAG,OAAO,GACzD,CAAC,CAAC,CAAC,CAAC,SAAS,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,OAAO,EAAE,GAC1D,KAAK;CACR,CAAA;AAED;;GAEG;AACH,MAAM,MAAM,MAAM,CAAC,CAAC,SAAS,SAAS,IAAI;IACxC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,CAAA;IACzB,WAAW,EAAE,MAAM,EAAE,CAAA;CACtB,CAAA;AA0PD;;GAEG;AACH,MAAM,WAAW,GAAG;IAClB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,OAAQ,SAAQ,GAAG;IAClC,IAAI,EAAE,SAAS,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,EAAE,CAAA;IACT,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,CAAC,EAAE,OAAO,CAAA;CACd;AAID;;;;;GAKG;AACH,MAAM,WAAW,WAAY,SAAQ,GAAG;IACtC,IAAI,EAAE,aAAa,CAAA;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,EAAE,CAAA;IACT,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,GAAG,CAAC,EAAE,OAAO,CAAA;CACd;AAKD;;;GAGG;AACH,MAAM,MAAM,OAAO,GAAG,OAAO,GAAG,WAAW,CAAA;AAE3C;;GAEG;AACH,MAAM,MAAM,UAAU,GAClB,OAAO,GACP;IACE,IAAI,EAAE,QAAQ,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,gBAAgB,CAAC,UAAU,CAAC,CAAA;CACpC,CAAA;AAEL;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAE1B;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAElB;;;OAGG;IACH,GAAG,CAAC,EAAE;QAAE,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;KAAE,CAAA;IAEzC;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAA;IAEd;;;;;;;;;;;OAWG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAC3B;AAED;;;GAGG;AACH,qBAAa,IAAI,CAAC,CAAC,SAAS,SAAS,GAAG,EAAE;;gBAW5B,OAAO,GAAE,WAAgB;IAarC;;;;;OAKG;IACH,eAAe,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,MAAM,SAAK;IA6BtD;;;;;;;;;;OAUG;IACH,KAAK,CAAC,IAAI,GAAE,MAAM,EAAiB,GAAG,MAAM,CAAC,CAAC,CAAC;IAkL/C;;;OAGG;IACH,QAAQ,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IAuEtD;;OAEG;IACH,OAAO,CACL,IAAI,EAAE,MAAM,EACZ,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAC7B,EAAE,GAAW,EAAE,GAAE;QAAE,GAAG,CAAC,EAAE,OAAO,CAAA;KAAO,GACtC,IAAI,CAAC,CAAC,CAAC;IAQV;;OAEG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,GAAE;QAAE,GAAG,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG,IAAI,CAAC,CAAC,CAAC;IAKnE;;OAEG;IACH,GAAG,CAAC,CAAC,SAAS,aAAa,CAAC,QAAQ,EAAE,KAAK,CAAC,EAC1C,MAAM,EAAE,CAAC,GACR,IAAI,CAAC,CAAC,GAAG,oBAAoB,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IAIrD;;OAEG;IACH,OAAO,CAAC,CAAC,SAAS,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,EAC7C,MAAM,EAAE,CAAC,GACR,IAAI,CAAC,CAAC,GAAG,oBAAoB,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAIpD;;OAEG;IACH,GAAG,CAAC,CAAC,SAAS,aAAa,CAAC,QAAQ,EAAE,KAAK,CAAC,EAC1C,MAAM,EAAE,CAAC,GACR,IAAI,CAAC,CAAC,GAAG,oBAAoB,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IAIrD;;OAEG;IACH,OAAO,CAAC,CAAC,SAAS,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,EAC7C,MAAM,EAAE,CAAC,GACR,IAAI,CAAC,CAAC,GAAG,oBAAoB,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAIpD;;OAEG;IACH,IAAI,CAAC,CAAC,SAAS,aAAa,CAAC,SAAS,EAAE,KAAK,CAAC,EAC5C,MAAM,EAAE,CAAC,GACR,IAAI,CAAC,CAAC,GAAG,oBAAoB,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IAItD;;OAEG;IACH,QAAQ,CAAC,CAAC,SAAS,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,EAC/C,MAAM,EAAE,CAAC,GACR,IAAI,CAAC,CAAC,GAAG,oBAAoB,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAIrD;;;;OAIG;IACH,SAAS,CAAC,CAAC,SAAS,SAAS,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IA4EtD;;OAEG;IACH,KAAK,IAAI,MAAM;IAgGf;;OAEG;IACH,aAAa,IAAI,MAAM;IAgIvB;;OAEG;IACH,MAAM;;;;;;;;;;;;IAoBN;;OAEG;IACH,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc;CAGpD;AAuCD;;GAEG;AACH,eAAO,MAAM,IAAI,aAAa,WAAW,aAA2B,CAAA"}
|
package/dist/commonjs/index.js
CHANGED
|
@@ -45,6 +45,8 @@ const isConfigType = (t) => typeof t === 'string' &&
|
|
|
45
45
|
(t === 'string' || t === 'number' || t === 'boolean');
|
|
46
46
|
exports.isConfigType = isConfigType;
|
|
47
47
|
const undefOrType = (v, t) => v === undefined || typeof v === t;
|
|
48
|
+
const undefOrTypeArray = (v, t) => v === undefined || (Array.isArray(v) && v.every(x => typeof x === t));
|
|
49
|
+
const isValidOption = (v, vo) => Array.isArray(v) ? v.every(x => isValidOption(x, vo)) : vo.includes(v);
|
|
48
50
|
// print the value type, for error message reporting
|
|
49
51
|
const valueType = (v) => typeof v === 'string' ? 'string'
|
|
50
52
|
: typeof v === 'boolean' ? 'boolean'
|
|
@@ -73,67 +75,135 @@ const isConfigOption = (o, type, multi) => !!o &&
|
|
|
73
75
|
undefOrType(o.description, 'string') &&
|
|
74
76
|
undefOrType(o.hint, 'string') &&
|
|
75
77
|
undefOrType(o.validate, 'function') &&
|
|
78
|
+
(o.type === 'boolean' ?
|
|
79
|
+
o.validOptions === undefined
|
|
80
|
+
: undefOrTypeArray(o.validOptions, o.type)) &&
|
|
76
81
|
(o.default === undefined || isValidValue(o.default, type, multi)) &&
|
|
77
82
|
!!o.multiple === multi;
|
|
78
83
|
exports.isConfigOption = isConfigOption;
|
|
79
84
|
function num(o = {}) {
|
|
80
|
-
const { default: def, validate: val, ...rest } = o;
|
|
85
|
+
const { default: def, validate: val, validOptions, ...rest } = o;
|
|
81
86
|
if (def !== undefined && !isValidValue(def, 'number', false)) {
|
|
82
|
-
throw new TypeError('invalid default value'
|
|
87
|
+
throw new TypeError('invalid default value', {
|
|
88
|
+
cause: {
|
|
89
|
+
found: def,
|
|
90
|
+
wanted: 'number',
|
|
91
|
+
},
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
if (!undefOrTypeArray(validOptions, 'number')) {
|
|
95
|
+
throw new TypeError('invalid validOptions', {
|
|
96
|
+
cause: {
|
|
97
|
+
found: validOptions,
|
|
98
|
+
wanted: 'number[]',
|
|
99
|
+
},
|
|
100
|
+
});
|
|
83
101
|
}
|
|
84
|
-
const validate = val ?
|
|
102
|
+
const validate = val ?
|
|
103
|
+
val
|
|
104
|
+
: undefined;
|
|
85
105
|
return {
|
|
86
106
|
...rest,
|
|
87
107
|
default: def,
|
|
88
108
|
validate,
|
|
109
|
+
validOptions,
|
|
89
110
|
type: 'number',
|
|
90
111
|
multiple: false,
|
|
91
112
|
};
|
|
92
113
|
}
|
|
93
114
|
function numList(o = {}) {
|
|
94
|
-
const { default: def, validate: val, ...rest } = o;
|
|
115
|
+
const { default: def, validate: val, validOptions, ...rest } = o;
|
|
95
116
|
if (def !== undefined && !isValidValue(def, 'number', true)) {
|
|
96
|
-
throw new TypeError('invalid default value'
|
|
117
|
+
throw new TypeError('invalid default value', {
|
|
118
|
+
cause: {
|
|
119
|
+
found: def,
|
|
120
|
+
wanted: 'number[]',
|
|
121
|
+
},
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
if (!undefOrTypeArray(validOptions, 'number')) {
|
|
125
|
+
throw new TypeError('invalid validOptions', {
|
|
126
|
+
cause: {
|
|
127
|
+
found: validOptions,
|
|
128
|
+
wanted: 'number[]',
|
|
129
|
+
},
|
|
130
|
+
});
|
|
97
131
|
}
|
|
98
|
-
const validate = val ?
|
|
132
|
+
const validate = val ?
|
|
133
|
+
val
|
|
134
|
+
: undefined;
|
|
99
135
|
return {
|
|
100
136
|
...rest,
|
|
101
137
|
default: def,
|
|
102
138
|
validate,
|
|
139
|
+
validOptions,
|
|
103
140
|
type: 'number',
|
|
104
141
|
multiple: true,
|
|
105
142
|
};
|
|
106
143
|
}
|
|
107
144
|
function opt(o = {}) {
|
|
108
|
-
const { default: def, validate: val, ...rest } = o;
|
|
145
|
+
const { default: def, validate: val, validOptions, ...rest } = o;
|
|
109
146
|
if (def !== undefined && !isValidValue(def, 'string', false)) {
|
|
110
|
-
throw new TypeError('invalid default value'
|
|
147
|
+
throw new TypeError('invalid default value', {
|
|
148
|
+
cause: {
|
|
149
|
+
found: def,
|
|
150
|
+
wanted: 'string',
|
|
151
|
+
},
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
if (!undefOrTypeArray(validOptions, 'string')) {
|
|
155
|
+
throw new TypeError('invalid validOptions', {
|
|
156
|
+
cause: {
|
|
157
|
+
found: validOptions,
|
|
158
|
+
wanted: 'string[]',
|
|
159
|
+
},
|
|
160
|
+
});
|
|
111
161
|
}
|
|
112
|
-
const validate = val ?
|
|
162
|
+
const validate = val ?
|
|
163
|
+
val
|
|
164
|
+
: undefined;
|
|
113
165
|
return {
|
|
114
166
|
...rest,
|
|
115
167
|
default: def,
|
|
116
168
|
validate,
|
|
169
|
+
validOptions,
|
|
117
170
|
type: 'string',
|
|
118
171
|
multiple: false,
|
|
119
172
|
};
|
|
120
173
|
}
|
|
121
174
|
function optList(o = {}) {
|
|
122
|
-
const { default: def, validate: val, ...rest } = o;
|
|
175
|
+
const { default: def, validate: val, validOptions, ...rest } = o;
|
|
123
176
|
if (def !== undefined && !isValidValue(def, 'string', true)) {
|
|
124
|
-
throw new TypeError('invalid default value'
|
|
177
|
+
throw new TypeError('invalid default value', {
|
|
178
|
+
cause: {
|
|
179
|
+
found: def,
|
|
180
|
+
wanted: 'string[]',
|
|
181
|
+
},
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
if (!undefOrTypeArray(validOptions, 'string')) {
|
|
185
|
+
throw new TypeError('invalid validOptions', {
|
|
186
|
+
cause: {
|
|
187
|
+
found: validOptions,
|
|
188
|
+
wanted: 'string[]',
|
|
189
|
+
},
|
|
190
|
+
});
|
|
125
191
|
}
|
|
126
|
-
const validate = val ?
|
|
192
|
+
const validate = val ?
|
|
193
|
+
val
|
|
194
|
+
: undefined;
|
|
127
195
|
return {
|
|
128
196
|
...rest,
|
|
129
197
|
default: def,
|
|
130
198
|
validate,
|
|
199
|
+
validOptions,
|
|
131
200
|
type: 'string',
|
|
132
201
|
multiple: true,
|
|
133
202
|
};
|
|
134
203
|
}
|
|
135
204
|
function flag(o = {}) {
|
|
136
205
|
const { hint, default: def, validate: val, ...rest } = o;
|
|
206
|
+
delete rest.validOptions;
|
|
137
207
|
if (def !== undefined && !isValidValue(def, 'boolean', false)) {
|
|
138
208
|
throw new TypeError('invalid default value');
|
|
139
209
|
}
|
|
@@ -153,10 +223,13 @@ function flag(o = {}) {
|
|
|
153
223
|
}
|
|
154
224
|
function flagList(o = {}) {
|
|
155
225
|
const { hint, default: def, validate: val, ...rest } = o;
|
|
226
|
+
delete rest.validOptions;
|
|
156
227
|
if (def !== undefined && !isValidValue(def, 'boolean', true)) {
|
|
157
228
|
throw new TypeError('invalid default value');
|
|
158
229
|
}
|
|
159
|
-
const validate = val ?
|
|
230
|
+
const validate = val ?
|
|
231
|
+
val
|
|
232
|
+
: undefined;
|
|
160
233
|
if (hint !== undefined) {
|
|
161
234
|
throw new TypeError('cannot provide hint for flag list');
|
|
162
235
|
}
|
|
@@ -197,7 +270,7 @@ const toParseArgsOptionsConfig = (options) => {
|
|
|
197
270
|
const conf = config;
|
|
198
271
|
c[longOption] = {
|
|
199
272
|
type: conf.type,
|
|
200
|
-
multiple: conf.multiple,
|
|
273
|
+
multiple: !!conf.multiple,
|
|
201
274
|
default: conf.default,
|
|
202
275
|
};
|
|
203
276
|
}
|
|
@@ -404,8 +477,16 @@ class Jack {
|
|
|
404
477
|
}
|
|
405
478
|
for (const [field, value] of Object.entries(p.values)) {
|
|
406
479
|
const valid = this.#configSet[field]?.validate;
|
|
480
|
+
const validOptions = this.#configSet[field]?.validOptions;
|
|
481
|
+
let cause;
|
|
482
|
+
if (validOptions && !isValidOption(value, validOptions)) {
|
|
483
|
+
cause = { name: field, found: value, validOptions: validOptions };
|
|
484
|
+
}
|
|
407
485
|
if (valid && !valid(value)) {
|
|
408
|
-
|
|
486
|
+
cause ??= { name: field, found: value };
|
|
487
|
+
}
|
|
488
|
+
if (cause) {
|
|
489
|
+
throw new Error(`Invalid value provided for --${field}: ${JSON.stringify(value)}`, { cause });
|
|
409
490
|
}
|
|
410
491
|
}
|
|
411
492
|
this.#writeEnv(p);
|
|
@@ -435,26 +516,43 @@ class Jack {
|
|
|
435
516
|
cause: { found: o },
|
|
436
517
|
});
|
|
437
518
|
}
|
|
519
|
+
const opts = o;
|
|
438
520
|
for (const field in o) {
|
|
439
|
-
|
|
521
|
+
const value = opts[field];
|
|
522
|
+
/* c8 ignore next - for TS */
|
|
523
|
+
if (value === undefined)
|
|
524
|
+
continue;
|
|
525
|
+
this.#noNoFields(field, value);
|
|
440
526
|
const config = this.#configSet[field];
|
|
441
527
|
if (!config) {
|
|
442
528
|
throw new Error(`Unknown config option: ${field}`, {
|
|
443
529
|
cause: { found: field },
|
|
444
530
|
});
|
|
445
531
|
}
|
|
446
|
-
if (!isValidValue(
|
|
447
|
-
throw new Error(`Invalid value ${valueType(
|
|
532
|
+
if (!isValidValue(value, config.type, !!config.multiple)) {
|
|
533
|
+
throw new Error(`Invalid value ${valueType(value)} for ${field}, expected ${valueType(config)}`, {
|
|
448
534
|
cause: {
|
|
449
535
|
name: field,
|
|
450
|
-
found:
|
|
536
|
+
found: value,
|
|
451
537
|
wanted: valueType(config),
|
|
452
538
|
},
|
|
453
539
|
});
|
|
454
540
|
}
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
541
|
+
let cause;
|
|
542
|
+
if (config.validOptions &&
|
|
543
|
+
!isValidOption(value, config.validOptions)) {
|
|
544
|
+
cause = {
|
|
545
|
+
name: field,
|
|
546
|
+
found: value,
|
|
547
|
+
validOptions: config.validOptions,
|
|
548
|
+
};
|
|
549
|
+
}
|
|
550
|
+
if (config.validate && !config.validate(value)) {
|
|
551
|
+
cause ??= { name: field, found: value };
|
|
552
|
+
}
|
|
553
|
+
if (cause) {
|
|
554
|
+
throw new Error(`Invalid config value for ${field}: ${value}`, {
|
|
555
|
+
cause,
|
|
458
556
|
});
|
|
459
557
|
}
|
|
460
558
|
}
|
|
@@ -766,8 +864,12 @@ class Jack {
|
|
|
766
864
|
const { value } = field;
|
|
767
865
|
const desc = value.description || '';
|
|
768
866
|
const mult = value.multiple ? 'Can be set multiple times' : '';
|
|
769
|
-
const
|
|
770
|
-
|
|
867
|
+
const opts = value.validOptions?.length ?
|
|
868
|
+
`Valid options:${value.validOptions.map(v => ` ${JSON.stringify(v)}`)}`
|
|
869
|
+
: '';
|
|
870
|
+
const dmDelim = desc.includes('\n') ? '\n\n' : '\n';
|
|
871
|
+
const extra = [opts, mult].join(dmDelim).trim();
|
|
872
|
+
const text = (normalize(desc) + dmDelim + extra).trim();
|
|
771
873
|
const hint = value.hint ||
|
|
772
874
|
(value.type === 'number' ? 'n'
|
|
773
875
|
: value.type === 'string' ? field.name
|
|
@@ -808,6 +910,7 @@ class Jack {
|
|
|
808
910
|
{ description: normalize(def.description) }
|
|
809
911
|
: {}),
|
|
810
912
|
...(def.validate ? { validate: def.validate } : {}),
|
|
913
|
+
...(def.validOptions ? { validOptions: def.validOptions } : {}),
|
|
811
914
|
...(def.default !== undefined ? { default: def.default } : {}),
|
|
812
915
|
},
|
|
813
916
|
]));
|