@spudlabs/guardis 0.4.0 → 0.5.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 +12 -1
- package/esm/src/guard.d.ts.map +1 -1
- package/esm/src/guard.js +60 -38
- package/esm/src/types.d.ts +7 -3
- package/esm/src/types.d.ts.map +1 -1
- package/esm/src/utilities.d.ts +23 -6
- package/esm/src/utilities.d.ts.map +1 -1
- package/esm/src/utilities.js +40 -8
- package/package.json +20 -1
- package/script/src/guard.d.ts.map +1 -1
- package/script/src/guard.js +60 -38
- package/script/src/types.d.ts +7 -3
- package/script/src/types.d.ts.map +1 -1
- package/script/src/utilities.d.ts +23 -6
- package/script/src/utilities.d.ts.map +1 -1
- package/script/src/utilities.js +39 -7
package/README.md
CHANGED
|
@@ -298,6 +298,17 @@ isStringArray.validate(["a", 123, "c"]);
|
|
|
298
298
|
const isPeople = Is.Array.of(isPerson);
|
|
299
299
|
isPeople.validate([{ name: "Alice", address: { city: 456, zip: 12345 } }]);
|
|
300
300
|
// { issues: [{ message: "Expected string. Received: 456", path: [0, "address", "city"] }] }
|
|
301
|
+
|
|
302
|
+
// Tuple validation includes element indices in the path
|
|
303
|
+
const isPair = createTypeGuard("pair", (v, { tupleHas }) => {
|
|
304
|
+
if (!Is.Array(v) || v.length !== 2) return null;
|
|
305
|
+
if (!tupleHas(v, 0, Is.String)) return null;
|
|
306
|
+
if (!tupleHas(v, 1, Is.Number)) return null;
|
|
307
|
+
return v;
|
|
308
|
+
});
|
|
309
|
+
|
|
310
|
+
isPair.validate(["hi", "nope"]);
|
|
311
|
+
// { issues: [{ message: 'Expected number. Received: "nope"', path: [1] }] }
|
|
301
312
|
```
|
|
302
313
|
|
|
303
314
|
**Collecting errors:**
|
|
@@ -483,7 +494,7 @@ const isExample = createTypeGuard((val, helpers) => {
|
|
|
483
494
|
// Check that a property does NOT exist
|
|
484
495
|
hasNot(obj, "deleted"); // ensures "deleted" property is absent
|
|
485
496
|
|
|
486
|
-
// Check tuple element at specific index
|
|
497
|
+
// Check tuple element at specific index (includes index in validation path)
|
|
487
498
|
tupleHas(tuple, 0, Is.String); // [string, ...unknown[]]
|
|
488
499
|
|
|
489
500
|
// Check if value is in array (for union types)
|
package/esm/src/guard.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"guard.d.ts","sourceRoot":"","sources":["../../src/src/guard.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAKV,UAAU,EAGV,UAAU,EACV,aAAa,EACb,SAAS,EAET,MAAM,EACN,WAAW,EAGX,aAAa,EACb,SAAS,EACT,cAAc,EACf,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"guard.d.ts","sourceRoot":"","sources":["../../src/src/guard.ts"],"names":[],"mappings":"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"}
|
package/esm/src/guard.js
CHANGED
|
@@ -15,7 +15,7 @@ function createHelpers(ctx) {
|
|
|
15
15
|
has: (t, k, guard, errorMessage) => hasProperty(t, k, guard, ctx?.pushPath(k), ctx ? errorMessage : undefined),
|
|
16
16
|
hasNot: (t, k, errorMessage) => doesNotHaveProperty(t, k, ctx?.pushPath(k), ctx ? errorMessage : undefined),
|
|
17
17
|
hasOptional: (t, k, guard, errorMessage) => hasOptionalProperty(t, k, guard, ctx?.pushPath(k), ctx ? errorMessage : undefined),
|
|
18
|
-
tupleHas,
|
|
18
|
+
tupleHas: (t, i, guard) => tupleHas(t, i, guard, ctx?.pushPath(i)),
|
|
19
19
|
includes,
|
|
20
20
|
keyOf: (k, t, errorMessage) => keyOf(k, t, ctx, ctx ? errorMessage : undefined),
|
|
21
21
|
fail: (message) => {
|
|
@@ -161,17 +161,57 @@ const createStrictTypeGuard = (parser, name) => {
|
|
|
161
161
|
* console.log(isStringOrNumber(false)); // false
|
|
162
162
|
* ```
|
|
163
163
|
*/
|
|
164
|
-
const createOrTypeGuard = (guard) => (
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
164
|
+
const createOrTypeGuard = (guard) => (...others) => {
|
|
165
|
+
if (others.length === 0)
|
|
166
|
+
return guard;
|
|
167
|
+
const allGuards = [guard, ...others];
|
|
168
|
+
// Build a union name from all named guards
|
|
169
|
+
const names = [];
|
|
170
|
+
for (const g of allGuards) {
|
|
171
|
+
if (hasName(g))
|
|
172
|
+
names.push(g._.name);
|
|
173
|
+
}
|
|
174
|
+
const name = names.length === allGuards.length ? names.join(" | ") : undefined;
|
|
169
175
|
const parser = (v) => {
|
|
170
|
-
|
|
171
|
-
|
|
176
|
+
for (const g of allGuards) {
|
|
177
|
+
if (g(v))
|
|
178
|
+
return v === null ? true : v;
|
|
179
|
+
}
|
|
172
180
|
return null;
|
|
173
181
|
};
|
|
174
|
-
return name ? createTypeGuard(name, parser) : createTypeGuard(parser);
|
|
182
|
+
return (name ? createTypeGuard(name, parser) : createTypeGuard(parser));
|
|
183
|
+
};
|
|
184
|
+
/**
|
|
185
|
+
* Creates an optional variant of a type guard that accepts undefined.
|
|
186
|
+
* The returned guard is context-aware for path tracking in shapes.
|
|
187
|
+
*
|
|
188
|
+
* @template T - The type checked by the base type guard.
|
|
189
|
+
*
|
|
190
|
+
* @param guard - The base type guard predicate to wrap.
|
|
191
|
+
* @param parser - The parser function from the base type guard.
|
|
192
|
+
* @param context - The context-aware validation function from the base type guard.
|
|
193
|
+
* @returns A new type guard that checks if a value is of type `T | undefined`.
|
|
194
|
+
*
|
|
195
|
+
* @example
|
|
196
|
+
* ```typescript
|
|
197
|
+
* const optionalString = createOptionalTypeGuard(isString, stringParser, stringContext);
|
|
198
|
+
*
|
|
199
|
+
* console.log(optionalString("hello")); // true
|
|
200
|
+
* console.log(optionalString(undefined)); // true
|
|
201
|
+
* console.log(optionalString(42)); // false
|
|
202
|
+
* ```
|
|
203
|
+
*/
|
|
204
|
+
const createOptionalTypeGuard = (guard, parser, context) => {
|
|
205
|
+
const optional = (value) => isUndefined(value) || guard(value);
|
|
206
|
+
const name = hasName(guard) ? `${guard._.name} | undefined` : undefined;
|
|
207
|
+
const optionalParser = (v, h) => isUndefined(v) ? v : parser(v, h);
|
|
208
|
+
const optionalContext = (value, ctx) => isUndefined(value) ? { value } : context(value, ctx ?? createContext());
|
|
209
|
+
optional._ = { name, parser: optionalParser, context: optionalContext };
|
|
210
|
+
optional.strict = createStrictTypeGuard(optionalParser, name);
|
|
211
|
+
optional.assert = optional.strict;
|
|
212
|
+
optional.validate = (value) => optionalContext(value, createContext());
|
|
213
|
+
optional.or = createOrTypeGuard(optional);
|
|
214
|
+
return optional;
|
|
175
215
|
};
|
|
176
216
|
/**
|
|
177
217
|
* Creates a notEmpty variant of a type guard that rejects empty values
|
|
@@ -196,18 +236,7 @@ const createNotEmptyTypeGuard = (guard) => {
|
|
|
196
236
|
notEmpty.strict = createStrictTypeGuard(notEmptyParser, name);
|
|
197
237
|
notEmpty.assert = notEmpty.strict;
|
|
198
238
|
notEmpty.validate = (value) => context(value, createContext());
|
|
199
|
-
|
|
200
|
-
const optionalName = name ? `${name} | undefined` : undefined;
|
|
201
|
-
const optionalParser = (v) => notEmptyOptional(v) ? v : null;
|
|
202
|
-
notEmptyOptional.strict = createStrictTypeGuard(optionalParser, optionalName);
|
|
203
|
-
notEmptyOptional.assert = notEmptyOptional.strict;
|
|
204
|
-
notEmptyOptional.validate = (value) => {
|
|
205
|
-
if (isUndefined(value))
|
|
206
|
-
return { value: value };
|
|
207
|
-
return context(value, createContext());
|
|
208
|
-
};
|
|
209
|
-
notEmptyOptional.or = createOrTypeGuard(notEmptyOptional);
|
|
210
|
-
notEmpty.optional = notEmptyOptional;
|
|
239
|
+
notEmpty.optional = createOptionalTypeGuard(notEmpty, notEmptyParser, context);
|
|
211
240
|
notEmpty.or = createOrTypeGuard(notEmpty);
|
|
212
241
|
return notEmpty;
|
|
213
242
|
};
|
|
@@ -227,21 +256,23 @@ export function createTypeGuard(...args) {
|
|
|
227
256
|
* This is used by nested validations to propagate paths.
|
|
228
257
|
*/
|
|
229
258
|
const context = (value, ctx) => {
|
|
230
|
-
const issuesBefore = ctx?.issues.length
|
|
259
|
+
const issuesBefore = ctx?.issues.length;
|
|
231
260
|
const helpers = createHelpers(ctx);
|
|
232
261
|
const result = parser(value, helpers);
|
|
233
262
|
// If parser returned null and no child issues were added, add this guard's error
|
|
234
|
-
if (result === null && ctx
|
|
263
|
+
if (result === null && ctx && ctx.issues.length === issuesBefore) {
|
|
235
264
|
ctx.addIssue(formatErrorMessage(value, name));
|
|
236
265
|
}
|
|
237
|
-
//
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
}
|
|
241
|
-
if (result !== null) {
|
|
266
|
+
// Check if THIS guard added any issues (not sibling issues from shared context)
|
|
267
|
+
const hasNewIssues = ctx !== undefined && ctx.issues.length > issuesBefore;
|
|
268
|
+
if (result !== null && !hasNewIssues) {
|
|
242
269
|
// Special case: isNull parser returns `true` when value is null
|
|
243
270
|
return { value: result === true && value === null ? value : result };
|
|
244
271
|
}
|
|
272
|
+
// Return accumulated issues if this guard contributed any
|
|
273
|
+
if (hasNewIssues) {
|
|
274
|
+
return { issues: ctx.issues };
|
|
275
|
+
}
|
|
245
276
|
return { issues: [{ message: formatErrorMessage(value, name) }] };
|
|
246
277
|
};
|
|
247
278
|
const callback = (value) => parser(value, defaultHelpers) !== null;
|
|
@@ -278,16 +309,7 @@ export function createTypeGuard(...args) {
|
|
|
278
309
|
* @returns
|
|
279
310
|
*/
|
|
280
311
|
callback.notEmpty = createNotEmptyTypeGuard(callback);
|
|
281
|
-
|
|
282
|
-
* Returns true if the value is undefined or passes the parser.
|
|
283
|
-
* @param {unknown} value
|
|
284
|
-
* @returns
|
|
285
|
-
*/
|
|
286
|
-
const optional = (value) => isUndefined(value) || callback(value);
|
|
287
|
-
optional.strict = createStrictTypeGuard((v, h) => isUndefined(v) ? v : parser(v, h), name ? `${name} | undefined` : undefined);
|
|
288
|
-
optional.assert = optional.strict;
|
|
289
|
-
optional.validate = (value) => isUndefined(value) ? { value } : context(value, createContext());
|
|
290
|
-
optional.or = createOrTypeGuard(optional);
|
|
312
|
+
const optional = createOptionalTypeGuard(callback, parser, context);
|
|
291
313
|
optional.notEmpty = callback.notEmpty.optional;
|
|
292
314
|
callback.optional = optional;
|
|
293
315
|
/**
|
package/esm/src/types.d.ts
CHANGED
|
@@ -42,6 +42,10 @@ export type HelpersWithContext = Helpers & {
|
|
|
42
42
|
export type Parser<T = unknown> = (val: unknown, helper: Helpers) => T | null;
|
|
43
43
|
export type ExtendedParser<T1, T2 extends T1 = T1> = (val: T1, helper: Helpers) => T2 | null;
|
|
44
44
|
export type Predicate<T> = (val: unknown) => val is T;
|
|
45
|
+
/** Extracts a union of guarded types from a tuple of predicates */
|
|
46
|
+
type PredicateUnion<Guards extends [Predicate<unknown>, ...Predicate<unknown>[]]> = {
|
|
47
|
+
[K in keyof Guards]: Guards[K] extends Predicate<infer U> ? U : never;
|
|
48
|
+
}[number];
|
|
45
49
|
export type StrictTypeGuard<T> = (value: unknown, errorMsg?: string) => value is T;
|
|
46
50
|
/**
|
|
47
51
|
* Represents a type guard function with additional utility methods.
|
|
@@ -77,7 +81,7 @@ export interface TypeGuard<T1> extends StandardSchemaV1<T1> {
|
|
|
77
81
|
* @param guard A type guard for T2
|
|
78
82
|
* @returns A new type guard that checks if the value is of type T or T2
|
|
79
83
|
*/
|
|
80
|
-
or: <
|
|
84
|
+
or: <Guards extends [Predicate<unknown>, ...Predicate<unknown>[]]>(...guards: Guards) => TypeGuard<T1 | PredicateUnion<Guards>>;
|
|
81
85
|
/**
|
|
82
86
|
* A strict type guard that throws an error if the value is not of type T.
|
|
83
87
|
* @param value The value to check
|
|
@@ -179,7 +183,7 @@ export interface TypeGuard<T1> extends StandardSchemaV1<T1> {
|
|
|
179
183
|
* @param guard A type guard for T2
|
|
180
184
|
* @returns A new type guard that checks if the value is of type T1 | undefined | T2
|
|
181
185
|
*/
|
|
182
|
-
or: <
|
|
186
|
+
or: <Guards extends [Predicate<unknown>, ...Predicate<unknown>[]]>(...guards: Guards) => TypeGuard<T1 | undefined | PredicateUnion<Guards>>;
|
|
183
187
|
/**
|
|
184
188
|
* A type guard that checks if the value is not empty and of type T | undefined.
|
|
185
189
|
* An empty value is defined as null, an empty string, an empty array,
|
|
@@ -248,7 +252,7 @@ export interface TypeGuard<T1> extends StandardSchemaV1<T1> {
|
|
|
248
252
|
* @param guard A type guard for T2
|
|
249
253
|
* @returns A new type guard that checks if the value is of type T1 or T2
|
|
250
254
|
*/
|
|
251
|
-
or: <
|
|
255
|
+
or: <Guards extends [Predicate<unknown>, ...Predicate<unknown>[]]>(...guards: Guards) => TypeGuard<T1 | PredicateUnion<Guards>>;
|
|
252
256
|
/**
|
|
253
257
|
* A type guard that checks if the value is not empty and of type T | undefined.
|
|
254
258
|
* An empty value is defined as null, an empty string, an empty array,
|
package/esm/src/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/src/types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/src/types.ts"],"names":[],"mappings":"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"}
|
package/esm/src/utilities.d.ts
CHANGED
|
@@ -49,13 +49,30 @@ export declare function hasOptionalProperty<K extends PropertyKey, G = unknown>(
|
|
|
49
49
|
[K2 in K]+?: G;
|
|
50
50
|
};
|
|
51
51
|
/**
|
|
52
|
-
*
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
* @
|
|
56
|
-
* @
|
|
52
|
+
* Validates that a tuple element at a given index satisfies a type guard.
|
|
53
|
+
* Narrows the tuple type to include the guarded type at the specified index.
|
|
54
|
+
*
|
|
55
|
+
* @typeParam T - The tuple type.
|
|
56
|
+
* @typeParam I - The numeric index type.
|
|
57
|
+
* @typeParam G - The type that the guard checks for.
|
|
58
|
+
*
|
|
59
|
+
* @param t - The tuple to validate.
|
|
60
|
+
* @param i - The index of the element to check.
|
|
61
|
+
* @param guard - The type guard to validate `t[i]` against.
|
|
62
|
+
* @param ctx - Optional validation context for path tracking.
|
|
63
|
+
* Note: ctx is expected to already include the index in its path when passed.
|
|
64
|
+
* @returns `true` if the element at index `i` satisfies the guard, `false` otherwise.
|
|
65
|
+
*
|
|
66
|
+
* @example
|
|
67
|
+
* ```typescript
|
|
68
|
+
* const tuple = [1, "test", true] as const;
|
|
69
|
+
*
|
|
70
|
+
* tupleHas(tuple, 0, isNumber); // true — narrows tuple[0] to number
|
|
71
|
+
* tupleHas(tuple, 1, isNumber); // false
|
|
72
|
+
* tupleHas(tuple, 5, isString); // false — index out of bounds
|
|
73
|
+
* ```
|
|
57
74
|
*/
|
|
58
|
-
export declare function tupleHas<T extends readonly unknown[], I extends number, G = unknown>(t: T, i: I, guard: (v: unknown) => v is G): t is T & {
|
|
75
|
+
export declare function tupleHas<T extends readonly unknown[], I extends number, G = unknown>(t: T, i: I, guard: (v: unknown) => v is G, ctx?: Context): t is T & {
|
|
59
76
|
[K in I]: G;
|
|
60
77
|
};
|
|
61
78
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utilities.d.ts","sourceRoot":"","sources":["../../src/src/utilities.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAElE;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,WAAW,EAAE,CAAC,GAAG,OAAO,EAC5D,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,CAAC,EACJ,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,CAAC,IAAI,CAAC,EAC9B,GAAG,CAAC,EAAE,OAAO,EACb,YAAY,CAAC,EAAE,MAAM,GACpB,CAAC,IAAI;KAAG,EAAE,IAAI,CAAC,GAAG,CAAC;CAAE,CAmCvB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,WAAW,EACvD,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,CAAC,EACJ,GAAG,CAAC,EAAE,OAAO,EACb,YAAY,CAAC,EAAE,MAAM,GACpB,CAAC,IAAI;KAAG,EAAE,IAAI,CAAC,GAAG,KAAK;CAAE,CAM3B;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,WAAW,EAAE,CAAC,GAAG,OAAO,EACpE,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,CAAC,EACJ,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,CAAC,IAAI,CAAC,EAC9B,GAAG,CAAC,EAAE,OAAO,EACb,YAAY,CAAC,EAAE,MAAM,GACpB,CAAC,IAAI;KAAG,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;CAAE,CAIzB;AAED
|
|
1
|
+
{"version":3,"file":"utilities.d.ts","sourceRoot":"","sources":["../../src/src/utilities.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAElE;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,WAAW,EAAE,CAAC,GAAG,OAAO,EAC5D,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,CAAC,EACJ,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,CAAC,IAAI,CAAC,EAC9B,GAAG,CAAC,EAAE,OAAO,EACb,YAAY,CAAC,EAAE,MAAM,GACpB,CAAC,IAAI;KAAG,EAAE,IAAI,CAAC,GAAG,CAAC;CAAE,CAmCvB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,WAAW,EACvD,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,CAAC,EACJ,GAAG,CAAC,EAAE,OAAO,EACb,YAAY,CAAC,EAAE,MAAM,GACpB,CAAC,IAAI;KAAG,EAAE,IAAI,CAAC,GAAG,KAAK;CAAE,CAM3B;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,WAAW,EAAE,CAAC,GAAG,OAAO,EACpE,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,CAAC,EACJ,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,CAAC,IAAI,CAAC,EAC9B,GAAG,CAAC,EAAE,OAAO,EACb,YAAY,CAAC,EAAE,MAAM,GACpB,CAAC,IAAI;KAAG,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;CAAE,CAIzB;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,QAAQ,CAAC,CAAC,SAAS,SAAS,OAAO,EAAE,EAAE,CAAC,SAAS,MAAM,EAAE,CAAC,GAAG,OAAO,EAClF,CAAC,EAAE,CAAC,EACJ,CAAC,EAAE,CAAC,EACJ,KAAK,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,CAAC,IAAI,CAAC,EAC7B,GAAG,CAAC,EAAE,OAAO,GACZ,CAAC,IAAI,CAAC,GAAG;KAAG,CAAC,IAAI,CAAC,GAAG,CAAC;CAAE,CAmB1B;AAED;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,CAAC,SAAS,SAAS,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAEvF;AAED;;;;;;;GAOG;AACH,wBAAgB,KAAK,CAAC,CAAC,SAAS,MAAM,EACpC,CAAC,EAAE,OAAO,EACV,CAAC,EAAE,CAAC,EACJ,GAAG,CAAC,EAAE,OAAO,EACb,YAAY,CAAC,EAAE,MAAM,GACpB,CAAC,IAAI,MAAM,CAAC,CAYd;AAoCD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAQxE;AAED;;;;;;GAMG;AACH,eAAO,MAAM,OAAO,GAAI,CAAC,SAAS,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,EACtF,GAAG,QAAQ,CAAC,KACX,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAYlC,CAAC"}
|
package/esm/src/utilities.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { isUndefined } from "./guard.js";
|
|
2
|
-
import { hasContext } from "./introspect.js";
|
|
2
|
+
import { hasContext, hasName } from "./introspect.js";
|
|
3
3
|
/**
|
|
4
4
|
* Utility to verify if a property exists in an object. Checks that
|
|
5
5
|
* k is a key in t. If a guard method is provided, it will also check
|
|
@@ -86,14 +86,46 @@ export function hasOptionalProperty(t, k, guard, ctx, errorMessage) {
|
|
|
86
86
|
return hasProperty(t, k, guard, ctx, errorMessage);
|
|
87
87
|
}
|
|
88
88
|
/**
|
|
89
|
-
*
|
|
90
|
-
*
|
|
91
|
-
*
|
|
92
|
-
* @
|
|
93
|
-
* @
|
|
89
|
+
* Validates that a tuple element at a given index satisfies a type guard.
|
|
90
|
+
* Narrows the tuple type to include the guarded type at the specified index.
|
|
91
|
+
*
|
|
92
|
+
* @typeParam T - The tuple type.
|
|
93
|
+
* @typeParam I - The numeric index type.
|
|
94
|
+
* @typeParam G - The type that the guard checks for.
|
|
95
|
+
*
|
|
96
|
+
* @param t - The tuple to validate.
|
|
97
|
+
* @param i - The index of the element to check.
|
|
98
|
+
* @param guard - The type guard to validate `t[i]` against.
|
|
99
|
+
* @param ctx - Optional validation context for path tracking.
|
|
100
|
+
* Note: ctx is expected to already include the index in its path when passed.
|
|
101
|
+
* @returns `true` if the element at index `i` satisfies the guard, `false` otherwise.
|
|
102
|
+
*
|
|
103
|
+
* @example
|
|
104
|
+
* ```typescript
|
|
105
|
+
* const tuple = [1, "test", true] as const;
|
|
106
|
+
*
|
|
107
|
+
* tupleHas(tuple, 0, isNumber); // true — narrows tuple[0] to number
|
|
108
|
+
* tupleHas(tuple, 1, isNumber); // false
|
|
109
|
+
* tupleHas(tuple, 5, isString); // false — index out of bounds
|
|
110
|
+
* ```
|
|
94
111
|
*/
|
|
95
|
-
export function tupleHas(t, i, guard) {
|
|
96
|
-
|
|
112
|
+
export function tupleHas(t, i, guard, ctx) {
|
|
113
|
+
if (!(i in t))
|
|
114
|
+
return false;
|
|
115
|
+
// If context is provided, use context-aware validation if available on the guard
|
|
116
|
+
if (ctx && hasContext(guard)) {
|
|
117
|
+
guard._.context(t[i], ctx);
|
|
118
|
+
// Returns true despite potential failure to avoid short-circuiting && chains,
|
|
119
|
+
// enabling multi-element error collection. Safe because validate() checks ctx.issues.
|
|
120
|
+
return true;
|
|
121
|
+
}
|
|
122
|
+
if (guard(t[i]))
|
|
123
|
+
return true;
|
|
124
|
+
if (ctx) {
|
|
125
|
+
ctx.addIssue(formatErrorMessage(t[i], hasName(guard) ? guard._.name : undefined));
|
|
126
|
+
return true;
|
|
127
|
+
}
|
|
128
|
+
return false;
|
|
97
129
|
}
|
|
98
130
|
/**
|
|
99
131
|
* Determines whether the specified value `i` is included in the array `t`.
|
package/package.json
CHANGED
|
@@ -1,7 +1,26 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@spudlabs/guardis",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"description": "Guardis is a modular library of type guards, built to be easy to use and extend.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"typescript",
|
|
7
|
+
"type-guard",
|
|
8
|
+
"typeguard",
|
|
9
|
+
"runtime-validation",
|
|
10
|
+
"type-safety",
|
|
11
|
+
"validation",
|
|
12
|
+
"type-check",
|
|
13
|
+
"branded-types",
|
|
14
|
+
"standard-schema",
|
|
15
|
+
"runtime-type-check",
|
|
16
|
+
"parser",
|
|
17
|
+
"assertion",
|
|
18
|
+
"schema",
|
|
19
|
+
"zod",
|
|
20
|
+
"arktype",
|
|
21
|
+
"valibot",
|
|
22
|
+
"typebox"
|
|
23
|
+
],
|
|
5
24
|
"repository": {
|
|
6
25
|
"type": "git",
|
|
7
26
|
"url": "git+https://github.com/bsickler/guardis.git"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"guard.d.ts","sourceRoot":"","sources":["../../src/src/guard.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAKV,UAAU,EAGV,UAAU,EACV,aAAa,EACb,SAAS,EAET,MAAM,EACN,WAAW,EAGX,aAAa,EACb,SAAS,EACT,cAAc,EACf,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"guard.d.ts","sourceRoot":"","sources":["../../src/src/guard.ts"],"names":[],"mappings":"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"}
|
package/script/src/guard.js
CHANGED
|
@@ -20,7 +20,7 @@ function createHelpers(ctx) {
|
|
|
20
20
|
has: (t, k, guard, errorMessage) => (0, utilities_js_1.hasProperty)(t, k, guard, ctx?.pushPath(k), ctx ? errorMessage : undefined),
|
|
21
21
|
hasNot: (t, k, errorMessage) => (0, utilities_js_1.doesNotHaveProperty)(t, k, ctx?.pushPath(k), ctx ? errorMessage : undefined),
|
|
22
22
|
hasOptional: (t, k, guard, errorMessage) => (0, utilities_js_1.hasOptionalProperty)(t, k, guard, ctx?.pushPath(k), ctx ? errorMessage : undefined),
|
|
23
|
-
tupleHas: utilities_js_1.tupleHas,
|
|
23
|
+
tupleHas: (t, i, guard) => (0, utilities_js_1.tupleHas)(t, i, guard, ctx?.pushPath(i)),
|
|
24
24
|
includes: utilities_js_1.includes,
|
|
25
25
|
keyOf: (k, t, errorMessage) => (0, utilities_js_1.keyOf)(k, t, ctx, ctx ? errorMessage : undefined),
|
|
26
26
|
fail: (message) => {
|
|
@@ -166,17 +166,57 @@ const createStrictTypeGuard = (parser, name) => {
|
|
|
166
166
|
* console.log(isStringOrNumber(false)); // false
|
|
167
167
|
* ```
|
|
168
168
|
*/
|
|
169
|
-
const createOrTypeGuard = (guard) => (
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
169
|
+
const createOrTypeGuard = (guard) => (...others) => {
|
|
170
|
+
if (others.length === 0)
|
|
171
|
+
return guard;
|
|
172
|
+
const allGuards = [guard, ...others];
|
|
173
|
+
// Build a union name from all named guards
|
|
174
|
+
const names = [];
|
|
175
|
+
for (const g of allGuards) {
|
|
176
|
+
if ((0, introspect_js_1.hasName)(g))
|
|
177
|
+
names.push(g._.name);
|
|
178
|
+
}
|
|
179
|
+
const name = names.length === allGuards.length ? names.join(" | ") : undefined;
|
|
174
180
|
const parser = (v) => {
|
|
175
|
-
|
|
176
|
-
|
|
181
|
+
for (const g of allGuards) {
|
|
182
|
+
if (g(v))
|
|
183
|
+
return v === null ? true : v;
|
|
184
|
+
}
|
|
177
185
|
return null;
|
|
178
186
|
};
|
|
179
|
-
return name ? createTypeGuard(name, parser) : createTypeGuard(parser);
|
|
187
|
+
return (name ? createTypeGuard(name, parser) : createTypeGuard(parser));
|
|
188
|
+
};
|
|
189
|
+
/**
|
|
190
|
+
* Creates an optional variant of a type guard that accepts undefined.
|
|
191
|
+
* The returned guard is context-aware for path tracking in shapes.
|
|
192
|
+
*
|
|
193
|
+
* @template T - The type checked by the base type guard.
|
|
194
|
+
*
|
|
195
|
+
* @param guard - The base type guard predicate to wrap.
|
|
196
|
+
* @param parser - The parser function from the base type guard.
|
|
197
|
+
* @param context - The context-aware validation function from the base type guard.
|
|
198
|
+
* @returns A new type guard that checks if a value is of type `T | undefined`.
|
|
199
|
+
*
|
|
200
|
+
* @example
|
|
201
|
+
* ```typescript
|
|
202
|
+
* const optionalString = createOptionalTypeGuard(isString, stringParser, stringContext);
|
|
203
|
+
*
|
|
204
|
+
* console.log(optionalString("hello")); // true
|
|
205
|
+
* console.log(optionalString(undefined)); // true
|
|
206
|
+
* console.log(optionalString(42)); // false
|
|
207
|
+
* ```
|
|
208
|
+
*/
|
|
209
|
+
const createOptionalTypeGuard = (guard, parser, context) => {
|
|
210
|
+
const optional = (value) => (0, exports.isUndefined)(value) || guard(value);
|
|
211
|
+
const name = (0, introspect_js_1.hasName)(guard) ? `${guard._.name} | undefined` : undefined;
|
|
212
|
+
const optionalParser = (v, h) => (0, exports.isUndefined)(v) ? v : parser(v, h);
|
|
213
|
+
const optionalContext = (value, ctx) => (0, exports.isUndefined)(value) ? { value } : context(value, ctx ?? (0, context_js_1.createContext)());
|
|
214
|
+
optional._ = { name, parser: optionalParser, context: optionalContext };
|
|
215
|
+
optional.strict = createStrictTypeGuard(optionalParser, name);
|
|
216
|
+
optional.assert = optional.strict;
|
|
217
|
+
optional.validate = (value) => optionalContext(value, (0, context_js_1.createContext)());
|
|
218
|
+
optional.or = createOrTypeGuard(optional);
|
|
219
|
+
return optional;
|
|
180
220
|
};
|
|
181
221
|
/**
|
|
182
222
|
* Creates a notEmpty variant of a type guard that rejects empty values
|
|
@@ -201,18 +241,7 @@ const createNotEmptyTypeGuard = (guard) => {
|
|
|
201
241
|
notEmpty.strict = createStrictTypeGuard(notEmptyParser, name);
|
|
202
242
|
notEmpty.assert = notEmpty.strict;
|
|
203
243
|
notEmpty.validate = (value) => context(value, (0, context_js_1.createContext)());
|
|
204
|
-
|
|
205
|
-
const optionalName = name ? `${name} | undefined` : undefined;
|
|
206
|
-
const optionalParser = (v) => notEmptyOptional(v) ? v : null;
|
|
207
|
-
notEmptyOptional.strict = createStrictTypeGuard(optionalParser, optionalName);
|
|
208
|
-
notEmptyOptional.assert = notEmptyOptional.strict;
|
|
209
|
-
notEmptyOptional.validate = (value) => {
|
|
210
|
-
if ((0, exports.isUndefined)(value))
|
|
211
|
-
return { value: value };
|
|
212
|
-
return context(value, (0, context_js_1.createContext)());
|
|
213
|
-
};
|
|
214
|
-
notEmptyOptional.or = createOrTypeGuard(notEmptyOptional);
|
|
215
|
-
notEmpty.optional = notEmptyOptional;
|
|
244
|
+
notEmpty.optional = createOptionalTypeGuard(notEmpty, notEmptyParser, context);
|
|
216
245
|
notEmpty.or = createOrTypeGuard(notEmpty);
|
|
217
246
|
return notEmpty;
|
|
218
247
|
};
|
|
@@ -232,21 +261,23 @@ function createTypeGuard(...args) {
|
|
|
232
261
|
* This is used by nested validations to propagate paths.
|
|
233
262
|
*/
|
|
234
263
|
const context = (value, ctx) => {
|
|
235
|
-
const issuesBefore = ctx?.issues.length
|
|
264
|
+
const issuesBefore = ctx?.issues.length;
|
|
236
265
|
const helpers = createHelpers(ctx);
|
|
237
266
|
const result = parser(value, helpers);
|
|
238
267
|
// If parser returned null and no child issues were added, add this guard's error
|
|
239
|
-
if (result === null && ctx
|
|
268
|
+
if (result === null && ctx && ctx.issues.length === issuesBefore) {
|
|
240
269
|
ctx.addIssue((0, utilities_js_1.formatErrorMessage)(value, name));
|
|
241
270
|
}
|
|
242
|
-
//
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
}
|
|
246
|
-
if (result !== null) {
|
|
271
|
+
// Check if THIS guard added any issues (not sibling issues from shared context)
|
|
272
|
+
const hasNewIssues = ctx !== undefined && ctx.issues.length > issuesBefore;
|
|
273
|
+
if (result !== null && !hasNewIssues) {
|
|
247
274
|
// Special case: isNull parser returns `true` when value is null
|
|
248
275
|
return { value: result === true && value === null ? value : result };
|
|
249
276
|
}
|
|
277
|
+
// Return accumulated issues if this guard contributed any
|
|
278
|
+
if (hasNewIssues) {
|
|
279
|
+
return { issues: ctx.issues };
|
|
280
|
+
}
|
|
250
281
|
return { issues: [{ message: (0, utilities_js_1.formatErrorMessage)(value, name) }] };
|
|
251
282
|
};
|
|
252
283
|
const callback = (value) => parser(value, defaultHelpers) !== null;
|
|
@@ -283,16 +314,7 @@ function createTypeGuard(...args) {
|
|
|
283
314
|
* @returns
|
|
284
315
|
*/
|
|
285
316
|
callback.notEmpty = createNotEmptyTypeGuard(callback);
|
|
286
|
-
|
|
287
|
-
* Returns true if the value is undefined or passes the parser.
|
|
288
|
-
* @param {unknown} value
|
|
289
|
-
* @returns
|
|
290
|
-
*/
|
|
291
|
-
const optional = (value) => (0, exports.isUndefined)(value) || callback(value);
|
|
292
|
-
optional.strict = createStrictTypeGuard((v, h) => (0, exports.isUndefined)(v) ? v : parser(v, h), name ? `${name} | undefined` : undefined);
|
|
293
|
-
optional.assert = optional.strict;
|
|
294
|
-
optional.validate = (value) => (0, exports.isUndefined)(value) ? { value } : context(value, (0, context_js_1.createContext)());
|
|
295
|
-
optional.or = createOrTypeGuard(optional);
|
|
317
|
+
const optional = createOptionalTypeGuard(callback, parser, context);
|
|
296
318
|
optional.notEmpty = callback.notEmpty.optional;
|
|
297
319
|
callback.optional = optional;
|
|
298
320
|
/**
|
package/script/src/types.d.ts
CHANGED
|
@@ -42,6 +42,10 @@ export type HelpersWithContext = Helpers & {
|
|
|
42
42
|
export type Parser<T = unknown> = (val: unknown, helper: Helpers) => T | null;
|
|
43
43
|
export type ExtendedParser<T1, T2 extends T1 = T1> = (val: T1, helper: Helpers) => T2 | null;
|
|
44
44
|
export type Predicate<T> = (val: unknown) => val is T;
|
|
45
|
+
/** Extracts a union of guarded types from a tuple of predicates */
|
|
46
|
+
type PredicateUnion<Guards extends [Predicate<unknown>, ...Predicate<unknown>[]]> = {
|
|
47
|
+
[K in keyof Guards]: Guards[K] extends Predicate<infer U> ? U : never;
|
|
48
|
+
}[number];
|
|
45
49
|
export type StrictTypeGuard<T> = (value: unknown, errorMsg?: string) => value is T;
|
|
46
50
|
/**
|
|
47
51
|
* Represents a type guard function with additional utility methods.
|
|
@@ -77,7 +81,7 @@ export interface TypeGuard<T1> extends StandardSchemaV1<T1> {
|
|
|
77
81
|
* @param guard A type guard for T2
|
|
78
82
|
* @returns A new type guard that checks if the value is of type T or T2
|
|
79
83
|
*/
|
|
80
|
-
or: <
|
|
84
|
+
or: <Guards extends [Predicate<unknown>, ...Predicate<unknown>[]]>(...guards: Guards) => TypeGuard<T1 | PredicateUnion<Guards>>;
|
|
81
85
|
/**
|
|
82
86
|
* A strict type guard that throws an error if the value is not of type T.
|
|
83
87
|
* @param value The value to check
|
|
@@ -179,7 +183,7 @@ export interface TypeGuard<T1> extends StandardSchemaV1<T1> {
|
|
|
179
183
|
* @param guard A type guard for T2
|
|
180
184
|
* @returns A new type guard that checks if the value is of type T1 | undefined | T2
|
|
181
185
|
*/
|
|
182
|
-
or: <
|
|
186
|
+
or: <Guards extends [Predicate<unknown>, ...Predicate<unknown>[]]>(...guards: Guards) => TypeGuard<T1 | undefined | PredicateUnion<Guards>>;
|
|
183
187
|
/**
|
|
184
188
|
* A type guard that checks if the value is not empty and of type T | undefined.
|
|
185
189
|
* An empty value is defined as null, an empty string, an empty array,
|
|
@@ -248,7 +252,7 @@ export interface TypeGuard<T1> extends StandardSchemaV1<T1> {
|
|
|
248
252
|
* @param guard A type guard for T2
|
|
249
253
|
* @returns A new type guard that checks if the value is of type T1 or T2
|
|
250
254
|
*/
|
|
251
|
-
or: <
|
|
255
|
+
or: <Guards extends [Predicate<unknown>, ...Predicate<unknown>[]]>(...guards: Guards) => TypeGuard<T1 | PredicateUnion<Guards>>;
|
|
252
256
|
/**
|
|
253
257
|
* A type guard that checks if the value is not empty and of type T | undefined.
|
|
254
258
|
* An empty value is defined as null, an empty string, an empty array,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/src/types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/src/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -49,13 +49,30 @@ export declare function hasOptionalProperty<K extends PropertyKey, G = unknown>(
|
|
|
49
49
|
[K2 in K]+?: G;
|
|
50
50
|
};
|
|
51
51
|
/**
|
|
52
|
-
*
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
* @
|
|
56
|
-
* @
|
|
52
|
+
* Validates that a tuple element at a given index satisfies a type guard.
|
|
53
|
+
* Narrows the tuple type to include the guarded type at the specified index.
|
|
54
|
+
*
|
|
55
|
+
* @typeParam T - The tuple type.
|
|
56
|
+
* @typeParam I - The numeric index type.
|
|
57
|
+
* @typeParam G - The type that the guard checks for.
|
|
58
|
+
*
|
|
59
|
+
* @param t - The tuple to validate.
|
|
60
|
+
* @param i - The index of the element to check.
|
|
61
|
+
* @param guard - The type guard to validate `t[i]` against.
|
|
62
|
+
* @param ctx - Optional validation context for path tracking.
|
|
63
|
+
* Note: ctx is expected to already include the index in its path when passed.
|
|
64
|
+
* @returns `true` if the element at index `i` satisfies the guard, `false` otherwise.
|
|
65
|
+
*
|
|
66
|
+
* @example
|
|
67
|
+
* ```typescript
|
|
68
|
+
* const tuple = [1, "test", true] as const;
|
|
69
|
+
*
|
|
70
|
+
* tupleHas(tuple, 0, isNumber); // true — narrows tuple[0] to number
|
|
71
|
+
* tupleHas(tuple, 1, isNumber); // false
|
|
72
|
+
* tupleHas(tuple, 5, isString); // false — index out of bounds
|
|
73
|
+
* ```
|
|
57
74
|
*/
|
|
58
|
-
export declare function tupleHas<T extends readonly unknown[], I extends number, G = unknown>(t: T, i: I, guard: (v: unknown) => v is G): t is T & {
|
|
75
|
+
export declare function tupleHas<T extends readonly unknown[], I extends number, G = unknown>(t: T, i: I, guard: (v: unknown) => v is G, ctx?: Context): t is T & {
|
|
59
76
|
[K in I]: G;
|
|
60
77
|
};
|
|
61
78
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utilities.d.ts","sourceRoot":"","sources":["../../src/src/utilities.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAElE;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,WAAW,EAAE,CAAC,GAAG,OAAO,EAC5D,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,CAAC,EACJ,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,CAAC,IAAI,CAAC,EAC9B,GAAG,CAAC,EAAE,OAAO,EACb,YAAY,CAAC,EAAE,MAAM,GACpB,CAAC,IAAI;KAAG,EAAE,IAAI,CAAC,GAAG,CAAC;CAAE,CAmCvB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,WAAW,EACvD,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,CAAC,EACJ,GAAG,CAAC,EAAE,OAAO,EACb,YAAY,CAAC,EAAE,MAAM,GACpB,CAAC,IAAI;KAAG,EAAE,IAAI,CAAC,GAAG,KAAK;CAAE,CAM3B;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,WAAW,EAAE,CAAC,GAAG,OAAO,EACpE,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,CAAC,EACJ,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,CAAC,IAAI,CAAC,EAC9B,GAAG,CAAC,EAAE,OAAO,EACb,YAAY,CAAC,EAAE,MAAM,GACpB,CAAC,IAAI;KAAG,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;CAAE,CAIzB;AAED
|
|
1
|
+
{"version":3,"file":"utilities.d.ts","sourceRoot":"","sources":["../../src/src/utilities.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAElE;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,WAAW,EAAE,CAAC,GAAG,OAAO,EAC5D,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,CAAC,EACJ,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,CAAC,IAAI,CAAC,EAC9B,GAAG,CAAC,EAAE,OAAO,EACb,YAAY,CAAC,EAAE,MAAM,GACpB,CAAC,IAAI;KAAG,EAAE,IAAI,CAAC,GAAG,CAAC;CAAE,CAmCvB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,WAAW,EACvD,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,CAAC,EACJ,GAAG,CAAC,EAAE,OAAO,EACb,YAAY,CAAC,EAAE,MAAM,GACpB,CAAC,IAAI;KAAG,EAAE,IAAI,CAAC,GAAG,KAAK;CAAE,CAM3B;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,WAAW,EAAE,CAAC,GAAG,OAAO,EACpE,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,CAAC,EACJ,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,CAAC,IAAI,CAAC,EAC9B,GAAG,CAAC,EAAE,OAAO,EACb,YAAY,CAAC,EAAE,MAAM,GACpB,CAAC,IAAI;KAAG,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;CAAE,CAIzB;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,QAAQ,CAAC,CAAC,SAAS,SAAS,OAAO,EAAE,EAAE,CAAC,SAAS,MAAM,EAAE,CAAC,GAAG,OAAO,EAClF,CAAC,EAAE,CAAC,EACJ,CAAC,EAAE,CAAC,EACJ,KAAK,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,CAAC,IAAI,CAAC,EAC7B,GAAG,CAAC,EAAE,OAAO,GACZ,CAAC,IAAI,CAAC,GAAG;KAAG,CAAC,IAAI,CAAC,GAAG,CAAC;CAAE,CAmB1B;AAED;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,CAAC,SAAS,SAAS,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAEvF;AAED;;;;;;;GAOG;AACH,wBAAgB,KAAK,CAAC,CAAC,SAAS,MAAM,EACpC,CAAC,EAAE,OAAO,EACV,CAAC,EAAE,CAAC,EACJ,GAAG,CAAC,EAAE,OAAO,EACb,YAAY,CAAC,EAAE,MAAM,GACpB,CAAC,IAAI,MAAM,CAAC,CAYd;AAoCD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAQxE;AAED;;;;;;GAMG;AACH,eAAO,MAAM,OAAO,GAAI,CAAC,SAAS,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,EACtF,GAAG,QAAQ,CAAC,KACX,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAYlC,CAAC"}
|
package/script/src/utilities.js
CHANGED
|
@@ -96,14 +96,46 @@ function hasOptionalProperty(t, k, guard, ctx, errorMessage) {
|
|
|
96
96
|
return hasProperty(t, k, guard, ctx, errorMessage);
|
|
97
97
|
}
|
|
98
98
|
/**
|
|
99
|
-
*
|
|
100
|
-
*
|
|
101
|
-
*
|
|
102
|
-
* @
|
|
103
|
-
* @
|
|
99
|
+
* Validates that a tuple element at a given index satisfies a type guard.
|
|
100
|
+
* Narrows the tuple type to include the guarded type at the specified index.
|
|
101
|
+
*
|
|
102
|
+
* @typeParam T - The tuple type.
|
|
103
|
+
* @typeParam I - The numeric index type.
|
|
104
|
+
* @typeParam G - The type that the guard checks for.
|
|
105
|
+
*
|
|
106
|
+
* @param t - The tuple to validate.
|
|
107
|
+
* @param i - The index of the element to check.
|
|
108
|
+
* @param guard - The type guard to validate `t[i]` against.
|
|
109
|
+
* @param ctx - Optional validation context for path tracking.
|
|
110
|
+
* Note: ctx is expected to already include the index in its path when passed.
|
|
111
|
+
* @returns `true` if the element at index `i` satisfies the guard, `false` otherwise.
|
|
112
|
+
*
|
|
113
|
+
* @example
|
|
114
|
+
* ```typescript
|
|
115
|
+
* const tuple = [1, "test", true] as const;
|
|
116
|
+
*
|
|
117
|
+
* tupleHas(tuple, 0, isNumber); // true — narrows tuple[0] to number
|
|
118
|
+
* tupleHas(tuple, 1, isNumber); // false
|
|
119
|
+
* tupleHas(tuple, 5, isString); // false — index out of bounds
|
|
120
|
+
* ```
|
|
104
121
|
*/
|
|
105
|
-
function tupleHas(t, i, guard) {
|
|
106
|
-
|
|
122
|
+
function tupleHas(t, i, guard, ctx) {
|
|
123
|
+
if (!(i in t))
|
|
124
|
+
return false;
|
|
125
|
+
// If context is provided, use context-aware validation if available on the guard
|
|
126
|
+
if (ctx && (0, introspect_js_1.hasContext)(guard)) {
|
|
127
|
+
guard._.context(t[i], ctx);
|
|
128
|
+
// Returns true despite potential failure to avoid short-circuiting && chains,
|
|
129
|
+
// enabling multi-element error collection. Safe because validate() checks ctx.issues.
|
|
130
|
+
return true;
|
|
131
|
+
}
|
|
132
|
+
if (guard(t[i]))
|
|
133
|
+
return true;
|
|
134
|
+
if (ctx) {
|
|
135
|
+
ctx.addIssue(formatErrorMessage(t[i], (0, introspect_js_1.hasName)(guard) ? guard._.name : undefined));
|
|
136
|
+
return true;
|
|
137
|
+
}
|
|
138
|
+
return false;
|
|
107
139
|
}
|
|
108
140
|
/**
|
|
109
141
|
* Determines whether the specified value `i` is included in the array `t`.
|