@decaf-ts/decorator-validation 1.10.5 → 1.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (218) hide show
  1. package/README.md +1 -1
  2. package/dist/decorator-validation.cjs +1 -1
  3. package/dist/decorator-validation.cjs.map +1 -1
  4. package/dist/decorator-validation.js +1 -1
  5. package/dist/decorator-validation.js.map +1 -1
  6. package/lib/esm/index.d.ts +2 -1
  7. package/lib/esm/index.js +2 -1
  8. package/lib/esm/index.js.map +1 -1
  9. package/lib/esm/model/Builder.d.ts +84 -0
  10. package/lib/esm/model/Builder.js +395 -129
  11. package/lib/esm/model/Builder.js.map +1 -1
  12. package/lib/esm/model/Model.d.ts +21 -19
  13. package/lib/esm/model/Model.js +112 -105
  14. package/lib/esm/model/Model.js.map +1 -1
  15. package/lib/esm/model/constants.d.ts +8 -8
  16. package/lib/esm/model/constants.js +8 -9
  17. package/lib/esm/model/constants.js.map +1 -1
  18. package/lib/esm/model/decorators.d.ts +2 -12
  19. package/lib/esm/model/decorators.js +5 -39
  20. package/lib/esm/model/decorators.js.map +1 -1
  21. package/lib/esm/model/index.d.ts +1 -0
  22. package/lib/esm/model/index.js +1 -0
  23. package/lib/esm/model/index.js.map +1 -1
  24. package/lib/esm/model/types.d.ts +9 -12
  25. package/lib/esm/model/utils.d.ts +0 -3
  26. package/lib/esm/model/utils.js +0 -10
  27. package/lib/esm/model/utils.js.map +1 -1
  28. package/lib/esm/model/validation.d.ts +4 -37
  29. package/lib/esm/model/validation.js +30 -106
  30. package/lib/esm/model/validation.js.map +1 -1
  31. package/lib/esm/overrides/Metadata.d.ts +128 -0
  32. package/lib/esm/overrides/Metadata.js +2 -0
  33. package/lib/esm/overrides/Metadata.js.map +1 -0
  34. package/lib/esm/overrides/index.d.ts +3 -0
  35. package/lib/esm/overrides/index.js +4 -0
  36. package/lib/esm/overrides/index.js.map +1 -0
  37. package/lib/esm/overrides/overrides.d.ts +1 -0
  38. package/lib/esm/overrides/overrides.js +79 -0
  39. package/lib/esm/overrides/overrides.js.map +1 -0
  40. package/lib/esm/overrides/types.d.ts +9 -0
  41. package/lib/esm/overrides/types.js +2 -0
  42. package/lib/esm/overrides/types.js.map +1 -0
  43. package/lib/esm/types/validation.d.ts +4 -2
  44. package/lib/esm/utils/constants.d.ts +4 -18
  45. package/lib/esm/utils/constants.js +4 -17
  46. package/lib/esm/utils/constants.js.map +1 -1
  47. package/lib/esm/utils/dates.d.ts +0 -1
  48. package/lib/esm/utils/dates.js +0 -1
  49. package/lib/esm/utils/dates.js.map +1 -1
  50. package/lib/esm/utils/equality.d.ts +56 -0
  51. package/lib/esm/utils/equality.js +160 -0
  52. package/lib/esm/utils/equality.js.map +1 -0
  53. package/lib/esm/utils/index.d.ts +1 -2
  54. package/lib/esm/utils/index.js +1 -2
  55. package/lib/esm/utils/index.js.map +1 -1
  56. package/lib/esm/utils/registry.d.ts +1 -1
  57. package/lib/esm/utils/serialization.d.ts +2 -2
  58. package/lib/esm/utils/serialization.js +10 -2
  59. package/lib/esm/utils/serialization.js.map +1 -1
  60. package/lib/esm/utils/types.d.ts +0 -102
  61. package/lib/esm/validation/Validation.d.ts +2 -3
  62. package/lib/esm/validation/Validation.js +11 -6
  63. package/lib/esm/validation/Validation.js.map +1 -1
  64. package/lib/esm/validation/Validators/BaseValidator.js +7 -3
  65. package/lib/esm/validation/Validators/BaseValidator.js.map +1 -1
  66. package/lib/esm/validation/Validators/DiffValidator.js +1 -1
  67. package/lib/esm/validation/Validators/DiffValidator.js.map +1 -1
  68. package/lib/esm/validation/Validators/EqualsValidator.js +1 -1
  69. package/lib/esm/validation/Validators/EqualsValidator.js.map +1 -1
  70. package/lib/esm/validation/Validators/GreaterThanOrEqualValidator.js +1 -1
  71. package/lib/esm/validation/Validators/GreaterThanOrEqualValidator.js.map +1 -1
  72. package/lib/esm/validation/Validators/LessThanOrEqualValidator.js +1 -1
  73. package/lib/esm/validation/Validators/LessThanOrEqualValidator.js.map +1 -1
  74. package/lib/esm/validation/Validators/ListValidator.js +4 -4
  75. package/lib/esm/validation/Validators/ListValidator.js.map +1 -1
  76. package/lib/esm/validation/Validators/MaxLengthValidator.js +3 -2
  77. package/lib/esm/validation/Validators/MaxLengthValidator.js.map +1 -1
  78. package/lib/esm/validation/Validators/MaxValidator.js +1 -1
  79. package/lib/esm/validation/Validators/MaxValidator.js.map +1 -1
  80. package/lib/esm/validation/Validators/MinLengthValidator.js +3 -2
  81. package/lib/esm/validation/Validators/MinLengthValidator.js.map +1 -1
  82. package/lib/esm/validation/Validators/MinValidator.js +1 -1
  83. package/lib/esm/validation/Validators/MinValidator.js.map +1 -1
  84. package/lib/esm/validation/Validators/OptionValidator.d.ts +29 -0
  85. package/lib/esm/validation/Validators/OptionValidator.js +61 -0
  86. package/lib/esm/validation/Validators/OptionValidator.js.map +1 -0
  87. package/lib/esm/validation/Validators/TypeValidator.js +2 -2
  88. package/lib/esm/validation/Validators/TypeValidator.js.map +1 -1
  89. package/lib/esm/validation/Validators/constants.d.ts +2 -1
  90. package/lib/esm/validation/Validators/constants.js +3 -2
  91. package/lib/esm/validation/Validators/constants.js.map +1 -1
  92. package/lib/esm/validation/Validators/decorators.d.ts +1 -1
  93. package/lib/esm/validation/Validators/decorators.js +2 -2
  94. package/lib/esm/validation/Validators/decorators.js.map +1 -1
  95. package/lib/esm/validation/Validators/index.d.ts +1 -0
  96. package/lib/esm/validation/Validators/index.js +1 -0
  97. package/lib/esm/validation/Validators/index.js.map +1 -1
  98. package/lib/esm/validation/Validators/utils.d.ts +33 -0
  99. package/lib/esm/validation/Validators/utils.js +62 -0
  100. package/lib/esm/validation/Validators/utils.js.map +1 -1
  101. package/lib/esm/validation/decorators.d.ts +28 -17
  102. package/lib/esm/validation/decorators.js +138 -55
  103. package/lib/esm/validation/decorators.js.map +1 -1
  104. package/lib/esm/validation/types.d.ts +15 -5
  105. package/lib/esm/validation/types.js.map +1 -1
  106. package/lib/index.cjs +2 -1
  107. package/lib/index.d.ts +2 -1
  108. package/lib/index.js.map +1 -1
  109. package/lib/model/Builder.cjs +399 -128
  110. package/lib/model/Builder.d.ts +84 -0
  111. package/lib/model/Builder.js.map +1 -1
  112. package/lib/model/Model.cjs +114 -107
  113. package/lib/model/Model.d.ts +21 -19
  114. package/lib/model/Model.js.map +1 -1
  115. package/lib/model/constants.cjs +8 -9
  116. package/lib/model/constants.d.ts +8 -8
  117. package/lib/model/constants.js.map +1 -1
  118. package/lib/model/decorators.cjs +4 -39
  119. package/lib/model/decorators.d.ts +2 -12
  120. package/lib/model/decorators.js.map +1 -1
  121. package/lib/model/index.cjs +1 -0
  122. package/lib/model/index.d.ts +1 -0
  123. package/lib/model/index.js.map +1 -1
  124. package/lib/model/types.d.ts +9 -12
  125. package/lib/model/utils.cjs +0 -12
  126. package/lib/model/utils.d.ts +0 -3
  127. package/lib/model/utils.js.map +1 -1
  128. package/lib/model/validation.cjs +30 -108
  129. package/lib/model/validation.d.ts +4 -37
  130. package/lib/model/validation.js.map +1 -1
  131. package/lib/overrides/Metadata.cjs +3 -0
  132. package/lib/overrides/Metadata.d.ts +128 -0
  133. package/lib/overrides/Metadata.js.map +1 -0
  134. package/lib/overrides/index.cjs +20 -0
  135. package/lib/overrides/index.d.ts +3 -0
  136. package/lib/overrides/index.js.map +1 -0
  137. package/lib/overrides/overrides.cjs +81 -0
  138. package/lib/overrides/overrides.d.ts +1 -0
  139. package/lib/overrides/overrides.js.map +1 -0
  140. package/lib/overrides/types.cjs +3 -0
  141. package/lib/overrides/types.d.ts +9 -0
  142. package/lib/overrides/types.js.map +1 -0
  143. package/lib/types/validation.d.ts +4 -2
  144. package/lib/utils/constants.cjs +5 -18
  145. package/lib/utils/constants.d.ts +4 -18
  146. package/lib/utils/constants.js.map +1 -1
  147. package/lib/utils/dates.cjs +0 -1
  148. package/lib/utils/dates.d.ts +0 -1
  149. package/lib/utils/dates.js.map +1 -1
  150. package/lib/utils/equality.cjs +163 -0
  151. package/lib/utils/equality.d.ts +56 -0
  152. package/lib/utils/equality.js.map +1 -0
  153. package/lib/utils/index.cjs +1 -2
  154. package/lib/utils/index.d.ts +1 -2
  155. package/lib/utils/index.js.map +1 -1
  156. package/lib/utils/registry.d.ts +1 -1
  157. package/lib/utils/serialization.cjs +10 -2
  158. package/lib/utils/serialization.d.ts +2 -2
  159. package/lib/utils/serialization.js.map +1 -1
  160. package/lib/utils/types.d.ts +0 -102
  161. package/lib/validation/Validation.cjs +11 -6
  162. package/lib/validation/Validation.d.ts +2 -3
  163. package/lib/validation/Validation.js.map +1 -1
  164. package/lib/validation/Validators/BaseValidator.cjs +7 -3
  165. package/lib/validation/Validators/BaseValidator.js.map +1 -1
  166. package/lib/validation/Validators/DiffValidator.cjs +2 -2
  167. package/lib/validation/Validators/DiffValidator.js.map +1 -1
  168. package/lib/validation/Validators/EqualsValidator.cjs +2 -2
  169. package/lib/validation/Validators/EqualsValidator.js.map +1 -1
  170. package/lib/validation/Validators/GreaterThanOrEqualValidator.cjs +2 -2
  171. package/lib/validation/Validators/GreaterThanOrEqualValidator.js.map +1 -1
  172. package/lib/validation/Validators/LessThanOrEqualValidator.cjs +2 -2
  173. package/lib/validation/Validators/LessThanOrEqualValidator.js.map +1 -1
  174. package/lib/validation/Validators/ListValidator.cjs +4 -4
  175. package/lib/validation/Validators/ListValidator.js.map +1 -1
  176. package/lib/validation/Validators/MaxLengthValidator.cjs +3 -2
  177. package/lib/validation/Validators/MaxLengthValidator.js.map +1 -1
  178. package/lib/validation/Validators/MaxValidator.cjs +1 -1
  179. package/lib/validation/Validators/MaxValidator.js.map +1 -1
  180. package/lib/validation/Validators/MinLengthValidator.cjs +3 -2
  181. package/lib/validation/Validators/MinLengthValidator.js.map +1 -1
  182. package/lib/validation/Validators/MinValidator.cjs +1 -1
  183. package/lib/validation/Validators/MinValidator.js.map +1 -1
  184. package/lib/validation/Validators/OptionValidator.cjs +64 -0
  185. package/lib/validation/Validators/OptionValidator.d.ts +29 -0
  186. package/lib/validation/Validators/OptionValidator.js.map +1 -0
  187. package/lib/validation/Validators/TypeValidator.cjs +2 -2
  188. package/lib/validation/Validators/TypeValidator.js.map +1 -1
  189. package/lib/validation/Validators/constants.cjs +5 -4
  190. package/lib/validation/Validators/constants.d.ts +2 -1
  191. package/lib/validation/Validators/constants.js.map +1 -1
  192. package/lib/validation/Validators/decorators.cjs +3 -3
  193. package/lib/validation/Validators/decorators.d.ts +1 -1
  194. package/lib/validation/Validators/decorators.js.map +1 -1
  195. package/lib/validation/Validators/index.cjs +1 -0
  196. package/lib/validation/Validators/index.d.ts +1 -0
  197. package/lib/validation/Validators/index.js.map +1 -1
  198. package/lib/validation/Validators/utils.cjs +66 -0
  199. package/lib/validation/Validators/utils.d.ts +33 -0
  200. package/lib/validation/Validators/utils.js.map +1 -1
  201. package/lib/validation/decorators.cjs +154 -69
  202. package/lib/validation/decorators.d.ts +28 -17
  203. package/lib/validation/decorators.js.map +1 -1
  204. package/lib/validation/types.d.ts +15 -5
  205. package/lib/validation/types.js.map +1 -1
  206. package/package.json +2 -3
  207. package/lib/esm/utils/Decoration.d.ts +0 -135
  208. package/lib/esm/utils/Decoration.js +0 -227
  209. package/lib/esm/utils/Decoration.js.map +0 -1
  210. package/lib/esm/utils/decorators.d.ts +0 -38
  211. package/lib/esm/utils/decorators.js +0 -64
  212. package/lib/esm/utils/decorators.js.map +0 -1
  213. package/lib/utils/Decoration.cjs +0 -231
  214. package/lib/utils/Decoration.d.ts +0 -135
  215. package/lib/utils/Decoration.js.map +0 -1
  216. package/lib/utils/decorators.cjs +0 -68
  217. package/lib/utils/decorators.d.ts +0 -38
  218. package/lib/utils/decorators.js.map +0 -1
@@ -0,0 +1,84 @@
1
+ import { Model } from "./Model";
2
+ import { ObjectAccumulator } from "typed-object-accumulator";
3
+ import { Constructor } from "@decaf-ts/decoration";
4
+ import { ComparisonValidatorOptions } from "../validation/types";
5
+ import { ExtendedMetadata } from "../overrides/types";
6
+ type BuildableModel = Model & Record<PropertyKey, any>;
7
+ export interface DecorateOption<M extends Model> {
8
+ decorate(...decorators: PropertyDecorator[]): ModelBuilder<M>;
9
+ }
10
+ export declare class AttributeBuilder<M extends BuildableModel, N extends keyof M, T> implements DecorateOption<M> {
11
+ protected parent: ModelBuilder<M>;
12
+ readonly attr: N;
13
+ readonly declaredType: T;
14
+ constructor(parent: ModelBuilder<M>, attr: N, declaredType: T);
15
+ private decorators;
16
+ decorate(...decorators: PropertyDecorator[]): ModelBuilder<M>;
17
+ undecorate(...decorators: PropertyDecorator[]): ModelBuilder<M>;
18
+ required(messageOrMeta?: string | Record<string, any>): ModelBuilder<M>;
19
+ min(valueOrMeta: number | Date | string | Record<string, any>, message?: string): ModelBuilder<M>;
20
+ max(valueOrMeta: number | Date | string | Record<string, any>, message?: string): ModelBuilder<M>;
21
+ step(valueOrMeta: number | Record<string, any>, message?: string): ModelBuilder<M>;
22
+ minlength(valueOrMeta: number | Record<string, any>, message?: string): ModelBuilder<M>;
23
+ maxlength(valueOrMeta: number | Record<string, any>, message?: string): ModelBuilder<M>;
24
+ pattern(valueOrMeta: RegExp | string | Record<string, any>, message?: string): ModelBuilder<M>;
25
+ email(messageOrMeta?: string | Record<string, any>): ModelBuilder<M>;
26
+ url(messageOrMeta?: string | Record<string, any>): ModelBuilder<M>;
27
+ type(valueOrMeta: Constructor | (() => Constructor) | (Constructor | (() => Constructor))[] | Record<string, any>, message?: string): ModelBuilder<M>;
28
+ date(formatOrMeta?: string | Record<string, any>, message?: string): ModelBuilder<M>;
29
+ password(valueOrMeta?: RegExp | string | Record<string, any>, message?: string): ModelBuilder<M>;
30
+ list(clazzOrMeta: Constructor | (() => Constructor) | (Constructor | (() => Constructor))[] | Record<string, any>, collection?: "Array" | "Set", message?: string): ModelBuilder<M>;
31
+ set(clazzOrMeta: Constructor | Record<string, any>, message?: string): ModelBuilder<M>;
32
+ enum(valueOrMeta: any[] | Record<any, any> | Record<string, any>, message?: string): ModelBuilder<M>;
33
+ option(value: any[] | Record<any, any>, message?: string): ModelBuilder<M>;
34
+ private static isMetadataPayload;
35
+ private static asMeta;
36
+ private static resolveMessage;
37
+ private static patternFromString;
38
+ private resolveComparison;
39
+ equals(propertyOrMeta: string | Record<string, any>, options?: Omit<ComparisonValidatorOptions, "async" | "description">): ModelBuilder<M>;
40
+ eq(propertyOrMeta: string | Record<string, any>, options?: Omit<ComparisonValidatorOptions, "async" | "description">): ModelBuilder<M>;
41
+ different(propertyOrMeta: string | Record<string, any>, options?: Omit<ComparisonValidatorOptions, "async" | "description">): ModelBuilder<M>;
42
+ diff(propertyOrMeta: string | Record<string, any>, options?: Omit<ComparisonValidatorOptions, "async" | "description">): ModelBuilder<M>;
43
+ lessThan(propertyOrMeta: string | Record<string, any>, options?: Omit<ComparisonValidatorOptions, "async" | "description">): ModelBuilder<M>;
44
+ lt(propertyOrMeta: string | Record<string, any>, options?: Omit<ComparisonValidatorOptions, "async" | "description">): ModelBuilder<M>;
45
+ lessThanOrEqual(propertyOrMeta: string | Record<string, any>, options?: Omit<ComparisonValidatorOptions, "async" | "description">): ModelBuilder<M>;
46
+ lte(propertyOrMeta: string | Record<string, any>, options?: Omit<ComparisonValidatorOptions, "async" | "description">): ModelBuilder<M>;
47
+ greaterThan(propertyOrMeta: string | Record<string, any>, options?: Omit<ComparisonValidatorOptions, "async" | "description">): ModelBuilder<M>;
48
+ gt(propertyOrMeta: string | Record<string, any>, options?: Omit<ComparisonValidatorOptions, "async" | "description">): ModelBuilder<M>;
49
+ greaterThanOrEqual(propertyOrMeta: string | Record<string, any>, options?: Omit<ComparisonValidatorOptions, "async" | "description">): ModelBuilder<M>;
50
+ gte(propertyOrMeta: string | Record<string, any>, options?: Omit<ComparisonValidatorOptions, "async" | "description">): ModelBuilder<M>;
51
+ description(desc: string): ModelBuilder<M>;
52
+ /**
53
+ * Applies the attribute metadata and decorators to the provided constructor.
54
+ */
55
+ build(constructor: Constructor<M>): void;
56
+ }
57
+ declare class ListAttributeBuilder<M extends BuildableModel, N extends keyof M> {
58
+ private readonly parent;
59
+ private readonly attribute;
60
+ private readonly collection;
61
+ constructor(parent: ModelBuilder<M>, attribute: AttributeBuilder<M, N, any>, collection: "Array" | "Set");
62
+ ofPrimitives(clazz: Constructor | (() => Constructor) | (Constructor | (() => Constructor))[], message?: string): ModelBuilder<M>;
63
+ ofModel<MM extends BuildableModel>(): ModelBuilder<MM>;
64
+ }
65
+ export declare class ModelBuilder<M extends BuildableModel = BuildableModel> extends ObjectAccumulator<M> {
66
+ private attributes;
67
+ private _name?;
68
+ private _description?;
69
+ private _parent?;
70
+ setName(name: string): this;
71
+ description(desc: string): this;
72
+ private attribute;
73
+ string<N extends keyof M>(attr: N): AttributeBuilder<M, N, StringConstructor>;
74
+ number<N extends keyof M>(attr: N): AttributeBuilder<M, N, NumberConstructor>;
75
+ date<N extends keyof M>(attr: N): AttributeBuilder<M, N, DateConstructor>;
76
+ bigint<N extends keyof M>(attr: N): AttributeBuilder<M, N, BigIntConstructor>;
77
+ instance<N extends keyof M>(clazz: Constructor<any>, attr: N): AttributeBuilder<M, N, Constructor<any>>;
78
+ model<MM extends Model, N extends keyof M>(attr: N): ModelBuilder<MM>;
79
+ listOf<N extends keyof M>(attr: N, collection?: "Array" | "Set"): ListAttributeBuilder<M, N>;
80
+ build(): Constructor<M>;
81
+ static builder<M extends BuildableModel = BuildableModel>(): ModelBuilder<M>;
82
+ static from<N extends Model, M extends ExtendedMetadata<N>>(meta: M, name?: string): Constructor<N>;
83
+ }
84
+ export {};
@@ -1,130 +1,396 @@
1
- "use strict";
2
- // import { Model } from "./Model";
3
- // import { Constructor, ModelArg } from "./types";
4
- // import { ObjectAccumulator } from "typed-object-accumulator";
5
- //
6
- // export interface DecorateOption<M extends Model> {
7
- // decorate(...decorators: PropertyDecorator[]): ModelBuilder<M>;
8
- // }
9
- //
10
- // export class AttributeBuilder<M extends Model, N extends keyof M, T>
11
- // implements DecorateOption<M>
12
- // {
13
- // constructor(
14
- // protected parent: ModelBuilder<M>,
15
- // readonly attr: keyof M,
16
- // readonly type: T
17
- // ) {}
18
- //
19
- // private decorators: Set<PropertyDecorator> = new Set();
20
- //
21
- // decorate(...decorators: PropertyDecorator[]): ModelBuilder<M> {
22
- // for (const decorator of decorators) {
23
- // if (this.decorators.has(decorator))
24
- // throw new Error(`Decorator "${decorator}" has already been used`);
25
- // this.decorators.add(decorator);
26
- // }
27
- // return this.parent;
28
- // }
29
- //
30
- // undecorate(...decorators: PropertyDecorator[]) {
31
- // for (const decorator of decorators) {
32
- // if (!this.decorators.has(decorator))
33
- // throw new Error(
34
- // `Decorator "${decorator}" is not applied to ${this.attr as string}`
35
- // );
36
- // this.decorators.delete(decorator);
37
- // }
38
- // return this.parent;
39
- // }
40
- //
41
- // apply(obj: Constructor<M>): ModelBuilder<M> {
42
- // Object.defineProperty(obj, this.attr, {
43
- // value: undefined,
44
- // });
45
- // this.decorators.forEach((decorator) => {
46
- // try {
47
- // decorator(obj, this.attr as any);
48
- // } catch (e: unknown) {
49
- // throw new Error(
50
- // `Failed to apply decorator to property "${this.attr as any}": ${e}`
51
- // );
52
- // }
53
- // });
54
- // //
55
- // // const c = `${this.attr.toString()}` as const;
56
- // //
57
- // // const temp: {
58
- // // [c]: T
59
- // // } = {
60
- // // [this.attr]: 0
61
- // // }
62
- //
63
- // return this.parent.accumulate() as unknown as ModelBuilder<M & Record<N, T>>;
64
- // }
65
- // }
66
- //
67
- // export class ModelBuilder<M extends Model = Model> extends ObjectAccumulator<M>{
68
- // private attributes: Map<string, AttributeBuilder<M, any, any>> = new Map();
69
- // private _name?: string;
70
- //
71
- // private _parent?: Constructor<M>;
72
- //
73
- // setName(name: string) {
74
- // this._name = name;
75
- // return this;
76
- // }
77
- //
78
- // private attribute<T, N extends symbol>(
79
- // attr: string,
80
- // type: T
81
- // ): AttributeBuilder<M, N, T> {
82
- // return new AttributeBuilder<M, N, T>(this, attr as any, type);
83
- // }
84
- //
85
- // string(attr: string) {
86
- // return this.attribute(attr, String.name);
87
- // }
88
- //
89
- // number(attr: string) {
90
- // return this.attribute(attr, Number.name);
91
- // }
92
- //
93
- // date(attr: string) {
94
- // return this.attribute(attr, Date.name);
95
- // }
96
- //
97
- // bigint(attr: string) {
98
- // return this.attribute(attr, BigInt.name);
99
- // }
100
- //
101
- // instance(clazz: Constructor<any>, attr: string) {
102
- // return this.attribute(attr, clazz.name);
103
- // }
104
- //
105
- // build(): Constructor<M> {
106
- // if (!this._name) throw new Error("name is required");
107
- //
108
- // const DynamicBuiltClass = class<M> extends Model {
109
- // constructor(arg?: ModelArg<M>) {
110
- // super(arg as any);
111
- // }
112
- // };
113
- //
114
- // Object.defineProperty(DynamicBuiltClass, "name", {
115
- // value: this._name,
116
- // writable: false,
117
- // });
118
- //
119
- // this.attributes.forEach((attribute) => {
120
- // attribute.apply(DynamicBuiltClass as any);
121
- // });
122
- //
123
- // return DynamicBuiltClass as unknown as Constructor<M>;
124
- // }
125
- //
126
- // static get builder() {
127
- // return new ModelBuilder();
128
- // }
129
- // }
1
+ import { Model } from "./Model.js";
2
+ import { ObjectAccumulator } from "typed-object-accumulator";
3
+ import { DecorationKeys, prop, description, } from "@decaf-ts/decoration";
4
+ import { model } from "./decorators.js";
5
+ import { date, diff, email, eq, gt, gte, list, lt, lte, max, maxlength, min, minlength, option, password, pattern, required, step, type, url, } from "./../validation/decorators.js";
6
+ import { ValidationKeys } from "./../validation/Validators/constants.js";
7
+ import { Validation } from "./../validation/Validation.js";
8
+ export class AttributeBuilder {
9
+ constructor(parent, attr, declaredType) {
10
+ this.parent = parent;
11
+ this.attr = attr;
12
+ this.declaredType = declaredType;
13
+ this.decorators = [];
14
+ }
15
+ decorate(...decorators) {
16
+ for (const decorator of decorators) {
17
+ if (this.decorators.includes(decorator))
18
+ throw new Error(`Decorator "${decorator}" has already been used`);
19
+ this.decorators.push(decorator);
20
+ }
21
+ return this.parent;
22
+ }
23
+ undecorate(...decorators) {
24
+ for (const decorator of decorators) {
25
+ const index = this.decorators.indexOf(decorator);
26
+ if (index < 0)
27
+ throw new Error(`Decorator "${decorator}" is not applied to ${this.attr}`);
28
+ this.decorators.splice(index, 1);
29
+ }
30
+ return this.parent;
31
+ }
32
+ required(messageOrMeta) {
33
+ const meta = AttributeBuilder.asMeta(messageOrMeta);
34
+ const message = typeof messageOrMeta === "string"
35
+ ? messageOrMeta
36
+ : AttributeBuilder.resolveMessage(meta);
37
+ return this.decorate(required(message));
38
+ }
39
+ min(valueOrMeta, message) {
40
+ const meta = AttributeBuilder.asMeta(valueOrMeta);
41
+ const value = meta?.[ValidationKeys.MIN] ??
42
+ (meta ? undefined : valueOrMeta);
43
+ if (value === undefined)
44
+ throw new Error(`Missing ${ValidationKeys.MIN} for ${String(this.attr)}`);
45
+ return this.decorate(min(value, AttributeBuilder.resolveMessage(meta, message)));
46
+ }
47
+ max(valueOrMeta, message) {
48
+ const meta = AttributeBuilder.asMeta(valueOrMeta);
49
+ const value = meta?.[ValidationKeys.MAX] ??
50
+ (meta ? undefined : valueOrMeta);
51
+ if (value === undefined)
52
+ throw new Error(`Missing ${ValidationKeys.MAX} for ${String(this.attr)}`);
53
+ return this.decorate(max(value, AttributeBuilder.resolveMessage(meta, message)));
54
+ }
55
+ step(valueOrMeta, message) {
56
+ const meta = AttributeBuilder.asMeta(valueOrMeta);
57
+ const value = meta?.[ValidationKeys.STEP] ??
58
+ (meta ? undefined : valueOrMeta);
59
+ if (value === undefined)
60
+ throw new Error(`Missing ${ValidationKeys.STEP} for ${String(this.attr)}`);
61
+ return this.decorate(step(value, AttributeBuilder.resolveMessage(meta, message)));
62
+ }
63
+ minlength(valueOrMeta, message) {
64
+ const meta = AttributeBuilder.asMeta(valueOrMeta);
65
+ const value = meta?.[ValidationKeys.MIN_LENGTH] ??
66
+ (meta ? undefined : valueOrMeta);
67
+ if (value === undefined)
68
+ throw new Error(`Missing ${ValidationKeys.MIN_LENGTH} for ${String(this.attr)}`);
69
+ return this.decorate(minlength(value, AttributeBuilder.resolveMessage(meta, message)));
70
+ }
71
+ maxlength(valueOrMeta, message) {
72
+ const meta = AttributeBuilder.asMeta(valueOrMeta);
73
+ const value = meta?.[ValidationKeys.MAX_LENGTH] ??
74
+ (meta ? undefined : valueOrMeta);
75
+ if (value === undefined)
76
+ throw new Error(`Missing ${ValidationKeys.MAX_LENGTH} for ${String(this.attr)}`);
77
+ return this.decorate(maxlength(value, AttributeBuilder.resolveMessage(meta, message)));
78
+ }
79
+ pattern(valueOrMeta, message) {
80
+ const meta = AttributeBuilder.asMeta(valueOrMeta);
81
+ const rawPattern = meta?.[ValidationKeys.PATTERN] ??
82
+ (meta ? undefined : valueOrMeta);
83
+ const regex = AttributeBuilder.patternFromString(rawPattern) ?? /.*/;
84
+ return this.decorate(pattern(regex, AttributeBuilder.resolveMessage(meta, message)));
85
+ }
86
+ email(messageOrMeta) {
87
+ const meta = AttributeBuilder.asMeta(messageOrMeta);
88
+ const message = typeof messageOrMeta === "string"
89
+ ? messageOrMeta
90
+ : AttributeBuilder.resolveMessage(meta);
91
+ return this.decorate(email(message));
92
+ }
93
+ url(messageOrMeta) {
94
+ const meta = AttributeBuilder.asMeta(messageOrMeta);
95
+ const message = typeof messageOrMeta === "string"
96
+ ? messageOrMeta
97
+ : AttributeBuilder.resolveMessage(meta);
98
+ return this.decorate(url(message));
99
+ }
100
+ type(valueOrMeta, message) {
101
+ const meta = AttributeBuilder.asMeta(valueOrMeta);
102
+ const types = meta?.customTypes ?? meta?.type ?? (meta ? undefined : valueOrMeta);
103
+ return this.decorate(type(types, AttributeBuilder.resolveMessage(meta, message)));
104
+ }
105
+ date(formatOrMeta, message) {
106
+ const meta = AttributeBuilder.asMeta(formatOrMeta);
107
+ const format = meta?.[ValidationKeys.FORMAT] ??
108
+ (meta ? undefined : formatOrMeta);
109
+ return this.decorate(date(format, AttributeBuilder.resolveMessage(meta, message)));
110
+ }
111
+ password(valueOrMeta, message) {
112
+ const meta = AttributeBuilder.asMeta(valueOrMeta);
113
+ const rawPattern = meta?.[ValidationKeys.PATTERN] ??
114
+ (meta ? undefined : valueOrMeta);
115
+ const regex = AttributeBuilder.patternFromString(rawPattern);
116
+ return this.decorate(password(regex, AttributeBuilder.resolveMessage(meta, message)));
117
+ }
118
+ list(clazzOrMeta, collection, message) {
119
+ const meta = AttributeBuilder.asMeta(clazzOrMeta);
120
+ const clazz = meta?.clazz ?? (meta ? undefined : clazzOrMeta);
121
+ const typeOfCollection = meta?.type ?? collection;
122
+ return this.decorate(list(clazz, typeOfCollection, AttributeBuilder.resolveMessage(meta, message)));
123
+ }
124
+ set(clazzOrMeta, message) {
125
+ if (AttributeBuilder.isMetadataPayload(clazzOrMeta))
126
+ return this.list(clazzOrMeta);
127
+ return this.list(clazzOrMeta, "Set", message);
128
+ }
129
+ enum(valueOrMeta, message) {
130
+ const meta = AttributeBuilder.asMeta(valueOrMeta);
131
+ const values = meta?.[ValidationKeys.ENUM] ?? (meta ? undefined : valueOrMeta);
132
+ return this.decorate(option(values, AttributeBuilder.resolveMessage(meta, message)));
133
+ }
134
+ option(value, message) {
135
+ return this.enum(value, message);
136
+ }
137
+ static isMetadataPayload(value) {
138
+ if (!value)
139
+ return false;
140
+ if (value instanceof Date)
141
+ return false;
142
+ if (value instanceof RegExp)
143
+ return false;
144
+ if (Array.isArray(value))
145
+ return false;
146
+ return typeof value === "object";
147
+ }
148
+ static asMeta(value) {
149
+ return AttributeBuilder.isMetadataPayload(value)
150
+ ? value
151
+ : undefined;
152
+ }
153
+ static resolveMessage(meta, fallback) {
154
+ return meta?.message ?? fallback;
155
+ }
156
+ static patternFromString(pattern) {
157
+ if (!pattern)
158
+ return undefined;
159
+ if (pattern instanceof RegExp)
160
+ return pattern;
161
+ const match = pattern.match(/^\/(.+)\/([gimsuy]*)$/);
162
+ if (match)
163
+ return new RegExp(match[1], match[2]);
164
+ return new RegExp(pattern);
165
+ }
166
+ resolveComparison(propertyOrMeta, key, options) {
167
+ const meta = AttributeBuilder.asMeta(propertyOrMeta);
168
+ if (meta) {
169
+ return {
170
+ target: meta[key],
171
+ options: {
172
+ label: meta.label,
173
+ message: meta.message,
174
+ },
175
+ };
176
+ }
177
+ return { target: propertyOrMeta, options };
178
+ }
179
+ equals(propertyOrMeta, options) {
180
+ const { target, options: resolvedOptions } = this.resolveComparison(propertyOrMeta, ValidationKeys.EQUALS, options);
181
+ return this.decorate(eq(target, resolvedOptions));
182
+ }
183
+ eq(propertyOrMeta, options) {
184
+ return this.equals(propertyOrMeta, options);
185
+ }
186
+ different(propertyOrMeta, options) {
187
+ const { target, options: resolvedOptions } = this.resolveComparison(propertyOrMeta, ValidationKeys.DIFF, options);
188
+ return this.decorate(diff(target, resolvedOptions));
189
+ }
190
+ diff(propertyOrMeta, options) {
191
+ return this.different(propertyOrMeta, options);
192
+ }
193
+ lessThan(propertyOrMeta, options) {
194
+ const { target, options: resolvedOptions } = this.resolveComparison(propertyOrMeta, ValidationKeys.LESS_THAN, options);
195
+ return this.decorate(lt(target, resolvedOptions));
196
+ }
197
+ lt(propertyOrMeta, options) {
198
+ return this.lessThan(propertyOrMeta, options);
199
+ }
200
+ lessThanOrEqual(propertyOrMeta, options) {
201
+ const { target, options: resolvedOptions } = this.resolveComparison(propertyOrMeta, ValidationKeys.LESS_THAN_OR_EQUAL, options);
202
+ return this.decorate(lte(target, resolvedOptions));
203
+ }
204
+ lte(propertyOrMeta, options) {
205
+ return this.lessThanOrEqual(propertyOrMeta, options);
206
+ }
207
+ greaterThan(propertyOrMeta, options) {
208
+ const { target, options: resolvedOptions } = this.resolveComparison(propertyOrMeta, ValidationKeys.GREATER_THAN, options);
209
+ return this.decorate(gt(target, resolvedOptions));
210
+ }
211
+ gt(propertyOrMeta, options) {
212
+ return this.greaterThan(propertyOrMeta, options);
213
+ }
214
+ greaterThanOrEqual(propertyOrMeta, options) {
215
+ const { target, options: resolvedOptions } = this.resolveComparison(propertyOrMeta, ValidationKeys.GREATER_THAN_OR_EQUAL, options);
216
+ return this.decorate(gte(target, resolvedOptions));
217
+ }
218
+ gte(propertyOrMeta, options) {
219
+ return this.greaterThanOrEqual(propertyOrMeta, options);
220
+ }
221
+ description(desc) {
222
+ return this.decorate(description(desc));
223
+ }
224
+ /**
225
+ * Applies the attribute metadata and decorators to the provided constructor.
226
+ */
227
+ build(constructor) {
228
+ const target = constructor.prototype;
229
+ const propKey = this.attr;
230
+ if (!Object.getOwnPropertyDescriptor(target, propKey)) {
231
+ Object.defineProperty(target, propKey, {
232
+ configurable: true,
233
+ enumerable: true,
234
+ writable: true,
235
+ value: undefined,
236
+ });
237
+ }
238
+ if (this.declaredType) {
239
+ Reflect.defineMetadata(DecorationKeys.DESIGN_TYPE, this.declaredType, target, propKey);
240
+ }
241
+ prop()(target, propKey);
242
+ this.decorators.forEach((decorator) => {
243
+ try {
244
+ decorator(target, propKey);
245
+ }
246
+ catch (e) {
247
+ throw new Error(`Failed to apply decorator to property "${this.attr}": ${e}`);
248
+ }
249
+ });
250
+ }
251
+ }
252
+ class ListAttributeBuilder {
253
+ constructor(parent, attribute, collection) {
254
+ this.parent = parent;
255
+ this.attribute = attribute;
256
+ this.collection = collection;
257
+ }
258
+ ofPrimitives(clazz, message) {
259
+ this.attribute.list(clazz, this.collection, message);
260
+ return this.parent;
261
+ }
262
+ ofModel() {
263
+ const nestedBuilder = ModelBuilder.builder();
264
+ const originalBuild = nestedBuilder.build;
265
+ let cachedConstructor;
266
+ const factory = (() => {
267
+ return function () {
268
+ if (!cachedConstructor) {
269
+ cachedConstructor = Reflect.apply(originalBuild, nestedBuilder, []);
270
+ }
271
+ return cachedConstructor;
272
+ };
273
+ })();
274
+ this.attribute.list(factory, this.collection);
275
+ nestedBuilder.build = new Proxy(originalBuild, {
276
+ apply: (target, thisArg, argArray) => {
277
+ cachedConstructor = Reflect.apply(target, thisArg, argArray);
278
+ return this.parent;
279
+ },
280
+ });
281
+ return nestedBuilder;
282
+ }
283
+ }
284
+ export class ModelBuilder extends ObjectAccumulator {
285
+ constructor() {
286
+ super(...arguments);
287
+ this.attributes = new Map();
288
+ }
289
+ setName(name) {
290
+ this._name = name;
291
+ return this;
292
+ }
293
+ description(desc) {
294
+ this._description = desc;
295
+ return this;
296
+ }
297
+ attribute(attr, type) {
298
+ const existing = this.attributes.get(attr);
299
+ if (existing) {
300
+ if (existing.declaredType !== type)
301
+ throw new Error(`Attribute "${String(attr)}" already exists with a different type`);
302
+ return existing;
303
+ }
304
+ const attributeBuilder = new AttributeBuilder(this, attr, type);
305
+ this.attributes.set(attr, attributeBuilder);
306
+ return attributeBuilder;
307
+ }
308
+ string(attr) {
309
+ return this.attribute(attr, String);
310
+ }
311
+ number(attr) {
312
+ return this.attribute(attr, Number);
313
+ }
314
+ date(attr) {
315
+ return this.attribute(attr, Date);
316
+ }
317
+ bigint(attr) {
318
+ return this.attribute(attr, BigInt);
319
+ }
320
+ instance(clazz, attr) {
321
+ return this.attribute(attr, clazz);
322
+ }
323
+ model(attr) {
324
+ const mm = new ModelBuilder();
325
+ mm.build = new Proxy(mm.build, {
326
+ apply: (target, thisArg, argArray) => {
327
+ const built = Reflect.apply(target, thisArg, argArray);
328
+ return this.instance(built, attr);
329
+ },
330
+ });
331
+ return mm;
332
+ }
333
+ listOf(attr, collection = "Array") {
334
+ const listType = (collection === "Set" ? Set : Array);
335
+ const attribute = this.attribute(attr, listType);
336
+ return new ListAttributeBuilder(this, attribute, collection);
337
+ }
338
+ build() {
339
+ if (!this._name)
340
+ throw new Error("name is required");
341
+ const Parent = this._parent ?? Model;
342
+ class DynamicBuiltClass extends Parent {
343
+ constructor(arg) {
344
+ super(arg);
345
+ }
346
+ }
347
+ Object.defineProperty(DynamicBuiltClass, "name", {
348
+ value: this._name,
349
+ writable: false,
350
+ });
351
+ for (const attribute of this.attributes.values()) {
352
+ attribute.build(DynamicBuiltClass);
353
+ }
354
+ let result = model()(DynamicBuiltClass);
355
+ if (this._description)
356
+ result = description(this._description)(result);
357
+ return result;
358
+ }
359
+ static builder() {
360
+ return new ModelBuilder();
361
+ }
362
+ static from(meta, name) {
363
+ if (!meta)
364
+ throw new Error("metadata is required");
365
+ const builder = ModelBuilder.builder();
366
+ const derivedName = name ?? `GeneratedModel${Date.now()}`;
367
+ builder.setName(derivedName);
368
+ const properties = meta.properties || {};
369
+ const validations = meta.validation || {};
370
+ for (const [prop, designType] of Object.entries(properties)) {
371
+ const attribute = builder.attribute(prop, designType || Object);
372
+ const propValidation = validations[prop];
373
+ if (propValidation) {
374
+ for (const [key, validationMeta] of Object.entries(propValidation)) {
375
+ const handler = attribute[key];
376
+ if (typeof handler === "function") {
377
+ handler.call(attribute, validationMeta);
378
+ continue;
379
+ }
380
+ try {
381
+ const decoratorFactory = Validation.decoratorFromKey(key);
382
+ const decorator = typeof decoratorFactory === "function"
383
+ ? decoratorFactory(validationMeta)
384
+ : decoratorFactory;
385
+ attribute.decorate(decorator);
386
+ }
387
+ catch {
388
+ // ignore unknown decorators
389
+ }
390
+ }
391
+ }
392
+ }
393
+ return builder.build();
394
+ }
395
+ }
130
396
  //# sourceMappingURL=Builder.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Builder.js","sourceRoot":"","sources":["../../../src/model/Builder.ts"],"names":[],"mappings":";AAAA,mCAAmC;AACnC,mDAAmD;AACnD,gEAAgE;AAChE,EAAE;AACF,qDAAqD;AACrD,mEAAmE;AACnE,IAAI;AACJ,EAAE;AACF,uEAAuE;AACvE,iCAAiC;AACjC,IAAI;AACJ,iBAAiB;AACjB,yCAAyC;AACzC,8BAA8B;AAC9B,uBAAuB;AACvB,SAAS;AACT,EAAE;AACF,4DAA4D;AAC5D,EAAE;AACF,oEAAoE;AACpE,4CAA4C;AAC5C,4CAA4C;AAC5C,6EAA6E;AAC7E,wCAAwC;AACxC,QAAQ;AACR,0BAA0B;AAC1B,MAAM;AACN,EAAE;AACF,qDAAqD;AACrD,4CAA4C;AAC5C,6CAA6C;AAC7C,2BAA2B;AAC3B,gFAAgF;AAChF,aAAa;AACb,2CAA2C;AAC3C,QAAQ;AACR,0BAA0B;AAC1B,MAAM;AACN,EAAE;AACF,kDAAkD;AAClD,8CAA8C;AAC9C,0BAA0B;AAC1B,UAAU;AACV,+CAA+C;AAC/C,cAAc;AACd,4CAA4C;AAC5C,+BAA+B;AAC/B,2BAA2B;AAC3B,gFAAgF;AAChF,aAAa;AACb,UAAU;AACV,UAAU;AACV,SAAS;AACT,uDAAuD;AACvD,SAAS;AACT,uBAAuB;AACvB,kBAAkB;AAClB,eAAe;AACf,0BAA0B;AAC1B,WAAW;AACX,EAAE;AACF,oFAAoF;AACpF,MAAM;AACN,IAAI;AACJ,EAAE;AACF,mFAAmF;AACnF,gFAAgF;AAChF,4BAA4B;AAC5B,EAAE;AACF,sCAAsC;AACtC,EAAE;AACF,4BAA4B;AAC5B,yBAAyB;AACzB,mBAAmB;AACnB,MAAM;AACN,EAAE;AACF,4CAA4C;AAC5C,oBAAoB;AACpB,cAAc;AACd,mCAAmC;AACnC,qEAAqE;AACrE,MAAM;AACN,EAAE;AACF,2BAA2B;AAC3B,gDAAgD;AAChD,MAAM;AACN,EAAE;AACF,2BAA2B;AAC3B,gDAAgD;AAChD,MAAM;AACN,EAAE;AACF,yBAAyB;AACzB,8CAA8C;AAC9C,MAAM;AACN,EAAE;AACF,2BAA2B;AAC3B,gDAAgD;AAChD,MAAM;AACN,EAAE;AACF,sDAAsD;AACtD,+CAA+C;AAC/C,MAAM;AACN,EAAE;AACF,8BAA8B;AAC9B,4DAA4D;AAC5D,EAAE;AACF,yDAAyD;AACzD,yCAAyC;AACzC,6BAA6B;AAC7B,UAAU;AACV,SAAS;AACT,EAAE;AACF,yDAAyD;AACzD,2BAA2B;AAC3B,yBAAyB;AACzB,UAAU;AACV,EAAE;AACF,+CAA+C;AAC/C,mDAAmD;AACnD,UAAU;AACV,EAAE;AACF,6DAA6D;AAC7D,MAAM;AACN,EAAE;AACF,2BAA2B;AAC3B,iCAAiC;AACjC,MAAM;AACN,IAAI"}
1
+ {"version":3,"file":"Builder.js","sourceRoot":"","sources":["../../../src/model/Builder.ts"],"names":[],"mappings":"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"}