ddd-node 16.0.1 → 16.2.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.
@@ -0,0 +1,5 @@
1
+ import { AnyEvent } from "../message";
2
+ export interface IEventPublisher {
3
+ publish(event: AnyEvent): void;
4
+ publishAll(events: AnyEvent[]): void;
5
+ }
@@ -0,0 +1,2 @@
1
+ export * from "./event-publisher";
2
+ export * from "./repository";
@@ -0,0 +1,18 @@
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("./event-publisher"), exports);
18
+ __exportStar(require("./repository"), exports);
@@ -1,5 +1,5 @@
1
- import { AnyAggregate } from "./aggregate";
2
- import { Id } from "./id";
1
+ import { AnyAggregate } from "../aggregate";
2
+ import { Id } from "../id";
3
3
  export interface IRepository<T extends AnyAggregate> {
4
4
  findById(id: Id): Promise<T | null>;
5
5
  save(instance: T): Promise<any>;
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -37,6 +37,7 @@ export declare class EventSourcedAggregateBase<P extends Props> extends Aggregat
37
37
  commandHandlerMap(): Map<string, CommandHandler>;
38
38
  getHandlerForCommand<C extends AnyCommand>(command: C): CommandHandler<C, AnyEvent | AnyEvent[]>;
39
39
  handleCommand<C extends AnyCommand>(command: C): AnyEvent[];
40
+ snapMetadata(): SnapshotMetadata;
40
41
  snap(): Snapshot<this>;
41
42
  }
42
43
  export type AnyEventSourcedAggregate = EventSourcedAggregateBase<Props>;
@@ -119,14 +119,17 @@ class EventSourcedAggregateBase extends base_1.AggregateBase {
119
119
  this._handledCommands.push(command);
120
120
  return events;
121
121
  }
122
+ snapMetadata() {
123
+ return {
124
+ id: this.id(),
125
+ version: this.version(),
126
+ };
127
+ }
122
128
  snap() {
123
- if (!this._props)
124
- throw new Error();
129
+ if (this.propsIsEmpty())
130
+ throw new Error("Cannot create snapshot when the props is not initialized");
125
131
  return {
126
- metadata: {
127
- id: this.id(),
128
- version: this.version(),
129
- },
132
+ metadata: this.snapMetadata(),
130
133
  props: this.props(),
131
134
  };
132
135
  }
@@ -4,6 +4,7 @@ import { Id } from "../id";
4
4
  import { AnyEvent, EventClass } from "../message";
5
5
  import { Props, PropsOf } from "../model";
6
6
  import { AggregateBase, AggregateMetadata } from "./base";
7
+ import { IEventPublisher } from "../abstraction/event-publisher";
7
8
  export declare class StateAggregateBase<P extends Props> extends AggregateBase<P> {
8
9
  private _events;
9
10
  constructor(metadata: AggregateMetadata, props: P);
@@ -13,6 +14,7 @@ export declare class StateAggregateBase<P extends Props> extends AggregateBase<P
13
14
  events(): AnyEvent[];
14
15
  protected recordEvent<E extends AnyEvent>(event: E): void;
15
16
  protected recordEvent<E extends AnyEvent>(eventClass: EventClass<E>, props: PropsOf<E>): void;
17
+ publishEvents(eventPublisher: IEventPublisher): void;
16
18
  clearEvents(): void;
17
19
  }
18
20
  export type AnyStateAggregate = StateAggregateBase<Props>;
@@ -20,7 +20,7 @@ class StateAggregateBase extends base_1.AggregateBase {
20
20
  return this._version;
21
21
  }
22
22
  events() {
23
- return this._events;
23
+ return [...this._events];
24
24
  }
25
25
  recordEvent(param1, param2) {
26
26
  let event;
@@ -32,6 +32,10 @@ class StateAggregateBase extends base_1.AggregateBase {
32
32
  }
33
33
  this._events.push(event);
34
34
  }
35
+ publishEvents(eventPublisher) {
36
+ eventPublisher.publishAll(this.events());
37
+ this.clearEvents();
38
+ }
35
39
  clearEvents() {
36
40
  this._events = [];
37
41
  }
@@ -0,0 +1,19 @@
1
+ import { AnyModel, ModelClass } from "./model";
2
+ type ModelName = string;
3
+ type ModelVersion = number;
4
+ export declare class ModelVersionRegistry<T extends AnyModel = AnyModel> extends Map<ModelVersion, ModelClass<T>> {
5
+ }
6
+ export declare class ModelRegistry<T extends AnyModel = AnyModel> extends Map<ModelName, ModelVersionRegistry<T>> {
7
+ }
8
+ export type DomainName = string;
9
+ export declare class Domain {
10
+ readonly name?: DomainName;
11
+ private readonly modelRegistry;
12
+ constructor(name?: DomainName);
13
+ getModelVersionRegistry(modelName: ModelName): ModelVersionRegistry<AnyModel>;
14
+ getModel(modelName: ModelName, modelVersion?: ModelVersion): ModelClass<AnyModel> | undefined;
15
+ hasRegisteredModel(modelName: ModelName, modelVersion: ModelVersion): boolean;
16
+ hasRegisteredModel(model: ModelClass): boolean;
17
+ registerModel(modelClass: ModelClass): this;
18
+ }
19
+ export {};
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Domain = exports.ModelRegistry = exports.ModelVersionRegistry = void 0;
4
+ class ModelVersionRegistry extends Map {
5
+ }
6
+ exports.ModelVersionRegistry = ModelVersionRegistry;
7
+ class ModelRegistry extends Map {
8
+ }
9
+ exports.ModelRegistry = ModelRegistry;
10
+ class Domain {
11
+ constructor(name) {
12
+ this.modelRegistry = new ModelRegistry();
13
+ this.name = name;
14
+ }
15
+ getModelVersionRegistry(modelName) {
16
+ const modelVersionRegistry = () => this.modelRegistry.get(modelName);
17
+ if (!modelVersionRegistry())
18
+ this.modelRegistry.set(modelName, new ModelVersionRegistry());
19
+ return modelVersionRegistry();
20
+ }
21
+ getModel(modelName, modelVersion = 0) {
22
+ const modelVersionRegistry = this.getModelVersionRegistry(modelName);
23
+ return modelVersionRegistry.get(modelVersion);
24
+ }
25
+ hasRegisteredModel(p1, p2) {
26
+ let modelName, modelVersion;
27
+ if (typeof p1 === "string") {
28
+ modelName = p1;
29
+ modelVersion = p2;
30
+ }
31
+ else {
32
+ modelName = p1.modelName();
33
+ modelVersion = p1.modelVersion();
34
+ }
35
+ return Boolean(this.getModel(modelName, modelVersion));
36
+ }
37
+ registerModel(modelClass) {
38
+ const modelName = modelClass.modelName();
39
+ const modelVersion = modelClass.modelVersion();
40
+ if (this.hasRegisteredModel(modelName, modelVersion))
41
+ throw new Error(`Model ${modelName} with version ${modelVersion} has been registered`);
42
+ const modelVersionRegistry = this.getModelVersionRegistry(modelName);
43
+ modelVersionRegistry.set(modelVersion, modelClass);
44
+ return this;
45
+ }
46
+ }
47
+ exports.Domain = Domain;
@@ -5,4 +5,5 @@ export * from "./entity";
5
5
  export * from "./enum";
6
6
  export * from "./message";
7
7
  export * from "./value-object";
8
- export * from "./repository";
8
+ export * from "./abstraction";
9
+ export * from "./domain";
@@ -21,4 +21,5 @@ __exportStar(require("./entity"), exports);
21
21
  __exportStar(require("./enum"), exports);
22
22
  __exportStar(require("./message"), exports);
23
23
  __exportStar(require("./value-object"), exports);
24
- __exportStar(require("./repository"), exports);
24
+ __exportStar(require("./abstraction"), exports);
25
+ __exportStar(require("./domain"), exports);
@@ -13,6 +13,7 @@ export declare class ModelBase<P extends Props> {
13
13
  static isModel(model: any): model is AnyModel;
14
14
  static mutable(): boolean;
15
15
  static modelName<T extends AnyModel>(this: ModelClass<T>): string;
16
+ static modelVersion<T extends AnyModel>(this: ModelClass<T>): number;
16
17
  static ownPropsValidator<T extends AnyModel>(this: ModelClass<T>): import("../../meta").PropsValidator<T> | undefined;
17
18
  static propsValidators<T extends AnyModel>(this: ModelClass<T>): import("../../meta").PropsValidator<AnyModel>[];
18
19
  static ownStaticValues<T extends AnyModel>(this: ModelClass<T>): Map<string | symbol, import("../../meta").StaticValue<T>>;
@@ -24,6 +25,7 @@ export declare class ModelBase<P extends Props> {
24
25
  protected get _modelClass(): ModelClass<this>;
25
26
  isMutable(): boolean;
26
27
  modelName(): string;
28
+ modelVersion(): number;
27
29
  ownPropsValidator(): import("../../meta").PropsValidator<this> | undefined;
28
30
  propsValidators(): import("../../meta").PropsValidator<AnyModel>[];
29
31
  ownPropsMap(): import("../../meta").PropsMap<ModelBase<any>>;
@@ -17,6 +17,9 @@ class ModelBase {
17
17
  static modelName() {
18
18
  return (0, meta_1.getModelName)(this);
19
19
  }
20
+ static modelVersion() {
21
+ return (0, meta_1.getModelVersion)(this);
22
+ }
20
23
  static ownPropsValidator() {
21
24
  return (0, meta_1.getOwnPropsValidator)(this);
22
25
  }
@@ -60,6 +63,9 @@ class ModelBase {
60
63
  modelName() {
61
64
  return this._modelClass.modelName();
62
65
  }
66
+ modelVersion() {
67
+ return this._modelClass.modelVersion();
68
+ }
63
69
  ownPropsValidator() {
64
70
  return this._modelClass.ownPropsValidator();
65
71
  }
@@ -1,5 +1,6 @@
1
1
  export * from "./prop";
2
- export * from "./model-name";
2
+ export * from "./model";
3
+ export * from "./version";
3
4
  export * from "./validator";
4
5
  export * from "./static";
5
6
  export * from "./enum";
@@ -15,7 +15,8 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./prop"), exports);
18
- __exportStar(require("./model-name"), exports);
18
+ __exportStar(require("./model"), exports);
19
+ __exportStar(require("./version"), exports);
19
20
  __exportStar(require("./validator"), exports);
20
21
  __exportStar(require("./static"), exports);
21
22
  __exportStar(require("./enum"), exports);
@@ -0,0 +1,2 @@
1
+ import { ModelClass } from "../../core";
2
+ export declare const Model: (name: string) => <T extends ModelClass<import("../../core").AnyModel>>(target: T) => void;
@@ -1,10 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ModelName = void 0;
3
+ exports.Model = void 0;
4
4
  const meta_1 = require("../../meta");
5
- const ModelName = (name) => {
5
+ const Model = (name) => {
6
6
  return (target) => {
7
7
  (0, meta_1.setModelName)(target, name);
8
8
  };
9
9
  };
10
- exports.ModelName = ModelName;
10
+ exports.Model = Model;
@@ -1,2 +1,2 @@
1
1
  import { ModelClass } from "../../core";
2
- export declare const ModelName: (name?: string) => <T extends ModelClass<import("../../core").AnyModel>>(target: T) => void;
2
+ export declare const Version: (version: number) => <T extends ModelClass<import("../../core").AnyModel>>(target: T) => void;
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Version = void 0;
4
+ const meta_1 = require("../../meta");
5
+ const Version = (version) => {
6
+ return (target) => {
7
+ (0, meta_1.setModelVersion)(target, version);
8
+ };
9
+ };
10
+ exports.Version = Version;
@@ -5,8 +5,10 @@ export declare class PropsMap<T extends AnyModel = AnyModel> extends Map<PropKey
5
5
  export declare const getOwnPropsMap: <T extends AnyModel = AnyModel>(target: T) => PropsMap<T>;
6
6
  export declare const setProp: <T extends AnyModel = AnyModel>(target: T, key: PropKey, propTargetKey?: keyof PropsOf<T> | undefined) => void;
7
7
  export declare const getPropsMap: <T extends AnyModel = AnyModel>(target: T) => PropsMap<T>;
8
- export declare const setModelName: <T extends AnyModel>(target: ModelClass<T>, name?: string) => void;
8
+ export declare const setModelName: <T extends AnyModel>(target: ModelClass<T>, name: string) => void;
9
9
  export declare const getModelName: <T extends AnyModel>(target: ModelClass<T>) => string;
10
+ export declare const setModelVersion: <T extends AnyModel>(target: ModelClass<T>, version: number) => void;
11
+ export declare const getModelVersion: <T extends AnyModel>(target: ModelClass<T>) => number;
10
12
  export type PropsValidator<T extends AnyModel = AnyModel> = (props: PropsOf<T>) => void;
11
13
  export declare const setPropsValidator: <T extends AnyModel>(target: object, validator: PropsValidator<T>) => void;
12
14
  export declare const getOwnPropsValidator: <T extends AnyModel>(target: object) => PropsValidator<T> | undefined;
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.getStaticValue = exports.setStaticValue = exports.getOwnStaticValues = exports.getPropsValidators = exports.PropsValidatorsMetaKey = exports.getOwnPropsValidator = exports.setPropsValidator = exports.getModelName = exports.setModelName = exports.getPropsMap = exports.setProp = exports.getOwnPropsMap = exports.PropsMap = void 0;
6
+ exports.getStaticValue = exports.setStaticValue = exports.getOwnStaticValues = exports.getPropsValidators = exports.PropsValidatorsMetaKey = exports.getOwnPropsValidator = exports.setPropsValidator = exports.getModelVersion = exports.setModelVersion = exports.getModelName = exports.setModelName = exports.getPropsMap = exports.setProp = exports.getOwnPropsMap = exports.PropsMap = void 0;
7
7
  const lodash_1 = __importDefault(require("lodash"));
8
8
  const core_1 = require("../core");
9
9
  const static_value_1 = require("./helpers/static-value");
@@ -53,16 +53,29 @@ exports.getPropsMap = getPropsMap;
53
53
  //
54
54
  const ModelNameMetaKey = Symbol.for("MODEL_NAME");
55
55
  const setModelName = (target, name) => {
56
- Reflect.defineMetadata(ModelNameMetaKey, name ?? target.name, target);
56
+ Reflect.defineMetadata(ModelNameMetaKey, name, target);
57
57
  };
58
58
  exports.setModelName = setModelName;
59
59
  const getModelName = (target) => {
60
- const modelName = () => Reflect.getMetadata(ModelNameMetaKey, target);
60
+ const modelName = () => Reflect.getOwnMetadata(ModelNameMetaKey, target);
61
61
  if (!modelName())
62
- (0, exports.setModelName)(target);
62
+ (0, exports.setModelName)(target, target.name);
63
63
  return modelName();
64
64
  };
65
65
  exports.getModelName = getModelName;
66
+ //
67
+ const ModelVersionMetaKey = Symbol.for("MODEL_VERSION");
68
+ const setModelVersion = (target, version) => {
69
+ Reflect.defineMetadata(ModelVersionMetaKey, version, target);
70
+ };
71
+ exports.setModelVersion = setModelVersion;
72
+ const getModelVersion = (target) => {
73
+ const modelVersion = () => Reflect.getOwnMetadata(ModelVersionMetaKey, target);
74
+ if (!modelVersion())
75
+ (0, exports.setModelVersion)(target, 0);
76
+ return modelVersion();
77
+ };
78
+ exports.getModelVersion = getModelVersion;
66
79
  const OwnPropsValidatorMetaKey = Symbol.for("OWN_PROPS_VALIDATOR");
67
80
  const setPropsValidator = (target, validator) => {
68
81
  Reflect.defineMetadata(OwnPropsValidatorMetaKey, validator, target);
package/dist/package.json CHANGED
@@ -1 +1 @@
1
- {"name":"ddd-node","version":"16.0.1","description":"Domain Driven Design base for NodeJs","type":"commonjs","main":"index.js","types":"index.d.ts","files":["dist"],"repository":{"type":"git","url":"https://github.com/nqd881/ddd-node"},"keywords":["ddd","ddd-node","ddd-base","ddd-ts","ddd-js"],"author":"Quoc Dai","license":"ISC","devDependencies":{"@types/chai":"^4.3.16","@types/lodash":"^4.14.200","@types/mocha":"^10.0.6","@types/uuid":"^9.0.6","chai":"^5.1.1","chai-deep-match":"^1.2.1","ddd-node":"file:dist","mocha":"^10.4.0","ts-node":"^10.9.1","tsconfig-paths":"^4.2.0","typescript":"^5.2.2"},"dependencies":{"lodash":"^4.17.21","nodejs-snowflake":"^2.0.1","reflect-metadata":"^0.1.13","tsc-alias":"^1.8.8","type-fest":"^4.15.0","uuid":"^9.0.1"}}
1
+ {"name":"ddd-node","version":"16.2.0","description":"Domain Driven Design base for NodeJs","type":"commonjs","main":"index.js","types":"index.d.ts","files":["dist"],"repository":{"type":"git","url":"https://github.com/nqd881/ddd-node"},"keywords":["ddd","ddd-node","ddd-base","ddd-ts","ddd-js"],"author":"Quoc Dai","license":"ISC","devDependencies":{"@types/chai":"^4.3.16","@types/lodash":"^4.14.200","@types/mocha":"^10.0.6","@types/uuid":"^9.0.6","chai":"^5.1.1","chai-deep-match":"^1.2.1","ddd-node":"file:dist","mocha":"^10.4.0","ts-node":"^10.9.1","tsconfig-paths":"^4.2.0","typescript":"^5.2.2"},"dependencies":{"lodash":"^4.17.21","nodejs-snowflake":"^2.0.1","reflect-metadata":"^0.1.13","tsc-alias":"^1.8.8","type-fest":"^4.15.0","uuid":"^9.0.1"}}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ddd-node",
3
- "version": "16.0.1",
3
+ "version": "16.2.0",
4
4
  "description": "Domain Driven Design base for NodeJs",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",