ddd-node 34.1.0 → 35.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.
Files changed (85) hide show
  1. package/base/decorators/model.d.ts +17 -7
  2. package/base/decorators/model.js +65 -47
  3. package/base/decorators/prop.js +1 -2
  4. package/base/decorators/props-validator.js +1 -3
  5. package/base/meta/index.d.ts +1 -0
  6. package/base/meta/index.js +1 -0
  7. package/base/meta/model-domain.d.ts +0 -1
  8. package/base/meta/model-domain.js +5 -5
  9. package/base/meta/model-id.js +1 -1
  10. package/base/meta/model-name.js +1 -1
  11. package/base/meta/model-property-accessor.js +11 -18
  12. package/base/meta/model-props-type.d.ts +4 -0
  13. package/base/meta/model-props-type.js +12 -0
  14. package/base/meta/model-props-validator.d.ts +9 -2
  15. package/base/meta/model-props-validator.js +35 -17
  16. package/base/meta/model-static-values.js +2 -3
  17. package/base/meta/model-version.js +1 -1
  18. package/base/model/model-descriptor.d.ts +13 -11
  19. package/base/model/model-descriptor.js +14 -12
  20. package/base/model/model.d.ts +7 -7
  21. package/base/model/model.js +10 -15
  22. package/base/model-registry.d.ts +1 -1
  23. package/base/model-registry.js +3 -3
  24. package/common/index.d.ts +1 -0
  25. package/common/index.js +17 -0
  26. package/common/props-validator/index.d.ts +1 -0
  27. package/common/props-validator/index.js +17 -0
  28. package/common/props-validator/use-class-validator.d.ts +17 -0
  29. package/common/props-validator/use-class-validator.js +62 -0
  30. package/core/decorators/enum/is-enum.d.ts +2 -2
  31. package/core/decorators/enum/is-enum.js +4 -1
  32. package/core/decorators/es-aggregate/handle.js +1 -1
  33. package/core/decorators/es-aggregate/when.js +1 -1
  34. package/core/meta/{command.metadata.js → command.js} +5 -5
  35. package/core/meta/enum.d.ts +7 -0
  36. package/core/meta/enum.js +33 -0
  37. package/core/meta/es-aggregate/{command-handler-map.d.ts → command-handler.d.ts} +2 -3
  38. package/core/meta/es-aggregate/{command-handler-map.js → command-handler.js} +11 -10
  39. package/core/meta/es-aggregate/{event-applier-map.d.ts → event-applier.d.ts} +1 -3
  40. package/core/meta/es-aggregate/{event-applier-map.js → event-applier.js} +11 -11
  41. package/core/meta/es-aggregate/index.d.ts +2 -2
  42. package/core/meta/es-aggregate/index.js +2 -2
  43. package/core/meta/{event.metadata.js → event.js} +4 -4
  44. package/core/meta/index.d.ts +3 -2
  45. package/core/meta/index.js +3 -2
  46. package/core/model/aggregate/aggregate.d.ts +9 -14
  47. package/core/model/aggregate/aggregate.js +11 -18
  48. package/core/model/aggregate/es-aggregate.d.ts +16 -12
  49. package/core/model/aggregate/es-aggregate.js +27 -25
  50. package/core/model/aggregate/event-releaser.d.ts +4 -0
  51. package/core/model/aggregate/index.d.ts +1 -0
  52. package/core/model/aggregate/index.js +1 -0
  53. package/core/model/aggregate/state-aggregate.d.ts +10 -11
  54. package/core/model/aggregate/state-aggregate.js +12 -11
  55. package/core/model/aggregate/types.d.ts +0 -4
  56. package/core/model/entity/entity.d.ts +5 -7
  57. package/core/model/entity/entity.js +7 -7
  58. package/core/model/enum/enum.d.ts +1 -0
  59. package/core/model/enum/enum.js +12 -10
  60. package/core/model/identified-model/id.js +2 -0
  61. package/core/model/identified-model/identified-model.d.ts +16 -0
  62. package/core/model/identified-model/identified-model.js +21 -0
  63. package/core/model/identified-model/index.d.ts +2 -0
  64. package/core/model/{model-with-id → identified-model}/index.js +1 -1
  65. package/core/model/index.d.ts +1 -1
  66. package/core/model/index.js +1 -1
  67. package/core/model/message/command.d.ts +9 -7
  68. package/core/model/message/command.js +5 -7
  69. package/core/model/message/event.d.ts +10 -12
  70. package/core/model/message/event.js +6 -8
  71. package/core/model/message/message.d.ts +12 -22
  72. package/core/model/message/message.js +23 -24
  73. package/core/model/value-object/value-object.d.ts +1 -1
  74. package/handling-event/event-dispatcher.js +3 -14
  75. package/handling-event/event-subscriber.js +1 -2
  76. package/index.d.ts +1 -1
  77. package/index.js +1 -0
  78. package/package.json +1 -1
  79. package/core/model/model-with-id/index.d.ts +0 -2
  80. package/core/model/model-with-id/model-with-id.d.ts +0 -13
  81. package/core/model/model-with-id/model-with-id.js +0 -20
  82. /package/core/meta/{command.metadata.d.ts → command.d.ts} +0 -0
  83. /package/core/meta/{event.metadata.d.ts → event.d.ts} +0 -0
  84. /package/core/model/{model-with-id/id.js → aggregate/event-releaser.js} +0 -0
  85. /package/core/model/{model-with-id → identified-model}/id.d.ts +0 -0
@@ -1,13 +1,23 @@
1
- import { ModelPropsValidateFn, ModelPropsValidator } from "../meta";
2
- import { AnyDomainModel, DomainModelClass } from "../model";
1
+ import { Class } from "type-fest";
2
+ import { ModelPropsValidatorWrapperInput } from "../meta";
3
+ import { AnyDomainModel, DomainModelClass, InferredProps } from "../model";
3
4
  export type ModelOptions<T extends AnyDomainModel = AnyDomainModel> = {
4
5
  name?: string;
5
6
  version?: number;
6
7
  domain?: string;
7
- propsValidator?: ModelPropsValidator<T> | ModelPropsValidateFn<T>;
8
+ propsValidator?: ModelPropsValidatorWrapperInput<T>;
9
+ propsType?: Class<InferredProps<T>>;
8
10
  autoRegisterModel?: boolean;
9
11
  };
10
- export declare const DEFAULT_MODEL_OPTIONS: ModelOptions;
11
- export declare function Model<T extends DomainModelClass, I extends InstanceType<T> = InstanceType<T>>(options?: ModelOptions<I>): any;
12
- export declare function Model<T extends DomainModelClass, I extends InstanceType<T> = InstanceType<T>>(name: string, options?: ModelOptions<I>): any;
13
- export declare function Model<T extends DomainModelClass, I extends InstanceType<T> = InstanceType<T>>(name: string, version: number, options?: ModelOptions<I>): any;
12
+ export declare const DEFAULT_MODEL_OPTIONS: Required<Pick<ModelOptions, "autoRegisterModel">>;
13
+ /**
14
+ * @Model decorator registers a DomainModel with metadata and domain context.
15
+ *
16
+ * Usage examples:
17
+ * @Model()
18
+ * @Model("User")
19
+ * @Model("User", 2)
20
+ * @Model("User", { domain: "Auth" })
21
+ * @Model("User", 2, { domain: "Auth" })
22
+ */
23
+ export declare function Model<T extends DomainModelClass, I extends InstanceType<T> = InstanceType<T>>(nameOrOptions?: string | ModelOptions<I>, versionOrOptions?: number | ModelOptions<I>, options?: ModelOptions<I>): (target: T) => void;
@@ -1,58 +1,76 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.Model = exports.DEFAULT_MODEL_OPTIONS = void 0;
7
- const lodash_1 = __importDefault(require("lodash"));
3
+ exports.DEFAULT_MODEL_OPTIONS = void 0;
4
+ exports.Model = Model;
8
5
  const domain_1 = require("../domain");
9
6
  const meta_1 = require("../meta");
10
7
  exports.DEFAULT_MODEL_OPTIONS = {
11
8
  autoRegisterModel: true,
12
9
  };
13
- function Model(p1, p2, p3) {
14
- const defaultModelOptions = lodash_1.default.clone(exports.DEFAULT_MODEL_OPTIONS);
15
- let modelOptions = {};
16
- if (p1 && !p2 && !p3) {
17
- if (typeof p1 === "string")
18
- modelOptions = { name: p1 };
19
- else
20
- modelOptions = p1;
21
- }
22
- else if (p1 && p2 && !p3) {
23
- if (typeof p2 === "number")
24
- modelOptions = { name: p1, version: p2 };
25
- else
26
- modelOptions = Object.assign({ name: p1 }, p2);
27
- }
28
- else if (p1 && p2 && p3) {
29
- modelOptions = Object.assign({ name: p1, version: p2 }, p3);
30
- }
31
- modelOptions = lodash_1.default.merge(defaultModelOptions, modelOptions);
10
+ /**
11
+ * @Model decorator — registers a DomainModel with metadata and domain context.
12
+ *
13
+ * Usage examples:
14
+ * @Model()
15
+ * @Model("User")
16
+ * @Model("User", 2)
17
+ * @Model("User", { domain: "Auth" })
18
+ * @Model("User", 2, { domain: "Auth" })
19
+ */
20
+ function Model(nameOrOptions, versionOrOptions, options) {
21
+ const modelOptions = normalizeModelOptions(nameOrOptions, versionOrOptions, options);
32
22
  return (target) => {
33
- if (modelOptions === null || modelOptions === void 0 ? void 0 : modelOptions.name)
34
- (0, meta_1.defineModelName)(target, modelOptions.name);
35
- if (modelOptions === null || modelOptions === void 0 ? void 0 : modelOptions.version)
36
- (0, meta_1.defineModelVersion)(target, modelOptions.version);
37
- if (modelOptions === null || modelOptions === void 0 ? void 0 : modelOptions.domain)
38
- (0, meta_1.defineModelDomain)(target, modelOptions.domain);
39
- if (modelOptions === null || modelOptions === void 0 ? void 0 : modelOptions.autoRegisterModel) {
40
- const domainName = (0, meta_1.getModelDomain)(target);
41
- const domainManager = domain_1.DomainManager.instance();
42
- if (!domainManager.hasDomain(domainName)) {
43
- domainManager.addDomain(new domain_1.Domain(domainName));
44
- }
45
- const domain = domainManager.getDomain(domainName);
46
- domain.modelRegistry.registerModel(target);
47
- }
48
- if (modelOptions === null || modelOptions === void 0 ? void 0 : modelOptions.propsValidator) {
49
- if (typeof modelOptions.propsValidator === "function")
50
- (0, meta_1.defineModelPropGettersValidator)(target, {
51
- validate: modelOptions.propsValidator,
52
- });
53
- else
54
- (0, meta_1.defineModelPropGettersValidator)(target, modelOptions.propsValidator);
23
+ defineModel(target, modelOptions);
24
+ if (modelOptions.autoRegisterModel) {
25
+ registerModel(target);
55
26
  }
56
27
  };
57
28
  }
58
- exports.Model = Model;
29
+ /**
30
+ * Normalizes decorator overload arguments into a unified ModelOptions object.
31
+ */
32
+ function normalizeModelOptions(p1, p2, p3) {
33
+ let options = {};
34
+ if (typeof p1 === "string" && typeof p2 === "number") {
35
+ options = { name: p1, version: p2, ...p3 };
36
+ }
37
+ else if (typeof p1 === "string" && typeof p2 === "object") {
38
+ options = { name: p1, ...p2 };
39
+ }
40
+ else if (typeof p1 === "string") {
41
+ options = { name: p1 };
42
+ }
43
+ else if (typeof p1 === "object") {
44
+ options = { ...p1 };
45
+ }
46
+ return { ...exports.DEFAULT_MODEL_OPTIONS, ...options };
47
+ }
48
+ /**
49
+ * Defines model metadata such as name, version, domain, propsType, and validator.
50
+ */
51
+ function defineModel(target, options) {
52
+ if (options.name)
53
+ (0, meta_1.defineModelName)(target, options.name);
54
+ if (options.version)
55
+ (0, meta_1.defineModelVersion)(target, options.version);
56
+ if (options.domain)
57
+ (0, meta_1.defineModelDomain)(target, options.domain);
58
+ if (options.propsValidator) {
59
+ (0, meta_1.defineModelPropsValidator)(target, new meta_1.ModelPropsValidatorWrapper(options.propsValidator));
60
+ }
61
+ if (options.propsType) {
62
+ (0, meta_1.defineModelPropsType)(target, options.propsType);
63
+ }
64
+ }
65
+ /**
66
+ * Registers the model in its associated domain via DomainManager.
67
+ */
68
+ function registerModel(target) {
69
+ const domainName = (0, meta_1.getModelDomain)(target);
70
+ const domainManager = domain_1.DomainManager.instance();
71
+ if (!domainManager.hasDomain(domainName)) {
72
+ domainManager.addDomain(new domain_1.Domain(domainName));
73
+ }
74
+ const domain = domainManager.getDomain(domainName);
75
+ domain.modelRegistry.registerModel(target);
76
+ }
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Prop = void 0;
3
+ exports.Prop = Prop;
4
4
  const meta_1 = require("../meta");
5
5
  function Prop(p1, p2) {
6
6
  let propTargetKey, converter;
@@ -24,4 +24,3 @@ function Prop(p1, p2) {
24
24
  (0, meta_1.registerPropertyAccessor)(target, key, propTargetKey, converter);
25
25
  });
26
26
  }
27
- exports.Prop = Prop;
@@ -3,8 +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.defineModelPropGettersValidator)(target, {
7
- validate: propertyDescriptor.value.bind(target),
8
- });
6
+ (0, __1.defineModelPropsValidator)(target, new __1.ModelPropsValidatorWrapper(propertyDescriptor.value.bind(target)));
9
7
  };
10
8
  exports.PropsValidator = PropsValidator;
@@ -6,3 +6,4 @@ export * from "./model-props-validator";
6
6
  export * from "./model-version";
7
7
  export * from "./model-domain";
8
8
  export * from "./model-mutable";
9
+ export * from "./model-props-type";
@@ -22,3 +22,4 @@ __exportStar(require("./model-props-validator"), exports);
22
22
  __exportStar(require("./model-version"), exports);
23
23
  __exportStar(require("./model-domain"), exports);
24
24
  __exportStar(require("./model-mutable"), exports);
25
+ __exportStar(require("./model-props-type"), exports);
@@ -1,5 +1,4 @@
1
1
  import { DomainName } from "../domain";
2
2
  import { AnyDomainModel, DomainModelClass } from "../model";
3
- export declare const MODEL_DOMAIN: unique symbol;
4
3
  export declare const defineModelDomain: <T extends AnyDomainModel>(target: DomainModelClass<T>, domainName: DomainName) => void;
5
4
  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.MODEL_DOMAIN = void 0;
3
+ exports.getModelDomain = exports.defineModelDomain = void 0;
4
4
  const domain_1 = require("../domain");
5
- exports.MODEL_DOMAIN = Symbol.for("MODEL_DOMAIN");
5
+ const MODEL_DOMAIN = Symbol.for("MODEL_DOMAIN");
6
6
  const defineModelDomain = (target, domainName) => {
7
- Reflect.defineMetadata(exports.MODEL_DOMAIN, domainName, target);
7
+ Reflect.defineMetadata(MODEL_DOMAIN, domainName, target);
8
8
  };
9
9
  exports.defineModelDomain = defineModelDomain;
10
10
  const getModelDomain = (target) => {
11
- if (!Reflect.hasOwnMetadata(exports.MODEL_DOMAIN, target))
11
+ if (!Reflect.hasOwnMetadata(MODEL_DOMAIN, target))
12
12
  (0, exports.defineModelDomain)(target, domain_1.DEFAULT_DOMAIN);
13
- return Reflect.getOwnMetadata(exports.MODEL_DOMAIN, target);
13
+ return Reflect.getOwnMetadata(MODEL_DOMAIN, target);
14
14
  };
15
15
  exports.getModelDomain = getModelDomain;
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getModelId = exports.setModelId = exports.$ModelId = void 0;
4
4
  const model_name_1 = require("./model-name");
5
5
  const model_version_1 = require("./model-version");
6
+ const MODEL_ID = Symbol.for("MODEL_ID");
6
7
  class $ModelId extends String {
7
8
  static fromValue(value) {
8
9
  if (!this.Format.test(value))
@@ -23,7 +24,6 @@ class $ModelId extends String {
23
24
  exports.$ModelId = $ModelId;
24
25
  $ModelId.Divider = "|";
25
26
  $ModelId.Format = new RegExp(/^.+\|[0-9]+$/);
26
- const MODEL_ID = Symbol.for("MODEL_ID");
27
27
  const setModelId = (target, modelId) => {
28
28
  Reflect.defineMetadata(MODEL_ID, modelId, target);
29
29
  };
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getModelName = exports.defineModelName = exports.$ModelName = void 0;
4
+ const MODEL_NAME = Symbol.for("MODEL_NAME");
4
5
  class $ModelName extends String {
5
6
  static validate(modelName) {
6
7
  if (modelName.trim().length === 0)
@@ -12,7 +13,6 @@ class $ModelName extends String {
12
13
  }
13
14
  }
14
15
  exports.$ModelName = $ModelName;
15
- const MODEL_NAME = Symbol.for("MODEL_NAME");
16
16
  const defineModelName = (target, modelName) => {
17
17
  Reflect.defineMetadata(MODEL_NAME, new $ModelName(modelName), target);
18
18
  };
@@ -3,7 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getResolvedPropertyAccessors = exports.registerPropertyAccessor = exports.getDeclaredPropertyAccessors = exports.ModelPropertyAccessorMap = void 0;
4
4
  const model_1 = require("../model");
5
5
  const OWN_MODEL_PROPERTY_ACCESSORS = Symbol.for("OWN_MODEL_PROPERTY_ACCESSORS");
6
- const MODEL_PROPERTY_ACCESSORS = Symbol.for("MODEL_PROPERTY_ACCESSORS");
7
6
  class ModelPropertyAccessorMap extends Map {
8
7
  }
9
8
  exports.ModelPropertyAccessorMap = ModelPropertyAccessorMap;
@@ -24,22 +23,16 @@ const registerPropertyAccessor = (target, key, propTargetKey, propConverter) =>
24
23
  };
25
24
  exports.registerPropertyAccessor = registerPropertyAccessor;
26
25
  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);
26
+ const result = new ModelPropertyAccessorMap();
27
+ const ownMaps = [];
28
+ let current = target;
29
+ do {
30
+ if (model_1.DomainModel.isDomainModel(current)) {
31
+ ownMaps.unshift((0, exports.getDeclaredPropertyAccessors)(current));
32
+ }
33
+ current = Reflect.getPrototypeOf(current);
34
+ } while (current !== null);
35
+ ownMaps.forEach((map) => map.forEach((meta, key) => result.set(key, meta)));
36
+ return result;
44
37
  };
45
38
  exports.getResolvedPropertyAccessors = getResolvedPropertyAccessors;
@@ -0,0 +1,4 @@
1
+ import { Class } from "type-fest";
2
+ import { AnyDomainModel, DomainModelClass, InferredProps } from "../model";
3
+ export declare const defineModelPropsType: <T extends AnyDomainModel>(target: DomainModelClass<T>, propsType: Class<InferredProps<T>>) => void;
4
+ export declare const getModelPropsType: <T extends AnyDomainModel>(target: DomainModelClass<T>) => Class<InferredProps<T>> | undefined;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getModelPropsType = exports.defineModelPropsType = void 0;
4
+ const MODEL_PROPS_TYPE = Symbol.for("MODEL_PROPS_TYPE");
5
+ const defineModelPropsType = (target, propsType) => {
6
+ Reflect.defineMetadata(MODEL_PROPS_TYPE, propsType, target);
7
+ };
8
+ exports.defineModelPropsType = defineModelPropsType;
9
+ const getModelPropsType = (target) => {
10
+ return Reflect.getMetadata(MODEL_PROPS_TYPE, target);
11
+ };
12
+ exports.getModelPropsType = getModelPropsType;
@@ -1,9 +1,16 @@
1
+ import { Class } from "type-fest";
1
2
  import { AnyDomainModel, InferredProps } from "../model";
2
3
  export interface ModelPropsValidator<T extends AnyDomainModel = AnyDomainModel> {
3
4
  validate(props: InferredProps<T>): void;
4
5
  }
5
6
  export type ModelPropsValidateFn<T extends AnyDomainModel> = ModelPropsValidator<T>["validate"];
6
- export declare const defineModelPropGettersValidator: <T extends AnyDomainModel>(target: object, validator: ModelPropsValidator<T>) => void;
7
+ export type ModelPropsValidatorBuilder<T extends AnyDomainModel> = () => ModelPropsValidator<T>;
8
+ export type ModelPropsValidatorWrapperInput<T extends AnyDomainModel> = Class<ModelPropsValidator<T>, []> | ModelPropsValidator<T> | ModelPropsValidateFn<T> | ModelPropsValidatorBuilder<T>;
9
+ export declare class ModelPropsValidatorWrapper<T extends AnyDomainModel> implements ModelPropsValidator<T> {
10
+ private input;
11
+ constructor(input: ModelPropsValidatorWrapperInput<T>);
12
+ validate(props: InferredProps<T>): void;
13
+ }
14
+ export declare const defineModelPropsValidator: <T extends AnyDomainModel>(target: object, validator: ModelPropsValidator<T>) => void;
7
15
  export declare const getOwnModelPropsValidator: <T extends AnyDomainModel>(target: object) => ModelPropsValidator<T> | undefined;
8
- export declare const MODEL_PROPS_VALIDATORS: unique symbol;
9
16
  export declare const getModelPropsValidators: (target: object) => ModelPropsValidator[];
@@ -3,31 +3,49 @@ 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.MODEL_PROPS_VALIDATORS = exports.getOwnModelPropsValidator = exports.defineModelPropGettersValidator = void 0;
6
+ exports.getModelPropsValidators = exports.getOwnModelPropsValidator = exports.defineModelPropsValidator = exports.ModelPropsValidatorWrapper = void 0;
7
+ const is_class_1 = __importDefault(require("is-class"));
7
8
  const lodash_1 = __importDefault(require("lodash"));
8
9
  const OWN_MODEL_PROPS_VALIDATOR = Symbol.for("OWN_MODEL_PROPS_VALIDATOR");
9
- const defineModelPropGettersValidator = (target, validator) => {
10
+ class ModelPropsValidatorWrapper {
11
+ constructor(input) {
12
+ this.input = input;
13
+ }
14
+ validate(props) {
15
+ if ((0, is_class_1.default)(this.input)) {
16
+ const instance = new this.input();
17
+ return instance.validate(props);
18
+ }
19
+ if (typeof this.input === "function") {
20
+ const res = this.input(props);
21
+ const resIsValidator = res && typeof res === "object" && "validate" in res;
22
+ if (resIsValidator) {
23
+ return res.validate(props);
24
+ }
25
+ return res;
26
+ }
27
+ return this.input.validate(props);
28
+ }
29
+ }
30
+ exports.ModelPropsValidatorWrapper = ModelPropsValidatorWrapper;
31
+ const defineModelPropsValidator = (target, validator) => {
10
32
  Reflect.defineMetadata(OWN_MODEL_PROPS_VALIDATOR, validator, target);
11
33
  };
12
- exports.defineModelPropGettersValidator = defineModelPropGettersValidator;
34
+ exports.defineModelPropsValidator = defineModelPropsValidator;
13
35
  const getOwnModelPropsValidator = (target) => {
14
36
  return Reflect.getOwnMetadata(OWN_MODEL_PROPS_VALIDATOR, target);
15
37
  };
16
38
  exports.getOwnModelPropsValidator = getOwnModelPropsValidator;
17
- exports.MODEL_PROPS_VALIDATORS = Symbol.for("MODEL_PROPS_VALIDATORS");
18
39
  const getModelPropsValidators = (target) => {
19
- if (!Reflect.hasOwnMetadata(exports.MODEL_PROPS_VALIDATORS, target)) {
20
- let result = [];
21
- let _target = target;
22
- do {
23
- const ownValidator = (0, exports.getOwnModelPropsValidator)(_target);
24
- if (ownValidator)
25
- result.push(ownValidator);
26
- _target = Reflect.getPrototypeOf(_target);
27
- } while (_target !== null);
28
- result = lodash_1.default.uniq(result);
29
- Reflect.defineMetadata(exports.MODEL_PROPS_VALIDATORS, result, target);
30
- }
31
- return Reflect.getOwnMetadata(exports.MODEL_PROPS_VALIDATORS, target);
40
+ let result = [];
41
+ let _target = target;
42
+ do {
43
+ const ownValidator = (0, exports.getOwnModelPropsValidator)(_target);
44
+ if (ownValidator)
45
+ result.push(ownValidator);
46
+ _target = Reflect.getPrototypeOf(_target);
47
+ } while (_target !== null);
48
+ result = lodash_1.default.uniq(result);
49
+ return result;
32
50
  };
33
51
  exports.getModelPropsValidators = getModelPropsValidators;
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.defineModelStaticValueProperty = exports.getModelStaticValue = exports.setModelStaticValue = exports.getOwnModelStaticValues = exports.ModelStaticValuesMap = exports.ModelStaticValue = void 0;
4
+ const OWN_MODEL_STATIC_VALUES = Symbol.for("OWN_MODEL_STATIC_VALUES");
4
5
  class ModelStaticValue {
5
6
  constructor(value) {
6
7
  this._value = value;
@@ -13,7 +14,6 @@ class ModelStaticValue {
13
14
  }
14
15
  }
15
16
  exports.ModelStaticValue = ModelStaticValue;
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;
@@ -29,12 +29,11 @@ const setModelStaticValue = (target, key, value) => {
29
29
  };
30
30
  exports.setModelStaticValue = setModelStaticValue;
31
31
  const getModelStaticValue = (target, key) => {
32
- var _a;
33
32
  let _target = target;
34
33
  do {
35
34
  const staticValues = (0, exports.getOwnModelStaticValues)(_target);
36
35
  if (staticValues.has(key))
37
- return (_a = staticValues.get(key)) === null || _a === void 0 ? void 0 : _a.value;
36
+ return staticValues.get(key)?.value;
38
37
  _target = Reflect.getPrototypeOf(_target);
39
38
  } while (_target !== null);
40
39
  return undefined;
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getModelVersion = exports.defineModelVersion = exports.$ModelVersion = void 0;
4
+ const MODEL_VERSION = Symbol.for("MODEL_VERSION");
4
5
  class $ModelVersion extends Number {
5
6
  static validate(modelVersion) {
6
7
  if (modelVersion < 0 && Number.isInteger(modelVersion))
@@ -12,7 +13,6 @@ class $ModelVersion extends Number {
12
13
  }
13
14
  }
14
15
  exports.$ModelVersion = $ModelVersion;
15
- const MODEL_VERSION = Symbol.for("MODEL_VERSION");
16
16
  const defineModelVersion = (target, modelVersion) => {
17
17
  Reflect.defineMetadata(MODEL_VERSION, new $ModelVersion(modelVersion), target);
18
18
  };
@@ -1,16 +1,18 @@
1
- import { AnyDomainModel, DomainModelClass } from ".";
1
+ import { Class } from "type-fest";
2
+ import { AnyDomainModel, DomainModelClass, InferredProps } from ".";
2
3
  import { ModelId, ModelName, ModelPropertyAccessorMap, ModelPropsValidator, ModelStaticValuesMap, ModelVersion } from "../meta";
3
4
  export declare class ModelDescriptor<T extends AnyDomainModel = AnyDomainModel> {
4
5
  readonly modelClass: DomainModelClass<T>;
5
6
  constructor(modelClass: DomainModelClass<T>);
6
- modelDomain(): string;
7
- modelMutable(): boolean;
8
- modelName(): ModelName;
9
- modelVersion(): ModelVersion;
10
- modelId(): ModelId;
11
- ownModelPropsValidator(): ModelPropsValidator<T> | undefined;
12
- modelPropsValidators(): ModelPropsValidator[];
13
- ownModelStaticValues(): ModelStaticValuesMap<T>;
14
- declaredPropertyAccessors(): ModelPropertyAccessorMap<T>;
15
- resolvedPropertyAccessors(): ModelPropertyAccessorMap<T>;
7
+ get modelDomain(): string;
8
+ get modelMutable(): boolean;
9
+ get modelName(): ModelName;
10
+ get modelVersion(): ModelVersion;
11
+ get modelId(): ModelId;
12
+ get ownModelPropsValidator(): ModelPropsValidator<T> | undefined;
13
+ get modelPropsValidators(): ModelPropsValidator[];
14
+ get ownModelStaticValues(): ModelStaticValuesMap<T>;
15
+ get declaredPropertyAccessors(): ModelPropertyAccessorMap<T>;
16
+ get resolvedPropertyAccessors(): ModelPropertyAccessorMap<T>;
17
+ get propsType(): Class<InferredProps<T>> | undefined;
16
18
  }
@@ -6,36 +6,38 @@ class ModelDescriptor {
6
6
  constructor(modelClass) {
7
7
  this.modelClass = modelClass;
8
8
  }
9
- modelDomain() {
9
+ get modelDomain() {
10
10
  return (0, meta_1.getModelDomain)(this.modelClass);
11
11
  }
12
- modelMutable() {
13
- var _a;
14
- return (_a = (0, meta_1.getModelMutable)(this.modelClass)) !== null && _a !== void 0 ? _a : false;
12
+ get modelMutable() {
13
+ return (0, meta_1.getModelMutable)(this.modelClass) ?? false;
15
14
  }
16
- modelName() {
15
+ get modelName() {
17
16
  return (0, meta_1.getModelName)(this.modelClass);
18
17
  }
19
- modelVersion() {
18
+ get modelVersion() {
20
19
  return (0, meta_1.getModelVersion)(this.modelClass);
21
20
  }
22
- modelId() {
21
+ get modelId() {
23
22
  return (0, meta_1.getModelId)(this.modelClass);
24
23
  }
25
- ownModelPropsValidator() {
24
+ get ownModelPropsValidator() {
26
25
  return (0, meta_1.getOwnModelPropsValidator)(this.modelClass);
27
26
  }
28
- modelPropsValidators() {
27
+ get modelPropsValidators() {
29
28
  return (0, meta_1.getModelPropsValidators)(this.modelClass);
30
29
  }
31
- ownModelStaticValues() {
30
+ get ownModelStaticValues() {
32
31
  return (0, meta_1.getOwnModelStaticValues)(this.modelClass);
33
32
  }
34
- declaredPropertyAccessors() {
33
+ get declaredPropertyAccessors() {
35
34
  return (0, meta_1.getDeclaredPropertyAccessors)(this.modelClass.prototype);
36
35
  }
37
- resolvedPropertyAccessors() {
36
+ get resolvedPropertyAccessors() {
38
37
  return (0, meta_1.getResolvedPropertyAccessors)(this.modelClass.prototype);
39
38
  }
39
+ get propsType() {
40
+ return (0, meta_1.getModelPropsType)(this.modelClass);
41
+ }
40
42
  }
41
43
  exports.ModelDescriptor = ModelDescriptor;
@@ -1,7 +1,7 @@
1
1
  import { AbstractClass, Class } from "type-fest";
2
+ import { PropertyConverter } from "..";
2
3
  import { ClassStatic } from "../../types";
3
4
  import { ModelDescriptor } from "./model-descriptor";
4
- import { PropertyConverter } from "..";
5
5
  export interface Props {
6
6
  [key: PropertyKey]: any;
7
7
  }
@@ -17,18 +17,18 @@ export declare class DomainModel<P extends Props> {
17
17
  constructor();
18
18
  definePropertyAccessors(): void;
19
19
  protected definePropAccessor<K extends keyof P>(key: keyof this, propTargetKey: K, propConverter?: PropertyConverter): void;
20
- modelDescriptor(): ModelDescriptor<AnyDomainModel>;
20
+ get modelDescriptor(): ModelDescriptor<AnyDomainModel>;
21
21
  validateProps(props: P): void;
22
22
  validate(): void;
23
- isPropsEmpty(): this is InitializedDomainModel<P>;
23
+ isPropsEmpty(): boolean;
24
+ isPropsInitialized<T extends AnyDomainModel>(this: T): this is InitializedDomainModel<typeof this>;
24
25
  props(): P | null;
25
- metadata(): any;
26
26
  protected initializeProps(propsOrBuilder: P | PropsBuilder<typeof this>): void;
27
27
  }
28
- export type InitializedDomainModel<P extends Props> = DomainModel<P> & {
29
- props(): P;
30
- };
31
28
  export type AnyDomainModel = DomainModel<Props>;
29
+ export type InitializedDomainModel<T extends AnyDomainModel> = T & {
30
+ props(): InferredProps<T>;
31
+ };
32
32
  export type InferredProps<T extends AnyDomainModel> = T extends DomainModel<infer P> ? P : never;
33
33
  export type DomainModelClass<T extends AnyDomainModel = AnyDomainModel> = Class<T> & ClassStatic<typeof DomainModel<InferredProps<T>>>;
34
34
  export type AbstractDomainModelClass<T extends AnyDomainModel = AnyDomainModel> = AbstractClass<T> & ClassStatic<typeof DomainModel<InferredProps<T>>>;
@@ -19,9 +19,7 @@ class DomainModel {
19
19
  this.definePropertyAccessors();
20
20
  }
21
21
  definePropertyAccessors() {
22
- this.modelDescriptor()
23
- .resolvedPropertyAccessors()
24
- .forEach(({ targetKey, converter }, key) => {
22
+ this.modelDescriptor.resolvedPropertyAccessors.forEach(({ targetKey, converter }, key) => {
25
23
  this.definePropAccessor(key, targetKey, converter);
26
24
  });
27
25
  }
@@ -30,22 +28,19 @@ class DomainModel {
30
28
  configurable: false,
31
29
  enumerable: true,
32
30
  get() {
33
- var _a;
34
- const value = (_a = this._props) === null || _a === void 0 ? void 0 : _a[propTargetKey];
31
+ const value = this._props?.[propTargetKey];
35
32
  if (!propConverter)
36
33
  return value;
37
34
  return propConverter(value);
38
35
  },
39
36
  });
40
37
  }
41
- modelDescriptor() {
38
+ get modelDescriptor() {
42
39
  return new model_descriptor_1.ModelDescriptor(this.constructor);
43
40
  }
44
41
  validateProps(props) {
45
- const modelPropsValidators = this.modelDescriptor().modelPropsValidators();
46
- modelPropsValidators.forEach((propsValidator) => propsValidator.validate(props)
47
- // propsValidator.call(this.constructor, props)
48
- );
42
+ const modelPropsValidators = this.modelDescriptor.modelPropsValidators;
43
+ modelPropsValidators.forEach((propsValidator) => propsValidator.validate(props));
49
44
  }
50
45
  validate() {
51
46
  this.validateProps(this._props);
@@ -53,23 +48,23 @@ class DomainModel {
53
48
  isPropsEmpty() {
54
49
  return this._props === DomainModel.EMPTY_PROPS;
55
50
  }
51
+ isPropsInitialized() {
52
+ return !this.isPropsEmpty();
53
+ }
56
54
  props() {
57
55
  if (this.isPropsEmpty())
58
56
  return null;
59
57
  return lodash_1.default.cloneDeep(this._props);
60
58
  }
61
- metadata() {
62
- return {};
63
- }
64
59
  initializeProps(propsOrBuilder) {
65
- if (!this.isPropsEmpty())
60
+ if (this.isPropsInitialized())
66
61
  throw new errors_1.PropsInitializedError();
67
62
  let props;
68
63
  if (typeof propsOrBuilder === "function")
69
64
  props = propsOrBuilder.call(this);
70
65
  else
71
66
  props = propsOrBuilder;
72
- if (!this.modelDescriptor().modelMutable) {
67
+ if (!this.modelDescriptor.modelMutable) {
73
68
  this._props = props;
74
69
  Object.freeze(this._props);
75
70
  }
@@ -1,5 +1,5 @@
1
- import { AnyDomainModel, DomainModelClass } from "./model";
2
1
  import { ModelId, ModelName, ModelVersion } from "./meta";
2
+ import { AnyDomainModel, DomainModelClass } from "./model";
3
3
  export declare class ModelVersions<T extends AnyDomainModel = AnyDomainModel> extends Map<ModelVersion, DomainModelClass<T>> {
4
4
  readonly modelName: ModelName;
5
5
  constructor(modelName: ModelName);