ts-fortress 9.2.0 → 9.2.1
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/dist/array/array-at-least-length.mjs +59 -58
- package/dist/array/array-at-least-length.mjs.map +1 -1
- package/dist/array/array-at-most-length.mjs +62 -59
- package/dist/array/array-at-most-length.mjs.map +1 -1
- package/dist/array/array-bounded-length.mjs +66 -67
- package/dist/array/array-bounded-length.mjs.map +1 -1
- package/dist/array/array-of-length.d.mts.map +1 -1
- package/dist/array/array-of-length.mjs +65 -60
- package/dist/array/array-of-length.mjs.map +1 -1
- package/dist/array/array.d.mts.map +1 -1
- package/dist/array/array.mjs +39 -40
- package/dist/array/array.mjs.map +1 -1
- package/dist/array/non-empty-array.d.mts.map +1 -1
- package/dist/array/non-empty-array.mjs +53 -54
- package/dist/array/non-empty-array.mjs.map +1 -1
- package/dist/array/tuple.d.mts +3 -3
- package/dist/array/tuple.d.mts.map +1 -1
- package/dist/array/tuple.mjs +69 -61
- package/dist/array/tuple.mjs.map +1 -1
- package/dist/brand/brand.d.mts.map +1 -1
- package/dist/brand/brand.mjs +41 -37
- package/dist/brand/brand.mjs.map +1 -1
- package/dist/brand/branded-number.d.mts.map +1 -1
- package/dist/brand/branded-number.mjs +10 -11
- package/dist/brand/branded-number.mjs.map +1 -1
- package/dist/brand/branded-string.d.mts.map +1 -1
- package/dist/brand/branded-string.mjs +10 -11
- package/dist/brand/branded-string.mjs.map +1 -1
- package/dist/compose/intersection.d.mts +7 -7
- package/dist/compose/intersection.d.mts.map +1 -1
- package/dist/compose/intersection.mjs +72 -81
- package/dist/compose/intersection.mjs.map +1 -1
- package/dist/compose/union.d.mts +6 -6
- package/dist/compose/union.d.mts.map +1 -1
- package/dist/compose/union.mjs +51 -55
- package/dist/compose/union.mjs.map +1 -1
- package/dist/enum/enum.mjs +38 -38
- package/dist/enum/enum.mjs.map +1 -1
- package/dist/enum/int-range.d.mts.map +1 -1
- package/dist/enum/int-range.mjs +40 -38
- package/dist/enum/int-range.mjs.map +1 -1
- package/dist/enum/uint-range.d.mts.map +1 -1
- package/dist/enum/uint-range.mjs +40 -38
- package/dist/enum/uint-range.mjs.map +1 -1
- package/dist/other-types/literal.d.mts.map +1 -1
- package/dist/other-types/literal.mjs +3 -7
- package/dist/other-types/literal.mjs.map +1 -1
- package/dist/other-types/map.d.mts +3 -3
- package/dist/other-types/map.d.mts.map +1 -1
- package/dist/other-types/map.mjs +72 -70
- package/dist/other-types/map.mjs.map +1 -1
- package/dist/other-types/recursion.d.mts.map +1 -1
- package/dist/other-types/recursion.mjs +61 -206
- package/dist/other-types/recursion.mjs.map +1 -1
- package/dist/other-types/refine.d.mts.map +1 -1
- package/dist/other-types/refine.mjs +20 -19
- package/dist/other-types/refine.mjs.map +1 -1
- package/dist/other-types/set.d.mts +3 -3
- package/dist/other-types/set.d.mts.map +1 -1
- package/dist/other-types/set.mjs +51 -50
- package/dist/other-types/set.mjs.map +1 -1
- package/dist/other-types/template-literal.d.mts.map +1 -1
- package/dist/other-types/template-literal.mjs +35 -109
- package/dist/other-types/template-literal.mjs.map +1 -1
- package/dist/other-types/unknown.d.mts.map +1 -1
- package/dist/other-types/unknown.mjs +10 -10
- package/dist/other-types/unknown.mjs.map +1 -1
- package/dist/predefined/brand/number/finite-number.d.mts.map +1 -1
- package/dist/predefined/brand/number/finite-number.mjs +6 -6
- package/dist/predefined/brand/number/finite-number.mjs.map +1 -1
- package/dist/predefined/brand/number/int.d.mts.map +1 -1
- package/dist/predefined/brand/number/int.mjs +6 -6
- package/dist/predefined/brand/number/int.mjs.map +1 -1
- package/dist/predefined/brand/number/int16.d.mts.map +1 -1
- package/dist/predefined/brand/number/int16.mjs +18 -18
- package/dist/predefined/brand/number/int16.mjs.map +1 -1
- package/dist/predefined/brand/number/int32.d.mts.map +1 -1
- package/dist/predefined/brand/number/int32.mjs +14 -14
- package/dist/predefined/brand/number/int32.mjs.map +1 -1
- package/dist/predefined/brand/number/negative-finite-number.d.mts.map +1 -1
- package/dist/predefined/brand/number/negative-finite-number.mjs +6 -6
- package/dist/predefined/brand/number/negative-finite-number.mjs.map +1 -1
- package/dist/predefined/brand/number/negative-int.d.mts.map +1 -1
- package/dist/predefined/brand/number/negative-int.mjs +15 -15
- package/dist/predefined/brand/number/negative-int.mjs.map +1 -1
- package/dist/predefined/brand/number/negative-safe-int.d.mts.map +1 -1
- package/dist/predefined/brand/number/negative-safe-int.mjs +16 -16
- package/dist/predefined/brand/number/negative-safe-int.mjs.map +1 -1
- package/dist/predefined/brand/number/non-negative-finite-number.d.mts.map +1 -1
- package/dist/predefined/brand/number/non-negative-finite-number.mjs +6 -6
- package/dist/predefined/brand/number/non-negative-finite-number.mjs.map +1 -1
- package/dist/predefined/brand/number/non-positive-finite-number.d.mts.map +1 -1
- package/dist/predefined/brand/number/non-positive-finite-number.mjs +6 -6
- package/dist/predefined/brand/number/non-positive-finite-number.mjs.map +1 -1
- package/dist/predefined/brand/number/non-positive-int.d.mts.map +1 -1
- package/dist/predefined/brand/number/non-positive-int.mjs +6 -6
- package/dist/predefined/brand/number/non-positive-int.mjs.map +1 -1
- package/dist/predefined/brand/number/non-positive-safe-int.d.mts.map +1 -1
- package/dist/predefined/brand/number/non-positive-safe-int.mjs +15 -15
- package/dist/predefined/brand/number/non-positive-safe-int.mjs.map +1 -1
- package/dist/predefined/brand/number/non-zero-finite-number.d.mts.map +1 -1
- package/dist/predefined/brand/number/non-zero-finite-number.mjs +6 -6
- package/dist/predefined/brand/number/non-zero-finite-number.mjs.map +1 -1
- package/dist/predefined/brand/number/non-zero-int.d.mts.map +1 -1
- package/dist/predefined/brand/number/non-zero-int.mjs +6 -6
- package/dist/predefined/brand/number/non-zero-int.mjs.map +1 -1
- package/dist/predefined/brand/number/non-zero-safe-int.d.mts.map +1 -1
- package/dist/predefined/brand/number/non-zero-safe-int.mjs +6 -6
- package/dist/predefined/brand/number/non-zero-safe-int.mjs.map +1 -1
- package/dist/predefined/brand/number/positive-finite-number.d.mts.map +1 -1
- package/dist/predefined/brand/number/positive-finite-number.mjs +14 -14
- package/dist/predefined/brand/number/positive-finite-number.mjs.map +1 -1
- package/dist/predefined/brand/number/positive-int.d.mts.map +1 -1
- package/dist/predefined/brand/number/positive-int.mjs +15 -15
- package/dist/predefined/brand/number/positive-int.mjs.map +1 -1
- package/dist/predefined/brand/number/positive-safe-int.d.mts.map +1 -1
- package/dist/predefined/brand/number/positive-safe-int.mjs +16 -16
- package/dist/predefined/brand/number/positive-safe-int.mjs.map +1 -1
- package/dist/predefined/brand/number/safe-int.d.mts.map +1 -1
- package/dist/predefined/brand/number/safe-int.mjs +6 -6
- package/dist/predefined/brand/number/safe-int.mjs.map +1 -1
- package/dist/predefined/brand/number/safe-uint.d.mts.map +1 -1
- package/dist/predefined/brand/number/safe-uint.mjs +15 -15
- package/dist/predefined/brand/number/safe-uint.mjs.map +1 -1
- package/dist/predefined/brand/number/uint.d.mts.map +1 -1
- package/dist/predefined/brand/number/uint.mjs +14 -14
- package/dist/predefined/brand/number/uint.mjs.map +1 -1
- package/dist/predefined/brand/number/uint16.d.mts.map +1 -1
- package/dist/predefined/brand/number/uint16.mjs +18 -18
- package/dist/predefined/brand/number/uint16.mjs.map +1 -1
- package/dist/predefined/brand/number/uint32.d.mts.map +1 -1
- package/dist/predefined/brand/number/uint32.mjs +16 -16
- package/dist/predefined/brand/number/uint32.mjs.map +1 -1
- package/dist/predefined/brand/string/email.d.mts.map +1 -1
- package/dist/predefined/brand/string/email.mjs +11 -13
- package/dist/predefined/brand/string/email.mjs.map +1 -1
- package/dist/predefined/brand/string/iso-8601.d.mts.map +1 -1
- package/dist/predefined/brand/string/iso-8601.mjs +52 -66
- package/dist/predefined/brand/string/iso-8601.mjs.map +1 -1
- package/dist/predefined/brand/string/json-string.d.mts.map +1 -1
- package/dist/predefined/brand/string/json-string.mjs +12 -16
- package/dist/predefined/brand/string/json-string.mjs.map +1 -1
- package/dist/predefined/brand/string/non-empty-string.mjs +2 -5
- package/dist/predefined/brand/string/non-empty-string.mjs.map +1 -1
- package/dist/predefined/brand/string/uri.d.mts.map +1 -1
- package/dist/predefined/brand/string/uri.mjs +5 -10
- package/dist/predefined/brand/string/uri.mjs.map +1 -1
- package/dist/predefined/brand/string/uuid.d.mts.map +1 -1
- package/dist/predefined/brand/string/uuid.mjs +40 -51
- package/dist/predefined/brand/string/uuid.mjs.map +1 -1
- package/dist/predefined/int8.d.mts.map +1 -1
- package/dist/predefined/int8.mjs +3 -3
- package/dist/predefined/int8.mjs.map +1 -1
- package/dist/predefined/json.mjs +4 -1
- package/dist/predefined/json.mjs.map +1 -1
- package/dist/predefined/nullable.d.mts.map +1 -1
- package/dist/predefined/nullable.mjs.map +1 -1
- package/dist/predefined/uint8.d.mts.map +1 -1
- package/dist/predefined/uint8.mjs +3 -3
- package/dist/predefined/uint8.mjs.map +1 -1
- package/dist/primitives/bigint.mjs +85 -76
- package/dist/primitives/bigint.mjs.map +1 -1
- package/dist/primitives/boolean.d.mts.map +1 -1
- package/dist/primitives/boolean.mjs +1 -1
- package/dist/primitives/boolean.mjs.map +1 -1
- package/dist/primitives/null.mjs +3 -3
- package/dist/primitives/null.mjs.map +1 -1
- package/dist/primitives/number.mjs +99 -87
- package/dist/primitives/number.mjs.map +1 -1
- package/dist/primitives/string.mjs +81 -68
- package/dist/primitives/string.mjs.map +1 -1
- package/dist/primitives/symbol.d.mts.map +1 -1
- package/dist/primitives/symbol.mjs +3 -3
- package/dist/primitives/symbol.mjs.map +1 -1
- package/dist/primitives/undefined.mjs +3 -3
- package/dist/primitives/undefined.mjs.map +1 -1
- package/dist/record/at.mjs +30 -32
- package/dist/record/at.mjs.map +1 -1
- package/dist/record/key-value-record.d.mts +3 -3
- package/dist/record/key-value-record.d.mts.map +1 -1
- package/dist/record/key-value-record.mjs +77 -75
- package/dist/record/key-value-record.mjs.map +1 -1
- package/dist/record/keyof.d.mts.map +1 -1
- package/dist/record/keyof.mjs +25 -24
- package/dist/record/keyof.mjs.map +1 -1
- package/dist/record/merge-records.d.mts.map +1 -1
- package/dist/record/merge-records.mjs +39 -36
- package/dist/record/merge-records.mjs.map +1 -1
- package/dist/record/omit.d.mts.map +1 -1
- package/dist/record/omit.mjs +15 -14
- package/dist/record/omit.mjs.map +1 -1
- package/dist/record/optional.d.mts +5 -5
- package/dist/record/optional.d.mts.map +1 -1
- package/dist/record/optional.mjs +13 -46
- package/dist/record/optional.mjs.map +1 -1
- package/dist/record/partial.d.mts.map +1 -1
- package/dist/record/partial.mjs +24 -22
- package/dist/record/partial.mjs.map +1 -1
- package/dist/record/pick.d.mts.map +1 -1
- package/dist/record/pick.mjs +15 -14
- package/dist/record/pick.mjs.map +1 -1
- package/dist/record/record.d.mts +1 -1
- package/dist/record/record.d.mts.map +1 -1
- package/dist/record/record.mjs +121 -130
- package/dist/record/record.mjs.map +1 -1
- package/dist/record/required.d.mts.map +1 -1
- package/dist/record/required.mjs +29 -32
- package/dist/record/required.mjs.map +1 -1
- package/dist/record/valueof.d.mts.map +1 -1
- package/dist/record/valueof.mjs +21 -21
- package/dist/record/valueof.mjs.map +1 -1
- package/dist/type.d.mts +28 -4
- package/dist/type.d.mts.map +1 -1
- package/dist/type.mjs +56 -89
- package/dist/type.mjs.map +1 -1
- package/dist/utils/create-assert-fn.d.mts +1 -1
- package/dist/utils/create-assert-fn.d.mts.map +1 -1
- package/dist/utils/create-assert-fn.mjs +6 -5
- package/dist/utils/create-assert-fn.mjs.map +1 -1
- package/dist/utils/create-cast-fn.d.mts +1 -1
- package/dist/utils/create-cast-fn.d.mts.map +1 -1
- package/dist/utils/create-cast-fn.mjs +5 -6
- package/dist/utils/create-cast-fn.mjs.map +1 -1
- package/dist/utils/create-is-fn.d.mts +1 -1
- package/dist/utils/create-is-fn.d.mts.map +1 -1
- package/dist/utils/create-is-fn.mjs.map +1 -1
- package/dist/utils/create-primitive-type.d.mts.map +1 -1
- package/dist/utils/create-primitive-type.mjs +23 -21
- package/dist/utils/create-primitive-type.mjs.map +1 -1
- package/dist/utils/create-type.d.mts +3 -3
- package/dist/utils/create-type.d.mts.map +1 -1
- package/dist/utils/create-type.mjs +18 -12
- package/dist/utils/create-type.mjs.map +1 -1
- package/dist/utils/to-union-string.d.mts.map +1 -1
- package/dist/utils/to-union-string.mjs +3 -3
- package/dist/utils/to-union-string.mjs.map +1 -1
- package/dist/utils/validation-error.d.mts.map +1 -1
- package/dist/utils/validation-error.mjs +76 -92
- package/dist/utils/validation-error.mjs.map +1 -1
- package/package.json +13 -12
- package/src/array/tuple.mts +15 -5
- package/src/compose/intersection.mts +10 -10
- package/src/compose/union.mts +6 -6
- package/src/other-types/map.mts +6 -6
- package/src/other-types/set.mts +4 -3
- package/src/record/key-value-record.mts +3 -3
- package/src/record/optional.mts +5 -5
- package/src/record/required.mts +2 -3
- package/src/record/valueof.mts +2 -4
- package/src/type.mts +30 -4
|
@@ -5,66 +5,67 @@ import { createIsFn } from '../utils/create-is-fn.mjs';
|
|
|
5
5
|
import { createPrimitiveValidationError, prependIndexToValidationErrors } from '../utils/validation-error.mjs';
|
|
6
6
|
|
|
7
7
|
function arrayAtLeastLength(size, elementType, options) {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
8
|
+
const typeName = options?.typeName ?? `ArrayAtLeastLen<${size}, ${elementType.typeName}>`;
|
|
9
|
+
const getDefaultValue = memoizeFunction(
|
|
10
|
+
() => options?.defaultValue ?? // An array of `size` elements is the shortest value satisfying the bound.
|
|
11
|
+
Arr.create(asUint32(size), elementType.defaultValue)
|
|
12
|
+
);
|
|
13
|
+
const validate = (a) => {
|
|
14
|
+
if (!Arr.isArray(a)) {
|
|
15
|
+
return Result.err([
|
|
16
|
+
createPrimitiveValidationError({
|
|
17
|
+
actualValue: a,
|
|
18
|
+
expectedType: "array",
|
|
19
|
+
typeName,
|
|
20
|
+
details: void 0
|
|
21
|
+
})
|
|
22
|
+
]);
|
|
23
|
+
}
|
|
24
|
+
if (a.length < size) {
|
|
25
|
+
return Result.err([
|
|
26
|
+
{
|
|
27
|
+
path: [],
|
|
28
|
+
actualValue: a,
|
|
29
|
+
expectedType: typeName,
|
|
30
|
+
typeName,
|
|
31
|
+
details: {
|
|
32
|
+
kind: "array-min-length",
|
|
33
|
+
minLength: size,
|
|
34
|
+
actualLength: a.length
|
|
35
|
+
}
|
|
22
36
|
}
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
details: {
|
|
31
|
-
kind: 'array-min-length',
|
|
32
|
-
minLength: size,
|
|
33
|
-
actualLength: a.length,
|
|
34
|
-
},
|
|
35
|
-
},
|
|
36
|
-
]);
|
|
37
|
+
]);
|
|
38
|
+
}
|
|
39
|
+
const errors = Arr.generate(function* () {
|
|
40
|
+
for (const [index, el] of a.entries()) {
|
|
41
|
+
const res = elementType.validate(el);
|
|
42
|
+
if (Result.isErr(res)) {
|
|
43
|
+
yield* prependIndexToValidationErrors(res.value, index);
|
|
37
44
|
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
prune,
|
|
63
|
-
validate,
|
|
64
|
-
is: createIsFn(validate),
|
|
65
|
-
cast: createCastFn(validate),
|
|
66
|
-
assertIs: createAssertFn(validate),
|
|
67
|
-
};
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
if (Arr.isNonEmpty(errors)) {
|
|
48
|
+
return Result.err(errors);
|
|
49
|
+
}
|
|
50
|
+
return Result.ok(a);
|
|
51
|
+
};
|
|
52
|
+
const fill = (a) => Arr.isArray(a) ? Arr.map(
|
|
53
|
+
Arr.seq(asUint32(size)),
|
|
54
|
+
(i) => elementType.fill(a[i])
|
|
55
|
+
) : getDefaultValue();
|
|
56
|
+
const prune = (a) => a.map((el) => elementType.prune(el));
|
|
57
|
+
return {
|
|
58
|
+
typeName,
|
|
59
|
+
get defaultValue() {
|
|
60
|
+
return getDefaultValue();
|
|
61
|
+
},
|
|
62
|
+
fill,
|
|
63
|
+
prune,
|
|
64
|
+
validate,
|
|
65
|
+
is: createIsFn(validate),
|
|
66
|
+
cast: createCastFn(validate),
|
|
67
|
+
assertIs: createAssertFn(validate)
|
|
68
|
+
};
|
|
68
69
|
}
|
|
69
70
|
|
|
70
71
|
export { arrayAtLeastLength };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"array-at-least-length.mjs","sources":["../../src/array/array-at-least-length.mts"],"sourcesContent":[
|
|
1
|
+
{"version":3,"file":"array-at-least-length.mjs","sources":["../../src/array/array-at-least-length.mts"],"sourcesContent":["import { Arr, asUint32, memoizeFunction, Result } from 'ts-data-forge';\nimport { type ArrayAtLeastLen, type SmallUint } from 'ts-type-forge';\nimport { type Type } from '../type.mjs';\nimport {\n createAssertFn,\n createCastFn,\n createIsFn,\n createPrimitiveValidationError,\n prependIndexToValidationErrors,\n type ValidationError,\n} from '../utils/index.mjs';\n\nexport type { ArrayAtLeastLen } from 'ts-type-forge';\n\nexport function arrayAtLeastLength<A, N extends SmallUint>(\n size: N,\n elementType: Type<A>,\n options?: Partial<\n Readonly<{\n typeName: string;\n defaultValue: ArrayAtLeastLen<N, A>;\n }>\n >,\n): Type<ArrayAtLeastLen<N, A>>;\n\n// For sizes outside `SmallUint` the exact length cannot be encoded in the type,\n// so the result length is left unconstrained (`readonly A[]`).\nexport function arrayAtLeastLength<A>(\n size: number,\n elementType: Type<A>,\n options?: Partial<\n Readonly<{\n typeName: string;\n defaultValue: readonly A[];\n }>\n >,\n): Type<readonly A[]>;\n\nexport function arrayAtLeastLength<A>(\n size: number,\n elementType: Type<A>,\n options?: Partial<\n Readonly<{\n typeName: string;\n defaultValue: readonly A[];\n }>\n >,\n): Type<readonly A[]> {\n type T = readonly A[];\n\n const typeName =\n options?.typeName ?? `ArrayAtLeastLen<${size}, ${elementType.typeName}>`;\n\n const getDefaultValue = memoizeFunction(\n (): T =>\n options?.defaultValue ??\n // An array of `size` elements is the shortest value satisfying the bound.\n Arr.create(asUint32(size), elementType.defaultValue),\n );\n\n const validate: Type<T>['validate'] = (a) => {\n if (!Arr.isArray(a)) {\n return Result.err([\n createPrimitiveValidationError({\n actualValue: a,\n expectedType: 'array',\n typeName,\n details: undefined,\n }),\n ]);\n }\n\n if (a.length < size) {\n return Result.err([\n {\n path: [],\n actualValue: a,\n expectedType: typeName,\n typeName,\n details: {\n kind: 'array-min-length',\n minLength: size,\n actualLength: a.length,\n },\n } satisfies ValidationError,\n ]);\n }\n\n const errors: readonly ValidationError[] = Arr.generate(function* () {\n for (const [index, el] of a.entries()) {\n const res = elementType.validate(el);\n\n if (Result.isErr(res)) {\n yield* prependIndexToValidationErrors(res.value, index);\n }\n }\n });\n\n if (Arr.isNonEmpty(errors)) {\n return Result.err(errors);\n }\n\n // eslint-disable-next-line total-functions/no-unsafe-type-assertion\n return Result.ok(a as unknown as T);\n };\n\n const fill: Type<T>['fill'] = (a) =>\n Arr.isArray(a)\n ? Arr.map(\n Arr.seq(asUint32(size)),\n (i) => elementType.fill(a[i]) satisfies A,\n )\n : getDefaultValue();\n\n const prune = (a: T): T => a.map((el) => elementType.prune(el));\n\n return {\n typeName,\n get defaultValue() {\n return getDefaultValue();\n },\n fill,\n prune,\n validate,\n is: createIsFn(validate),\n cast: createCastFn(validate),\n assertIs: createAssertFn(validate),\n };\n}\n"],"names":[],"mappings":";;;;;;AAsCO,SAAS,kBAAA,CACd,IAAA,EACA,WAAA,EACA,OAAA,EAMoB;AAGpB,EAAA,MAAM,WACJ,OAAA,EAAS,QAAA,IAAY,mBAAmB,IAAI,CAAA,EAAA,EAAK,YAAY,QAAQ,CAAA,CAAA,CAAA;AAEvE,EAAA,MAAM,eAAA,GAAkB,eAAA;AAAA,IACtB,MACE,OAAA,EAAS,YAAA;AAAA,IAET,IAAI,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,EAAG,YAAY,YAAY;AAAA,GACvD;AAEA,EAAA,MAAM,QAAA,GAAgC,CAAC,CAAA,KAAM;AAC3C,IAAA,IAAI,CAAC,GAAA,CAAI,OAAA,CAAQ,CAAC,CAAA,EAAG;AACnB,MAAA,OAAO,OAAO,GAAA,CAAI;AAAA,QAChB,8BAAA,CAA+B;AAAA,UAC7B,WAAA,EAAa,CAAA;AAAA,UACb,YAAA,EAAc,OAAA;AAAA,UACd,QAAA;AAAA,UACA,OAAA,EAAS;AAAA,SACV;AAAA,OACF,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,CAAA,CAAE,SAAS,IAAA,EAAM;AACnB,MAAA,OAAO,OAAO,GAAA,CAAI;AAAA,QAChB;AAAA,UACE,MAAM,EAAC;AAAA,UACP,WAAA,EAAa,CAAA;AAAA,UACb,YAAA,EAAc,QAAA;AAAA,UACd,QAAA;AAAA,UACA,OAAA,EAAS;AAAA,YACP,IAAA,EAAM,kBAAA;AAAA,YACN,SAAA,EAAW,IAAA;AAAA,YACX,cAAc,CAAA,CAAE;AAAA;AAClB;AACF,OACD,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,MAAA,GAAqC,GAAA,CAAI,QAAA,CAAS,aAAa;AACnE,MAAA,KAAA,MAAW,CAAC,KAAA,EAAO,EAAE,CAAA,IAAK,CAAA,CAAE,SAAQ,EAAG;AACrC,QAAA,MAAM,GAAA,GAAM,WAAA,CAAY,QAAA,CAAS,EAAE,CAAA;AAEnC,QAAA,IAAI,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA,EAAG;AACrB,UAAA,OAAO,8BAAA,CAA+B,GAAA,CAAI,KAAA,EAAO,KAAK,CAAA;AAAA,QACxD;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AAED,IAAA,IAAI,GAAA,CAAI,UAAA,CAAW,MAAM,CAAA,EAAG;AAC1B,MAAA,OAAO,MAAA,CAAO,IAAI,MAAM,CAAA;AAAA,IAC1B;AAGA,IAAA,OAAO,MAAA,CAAO,GAAG,CAAiB,CAAA;AAAA,EACpC,CAAA;AAEA,EAAA,MAAM,OAAwB,CAAC,CAAA,KAC7B,IAAI,OAAA,CAAQ,CAAC,IACT,GAAA,CAAI,GAAA;AAAA,IACF,GAAA,CAAI,GAAA,CAAI,QAAA,CAAS,IAAI,CAAC,CAAA;AAAA,IACtB,CAAC,CAAA,KAAM,WAAA,CAAY,IAAA,CAAK,CAAA,CAAE,CAAC,CAAC;AAAA,MAE9B,eAAA,EAAgB;AAEtB,EAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAY,CAAA,CAAE,GAAA,CAAI,CAAC,EAAA,KAAO,WAAA,CAAY,KAAA,CAAM,EAAE,CAAC,CAAA;AAE9D,EAAA,OAAO;AAAA,IACL,QAAA;AAAA,IACA,IAAI,YAAA,GAAe;AACjB,MAAA,OAAO,eAAA,EAAgB;AAAA,IACzB,CAAA;AAAA,IACA,IAAA;AAAA,IACA,KAAA;AAAA,IACA,QAAA;AAAA,IACA,EAAA,EAAI,WAAW,QAAQ,CAAA;AAAA,IACvB,IAAA,EAAM,aAAa,QAAQ,CAAA;AAAA,IAC3B,QAAA,EAAU,eAAe,QAAQ;AAAA,GACnC;AACF;;;;"}
|
|
@@ -5,67 +5,70 @@ import { createIsFn } from '../utils/create-is-fn.mjs';
|
|
|
5
5
|
import { createPrimitiveValidationError, prependIndexToValidationErrors } from '../utils/validation-error.mjs';
|
|
6
6
|
|
|
7
7
|
function arrayAtMostLength(size, elementType, options) {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
8
|
+
const typeName = options?.typeName ?? `ArrayAtMostLen<${size}, ${elementType.typeName}>`;
|
|
9
|
+
const getDefaultValue = memoizeFunction(
|
|
10
|
+
() => options?.defaultValue ?? // The empty array is the shortest value satisfying `length <= size`.
|
|
11
|
+
Arr.create(0, elementType.defaultValue)
|
|
12
|
+
);
|
|
13
|
+
const validate = (a) => {
|
|
14
|
+
if (!Arr.isArray(a)) {
|
|
15
|
+
return Result.err([
|
|
16
|
+
createPrimitiveValidationError({
|
|
17
|
+
actualValue: a,
|
|
18
|
+
expectedType: "array",
|
|
19
|
+
typeName,
|
|
20
|
+
details: void 0
|
|
21
|
+
})
|
|
22
|
+
]);
|
|
23
|
+
}
|
|
24
|
+
if (a.length > size) {
|
|
25
|
+
return Result.err([
|
|
26
|
+
{
|
|
27
|
+
path: [],
|
|
28
|
+
actualValue: a,
|
|
29
|
+
expectedType: typeName,
|
|
30
|
+
typeName,
|
|
31
|
+
details: {
|
|
32
|
+
kind: "array-max-length",
|
|
33
|
+
maxLength: size,
|
|
34
|
+
actualLength: a.length
|
|
35
|
+
}
|
|
22
36
|
}
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
details: {
|
|
31
|
-
kind: 'array-max-length',
|
|
32
|
-
maxLength: size,
|
|
33
|
-
actualLength: a.length,
|
|
34
|
-
},
|
|
35
|
-
},
|
|
36
|
-
]);
|
|
37
|
+
]);
|
|
38
|
+
}
|
|
39
|
+
const errors = Arr.generate(function* () {
|
|
40
|
+
for (const [index, el] of a.entries()) {
|
|
41
|
+
const res = elementType.validate(el);
|
|
42
|
+
if (Result.isErr(res)) {
|
|
43
|
+
yield* prependIndexToValidationErrors(res.value, index);
|
|
37
44
|
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
is: createIsFn(validate),
|
|
66
|
-
cast: createCastFn(validate),
|
|
67
|
-
assertIs: createAssertFn(validate),
|
|
68
|
-
};
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
if (Arr.isNonEmpty(errors)) {
|
|
48
|
+
return Result.err(errors);
|
|
49
|
+
}
|
|
50
|
+
return Result.ok(a);
|
|
51
|
+
};
|
|
52
|
+
const fill = (a) => Arr.isArray(a) ? (
|
|
53
|
+
// Keep the input but trim down to at most `size` elements.
|
|
54
|
+
Arr.map(
|
|
55
|
+
Arr.take(a, asUint32(size)),
|
|
56
|
+
(el) => elementType.fill(el)
|
|
57
|
+
)
|
|
58
|
+
) : getDefaultValue();
|
|
59
|
+
const prune = (a) => a.map((el) => elementType.prune(el));
|
|
60
|
+
return {
|
|
61
|
+
typeName,
|
|
62
|
+
get defaultValue() {
|
|
63
|
+
return getDefaultValue();
|
|
64
|
+
},
|
|
65
|
+
fill,
|
|
66
|
+
prune,
|
|
67
|
+
validate,
|
|
68
|
+
is: createIsFn(validate),
|
|
69
|
+
cast: createCastFn(validate),
|
|
70
|
+
assertIs: createAssertFn(validate)
|
|
71
|
+
};
|
|
69
72
|
}
|
|
70
73
|
|
|
71
74
|
export { arrayAtMostLength };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"array-at-most-length.mjs","sources":["../../src/array/array-at-most-length.mts"],"sourcesContent":[
|
|
1
|
+
{"version":3,"file":"array-at-most-length.mjs","sources":["../../src/array/array-at-most-length.mts"],"sourcesContent":["import { Arr, asUint32, memoizeFunction, Result } from 'ts-data-forge';\nimport { type ArrayAtMostLen, type SmallUint } from 'ts-type-forge';\nimport { type Type } from '../type.mjs';\nimport {\n createAssertFn,\n createCastFn,\n createIsFn,\n createPrimitiveValidationError,\n prependIndexToValidationErrors,\n type ValidationError,\n} from '../utils/index.mjs';\n\nexport type { ArrayAtMostLen } from 'ts-type-forge';\n\nexport function arrayAtMostLength<A, N extends SmallUint>(\n size: N,\n elementType: Type<A>,\n options?: Partial<\n Readonly<{\n typeName: string;\n defaultValue: ArrayAtMostLen<N, A>;\n }>\n >,\n): Type<ArrayAtMostLen<N, A>>;\n\n// For sizes outside `SmallUint` the exact length cannot be encoded in the type,\n// so the result length is left unconstrained (`readonly A[]`).\nexport function arrayAtMostLength<A>(\n size: number,\n elementType: Type<A>,\n options?: Partial<\n Readonly<{\n typeName: string;\n defaultValue: readonly A[];\n }>\n >,\n): Type<readonly A[]>;\n\nexport function arrayAtMostLength<A>(\n size: number,\n elementType: Type<A>,\n options?: Partial<\n Readonly<{\n typeName: string;\n defaultValue: readonly A[];\n }>\n >,\n): Type<readonly A[]> {\n type T = readonly A[];\n\n const typeName =\n options?.typeName ?? `ArrayAtMostLen<${size}, ${elementType.typeName}>`;\n\n const getDefaultValue = memoizeFunction(\n (): T =>\n options?.defaultValue ??\n // The empty array is the shortest value satisfying `length <= size`.\n Arr.create(0, elementType.defaultValue),\n );\n\n const validate: Type<T>['validate'] = (a) => {\n if (!Arr.isArray(a)) {\n return Result.err([\n createPrimitiveValidationError({\n actualValue: a,\n expectedType: 'array',\n typeName,\n details: undefined,\n }),\n ]);\n }\n\n if (a.length > size) {\n return Result.err([\n {\n path: [],\n actualValue: a,\n expectedType: typeName,\n typeName,\n details: {\n kind: 'array-max-length',\n maxLength: size,\n actualLength: a.length,\n },\n } satisfies ValidationError,\n ]);\n }\n\n const errors: readonly ValidationError[] = Arr.generate(function* () {\n for (const [index, el] of a.entries()) {\n const res = elementType.validate(el);\n\n if (Result.isErr(res)) {\n yield* prependIndexToValidationErrors(res.value, index);\n }\n }\n });\n\n if (Arr.isNonEmpty(errors)) {\n return Result.err(errors);\n }\n\n // eslint-disable-next-line total-functions/no-unsafe-type-assertion\n return Result.ok(a as unknown as T);\n };\n\n const fill: Type<T>['fill'] = (a) =>\n Arr.isArray(a)\n ? // Keep the input but trim down to at most `size` elements.\n Arr.map(\n Arr.take(a, asUint32(size)),\n (el) => elementType.fill(el) satisfies A,\n )\n : getDefaultValue();\n\n const prune = (a: T): T => a.map((el) => elementType.prune(el));\n\n return {\n typeName,\n get defaultValue() {\n return getDefaultValue();\n },\n fill,\n prune,\n validate,\n is: createIsFn(validate),\n cast: createCastFn(validate),\n assertIs: createAssertFn(validate),\n };\n}\n"],"names":[],"mappings":";;;;;;AAsCO,SAAS,iBAAA,CACd,IAAA,EACA,WAAA,EACA,OAAA,EAMoB;AAGpB,EAAA,MAAM,WACJ,OAAA,EAAS,QAAA,IAAY,kBAAkB,IAAI,CAAA,EAAA,EAAK,YAAY,QAAQ,CAAA,CAAA,CAAA;AAEtE,EAAA,MAAM,eAAA,GAAkB,eAAA;AAAA,IACtB,MACE,OAAA,EAAS,YAAA;AAAA,IAET,GAAA,CAAI,MAAA,CAAO,CAAA,EAAG,WAAA,CAAY,YAAY;AAAA,GAC1C;AAEA,EAAA,MAAM,QAAA,GAAgC,CAAC,CAAA,KAAM;AAC3C,IAAA,IAAI,CAAC,GAAA,CAAI,OAAA,CAAQ,CAAC,CAAA,EAAG;AACnB,MAAA,OAAO,OAAO,GAAA,CAAI;AAAA,QAChB,8BAAA,CAA+B;AAAA,UAC7B,WAAA,EAAa,CAAA;AAAA,UACb,YAAA,EAAc,OAAA;AAAA,UACd,QAAA;AAAA,UACA,OAAA,EAAS;AAAA,SACV;AAAA,OACF,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,CAAA,CAAE,SAAS,IAAA,EAAM;AACnB,MAAA,OAAO,OAAO,GAAA,CAAI;AAAA,QAChB;AAAA,UACE,MAAM,EAAC;AAAA,UACP,WAAA,EAAa,CAAA;AAAA,UACb,YAAA,EAAc,QAAA;AAAA,UACd,QAAA;AAAA,UACA,OAAA,EAAS;AAAA,YACP,IAAA,EAAM,kBAAA;AAAA,YACN,SAAA,EAAW,IAAA;AAAA,YACX,cAAc,CAAA,CAAE;AAAA;AAClB;AACF,OACD,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,MAAA,GAAqC,GAAA,CAAI,QAAA,CAAS,aAAa;AACnE,MAAA,KAAA,MAAW,CAAC,KAAA,EAAO,EAAE,CAAA,IAAK,CAAA,CAAE,SAAQ,EAAG;AACrC,QAAA,MAAM,GAAA,GAAM,WAAA,CAAY,QAAA,CAAS,EAAE,CAAA;AAEnC,QAAA,IAAI,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA,EAAG;AACrB,UAAA,OAAO,8BAAA,CAA+B,GAAA,CAAI,KAAA,EAAO,KAAK,CAAA;AAAA,QACxD;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AAED,IAAA,IAAI,GAAA,CAAI,UAAA,CAAW,MAAM,CAAA,EAAG;AAC1B,MAAA,OAAO,MAAA,CAAO,IAAI,MAAM,CAAA;AAAA,IAC1B;AAGA,IAAA,OAAO,MAAA,CAAO,GAAG,CAAiB,CAAA;AAAA,EACpC,CAAA;AAEA,EAAA,MAAM,IAAA,GAAwB,CAAC,CAAA,KAC7B,GAAA,CAAI,QAAQ,CAAC,CAAA;AAAA;AAAA,IAET,GAAA,CAAI,GAAA;AAAA,MACF,GAAA,CAAI,IAAA,CAAK,CAAA,EAAG,QAAA,CAAS,IAAI,CAAC,CAAA;AAAA,MAC1B,CAAC,EAAA,KAAO,WAAA,CAAY,IAAA,CAAK,EAAE;AAAA;AAC7B,MACA,eAAA,EAAgB;AAEtB,EAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAY,CAAA,CAAE,GAAA,CAAI,CAAC,EAAA,KAAO,WAAA,CAAY,KAAA,CAAM,EAAE,CAAC,CAAA;AAE9D,EAAA,OAAO;AAAA,IACL,QAAA;AAAA,IACA,IAAI,YAAA,GAAe;AACjB,MAAA,OAAO,eAAA,EAAgB;AAAA,IACzB,CAAA;AAAA,IACA,IAAA;AAAA,IACA,KAAA;AAAA,IACA,QAAA;AAAA,IACA,EAAA,EAAI,WAAW,QAAQ,CAAA;AAAA,IACvB,IAAA,EAAM,aAAa,QAAQ,CAAA;AAAA,IAC3B,QAAA,EAAU,eAAe,QAAQ;AAAA,GACnC;AACF;;;;"}
|
|
@@ -5,75 +5,74 @@ import { createIsFn } from '../utils/create-is-fn.mjs';
|
|
|
5
5
|
import { createPrimitiveValidationError, prependIndexToValidationErrors } from '../utils/validation-error.mjs';
|
|
6
6
|
|
|
7
7
|
function arrayBoundedLength(min, max, elementType, options) {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
8
|
+
const typeName = options?.typeName ?? `ArrayBoundedLen<${min}, ${max}, ${elementType.typeName}>`;
|
|
9
|
+
const getDefaultValue = memoizeFunction(
|
|
10
|
+
() => options?.defaultValue ?? // An array of the minimum length is the shortest value within the range.
|
|
11
|
+
Arr.create(asUint32(min), elementType.defaultValue)
|
|
12
|
+
);
|
|
13
|
+
const validate = (a) => {
|
|
14
|
+
if (!Arr.isArray(a)) {
|
|
15
|
+
return Result.err([
|
|
16
|
+
createPrimitiveValidationError({
|
|
17
|
+
actualValue: a,
|
|
18
|
+
expectedType: "array",
|
|
19
|
+
typeName,
|
|
20
|
+
details: void 0
|
|
21
|
+
})
|
|
22
|
+
]);
|
|
23
|
+
}
|
|
24
|
+
if (a.length < min || max < a.length) {
|
|
25
|
+
return Result.err([
|
|
26
|
+
{
|
|
27
|
+
path: [],
|
|
28
|
+
actualValue: a,
|
|
29
|
+
expectedType: typeName,
|
|
30
|
+
typeName,
|
|
31
|
+
details: {
|
|
32
|
+
kind: "array-range-length",
|
|
33
|
+
minLength: min,
|
|
34
|
+
maxLength: max,
|
|
35
|
+
actualLength: a.length
|
|
36
|
+
}
|
|
23
37
|
}
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
details: {
|
|
32
|
-
kind: 'array-range-length',
|
|
33
|
-
minLength: min,
|
|
34
|
-
maxLength: max,
|
|
35
|
-
actualLength: a.length,
|
|
36
|
-
},
|
|
37
|
-
},
|
|
38
|
-
]);
|
|
38
|
+
]);
|
|
39
|
+
}
|
|
40
|
+
const errors = Arr.generate(function* () {
|
|
41
|
+
for (const [index, el] of a.entries()) {
|
|
42
|
+
const res = elementType.validate(el);
|
|
43
|
+
if (Result.isErr(res)) {
|
|
44
|
+
yield* prependIndexToValidationErrors(res.value, index);
|
|
39
45
|
}
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
fill,
|
|
71
|
-
prune,
|
|
72
|
-
validate,
|
|
73
|
-
is: createIsFn(validate),
|
|
74
|
-
cast: createCastFn(validate),
|
|
75
|
-
assertIs: createAssertFn(validate),
|
|
76
|
-
};
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
if (Arr.isNonEmpty(errors)) {
|
|
49
|
+
return Result.err(errors);
|
|
50
|
+
}
|
|
51
|
+
return Result.ok(a);
|
|
52
|
+
};
|
|
53
|
+
const fill = (a) => {
|
|
54
|
+
if (!Arr.isArray(a)) {
|
|
55
|
+
return getDefaultValue();
|
|
56
|
+
}
|
|
57
|
+
const capped = Arr.take(a, asUint32(max));
|
|
58
|
+
return capped.length >= min ? Arr.map(capped, (el) => elementType.fill(el)) : Arr.map(
|
|
59
|
+
Arr.seq(asUint32(min)),
|
|
60
|
+
(i) => elementType.fill(capped[i])
|
|
61
|
+
);
|
|
62
|
+
};
|
|
63
|
+
const prune = (a) => a.map((el) => elementType.prune(el));
|
|
64
|
+
return {
|
|
65
|
+
typeName,
|
|
66
|
+
get defaultValue() {
|
|
67
|
+
return getDefaultValue();
|
|
68
|
+
},
|
|
69
|
+
fill,
|
|
70
|
+
prune,
|
|
71
|
+
validate,
|
|
72
|
+
is: createIsFn(validate),
|
|
73
|
+
cast: createCastFn(validate),
|
|
74
|
+
assertIs: createAssertFn(validate)
|
|
75
|
+
};
|
|
77
76
|
}
|
|
78
77
|
|
|
79
78
|
export { arrayBoundedLength };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"array-bounded-length.mjs","sources":["../../src/array/array-bounded-length.mts"],"sourcesContent":[
|
|
1
|
+
{"version":3,"file":"array-bounded-length.mjs","sources":["../../src/array/array-bounded-length.mts"],"sourcesContent":["import { Arr, asUint32, memoizeFunction, Result } from 'ts-data-forge';\nimport {\n type ArrayAtLeastLen,\n type ArrayAtMostLen,\n type ArrayBoundedLen,\n type SmallUint,\n} from 'ts-type-forge';\nimport { type Type } from '../type.mjs';\nimport {\n createAssertFn,\n createCastFn,\n createIsFn,\n createPrimitiveValidationError,\n prependIndexToValidationErrors,\n type ValidationError,\n} from '../utils/index.mjs';\n\nexport type { ArrayBoundedLen } from 'ts-type-forge';\n\nexport function arrayBoundedLength<\n A,\n Min extends SmallUint,\n Max extends SmallUint,\n>(\n min: Min,\n max: Max,\n elementType: Type<A>,\n options?: Partial<\n Readonly<{\n typeName: string;\n defaultValue: ArrayBoundedLen<Min, Max, A>;\n }>\n >,\n): Type<ArrayBoundedLen<Min, Max, A>>;\n\n// Only the lower bound is in `SmallUint`, so the upper bound is dropped from the\n// result type and only the \"at least `min`\" guarantee is kept.\nexport function arrayBoundedLength<A, Min extends SmallUint>(\n min: Min,\n max: number,\n elementType: Type<A>,\n options?: Partial<\n Readonly<{\n typeName: string;\n defaultValue: ArrayAtLeastLen<Min, A>;\n }>\n >,\n): Type<ArrayAtLeastLen<Min, A>>;\n\n// Only the upper bound is in `SmallUint`, so the lower bound is dropped from the\n// result type and only the \"at most `max`\" guarantee is kept.\nexport function arrayBoundedLength<A, Max extends SmallUint>(\n min: number,\n max: Max,\n elementType: Type<A>,\n options?: Partial<\n Readonly<{\n typeName: string;\n defaultValue: ArrayAtMostLen<Max, A>;\n }>\n >,\n): Type<ArrayAtMostLen<Max, A>>;\n\n// Neither bound is in `SmallUint`, so the result length is left unconstrained.\nexport function arrayBoundedLength<A>(\n min: number,\n max: number,\n elementType: Type<A>,\n options?: Partial<\n Readonly<{\n typeName: string;\n defaultValue: readonly A[];\n }>\n >,\n): Type<readonly A[]>;\n\nexport function arrayBoundedLength<A>(\n min: number,\n max: number,\n elementType: Type<A>,\n options?: Partial<\n Readonly<{\n typeName: string;\n defaultValue: readonly A[];\n }>\n >,\n): Type<readonly A[]> {\n type T = readonly A[];\n\n const typeName =\n options?.typeName ??\n `ArrayBoundedLen<${min}, ${max}, ${elementType.typeName}>`;\n\n const getDefaultValue = memoizeFunction(\n (): T =>\n options?.defaultValue ??\n // An array of the minimum length is the shortest value within the range.\n Arr.create(asUint32(min), elementType.defaultValue),\n );\n\n const validate: Type<T>['validate'] = (a) => {\n if (!Arr.isArray(a)) {\n return Result.err([\n createPrimitiveValidationError({\n actualValue: a,\n expectedType: 'array',\n typeName,\n details: undefined,\n }),\n ]);\n }\n\n if (a.length < min || max < a.length) {\n return Result.err([\n {\n path: [],\n actualValue: a,\n expectedType: typeName,\n typeName,\n details: {\n kind: 'array-range-length',\n minLength: min,\n maxLength: max,\n actualLength: a.length,\n },\n } satisfies ValidationError,\n ]);\n }\n\n const errors: readonly ValidationError[] = Arr.generate(function* () {\n for (const [index, el] of a.entries()) {\n const res = elementType.validate(el);\n\n if (Result.isErr(res)) {\n yield* prependIndexToValidationErrors(res.value, index);\n }\n }\n });\n\n if (Arr.isNonEmpty(errors)) {\n return Result.err(errors);\n }\n\n // eslint-disable-next-line total-functions/no-unsafe-type-assertion\n return Result.ok(a as unknown as T);\n };\n\n const fill: Type<T>['fill'] = (a) => {\n if (!Arr.isArray(a)) {\n return getDefaultValue();\n }\n\n // Trim down to at most `max`, then pad up to at least `min`.\n const capped = Arr.take(a, asUint32(max));\n\n return capped.length >= min\n ? Arr.map(capped, (el) => elementType.fill(el) satisfies A)\n : Arr.map(\n Arr.seq(asUint32(min)),\n (i) => elementType.fill(capped[i]) satisfies A,\n );\n };\n\n const prune = (a: T): T => a.map((el) => elementType.prune(el));\n\n return {\n typeName,\n get defaultValue() {\n return getDefaultValue();\n },\n fill,\n prune,\n validate,\n is: createIsFn(validate),\n cast: createCastFn(validate),\n assertIs: createAssertFn(validate),\n };\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"array-of-length.d.mts","sourceRoot":"","sources":["../../src/array/array-of-length.mts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,SAAS,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,aAAa,CAAC;AAUxC,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,eAAO,MAAM,aAAa,GAAI,CAAC,EAAE,CAAC,SAAS,SAAS,
|
|
1
|
+
{"version":3,"file":"array-of-length.d.mts","sourceRoot":"","sources":["../../src/array/array-of-length.mts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,SAAS,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,aAAa,CAAC;AAUxC,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,eAAO,MAAM,aAAa,GAAI,CAAC,EAAE,CAAC,SAAS,SAAS,QAC5C,CAAC,eACM,IAAI,CAAC,CAAC,CAAC,YACV,OAAO,CACf,QAAQ,CAAC;IACP,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;CACnC,CAAC,CACH,KACA,IAAI,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAoF1B,CAAC"}
|