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.
Files changed (55) hide show
  1. package/README.md +6 -6
  2. package/dist/other-types/recursion.d.mts +28 -1
  3. package/dist/other-types/recursion.d.mts.map +1 -1
  4. package/dist/other-types/recursion.mjs +28 -1
  5. package/dist/other-types/recursion.mjs.map +1 -1
  6. package/dist/other-types/unknown.d.mts.map +1 -1
  7. package/dist/other-types/unknown.mjs.map +1 -1
  8. package/dist/record/optional.d.mts +71 -1
  9. package/dist/record/optional.d.mts.map +1 -1
  10. package/dist/record/optional.mjs +77 -2
  11. package/dist/record/optional.mjs.map +1 -1
  12. package/dist/record/record.d.mts.map +1 -1
  13. package/dist/record/record.mjs +26 -2
  14. package/dist/record/record.mjs.map +1 -1
  15. package/dist/utils/create-assert-fn.mjs.map +1 -1
  16. package/dist/utils/validation-error.d.mts.map +1 -1
  17. package/dist/utils/validation-error.mjs +3 -1
  18. package/dist/utils/validation-error.mjs.map +1 -1
  19. package/package.json +13 -9
  20. package/src/array/array-at-least-length.test.mts +9 -9
  21. package/src/array/array-of-length.test.mts +10 -10
  22. package/src/array/array.test.mts +7 -7
  23. package/src/array/non-empty-array.test.mts +10 -10
  24. package/src/array/tuple.test.mts +10 -10
  25. package/src/compose/intersection.test.mts +7 -7
  26. package/src/compose/merge-records.test.mts +6 -6
  27. package/src/compose/union-literal-array.test.mts +3 -3
  28. package/src/compose/union-mixed.test.mts +5 -5
  29. package/src/compose/union-nested-array.test.mts +7 -7
  30. package/src/compose/union-nested-record.test.mts +6 -6
  31. package/src/compose/union-primitive-array.test.mts +6 -6
  32. package/src/compose/union-record-array.test.mts +7 -7
  33. package/src/compose/union-record-primitive.test.mts +4 -4
  34. package/src/compose/union-records.test.mts +6 -6
  35. package/src/compose/union.test.mts +3 -3
  36. package/src/other-types/recursion.mts +28 -1
  37. package/src/other-types/recursion.test.mts +519 -7
  38. package/src/other-types/set.test.mts +2 -2
  39. package/src/other-types/unknown.mts +12 -11
  40. package/src/record/key-value-record.test.mts +8 -8
  41. package/src/record/omit.test.mts +12 -12
  42. package/src/record/optional.mts +92 -4
  43. package/src/record/optional.test.mts +3 -1
  44. package/src/record/partial.test.mts +27 -27
  45. package/src/record/pick.test.mts +13 -13
  46. package/src/record/record-allow-excess-properties.test.mts +10 -10
  47. package/src/record/record-strict-composition-simple.test.mts +35 -12
  48. package/src/record/record-strict-composition.test.mts +45 -25
  49. package/src/record/record.mts +34 -7
  50. package/src/record/record.test.mts +22 -22
  51. package/src/record/required.test.mts +31 -31
  52. package/src/record/strict-record.test.mts +24 -12
  53. package/src/utils/create-assert-fn.mts +1 -1
  54. package/src/utils/validation-error.mts +13 -10
  55. 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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoHG;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"}
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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoHG;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
+ {"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,CAU3D,CAAC"}
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,MAAqB;AACjE,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;AAED,MAAM,QAAQ,GAA8B,MAAM,CAAC,EAAE;AAErD,MAAM,EAAE,GAAG,CAAC,EAAW,KAAoB,IAAI;;;;"}
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
- export declare const optional: <T extends Type<unknown>>(t: T) => OptionalPropertyType<T>;
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,KACH,oBAAoB,CAAC,CAAC,CAGvB,CAAC;AAEH,eAAO,MAAM,kBAAkB,GAAI,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,EACxD,GAAG,CAAC,KACH,CAAC,IAAI,oBAAoB,CAAC,CAAC,CACuB,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"}
@@ -1,5 +1,80 @@
1
- const optional = (t) => ({
2
- ...t,
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":"MAUa,QAAQ,GAAG,CACtB,CAAI,MACyB;AAC7B,IAAA,GAAG,CAAC;AACJ,IAAA,QAAQ,EAAE,IAAI;AACf,CAAA;MAEY,kBAAkB,GAAG,CAChC,CAAI,KAEJ,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,QAAQ,KAAK;;;;"}
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,CAmKhC,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"}
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"}
@@ -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]) => tp(k, Object.hasOwn(a, k) ? v.fill(a[k]) : v.defaultValue)),
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]) => tp(k, Object.hasOwn(a, k) ? v.fill(a[k]) : v.defaultValue)));
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":"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"}
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,EAAE;AAEhD,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
+ {"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":"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"}
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 ? `Error at ${error.path.join('.')}: ` : 'Error: ';
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,CAAC,GAAG,CAAA,SAAA,EAAY,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA,EAAA,CAAI,GAAG,SAAS;IAE1E,MAAM,cAAc,GAAG,oBAAoB,CACzC,KAAK,EACL,2BAA2B,CAC5B;AAED,IAAA,IAAI,cAAc,KAAK,SAAS,EAAE;AAChC,QAAA,OAAO,CAAA,EAAG,UAAU,CAAA,EAAG,cAAc,EAAE;IACzC;AAEA,IAAA,MAAM,aAAa,GAAG,OAAO,KAAK,CAAC,WAAW;AAE9C,IAAA,MAAM,cAAc,GAAW,QAAQ,CAAC,KAAK,CAAC,WAAW;AACvD,UAAE,KAAK,CAAC,WAAW,CAAC,MAAM,IAAI;AAC5B,cAAE,CAAA,EAAA,EAAK,KAAK,CAAC,WAAW,CAAA,CAAA;AACxB,cAAE;AACJ,UAAE,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAC7C,CAAC,CAAC,MAAM,IAAI,2BAA2B,GAAG,CAAA,GAAA,EAAM,CAAC,CAAA,EAAA,CAAI,GAAG,EAAE,CAC3D,CAAC,KAAK;IAEX,OAAO,CAAA,EAAG,UAAU,CAAA,UAAA,EAAa,KAAK,CAAC,YAAY,CAAA,YAAA,EAAe,aAAa,CAAA,YAAA,EAAe,cAAc,CAAA,YAAA,CAAc;AAC5H;AAEA,MAAM,oBAAoB,GAAG,CAC3B,KAAsB,EACtB,2BAAmC,KACb;AACtB,IAAA,MAAM,aAAa,GAAG,OAAO,KAAK,CAAC,WAAW;AAE9C,IAAA,MAAM,cAAc,GAAW,QAAQ,CAAC,KAAK,CAAC,WAAW;AACvD,UAAE,KAAK,CAAC,WAAW,CAAC,MAAM,IAAI;AAC5B,cAAE,CAAA,EAAA,EAAK,KAAK,CAAC,WAAW,CAAA,CAAA;AACxB,cAAE;AACJ,UAAE,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAC7C,CAAC,CAAC,MAAM,IAAI,2BAA2B,GAAG,CAAA,GAAA,EAAM,CAAC,CAAA,EAAA,CAAI,GAAG,EAAE,CAC3D,CAAC,KAAK;AAEX,IAAA,QAAQ,KAAK,CAAC,OAAO,EAAE,IAAI;AACzB,QAAA,KAAK,SAAS;AACZ,YAAA,OAAO,SAAS;AAElB,QAAA,KAAK,QAAQ;AACX,YAAA,OAAO,KAAK,CAAC,OAAO,CAAC,OAAO;AAE9B,QAAA,KAAK,eAAe;AAClB,YAAA,OAAO,+BAA+B,KAAK,CAAC,OAAO,CAAC,KAAK,CAAA,KAAA,EAAQ,KAAK,CAAC,OAAO,CAAC,YAAY,GAAG,CAAC,CAAA,IAAA,EAAO,cAAc,cAAc;AAEpI,QAAA,KAAK,cAAc;AACjB,YAAA,OAAO,CAAA,yBAAA,EAA4B,KAAK,CAAC,OAAO,CAAC,cAAc,CAAA,YAAA,EAAe,KAAK,CAAC,OAAO,CAAC,YAAY,cAAc;AAExH,QAAA,KAAK,cAAc;AACjB,YAAA,OAAO,CAAA,yBAAA,EAA4B,KAAK,CAAC,OAAO,CAAC,cAAc,CAAA,YAAA,EAAe,KAAK,CAAC,OAAO,CAAC,YAAY,cAAc;AAExH,QAAA,KAAK,kBAAkB;AACrB,YAAA,OAAO,CAAA,yBAAA,EAA4B,KAAK,CAAC,OAAO,CAAC,SAAS,CAAA,oBAAA,EAAuB,KAAK,CAAC,OAAO,CAAC,YAAY,cAAc;AAE3H,QAAA,KAAK,iBAAiB;AACpB,YAAA,OAAO,sDAAsD;AAE/D,QAAA,KAAK,aAAa;AAChB,YAAA,OAAO,yBAAyB,KAAK,CAAC,OAAO,CAAC,GAAG,IAAI;AAEvD,QAAA,KAAK,YAAY;AACf,YAAA,OAAO,oBAAoB,KAAK,CAAC,OAAO,CAAC,GAAG,mBAAmB;AAEjE,QAAA,KAAK,cAAc;AACjB,YAAA,OAAO,yCAAyC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA,OAAA,EAAU,aAAa,CAAA,YAAA,EAAe,cAAc,cAAc;AAExJ,QAAA,KAAK,MAAM;AACT,YAAA,OAAO,CAAA,kBAAA,EAAqB,KAAK,CAAC,OAAO,CAAC;iBACvC,GAAG,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,CAAC;AAC5B,iBAAA,IAAI,CAAC,IAAI,CAAC,CAAA,MAAA,EAAS,cAAc,cAAc;AAEpD,QAAA,KAAK,OAAO;AACV,YAAA,OAAO,oBAAoB,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA,OAAA,EAAU,aAAa,CAAA,YAAA,EAAe,cAAc,cAAc;AAEnI,QAAA,KAAK,cAAc;AACjB,YAAA,OAAO,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE;gBAChC,GAAG,EAAE,CAAA,gCAAA,EAAmC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAA,OAAA,EAAU,aAAa,CAAA,YAAA,EAAe,cAAc,CAAA,YAAA,CAAc;gBACpI,KAAK,EAAE,CAAA,kCAAA,EAAqC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAA,OAAA,EAAU,aAAa,CAAA,YAAA,EAAe,cAAc,CAAA,YAAA,CAAc;AACzI,aAAA,CAAC;AAEJ,QAAA,KAAK,WAAW;AACd,YAAA,OAAO,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE;gBAChC,GAAG,EAAE,CAAA,6BAAA,EAAgC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAA,OAAA,EAAU,aAAa,CAAA,YAAA,EAAe,cAAc,CAAA,YAAA,CAAc;gBACjI,KAAK,EAAE,CAAA,+BAAA,EAAkC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAA,OAAA,EAAU,aAAa,CAAA,YAAA,EAAe,cAAc,CAAA,YAAA,CAAc;AACtI,aAAA,CAAC;AAEJ,QAAA,KAAK,aAAa;YAChB,OAAO,CAAA,iCAAA,EAAoC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAA,OAAA,EAAU,aAAa,CAAA,YAAA,EAAe,cAAc,CAAA,YAAA,CAAc;AAEzI,QAAA,KAAK,OAAO;AACV,YAAA,OAAO,yCAAyC,KAAK,CAAC,OAAO,CAAC,WAAW,GAAG;;AAElF,CAAC;AAED;;;AAGG;AACI,MAAM,0BAA0B,GAAG,CACxC,MAAkC,EAClC,2BAAA,GAAsC,EAAE,KAExC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,wBAAwB,CAAC,CAAC,EAAE,2BAA2B,CAAC;AAE5E;;AAEG;MACU,6BAA6B,GAAG,CAC3C,MAAkC,EAClC,WAAmB,KAEnB,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,MAAM;AACrB,IAAA,GAAG,KAAK;IACR,IAAI,EAAE,CAAC,WAAW,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC;AACnC,CAAA,CAAC;AAEJ;;AAEG;MACU,8BAA8B,GAAG,CAC5C,MAAkC,EAClC,KAAa,KAEb,6BAA6B,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,EAAE;AAExD;;AAEG;AACI,MAAM,8BAA8B,GAAG,CAAC,EAC7C,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,OAAO,GAMP,MAAuB;AACvB,IAAA,IAAI,EAAE,EAAE;IACR,WAAW;IACX,YAAY;IACZ,QAAQ;IACR,OAAO;AACR,CAAA;;;;"}
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.2.5",
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:all fmt",
38
- "codemod:all": "convert-to-readonly '{src,scripts,samples,test}/**/*.{mts,tsx}'",
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.2",
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.2",
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.0",
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.0",
110
- "semantic-release": "25.0.2",
111
- "ts-codemod-lib": "^1.3.1",
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
  });