ddd-node 29.2.0 → 29.4.0

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 (193) hide show
  1. package/dist/base/decorators/index.d.ts +5 -0
  2. package/dist/base/decorators/index.js +21 -0
  3. package/dist/base/decorators/model.d.ts +13 -0
  4. package/dist/base/decorators/model.js +56 -0
  5. package/dist/base/decorators/mutable.d.ts +2 -0
  6. package/dist/base/decorators/mutable.js +10 -0
  7. package/dist/base/decorators/prop.d.ts +2 -0
  8. package/dist/base/decorators/prop.js +10 -0
  9. package/dist/base/decorators/props-validator.d.ts +2 -0
  10. package/dist/base/decorators/props-validator.js +8 -0
  11. package/dist/base/decorators/static.d.ts +3 -0
  12. package/dist/base/decorators/static.js +11 -0
  13. package/dist/base/domain.d.ts +24 -0
  14. package/dist/base/domain.js +49 -0
  15. package/dist/base/index.d.ts +5 -0
  16. package/dist/base/index.js +21 -0
  17. package/dist/base/meta/index.d.ts +8 -0
  18. package/dist/base/meta/index.js +24 -0
  19. package/dist/base/meta/model-domain.d.ts +4 -0
  20. package/dist/base/meta/model-domain.js +15 -0
  21. package/dist/base/meta/model-id.d.ts +16 -0
  22. package/dist/base/meta/model-id.js +39 -0
  23. package/dist/base/meta/model-mutable.d.ts +2 -0
  24. package/dist/base/meta/model-mutable.js +14 -0
  25. package/dist/base/meta/model-name.d.ts +8 -0
  26. package/dist/base/meta/model-name.js +25 -0
  27. package/dist/base/meta/model-props-map.d.ts +6 -0
  28. package/dist/base/meta/model-props-map.js +45 -0
  29. package/dist/base/meta/model-props-validator.d.ts +6 -0
  30. package/dist/base/meta/model-props-validator.js +33 -0
  31. package/dist/base/meta/model-static-values.d.ts +13 -0
  32. package/dist/base/meta/model-static-values.js +54 -0
  33. package/dist/base/meta/model-version.d.ts +8 -0
  34. package/dist/base/meta/model-version.js +25 -0
  35. package/dist/base/model/errors.d.ts +3 -0
  36. package/dist/base/model/errors.js +9 -0
  37. package/dist/base/model/index.d.ts +3 -0
  38. package/dist/base/model/index.js +19 -0
  39. package/dist/base/model/model-descriptor.d.ts +13 -0
  40. package/dist/base/model/model-descriptor.js +2 -0
  41. package/dist/base/model/model.builder.d.ts +11 -0
  42. package/dist/base/model/model.builder.js +18 -0
  43. package/dist/base/model/model.d.ts +40 -0
  44. package/dist/base/model/model.js +117 -0
  45. package/dist/base/model-registry.d.ts +17 -0
  46. package/dist/base/model-registry.js +55 -0
  47. package/dist/core/aggregate/aggregate-base/aggregate-event-publisher.interface.d.ts +4 -0
  48. package/dist/core/aggregate/aggregate-base/aggregate-event-publisher.interface.js +2 -0
  49. package/dist/core/aggregate/aggregate-base/aggregate.builder.d.ts +6 -0
  50. package/dist/core/aggregate/aggregate-base/aggregate.builder.js +15 -0
  51. package/dist/core/aggregate/aggregate-base/aggregate.d.ts +17 -0
  52. package/dist/core/aggregate/aggregate-base/aggregate.js +46 -0
  53. package/dist/core/aggregate/aggregate-base/index.d.ts +3 -0
  54. package/dist/core/aggregate/aggregate-base/index.js +19 -0
  55. package/dist/core/aggregate/event-sourced-aggregate/event-sourced-aggregate-model-descriptor.d.ts +9 -0
  56. package/dist/core/aggregate/event-sourced-aggregate/event-sourced-aggregate-model-descriptor.js +2 -0
  57. package/dist/core/aggregate/event-sourced-aggregate/event-sourced-aggregate.builder.d.ts +13 -0
  58. package/dist/core/aggregate/event-sourced-aggregate/event-sourced-aggregate.builder.js +33 -0
  59. package/dist/core/aggregate/event-sourced-aggregate/event-sourced-aggregate.d.ts +49 -0
  60. package/dist/core/aggregate/event-sourced-aggregate/event-sourced-aggregate.js +141 -0
  61. package/dist/core/aggregate/event-sourced-aggregate/index.d.ts +2 -0
  62. package/dist/core/aggregate/event-sourced-aggregate/index.js +18 -0
  63. package/dist/core/aggregate/event-sourced-aggregate/snapshot.d.ts +8 -0
  64. package/dist/core/aggregate/event-sourced-aggregate/snapshot.js +2 -0
  65. package/dist/core/aggregate/index.d.ts +4 -0
  66. package/dist/core/aggregate/index.js +20 -0
  67. package/dist/core/aggregate/state-aggregate/index.d.ts +2 -0
  68. package/dist/core/aggregate/state-aggregate/index.js +18 -0
  69. package/dist/core/aggregate/state-aggregate/state-aggregate.builder.d.ts +7 -0
  70. package/dist/core/aggregate/state-aggregate/state-aggregate.builder.js +19 -0
  71. package/dist/core/aggregate/state-aggregate/state-aggregate.d.ts +25 -0
  72. package/dist/core/aggregate/state-aggregate/state-aggregate.js +41 -0
  73. package/dist/core/aggregate/types.d.ts +4 -0
  74. package/dist/core/aggregate/types.js +2 -0
  75. package/dist/core/entity/entity.builder.d.ts +7 -0
  76. package/dist/core/entity/entity.builder.js +16 -0
  77. package/dist/core/entity/entity.d.ts +18 -0
  78. package/dist/core/entity/entity.js +29 -0
  79. package/dist/core/entity/index.d.ts +2 -0
  80. package/dist/core/entity/index.js +18 -0
  81. package/dist/core/enum/enum-builder.d.ts +9 -0
  82. package/dist/core/enum/enum-builder.js +32 -0
  83. package/dist/core/enum/enum.d.ts +22 -0
  84. package/dist/core/enum/enum.js +44 -0
  85. package/dist/core/enum/index.d.ts +2 -0
  86. package/dist/core/enum/index.js +18 -0
  87. package/dist/core/index.d.ts +7 -0
  88. package/dist/core/index.js +23 -0
  89. package/dist/core/message/command/command-model-descriptor.d.ts +6 -0
  90. package/dist/core/message/command/command-model-descriptor.js +2 -0
  91. package/dist/core/message/command/command.builder.d.ts +7 -0
  92. package/dist/core/message/command/command.builder.js +21 -0
  93. package/dist/core/message/command/command.d.ts +24 -0
  94. package/dist/core/message/command/command.js +35 -0
  95. package/dist/core/message/command/index.d.ts +3 -0
  96. package/dist/core/message/command/index.js +19 -0
  97. package/dist/core/message/event/event-model-descriptor.d.ts +6 -0
  98. package/dist/core/message/event/event-model-descriptor.js +2 -0
  99. package/dist/core/message/event/event.builder.d.ts +9 -0
  100. package/dist/core/message/event/event.builder.js +28 -0
  101. package/dist/core/message/event/event.d.ts +35 -0
  102. package/dist/core/message/event/event.js +40 -0
  103. package/dist/core/message/event/index.d.ts +3 -0
  104. package/dist/core/message/event/index.js +19 -0
  105. package/dist/core/message/index.d.ts +3 -0
  106. package/dist/core/message/index.js +19 -0
  107. package/dist/core/message/message-base/index.d.ts +2 -0
  108. package/dist/core/message/message-base/index.js +18 -0
  109. package/dist/core/message/message-base/message.builder.d.ts +16 -0
  110. package/dist/core/message/message-base/message.builder.js +44 -0
  111. package/dist/core/message/message-base/message.d.ts +31 -0
  112. package/dist/core/message/message-base/message.js +58 -0
  113. package/dist/core/model-with-id/id.d.ts +1 -0
  114. package/dist/core/model-with-id/id.js +2 -0
  115. package/dist/core/model-with-id/index.d.ts +3 -0
  116. package/dist/core/model-with-id/index.js +19 -0
  117. package/dist/core/model-with-id/model-with-id.builder.d.ts +9 -0
  118. package/dist/core/model-with-id/model-with-id.builder.js +22 -0
  119. package/dist/core/model-with-id/model-with-id.d.ts +13 -0
  120. package/dist/core/model-with-id/model-with-id.js +23 -0
  121. package/dist/core/repository/index.d.ts +1 -0
  122. package/dist/core/repository/index.js +17 -0
  123. package/dist/core/repository/repository.d.ts +6 -0
  124. package/dist/core/repository/repository.js +2 -0
  125. package/dist/core/value-object/index.d.ts +2 -0
  126. package/dist/core/value-object/index.js +18 -0
  127. package/dist/core/value-object/value-object.builder.d.ts +7 -0
  128. package/dist/core/value-object/value-object.builder.js +16 -0
  129. package/dist/core/value-object/value-object.d.ts +17 -0
  130. package/dist/core/value-object/value-object.js +64 -0
  131. package/dist/decorators/aggregate-es/handle.d.ts +2 -0
  132. package/dist/decorators/aggregate-es/handle.js +13 -0
  133. package/dist/decorators/aggregate-es/index.d.ts +2 -0
  134. package/dist/decorators/aggregate-es/index.js +18 -0
  135. package/dist/decorators/aggregate-es/when.d.ts +2 -0
  136. package/dist/decorators/aggregate-es/when.js +13 -0
  137. package/dist/decorators/enum.d.ts +2 -0
  138. package/dist/decorators/enum.js +10 -0
  139. package/dist/decorators/index.d.ts +3 -0
  140. package/dist/decorators/index.js +19 -0
  141. package/dist/decorators/message/command.d.ts +3 -0
  142. package/dist/decorators/message/command.js +10 -0
  143. package/dist/decorators/message/event.d.ts +3 -0
  144. package/dist/decorators/message/event.js +10 -0
  145. package/dist/decorators/message/index.d.ts +2 -0
  146. package/dist/decorators/message/index.js +18 -0
  147. package/dist/decorators/type.d.ts +2 -0
  148. package/dist/decorators/type.js +2 -0
  149. package/dist/event-pubsub/decorators/index.d.ts +1 -0
  150. package/dist/event-pubsub/decorators/index.js +17 -0
  151. package/dist/event-pubsub/decorators/subscribe-to-events.d.ts +5 -0
  152. package/dist/event-pubsub/decorators/subscribe-to-events.js +11 -0
  153. package/dist/event-pubsub/event-publisher.d.ts +7 -0
  154. package/dist/event-pubsub/event-publisher.js +13 -0
  155. package/dist/event-pubsub/event-subscriber-registry.d.ts +23 -0
  156. package/dist/event-pubsub/event-subscriber-registry.js +80 -0
  157. package/dist/event-pubsub/event-subscriber.d.ts +13 -0
  158. package/dist/event-pubsub/event-subscriber.js +24 -0
  159. package/dist/event-pubsub/index.d.ts +5 -0
  160. package/dist/event-pubsub/index.js +21 -0
  161. package/dist/event-pubsub/interfaces/event-publisher.interface.d.ts +4 -0
  162. package/dist/event-pubsub/interfaces/event-publisher.interface.js +2 -0
  163. package/dist/event-pubsub/interfaces/event-subscriber-registry.interface.d.ts +13 -0
  164. package/dist/event-pubsub/interfaces/event-subscriber-registry.interface.js +2 -0
  165. package/dist/event-pubsub/interfaces/event-subscriber.interface.d.ts +9 -0
  166. package/dist/event-pubsub/interfaces/event-subscriber.interface.js +2 -0
  167. package/dist/event-pubsub/interfaces/index.d.ts +3 -0
  168. package/dist/event-pubsub/interfaces/index.js +19 -0
  169. package/dist/index.d.ts +8 -0
  170. package/dist/meta/aggregate-es/command-handler-map.d.ts +8 -0
  171. package/dist/meta/aggregate-es/command-handler-map.js +43 -0
  172. package/dist/meta/aggregate-es/event-applier-map.d.ts +9 -0
  173. package/dist/meta/aggregate-es/event-applier-map.js +43 -0
  174. package/dist/meta/aggregate-es/index.d.ts +2 -0
  175. package/dist/meta/aggregate-es/index.js +18 -0
  176. package/dist/meta/command.metadata.d.ts +8 -0
  177. package/dist/meta/command.metadata.js +27 -0
  178. package/dist/meta/event.metadata.d.ts +8 -0
  179. package/dist/meta/event.metadata.js +27 -0
  180. package/dist/meta/index.d.ts +3 -0
  181. package/dist/meta/index.js +19 -0
  182. package/dist/types/class-static.d.ts +2 -0
  183. package/dist/types/class-static.js +2 -0
  184. package/dist/types/class.d.ts +2 -0
  185. package/dist/types/class.js +2 -0
  186. package/dist/types/index.d.ts +2 -0
  187. package/dist/types/index.js +18 -0
  188. package/dist/utils/index.d.ts +1 -0
  189. package/dist/utils/index.js +17 -0
  190. package/dist/utils/to-array.d.ts +1 -0
  191. package/dist/utils/to-array.js +7 -0
  192. package/package.json +62 -1
  193. /package/{index.js → dist/index.js} +0 -0
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PropsInitializedError = void 0;
4
+ class PropsInitializedError extends Error {
5
+ constructor() {
6
+ super("Props is initialized");
7
+ }
8
+ }
9
+ exports.PropsInitializedError = PropsInitializedError;
@@ -0,0 +1,3 @@
1
+ export * from "./model";
2
+ export * from "./model-descriptor";
3
+ export * from "./model.builder";
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./model"), exports);
18
+ __exportStar(require("./model-descriptor"), exports);
19
+ __exportStar(require("./model.builder"), exports);
@@ -0,0 +1,13 @@
1
+ import { AnyModel } from "./model";
2
+ import { ModelId, ModelName, ModelVersion, ModelPropsMap, ModelPropsValidator, ModelStaticValuesMap } from "../meta";
3
+ export interface ModelDescriptor<T extends AnyModel = AnyModel> {
4
+ modelId: ModelId;
5
+ modelName: ModelName;
6
+ modelVersion: ModelVersion;
7
+ modelMutable: boolean;
8
+ ownModelPropsValidator?: ModelPropsValidator<T>;
9
+ modelPropsValidators: ModelPropsValidator[];
10
+ ownModelStaticValues: ModelStaticValuesMap<T>;
11
+ ownModelPropsMap: ModelPropsMap<T>;
12
+ modelPropsMap: ModelPropsMap<T>;
13
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,11 @@
1
+ import { AnyModel, InferredProps } from "./model";
2
+ export interface IModelBuilder<T extends AnyModel = AnyModel> {
3
+ buildSafe(): T | null;
4
+ build(): T;
5
+ }
6
+ export declare abstract class ModelBuilder<T extends AnyModel = AnyModel> implements IModelBuilder<T> {
7
+ protected props?: InferredProps<T>;
8
+ withProps(props: InferredProps<T>): this;
9
+ abstract build(): T;
10
+ buildSafe(): T | null;
11
+ }
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ModelBuilder = void 0;
4
+ class ModelBuilder {
5
+ withProps(props) {
6
+ this.props = props;
7
+ return this;
8
+ }
9
+ buildSafe() {
10
+ try {
11
+ return this.build();
12
+ }
13
+ catch (err) {
14
+ return null;
15
+ }
16
+ }
17
+ }
18
+ exports.ModelBuilder = ModelBuilder;
@@ -0,0 +1,40 @@
1
+ import { AbstractClass, Class } from "type-fest";
2
+ import { ClassStatic } from "../../types";
3
+ import { ModelId, ModelName, ModelPropsMap, ModelPropsValidator, ModelStaticValuesMap, ModelVersion } from "../meta";
4
+ import { ModelDescriptor } from "./model-descriptor";
5
+ export interface Props {
6
+ [key: PropertyKey]: any;
7
+ }
8
+ export type EmptyProps = {
9
+ [key: PropertyKey]: never;
10
+ };
11
+ export declare class ModelBase<P extends Props> {
12
+ static readonly EMPTY_PROPS: EmptyProps;
13
+ protected _props: P;
14
+ static isModel(model: any): model is AnyModel;
15
+ static modelMutable<T extends AnyModel>(this: ModelClass<T>): boolean;
16
+ static modelName<T extends AnyModel>(this: ModelClass<T>): ModelName;
17
+ static modelVersion<T extends AnyModel>(this: ModelClass<T>): ModelVersion;
18
+ static modelId<T extends AnyModel>(this: ModelClass<T>): ModelId;
19
+ static ownModelPropsValidator<T extends AnyModel>(this: ModelClass<T>): ModelPropsValidator<T> | undefined;
20
+ static modelPropsValidators<T extends AnyModel>(this: ModelClass<T>): ModelPropsValidator[];
21
+ static ownModelStaticValues<T extends AnyModel>(this: ModelClass<T>): ModelStaticValuesMap<T>;
22
+ static ownModelPropsMap<T extends AnyModel>(this: ModelClass<T>): ModelPropsMap<T>;
23
+ static modelPropsMap<T extends AnyModel>(this: ModelClass<T>): ModelPropsMap<T>;
24
+ constructor();
25
+ redefineModel(): void;
26
+ protected redefineProp<K extends keyof P>(key: keyof this, propTargetKey: K): void;
27
+ modelDescriptor(): ModelDescriptor<typeof this>;
28
+ validateProps(props: P): void;
29
+ validate(): void;
30
+ propsIsEmpty(): boolean;
31
+ props(): P | null;
32
+ metadata(): any;
33
+ protected initializeProps(props: P): void;
34
+ }
35
+ export type AnyModel = ModelBase<Props>;
36
+ export type InferredProps<T extends AnyModel> = T extends ModelBase<infer P> ? P : never;
37
+ export interface ModelClass<T extends AnyModel = AnyModel> extends Class<T>, ClassStatic<typeof ModelBase<InferredProps<T>>> {
38
+ }
39
+ export interface AbstractModelClass<T extends AnyModel = AnyModel> extends AbstractClass<T>, ClassStatic<typeof ModelBase<InferredProps<T>>> {
40
+ }
@@ -0,0 +1,117 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ModelBase = void 0;
7
+ const lodash_1 = __importDefault(require("lodash"));
8
+ const meta_1 = require("../meta");
9
+ const errors_1 = require("./errors");
10
+ class ModelBase {
11
+ static isModel(model) {
12
+ return model instanceof ModelBase;
13
+ }
14
+ static modelMutable() {
15
+ return (0, meta_1.getModelMutable)(this) ?? false;
16
+ }
17
+ static modelName() {
18
+ return (0, meta_1.getModelName)(this);
19
+ }
20
+ static modelVersion() {
21
+ return (0, meta_1.getModelVersion)(this);
22
+ }
23
+ static modelId() {
24
+ return (0, meta_1.getModelId)(this);
25
+ }
26
+ static ownModelPropsValidator() {
27
+ return (0, meta_1.getOwnModelPropsValidator)(this);
28
+ }
29
+ static modelPropsValidators() {
30
+ return (0, meta_1.getModelPropsValidators)(this);
31
+ }
32
+ static ownModelStaticValues() {
33
+ return (0, meta_1.getOwnModelStaticValues)(this);
34
+ }
35
+ static ownModelPropsMap() {
36
+ return (0, meta_1.getOwnModelPropsMap)(this.prototype);
37
+ }
38
+ static modelPropsMap() {
39
+ return (0, meta_1.getModelPropsMap)(this.prototype);
40
+ }
41
+ constructor() {
42
+ this._props = ModelBase.EMPTY_PROPS;
43
+ this.redefineModel();
44
+ }
45
+ redefineModel() {
46
+ this.modelDescriptor().modelPropsMap.forEach((propTargetKey, key) => {
47
+ this.redefineProp(key, propTargetKey);
48
+ });
49
+ }
50
+ redefineProp(key, propTargetKey) {
51
+ Object.defineProperty(this, key, {
52
+ // must be true because the props() method need to recall redefineModel(-> redefineProp)
53
+ configurable: true,
54
+ enumerable: true,
55
+ get() {
56
+ return this._props?.[propTargetKey];
57
+ },
58
+ });
59
+ }
60
+ modelDescriptor() {
61
+ const modelClass = this.constructor;
62
+ return {
63
+ modelMutable: modelClass.modelMutable(),
64
+ modelId: modelClass.modelId(),
65
+ modelName: modelClass.modelName(),
66
+ modelVersion: modelClass.modelVersion(),
67
+ ownModelPropsValidator: modelClass.ownModelPropsValidator(),
68
+ modelPropsValidators: modelClass.modelPropsValidators(),
69
+ ownModelStaticValues: modelClass.ownModelStaticValues(),
70
+ ownModelPropsMap: modelClass.ownModelPropsMap(),
71
+ modelPropsMap: modelClass.modelPropsMap(),
72
+ };
73
+ }
74
+ validateProps(props) {
75
+ const modelPropsValidators = this.modelDescriptor().modelPropsValidators;
76
+ modelPropsValidators.forEach((propsValidator) => propsValidator.call(this.constructor, props));
77
+ }
78
+ validate() {
79
+ this.validateProps(this._props);
80
+ }
81
+ propsIsEmpty() {
82
+ return this._props === ModelBase.EMPTY_PROPS;
83
+ }
84
+ props() {
85
+ if (this.propsIsEmpty())
86
+ return null;
87
+ return lodash_1.default.cloneDeepWith(this._props, (value) => {
88
+ if (ModelBase.isModel(value)) {
89
+ value.redefineModel();
90
+ return value;
91
+ }
92
+ });
93
+ }
94
+ metadata() {
95
+ return {};
96
+ }
97
+ initializeProps(props) {
98
+ if (!this.propsIsEmpty())
99
+ throw new errors_1.PropsInitializedError();
100
+ if (!this.modelDescriptor().modelMutable) {
101
+ this._props = props;
102
+ Object.freeze(this._props);
103
+ }
104
+ else {
105
+ this._props = new Proxy(props, {
106
+ set: (target, propKey, value) => {
107
+ let result = Reflect.set(target, propKey, value);
108
+ this.validate();
109
+ return result;
110
+ },
111
+ });
112
+ }
113
+ this.validate();
114
+ }
115
+ }
116
+ exports.ModelBase = ModelBase;
117
+ ModelBase.EMPTY_PROPS = {};
@@ -0,0 +1,17 @@
1
+ import { AnyModel, ModelClass } from "./model";
2
+ import { ModelId, ModelName, ModelVersion } from "./meta";
3
+ export declare class ModelVersionMap<T extends AnyModel = AnyModel> extends Map<ModelVersion, ModelClass<T>> {
4
+ readonly modelName: ModelName;
5
+ constructor(modelName: ModelName);
6
+ }
7
+ export declare class ModelMap<T extends AnyModel = AnyModel> extends Map<ModelName, ModelVersionMap<T>> {
8
+ }
9
+ export declare class ModelRegistry {
10
+ private readonly modelMap;
11
+ getModelVersionMap<T extends AnyModel = AnyModel>(modelName: ModelName): ModelVersionMap<T>;
12
+ getModel<T extends AnyModel = AnyModel>(modelName: ModelName, modelVersion?: ModelVersion): ModelClass<T> | undefined;
13
+ getModelByModelId<T extends AnyModel = AnyModel>(modelId: ModelId): ModelClass<T> | undefined;
14
+ hasRegisteredModel(modelName: ModelName, modelVersion: ModelVersion): boolean;
15
+ hasRegisteredModel(model: ModelClass): boolean;
16
+ registerModel(modelClass: ModelClass): this;
17
+ }
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ModelRegistry = exports.ModelMap = exports.ModelVersionMap = void 0;
4
+ const meta_1 = require("./meta");
5
+ class ModelVersionMap extends Map {
6
+ constructor(modelName) {
7
+ super();
8
+ this.modelName = modelName;
9
+ }
10
+ }
11
+ exports.ModelVersionMap = ModelVersionMap;
12
+ class ModelMap extends Map {
13
+ }
14
+ exports.ModelMap = ModelMap;
15
+ class ModelRegistry {
16
+ constructor() {
17
+ this.modelMap = new ModelMap();
18
+ }
19
+ getModelVersionMap(modelName) {
20
+ const modelVersionMap = () => this.modelMap.get(modelName);
21
+ if (!modelVersionMap())
22
+ this.modelMap.set(modelName, new ModelVersionMap(modelName));
23
+ return modelVersionMap();
24
+ }
25
+ getModel(modelName, modelVersion = 0) {
26
+ const modelVersionMap = this.getModelVersionMap(modelName);
27
+ return modelVersionMap.get(modelVersion);
28
+ }
29
+ getModelByModelId(modelId) {
30
+ const { modelName, modelVersion } = meta_1.$ModelId.fromValue(modelId);
31
+ return this.getModel(modelName, modelVersion);
32
+ }
33
+ hasRegisteredModel(p1, p2) {
34
+ let modelName, modelVersion;
35
+ if (typeof p1 === "string") {
36
+ modelName = p1;
37
+ modelVersion = p2;
38
+ }
39
+ else {
40
+ modelName = p1.modelName();
41
+ modelVersion = p1.modelVersion();
42
+ }
43
+ return Boolean(this.getModel(modelName, modelVersion));
44
+ }
45
+ registerModel(modelClass) {
46
+ const modelName = modelClass.modelName();
47
+ const modelVersion = modelClass.modelVersion();
48
+ if (this.hasRegisteredModel(modelName, modelVersion))
49
+ throw new Error(`Model ${modelName} with version ${modelVersion} has been registered`);
50
+ const modelVersionMap = this.getModelVersionMap(modelName);
51
+ modelVersionMap.set(modelVersion, modelClass);
52
+ return this;
53
+ }
54
+ }
55
+ exports.ModelRegistry = ModelRegistry;
@@ -0,0 +1,4 @@
1
+ import { AnyEvent } from "../../message";
2
+ export interface IAggregateEventPublisher {
3
+ publish(events: AnyEvent | AnyEvent[]): void;
4
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,6 @@
1
+ import { ModelWithIdBuilder } from "../../model-with-id";
2
+ import { AnyAggregate } from "./aggregate";
3
+ export declare abstract class AggregateBuilderBase<T extends AnyAggregate> extends ModelWithIdBuilder<T> {
4
+ protected version: number;
5
+ withVersion(version: number): this;
6
+ }
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AggregateBuilderBase = void 0;
4
+ const model_with_id_1 = require("../../model-with-id");
5
+ class AggregateBuilderBase extends model_with_id_1.ModelWithIdBuilder {
6
+ constructor() {
7
+ super(...arguments);
8
+ this.version = 0;
9
+ }
10
+ withVersion(version) {
11
+ this.version = version;
12
+ return this;
13
+ }
14
+ }
15
+ exports.AggregateBuilderBase = AggregateBuilderBase;
@@ -0,0 +1,17 @@
1
+ import { Props, InferredProps } from "../../../base";
2
+ import { ModelWithId, ModelWithIdMetadata } from "../../model-with-id";
3
+ import { AnyEvent, EventClassWithTypedConstructor, EventSource } from "../../message";
4
+ import { IAggregateEventPublisher } from "./aggregate-event-publisher.interface";
5
+ export interface AggregateMetadata extends ModelWithIdMetadata {
6
+ version: number;
7
+ }
8
+ export declare abstract class AggregateBase<P extends Props> extends ModelWithId<P> {
9
+ protected readonly _version: number;
10
+ constructor(metadata: AggregateMetadata, props?: P);
11
+ abstract version(): number;
12
+ metadata(): AggregateMetadata;
13
+ protected createEventSource(): EventSource;
14
+ protected newEvent<E extends AnyEvent>(eventClass: EventClassWithTypedConstructor<E>, props: InferredProps<E>): E;
15
+ abstract publishEvents(publisher: IAggregateEventPublisher): void;
16
+ }
17
+ export type AnyAggregate = AggregateBase<Props>;
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.AggregateBase = void 0;
13
+ const base_1 = require("../../../base");
14
+ const model_with_id_1 = require("../../model-with-id");
15
+ let AggregateBase = class AggregateBase extends model_with_id_1.ModelWithId {
16
+ constructor(metadata, props) {
17
+ super(metadata);
18
+ if (props)
19
+ this.initializeProps(props);
20
+ this._version = metadata.version;
21
+ }
22
+ metadata() {
23
+ return {
24
+ ...super.metadata(),
25
+ version: this.version(),
26
+ };
27
+ }
28
+ createEventSource() {
29
+ return {
30
+ aggregateId: this.id(),
31
+ aggregateVersion: this.version(),
32
+ };
33
+ }
34
+ newEvent(eventClass, props) {
35
+ return eventClass
36
+ .builder()
37
+ .withSource(this.createEventSource())
38
+ .withProps(props)
39
+ .build();
40
+ }
41
+ };
42
+ exports.AggregateBase = AggregateBase;
43
+ exports.AggregateBase = AggregateBase = __decorate([
44
+ (0, base_1.Mutable)(true),
45
+ __metadata("design:paramtypes", [Object, Object])
46
+ ], AggregateBase);
@@ -0,0 +1,3 @@
1
+ export * from "./aggregate";
2
+ export * from "./aggregate.builder";
3
+ export * from "./aggregate-event-publisher.interface";
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./aggregate"), exports);
18
+ __exportStar(require("./aggregate.builder"), exports);
19
+ __exportStar(require("./aggregate-event-publisher.interface"), exports);
@@ -0,0 +1,9 @@
1
+ import { AnyEventSourcedAggregate } from ".";
2
+ import { CommandHandlerMap, EventApplierMap } from "../../../meta";
3
+ import { ModelDescriptor } from "../../../base";
4
+ export interface EventSourcedAggregateModelDescriptor<T extends AnyEventSourcedAggregate> extends ModelDescriptor<T> {
5
+ ownEventApplierMap: EventApplierMap;
6
+ eventApplierMap: EventApplierMap;
7
+ ownCommandHandlerMap: CommandHandlerMap;
8
+ commandHandlerMap: CommandHandlerMap;
9
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,13 @@
1
+ import { AnyEvent } from "../../message";
2
+ import { AggregateBuilderBase } from "../aggregate-base";
3
+ import { AnyEventSourcedAggregate, EventSourcedAggregateClassWithTypedConstructor } from "./event-sourced-aggregate";
4
+ import { Snapshot } from "./snapshot";
5
+ export declare class EventSourcedAggregateBuilder<T extends AnyEventSourcedAggregate> extends AggregateBuilderBase<T> {
6
+ private aggregateClass;
7
+ private pastEvents?;
8
+ private snapshot?;
9
+ constructor(aggregateClass: EventSourcedAggregateClassWithTypedConstructor<T>);
10
+ withPastEvents(pastEvents: AnyEvent[]): this;
11
+ withSnapshot(snapshot: Snapshot<T>): this;
12
+ build(): T;
13
+ }
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EventSourcedAggregateBuilder = void 0;
4
+ const aggregate_base_1 = require("../aggregate-base");
5
+ class EventSourcedAggregateBuilder extends aggregate_base_1.AggregateBuilderBase {
6
+ constructor(aggregateClass) {
7
+ super();
8
+ this.aggregateClass = aggregateClass;
9
+ }
10
+ withPastEvents(pastEvents) {
11
+ this.pastEvents = pastEvents;
12
+ return this;
13
+ }
14
+ withSnapshot(snapshot) {
15
+ this.snapshot = snapshot;
16
+ return this;
17
+ }
18
+ build() {
19
+ if (this.snapshot) {
20
+ const { id, version } = this.snapshot.metadata;
21
+ const { props } = this.snapshot;
22
+ this.withId(id).withVersion(version).withProps(props);
23
+ }
24
+ const instance = new this.aggregateClass({
25
+ id: this.id,
26
+ version: this.version,
27
+ }, this.props);
28
+ if (this.pastEvents)
29
+ instance.applyPastEvents(this.pastEvents);
30
+ return instance;
31
+ }
32
+ }
33
+ exports.EventSourcedAggregateBuilder = EventSourcedAggregateBuilder;
@@ -0,0 +1,49 @@
1
+ import { Class } from "type-fest";
2
+ import { Props, InferredProps } from "../../../base";
3
+ import { ClassStatic } from "../../../types";
4
+ import { AnyCommand, AnyEvent, EventClassWithTypedConstructor } from "../../message";
5
+ import { AggregateBase, AggregateMetadata } from "../aggregate-base";
6
+ import { IAggregateEventPublisher } from "../aggregate-base";
7
+ import { EventSourcedAggregateModelDescriptor } from "./event-sourced-aggregate-model-descriptor";
8
+ import { Snapshot, SnapshotMetadata } from "./snapshot";
9
+ import { EventSourcedAggregateBuilder } from ".";
10
+ export interface EventSourceAggregateMetadata extends AggregateMetadata {
11
+ }
12
+ export declare class EventSourcedAggregateBase<P extends Props> extends AggregateBase<P> {
13
+ static builder<T extends AnyEventSourcedAggregate>(this: EventSourcedAggregateClass<T>): EventSourcedAggregateBuilder<T>;
14
+ private _handledCommands;
15
+ private _pastEvents;
16
+ private _events;
17
+ constructor(metadata: EventSourceAggregateMetadata, props?: P);
18
+ static ownEventApplierMap<T extends AnyEventSourcedAggregate>(this: EventSourcedAggregateClass<T>): import("../../../meta").EventApplierMap;
19
+ static eventApplierMap<T extends AnyEventSourcedAggregate>(this: EventSourcedAggregateClass<T>): import("../../../meta").EventApplierMap;
20
+ static ownCommandHandlerMap<T extends AnyEventSourcedAggregate>(this: EventSourcedAggregateClass<T>): import("../../../meta").CommandHandlerMap;
21
+ static commandHandlerMap<T extends AnyEventSourcedAggregate>(this: EventSourcedAggregateClass<T>): import("../../../meta").CommandHandlerMap;
22
+ modelDescriptor(): EventSourcedAggregateModelDescriptor<typeof this>;
23
+ version(): number;
24
+ pastEvents(): AnyEvent[];
25
+ events(): AnyEvent[];
26
+ handledCommands(): AnyCommand[];
27
+ hasNewEvent(): boolean;
28
+ getEventApplier<E extends AnyEvent>(event: E): EventApplier<E>;
29
+ private validateEventBeforeApply;
30
+ private _applyEvent;
31
+ private applyPastEvent;
32
+ applyPastEvents(pastEvents: AnyEvent[]): void;
33
+ applyEvent<E extends AnyEvent>(event: E): void;
34
+ applyEvents(events: AnyEvent[]): void;
35
+ applyNewEvent<E extends AnyEvent>(eventClass: EventClassWithTypedConstructor<E>, props: InferredProps<E>): void;
36
+ getCommandHandler<C extends AnyCommand>(command: C): CommandHandler<C, AnyEvent | AnyEvent[]>;
37
+ handleCommand<C extends AnyCommand>(command: C): AnyEvent[];
38
+ snapMetadata(): SnapshotMetadata;
39
+ snap(): Snapshot<this>;
40
+ protected archiveEvents(): void;
41
+ publishEvents(publisher: IAggregateEventPublisher): void;
42
+ }
43
+ export type AnyEventSourcedAggregate = EventSourcedAggregateBase<Props>;
44
+ export interface EventSourcedAggregateClass<T extends AnyEventSourcedAggregate = AnyEventSourcedAggregate, Arguments extends unknown[] = any[]> extends Class<T, Arguments>, ClassStatic<typeof EventSourcedAggregateBase<InferredProps<T>>> {
45
+ }
46
+ export interface EventSourcedAggregateClassWithTypedConstructor<T extends AnyEventSourcedAggregate = AnyEventSourcedAggregate> extends EventSourcedAggregateClass<T, ConstructorParameters<typeof EventSourcedAggregateBase<InferredProps<T>>>> {
47
+ }
48
+ export type EventApplier<T extends AnyEvent = AnyEvent> = (event: T) => void;
49
+ export type CommandHandler<T extends AnyCommand = AnyCommand, U extends AnyEvent | AnyEvent[] = AnyEvent | AnyEvent[]> = (command: T) => U;