ts-fortress 6.2.5 → 6.3.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 +6 -6
- package/dist/other-types/recursion.d.mts +28 -1
- package/dist/other-types/recursion.d.mts.map +1 -1
- package/dist/other-types/recursion.mjs +28 -1
- package/dist/other-types/recursion.mjs.map +1 -1
- package/dist/other-types/unknown.d.mts.map +1 -1
- package/dist/other-types/unknown.mjs.map +1 -1
- package/dist/record/optional.d.mts +71 -1
- package/dist/record/optional.d.mts.map +1 -1
- package/dist/record/optional.mjs +77 -2
- package/dist/record/optional.mjs.map +1 -1
- package/dist/record/record.d.mts.map +1 -1
- package/dist/record/record.mjs +26 -2
- package/dist/record/record.mjs.map +1 -1
- package/dist/utils/create-assert-fn.mjs.map +1 -1
- package/dist/utils/validation-error.d.mts.map +1 -1
- package/dist/utils/validation-error.mjs +3 -1
- package/dist/utils/validation-error.mjs.map +1 -1
- package/package.json +13 -9
- package/src/array/array-at-least-length.test.mts +9 -9
- package/src/array/array-of-length.test.mts +10 -10
- package/src/array/array.test.mts +7 -7
- package/src/array/non-empty-array.test.mts +10 -10
- package/src/array/tuple.test.mts +10 -10
- package/src/compose/intersection.test.mts +7 -7
- package/src/compose/merge-records.test.mts +6 -6
- package/src/compose/union-literal-array.test.mts +3 -3
- package/src/compose/union-mixed.test.mts +5 -5
- package/src/compose/union-nested-array.test.mts +7 -7
- package/src/compose/union-nested-record.test.mts +6 -6
- package/src/compose/union-primitive-array.test.mts +6 -6
- package/src/compose/union-record-array.test.mts +7 -7
- package/src/compose/union-record-primitive.test.mts +4 -4
- package/src/compose/union-records.test.mts +6 -6
- package/src/compose/union.test.mts +3 -3
- package/src/other-types/recursion.mts +28 -1
- package/src/other-types/recursion.test.mts +519 -7
- package/src/other-types/set.test.mts +2 -2
- package/src/other-types/unknown.mts +12 -11
- package/src/record/key-value-record.test.mts +8 -8
- package/src/record/omit.test.mts +12 -12
- package/src/record/optional.mts +92 -4
- package/src/record/optional.test.mts +3 -1
- package/src/record/partial.test.mts +27 -27
- package/src/record/pick.test.mts +13 -13
- package/src/record/record-allow-excess-properties.test.mts +10 -10
- package/src/record/record-strict-composition-simple.test.mts +35 -12
- package/src/record/record-strict-composition.test.mts +45 -25
- package/src/record/record.mts +34 -7
- package/src/record/record.test.mts +22 -22
- package/src/record/required.test.mts +31 -31
- package/src/record/strict-record.test.mts +24 -12
- package/src/utils/create-assert-fn.mts +1 -1
- package/src/utils/validation-error.mts +13 -10
- package/src/utils/validation-error.test.mts +4 -4
package/README.md
CHANGED
|
@@ -127,7 +127,7 @@ const partialData = {
|
|
|
127
127
|
// notifications missing - will be filled with default
|
|
128
128
|
},
|
|
129
129
|
// age, email, tags missing - will be filled with defaults
|
|
130
|
-
};
|
|
130
|
+
} as const;
|
|
131
131
|
|
|
132
132
|
const filledData = UserProfile.fill(partialData);
|
|
133
133
|
|
|
@@ -534,7 +534,7 @@ const User = t.record({
|
|
|
534
534
|
type User = t.TypeOf<typeof User>;
|
|
535
535
|
|
|
536
536
|
// Use defaultValue for initialization
|
|
537
|
-
const newUser: User = { ...User.defaultValue, id: 'user-123' };
|
|
537
|
+
const newUser: User = { ...User.defaultValue, id: 'user-123' } as const;
|
|
538
538
|
|
|
539
539
|
// This default value filling process can also be written as follows:
|
|
540
540
|
const newUser2: User = User.fill({ id: 'user-456' });
|
|
@@ -645,13 +645,13 @@ const PermissiveUserType = t.record(
|
|
|
645
645
|
);
|
|
646
646
|
|
|
647
647
|
// Example usage - both StrictUserType and StrictUserTypeAlias behave identically
|
|
648
|
-
const strictData = { id: '123', name: 'John', extra: 'not allowed' };
|
|
648
|
+
const strictData = { id: '123', name: 'John', extra: 'not allowed' } as const;
|
|
649
649
|
|
|
650
650
|
assert.isFalse(StrictUserType.is(strictData)); // 'extra' property causes rejection
|
|
651
651
|
|
|
652
652
|
assert.isFalse(StrictUserTypeAlias.is(strictData)); // same as above
|
|
653
653
|
|
|
654
|
-
const permissiveData = { id: '123', name: 'John', extra: 'allowed' };
|
|
654
|
+
const permissiveData = { id: '123', name: 'John', extra: 'allowed' } as const;
|
|
655
655
|
|
|
656
656
|
assert.isTrue(PermissiveUserType.is(permissiveData)); // 'extra' property is allowed
|
|
657
657
|
|
|
@@ -927,7 +927,7 @@ const User = t.record({
|
|
|
927
927
|
|
|
928
928
|
type User = t.TypeOf<typeof User>;
|
|
929
929
|
|
|
930
|
-
const invalidData = { name: 123, age: 'not a number' };
|
|
930
|
+
const invalidData = { name: 123, age: 'not a number' } as const;
|
|
931
931
|
|
|
932
932
|
const result = User.validate(invalidData);
|
|
933
933
|
|
|
@@ -986,7 +986,7 @@ const StrictType = t.record(
|
|
|
986
986
|
},
|
|
987
987
|
);
|
|
988
988
|
|
|
989
|
-
const dataWithExcess = { name: 'John', age: 30, extra: 'not allowed' };
|
|
989
|
+
const dataWithExcess = { name: 'John', age: 30, extra: 'not allowed' } as const;
|
|
990
990
|
|
|
991
991
|
const strictResult = StrictType.validate(dataWithExcess);
|
|
992
992
|
|
|
@@ -106,13 +106,40 @@ import { type Type } from '../type.mjs';
|
|
|
106
106
|
* );
|
|
107
107
|
* ```
|
|
108
108
|
*
|
|
109
|
+
* @example
|
|
110
|
+
* // Mutually recursive types with optional fields
|
|
111
|
+
* ```ts
|
|
112
|
+
* import * as t from 'ts-fortress';
|
|
113
|
+
*
|
|
114
|
+
* type EvenNumber = Readonly<{ type: 'even'; next?: OddNumber }>;
|
|
115
|
+
*
|
|
116
|
+
* type OddNumber = Readonly<{ type: 'odd'; next?: EvenNumber }>;
|
|
117
|
+
*
|
|
118
|
+
* // When using optional fields in mutually recursive types,
|
|
119
|
+
* // use forceUndefinedDefault to avoid infinite loops when accessing defaultValue
|
|
120
|
+
* const EvenNumber: t.Type<EvenNumber> = t.recursion('EvenNumber', () =>
|
|
121
|
+
* t.record({
|
|
122
|
+
* type: t.literal('even'),
|
|
123
|
+
* next: t.optional(OddNumber, { forceUndefinedDefault: true }),
|
|
124
|
+
* }),
|
|
125
|
+
* );
|
|
126
|
+
*
|
|
127
|
+
* const OddNumber: t.Type<OddNumber> = t.recursion('OddNumber', () =>
|
|
128
|
+
* t.record({
|
|
129
|
+
* type: t.literal('odd'),
|
|
130
|
+
* next: t.optional(EvenNumber, { forceUndefinedDefault: true }),
|
|
131
|
+
* }),
|
|
132
|
+
* );
|
|
133
|
+
* ```
|
|
134
|
+
*
|
|
109
135
|
* @remarks
|
|
110
136
|
* **Important Notes:**
|
|
111
137
|
* - The `definition` function is called lazily on first use, enabling self-reference
|
|
112
138
|
* - For mutually recursive types, accessing `defaultValue` may cause infinite loops
|
|
113
139
|
* unless proper precautions are taken:
|
|
114
140
|
* 1. Place terminal types (like `nullType`) first in union types, OR
|
|
115
|
-
* 2. Provide an explicit `defaultValue` in options
|
|
141
|
+
* 2. Provide an explicit `defaultValue` in options, OR
|
|
142
|
+
* 3. Use `optional()` with `forceUndefinedDefault: true` for optional fields
|
|
116
143
|
* - The type definition itself (validation, type checking) works fine regardless of
|
|
117
144
|
* union ordering or defaultValue specification
|
|
118
145
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recursion.d.mts","sourceRoot":"","sources":["../../src/other-types/recursion.mts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,aAAa,CAAC;AAGxC
|
|
1
|
+
{"version":3,"file":"recursion.d.mts","sourceRoot":"","sources":["../../src/other-types/recursion.mts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,aAAa,CAAC;AAGxC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+IG;AACH,eAAO,MAAM,SAAS,GAAI,CAAC,EACzB,UAAU,MAAM,EAChB,YAAY,MAAM,IAAI,CAAC,CAAC,CAAC,EACzB,UAAU,OAAO,CACf,QAAQ,CAAC;IACP,YAAY,EAAE,CAAC,CAAC;CACjB,CAAC,CACH,KACA,IAAI,CAAC,CAAC,CAwBR,CAAC"}
|
|
@@ -110,13 +110,40 @@ import { createIsFn } from '../utils/create-is-fn.mjs';
|
|
|
110
110
|
* );
|
|
111
111
|
* ```
|
|
112
112
|
*
|
|
113
|
+
* @example
|
|
114
|
+
* // Mutually recursive types with optional fields
|
|
115
|
+
* ```ts
|
|
116
|
+
* import * as t from 'ts-fortress';
|
|
117
|
+
*
|
|
118
|
+
* type EvenNumber = Readonly<{ type: 'even'; next?: OddNumber }>;
|
|
119
|
+
*
|
|
120
|
+
* type OddNumber = Readonly<{ type: 'odd'; next?: EvenNumber }>;
|
|
121
|
+
*
|
|
122
|
+
* // When using optional fields in mutually recursive types,
|
|
123
|
+
* // use forceUndefinedDefault to avoid infinite loops when accessing defaultValue
|
|
124
|
+
* const EvenNumber: t.Type<EvenNumber> = t.recursion('EvenNumber', () =>
|
|
125
|
+
* t.record({
|
|
126
|
+
* type: t.literal('even'),
|
|
127
|
+
* next: t.optional(OddNumber, { forceUndefinedDefault: true }),
|
|
128
|
+
* }),
|
|
129
|
+
* );
|
|
130
|
+
*
|
|
131
|
+
* const OddNumber: t.Type<OddNumber> = t.recursion('OddNumber', () =>
|
|
132
|
+
* t.record({
|
|
133
|
+
* type: t.literal('odd'),
|
|
134
|
+
* next: t.optional(EvenNumber, { forceUndefinedDefault: true }),
|
|
135
|
+
* }),
|
|
136
|
+
* );
|
|
137
|
+
* ```
|
|
138
|
+
*
|
|
113
139
|
* @remarks
|
|
114
140
|
* **Important Notes:**
|
|
115
141
|
* - The `definition` function is called lazily on first use, enabling self-reference
|
|
116
142
|
* - For mutually recursive types, accessing `defaultValue` may cause infinite loops
|
|
117
143
|
* unless proper precautions are taken:
|
|
118
144
|
* 1. Place terminal types (like `nullType`) first in union types, OR
|
|
119
|
-
* 2. Provide an explicit `defaultValue` in options
|
|
145
|
+
* 2. Provide an explicit `defaultValue` in options, OR
|
|
146
|
+
* 3. Use `optional()` with `forceUndefinedDefault: true` for optional fields
|
|
120
147
|
* - The type definition itself (validation, type checking) works fine regardless of
|
|
121
148
|
* union ordering or defaultValue specification
|
|
122
149
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recursion.mjs","sources":["../../src/other-types/recursion.mts"],"sourcesContent":[null],"names":[],"mappings":";;;;;AAIA
|
|
1
|
+
{"version":3,"file":"recursion.mjs","sources":["../../src/other-types/recursion.mts"],"sourcesContent":[null],"names":[],"mappings":";;;;;AAIA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+IG;AACI,MAAM,SAAS,GAAG,CACvB,QAAgB,EAChB,UAAyB,EACzB,OAIC,KACU;AACX,IAAA,MAAM,eAAe,GAAG,eAAe,CACrC,MAAS,OAAO,EAAE,YAAY,IAAI,YAAY,EAAE,CAAC,YAAY,CAC9D;AAED,IAAA,MAAM,YAAY,GAAkB,eAAe,CAAC,UAAU,CAAC;AAE/D,IAAA,MAAM,QAAQ,GAAwB,CAAC,CAAC,KAAK,YAAY,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;AAEvE,IAAA,MAAM,EAAE,GAAG,UAAU,CAAI,QAAQ,CAAC;AAElC,IAAA,MAAM,IAAI,GAAoB,CAAC,CAAC,KAAK,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAE3D,OAAO;QACL,QAAQ;AACR,QAAA,IAAI,YAAY,GAAA;YACd,OAAO,eAAe,EAAE;QAC1B,CAAC;QACD,IAAI;QACJ,QAAQ;QACR,EAAE;AACF,QAAA,QAAQ,EAAE,cAAc,CAAC,QAAQ,CAAC;AAClC,QAAA,IAAI,EAAE,YAAY,CAAC,QAAQ,CAAC;KAC7B;AACH;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unknown.d.mts","sourceRoot":"","sources":["../../src/other-types/unknown.mts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,aAAa,CAAC;AAGxC,eAAO,MAAM,OAAO,GAAI,eAAe,OAAO,KAAG,IAAI,CAAC,OAAO,
|
|
1
|
+
{"version":3,"file":"unknown.d.mts","sourceRoot":"","sources":["../../src/other-types/unknown.mts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,aAAa,CAAC;AAGxC,eAAO,MAAM,OAAO,GAAI,eAAe,OAAO,KAAG,IAAI,CAAC,OAAO,CAWhD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unknown.mjs","sources":["../../src/other-types/unknown.mts"],"sourcesContent":[null],"names":[],"mappings":";;;;MAIa,OAAO,GAAG,CAAC,YAAsB,
|
|
1
|
+
{"version":3,"file":"unknown.mjs","sources":["../../src/other-types/unknown.mts"],"sourcesContent":[null],"names":[],"mappings":";;;;MAIa,OAAO,GAAG,CAAC,YAAsB,MAC3C;AACC,IAAA,QAAQ,EAAE,SAAS;AACnB,IAAA,IAAI,YAAY,GAAA;AACd,QAAA,OAAO,YAAY;IACrB,CAAC;IACD,EAAE;AACF,IAAA,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC;IACd,QAAQ;AACR,IAAA,QAAQ,EAAE,cAAc,CAAC,QAAQ,CAAC;AAClC,IAAA,IAAI,EAAE,YAAY,CAAC,QAAQ,CAAC;AAC7B,CAAA;AAEH,MAAM,QAAQ,GAA8B,MAAM,CAAC,EAAE;AAErD,MAAM,EAAE,GAAG,CAAC,EAAW,KAAoB,IAAI;;;;"}
|
|
@@ -1,6 +1,76 @@
|
|
|
1
1
|
import { type Type } from '../type.mjs';
|
|
2
2
|
export type OptionalPropertyType<T extends Type<unknown>> = T & PartiallyRequired<T, 'optional'>;
|
|
3
3
|
export type RequiredPropertyType<T extends Type<unknown>> = PartiallyOptional<T, 'optional'>;
|
|
4
|
-
|
|
4
|
+
/**
|
|
5
|
+
* Converts a Type to an optional property type.
|
|
6
|
+
*
|
|
7
|
+
* @template T - The Type to make optional
|
|
8
|
+
* @param t - The Type to make optional
|
|
9
|
+
* @param options - Optional configuration
|
|
10
|
+
* @param options.forceUndefinedDefault - If true, forces defaultValue to be undefined.
|
|
11
|
+
* Use this for recursive types to avoid infinite loops.
|
|
12
|
+
*
|
|
13
|
+
* @returns An OptionalPropertyType that can be used in record definitions
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* // Basic usage
|
|
17
|
+
* ```ts
|
|
18
|
+
* import * as t from 'ts-fortress';
|
|
19
|
+
*
|
|
20
|
+
* type EvenNumber = Readonly<{ type: 'even'; next?: OddNumber }>;
|
|
21
|
+
*
|
|
22
|
+
* type OddNumber = Readonly<{ type: 'odd'; next?: EvenNumber }>;
|
|
23
|
+
*
|
|
24
|
+
* // When using optional fields in mutually recursive types,
|
|
25
|
+
* // use forceUndefinedDefault to avoid infinite loops when accessing defaultValue
|
|
26
|
+
* const EvenNumber: t.Type<EvenNumber> = t.recursion('EvenNumber', () =>
|
|
27
|
+
* t.record({
|
|
28
|
+
* type: t.literal('even'),
|
|
29
|
+
* next: t.optional(OddNumber, { forceUndefinedDefault: true }),
|
|
30
|
+
* }),
|
|
31
|
+
* );
|
|
32
|
+
*
|
|
33
|
+
* const OddNumber: t.Type<OddNumber> = t.recursion('OddNumber', () =>
|
|
34
|
+
* t.record({
|
|
35
|
+
* type: t.literal('odd'),
|
|
36
|
+
* next: t.optional(EvenNumber, { forceUndefinedDefault: true }),
|
|
37
|
+
* }),
|
|
38
|
+
* );
|
|
39
|
+
* ```
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* // With recursive types - use forceUndefinedDefault to avoid infinite loops
|
|
43
|
+
* ```ts
|
|
44
|
+
* import * as t from 'ts-fortress';
|
|
45
|
+
*
|
|
46
|
+
* type EvenNumber = Readonly<{ type: 'even'; next?: OddNumber }>;
|
|
47
|
+
*
|
|
48
|
+
* type OddNumber = Readonly<{ type: 'odd'; next?: EvenNumber }>;
|
|
49
|
+
*
|
|
50
|
+
* // When using optional fields in mutually recursive types,
|
|
51
|
+
* // use forceUndefinedDefault to avoid infinite loops when accessing defaultValue
|
|
52
|
+
* const EvenNumber: t.Type<EvenNumber> = t.recursion('EvenNumber', () =>
|
|
53
|
+
* t.record({
|
|
54
|
+
* type: t.literal('even'),
|
|
55
|
+
* next: t.optional(OddNumber, { forceUndefinedDefault: true }),
|
|
56
|
+
* }),
|
|
57
|
+
* );
|
|
58
|
+
*
|
|
59
|
+
* const OddNumber: t.Type<OddNumber> = t.recursion('OddNumber', () =>
|
|
60
|
+
* t.record({
|
|
61
|
+
* type: t.literal('odd'),
|
|
62
|
+
* next: t.optional(EvenNumber, { forceUndefinedDefault: true }),
|
|
63
|
+
* }),
|
|
64
|
+
* );
|
|
65
|
+
* ```
|
|
66
|
+
*/
|
|
67
|
+
export declare const optional: <T extends Type<unknown>>(t: T, options?: Partial<Readonly<{
|
|
68
|
+
/**
|
|
69
|
+
* If true, forces defaultValue to be undefined.
|
|
70
|
+
* Use this for recursive types to avoid infinite loops.
|
|
71
|
+
* @default false
|
|
72
|
+
*/
|
|
73
|
+
forceUndefinedDefault: boolean;
|
|
74
|
+
}>>) => OptionalPropertyType<T>;
|
|
5
75
|
export declare const isOptionalProperty: <T extends Type<unknown>>(t: T) => t is OptionalPropertyType<T>;
|
|
6
76
|
//# sourceMappingURL=optional.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"optional.d.mts","sourceRoot":"","sources":["../../src/record/optional.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,aAAa,CAAC;AAExC,MAAM,MAAM,oBAAoB,CAAC,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAC3D,iBAAiB,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;AAEnC,MAAM,MAAM,oBAAoB,CAAC,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,IAAI,iBAAiB,CAC3E,CAAC,EACD,UAAU,CACX,CAAC;AAEF,eAAO,MAAM,QAAQ,GAAI,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,EAC9C,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"optional.d.mts","sourceRoot":"","sources":["../../src/record/optional.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,aAAa,CAAC;AAExC,MAAM,MAAM,oBAAoB,CAAC,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAC3D,iBAAiB,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;AAEnC,MAAM,MAAM,oBAAoB,CAAC,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,IAAI,iBAAiB,CAC3E,CAAC,EACD,UAAU,CACX,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8DG;AACH,eAAO,MAAM,QAAQ,GAAI,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,EAC9C,GAAG,CAAC,EACJ,UAAU,OAAO,CACf,QAAQ,CAAC;IACP;;;;OAIG;IACH,qBAAqB,EAAE,OAAO,CAAC;CAChC,CAAC,CACH,KACA,oBAAoB,CAAC,CAAC,CAkBoD,CAAC;AAE9E,eAAO,MAAM,kBAAkB,GAAI,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,EACxD,GAAG,CAAC,KACH,CAAC,IAAI,oBAAoB,CAAC,CAAC,CACuB,CAAC"}
|
package/dist/record/optional.mjs
CHANGED
|
@@ -1,5 +1,80 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Converts a Type to an optional property type.
|
|
3
|
+
*
|
|
4
|
+
* @template T - The Type to make optional
|
|
5
|
+
* @param t - The Type to make optional
|
|
6
|
+
* @param options - Optional configuration
|
|
7
|
+
* @param options.forceUndefinedDefault - If true, forces defaultValue to be undefined.
|
|
8
|
+
* Use this for recursive types to avoid infinite loops.
|
|
9
|
+
*
|
|
10
|
+
* @returns An OptionalPropertyType that can be used in record definitions
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* // Basic usage
|
|
14
|
+
* ```ts
|
|
15
|
+
* import * as t from 'ts-fortress';
|
|
16
|
+
*
|
|
17
|
+
* type EvenNumber = Readonly<{ type: 'even'; next?: OddNumber }>;
|
|
18
|
+
*
|
|
19
|
+
* type OddNumber = Readonly<{ type: 'odd'; next?: EvenNumber }>;
|
|
20
|
+
*
|
|
21
|
+
* // When using optional fields in mutually recursive types,
|
|
22
|
+
* // use forceUndefinedDefault to avoid infinite loops when accessing defaultValue
|
|
23
|
+
* const EvenNumber: t.Type<EvenNumber> = t.recursion('EvenNumber', () =>
|
|
24
|
+
* t.record({
|
|
25
|
+
* type: t.literal('even'),
|
|
26
|
+
* next: t.optional(OddNumber, { forceUndefinedDefault: true }),
|
|
27
|
+
* }),
|
|
28
|
+
* );
|
|
29
|
+
*
|
|
30
|
+
* const OddNumber: t.Type<OddNumber> = t.recursion('OddNumber', () =>
|
|
31
|
+
* t.record({
|
|
32
|
+
* type: t.literal('odd'),
|
|
33
|
+
* next: t.optional(EvenNumber, { forceUndefinedDefault: true }),
|
|
34
|
+
* }),
|
|
35
|
+
* );
|
|
36
|
+
* ```
|
|
37
|
+
*
|
|
38
|
+
* @example
|
|
39
|
+
* // With recursive types - use forceUndefinedDefault to avoid infinite loops
|
|
40
|
+
* ```ts
|
|
41
|
+
* import * as t from 'ts-fortress';
|
|
42
|
+
*
|
|
43
|
+
* type EvenNumber = Readonly<{ type: 'even'; next?: OddNumber }>;
|
|
44
|
+
*
|
|
45
|
+
* type OddNumber = Readonly<{ type: 'odd'; next?: EvenNumber }>;
|
|
46
|
+
*
|
|
47
|
+
* // When using optional fields in mutually recursive types,
|
|
48
|
+
* // use forceUndefinedDefault to avoid infinite loops when accessing defaultValue
|
|
49
|
+
* const EvenNumber: t.Type<EvenNumber> = t.recursion('EvenNumber', () =>
|
|
50
|
+
* t.record({
|
|
51
|
+
* type: t.literal('even'),
|
|
52
|
+
* next: t.optional(OddNumber, { forceUndefinedDefault: true }),
|
|
53
|
+
* }),
|
|
54
|
+
* );
|
|
55
|
+
*
|
|
56
|
+
* const OddNumber: t.Type<OddNumber> = t.recursion('OddNumber', () =>
|
|
57
|
+
* t.record({
|
|
58
|
+
* type: t.literal('odd'),
|
|
59
|
+
* next: t.optional(EvenNumber, { forceUndefinedDefault: true }),
|
|
60
|
+
* }),
|
|
61
|
+
* );
|
|
62
|
+
* ```
|
|
63
|
+
*/
|
|
64
|
+
const optional = (t, options) =>
|
|
65
|
+
// eslint-disable-next-line total-functions/no-unsafe-type-assertion
|
|
66
|
+
({
|
|
67
|
+
assertIs: t.assertIs,
|
|
68
|
+
is: t.is,
|
|
69
|
+
cast: t.cast,
|
|
70
|
+
fill: t.fill,
|
|
71
|
+
validate: t.validate,
|
|
72
|
+
typeName: t.typeName,
|
|
73
|
+
defaultValue: options?.forceUndefinedDefault === true
|
|
74
|
+
? // For recursive types: set defaultValue to undefined to avoid infinite loops
|
|
75
|
+
undefined
|
|
76
|
+
: // For normal types: preserve the original defaultValue
|
|
77
|
+
t.defaultValue,
|
|
3
78
|
optional: true,
|
|
4
79
|
});
|
|
5
80
|
const isOptionalProperty = (t) => Object.hasOwn(t, 'optional') && t.optional === true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"optional.mjs","sources":["../../src/record/optional.mts"],"sourcesContent":[null],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"optional.mjs","sources":["../../src/record/optional.mts"],"sourcesContent":[null],"names":[],"mappings":"AAUA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8DG;MACU,QAAQ,GAAG,CACtB,CAAI,EACJ,OASC;AAED;AACA,CAAC;IACC,QAAQ,EAAE,CAAC,CAAC,QAAQ;IACpB,EAAE,EAAE,CAAC,CAAC,EAAE;IACR,IAAI,EAAE,CAAC,CAAC,IAAI;IACZ,IAAI,EAAE,CAAC,CAAC,IAAI;IACZ,QAAQ,EAAE,CAAC,CAAC,QAAQ;IACpB,QAAQ,EAAE,CAAC,CAAC,QAAQ;AAEpB,IAAA,YAAY,EACV,OAAO,EAAE,qBAAqB,KAAK;AACjC;YACE;AACF;AACE,YAAA,CAAC,CAAC,YAAY;AAEpB,IAAA,QAAQ,EAAE,IAAI;AACf,CAAA;MAEU,kBAAkB,GAAG,CAChC,CAAI,KAEJ,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,QAAQ,KAAK;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"record.d.mts","sourceRoot":"","sources":["../../src/record/record.mts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,sBAAsB,EAC3B,KAAK,0BAA0B,EAC/B,KAAK,UAAU,EAEf,KAAK,IAAI,EACV,MAAM,aAAa,CAAC;AAUrB,eAAO,MAAM,MAAM,GACjB,KAAK,CAAC,CAAC,SAAS,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,EACrD,KAAK,CAAC,gBAAgB,SAAS,sBAAsB,GAAG,OAAO,EAE/D,OAAO,CAAC,EACR,UAAU,OAAO,CACf,QAAQ,CAAC;IACP,QAAQ,EAAE,MAAM,CAAC;IAEjB;;;;;;OAMG;IACH,wBAAwB,EAAE,gBAAgB,CAAC;IAE3C;;;;;OAKG;IACH,kBAAkB,EAAE,0BAA0B,CAAC;CAChD,CAAC,CACH,KACA,UAAU,CAAC,CAAC,EAAE,gBAAgB,
|
|
1
|
+
{"version":3,"file":"record.d.mts","sourceRoot":"","sources":["../../src/record/record.mts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,sBAAsB,EAC3B,KAAK,0BAA0B,EAC/B,KAAK,UAAU,EAEf,KAAK,IAAI,EACV,MAAM,aAAa,CAAC;AAUrB,eAAO,MAAM,MAAM,GACjB,KAAK,CAAC,CAAC,SAAS,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,EACrD,KAAK,CAAC,gBAAgB,SAAS,sBAAsB,GAAG,OAAO,EAE/D,OAAO,CAAC,EACR,UAAU,OAAO,CACf,QAAQ,CAAC;IACP,QAAQ,EAAE,MAAM,CAAC;IAEjB;;;;;;OAMG;IACH,wBAAwB,EAAE,gBAAgB,CAAC;IAE3C;;;;;OAKG;IACH,kBAAkB,EAAE,0BAA0B,CAAC;CAChD,CAAC,CACH,KACA,UAAU,CAAC,CAAC,EAAE,gBAAgB,CA8LhC,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,YAAY,GACvB,KAAK,CAAC,CAAC,SAAS,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,EAErD,QAAQ,CAAC,EACT,UAAU,OAAO,CACf,QAAQ,CAAC;IACP,QAAQ,EAAE,MAAM,CAAC;IACjB,kBAAkB,EAAE,OAAO,CAAC,sBAAsB,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC;CACxE,CAAC,CACH,KACA,UAAU,CAAC,CAAC,EAAE,OAAO,CAC2C,CAAC"}
|
package/dist/record/record.mjs
CHANGED
|
@@ -48,6 +48,10 @@ const record = (shape, options) => {
|
|
|
48
48
|
else {
|
|
49
49
|
// The case where the key exists in the object
|
|
50
50
|
const v = a[k];
|
|
51
|
+
// Skip validation for optional fields with undefined values
|
|
52
|
+
if (valueType.optional === true && v === undefined) {
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
51
55
|
const res = valueType.validate(v);
|
|
52
56
|
if (Result.isErr(res)) {
|
|
53
57
|
yield* prependPathToValidationErrors(res.value, k);
|
|
@@ -96,14 +100,34 @@ const record = (shape, options) => {
|
|
|
96
100
|
const excessEntries = Object.entries(a).filter(([key]) => !sourceKeys.has(key));
|
|
97
101
|
// eslint-disable-next-line total-functions/no-unsafe-type-assertion
|
|
98
102
|
return Object.fromEntries([
|
|
99
|
-
...Object.entries(shape).map(([k, v]) =>
|
|
103
|
+
...Object.entries(shape).map(([k, v]) => {
|
|
104
|
+
if (Object.hasOwn(a, k)) {
|
|
105
|
+
const value = a[k];
|
|
106
|
+
// For optional fields, if the value is undefined, keep it as undefined
|
|
107
|
+
if (v.optional === true && value === undefined) {
|
|
108
|
+
return tp(k, undefined);
|
|
109
|
+
}
|
|
110
|
+
return tp(k, v.fill(value));
|
|
111
|
+
}
|
|
112
|
+
return tp(k, v.defaultValue);
|
|
113
|
+
}),
|
|
100
114
|
...excessEntries,
|
|
101
115
|
]);
|
|
102
116
|
}
|
|
103
117
|
case 'strip': {
|
|
104
118
|
// For 'strip' or 'error' (treated as 'strip' for fill), return only defined keys
|
|
105
119
|
// eslint-disable-next-line total-functions/no-unsafe-type-assertion
|
|
106
|
-
return Object.fromEntries(Object.entries(shape).map(([k, v]) =>
|
|
120
|
+
return Object.fromEntries(Object.entries(shape).map(([k, v]) => {
|
|
121
|
+
if (Object.hasOwn(a, k)) {
|
|
122
|
+
const value = a[k];
|
|
123
|
+
// For optional fields, if the value is undefined, keep it as undefined
|
|
124
|
+
if (v.optional === true && value === undefined) {
|
|
125
|
+
return tp(k, undefined);
|
|
126
|
+
}
|
|
127
|
+
return tp(k, v.fill(value));
|
|
128
|
+
}
|
|
129
|
+
return tp(k, v.defaultValue);
|
|
130
|
+
}));
|
|
107
131
|
}
|
|
108
132
|
}
|
|
109
133
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"record.mjs","sources":["../../src/record/record.mts"],"sourcesContent":[null],"names":[],"mappings":";;;;;;MAiBa,MAAM,GAAG,CAIpB,KAAQ,EACR,OAqBC,KACkC;AAKnC,IAAA,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAE9C,IAAA,MAAM,cAAc,GAClB,OAAO,EAAE,QAAQ;AACjB,QAAA,CAAA,EAAA,EAAK,MAAM,CAAC,OAAO,CAAC,KAAK;AACtB,aAAA,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,GAAG,CAAC,CAAA,EAAA,EAAK,CAAC,CAAC,QAAQ,EAAE;AACrC,aAAA,IAAI,CAAC,IAAI,CAAC,CAAA,EAAA,CAAI;AAEnB,IAAA,MAAM,wBAAwB,GAAG,OAAO,EAAE,wBAAwB,IAAI,OAAO;AAE7E,IAAA,MAAM,kBAAkB,GAAG,OAAO,EAAE,kBAAkB,IAAI,OAAO;AAEjE,IAAA,MAAM,eAAe,GAAG,eAAe,CACrC;;AAEE,IAAA,MAAM,CAAC,WAAW,CAChB,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,KACrC,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,YAAY,CAAC,CAC5B,CACG,CACT;AAED,IAAA,MAAM,qBAAqB,GAAG,CAAC,GAAoC;;IAEjE,MAAM,CAAC,WAAW,CAChB,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CACtD;AAER,IAAA,MAAM,QAAQ,GAAwB,CAAC,CAAC,KAAI;AAC1C,QAAA,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE;YAChB,OAAO,MAAM,CAAC,GAAG,CAAC;AAChB,gBAAA,8BAA8B,CAAC;AAC7B,oBAAA,WAAW,EAAE,CAAC;AACd,oBAAA,YAAY,EAAE,QAAQ;AACtB,oBAAA,QAAQ,EAAE,cAAc;AACxB,oBAAA,OAAO,EAAE,SAAS;iBACnB,CAAC;AACH,aAAA,CAAC;QACJ;AAEA,QAAA,MAAM,aAAa,GAA+B,GAAG,CAAC,QAAQ,CAC5D,aAAS;AACP,YAAA,KAAK,MAAM,CAAC,CAAC,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;gBAClD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;oBACxB,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,QAAQ,KAAK,IAAI,EAAE;wBAC/B,MAAM;4BACJ,IAAI,EAAE,CAAC,CAAC,CAAC;AACT,4BAAA,WAAW,EAAE,CAAC;AACd,4BAAA,QAAQ,EAAE,cAAc;AACxB,4BAAA,YAAY,EAAE,cAAc;AAC5B,4BAAA,OAAO,EAAE;AACP,gCAAA,IAAI,EAAE,aAAa;AACnB,gCAAA,GAAG,EAAE,CAAC;AACP,6BAAA;yBACwB;oBAC7B;gBACF;qBAAO;;AAEL,oBAAA,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"record.mjs","sources":["../../src/record/record.mts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-assert-fn.mjs","sources":["../../src/utils/create-assert-fn.mts"],"sourcesContent":[null],"names":[],"mappings":";;;AAOA,MAAM,wBAAwB,GAAG,CAAC,MAAkC,KAClE,CAAA,EAAA,EAAK,0BAA0B,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"create-assert-fn.mjs","sources":["../../src/utils/create-assert-fn.mts"],"sourcesContent":[null],"names":[],"mappings":";;;AAOA,MAAM,wBAAwB,GAAG,CAAC,MAAkC,KAClE,CAAA,EAAA,EAAK,0BAA0B,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAW;AAEzD,MAAM,cAAc,GACzB,CAAK,QAA6B,KAClC,CAAC,CAAU,KAAoB;AAC7B,IAAA,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC;AAEvB,IAAA,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;QACrB,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACtD;AACF;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation-error.d.mts","sourceRoot":"","sources":["../../src/utils/validation-error.mts"],"names":[],"mappings":"AAEA,MAAM,MAAM,sBAAsB,GAAG,QAAQ,CACzC;IACE,IAAI,EAAE,QAAQ,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB,GACD;IACE,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,OAAO,EAAE,CAAC;CAC5B,GACD;IACE,IAAI,EAAE,eAAe,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;CACtB,GACD;IACE,IAAI,EAAE,cAAc,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;CACtB,GACD;IACE,IAAI,EAAE,cAAc,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;CACtB,GACD;IACE,IAAI,EAAE,kBAAkB,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACtB,GACD;IACE,IAAI,EAAE,iBAAiB,CAAC;CACzB,GACD;IACE,IAAI,EAAE,aAAa,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;CACb,GACD;IACE,IAAI,EAAE,YAAY,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;CACb,GACD;IACE,IAAI,EAAE,cAAc,CAAC;IACrB,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;CAC9B,GACD;IACE,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;CAC9B,GACD;IACE,IAAI,EAAE,cAAc,CAAC;IACrB,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;CACtB,GACD;IACE,IAAI,EAAE,WAAW,CAAC;IAClB,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;CACtB,GACD;IACE,IAAI,EAAE,aAAa,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB,GACD;IACE,IAAI,EAAE,OAAO,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACrB,CACJ,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,QAAQ,CAAC;IACrC,iFAAiF;IACjF,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACxB,8CAA8C;IAC9C,WAAW,EAAE,OAAO,CAAC;IACrB,sCAAsC;IACtC,YAAY,EAAE,MAAM,CAAC;IACrB,oDAAoD;IACpD,QAAQ,EAAE,MAAM,CAAC;IACjB,8EAA8E;IAC9E,OAAO,CAAC,EAAE,sBAAsB,GAAG,SAAS,CAAC;CAC9C,CAAC,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,wBAAwB,GACnC,OAAO,eAAe,EACtB,8BAA6B,MAAW,KACvC,
|
|
1
|
+
{"version":3,"file":"validation-error.d.mts","sourceRoot":"","sources":["../../src/utils/validation-error.mts"],"names":[],"mappings":"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"}
|
|
@@ -4,7 +4,9 @@ import { isString, pipe, unknownToString, match } from 'ts-data-forge';
|
|
|
4
4
|
* Converts a validation error to a human-readable string message
|
|
5
5
|
*/
|
|
6
6
|
const validationErrorToMessage = (error, maxLengthToPrintActualValue = 20) => {
|
|
7
|
-
const pathPrefix = error.path.length > 0
|
|
7
|
+
const pathPrefix = error.path.length > 0
|
|
8
|
+
? `Error at ${error.path.join('.')}: `
|
|
9
|
+
: 'Error: ';
|
|
8
10
|
const detailsMessage = createDetailsMessage(error, maxLengthToPrintActualValue);
|
|
9
11
|
if (detailsMessage !== undefined) {
|
|
10
12
|
return `${pathPrefix}${detailsMessage}`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation-error.mjs","sources":["../../src/utils/validation-error.mts"],"sourcesContent":[null],"names":[],"mappings":";;AAsFA;;AAEG;AACI,MAAM,wBAAwB,GAAG,CACtC,KAAsB,EACtB,2BAAA,GAAsC,EAAE,KAC9B;IACV,MAAM,UAAU,GACd,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,
|
|
1
|
+
{"version":3,"file":"validation-error.mjs","sources":["../../src/utils/validation-error.mts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ts-fortress",
|
|
3
|
-
"version": "6.
|
|
3
|
+
"version": "6.3.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"keywords": [
|
|
6
6
|
"typescript"
|
|
@@ -34,8 +34,12 @@
|
|
|
34
34
|
"build:min": "tsx ./scripts/cmd/build.mts --skip-check",
|
|
35
35
|
"check:ext": "tsx ./scripts/cmd/check-ext.mts",
|
|
36
36
|
"check-all": "tsx ./scripts/cmd/check-all.mts",
|
|
37
|
-
"codemod": "run-s codemod:
|
|
38
|
-
"codemod:
|
|
37
|
+
"codemod": "run-s codemod:uncommitted:as-const fmt codemod:uncommitted:readonly fmt",
|
|
38
|
+
"codemod:full": "run-s codemod:full:as-const fmt codemod:full:readonly fmt",
|
|
39
|
+
"codemod:full:as-const": "append-as-const '{src,scripts,samples,test}/**/*.{mts,tsx}'",
|
|
40
|
+
"codemod:full:readonly": "convert-to-readonly '{src,scripts,samples,test}/**/*.{mts,tsx}'",
|
|
41
|
+
"codemod:uncommitted:as-const": "append-as-const --uncommitted '{src,scripts,samples,test}/**/*.{mts,tsx}'",
|
|
42
|
+
"codemod:uncommitted:readonly": "convert-to-readonly --uncommitted '{src,scripts,samples,test}/**/*.{mts,tsx}'",
|
|
39
43
|
"cspell": "cspell \"**\" --gitignore --gitignore-root ./ --no-progress",
|
|
40
44
|
"doc": "tsx ./scripts/cmd/gen-docs.mts",
|
|
41
45
|
"doc:embed": "tsx ./scripts/cmd/embed-examples.mts",
|
|
@@ -83,7 +87,7 @@
|
|
|
83
87
|
"@semantic-release/commit-analyzer": "13.0.1",
|
|
84
88
|
"@semantic-release/exec": "7.1.0",
|
|
85
89
|
"@semantic-release/git": "10.0.1",
|
|
86
|
-
"@semantic-release/github": "12.0.
|
|
90
|
+
"@semantic-release/github": "12.0.3",
|
|
87
91
|
"@semantic-release/npm": "13.1.3",
|
|
88
92
|
"@semantic-release/release-notes-generator": "14.1.0",
|
|
89
93
|
"@types/node": "25.2.0",
|
|
@@ -91,7 +95,7 @@
|
|
|
91
95
|
"@vitest/coverage-v8": "4.0.18",
|
|
92
96
|
"@vitest/ui": "4.0.18",
|
|
93
97
|
"conventional-changelog-conventionalcommits": "9.1.0",
|
|
94
|
-
"cspell": "9.6.
|
|
98
|
+
"cspell": "9.6.3",
|
|
95
99
|
"eslint": "9.39.2",
|
|
96
100
|
"eslint-config-typed": "4.6.1",
|
|
97
101
|
"fast-glob": "3.3.3",
|
|
@@ -102,13 +106,13 @@
|
|
|
102
106
|
"markdownlint": "0.40.0",
|
|
103
107
|
"markdownlint-cli2": "0.20.0",
|
|
104
108
|
"npm-run-all2": "8.0.4",
|
|
105
|
-
"playwright": "1.58.
|
|
109
|
+
"playwright": "1.58.1",
|
|
106
110
|
"prettier": "3.8.1",
|
|
107
111
|
"prettier-plugin-organize-imports": "4.3.0",
|
|
108
112
|
"prettier-plugin-packagejson": "3.0.0",
|
|
109
|
-
"rollup": "4.57.
|
|
110
|
-
"semantic-release": "25.0.
|
|
111
|
-
"ts-codemod-lib": "^
|
|
113
|
+
"rollup": "4.57.1",
|
|
114
|
+
"semantic-release": "25.0.3",
|
|
115
|
+
"ts-codemod-lib": "^2.0.3",
|
|
112
116
|
"ts-repo-utils": "8.1.0",
|
|
113
117
|
"tslib": "2.8.1",
|
|
114
118
|
"tsx": "4.21.0",
|
|
@@ -47,7 +47,7 @@ describe(arrayAtLeastLength, () => {
|
|
|
47
47
|
|
|
48
48
|
describe('is', () => {
|
|
49
49
|
test('truthy case', () => {
|
|
50
|
-
const ys: unknown = [4, 5, 6, 7];
|
|
50
|
+
const ys: unknown = [4, 5, 6, 7] as const;
|
|
51
51
|
|
|
52
52
|
if (xs.is(ys)) {
|
|
53
53
|
expectType<typeof ys, Xs>('=');
|
|
@@ -59,7 +59,7 @@ describe(arrayAtLeastLength, () => {
|
|
|
59
59
|
});
|
|
60
60
|
|
|
61
61
|
test('falsy case 1', () => {
|
|
62
|
-
const ys: unknown = [1, 2];
|
|
62
|
+
const ys: unknown = [1, 2] as const;
|
|
63
63
|
|
|
64
64
|
if (xs.is(ys)) {
|
|
65
65
|
expectType<typeof ys, Xs>('=');
|
|
@@ -71,7 +71,7 @@ describe(arrayAtLeastLength, () => {
|
|
|
71
71
|
});
|
|
72
72
|
|
|
73
73
|
test('falsy case 2', () => {
|
|
74
|
-
const ys: unknown = [1, '2', 3];
|
|
74
|
+
const ys: unknown = [1, '2', 3] as const;
|
|
75
75
|
|
|
76
76
|
if (xs.is(ys)) {
|
|
77
77
|
expectType<typeof ys, Xs>('=');
|
|
@@ -97,7 +97,7 @@ describe(arrayAtLeastLength, () => {
|
|
|
97
97
|
|
|
98
98
|
describe('validate', () => {
|
|
99
99
|
test('truthy case', () => {
|
|
100
|
-
const ys: unknown = [4, 5, 6, 7];
|
|
100
|
+
const ys: unknown = [4, 5, 6, 7] as const;
|
|
101
101
|
|
|
102
102
|
const result = xs.validate(ys);
|
|
103
103
|
|
|
@@ -111,7 +111,7 @@ describe(arrayAtLeastLength, () => {
|
|
|
111
111
|
});
|
|
112
112
|
|
|
113
113
|
test('validate returns input as-is for OK cases', () => {
|
|
114
|
-
const input = [4, 5, 6];
|
|
114
|
+
const input = [4, 5, 6] as const;
|
|
115
115
|
|
|
116
116
|
const result = xs.validate(input);
|
|
117
117
|
|
|
@@ -147,7 +147,7 @@ describe(arrayAtLeastLength, () => {
|
|
|
147
147
|
});
|
|
148
148
|
|
|
149
149
|
test('falsy case 2', () => {
|
|
150
|
-
const ys: unknown = [1, 2];
|
|
150
|
+
const ys: unknown = [1, 2] as const;
|
|
151
151
|
|
|
152
152
|
const result = xs.validate(ys);
|
|
153
153
|
|
|
@@ -175,7 +175,7 @@ describe(arrayAtLeastLength, () => {
|
|
|
175
175
|
});
|
|
176
176
|
|
|
177
177
|
test('falsy case 3', () => {
|
|
178
|
-
const ys: unknown = [1, '2', 3];
|
|
178
|
+
const ys: unknown = [1, '2', 3] as const;
|
|
179
179
|
|
|
180
180
|
const result = xs.validate(ys);
|
|
181
181
|
|
|
@@ -201,13 +201,13 @@ describe(arrayAtLeastLength, () => {
|
|
|
201
201
|
|
|
202
202
|
describe('fill', () => {
|
|
203
203
|
test('keeps numeric entries and trims extras', () => {
|
|
204
|
-
const ys: unknown = [4, 5, 6, 7];
|
|
204
|
+
const ys: unknown = [4, 5, 6, 7] as const;
|
|
205
205
|
|
|
206
206
|
assert.deepStrictEqual(xs.fill(ys), [4, 5, 6]);
|
|
207
207
|
});
|
|
208
208
|
|
|
209
209
|
test('fills missing or invalid entries', () => {
|
|
210
|
-
const ys: unknown = [4, '5'];
|
|
210
|
+
const ys: unknown = [4, '5'] as const;
|
|
211
211
|
|
|
212
212
|
assert.deepStrictEqual(xs.fill(ys), [4, 0, 0]);
|
|
213
213
|
});
|