@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 +306 -0
- package/dist/index.d.ts +66 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +40 -0
- package/dist/index.js.map +1 -0
- package/dist/index.spec.d.ts +2 -0
- package/dist/index.spec.d.ts.map +1 -0
- package/dist/index.spec.js +405 -0
- package/dist/index.spec.js.map +1 -0
- package/package.json +15 -0
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).
|
package/dist/index.d.ts
ADDED
|
@@ -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 @@
|
|
|
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
|
+
}
|