ddd-node 33.0.0 → 34.0.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.
@@ -46,7 +46,7 @@ function Model(p1, p2, p3) {
46
46
  domain.modelRegistry.registerModel(target);
47
47
  }
48
48
  if (modelOptions === null || modelOptions === void 0 ? void 0 : modelOptions.propsValidator)
49
- (0, meta_1.defineModelPropsValidator)(target, modelOptions.propsValidator);
49
+ (0, meta_1.defineModelPropGettersValidator)(target, modelOptions.propsValidator);
50
50
  };
51
51
  }
52
52
  exports.Model = Model;
@@ -1,2 +1,4 @@
1
1
  import { AnyDomainModel, InferredProps } from "../model";
2
- export declare const Prop: <T extends AnyDomainModel>(propTargetKey?: keyof InferredProps<T> | undefined) => (target: T, key: PropertyKey) => void;
2
+ import { PropertyConverter } from "../meta";
3
+ export declare function Prop<T extends AnyDomainModel>(propTargetKey?: keyof InferredProps<T>, converter?: PropertyConverter): PropertyDecorator;
4
+ export declare function Prop<T extends AnyDomainModel>(converter?: PropertyConverter): PropertyDecorator;
@@ -2,9 +2,26 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Prop = void 0;
4
4
  const meta_1 = require("../meta");
5
- const Prop = (propTargetKey) => {
6
- return (target, key) => {
7
- (0, meta_1.defineModelProp)(target, key, propTargetKey !== null && propTargetKey !== void 0 ? propTargetKey : key);
8
- };
9
- };
5
+ function Prop(p1, p2) {
6
+ let propTargetKey, converter;
7
+ return ((target, key) => {
8
+ if (!p1 && !p2) {
9
+ propTargetKey = key;
10
+ }
11
+ else if (p1 && !p2) {
12
+ if (typeof p1 === "function") {
13
+ propTargetKey = key;
14
+ converter = p1;
15
+ }
16
+ else {
17
+ propTargetKey = p1;
18
+ }
19
+ }
20
+ else if (p1 && p2) {
21
+ propTargetKey = p1;
22
+ converter = p2;
23
+ }
24
+ (0, meta_1.registerPropertyAccessor)(target, key, propTargetKey, converter);
25
+ });
26
+ }
10
27
  exports.Prop = Prop;
@@ -3,6 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.PropsValidator = void 0;
4
4
  const __1 = require("..");
5
5
  const PropsValidator = (target, key, propertyDescriptor) => {
6
- (0, __1.defineModelPropsValidator)(target, propertyDescriptor.value);
6
+ (0, __1.defineModelPropGettersValidator)(target, propertyDescriptor.value);
7
7
  };
8
8
  exports.PropsValidator = PropsValidator;
@@ -1,6 +1,6 @@
1
1
  export * from "./model-id";
2
2
  export * from "./model-name";
3
- export * from "./model-props-map";
3
+ export * from "./model-property-accessor";
4
4
  export * from "./model-static-values";
5
5
  export * from "./model-props-validator";
6
6
  export * from "./model-version";
@@ -16,7 +16,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./model-id"), exports);
18
18
  __exportStar(require("./model-name"), exports);
19
- __exportStar(require("./model-props-map"), exports);
19
+ __exportStar(require("./model-property-accessor"), exports);
20
20
  __exportStar(require("./model-static-values"), exports);
21
21
  __exportStar(require("./model-props-validator"), exports);
22
22
  __exportStar(require("./model-version"), exports);
@@ -1,5 +1,5 @@
1
1
  import { DomainName } from "../domain";
2
2
  import { AnyDomainModel, DomainModelClass } from "../model";
3
- export declare const ModelDomainMetaKey: unique symbol;
3
+ export declare const MODEL_DOMAIN: unique symbol;
4
4
  export declare const defineModelDomain: <T extends AnyDomainModel>(target: DomainModelClass<T>, domainName: DomainName) => void;
5
5
  export declare const getModelDomain: <T extends AnyDomainModel>(target: DomainModelClass<T>) => string;
@@ -1,15 +1,15 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getModelDomain = exports.defineModelDomain = exports.ModelDomainMetaKey = void 0;
3
+ exports.getModelDomain = exports.defineModelDomain = exports.MODEL_DOMAIN = void 0;
4
4
  const domain_1 = require("../domain");
5
- exports.ModelDomainMetaKey = Symbol.for("MODEL_DOMAIN");
5
+ exports.MODEL_DOMAIN = Symbol.for("MODEL_DOMAIN");
6
6
  const defineModelDomain = (target, domainName) => {
7
- Reflect.defineMetadata(exports.ModelDomainMetaKey, domainName, target);
7
+ Reflect.defineMetadata(exports.MODEL_DOMAIN, domainName, target);
8
8
  };
9
9
  exports.defineModelDomain = defineModelDomain;
10
10
  const getModelDomain = (target) => {
11
- if (!Reflect.hasOwnMetadata(exports.ModelDomainMetaKey, target))
11
+ if (!Reflect.hasOwnMetadata(exports.MODEL_DOMAIN, target))
12
12
  (0, exports.defineModelDomain)(target, domain_1.DEFAULT_DOMAIN);
13
- return Reflect.getOwnMetadata(exports.ModelDomainMetaKey, target);
13
+ return Reflect.getOwnMetadata(exports.MODEL_DOMAIN, target);
14
14
  };
15
15
  exports.getModelDomain = getModelDomain;
@@ -23,17 +23,17 @@ class $ModelId extends String {
23
23
  exports.$ModelId = $ModelId;
24
24
  $ModelId.Divider = "|";
25
25
  $ModelId.Format = new RegExp(/^.+\|[0-9]+$/);
26
- const ModelIdMetaKey = Symbol.for("MODEL_ID");
26
+ const MODEL_ID = Symbol.for("MODEL_ID");
27
27
  const setModelId = (target, modelId) => {
28
- Reflect.defineMetadata(ModelIdMetaKey, modelId, target);
28
+ Reflect.defineMetadata(MODEL_ID, modelId, target);
29
29
  };
30
30
  exports.setModelId = setModelId;
31
31
  const getModelId = (target) => {
32
- if (!Reflect.hasOwnMetadata(ModelIdMetaKey, target)) {
32
+ if (!Reflect.hasOwnMetadata(MODEL_ID, target)) {
33
33
  const modelName = (0, model_name_1.getModelName)(target);
34
34
  const modelVersion = (0, model_version_1.getModelVersion)(target);
35
35
  (0, exports.setModelId)(target, new $ModelId(modelName, modelVersion));
36
36
  }
37
- return Reflect.getOwnMetadata(ModelIdMetaKey, target).valueOf();
37
+ return Reflect.getOwnMetadata(MODEL_ID, target).valueOf();
38
38
  };
39
39
  exports.getModelId = getModelId;
@@ -2,14 +2,14 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getModelMutable = exports.defineModelMutable = void 0;
4
4
  require("reflect-metadata");
5
- const ModelMutableMetaKey = Symbol.for("MODEL_MUTABLE");
5
+ const MODEL_MUTABLE = Symbol.for("MODEL_MUTABLE");
6
6
  const defineModelMutable = (target, mutable) => {
7
- if (Reflect.hasMetadata(ModelMutableMetaKey, target))
7
+ if (Reflect.hasMetadata(MODEL_MUTABLE, target))
8
8
  return;
9
- Reflect.defineMetadata(ModelMutableMetaKey, mutable, target);
9
+ Reflect.defineMetadata(MODEL_MUTABLE, mutable, target);
10
10
  };
11
11
  exports.defineModelMutable = defineModelMutable;
12
12
  const getModelMutable = (target) => {
13
- return Reflect.getMetadata(ModelMutableMetaKey, target);
13
+ return Reflect.getMetadata(MODEL_MUTABLE, target);
14
14
  };
15
15
  exports.getModelMutable = getModelMutable;
@@ -12,14 +12,14 @@ class $ModelName extends String {
12
12
  }
13
13
  }
14
14
  exports.$ModelName = $ModelName;
15
- const ModelNameMetaKey = Symbol.for("MODEL_NAME");
15
+ const MODEL_NAME = Symbol.for("MODEL_NAME");
16
16
  const defineModelName = (target, modelName) => {
17
- Reflect.defineMetadata(ModelNameMetaKey, new $ModelName(modelName), target);
17
+ Reflect.defineMetadata(MODEL_NAME, new $ModelName(modelName), target);
18
18
  };
19
19
  exports.defineModelName = defineModelName;
20
20
  const getModelName = (target) => {
21
- if (!Reflect.hasOwnMetadata(ModelNameMetaKey, target))
21
+ if (!Reflect.hasOwnMetadata(MODEL_NAME, target))
22
22
  (0, exports.defineModelName)(target, target.name);
23
- return Reflect.getOwnMetadata(ModelNameMetaKey, target).valueOf();
23
+ return Reflect.getOwnMetadata(MODEL_NAME, target).valueOf();
24
24
  };
25
25
  exports.getModelName = getModelName;
@@ -0,0 +1,11 @@
1
+ import { AnyDomainModel, InferredProps } from "../model";
2
+ export type PropertyConverter<T = any> = (value: any) => T;
3
+ export type PropertyAccessorMetadata<T extends AnyDomainModel, R> = {
4
+ targetKey: keyof InferredProps<T>;
5
+ converter?: PropertyConverter<R>;
6
+ };
7
+ export declare class ModelPropertyAccessorMap<T extends AnyDomainModel = AnyDomainModel> extends Map<PropertyKey, PropertyAccessorMetadata<T, any>> {
8
+ }
9
+ export declare const getDeclaredPropertyAccessors: <T extends AnyDomainModel = AnyDomainModel>(target: object) => ModelPropertyAccessorMap<T>;
10
+ export declare const registerPropertyAccessor: <T extends AnyDomainModel = AnyDomainModel>(target: object, key: PropertyKey, propTargetKey: keyof InferredProps<T>, propConverter?: PropertyConverter) => void;
11
+ export declare const getResolvedPropertyAccessors: <T extends AnyDomainModel = AnyDomainModel>(target: object) => ModelPropertyAccessorMap<T>;
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getResolvedPropertyAccessors = exports.registerPropertyAccessor = exports.getDeclaredPropertyAccessors = exports.ModelPropertyAccessorMap = void 0;
4
+ const model_1 = require("../model");
5
+ const OWN_MODEL_PROPERTY_ACCESSORS = Symbol.for("OWN_MODEL_PROPERTY_ACCESSORS");
6
+ const MODEL_PROPERTY_ACCESSORS = Symbol.for("MODEL_PROPERTY_ACCESSORS");
7
+ class ModelPropertyAccessorMap extends Map {
8
+ }
9
+ exports.ModelPropertyAccessorMap = ModelPropertyAccessorMap;
10
+ // target = prototype
11
+ const getDeclaredPropertyAccessors = (target) => {
12
+ if (!Reflect.hasOwnMetadata(OWN_MODEL_PROPERTY_ACCESSORS, target)) {
13
+ Reflect.defineMetadata(OWN_MODEL_PROPERTY_ACCESSORS, new ModelPropertyAccessorMap(), target);
14
+ }
15
+ return Reflect.getOwnMetadata(OWN_MODEL_PROPERTY_ACCESSORS, target);
16
+ };
17
+ exports.getDeclaredPropertyAccessors = getDeclaredPropertyAccessors;
18
+ const registerPropertyAccessor = (target, key, propTargetKey, propConverter) => {
19
+ const declaredMap = (0, exports.getDeclaredPropertyAccessors)(target);
20
+ declaredMap.set(key, {
21
+ targetKey: propTargetKey,
22
+ converter: propConverter,
23
+ });
24
+ };
25
+ exports.registerPropertyAccessor = registerPropertyAccessor;
26
+ const getResolvedPropertyAccessors = (target) => {
27
+ if (!Reflect.hasOwnMetadata(MODEL_PROPERTY_ACCESSORS, target)) {
28
+ const buildMap = (target) => {
29
+ const result = new ModelPropertyAccessorMap();
30
+ const ownMaps = [];
31
+ let current = target;
32
+ do {
33
+ if (model_1.DomainModel.isDomainModel(current)) {
34
+ ownMaps.unshift((0, exports.getDeclaredPropertyAccessors)(current));
35
+ }
36
+ current = Reflect.getPrototypeOf(current);
37
+ } while (current !== null);
38
+ ownMaps.forEach((map) => map.forEach((meta, key) => result.set(key, meta)));
39
+ return result;
40
+ };
41
+ Reflect.defineMetadata(MODEL_PROPERTY_ACCESSORS, buildMap(target), target);
42
+ }
43
+ return Reflect.getOwnMetadata(MODEL_PROPERTY_ACCESSORS, target);
44
+ };
45
+ exports.getResolvedPropertyAccessors = getResolvedPropertyAccessors;
@@ -1,6 +1,6 @@
1
1
  import { AnyDomainModel, InferredProps } from "../model";
2
2
  export type ModelPropsValidator<T extends AnyDomainModel = AnyDomainModel> = (props: InferredProps<T>) => void;
3
- export declare const defineModelPropsValidator: <T extends AnyDomainModel>(target: object, validator: ModelPropsValidator<T>) => void;
3
+ export declare const defineModelPropGettersValidator: <T extends AnyDomainModel>(target: object, validator: ModelPropsValidator<T>) => void;
4
4
  export declare const getOwnModelPropsValidator: <T extends AnyDomainModel>(target: object) => ModelPropsValidator<T> | undefined;
5
- export declare const ModelPropsValidatorsMetaKey: unique symbol;
5
+ export declare const MODEL_PROPS_VALIDATORS: unique symbol;
6
6
  export declare const getModelPropsValidators: (target: object) => ModelPropsValidator[];
@@ -3,20 +3,20 @@ 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.getModelPropsValidators = exports.ModelPropsValidatorsMetaKey = exports.getOwnModelPropsValidator = exports.defineModelPropsValidator = void 0;
6
+ exports.getModelPropsValidators = exports.MODEL_PROPS_VALIDATORS = exports.getOwnModelPropsValidator = exports.defineModelPropGettersValidator = void 0;
7
7
  const lodash_1 = __importDefault(require("lodash"));
8
- const OwnPropsValidatorMetaKey = Symbol.for("OWN_MODEL_PROPS_VALIDATOR");
9
- const defineModelPropsValidator = (target, validator) => {
10
- Reflect.defineMetadata(OwnPropsValidatorMetaKey, validator, target);
8
+ const OWN_MODEL_PROPS_VALIDATOR = Symbol.for("OWN_MODEL_PROPS_VALIDATOR");
9
+ const defineModelPropGettersValidator = (target, validator) => {
10
+ Reflect.defineMetadata(OWN_MODEL_PROPS_VALIDATOR, validator, target);
11
11
  };
12
- exports.defineModelPropsValidator = defineModelPropsValidator;
12
+ exports.defineModelPropGettersValidator = defineModelPropGettersValidator;
13
13
  const getOwnModelPropsValidator = (target) => {
14
- return Reflect.getOwnMetadata(OwnPropsValidatorMetaKey, target);
14
+ return Reflect.getOwnMetadata(OWN_MODEL_PROPS_VALIDATOR, target);
15
15
  };
16
16
  exports.getOwnModelPropsValidator = getOwnModelPropsValidator;
17
- exports.ModelPropsValidatorsMetaKey = Symbol.for("MODEL_PROPS_VALIDATORS");
17
+ exports.MODEL_PROPS_VALIDATORS = Symbol.for("MODEL_PROPS_VALIDATORS");
18
18
  const getModelPropsValidators = (target) => {
19
- if (!Reflect.hasOwnMetadata(exports.ModelPropsValidatorsMetaKey, target)) {
19
+ if (!Reflect.hasOwnMetadata(exports.MODEL_PROPS_VALIDATORS, target)) {
20
20
  let result = [];
21
21
  let _target = target;
22
22
  do {
@@ -26,8 +26,8 @@ const getModelPropsValidators = (target) => {
26
26
  _target = Reflect.getPrototypeOf(_target);
27
27
  } while (_target !== null);
28
28
  result = lodash_1.default.uniq(result);
29
- Reflect.defineMetadata(exports.ModelPropsValidatorsMetaKey, result, target);
29
+ Reflect.defineMetadata(exports.MODEL_PROPS_VALIDATORS, result, target);
30
30
  }
31
- return Reflect.getOwnMetadata(exports.ModelPropsValidatorsMetaKey, target);
31
+ return Reflect.getOwnMetadata(exports.MODEL_PROPS_VALIDATORS, target);
32
32
  };
33
33
  exports.getModelPropsValidators = getModelPropsValidators;
@@ -13,14 +13,14 @@ class ModelStaticValue {
13
13
  }
14
14
  }
15
15
  exports.ModelStaticValue = ModelStaticValue;
16
- const OwnModelStaticValuesMetaKey = Symbol.for("OWN_MODEL_STATIC_VALUES");
16
+ const OWN_MODEL_STATIC_VALUES = Symbol.for("OWN_MODEL_STATIC_VALUES");
17
17
  class ModelStaticValuesMap extends Map {
18
18
  }
19
19
  exports.ModelStaticValuesMap = ModelStaticValuesMap;
20
20
  const getOwnModelStaticValues = (target) => {
21
- if (!Reflect.hasOwnMetadata(OwnModelStaticValuesMetaKey, target))
22
- Reflect.defineMetadata(OwnModelStaticValuesMetaKey, new ModelStaticValuesMap(), target);
23
- return Reflect.getOwnMetadata(OwnModelStaticValuesMetaKey, target);
21
+ if (!Reflect.hasOwnMetadata(OWN_MODEL_STATIC_VALUES, target))
22
+ Reflect.defineMetadata(OWN_MODEL_STATIC_VALUES, new ModelStaticValuesMap(), target);
23
+ return Reflect.getOwnMetadata(OWN_MODEL_STATIC_VALUES, target);
24
24
  };
25
25
  exports.getOwnModelStaticValues = getOwnModelStaticValues;
26
26
  const setModelStaticValue = (target, key, value) => {
@@ -12,14 +12,14 @@ class $ModelVersion extends Number {
12
12
  }
13
13
  }
14
14
  exports.$ModelVersion = $ModelVersion;
15
- const ModelVersionMetaKey = Symbol.for("MODEL_VERSION");
15
+ const MODEL_VERSION = Symbol.for("MODEL_VERSION");
16
16
  const defineModelVersion = (target, modelVersion) => {
17
- Reflect.defineMetadata(ModelVersionMetaKey, new $ModelVersion(modelVersion), target);
17
+ Reflect.defineMetadata(MODEL_VERSION, new $ModelVersion(modelVersion), target);
18
18
  };
19
19
  exports.defineModelVersion = defineModelVersion;
20
20
  const getModelVersion = (target) => {
21
- if (!Reflect.hasOwnMetadata(ModelVersionMetaKey, target))
21
+ if (!Reflect.hasOwnMetadata(MODEL_VERSION, target))
22
22
  (0, exports.defineModelVersion)(target, 0);
23
- return Reflect.getOwnMetadata(ModelVersionMetaKey, target).valueOf();
23
+ return Reflect.getOwnMetadata(MODEL_VERSION, target).valueOf();
24
24
  };
25
25
  exports.getModelVersion = getModelVersion;
@@ -1,5 +1,5 @@
1
1
  import { AnyDomainModel, DomainModelClass } from ".";
2
- import { ModelId, ModelName, ModelPropsMap, ModelPropsValidator, ModelStaticValuesMap, ModelVersion } from "../meta";
2
+ import { ModelId, ModelName, ModelPropertyAccessorMap, ModelPropsValidator, ModelStaticValuesMap, ModelVersion } from "../meta";
3
3
  export declare class ModelDescriptor<T extends AnyDomainModel = AnyDomainModel> {
4
4
  readonly modelClass: DomainModelClass<T>;
5
5
  constructor(modelClass: DomainModelClass<T>);
@@ -11,6 +11,6 @@ export declare class ModelDescriptor<T extends AnyDomainModel = AnyDomainModel>
11
11
  ownModelPropsValidator(): ModelPropsValidator<T> | undefined;
12
12
  modelPropsValidators(): ModelPropsValidator[];
13
13
  ownModelStaticValues(): ModelStaticValuesMap<T>;
14
- ownModelPropsMap(): ModelPropsMap<T>;
15
- modelPropsMap(): ModelPropsMap<T>;
14
+ declaredPropertyAccessors(): ModelPropertyAccessorMap<T>;
15
+ resolvedPropertyAccessors(): ModelPropertyAccessorMap<T>;
16
16
  }
@@ -31,11 +31,11 @@ class ModelDescriptor {
31
31
  ownModelStaticValues() {
32
32
  return (0, meta_1.getOwnModelStaticValues)(this.modelClass);
33
33
  }
34
- ownModelPropsMap() {
35
- return (0, meta_1.getOwnModelPropsMap)(this.modelClass.prototype);
34
+ declaredPropertyAccessors() {
35
+ return (0, meta_1.getDeclaredPropertyAccessors)(this.modelClass.prototype);
36
36
  }
37
- modelPropsMap() {
38
- return (0, meta_1.getModelPropsMap)(this.modelClass.prototype);
37
+ resolvedPropertyAccessors() {
38
+ return (0, meta_1.getResolvedPropertyAccessors)(this.modelClass.prototype);
39
39
  }
40
40
  }
41
41
  exports.ModelDescriptor = ModelDescriptor;
@@ -1,6 +1,7 @@
1
1
  import { AbstractClass, Class } from "type-fest";
2
2
  import { ClassStatic } from "../../types";
3
3
  import { ModelDescriptor } from "./model-descriptor";
4
+ import { PropertyConverter } from "..";
4
5
  export interface Props {
5
6
  [key: PropertyKey]: any;
6
7
  }
@@ -14,16 +15,19 @@ export declare class DomainModel<P extends Props> {
14
15
  static isDomainModel(model: any): model is AnyDomainModel;
15
16
  protected _props: P;
16
17
  constructor();
17
- redefineModel(): void;
18
- protected redefineProp<K extends keyof P>(key: keyof this, propTargetKey: K): void;
18
+ definePropertyAccessors(): void;
19
+ protected definePropAccessor<K extends keyof P>(key: keyof this, propTargetKey: K, propConverter?: PropertyConverter): void;
19
20
  modelDescriptor(): ModelDescriptor<AnyDomainModel>;
20
21
  validateProps(props: P): void;
21
22
  validate(): void;
22
- propsIsEmpty(): boolean;
23
+ isPropsEmpty(): this is InitializedDomainModel<P>;
23
24
  props(): P | null;
24
25
  metadata(): any;
25
26
  protected initializeProps(propsOrBuilder: P | PropsBuilder<typeof this>): void;
26
27
  }
28
+ export type InitializedDomainModel<P extends Props> = DomainModel<P> & {
29
+ props(): P;
30
+ };
27
31
  export type AnyDomainModel = DomainModel<Props>;
28
32
  export type InferredProps<T extends AnyDomainModel> = T extends DomainModel<infer P> ? P : never;
29
33
  export type DomainModelClass<T extends AnyDomainModel = AnyDomainModel> = Class<T> & ClassStatic<typeof DomainModel<InferredProps<T>>>;
@@ -16,23 +16,25 @@ class DomainModel {
16
16
  }
17
17
  constructor() {
18
18
  this._props = DomainModel.EMPTY_PROPS;
19
- this.redefineModel();
19
+ this.definePropertyAccessors();
20
20
  }
21
- redefineModel() {
21
+ definePropertyAccessors() {
22
22
  this.modelDescriptor()
23
- .modelPropsMap()
24
- .forEach((propTargetKey, key) => {
25
- this.redefineProp(key, propTargetKey);
23
+ .resolvedPropertyAccessors()
24
+ .forEach(({ targetKey, converter }, key) => {
25
+ this.definePropAccessor(key, targetKey, converter);
26
26
  });
27
27
  }
28
- redefineProp(key, propTargetKey) {
28
+ definePropAccessor(key, propTargetKey, propConverter) {
29
29
  Object.defineProperty(this, key, {
30
- // must be true because the props() method need to recall redefineModel(-> redefineProp)
31
- configurable: true,
30
+ configurable: false,
32
31
  enumerable: true,
33
32
  get() {
34
33
  var _a;
35
- return (_a = this._props) === null || _a === void 0 ? void 0 : _a[propTargetKey];
34
+ const value = (_a = this._props) === null || _a === void 0 ? void 0 : _a[propTargetKey];
35
+ if (!propConverter)
36
+ return value;
37
+ return propConverter(value);
36
38
  },
37
39
  });
38
40
  }
@@ -46,24 +48,19 @@ class DomainModel {
46
48
  validate() {
47
49
  this.validateProps(this._props);
48
50
  }
49
- propsIsEmpty() {
51
+ isPropsEmpty() {
50
52
  return this._props === DomainModel.EMPTY_PROPS;
51
53
  }
52
54
  props() {
53
- if (this.propsIsEmpty())
55
+ if (this.isPropsEmpty())
54
56
  return null;
55
- return lodash_1.default.cloneDeepWith(this._props, (value) => {
56
- if (DomainModel.isDomainModel(value)) {
57
- value.redefineModel();
58
- return value;
59
- }
60
- });
57
+ return lodash_1.default.cloneDeep(this._props);
61
58
  }
62
59
  metadata() {
63
60
  return {};
64
61
  }
65
62
  initializeProps(propsOrBuilder) {
66
- if (!this.propsIsEmpty())
63
+ if (!this.isPropsEmpty())
67
64
  throw new errors_1.PropsInitializedError();
68
65
  let props;
69
66
  if (typeof propsOrBuilder === "function")
@@ -13,6 +13,6 @@ export declare abstract class Aggregate<P extends Props> extends ModelWithId<P>
13
13
  metadata(): AggregateMetadata;
14
14
  protected createEventSource(): EventSource;
15
15
  protected newEvent<E extends AnyEvent>(eventClass: EventClassWithTypedConstructor<E>, props: InferredProps<E>): E;
16
- abstract publishEvents(publisher: IAggregateEventPublisher): void;
16
+ abstract publishEvents<R = any>(publisher: IAggregateEventPublisher<R>): R;
17
17
  }
18
18
  export type AnyAggregate = Aggregate<Props>;
@@ -35,7 +35,7 @@ export declare class ESAggregate<P extends Props> extends Aggregate<P> {
35
35
  handleCommand<C extends AnyCommand>(command: C): AnyEvent[];
36
36
  takeSnapshot(): Snapshot<this>;
37
37
  protected commitEvents(): void;
38
- publishEvents(publisher: IAggregateEventPublisher): void;
38
+ publishEvents<R = any>(publisher: IAggregateEventPublisher<R>): R;
39
39
  }
40
40
  export type AnyESAggregate = ESAggregate<Props>;
41
41
  export interface ESAggregateClass<T extends AnyESAggregate = AnyESAggregate, Arguments extends unknown[] = any[]> extends Class<T, Arguments>, ClassStatic<typeof ESAggregate<InferredProps<T>>> {
@@ -122,7 +122,7 @@ class ESAggregate extends aggregate_1.Aggregate {
122
122
  return events;
123
123
  }
124
124
  takeSnapshot() {
125
- if (this.propsIsEmpty())
125
+ if (this.isPropsEmpty())
126
126
  throw new Error("Cannot create snapshot when the props is not initialized");
127
127
  return {
128
128
  metadata: this.metadata(),
@@ -130,13 +130,13 @@ class ESAggregate extends aggregate_1.Aggregate {
130
130
  };
131
131
  }
132
132
  commitEvents() {
133
- const events = this.events();
133
+ this._pastEvents.push(...this.events());
134
134
  this._events = [];
135
- this._pastEvents.push(...events);
136
135
  }
137
136
  publishEvents(publisher) {
138
- publisher.publish(this.events());
137
+ const events = this.events();
139
138
  this.commitEvents();
139
+ return publisher.publish(events);
140
140
  }
141
141
  }
142
142
  exports.ESAggregate = ESAggregate;
@@ -17,7 +17,7 @@ export declare class StateAggregate<P extends Props> extends Aggregate<P> {
17
17
  protected recordEvent<E extends AnyEvent>(event: E): void;
18
18
  protected recordEvent<E extends AnyEvent>(eventClass: EventClassWithTypedConstructor<E>, props: InferredProps<E>): void;
19
19
  clearEvents(): void;
20
- publishEvents(publisher: IAggregateEventPublisher): void;
20
+ publishEvents<R = any>(publisher: IAggregateEventPublisher<R>): R;
21
21
  }
22
22
  export type AnyStateAggregate = StateAggregate<Props>;
23
23
  export interface StateAggregateClass<T extends AnyStateAggregate = AnyStateAggregate, Arguments extends unknown[] = any[]> extends Class<T, Arguments>, ClassStatic<typeof StateAggregate<InferredProps<T>>> {
@@ -36,8 +36,9 @@ class StateAggregate extends aggregate_1.Aggregate {
36
36
  this._events = [];
37
37
  }
38
38
  publishEvents(publisher) {
39
- publisher.publish(this.events());
39
+ const events = this.events();
40
40
  this.clearEvents();
41
+ return publisher.publish(events);
41
42
  }
42
43
  }
43
44
  exports.StateAggregate = StateAggregate;
@@ -2,6 +2,6 @@ import { ESAggregateClass } from "./es-aggregate";
2
2
  import { StateAggregateClass } from "./state-aggregate";
3
3
  import { AnyEvent } from "../message";
4
4
  export type AggregateClass = StateAggregateClass | ESAggregateClass;
5
- export interface IAggregateEventPublisher {
6
- publish(events: AnyEvent | AnyEvent[]): void;
5
+ export interface IAggregateEventPublisher<R = any> {
6
+ publish(events: AnyEvent | AnyEvent[]): R;
7
7
  }
package/package.json CHANGED
@@ -1 +1 @@
1
- {"name":"ddd-node","version":"33.0.0","description":"Domain Driven Design base for NodeJs","type":"commonjs","main":"index.js","types":"index.d.ts","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","tsconfig-paths":"^4.2.0","typescript":"^5.2.2"},"dependencies":{"lodash":"^4.17.21","reflect-metadata":"^0.1.13","ts-node":"^10.9.2","tsc-alias":"^1.8.8","type-fest":"^4.20.1","uuid":"^9.0.1"}}
1
+ {"name":"ddd-node","version":"34.0.0","description":"Domain Driven Design base for NodeJs","type":"commonjs","main":"index.js","types":"index.d.ts","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","tsconfig-paths":"^4.2.0","typescript":"^5.2.2"},"dependencies":{"lodash":"^4.17.21","reflect-metadata":"^0.1.13","ts-node":"^10.9.2","tsc-alias":"^1.8.8","type-fest":"^4.20.1","uuid":"^9.0.1"}}
@@ -1,6 +0,0 @@
1
- import { AnyDomainModel, InferredProps } from "../model";
2
- export declare class ModelPropsMap<T extends AnyDomainModel = AnyDomainModel> extends Map<PropertyKey, keyof InferredProps<T>> {
3
- }
4
- export declare const getOwnModelPropsMap: <T extends AnyDomainModel = AnyDomainModel>(target: object) => ModelPropsMap<T>;
5
- export declare const defineModelProp: <T extends AnyDomainModel = AnyDomainModel>(target: object, key: PropertyKey, propTargetKey?: keyof InferredProps<T> | undefined) => void;
6
- export declare const getModelPropsMap: <T extends AnyDomainModel = AnyDomainModel>(target: object) => ModelPropsMap<T>;
@@ -1,45 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getModelPropsMap = exports.defineModelProp = exports.getOwnModelPropsMap = exports.ModelPropsMap = void 0;
4
- const model_1 = require("../model");
5
- const OwnModelPropsMapMetaKey = Symbol.for("OWN_MODEL_PROPS_MAP");
6
- class ModelPropsMap extends Map {
7
- }
8
- exports.ModelPropsMap = ModelPropsMap;
9
- // target is prototype
10
- const getOwnModelPropsMap = (target) => {
11
- if (!Reflect.hasOwnMetadata(OwnModelPropsMapMetaKey, target))
12
- Reflect.defineMetadata(OwnModelPropsMapMetaKey, new ModelPropsMap(), target);
13
- return Reflect.getOwnMetadata(OwnModelPropsMapMetaKey, target);
14
- };
15
- exports.getOwnModelPropsMap = getOwnModelPropsMap;
16
- const defineModelProp = (target, key, propTargetKey) => {
17
- const ownModelPropsMap = (0, exports.getOwnModelPropsMap)(target);
18
- if (propTargetKey)
19
- ownModelPropsMap.set(key, propTargetKey);
20
- };
21
- exports.defineModelProp = defineModelProp;
22
- const ModelPropsMapMetaKey = Symbol.for("MODEL_PROPS_MAP");
23
- const getModelPropsMap = (target) => {
24
- if (!Reflect.hasOwnMetadata(ModelPropsMapMetaKey, target)) {
25
- const buildPropsMap = (target) => {
26
- let _target = target;
27
- const result = new ModelPropsMap();
28
- const ownPropsMapList = [];
29
- do {
30
- if (model_1.DomainModel.isDomainModel(_target)) {
31
- const ownModelPropsMap = (0, exports.getOwnModelPropsMap)(_target);
32
- ownPropsMapList.unshift(ownModelPropsMap);
33
- }
34
- _target = Reflect.getPrototypeOf(_target);
35
- } while (_target !== null);
36
- ownPropsMapList.forEach((ownModelPropsMap) => {
37
- ownModelPropsMap.forEach((targetPropKey, key) => result.set(key, targetPropKey));
38
- });
39
- return result;
40
- };
41
- Reflect.defineMetadata(ModelPropsMapMetaKey, buildPropsMap(target), target);
42
- }
43
- return Reflect.getOwnMetadata(ModelPropsMapMetaKey, target);
44
- };
45
- exports.getModelPropsMap = getModelPropsMap;