@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 +0,0 @@
1
- {"version":3,"file":"optional.spec.js","sourceRoot":"","sources":["../src/optional.spec.ts"],"names":[],"mappings":"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","sourcesContent":["import { Optional, OptionalConfiguration } from \"./optional\";\nimport { Dict } from \"./dict\";\nimport { ex } from \"./test\";\n\ndescribe(\"Optional\", () => {\n it(\"class definition\", () => {\n class Test extends Optional(String) {\n test = true as const;\n }\n\n type Serialized = string | undefined;\n\n // Constructor parameters\n ex(Test).toHaveFirstParam<Serialized>().ok;\n\n // Deserialization\n ex(Test.deserialize).toHaveFirstParam<Serialized>().ok;\n const a = Test.deserialize(\"a\");\n ex(a).toBeInstanceOf(Test).ok;\n\n // Additional prototype on deserialization\n ex(a.test).toBe(true as const).ok;\n\n // Inherited prototype on deserialization\n ex(a.value).toStrictEqual<string | undefined>(\"a\").ok;\n ex(\n a.match({\n some: (value) => value,\n none: () => \"default\",\n }),\n ).toBe(\"a\").ok;\n\n // Serialization\n ex(a.serialize()).toStrictEqual<Serialized>(\"a\").ok;\n\n // Instantiation\n const b: Test = new Test(undefined);\n ex(b).toBeInstanceOf(Test);\n\n // Additional prototype on instantiation\n ex(b.test).toBe(true as const).ok;\n\n // Inherited prototype on instantiation\n ex(b.value).toStrictEqual<Serialized>(undefined).ok;\n ex(\n b.match({\n some: (value) => value,\n none: () => \"default\",\n }),\n ).toBe(\"default\").ok;\n });\n\n it(\"inline definition\", () => {\n class Test extends Dict({ longhand: Optional(String) }) {\n test = true as const;\n }\n\n type Serialized = { longhand: string | undefined };\n\n // Constructor parameters\n ex(Test).toHaveFirstParam<Serialized>().ok;\n\n // Deserialization\n ex(Test.deserialize).toHaveFirstParam<Serialized>().ok;\n const a = Test.deserialize({ longhand: \"a\" });\n ex(a).toBeInstanceOf(Test).ok;\n\n // Additional prototype on deserialization\n ex(a.test).toBe(true as const).ok;\n\n // Inherited prototype on deserialization\n ex(a.longhand).toStrictEqual<string | undefined>(\"a\").ok;\n\n // Serialization\n ex(a.serialize()).toStrictEqual<Serialized>({ longhand: \"a\" }).ok;\n\n // Instantiation\n const b: Test = new Test({ longhand: undefined });\n ex(b).toBeInstanceOf(Test);\n\n // Additional prototype on instantiation\n ex(b.test).toBe(true as const).ok;\n\n // Inherited prototype on instantiation\n ex(b.longhand).toStrictEqual<string | undefined>(undefined).ok;\n });\n\n it(\"referenced definition\", () => {\n class Reference extends Optional(String) {}\n class Test extends Dict({ reference: Reference }) {\n test = true as const;\n }\n\n type Serialized = { reference: string | undefined };\n\n // Constructor parameters\n ex(Test).toHaveFirstParam<{ reference: Reference }>().ok;\n\n // Deserialization\n ex(Test.deserialize).toHaveFirstParam<Serialized>().ok;\n const a: Test = Test.deserialize({ reference: \"a\" });\n ex(a).toBeInstanceOf(Test).ok;\n\n // Additional prototype on deserialization\n ex(a.test).toBe(true as const).ok;\n\n // Inherited prototype on deserialization\n ex(a.reference).toStrictEqual<Reference>(new Reference(\"a\")).ok;\n\n // Serialization\n ex(a.serialize()).toStrictEqual<Serialized>({ reference: \"a\" }).ok;\n\n // Instantiation\n const b: Test = new Test({ reference: new Reference(undefined) });\n ex(b).toBeInstanceOf(Test).ok;\n\n // Additional prototype on instantiation\n ex(b.test).toBe(true as const).ok;\n\n // Inherited prototype on instantiation\n ex(b.reference).toStrictEqual<Reference>(new Reference(undefined)).ok;\n });\n\n it(\"mixin extension\", () => {\n const Testable = <const C extends OptionalConfiguration>(config: C) => {\n abstract class I extends Optional(config) {\n deep = true as const;\n static deep = true as const;\n\n abstract abstract: true;\n }\n\n return I;\n };\n\n class Test extends Testable(String) {\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 = string | undefined;\n\n // Constructor parameters\n ex(Test).toHaveFirstParam<Serialized>().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(\"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<Serialized>(\"a\").ok;\n\n // Serialization\n ex(a.serialize()).toStrictEqual<Serialized>(\"a\").ok;\n\n // Instantiation\n const b = new Test(undefined);\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<Serialized>(undefined).ok;\n });\n\n it(\"mixin supersede\", () => {\n const Testable = <C extends OptionalConfiguration>(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 Optional(config, I);\n };\n\n class Test extends Testable(String) {\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 = string | undefined;\n\n // Constructor parameters\n ex(Test).toHaveFirstParam<Serialized>().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(\"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<Serialized>(\"a\").ok;\n\n // Serialization\n ex(a.serialize()).toStrictEqual<Serialized>(\"a\").ok;\n\n // Instantiation\n const b = new Test(undefined);\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<Serialized>(undefined).ok;\n });\n});\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"primitive.js","sourceRoot":"","sources":["../src/primitive.ts"],"names":[],"mappings":";;;AAAA,0BAAgF;AAuCzE,MAAM,SAAS,GAAG,CAIvB,EAAK,EACL,OAAU,QAAY,EACJ,EAAE;IAGpB,MAAe,UAAW,SAAS,IAA+B;QACpC;QAA5B,YAA4B,KAAqB;YAC/C,KAAK,EAAE,CAAC;YADkB,UAAK,GAAL,KAAK,CAAgB;QAEjD,CAAC;QAED,MAAM,CAAC,MAAM,GAAG,WAAoB,CAAC;QAErC,SAAS;YACP,OAAO,IAAI,CAAC,KAAK,CAAC;QACpB,CAAC;QAED,MAAM,CAAC,WAAW,CAEhB,KAAa;YAEb,OAAO,IAAK,IAAY,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAoB,CAAC;QACxE,CAAC;QAED,MAAM,CAAC,UAAU,CAAC,KAAa;YAC7B,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,CAAC,YAAY,CAAC,KAAa;YAC/B,IAAI,EAAE,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC7C,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;YACzB,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,CAAC,OAAO,CAAiB;;IAWjC,OAAO,UAAiB,CAAC;AAC3B,CAAC,CAAC;AAlDW,QAAA,SAAS,aAkDpB","sourcesContent":["import { AbstractConstructor, Concrete, Constructor, Empty, Expand } from \"./_\";\n\ntype PrimitiveMap = [\n [StringConstructor, string],\n [NumberConstructor, number],\n [DateConstructor, Date],\n [BooleanConstructor, boolean],\n];\n\ntype PrimitiveConstructor = PrimitiveMap[number][0];\nexport type PrimitiveFromConstructor<S> = Extract<\n PrimitiveMap[number],\n [S, any]\n>[1];\n\nexport type PrimitiveShorthand = PrimitiveConstructor;\n\nexport type IPrimitive<\n S extends PrimitiveConstructor,\n B extends AbstractConstructor<{}> = typeof Empty,\n> = Omit<B, \"\"> &\n (abstract new (\n value: Expand<PrimitiveFromConstructor<S>>,\n ) => InstanceType<B> & {\n readonly value: Expand<PrimitiveFromConstructor<S>>;\n serialize(): PrimitiveFromConstructor<S>;\n }) & {\n $shape: \"primitive\";\n deserialize<T extends Constructor<any>>(\n this: T,\n value: PrimitiveFromConstructor<S>,\n ): InstanceType<T>;\n $serialize(value: PrimitiveFromConstructor<S>): PrimitiveFromConstructor<S>;\n $deserialize(\n value: PrimitiveFromConstructor<S>,\n ): PrimitiveFromConstructor<S>;\n $inline: Expand<PrimitiveFromConstructor<S>>;\n };\n\nexport const Primitive = <\n S extends PrimitiveConstructor,\n B extends AbstractConstructor<{}> = typeof Empty,\n>(\n of: S,\n base: B = Empty as any,\n): IPrimitive<S, B> => {\n type Inline = PrimitiveFromConstructor<S>;\n\n abstract class $Primitive extends (base as any as Constructor<{}>) {\n constructor(public readonly value: Expand<Inline>) {\n super();\n }\n\n static $shape = \"primitive\" as const;\n\n serialize(): Inline {\n return this.value;\n }\n\n static deserialize<T extends typeof $Primitive>(\n this: T,\n value: Inline,\n ): InstanceType<T> {\n return new (this as any)(this.$deserialize(value)) as InstanceType<T>;\n }\n\n static $serialize(value: Inline): Inline {\n return value;\n }\n\n static $deserialize(value: Inline): Inline {\n if (of === Date && typeof value === \"string\") {\n return new Date(value);\n }\n return value;\n }\n\n static $inline: Expand<Inline>;\n }\n\n type PrimitiveConstructor = abstract new (\n value: Expand<Inline>,\n ) => InstanceType<B> & $Primitive;\n\n type Primitive = Omit<B, \"prototype\"> &\n Omit<typeof $Primitive, \"prototype\"> &\n PrimitiveConstructor;\n\n return $Primitive as any;\n};\n"]}
@@ -1,162 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const primitive_1 = require("./primitive");
4
- const dict_1 = require("./dict");
5
- const test_1 = require("./test");
6
- describe("Primitive", () => {
7
- it("class definition", () => {
8
- class Test extends (0, primitive_1.Primitive)(String) {
9
- test = true;
10
- }
11
- // Constructor parameters
12
- (0, test_1.ex)(Test).toHaveFirstParam().ok;
13
- // Deserialization
14
- (0, test_1.ex)(Test.deserialize).toHaveFirstParam().ok;
15
- const a = Test.deserialize("a");
16
- (0, test_1.ex)(a).toBeInstanceOf(Test).ok;
17
- // Additional prototype on deserialization
18
- (0, test_1.ex)(a.test).toBe(true).ok;
19
- // Inherited prototype on deserialization
20
- (0, test_1.ex)(a.value).toBe("a").ok;
21
- // Serialization
22
- (0, test_1.ex)(a.serialize()).toBe("a").ok;
23
- // Instantiation
24
- const b = new Test("a");
25
- (0, test_1.ex)(b).toBeInstanceOf(Test).ok;
26
- // Additional prototype on instantiation
27
- (0, test_1.ex)(b.test).toBe(true).ok;
28
- // Inherited prototype on instantiation
29
- (0, test_1.ex)(b.value).toBe("a").ok;
30
- });
31
- it("inline definition", () => {
32
- class Test extends (0, dict_1.Dict)({ a: (0, primitive_1.Primitive)(String) }) {
33
- test = true;
34
- }
35
- // Constructor parameters
36
- (0, test_1.ex)(Test).toHaveFirstParam().ok;
37
- // Deserialization
38
- (0, test_1.ex)(Test.deserialize).toHaveFirstParam().ok;
39
- const a = Test.deserialize({ a: "a" });
40
- (0, test_1.ex)(a).toBeInstanceOf(Test).ok;
41
- // Additional prototype on deserialization
42
- (0, test_1.ex)(a.test).toBe(true).ok;
43
- // Inherited prototype on deserialization
44
- (0, test_1.ex)(a.a).toBe("a").ok;
45
- // Serialization
46
- (0, test_1.ex)(a.serialize()).toStrictEqual({ a: "a" }).ok;
47
- // Instantiation
48
- const b = new Test({ a: "a" });
49
- (0, test_1.ex)(b).toBeInstanceOf(Test).ok;
50
- // Additional prototype on instantiation
51
- (0, test_1.ex)(b.test).toBe(true).ok;
52
- // Inherited prototype on instantiation
53
- (0, test_1.ex)(b.a).toBe("a").ok;
54
- });
55
- it("referenced definition", () => {
56
- class A extends (0, primitive_1.Primitive)(String) {
57
- }
58
- class Test extends (0, dict_1.Dict)({ a: A }) {
59
- test = true;
60
- }
61
- // Constructor parameters
62
- (0, test_1.ex)(Test).toHaveFirstParam().ok;
63
- // Deserialization
64
- (0, test_1.ex)(Test.deserialize).toHaveFirstParam().ok;
65
- const a = Test.deserialize({ a: "a" });
66
- (0, test_1.ex)(a).toBeInstanceOf(Test).ok;
67
- // Preserve reference
68
- (0, test_1.ex)(a.a).toBeInstanceOf(A);
69
- (0, test_1.ex)(a.a.value).toBe("a").ok;
70
- // Serialization
71
- (0, test_1.ex)(a.serialize()).toStrictEqual({ a: "a" }).ok;
72
- // Instantiation
73
- const b = new Test({ a: new A("a") });
74
- (0, test_1.ex)(b).toBeInstanceOf(Test).ok;
75
- // Inherited prototype on instantiation
76
- (0, test_1.ex)(b.a).toBeInstanceOf(A);
77
- (0, test_1.ex)(b.a.value).toBe("a").ok;
78
- });
79
- it("mixin extension", () => {
80
- const Testable = (shape) => {
81
- class I extends (0, primitive_1.Primitive)(shape) {
82
- deep = true;
83
- static deep = true;
84
- }
85
- return I;
86
- };
87
- class Test extends Testable(Number) {
88
- test = true;
89
- // @ts-expect-error is not assignable to parameter of type 'true'
90
- abstract = false;
91
- }
92
- // Constructor parameters
93
- (0, test_1.ex)(Test).toHaveFirstParam().ok;
94
- // Additional static prototype
95
- (0, test_1.ex)(Test.deep).toBe(true).ok;
96
- // Deserialization
97
- (0, test_1.ex)(Test.deserialize).toHaveFirstParam().ok;
98
- const a = Test.deserialize(1);
99
- (0, test_1.ex)(a).toBeInstanceOf(Test).ok;
100
- // Additional prototype on deserialization
101
- (0, test_1.ex)(a.test).toBe(true).ok;
102
- (0, test_1.ex)(a.abstract).toBe(false).ok;
103
- // Extended prototype on deserialization
104
- (0, test_1.ex)(a.deep).toBe(true).ok;
105
- // Inherited prototype on deserialization
106
- (0, test_1.ex)(a.value).toStrictEqual(1).ok;
107
- // Serialization
108
- (0, test_1.ex)(a.serialize()).toStrictEqual(1).ok;
109
- // Instantiation
110
- const b = new Test(2);
111
- (0, test_1.ex)(b).toBeInstanceOf(Test).ok;
112
- // Additional prototype on instantiation
113
- (0, test_1.ex)(b.test).toBe(true).ok;
114
- (0, test_1.ex)(b.abstract).toBe(false).ok;
115
- // Extended prototype on instantiation
116
- (0, test_1.ex)(b.deep).toBe(true).ok;
117
- // Inherited prototype on instantiation
118
- (0, test_1.ex)(b.value).toStrictEqual(2).ok;
119
- });
120
- it("mixin supersede", () => {
121
- const Testable = (shape) => {
122
- class I {
123
- deep = true;
124
- static deep = true;
125
- }
126
- return (0, primitive_1.Primitive)(shape, I);
127
- };
128
- class Test extends Testable(Number) {
129
- test = true;
130
- // @ts-expect-error is not assignable to parameter of type 'true'
131
- abstract = false;
132
- }
133
- // Constructor parameters
134
- (0, test_1.ex)(Test).toHaveFirstParam().ok;
135
- // Additional static prototype
136
- (0, test_1.ex)(Test.deep).toBe(true).ok;
137
- // Deserialization
138
- (0, test_1.ex)(Test.deserialize).toHaveFirstParam().ok;
139
- const a = Test.deserialize(1);
140
- (0, test_1.ex)(a).toBeInstanceOf(Test).ok;
141
- // Additional prototype on deserialization
142
- (0, test_1.ex)(a.test).toBe(true).ok;
143
- (0, test_1.ex)(a.abstract).toBe(false).ok;
144
- // Superseded prototype on deserialization
145
- (0, test_1.ex)(a.deep).toBe(true).ok;
146
- // Inherited prototype on deserialization
147
- (0, test_1.ex)(a.value).toBe(1).ok;
148
- // Serialization
149
- (0, test_1.ex)(a.serialize()).toStrictEqual(1).ok;
150
- // Instantiation
151
- const b = new Test(2);
152
- (0, test_1.ex)(b).toBeInstanceOf(Test).ok;
153
- // Additional prototype on instantiation
154
- (0, test_1.ex)(b.test).toBe(true).ok;
155
- (0, test_1.ex)(b.abstract).toBe(false).ok;
156
- // Superseded prototype on instantiation
157
- (0, test_1.ex)(b.deep).toBe(true).ok;
158
- // Inherited prototype on instantiation
159
- (0, test_1.ex)(b.value).toBe(2).ok;
160
- });
161
- });
162
- //# sourceMappingURL=primitive.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"primitive.spec.js","sourceRoot":"","sources":["../src/primitive.spec.ts"],"names":[],"mappings":"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","sourcesContent":["import { Primitive, PrimitiveShorthand } from \"./primitive\";\nimport { Dict } from \"./dict\";\nimport { ex } from \"./test\";\n\ndescribe(\"Primitive\", () => {\n it(\"class definition\", () => {\n class Test extends Primitive(String) {\n test = true as const;\n }\n\n // Constructor parameters\n ex(Test).toHaveFirstParam<string>().ok;\n\n // Deserialization\n ex(Test.deserialize).toHaveFirstParam<string>().ok;\n const a = Test.deserialize(\"a\");\n ex(a).toBeInstanceOf(Test).ok;\n\n // Additional prototype on deserialization\n ex(a.test).toBe(true as const).ok;\n\n // Inherited prototype on deserialization\n ex(a.value).toBe<string>(\"a\").ok;\n\n // Serialization\n ex(a.serialize()).toBe<string>(\"a\").ok;\n\n // Instantiation\n const b = new Test(\"a\");\n ex(b).toBeInstanceOf(Test).ok;\n\n // Additional prototype on instantiation\n ex(b.test).toBe(true as const).ok;\n\n // Inherited prototype on instantiation\n ex(b.value).toBe<string>(\"a\").ok;\n });\n\n it(\"inline definition\", () => {\n class Test extends Dict({ a: Primitive(String) }) {\n test = true as const;\n }\n\n type Serialized = { a: string };\n\n // Constructor parameters\n ex(Test).toHaveFirstParam<Serialized>().ok;\n\n // Deserialization\n ex(Test.deserialize).toHaveFirstParam<Serialized>().ok;\n const a = Test.deserialize({ a: \"a\" });\n ex(a).toBeInstanceOf(Test).ok;\n\n // Additional prototype on deserialization\n ex(a.test).toBe(true as const).ok;\n\n // Inherited prototype on deserialization\n ex(a.a).toBe<string>(\"a\").ok;\n\n // Serialization\n ex(a.serialize()).toStrictEqual<Serialized>({ a: \"a\" }).ok;\n\n // Instantiation\n const b = new Test({ a: \"a\" });\n ex(b).toBeInstanceOf(Test).ok;\n\n // Additional prototype on instantiation\n ex(b.test).toBe(true as const).ok;\n\n // Inherited prototype on instantiation\n ex(b.a).toBe<string>(\"a\").ok;\n });\n\n it(\"referenced definition\", () => {\n class A extends Primitive(String) {}\n class Test extends Dict({ a: A }) {\n test = true as const;\n }\n\n type Serialized = { a: string };\n\n // Constructor parameters\n ex(Test).toHaveFirstParam<{ a: A }>().ok;\n\n // Deserialization\n ex(Test.deserialize).toHaveFirstParam<Serialized>().ok;\n const a = Test.deserialize({ a: \"a\" });\n ex(a).toBeInstanceOf(Test).ok;\n\n // Preserve reference\n ex(a.a).toBeInstanceOf(A);\n ex(a.a.value).toBe<string>(\"a\").ok;\n\n // Serialization\n ex(a.serialize()).toStrictEqual<Serialized>({ a: \"a\" }).ok;\n\n // Instantiation\n const b = new Test({ a: new A(\"a\") });\n ex(b).toBeInstanceOf(Test).ok;\n\n // Inherited prototype on instantiation\n ex(b.a).toBeInstanceOf(A);\n ex(b.a.value).toBe<string>(\"a\").ok;\n });\n\n it(\"mixin extension\", () => {\n const Testable = <S extends PrimitiveShorthand>(shape: S) => {\n abstract class I extends Primitive(shape) {\n deep = true as const;\n static deep = true as const;\n\n abstract abstract: true;\n }\n\n return I;\n };\n\n class Test extends Testable(Number) {\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 parameters\n ex(Test).toHaveFirstParam<number>().ok;\n\n // Additional static prototype\n ex(Test.deep).toBe(true as const).ok;\n\n // Deserialization\n ex(Test.deserialize).toHaveFirstParam<number>().ok;\n const a = Test.deserialize(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(1).ok;\n\n // Serialization\n ex(a.serialize()).toStrictEqual(1).ok;\n\n // Instantiation\n const b = new Test(2);\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(2).ok;\n });\n\n it(\"mixin supersede\", () => {\n const Testable = <S extends PrimitiveShorthand>(shape: S) => {\n abstract class I {\n deep = true as const;\n static deep = true as const;\n\n abstract abstract: true;\n }\n\n return Primitive(shape, I);\n };\n\n class Test extends Testable(Number) {\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 parameters\n ex(Test).toHaveFirstParam<number>().ok;\n\n // Additional static prototype\n ex(Test.deep).toBe(true as const).ok;\n\n // Deserialization\n ex(Test.deserialize).toHaveFirstParam<number>().ok;\n const a = Test.deserialize(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).toBe(1).ok;\n\n // Serialization\n ex(a.serialize()).toStrictEqual(1).ok;\n\n // Instantiation\n const b = new Test(2);\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\n // Inherited prototype on instantiation\n ex(b.value).toBe(2).ok;\n });\n});\n"]}
package/dist/test.js DELETED
@@ -1,45 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ex = ex;
4
- const popStackTrace = (error) => {
5
- const lines = error.stack.split("\n");
6
- const at = lines.findIndex((line) => line.includes("at"));
7
- lines.splice(at, 1);
8
- error.stack = lines.join("\n");
9
- return error;
10
- };
11
- function ex(received) {
12
- return {
13
- toBe(expected) {
14
- try {
15
- expect(received).toBe(expected);
16
- }
17
- catch (error) {
18
- throw popStackTrace(error);
19
- }
20
- return { ok: true };
21
- },
22
- toStrictEqual(expected) {
23
- try {
24
- expect(received).toStrictEqual(expected);
25
- }
26
- catch (error) {
27
- throw popStackTrace(error);
28
- }
29
- return { ok: true };
30
- },
31
- toBeInstanceOf(expected) {
32
- try {
33
- expect(received).toBeInstanceOf(expected);
34
- }
35
- catch (error) {
36
- throw popStackTrace(error);
37
- }
38
- return { ok: true };
39
- },
40
- toHaveFirstParam() {
41
- return { ok: true };
42
- },
43
- };
44
- }
45
- //# sourceMappingURL=test.js.map
package/dist/test.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"test.js","sourceRoot":"","sources":["../src/test.ts"],"names":[],"mappings":";;AAwJA,gBAqDC;AA7DD,MAAM,aAAa,GAAG,CAAC,KAAU,EAAE,EAAE;IACnC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAa,CAAC;IAClD,MAAM,EAAE,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1D,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACpB,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/B,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF,SAAgB,EAAE,CAAW,QAAkB;IAC7C,OAAO;QACL,IAAI,CACF,QAAkB;YAIlB,IAAI,CAAC;gBACH,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAClC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,aAAa,CAAC,KAAK,CAAC,CAAC;YAC7B,CAAC;YACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAS,CAAC;QAC7B,CAAC;QACD,aAAa,CACX,QAAkB;YAIlB,IAAI,CAAC;gBACH,MAAM,CAAC,QAAQ,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;YAC3C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,aAAa,CAAC,KAAK,CAAC,CAAC;YAC7B,CAAC;YACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAS,CAAC;QAC7B,CAAC;QACD,cAAc,CACZ,QAAkB;YAIlB,IAAI,CAAC;gBACH,MAAM,CAAC,QAAQ,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;YAC5C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,aAAa,CAAC,KAAK,CAAC,CAAC;YAC7B,CAAC;YACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAS,CAAC;QAC7B,CAAC;QACD,gBAAgB;YAYd,OAAO,EAAE,EAAE,EAAE,IAAI,EAAS,CAAC;QAC7B,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["import { Constructor, Expand } from \"./_\";\n\ntype IfEquals<T, U, Y = unknown, N = never> = (<G>() => G extends T\n ? 1\n : 2) extends <G>() => G extends U ? 1 : 2\n ? Y\n : N;\n\nexport type Equals<X, Y> = IfEquals<X, Y, true, false>;\n\ntype tests = {\n // Booleans\n \"Equals<true, true> -> true\": [Equals<true, true>, true];\n \"Equals<true, false> -> false\": [Equals<true, false>, false];\n \"Equals<false, true> -> false\": [Equals<false, true>, false];\n \"Equals<false, false> -> true\": [Equals<false, false>, true];\n \"Equals<true, any> -> false\": [Equals<true, any>, false];\n \"Equals<any, true> -> false\": [Equals<any, true>, false];\n \"Equals<false, any> -> false\": [Equals<false, any>, false];\n \"Equals<any, false> -> false\": [Equals<any, false>, false];\n \"Equals<true, unknown> -> false\": [Equals<true, unknown>, false];\n \"Equals<unknown, true> -> false\": [Equals<unknown, true>, false];\n \"Equals<false, unknown> -> false\": [Equals<false, unknown>, false];\n \"Equals<unknown, false> -> false\": [Equals<unknown, false>, false];\n \"Equals<true, never> -> false\": [Equals<true, never>, false];\n \"Equals<never, true> -> false\": [Equals<never, true>, false];\n \"Equals<false, never> -> false\": [Equals<false, never>, false];\n \"Equals<never, false> -> false\": [Equals<never, false>, false];\n \"Equals<true, true | false> -> true\": [Equals<true, true | false>, false];\n \"Equals<true | false, true> -> true\": [Equals<true | false, true>, false];\n\n // Numbers\n \"Equals<1, 1> -> true\": [Equals<1, 1>, true];\n \"Equals<1, 2> -> false\": [Equals<1, 2>, false];\n \"Equals<2, 1> -> false\": [Equals<2, 1>, false];\n \"Equals<2, 2> -> true\": [Equals<2, 2>, true];\n // Strings\n \"Equals<'a', 'a'> -> true\": [Equals<\"a\", \"a\">, true];\n \"Equals<'a', 'b'> -> false\": [Equals<\"a\", \"b\">, false];\n \"Equals<'b', 'a'> -> false\": [Equals<\"b\", \"a\">, false];\n \"Equals<'b', 'b'> -> true\": [Equals<\"b\", \"b\">, true];\n // Arrays\n \"Equals<[], []> -> true\": [Equals<[], []>, true];\n \"Equals<[], [1]> -> false\": [Equals<[], [1]>, false];\n \"Equals<[1], []> -> false\": [Equals<[1], []>, false];\n \"Equals<[1], [1]> -> true\": [Equals<[1], [1]>, true];\n // Objects\n\n \"Equals<{}, {}> -> true\": [Equals<{}, {}>, true];\n \"Equals<{}, { a: 1 }> -> false\": [Equals<{}, { a: 1 }>, false];\n \"Equals<{ a: 1 }, {}> -> false\": [Equals<{ a: 1 }, {}>, false];\n \"Equals<{ a: 1 }, { a: 1 }> -> true\": [Equals<{ a: 1 }, { a: 1 }>, true];\n \"Equals<{ a: 1 }, { a: 2 }> -> false\": [Equals<{ a: 1 }, { a: 2 }>, false];\n \"Equals<{ a: 2 }, { a: 1 }> -> false\": [Equals<{ a: 2 }, { a: 1 }>, false];\n \"Equals<{ a: 2 }, { a: 2 }> -> true\": [Equals<{ a: 2 }, { a: 2 }>, true];\n \"Equals<{ a: 1 }, { b: 1 }> -> false\": [Equals<{ a: 1 }, { b: 1 }>, false];\n \"Equals<{ b: 1 }, { a: 1 }> -> false\": [Equals<{ b: 1 }, { a: 1 }>, false];\n // Objects with any, unknown, never\n \"Equals<{}, any> -> false\": [Equals<{}, any>, false];\n \"Equals<any, {}> -> false\": [Equals<any, {}>, false];\n \"Equals<{}, unknown> -> false\": [Equals<{}, unknown>, false];\n \"Equals<unknown, {}> -> false\": [Equals<unknown, {}>, false];\n \"Equals<{}, never> -> false\": [Equals<{}, never>, false];\n \"Equals<never, {}> -> false\": [Equals<never, {}>, false];\n // Objects with nested any, unknown, never and real types\n \"Equals<{ a: any }, { a: any }> -> true\": [\n Equals<{ a: any }, { a: any }>,\n true,\n ];\n \"Equals<{ a: unknown }, { a: unknown }> -> true\": [\n Equals<{ a: unknown }, { a: unknown }>,\n true,\n ];\n \"Equals<{ a: never }, { a: never }> -> true\": [\n Equals<{ a: never }, { a: never }>,\n true,\n ];\n \"Equals<{ a: any }, { a: unknown }> -> false\": [\n Equals<{ a: any }, { a: unknown }>,\n false,\n ];\n \"Equals<{ a: any }, { a: never }> -> false\": [\n Equals<{ a: any }, { a: never }>,\n false,\n ];\n \"Equals<{ a: unknown }, { a: any }> -> false\": [\n Equals<{ a: unknown }, { a: any }>,\n false,\n ];\n \"Equals<{ a: unknown }, { a: never }> -> false\": [\n Equals<{ a: unknown }, { a: never }>,\n false,\n ];\n \"Equals<{ a: never }, { a: any }> -> false\": [\n Equals<{ a: never }, { a: any }>,\n false,\n ];\n \"Equals<{ a: never }, { a: unknown }> -> false\": [\n Equals<{ a: never }, { a: unknown }>,\n false,\n ];\n \"Equals<{ a: any }, { a: 1 }> -> false\": [\n Equals<{ a: any }, { a: 1 }>,\n false,\n ];\n \"Equals<{ a: unknown }, { a: 1 }> -> false\": [\n Equals<{ a: unknown }, { a: 1 }>,\n false,\n ];\n \"Equals<{ a: never }, { a: 1 }> -> false\": [\n Equals<{ a: never }, { a: 1 }>,\n false,\n ];\n \"Equals<{ a: 1 }, { a: any }> -> false\": [\n Equals<{ a: 1 }, { a: any }>,\n false,\n ];\n \"Equals<{ a: 1 }, { a: unknown }> -> false\": [\n Equals<{ a: 1 }, { a: unknown }>,\n false,\n ];\n \"Equals<{ a: 1 }, { a: never }> -> false\": [\n Equals<{ a: 1 }, { a: never }>,\n false,\n ];\n \"Equals<{ (): string } & { (x: string): number },{ (x: string): number } & { (): string }>\": [\n Equals<\n { (): string } & { (x: string): number },\n { (x: string): number } & { (): string }\n >,\n false,\n ];\n};\n\ntype check = {\n [name in keyof tests]: Equals<tests[name][0], tests[name][1]> extends true\n ? true\n : false;\n};\n\ntype failingtests = {\n [name in keyof check]: check[name] extends true ? never : name;\n}[keyof check];\n\nconst popStackTrace = (error: any) => {\n const lines = error.stack.split(\"\\n\") as string[];\n const at = lines.findIndex((line) => line.includes(\"at\"));\n lines.splice(at, 1);\n error.stack = lines.join(\"\\n\");\n return error;\n};\n\nexport function ex<Received>(received: Received) {\n return {\n toBe<Expected>(\n expected: Expected,\n ): Equals<Received, Expected> extends true\n ? { ok: true }\n : { expected: Expected; received: Received } {\n try {\n expect(received).toBe(expected);\n } catch (error) {\n throw popStackTrace(error);\n }\n return { ok: true } as any;\n },\n toStrictEqual<Expected>(\n expected: Expected,\n ): Equals<Received, Expected> extends true\n ? { ok: true }\n : { expected: Expected; received: Received } {\n try {\n expect(received).toStrictEqual(expected);\n } catch (error) {\n throw popStackTrace(error);\n }\n return { ok: true } as any;\n },\n toBeInstanceOf<Expected extends Constructor>(\n expected: Expected,\n ): Equals<Received, InstanceType<Expected>> extends true\n ? { ok: true }\n : { expected: InstanceType<Expected>; received: Received } {\n try {\n expect(received).toBeInstanceOf(expected);\n } catch (error) {\n throw popStackTrace(error);\n }\n return { ok: true } as any;\n },\n toHaveFirstParam<Expected>(): Received extends (\n first: infer P,\n ...rest: any[]\n ) => any\n ? Equals<P, Expected> extends true\n ? { ok: true }\n : { expected: Expected; received: P }\n : Received extends Constructor<any, [infer P, ...any[]]>\n ? Equals<P, Expected> extends true\n ? { ok: true }\n : { expected: Expected; received: P }\n : \"not a function or constructor\" {\n return { ok: true } as any;\n },\n };\n}\n"]}