@decaf-ts/db-decorators 0.6.1 → 0.6.2

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 (141) hide show
  1. package/LICENSE.md +21 -157
  2. package/README.md +571 -10
  3. package/dist/db-decorators.cjs +1352 -322
  4. package/dist/db-decorators.esm.cjs +1352 -323
  5. package/lib/esm/identity/decorators.d.ts +7 -0
  6. package/lib/esm/identity/decorators.js +11 -4
  7. package/lib/esm/identity/index.js +3 -3
  8. package/lib/esm/identity/utils.d.ts +36 -23
  9. package/lib/esm/identity/utils.js +38 -25
  10. package/lib/esm/index.d.ts +12 -27
  11. package/lib/esm/index.js +13 -28
  12. package/lib/esm/interfaces/BulkCrudOperator.d.ts +39 -0
  13. package/lib/esm/interfaces/BulkCrudOperator.js +1 -1
  14. package/lib/esm/interfaces/Contextual.d.ts +17 -0
  15. package/lib/esm/interfaces/Contextual.js +1 -1
  16. package/lib/esm/interfaces/CrudOperator.d.ts +26 -23
  17. package/lib/esm/interfaces/CrudOperator.js +1 -1
  18. package/lib/esm/interfaces/IRepository.d.ts +10 -2
  19. package/lib/esm/interfaces/IRepository.js +1 -1
  20. package/lib/esm/interfaces/index.js +5 -5
  21. package/lib/esm/model/constants.d.ts +11 -13
  22. package/lib/esm/model/constants.js +12 -14
  23. package/lib/esm/model/decorators.d.ts +112 -23
  24. package/lib/esm/model/decorators.js +119 -29
  25. package/lib/esm/model/index.d.ts +1 -0
  26. package/lib/esm/model/index.js +7 -6
  27. package/lib/esm/model/model.d.ts +2 -141
  28. package/lib/esm/model/model.js +2 -13
  29. package/lib/esm/model/overrides.d.ts +1 -0
  30. package/lib/esm/model/overrides.js +23 -0
  31. package/lib/esm/model/utils.d.ts +39 -0
  32. package/lib/esm/model/utils.js +42 -3
  33. package/lib/esm/model/validation.d.ts +26 -8
  34. package/lib/esm/model/validation.js +29 -11
  35. package/lib/esm/operations/Operations.d.ts +65 -3
  36. package/lib/esm/operations/Operations.js +68 -6
  37. package/lib/esm/operations/OperationsRegistry.d.ts +44 -16
  38. package/lib/esm/operations/OperationsRegistry.js +46 -18
  39. package/lib/esm/operations/constants.d.ts +27 -8
  40. package/lib/esm/operations/constants.js +16 -9
  41. package/lib/esm/operations/decorators.d.ts +140 -134
  42. package/lib/esm/operations/decorators.js +152 -137
  43. package/lib/esm/operations/index.js +6 -6
  44. package/lib/esm/operations/types.d.ts +10 -0
  45. package/lib/esm/operations/types.js +1 -1
  46. package/lib/esm/repository/BaseRepository.d.ts +322 -0
  47. package/lib/esm/repository/BaseRepository.js +297 -7
  48. package/lib/esm/repository/Context.d.ts +153 -2
  49. package/lib/esm/repository/Context.js +154 -6
  50. package/lib/esm/repository/Repository.d.ts +89 -0
  51. package/lib/esm/repository/Repository.js +96 -7
  52. package/lib/esm/repository/constants.d.ts +7 -0
  53. package/lib/esm/repository/constants.js +8 -1
  54. package/lib/esm/repository/errors.d.ts +61 -34
  55. package/lib/esm/repository/errors.js +62 -35
  56. package/lib/esm/repository/index.js +9 -9
  57. package/lib/esm/repository/types.d.ts +25 -0
  58. package/lib/esm/repository/types.js +1 -1
  59. package/lib/esm/repository/utils.d.ts +11 -0
  60. package/lib/esm/repository/utils.js +4 -4
  61. package/lib/esm/repository/wrappers.d.ts +2 -2
  62. package/lib/esm/repository/wrappers.js +5 -5
  63. package/lib/esm/validation/constants.d.ts +20 -5
  64. package/lib/esm/validation/constants.js +22 -7
  65. package/lib/esm/validation/decorators.d.ts +101 -19
  66. package/lib/esm/validation/decorators.js +109 -27
  67. package/lib/esm/validation/index.js +5 -5
  68. package/lib/esm/validation/validation.js +10 -2
  69. package/lib/esm/validation/validators/ReadOnlyValidator.d.ts +32 -8
  70. package/lib/esm/validation/validators/ReadOnlyValidator.js +34 -10
  71. package/lib/esm/validation/validators/TimestampValidator.d.ts +37 -3
  72. package/lib/esm/validation/validators/TimestampValidator.js +39 -5
  73. package/lib/esm/validation/validators/UpdateValidator.d.ts +28 -11
  74. package/lib/esm/validation/validators/UpdateValidator.js +23 -8
  75. package/lib/esm/validation/validators/index.js +4 -4
  76. package/lib/identity/decorators.cjs +8 -1
  77. package/lib/identity/decorators.d.ts +7 -0
  78. package/lib/identity/utils.cjs +35 -22
  79. package/lib/identity/utils.d.ts +36 -23
  80. package/lib/index.cjs +14 -28
  81. package/lib/index.d.ts +12 -27
  82. package/lib/interfaces/BulkCrudOperator.cjs +1 -1
  83. package/lib/interfaces/BulkCrudOperator.d.ts +39 -0
  84. package/lib/interfaces/Contextual.cjs +1 -1
  85. package/lib/interfaces/Contextual.d.ts +17 -0
  86. package/lib/interfaces/CrudOperator.cjs +1 -1
  87. package/lib/interfaces/CrudOperator.d.ts +26 -23
  88. package/lib/interfaces/IRepository.cjs +1 -1
  89. package/lib/interfaces/IRepository.d.ts +10 -2
  90. package/lib/model/constants.cjs +12 -14
  91. package/lib/model/constants.d.ts +11 -13
  92. package/lib/model/decorators.cjs +114 -24
  93. package/lib/model/decorators.d.ts +112 -23
  94. package/lib/model/index.cjs +2 -1
  95. package/lib/model/index.d.ts +1 -0
  96. package/lib/model/model.cjs +1 -13
  97. package/lib/model/model.d.ts +2 -141
  98. package/lib/model/overrides.cjs +25 -0
  99. package/lib/model/overrides.d.ts +1 -0
  100. package/lib/model/utils.cjs +40 -1
  101. package/lib/model/utils.d.ts +39 -0
  102. package/lib/model/validation.cjs +27 -9
  103. package/lib/model/validation.d.ts +26 -8
  104. package/lib/operations/Operations.cjs +66 -4
  105. package/lib/operations/Operations.d.ts +65 -3
  106. package/lib/operations/OperationsRegistry.cjs +45 -17
  107. package/lib/operations/OperationsRegistry.d.ts +44 -16
  108. package/lib/operations/constants.cjs +16 -9
  109. package/lib/operations/constants.d.ts +27 -8
  110. package/lib/operations/decorators.cjs +150 -135
  111. package/lib/operations/decorators.d.ts +140 -134
  112. package/lib/operations/types.cjs +1 -1
  113. package/lib/operations/types.d.ts +10 -0
  114. package/lib/repository/BaseRepository.cjs +291 -1
  115. package/lib/repository/BaseRepository.d.ts +322 -0
  116. package/lib/repository/Context.cjs +153 -5
  117. package/lib/repository/Context.d.ts +153 -2
  118. package/lib/repository/Repository.cjs +90 -1
  119. package/lib/repository/Repository.d.ts +89 -0
  120. package/lib/repository/constants.cjs +8 -1
  121. package/lib/repository/constants.d.ts +7 -0
  122. package/lib/repository/errors.cjs +62 -35
  123. package/lib/repository/errors.d.ts +61 -34
  124. package/lib/repository/types.cjs +1 -1
  125. package/lib/repository/types.d.ts +25 -0
  126. package/lib/repository/utils.cjs +1 -1
  127. package/lib/repository/utils.d.ts +11 -0
  128. package/lib/repository/wrappers.cjs +3 -3
  129. package/lib/repository/wrappers.d.ts +2 -2
  130. package/lib/validation/constants.cjs +21 -6
  131. package/lib/validation/constants.d.ts +20 -5
  132. package/lib/validation/decorators.cjs +102 -20
  133. package/lib/validation/decorators.d.ts +101 -19
  134. package/lib/validation/validation.cjs +9 -1
  135. package/lib/validation/validators/ReadOnlyValidator.cjs +33 -9
  136. package/lib/validation/validators/ReadOnlyValidator.d.ts +32 -8
  137. package/lib/validation/validators/TimestampValidator.cjs +38 -4
  138. package/lib/validation/validators/TimestampValidator.d.ts +37 -3
  139. package/lib/validation/validators/UpdateValidator.cjs +23 -8
  140. package/lib/validation/validators/UpdateValidator.d.ts +28 -11
  141. package/package.json +2 -2
@@ -1,20 +1,19 @@
1
- import "./validation";
1
+ import "./validation.js";
2
2
  import { date, Decoration, propMetadata, required, type, Validation, } from "@decaf-ts/decorator-validation";
3
- import { DBKeys, DEFAULT_TIMESTAMP_FORMAT } from "../model/constants";
4
- import { DEFAULT_ERROR_MESSAGES } from "./constants";
5
- import { DBOperations, OperationKeys } from "../operations/constants";
6
- import { after, on, onCreateUpdate } from "../operations/decorators";
7
- import { SerializationError } from "../repository/errors";
3
+ import { DBKeys, DEFAULT_TIMESTAMP_FORMAT } from "./../model/constants.js";
4
+ import { DEFAULT_ERROR_MESSAGES } from "./constants.js";
5
+ import { DBOperations, OperationKeys } from "./../operations/constants.js";
6
+ import { after, on, onCreateUpdate } from "./../operations/decorators.js";
7
+ import { SerializationError } from "./../repository/errors.js";
8
8
  import { apply, metadata } from "@decaf-ts/reflection";
9
- import { Repository } from "../repository";
9
+ import { Repository } from "./../repository/index.js";
10
10
  /**
11
- * Marks the property as readonly.
12
- *
13
- * @param {string} [message] the error message. Defaults to {@link DEFAULT_ERROR_MESSAGES.READONLY.INVALID}
14
- *
15
- * @decorator readonly
16
- *
17
- * @category Decorators
11
+ * @description Prevents a property from being modified after initial creation.
12
+ * @summary Marks the property as readonly, causing validation errors if attempts are made to modify it during updates.
13
+ * @param {string} [message] - The error message to display when validation fails. Defaults to {@link DEFAULT_ERROR_MESSAGES.READONLY.INVALID}
14
+ * @return {PropertyDecorator} A decorator function that can be applied to class properties
15
+ * @function readonly
16
+ * @category Property Decorators
18
17
  */
19
18
  export function readonly(message = DEFAULT_ERROR_MESSAGES.READONLY.INVALID) {
20
19
  const key = Validation.updateKey(DBKeys.READONLY);
@@ -24,13 +23,28 @@ export function readonly(message = DEFAULT_ERROR_MESSAGES.READONLY.INVALID) {
24
23
  }))
25
24
  .apply();
26
25
  }
26
+ /**
27
+ * @description Handler function that sets a timestamp property to the current timestamp.
28
+ * @summary Updates a model property with the current timestamp from the repository context.
29
+ * @template M - The model type extending Model
30
+ * @template R - The repository type extending IRepository
31
+ * @template V - The data type for the operation
32
+ * @template F - The repository flags type
33
+ * @template C - The context type
34
+ * @param {C} context - The repository context containing the current timestamp
35
+ * @param {V} data - The data being processed
36
+ * @param key - The property key to update
37
+ * @param {M} model - The model instance being updated
38
+ * @return {Promise<void>} A promise that resolves when the timestamp has been set
39
+ * @function timestampHandler
40
+ * @memberOf module:db-decorators
41
+ */
27
42
  export async function timestampHandler(context, data, key, model) {
28
43
  model[key] = context.timestamp;
29
44
  }
30
45
  /**
31
- * Marks the property as timestamp.
32
- * Makes it {@link required}
33
- * Makes it a {@link date}
46
+ * @description Automatically manages timestamp properties for tracking creation and update times.
47
+ * @summary Marks the property as a timestamp, making it required and ensuring it's a valid date. The property will be automatically updated with the current timestamp during specified operations.
34
48
  *
35
49
  * Date Format:
36
50
  *
@@ -50,13 +64,30 @@ export async function timestampHandler(context, data, key, model) {
50
64
  * S = miliseconds
51
65
  * </pre>
52
66
  *
53
- * @param {string[]} operation The {@link DBOperations} to act on. Defaults to {@link DBOperations.CREATE_UPDATE}
54
- * @param {string} [format] The TimeStamp format. defaults to {@link DEFAULT_TIMESTAMP_FORMAT}
55
- * @param {{new: UpdateValidator}} [validator] defaults to {@link TimestampValidator}
67
+ * @param {OperationKeys[]} operation - The operations to act on. Defaults to {@link DBOperations.CREATE_UPDATE}
68
+ * @param {string} [format] - The timestamp format. Defaults to {@link DEFAULT_TIMESTAMP_FORMAT}
69
+ * @return {PropertyDecorator} A decorator function that can be applied to class properties
70
+ * @function timestamp
71
+ * @category Property Decorators
72
+ * @mermaid
73
+ * sequenceDiagram
74
+ * participant C as Client
75
+ * participant M as Model
76
+ * participant T as TimestampDecorator
77
+ * participant V as Validator
78
+ *
79
+ * C->>M: Create/Update model
80
+ * M->>T: Process timestamp property
81
+ * T->>M: Apply required validation
82
+ * T->>M: Apply date format validation
56
83
  *
57
- * @decorator timestamp
84
+ * alt Update operation
85
+ * T->>V: Register timestamp validator
86
+ * V->>M: Validate timestamp is newer
87
+ * end
58
88
  *
59
- * @category Decorators
89
+ * T->>M: Set current timestamp
90
+ * M->>C: Return updated model
60
91
  */
61
92
  export function timestamp(operation = DBOperations.CREATE_UPDATE, format = DEFAULT_TIMESTAMP_FORMAT) {
62
93
  const key = Validation.updateKey(DBKeys.TIMESTAMP);
@@ -73,6 +104,22 @@ export function timestamp(operation = DBOperations.CREATE_UPDATE, format = DEFAU
73
104
  .define(...decorators)
74
105
  .apply();
75
106
  }
107
+ /**
108
+ * @description Handler function that serializes a property to JSON string during create and update operations.
109
+ * @summary Converts a complex object property to a JSON string before storing it in the database.
110
+ * @template M - The model type extending Model
111
+ * @template R - The repository type extending IRepository
112
+ * @template V - The data type for the operation
113
+ * @template F - The repository flags type
114
+ * @template C - The context type
115
+ * @param {C} context - The repository context
116
+ * @param {V} data - The data being processed
117
+ * @param key - The property key to serialize
118
+ * @param {M} model - The model instance being processed
119
+ * @return {Promise<void>} A promise that resolves when the property has been serialized
120
+ * @function serializeOnCreateUpdate
121
+ * @memberOf module:db-decorators
122
+ */
76
123
  export async function serializeOnCreateUpdate(context, data, key, model) {
77
124
  if (!model[key])
78
125
  return;
@@ -84,6 +131,22 @@ export async function serializeOnCreateUpdate(context, data, key, model) {
84
131
  throw new SerializationError(`Failed to serialize ${key.toString()} property of model ${model.constructor.name}: e`);
85
132
  }
86
133
  }
134
+ /**
135
+ * @description Handler function that deserializes a property from JSON string after database operations.
136
+ * @summary Converts a JSON string property back to its original complex object form after retrieving it from the database.
137
+ * @template M - The model type extending Model
138
+ * @template R - The repository type extending IRepository
139
+ * @template V - The data type for the operation
140
+ * @template F - The repository flags type
141
+ * @template C - The context type
142
+ * @param {C} context - The repository context
143
+ * @param {V} data - The data being processed
144
+ * @param key - The property key to deserialize
145
+ * @param {M} model - The model instance being processed
146
+ * @return {Promise<void>} A promise that resolves when the property has been deserialized
147
+ * @function serializeAfterAll
148
+ * @memberOf module:db-decorators
149
+ */
87
150
  export async function serializeAfterAll(context, data, key, model) {
88
151
  if (!model[key])
89
152
  return;
@@ -97,14 +160,33 @@ export async function serializeAfterAll(context, data, key, model) {
97
160
  }
98
161
  }
99
162
  /**
100
- * @summary Serialize Decorator
101
- * @description properties decorated will the serialized before stored in the db
102
- *
163
+ * @description Enables automatic JSON serialization and deserialization for complex object properties.
164
+ * @summary Decorator that automatically converts complex objects to JSON strings before storing in the database and back to objects when retrieving them.
165
+ * @return {PropertyDecorator} A decorator function that can be applied to class properties
103
166
  * @function serialize
167
+ * @category Property Decorators
168
+ * @mermaid
169
+ * sequenceDiagram
170
+ * participant C as Client
171
+ * participant M as Model
172
+ * participant S as SerializeDecorator
173
+ * participant DB as Database
174
+ *
175
+ * Note over C,DB: Create/Update Flow
176
+ * C->>M: Set complex object property
177
+ * M->>S: Process property (create/update)
178
+ * S->>M: Convert to JSON string
179
+ * M->>DB: Store serialized data
104
180
  *
105
- * @memberOf module:wallet-db.Decorators
181
+ * Note over C,DB: Retrieval Flow
182
+ * C->>M: Request model
183
+ * M->>DB: Fetch data
184
+ * DB->>M: Return with serialized property
185
+ * M->>S: Process property (after all ops)
186
+ * S->>M: Parse JSON back to object
187
+ * M->>C: Return model with deserialized property
106
188
  */
107
189
  export function serialize() {
108
190
  return apply(onCreateUpdate(serializeOnCreateUpdate), after(DBOperations.ALL, serializeAfterAll), type([String.name, Object.name]), metadata(Repository.key(DBKeys.SERIALIZE), {}));
109
191
  }
110
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy92YWxpZGF0aW9uL2RlY29yYXRvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxjQUFjLENBQUM7QUFDdEIsT0FBTyxFQUNMLElBQUksRUFDSixVQUFVLEVBRVYsWUFBWSxFQUNaLFFBQVEsRUFDUixJQUFJLEVBQ0osVUFBVSxHQUNYLE1BQU0sZ0NBQWdDLENBQUM7QUFDeEMsT0FBTyxFQUFFLE1BQU0sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNyRCxPQUFPLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRXJFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzFELE9BQU8sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUkzQzs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSxRQUFRLENBQ3RCLFVBQWtCLHNCQUFzQixDQUFDLFFBQVEsQ0FBQyxPQUFPO0lBRXpELE1BQU0sR0FBRyxHQUFHLFVBQVUsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2xELE9BQU8sVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7U0FDdkIsTUFBTSxDQUNMLFlBQVksQ0FBQyxHQUFHLEVBQUU7UUFDaEIsT0FBTyxFQUFFLE9BQU87S0FDakIsQ0FBQyxDQUNIO1NBQ0EsS0FBSyxFQUFFLENBQUM7QUFDYixDQUFDO0FBRUQsTUFBTSxDQUFDLEtBQUss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Q2hDLFFBQVEsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FDL0MsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXCIuL3ZhbGlkYXRpb25cIjtcbmltcG9ydCB7XG4gIGRhdGUsXG4gIERlY29yYXRpb24sXG4gIE1vZGVsLFxuICBwcm9wTWV0YWRhdGEsXG4gIHJlcXVpcmVkLFxuICB0eXBlLFxuICBWYWxpZGF0aW9uLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBEQktleXMsIERFRkFVTFRfVElNRVNUQU1QX0ZPUk1BVCB9IGZyb20gXCIuLi9tb2RlbC9jb25zdGFudHNcIjtcbmltcG9ydCB7IERFRkFVTFRfRVJST1JfTUVTU0FHRVMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IERCT3BlcmF0aW9ucywgT3BlcmF0aW9uS2V5cyB9IGZyb20gXCIuLi9vcGVyYXRpb25zL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgYWZ0ZXIsIG9uLCBvbkNyZWF0ZVVwZGF0ZSB9IGZyb20gXCIuLi9vcGVyYXRpb25zL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IElSZXBvc2l0b3J5IH0gZnJvbSBcIi4uL2ludGVyZmFjZXMvSVJlcG9zaXRvcnlcIjtcbmltcG9ydCB7IFNlcmlhbGl6YXRpb25FcnJvciB9IGZyb20gXCIuLi9yZXBvc2l0b3J5L2Vycm9yc1wiO1xuaW1wb3J0IHsgYXBwbHksIG1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBSZXBvc2l0b3J5IH0gZnJvbSBcIi4uL3JlcG9zaXRvcnlcIjtcbmltcG9ydCB7IENvbnRleHQgfSBmcm9tIFwiLi4vcmVwb3NpdG9yeS9Db250ZXh0XCI7XG5pbXBvcnQgeyBSZXBvc2l0b3J5RmxhZ3MgfSBmcm9tIFwiLi4vcmVwb3NpdG9yeS90eXBlc1wiO1xuXG4vKipcbiAqIE1hcmtzIHRoZSBwcm9wZXJ0eSBhcyByZWFkb25seS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIHRoZSBlcnJvciBtZXNzYWdlLiBEZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5SRUFET05MWS5JTlZBTElEfVxuICpcbiAqIEBkZWNvcmF0b3IgcmVhZG9ubHlcbiAqXG4gKiBAY2F0ZWdvcnkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZG9ubHkoXG4gIG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuUkVBRE9OTFkuSU5WQUxJRFxuKSB7XG4gIGNvbnN0IGtleSA9IFZhbGlkYXRpb24udXBkYXRlS2V5KERCS2V5cy5SRUFET05MWSk7XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZShcbiAgICAgIHByb3BNZXRhZGF0YShrZXksIHtcbiAgICAgICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICAgIH0pXG4gICAgKVxuICAgIC5hcHBseSgpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGltZXN0YW1wSGFuZGxlcjxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgSVJlcG9zaXRvcnk8TSwgRiwgQz4sXG4gIFYsXG4gIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MgPSBSZXBvc2l0b3J5RmxhZ3MsXG4gIEMgZXh0ZW5kcyBDb250ZXh0PEY+ID0gQ29udGV4dDxGPixcbj4odGhpczogUiwgY29udGV4dDogQywgZGF0YTogViwga2V5OiBrZXlvZiBNLCBtb2RlbDogTSk6IFByb21pc2U8dm9pZD4ge1xuICAobW9kZWwgYXMgYW55KVtrZXldID0gY29udGV4dC50aW1lc3RhbXA7XG59XG5cbi8qKlxuICogTWFya3MgdGhlIHByb3BlcnR5IGFzIHRpbWVzdGFtcC5cbiAqIE1ha2VzIGl0IHtAbGluayByZXF1aXJlZH1cbiAqIE1ha2VzIGl0IGEge0BsaW5rIGRhdGV9XG4gKlxuICogRGF0ZSBGb3JtYXQ6XG4gKlxuICogPHByZT5cbiAqICAgICAgVXNpbmcgc2ltaWxhciBmb3JtYXR0aW5nIGFzIE1vbWVudC5qcywgQ2xhc3MgRGF0ZVRpbWVGb3JtYXR0ZXIgKEphdmEpLCBhbmQgQ2xhc3MgU2ltcGxlRGF0ZUZvcm1hdCAoSmF2YSksXG4gKiAgICAgIEkgaW1wbGVtZW50ZWQgYSBjb21wcmVoZW5zaXZlIHNvbHV0aW9uIGZvcm1hdERhdGUoZGF0ZSwgcGF0dGVyblN0cikgd2hlcmUgdGhlIGNvZGUgaXMgZWFzeSB0byByZWFkIGFuZCBtb2RpZnkuXG4gKiAgICAgIFlvdSBjYW4gZGlzcGxheSBkYXRlLCB0aW1lLCBBTS9QTSwgZXRjLlxuICpcbiAqICAgICAgRGF0ZSBhbmQgVGltZSBQYXR0ZXJuc1xuICogICAgICB5eSA9IDItZGlnaXQgeWVhcjsgeXl5eSA9IGZ1bGwgeWVhclxuICogICAgICBNID0gZGlnaXQgbW9udGg7IE1NID0gMi1kaWdpdCBtb250aDsgTU1NID0gc2hvcnQgbW9udGggbmFtZTsgTU1NTSA9IGZ1bGwgbW9udGggbmFtZVxuICogICAgICBFRUVFID0gZnVsbCB3ZWVrZGF5IG5hbWU7IEVFRSA9IHNob3J0IHdlZWtkYXkgbmFtZVxuICogICAgICBkID0gZGlnaXQgZGF5OyBkZCA9IDItZGlnaXQgZGF5XG4gKiAgICAgIGggPSBob3VycyBhbS9wbTsgaGggPSAyLWRpZ2l0IGhvdXJzIGFtL3BtOyBIID0gaG91cnM7IEhIID0gMi1kaWdpdCBob3Vyc1xuICogICAgICBtID0gbWludXRlczsgbW0gPSAyLWRpZ2l0IG1pbnV0ZXM7IGFhYSA9IEFNL1BNXG4gKiAgICAgIHMgPSBzZWNvbmRzOyBzcyA9IDItZGlnaXQgc2Vjb25kc1xuICogICAgICBTID0gbWlsaXNlY29uZHNcbiAqIDwvcHJlPlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nW119IG9wZXJhdGlvbiBUaGUge0BsaW5rIERCT3BlcmF0aW9uc30gdG8gYWN0IG9uLiBEZWZhdWx0cyB0byB7QGxpbmsgREJPcGVyYXRpb25zLkNSRUFURV9VUERBVEV9XG4gKiBAcGFyYW0ge3N0cmluZ30gW2Zvcm1hdF0gVGhlIFRpbWVTdGFtcCBmb3JtYXQuIGRlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX1RJTUVTVEFNUF9GT1JNQVR9XG4gKiBAcGFyYW0ge3tuZXc6IFVwZGF0ZVZhbGlkYXRvcn19IFt2YWxpZGF0b3JdIGRlZmF1bHRzIHRvIHtAbGluayBUaW1lc3RhbXBWYWxpZGF0b3J9XG4gKlxuICogQGRlY29yYXRvciB0aW1lc3RhbXBcbiAqXG4gKiBAY2F0ZWdvcnkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdGltZXN0YW1wKFxuICBvcGVyYXRpb246IE9wZXJhdGlvbktleXNbXSA9IERCT3BlcmF0aW9ucy5DUkVBVEVfVVBEQVRFIGFzIHVua25vd24gYXMgT3BlcmF0aW9uS2V5c1tdLFxuICBmb3JtYXQ6IHN0cmluZyA9IERFRkFVTFRfVElNRVNUQU1QX0ZPUk1BVFxuKSB7XG4gIGNvbnN0IGtleSA9IFZhbGlkYXRpb24udXBkYXRlS2V5KERCS2V5cy5USU1FU1RBTVApO1xuXG4gIGNvbnN0IGRlY29yYXRvcnM6IGFueVtdID0gW1xuICAgIGRhdGUoZm9ybWF0LCBERUZBVUxUX0VSUk9SX01FU1NBR0VTLlRJTUVTVEFNUC5EQVRFKSxcbiAgICByZXF1aXJlZChERUZBVUxUX0VSUk9SX01FU1NBR0VTLlRJTUVTVEFNUC5SRVFVSVJFRCksXG4gICAgb24ob3BlcmF0aW9uLCB0aW1lc3RhbXBIYW5kbGVyKSxcbiAgXTtcblxuICBpZiAob3BlcmF0aW9uLmluZGV4T2YoT3BlcmF0aW9uS2V5cy5VUERBVEUpICE9PSAtMSlcbiAgICBkZWNvcmF0b3JzLnB1c2goXG4gICAgICBwcm9wTWV0YWRhdGEoVmFsaWRhdGlvbi51cGRhdGVLZXkoREJLZXlzLlRJTUVTVEFNUCksIHtcbiAgICAgICAgbWVzc2FnZTogREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5USU1FU1RBTVAuSU5WQUxJRCxcbiAgICAgIH0pXG4gICAgKTtcbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKC4uLmRlY29yYXRvcnMpXG4gICAgLmFwcGx5KCk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXJpYWxpemVPbkNyZWF0ZVVwZGF0ZTxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgSVJlcG9zaXRvcnk8TSwgRiwgQz4sXG4gIFYsXG4gIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MgPSBSZXBvc2l0b3J5RmxhZ3MsXG4gIEMgZXh0ZW5kcyBDb250ZXh0PEY+ID0gQ29udGV4dDxGPixcbj4odGhpczogUiwgY29udGV4dDogQywgZGF0YTogViwga2V5OiBrZXlvZiBNLCBtb2RlbDogTSk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIW1vZGVsW2tleV0pIHJldHVybjtcbiAgdHJ5IHtcbiAgICBtb2RlbFtrZXldID0gSlNPTi5zdHJpbmdpZnkobW9kZWxba2V5XSkgYXMgTVtrZXlvZiBNXTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKFxuICAgICAgYEZhaWxlZCB0byBzZXJpYWxpemUgJHtrZXkudG9TdHJpbmcoKX0gcHJvcGVydHkgb2YgbW9kZWwgJHttb2RlbC5jb25zdHJ1Y3Rvci5uYW1lfTogZWBcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXJpYWxpemVBZnRlckFsbDxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgSVJlcG9zaXRvcnk8TSwgRiwgQz4sXG4gIFYsXG4gIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MgPSBSZXBvc2l0b3J5RmxhZ3MsXG4gIEMgZXh0ZW5kcyBDb250ZXh0PEY+ID0gQ29udGV4dDxGPixcbj4odGhpczogUiwgY29udGV4dDogQywgZGF0YTogViwga2V5OiBrZXlvZiBNLCBtb2RlbDogTSk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIW1vZGVsW2tleV0pIHJldHVybjtcbiAgaWYgKHR5cGVvZiBtb2RlbFtrZXldICE9PSBcInN0cmluZ1wiKSByZXR1cm47XG5cbiAgdHJ5IHtcbiAgICBtb2RlbFtrZXldID0gSlNPTi5wYXJzZShtb2RlbFtrZXldKTtcbiAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoXG4gICAgICBgRmFpbGVkIHRvIGRlc2VyaWFsaXplICR7a2V5LnRvU3RyaW5nKCl9IHByb3BlcnR5IG9mIG1vZGVsICR7bW9kZWwuY29uc3RydWN0b3IubmFtZX06ICR7ZX1gXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIEBzdW1tYXJ5IFNlcmlhbGl6ZSBEZWNvcmF0b3JcbiAqIEBkZXNjcmlwdGlvbiBwcm9wZXJ0aWVzIGRlY29yYXRlZCB3aWxsIHRoZSBzZXJpYWxpemVkIGJlZm9yZSBzdG9yZWQgaW4gdGhlIGRiXG4gKlxuICogQGZ1bmN0aW9uIHNlcmlhbGl6ZVxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6d2FsbGV0LWRiLkRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZSgpIHtcbiAgcmV0dXJuIGFwcGx5KFxuICAgIG9uQ3JlYXRlVXBkYXRlKHNlcmlhbGl6ZU9uQ3JlYXRlVXBkYXRlKSxcbiAgICBhZnRlcihEQk9wZXJhdGlvbnMuQUxMLCBzZXJpYWxpemVBZnRlckFsbCksXG4gICAgdHlwZShbU3RyaW5nLm5hbWUsIE9iamVjdC5uYW1lXSksXG4gICAgbWV0YWRhdGEoUmVwb3NpdG9yeS5rZXkoREJLZXlzLlNFUklBTElaRSksIHt9KVxuICApO1xufVxuIl19
192
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy92YWxpZGF0aW9uL2RlY29yYXRvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEseUJBQXNCO0FBQ3RCLE9BQU8sRUFDTCxJQUFJLEVBQ0osVUFBVSxFQUVWLFlBQVksRUFDWixRQUFRLEVBQ1IsSUFBSSxFQUNKLFVBQVUsR0FDWCxNQUFNLGdDQUFnQyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxNQUFNLEVBQUUsd0JBQXdCLEVBQUUsZ0NBQTJCO0FBQ3RFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSx1QkFBb0I7QUFDckQsT0FBTyxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUscUNBQWdDO0FBQ3RFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLGNBQWMsRUFBRSxzQ0FBaUM7QUFFckUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGtDQUE2QjtBQUMxRCxPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxVQUFVLEVBQUUsaUNBQXNCO0FBSTNDOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsUUFBUSxDQUN0QixVQUFrQixzQkFBc0IsQ0FBQyxRQUFRLENBQUMsT0FBTztJQUV6RCxNQUFNLEdBQUcsR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNsRCxPQUFPLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO1NBQ3ZCLE1BQU0sQ0FDTCxZQUFZLENBQUMsR0FBRyxFQUFFO1FBQ2hCLE9BQU8sRUFBRSxPQUFPO0tBQ2pCLENBQUMsQ0FDSDtTQUNBLEtBQUssRUFBRSxDQUFDO0FBQ2IsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsZ0JBQWdCLENBTTNCLE9BQVUsRUFBRSxJQUFPLEVBQUUsR0FB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LENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUNoQyxRQUFRLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQy9DLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFwiLi92YWxpZGF0aW9uXCI7XG5pbXBvcnQge1xuICBkYXRlLFxuICBEZWNvcmF0aW9uLFxuICBNb2RlbCxcbiAgcHJvcE1ldGFkYXRhLFxuICByZXF1aXJlZCxcbiAgdHlwZSxcbiAgVmFsaWRhdGlvbixcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgREJLZXlzLCBERUZBVUxUX1RJTUVTVEFNUF9GT1JNQVQgfSBmcm9tIFwiLi4vbW9kZWwvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBERUZBVUxUX0VSUk9SX01FU1NBR0VTIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBEQk9wZXJhdGlvbnMsIE9wZXJhdGlvbktleXMgfSBmcm9tIFwiLi4vb3BlcmF0aW9ucy9jb25zdGFudHNcIjtcbmltcG9ydCB7IGFmdGVyLCBvbiwgb25DcmVhdGVVcGRhdGUgfSBmcm9tIFwiLi4vb3BlcmF0aW9ucy9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBJUmVwb3NpdG9yeSB9IGZyb20gXCIuLi9pbnRlcmZhY2VzL0lSZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBTZXJpYWxpemF0aW9uRXJyb3IgfSBmcm9tIFwiLi4vcmVwb3NpdG9yeS9lcnJvcnNcIjtcbmltcG9ydCB7IGFwcGx5LCBtZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvcmVmbGVjdGlvblwiO1xuaW1wb3J0IHsgUmVwb3NpdG9yeSB9IGZyb20gXCIuLi9yZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBDb250ZXh0IH0gZnJvbSBcIi4uL3JlcG9zaXRvcnkvQ29udGV4dFwiO1xuaW1wb3J0IHsgUmVwb3NpdG9yeUZsYWdzIH0gZnJvbSBcIi4uL3JlcG9zaXRvcnkvdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUHJldmVudHMgYSBwcm9wZXJ0eSBmcm9tIGJlaW5nIG1vZGlmaWVkIGFmdGVyIGluaXRpYWwgY3JlYXRpb24uXG4gKiBAc3VtbWFyeSBNYXJrcyB0aGUgcHJvcGVydHkgYXMgcmVhZG9ubHksIGNhdXNpbmcgdmFsaWRhdGlvbiBlcnJvcnMgaWYgYXR0ZW1wdHMgYXJlIG1hZGUgdG8gbW9kaWZ5IGl0IGR1cmluZyB1cGRhdGVzLlxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSAtIFRoZSBlcnJvciBtZXNzYWdlIHRvIGRpc3BsYXkgd2hlbiB2YWxpZGF0aW9uIGZhaWxzLiBEZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5SRUFET05MWS5JTlZBTElEfVxuICogQHJldHVybiB7UHJvcGVydHlEZWNvcmF0b3J9IEEgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gY2xhc3MgcHJvcGVydGllc1xuICogQGZ1bmN0aW9uIHJlYWRvbmx5XG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZG9ubHkoXG4gIG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuUkVBRE9OTFkuSU5WQUxJRFxuKSB7XG4gIGNvbnN0IGtleSA9IFZhbGlkYXRpb24udXBkYXRlS2V5KERCS2V5cy5SRUFET05MWSk7XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZShcbiAgICAgIHByb3BNZXRhZGF0YShrZXksIHtcbiAgICAgICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICAgIH0pXG4gICAgKVxuICAgIC5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBIYW5kbGVyIGZ1bmN0aW9uIHRoYXQgc2V0cyBhIHRpbWVzdGFtcCBwcm9wZXJ0eSB0byB0aGUgY3VycmVudCB0aW1lc3RhbXAuXG4gKiBAc3VtbWFyeSBVcGRhdGVzIGEgbW9kZWwgcHJvcGVydHkgd2l0aCB0aGUgY3VycmVudCB0aW1lc3RhbXAgZnJvbSB0aGUgcmVwb3NpdG9yeSBjb250ZXh0LlxuICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHJlcG9zaXRvcnkgdHlwZSBleHRlbmRpbmcgSVJlcG9zaXRvcnlcbiAqIEB0ZW1wbGF0ZSBWIC0gVGhlIGRhdGEgdHlwZSBmb3IgdGhlIG9wZXJhdGlvblxuICogQHRlbXBsYXRlIEYgLSBUaGUgcmVwb3NpdG9yeSBmbGFncyB0eXBlXG4gKiBAdGVtcGxhdGUgQyAtIFRoZSBjb250ZXh0IHR5cGVcbiAqIEBwYXJhbSB7Q30gY29udGV4dCAtIFRoZSByZXBvc2l0b3J5IGNvbnRleHQgY29udGFpbmluZyB0aGUgY3VycmVudCB0aW1lc3RhbXBcbiAqIEBwYXJhbSB7Vn0gZGF0YSAtIFRoZSBkYXRhIGJlaW5nIHByb2Nlc3NlZFxuICogQHBhcmFtIGtleSAtIFRoZSBwcm9wZXJ0eSBrZXkgdG8gdXBkYXRlXG4gKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIGJlaW5nIHVwZGF0ZWRcbiAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHRpbWVzdGFtcCBoYXMgYmVlbiBzZXRcbiAqIEBmdW5jdGlvbiB0aW1lc3RhbXBIYW5kbGVyXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRiLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRpbWVzdGFtcEhhbmRsZXI8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIElSZXBvc2l0b3J5PE0sIEYsIEM+LFxuICBWLFxuICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzID0gUmVwb3NpdG9yeUZsYWdzLFxuICBDIGV4dGVuZHMgQ29udGV4dDxGPiA9IENvbnRleHQ8Rj4sXG4+KHRoaXM6IFIsIGNvbnRleHQ6IEMsIGRhdGE6IFYsIGtleToga2V5b2YgTSwgbW9kZWw6IE0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgKG1vZGVsIGFzIGFueSlba2V5XSA9IGNvbnRleHQudGltZXN0YW1wO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBdXRvbWF0aWNhbGx5IG1hbmFnZXMgdGltZXN0YW1wIHByb3BlcnRpZXMgZm9yIHRyYWNraW5nIGNyZWF0aW9uIGFuZCB1cGRhdGUgdGltZXMuXG4gKiBAc3VtbWFyeSBNYXJrcyB0aGUgcHJvcGVydHkgYXMgYSB0aW1lc3RhbXAsIG1ha2luZyBpdCByZXF1aXJlZCBhbmQgZW5zdXJpbmcgaXQncyBhIHZhbGlkIGRhdGUuIFRoZSBwcm9wZXJ0eSB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgdXBkYXRlZCB3aXRoIHRoZSBjdXJyZW50IHRpbWVzdGFtcCBkdXJpbmcgc3BlY2lmaWVkIG9wZXJhdGlvbnMuXG4gKlxuICogRGF0ZSBGb3JtYXQ6XG4gKlxuICogPHByZT5cbiAqICAgICAgVXNpbmcgc2ltaWxhciBmb3JtYXR0aW5nIGFzIE1vbWVudC5qcywgQ2xhc3MgRGF0ZVRpbWVGb3JtYXR0ZXIgKEphdmEpLCBhbmQgQ2xhc3MgU2ltcGxlRGF0ZUZvcm1hdCAoSmF2YSksXG4gKiAgICAgIEkgaW1wbGVtZW50ZWQgYSBjb21wcmVoZW5zaXZlIHNvbHV0aW9uIGZvcm1hdERhdGUoZGF0ZSwgcGF0dGVyblN0cikgd2hlcmUgdGhlIGNvZGUgaXMgZWFzeSB0byByZWFkIGFuZCBtb2RpZnkuXG4gKiAgICAgIFlvdSBjYW4gZGlzcGxheSBkYXRlLCB0aW1lLCBBTS9QTSwgZXRjLlxuICpcbiAqICAgICAgRGF0ZSBhbmQgVGltZSBQYXR0ZXJuc1xuICogICAgICB5eSA9IDItZGlnaXQgeWVhcjsgeXl5eSA9IGZ1bGwgeWVhclxuICogICAgICBNID0gZGlnaXQgbW9udGg7IE1NID0gMi1kaWdpdCBtb250aDsgTU1NID0gc2hvcnQgbW9udGggbmFtZTsgTU1NTSA9IGZ1bGwgbW9udGggbmFtZVxuICogICAgICBFRUVFID0gZnVsbCB3ZWVrZGF5IG5hbWU7IEVFRSA9IHNob3J0IHdlZWtkYXkgbmFtZVxuICogICAgICBkID0gZGlnaXQgZGF5OyBkZCA9IDItZGlnaXQgZGF5XG4gKiAgICAgIGggPSBob3VycyBhbS9wbTsgaGggPSAyLWRpZ2l0IGhvdXJzIGFtL3BtOyBIID0gaG91cnM7IEhIID0gMi1kaWdpdCBob3Vyc1xuICogICAgICBtID0gbWludXRlczsgbW0gPSAyLWRpZ2l0IG1pbnV0ZXM7IGFhYSA9IEFNL1BNXG4gKiAgICAgIHMgPSBzZWNvbmRzOyBzcyA9IDItZGlnaXQgc2Vjb25kc1xuICogICAgICBTID0gbWlsaXNlY29uZHNcbiAqIDwvcHJlPlxuICpcbiAqIEBwYXJhbSB7T3BlcmF0aW9uS2V5c1tdfSBvcGVyYXRpb24gLSBUaGUgb3BlcmF0aW9ucyB0byBhY3Qgb24uIERlZmF1bHRzIHRvIHtAbGluayBEQk9wZXJhdGlvbnMuQ1JFQVRFX1VQREFURX1cbiAqIEBwYXJhbSB7c3RyaW5nfSBbZm9ybWF0XSAtIFRoZSB0aW1lc3RhbXAgZm9ybWF0LiBEZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9USU1FU1RBTVBfRk9STUFUfVxuICogQHJldHVybiB7UHJvcGVydHlEZWNvcmF0b3J9IEEgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gY2xhc3MgcHJvcGVydGllc1xuICogQGZ1bmN0aW9uIHRpbWVzdGFtcFxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQyBhcyBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgTSBhcyBNb2RlbFxuICogICBwYXJ0aWNpcGFudCBUIGFzIFRpbWVzdGFtcERlY29yYXRvclxuICogICBwYXJ0aWNpcGFudCBWIGFzIFZhbGlkYXRvclxuICpcbiAqICAgQy0+Pk06IENyZWF0ZS9VcGRhdGUgbW9kZWxcbiAqICAgTS0+PlQ6IFByb2Nlc3MgdGltZXN0YW1wIHByb3BlcnR5XG4gKiAgIFQtPj5NOiBBcHBseSByZXF1aXJlZCB2YWxpZGF0aW9uXG4gKiAgIFQtPj5NOiBBcHBseSBkYXRlIGZvcm1hdCB2YWxpZGF0aW9uXG4gKlxuICogICBhbHQgVXBkYXRlIG9wZXJhdGlvblxuICogICAgIFQtPj5WOiBSZWdpc3RlciB0aW1lc3RhbXAgdmFsaWRhdG9yXG4gKiAgICAgVi0+Pk06IFZhbGlkYXRlIHRpbWVzdGFtcCBpcyBuZXdlclxuICogICBlbmRcbiAqXG4gKiAgIFQtPj5NOiBTZXQgY3VycmVudCB0aW1lc3RhbXBcbiAqICAgTS0+PkM6IFJldHVybiB1cGRhdGVkIG1vZGVsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0aW1lc3RhbXAoXG4gIG9wZXJhdGlvbjogT3BlcmF0aW9uS2V5c1tdID0gREJPcGVyYXRpb25zLkNSRUFURV9VUERBVEUgYXMgdW5rbm93biBhcyBPcGVyYXRpb25LZXlzW10sXG4gIGZvcm1hdDogc3RyaW5nID0gREVGQVVMVF9USU1FU1RBTVBfRk9STUFUXG4pIHtcbiAgY29uc3Qga2V5ID0gVmFsaWRhdGlvbi51cGRhdGVLZXkoREJLZXlzLlRJTUVTVEFNUCk7XG5cbiAgY29uc3QgZGVjb3JhdG9yczogYW55W10gPSBbXG4gICAgZGF0ZShmb3JtYXQsIERFRkFVTFRfRVJST1JfTUVTU0FHRVMuVElNRVNUQU1QLkRBVEUpLFxuICAgIHJlcXVpcmVkKERFRkFVTFRfRVJST1JfTUVTU0FHRVMuVElNRVNUQU1QLlJFUVVJUkVEKSxcbiAgICBvbihvcGVyYXRpb24sIHRpbWVzdGFtcEhhbmRsZXIpLFxuICBdO1xuXG4gIGlmIChvcGVyYXRpb24uaW5kZXhPZihPcGVyYXRpb25LZXlzLlVQREFURSkgIT09IC0xKVxuICAgIGRlY29yYXRvcnMucHVzaChcbiAgICAgIHByb3BNZXRhZGF0YShWYWxpZGF0aW9uLnVwZGF0ZUtleShEQktleXMuVElNRVNUQU1QKSwge1xuICAgICAgICBtZXNzYWdlOiBERUZBVUxUX0VSUk9SX01FU1NBR0VTLlRJTUVTVEFNUC5JTlZBTElELFxuICAgICAgfSlcbiAgICApO1xuICByZXR1cm4gRGVjb3JhdGlvbi5mb3Ioa2V5KVxuICAgIC5kZWZpbmUoLi4uZGVjb3JhdG9ycylcbiAgICAuYXBwbHkoKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gSGFuZGxlciBmdW5jdGlvbiB0aGF0IHNlcmlhbGl6ZXMgYSBwcm9wZXJ0eSB0byBKU09OIHN0cmluZyBkdXJpbmcgY3JlYXRlIGFuZCB1cGRhdGUgb3BlcmF0aW9ucy5cbiAqIEBzdW1tYXJ5IENvbnZlcnRzIGEgY29tcGxleCBvYmplY3QgcHJvcGVydHkgdG8gYSBKU09OIHN0cmluZyBiZWZvcmUgc3RvcmluZyBpdCBpbiB0aGUgZGF0YWJhc2UuXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHRlbXBsYXRlIFIgLSBUaGUgcmVwb3NpdG9yeSB0eXBlIGV4dGVuZGluZyBJUmVwb3NpdG9yeVxuICogQHRlbXBsYXRlIFYgLSBUaGUgZGF0YSB0eXBlIGZvciB0aGUgb3BlcmF0aW9uXG4gKiBAdGVtcGxhdGUgRiAtIFRoZSByZXBvc2l0b3J5IGZsYWdzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBDIC0gVGhlIGNvbnRleHQgdHlwZVxuICogQHBhcmFtIHtDfSBjb250ZXh0IC0gVGhlIHJlcG9zaXRvcnkgY29udGV4dFxuICogQHBhcmFtIHtWfSBkYXRhIC0gVGhlIGRhdGEgYmVpbmcgcHJvY2Vzc2VkXG4gKiBAcGFyYW0ga2V5IC0gVGhlIHByb3BlcnR5IGtleSB0byBzZXJpYWxpemVcbiAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UgYmVpbmcgcHJvY2Vzc2VkXG4gKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBwcm9wZXJ0eSBoYXMgYmVlbiBzZXJpYWxpemVkXG4gKiBAZnVuY3Rpb24gc2VyaWFsaXplT25DcmVhdGVVcGRhdGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGItZGVjb3JhdG9yc1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VyaWFsaXplT25DcmVhdGVVcGRhdGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIElSZXBvc2l0b3J5PE0sIEYsIEM+LFxuICBWLFxuICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzID0gUmVwb3NpdG9yeUZsYWdzLFxuICBDIGV4dGVuZHMgQ29udGV4dDxGPiA9IENvbnRleHQ8Rj4sXG4+KHRoaXM6IFIsIGNvbnRleHQ6IEMsIGRhdGE6IFYsIGtleToga2V5b2YgTSwgbW9kZWw6IE0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFtb2RlbFtrZXldKSByZXR1cm47XG4gIHRyeSB7XG4gICAgbW9kZWxba2V5XSA9IEpTT04uc3RyaW5naWZ5KG1vZGVsW2tleV0pIGFzIE1ba2V5b2YgTV07XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihcbiAgICAgIGBGYWlsZWQgdG8gc2VyaWFsaXplICR7a2V5LnRvU3RyaW5nKCl9IHByb3BlcnR5IG9mIG1vZGVsICR7bW9kZWwuY29uc3RydWN0b3IubmFtZX06IGVgXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBIYW5kbGVyIGZ1bmN0aW9uIHRoYXQgZGVzZXJpYWxpemVzIGEgcHJvcGVydHkgZnJvbSBKU09OIHN0cmluZyBhZnRlciBkYXRhYmFzZSBvcGVyYXRpb25zLlxuICogQHN1bW1hcnkgQ29udmVydHMgYSBKU09OIHN0cmluZyBwcm9wZXJ0eSBiYWNrIHRvIGl0cyBvcmlnaW5hbCBjb21wbGV4IG9iamVjdCBmb3JtIGFmdGVyIHJldHJpZXZpbmcgaXQgZnJvbSB0aGUgZGF0YWJhc2UuXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHRlbXBsYXRlIFIgLSBUaGUgcmVwb3NpdG9yeSB0eXBlIGV4dGVuZGluZyBJUmVwb3NpdG9yeVxuICogQHRlbXBsYXRlIFYgLSBUaGUgZGF0YSB0eXBlIGZvciB0aGUgb3BlcmF0aW9uXG4gKiBAdGVtcGxhdGUgRiAtIFRoZSByZXBvc2l0b3J5IGZsYWdzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBDIC0gVGhlIGNvbnRleHQgdHlwZVxuICogQHBhcmFtIHtDfSBjb250ZXh0IC0gVGhlIHJlcG9zaXRvcnkgY29udGV4dFxuICogQHBhcmFtIHtWfSBkYXRhIC0gVGhlIGRhdGEgYmVpbmcgcHJvY2Vzc2VkXG4gKiBAcGFyYW0ga2V5IC0gVGhlIHByb3BlcnR5IGtleSB0byBkZXNlcmlhbGl6ZVxuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSBiZWluZyBwcm9jZXNzZWRcbiAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHByb3BlcnR5IGhhcyBiZWVuIGRlc2VyaWFsaXplZFxuICogQGZ1bmN0aW9uIHNlcmlhbGl6ZUFmdGVyQWxsXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRiLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlcmlhbGl6ZUFmdGVyQWxsPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBJUmVwb3NpdG9yeTxNLCBGLCBDPixcbiAgVixcbiAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyA9IFJlcG9zaXRvcnlGbGFncyxcbiAgQyBleHRlbmRzIENvbnRleHQ8Rj4gPSBDb250ZXh0PEY+LFxuPih0aGlzOiBSLCBjb250ZXh0OiBDLCBkYXRhOiBWLCBrZXk6IGtleW9mIE0sIG1vZGVsOiBNKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghbW9kZWxba2V5XSkgcmV0dXJuO1xuICBpZiAodHlwZW9mIG1vZGVsW2tleV0gIT09IFwic3RyaW5nXCIpIHJldHVybjtcblxuICB0cnkge1xuICAgIG1vZGVsW2tleV0gPSBKU09OLnBhcnNlKG1vZGVsW2tleV0pO1xuICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihcbiAgICAgIGBGYWlsZWQgdG8gZGVzZXJpYWxpemUgJHtrZXkudG9TdHJpbmcoKX0gcHJvcGVydHkgb2YgbW9kZWwgJHttb2RlbC5jb25zdHJ1Y3Rvci5uYW1lfTogJHtlfWBcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEVuYWJsZXMgYXV0b21hdGljIEpTT04gc2VyaWFsaXphdGlvbiBhbmQgZGVzZXJpYWxpemF0aW9uIGZvciBjb21wbGV4IG9iamVjdCBwcm9wZXJ0aWVzLlxuICogQHN1bW1hcnkgRGVjb3JhdG9yIHRoYXQgYXV0b21hdGljYWxseSBjb252ZXJ0cyBjb21wbGV4IG9iamVjdHMgdG8gSlNPTiBzdHJpbmdzIGJlZm9yZSBzdG9yaW5nIGluIHRoZSBkYXRhYmFzZSBhbmQgYmFjayB0byBvYmplY3RzIHdoZW4gcmV0cmlldmluZyB0aGVtLlxuICogQHJldHVybiB7UHJvcGVydHlEZWNvcmF0b3J9IEEgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gY2xhc3MgcHJvcGVydGllc1xuICogQGZ1bmN0aW9uIHNlcmlhbGl6ZVxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQyBhcyBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgTSBhcyBNb2RlbFxuICogICBwYXJ0aWNpcGFudCBTIGFzIFNlcmlhbGl6ZURlY29yYXRvclxuICogICBwYXJ0aWNpcGFudCBEQiBhcyBEYXRhYmFzZVxuICpcbiAqICAgTm90ZSBvdmVyIEMsREI6IENyZWF0ZS9VcGRhdGUgRmxvd1xuICogICBDLT4+TTogU2V0IGNvbXBsZXggb2JqZWN0IHByb3BlcnR5XG4gKiAgIE0tPj5TOiBQcm9jZXNzIHByb3BlcnR5IChjcmVhdGUvdXBkYXRlKVxuICogICBTLT4+TTogQ29udmVydCB0byBKU09OIHN0cmluZ1xuICogICBNLT4+REI6IFN0b3JlIHNlcmlhbGl6ZWQgZGF0YVxuICpcbiAqICAgTm90ZSBvdmVyIEMsREI6IFJldHJpZXZhbCBGbG93XG4gKiAgIEMtPj5NOiBSZXF1ZXN0IG1vZGVsXG4gKiAgIE0tPj5EQjogRmV0Y2ggZGF0YVxuICogICBEQi0+Pk06IFJldHVybiB3aXRoIHNlcmlhbGl6ZWQgcHJvcGVydHlcbiAqICAgTS0+PlM6IFByb2Nlc3MgcHJvcGVydHkgKGFmdGVyIGFsbCBvcHMpXG4gKiAgIFMtPj5NOiBQYXJzZSBKU09OIGJhY2sgdG8gb2JqZWN0XG4gKiAgIE0tPj5DOiBSZXR1cm4gbW9kZWwgd2l0aCBkZXNlcmlhbGl6ZWQgcHJvcGVydHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZSgpIHtcbiAgcmV0dXJuIGFwcGx5KFxuICAgIG9uQ3JlYXRlVXBkYXRlKHNlcmlhbGl6ZU9uQ3JlYXRlVXBkYXRlKSxcbiAgICBhZnRlcihEQk9wZXJhdGlvbnMuQUxMLCBzZXJpYWxpemVBZnRlckFsbCksXG4gICAgdHlwZShbU3RyaW5nLm5hbWUsIE9iamVjdC5uYW1lXSksXG4gICAgbWV0YWRhdGEoUmVwb3NpdG9yeS5rZXkoREJLZXlzLlNFUklBTElaRSksIHt9KVxuICApO1xufVxuIl19
@@ -1,5 +1,5 @@
1
- export * from "./validators";
2
- export * from "./constants";
3
- export * from "./decorators";
4
- export * from "./validation";
5
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdmFsaWRhdGlvbi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGNBQWMsQ0FBQztBQUM3QixjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLGNBQWMsQ0FBQztBQUM3QixjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gXCIuL3ZhbGlkYXRvcnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2NvbnN0YW50c1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vdmFsaWRhdGlvblwiO1xuIl19
1
+ export * from "./validators/index.js";
2
+ export * from "./constants.js";
3
+ export * from "./decorators.js";
4
+ export * from "./validation.js";
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdmFsaWRhdGlvbi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxzQ0FBNkI7QUFDN0IsK0JBQTRCO0FBQzVCLGdDQUE2QjtBQUM3QixnQ0FBNkIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tIFwiLi92YWxpZGF0b3JzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3ZhbGlkYXRpb25cIjtcbiJdfQ==
@@ -1,6 +1,14 @@
1
1
  import { Validation, } from "@decaf-ts/decorator-validation";
2
- import { UpdateValidationKeys } from "./constants";
2
+ import { UpdateValidationKeys } from "./constants.js";
3
+ /**
4
+ * @description Generates a key for update validation metadata.
5
+ * @summary Builds the key to store as metadata under Reflections for update validation by prefixing the provided key with the update validation prefix.
6
+ * @param {string} key - The base key to be prefixed
7
+ * @return {string} The complete metadata key for update validation
8
+ * @function updateKey
9
+ * @memberOf module:db-decorators
10
+ */
3
11
  Validation.updateKey = function (key) {
4
12
  return UpdateValidationKeys.REFLECT + key;
5
13
  };
6
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy92YWxpZGF0aW9uL3ZhbGlkYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFVBQVUsR0FHWCxNQUFNLGdDQUFnQyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUVuRCxVQUFVLENBQUMsU0FBUyxHQUFHLFVBQVUsR0FBVztJQUMxQyxPQUFPLG9CQUFvQixDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUM7QUFDNUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgVmFsaWRhdG9yLFxuICBWYWxpZGF0aW9uLFxuICBWYWxpZGF0b3JEZWZpbml0aW9uLFxuICBJVmFsaWRhdG9yUmVnaXN0cnksXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFVwZGF0ZVZhbGlkYXRpb25LZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cblZhbGlkYXRpb24udXBkYXRlS2V5ID0gZnVuY3Rpb24gKGtleTogc3RyaW5nKSB7XG4gIHJldHVybiBVcGRhdGVWYWxpZGF0aW9uS2V5cy5SRUZMRUNUICsga2V5O1xufTtcblxuZGVjbGFyZSBtb2R1bGUgXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIiB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcbiAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICBkZWNsYXJlIGNsYXNzIFZhbGlkYXRpb24ge1xuICAgIHByaXZhdGUgc3RhdGljIGFjdGluZ1ZhbGlkYXRvclJlZ2lzdHJ5PztcbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKCk7XG4gICAgLyoqXG4gICAgICogQHN1bW1hcnkgRGVmaW5lcyB0aGUgYWN0aW5nIFZhbGlkYXRvclJlZ2lzdHJ5XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0lWYWxpZGF0b3JSZWdpc3RyeX0gdmFsaWRhdG9yUmVnaXN0cnkgdGhlIG5ldyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgdmFsaWRhdG9yIFJlZ2lzdHJ5XG4gICAgICogQHBhcmFtIHtmdW5jdGlvbihWYWxpZGF0b3IpOiBWYWxpZGF0b3J9IFttaWdyYXRpb25IYW5kbGVyXSB0aGUgbWV0aG9kIHRvIG1hcCB0aGUgdmFsaWRhdG9yIGlmIHJlcXVpcmVkO1xuICAgICAqL1xuICAgIHN0YXRpYyBzZXRSZWdpc3RyeShcbiAgICAgIHZhbGlkYXRvclJlZ2lzdHJ5OiBJVmFsaWRhdG9yUmVnaXN0cnk8VmFsaWRhdG9yPixcbiAgICAgIG1pZ3JhdGlvbkhhbmRsZXI/OiAodmFsaWRhdG9yOiBWYWxpZGF0b3IpID0+IFZhbGlkYXRvclxuICAgICk6IHZvaWQ7XG4gICAgLyoqXG4gICAgICogQHN1bW1hcnkgUmV0dXJucyB0aGUgY3VycmVudCBWYWxpZGF0b3JSZWdpc3RyeVxuICAgICAqXG4gICAgICogQHJldHVybiBJVmFsaWRhdG9yUmVnaXN0cnksIGRlZmF1bHRzIHRvIHtAbGluayBWYWxpZGF0b3JSZWdpc3RyeX1cbiAgICAgKi9cbiAgICBwcml2YXRlIHN0YXRpYyBnZXRSZWdpc3RyeTtcbiAgICAvKipcbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgYSB2YWxpZGF0b3JcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB2YWxpZGF0b3JLZXkgb25lIG9mIHRoZSB7QGxpbmsgVmFsaWRhdGlvbktleXN9XG4gICAgICogQHJldHVybiB7VmFsaWRhdG9yIHwgdW5kZWZpbmVkfSB0aGUgcmVnaXN0ZXJlZCBWYWxpZGF0b3Igb3IgdW5kZWZpbmVkIGlmIHRoZXJlIGlzIG5vbm8gbWF0Y2hpbmcgdGhlIHByb3ZpZGVkIGtleVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQ8VCBleHRlbmRzIFZhbGlkYXRvcj4odmFsaWRhdG9yS2V5OiBzdHJpbmcpOiBUIHwgdW5kZWZpbmVkO1xuICAgIC8qKlxuICAgICAqIEBzdW1tYXJ5IFJlZ2lzdGVycyB0aGUgcHJvdmlkZWQgdmFsaWRhdG9ycyBvbnRvIHRoZSByZWdpc3RyeVxuICAgICAqXG4gICAgICogQHBhcmFtIHtUW10gfCBWYWxpZGF0b3JEZWZpbml0aW9uW119IHZhbGlkYXRvclxuICAgICAqL1xuICAgIHN0YXRpYyByZWdpc3RlcjxUIGV4dGVuZHMgVmFsaWRhdG9yPihcbiAgICAgIC4uLnZhbGlkYXRvcjogKFZhbGlkYXRvckRlZmluaXRpb24gfCBUKVtdXG4gICAgKTogdm9pZDtcbiAgICAvKipcbiAgICAgKiBAc3VtbWFyeSBCdWlsZHMgdGhlIGtleSB0byBzdG9yZSBhcyBNZXRhZGF0YSB1bmRlciBSZWZsZWN0aW9uc1xuICAgICAqIEBkZXNjcmlwdGlvbiBjb25jYXRlbmF0ZXMge0BsaW5rIFZhbGlkYXRpb25LZXlzI1JFRkxFQ1R9IHdpdGggdGhlIHByb3ZpZGVkIGtleVxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICAgICAqL1xuICAgIHN0YXRpYyBrZXkoa2V5OiBzdHJpbmcpOiBzdHJpbmc7XG5cbiAgICBzdGF0aWMgdXBkYXRlS2V5KGtleTogc3RyaW5nKTogc3RyaW5nO1xuICB9XG59XG4iXX0=
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy92YWxpZGF0aW9uL3ZhbGlkYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFVBQVUsR0FHWCxNQUFNLGdDQUFnQyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSx1QkFBb0I7QUFFbkQ7Ozs7Ozs7R0FPRztBQUNILFVBQVUsQ0FBQyxTQUFTLEdBQUcsVUFBVSxHQUFXO0lBQzFDLE9BQU8sb0JBQW9CLENBQUMsT0FBTyxHQUFHLEdBQUcsQ0FBQztBQUM1QyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBWYWxpZGF0b3IsXG4gIFZhbGlkYXRpb24sXG4gIFZhbGlkYXRvckRlZmluaXRpb24sXG4gIElWYWxpZGF0b3JSZWdpc3RyeSxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgVXBkYXRlVmFsaWRhdGlvbktleXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gR2VuZXJhdGVzIGEga2V5IGZvciB1cGRhdGUgdmFsaWRhdGlvbiBtZXRhZGF0YS5cbiAqIEBzdW1tYXJ5IEJ1aWxkcyB0aGUga2V5IHRvIHN0b3JlIGFzIG1ldGFkYXRhIHVuZGVyIFJlZmxlY3Rpb25zIGZvciB1cGRhdGUgdmFsaWRhdGlvbiBieSBwcmVmaXhpbmcgdGhlIHByb3ZpZGVkIGtleSB3aXRoIHRoZSB1cGRhdGUgdmFsaWRhdGlvbiBwcmVmaXguXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIGJhc2Uga2V5IHRvIGJlIHByZWZpeGVkXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBjb21wbGV0ZSBtZXRhZGF0YSBrZXkgZm9yIHVwZGF0ZSB2YWxpZGF0aW9uXG4gKiBAZnVuY3Rpb24gdXBkYXRlS2V5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRiLWRlY29yYXRvcnNcbiAqL1xuVmFsaWRhdGlvbi51cGRhdGVLZXkgPSBmdW5jdGlvbiAoa2V5OiBzdHJpbmcpIHtcbiAgcmV0dXJuIFVwZGF0ZVZhbGlkYXRpb25LZXlzLlJFRkxFQ1QgKyBrZXk7XG59O1xuXG5kZWNsYXJlIG1vZHVsZSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gIGRlY2xhcmUgY2xhc3MgVmFsaWRhdGlvbiB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgYWN0aW5nVmFsaWRhdG9yUmVnaXN0cnk/O1xuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKTtcbiAgICAvKipcbiAgICAgKiBAc3VtbWFyeSBEZWZpbmVzIHRoZSBhY3RpbmcgVmFsaWRhdG9yUmVnaXN0cnlcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7SVZhbGlkYXRvclJlZ2lzdHJ5fSB2YWxpZGF0b3JSZWdpc3RyeSB0aGUgbmV3IGltcGxlbWVudGF0aW9uIG9mIHRoZSB2YWxpZGF0b3IgUmVnaXN0cnlcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKFZhbGlkYXRvcik6IFZhbGlkYXRvcn0gW21pZ3JhdGlvbkhhbmRsZXJdIHRoZSBtZXRob2QgdG8gbWFwIHRoZSB2YWxpZGF0b3IgaWYgcmVxdWlyZWQ7XG4gICAgICovXG4gICAgc3RhdGljIHNldFJlZ2lzdHJ5KFxuICAgICAgdmFsaWRhdG9yUmVnaXN0cnk6IElWYWxpZGF0b3JSZWdpc3RyeTxWYWxpZGF0b3I+LFxuICAgICAgbWlncmF0aW9uSGFuZGxlcj86ICh2YWxpZGF0b3I6IFZhbGlkYXRvcikgPT4gVmFsaWRhdG9yXG4gICAgKTogdm9pZDtcbiAgICAvKipcbiAgICAgKiBAc3VtbWFyeSBSZXR1cm5zIHRoZSBjdXJyZW50IFZhbGlkYXRvclJlZ2lzdHJ5XG4gICAgICpcbiAgICAgKiBAcmV0dXJuIElWYWxpZGF0b3JSZWdpc3RyeSwgZGVmYXVsdHMgdG8ge0BsaW5rIFZhbGlkYXRvclJlZ2lzdHJ5fVxuICAgICAqL1xuICAgIHByaXZhdGUgc3RhdGljIGdldFJlZ2lzdHJ5O1xuICAgIC8qKlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlcyBhIHZhbGlkYXRvclxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHZhbGlkYXRvcktleSBvbmUgb2YgdGhlIHtAbGluayBWYWxpZGF0aW9uS2V5c31cbiAgICAgKiBAcmV0dXJuIHtWYWxpZGF0b3IgfCB1bmRlZmluZWR9IHRoZSByZWdpc3RlcmVkIFZhbGlkYXRvciBvciB1bmRlZmluZWQgaWYgdGhlcmUgaXMgbm9ubyBtYXRjaGluZyB0aGUgcHJvdmlkZWQga2V5XG4gICAgICovXG4gICAgc3RhdGljIGdldDxUIGV4dGVuZHMgVmFsaWRhdG9yPih2YWxpZGF0b3JLZXk6IHN0cmluZyk6IFQgfCB1bmRlZmluZWQ7XG4gICAgLyoqXG4gICAgICogQHN1bW1hcnkgUmVnaXN0ZXJzIHRoZSBwcm92aWRlZCB2YWxpZGF0b3JzIG9udG8gdGhlIHJlZ2lzdHJ5XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1RbXSB8IFZhbGlkYXRvckRlZmluaXRpb25bXX0gdmFsaWRhdG9yXG4gICAgICovXG4gICAgc3RhdGljIHJlZ2lzdGVyPFQgZXh0ZW5kcyBWYWxpZGF0b3I+KFxuICAgICAgLi4udmFsaWRhdG9yOiAoVmFsaWRhdG9yRGVmaW5pdGlvbiB8IFQpW11cbiAgICApOiB2b2lkO1xuICAgIC8qKlxuICAgICAqIEBzdW1tYXJ5IEJ1aWxkcyB0aGUga2V5IHRvIHN0b3JlIGFzIE1ldGFkYXRhIHVuZGVyIFJlZmxlY3Rpb25zXG4gICAgICogQGRlc2NyaXB0aW9uIGNvbmNhdGVuYXRlcyB7QGxpbmsgVmFsaWRhdGlvbktleXMjUkVGTEVDVH0gd2l0aCB0aGUgcHJvdmlkZWQga2V5XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gICAgICovXG4gICAgc3RhdGljIGtleShrZXk6IHN0cmluZyk6IHN0cmluZztcblxuICAgIHN0YXRpYyB1cGRhdGVLZXkoa2V5OiBzdHJpbmcpOiBzdHJpbmc7XG4gIH1cbn1cbiJdfQ==
@@ -1,23 +1,47 @@
1
1
  import { Validator } from "@decaf-ts/decorator-validation";
2
2
  /**
3
- * @summary Validator for the {@link readonly} decorator
4
- *
3
+ * @description A validator that ensures properties marked as readonly cannot be modified during updates.
4
+ * @summary Validator for the {@link readonly} decorator that checks if a value has been changed during an update operation. It compares the new value with the old value and returns an error message if they are not equal.
5
+ * @param {any} value - The value to be validated
6
+ * @param {any} oldValue - The previous value to compare against
7
+ * @param {string} [message] - Optional custom error message
5
8
  * @class ReadOnlyValidator
6
- * @extends Validator
9
+ * @example
10
+ * // Using ReadOnlyValidator with a readonly property
11
+ * class User {
12
+ * @readonly()
13
+ * id: string;
14
+ *
15
+ * name: string;
16
+ *
17
+ * constructor(id: string, name: string) {
18
+ * this.id = id;
19
+ * this.name = name;
20
+ * }
21
+ * }
7
22
  *
23
+ * // This will trigger validation error when trying to update
24
+ * const user = new User('123', 'John');
25
+ * user.id = '456'; // Will be prevented by ReadOnlyValidator
8
26
  * @category Validators
9
27
  */
10
28
  export declare class ReadOnlyValidator extends Validator {
11
29
  constructor();
12
30
  /**
13
- * @inheritDoc
31
+ * @description Implementation of the base validator's hasErrors method.
32
+ * @summary This method is required by the Validator interface but not used in this validator as validation only happens during updates.
33
+ * @param {any} value - The value to validate
34
+ * @param {any[]} args - Additional arguments
35
+ * @return {string | undefined} Always returns undefined as this validator only works during updates
14
36
  */
15
37
  hasErrors(value: any, ...args: any[]): string | undefined;
16
38
  /**
17
- * @summary Validates a value has not changed
18
- * @param {any} value
19
- * @param {any} oldValue
20
- * @param {string} [message] the error message override
39
+ * @description Checks if a value has been modified during an update operation.
40
+ * @summary Validates a value has not changed by comparing it with the previous value using deep equality.
41
+ * @param {any} value - The new value to validate
42
+ * @param {any} oldValue - The original value to compare against
43
+ * @param {string} [message] - Optional custom error message to override the default
44
+ * @return {string | undefined} An error message if validation fails, undefined otherwise
21
45
  */
22
46
  updateHasErrors(value: any, oldValue: any, message?: string): string | undefined;
23
47
  }
@@ -8,14 +8,32 @@ var __metadata = (this && this.__metadata) || function (k, v) {
8
8
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
9
  };
10
10
  import { validator, Validator } from "@decaf-ts/decorator-validation";
11
- import { DEFAULT_ERROR_MESSAGES, UpdateValidationKeys } from "../constants";
11
+ import { DEFAULT_ERROR_MESSAGES, UpdateValidationKeys } from "./../constants.js";
12
12
  import { isEqual } from "@decaf-ts/reflection";
13
13
  /**
14
- * @summary Validator for the {@link readonly} decorator
15
- *
14
+ * @description A validator that ensures properties marked as readonly cannot be modified during updates.
15
+ * @summary Validator for the {@link readonly} decorator that checks if a value has been changed during an update operation. It compares the new value with the old value and returns an error message if they are not equal.
16
+ * @param {any} value - The value to be validated
17
+ * @param {any} oldValue - The previous value to compare against
18
+ * @param {string} [message] - Optional custom error message
16
19
  * @class ReadOnlyValidator
17
- * @extends Validator
20
+ * @example
21
+ * // Using ReadOnlyValidator with a readonly property
22
+ * class User {
23
+ * @readonly()
24
+ * id: string;
25
+ *
26
+ * name: string;
27
+ *
28
+ * constructor(id: string, name: string) {
29
+ * this.id = id;
30
+ * this.name = name;
31
+ * }
32
+ * }
18
33
  *
34
+ * // This will trigger validation error when trying to update
35
+ * const user = new User('123', 'John');
36
+ * user.id = '456'; // Will be prevented by ReadOnlyValidator
19
37
  * @category Validators
20
38
  */
21
39
  let ReadOnlyValidator = class ReadOnlyValidator extends Validator {
@@ -23,17 +41,23 @@ let ReadOnlyValidator = class ReadOnlyValidator extends Validator {
23
41
  super(DEFAULT_ERROR_MESSAGES.READONLY.INVALID);
24
42
  }
25
43
  /**
26
- * @inheritDoc
44
+ * @description Implementation of the base validator's hasErrors method.
45
+ * @summary This method is required by the Validator interface but not used in this validator as validation only happens during updates.
46
+ * @param {any} value - The value to validate
47
+ * @param {any[]} args - Additional arguments
48
+ * @return {string | undefined} Always returns undefined as this validator only works during updates
27
49
  */
28
50
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
29
51
  hasErrors(value, ...args) {
30
52
  return undefined;
31
53
  }
32
54
  /**
33
- * @summary Validates a value has not changed
34
- * @param {any} value
35
- * @param {any} oldValue
36
- * @param {string} [message] the error message override
55
+ * @description Checks if a value has been modified during an update operation.
56
+ * @summary Validates a value has not changed by comparing it with the previous value using deep equality.
57
+ * @param {any} value - The new value to validate
58
+ * @param {any} oldValue - The original value to compare against
59
+ * @param {string} [message] - Optional custom error message to override the default
60
+ * @return {string | undefined} An error message if validation fails, undefined otherwise
37
61
  */
38
62
  updateHasErrors(value, oldValue, message) {
39
63
  if (value === undefined)
@@ -48,4 +72,4 @@ ReadOnlyValidator = __decorate([
48
72
  __metadata("design:paramtypes", [])
49
73
  ], ReadOnlyValidator);
50
74
  export { ReadOnlyValidator };
51
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVhZE9ubHlWYWxpZGF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdmFsaWRhdGlvbi92YWxpZGF0b3JzL1JlYWRPbmx5VmFsaWRhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDdEUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLG9CQUFvQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUUvQzs7Ozs7OztHQU9HO0FBRUksSUFBTSxpQkFBaUIsR0FBdkIsTUFBTSxpQkFBa0IsU0FBUSxTQUFTO0lBQzlDO1FBQ0UsS0FBSyxDQUFDLHNCQUFzQixDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQ7O09BRUc7SUFDSCw2REFBNkQ7SUFDN0QsU0FBUyxDQUFDLEtBQVUsRUFBRSxHQUFHLElBQVc7UUFDbEMsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksZUFBZSxDQUNwQixLQUFVLEVBQ1YsUUFBYSxFQUNiLE9BQWdCO1FBRWhCLElBQUksS0FBSyxLQUFLLFNBQVM7WUFBRSxPQUFPO1FBRWhDLE9BQU8sT0FBTyxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUM7WUFDN0IsQ0FBQyxDQUFDLFNBQVM7WUFDWCxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQy9DLENBQUM7Q0FDRixDQUFBO0FBOUJZLGlCQUFpQjtJQUQ3QixTQUFTLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDOztHQUM1QixpQkFBaUIsQ0E4QjdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdmFsaWRhdG9yLCBWYWxpZGF0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBERUZBVUxUX0VSUk9SX01FU1NBR0VTLCBVcGRhdGVWYWxpZGF0aW9uS2V5cyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IGlzRXF1YWwgfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBWYWxpZGF0b3IgZm9yIHRoZSB7QGxpbmsgcmVhZG9ubHl9IGRlY29yYXRvclxuICpcbiAqIEBjbGFzcyBSZWFkT25seVZhbGlkYXRvclxuICogQGV4dGVuZHMgVmFsaWRhdG9yXG4gKlxuICogQGNhdGVnb3J5IFZhbGlkYXRvcnNcbiAqL1xuQHZhbGlkYXRvcihVcGRhdGVWYWxpZGF0aW9uS2V5cy5SRUFET05MWSlcbmV4cG9ydCBjbGFzcyBSZWFkT25seVZhbGlkYXRvciBleHRlbmRzIFZhbGlkYXRvciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKERFRkFVTFRfRVJST1JfTUVTU0FHRVMuUkVBRE9OTFkuSU5WQUxJRCk7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgaGFzRXJyb3JzKHZhbHVlOiBhbnksIC4uLmFyZ3M6IGFueVtdKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFZhbGlkYXRlcyBhIHZhbHVlIGhhcyBub3QgY2hhbmdlZFxuICAgKiBAcGFyYW0ge2FueX0gdmFsdWVcbiAgICogQHBhcmFtIHthbnl9IG9sZFZhbHVlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gdGhlIGVycm9yIG1lc3NhZ2Ugb3ZlcnJpZGVcbiAgICovXG4gIHB1YmxpYyB1cGRhdGVIYXNFcnJvcnMoXG4gICAgdmFsdWU6IGFueSxcbiAgICBvbGRWYWx1ZTogYW55LFxuICAgIG1lc3NhZ2U/OiBzdHJpbmcsXG4gICk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybjtcblxuICAgIHJldHVybiBpc0VxdWFsKHZhbHVlLCBvbGRWYWx1ZSlcbiAgICAgID8gdW5kZWZpbmVkXG4gICAgICA6IHRoaXMuZ2V0TWVzc2FnZShtZXNzYWdlIHx8IHRoaXMubWVzc2FnZSk7XG4gIH1cbn1cbiJdfQ==
75
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVhZE9ubHlWYWxpZGF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdmFsaWRhdGlvbi92YWxpZGF0b3JzL1JlYWRPbmx5VmFsaWRhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDdEUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLG9CQUFvQixFQUFFLDBCQUFxQjtBQUM1RSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFL0M7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F5Qkc7QUFFSSxJQUFNLGlCQUFpQixHQUF2QixNQUFNLGlCQUFrQixTQUFRLFNBQVM7SUFDOUM7UUFDRSxLQUFLLENBQUMsc0JBQXNCLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCw2REFBNkQ7SUFDN0QsU0FBUyxDQUFDLEtBQVUsRUFBRSxHQUFHLElBQVc7UUFDbEMsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSSxlQUFlLENBQ3BCLEtBQVUsRUFDVixRQUFhLEVBQ2IsT0FBZ0I7UUFFaEIsSUFBSSxLQUFLLEtBQUssU0FBUztZQUFFLE9BQU87UUFFaEMsT0FBTyxPQUFPLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQztZQUM3QixDQUFDLENBQUMsU0FBUztZQUNYLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDL0MsQ0FBQztDQUNGLENBQUE7QUFwQ1ksaUJBQWlCO0lBRDdCLFNBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUM7O0dBQzVCLGlCQUFpQixDQW9DN0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB2YWxpZGF0b3IsIFZhbGlkYXRvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IERFRkFVTFRfRVJST1JfTUVTU0FHRVMsIFVwZGF0ZVZhbGlkYXRpb25LZXlzIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgaXNFcXVhbCB9IGZyb20gXCJAZGVjYWYtdHMvcmVmbGVjdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBIHZhbGlkYXRvciB0aGF0IGVuc3VyZXMgcHJvcGVydGllcyBtYXJrZWQgYXMgcmVhZG9ubHkgY2Fubm90IGJlIG1vZGlmaWVkIGR1cmluZyB1cGRhdGVzLlxuICogQHN1bW1hcnkgVmFsaWRhdG9yIGZvciB0aGUge0BsaW5rIHJlYWRvbmx5fSBkZWNvcmF0b3IgdGhhdCBjaGVja3MgaWYgYSB2YWx1ZSBoYXMgYmVlbiBjaGFuZ2VkIGR1cmluZyBhbiB1cGRhdGUgb3BlcmF0aW9uLiBJdCBjb21wYXJlcyB0aGUgbmV3IHZhbHVlIHdpdGggdGhlIG9sZCB2YWx1ZSBhbmQgcmV0dXJucyBhbiBlcnJvciBtZXNzYWdlIGlmIHRoZXkgYXJlIG5vdCBlcXVhbC5cbiAqIEBwYXJhbSB7YW55fSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBiZSB2YWxpZGF0ZWRcbiAqIEBwYXJhbSB7YW55fSBvbGRWYWx1ZSAtIFRoZSBwcmV2aW91cyB2YWx1ZSB0byBjb21wYXJlIGFnYWluc3RcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gLSBPcHRpb25hbCBjdXN0b20gZXJyb3IgbWVzc2FnZVxuICogQGNsYXNzIFJlYWRPbmx5VmFsaWRhdG9yXG4gKiBAZXhhbXBsZVxuICogLy8gVXNpbmcgUmVhZE9ubHlWYWxpZGF0b3Igd2l0aCBhIHJlYWRvbmx5IHByb3BlcnR5XG4gKiBjbGFzcyBVc2VyIHtcbiAqICAgQHJlYWRvbmx5KClcbiAqICAgaWQ6IHN0cmluZztcbiAqICAgXG4gKiAgIG5hbWU6IHN0cmluZztcbiAqICAgXG4gKiAgIGNvbnN0cnVjdG9yKGlkOiBzdHJpbmcsIG5hbWU6IHN0cmluZykge1xuICogICAgIHRoaXMuaWQgPSBpZDtcbiAqICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICogICB9XG4gKiB9XG4gKiBcbiAqIC8vIFRoaXMgd2lsbCB0cmlnZ2VyIHZhbGlkYXRpb24gZXJyb3Igd2hlbiB0cnlpbmcgdG8gdXBkYXRlXG4gKiBjb25zdCB1c2VyID0gbmV3IFVzZXIoJzEyMycsICdKb2huJyk7XG4gKiB1c2VyLmlkID0gJzQ1Nic7IC8vIFdpbGwgYmUgcHJldmVudGVkIGJ5IFJlYWRPbmx5VmFsaWRhdG9yXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdG9yc1xuICovXG5AdmFsaWRhdG9yKFVwZGF0ZVZhbGlkYXRpb25LZXlzLlJFQURPTkxZKVxuZXhwb3J0IGNsYXNzIFJlYWRPbmx5VmFsaWRhdG9yIGV4dGVuZHMgVmFsaWRhdG9yIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5SRUFET05MWS5JTlZBTElEKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW1wbGVtZW50YXRpb24gb2YgdGhlIGJhc2UgdmFsaWRhdG9yJ3MgaGFzRXJyb3JzIG1ldGhvZC5cbiAgICogQHN1bW1hcnkgVGhpcyBtZXRob2QgaXMgcmVxdWlyZWQgYnkgdGhlIFZhbGlkYXRvciBpbnRlcmZhY2UgYnV0IG5vdCB1c2VkIGluIHRoaXMgdmFsaWRhdG9yIGFzIHZhbGlkYXRpb24gb25seSBoYXBwZW5zIGR1cmluZyB1cGRhdGVzLlxuICAgKiBAcGFyYW0ge2FueX0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gdmFsaWRhdGVcbiAgICogQHBhcmFtIHthbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzXG4gICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH0gQWx3YXlzIHJldHVybnMgdW5kZWZpbmVkIGFzIHRoaXMgdmFsaWRhdG9yIG9ubHkgd29ya3MgZHVyaW5nIHVwZGF0ZXNcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgaGFzRXJyb3JzKHZhbHVlOiBhbnksIC4uLmFyZ3M6IGFueVtdKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDaGVja3MgaWYgYSB2YWx1ZSBoYXMgYmVlbiBtb2RpZmllZCBkdXJpbmcgYW4gdXBkYXRlIG9wZXJhdGlvbi5cbiAgICogQHN1bW1hcnkgVmFsaWRhdGVzIGEgdmFsdWUgaGFzIG5vdCBjaGFuZ2VkIGJ5IGNvbXBhcmluZyBpdCB3aXRoIHRoZSBwcmV2aW91cyB2YWx1ZSB1c2luZyBkZWVwIGVxdWFsaXR5LlxuICAgKiBAcGFyYW0ge2FueX0gdmFsdWUgLSBUaGUgbmV3IHZhbHVlIHRvIHZhbGlkYXRlXG4gICAqIEBwYXJhbSB7YW55fSBvbGRWYWx1ZSAtIFRoZSBvcmlnaW5hbCB2YWx1ZSB0byBjb21wYXJlIGFnYWluc3RcbiAgICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSAtIE9wdGlvbmFsIGN1c3RvbSBlcnJvciBtZXNzYWdlIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0XG4gICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH0gQW4gZXJyb3IgbWVzc2FnZSBpZiB2YWxpZGF0aW9uIGZhaWxzLCB1bmRlZmluZWQgb3RoZXJ3aXNlXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlSGFzRXJyb3JzKFxuICAgIHZhbHVlOiBhbnksXG4gICAgb2xkVmFsdWU6IGFueSxcbiAgICBtZXNzYWdlPzogc3RyaW5nLFxuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG5cbiAgICByZXR1cm4gaXNFcXVhbCh2YWx1ZSwgb2xkVmFsdWUpXG4gICAgICA/IHVuZGVmaW5lZFxuICAgICAgOiB0aGlzLmdldE1lc3NhZ2UobWVzc2FnZSB8fCB0aGlzLm1lc3NhZ2UpO1xuICB9XG59XG4iXX0=
@@ -1,14 +1,48 @@
1
1
  import { Validator } from "@decaf-ts/decorator-validation";
2
2
  /**
3
- * @summary Validates the update of a timestamp
4
- *
3
+ * @description A validator that ensures timestamp values are only updated with newer timestamps.
4
+ * @summary Validates the update of a timestamp by comparing the new timestamp with the old one, ensuring the new timestamp is more recent.
5
+ * @param {Date|string|number} value - The timestamp value to validate
6
+ * @param {Date|string|number} oldValue - The previous timestamp to compare against
7
+ * @param {string} [message] - Optional custom error message
5
8
  * @class TimestampValidator
6
- * @extends Validator
9
+ * @example
10
+ * // Using TimestampValidator with a timestamp property
11
+ * class Document {
12
+ * @timestamp()
13
+ * updatedAt: Date;
14
+ *
15
+ * title: string;
16
+ *
17
+ * constructor(title: string) {
18
+ * this.title = title;
19
+ * this.updatedAt = new Date();
20
+ * }
21
+ * }
7
22
  *
23
+ * // This will trigger validation error when trying to update with an older timestamp
24
+ * const doc = new Document('My Document');
25
+ * const oldDate = new Date(2020, 0, 1);
26
+ * doc.updatedAt = oldDate; // Will be prevented by TimestampValidator
8
27
  * @category Validators
9
28
  */
10
29
  export declare class TimestampValidator extends Validator {
11
30
  constructor();
31
+ /**
32
+ * @description Implementation of the base validator's hasErrors method.
33
+ * @summary This method is required by the Validator interface but not used in this validator as validation only happens during updates.
34
+ * @param {any} value - The timestamp value to validate
35
+ * @param {any[]} args - Additional arguments
36
+ * @return {string | undefined} Always returns undefined as this validator only works during updates
37
+ */
12
38
  hasErrors(value: any, ...args: any[]): string | undefined;
39
+ /**
40
+ * @description Validates that a timestamp is newer than its previous value.
41
+ * @summary Checks if a timestamp has been updated with a more recent value by converting both values to Date objects and comparing them.
42
+ * @param {Date|string|number} value - The new timestamp value to validate
43
+ * @param {Date|string|number} oldValue - The original timestamp to compare against
44
+ * @param {string} [message] - Optional custom error message to override the default
45
+ * @return {string | undefined} An error message if validation fails (new timestamp is not newer), undefined otherwise
46
+ */
13
47
  updateHasErrors(value: Date | string | number, oldValue: Date | string | number, message?: string): string | undefined;
14
48
  }
@@ -8,23 +8,57 @@ var __metadata = (this && this.__metadata) || function (k, v) {
8
8
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
9
  };
10
10
  import { validator, Validator } from "@decaf-ts/decorator-validation";
11
- import { DEFAULT_ERROR_MESSAGES, UpdateValidationKeys } from "../constants";
11
+ import { DEFAULT_ERROR_MESSAGES, UpdateValidationKeys } from "./../constants.js";
12
12
  /**
13
- * @summary Validates the update of a timestamp
14
- *
13
+ * @description A validator that ensures timestamp values are only updated with newer timestamps.
14
+ * @summary Validates the update of a timestamp by comparing the new timestamp with the old one, ensuring the new timestamp is more recent.
15
+ * @param {Date|string|number} value - The timestamp value to validate
16
+ * @param {Date|string|number} oldValue - The previous timestamp to compare against
17
+ * @param {string} [message] - Optional custom error message
15
18
  * @class TimestampValidator
16
- * @extends Validator
19
+ * @example
20
+ * // Using TimestampValidator with a timestamp property
21
+ * class Document {
22
+ * @timestamp()
23
+ * updatedAt: Date;
24
+ *
25
+ * title: string;
26
+ *
27
+ * constructor(title: string) {
28
+ * this.title = title;
29
+ * this.updatedAt = new Date();
30
+ * }
31
+ * }
17
32
  *
33
+ * // This will trigger validation error when trying to update with an older timestamp
34
+ * const doc = new Document('My Document');
35
+ * const oldDate = new Date(2020, 0, 1);
36
+ * doc.updatedAt = oldDate; // Will be prevented by TimestampValidator
18
37
  * @category Validators
19
38
  */
20
39
  let TimestampValidator = class TimestampValidator extends Validator {
21
40
  constructor() {
22
41
  super(DEFAULT_ERROR_MESSAGES.TIMESTAMP.INVALID);
23
42
  }
43
+ /**
44
+ * @description Implementation of the base validator's hasErrors method.
45
+ * @summary This method is required by the Validator interface but not used in this validator as validation only happens during updates.
46
+ * @param {any} value - The timestamp value to validate
47
+ * @param {any[]} args - Additional arguments
48
+ * @return {string | undefined} Always returns undefined as this validator only works during updates
49
+ */
24
50
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
25
51
  hasErrors(value, ...args) {
26
52
  return undefined;
27
53
  }
54
+ /**
55
+ * @description Validates that a timestamp is newer than its previous value.
56
+ * @summary Checks if a timestamp has been updated with a more recent value by converting both values to Date objects and comparing them.
57
+ * @param {Date|string|number} value - The new timestamp value to validate
58
+ * @param {Date|string|number} oldValue - The original timestamp to compare against
59
+ * @param {string} [message] - Optional custom error message to override the default
60
+ * @return {string | undefined} An error message if validation fails (new timestamp is not newer), undefined otherwise
61
+ */
28
62
  updateHasErrors(value, oldValue, message) {
29
63
  if (value === undefined)
30
64
  return;
@@ -45,4 +79,4 @@ TimestampValidator = __decorate([
45
79
  __metadata("design:paramtypes", [])
46
80
  ], TimestampValidator);
47
81
  export { TimestampValidator };
48
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGltZXN0YW1wVmFsaWRhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3ZhbGlkYXRpb24vdmFsaWRhdG9ycy9UaW1lc3RhbXBWYWxpZGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN0RSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFNUU7Ozs7Ozs7R0FPRztBQUVJLElBQU0sa0JBQWtCLEdBQXhCLE1BQU0sa0JBQW1CLFNBQVEsU0FBUztJQUMvQztRQUNFLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVELDZEQUE2RDtJQUM3RCxTQUFTLENBQUMsS0FBVSxFQUFFLEdBQUcsSUFBVztRQUNsQyxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRU0sZUFBZSxDQUNwQixLQUE2QixFQUM3QixRQUFnQyxFQUNoQyxPQUFnQjtRQUVoQixJQUFJLEtBQUssS0FBSyxTQUFTO1lBQUUsT0FBTztRQUVoQyxPQUFPLEdBQUcsT0FBTyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUU5RCxJQUFJLENBQUM7WUFDSCxLQUFLLEdBQUcsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDeEIsUUFBUSxHQUFHLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzlCLDZEQUE2RDtRQUMvRCxDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNYLE9BQU8sT0FBTyxDQUFDO1FBQ2pCLENBQUM7UUFFRCxPQUFPLEtBQUssSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ2pELENBQUM7Q0FDRixDQUFBO0FBN0JZLGtCQUFrQjtJQUQ5QixTQUFTLENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDOztHQUM3QixrQkFBa0IsQ0E2QjlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdmFsaWRhdG9yLCBWYWxpZGF0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBERUZBVUxUX0VSUk9SX01FU1NBR0VTLCBVcGRhdGVWYWxpZGF0aW9uS2V5cyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBWYWxpZGF0ZXMgdGhlIHVwZGF0ZSBvZiBhIHRpbWVzdGFtcFxuICpcbiAqIEBjbGFzcyBUaW1lc3RhbXBWYWxpZGF0b3JcbiAqIEBleHRlbmRzIFZhbGlkYXRvclxuICpcbiAqIEBjYXRlZ29yeSBWYWxpZGF0b3JzXG4gKi9cbkB2YWxpZGF0b3IoVXBkYXRlVmFsaWRhdGlvbktleXMuVElNRVNUQU1QKVxuZXhwb3J0IGNsYXNzIFRpbWVzdGFtcFZhbGlkYXRvciBleHRlbmRzIFZhbGlkYXRvciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKERFRkFVTFRfRVJST1JfTUVTU0FHRVMuVElNRVNUQU1QLklOVkFMSUQpO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBoYXNFcnJvcnModmFsdWU6IGFueSwgLi4uYXJnczogYW55W10pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlSGFzRXJyb3JzKFxuICAgIHZhbHVlOiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyLFxuICAgIG9sZFZhbHVlOiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyLFxuICAgIG1lc3NhZ2U/OiBzdHJpbmdcbiAgKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuXG4gICAgbWVzc2FnZSA9IG1lc3NhZ2UgfHwgdGhpcy5nZXRNZXNzYWdlKG1lc3NhZ2UgfHwgdGhpcy5tZXNzYWdlKTtcblxuICAgIHRyeSB7XG4gICAgICB2YWx1ZSA9IG5ldyBEYXRlKHZhbHVlKTtcbiAgICAgIG9sZFZhbHVlID0gbmV3IERhdGUob2xkVmFsdWUpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZSA8PSBvbGRWYWx1ZSA/IG1lc3NhZ2UgOiB1bmRlZmluZWQ7XG4gIH1cbn1cbiJdfQ==
82
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGltZXN0YW1wVmFsaWRhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3ZhbGlkYXRpb24vdmFsaWRhdG9ycy9UaW1lc3RhbXBWYWxpZGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN0RSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsb0JBQW9CLEVBQUUsMEJBQXFCO0FBRTVFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBCRztBQUVJLElBQU0sa0JBQWtCLEdBQXhCLE1BQU0sa0JBQW1CLFNBQVEsU0FBUztJQUMvQztRQUNFLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILDZEQUE2RDtJQUM3RCxTQUFTLENBQUMsS0FBVSxFQUFFLEdBQUcsSUFBVztRQUNsQyxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNJLGVBQWUsQ0FDcEIsS0FBNkIsRUFDN0IsUUFBZ0MsRUFDaEMsT0FBZ0I7UUFFaEIsSUFBSSxLQUFLLEtBQUssU0FBUztZQUFFLE9BQU87UUFFaEMsT0FBTyxHQUFHLE9BQU8sSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFOUQsSUFBSSxDQUFDO1lBQ0gsS0FBSyxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3hCLFFBQVEsR0FBRyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUM5Qiw2REFBNkQ7UUFDL0QsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDWCxPQUFPLE9BQU8sQ0FBQztRQUNqQixDQUFDO1FBRUQsT0FBTyxLQUFLLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUNqRCxDQUFDO0NBQ0YsQ0FBQTtBQTVDWSxrQkFBa0I7SUFEOUIsU0FBUyxDQUFDLG9CQUFvQixDQUFDLFNBQVMsQ0FBQzs7R0FDN0Isa0JBQWtCLENBNEM5QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHZhbGlkYXRvciwgVmFsaWRhdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUywgVXBkYXRlVmFsaWRhdGlvbktleXMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEEgdmFsaWRhdG9yIHRoYXQgZW5zdXJlcyB0aW1lc3RhbXAgdmFsdWVzIGFyZSBvbmx5IHVwZGF0ZWQgd2l0aCBuZXdlciB0aW1lc3RhbXBzLlxuICogQHN1bW1hcnkgVmFsaWRhdGVzIHRoZSB1cGRhdGUgb2YgYSB0aW1lc3RhbXAgYnkgY29tcGFyaW5nIHRoZSBuZXcgdGltZXN0YW1wIHdpdGggdGhlIG9sZCBvbmUsIGVuc3VyaW5nIHRoZSBuZXcgdGltZXN0YW1wIGlzIG1vcmUgcmVjZW50LlxuICogQHBhcmFtIHtEYXRlfHN0cmluZ3xudW1iZXJ9IHZhbHVlIC0gVGhlIHRpbWVzdGFtcCB2YWx1ZSB0byB2YWxpZGF0ZVxuICogQHBhcmFtIHtEYXRlfHN0cmluZ3xudW1iZXJ9IG9sZFZhbHVlIC0gVGhlIHByZXZpb3VzIHRpbWVzdGFtcCB0byBjb21wYXJlIGFnYWluc3RcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gLSBPcHRpb25hbCBjdXN0b20gZXJyb3IgbWVzc2FnZVxuICogQGNsYXNzIFRpbWVzdGFtcFZhbGlkYXRvclxuICogQGV4YW1wbGVcbiAqIC8vIFVzaW5nIFRpbWVzdGFtcFZhbGlkYXRvciB3aXRoIGEgdGltZXN0YW1wIHByb3BlcnR5XG4gKiBjbGFzcyBEb2N1bWVudCB7XG4gKiAgIEB0aW1lc3RhbXAoKVxuICogICB1cGRhdGVkQXQ6IERhdGU7XG4gKiAgIFxuICogICB0aXRsZTogc3RyaW5nO1xuICogICBcbiAqICAgY29uc3RydWN0b3IodGl0bGU6IHN0cmluZykge1xuICogICAgIHRoaXMudGl0bGUgPSB0aXRsZTtcbiAqICAgICB0aGlzLnVwZGF0ZWRBdCA9IG5ldyBEYXRlKCk7XG4gKiAgIH1cbiAqIH1cbiAqIFxuICogLy8gVGhpcyB3aWxsIHRyaWdnZXIgdmFsaWRhdGlvbiBlcnJvciB3aGVuIHRyeWluZyB0byB1cGRhdGUgd2l0aCBhbiBvbGRlciB0aW1lc3RhbXBcbiAqIGNvbnN0IGRvYyA9IG5ldyBEb2N1bWVudCgnTXkgRG9jdW1lbnQnKTtcbiAqIGNvbnN0IG9sZERhdGUgPSBuZXcgRGF0ZSgyMDIwLCAwLCAxKTtcbiAqIGRvYy51cGRhdGVkQXQgPSBvbGREYXRlOyAvLyBXaWxsIGJlIHByZXZlbnRlZCBieSBUaW1lc3RhbXBWYWxpZGF0b3JcbiAqIEBjYXRlZ29yeSBWYWxpZGF0b3JzXG4gKi9cbkB2YWxpZGF0b3IoVXBkYXRlVmFsaWRhdGlvbktleXMuVElNRVNUQU1QKVxuZXhwb3J0IGNsYXNzIFRpbWVzdGFtcFZhbGlkYXRvciBleHRlbmRzIFZhbGlkYXRvciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKERFRkFVTFRfRVJST1JfTUVTU0FHRVMuVElNRVNUQU1QLklOVkFMSUQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgYmFzZSB2YWxpZGF0b3IncyBoYXNFcnJvcnMgbWV0aG9kLlxuICAgKiBAc3VtbWFyeSBUaGlzIG1ldGhvZCBpcyByZXF1aXJlZCBieSB0aGUgVmFsaWRhdG9yIGludGVyZmFjZSBidXQgbm90IHVzZWQgaW4gdGhpcyB2YWxpZGF0b3IgYXMgdmFsaWRhdGlvbiBvbmx5IGhhcHBlbnMgZHVyaW5nIHVwZGF0ZXMuXG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZSAtIFRoZSB0aW1lc3RhbXAgdmFsdWUgdG8gdmFsaWRhdGVcbiAgICogQHBhcmFtIHthbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzXG4gICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH0gQWx3YXlzIHJldHVybnMgdW5kZWZpbmVkIGFzIHRoaXMgdmFsaWRhdG9yIG9ubHkgd29ya3MgZHVyaW5nIHVwZGF0ZXNcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgaGFzRXJyb3JzKHZhbHVlOiBhbnksIC4uLmFyZ3M6IGFueVtdKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBWYWxpZGF0ZXMgdGhhdCBhIHRpbWVzdGFtcCBpcyBuZXdlciB0aGFuIGl0cyBwcmV2aW91cyB2YWx1ZS5cbiAgICogQHN1bW1hcnkgQ2hlY2tzIGlmIGEgdGltZXN0YW1wIGhhcyBiZWVuIHVwZGF0ZWQgd2l0aCBhIG1vcmUgcmVjZW50IHZhbHVlIGJ5IGNvbnZlcnRpbmcgYm90aCB2YWx1ZXMgdG8gRGF0ZSBvYmplY3RzIGFuZCBjb21wYXJpbmcgdGhlbS5cbiAgICogQHBhcmFtIHtEYXRlfHN0cmluZ3xudW1iZXJ9IHZhbHVlIC0gVGhlIG5ldyB0aW1lc3RhbXAgdmFsdWUgdG8gdmFsaWRhdGVcbiAgICogQHBhcmFtIHtEYXRlfHN0cmluZ3xudW1iZXJ9IG9sZFZhbHVlIC0gVGhlIG9yaWdpbmFsIHRpbWVzdGFtcCB0byBjb21wYXJlIGFnYWluc3RcbiAgICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSAtIE9wdGlvbmFsIGN1c3RvbSBlcnJvciBtZXNzYWdlIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0XG4gICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH0gQW4gZXJyb3IgbWVzc2FnZSBpZiB2YWxpZGF0aW9uIGZhaWxzIChuZXcgdGltZXN0YW1wIGlzIG5vdCBuZXdlciksIHVuZGVmaW5lZCBvdGhlcndpc2VcbiAgICovXG4gIHB1YmxpYyB1cGRhdGVIYXNFcnJvcnMoXG4gICAgdmFsdWU6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIsXG4gICAgb2xkVmFsdWU6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIsXG4gICAgbWVzc2FnZT86IHN0cmluZ1xuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG5cbiAgICBtZXNzYWdlID0gbWVzc2FnZSB8fCB0aGlzLmdldE1lc3NhZ2UobWVzc2FnZSB8fCB0aGlzLm1lc3NhZ2UpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHZhbHVlID0gbmV3IERhdGUodmFsdWUpO1xuICAgICAgb2xkVmFsdWUgPSBuZXcgRGF0ZShvbGRWYWx1ZSk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlIDw9IG9sZFZhbHVlID8gbWVzc2FnZSA6IHVuZGVmaW5lZDtcbiAgfVxufVxuIl19
@@ -1,23 +1,40 @@
1
1
  import { Validator } from "@decaf-ts/decorator-validation";
2
2
  /**
3
- * @summary Base class for an Update validator
4
- *
5
- * @param {string} [message] error message. defaults to {@link DecoratorMessages#DEFAULT}
6
- * @param {string[]} [acceptedTypes] the accepted value types by the decorator
7
- *
3
+ * @description Abstract base class for validators that compare new values with old values during updates.
4
+ * @summary Base class for an Update validator that provides a framework for implementing validation logic that compares a new value with its previous state.
5
+ * @param {string} [message] - Error message. Defaults to {@link DecoratorMessages#DEFAULT}
6
+ * @param {string[]} [acceptedTypes] - The accepted value types by the decorator
8
7
  * @class UpdateValidator
9
- * @abstract
10
- * @extends Validator
8
+ * @example
9
+ * // Extending UpdateValidator to create a custom validator
10
+ * class MyCustomValidator extends UpdateValidator {
11
+ * constructor() {
12
+ * super("Custom validation failed");
13
+ * }
14
+ *
15
+ * public updateHasErrors(value: any, oldValue: any): string | undefined {
16
+ * // Custom validation logic
17
+ * if (value === oldValue) {
18
+ * return this.message;
19
+ * }
20
+ * return undefined;
21
+ * }
11
22
  *
23
+ * hasErrors(value: any): string | undefined {
24
+ * return undefined; // Not used for update validators
25
+ * }
26
+ * }
12
27
  * @category Validators
13
28
  */
14
29
  export declare abstract class UpdateValidator extends Validator {
15
30
  protected constructor(message?: string, ...acceptedTypes: string[]);
16
31
  /**
17
- * @summary validates a value by comparing to its old version
18
- * @param {any} value
19
- * @param {any} oldValue
20
- * @param {any[]} args
32
+ * @description Abstract method that must be implemented by subclasses to perform update validation.
33
+ * @summary Validates a value by comparing it to its old version to determine if the update is valid.
34
+ * @param {any} value - The new value to validate
35
+ * @param {any} oldValue - The previous value to compare against
36
+ * @param {any[]} args - Additional arguments that may be needed for validation
37
+ * @return {string | undefined} An error message if validation fails, undefined if validation passes
21
38
  */
22
39
  abstract updateHasErrors(value: any, oldValue: any, ...args: any[]): string | undefined;
23
40
  }