@ddd-ts/shape 0.0.36 → 0.0.38

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 (94) hide show
  1. package/LICENSE +21 -0
  2. package/dist/_.d.ts +6 -6
  3. package/dist/_.d.ts.map +1 -1
  4. package/dist/_.js +34 -51
  5. package/dist/_.mjs +36 -0
  6. package/dist/addons/microsecond-timestamp.js +62 -75
  7. package/dist/addons/microsecond-timestamp.mjs +61 -0
  8. package/dist/choice.d.ts +1 -1
  9. package/dist/choice.d.ts.map +1 -1
  10. package/dist/choice.js +43 -48
  11. package/dist/choice.mjs +44 -0
  12. package/dist/class.d.ts +1 -1
  13. package/dist/class.d.ts.map +1 -1
  14. package/dist/class.js +29 -30
  15. package/dist/class.mjs +30 -0
  16. package/dist/dict.d.ts +1 -1
  17. package/dist/dict.d.ts.map +1 -1
  18. package/dist/dict.js +40 -46
  19. package/dist/dict.mjs +41 -0
  20. package/dist/discriminated-union.d.ts +2 -2
  21. package/dist/discriminated-union.d.ts.map +1 -1
  22. package/dist/discriminated-union.js +59 -90
  23. package/dist/discriminated-union.mjs +64 -0
  24. package/dist/either.d.ts +2 -2
  25. package/dist/either.d.ts.map +1 -1
  26. package/dist/either.js +50 -61
  27. package/dist/either.mjs +51 -0
  28. package/dist/index.js +32 -30
  29. package/dist/index.mjs +15 -0
  30. package/dist/literal.d.ts +1 -1
  31. package/dist/literal.d.ts.map +1 -1
  32. package/dist/literal.js +26 -26
  33. package/dist/literal.mjs +27 -0
  34. package/dist/mapping.d.ts +1 -1
  35. package/dist/mapping.d.ts.map +1 -1
  36. package/dist/mapping.js +44 -49
  37. package/dist/mapping.mjs +45 -0
  38. package/dist/multiple.d.ts +1 -1
  39. package/dist/multiple.d.ts.map +1 -1
  40. package/dist/multiple.js +118 -119
  41. package/dist/multiple.mjs +119 -0
  42. package/dist/nothing.d.ts +1 -1
  43. package/dist/nothing.d.ts.map +1 -1
  44. package/dist/nothing.js +18 -18
  45. package/dist/nothing.mjs +19 -0
  46. package/dist/optional.d.ts +1 -1
  47. package/dist/optional.d.ts.map +1 -1
  48. package/dist/optional.js +33 -40
  49. package/dist/optional.mjs +34 -0
  50. package/dist/primitive.d.ts +1 -1
  51. package/dist/primitive.d.ts.map +1 -1
  52. package/dist/primitive.js +29 -32
  53. package/dist/primitive.mjs +30 -0
  54. package/dist/test.d.ts +1 -1
  55. package/dist/test.d.ts.map +1 -1
  56. package/package.json +21 -10
  57. package/dist/_.js.map +0 -1
  58. package/dist/addons/microsecond-timestamp.js.map +0 -1
  59. package/dist/choice.js.map +0 -1
  60. package/dist/choice.spec.js +0 -147
  61. package/dist/choice.spec.js.map +0 -1
  62. package/dist/class.js.map +0 -1
  63. package/dist/class.spec.js +0 -39
  64. package/dist/class.spec.js.map +0 -1
  65. package/dist/dict.js.map +0 -1
  66. package/dist/dict.spec.js +0 -180
  67. package/dist/dict.spec.js.map +0 -1
  68. package/dist/discriminated-union.js.map +0 -1
  69. package/dist/discriminated-union.spec.js +0 -262
  70. package/dist/discriminated-union.spec.js.map +0 -1
  71. package/dist/either.js.map +0 -1
  72. package/dist/either.spec.js +0 -232
  73. package/dist/either.spec.js.map +0 -1
  74. package/dist/index.js.map +0 -1
  75. package/dist/literal.js.map +0 -1
  76. package/dist/literal.spec.js +0 -162
  77. package/dist/literal.spec.js.map +0 -1
  78. package/dist/mapping.js.map +0 -1
  79. package/dist/mapping.spec.js +0 -207
  80. package/dist/mapping.spec.js.map +0 -1
  81. package/dist/multiple.js.map +0 -1
  82. package/dist/multiple.spec.js +0 -207
  83. package/dist/multiple.spec.js.map +0 -1
  84. package/dist/nothing.js.map +0 -1
  85. package/dist/nothing.spec.js +0 -172
  86. package/dist/nothing.spec.js.map +0 -1
  87. package/dist/optional.js.map +0 -1
  88. package/dist/optional.spec.js +0 -172
  89. package/dist/optional.spec.js.map +0 -1
  90. package/dist/primitive.js.map +0 -1
  91. package/dist/primitive.spec.js +0 -162
  92. package/dist/primitive.spec.js.map +0 -1
  93. package/dist/test.js +0 -45
  94. package/dist/test.js.map +0 -1
@@ -1,262 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const dict_1 = require("./dict");
4
- const test_1 = require("./test");
5
- const discriminated_union_1 = require("./discriminated-union");
6
- describe("DiscriminatedUnion", () => {
7
- it("class definition with two arguments", () => {
8
- class A extends (0, dict_1.Dict)({ type: "A", a: String }) {
9
- }
10
- const B = (0, dict_1.Dict)({ type: "B", b: Number });
11
- const C = { type: "C", c: Boolean };
12
- class Test extends (0, discriminated_union_1.DiscriminatedUnion)([A, B, C]) {
13
- test = true;
14
- }
15
- // Constructor parameters
16
- (0, test_1.ex)(Test).toHaveFirstParam().ok;
17
- // Deserialization
18
- (0, test_1.ex)(Test.deserialize).toHaveFirstParam().ok;
19
- const a = Test.deserialize({ type: "A", a: "test" });
20
- (0, test_1.ex)(a).toBeInstanceOf(Test).ok;
21
- // Additional prototype
22
- (0, test_1.ex)(a.test).toBe(true).ok;
23
- // Inherited prototype on deserialization
24
- (0, test_1.ex)(a.value).toStrictEqual(new A({ type: "A", a: "test" })).ok;
25
- // Serialization
26
- (0, test_1.ex)(a.serialize()).toStrictEqual({
27
- type: "A",
28
- a: "test",
29
- }).ok;
30
- // Instantiation
31
- const b = new Test(new A({ type: "A", a: "test" }));
32
- (0, test_1.ex)(b).toBeInstanceOf(Test).ok;
33
- // Inherited prototype on instantiation
34
- (0, test_1.ex)(b.value).toStrictEqual(new A({ type: "A", a: "test" })).ok;
35
- const c = new Test({ type: "B", b: 2 });
36
- (0, test_1.ex)(c).toBeInstanceOf(Test).ok;
37
- (0, test_1.ex)(c.value).toStrictEqual({ type: "B", b: 2 }).ok;
38
- (0, test_1.ex)(c.serialize()).toStrictEqual({ type: "B", b: 2 }).ok;
39
- const c2 = Test.deserialize({ type: "B", b: 2 });
40
- (0, test_1.ex)(c2).toBeInstanceOf(Test).ok;
41
- (0, test_1.ex)(c2.value).toStrictEqual({ type: "B", b: 2 }).ok;
42
- (0, test_1.ex)(c2.serialize()).toStrictEqual({ type: "B", b: 2 }).ok;
43
- const d = new Test({ type: "C", c: true });
44
- (0, test_1.ex)(d).toBeInstanceOf(Test).ok;
45
- (0, test_1.ex)(d.value).toStrictEqual({ type: "C", c: true }).ok;
46
- (0, test_1.ex)(d.serialize()).toStrictEqual({ type: "C", c: true }).ok;
47
- const d2 = Test.deserialize({ type: "C", c: true });
48
- (0, test_1.ex)(d2).toBeInstanceOf(Test).ok;
49
- (0, test_1.ex)(d2.value).toStrictEqual({ type: "C", c: true }).ok;
50
- (0, test_1.ex)(d2.serialize()).toStrictEqual({ type: "C", c: true }).ok;
51
- });
52
- it("class definition with constructors", () => {
53
- class A extends (0, dict_1.Dict)({ type: "A", a: String }) {
54
- }
55
- class B {
56
- static type = "B";
57
- type;
58
- a;
59
- constructor({ type, a }) {
60
- Object.assign(this, { type, a });
61
- }
62
- static deserialize({ type, a }) {
63
- return new B({ type, a });
64
- }
65
- serialize() {
66
- return { type: this.type, a: this.a };
67
- }
68
- }
69
- class Test extends (0, discriminated_union_1.DiscriminatedUnion)([A, B]) {
70
- test = true;
71
- }
72
- // Constructor parameters
73
- (0, test_1.ex)(Test).toHaveFirstParam().ok;
74
- // Deserialization
75
- (0, test_1.ex)(Test.deserialize).toHaveFirstParam().ok;
76
- const a = Test.deserialize({ type: "A", a: "a" });
77
- (0, test_1.ex)(a).toBeInstanceOf(Test).ok;
78
- const b = Test.deserialize({ type: "B", a: "b" });
79
- (0, test_1.ex)(b).toBeInstanceOf(Test).ok;
80
- // Additional prototype
81
- (0, test_1.ex)(a.match({
82
- A: () => true,
83
- B: () => false,
84
- })).toBe(true).ok;
85
- (0, test_1.ex)(a.match({
86
- _: () => true,
87
- })).toBe(true).ok;
88
- (0, test_1.ex)(a.match({
89
- B: () => true,
90
- }, () => false)).toBe(false).ok;
91
- (0, test_1.ex)(a.test).toBe(true).ok;
92
- // Inherited prototype on deserialization
93
- (0, test_1.ex)(a.value).toBeInstanceOf(A).ok;
94
- (0, test_1.ex)(b.value).toBeInstanceOf(B).ok;
95
- // Serialization
96
- (0, test_1.ex)(a.serialize()).toStrictEqual({ type: "A", a: "a" }).ok;
97
- (0, test_1.ex)(b.serialize()).toStrictEqual({ type: "B", a: "b" }).ok;
98
- // Instantiation
99
- const c = new Test(new A({ type: "A", a: "aa" }));
100
- (0, test_1.ex)(c).toBeInstanceOf(Test).ok;
101
- const d = new Test(new B({ type: "B", a: "bb" }));
102
- (0, test_1.ex)(d).toBeInstanceOf(Test).ok;
103
- // Inherited prototype
104
- (0, test_1.ex)(c.value).toBeInstanceOf(A).ok;
105
- (0, test_1.ex)(c.value.a).toBe("aa").ok;
106
- (0, test_1.ex)(d.value).toBeInstanceOf(B).ok;
107
- (0, test_1.ex)(d.value.a).toBe("bb").ok;
108
- });
109
- it("inline definition", () => {
110
- class A extends (0, dict_1.Dict)({ type: "A", a: String }) {
111
- }
112
- const B = (0, dict_1.Dict)({ type: "B", b: Number });
113
- class Test extends (0, dict_1.Dict)({ nested: (0, discriminated_union_1.DiscriminatedUnion)([A, B]) }) {
114
- }
115
- // Constructor parameters
116
- (0, test_1.ex)(Test).toHaveFirstParam().ok;
117
- // Deserialization
118
- (0, test_1.ex)(Test.deserialize).toHaveFirstParam().ok;
119
- const a = Test.deserialize({ nested: { type: "A", a: "test" } });
120
- (0, test_1.ex)(a).toBeInstanceOf(Test).ok;
121
- // Inherited prototype on deserialization
122
- (0, test_1.ex)(a.nested).toStrictEqual(new A({ type: "A", a: "test" })).ok;
123
- // Serialization
124
- (0, test_1.ex)(a.serialize()).toStrictEqual({
125
- nested: { type: "A", a: "test" },
126
- }).ok;
127
- // Instantiation
128
- const b = new Test({ nested: { type: "B", b: 0 } });
129
- (0, test_1.ex)(b).toBeInstanceOf(Test).ok;
130
- // Inherited prototype on instantiation
131
- (0, test_1.ex)(b.nested).toStrictEqual({ type: "B", b: 0 }).ok;
132
- });
133
- it("referenced definition", () => {
134
- class A extends (0, dict_1.Dict)({ type: "A" }) {
135
- }
136
- class B extends (0, dict_1.Dict)({ type: "B" }) {
137
- }
138
- class Union extends (0, discriminated_union_1.DiscriminatedUnion)([A, B]) {
139
- }
140
- class Test extends (0, dict_1.Dict)({ nested: Union }) {
141
- }
142
- // Constructor parameters
143
- (0, test_1.ex)(Test).toHaveFirstParam().ok;
144
- // Deserialization
145
- (0, test_1.ex)(Test.deserialize).toHaveFirstParam().ok;
146
- const a = Test.deserialize({ nested: { type: "A" } });
147
- (0, test_1.ex)(a).toBeInstanceOf(Test).ok;
148
- // Inherited prototype on deserialization
149
- (0, test_1.ex)(a.nested).toBeInstanceOf(Union).ok;
150
- (0, test_1.ex)(a.nested.value).toStrictEqual(new A({ type: "A" })).ok;
151
- // Serialization
152
- (0, test_1.ex)(a.serialize()).toStrictEqual({ nested: { type: "A" } }).ok;
153
- // Instantiation
154
- const b = new Test({ nested: new Union(new A({ type: "A" })) });
155
- (0, test_1.ex)(b).toBeInstanceOf(Test).ok;
156
- // Inherited prototype on instantiation
157
- (0, test_1.ex)(b.nested.value).toStrictEqual(new A({ type: "A" })).ok;
158
- });
159
- it("mixin extension", () => {
160
- const Mixin = (config) => {
161
- class Mix extends (0, discriminated_union_1.DiscriminatedUnion)(config) {
162
- deep = true;
163
- static deep = true;
164
- }
165
- return Mix;
166
- };
167
- class A extends (0, dict_1.Dict)({ type: "A" }) {
168
- }
169
- class B extends (0, dict_1.Dict)({ type: "B" }) {
170
- }
171
- class Test extends Mixin([A, B]) {
172
- test = true;
173
- // @ts-expect-error is not assignable to parameter of type 'true'
174
- abstract = false;
175
- }
176
- // Constructor parameters
177
- (0, test_1.ex)(Test).toHaveFirstParam().ok;
178
- // Additional static prototype
179
- (0, test_1.ex)(Test.deep).toBe(true).ok;
180
- // Deserialization
181
- (0, test_1.ex)(Test.deserialize).toHaveFirstParam().ok;
182
- const a = Test.deserialize({ type: "A" });
183
- (0, test_1.ex)(a).toBeInstanceOf(Test).ok;
184
- // Additional prototype on deserialization
185
- (0, test_1.ex)(a.test).toBe(true).ok;
186
- (0, test_1.ex)(a.abstract).toBe(false).ok;
187
- // Extended prototype on deserialization
188
- (0, test_1.ex)(a.deep).toBe(true).ok;
189
- // Inherited prototype on deserialization
190
- (0, test_1.ex)(a.value).toStrictEqual(new A({ type: "A" })).ok;
191
- // Serialization
192
- (0, test_1.ex)(a.serialize()).toStrictEqual({ type: "A" }).ok;
193
- // Instantiation
194
- const b = new Test(new B({ type: "B" }));
195
- (0, test_1.ex)(b).toBeInstanceOf(Test).ok;
196
- // Additional prototype on instantiation
197
- (0, test_1.ex)(b.test).toBe(true).ok;
198
- (0, test_1.ex)(b.abstract).toBe(false).ok;
199
- // Extended prototype on instantiation
200
- (0, test_1.ex)(b.deep).toBe(true).ok;
201
- // Inherited prototype on instantiation
202
- (0, test_1.ex)(b.value).toStrictEqual(new B({ type: "B" })).ok;
203
- });
204
- it("mixin supersede", () => {
205
- const Testable = (config) => {
206
- class I {
207
- deep = true;
208
- static deep = true;
209
- }
210
- return (0, discriminated_union_1.DiscriminatedUnion)(config, I);
211
- };
212
- class A extends (0, dict_1.Dict)({ type: "A" }) {
213
- }
214
- class B extends (0, dict_1.Dict)({ type: "B" }) {
215
- }
216
- class Test extends Testable([A, B]) {
217
- test = true;
218
- // @ts-expect-error is not assignable to parameter of type 'true'
219
- abstract = false;
220
- }
221
- // Constructor type
222
- (0, test_1.ex)(Test).toHaveFirstParam().ok;
223
- // Additional static prototype
224
- (0, test_1.ex)(Test.deep).toBe(true).ok;
225
- // Deserialization
226
- (0, test_1.ex)(Test.deserialize).toHaveFirstParam().ok;
227
- const a = Test.deserialize({ type: "A" });
228
- (0, test_1.ex)(a).toBeInstanceOf(Test).ok;
229
- // Additional prototype on deserialization
230
- (0, test_1.ex)(a.test).toBe(true).ok;
231
- (0, test_1.ex)(a.abstract).toBe(false).ok;
232
- // Superseded prototype on deserialization
233
- (0, test_1.ex)(a.deep).toBe(true).ok;
234
- // Inherited prototype on deserialization
235
- (0, test_1.ex)(a.value).toStrictEqual(new A({ type: "A" })).ok;
236
- // Serialization
237
- (0, test_1.ex)(a.serialize()).toStrictEqual({
238
- type: "A",
239
- }).ok;
240
- // Instantiation
241
- const b = new Test(new B({ type: "B" }));
242
- (0, test_1.ex)(b).toBeInstanceOf(Test).ok;
243
- // Additional prototype on instantiation
244
- (0, test_1.ex)(b.test).toBe(true).ok;
245
- (0, test_1.ex)(b.abstract).toBe(false).ok;
246
- // Superseded prototype on instantiation
247
- (0, test_1.ex)(b.deep).toBe(true).ok;
248
- (0, test_1.ex)(b.abstract).toBe(false).ok;
249
- // Inherited prototype on instantiation
250
- (0, test_1.ex)(b.value).toStrictEqual(new B({ type: "B" })).ok;
251
- });
252
- });
253
- // making the config `as const` breaks the freeze command
254
- // This enforces the use of `as const` in the discriminator
255
- // This is ugly
256
- class A extends (0, discriminated_union_1.DiscriminatedUnion)([
257
- { type: "A" },
258
- { type: "B" },
259
- ]) {
260
- }
261
- const _shouldBeFreezable = true;
262
- //# sourceMappingURL=discriminated-union.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"discriminated-union.spec.js","sourceRoot":"","sources":["../src/discriminated-union.spec.ts"],"names":[],"mappings":"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","sourcesContent":["import { Dict } from \"./dict\";\nimport { ex, type Equals } from \"./test\";\nimport {\n DiscriminatedUnion,\n DiscriminatedUnionConfiguration,\n} from \"./discriminated-union\";\n\ndescribe(\"DiscriminatedUnion\", () => {\n it(\"class definition with two arguments\", () => {\n class A extends Dict({ type: \"A\", a: String }) {}\n const B = Dict({ type: \"B\", b: Number });\n const C = { type: \"C\" as const, c: Boolean };\n\n class Test extends DiscriminatedUnion([A, B, C]) {\n test = true as const;\n }\n\n type Inlined = A | { type: \"B\"; b: number } | { type: \"C\"; c: boolean };\n type Serialized =\n | { type: \"A\"; a: string }\n | { type: \"B\"; b: number }\n | { type: \"C\"; c: boolean };\n\n // Constructor parameters\n ex(Test).toHaveFirstParam<Inlined>().ok;\n\n // Deserialization\n ex(Test.deserialize).toHaveFirstParam<Serialized>().ok;\n const a = Test.deserialize({ type: \"A\", a: \"test\" });\n ex(a).toBeInstanceOf(Test).ok;\n\n // Additional prototype\n ex(a.test).toBe(true as const).ok;\n\n // Inherited prototype on deserialization\n ex(a.value).toStrictEqual<Inlined>(new A({ type: \"A\", a: \"test\" })).ok;\n\n // Serialization\n ex(a.serialize()).toStrictEqual<Serialized>({\n type: \"A\",\n a: \"test\",\n }).ok;\n\n // Instantiation\n const b = new Test(new A({ type: \"A\", a: \"test\" }));\n ex(b).toBeInstanceOf(Test).ok;\n\n // Inherited prototype on instantiation\n ex(b.value).toStrictEqual<Inlined>(new A({ type: \"A\", a: \"test\" })).ok;\n\n const c = new Test({ type: \"B\", b: 2 });\n ex(c).toBeInstanceOf(Test).ok;\n ex(c.value).toStrictEqual<Inlined>({ type: \"B\", b: 2 }).ok;\n ex(c.serialize()).toStrictEqual<Serialized>({ type: \"B\", b: 2 }).ok;\n\n const c2 = Test.deserialize({ type: \"B\", b: 2 });\n ex(c2).toBeInstanceOf(Test).ok;\n ex(c2.value).toStrictEqual<Inlined>({ type: \"B\", b: 2 }).ok;\n ex(c2.serialize()).toStrictEqual<Serialized>({ type: \"B\", b: 2 }).ok;\n\n const d = new Test({ type: \"C\", c: true });\n ex(d).toBeInstanceOf(Test).ok;\n ex(d.value).toStrictEqual<Inlined>({ type: \"C\", c: true }).ok;\n ex(d.serialize()).toStrictEqual<Serialized>({ type: \"C\", c: true }).ok;\n\n const d2 = Test.deserialize({ type: \"C\", c: true });\n ex(d2).toBeInstanceOf(Test).ok;\n ex(d2.value).toStrictEqual<Inlined>({ type: \"C\", c: true }).ok;\n ex(d2.serialize()).toStrictEqual<Serialized>({ type: \"C\", c: true }).ok;\n });\n\n it(\"class definition with constructors\", () => {\n class A extends Dict({ type: \"A\", a: String }) {}\n class B {\n static type = \"B\" as const;\n type!: \"B\";\n a!: string;\n constructor({ type, a }: { type: \"B\"; a: string }) {\n Object.assign(this, { type, a });\n }\n\n static deserialize({ type, a }: { type: \"B\"; a: string }) {\n return new B({ type, a });\n }\n\n serialize() {\n return { type: this.type, a: this.a };\n }\n }\n\n class Test extends DiscriminatedUnion([A, B]) {\n test = true as const;\n }\n\n type Serialized = { type: \"A\"; a: string } | { type: \"B\"; a: string };\n\n // Constructor parameters\n ex(Test).toHaveFirstParam<A | B>().ok;\n\n // Deserialization\n ex(Test.deserialize).toHaveFirstParam<Serialized>().ok;\n const a = Test.deserialize({ type: \"A\", a: \"a\" });\n ex(a).toBeInstanceOf(Test).ok;\n const b = Test.deserialize({ type: \"B\", a: \"b\" });\n ex(b).toBeInstanceOf(Test).ok;\n\n // Additional prototype\n ex(\n a.match({\n A: () => true as const,\n B: () => false as const,\n }),\n ).toBe<true | false>(true as const).ok;\n ex(\n a.match({\n _: () => true as const,\n }),\n ).toBe<true>(true as const).ok;\n ex(\n a.match(\n {\n B: () => true as const,\n },\n () => false as const,\n ),\n ).toBe<true | false>(false as const).ok;\n\n ex(a.test).toBe(true as const).ok;\n // Inherited prototype on deserialization\n ex(a.value).toBeInstanceOf<typeof A | typeof B>(A).ok;\n ex(b.value).toBeInstanceOf<typeof A | typeof B>(B).ok;\n\n // Serialization\n ex(a.serialize()).toStrictEqual<Serialized>({ type: \"A\", a: \"a\" }).ok;\n ex(b.serialize()).toStrictEqual<Serialized>({ type: \"B\", a: \"b\" }).ok;\n\n // Instantiation\n const c = new Test(new A({ type: \"A\", a: \"aa\" }));\n ex(c).toBeInstanceOf(Test).ok;\n\n const d = new Test(new B({ type: \"B\", a: \"bb\" }));\n ex(d).toBeInstanceOf(Test).ok;\n\n // Inherited prototype\n ex(c.value).toBeInstanceOf<typeof A | typeof B>(A).ok;\n ex(c.value.a).toBe(\"aa\").ok;\n\n ex(d.value).toBeInstanceOf<typeof A | typeof B>(B).ok;\n ex(d.value.a).toBe(\"bb\").ok;\n });\n\n it(\"inline definition\", () => {\n class A extends Dict({ type: \"A\", a: String }) {}\n const B = Dict({ type: \"B\", b: Number });\n\n class Test extends Dict({ nested: DiscriminatedUnion([A, B]) }) {}\n\n type Inlined = { nested: A | { type: \"B\"; b: number } };\n type Serialized = {\n nested: { type: \"A\"; a: string } | { type: \"B\"; b: number };\n };\n\n // Constructor parameters\n ex(Test).toHaveFirstParam<Inlined>().ok;\n\n // Deserialization\n ex(Test.deserialize).toHaveFirstParam<Serialized>().ok;\n const a: Test = Test.deserialize({ nested: { type: \"A\", a: \"test\" } });\n ex(a).toBeInstanceOf(Test).ok;\n\n // Inherited prototype on deserialization\n ex(a.nested).toStrictEqual<Inlined[\"nested\"]>(\n new A({ type: \"A\", a: \"test\" }),\n ).ok;\n\n // Serialization\n ex(a.serialize()).toStrictEqual<Serialized>({\n nested: { type: \"A\", a: \"test\" },\n }).ok;\n\n // Instantiation\n const b = new Test({ nested: { type: \"B\", b: 0 } });\n ex(b).toBeInstanceOf(Test).ok;\n\n // Inherited prototype on instantiation\n ex(b.nested).toStrictEqual<Inlined[\"nested\"]>({ type: \"B\", b: 0 }).ok;\n });\n\n it(\"referenced definition\", () => {\n class A extends Dict({ type: \"A\" }) {}\n class B extends Dict({ type: \"B\" }) {}\n\n class Union extends DiscriminatedUnion([A, B]) {}\n class Test extends Dict({ nested: Union }) {}\n\n type Serialized = { nested: { type: \"A\" } | { type: \"B\" } };\n\n // Constructor parameters\n ex(Test).toHaveFirstParam<{ nested: Union }>().ok;\n\n // Deserialization\n ex(Test.deserialize).toHaveFirstParam<Serialized>().ok;\n const a: Test = Test.deserialize({ nested: { type: \"A\" } });\n ex(a).toBeInstanceOf(Test).ok;\n\n // Inherited prototype on deserialization\n ex(a.nested).toBeInstanceOf(Union).ok;\n ex(a.nested.value).toStrictEqual<Union[\"value\"]>(new A({ type: \"A\" })).ok;\n\n // Serialization\n ex(a.serialize()).toStrictEqual<Serialized>({ nested: { type: \"A\" } }).ok;\n\n // Instantiation\n const b: Test = new Test({ nested: new Union(new A({ type: \"A\" })) });\n ex(b).toBeInstanceOf(Test).ok;\n\n // Inherited prototype on instantiation\n ex(b.nested.value).toStrictEqual<A | B>(new A({ type: \"A\" })).ok;\n });\n\n it(\"mixin extension\", () => {\n const Mixin = <const S extends DiscriminatedUnionConfiguration>(\n config: S,\n ) => {\n abstract class Mix extends DiscriminatedUnion(config) {\n deep = true as const;\n static deep = true as const;\n abstract abstract: true;\n }\n\n return Mix;\n };\n\n class A extends Dict({ type: \"A\" }) {}\n class B extends Dict({ type: \"B\" }) {}\n\n class Test extends Mixin([A, B]) {\n test = true as const;\n\n // @ts-expect-error is not assignable to parameter of type 'true'\n abstract = false as const;\n }\n\n type Serialized = { type: \"A\" } | { type: \"B\" };\n\n // Constructor parameters\n ex(Test).toHaveFirstParam<A | B>().ok;\n\n // Additional static prototype\n ex(Test.deep).toBe(true as const).ok;\n\n // Deserialization\n ex(Test.deserialize).toHaveFirstParam<Serialized>().ok;\n const a = Test.deserialize({ type: \"A\" });\n ex(a).toBeInstanceOf(Test).ok;\n\n // Additional prototype on deserialization\n ex(a.test).toBe(true as const).ok;\n ex(a.abstract).toBe(false as const).ok;\n\n // Extended prototype on deserialization\n ex(a.deep).toBe(true as const).ok;\n\n // Inherited prototype on deserialization\n ex(a.value).toStrictEqual<A | B>(new A({ type: \"A\" })).ok;\n\n // Serialization\n ex(a.serialize()).toStrictEqual<Serialized>({ type: \"A\" }).ok;\n\n // Instantiation\n const b = new Test(new B({ type: \"B\" }));\n ex(b).toBeInstanceOf(Test).ok;\n\n // Additional prototype on instantiation\n ex(b.test).toBe(true as const).ok;\n ex(b.abstract).toBe(false as const).ok;\n\n // Extended prototype on instantiation\n ex(b.deep).toBe(true as const).ok;\n\n // Inherited prototype on instantiation\n ex(b.value).toStrictEqual<A | B>(new B({ type: \"B\" })).ok;\n });\n\n it(\"mixin supersede\", () => {\n const Testable = <const C extends DiscriminatedUnionConfiguration>(\n config: C,\n ) => {\n abstract class I {\n deep = true as const;\n static deep = true as const;\n\n abstract abstract: true;\n }\n\n return DiscriminatedUnion(config, I);\n };\n\n class A extends Dict({ type: \"A\" }) {}\n class B extends Dict({ type: \"B\" }) {}\n\n class Test extends Testable([A, B]) {\n test = true as const;\n\n // @ts-expect-error is not assignable to parameter of type 'true'\n abstract = false as const;\n }\n\n // Constructor type\n ex(Test).toHaveFirstParam<A | B>().ok;\n\n // Additional static prototype\n ex(Test.deep).toBe(true as const).ok;\n\n type Serialized = { type: \"A\" } | { type: \"B\" };\n\n // Deserialization\n ex(Test.deserialize).toHaveFirstParam<Serialized>().ok;\n const a = Test.deserialize({ type: \"A\" });\n ex(a).toBeInstanceOf(Test).ok;\n\n // Additional prototype on deserialization\n ex(a.test).toBe(true as const).ok;\n ex(a.abstract).toBe(false as const).ok;\n\n // Superseded prototype on deserialization\n ex(a.deep).toBe(true as const).ok;\n\n // Inherited prototype on deserialization\n ex(a.value).toStrictEqual<A | B>(new A({ type: \"A\" })).ok;\n\n // Serialization\n ex(a.serialize()).toStrictEqual<Serialized>({\n type: \"A\",\n }).ok;\n\n // Instantiation\n const b = new Test(new B({ type: \"B\" }));\n ex(b).toBeInstanceOf(Test).ok;\n\n // Additional prototype on instantiation\n ex(b.test).toBe(true as const).ok;\n ex(b.abstract).toBe(false as const).ok;\n\n // Superseded prototype on instantiation\n ex(b.deep).toBe(true as const).ok;\n ex(b.abstract).toBe(false as const).ok;\n\n // Inherited prototype on instantiation\n ex(b.value).toStrictEqual<A | B>(new B({ type: \"B\" })).ok;\n });\n});\n\n// making the config `as const` breaks the freeze command\n// This enforces the use of `as const` in the discriminator\n// This is ugly\nclass A extends DiscriminatedUnion([\n { type: \"A\" as const },\n { type: \"B\" as const },\n]) {}\nconst _shouldBeFreezable: Equals<\n (typeof A)[\"$of\"],\n ({ type: \"A\" } | { type: \"B\" })[]\n> = true;\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"either.js","sourceRoot":"","sources":["../src/either.ts"],"names":[],"mappings":";;;AAAA,0BAOa;AA2CN,MAAM,MAAM,GAAG,CAIpB,EAAK,EACL,OAAU,QAAY,EACtB,EAAE;IAOF,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CACpC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;QACtC,OAAO,CAAC,GAAG,EAAE,IAAA,QAAK,EAAC,KAAK,CAAC,CAAU,CAAC;IACtC,CAAC,CAAC,CACH,CAAC;IAEF,MAAe,OAAQ,SAAS,IAA+B;QAC1C;QAAnB,YAAmB,KAAa;YAC9B,KAAK,EAAE,CAAC;YADS,UAAK,GAAL,KAAK,CAAQ;QAEhC,CAAC;QAED,MAAM,CAAC,UAAU,CAAa;QAE9B,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC;QAEf,MAAM,CAAC,MAAM,GAAG,QAAiB,CAAC;QAElC,SAAS;YACP,OAAQ,OAAe,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAQ,CAAC;QACxD,CAAC;QAED,KAAK,CAcH,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAqB;YAM1C,MAAM,GAAG,GAAQ,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CACtC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAO,IAAI,CAAC,KAAa,CAAC,WAAmB,CAC3D,EAAE,CAAC,CAAC,CAAQ,CAAC;YAEd,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;YAC7B,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,OAAO,CAAC,IAAI,CAAC,KAAY,CAAC,CAAC;YACpC,CAAC;YACD,IAAI,QAAQ,EAAE,CAAC;gBACb,OAAO,QAAQ,CAAC,IAAI,CAAC,KAAY,CAAC,CAAC;YACrC,CAAC;YACD,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC;gBACd,OAAO,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAY,CAAC,CAAC;YACtC,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAC1C,CAAC;QAED,MAAM,CAAC,WAAW,CAEhB,KAAyB;YAEzB,OAAO,IAAK,IAAY,CAAC,IAAI,CAAC,YAAY,CAAC,KAAY,CAAC,CAAQ,CAAC;QACnE,CAAC;QAED,MAAM,CAAC,YAAY,CAEjB,KAAiB;YAEjB,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,UAAU,EAAE,GAAG,KAAY,CAAC;YAClD,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;YACpC,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;YAC/C,CAAC;YACD,OAAQ,UAAkB,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;QACtD,CAAC;QAED,MAAM,CAAC,UAAU,CAEf,KAAa;YAEb,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CACjC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAO,KAAa,CAAC,WAAmB,CACtD,EAAE,CAAC,CAAC,CAAC,CAAC;YACP,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;YAC9D,CAAC;YAED,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;YACpC,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;YAC7C,CAAC;YACD,OAAO,EAAE,GAAI,UAAkB,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,GAAG,EAAS,CAAC;QACxE,CAAC;QAED,MAAM,CAAC,OAAO,CAAS;;IAUzB,OAAO,OAAiB,CAAC;AAC3B,CAAC,CAAC;AAvHW,QAAA,MAAM,UAuHjB","sourcesContent":["import {\n Constructor,\n Expand,\n DefinitionOf,\n Shape,\n AbstractConstructor,\n Empty,\n} from \"./_\";\nimport { ClassShorthand } from \"./class\";\nimport { PrimitiveShorthand } from \"./primitive\";\n\ntype Config = { [key: string]: any };\n\ntype ExhaustiveMatcher<C extends Config> = {\n [key in keyof C]: (value: InstanceType<C[key]>) => any;\n};\n\ntype UnsafeFallthroughMatcher<C extends Config> = {\n [key in keyof C]?: (value: InstanceType<C[key]>) => any;\n} & {\n _: (value: InstanceType<C[keyof C]>) => any;\n};\n\ntype PartialMatcher<C extends Config> = {\n [key in keyof C]?: (value: InstanceType<C[key]>) => any;\n};\n\ntype Matcher<C extends Config> =\n | ExhaustiveMatcher<C>\n | UnsafeFallthroughMatcher<C>\n | PartialMatcher<C>;\n\nexport type EitherConfiguration = {\n [key: string]: ClassShorthand;\n};\n\ntype Internal<\n S extends EitherConfiguration,\n B extends AbstractConstructor<{}>,\n> = {\n Definition: DefinitionOf<S[keyof S]>;\n Serialized: (B extends { $name: infer U } ? { $name: U } : {}) & {\n _key: keyof S;\n } & ReturnType<DefinitionOf<S[keyof S]>[\"$serialize\"]>;\n Deserializing: (B extends { $name: infer U } ? { $name: U } : {}) & {\n _key: keyof S;\n } & Parameters<DefinitionOf<S[keyof S]>[\"$deserialize\"]>[0];\n Inline: DefinitionOf<S[keyof S]>[\"$inline\"];\n};\n\nexport const Either = <\n const S extends EitherConfiguration,\n const B extends AbstractConstructor<{}> = typeof Empty,\n>(\n of: S,\n base: B = Empty as any,\n) => {\n type Serialized = {\n [K in keyof S]: { _key: K } & ReturnType<DefinitionOf<S[K]>[\"$serialize\"]>;\n }[keyof S];\n\n type Inline = DefinitionOf<S[keyof S]>[\"$inline\"];\n\n const definitions = Object.fromEntries(\n Object.entries(of).map(([key, value]) => {\n return [key, Shape(value)] as const;\n }),\n );\n\n abstract class $Either extends (base as any as Constructor<{}>) {\n constructor(public value: Inline) {\n super();\n }\n\n static serialized: Serialized;\n\n static of = of;\n\n static $shape = \"either\" as const;\n\n serialize(): Expand<Serialized> {\n return ($Either as any).$serialize(this.value) as any;\n }\n\n match<\n M extends Matcher<S>,\n F extends M extends ExhaustiveMatcher<S>\n ? []\n : M extends UnsafeFallthroughMatcher<S>\n ? []\n : M extends PartialMatcher<S>\n ? [\n fallback: (\n value: InstanceType<Omit<S, keyof M>[keyof Omit<S, keyof M>]>,\n ) => any,\n ]\n : [],\n >(\n ...[matcher, fallback]: [matcher: M, ...F]\n ):\n | (M[keyof M] extends (...args: any[]) => any\n ? ReturnType<M[keyof M]>\n : never)\n | (F[0] extends (...args: any[]) => any ? ReturnType<F[0]> : never) {\n const key: any = Object.entries(of).find(\n ([_, v]) => v === ((this.value as any).constructor as any),\n )?.[0] as any;\n\n const handler = matcher[key];\n if (handler) {\n return handler(this.value as any);\n }\n if (fallback) {\n return fallback(this.value as any);\n }\n if (matcher._) {\n return matcher._(this.value as any);\n }\n throw new Error(\"Non-exhaustive match\");\n }\n\n static deserialize<T extends typeof $Either>(\n this: T,\n value: Expand<Serialized>,\n ): InstanceType<T> {\n return new (this as any)(this.$deserialize(value as any)) as any;\n }\n\n static $deserialize<T extends typeof $Either>(\n this: T,\n value: Serialized,\n ): Inline {\n const { _key: key, ...serialized } = value as any;\n const definition = definitions[key];\n if (!definition) {\n throw new Error(\"Cannot deserialize Either\");\n }\n return (definition as any).$deserialize(serialized);\n }\n\n static $serialize<T extends typeof $Either>(\n this: T,\n value: Inline,\n ): Serialized {\n const key = Object.entries(of).find(\n ([_, v]) => v === ((value as any).constructor as any),\n )?.[0];\n if (!key) {\n throw new Error(\"Cannot serialize Either, no matching key\");\n }\n\n const definition = definitions[key];\n if (!definition) {\n throw new Error(\"Cannot serialize Either\");\n }\n return { ...(definition as any).$serialize(value), _key: key } as any;\n }\n\n static $inline: Inline;\n }\n\n type EitherConstructor = abstract new (\n value: Expand<Inline>,\n ) => InstanceType<B> & $Either;\n type Either = Omit<B, \"prototype\"> &\n Omit<typeof $Either, \"prototype\"> &\n EitherConstructor;\n\n return $Either as Either;\n};\n\nexport type Either<\n S extends EitherConfiguration,\n B extends AbstractConstructor<{}> = typeof Empty,\n> = Omit<B, \"prototype\"> &\n (abstract new (\n value: Internal<S, B>[\"Inline\"],\n ) => {\n value: Internal<S, B>[\"Inline\"];\n serialize(): Internal<S, B>[\"Serialized\"];\n match<\n M extends Matcher<S>,\n F extends M extends ExhaustiveMatcher<S>\n ? []\n : M extends UnsafeFallthroughMatcher<S>\n ? []\n : M extends PartialMatcher<S>\n ? [\n fallback: (\n value: InstanceType<Omit<S, keyof M>[keyof Omit<S, keyof M>]>,\n ) => any,\n ]\n : [],\n >(\n matcher: M,\n ...fallback_n: F\n ):\n | (M[keyof M] extends (...args: any[]) => any\n ? ReturnType<M[keyof M]>\n : never)\n | (F[0] extends (...args: any[]) => any ? ReturnType<F[0]> : never);\n }) & {\n serialized: Internal<S, B>[\"Serialized\"];\n of: S;\n $shape: \"either\";\n deserialize<T extends Constructor>(\n this: T,\n value: Internal<S, B>[\"Serialized\"],\n ): InstanceType<T>;\n $deserialize<T>(\n this: T,\n value: Internal<S, B>[\"Serialized\"],\n ): Internal<S, B>[\"Inline\"];\n $serialize<T>(\n this: T,\n value: Internal<S, B>[\"Inline\"],\n ): Internal<S, B>[\"Serialized\"];\n $inline: Internal<S, B>[\"Inline\"];\n };\n"]}
@@ -1,232 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const either_1 = require("./either");
4
- const dict_1 = require("./dict");
5
- const test_1 = require("./test");
6
- const _1 = require("./_");
7
- describe("Either", () => {
8
- it("class definition with two arguments", () => {
9
- class A extends (0, _1.Shape)({ value: Number }) {
10
- }
11
- class B extends (0, _1.Shape)({ value: String }) {
12
- }
13
- class Test extends (0, either_1.Either)({ A, B }) {
14
- test = true;
15
- }
16
- // Constructor parameters
17
- (0, test_1.ex)(Test).toHaveFirstParam().ok;
18
- // Deserialization
19
- (0, test_1.ex)(Test.deserialize).toHaveFirstParam().ok;
20
- const a = Test.deserialize({ _key: "A", value: 1 });
21
- (0, test_1.ex)(a).toBeInstanceOf(Test).ok;
22
- // Additional prototype
23
- (0, test_1.ex)(a.test).toBe(true).ok;
24
- // Inherited prototype on deserialization
25
- (0, test_1.ex)(a.value).toStrictEqual(new A({ value: 1 })).ok;
26
- // Serialization
27
- (0, test_1.ex)(a.serialize()).toStrictEqual({ _key: "A", value: 1 }).ok;
28
- // Instantiation
29
- const b = new Test(new B({ value: "1" }));
30
- (0, test_1.ex)(b).toBeInstanceOf(Test).ok;
31
- // Inherited prototype on instantiation
32
- (0, test_1.ex)(b.value).toStrictEqual(new B({ value: "1" })).ok;
33
- });
34
- it("class definition with constructors", () => {
35
- class A extends (0, dict_1.Dict)({ a: String }) {
36
- }
37
- class B {
38
- a;
39
- constructor({ a }) {
40
- Object.assign(this, { a });
41
- }
42
- static deserialize({ a }) {
43
- return new B({ a });
44
- }
45
- serialize() {
46
- return { a: this.a };
47
- }
48
- }
49
- class Test extends (0, either_1.Either)({ A, B }) {
50
- test = true;
51
- }
52
- // Constructor parameters
53
- (0, test_1.ex)(Test).toHaveFirstParam().ok;
54
- // Deserialization
55
- (0, test_1.ex)(Test.deserialize).toHaveFirstParam().ok;
56
- const a = Test.deserialize({ _key: "A", a: "test" });
57
- (0, test_1.ex)(a).toBeInstanceOf(Test).ok;
58
- const b = Test.deserialize({ _key: "B", a: "test" });
59
- (0, test_1.ex)(b).toBeInstanceOf(Test).ok;
60
- // Additional prototype
61
- (0, test_1.ex)(a.match({
62
- A: () => true,
63
- B: () => false,
64
- })).toBe(true).ok;
65
- (0, test_1.ex)(a.match({
66
- _: () => true,
67
- })).toBe(true).ok;
68
- (0, test_1.ex)(a.match({
69
- B: () => true,
70
- }, () => false)).toBe(false).ok;
71
- (0, test_1.ex)(a.test).toBe(true).ok;
72
- // Inherited prototype on deserialization
73
- (0, test_1.ex)(a.value).toBeInstanceOf(A).ok;
74
- (0, test_1.ex)(b.value).toBeInstanceOf(B).ok;
75
- // Serialization
76
- (0, test_1.ex)(a.serialize()).toStrictEqual({ _key: "A", a: "test" }).ok;
77
- (0, test_1.ex)(b.serialize()).toStrictEqual({ _key: "B", a: "test" }).ok;
78
- // Instantiation
79
- const c = new Test(new A({ a: "test" }));
80
- (0, test_1.ex)(c).toBeInstanceOf(Test).ok;
81
- const d = new Test(new B({ a: "test" }));
82
- (0, test_1.ex)(d).toBeInstanceOf(Test).ok;
83
- // Inherited prototype
84
- (0, test_1.ex)(c.value).toBeInstanceOf(A).ok;
85
- (0, test_1.ex)(c.value.a).toBe("test").ok;
86
- (0, test_1.ex)(d.value).toBeInstanceOf(B).ok;
87
- (0, test_1.ex)(d.value.a).toBe("test").ok;
88
- });
89
- it("inline definition", () => {
90
- class A extends (0, _1.Shape)({ value: Number }) {
91
- }
92
- class B extends (0, _1.Shape)({ value: String }) {
93
- }
94
- class Test extends (0, dict_1.Dict)({ nested: (0, either_1.Either)({ A, B }) }) {
95
- }
96
- // Constructor parameters
97
- (0, test_1.ex)(Test).toHaveFirstParam().ok;
98
- // Deserialization
99
- (0, test_1.ex)(Test.deserialize).toHaveFirstParam().ok;
100
- const a = Test.deserialize({ nested: { _key: "A", value: 1 } });
101
- (0, test_1.ex)(a).toBeInstanceOf(Test).ok;
102
- // Inherited prototype on deserialization
103
- (0, test_1.ex)(a.nested).toStrictEqual(new A({ value: 1 })).ok;
104
- // Serialization
105
- (0, test_1.ex)(a.serialize()).toStrictEqual({ nested: { _key: "A", value: 1 } })
106
- .ok;
107
- // Instantiation
108
- const b = new Test({ nested: new B({ value: "1" }) });
109
- (0, test_1.ex)(b).toBeInstanceOf(Test).ok;
110
- // Inherited prototype on instantiation
111
- (0, test_1.ex)(b.nested).toStrictEqual(new B({ value: "1" })).ok;
112
- });
113
- it("referenced definition", () => {
114
- class B extends (0, _1.Shape)({ value: Number }) {
115
- }
116
- class C extends (0, _1.Shape)({ value: String }) {
117
- }
118
- class A extends (0, either_1.Either)({ B, C }) {
119
- }
120
- class Test extends (0, dict_1.Dict)({ nested: A }) {
121
- }
122
- // Constructor parameters
123
- (0, test_1.ex)(Test).toHaveFirstParam().ok;
124
- // Deserialization
125
- (0, test_1.ex)(Test.deserialize).toHaveFirstParam().ok;
126
- const a = Test.deserialize({ nested: { _key: "B", "value": 1 } });
127
- (0, test_1.ex)(a).toBeInstanceOf(Test).ok;
128
- // Inherited prototype on deserialization
129
- (0, test_1.ex)(a.nested).toBeInstanceOf(A).ok;
130
- (0, test_1.ex)(a.nested.value).toStrictEqual(new B({ value: 1 })).ok;
131
- // Serialization
132
- (0, test_1.ex)(a.serialize()).toStrictEqual({ nested: { _key: "B", value: 1 } })
133
- .ok;
134
- // Instantiation
135
- const b = new Test({ nested: new A(new C({ value: "1" })) });
136
- (0, test_1.ex)(b).toBeInstanceOf(Test).ok;
137
- // Inherited prototype on instantiation
138
- (0, test_1.ex)(b.nested.value).toStrictEqual(new C({ value: "1" })).ok;
139
- });
140
- it("mixin extension", () => {
141
- const Mixin = (either) => {
142
- class Mix extends (0, either_1.Either)(either) {
143
- deep = true;
144
- static deep = true;
145
- }
146
- return Mix;
147
- };
148
- class A extends (0, _1.Shape)({ value: Number }) {
149
- }
150
- class B extends (0, _1.Shape)({ value: String }) {
151
- }
152
- class Test extends Mixin({ A, B }) {
153
- test = true;
154
- // @ts-expect-error is not assignable to parameter of type 'true'
155
- abstract = false;
156
- }
157
- // Constructor parameters
158
- (0, test_1.ex)(Test).toHaveFirstParam().ok;
159
- // Additional static prototype
160
- (0, test_1.ex)(Test.deep).toBe(true).ok;
161
- // Deserialization
162
- (0, test_1.ex)(Test.deserialize).toHaveFirstParam().ok;
163
- const a = Test.deserialize({ _key: "A", value: 1 });
164
- (0, test_1.ex)(a).toBeInstanceOf(Test).ok;
165
- // Additional prototype on deserialization
166
- (0, test_1.ex)(a.test).toBe(true).ok;
167
- (0, test_1.ex)(a.abstract).toBe(false).ok;
168
- // Extended prototype on deserialization
169
- (0, test_1.ex)(a.deep).toBe(true).ok;
170
- // Inherited prototype on deserialization
171
- (0, test_1.ex)(a.value).toStrictEqual(new A({ value: 1 })).ok;
172
- // Serialization
173
- (0, test_1.ex)(a.serialize()).toStrictEqual({ _key: "A", value: 1 }).ok;
174
- // Instantiation
175
- const b = new Test(new B({ value: "1" }));
176
- (0, test_1.ex)(b).toBeInstanceOf(Test).ok;
177
- // Additional prototype on instantiation
178
- (0, test_1.ex)(b.test).toBe(true).ok;
179
- (0, test_1.ex)(b.abstract).toBe(false).ok;
180
- // Extended prototype on instantiation
181
- (0, test_1.ex)(b.deep).toBe(true).ok;
182
- // Inherited prototype on instantiation
183
- (0, test_1.ex)(b.value).toStrictEqual(new B({ value: "1" })).ok;
184
- });
185
- it("mixin supersede", () => {
186
- const Testable = (config) => {
187
- class I {
188
- deep = true;
189
- static deep = true;
190
- }
191
- return (0, either_1.Either)(config, I);
192
- };
193
- class A extends (0, _1.Shape)({ value: Number }) {
194
- }
195
- class B extends (0, _1.Shape)({ value: String }) {
196
- }
197
- class Test extends Testable({ A, B }) {
198
- test = true;
199
- // @ts-expect-error is not assignable to parameter of type 'true'
200
- abstract = false;
201
- }
202
- // Constructor type
203
- (0, test_1.ex)(Test).toHaveFirstParam().ok;
204
- // Additional static prototype
205
- (0, test_1.ex)(Test.deep).toBe(true).ok;
206
- // Deserialization
207
- (0, test_1.ex)(Test.deserialize).toHaveFirstParam().ok;
208
- const a = Test.deserialize({ _key: "A", value: 1 });
209
- (0, test_1.ex)(a).toBeInstanceOf(Test).ok;
210
- // Additional prototype on deserialization
211
- (0, test_1.ex)(a.test).toBe(true).ok;
212
- (0, test_1.ex)(a.abstract).toBe(false).ok;
213
- // Superseded prototype on deserialization
214
- (0, test_1.ex)(a.deep).toBe(true).ok;
215
- // Inherited prototype on deserialization
216
- (0, test_1.ex)(a.value).toStrictEqual(new A({ value: 1 })).ok;
217
- // Serialization
218
- (0, test_1.ex)(a.serialize()).toStrictEqual({ _key: "A", value: 1 }).ok;
219
- // Instantiation
220
- const b = new Test(new B({ value: "1" }));
221
- (0, test_1.ex)(b).toBeInstanceOf(Test).ok;
222
- // Additional prototype on instantiation
223
- (0, test_1.ex)(b.test).toBe(true).ok;
224
- (0, test_1.ex)(b.abstract).toBe(false).ok;
225
- // Superseded prototype on instantiation
226
- (0, test_1.ex)(b.deep).toBe(true).ok;
227
- (0, test_1.ex)(b.abstract).toBe(false).ok;
228
- // Inherited prototype on instantiation
229
- (0, test_1.ex)(b.value).toStrictEqual(new B({ value: "1" })).ok;
230
- });
231
- });
232
- //# sourceMappingURL=either.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"either.spec.js","sourceRoot":"","sources":["../src/either.spec.ts"],"names":[],"mappings":"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","sourcesContent":["import { Either, EitherConfiguration } from \"./either\";\nimport { Dict } from \"./dict\";\nimport { ex } from \"./test\";\nimport { Shape } from \"./_\";\n\ndescribe(\"Either\", () => {\n it(\"class definition with two arguments\", () => {\n class A extends Shape({ value: Number }) { }\n class B extends Shape({ value: String }) { }\n class Test extends Either({ A, B }) {\n test = true as const;\n }\n\n type Serialized = { _key: \"A\", value: number } | { _key: \"B\", value: string };\n\n // Constructor parameters\n ex(Test).toHaveFirstParam<A | B>().ok;\n\n // Deserialization\n ex(Test.deserialize).toHaveFirstParam<Serialized>().ok;\n const a = Test.deserialize({ _key: \"A\", value: 1 });\n ex(a).toBeInstanceOf(Test).ok;\n\n // Additional prototype\n ex(a.test).toBe(true as const).ok;\n\n // Inherited prototype on deserialization\n ex(a.value).toStrictEqual<A | B>(new A({ value: 1 })).ok;\n\n // Serialization\n ex(a.serialize()).toStrictEqual<Serialized>({ _key: \"A\", value: 1 }).ok;\n\n // Instantiation\n const b = new Test(new B({ value: \"1\" }));\n ex(b).toBeInstanceOf(Test).ok;\n\n // Inherited prototype on instantiation\n ex(b.value).toStrictEqual<A | B>(new B({ value: \"1\" })).ok;\n });\n\n it(\"class definition with constructors\", () => {\n class A extends Dict({ a: String }) { }\n class B {\n a!: string;\n constructor({ a }: { a: string }) {\n Object.assign(this, { a });\n }\n\n static deserialize({ a }: { a: string }) {\n return new B({ a });\n }\n\n serialize() {\n return { a: this.a };\n }\n }\n\n class Test extends Either({ A, B }) {\n test = true as const;\n }\n\n type Serialized = { _key: \"A\", a: string } | { _key: \"B\", a: string };\n\n // Constructor parameters\n ex(Test).toHaveFirstParam<A | B>().ok;\n\n // Deserialization\n ex(Test.deserialize).toHaveFirstParam<Serialized>().ok;\n const a = Test.deserialize({ _key: \"A\", a: \"test\" });\n ex(a).toBeInstanceOf(Test).ok;\n const b = Test.deserialize({ _key: \"B\", a: \"test\" });\n ex(b).toBeInstanceOf(Test).ok;\n\n // Additional prototype\n ex(\n a.match({\n A: () => true as const,\n B: () => false as const,\n })\n ).toBe<true | false>(true as const).ok;\n ex(\n a.match({\n _: () => true as const,\n })\n ).toBe<true>(true as const).ok;\n ex(\n a.match({\n B: () => true as const,\n }, () => false as const)\n ).toBe<true | false>(false as const).ok;\n\n ex(a.test).toBe(true as const).ok;\n // Inherited prototype on deserialization\n ex(a.value).toBeInstanceOf<typeof A | typeof B>(A).ok;\n ex(b.value).toBeInstanceOf<typeof A | typeof B>(B).ok;\n\n // Serialization\n ex(a.serialize()).toStrictEqual<Serialized>({ _key: \"A\", a: \"test\" }).ok;\n ex(b.serialize()).toStrictEqual<Serialized>({ _key: \"B\", a: \"test\" }).ok;\n\n // Instantiation\n const c = new Test(new A({ a: \"test\" }));\n ex(c).toBeInstanceOf(Test).ok;\n\n const d = new Test(new B({ a: \"test\" }));\n ex(d).toBeInstanceOf(Test).ok;\n\n // Inherited prototype\n ex(c.value).toBeInstanceOf<typeof A | typeof B>(A).ok;\n ex(c.value.a).toBe(\"test\").ok;\n\n ex(d.value).toBeInstanceOf<typeof A | typeof B>(B).ok;\n ex(d.value.a).toBe(\"test\").ok;\n });\n\n it(\"inline definition\", () => {\n class A extends Shape({ value: Number }) { }\n class B extends Shape({ value: String }) { }\n class Test extends Dict({ nested: Either({ A, B }) }) { }\n\n type Serialized = { nested: { _key: \"A\", value: number } | { _key: \"B\", value: string } };\n\n // Constructor parameters\n ex(Test).toHaveFirstParam<{ nested: A | B }>().ok;\n\n // Deserialization\n ex(Test.deserialize).toHaveFirstParam<Serialized>().ok;\n const a: Test = Test.deserialize({ nested: { _key: \"A\", value: 1 } });\n ex(a).toBeInstanceOf(Test).ok;\n\n // Inherited prototype on deserialization\n ex(a.nested).toStrictEqual<A | B>(new A({ value: 1 })).ok;\n\n // Serialization\n ex(a.serialize()).toStrictEqual<Serialized>({ nested: { _key: \"A\", value: 1 } })\n .ok;\n\n // Instantiation\n const b = new Test({ nested: new B({ value: \"1\" }) });\n ex(b).toBeInstanceOf(Test).ok;\n\n // Inherited prototype on instantiation\n ex(b.nested).toStrictEqual<A | B>(new B({ value: \"1\" })).ok;\n });\n\n it(\"referenced definition\", () => {\n class B extends Shape({ value: Number }) { }\n class C extends Shape({ value: String }) { }\n class A extends Either({ B, C }) { }\n class Test extends Dict({ nested: A }) { }\n\n type Serialized = { nested: { _key: \"B\", value: number } | { _key: \"C\", value: string } };\n\n // Constructor parameters\n ex(Test).toHaveFirstParam<{ nested: A }>().ok;\n\n // Deserialization\n ex(Test.deserialize).toHaveFirstParam<Serialized>().ok;\n const a: Test = Test.deserialize({ nested: { _key: \"B\", \"value\": 1 } });\n ex(a).toBeInstanceOf(Test).ok;\n\n // Inherited prototype on deserialization\n ex(a.nested).toBeInstanceOf(A).ok;\n ex(a.nested.value).toStrictEqual<B | C>(new B({ value: 1 })).ok;\n\n // Serialization\n ex(a.serialize()).toStrictEqual<Serialized>({ nested: { _key: \"B\", value: 1 } })\n .ok;\n\n // Instantiation\n const b: Test = new Test({ nested: new A(new C({ value: \"1\" })) });\n ex(b).toBeInstanceOf(Test).ok;\n\n // Inherited prototype on instantiation\n ex(b.nested.value).toStrictEqual<B | C>(new C({ value: \"1\" })).ok;\n });\n\n it(\"mixin extension\", () => {\n const Mixin = <const S extends EitherConfiguration>(either: S) => {\n abstract class Mix extends Either(either) {\n deep = true as const;\n static deep = true as const;\n abstract abstract: true;\n }\n\n return Mix;\n };\n\n class A extends Shape({ value: Number }) { }\n class B extends Shape({ value: String }) { }\n class Test extends Mixin({ A, B }) {\n test = true as const;\n\n // @ts-expect-error is not assignable to parameter of type 'true'\n abstract = false as const;\n }\n\n type Serialized = { _key: \"A\", value: number } | { _key: \"B\", value: string };\n\n // Constructor parameters\n ex(Test).toHaveFirstParam<A | B>().ok;\n\n // Additional static prototype\n ex(Test.deep).toBe(true as const).ok;\n\n // Deserialization\n ex(Test.deserialize).toHaveFirstParam<Serialized>().ok;\n const a = Test.deserialize({ _key: \"A\", value: 1 });\n ex(a).toBeInstanceOf(Test).ok;\n\n // Additional prototype on deserialization\n ex(a.test).toBe(true as const).ok;\n ex(a.abstract).toBe(false as const).ok;\n\n // Extended prototype on deserialization\n ex(a.deep).toBe(true as const).ok;\n\n // Inherited prototype on deserialization\n ex(a.value).toStrictEqual<A | B>(new A({ value: 1 })).ok;\n\n // Serialization\n ex(a.serialize()).toStrictEqual<Serialized>({ _key: \"A\", value: 1 }).ok;\n\n // Instantiation\n const b = new Test(new B({ value: \"1\" }));\n ex(b).toBeInstanceOf(Test).ok;\n\n // Additional prototype on instantiation\n ex(b.test).toBe(true as const).ok;\n ex(b.abstract).toBe(false as const).ok;\n\n // Extended prototype on instantiation\n ex(b.deep).toBe(true as const).ok;\n\n // Inherited prototype on instantiation\n ex(b.value).toStrictEqual<A | B>(new B({ value: \"1\" })).ok;\n });\n\n it(\"mixin supersede\", () => {\n const Testable = <const C extends EitherConfiguration>(config: C) => {\n abstract class I {\n deep = true as const;\n static deep = true as const;\n\n abstract abstract: true;\n }\n\n return Either(config, I);\n };\n\n class A extends Shape({ value: Number }) { }\n class B extends Shape({ value: String }) { }\n\n class Test extends Testable({ A, B }) {\n test = true as const;\n\n // @ts-expect-error is not assignable to parameter of type 'true'\n abstract = false as const;\n }\n\n // Constructor type\n ex(Test).toHaveFirstParam<A | B>().ok;\n\n // Additional static prototype\n ex(Test.deep).toBe(true as const).ok;\n\n type Serialized = { _key: \"A\", value: number } | { _key: \"B\", value: string };\n\n // Deserialization\n ex(Test.deserialize).toHaveFirstParam<Serialized>().ok;\n const a = Test.deserialize({ _key: \"A\", value: 1 });\n ex(a).toBeInstanceOf(Test).ok;\n\n // Additional prototype on deserialization\n ex(a.test).toBe(true as const).ok;\n ex(a.abstract).toBe(false as const).ok;\n\n // Superseded prototype on deserialization\n ex(a.deep).toBe(true as const).ok;\n\n // Inherited prototype on deserialization\n ex(a.value).toStrictEqual<A | B>(new A({ value: 1 })).ok;\n\n // Serialization\n ex(a.serialize()).toStrictEqual<Serialized>({ _key: \"A\", value: 1 }).ok;\n\n // Instantiation\n const b = new Test(new B({ value: \"1\" }));\n ex(b).toBeInstanceOf(Test).ok;\n\n // Additional prototype on instantiation\n ex(b.test).toBe(true as const).ok;\n ex(b.abstract).toBe(false as const).ok;\n\n // Superseded prototype on instantiation\n ex(b.deep).toBe(true as const).ok;\n ex(b.abstract).toBe(false as const).ok;\n\n // Inherited prototype on instantiation\n ex(b.value).toStrictEqual<A | B>(new B({ value: \"1\" })).ok;\n });\n});\n"]}
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,sCAAoB;AACpB,2CAAyB;AACzB,0CAAwB;AACxB,yCAAuB;AACvB,2CAAyB;AACzB,8CAA4B;AAC5B,4CAA0B;AAC1B,wDAAsC;AACtC,4CAA0B;AAC1B,6CAA2B;AAC3B,4CAA0B;AAC1B,6CAA2B;AAC3B,iEAA+C","sourcesContent":["export * from \"./_\";\nexport * from \"./choice\";\nexport * from \"./class\";\nexport * from \"./dict\";\nexport * from \"./either\";\nexport * from \"./primitive\";\nexport * from \"./literal\";\nexport * from \"./discriminated-union\";\nexport * from \"./mapping\";\nexport * from \"./multiple\";\nexport * from \"./nothing\";\nexport * from \"./optional\";\nexport * from \"./addons/microsecond-timestamp\";\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"literal.js","sourceRoot":"","sources":["../src/literal.ts"],"names":[],"mappings":";;;AAAA,0BAAsE;AAI/D,MAAM,OAAO,GAAG,CAIrB,EAAK,EACL,OAAU,QAAY,EACN,EAAE;IAGlB,MAAe,QAAS,SAAS,IAA+B;QAC9C,KAAK,GAAG,EAAE,CAAC;QAC3B,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC;QAClB,MAAM,CAAC,MAAM,GAAG,SAAkB,CAAC;QACnC,SAAS;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,CAAC,WAAW,CAEhB,KAAa;YAEb,OAAO,IAAK,IAAY,EAAqB,CAAC;QAChD,CAAC;QAED,MAAM,CAAC,UAAU,CAAC,KAAa;YAC7B,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,CAAC,YAAY,CAAC,KAAa;YAC/B,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,CAAC,OAAO,CAAS;;IAGzB,OAAO,QAAe,CAAC;AACzB,CAAC,CAAC;AApCW,QAAA,OAAO,WAoClB","sourcesContent":["import { AbstractConstructor, Constructor, Empty, Expand } from \"./_\";\n\nexport type LiteralShorthand = string | number;\n\nexport const Literal = <\n const S extends LiteralShorthand,\n B extends AbstractConstructor<{}> = typeof Empty,\n>(\n of: S,\n base: B = Empty as any,\n): ILiteral<S, B> => {\n type Inline = S;\n\n abstract class $Literal extends (base as any as Constructor<{}>) {\n public readonly value = of;\n static value = of;\n static $shape = \"literal\" as const;\n serialize(): S {\n return of;\n }\n\n static deserialize<T extends typeof $Literal>(\n this: T,\n value: Inline,\n ): InstanceType<T> {\n return new (this as any)() as InstanceType<T>;\n }\n\n static $serialize(value: Inline): Inline {\n return of;\n }\n\n static $deserialize(value: Inline): Inline {\n return of;\n }\n\n static $inline: Inline;\n }\n\n return $Literal as any;\n};\n\nexport type ILiteral<\n S extends LiteralShorthand,\n B extends AbstractConstructor<{}> = typeof Empty,\n> = Omit<B, \"prototype\"> & {\n value: S;\n $shape: \"literal\";\n deserialize<T extends Constructor>(this: T, value: S): InstanceType<T>;\n $serialize(value: S): S;\n $deserialize(value: S): S;\n $inline: S;\n} & (abstract new (\n value: Expand<S>,\n ) => InstanceType<B> & {\n readonly value: S;\n serialize(): S;\n });\n"]}