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 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
 
@@ -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> | undefined;
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: any) => v is ValidValue<T, M>) | ((v: any) => boolean);
24
+ validate?: ((v: unknown) => v is ValidValue<T, M>) | ((v: unknown) => boolean);
24
25
  short?: string | undefined;
25
26
  type?: T;
26
- } & (T extends 'boolean' ? {} : {
27
- hint?: string | undefined;
28
- }) & (M extends false ? {} : {
29
- multiple?: M | undefined;
30
- delim?: string | undefined;
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: any) => v is ValidValue<T, M>;
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, boolean>;
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, boolean>;
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: any): asserts o is Parsed<C>['values'];
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
- validate?: ((v: any) => v is string | number | boolean | string[] | number[] | boolean[]) | undefined;
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":"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"}
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"}
@@ -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 ? val : undefined;
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 ? val : undefined;
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 ? val : undefined;
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 ? val : undefined;
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 ? val : undefined;
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
- throw new Error(`Invalid value provided for --${field}: ${JSON.stringify(value)}`, { cause: { name: field, found: value } });
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
- this.#noNoFields(field, o[field]);
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(o[field], config.type, !!config.multiple)) {
447
- throw new Error(`Invalid value ${valueType(o[field])} for ${field}, expected ${valueType(config)}`, {
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: o[field],
536
+ found: value,
451
537
  wanted: valueType(config),
452
538
  },
453
539
  });
454
540
  }
455
- if (config.validate && !config.validate(o[field])) {
456
- throw new Error(`Invalid config value for ${field}: ${o[field]}`, {
457
- cause: { name: field, found: o[field] },
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 dmDelim = mult && (desc.includes('\n') ? '\n\n' : '\n');
770
- const text = normalize(desc + dmDelim + mult);
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
  ]));