@strictly/define 0.0.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.
Files changed (162) hide show
  1. package/.eslintrc.cjs +31 -0
  2. package/.out/index.d.ts +20 -0
  3. package/.out/index.js +20 -0
  4. package/.out/transformers/copies/copy.d.ts +4 -0
  5. package/.out/transformers/copies/copy.js +7 -0
  6. package/.out/transformers/copies/copy_to.d.ts +6 -0
  7. package/.out/transformers/copies/copy_to.js +91 -0
  8. package/.out/transformers/copies/mobx_copy.d.ts +5 -0
  9. package/.out/transformers/copies/mobx_copy.js +42 -0
  10. package/.out/transformers/copies/specs/copy_to.tests.d.ts +1 -0
  11. package/.out/transformers/copies/specs/copy_to.tests.js +97 -0
  12. package/.out/transformers/copies/specs/mobx_copy.tests.d.ts +1 -0
  13. package/.out/transformers/copies/specs/mobx_copy.tests.js +19 -0
  14. package/.out/transformers/flatteners/flatten_accessors_of.d.ts +5 -0
  15. package/.out/transformers/flatteners/flatten_accessors_of.js +11 -0
  16. package/.out/transformers/flatteners/flatten_json_value_to_type_paths_of.d.ts +3 -0
  17. package/.out/transformers/flatteners/flatten_json_value_to_type_paths_of.js +10 -0
  18. package/.out/transformers/flatteners/flatten_type_def_to.d.ts +4 -0
  19. package/.out/transformers/flatteners/flatten_type_def_to.js +49 -0
  20. package/.out/transformers/flatteners/flatten_type_defs_of.d.ts +3 -0
  21. package/.out/transformers/flatteners/flatten_type_defs_of.js +7 -0
  22. package/.out/transformers/flatteners/flatten_value_type_to.d.ts +11 -0
  23. package/.out/transformers/flatteners/flatten_value_type_to.js +79 -0
  24. package/.out/transformers/flatteners/flatten_value_types_of.d.ts +3 -0
  25. package/.out/transformers/flatteners/flatten_value_types_of.js +7 -0
  26. package/.out/transformers/flatteners/json_path.d.ts +2 -0
  27. package/.out/transformers/flatteners/json_path.js +14 -0
  28. package/.out/transformers/flatteners/specs/flatten_accessors_of.tests.d.ts +1 -0
  29. package/.out/transformers/flatteners/specs/flatten_accessors_of.tests.js +90 -0
  30. package/.out/transformers/flatteners/specs/flatten_json_value_to_type_paths_of.tests.d.ts +1 -0
  31. package/.out/transformers/flatteners/specs/flatten_json_value_to_type_paths_of.tests.js +94 -0
  32. package/.out/transformers/flatteners/specs/flatten_type_def_to.tests.d.ts +1 -0
  33. package/.out/transformers/flatteners/specs/flatten_type_def_to.tests.js +110 -0
  34. package/.out/transformers/flatteners/specs/flatten_type_defs_of.tests.d.ts +1 -0
  35. package/.out/transformers/flatteners/specs/flatten_type_defs_of.tests.js +17 -0
  36. package/.out/transformers/flatteners/specs/flatten_value_type_to.tests.d.ts +1 -0
  37. package/.out/transformers/flatteners/specs/flatten_value_type_to.tests.js +297 -0
  38. package/.out/transformers/flatteners/specs/flatten_value_types_of.tests.d.ts +1 -0
  39. package/.out/transformers/flatteners/specs/flatten_value_types_of.tests.js +37 -0
  40. package/.out/transformers/flatteners/specs/value_path_to_type_path.tests.d.ts +1 -0
  41. package/.out/transformers/flatteners/specs/value_path_to_type_path.tests.js +167 -0
  42. package/.out/transformers/flatteners/value_path_to_type_path.d.ts +2 -0
  43. package/.out/transformers/flatteners/value_path_to_type_path.js +96 -0
  44. package/.out/tsconfig.json +15 -0
  45. package/.out/tsconfig.tsbuildinfo +1 -0
  46. package/.out/tsup.config.d.ts +3 -0
  47. package/.out/tsup.config.js +12 -0
  48. package/.out/types/builders.d.ts +62 -0
  49. package/.out/types/builders.js +148 -0
  50. package/.out/types/definitions.d.ts +41 -0
  51. package/.out/types/definitions.js +26 -0
  52. package/.out/types/flattened.d.ts +2 -0
  53. package/.out/types/flattened.js +1 -0
  54. package/.out/types/flattened_accessors_of.d.ts +9 -0
  55. package/.out/types/flattened_accessors_of.js +1 -0
  56. package/.out/types/flattened_type_defs_of.d.ts +21 -0
  57. package/.out/types/flattened_type_defs_of.js +1 -0
  58. package/.out/types/flattened_value_types_of.d.ts +6 -0
  59. package/.out/types/flattened_value_types_of.js +1 -0
  60. package/.out/types/json_path_of.d.ts +1 -0
  61. package/.out/types/json_path_of.js +1 -0
  62. package/.out/types/json_paths_of.d.ts +16 -0
  63. package/.out/types/json_paths_of.js +1 -0
  64. package/.out/types/mobx_value_type_of.d.ts +11 -0
  65. package/.out/types/mobx_value_type_of.js +2 -0
  66. package/.out/types/partial_type_def_of.d.ts +40 -0
  67. package/.out/types/partial_type_def_of.js +1 -0
  68. package/.out/types/readonly_type_def_of.d.ts +29 -0
  69. package/.out/types/readonly_type_def_of.js +1 -0
  70. package/.out/types/specs/builder.tests.d.ts +1 -0
  71. package/.out/types/specs/builder.tests.js +93 -0
  72. package/.out/types/specs/flattened_accessors_of.tests.d.ts +1 -0
  73. package/.out/types/specs/flattened_accessors_of.tests.js +11 -0
  74. package/.out/types/specs/flattened_type_defs_of.tests.d.ts +1 -0
  75. package/.out/types/specs/flattened_type_defs_of.tests.js +71 -0
  76. package/.out/types/specs/flattened_value_types_of.tests.d.ts +1 -0
  77. package/.out/types/specs/flattened_value_types_of.tests.js +11 -0
  78. package/.out/types/specs/json_paths_of.tests.d.ts +1 -0
  79. package/.out/types/specs/json_paths_of.tests.js +199 -0
  80. package/.out/types/specs/partial_type_def_of.tests.d.ts +1 -0
  81. package/.out/types/specs/partial_type_def_of.tests.js +50 -0
  82. package/.out/types/specs/readonly_type_def_of.tests.d.ts +1 -0
  83. package/.out/types/specs/readonly_type_def_of.tests.js +55 -0
  84. package/.out/types/specs/strict_definitions.tests.d.ts +1 -0
  85. package/.out/types/specs/strict_definitions.tests.js +42 -0
  86. package/.out/types/specs/value_to_type_paths_of.tests.d.ts +1 -0
  87. package/.out/types/specs/value_to_type_paths_of.tests.js +90 -0
  88. package/.out/types/specs/value_type_of.tests.d.ts +1 -0
  89. package/.out/types/specs/value_type_of.tests.js +91 -0
  90. package/.out/types/specs/value_types_of_discriminated_union.tests.d.ts +1 -0
  91. package/.out/types/specs/value_types_of_discriminated_union.tests.js +9 -0
  92. package/.out/types/strict_definitions.d.ts +44 -0
  93. package/.out/types/strict_definitions.js +1 -0
  94. package/.out/types/value_to_type_paths_of.d.ts +22 -0
  95. package/.out/types/value_to_type_paths_of.js +1 -0
  96. package/.out/types/value_type_of.d.ts +24 -0
  97. package/.out/types/value_type_of.js +1 -0
  98. package/.out/types/value_types_of_discriminated_union.d.ts +9 -0
  99. package/.out/types/value_types_of_discriminated_union.js +1 -0
  100. package/.out/vitest.workspace.d.ts +2 -0
  101. package/.out/vitest.workspace.js +7 -0
  102. package/.turbo/turbo-build.log +18 -0
  103. package/.turbo/turbo-check-types.log +3 -0
  104. package/.turbo/turbo-release$colon$exports.log +3 -0
  105. package/README.md +12 -0
  106. package/dist/index.cjs +798 -0
  107. package/dist/index.d.cts +301 -0
  108. package/dist/index.d.ts +301 -0
  109. package/dist/index.js +775 -0
  110. package/index.ts +20 -0
  111. package/package.exports.json +18 -0
  112. package/package.json +45 -0
  113. package/transformers/copies/copy.ts +18 -0
  114. package/transformers/copies/copy_to.ts +226 -0
  115. package/transformers/copies/mobx_copy.ts +81 -0
  116. package/transformers/copies/specs/copy_to.tests.ts +143 -0
  117. package/transformers/copies/specs/mobx_copy.tests.ts +26 -0
  118. package/transformers/flatteners/flatten_accessors_of.ts +43 -0
  119. package/transformers/flatteners/flatten_json_value_to_type_paths_of.ts +39 -0
  120. package/transformers/flatteners/flatten_type_def_to.ts +127 -0
  121. package/transformers/flatteners/flatten_type_defs_of.ts +16 -0
  122. package/transformers/flatteners/flatten_value_type_to.ts +227 -0
  123. package/transformers/flatteners/flatten_value_types_of.ts +23 -0
  124. package/transformers/flatteners/json_path.ts +15 -0
  125. package/transformers/flatteners/specs/flatten_accessors_of.tests.ts +113 -0
  126. package/transformers/flatteners/specs/flatten_json_value_to_type_paths_of.tests.ts +115 -0
  127. package/transformers/flatteners/specs/flatten_type_def_to.tests.ts +146 -0
  128. package/transformers/flatteners/specs/flatten_type_defs_of.tests.ts +26 -0
  129. package/transformers/flatteners/specs/flatten_value_type_to.tests.ts +452 -0
  130. package/transformers/flatteners/specs/flatten_value_types_of.tests.ts +46 -0
  131. package/transformers/flatteners/specs/value_path_to_type_path.tests.ts +240 -0
  132. package/transformers/flatteners/value_path_to_type_path.ts +164 -0
  133. package/tsconfig.build.json +11 -0
  134. package/tsconfig.json +15 -0
  135. package/tsup.config.ts +16 -0
  136. package/types/builders.ts +284 -0
  137. package/types/definitions.ts +106 -0
  138. package/types/flattened.ts +5 -0
  139. package/types/flattened_accessors_of.ts +15 -0
  140. package/types/flattened_type_defs_of.ts +130 -0
  141. package/types/flattened_value_types_of.ts +11 -0
  142. package/types/json_path_of.ts +7 -0
  143. package/types/json_paths_of.ts +129 -0
  144. package/types/mobx_value_type_of.ts +16 -0
  145. package/types/partial_type_def_of.ts +64 -0
  146. package/types/readonly_type_def_of.ts +53 -0
  147. package/types/specs/builder.tests.ts +295 -0
  148. package/types/specs/flattened_accessors_of.tests.ts +27 -0
  149. package/types/specs/flattened_type_defs_of.tests.ts +212 -0
  150. package/types/specs/flattened_value_types_of.tests.ts +21 -0
  151. package/types/specs/json_paths_of.tests.ts +304 -0
  152. package/types/specs/partial_type_def_of.tests.ts +251 -0
  153. package/types/specs/readonly_type_def_of.tests.ts +158 -0
  154. package/types/specs/strict_definitions.tests.ts +184 -0
  155. package/types/specs/value_to_type_paths_of.tests.ts +181 -0
  156. package/types/specs/value_type_of.tests.ts +329 -0
  157. package/types/specs/value_types_of_discriminated_union.tests.ts +30 -0
  158. package/types/strict_definitions.ts +107 -0
  159. package/types/value_to_type_paths_of.ts +184 -0
  160. package/types/value_type_of.ts +84 -0
  161. package/types/value_types_of_discriminated_union.ts +14 -0
  162. package/vitest.workspace.ts +11 -0
@@ -0,0 +1,301 @@
1
+ import { IsEqual, Simplify, UnionToIntersection, SimplifyDeep } from 'type-fest';
2
+ import { IsFieldReadonly } from '@strictly/base';
3
+
4
+ type Type<T extends TypeDef = TypeDef> = {
5
+ readonly definition: T;
6
+ };
7
+ type TypeDef = LiteralTypeDef | ListTypeDef | RecordTypeDef | ObjectTypeDef | UnionTypeDef;
8
+ declare enum TypeDefType {
9
+ Literal = 1,
10
+ List = 2,
11
+ Record = 3,
12
+ Object = 4,
13
+ Union = 5
14
+ }
15
+ type AnyTypeDef$1 = any;
16
+ type LiteralTypeDef<V = any> = {
17
+ readonly type: TypeDefType.Literal;
18
+ readonly valuePrototype: [V];
19
+ };
20
+ type ListTypeDef<E extends TypeDef = AnyTypeDef$1> = {
21
+ readonly type: TypeDefType.List;
22
+ readonly elements: E;
23
+ };
24
+ type RecordKeyType = string | number;
25
+ type RecordTypeDef<K extends RecordKeyType = RecordKeyType, V extends TypeDef | undefined = AnyTypeDef$1> = {
26
+ readonly type: TypeDefType.Record;
27
+ readonly keyPrototype: K;
28
+ readonly valueTypeDef: V;
29
+ };
30
+ type ObjectFieldKey = string | number;
31
+ type ObjectTypeDefFields = {
32
+ [Key: ObjectFieldKey]: AnyTypeDef$1;
33
+ };
34
+ type ObjectTypeDef<Fields extends ObjectTypeDefFields = ObjectTypeDefFields> = {
35
+ readonly type: TypeDefType.Object;
36
+ readonly fields: Fields;
37
+ };
38
+ type UnionKey = string;
39
+ type UnionTypeDef<D extends string | null = string | null, U extends Readonly<Record<UnionKey, AnyTypeDef$1>> = Readonly<Record<UnionKey, AnyTypeDef$1>>> = {
40
+ readonly discriminator: D;
41
+ readonly type: TypeDefType.Union;
42
+ readonly unions: U;
43
+ };
44
+
45
+ type ReadonlyTypeDefOf<T extends Type> = {
46
+ readonly definition: InternalReadonlyTypeDefOf<T['definition']>;
47
+ };
48
+ type InternalReadonlyTypeDefOf<T extends TypeDef> = T extends LiteralTypeDef ? InternalReadonlyTypeDefOfLiteral<T> : T extends ListTypeDef ? InternalReadonlyTypeDefOfList<T> : T extends RecordTypeDef ? InternalReadonlyTypeDefOfRecord<T> : T extends ObjectTypeDef ? InternalReadonlyTypeDefOfObject<T> : T extends UnionTypeDef ? InternalReadonlyTypeDefOfUnion<T> : never;
49
+ type InternalReadonlyTypeDefOfLiteral<T extends LiteralTypeDef> = T;
50
+ type InternalReadonlyTypeDefOfList<T extends ListTypeDef> = {
51
+ readonly type: T['type'];
52
+ readonly elements: InternalReadonlyTypeDefOf<T['elements']>;
53
+ };
54
+ type InternalReadonlyTypeDefOfRecord<T extends RecordTypeDef> = {
55
+ readonly type: T['type'];
56
+ readonly keyPrototype: T['keyPrototype'];
57
+ readonly valueTypeDef: undefined extends T['valueTypeDef'] ? InternalReadonlyTypeDefOf<Exclude<T['valueTypeDef'], undefined>> | undefined : InternalReadonlyTypeDefOf<T['valueTypeDef']>;
58
+ };
59
+ type InternalReadonlyTypeDefOfObject<T extends ObjectTypeDef> = T extends ObjectTypeDef<infer Fields> ? {
60
+ readonly type: T['type'];
61
+ readonly fields: {
62
+ readonly [K in keyof Fields]: InternalReadonlyTypeDefOf<Fields[K]>;
63
+ };
64
+ } : never;
65
+ type InternalReadonlyTypeDefOfUnion<T extends UnionTypeDef> = T extends UnionTypeDef<infer D, infer Unions> ? {
66
+ readonly type: T['type'];
67
+ readonly discriminator: D;
68
+ readonly unions: {
69
+ readonly [K in keyof Unions]: InternalReadonlyTypeDefOf<Unions[K]>;
70
+ };
71
+ } : never;
72
+
73
+ type StrictType<T extends StrictTypeDef = StrictTypeDef> = {
74
+ readonly definition: T;
75
+ };
76
+ type StrictTypeDef = StrictLiteralTypeDef | StrictListTypeDef | StrictRecordTypeDef | StrictObjectTypeDef | StrictUnionTypeDef;
77
+ type AnyTypeDef = any;
78
+ type StrictLiteralTypeDef<V = any> = {
79
+ readonly type: TypeDefType.Literal;
80
+ readonly valuePrototype: [V];
81
+ };
82
+ type StrictListTypeDef<E extends StrictTypeDef = AnyTypeDef> = {
83
+ readonly type: TypeDefType.List;
84
+ readonly elements: E;
85
+ };
86
+ type StrictRecordTypeDef<K extends RecordKeyType = RecordKeyType, V extends StrictTypeDef | undefined = AnyTypeDef> = {
87
+ readonly type: TypeDefType.Record;
88
+ readonly keyPrototype: K;
89
+ readonly valueTypeDef: V;
90
+ };
91
+ type StrictStructuredTypeDefFields = {
92
+ [Key: ObjectFieldKey]: AnyTypeDef;
93
+ };
94
+ type StrictObjectTypeDef<Fields extends StrictStructuredTypeDefFields = StrictStructuredTypeDefFields> = {
95
+ readonly type: TypeDefType.Object;
96
+ readonly fields: Fields;
97
+ };
98
+ type StrictUnionTypeDef<D extends string | null = string | null, U extends Readonly<Record<UnionKey, AnyTypeDef>> = Readonly<Record<UnionKey, AnyTypeDef>>> = D extends null ? IsStrictUnion<U> extends true ? {
99
+ readonly discriminator: null;
100
+ readonly type: TypeDefType.Union;
101
+ readonly unions: U;
102
+ } : never : {
103
+ readonly discriminator: D;
104
+ readonly type: TypeDefType.Union;
105
+ readonly unions: U;
106
+ };
107
+ type IsStrictUnion<U extends Readonly<Record<UnionKey, AnyTypeDef>>> = IsEqual<U, Simplify<{
108
+ readonly [K in keyof Omit<U, '0'> as U[K] extends StrictLiteralTypeDef ? K : never]: U[K];
109
+ } & (U extends {
110
+ readonly ['0']: AnyTypeDef;
111
+ } ? {
112
+ readonly ['0']: U['0'];
113
+ } : {})>>;
114
+
115
+ type ValueTypeOf<T, Extra = {}> = T extends Type ? InternalValueTypeOf<T['definition'], Extra> : never;
116
+ type InternalValueTypeOf<F extends TypeDef, Extra> = F extends LiteralTypeDef ? InternalValueTypeOfLiteral<F> : F extends ListTypeDef ? InternalValueTypeOfList<F, Extra> : F extends RecordTypeDef ? InternalValueTypeOfRecord<F, Extra> : F extends ObjectTypeDef ? InternalValueTypeOfObject<F, Extra> : F extends UnionTypeDef ? InternalValueTypeOfUnion<F, Extra> : never;
117
+ type InternalValueTypeOfLiteral<F extends LiteralTypeDef> = F['valuePrototype'][number];
118
+ type InternalValueTypeOfList<F extends ListTypeDef, Extra> = IsFieldReadonly<F, 'elements'> extends true ? readonly InternalValueTypeOf<F['elements'], Extra>[] & Extra : InternalValueTypeOf<F['elements'], Extra>[] & Extra;
119
+ type InternalValueTypeOfRecord<F extends RecordTypeDef, Extra> = undefined extends F['valueTypeDef'] ? IsFieldReadonly<F, 'valueTypeDef'> extends true ? {
120
+ readonly [k in F['keyPrototype']]?: InternalValueTypeOf<F['valueTypeDef'], Extra>;
121
+ } : {
122
+ [k in F['keyPrototype']]?: InternalValueTypeOf<F['valueTypeDef'], Extra>;
123
+ } : IsFieldReadonly<F, 'valueTypeDef'> extends true ? {
124
+ readonly [k in F['keyPrototype']]: InternalValueTypeOf<F['valueTypeDef'], Extra>;
125
+ } : {
126
+ [k in F['keyPrototype']]: InternalValueTypeOf<F['valueTypeDef'], Extra>;
127
+ };
128
+ type InternalValueTypeOfObject<F extends ObjectTypeDef, Extra> = F extends ObjectTypeDef<infer Fields> ? {
129
+ [K in keyof Fields]: InternalValueTypeOf<Fields[K], Extra>;
130
+ } & Extra : never;
131
+ type InternalValueTypeOfUnion<F extends UnionTypeDef, Extra> = F extends UnionTypeDef<infer D, infer U> ? D extends string ? {
132
+ [K in keyof U]: InternalValueTypeOf<U[K], Extra> & Readonly<Record<D, K>>;
133
+ }[keyof U] : {
134
+ [K in keyof U]: InternalValueTypeOf<U[K], Extra>;
135
+ }[keyof U] : never;
136
+
137
+ declare function copy<T extends StrictType>(t: T, proto: ValueTypeOf<ReadonlyTypeDefOf<T>>): ValueTypeOf<T>;
138
+
139
+ declare const MOBX_OBSERVABLE_KEY = "___mobx_observable";
140
+ type MobxObservable<T = {}> = {
141
+ [MOBX_OBSERVABLE_KEY]: true;
142
+ } & T;
143
+ type NonMobxObservable<T = {}> = {
144
+ [MOBX_OBSERVABLE_KEY]?: never;
145
+ } & T;
146
+ type MobxValueTypeOf<T extends Type> = ValueTypeOf<T, MobxObservable>;
147
+
148
+ declare function mobxCopy<T extends StrictType>(t: T, proto: ValueTypeOf<ReadonlyTypeDefOf<T>>): MobxValueTypeOf<T>;
149
+
150
+ type StartingDepth = 8;
151
+ type Depths = [-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13];
152
+
153
+ type JsonPathOf<Prefix extends string, Accessor extends string | number | symbol, SegmentOverride extends string | null = null> = SegmentOverride extends string ? `${Prefix}.${SegmentOverride}` : Accessor extends string | number ? `${Prefix}.${Accessor}` : never;
154
+
155
+ type FlattenedTypeDefsOf<T extends Type, SegmentOverride extends string | null, Path extends string = '$', Depth extends number = StartingDepth> = InternalFlattenedTypeDefsOf<T['definition'], SegmentOverride, Path, '', Depth>;
156
+ type InternalFlattenedTypeDefsOf<T extends TypeDef, SegmentOverride extends string | null, Path extends string, Qualifier extends string, Depth extends number> = {
157
+ readonly [K in Path]: Type<T>;
158
+ } & InternalFlattenedTypeDefsOfChildren<T, SegmentOverride, Path, Qualifier, Depth>;
159
+ type InternalFlattenedTypeDefsOfChildren<T extends TypeDef, SegmentOverride extends string | null, Path extends string, Qualifier extends string, Depth extends number, NextDepth extends number = Depths[Depth]> = NextDepth extends -1 ? never : T extends LiteralTypeDef ? InternalFlattenedTypeDefsOfLiteralChildren : T extends ListTypeDef ? InternalFlattenedTypeDefsOfListChildren<T, SegmentOverride, Path, NextDepth> : T extends RecordTypeDef ? InternalFlattenedTypeDefsOfRecordChildren<T, SegmentOverride, Path, NextDepth> : T extends ObjectTypeDef ? InternalFlattenedTypeDefsOfObjectChildren<T, SegmentOverride, Path, Qualifier, NextDepth> : T extends UnionTypeDef ? InternalFlattenedTypeDefsOfUnionChildren<T, SegmentOverride, Path, Qualifier, NextDepth> : never;
160
+ type InternalFlattenedTypeDefsOfLiteralChildren = {};
161
+ type InternalFlattenedTypeDefsOfListChildren<T extends ListTypeDef, SegmentOverride extends string | null, Path extends string, Depth extends number> = InternalFlattenedTypeDefsOf<T['elements'], SegmentOverride, JsonPathOf<Path, number, SegmentOverride>, '', Depth>;
162
+ type InternalFlattenedTypeDefsOfRecordChildren<T extends RecordTypeDef, SegmentOverride extends string | null, Path extends string, Depth extends number> = InternalFlattenedTypeDefsOf<T['valueTypeDef'], SegmentOverride, JsonPathOf<Path, T['keyPrototype'], SegmentOverride>, '', Depth>;
163
+ type InternalFlattenedTypeDefsOfObjectChildren<T extends ObjectTypeDef, SegmentOverride extends string | null, Path extends string, Qualifier extends string, Depth extends number> = T extends ObjectTypeDef<infer Fields> ? {} extends Fields ? {} : keyof Fields extends string ? UnionToIntersection<{
164
+ readonly [K in keyof Fields]-?: InternalFlattenedTypeDefsOf<Exclude<Fields[K], undefined>, SegmentOverride, JsonPathOf<Path, `${Qualifier}${K}`, null>, '', Depth>;
165
+ }[keyof Fields]> : never : never;
166
+ type InternalFlattenedTypeDefsOfUnionChildren<T extends UnionTypeDef, SegmentOverride extends string | null, Path extends string, Qualifier extends string, Depth extends number> = T extends UnionTypeDef<infer D, infer Unions> ? keyof Unions extends string ? D extends null ? UnionToIntersection<{
167
+ readonly [K in keyof Unions]: InternalFlattenedTypeDefsOfChildren<Unions[K], SegmentOverride, Path, '', Depth>;
168
+ }[keyof Unions]> : UnionToIntersection<{
169
+ readonly [K in keyof Unions]: InternalFlattenedTypeDefsOfChildren<Unions[K], SegmentOverride, Path, `${Qualifier}${K}:`, Depth>;
170
+ }[keyof Unions]> : never : never;
171
+
172
+ type FlattenedValueTypesOf<T extends Type, SegmentOverride extends string | null = null, Flattened extends Readonly<Record<string, Type>> = FlattenedTypeDefsOf<T, SegmentOverride>> = {
173
+ [K in keyof Flattened]: ValueTypeOf<Flattened[K], {}>;
174
+ };
175
+
176
+ type Accessor<T = any> = {
177
+ readonly value: T;
178
+ set(v: T): void;
179
+ };
180
+ type FlattenedAccessorsOf<T extends Type, Flattened extends Readonly<Record<string, Accessor>> = FlattenedValueTypesOf<T>> = {
181
+ readonly [K in keyof Flattened]: Accessor<Flattened[K]>;
182
+ };
183
+
184
+ type AnyValueType = any;
185
+ type Setter<V> = (v: V) => void;
186
+ type Mapper<R> = (t: StrictTypeDef, v: AnyValueType, setter: Setter<AnyValueType>, typePath: string, valuePath: string) => R;
187
+ declare function flattenValueTypeTo<T extends StrictType, M, R extends Readonly<Record<string, M>>>({ definition }: T, v: ValueTypeOf<T>, setter: Setter<ValueTypeOf<T>>, mapper: Mapper<M>): R;
188
+ declare function getUnionTypeDef<T extends UnionTypeDef>(typeDef: T, v: ValueTypeOf<ReadonlyTypeDefOf<{
189
+ definition: T;
190
+ }>>): any;
191
+
192
+ declare function flattenAccessorsOf<T extends Type, R extends Readonly<Record<string, Accessor<any>>> = FlattenedAccessorsOf<T>>(t: T, value: ValueTypeOf<T>, setValue: Setter<ValueTypeOf<T>>): R;
193
+
194
+ declare function flattenJsonValueToTypePathsOf<T extends Type, R extends Record<string, string | number | symbol>>(t: T, value: ValueTypeOf<T>): R;
195
+
196
+ declare function flattenTypeDefsOf<T extends StrictType>(t: T): Record<string, Type>;
197
+
198
+ declare function jsonPath(prefix: string, segment: number | string, qualifier?: string): string;
199
+ declare function jsonPathPop(path: string): [string, string] | null;
200
+
201
+ declare function valuePathToTypePath<JsonPaths extends Record<string, string>, ValuePath extends keyof JsonPaths>({ definition: typeDef }: Type, valuePath: ValuePath, allowMissingPaths?: boolean): JsonPaths[ValuePath];
202
+
203
+ declare class TypeDefBuilder<T extends TypeDef> implements Type<T> {
204
+ readonly definition: T;
205
+ constructor(definition: T);
206
+ get narrow(): Type<T>;
207
+ }
208
+ declare class LiteralTypeDefBuilder<T> extends TypeDefBuilder<LiteralTypeDef<T>> {
209
+ }
210
+ declare class ListTypeDefBuilder<T extends ListTypeDef> extends TypeDefBuilder<T> {
211
+ readonly(): ListTypeDefBuilder<{
212
+ readonly type: TypeDefType.List;
213
+ readonly elements: T['elements'];
214
+ }>;
215
+ }
216
+ declare class RecordTypeDefBuilder<T extends RecordTypeDef> extends TypeDefBuilder<T> {
217
+ partial(): IsFieldReadonly<T, 'valueTypeDef'> extends true ? RecordTypeDefBuilder<{
218
+ readonly type: TypeDefType.Record;
219
+ readonly keyPrototype: T['keyPrototype'];
220
+ readonly valueTypeDef: T['valueTypeDef'] | undefined;
221
+ }> : RecordTypeDefBuilder<{
222
+ readonly type: TypeDefType.Record;
223
+ readonly keyPrototype: T['keyPrototype'];
224
+ valueTypeDef: T['valueTypeDef'] | undefined;
225
+ }>;
226
+ readonly(): RecordTypeDefBuilder<{
227
+ readonly type: TypeDefType.Record;
228
+ readonly keyPrototype: T['keyPrototype'];
229
+ readonly valueTypeDef: T['valueTypeDef'];
230
+ }>;
231
+ }
232
+ declare class ObjectTypeDefBuilder<Fields extends Readonly<Record<ObjectFieldKey, TypeDef>> = {}> extends TypeDefBuilder<ObjectTypeDef<Fields>> {
233
+ set<Name extends string, T extends TypeDef>(name: Name, { definition: typeDef }: Type<T>): ObjectTypeDefBuilder<Fields & Record<Name, T>>;
234
+ setReadonly<Name extends string, T extends TypeDef>(name: Name, { definition: typeDef }: Type<T>): ObjectTypeDefBuilder<Fields & Readonly<Record<Name, T>>>;
235
+ setOptional<Name extends string, T extends TypeDef>(name: Name, { definition: typeDef }: Type<T>): ObjectTypeDefBuilder<Fields & Partial<Record<Name, T>>>;
236
+ setReadonlyOptional<Name extends string, T extends TypeDef>(name: Name, { definition: typeDef }: Type<T>): ObjectTypeDefBuilder<Fields & Partial<Readonly<Record<Name, T>>>>;
237
+ }
238
+ declare class UnionTypeDefBuilder<D extends string | null, U extends Record<UnionKey, TypeDef>> extends TypeDefBuilder<UnionTypeDef<D, U>> {
239
+ add<K extends Exclude<UnionKey, keyof U>, T extends TypeDef>(k: K, { definition: typeDef, }: Type<T>): UnionTypeDefBuilder<D, Readonly<Record<K, T>> & U>;
240
+ }
241
+ declare function literal<T>(value?: [T]): LiteralTypeDefBuilder<T>;
242
+ declare const stringType: LiteralTypeDefBuilder<string>;
243
+ declare const numberType: LiteralTypeDefBuilder<number>;
244
+ declare const booleanType: LiteralTypeDefBuilder<boolean>;
245
+ declare const nullType: LiteralTypeDefBuilder<null>;
246
+ declare function nullable<T extends TypeDef>(nonNullable: Type<T>): UnionTypeDefBuilder<null, {
247
+ readonly ['0']: T;
248
+ readonly ['1']: LiteralTypeDef<null>;
249
+ }>;
250
+ declare function list<T extends TypeDef>(elements: Type<T>): ListTypeDefBuilder<{
251
+ readonly type: TypeDefType.List;
252
+ elements: T;
253
+ }>;
254
+ declare function record<V extends Type, K extends RecordKeyType>({ definition: typeDef }: V): RecordTypeDefBuilder<{
255
+ readonly type: TypeDefType.Record;
256
+ readonly keyPrototype: K;
257
+ valueTypeDef: V["definition"];
258
+ }>;
259
+ declare function object(): ObjectTypeDefBuilder<{}>;
260
+ declare function union<D extends null>(): UnionTypeDefBuilder<D, {}>;
261
+ declare function union<D extends string>(discriminator: D): UnionTypeDefBuilder<D, {}>;
262
+
263
+ type JsonPathsOf<T extends Type, SegmentOverride extends string | null = null, Prefix extends string = '$'> = InternalJsonPathsOf<T['definition'], Prefix, SegmentOverride, StartingDepth>;
264
+ type InternalJsonPathsOf<F extends TypeDef, Prefix extends string, SegmentOverride extends string | null, Depth extends number, NextDepth extends number = Depths[Depth]> = InternalJsonPathsOfChildren<F, Prefix, SegmentOverride, '', NextDepth> | Prefix;
265
+ type InternalJsonPathsOfChildren<F extends TypeDef, Prefix extends string, SegmentOverride extends string | null, Qualifier extends string, Depth extends number> = Depth extends -1 ? never : F extends LiteralTypeDef ? InternalJsonPathsOfLiteralChildren : F extends ListTypeDef ? InternalJsonPathsOfListChildren<F, Prefix, SegmentOverride, Depth> : F extends RecordTypeDef ? InternalJsonPathsOfRecordChildren<F, Prefix, SegmentOverride, Depth> : F extends ObjectTypeDef ? InternalJsonPathsOfObjectChildren<F, Prefix, SegmentOverride, Qualifier, Depth> : F extends UnionTypeDef ? InternalJsonPathsOfUnionChildren<F, Prefix, SegmentOverride, Qualifier, Depth> : never;
266
+ type InternalJsonPathsOfLiteralChildren = never;
267
+ type InternalJsonPathsOfListChildren<F extends ListTypeDef, Prefix extends string, SegmentOverride extends string | null, Depth extends number> = InternalJsonPathsOf<F['elements'], JsonPathOf<Prefix, number, SegmentOverride>, SegmentOverride, Depth>;
268
+ type InternalJsonPathsOfRecordChildren<F extends RecordTypeDef, Prefix extends string, SegmentOverride extends string | null, Depth extends number> = InternalJsonPathsOf<F['valueTypeDef'], JsonPathOf<Prefix, F['keyPrototype'], SegmentOverride>, SegmentOverride, Depth>;
269
+ type InternalJsonPathsOfObjectChildren<F extends ObjectTypeDef, Prefix extends string, SegmentOverride extends string | null, Qualifier extends string, Depth extends number> = F extends ObjectTypeDef<infer Fields> ? keyof Fields extends string ? {
270
+ [K in keyof Fields]: InternalJsonPathsOf<Fields[K], JsonPathOf<Prefix, `${Qualifier}${K}`, null>, SegmentOverride, Depth>;
271
+ }[keyof Fields] : never : never;
272
+ type InternalJsonPathsOfUnionChildren<F extends UnionTypeDef, Prefix extends string, SegmentOverride extends string | null, Qualifier extends string, Depth extends number> = F extends UnionTypeDef<infer D, infer Unions> ? keyof Unions extends string ? {
273
+ readonly [K in keyof Unions]: InternalJsonPathsOfChildren<Unions[K], Prefix, SegmentOverride, D extends null ? Qualifier : `${Qualifier}${K}:`, Depth>;
274
+ }[keyof Unions] : never : never;
275
+
276
+ type ValueToTypePathsOf<T extends StrictType, SegmentOverride extends string = '*', Path extends string = '$'> = SimplifyDeep<InternalFlattenedJsonPathsOf<T['definition'], SegmentOverride, Path, Path, StartingDepth>>;
277
+ type InternalFlattenedJsonPathsOf<T extends TypeDef, SegmentOverride extends string, ValuePath extends string, TypePath extends string, Depth extends number> = {
278
+ readonly [K in ValuePath]: TypePath;
279
+ } & InternalFlattenedJsonPathsOfChildren<T, SegmentOverride, ValuePath, TypePath, '', Depth>;
280
+ type InternalFlattenedJsonPathsOfChildren<T extends TypeDef, SegmentOverride extends string, ValuePath extends string, TypePath extends string, Qualifier extends string, Depth extends number, NextDepth extends number = Depths[Depth]> = NextDepth extends -1 ? never : T extends LiteralTypeDef ? InternalFlattenedJsonPathsOfLiteralChildren : T extends ListTypeDef ? InternalFlattenedJsonPathsOfListChildren<T, SegmentOverride, ValuePath, TypePath, NextDepth> : T extends RecordTypeDef ? InternalFlattenedJsonPathsOfRecordChildren<T, SegmentOverride, ValuePath, TypePath, NextDepth> : T extends ObjectTypeDef ? InternalFlattenedJsonPathsOfObjectChildren<T, SegmentOverride, ValuePath, TypePath, Qualifier, NextDepth> : T extends UnionTypeDef ? InternalFlattenedJsonPathsOfUnionChildren<T, SegmentOverride, ValuePath, TypePath, Qualifier, NextDepth> : never;
281
+ type InternalFlattenedJsonPathsOfLiteralChildren = {};
282
+ type InternalFlattenedJsonPathsOfListChildren<T extends ListTypeDef, SegmentOverride extends string, ValuePath extends string, TypePath extends string, Depth extends number> = InternalFlattenedJsonPathsOf<T['elements'], SegmentOverride, JsonPathOf<ValuePath, number>, JsonPathOf<TypePath, number, SegmentOverride>, Depth>;
283
+ type InternalFlattenedJsonPathsOfRecordChildren<T extends RecordTypeDef, SegmentOverride extends string, ValuePath extends string, TypePath extends string, Depth extends number> = InternalFlattenedJsonPathsOf<T['valueTypeDef'], SegmentOverride, JsonPathOf<ValuePath, T['keyPrototype']>, JsonPathOf<TypePath, T['keyPrototype'], SegmentOverride>, Depth>;
284
+ type InternalFlattenedJsonPathsOfObjectChildren<T extends ObjectTypeDef, SegmentOverride extends string, ValuePath extends string, TypePath extends string, Qualifier extends string, Depth extends number> = T extends ObjectTypeDef<infer Fields> ? keyof Fields extends string ? UnionToIntersection<{
285
+ readonly [K in keyof Fields]-?: InternalFlattenedJsonPathsOf<Exclude<Fields[K], undefined>, SegmentOverride, JsonPathOf<ValuePath, `${Qualifier}${K}`>, JsonPathOf<TypePath, `${Qualifier}${K}`>, Depth>;
286
+ }[keyof Fields]> : never : never;
287
+ type InternalFlattenedJsonPathsOfUnionChildren<T extends UnionTypeDef, SegmentOverride extends string, ValuePath extends string, TypePath extends string, Qualifier extends string, Depth extends number> = T extends UnionTypeDef<infer D, infer Unions> ? keyof Unions extends string ? D extends null ? UnionToIntersection<{
288
+ readonly [K in keyof Unions]: InternalFlattenedJsonPathsOfChildren<Unions[K], SegmentOverride, ValuePath, TypePath, '', Depth>;
289
+ }[keyof Unions]> : UnionToIntersection<{
290
+ readonly [K in keyof Unions]: InternalFlattenedJsonPathsOfChildren<Unions[K], SegmentOverride, ValuePath, TypePath, `${Qualifier}${K}:`, Depth>;
291
+ }[keyof Unions]> : never : never;
292
+
293
+ type ValueTypesOfDiscriminatedUnion<U extends UnionTypeDef> = U extends UnionTypeDef<infer D, infer Unions> ? D extends string ? {
294
+ [K in keyof Unions]: ValueTypeOf<{
295
+ definition: Unions[K];
296
+ }> & {
297
+ [KD in D]: K;
298
+ };
299
+ } : never : never;
300
+
301
+ export { type Accessor, type AnyValueType, type FlattenedAccessorsOf, type FlattenedTypeDefsOf, type FlattenedValueTypesOf, type InternalJsonPathsOf, type InternalValueTypeOf, type IsStrictUnion, type JsonPathsOf, type ListTypeDef, type LiteralTypeDef, type Mapper, type MobxObservable, type MobxValueTypeOf, type NonMobxObservable, type ObjectFieldKey, type ObjectTypeDef, type ObjectTypeDefFields, type ReadonlyTypeDefOf, type RecordKeyType, type RecordTypeDef, type Setter, type StrictListTypeDef, type StrictLiteralTypeDef, type StrictObjectTypeDef, type StrictRecordTypeDef, type StrictStructuredTypeDefFields, type StrictType, type StrictTypeDef, type StrictUnionTypeDef, type Type, type TypeDef, TypeDefType, type UnionKey, type UnionTypeDef, type ValueToTypePathsOf, type ValueTypeOf, type ValueTypesOfDiscriminatedUnion, booleanType, copy, flattenAccessorsOf, flattenJsonValueToTypePathsOf, flattenTypeDefsOf, flattenValueTypeTo, getUnionTypeDef, jsonPath, jsonPathPop, list, literal, mobxCopy, nullType, nullable, numberType, object, record, stringType, union, valuePathToTypePath };
@@ -0,0 +1,301 @@
1
+ import { IsEqual, Simplify, UnionToIntersection, SimplifyDeep } from 'type-fest';
2
+ import { IsFieldReadonly } from '@strictly/base';
3
+
4
+ type Type<T extends TypeDef = TypeDef> = {
5
+ readonly definition: T;
6
+ };
7
+ type TypeDef = LiteralTypeDef | ListTypeDef | RecordTypeDef | ObjectTypeDef | UnionTypeDef;
8
+ declare enum TypeDefType {
9
+ Literal = 1,
10
+ List = 2,
11
+ Record = 3,
12
+ Object = 4,
13
+ Union = 5
14
+ }
15
+ type AnyTypeDef$1 = any;
16
+ type LiteralTypeDef<V = any> = {
17
+ readonly type: TypeDefType.Literal;
18
+ readonly valuePrototype: [V];
19
+ };
20
+ type ListTypeDef<E extends TypeDef = AnyTypeDef$1> = {
21
+ readonly type: TypeDefType.List;
22
+ readonly elements: E;
23
+ };
24
+ type RecordKeyType = string | number;
25
+ type RecordTypeDef<K extends RecordKeyType = RecordKeyType, V extends TypeDef | undefined = AnyTypeDef$1> = {
26
+ readonly type: TypeDefType.Record;
27
+ readonly keyPrototype: K;
28
+ readonly valueTypeDef: V;
29
+ };
30
+ type ObjectFieldKey = string | number;
31
+ type ObjectTypeDefFields = {
32
+ [Key: ObjectFieldKey]: AnyTypeDef$1;
33
+ };
34
+ type ObjectTypeDef<Fields extends ObjectTypeDefFields = ObjectTypeDefFields> = {
35
+ readonly type: TypeDefType.Object;
36
+ readonly fields: Fields;
37
+ };
38
+ type UnionKey = string;
39
+ type UnionTypeDef<D extends string | null = string | null, U extends Readonly<Record<UnionKey, AnyTypeDef$1>> = Readonly<Record<UnionKey, AnyTypeDef$1>>> = {
40
+ readonly discriminator: D;
41
+ readonly type: TypeDefType.Union;
42
+ readonly unions: U;
43
+ };
44
+
45
+ type ReadonlyTypeDefOf<T extends Type> = {
46
+ readonly definition: InternalReadonlyTypeDefOf<T['definition']>;
47
+ };
48
+ type InternalReadonlyTypeDefOf<T extends TypeDef> = T extends LiteralTypeDef ? InternalReadonlyTypeDefOfLiteral<T> : T extends ListTypeDef ? InternalReadonlyTypeDefOfList<T> : T extends RecordTypeDef ? InternalReadonlyTypeDefOfRecord<T> : T extends ObjectTypeDef ? InternalReadonlyTypeDefOfObject<T> : T extends UnionTypeDef ? InternalReadonlyTypeDefOfUnion<T> : never;
49
+ type InternalReadonlyTypeDefOfLiteral<T extends LiteralTypeDef> = T;
50
+ type InternalReadonlyTypeDefOfList<T extends ListTypeDef> = {
51
+ readonly type: T['type'];
52
+ readonly elements: InternalReadonlyTypeDefOf<T['elements']>;
53
+ };
54
+ type InternalReadonlyTypeDefOfRecord<T extends RecordTypeDef> = {
55
+ readonly type: T['type'];
56
+ readonly keyPrototype: T['keyPrototype'];
57
+ readonly valueTypeDef: undefined extends T['valueTypeDef'] ? InternalReadonlyTypeDefOf<Exclude<T['valueTypeDef'], undefined>> | undefined : InternalReadonlyTypeDefOf<T['valueTypeDef']>;
58
+ };
59
+ type InternalReadonlyTypeDefOfObject<T extends ObjectTypeDef> = T extends ObjectTypeDef<infer Fields> ? {
60
+ readonly type: T['type'];
61
+ readonly fields: {
62
+ readonly [K in keyof Fields]: InternalReadonlyTypeDefOf<Fields[K]>;
63
+ };
64
+ } : never;
65
+ type InternalReadonlyTypeDefOfUnion<T extends UnionTypeDef> = T extends UnionTypeDef<infer D, infer Unions> ? {
66
+ readonly type: T['type'];
67
+ readonly discriminator: D;
68
+ readonly unions: {
69
+ readonly [K in keyof Unions]: InternalReadonlyTypeDefOf<Unions[K]>;
70
+ };
71
+ } : never;
72
+
73
+ type StrictType<T extends StrictTypeDef = StrictTypeDef> = {
74
+ readonly definition: T;
75
+ };
76
+ type StrictTypeDef = StrictLiteralTypeDef | StrictListTypeDef | StrictRecordTypeDef | StrictObjectTypeDef | StrictUnionTypeDef;
77
+ type AnyTypeDef = any;
78
+ type StrictLiteralTypeDef<V = any> = {
79
+ readonly type: TypeDefType.Literal;
80
+ readonly valuePrototype: [V];
81
+ };
82
+ type StrictListTypeDef<E extends StrictTypeDef = AnyTypeDef> = {
83
+ readonly type: TypeDefType.List;
84
+ readonly elements: E;
85
+ };
86
+ type StrictRecordTypeDef<K extends RecordKeyType = RecordKeyType, V extends StrictTypeDef | undefined = AnyTypeDef> = {
87
+ readonly type: TypeDefType.Record;
88
+ readonly keyPrototype: K;
89
+ readonly valueTypeDef: V;
90
+ };
91
+ type StrictStructuredTypeDefFields = {
92
+ [Key: ObjectFieldKey]: AnyTypeDef;
93
+ };
94
+ type StrictObjectTypeDef<Fields extends StrictStructuredTypeDefFields = StrictStructuredTypeDefFields> = {
95
+ readonly type: TypeDefType.Object;
96
+ readonly fields: Fields;
97
+ };
98
+ type StrictUnionTypeDef<D extends string | null = string | null, U extends Readonly<Record<UnionKey, AnyTypeDef>> = Readonly<Record<UnionKey, AnyTypeDef>>> = D extends null ? IsStrictUnion<U> extends true ? {
99
+ readonly discriminator: null;
100
+ readonly type: TypeDefType.Union;
101
+ readonly unions: U;
102
+ } : never : {
103
+ readonly discriminator: D;
104
+ readonly type: TypeDefType.Union;
105
+ readonly unions: U;
106
+ };
107
+ type IsStrictUnion<U extends Readonly<Record<UnionKey, AnyTypeDef>>> = IsEqual<U, Simplify<{
108
+ readonly [K in keyof Omit<U, '0'> as U[K] extends StrictLiteralTypeDef ? K : never]: U[K];
109
+ } & (U extends {
110
+ readonly ['0']: AnyTypeDef;
111
+ } ? {
112
+ readonly ['0']: U['0'];
113
+ } : {})>>;
114
+
115
+ type ValueTypeOf<T, Extra = {}> = T extends Type ? InternalValueTypeOf<T['definition'], Extra> : never;
116
+ type InternalValueTypeOf<F extends TypeDef, Extra> = F extends LiteralTypeDef ? InternalValueTypeOfLiteral<F> : F extends ListTypeDef ? InternalValueTypeOfList<F, Extra> : F extends RecordTypeDef ? InternalValueTypeOfRecord<F, Extra> : F extends ObjectTypeDef ? InternalValueTypeOfObject<F, Extra> : F extends UnionTypeDef ? InternalValueTypeOfUnion<F, Extra> : never;
117
+ type InternalValueTypeOfLiteral<F extends LiteralTypeDef> = F['valuePrototype'][number];
118
+ type InternalValueTypeOfList<F extends ListTypeDef, Extra> = IsFieldReadonly<F, 'elements'> extends true ? readonly InternalValueTypeOf<F['elements'], Extra>[] & Extra : InternalValueTypeOf<F['elements'], Extra>[] & Extra;
119
+ type InternalValueTypeOfRecord<F extends RecordTypeDef, Extra> = undefined extends F['valueTypeDef'] ? IsFieldReadonly<F, 'valueTypeDef'> extends true ? {
120
+ readonly [k in F['keyPrototype']]?: InternalValueTypeOf<F['valueTypeDef'], Extra>;
121
+ } : {
122
+ [k in F['keyPrototype']]?: InternalValueTypeOf<F['valueTypeDef'], Extra>;
123
+ } : IsFieldReadonly<F, 'valueTypeDef'> extends true ? {
124
+ readonly [k in F['keyPrototype']]: InternalValueTypeOf<F['valueTypeDef'], Extra>;
125
+ } : {
126
+ [k in F['keyPrototype']]: InternalValueTypeOf<F['valueTypeDef'], Extra>;
127
+ };
128
+ type InternalValueTypeOfObject<F extends ObjectTypeDef, Extra> = F extends ObjectTypeDef<infer Fields> ? {
129
+ [K in keyof Fields]: InternalValueTypeOf<Fields[K], Extra>;
130
+ } & Extra : never;
131
+ type InternalValueTypeOfUnion<F extends UnionTypeDef, Extra> = F extends UnionTypeDef<infer D, infer U> ? D extends string ? {
132
+ [K in keyof U]: InternalValueTypeOf<U[K], Extra> & Readonly<Record<D, K>>;
133
+ }[keyof U] : {
134
+ [K in keyof U]: InternalValueTypeOf<U[K], Extra>;
135
+ }[keyof U] : never;
136
+
137
+ declare function copy<T extends StrictType>(t: T, proto: ValueTypeOf<ReadonlyTypeDefOf<T>>): ValueTypeOf<T>;
138
+
139
+ declare const MOBX_OBSERVABLE_KEY = "___mobx_observable";
140
+ type MobxObservable<T = {}> = {
141
+ [MOBX_OBSERVABLE_KEY]: true;
142
+ } & T;
143
+ type NonMobxObservable<T = {}> = {
144
+ [MOBX_OBSERVABLE_KEY]?: never;
145
+ } & T;
146
+ type MobxValueTypeOf<T extends Type> = ValueTypeOf<T, MobxObservable>;
147
+
148
+ declare function mobxCopy<T extends StrictType>(t: T, proto: ValueTypeOf<ReadonlyTypeDefOf<T>>): MobxValueTypeOf<T>;
149
+
150
+ type StartingDepth = 8;
151
+ type Depths = [-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13];
152
+
153
+ type JsonPathOf<Prefix extends string, Accessor extends string | number | symbol, SegmentOverride extends string | null = null> = SegmentOverride extends string ? `${Prefix}.${SegmentOverride}` : Accessor extends string | number ? `${Prefix}.${Accessor}` : never;
154
+
155
+ type FlattenedTypeDefsOf<T extends Type, SegmentOverride extends string | null, Path extends string = '$', Depth extends number = StartingDepth> = InternalFlattenedTypeDefsOf<T['definition'], SegmentOverride, Path, '', Depth>;
156
+ type InternalFlattenedTypeDefsOf<T extends TypeDef, SegmentOverride extends string | null, Path extends string, Qualifier extends string, Depth extends number> = {
157
+ readonly [K in Path]: Type<T>;
158
+ } & InternalFlattenedTypeDefsOfChildren<T, SegmentOverride, Path, Qualifier, Depth>;
159
+ type InternalFlattenedTypeDefsOfChildren<T extends TypeDef, SegmentOverride extends string | null, Path extends string, Qualifier extends string, Depth extends number, NextDepth extends number = Depths[Depth]> = NextDepth extends -1 ? never : T extends LiteralTypeDef ? InternalFlattenedTypeDefsOfLiteralChildren : T extends ListTypeDef ? InternalFlattenedTypeDefsOfListChildren<T, SegmentOverride, Path, NextDepth> : T extends RecordTypeDef ? InternalFlattenedTypeDefsOfRecordChildren<T, SegmentOverride, Path, NextDepth> : T extends ObjectTypeDef ? InternalFlattenedTypeDefsOfObjectChildren<T, SegmentOverride, Path, Qualifier, NextDepth> : T extends UnionTypeDef ? InternalFlattenedTypeDefsOfUnionChildren<T, SegmentOverride, Path, Qualifier, NextDepth> : never;
160
+ type InternalFlattenedTypeDefsOfLiteralChildren = {};
161
+ type InternalFlattenedTypeDefsOfListChildren<T extends ListTypeDef, SegmentOverride extends string | null, Path extends string, Depth extends number> = InternalFlattenedTypeDefsOf<T['elements'], SegmentOverride, JsonPathOf<Path, number, SegmentOverride>, '', Depth>;
162
+ type InternalFlattenedTypeDefsOfRecordChildren<T extends RecordTypeDef, SegmentOverride extends string | null, Path extends string, Depth extends number> = InternalFlattenedTypeDefsOf<T['valueTypeDef'], SegmentOverride, JsonPathOf<Path, T['keyPrototype'], SegmentOverride>, '', Depth>;
163
+ type InternalFlattenedTypeDefsOfObjectChildren<T extends ObjectTypeDef, SegmentOverride extends string | null, Path extends string, Qualifier extends string, Depth extends number> = T extends ObjectTypeDef<infer Fields> ? {} extends Fields ? {} : keyof Fields extends string ? UnionToIntersection<{
164
+ readonly [K in keyof Fields]-?: InternalFlattenedTypeDefsOf<Exclude<Fields[K], undefined>, SegmentOverride, JsonPathOf<Path, `${Qualifier}${K}`, null>, '', Depth>;
165
+ }[keyof Fields]> : never : never;
166
+ type InternalFlattenedTypeDefsOfUnionChildren<T extends UnionTypeDef, SegmentOverride extends string | null, Path extends string, Qualifier extends string, Depth extends number> = T extends UnionTypeDef<infer D, infer Unions> ? keyof Unions extends string ? D extends null ? UnionToIntersection<{
167
+ readonly [K in keyof Unions]: InternalFlattenedTypeDefsOfChildren<Unions[K], SegmentOverride, Path, '', Depth>;
168
+ }[keyof Unions]> : UnionToIntersection<{
169
+ readonly [K in keyof Unions]: InternalFlattenedTypeDefsOfChildren<Unions[K], SegmentOverride, Path, `${Qualifier}${K}:`, Depth>;
170
+ }[keyof Unions]> : never : never;
171
+
172
+ type FlattenedValueTypesOf<T extends Type, SegmentOverride extends string | null = null, Flattened extends Readonly<Record<string, Type>> = FlattenedTypeDefsOf<T, SegmentOverride>> = {
173
+ [K in keyof Flattened]: ValueTypeOf<Flattened[K], {}>;
174
+ };
175
+
176
+ type Accessor<T = any> = {
177
+ readonly value: T;
178
+ set(v: T): void;
179
+ };
180
+ type FlattenedAccessorsOf<T extends Type, Flattened extends Readonly<Record<string, Accessor>> = FlattenedValueTypesOf<T>> = {
181
+ readonly [K in keyof Flattened]: Accessor<Flattened[K]>;
182
+ };
183
+
184
+ type AnyValueType = any;
185
+ type Setter<V> = (v: V) => void;
186
+ type Mapper<R> = (t: StrictTypeDef, v: AnyValueType, setter: Setter<AnyValueType>, typePath: string, valuePath: string) => R;
187
+ declare function flattenValueTypeTo<T extends StrictType, M, R extends Readonly<Record<string, M>>>({ definition }: T, v: ValueTypeOf<T>, setter: Setter<ValueTypeOf<T>>, mapper: Mapper<M>): R;
188
+ declare function getUnionTypeDef<T extends UnionTypeDef>(typeDef: T, v: ValueTypeOf<ReadonlyTypeDefOf<{
189
+ definition: T;
190
+ }>>): any;
191
+
192
+ declare function flattenAccessorsOf<T extends Type, R extends Readonly<Record<string, Accessor<any>>> = FlattenedAccessorsOf<T>>(t: T, value: ValueTypeOf<T>, setValue: Setter<ValueTypeOf<T>>): R;
193
+
194
+ declare function flattenJsonValueToTypePathsOf<T extends Type, R extends Record<string, string | number | symbol>>(t: T, value: ValueTypeOf<T>): R;
195
+
196
+ declare function flattenTypeDefsOf<T extends StrictType>(t: T): Record<string, Type>;
197
+
198
+ declare function jsonPath(prefix: string, segment: number | string, qualifier?: string): string;
199
+ declare function jsonPathPop(path: string): [string, string] | null;
200
+
201
+ declare function valuePathToTypePath<JsonPaths extends Record<string, string>, ValuePath extends keyof JsonPaths>({ definition: typeDef }: Type, valuePath: ValuePath, allowMissingPaths?: boolean): JsonPaths[ValuePath];
202
+
203
+ declare class TypeDefBuilder<T extends TypeDef> implements Type<T> {
204
+ readonly definition: T;
205
+ constructor(definition: T);
206
+ get narrow(): Type<T>;
207
+ }
208
+ declare class LiteralTypeDefBuilder<T> extends TypeDefBuilder<LiteralTypeDef<T>> {
209
+ }
210
+ declare class ListTypeDefBuilder<T extends ListTypeDef> extends TypeDefBuilder<T> {
211
+ readonly(): ListTypeDefBuilder<{
212
+ readonly type: TypeDefType.List;
213
+ readonly elements: T['elements'];
214
+ }>;
215
+ }
216
+ declare class RecordTypeDefBuilder<T extends RecordTypeDef> extends TypeDefBuilder<T> {
217
+ partial(): IsFieldReadonly<T, 'valueTypeDef'> extends true ? RecordTypeDefBuilder<{
218
+ readonly type: TypeDefType.Record;
219
+ readonly keyPrototype: T['keyPrototype'];
220
+ readonly valueTypeDef: T['valueTypeDef'] | undefined;
221
+ }> : RecordTypeDefBuilder<{
222
+ readonly type: TypeDefType.Record;
223
+ readonly keyPrototype: T['keyPrototype'];
224
+ valueTypeDef: T['valueTypeDef'] | undefined;
225
+ }>;
226
+ readonly(): RecordTypeDefBuilder<{
227
+ readonly type: TypeDefType.Record;
228
+ readonly keyPrototype: T['keyPrototype'];
229
+ readonly valueTypeDef: T['valueTypeDef'];
230
+ }>;
231
+ }
232
+ declare class ObjectTypeDefBuilder<Fields extends Readonly<Record<ObjectFieldKey, TypeDef>> = {}> extends TypeDefBuilder<ObjectTypeDef<Fields>> {
233
+ set<Name extends string, T extends TypeDef>(name: Name, { definition: typeDef }: Type<T>): ObjectTypeDefBuilder<Fields & Record<Name, T>>;
234
+ setReadonly<Name extends string, T extends TypeDef>(name: Name, { definition: typeDef }: Type<T>): ObjectTypeDefBuilder<Fields & Readonly<Record<Name, T>>>;
235
+ setOptional<Name extends string, T extends TypeDef>(name: Name, { definition: typeDef }: Type<T>): ObjectTypeDefBuilder<Fields & Partial<Record<Name, T>>>;
236
+ setReadonlyOptional<Name extends string, T extends TypeDef>(name: Name, { definition: typeDef }: Type<T>): ObjectTypeDefBuilder<Fields & Partial<Readonly<Record<Name, T>>>>;
237
+ }
238
+ declare class UnionTypeDefBuilder<D extends string | null, U extends Record<UnionKey, TypeDef>> extends TypeDefBuilder<UnionTypeDef<D, U>> {
239
+ add<K extends Exclude<UnionKey, keyof U>, T extends TypeDef>(k: K, { definition: typeDef, }: Type<T>): UnionTypeDefBuilder<D, Readonly<Record<K, T>> & U>;
240
+ }
241
+ declare function literal<T>(value?: [T]): LiteralTypeDefBuilder<T>;
242
+ declare const stringType: LiteralTypeDefBuilder<string>;
243
+ declare const numberType: LiteralTypeDefBuilder<number>;
244
+ declare const booleanType: LiteralTypeDefBuilder<boolean>;
245
+ declare const nullType: LiteralTypeDefBuilder<null>;
246
+ declare function nullable<T extends TypeDef>(nonNullable: Type<T>): UnionTypeDefBuilder<null, {
247
+ readonly ['0']: T;
248
+ readonly ['1']: LiteralTypeDef<null>;
249
+ }>;
250
+ declare function list<T extends TypeDef>(elements: Type<T>): ListTypeDefBuilder<{
251
+ readonly type: TypeDefType.List;
252
+ elements: T;
253
+ }>;
254
+ declare function record<V extends Type, K extends RecordKeyType>({ definition: typeDef }: V): RecordTypeDefBuilder<{
255
+ readonly type: TypeDefType.Record;
256
+ readonly keyPrototype: K;
257
+ valueTypeDef: V["definition"];
258
+ }>;
259
+ declare function object(): ObjectTypeDefBuilder<{}>;
260
+ declare function union<D extends null>(): UnionTypeDefBuilder<D, {}>;
261
+ declare function union<D extends string>(discriminator: D): UnionTypeDefBuilder<D, {}>;
262
+
263
+ type JsonPathsOf<T extends Type, SegmentOverride extends string | null = null, Prefix extends string = '$'> = InternalJsonPathsOf<T['definition'], Prefix, SegmentOverride, StartingDepth>;
264
+ type InternalJsonPathsOf<F extends TypeDef, Prefix extends string, SegmentOverride extends string | null, Depth extends number, NextDepth extends number = Depths[Depth]> = InternalJsonPathsOfChildren<F, Prefix, SegmentOverride, '', NextDepth> | Prefix;
265
+ type InternalJsonPathsOfChildren<F extends TypeDef, Prefix extends string, SegmentOverride extends string | null, Qualifier extends string, Depth extends number> = Depth extends -1 ? never : F extends LiteralTypeDef ? InternalJsonPathsOfLiteralChildren : F extends ListTypeDef ? InternalJsonPathsOfListChildren<F, Prefix, SegmentOverride, Depth> : F extends RecordTypeDef ? InternalJsonPathsOfRecordChildren<F, Prefix, SegmentOverride, Depth> : F extends ObjectTypeDef ? InternalJsonPathsOfObjectChildren<F, Prefix, SegmentOverride, Qualifier, Depth> : F extends UnionTypeDef ? InternalJsonPathsOfUnionChildren<F, Prefix, SegmentOverride, Qualifier, Depth> : never;
266
+ type InternalJsonPathsOfLiteralChildren = never;
267
+ type InternalJsonPathsOfListChildren<F extends ListTypeDef, Prefix extends string, SegmentOverride extends string | null, Depth extends number> = InternalJsonPathsOf<F['elements'], JsonPathOf<Prefix, number, SegmentOverride>, SegmentOverride, Depth>;
268
+ type InternalJsonPathsOfRecordChildren<F extends RecordTypeDef, Prefix extends string, SegmentOverride extends string | null, Depth extends number> = InternalJsonPathsOf<F['valueTypeDef'], JsonPathOf<Prefix, F['keyPrototype'], SegmentOverride>, SegmentOverride, Depth>;
269
+ type InternalJsonPathsOfObjectChildren<F extends ObjectTypeDef, Prefix extends string, SegmentOverride extends string | null, Qualifier extends string, Depth extends number> = F extends ObjectTypeDef<infer Fields> ? keyof Fields extends string ? {
270
+ [K in keyof Fields]: InternalJsonPathsOf<Fields[K], JsonPathOf<Prefix, `${Qualifier}${K}`, null>, SegmentOverride, Depth>;
271
+ }[keyof Fields] : never : never;
272
+ type InternalJsonPathsOfUnionChildren<F extends UnionTypeDef, Prefix extends string, SegmentOverride extends string | null, Qualifier extends string, Depth extends number> = F extends UnionTypeDef<infer D, infer Unions> ? keyof Unions extends string ? {
273
+ readonly [K in keyof Unions]: InternalJsonPathsOfChildren<Unions[K], Prefix, SegmentOverride, D extends null ? Qualifier : `${Qualifier}${K}:`, Depth>;
274
+ }[keyof Unions] : never : never;
275
+
276
+ type ValueToTypePathsOf<T extends StrictType, SegmentOverride extends string = '*', Path extends string = '$'> = SimplifyDeep<InternalFlattenedJsonPathsOf<T['definition'], SegmentOverride, Path, Path, StartingDepth>>;
277
+ type InternalFlattenedJsonPathsOf<T extends TypeDef, SegmentOverride extends string, ValuePath extends string, TypePath extends string, Depth extends number> = {
278
+ readonly [K in ValuePath]: TypePath;
279
+ } & InternalFlattenedJsonPathsOfChildren<T, SegmentOverride, ValuePath, TypePath, '', Depth>;
280
+ type InternalFlattenedJsonPathsOfChildren<T extends TypeDef, SegmentOverride extends string, ValuePath extends string, TypePath extends string, Qualifier extends string, Depth extends number, NextDepth extends number = Depths[Depth]> = NextDepth extends -1 ? never : T extends LiteralTypeDef ? InternalFlattenedJsonPathsOfLiteralChildren : T extends ListTypeDef ? InternalFlattenedJsonPathsOfListChildren<T, SegmentOverride, ValuePath, TypePath, NextDepth> : T extends RecordTypeDef ? InternalFlattenedJsonPathsOfRecordChildren<T, SegmentOverride, ValuePath, TypePath, NextDepth> : T extends ObjectTypeDef ? InternalFlattenedJsonPathsOfObjectChildren<T, SegmentOverride, ValuePath, TypePath, Qualifier, NextDepth> : T extends UnionTypeDef ? InternalFlattenedJsonPathsOfUnionChildren<T, SegmentOverride, ValuePath, TypePath, Qualifier, NextDepth> : never;
281
+ type InternalFlattenedJsonPathsOfLiteralChildren = {};
282
+ type InternalFlattenedJsonPathsOfListChildren<T extends ListTypeDef, SegmentOverride extends string, ValuePath extends string, TypePath extends string, Depth extends number> = InternalFlattenedJsonPathsOf<T['elements'], SegmentOverride, JsonPathOf<ValuePath, number>, JsonPathOf<TypePath, number, SegmentOverride>, Depth>;
283
+ type InternalFlattenedJsonPathsOfRecordChildren<T extends RecordTypeDef, SegmentOverride extends string, ValuePath extends string, TypePath extends string, Depth extends number> = InternalFlattenedJsonPathsOf<T['valueTypeDef'], SegmentOverride, JsonPathOf<ValuePath, T['keyPrototype']>, JsonPathOf<TypePath, T['keyPrototype'], SegmentOverride>, Depth>;
284
+ type InternalFlattenedJsonPathsOfObjectChildren<T extends ObjectTypeDef, SegmentOverride extends string, ValuePath extends string, TypePath extends string, Qualifier extends string, Depth extends number> = T extends ObjectTypeDef<infer Fields> ? keyof Fields extends string ? UnionToIntersection<{
285
+ readonly [K in keyof Fields]-?: InternalFlattenedJsonPathsOf<Exclude<Fields[K], undefined>, SegmentOverride, JsonPathOf<ValuePath, `${Qualifier}${K}`>, JsonPathOf<TypePath, `${Qualifier}${K}`>, Depth>;
286
+ }[keyof Fields]> : never : never;
287
+ type InternalFlattenedJsonPathsOfUnionChildren<T extends UnionTypeDef, SegmentOverride extends string, ValuePath extends string, TypePath extends string, Qualifier extends string, Depth extends number> = T extends UnionTypeDef<infer D, infer Unions> ? keyof Unions extends string ? D extends null ? UnionToIntersection<{
288
+ readonly [K in keyof Unions]: InternalFlattenedJsonPathsOfChildren<Unions[K], SegmentOverride, ValuePath, TypePath, '', Depth>;
289
+ }[keyof Unions]> : UnionToIntersection<{
290
+ readonly [K in keyof Unions]: InternalFlattenedJsonPathsOfChildren<Unions[K], SegmentOverride, ValuePath, TypePath, `${Qualifier}${K}:`, Depth>;
291
+ }[keyof Unions]> : never : never;
292
+
293
+ type ValueTypesOfDiscriminatedUnion<U extends UnionTypeDef> = U extends UnionTypeDef<infer D, infer Unions> ? D extends string ? {
294
+ [K in keyof Unions]: ValueTypeOf<{
295
+ definition: Unions[K];
296
+ }> & {
297
+ [KD in D]: K;
298
+ };
299
+ } : never : never;
300
+
301
+ export { type Accessor, type AnyValueType, type FlattenedAccessorsOf, type FlattenedTypeDefsOf, type FlattenedValueTypesOf, type InternalJsonPathsOf, type InternalValueTypeOf, type IsStrictUnion, type JsonPathsOf, type ListTypeDef, type LiteralTypeDef, type Mapper, type MobxObservable, type MobxValueTypeOf, type NonMobxObservable, type ObjectFieldKey, type ObjectTypeDef, type ObjectTypeDefFields, type ReadonlyTypeDefOf, type RecordKeyType, type RecordTypeDef, type Setter, type StrictListTypeDef, type StrictLiteralTypeDef, type StrictObjectTypeDef, type StrictRecordTypeDef, type StrictStructuredTypeDefFields, type StrictType, type StrictTypeDef, type StrictUnionTypeDef, type Type, type TypeDef, TypeDefType, type UnionKey, type UnionTypeDef, type ValueToTypePathsOf, type ValueTypeOf, type ValueTypesOfDiscriminatedUnion, booleanType, copy, flattenAccessorsOf, flattenJsonValueToTypePathsOf, flattenTypeDefsOf, flattenValueTypeTo, getUnionTypeDef, jsonPath, jsonPathPop, list, literal, mobxCopy, nullType, nullable, numberType, object, record, stringType, union, valuePathToTypePath };