@ddd-ts/shape 0.0.3-54 → 0.0.3-55

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 (85) hide show
  1. package/dist/_.d.ts +39 -0
  2. package/dist/_.d.ts.map +1 -0
  3. package/dist/_.js +51 -0
  4. package/dist/_.js.map +1 -0
  5. package/dist/choice.d.ts +158 -0
  6. package/dist/choice.d.ts.map +1 -0
  7. package/dist/choice.js +46 -0
  8. package/dist/choice.js.map +1 -0
  9. package/dist/choice.spec.d.ts +2 -0
  10. package/dist/choice.spec.d.ts.map +1 -0
  11. package/dist/choice.spec.js +147 -0
  12. package/dist/choice.spec.js.map +1 -0
  13. package/dist/class.d.ts +21 -0
  14. package/dist/class.d.ts.map +1 -0
  15. package/dist/class.js +30 -0
  16. package/dist/class.js.map +1 -0
  17. package/dist/class.spec.d.ts +2 -0
  18. package/dist/class.spec.d.ts.map +1 -0
  19. package/dist/class.spec.js +39 -0
  20. package/dist/class.spec.js.map +1 -0
  21. package/dist/dict.d.ts +26 -0
  22. package/dist/dict.d.ts.map +1 -0
  23. package/dist/dict.js +46 -0
  24. package/dist/dict.js.map +1 -0
  25. package/dist/dict.spec.d.ts +2 -0
  26. package/dist/dict.spec.d.ts.map +1 -0
  27. package/dist/dict.spec.js +180 -0
  28. package/dist/dict.spec.js.map +1 -0
  29. package/dist/either.d.ts +21 -0
  30. package/dist/either.d.ts.map +1 -0
  31. package/dist/either.js +42 -0
  32. package/dist/either.js.map +1 -0
  33. package/dist/either.spec.d.ts +2 -0
  34. package/dist/either.spec.d.ts.map +1 -0
  35. package/dist/either.spec.js +199 -0
  36. package/dist/either.spec.js.map +1 -0
  37. package/dist/index.d.ts +10 -15
  38. package/dist/index.d.ts.map +1 -1
  39. package/dist/index.js +10 -15
  40. package/dist/index.js.map +1 -1
  41. package/dist/literal.d.ts +43 -0
  42. package/dist/literal.d.ts.map +1 -0
  43. package/dist/literal.js +30 -0
  44. package/dist/literal.js.map +1 -0
  45. package/dist/literal.spec.d.ts +2 -0
  46. package/dist/literal.spec.d.ts.map +1 -0
  47. package/dist/literal.spec.js +162 -0
  48. package/dist/literal.spec.js.map +1 -0
  49. package/dist/mapping.d.ts +39 -0
  50. package/dist/mapping.d.ts.map +1 -0
  51. package/dist/mapping.js +50 -0
  52. package/dist/mapping.js.map +1 -0
  53. package/dist/mapping.spec.d.ts +2 -0
  54. package/dist/mapping.spec.d.ts.map +1 -0
  55. package/dist/mapping.spec.js +207 -0
  56. package/dist/mapping.spec.js.map +1 -0
  57. package/dist/multiple.d.ts +159 -0
  58. package/dist/multiple.d.ts.map +1 -0
  59. package/dist/multiple.js +60 -0
  60. package/dist/multiple.js.map +1 -0
  61. package/dist/multiple.spec.d.ts +2 -0
  62. package/dist/multiple.spec.d.ts.map +1 -0
  63. package/dist/multiple.spec.js +208 -0
  64. package/dist/multiple.spec.js.map +1 -0
  65. package/dist/nothing.d.ts +14 -0
  66. package/dist/nothing.d.ts.map +1 -0
  67. package/dist/nothing.js +19 -0
  68. package/dist/nothing.js.map +1 -0
  69. package/dist/nothing.spec.d.ts +2 -0
  70. package/dist/nothing.spec.d.ts.map +1 -0
  71. package/dist/nothing.spec.js +172 -0
  72. package/dist/nothing.spec.js.map +1 -0
  73. package/dist/optional.d.ts +24 -0
  74. package/dist/optional.d.ts.map +1 -0
  75. package/dist/optional.js +40 -0
  76. package/dist/optional.js.map +1 -0
  77. package/dist/optional.spec.d.ts +2 -0
  78. package/dist/optional.spec.d.ts.map +1 -0
  79. package/dist/optional.spec.js +172 -0
  80. package/dist/optional.spec.js.map +1 -0
  81. package/dist/test.d.ts +36 -0
  82. package/dist/test.d.ts.map +1 -0
  83. package/dist/test.js +46 -0
  84. package/dist/test.js.map +1 -0
  85. package/package.json +1 -1
package/dist/_.d.ts ADDED
@@ -0,0 +1,39 @@
1
+ import { Class, ClassShorthand } from "./class";
2
+ import { Dict, DictShorthand } from "./dict";
3
+ import { Literal, LiteralShorthand } from "./literal";
4
+ import { Multiple, MultipleShorthand } from "./multiple";
5
+ import { Nothing, NothingShorthand } from "./nothing";
6
+ export declare abstract class Empty {
7
+ }
8
+ export interface Constructor<T = any, P extends any[] = any[]> {
9
+ new (...args: P): T;
10
+ }
11
+ export type AbstractConstructor<T = any, P extends any[] = any[]> = abstract new (...args: P) => T;
12
+ export interface Definition {
13
+ $name: string;
14
+ $inline: any;
15
+ $serialize(value: any): any;
16
+ $deserialize(value: any): any;
17
+ }
18
+ export type MakeAbstract<T> = T extends new (...params: infer P) => infer R ? Omit<T, ""> & (abstract new (...params: P) => R) : never;
19
+ export type Concrete<T extends AbstractConstructor<any>> = T extends abstract new (...params: infer P) => infer R ? Omit<T, ""> & {
20
+ new (...params: P): R;
21
+ } : never;
22
+ export type Shorthand = Definition | DictShorthand | LiteralShorthand | MultipleShorthand | NothingShorthand | ClassShorthand;
23
+ export type DefinitionOf<T extends Shorthand | Definition, B extends AbstractConstructor<{}> = typeof Empty> = T extends LiteralShorthand ? ReturnType<typeof Literal<T, B>> : T extends undefined ? ReturnType<typeof Nothing<B>> : T extends LiteralShorthand ? ReturnType<typeof Literal<T, B>> : T extends MultipleShorthand ? ReturnType<typeof Multiple<T[0], B>> : T extends ClassShorthand ? ReturnType<typeof Class<T, B>> : T extends {
24
+ prototype: any;
25
+ } ? T : T extends DictShorthand ? ReturnType<typeof Dict<T, B>> : never;
26
+ export declare function Shape<const S extends Definition | Shorthand, B extends AbstractConstructor<{}> = typeof Empty>(shorthand: S, base?: B): DefinitionOf<S, B>;
27
+ export type Expand<T> = T extends {
28
+ serialize(): any;
29
+ } ? T : T extends Date ? T : T extends Record<string, any> ? {
30
+ [key in keyof T]: Expand<T[key]>;
31
+ } : T;
32
+ export declare function forward<T extends AbstractConstructor<{
33
+ value: any;
34
+ }>, const Forward extends T extends AbstractConstructor<{
35
+ value: infer U;
36
+ }> ? (keyof U)[] : never>(base: T, forward: Forward): MakeAbstract<T & (new (...args: ConstructorParameters<T>) => InstanceType<T> & {
37
+ [K in Forward[number]]: InstanceType<T>["value"][K];
38
+ })>;
39
+ //# sourceMappingURL=_.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_.d.ts","sourceRoot":"","sources":["../src/_.ts"],"names":[],"mappings":"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"}
package/dist/_.js ADDED
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.forward = exports.Shape = exports.Empty = void 0;
4
+ const class_1 = require("./class");
5
+ const dict_1 = require("./dict");
6
+ const literal_1 = require("./literal");
7
+ const multiple_1 = require("./multiple");
8
+ const nothing_1 = require("./nothing");
9
+ class Empty {
10
+ }
11
+ exports.Empty = Empty;
12
+ function Shape(shorthand, base = Empty) {
13
+ if (shorthand &&
14
+ "$name" in shorthand &&
15
+ "name" in shorthand &&
16
+ typeof shorthand.name === "string") {
17
+ if (shorthand.name.startsWith("$")) {
18
+ return shorthand;
19
+ }
20
+ return (0, class_1.Class)(shorthand, base);
21
+ }
22
+ if (shorthand === undefined) {
23
+ return (0, nothing_1.Nothing)(undefined, base);
24
+ }
25
+ if ([String, Number, Date, Boolean].includes(shorthand)) {
26
+ return (0, literal_1.Literal)(shorthand, base);
27
+ }
28
+ if (shorthand && "prototype" in shorthand) {
29
+ return (0, class_1.Class)(shorthand, base);
30
+ }
31
+ if (Array.isArray(shorthand)) {
32
+ return multiple_1.Multiple(shorthand[0], base);
33
+ }
34
+ if (typeof shorthand === "object") {
35
+ return (0, dict_1.Dict)(shorthand, base);
36
+ }
37
+ throw new Error(`Could not determine longhand from shorthand ${JSON.stringify(shorthand)}`);
38
+ }
39
+ exports.Shape = Shape;
40
+ function forward(base, forward) {
41
+ for (const key of forward) {
42
+ Object.defineProperty(base.prototype, key, {
43
+ get() {
44
+ return this.value[key].bind(this.value);
45
+ },
46
+ });
47
+ }
48
+ return base;
49
+ }
50
+ exports.forward = forward;
51
+ //# sourceMappingURL=_.js.map
package/dist/_.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_.js","sourceRoot":"","sources":["../src/_.ts"],"names":[],"mappings":";;;AAAA,mCAAgD;AAChD,iCAA6C;AAC7C,uCAAsD;AACtD,yCAAyD;AACzD,uCAAsD;AAEtD,MAAsB,KAAK;CAAG;AAA9B,sBAA8B;AA2D9B,SAAgB,KAAK,CAGnB,SAAY,EAAE,OAAU,KAAY;IACpC,IACE,SAAS;QACT,OAAO,IAAI,SAAS;QACpB,MAAM,IAAI,SAAS;QACnB,OAAO,SAAS,CAAC,IAAI,KAAK,QAAQ,EAClC,CAAC;QACD,IAAK,SAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5C,OAAO,SAAgB,CAAC;QAC1B,CAAC;QACD,OAAO,IAAA,aAAK,EAAC,SAAgB,EAAE,IAAI,CAAQ,CAAC;IAC9C,CAAC;IACD,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,OAAO,IAAA,iBAAO,EAAC,SAAS,EAAE,IAAI,CAAQ,CAAC;IACzC,CAAC;IACD,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,SAAgB,CAAC,EAAE,CAAC;QAC/D,OAAO,IAAA,iBAAO,EAAC,SAAgB,EAAE,IAAI,CAAQ,CAAC;IAChD,CAAC;IACD,IAAI,SAAS,IAAI,WAAW,IAAI,SAAS,EAAE,CAAC;QAC1C,OAAO,IAAA,aAAK,EAAC,SAAgB,EAAE,IAAI,CAAQ,CAAC;IAC9C,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7B,OAAQ,mBAAgB,CAAC,SAAS,CAAC,CAAC,CAAQ,EAAE,IAAI,CAAC,CAAC;IACtD,CAAC;IAED,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;QAClC,OAAO,IAAA,WAAI,EAAC,SAAgB,EAAE,IAAI,CAAQ,CAAC;IAC7C,CAAC;IAED,MAAM,IAAI,KAAK,CACb,+CAA+C,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,CAC3E,CAAC;AACJ,CAAC;AApCD,sBAoCC;AAUD,SAAgB,OAAO,CAMrB,IAAO,EACP,OAAgB;IAShB,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE;YACzC,GAAG;gBACD,OAAQ,IAAI,CAAC,KAAa,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnD,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IACD,OAAO,IAAW,CAAC;AACrB,CAAC;AAxBD,0BAwBC"}
@@ -0,0 +1,158 @@
1
+ import { AbstractConstructor, Empty, Expand, Constructor } from "./_";
2
+ type Matcher<S extends string[]> = {
3
+ [key in S[number]]: () => any;
4
+ } | ({
5
+ _: () => any;
6
+ } & {
7
+ [key in S[number]]?: () => any;
8
+ });
9
+ type MatcherResult<M extends Matcher<any>> = M[keyof M] extends () => infer R ? R : never;
10
+ export declare const Choice: <const S extends string[], B extends AbstractConstructor<{}> = typeof Empty>(config: S, base?: B) => Omit<B, "" | "prototype"> & { [key in S[number]]: <T extends Constructor<any, any[]>>(this: T) => InstanceType<T>; } & (abstract new (value: Expand<S[number]>) => InstanceType<B> & {
11
+ [x: string]: any;
12
+ value: Expand<S[number]>;
13
+ is<T_1 extends S[number]>(value: T_1): this is Omit<any, "serialize" | "value"> & {
14
+ value: T_1;
15
+ serialize(): T_1;
16
+ };
17
+ match<M extends Matcher<S>>(matcher: M): MatcherResult<M>;
18
+ serialize(): S[number];
19
+ }) & {
20
+ [x: string]: any;
21
+ prototype: {
22
+ [x: string]: any;
23
+ value: any;
24
+ is<T_2 extends any>(value: T_2): this is Omit<any, "serialize" | "value"> & {
25
+ value: T_2;
26
+ serialize(): T_2;
27
+ };
28
+ match<M_1 extends Matcher<any>>(matcher: M_1): MatcherResult<M_1>;
29
+ serialize(): any;
30
+ };
31
+ $name: "choice";
32
+ deserialize: <T_3 extends Omit<(abstract new (value: Expand<S[number]>) => {
33
+ [x: string]: any;
34
+ value: Expand<S[number]>;
35
+ is<T_1 extends S[number]>(value: T_1): this is Omit<any, "serialize" | "value"> & {
36
+ value: T_1;
37
+ serialize(): T_1;
38
+ };
39
+ match<M extends Matcher<S>>(matcher: M): MatcherResult<M>;
40
+ serialize(): S[number];
41
+ }) & {
42
+ [x: string]: any;
43
+ $name: "choice";
44
+ deserialize<T_3 extends Omit<any, ""> & (new (value: Expand<S[number]>) => {
45
+ [x: string]: any;
46
+ value: Expand<S[number]>;
47
+ is<T_1 extends S[number]>(value: T_1): this is Omit<any, "serialize" | "value"> & {
48
+ value: T_1;
49
+ serialize(): T_1;
50
+ };
51
+ match<M extends Matcher<S>>(matcher: M): MatcherResult<M>;
52
+ serialize(): S[number];
53
+ })>(this: T_3, value: S[number]): InstanceType<T_3>;
54
+ $deserialize<T_4 extends Omit<any, ""> & (new (value: Expand<S[number]>) => {
55
+ [x: string]: any;
56
+ value: Expand<S[number]>;
57
+ is<T_1 extends S[number]>(value: T_1): this is Omit<any, "serialize" | "value"> & {
58
+ value: T_1;
59
+ serialize(): T_1;
60
+ };
61
+ match<M extends Matcher<S>>(matcher: M): MatcherResult<M>;
62
+ serialize(): S[number];
63
+ })>(this: T_4, value: S[number]): S[number];
64
+ $serialize<T_5 extends any>(this: T_5, value: S[number]): S[number];
65
+ $inline: S[number];
66
+ }, ""> & (new (value: Expand<S[number]>) => {
67
+ [x: string]: any;
68
+ value: Expand<S[number]>;
69
+ is<T_1 extends S[number]>(value: T_1): this is Omit<any, "serialize" | "value"> & {
70
+ value: T_1;
71
+ serialize(): T_1;
72
+ };
73
+ match<M extends Matcher<S>>(matcher: M): MatcherResult<M>;
74
+ serialize(): S[number];
75
+ })>(this: T_3, value: S[number]) => InstanceType<T_3>;
76
+ $deserialize: <T_4 extends Omit<(abstract new (value: Expand<S[number]>) => {
77
+ [x: string]: any;
78
+ value: Expand<S[number]>;
79
+ is<T_1 extends S[number]>(value: T_1): this is Omit<any, "serialize" | "value"> & {
80
+ value: T_1;
81
+ serialize(): T_1;
82
+ };
83
+ match<M extends Matcher<S>>(matcher: M): MatcherResult<M>;
84
+ serialize(): S[number];
85
+ }) & {
86
+ [x: string]: any;
87
+ $name: "choice";
88
+ deserialize<T_3 extends Omit<any, ""> & (new (value: Expand<S[number]>) => {
89
+ [x: string]: any;
90
+ value: Expand<S[number]>;
91
+ is<T_1 extends S[number]>(value: T_1): this is Omit<any, "serialize" | "value"> & {
92
+ value: T_1;
93
+ serialize(): T_1;
94
+ };
95
+ match<M extends Matcher<S>>(matcher: M): MatcherResult<M>;
96
+ serialize(): S[number];
97
+ })>(this: T_3, value: S[number]): InstanceType<T_3>;
98
+ $deserialize<T_4 extends Omit<any, ""> & (new (value: Expand<S[number]>) => {
99
+ [x: string]: any;
100
+ value: Expand<S[number]>;
101
+ is<T_1 extends S[number]>(value: T_1): this is Omit<any, "serialize" | "value"> & {
102
+ value: T_1;
103
+ serialize(): T_1;
104
+ };
105
+ match<M extends Matcher<S>>(matcher: M): MatcherResult<M>;
106
+ serialize(): S[number];
107
+ })>(this: T_4, value: S[number]): S[number];
108
+ $serialize<T_5 extends any>(this: T_5, value: S[number]): S[number];
109
+ $inline: S[number];
110
+ }, ""> & (new (value: Expand<S[number]>) => {
111
+ [x: string]: any;
112
+ value: Expand<S[number]>;
113
+ is<T_1 extends S[number]>(value: T_1): this is Omit<any, "serialize" | "value"> & {
114
+ value: T_1;
115
+ serialize(): T_1;
116
+ };
117
+ match<M extends Matcher<S>>(matcher: M): MatcherResult<M>;
118
+ serialize(): S[number];
119
+ })>(this: T_4, value: S[number]) => S[number];
120
+ $serialize: <T_5 extends (abstract new (value: Expand<S[number]>) => {
121
+ [x: string]: any;
122
+ value: Expand<S[number]>;
123
+ is<T_1 extends S[number]>(value: T_1): this is Omit<any, "serialize" | "value"> & {
124
+ value: T_1;
125
+ serialize(): T_1;
126
+ };
127
+ match<M extends Matcher<S>>(matcher: M): MatcherResult<M>;
128
+ serialize(): S[number];
129
+ }) & {
130
+ [x: string]: any;
131
+ $name: "choice";
132
+ deserialize<T_3 extends Omit<any, ""> & (new (value: Expand<S[number]>) => {
133
+ [x: string]: any;
134
+ value: Expand<S[number]>;
135
+ is<T_1 extends S[number]>(value: T_1): this is Omit<any, "serialize" | "value"> & {
136
+ value: T_1;
137
+ serialize(): T_1;
138
+ };
139
+ match<M extends Matcher<S>>(matcher: M): MatcherResult<M>;
140
+ serialize(): S[number];
141
+ })>(this: T_3, value: S[number]): InstanceType<T_3>;
142
+ $deserialize<T_4 extends Omit<any, ""> & (new (value: Expand<S[number]>) => {
143
+ [x: string]: any;
144
+ value: Expand<S[number]>;
145
+ is<T_1 extends S[number]>(value: T_1): this is Omit<any, "serialize" | "value"> & {
146
+ value: T_1;
147
+ serialize(): T_1;
148
+ };
149
+ match<M extends Matcher<S>>(matcher: M): MatcherResult<M>;
150
+ serialize(): S[number];
151
+ })>(this: T_4, value: S[number]): S[number];
152
+ $serialize<T_5 extends any>(this: T_5, value: S[number]): S[number];
153
+ $inline: S[number];
154
+ }>(this: T_5, value: S[number]) => S[number];
155
+ $inline: S[number];
156
+ };
157
+ export {};
158
+ //# sourceMappingURL=choice.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"choice.d.ts","sourceRoot":"","sources":["../src/choice.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,KAAK,EAAY,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,CAAC;AAEhF,KAAK,OAAO,CAAC,CAAC,SAAS,MAAM,EAAE,IAC3B;KACG,GAAG,IAAI,CAAC,CAAC,MAAM,CAAC,GAAG,MAAM,GAAG;CAC9B,GACD,CAAC;IACC,CAAC,EAAE,MAAM,GAAG,CAAC;CACd,GAAG;KACD,GAAG,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,GAAG;CAC/B,CAAC,CAAC;AAEP,KAAK,aAAa,CAAC,CAAC,SAAS,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,MAAM,MAAM,CAAC,GACzE,CAAC,GACD,KAAK,CAAC;AAEV,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6ElB,CAAC"}
package/dist/choice.js ADDED
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Choice = void 0;
4
+ const _1 = require("./_");
5
+ const Choice = (config, base = _1.Empty) => {
6
+ class $Choice extends base {
7
+ value;
8
+ static $name = "choice";
9
+ constructor(value) {
10
+ super();
11
+ this.value = value;
12
+ }
13
+ is(value) {
14
+ return this.value === value;
15
+ }
16
+ match(matcher) {
17
+ const handler = matcher[this.value];
18
+ if (handler)
19
+ return handler();
20
+ return matcher._();
21
+ }
22
+ serialize() {
23
+ return this.value;
24
+ }
25
+ static deserialize(value) {
26
+ return new this(value);
27
+ }
28
+ static $deserialize(value) {
29
+ return value;
30
+ }
31
+ static $serialize(value) {
32
+ return value;
33
+ }
34
+ static $inline;
35
+ static {
36
+ for (const choice of config) {
37
+ this[choice] = function () {
38
+ return new this(choice);
39
+ };
40
+ }
41
+ }
42
+ }
43
+ return $Choice;
44
+ };
45
+ exports.Choice = Choice;
46
+ //# sourceMappingURL=choice.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"choice.js","sourceRoot":"","sources":["../src/choice.ts"],"names":[],"mappings":";;;AAAA,0BAAgF;AAgBzE,MAAM,MAAM,GAAG,CAIpB,MAAS,EACT,OAAU,QAAY,EACtB,EAAE;IAGF,MAAe,OAAQ,SAAS,IAAY;QAGvB;QAFnB,MAAM,CAAC,KAAK,GAAG,QAAiB,CAAC;QAEjC,YAAmB,KAAqB;YACtC,KAAK,EAAE,CAAC;YADS,UAAK,GAAL,KAAK,CAAgB;QAExC,CAAC;QAED,EAAE,CAAmB,KAAQ;YAO3B,OAAO,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC;QAC9B,CAAC;QAED,KAAK,CAAuB,OAAU;YACpC,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACpC,IAAI,OAAO;gBAAE,OAAO,OAAO,EAAE,CAAC;YAC9B,OAAQ,OAA4B,CAAC,CAAC,EAAE,CAAC;QAC3C,CAAC;QAED,SAAS;YACP,OAAO,IAAI,CAAC,KAAK,CAAC;QACpB,CAAC;QAED,MAAM,CAAC,WAAW,CAEhB,KAAa;YAEb,OAAO,IAAI,IAAI,CAAC,KAAY,CAAoB,CAAC;QACnD,CAAC;QACD,MAAM,CAAC,YAAY,CAEjB,KAAa;YAEb,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,CAAC,UAAU,CAEf,KAAa;YAEb,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,CAAC,OAAO,CAAS;QAEvB;YACE,KAAK,MAAM,MAAM,IAAI,MAAM,EAAE,CAAC;gBAC5B,IAAI,CAAC,MAAM,CAAC,GAAG;oBACb,OAAO,IAAI,IAAI,CAAC,MAAa,CAAC,CAAC;gBACjC,CAAC,CAAC;YACJ,CAAC;QACH,CAAC;;IAaH,OAAO,OAAiB,CAAC;AAC3B,CAAC,CAAC;AA7EW,QAAA,MAAM,UA6EjB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=choice.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"choice.spec.d.ts","sourceRoot":"","sources":["../src/choice.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,147 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const choice_1 = require("./choice");
4
+ const dict_1 = require("./dict");
5
+ const test_1 = require("./test");
6
+ describe("Choice", () => {
7
+ it("class definition", () => {
8
+ class Test extends (0, choice_1.Choice)(["a", "b", "c"]) {
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
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
+ (0, test_1.ex)(a.match({
22
+ a: () => 1,
23
+ b: () => 2,
24
+ _: () => 3,
25
+ })).toBe(1).ok;
26
+ (0, test_1.ex)(a.is("a")).toBe(true).ok;
27
+ // Serialization
28
+ (0, test_1.ex)(a.serialize()).toBe("a").ok;
29
+ // Instantiation
30
+ const b = new Test("a");
31
+ (0, test_1.ex)(b).toBeInstanceOf(Test).ok;
32
+ // Inherited prototype on instantiation
33
+ (0, test_1.ex)(b.value).toBe("a").ok;
34
+ (0, test_1.ex)(a.match({
35
+ a: () => 1,
36
+ b: () => 2,
37
+ _: () => 3,
38
+ })).toBe(1).ok;
39
+ (0, test_1.ex)(b.is("a")).toBe(true).ok;
40
+ // Inherited statics
41
+ (0, test_1.ex)(Test.a()).toBeInstanceOf(Test).ok;
42
+ (0, test_1.ex)(Test.b()).toBeInstanceOf(Test).ok;
43
+ (0, test_1.ex)(Test.c()).toBeInstanceOf(Test).ok;
44
+ });
45
+ it("inlined definition", () => {
46
+ class Test extends (0, dict_1.Dict)({ nested: (0, choice_1.Choice)(["a", "b", "c"]) }) {
47
+ }
48
+ // Constructor parameters
49
+ (0, test_1.ex)(Test).toHaveFirstParam().ok;
50
+ // Deserialization
51
+ (0, test_1.ex)(Test.deserialize).toHaveFirstParam().ok;
52
+ const a = Test.deserialize({ nested: "b" });
53
+ (0, test_1.ex)(a).toBeInstanceOf(Test).ok;
54
+ // Inherited prototype on deserialization
55
+ (0, test_1.ex)(a.nested).toBe("b").ok;
56
+ // Serialization
57
+ (0, test_1.ex)(a.serialize()).toStrictEqual({
58
+ nested: "b",
59
+ }).ok;
60
+ // Instantiation
61
+ const e = new Test({ nested: "b" });
62
+ (0, test_1.ex)(e).toBeInstanceOf(Test).ok;
63
+ });
64
+ it("referenced definition", () => {
65
+ class Reference extends (0, choice_1.Choice)(["a", "b", "c"]) {
66
+ }
67
+ class Test extends (0, dict_1.Dict)({ nested: Reference }) {
68
+ }
69
+ // Constructor parameters
70
+ (0, test_1.ex)(Test).toHaveFirstParam().ok;
71
+ // Deserialization
72
+ (0, test_1.ex)(Test.deserialize).toHaveFirstParam().ok;
73
+ const a = Test.deserialize({ nested: "a" });
74
+ (0, test_1.ex)(a).toBeInstanceOf(Test);
75
+ // Preserve reference
76
+ (0, test_1.ex)(a.nested).toBeInstanceOf(Reference);
77
+ (0, test_1.ex)(a.nested.is("a")).toBe(true);
78
+ // Serialization
79
+ (0, test_1.ex)(a.serialize()).toStrictEqual({ nested: "a" });
80
+ // Instantiation
81
+ const b = new Test({ nested: new Reference("c") });
82
+ expect(b).toBeInstanceOf(Test);
83
+ });
84
+ it("mixin extension are not supported", () => {
85
+ const Mixin = (choices) => {
86
+ // @ts-expect-error https://github.com/microsoft/TypeScript/issues/57674
87
+ class Mix extends (0, choice_1.Choice)(choices) {
88
+ static d;
89
+ }
90
+ return Mix;
91
+ };
92
+ expect(true).toBe(true);
93
+ });
94
+ it("mixin supersede", () => {
95
+ const Testable = (choices) => {
96
+ class I {
97
+ deep = true;
98
+ static deep = true;
99
+ }
100
+ return (0, choice_1.Choice)(choices, I);
101
+ };
102
+ class Test extends Testable(["a", "b", "c"]) {
103
+ test = true;
104
+ // @ts-expect-error is not assignable to parameter of type 'true'
105
+ abstract = false;
106
+ }
107
+ // Constructor parameters
108
+ (0, test_1.ex)(Test).toHaveFirstParam().ok;
109
+ // Deserialization
110
+ (0, test_1.ex)(Test.deserialize).toHaveFirstParam().ok;
111
+ const a = Test.deserialize("a");
112
+ (0, test_1.ex)(a).toBeInstanceOf(Test).ok;
113
+ // Additional prototype
114
+ (0, test_1.ex)(a.test).toBe(true).ok;
115
+ // Inherited prototype on deserialization
116
+ (0, test_1.ex)(a.value).toBe("a").ok;
117
+ (0, test_1.ex)(a.match({
118
+ a: () => 1,
119
+ b: () => 2,
120
+ _: () => 3,
121
+ })).toBe(1).ok;
122
+ (0, test_1.ex)(a.is("a")).toBe(true).ok;
123
+ // Serialization
124
+ (0, test_1.ex)(a.serialize()).toBe("a").ok;
125
+ // Instantiation
126
+ const b = new Test("a");
127
+ (0, test_1.ex)(b).toBeInstanceOf(Test).ok;
128
+ // Inherited prototype on instantiation
129
+ (0, test_1.ex)(b.value).toBe("a").ok;
130
+ (0, test_1.ex)(a.match({
131
+ a: () => 1,
132
+ b: () => 2,
133
+ _: () => 3,
134
+ })).toBe(1).ok;
135
+ (0, test_1.ex)(b.is("a")).toBe(true).ok;
136
+ // Inherited statics
137
+ (0, test_1.ex)(Test.a()).toBeInstanceOf(Test).ok;
138
+ (0, test_1.ex)(Test.b()).toBeInstanceOf(Test).ok;
139
+ (0, test_1.ex)(Test.c()).toBeInstanceOf(Test).ok;
140
+ // Additional inherited static prototype
141
+ (0, test_1.ex)(Test.deep).toBe(true).ok;
142
+ // Additional inherited prototype
143
+ (0, test_1.ex)(b.abstract).toBe(false).ok;
144
+ (0, test_1.ex)(b.deep).toBe(true).ok;
145
+ });
146
+ });
147
+ //# sourceMappingURL=choice.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"choice.spec.js","sourceRoot":"","sources":["../src/choice.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { AbstractConstructor, Empty, Constructor, Expand } from "./_";
2
+ export type ClassShorthand = Constructor<{
3
+ serialize(): any;
4
+ }> & {
5
+ deserialize(value: any): any;
6
+ };
7
+ export declare const Class: <S extends Constructor<{
8
+ serialize(): any;
9
+ }, any[]> & {
10
+ deserialize(value: any): any;
11
+ }, B extends AbstractConstructor<any> = typeof Empty>(of: S, base?: typeof Empty) => (abstract new (value: InstanceType<B>) => {
12
+ value: InstanceType<B>;
13
+ serialize<T extends any>(this: T): Expand<ReturnType<InstanceType<S>["serialize"]>>;
14
+ }) & {
15
+ $name: "class";
16
+ deserialize<T_1 extends Constructor<any, any[]>>(this: T_1, value: Expand<ReturnType<InstanceType<S>["serialize"]>>): InstanceType<T_1>;
17
+ $deserialize(value: ReturnType<InstanceType<S>["serialize"]>): InstanceType<S>;
18
+ $serialize<T_2 extends any>(this: T_2, value: InstanceType<S>): ReturnType<InstanceType<S>["serialize"]>;
19
+ $inline: InstanceType<S>;
20
+ };
21
+ //# sourceMappingURL=class.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"class.d.ts","sourceRoot":"","sources":["../src/class.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAEtE,MAAM,MAAM,cAAc,GAAG,WAAW,CAAC;IAAE,SAAS,IAAI,GAAG,CAAA;CAAE,CAAC,GAAG;IAC/D,WAAW,CAAC,KAAK,EAAE,GAAG,GAAG,GAAG,CAAC;CAC9B,CAAC;AAEF,eAAO,MAAM,KAAK;iBACqB,GAAG;;uBACnB,GAAG,GAAG,GAAG;;;;;;;;;;CA6C/B,CAAC"}
package/dist/class.js ADDED
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Class = void 0;
4
+ const _1 = require("./_");
5
+ const Class = (of, base = _1.Empty) => {
6
+ class $Class extends base {
7
+ value;
8
+ static $name = "class";
9
+ constructor(value) {
10
+ super();
11
+ this.value = value;
12
+ }
13
+ static deserialize(value) {
14
+ return new this(of.deserialize(value));
15
+ }
16
+ serialize() {
17
+ return this.value.serialize();
18
+ }
19
+ static $deserialize(value) {
20
+ return of.deserialize(value);
21
+ }
22
+ static $serialize(value) {
23
+ return value.serialize();
24
+ }
25
+ static $inline;
26
+ }
27
+ return $Class;
28
+ };
29
+ exports.Class = Class;
30
+ //# sourceMappingURL=class.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"class.js","sourceRoot":"","sources":["../src/class.ts"],"names":[],"mappings":";;;AAAA,0BAAsE;AAM/D,MAAM,KAAK,GAAG,CAMnB,EAAK,EACL,IAAI,GAAG,QAAK,EACZ,EAAE;IAIF,MAAe,MAAO,SAAQ,IAAI;QAGb;QAFnB,MAAM,CAAC,KAAK,GAAG,OAAgB,CAAC;QAEhC,YAAmB,KAAsB;YACvC,KAAK,EAAE,CAAC;YADS,UAAK,GAAL,KAAK,CAAiB;QAEzC,CAAC;QAED,MAAM,CAAC,WAAW,CAEhB,KAAyB;YAEzB,OAAO,IAAI,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,CAAoB,CAAC;QAC5D,CAAC;QAED,SAAS;YACP,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;QAChC,CAAC;QAED,MAAM,CAAC,YAAY,CAAC,KAAiB;YACnC,OAAO,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;QAED,MAAM,CAAC,UAAU,CAEf,KAAa;YAEb,OAAO,KAAK,CAAC,SAAS,EAAE,CAAC;QAC3B,CAAC;QAED,MAAM,CAAC,OAAO,CAAS;;IAKzB,OAAO,MAAe,CAAC;AACzB,CAAC,CAAC;AA/CW,QAAA,KAAK,SA+ChB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=class.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"class.spec.d.ts","sourceRoot":"","sources":["../src/class.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const class_1 = require("./class");
4
+ const dict_1 = require("./dict");
5
+ const test_1 = require("./test");
6
+ describe("Class", () => {
7
+ it("inline definition", () => {
8
+ class A {
9
+ serialize() {
10
+ return "a";
11
+ }
12
+ static deserialize(value) {
13
+ return new A();
14
+ }
15
+ }
16
+ class Test extends (0, dict_1.Dict)({
17
+ nested: (0, class_1.Class)(A),
18
+ }) {
19
+ test = true;
20
+ }
21
+ // Constructor parameters
22
+ (0, test_1.ex)(Test).toHaveFirstParam().ok;
23
+ // Deserializes to self
24
+ (0, test_1.ex)(Test.deserialize).toHaveFirstParam().ok;
25
+ const a = Test.deserialize({ nested: "a" });
26
+ (0, test_1.ex)(a).toBeInstanceOf(Test).ok;
27
+ // Property is still there
28
+ const b = a.test;
29
+ (0, test_1.ex)(b).toBe(true).ok;
30
+ // Serializes to a precise type
31
+ (0, test_1.ex)(a.serialize()).toStrictEqual({ nested: "a" }).ok;
32
+ // Shape is still there
33
+ (0, test_1.ex)(a.nested.serialize()).toBe("a").ok;
34
+ // Instantiates with a precise type
35
+ const e = new Test({ nested: new A() });
36
+ (0, test_1.ex)(e).toBeInstanceOf(Test).ok;
37
+ });
38
+ });
39
+ //# sourceMappingURL=class.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"class.spec.js","sourceRoot":"","sources":["../src/class.spec.ts"],"names":[],"mappings":";;AAAA,mCAAgC;AAChC,iCAA8B;AAC9B,iCAA4B;AAE5B,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE;IACrB,EAAE,CAAC,mBAAmB,EAAE,GAAG,EAAE;QAC3B,MAAM,CAAC;YACL,SAAS;gBACP,OAAO,GAAG,CAAC;YACb,CAAC;YAED,MAAM,CAAC,WAAW,CAAC,KAAa;gBAC9B,OAAO,IAAI,CAAC,EAAE,CAAC;YACjB,CAAC;SACF;QAED,MAAM,IAAK,SAAQ,IAAA,WAAI,EAAC;YACtB,MAAM,EAAE,IAAA,aAAK,EAAC,CAAC,CAAC;SACjB,CAAC;YACA,IAAI,GAAG,IAAa,CAAC;SACtB;QAID,yBAAyB;QACzB,IAAA,SAAE,EAAC,IAAI,CAAC,CAAC,gBAAgB,EAAiB,CAAC,EAAE,CAAC;QAE9C,uBAAuB;QACvB,IAAA,SAAE,EAAC,IAAI,CAAC,WAAW,CAAC,CAAC,gBAAgB,EAAc,CAAC,EAAE,CAAC;QACvD,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QAC5C,IAAA,SAAE,EAAC,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QAE9B,0BAA0B;QAC1B,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;QACjB,IAAA,SAAE,EAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAa,CAAC,CAAC,EAAE,CAAC;QAE7B,+BAA+B;QAC/B,IAAA,SAAE,EAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC;QAEpD,uBAAuB;QACvB,IAAA,SAAE,EAAC,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QAEtC,mCAAmC;QACnC,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QACxC,IAAA,SAAE,EAAC,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;IAChC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
package/dist/dict.d.ts ADDED
@@ -0,0 +1,26 @@
1
+ import { DefinitionOf, Shorthand, Expand, AbstractConstructor, Constructor, Empty } from "./_";
2
+ export type DictShorthand = {
3
+ [key: string]: Shorthand;
4
+ };
5
+ export declare const Dict: <S extends {
6
+ [key: string]: any;
7
+ }, B extends AbstractConstructor<{}> = typeof Empty>(definition: S, base?: B) => Omit<B, "prototype"> & ((abstract new (...args: any[]) => {
8
+ [x: string]: any;
9
+ serialize(): Expand<{ [K in keyof S]: ReturnType<{ [K_1 in keyof S]: DefinitionOf<S[K_1]>; }[K]["$serialize"]>; }>;
10
+ }) & {
11
+ [x: string]: any;
12
+ $name: "dict";
13
+ shape: S;
14
+ serialized: { [K_2 in keyof S]: DefinitionOf<S[K_2]>; };
15
+ deserialize<T extends Constructor<any, any[]>>(this: T, value: Expand<{ [K in keyof S]: ReturnType<{ [K_1 in keyof S]: DefinitionOf<S[K_1]>; }[K]["$serialize"]>; }>): InstanceType<T>;
16
+ $deserialize<T_1 extends Omit<any, ""> & (new (...params: any[]) => {
17
+ [x: string]: any;
18
+ serialize(): Expand<{ [K in keyof S]: ReturnType<{ [K_1 in keyof S]: DefinitionOf<S[K_1]>; }[K]["$serialize"]>; }>;
19
+ })>(this: T_1, value: { [K in keyof S]: ReturnType<{ [K_1 in keyof S]: DefinitionOf<S[K_1]>; }[K]["$serialize"]>; }): { [K_3 in keyof { [K_1 in keyof S]: DefinitionOf<S[K_1]>; }]: { [K_1 in keyof S]: DefinitionOf<S[K_1]>; }[K_3]["$inline"]; };
20
+ $serialize<T_2 extends any>(this: T_2, value: InstanceType<T_2>): { [K in keyof S]: ReturnType<{ [K_1 in keyof S]: DefinitionOf<S[K_1]>; }[K]["$serialize"]>; };
21
+ $inline: { [K_3 in keyof { [K_1 in keyof S]: DefinitionOf<S[K_1]>; }]: { [K_1 in keyof S]: DefinitionOf<S[K_1]>; }[K_3]["$inline"]; };
22
+ }) & (abstract new (value: Expand<{ [K_3 in keyof { [K_1 in keyof S]: DefinitionOf<S[K_1]>; }]: { [K_1 in keyof S]: DefinitionOf<S[K_1]>; }[K_3]["$inline"]; }>) => InstanceType<B> & {
23
+ [x: string]: any;
24
+ serialize(): Expand<{ [K in keyof S]: ReturnType<{ [K_1 in keyof S]: DefinitionOf<S[K_1]>; }[K]["$serialize"]>; }>;
25
+ } & { [K_3 in keyof { [K_1 in keyof S]: DefinitionOf<S[K_1]>; }]: { [K_1 in keyof S]: DefinitionOf<S[K_1]>; }[K_3]["$inline"]; });
26
+ //# sourceMappingURL=dict.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dict.d.ts","sourceRoot":"","sources":["../src/dict.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,SAAS,EAGT,MAAM,EACN,mBAAmB,EACnB,WAAW,EACX,KAAK,EACN,MAAM,KAAK,CAAC;AAEb,MAAM,MAAM,aAAa,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AAEzD,eAAO,MAAM,IAAI;;iIAwBQ,GAAG,EAAE;;;;;;;;;;;;;;;;;;iIAqD7B,CAAC"}