@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,62 @@
1
+ import { type IsFieldReadonly } from '@strictly/base';
2
+ import { type ListTypeDef, type LiteralTypeDef, type ObjectFieldKey, type ObjectTypeDef, type RecordKeyType, type RecordTypeDef, type Type, type TypeDef, TypeDefType, type UnionKey, type UnionTypeDef } from './definitions';
3
+ declare class TypeDefBuilder<T extends TypeDef> implements Type<T> {
4
+ readonly definition: T;
5
+ constructor(definition: T);
6
+ get narrow(): Type<T>;
7
+ }
8
+ declare class LiteralTypeDefBuilder<T> extends TypeDefBuilder<LiteralTypeDef<T>> {
9
+ }
10
+ declare class ListTypeDefBuilder<T extends ListTypeDef> extends TypeDefBuilder<T> {
11
+ readonly(): ListTypeDefBuilder<{
12
+ readonly type: TypeDefType.List;
13
+ readonly elements: T['elements'];
14
+ }>;
15
+ }
16
+ declare class RecordTypeDefBuilder<T extends RecordTypeDef> extends TypeDefBuilder<T> {
17
+ partial(): IsFieldReadonly<T, 'valueTypeDef'> extends true ? RecordTypeDefBuilder<{
18
+ readonly type: TypeDefType.Record;
19
+ readonly keyPrototype: T['keyPrototype'];
20
+ readonly valueTypeDef: T['valueTypeDef'] | undefined;
21
+ }> : RecordTypeDefBuilder<{
22
+ readonly type: TypeDefType.Record;
23
+ readonly keyPrototype: T['keyPrototype'];
24
+ valueTypeDef: T['valueTypeDef'] | undefined;
25
+ }>;
26
+ readonly(): RecordTypeDefBuilder<{
27
+ readonly type: TypeDefType.Record;
28
+ readonly keyPrototype: T['keyPrototype'];
29
+ readonly valueTypeDef: T['valueTypeDef'];
30
+ }>;
31
+ }
32
+ declare class ObjectTypeDefBuilder<Fields extends Readonly<Record<ObjectFieldKey, TypeDef>> = {}> extends TypeDefBuilder<ObjectTypeDef<Fields>> {
33
+ set<Name extends string, T extends TypeDef>(name: Name, { definition: typeDef }: Type<T>): ObjectTypeDefBuilder<Fields & Record<Name, T>>;
34
+ setReadonly<Name extends string, T extends TypeDef>(name: Name, { definition: typeDef }: Type<T>): ObjectTypeDefBuilder<Fields & Readonly<Record<Name, T>>>;
35
+ setOptional<Name extends string, T extends TypeDef>(name: Name, { definition: typeDef }: Type<T>): ObjectTypeDefBuilder<Fields & Partial<Record<Name, T>>>;
36
+ setReadonlyOptional<Name extends string, T extends TypeDef>(name: Name, { definition: typeDef }: Type<T>): ObjectTypeDefBuilder<Fields & Partial<Readonly<Record<Name, T>>>>;
37
+ }
38
+ declare class UnionTypeDefBuilder<D extends string | null, U extends Record<UnionKey, TypeDef>> extends TypeDefBuilder<UnionTypeDef<D, U>> {
39
+ add<K extends Exclude<UnionKey, keyof U>, T extends TypeDef>(k: K, { definition: typeDef, }: Type<T>): UnionTypeDefBuilder<D, Readonly<Record<K, T>> & U>;
40
+ }
41
+ export declare function literal<T>(value?: [T]): LiteralTypeDefBuilder<T>;
42
+ export declare const stringType: LiteralTypeDefBuilder<string>;
43
+ export declare const numberType: LiteralTypeDefBuilder<number>;
44
+ export declare const booleanType: LiteralTypeDefBuilder<boolean>;
45
+ export declare const nullType: LiteralTypeDefBuilder<null>;
46
+ export declare function nullable<T extends TypeDef>(nonNullable: Type<T>): UnionTypeDefBuilder<null, {
47
+ readonly ['0']: T;
48
+ readonly ['1']: LiteralTypeDef<null>;
49
+ }>;
50
+ export declare function list<T extends TypeDef>(elements: Type<T>): ListTypeDefBuilder<{
51
+ readonly type: TypeDefType.List;
52
+ elements: T;
53
+ }>;
54
+ export declare function record<V extends Type, K extends RecordKeyType>({ definition: typeDef }: V): RecordTypeDefBuilder<{
55
+ readonly type: TypeDefType.Record;
56
+ readonly keyPrototype: K;
57
+ valueTypeDef: V["definition"];
58
+ }>;
59
+ export declare function object(): ObjectTypeDefBuilder<{}>;
60
+ export declare function union<D extends null>(): UnionTypeDefBuilder<D, {}>;
61
+ export declare function union<D extends string>(discriminator: D): UnionTypeDefBuilder<D, {}>;
62
+ export {};
@@ -0,0 +1,148 @@
1
+ import { TypeDefType, } from './definitions';
2
+ class TypeDefBuilder {
3
+ definition;
4
+ constructor(definition) {
5
+ this.definition = definition;
6
+ }
7
+ // returns just the relevant types, which can help typescript
8
+ // from complaining about infinitely deep data structures
9
+ get narrow() {
10
+ return {
11
+ definition: this.definition,
12
+ };
13
+ }
14
+ }
15
+ class LiteralTypeDefBuilder extends TypeDefBuilder {
16
+ }
17
+ class ListTypeDefBuilder extends TypeDefBuilder {
18
+ readonly() {
19
+ return this;
20
+ }
21
+ }
22
+ class RecordTypeDefBuilder extends TypeDefBuilder {
23
+ partial() {
24
+ return this;
25
+ }
26
+ readonly() {
27
+ return this;
28
+ }
29
+ }
30
+ class ObjectTypeDefBuilder extends TypeDefBuilder {
31
+ set(name, { definition: typeDef }) {
32
+ const newFields = {
33
+ [name]: typeDef,
34
+ };
35
+ // have to explicitly supply types as TS will infinitely recurse trying to infer them!
36
+ return new ObjectTypeDefBuilder({
37
+ type: TypeDefType.Object,
38
+ fields: {
39
+ ...this.definition.fields,
40
+ ...newFields,
41
+ },
42
+ });
43
+ }
44
+ setReadonly(name, { definition: typeDef }) {
45
+ const newFields = {
46
+ [name]: typeDef,
47
+ };
48
+ // have to explicitly supply types as TS will infinitely recurse trying to infer them!
49
+ return new ObjectTypeDefBuilder({
50
+ type: TypeDefType.Object,
51
+ fields: {
52
+ ...this.definition.fields,
53
+ ...newFields,
54
+ },
55
+ });
56
+ }
57
+ setOptional(name, { definition: typeDef }) {
58
+ const newFields = {
59
+ [name]: typeDef,
60
+ };
61
+ // have to explicitly supply types as TS will infinitely recurse trying to infer them!
62
+ return new ObjectTypeDefBuilder({
63
+ type: TypeDefType.Object,
64
+ fields: {
65
+ ...this.definition.fields,
66
+ ...newFields,
67
+ },
68
+ });
69
+ }
70
+ setReadonlyOptional(name, { definition: typeDef }) {
71
+ const newFields = {
72
+ [name]: typeDef,
73
+ };
74
+ // have to explicitly supply types as TS will infinitely recurse trying to infer them!
75
+ return new ObjectTypeDefBuilder({
76
+ type: TypeDefType.Object,
77
+ fields: {
78
+ ...this.definition.fields,
79
+ ...newFields,
80
+ },
81
+ });
82
+ }
83
+ }
84
+ class UnionTypeDefBuilder extends TypeDefBuilder {
85
+ add(k, { definition: typeDef, }) {
86
+ const { discriminator, unions, } = this.definition;
87
+ return new UnionTypeDefBuilder({
88
+ type: TypeDefType.Union,
89
+ discriminator: discriminator,
90
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
91
+ unions: {
92
+ ...unions,
93
+ [k]: typeDef,
94
+ },
95
+ });
96
+ }
97
+ }
98
+ export function literal(value) {
99
+ return new LiteralTypeDefBuilder({
100
+ type: TypeDefType.Literal,
101
+ valuePrototype: value,
102
+ });
103
+ }
104
+ export const stringType = literal();
105
+ export const numberType = literal();
106
+ export const booleanType = literal();
107
+ export const nullType = literal([null]);
108
+ export function nullable(nonNullable) {
109
+ return new UnionTypeDefBuilder({
110
+ type: TypeDefType.Union,
111
+ discriminator: null,
112
+ unions: {
113
+ ['0']: nonNullable.definition,
114
+ ['1']: nullType.definition,
115
+ },
116
+ });
117
+ }
118
+ export function list(elements) {
119
+ // have to explicitly supply types as TS will infinitely recurse trying to infer them!
120
+ return new ListTypeDefBuilder({
121
+ type: TypeDefType.List,
122
+ elements: elements.definition,
123
+ });
124
+ }
125
+ export function record({ definition: typeDef }) {
126
+ return new RecordTypeDefBuilder({
127
+ type: TypeDefType.Record,
128
+ // eslint-disable-next-line no-undefined
129
+ keyPrototype: undefined,
130
+ valueTypeDef: typeDef,
131
+ });
132
+ }
133
+ export function object() {
134
+ // have to explicitly supply types as TS will infinitely recurse trying to infer them!
135
+ return new ObjectTypeDefBuilder({
136
+ type: TypeDefType.Object,
137
+ fields: {},
138
+ });
139
+ }
140
+ export function union(discriminator) {
141
+ // have to explicitly supply types as TS will infinitely recurse trying to infer them!
142
+ return new UnionTypeDefBuilder({
143
+ type: TypeDefType.Union,
144
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
145
+ discriminator: (discriminator ?? null),
146
+ unions: {},
147
+ });
148
+ }
@@ -0,0 +1,41 @@
1
+ export type Type<T extends TypeDef = TypeDef> = {
2
+ readonly definition: T;
3
+ };
4
+ export type TypeDef = LiteralTypeDef | ListTypeDef | RecordTypeDef | ObjectTypeDef | UnionTypeDef;
5
+ export declare enum TypeDefType {
6
+ Literal = 1,
7
+ List = 2,
8
+ Record = 3,
9
+ Object = 4,
10
+ Union = 5
11
+ }
12
+ type AnyTypeDef = any;
13
+ export type LiteralTypeDef<V = any> = {
14
+ readonly type: TypeDefType.Literal;
15
+ readonly valuePrototype: [V];
16
+ };
17
+ export type ListTypeDef<E extends TypeDef = AnyTypeDef> = {
18
+ readonly type: TypeDefType.List;
19
+ readonly elements: E;
20
+ };
21
+ export type RecordKeyType = string | number;
22
+ export type RecordTypeDef<K extends RecordKeyType = RecordKeyType, V extends TypeDef | undefined = AnyTypeDef> = {
23
+ readonly type: TypeDefType.Record;
24
+ readonly keyPrototype: K;
25
+ readonly valueTypeDef: V;
26
+ };
27
+ export type ObjectFieldKey = string | number;
28
+ export type ObjectTypeDefFields = {
29
+ [Key: ObjectFieldKey]: AnyTypeDef;
30
+ };
31
+ export type ObjectTypeDef<Fields extends ObjectTypeDefFields = ObjectTypeDefFields> = {
32
+ readonly type: TypeDefType.Object;
33
+ readonly fields: Fields;
34
+ };
35
+ export type UnionKey = string;
36
+ export type UnionTypeDef<D extends string | null = string | null, U extends Readonly<Record<UnionKey, AnyTypeDef>> = Readonly<Record<UnionKey, AnyTypeDef>>> = {
37
+ readonly discriminator: D;
38
+ readonly type: TypeDefType.Union;
39
+ readonly unions: U;
40
+ };
41
+ export {};
@@ -0,0 +1,26 @@
1
+ // NOTE: this file, in conjunction with the types that derive information from these types, pushes the
2
+ // Typescript compiler to its absolute limit. It tends to be a death of 1000 cuts so no individual feature
3
+ // breaks it. When combined they hit some threshold (memory? performance? time?) beyond which the compiler
4
+ // gives up. To avoid problems try to follow these guidelines
5
+ // 1. Keep types as simple as possible.
6
+ // If you find yourself having to unwrap a bunch of boolean flags (for example) you're probably going to encounter issues
7
+ // 2. Only expose externally, and pass internally, the absolute minimum information information you need
8
+ // TS tends to get overwhelmed, where you can, narrow the types that are being returned to just the information
9
+ // the caller needs
10
+ // 3. Take advantage of helper functions to hide complexity/fragility from client code
11
+ // 4. Manually unroll complex operations
12
+ // Typescript can choke on things like the below, however you can manually do a full implementation where you
13
+ // check each type and return the appropriate value, and that seems to work.
14
+ // ```
15
+ // type HomogeneousFattenedValue<T extends TypeDef, V> = { [K in keyof FlattenedOf<T>]?: V }
16
+ // ```
17
+ // 5. Use longhand { [s: string]: number } instead of Record<string, number> when doing transformations and
18
+ // defining types
19
+ export var TypeDefType;
20
+ (function (TypeDefType) {
21
+ TypeDefType[TypeDefType["Literal"] = 1] = "Literal";
22
+ TypeDefType[TypeDefType["List"] = 2] = "List";
23
+ TypeDefType[TypeDefType["Record"] = 3] = "Record";
24
+ TypeDefType[TypeDefType["Object"] = 4] = "Object";
25
+ TypeDefType[TypeDefType["Union"] = 5] = "Union";
26
+ })(TypeDefType || (TypeDefType = {}));
@@ -0,0 +1,2 @@
1
+ export type StartingDepth = 8;
2
+ export type Depths = [-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13];
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,9 @@
1
+ import { type Type } from './definitions';
2
+ import { type FlattenedValueTypesOf } from './flattened_value_types_of';
3
+ export type Accessor<T = any> = {
4
+ readonly value: T;
5
+ set(v: T): void;
6
+ };
7
+ export type FlattenedAccessorsOf<T extends Type, Flattened extends Readonly<Record<string, Accessor>> = FlattenedValueTypesOf<T>> = {
8
+ readonly [K in keyof Flattened]: Accessor<Flattened[K]>;
9
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,21 @@
1
+ import { type UnionToIntersection } from 'type-fest';
2
+ import { type ListTypeDef, type LiteralTypeDef, type ObjectTypeDef, type RecordTypeDef, type Type, type TypeDef, type UnionTypeDef } from './definitions';
3
+ import { type Depths, type StartingDepth } from './flattened';
4
+ import { type JsonPathOf } from './json_path_of';
5
+ export type FlattenedTypeDefsOf<T extends Type, SegmentOverride extends string | null, Path extends string = '$', Depth extends number = StartingDepth> = InternalFlattenedTypeDefsOf<T['definition'], SegmentOverride, Path, '', Depth>;
6
+ type InternalFlattenedTypeDefsOf<T extends TypeDef, SegmentOverride extends string | null, Path extends string, Qualifier extends string, Depth extends number> = {
7
+ readonly [K in Path]: Type<T>;
8
+ } & InternalFlattenedTypeDefsOfChildren<T, SegmentOverride, Path, Qualifier, Depth>;
9
+ 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;
10
+ type InternalFlattenedTypeDefsOfLiteralChildren = {};
11
+ type InternalFlattenedTypeDefsOfListChildren<T extends ListTypeDef, SegmentOverride extends string | null, Path extends string, Depth extends number> = InternalFlattenedTypeDefsOf<T['elements'], SegmentOverride, JsonPathOf<Path, number, SegmentOverride>, '', Depth>;
12
+ 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>;
13
+ 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<{
14
+ readonly [K in keyof Fields]-?: InternalFlattenedTypeDefsOf<Exclude<Fields[K], undefined>, SegmentOverride, JsonPathOf<Path, `${Qualifier}${K}`, null>, '', Depth>;
15
+ }[keyof Fields]> : never : never;
16
+ 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<{
17
+ readonly [K in keyof Unions]: InternalFlattenedTypeDefsOfChildren<Unions[K], SegmentOverride, Path, '', Depth>;
18
+ }[keyof Unions]> : UnionToIntersection<{
19
+ readonly [K in keyof Unions]: InternalFlattenedTypeDefsOfChildren<Unions[K], SegmentOverride, Path, `${Qualifier}${K}:`, Depth>;
20
+ }[keyof Unions]> : never : never;
21
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,6 @@
1
+ import { type Type } from './definitions';
2
+ import { type FlattenedTypeDefsOf } from './flattened_type_defs_of';
3
+ import { type ValueTypeOf } from './value_type_of';
4
+ export type FlattenedValueTypesOf<T extends Type, SegmentOverride extends string | null = null, Flattened extends Readonly<Record<string, Type>> = FlattenedTypeDefsOf<T, SegmentOverride>> = {
5
+ [K in keyof Flattened]: ValueTypeOf<Flattened[K], {}>;
6
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export 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;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,16 @@
1
+ import { type ListTypeDef, type LiteralTypeDef, type ObjectTypeDef, type RecordTypeDef, type Type, type TypeDef, type UnionTypeDef } from './definitions';
2
+ import { type Depths, type StartingDepth } from './flattened';
3
+ import { type JsonPathOf } from './json_path_of';
4
+ export type JsonPathsOf<T extends Type, SegmentOverride extends string | null = null, Prefix extends string = '$'> = InternalJsonPathsOf<T['definition'], Prefix, SegmentOverride, StartingDepth>;
5
+ export 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;
6
+ 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;
7
+ type InternalJsonPathsOfLiteralChildren = never;
8
+ type InternalJsonPathsOfListChildren<F extends ListTypeDef, Prefix extends string, SegmentOverride extends string | null, Depth extends number> = InternalJsonPathsOf<F['elements'], JsonPathOf<Prefix, number, SegmentOverride>, SegmentOverride, Depth>;
9
+ 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>;
10
+ 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 ? {
11
+ [K in keyof Fields]: InternalJsonPathsOf<Fields[K], JsonPathOf<Prefix, `${Qualifier}${K}`, null>, SegmentOverride, Depth>;
12
+ }[keyof Fields] : never : never;
13
+ 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 ? {
14
+ readonly [K in keyof Unions]: InternalJsonPathsOfChildren<Unions[K], Prefix, SegmentOverride, D extends null ? Qualifier : `${Qualifier}${K}:`, Depth>;
15
+ }[keyof Unions] : never : never;
16
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,11 @@
1
+ import { type Type } from './definitions';
2
+ import { type ValueTypeOf } from './value_type_of';
3
+ declare const MOBX_OBSERVABLE_KEY = "___mobx_observable";
4
+ export type MobxObservable<T = {}> = {
5
+ [MOBX_OBSERVABLE_KEY]: true;
6
+ } & T;
7
+ export type NonMobxObservable<T = {}> = {
8
+ [MOBX_OBSERVABLE_KEY]?: never;
9
+ } & T;
10
+ export type MobxValueTypeOf<T extends Type> = ValueTypeOf<T, MobxObservable>;
11
+ export {};
@@ -0,0 +1,2 @@
1
+ const MOBX_OBSERVABLE_KEY = '___mobx_observable';
2
+ export {};
@@ -0,0 +1,40 @@
1
+ import { type ListTypeDef, type LiteralTypeDef, type ObjectTypeDef, type RecordTypeDef, type Type, type TypeDef, type TypeDefType, type UnionTypeDef } from './definitions';
2
+ export type PartialTypeDefOf<T extends Type> = {
3
+ readonly typeDef: InternalPartialAndNullableOf<T['definition']>;
4
+ };
5
+ type InternalPartialAndNullableOf<T extends TypeDef> = {
6
+ readonly type: TypeDefType.Union;
7
+ readonly discriminator: null;
8
+ readonly unions: {
9
+ readonly [0]: InternalPartialOf<T>;
10
+ readonly [1]: {
11
+ readonly type: TypeDefType.Literal;
12
+ readonly valuePrototype: [null];
13
+ };
14
+ };
15
+ };
16
+ type InternalPartialOf<T extends TypeDef> = T extends LiteralTypeDef ? InternalPartialOfLiteral<T> : T extends ListTypeDef ? InternalPartialOfList<T> : T extends RecordTypeDef ? InternalPartialOfRecord<T> : T extends ObjectTypeDef ? InternalPartialOfObject<T> : T extends UnionTypeDef ? InternalPartialOfUnion<T> : never;
17
+ type InternalPartialOfLiteral<T extends LiteralTypeDef> = T;
18
+ type InternalPartialOfList<T extends ListTypeDef> = {
19
+ readonly type: T['type'];
20
+ readonly elements: InternalPartialAndNullableOf<T['elements']>;
21
+ };
22
+ type InternalPartialOfRecord<T extends RecordTypeDef> = {
23
+ readonly type: T['type'];
24
+ readonly keyPrototype: T['keyPrototype'];
25
+ readonly valueTypeDef: InternalPartialAndNullableOf<T['valueTypeDef']> | undefined;
26
+ };
27
+ type InternalPartialOfObject<T extends ObjectTypeDef> = T extends ObjectTypeDef<infer Fields> ? {
28
+ readonly type: T['type'];
29
+ readonly fields: {
30
+ [K in keyof Fields]+?: InternalPartialAndNullableOf<Fields[K]>;
31
+ };
32
+ } : never;
33
+ type InternalPartialOfUnion<T extends UnionTypeDef> = T extends UnionTypeDef<infer D, infer Unions> ? {
34
+ readonly type: T['type'];
35
+ readonly discriminator: D;
36
+ readonly unions: {
37
+ [K in keyof Unions]: InternalPartialOf<Unions[K]>;
38
+ };
39
+ } : never;
40
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,29 @@
1
+ import { type ListTypeDef, type LiteralTypeDef, type ObjectTypeDef, type RecordTypeDef, type Type, type TypeDef, type UnionTypeDef } from './definitions';
2
+ export type ReadonlyTypeDefOf<T extends Type> = {
3
+ readonly definition: InternalReadonlyTypeDefOf<T['definition']>;
4
+ };
5
+ 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;
6
+ type InternalReadonlyTypeDefOfLiteral<T extends LiteralTypeDef> = T;
7
+ type InternalReadonlyTypeDefOfList<T extends ListTypeDef> = {
8
+ readonly type: T['type'];
9
+ readonly elements: InternalReadonlyTypeDefOf<T['elements']>;
10
+ };
11
+ type InternalReadonlyTypeDefOfRecord<T extends RecordTypeDef> = {
12
+ readonly type: T['type'];
13
+ readonly keyPrototype: T['keyPrototype'];
14
+ readonly valueTypeDef: undefined extends T['valueTypeDef'] ? InternalReadonlyTypeDefOf<Exclude<T['valueTypeDef'], undefined>> | undefined : InternalReadonlyTypeDefOf<T['valueTypeDef']>;
15
+ };
16
+ type InternalReadonlyTypeDefOfObject<T extends ObjectTypeDef> = T extends ObjectTypeDef<infer Fields> ? {
17
+ readonly type: T['type'];
18
+ readonly fields: {
19
+ readonly [K in keyof Fields]: InternalReadonlyTypeDefOf<Fields[K]>;
20
+ };
21
+ } : never;
22
+ type InternalReadonlyTypeDefOfUnion<T extends UnionTypeDef> = T extends UnionTypeDef<infer D, infer Unions> ? {
23
+ readonly type: T['type'];
24
+ readonly discriminator: D;
25
+ readonly unions: {
26
+ readonly [K in keyof Unions]: InternalReadonlyTypeDefOf<Unions[K]>;
27
+ };
28
+ } : never;
29
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,93 @@
1
+ import { booleanType, list, nullable, numberType, object, record, stringType, union, } from 'types/builders';
2
+ describe('builder', function () {
3
+ describe('literal', function () {
4
+ const { definition: typeDef } = numberType;
5
+ it('equals expected type', function () {
6
+ expectTypeOf(typeDef).toEqualTypeOf();
7
+ });
8
+ describe('nullable', function () {
9
+ const { definition: typeDef } = nullable(numberType);
10
+ it('equals expected type', function () {
11
+ expectTypeOf(typeDef).toEqualTypeOf();
12
+ });
13
+ });
14
+ });
15
+ describe('list', function () {
16
+ describe('numeric list', function () {
17
+ describe('mutable', function () {
18
+ const { definition: typeDef } = list(numberType);
19
+ it('equals expected type', function () {
20
+ expectTypeOf(typeDef).toEqualTypeOf();
21
+ });
22
+ });
23
+ });
24
+ describe('readonly', function () {
25
+ const { definition: typeDef } = list(numberType).readonly();
26
+ it('equals expected type', function () {
27
+ expectTypeOf(typeDef).toEqualTypeOf();
28
+ });
29
+ });
30
+ });
31
+ describe('record', function () {
32
+ describe('numeric record', function () {
33
+ describe('mutable', function () {
34
+ const { definition: typeDef } = record(numberType);
35
+ it('equals expected type', function () {
36
+ expectTypeOf(typeDef).toEqualTypeOf();
37
+ });
38
+ });
39
+ describe('readonly', function () {
40
+ const { definition: typeDef } = record(numberType).readonly();
41
+ it('equals expected type', function () {
42
+ expectTypeOf(typeDef).toEqualTypeOf();
43
+ });
44
+ });
45
+ describe('partial', function () {
46
+ const { definition: typeDef } = record(numberType).partial();
47
+ it('equals expected type', function () {
48
+ expectTypeOf(typeDef).toEqualTypeOf();
49
+ });
50
+ });
51
+ describe('partial readonly', function () {
52
+ const { definition: typeDef } = record(numberType).partial().readonly();
53
+ it('equals expected type', function () {
54
+ expectTypeOf(typeDef).toEqualTypeOf();
55
+ });
56
+ });
57
+ describe('readonly partial', function () {
58
+ const { definition: typeDef } = record(numberType).readonly().partial();
59
+ it('equals expected type', function () {
60
+ expectTypeOf(typeDef).toEqualTypeOf();
61
+ });
62
+ });
63
+ });
64
+ });
65
+ describe('object', function () {
66
+ const { definition: typeDef } = object()
67
+ .set('a', numberType)
68
+ .setReadonly('b', booleanType)
69
+ .setOptional('c', stringType)
70
+ .setReadonlyOptional('d', numberType);
71
+ it('equals expected type', function () {
72
+ expectTypeOf(typeDef).toEqualTypeOf();
73
+ });
74
+ });
75
+ describe('union', function () {
76
+ describe('literals', function () {
77
+ const { definition: typeDef, } = union()
78
+ .add('1', numberType)
79
+ .add('2', stringType);
80
+ it('equals expected type', function () {
81
+ expectTypeOf(typeDef).toEqualTypeOf();
82
+ });
83
+ });
84
+ describe('objects', function () {
85
+ const { definition: typeDef, } = union()
86
+ .add('1', object().set('a', booleanType))
87
+ .add('2', object().set('b', numberType));
88
+ it('equals expected type', function () {
89
+ expectTypeOf(typeDef).toEqualTypeOf();
90
+ });
91
+ });
92
+ });
93
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,11 @@
1
+ import { numberType, record, } from 'types/builders';
2
+ describe('FlattenedAccessorsOf', function () {
3
+ // note we only test a small example since most of the work is done in flatten
4
+ describe('record', function () {
5
+ const builder = record(numberType);
6
+ let v;
7
+ it('equals expected type', function () {
8
+ expectTypeOf(v).toEqualTypeOf();
9
+ });
10
+ });
11
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,71 @@
1
+ import { booleanType, list, numberType, object, record, stringType, union, } from 'types/builders';
2
+ describe('FlattenedTypeDefsOf', function () {
3
+ describe('literal', function () {
4
+ let t;
5
+ it('equals expected type', function () {
6
+ expectTypeOf(t).toEqualTypeOf();
7
+ });
8
+ });
9
+ describe('list', function () {
10
+ const builder = list(numberType);
11
+ let t;
12
+ it('equals expected type', function () {
13
+ expectTypeOf(t).toEqualTypeOf();
14
+ });
15
+ });
16
+ describe('record', function () {
17
+ const builder = record(numberType);
18
+ let t;
19
+ it('equals expected type', function () {
20
+ expectTypeOf(t).toEqualTypeOf();
21
+ });
22
+ });
23
+ describe('object', function () {
24
+ describe('simple', function () {
25
+ const builder = object()
26
+ .set('a', numberType)
27
+ .setOptional('b', stringType)
28
+ .setReadonly('c', booleanType)
29
+ .setReadonlyOptional('d', stringType);
30
+ let t;
31
+ it('equals expected type', function () {
32
+ expectTypeOf(t).toEqualTypeOf();
33
+ });
34
+ });
35
+ });
36
+ });
37
+ describe('union', function () {
38
+ describe('overlapping', function () {
39
+ describe('non-discriminated', function () {
40
+ const builder = union()
41
+ .add('x', object().set('a', booleanType))
42
+ .add('y', object().set('b', numberType));
43
+ let t;
44
+ it('equals expected type', function () {
45
+ expectTypeOf(t).toEqualTypeOf();
46
+ });
47
+ });
48
+ describe('discriminated', function () {
49
+ const builder = union('x')
50
+ .add('1', object().set('a', booleanType))
51
+ .add('2', object().set('a', numberType));
52
+ let t;
53
+ it('equals expected type', function () {
54
+ expectTypeOf(t).toEqualTypeOf();
55
+ });
56
+ });
57
+ describe('nested discriminated', function () {
58
+ const builder = union('x')
59
+ .add('1', union('y')
60
+ .add('p', object().set('a', booleanType))
61
+ .add('q', object().set('a', stringType)))
62
+ .add('2', union('z')
63
+ .add('r', object().set('b', numberType))
64
+ .add('s', object().set('c', stringType)));
65
+ let t;
66
+ it('equals expected type', function () {
67
+ expectTypeOf(t).toEqualTypeOf();
68
+ });
69
+ });
70
+ });
71
+ });