@ddd-ts/traits 0.0.0-alpha2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,306 @@
1
+ # @ddd-ts/traits 👥💡
2
+
3
+ A TypeScript typesafe library for implementing the trait pattern.
4
+
5
+ ## Installation ⬇️
6
+
7
+ ```
8
+ npm install @ddd-ts/traits
9
+ ```
10
+
11
+ ## Usage 🚀
12
+
13
+ The `@ddd-ts/traits` library provides utility functions for implementing the trait pattern in TypeScript. Traits allow you to compose reusable behaviors and mix them into classes without the need for inheritance.
14
+
15
+
16
+ - [Importing](#importing-)
17
+ - [Creating Traits](#creating-traits-)
18
+ - [Deriving Traits](#deriving-traits-)
19
+ - [Overloading Trait Methods](#overloading-trait-methods-)
20
+ - [Deriving Multiple Traits](#deriving-multiple-traits-)
21
+ - [Traits with Constructors](#traits-with-constructors-)
22
+ - [Type Checking with Traits](#type-checking-with-traits-)
23
+ - [Generic Traits](#generic-traits-)
24
+ - [Subtraits](#subtraits-)
25
+ - [Subtraits with Props](#subtraits-with-props-)
26
+ - [Forwarding Supertraits Props](#forwarding-supertraits-props-)
27
+ - [Limitations](#limitations-)
28
+
29
+
30
+ ### Importing 📥
31
+
32
+ ```typescript
33
+ import { Derive, Subtrait, Trait, implementsTrait } from "@ddd-ts/traits";
34
+ ```
35
+
36
+ ### Creating Traits ✨
37
+
38
+ A trait is defined using the `Trait` function, which takes a base class and returns a new class that extends the base class with additional behavior.
39
+
40
+ ```typescript
41
+ const Swim = Trait(
42
+ (base) =>
43
+ class extends base {
44
+ swim() {
45
+ return 1;
46
+ }
47
+ }
48
+ );
49
+
50
+ const Walk = Trait(
51
+ (base) =>
52
+ class extends base {
53
+ walk() {
54
+ return 1;
55
+ }
56
+ }
57
+ );
58
+ ```
59
+
60
+ ### Deriving Traits 🧬
61
+
62
+ To apply a trait to a class, use the `Derive` function. It takes the trait as an argument and returns a new class that extends the base class with the trait's behavior.
63
+
64
+ ```typescript
65
+ class Fish extends Derive(Swim) {}
66
+
67
+ const fish = new Fish({});
68
+
69
+ console.log(fish.swim()); // Output: 1
70
+ ```
71
+
72
+ ### Overloading Trait Methods ⚙️
73
+
74
+ You can override a trait method in a derived class by defining the same method and using the `super` keyword to call the base implementation.
75
+
76
+ ```typescript
77
+ class Dog extends Derive(Swim) {
78
+ swim() {
79
+ return super.swim() * 0.2;
80
+ }
81
+ }
82
+
83
+ const dog = new Dog({});
84
+
85
+ console.log(dog.swim()); // Output: 0.2
86
+ ```
87
+
88
+ ### Deriving Multiple Traits 🌟
89
+
90
+ You can derive multiple traits by passing them as arguments to the `Derive` function.
91
+
92
+ ```typescript
93
+ class Dog extends Derive(Swim, Walk) {}
94
+
95
+ const dog = new Dog({});
96
+
97
+ console.log(dog.swim()); // Output: 1
98
+ console.log(dog.walk()); // Output: 1
99
+ ```
100
+
101
+ ### Traits with Constructors 🏗️
102
+
103
+ If a trait requires initialization with certain properties, you can define a constructor in the trait class. When deriving a trait, you can pass the required properties to the `super` constructor.
104
+
105
+ ```typescript
106
+ const Run = Trait(
107
+ (base) =>
108
+ class extends base {
109
+ speed: number;
110
+ constructor(props: { speed: number }) {
111
+ super(props);
112
+ this.speed = props.speed;
113
+ }
114
+ run() {
115
+ return 2 * this.speed;
116
+ }
117
+ }
118
+ );
119
+
120
+ class Athlete extends Derive(Run) {
121
+ constructor() {
122
+ super({ speed: 10 });
123
+ }
124
+ }
125
+
126
+ const athlete = new Athlete();
127
+
128
+ console.log(athlete.run()); // Output: 20
129
+ ```
130
+
131
+ ### Type Checking with Traits ✅
132
+
133
+ You can use the `implementsTrait` function to check if an instance implements a specific trait.
134
+
135
+ ```typescript
136
+ class Athlete extends Derive(Run) {
137
+ constructor() {
138
+ super({ speed: 10 });
139
+ }
140
+ }
141
+
142
+ const athlete = new Athlete();
143
+
144
+ console.log(athlete instanceof Athlete); // Output: true
145
+ console.log(implementsTrait(athlete, Run)); // Output: true
146
+ ```
147
+
148
+ ### Generic Traits 🎛️
149
+
150
+ Traits can also be generic, allowing you to specify additional type parameters when applying the trait.
151
+
152
+ ```typescript
153
+ const Eat = <E>() =>
154
+ Trait(
155
+ (base) =>
156
+ class extends base {
157
+ eat(_e: E) {}
158
+ }
159
+ );
160
+
161
+ class Animal extends Derive(Eat<string>()) {
162
+ do() {
163
+ this.eat("a");
164
+ // @ts-expect-error should
165
+
166
+ not allow to eat a number
167
+ this.eat(1);
168
+ }
169
+ }
170
+ ```
171
+
172
+ ### Subtraits 🌳
173
+
174
+ Subtraits allow you to define traits that depend on other traits. The `Subtrait` function is used to create a subtrait, specifying the supertraits it depends on and the additional behavior it provides.
175
+
176
+ ```typescript
177
+ const Walk = Trait(
178
+ (base) =>
179
+ class extends base {
180
+ walk() {}
181
+ }
182
+ );
183
+
184
+ const Run = Subtrait(
185
+ [Walk] as const, // supertrait of subtrait defined here
186
+ (base, Props) =>
187
+ class extends base {
188
+ run() {
189
+ this.walk();
190
+ this.walk();
191
+ this.walk();
192
+ }
193
+ }
194
+ );
195
+
196
+ class Athlete extends Derive(Walk, Run) {
197
+ do() {
198
+ this.walk();
199
+ this.run();
200
+ }
201
+ }
202
+ ```
203
+
204
+ ### Subtraits with Props 🔧
205
+
206
+ Subtraits can also accept additional properties in their constructors. The supertraits' properties are automatically forwarded to the subtrait's constructor.
207
+
208
+ ```typescript
209
+ const Walk = Trait(
210
+ (base) =>
211
+ class extends base {
212
+ walk() {
213
+ return 2;
214
+ }
215
+ }
216
+ );
217
+
218
+ const Run = Subtrait(
219
+ [Walk], // supertrait of subtrait defined here
220
+ (base) =>
221
+ class extends base {
222
+ speed: number;
223
+ constructor(props: { speed: number }) {
224
+ super({});
225
+ this.speed = props.speed;
226
+ }
227
+ run() {
228
+ return this.walk() * this.speed;
229
+ }
230
+ }
231
+ );
232
+
233
+ class Athlete extends Derive(Walk, Run) {
234
+ constructor() {
235
+ super({ speed: 10 });
236
+ }
237
+ start() {
238
+ return this.walk() + this.run();
239
+ }
240
+ }
241
+
242
+ const athlete = new Athlete();
243
+
244
+ console.log(athlete.start()); // Output: 22
245
+ ```
246
+
247
+ ### Forwarding Supertraits Props ↔️
248
+
249
+ When using subtraits with multiple supertraits, the properties of all supertraits are automatically forwarded to the subtrait's constructor.
250
+
251
+ ```typescript
252
+ const Walk = Trait(
253
+ (base) =>
254
+ class extends base {
255
+ speed: number;
256
+ constructor(props: { speed: number }) {
257
+ super(props);
258
+ this.speed = props.speed;
259
+ }
260
+ walk() {
261
+ return this.speed * 0.1;
262
+ }
263
+ }
264
+ );
265
+
266
+ const Fly = Trait(
267
+ (base) =>
268
+ class extends base {
269
+ wings: number;
270
+ constructor(props: { wings: number }) {
271
+ super({});
272
+ this.wings = props.wings;
273
+ }
274
+ fly() {
275
+ return this.wings;
276
+ }
277
+ }
278
+ );
279
+
280
+ const Land = Subtrait(
281
+ [Walk, Fly], // supertraits of subtrait defined here
282
+ (base, Props) =>
283
+ class extends base {
284
+ constructor(props: { weight: number } & typeof Props) {
285
+ super(props);
286
+ }
287
+ land() {
288
+ return this.walk() + this.fly() - this.weight;
289
+ }
290
+ }
291
+ );
292
+
293
+ class Athlete extends Derive(Walk, Fly, Land) {}
294
+
295
+ const athlete = new Athlete({ speed: 10, weight: 10, wings: 10 });
296
+
297
+ console.log(athlete.land()); // Output: 20
298
+ ```
299
+
300
+ ### Limitations ⚠️
301
+
302
+ - The ordering of supertraits is important. Subtraits must be derived in the correct order of their dependencies.
303
+
304
+ ## License 📄
305
+
306
+ This project is licensed under the [MIT License](LICENSE).
@@ -0,0 +1,66 @@
1
+ export type Constructor<Props extends any = any, Result extends {} = {}> = new (props: Props) => Result;
2
+ export type AbstractConstructor<Props extends any = any, Result extends {} = {}> = abstract new (props: Props) => Result;
3
+ export type Trait<Factory extends <Base extends AbstractConstructor>(base: Base) => AbstractConstructor = any> = {
4
+ factory: Factory;
5
+ superTraits: readonly Trait<any>[];
6
+ };
7
+ type Explode<T> = {
8
+ [P in keyof T]: T[P];
9
+ };
10
+ export type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never;
11
+ type MergeStaticSide<T extends readonly Trait[]> = UnionToIntersection<Explode<ReturnType<[...T][number]["factory"]>>>;
12
+ export type MergeInstanceSide<T extends readonly Trait[]> = T extends [] ? {} : T extends never[] ? {} : UnionToIntersection<InstanceType<ReturnType<[...T][number]["factory"]>>>;
13
+ export type MergeParameter<T extends readonly Trait[]> = T extends [] ? {} : T extends never[] ? {} : ConstructorParameters<ReturnType<[...T][number]["factory"]>>[0] extends {} ? UnionToIntersection<ConstructorParameters<ReturnType<[...T][number]["factory"]>>[0]> : ConstructorParameters<ReturnType<[...T][number]["factory"]>>[0];
14
+ export type ApplyTraits<T extends readonly Trait[]> = {
15
+ new (param: MergeParameter<T>): MergeInstanceSide<T>;
16
+ } & MergeStaticSide<T>;
17
+ export type CheckTraitRequirements<Traits extends readonly Trait[]> = CheckTraitRequirementsInternal<[], Traits>;
18
+ type CheckTraitRequirementsInternal<AppliedTraits extends readonly Trait[], RemainingTraits extends readonly Trait[]> = RemainingTraits extends readonly [
19
+ infer ApplyingTrait extends Trait,
20
+ ...infer Rest extends Trait[]
21
+ ] ? MergeParameter<AppliedTraits> extends MergeParameter<ApplyingTrait["superTraits"]> ? MergeInstanceSide<AppliedTraits> extends MergeInstanceSide<ApplyingTrait["superTraits"]> ? CheckTraitRequirementsInternal<[...AppliedTraits, ApplyingTrait], Rest> : {
22
+ error: "Instance mismatch";
23
+ check: "MergeInstanceSide<AppliedTraits> extends MergeInstanceSide<ApplyingTrait['superTraits']>";
24
+ left: MergeInstanceSide<AppliedTraits>;
25
+ right: MergeInstanceSide<ApplyingTrait["superTraits"]>;
26
+ result: MergeInstanceSide<AppliedTraits> extends MergeInstanceSide<ApplyingTrait["superTraits"]> ? true : false;
27
+ } : {
28
+ error: "Parameter mismatch";
29
+ check: "MergeParameter<AppliedTraits> extends MergeParameter<[ApplyingTrait]>";
30
+ left: MergeParameter<AppliedTraits>;
31
+ right: MergeParameter<[ApplyingTrait]>;
32
+ result: MergeParameter<AppliedTraits> extends MergeParameter<[
33
+ ApplyingTrait
34
+ ]> ? true : false;
35
+ } : "success";
36
+ export declare function Subtrait<const SuperTraits extends readonly Trait[], Applied extends ApplyTraits<SuperTraits>, const Factory extends (base: Applied, props: ConstructorParameters<Applied>[0]) => AbstractConstructor>(superTraits: SuperTraits, factory: Factory): {
37
+ factory: Factory;
38
+ superTraits: SuperTraits;
39
+ symbol: symbol;
40
+ };
41
+ export type Props<T extends {
42
+ __traits_props__: any;
43
+ } | Trait | Trait[]> = T extends {
44
+ __traits_props__: any;
45
+ } ? T["__traits_props__"] : T extends Trait ? MergeParameter<[T]> : T extends Trait[] ? MergeParameter<T> : never;
46
+ export declare function Derive<R extends Trait[], C extends CheckTraitRequirements<R>>(...traits: R): C extends "success" ? ApplyTraits<R> & {
47
+ __traits__: R;
48
+ __traits_props__: MergeParameter<R>;
49
+ } : C;
50
+ export declare const Trait: <T extends (base: AbstractConstructor<{}, {}>) => AbstractConstructor<any, any>>(factory: T) => {
51
+ factory: T;
52
+ superTraits: Trait<any>[];
53
+ symbol: symbol;
54
+ };
55
+ export declare function implementsTrait<I extends InstanceType<any>, T extends Trait>(instance: I, trait: T): instance is ImplementsTrait<T>;
56
+ export type HasTrait<T extends Trait> = ReturnType<T["factory"]>;
57
+ export type ImplementsTrait<T extends Trait> = InstanceType<ReturnType<T["factory"]>>;
58
+ export declare const WithProps: <P extends Record<string, any>>() => {
59
+ factory: (base: AbstractConstructor<{}, {}>) => {
60
+ new (props: {}): {};
61
+ } & (new (props: {}) => {} & P);
62
+ superTraits: Trait<any>[];
63
+ symbol: symbol;
64
+ };
65
+ export {};
66
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js ADDED
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WithProps = exports.implementsTrait = exports.Trait = exports.Derive = exports.Subtrait = void 0;
4
+ function Subtrait(superTraits, factory) {
5
+ const symbol = Symbol();
6
+ return {
7
+ factory,
8
+ superTraits,
9
+ symbol
10
+ };
11
+ }
12
+ exports.Subtrait = Subtrait;
13
+ function Derive(...traits) {
14
+ let current = class {
15
+ };
16
+ for (const trait of traits) {
17
+ current = trait.factory(current);
18
+ }
19
+ for (const trait of traits) {
20
+ current[trait.symbol] = true;
21
+ }
22
+ return current;
23
+ }
24
+ exports.Derive = Derive;
25
+ const Trait = (factory) => {
26
+ const symbol = Symbol();
27
+ return { factory, superTraits: [], symbol };
28
+ };
29
+ exports.Trait = Trait;
30
+ function implementsTrait(instance, trait) {
31
+ return instance.constructor[trait.symbol] === true;
32
+ }
33
+ exports.implementsTrait = implementsTrait;
34
+ const WithProps = () => (0, exports.Trait)((base) => {
35
+ class Intermediate extends base {
36
+ }
37
+ return Intermediate;
38
+ });
39
+ exports.WithProps = WithProps;
40
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAmFA,SAAgB,QAAQ,CAOtB,WAAwB,EAAE,OAAgB;IAC1C,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;IACxB,OAAO;QACL,OAAO;QACP,WAAW;QACX,MAAM;KACP,CAAC;AACJ,CAAC;AAdD,4BAcC;AAaD,SAAgB,MAAM,CACpB,GAAG,MAAS;IAIZ,IAAI,OAAO,GAAgB;KAAS,CAAC;IACrC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC1B,OAAe,CAAE,KAAa,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;IACjD,CAAC;IAED,OAAO,OAAc,CAAC;AACxB,CAAC;AAfD,wBAeC;AACM,MAAM,KAAK,GAAG,CAGnB,OAAU,EACV,EAAE;IACF,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;IACxB,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,EAAa,EAAE,MAAM,EAAE,CAAC;AACzD,CAAC,CAAC;AAPW,QAAA,KAAK,SAOhB;AAEF,SAAgB,eAAe,CAC7B,QAAW,EACX,KAAQ;IAER,OAAQ,QAAgB,CAAC,WAAW,CAAE,KAAa,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC;AACvE,CAAC;AALD,0CAKC;AAQM,MAAM,SAAS,GAAG,GAAkC,EAAE,CAC3D,IAAA,aAAK,EAAC,CAAC,IAAI,EAAE,EAAE;IACb,MAAM,YAAa,SAAQ,IAAI;KAAI;IAInC,OAAO,YAAuC,CAAC;AACjD,CAAC,CAAC,CAAC;AAPQ,QAAA,SAAS,aAOjB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.spec.d.ts","sourceRoot":"","sources":["../src/index.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,405 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const _1 = require(".");
4
+ describe("Traits", () => {
5
+ const Swim = (0, _1.Trait)((base) => class Swim extends base {
6
+ swim() {
7
+ return 1;
8
+ }
9
+ });
10
+ const Walk = (0, _1.Trait)((base) => class extends base {
11
+ walk() {
12
+ return 1;
13
+ }
14
+ });
15
+ it("derives a trait", () => {
16
+ class Fish extends (0, _1.Derive)(Swim) {
17
+ do() {
18
+ // @ts-expect-error should be strictly typed
19
+ this.test();
20
+ }
21
+ }
22
+ const fish = new Fish({});
23
+ expect(fish.swim()).toBe(1);
24
+ });
25
+ it("overloads a trait method", () => {
26
+ class Dog extends (0, _1.Derive)(Swim) {
27
+ swim() {
28
+ return super.swim() * 0.2;
29
+ }
30
+ }
31
+ const dog = new Dog({});
32
+ expect(dog.swim()).toBe(0.2);
33
+ });
34
+ it("derives multiple traits", () => {
35
+ class Dog extends (0, _1.Derive)(Swim, Walk) {
36
+ }
37
+ const dog = new Dog({});
38
+ expect(dog.swim()).toBe(1);
39
+ expect(dog.walk()).toBe(1);
40
+ });
41
+ const Run = (0, _1.Trait)((base) => class extends base {
42
+ speed;
43
+ constructor(props) {
44
+ super(props);
45
+ this.speed = props.speed;
46
+ }
47
+ run() {
48
+ return 2 * this.speed;
49
+ }
50
+ });
51
+ it("derives a trait with a constructor", () => {
52
+ class Athlete extends (0, _1.Derive)(Run) {
53
+ constructor() {
54
+ super({ speed: 10 });
55
+ }
56
+ }
57
+ class ErrorAthlete extends (0, _1.Derive)(Run) {
58
+ constructor() {
59
+ // @ts-expect-error ensures the super constructor is called with the right props
60
+ super({});
61
+ }
62
+ }
63
+ const walker = new Athlete();
64
+ expect(walker.run()).toBe(20);
65
+ });
66
+ const Jump = (0, _1.Trait)((base) => class extends base {
67
+ agility;
68
+ constructor(props) {
69
+ super(props);
70
+ this.agility = props.agility;
71
+ }
72
+ jump() {
73
+ return 1;
74
+ }
75
+ });
76
+ it("derives multiple trait with a constructor", () => {
77
+ class Athlete extends (0, _1.Derive)(Run, Jump) {
78
+ constructor() {
79
+ super({ speed: 10, agility: 10 });
80
+ }
81
+ }
82
+ const walker = new Athlete();
83
+ expect(walker.run()).toBe(20);
84
+ });
85
+ it("asserts an instance implements a trait", () => {
86
+ const Unused = (0, _1.Trait)((base) => class extends base {
87
+ constructor(props) {
88
+ super(props);
89
+ }
90
+ });
91
+ class Athlete extends (0, _1.Derive)(Run, Jump) {
92
+ constructor() {
93
+ super({ speed: 10, agility: 10 });
94
+ }
95
+ }
96
+ const athlete = new Athlete();
97
+ expect(athlete instanceof Athlete).toBe(true);
98
+ expect((0, _1.implementsTrait)(athlete, Run)).toBe(true);
99
+ expect((0, _1.implementsTrait)(athlete, Jump)).toBe(true);
100
+ expect((0, _1.implementsTrait)(athlete, Unused)).toBe(false);
101
+ const unknown = athlete;
102
+ if ((0, _1.implementsTrait)(unknown, Run) && (0, _1.implementsTrait)(unknown, Jump)) {
103
+ // if type error, ensure the type guard works
104
+ unknown.run();
105
+ unknown.jump();
106
+ }
107
+ });
108
+ it("allows generic traits", () => {
109
+ const Eat = () => (0, _1.Trait)((base) => class extends base {
110
+ eat(_e) { }
111
+ });
112
+ class Animal extends (0, _1.Derive)(Eat()) {
113
+ do() {
114
+ this.eat("a");
115
+ // @ts-expect-error should not allow to eat a number
116
+ this.eat(1);
117
+ }
118
+ }
119
+ });
120
+ it("allows to easily access prop types", () => {
121
+ const WithProperties = () => (0, _1.Trait)((base) => class extends base {
122
+ a;
123
+ b;
124
+ c;
125
+ constructor(props) {
126
+ super(props);
127
+ this.a = props.a;
128
+ this.b = props.b;
129
+ this.c = props.c;
130
+ }
131
+ });
132
+ class Thing extends (0, _1.Derive)(WithProperties()) {
133
+ constructor(props) {
134
+ super(props);
135
+ }
136
+ do() {
137
+ const a = this.a;
138
+ const b = this.b;
139
+ const c = this.c;
140
+ }
141
+ }
142
+ });
143
+ it("allows a trait to construct the base class", () => {
144
+ const WithProperties = () => (0, _1.Trait)((base) => class extends base {
145
+ a;
146
+ b;
147
+ c;
148
+ constructor(props) {
149
+ super(props);
150
+ this.a = props.a;
151
+ this.b = props.b;
152
+ this.c = props.c;
153
+ }
154
+ static new(props) {
155
+ return new this({ ...props });
156
+ }
157
+ });
158
+ class Thing extends (0, _1.Derive)(WithProperties()) {
159
+ constructor(props) {
160
+ super(props);
161
+ }
162
+ }
163
+ Thing.new({ a: "a", b: true, c: 1, d: null });
164
+ });
165
+ describe("Subtraits", () => {
166
+ it("allows to specify supertraits", () => {
167
+ const Walk = (0, _1.Trait)((base) => class Walk extends base {
168
+ walk() { }
169
+ });
170
+ const Run = (0, _1.Subtrait)([Walk], // supertrait of subtrait defined here
171
+ (base) => class Run extends base {
172
+ run() {
173
+ this.walk();
174
+ this.walk();
175
+ this.walk();
176
+ }
177
+ });
178
+ // @ts-expect-error should not allow to create a runner without a walker
179
+ class ErrorAthlete extends (0, _1.Derive)(Run) {
180
+ }
181
+ // @ts-expect-error ordering matters: an athlete is a Runner because it is a walker
182
+ class ErrorAthlete2 extends (0, _1.Derive)(Run, Walk) {
183
+ }
184
+ class Athlete extends (0, _1.Derive)(Walk, Run) {
185
+ do() {
186
+ this.walk();
187
+ this.run();
188
+ }
189
+ }
190
+ });
191
+ it("allows to specify supertraits with props", () => {
192
+ const Walk = (0, _1.Trait)((base) => class extends base {
193
+ walk() {
194
+ return 2;
195
+ }
196
+ });
197
+ const Run = (0, _1.Subtrait)([Walk], // supertrait of subtrait defined here
198
+ (base) => class extends base {
199
+ speed;
200
+ constructor(props) {
201
+ super({});
202
+ this.speed = props.speed;
203
+ }
204
+ run() {
205
+ return this.walk() * this.speed;
206
+ }
207
+ });
208
+ class Athlete extends (0, _1.Derive)(Walk, Run) {
209
+ constructor() {
210
+ super({ speed: 10 });
211
+ }
212
+ start() {
213
+ return this.walk() + this.run();
214
+ }
215
+ }
216
+ const athlete = new Athlete();
217
+ expect(athlete.start()).toBe(22);
218
+ });
219
+ it("ensures supertraits props are forwarded", () => {
220
+ const Walk = (0, _1.Trait)((base) => class extends base {
221
+ speed;
222
+ constructor(props) {
223
+ super(props);
224
+ this.speed = props.speed;
225
+ }
226
+ walk() {
227
+ return this.speed * 0.1;
228
+ }
229
+ });
230
+ const Run = (0, _1.Subtrait)([Walk], // supertrait of subtrait defined here
231
+ (base, Props) => class extends base {
232
+ weigth;
233
+ constructor(props) {
234
+ super(props);
235
+ this.weigth = props.weigth;
236
+ }
237
+ run() {
238
+ return this.walk() * 10 + this.weigth;
239
+ }
240
+ });
241
+ class Athlete extends (0, _1.Derive)(Walk, Run) {
242
+ start() {
243
+ return this.walk() + this.run();
244
+ }
245
+ }
246
+ // @ts-expect-error missing subtrait props
247
+ new Athlete({ speed: 10 });
248
+ // @ts-expect-error missing supertrait props
249
+ new Athlete({ weigth: 10 });
250
+ const athlete = new Athlete({ speed: 10, weigth: 10 });
251
+ expect(athlete.start()).toBe(21);
252
+ });
253
+ it("ensures supertraits props are forwarded with multiple subtraits", () => {
254
+ const Walk = (0, _1.Trait)((base) => class Walk extends base {
255
+ speed;
256
+ constructor(props) {
257
+ super({});
258
+ this.speed = props.speed;
259
+ }
260
+ walk() {
261
+ return this.speed * 0.1;
262
+ }
263
+ });
264
+ const Fly = (0, _1.Trait)((base) => class Fly extends base {
265
+ wings;
266
+ constructor(props) {
267
+ super({});
268
+ this.wings = props.wings;
269
+ }
270
+ fly() {
271
+ // @ts-expect-error wings is a number
272
+ const s = this.wings;
273
+ return this.wings;
274
+ }
275
+ });
276
+ const Land = (0, _1.Subtrait)([Walk, Fly], // supertrait of subtrait defined here
277
+ (base, Props) => class Land extends base {
278
+ weigth;
279
+ constructor(props) {
280
+ super(props);
281
+ this.weigth = props.weigth;
282
+ }
283
+ land() {
284
+ return this.walk() + this.fly() - this.weigth;
285
+ }
286
+ });
287
+ // @ts-expect-error Land requires Walk & Fly
288
+ (class extends (0, _1.Derive)(Land) {
289
+ });
290
+ // @ts-expect-error Land requires Walk & Fly
291
+ (class extends (0, _1.Derive)(Walk, Land) {
292
+ });
293
+ // @ts-expect-error Land requires Walk & Fly
294
+ (class extends (0, _1.Derive)(Fly, Land) {
295
+ });
296
+ // @ts-expect-error Land requires Walk & Fly in correct order
297
+ (class extends (0, _1.Derive)(Land, Walk, Fly) {
298
+ });
299
+ class Athlete extends (0, _1.Derive)(Walk, Fly, Land) {
300
+ }
301
+ // @ts-expect-error missing props
302
+ new Athlete({ speed: 10 });
303
+ // @ts-expect-error missing props
304
+ new Athlete({ wings: 10 });
305
+ // @ts-expect-error missing props
306
+ new Athlete({ weigth: 10 });
307
+ // @ts-expect-error missing props
308
+ new Athlete({ speed: 10, weigth: 10 });
309
+ // @ts-expect-error missing props
310
+ new Athlete({ speed: 10, wings: 10 });
311
+ // @ts-expect-error missing props
312
+ new Athlete({ weigth: 10, wings: 10 });
313
+ new Athlete({ speed: 10, weigth: 10, wings: 10 });
314
+ });
315
+ it("ensures a class can derive traits that dont depend on all other traits", () => {
316
+ const Walk = (0, _1.Trait)((base) => class Walk extends base {
317
+ speed;
318
+ constructor(props) {
319
+ super({});
320
+ this.speed = props.speed;
321
+ }
322
+ walk() {
323
+ return this.speed * 0.1;
324
+ }
325
+ });
326
+ const Fly = (0, _1.Trait)((base) => class Fly extends base {
327
+ wings;
328
+ constructor(props) {
329
+ super({});
330
+ this.wings = props.wings;
331
+ }
332
+ fly() {
333
+ // @ts-expect-error wings is a number
334
+ const s = this.wings;
335
+ return this.wings;
336
+ }
337
+ });
338
+ const Land = (0, _1.Subtrait)([Walk], // supertrait of subtrait defined here
339
+ (base, Props) => class Land extends base {
340
+ weigth;
341
+ constructor(props) {
342
+ super(props);
343
+ this.weigth = props.weigth;
344
+ }
345
+ land() {
346
+ return this.walk() - this.weigth;
347
+ }
348
+ static isLander() {
349
+ return true;
350
+ }
351
+ });
352
+ // @ts-expect-error Land requires Walk & Fly
353
+ (class extends (0, _1.Derive)(Land) {
354
+ });
355
+ // @ts-expect-error Land requires Walk
356
+ (class extends (0, _1.Derive)(Fly, Land) {
357
+ });
358
+ // @ts-expect-error Land requires Walk & Fly in correct order
359
+ (class extends (0, _1.Derive)(Land, Walk, Fly) {
360
+ });
361
+ // @ts-expect-error Land requires Walk & Fly in correct order
362
+ (class extends (0, _1.Derive)(Fly, Land, Walk) {
363
+ });
364
+ class Athlete extends (0, _1.Derive)(Walk, Fly, Land) {
365
+ }
366
+ // @ts-expect-error missing props
367
+ new Athlete({ speed: 10 });
368
+ // @ts-expect-error missing props
369
+ new Athlete({ wings: 10 });
370
+ // @ts-expect-error missing props
371
+ new Athlete({ weigth: 10 });
372
+ // @ts-expect-error missing props
373
+ new Athlete({ speed: 10, weigth: 10 });
374
+ // @ts-expect-error missing props
375
+ new Athlete({ speed: 10, wings: 10 });
376
+ // @ts-expect-error missing props
377
+ new Athlete({ weigth: 10, wings: 10 });
378
+ new Athlete({ speed: 10, weigth: 10, wings: 10 });
379
+ });
380
+ });
381
+ it('allow abstract traits', () => {
382
+ const SomeTrait = (0, _1.Trait)((base) => {
383
+ class I extends base {
384
+ }
385
+ return I;
386
+ });
387
+ const SomeSubTrait = (0, _1.Subtrait)([SomeTrait], (base, Props) => {
388
+ class I extends base {
389
+ constructor(props) {
390
+ super(props);
391
+ }
392
+ }
393
+ return I;
394
+ });
395
+ class Test extends (0, _1.Derive)(SomeTrait, SomeSubTrait) {
396
+ do() {
397
+ console.log('do');
398
+ }
399
+ }
400
+ new Test({ test: 2 });
401
+ // @ts-expect-error
402
+ new Test({ anything: 2 });
403
+ });
404
+ });
405
+ //# sourceMappingURL=index.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.spec.js","sourceRoot":"","sources":["../src/index.spec.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,15 @@
1
+ {
2
+ "name": "@ddd-ts/traits",
3
+ "version": "0.0.0-alpha2.1",
4
+ "main": "dist/index.js",
5
+ "types": "dist/index.d.ts",
6
+ "license": "MIT",
7
+ "scripts": {
8
+ "build": "tsc",
9
+ "test": "jest --config node_modules/@ddd-ts/tools/jest.config.ts"
10
+ },
11
+ "devDependencies": {
12
+ "@ddd-ts/tools": "0.0.0-alpha2.1",
13
+ "@types/jest": "^29.5.12"
14
+ }
15
+ }