@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.
- package/LICENSE.md +21 -157
- package/README.md +571 -10
- package/dist/db-decorators.cjs +1352 -322
- package/dist/db-decorators.esm.cjs +1352 -323
- package/lib/esm/identity/decorators.d.ts +7 -0
- package/lib/esm/identity/decorators.js +11 -4
- package/lib/esm/identity/index.js +3 -3
- package/lib/esm/identity/utils.d.ts +36 -23
- package/lib/esm/identity/utils.js +38 -25
- package/lib/esm/index.d.ts +12 -27
- package/lib/esm/index.js +13 -28
- package/lib/esm/interfaces/BulkCrudOperator.d.ts +39 -0
- package/lib/esm/interfaces/BulkCrudOperator.js +1 -1
- package/lib/esm/interfaces/Contextual.d.ts +17 -0
- package/lib/esm/interfaces/Contextual.js +1 -1
- package/lib/esm/interfaces/CrudOperator.d.ts +26 -23
- package/lib/esm/interfaces/CrudOperator.js +1 -1
- package/lib/esm/interfaces/IRepository.d.ts +10 -2
- package/lib/esm/interfaces/IRepository.js +1 -1
- package/lib/esm/interfaces/index.js +5 -5
- package/lib/esm/model/constants.d.ts +11 -13
- package/lib/esm/model/constants.js +12 -14
- package/lib/esm/model/decorators.d.ts +112 -23
- package/lib/esm/model/decorators.js +119 -29
- package/lib/esm/model/index.d.ts +1 -0
- package/lib/esm/model/index.js +7 -6
- package/lib/esm/model/model.d.ts +2 -141
- package/lib/esm/model/model.js +2 -13
- package/lib/esm/model/overrides.d.ts +1 -0
- package/lib/esm/model/overrides.js +23 -0
- package/lib/esm/model/utils.d.ts +39 -0
- package/lib/esm/model/utils.js +42 -3
- package/lib/esm/model/validation.d.ts +26 -8
- package/lib/esm/model/validation.js +29 -11
- package/lib/esm/operations/Operations.d.ts +65 -3
- package/lib/esm/operations/Operations.js +68 -6
- package/lib/esm/operations/OperationsRegistry.d.ts +44 -16
- package/lib/esm/operations/OperationsRegistry.js +46 -18
- package/lib/esm/operations/constants.d.ts +27 -8
- package/lib/esm/operations/constants.js +16 -9
- package/lib/esm/operations/decorators.d.ts +140 -134
- package/lib/esm/operations/decorators.js +152 -137
- package/lib/esm/operations/index.js +6 -6
- package/lib/esm/operations/types.d.ts +10 -0
- package/lib/esm/operations/types.js +1 -1
- package/lib/esm/repository/BaseRepository.d.ts +322 -0
- package/lib/esm/repository/BaseRepository.js +297 -7
- package/lib/esm/repository/Context.d.ts +153 -2
- package/lib/esm/repository/Context.js +154 -6
- package/lib/esm/repository/Repository.d.ts +89 -0
- package/lib/esm/repository/Repository.js +96 -7
- package/lib/esm/repository/constants.d.ts +7 -0
- package/lib/esm/repository/constants.js +8 -1
- package/lib/esm/repository/errors.d.ts +61 -34
- package/lib/esm/repository/errors.js +62 -35
- package/lib/esm/repository/index.js +9 -9
- package/lib/esm/repository/types.d.ts +25 -0
- package/lib/esm/repository/types.js +1 -1
- package/lib/esm/repository/utils.d.ts +11 -0
- package/lib/esm/repository/utils.js +4 -4
- package/lib/esm/repository/wrappers.d.ts +2 -2
- package/lib/esm/repository/wrappers.js +5 -5
- package/lib/esm/validation/constants.d.ts +20 -5
- package/lib/esm/validation/constants.js +22 -7
- package/lib/esm/validation/decorators.d.ts +101 -19
- package/lib/esm/validation/decorators.js +109 -27
- package/lib/esm/validation/index.js +5 -5
- package/lib/esm/validation/validation.js +10 -2
- package/lib/esm/validation/validators/ReadOnlyValidator.d.ts +32 -8
- package/lib/esm/validation/validators/ReadOnlyValidator.js +34 -10
- package/lib/esm/validation/validators/TimestampValidator.d.ts +37 -3
- package/lib/esm/validation/validators/TimestampValidator.js +39 -5
- package/lib/esm/validation/validators/UpdateValidator.d.ts +28 -11
- package/lib/esm/validation/validators/UpdateValidator.js +23 -8
- package/lib/esm/validation/validators/index.js +4 -4
- package/lib/identity/decorators.cjs +8 -1
- package/lib/identity/decorators.d.ts +7 -0
- package/lib/identity/utils.cjs +35 -22
- package/lib/identity/utils.d.ts +36 -23
- package/lib/index.cjs +14 -28
- package/lib/index.d.ts +12 -27
- package/lib/interfaces/BulkCrudOperator.cjs +1 -1
- package/lib/interfaces/BulkCrudOperator.d.ts +39 -0
- package/lib/interfaces/Contextual.cjs +1 -1
- package/lib/interfaces/Contextual.d.ts +17 -0
- package/lib/interfaces/CrudOperator.cjs +1 -1
- package/lib/interfaces/CrudOperator.d.ts +26 -23
- package/lib/interfaces/IRepository.cjs +1 -1
- package/lib/interfaces/IRepository.d.ts +10 -2
- package/lib/model/constants.cjs +12 -14
- package/lib/model/constants.d.ts +11 -13
- package/lib/model/decorators.cjs +114 -24
- package/lib/model/decorators.d.ts +112 -23
- package/lib/model/index.cjs +2 -1
- package/lib/model/index.d.ts +1 -0
- package/lib/model/model.cjs +1 -13
- package/lib/model/model.d.ts +2 -141
- package/lib/model/overrides.cjs +25 -0
- package/lib/model/overrides.d.ts +1 -0
- package/lib/model/utils.cjs +40 -1
- package/lib/model/utils.d.ts +39 -0
- package/lib/model/validation.cjs +27 -9
- package/lib/model/validation.d.ts +26 -8
- package/lib/operations/Operations.cjs +66 -4
- package/lib/operations/Operations.d.ts +65 -3
- package/lib/operations/OperationsRegistry.cjs +45 -17
- package/lib/operations/OperationsRegistry.d.ts +44 -16
- package/lib/operations/constants.cjs +16 -9
- package/lib/operations/constants.d.ts +27 -8
- package/lib/operations/decorators.cjs +150 -135
- package/lib/operations/decorators.d.ts +140 -134
- package/lib/operations/types.cjs +1 -1
- package/lib/operations/types.d.ts +10 -0
- package/lib/repository/BaseRepository.cjs +291 -1
- package/lib/repository/BaseRepository.d.ts +322 -0
- package/lib/repository/Context.cjs +153 -5
- package/lib/repository/Context.d.ts +153 -2
- package/lib/repository/Repository.cjs +90 -1
- package/lib/repository/Repository.d.ts +89 -0
- package/lib/repository/constants.cjs +8 -1
- package/lib/repository/constants.d.ts +7 -0
- package/lib/repository/errors.cjs +62 -35
- package/lib/repository/errors.d.ts +61 -34
- package/lib/repository/types.cjs +1 -1
- package/lib/repository/types.d.ts +25 -0
- package/lib/repository/utils.cjs +1 -1
- package/lib/repository/utils.d.ts +11 -0
- package/lib/repository/wrappers.cjs +3 -3
- package/lib/repository/wrappers.d.ts +2 -2
- package/lib/validation/constants.cjs +21 -6
- package/lib/validation/constants.d.ts +20 -5
- package/lib/validation/decorators.cjs +102 -20
- package/lib/validation/decorators.d.ts +101 -19
- package/lib/validation/validation.cjs +9 -1
- package/lib/validation/validators/ReadOnlyValidator.cjs +33 -9
- package/lib/validation/validators/ReadOnlyValidator.d.ts +32 -8
- package/lib/validation/validators/TimestampValidator.cjs +38 -4
- package/lib/validation/validators/TimestampValidator.d.ts +37 -3
- package/lib/validation/validators/UpdateValidator.cjs +23 -8
- package/lib/validation/validators/UpdateValidator.d.ts +28 -11
- package/package.json +2 -2
|
@@ -1,8 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @
|
|
2
|
+
* @description Collection of default error messages used by validators.
|
|
3
|
+
* @summary Holds the default error messages for various validation scenarios including ID validation, readonly properties, and timestamps.
|
|
4
|
+
* @typedef {Object} ErrorMessages
|
|
5
|
+
* @property {Object} ID - Error messages for ID validation
|
|
6
|
+
* @property {string} ID.INVALID - Error message when an ID is invalid
|
|
7
|
+
* @property {string} ID.REQUIRED - Error message when an ID is missing
|
|
8
|
+
* @property {Object} READONLY - Error messages for readonly properties
|
|
9
|
+
* @property {string} READONLY.INVALID - Error message when attempting to update a readonly property
|
|
10
|
+
* @property {Object} TIMESTAMP - Error messages for timestamp validation
|
|
11
|
+
* @property {string} TIMESTAMP.REQUIRED - Error message when a timestamp is missing
|
|
12
|
+
* @property {string} TIMESTAMP.DATE - Error message when a timestamp is not a valid date
|
|
13
|
+
* @property {string} TIMESTAMP.INVALID - Error message when a timestamp is not increasing
|
|
3
14
|
* @const DEFAULT_ERROR_MESSAGES
|
|
4
|
-
*
|
|
5
|
-
* @memberOf module:db-decorators.Model
|
|
15
|
+
* @memberOf module:validation
|
|
6
16
|
*/
|
|
7
17
|
export declare const DEFAULT_ERROR_MESSAGES: {
|
|
8
18
|
ID: {
|
|
@@ -19,9 +29,14 @@ export declare const DEFAULT_ERROR_MESSAGES: {
|
|
|
19
29
|
};
|
|
20
30
|
};
|
|
21
31
|
/**
|
|
22
|
-
* @
|
|
32
|
+
* @description Constants used for reflection-based validation during update operations.
|
|
33
|
+
* @summary Keys used for storing and retrieving validation metadata on model properties during update operations.
|
|
34
|
+
* @typedef {Object} ValidationKeys
|
|
35
|
+
* @property {string} REFLECT - Base reflection key prefix for update validation
|
|
36
|
+
* @property {string} TIMESTAMP - Key for timestamp validation
|
|
37
|
+
* @property {string} READONLY - Key for readonly property validation
|
|
23
38
|
* @const UpdateValidationKeys
|
|
24
|
-
* @memberOf module:
|
|
39
|
+
* @memberOf module:validation
|
|
25
40
|
*/
|
|
26
41
|
export declare const UpdateValidationKeys: {
|
|
27
42
|
REFLECT: string;
|
|
@@ -16,13 +16,12 @@ const errors_1 = require("./../repository/errors.cjs");
|
|
|
16
16
|
const reflection_1 = require("@decaf-ts/reflection");
|
|
17
17
|
const repository_1 = require("./../repository/index.cjs");
|
|
18
18
|
/**
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
* @param {string} [message]
|
|
22
|
-
*
|
|
23
|
-
* @
|
|
24
|
-
*
|
|
25
|
-
* @category Decorators
|
|
19
|
+
* @description Prevents a property from being modified after initial creation.
|
|
20
|
+
* @summary Marks the property as readonly, causing validation errors if attempts are made to modify it during updates.
|
|
21
|
+
* @param {string} [message] - The error message to display when validation fails. Defaults to {@link DEFAULT_ERROR_MESSAGES.READONLY.INVALID}
|
|
22
|
+
* @return {PropertyDecorator} A decorator function that can be applied to class properties
|
|
23
|
+
* @function readonly
|
|
24
|
+
* @category Property Decorators
|
|
26
25
|
*/
|
|
27
26
|
function readonly(message = constants_2.DEFAULT_ERROR_MESSAGES.READONLY.INVALID) {
|
|
28
27
|
const key = decorator_validation_1.Validation.updateKey(constants_1.DBKeys.READONLY);
|
|
@@ -32,13 +31,28 @@ function readonly(message = constants_2.DEFAULT_ERROR_MESSAGES.READONLY.INVALID)
|
|
|
32
31
|
}))
|
|
33
32
|
.apply();
|
|
34
33
|
}
|
|
34
|
+
/**
|
|
35
|
+
* @description Handler function that sets a timestamp property to the current timestamp.
|
|
36
|
+
* @summary Updates a model property with the current timestamp from the repository context.
|
|
37
|
+
* @template M - The model type extending Model
|
|
38
|
+
* @template R - The repository type extending IRepository
|
|
39
|
+
* @template V - The data type for the operation
|
|
40
|
+
* @template F - The repository flags type
|
|
41
|
+
* @template C - The context type
|
|
42
|
+
* @param {C} context - The repository context containing the current timestamp
|
|
43
|
+
* @param {V} data - The data being processed
|
|
44
|
+
* @param key - The property key to update
|
|
45
|
+
* @param {M} model - The model instance being updated
|
|
46
|
+
* @return {Promise<void>} A promise that resolves when the timestamp has been set
|
|
47
|
+
* @function timestampHandler
|
|
48
|
+
* @memberOf module:db-decorators
|
|
49
|
+
*/
|
|
35
50
|
async function timestampHandler(context, data, key, model) {
|
|
36
51
|
model[key] = context.timestamp;
|
|
37
52
|
}
|
|
38
53
|
/**
|
|
39
|
-
*
|
|
40
|
-
*
|
|
41
|
-
* Makes it a {@link date}
|
|
54
|
+
* @description Automatically manages timestamp properties for tracking creation and update times.
|
|
55
|
+
* @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.
|
|
42
56
|
*
|
|
43
57
|
* Date Format:
|
|
44
58
|
*
|
|
@@ -58,13 +72,30 @@ async function timestampHandler(context, data, key, model) {
|
|
|
58
72
|
* S = miliseconds
|
|
59
73
|
* </pre>
|
|
60
74
|
*
|
|
61
|
-
* @param {
|
|
62
|
-
* @param {string} [format] The
|
|
63
|
-
* @
|
|
75
|
+
* @param {OperationKeys[]} operation - The operations to act on. Defaults to {@link DBOperations.CREATE_UPDATE}
|
|
76
|
+
* @param {string} [format] - The timestamp format. Defaults to {@link DEFAULT_TIMESTAMP_FORMAT}
|
|
77
|
+
* @return {PropertyDecorator} A decorator function that can be applied to class properties
|
|
78
|
+
* @function timestamp
|
|
79
|
+
* @category Property Decorators
|
|
80
|
+
* @mermaid
|
|
81
|
+
* sequenceDiagram
|
|
82
|
+
* participant C as Client
|
|
83
|
+
* participant M as Model
|
|
84
|
+
* participant T as TimestampDecorator
|
|
85
|
+
* participant V as Validator
|
|
86
|
+
*
|
|
87
|
+
* C->>M: Create/Update model
|
|
88
|
+
* M->>T: Process timestamp property
|
|
89
|
+
* T->>M: Apply required validation
|
|
90
|
+
* T->>M: Apply date format validation
|
|
64
91
|
*
|
|
65
|
-
*
|
|
92
|
+
* alt Update operation
|
|
93
|
+
* T->>V: Register timestamp validator
|
|
94
|
+
* V->>M: Validate timestamp is newer
|
|
95
|
+
* end
|
|
66
96
|
*
|
|
67
|
-
*
|
|
97
|
+
* T->>M: Set current timestamp
|
|
98
|
+
* M->>C: Return updated model
|
|
68
99
|
*/
|
|
69
100
|
function timestamp(operation = constants_3.DBOperations.CREATE_UPDATE, format = constants_1.DEFAULT_TIMESTAMP_FORMAT) {
|
|
70
101
|
const key = decorator_validation_1.Validation.updateKey(constants_1.DBKeys.TIMESTAMP);
|
|
@@ -81,6 +112,22 @@ function timestamp(operation = constants_3.DBOperations.CREATE_UPDATE, format =
|
|
|
81
112
|
.define(...decorators)
|
|
82
113
|
.apply();
|
|
83
114
|
}
|
|
115
|
+
/**
|
|
116
|
+
* @description Handler function that serializes a property to JSON string during create and update operations.
|
|
117
|
+
* @summary Converts a complex object property to a JSON string before storing it in the database.
|
|
118
|
+
* @template M - The model type extending Model
|
|
119
|
+
* @template R - The repository type extending IRepository
|
|
120
|
+
* @template V - The data type for the operation
|
|
121
|
+
* @template F - The repository flags type
|
|
122
|
+
* @template C - The context type
|
|
123
|
+
* @param {C} context - The repository context
|
|
124
|
+
* @param {V} data - The data being processed
|
|
125
|
+
* @param key - The property key to serialize
|
|
126
|
+
* @param {M} model - The model instance being processed
|
|
127
|
+
* @return {Promise<void>} A promise that resolves when the property has been serialized
|
|
128
|
+
* @function serializeOnCreateUpdate
|
|
129
|
+
* @memberOf module:db-decorators
|
|
130
|
+
*/
|
|
84
131
|
async function serializeOnCreateUpdate(context, data, key, model) {
|
|
85
132
|
if (!model[key])
|
|
86
133
|
return;
|
|
@@ -92,6 +139,22 @@ async function serializeOnCreateUpdate(context, data, key, model) {
|
|
|
92
139
|
throw new errors_1.SerializationError(`Failed to serialize ${key.toString()} property of model ${model.constructor.name}: e`);
|
|
93
140
|
}
|
|
94
141
|
}
|
|
142
|
+
/**
|
|
143
|
+
* @description Handler function that deserializes a property from JSON string after database operations.
|
|
144
|
+
* @summary Converts a JSON string property back to its original complex object form after retrieving it from the database.
|
|
145
|
+
* @template M - The model type extending Model
|
|
146
|
+
* @template R - The repository type extending IRepository
|
|
147
|
+
* @template V - The data type for the operation
|
|
148
|
+
* @template F - The repository flags type
|
|
149
|
+
* @template C - The context type
|
|
150
|
+
* @param {C} context - The repository context
|
|
151
|
+
* @param {V} data - The data being processed
|
|
152
|
+
* @param key - The property key to deserialize
|
|
153
|
+
* @param {M} model - The model instance being processed
|
|
154
|
+
* @return {Promise<void>} A promise that resolves when the property has been deserialized
|
|
155
|
+
* @function serializeAfterAll
|
|
156
|
+
* @memberOf module:db-decorators
|
|
157
|
+
*/
|
|
95
158
|
async function serializeAfterAll(context, data, key, model) {
|
|
96
159
|
if (!model[key])
|
|
97
160
|
return;
|
|
@@ -105,14 +168,33 @@ async function serializeAfterAll(context, data, key, model) {
|
|
|
105
168
|
}
|
|
106
169
|
}
|
|
107
170
|
/**
|
|
108
|
-
* @
|
|
109
|
-
* @
|
|
110
|
-
*
|
|
171
|
+
* @description Enables automatic JSON serialization and deserialization for complex object properties.
|
|
172
|
+
* @summary Decorator that automatically converts complex objects to JSON strings before storing in the database and back to objects when retrieving them.
|
|
173
|
+
* @return {PropertyDecorator} A decorator function that can be applied to class properties
|
|
111
174
|
* @function serialize
|
|
175
|
+
* @category Property Decorators
|
|
176
|
+
* @mermaid
|
|
177
|
+
* sequenceDiagram
|
|
178
|
+
* participant C as Client
|
|
179
|
+
* participant M as Model
|
|
180
|
+
* participant S as SerializeDecorator
|
|
181
|
+
* participant DB as Database
|
|
182
|
+
*
|
|
183
|
+
* Note over C,DB: Create/Update Flow
|
|
184
|
+
* C->>M: Set complex object property
|
|
185
|
+
* M->>S: Process property (create/update)
|
|
186
|
+
* S->>M: Convert to JSON string
|
|
187
|
+
* M->>DB: Store serialized data
|
|
112
188
|
*
|
|
113
|
-
*
|
|
189
|
+
* Note over C,DB: Retrieval Flow
|
|
190
|
+
* C->>M: Request model
|
|
191
|
+
* M->>DB: Fetch data
|
|
192
|
+
* DB->>M: Return with serialized property
|
|
193
|
+
* M->>S: Process property (after all ops)
|
|
194
|
+
* S->>M: Parse JSON back to object
|
|
195
|
+
* M->>C: Return model with deserialized property
|
|
114
196
|
*/
|
|
115
197
|
function serialize() {
|
|
116
198
|
return (0, reflection_1.apply)((0, decorators_1.onCreateUpdate)(serializeOnCreateUpdate), (0, decorators_1.after)(constants_3.DBOperations.ALL, serializeAfterAll), (0, decorator_validation_1.type)([String.name, Object.name]), (0, reflection_1.metadata)(repository_1.Repository.key(constants_1.DBKeys.SERIALIZE), {}));
|
|
117
199
|
}
|
|
118
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy92YWxpZGF0aW9uL2RlY29yYXRvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUE4QkEsNEJBV0M7QUFFRCw0Q0FRQztBQWlDRCw4QkFxQkM7QUFFRCwwREFnQkM7QUFFRCw4Q0FpQkM7QUFVRCw4QkFPQztBQS9KRCw0QkFBc0I7QUFDdEIseUVBUXdDO0FBQ3hDLHdEQUFzRTtBQUN0RSwrQ0FBcUQ7QUFDckQsNkRBQXNFO0FBQ3RFLCtEQUFxRTtBQUVyRSx1REFBMEQ7QUFDMUQscURBQXVEO0FBQ3ZELDBEQUEyQztBQUkzQzs7Ozs7Ozs7R0FRRztBQUNILFNBQWdCLFFBQVEsQ0FDdEIsVUFBa0Isa0NBQXNCLENBQUMsUUFBUSxDQUFDLE9BQU87SUFFekQsTUFBTSxHQUFHLEdBQUcsaUNBQVUsQ0FBQyxTQUFTLENBQUMsa0JBQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNsRCxPQUFPLGlDQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztTQUN2QixNQUFNLENBQ0wsSUFBQSxtQ0FBWSxFQUFDLEdBQUcsRUFBRTtRQUNoQixPQUFPLEVBQUUsT0FBTztLQUNqQixDQUFDLENBQ0g7U0FDQSxLQUFLLEVBQUUsQ0FBQztBQUNiLENBQUM7QUFFTSxLQUFLLFVBQVUsZ0JBQWdCLENBTTNCLE9BQVUsRUFBRSxJQUFPLEVBQUUsR0FBWSxFQUFFLEtBQVE7SUFDbkQsS0FBYSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUM7QUFDMUMsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4Qkc7QUFDSCxTQUFnQixTQUFTLENBQ3ZCLFlBQTZCLHdCQUFZLENBQUMsYUFBMkMsRUFDckYsU0FBaUIsb0NBQXdCO0lBRXpDLE1BQU0sR0FBRyxHQUFHLGlDQUFVLENBQUMsU0FBUyxDQUFDLGtCQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7SUFFbkQsTUFBTSxVQUFVLEdBQVU7UUFDeEIsSUFBQSwyQkFBSSxFQUFDLE1BQU0sRUFBRSxrQ0FBc0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDO1FBQ25ELElBQUEsK0JBQVEsRUFBQyxrQ0FBc0IsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDO1FBQ25ELElBQUEsZUFBRSxFQUFDLFNBQVMsRUFBRSxnQkFBZ0IsQ0FBQztLQUNoQyxDQUFDO0lBRUYsSUFBSSxTQUFTLENBQUMsT0FBTyxDQUFDLHlCQUFhLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hELFVBQVUsQ0FBQyxJQUFJLENBQ2IsSUFBQSxtQ0FBWSxFQUFDLGlDQUFVLENBQUMsU0FBUyxDQUFDLGtCQUFNLENBQUMsU0FBUyxDQUFDLEVBQUU7WUFDbkQsT0FBTyxFQUFFLGtDQUFzQixDQUFDLFNBQVMsQ0FBQyxPQUFPO1NBQ2xELENBQUMsQ0FDSCxDQUFDO0lBQ0osT0FBTyxpQ0FBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7U0FDdkIsTUFBTSxDQUFDLEdBQUcsVUFBVSxDQUFDO1NBQ3JCLEtBQUssRUFBRSxDQUFDO0FBQ2IsQ0FBQztBQUVNLEtBQUssVUFBVSx1QkFBdUIsQ0FNbEMsT0FBVSxFQUFFLElBQU8sRUFBRSxHQUFZLEVBQUUsS0FBUTtJQUNwRCxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQztRQUFFLE9BQU87SUFDeEIsSUFBSSxDQUFDO1FBQ0gsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFlLENBQUM7UUFDdEQsNkRBQTZEO0lBQy9ELENBQUM7SUFBQyxPQUFPLENBQVUsRUFBRSxDQUFDO1FBQ3BCLE1BQU0sSUFBSSwyQkFBa0IsQ0FDMUIsdUJBQXVCLEdBQUcsQ0FBQyxRQUFRLEVBQUUsc0JBQXNCLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxLQUFLLENBQ3ZGLENBQUM7SUFDSixDQUFDO0FBQ0gsQ0FBQztBQUVNLEtBQUssVUFBVSxpQkFBaUIsQ0FNNUIsT0FBVSxFQUFFLElBQU8sRUFBRSxHQUFZLEVBQUUsS0FBUTtJQUNwRCxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQztRQUFFLE9BQU87SUFDeEIsSUFBSSxPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxRQUFRO1FBQUUsT0FBTztJQUUzQyxJQUFJLENBQUM7UUFDSCxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBQUMsT0FBTyxDQUFVLEVBQUUsQ0FBQztRQUNwQixNQUFNLElBQUksMkJBQWtCLENBQzFCLHlCQUF5QixHQUFHLENBQUMsUUFBUSxFQUFFLHNCQUFzQixLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksS0FBSyxDQUFDLEVBQUUsQ0FDNUYsQ0FBQztJQUNKLENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILFNBQWdCLFNBQVM7SUFDdkIsT0FBTyxJQUFBLGtCQUFLLEVBQ1YsSUFBQSwyQkFBYyxFQUFDLHVCQUF1QixDQUFDLEVBQ3ZDLElBQUEsa0JBQUssRUFBQyx3QkFBWSxDQUFDLEdBQUcsRUFBRSxpQkFBaUIsQ0FBQyxFQUMxQyxJQUFBLDJCQUFJLEVBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUNoQyxJQUFBLHFCQUFRLEVBQUMsdUJBQVUsQ0FBQyxHQUFHLENBQUMsa0JBQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FDL0MsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXCIuL3ZhbGlkYXRpb25cIjtcbmltcG9ydCB7XG4gIGRhdGUsXG4gIERlY29yYXRpb24sXG4gIE1vZGVsLFxuICBwcm9wTWV0YWRhdGEsXG4gIHJlcXVpcmVkLFxuICB0eXBlLFxuICBWYWxpZGF0aW9uLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBEQktleXMsIERFRkFVTFRfVElNRVNUQU1QX0ZPUk1BVCB9IGZyb20gXCIuLi9tb2RlbC9jb25zdGFudHNcIjtcbmltcG9ydCB7IERFRkFVTFRfRVJST1JfTUVTU0FHRVMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IERCT3BlcmF0aW9ucywgT3BlcmF0aW9uS2V5cyB9IGZyb20gXCIuLi9vcGVyYXRpb25zL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgYWZ0ZXIsIG9uLCBvbkNyZWF0ZVVwZGF0ZSB9IGZyb20gXCIuLi9vcGVyYXRpb25zL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IElSZXBvc2l0b3J5IH0gZnJvbSBcIi4uL2ludGVyZmFjZXMvSVJlcG9zaXRvcnlcIjtcbmltcG9ydCB7IFNlcmlhbGl6YXRpb25FcnJvciB9IGZyb20gXCIuLi9yZXBvc2l0b3J5L2Vycm9yc1wiO1xuaW1wb3J0IHsgYXBwbHksIG1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBSZXBvc2l0b3J5IH0gZnJvbSBcIi4uL3JlcG9zaXRvcnlcIjtcbmltcG9ydCB7IENvbnRleHQgfSBmcm9tIFwiLi4vcmVwb3NpdG9yeS9Db250ZXh0XCI7XG5pbXBvcnQgeyBSZXBvc2l0b3J5RmxhZ3MgfSBmcm9tIFwiLi4vcmVwb3NpdG9yeS90eXBlc1wiO1xuXG4vKipcbiAqIE1hcmtzIHRoZSBwcm9wZXJ0eSBhcyByZWFkb25seS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIHRoZSBlcnJvciBtZXNzYWdlLiBEZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5SRUFET05MWS5JTlZBTElEfVxuICpcbiAqIEBkZWNvcmF0b3IgcmVhZG9ubHlcbiAqXG4gKiBAY2F0ZWdvcnkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZG9ubHkoXG4gIG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuUkVBRE9OTFkuSU5WQUxJRFxuKSB7XG4gIGNvbnN0IGtleSA9IFZhbGlkYXRpb24udXBkYXRlS2V5KERCS2V5cy5SRUFET05MWSk7XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZShcbiAgICAgIHByb3BNZXRhZGF0YShrZXksIHtcbiAgICAgICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICAgIH0pXG4gICAgKVxuICAgIC5hcHBseSgpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGltZXN0YW1wSGFuZGxlcjxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgSVJlcG9zaXRvcnk8TSwgRiwgQz4sXG4gIFYsXG4gIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MgPSBSZXBvc2l0b3J5RmxhZ3MsXG4gIEMgZXh0ZW5kcyBDb250ZXh0PEY+ID0gQ29udGV4dDxGPixcbj4odGhpczogUiwgY29udGV4dDogQywgZGF0YTogViwga2V5OiBrZXlvZiBNLCBtb2RlbDogTSk6IFByb21pc2U8dm9pZD4ge1xuICAobW9kZWwgYXMgYW55KVtrZXldID0gY29udGV4dC50aW1lc3RhbXA7XG59XG5cbi8qKlxuICogTWFya3MgdGhlIHByb3BlcnR5IGFzIHRpbWVzdGFtcC5cbiAqIE1ha2VzIGl0IHtAbGluayByZXF1aXJlZH1cbiAqIE1ha2VzIGl0IGEge0BsaW5rIGRhdGV9XG4gKlxuICogRGF0ZSBGb3JtYXQ6XG4gKlxuICogPHByZT5cbiAqICAgICAgVXNpbmcgc2ltaWxhciBmb3JtYXR0aW5nIGFzIE1vbWVudC5qcywgQ2xhc3MgRGF0ZVRpbWVGb3JtYXR0ZXIgKEphdmEpLCBhbmQgQ2xhc3MgU2ltcGxlRGF0ZUZvcm1hdCAoSmF2YSksXG4gKiAgICAgIEkgaW1wbGVtZW50ZWQgYSBjb21wcmVoZW5zaXZlIHNvbHV0aW9uIGZvcm1hdERhdGUoZGF0ZSwgcGF0dGVyblN0cikgd2hlcmUgdGhlIGNvZGUgaXMgZWFzeSB0byByZWFkIGFuZCBtb2RpZnkuXG4gKiAgICAgIFlvdSBjYW4gZGlzcGxheSBkYXRlLCB0aW1lLCBBTS9QTSwgZXRjLlxuICpcbiAqICAgICAgRGF0ZSBhbmQgVGltZSBQYXR0ZXJuc1xuICogICAgICB5eSA9IDItZGlnaXQgeWVhcjsgeXl5eSA9IGZ1bGwgeWVhclxuICogICAgICBNID0gZGlnaXQgbW9udGg7IE1NID0gMi1kaWdpdCBtb250aDsgTU1NID0gc2hvcnQgbW9udGggbmFtZTsgTU1NTSA9IGZ1bGwgbW9udGggbmFtZVxuICogICAgICBFRUVFID0gZnVsbCB3ZWVrZGF5IG5hbWU7IEVFRSA9IHNob3J0IHdlZWtkYXkgbmFtZVxuICogICAgICBkID0gZGlnaXQgZGF5OyBkZCA9IDItZGlnaXQgZGF5XG4gKiAgICAgIGggPSBob3VycyBhbS9wbTsgaGggPSAyLWRpZ2l0IGhvdXJzIGFtL3BtOyBIID0gaG91cnM7IEhIID0gMi1kaWdpdCBob3Vyc1xuICogICAgICBtID0gbWludXRlczsgbW0gPSAyLWRpZ2l0IG1pbnV0ZXM7IGFhYSA9IEFNL1BNXG4gKiAgICAgIHMgPSBzZWNvbmRzOyBzcyA9IDItZGlnaXQgc2Vjb25kc1xuICogICAgICBTID0gbWlsaXNlY29uZHNcbiAqIDwvcHJlPlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nW119IG9wZXJhdGlvbiBUaGUge0BsaW5rIERCT3BlcmF0aW9uc30gdG8gYWN0IG9uLiBEZWZhdWx0cyB0byB7QGxpbmsgREJPcGVyYXRpb25zLkNSRUFURV9VUERBVEV9XG4gKiBAcGFyYW0ge3N0cmluZ30gW2Zvcm1hdF0gVGhlIFRpbWVTdGFtcCBmb3JtYXQuIGRlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX1RJTUVTVEFNUF9GT1JNQVR9XG4gKiBAcGFyYW0ge3tuZXc6IFVwZGF0ZVZhbGlkYXRvcn19IFt2YWxpZGF0b3JdIGRlZmF1bHRzIHRvIHtAbGluayBUaW1lc3RhbXBWYWxpZGF0b3J9XG4gKlxuICogQGRlY29yYXRvciB0aW1lc3RhbXBcbiAqXG4gKiBAY2F0ZWdvcnkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdGltZXN0YW1wKFxuICBvcGVyYXRpb246IE9wZXJhdGlvbktleXNbXSA9IERCT3BlcmF0aW9ucy5DUkVBVEVfVVBEQVRFIGFzIHVua25vd24gYXMgT3BlcmF0aW9uS2V5c1tdLFxuICBmb3JtYXQ6IHN0cmluZyA9IERFRkFVTFRfVElNRVNUQU1QX0ZPUk1BVFxuKSB7XG4gIGNvbnN0IGtleSA9IFZhbGlkYXRpb24udXBkYXRlS2V5KERCS2V5cy5USU1FU1RBTVApO1xuXG4gIGNvbnN0IGRlY29yYXRvcnM6IGFueVtdID0gW1xuICAgIGRhdGUoZm9ybWF0LCBERUZBVUxUX0VSUk9SX01FU1NBR0VTLlRJTUVTVEFNUC5EQVRFKSxcbiAgICByZXF1aXJlZChERUZBVUxUX0VSUk9SX01FU1NBR0VTLlRJTUVTVEFNUC5SRVFVSVJFRCksXG4gICAgb24ob3BlcmF0aW9uLCB0aW1lc3RhbXBIYW5kbGVyKSxcbiAgXTtcblxuICBpZiAob3BlcmF0aW9uLmluZGV4T2YoT3BlcmF0aW9uS2V5cy5VUERBVEUpICE9PSAtMSlcbiAgICBkZWNvcmF0b3JzLnB1c2goXG4gICAgICBwcm9wTWV0YWRhdGEoVmFsaWRhdGlvbi51cGRhdGVLZXkoREJLZXlzLlRJTUVTVEFNUCksIHtcbiAgICAgICAgbWVzc2FnZTogREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5USU1FU1RBTVAuSU5WQUxJRCxcbiAgICAgIH0pXG4gICAgKTtcbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKC4uLmRlY29yYXRvcnMpXG4gICAgLmFwcGx5KCk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXJpYWxpemVPbkNyZWF0ZVVwZGF0ZTxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgSVJlcG9zaXRvcnk8TSwgRiwgQz4sXG4gIFYsXG4gIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MgPSBSZXBvc2l0b3J5RmxhZ3MsXG4gIEMgZXh0ZW5kcyBDb250ZXh0PEY+ID0gQ29udGV4dDxGPixcbj4odGhpczogUiwgY29udGV4dDogQywgZGF0YTogViwga2V5OiBrZXlvZiBNLCBtb2RlbDogTSk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIW1vZGVsW2tleV0pIHJldHVybjtcbiAgdHJ5IHtcbiAgICBtb2RlbFtrZXldID0gSlNPTi5zdHJpbmdpZnkobW9kZWxba2V5XSkgYXMgTVtrZXlvZiBNXTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKFxuICAgICAgYEZhaWxlZCB0byBzZXJpYWxpemUgJHtrZXkudG9TdHJpbmcoKX0gcHJvcGVydHkgb2YgbW9kZWwgJHttb2RlbC5jb25zdHJ1Y3Rvci5uYW1lfTogZWBcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXJpYWxpemVBZnRlckFsbDxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgSVJlcG9zaXRvcnk8TSwgRiwgQz4sXG4gIFYsXG4gIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MgPSBSZXBvc2l0b3J5RmxhZ3MsXG4gIEMgZXh0ZW5kcyBDb250ZXh0PEY+ID0gQ29udGV4dDxGPixcbj4odGhpczogUiwgY29udGV4dDogQywgZGF0YTogViwga2V5OiBrZXlvZiBNLCBtb2RlbDogTSk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIW1vZGVsW2tleV0pIHJldHVybjtcbiAgaWYgKHR5cGVvZiBtb2RlbFtrZXldICE9PSBcInN0cmluZ1wiKSByZXR1cm47XG5cbiAgdHJ5IHtcbiAgICBtb2RlbFtrZXldID0gSlNPTi5wYXJzZShtb2RlbFtrZXldKTtcbiAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoXG4gICAgICBgRmFpbGVkIHRvIGRlc2VyaWFsaXplICR7a2V5LnRvU3RyaW5nKCl9IHByb3BlcnR5IG9mIG1vZGVsICR7bW9kZWwuY29uc3RydWN0b3IubmFtZX06ICR7ZX1gXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIEBzdW1tYXJ5IFNlcmlhbGl6ZSBEZWNvcmF0b3JcbiAqIEBkZXNjcmlwdGlvbiBwcm9wZXJ0aWVzIGRlY29yYXRlZCB3aWxsIHRoZSBzZXJpYWxpemVkIGJlZm9yZSBzdG9yZWQgaW4gdGhlIGRiXG4gKlxuICogQGZ1bmN0aW9uIHNlcmlhbGl6ZVxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6d2FsbGV0LWRiLkRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZSgpIHtcbiAgcmV0dXJuIGFwcGx5KFxuICAgIG9uQ3JlYXRlVXBkYXRlKHNlcmlhbGl6ZU9uQ3JlYXRlVXBkYXRlKSxcbiAgICBhZnRlcihEQk9wZXJhdGlvbnMuQUxMLCBzZXJpYWxpemVBZnRlckFsbCksXG4gICAgdHlwZShbU3RyaW5nLm5hbWUsIE9iamVjdC5uYW1lXSksXG4gICAgbWV0YWRhdGEoUmVwb3NpdG9yeS5rZXkoREJLZXlzLlNFUklBTElaRSksIHt9KVxuICApO1xufVxuIl19
|
|
200
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy92YWxpZGF0aW9uL2RlY29yYXRvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUE2QkEsNEJBV0M7QUFrQkQsNENBUUM7QUFpREQsOEJBcUJDO0FBa0JELDBEQWdCQztBQWtCRCw4Q0FpQkM7QUE2QkQsOEJBT0M7QUFqUEQsNEJBQXNCO0FBQ3RCLHlFQVF3QztBQUN4Qyx3REFBc0U7QUFDdEUsK0NBQXFEO0FBQ3JELDZEQUFzRTtBQUN0RSwrREFBcUU7QUFFckUsdURBQTBEO0FBQzFELHFEQUF1RDtBQUN2RCwwREFBMkM7QUFJM0M7Ozs7Ozs7R0FPRztBQUNILFNBQWdCLFFBQVEsQ0FDdEIsVUFBa0Isa0NBQXNCLENBQUMsUUFBUSxDQUFDLE9BQU87SUFFekQsTUFBTSxHQUFHLEdBQUcsaUNBQVUsQ0FBQyxTQUFTLENBQUMsa0JBQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNsRCxPQUFPLGlDQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztTQUN2QixNQUFNLENBQ0wsSUFBQSxtQ0FBWSxFQUFDLEdBQUcsRUFBRTtRQUNoQixPQUFPLEVBQUUsT0FBTztLQUNqQixDQUFDLENBQ0g7U0FDQSxLQUFLLEVBQUUsQ0FBQztBQUNiLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSSxLQUFLLFVBQVUsZ0JBQWdCLENBTTNCLE9BQVUsRUFBRSxJQUFPLEVBQUUsR0FBWSxFQUFFLEtBQVE7SUFDbkQsS0FBYSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUM7QUFDMUMsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBOENHO0FBQ0gsU0FBZ0IsU0FBUyxDQUN2QixZQUE2Qix3QkFBWSxDQUFDLGFBQTJDLEVBQ3JGLFNBQWlCLG9DQUF3QjtJQUV6QyxNQUFNLEdBQUcsR0FBRyxpQ0FBVSxDQUFDLFNBQVMsQ0FBQyxrQkFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBRW5ELE1BQU0sVUFBVSxHQUFVO1FBQ3hCLElBQUEsMkJBQUksRUFBQyxNQUFNLEVBQUUsa0NBQXNCLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQztRQUNuRCxJQUFBLCtCQUFRLEVBQUMsa0NBQXNCLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQztRQUNuRCxJQUFBLGVBQUUsRUFBQyxTQUFTLEVBQUUsZ0JBQWdCLENBQUM7S0FDaEMsQ0FBQztJQUVGLElBQUksU0FBUyxDQUFDLE9BQU8sQ0FBQyx5QkFBYSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNoRCxVQUFVLENBQUMsSUFBSSxDQUNiLElBQUEsbUNBQVksRUFBQyxpQ0FBVSxDQUFDLFNBQVMsQ0FBQyxrQkFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQ25ELE9BQU8sRUFBRSxrQ0FBc0IsQ0FBQyxTQUFTLENBQUMsT0FBTztTQUNsRCxDQUFDLENBQ0gsQ0FBQztJQUNKLE9BQU8saUNBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO1NBQ3ZCLE1BQU0sQ0FBQyxHQUFHLFVBQVUsQ0FBQztTQUNyQixLQUFLLEVBQUUsQ0FBQztBQUNiLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSSxLQUFLLFVBQVUsdUJBQXVCLENBTWxDLE9BQVUsRUFBRSxJQUFPLEVBQUUsR0FBWSxFQUFFLEtBQVE7SUFDcEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUM7UUFBRSxPQUFPO0lBQ3hCLElBQUksQ0FBQztRQUNILEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBZSxDQUFDO1FBQ3RELDZEQUE2RDtJQUMvRCxDQUFDO0lBQUMsT0FBTyxDQUFVLEVBQUUsQ0FBQztRQUNwQixNQUFNLElBQUksMkJBQWtCLENBQzFCLHVCQUF1QixHQUFHLENBQUMsUUFBUSxFQUFFLHNCQUFzQixLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksS0FBSyxDQUN2RixDQUFDO0lBQ0osQ0FBQztBQUNILENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSSxLQUFLLFVBQVUsaUJBQWlCLENBTTVCLE9BQVUsRUFBRSxJQUFPLEVBQUUsR0FBWSxFQUFFLEtBQVE7SUFDcEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUM7UUFBRSxPQUFPO0lBQ3hCLElBQUksT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssUUFBUTtRQUFFLE9BQU87SUFFM0MsSUFBSSxDQUFDO1FBQ0gsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUFDLE9BQU8sQ0FBVSxFQUFFLENBQUM7UUFDcEIsTUFBTSxJQUFJLDJCQUFrQixDQUMxQix5QkFBeUIsR0FBRyxDQUFDLFFBQVEsRUFBRSxzQkFBc0IsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFLENBQzVGLENBQUM7SUFDSixDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBCRztBQUNILFNBQWdCLFNBQVM7SUFDdkIsT0FBTyxJQUFBLGtCQUFLLEVBQ1YsSUFBQSwyQkFBYyxFQUFDLHVCQUF1QixDQUFDLEVBQ3ZDLElBQUEsa0JBQUssRUFBQyx3QkFBWSxDQUFDLEdBQUcsRUFBRSxpQkFBaUIsQ0FBQyxFQUMxQyxJQUFBLDJCQUFJLEVBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUNoQyxJQUFBLHFCQUFRLEVBQUMsdUJBQVUsQ0FBQyxHQUFHLENBQUMsa0JBQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FDL0MsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXCIuL3ZhbGlkYXRpb25cIjtcbmltcG9ydCB7XG4gIGRhdGUsXG4gIERlY29yYXRpb24sXG4gIE1vZGVsLFxuICBwcm9wTWV0YWRhdGEsXG4gIHJlcXVpcmVkLFxuICB0eXBlLFxuICBWYWxpZGF0aW9uLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBEQktleXMsIERFRkFVTFRfVElNRVNUQU1QX0ZPUk1BVCB9IGZyb20gXCIuLi9tb2RlbC9jb25zdGFudHNcIjtcbmltcG9ydCB7IERFRkFVTFRfRVJST1JfTUVTU0FHRVMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IERCT3BlcmF0aW9ucywgT3BlcmF0aW9uS2V5cyB9IGZyb20gXCIuLi9vcGVyYXRpb25zL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgYWZ0ZXIsIG9uLCBvbkNyZWF0ZVVwZGF0ZSB9IGZyb20gXCIuLi9vcGVyYXRpb25zL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IElSZXBvc2l0b3J5IH0gZnJvbSBcIi4uL2ludGVyZmFjZXMvSVJlcG9zaXRvcnlcIjtcbmltcG9ydCB7IFNlcmlhbGl6YXRpb25FcnJvciB9IGZyb20gXCIuLi9yZXBvc2l0b3J5L2Vycm9yc1wiO1xuaW1wb3J0IHsgYXBwbHksIG1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBSZXBvc2l0b3J5IH0gZnJvbSBcIi4uL3JlcG9zaXRvcnlcIjtcbmltcG9ydCB7IENvbnRleHQgfSBmcm9tIFwiLi4vcmVwb3NpdG9yeS9Db250ZXh0XCI7XG5pbXBvcnQgeyBSZXBvc2l0b3J5RmxhZ3MgfSBmcm9tIFwiLi4vcmVwb3NpdG9yeS90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBQcmV2ZW50cyBhIHByb3BlcnR5IGZyb20gYmVpbmcgbW9kaWZpZWQgYWZ0ZXIgaW5pdGlhbCBjcmVhdGlvbi5cbiAqIEBzdW1tYXJ5IE1hcmtzIHRoZSBwcm9wZXJ0eSBhcyByZWFkb25seSwgY2F1c2luZyB2YWxpZGF0aW9uIGVycm9ycyBpZiBhdHRlbXB0cyBhcmUgbWFkZSB0byBtb2RpZnkgaXQgZHVyaW5nIHVwZGF0ZXMuXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIC0gVGhlIGVycm9yIG1lc3NhZ2UgdG8gZGlzcGxheSB3aGVuIHZhbGlkYXRpb24gZmFpbHMuIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTLlJFQURPTkxZLklOVkFMSUR9XG4gKiBAcmV0dXJuIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBjYW4gYmUgYXBwbGllZCB0byBjbGFzcyBwcm9wZXJ0aWVzXG4gKiBAZnVuY3Rpb24gcmVhZG9ubHlcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkb25seShcbiAgbWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5SRUFET05MWS5JTlZBTElEXG4pIHtcbiAgY29uc3Qga2V5ID0gVmFsaWRhdGlvbi51cGRhdGVLZXkoREJLZXlzLlJFQURPTkxZKTtcbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKFxuICAgICAgcHJvcE1ldGFkYXRhKGtleSwge1xuICAgICAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgICAgfSlcbiAgICApXG4gICAgLmFwcGx5KCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEhhbmRsZXIgZnVuY3Rpb24gdGhhdCBzZXRzIGEgdGltZXN0YW1wIHByb3BlcnR5IHRvIHRoZSBjdXJyZW50IHRpbWVzdGFtcC5cbiAqIEBzdW1tYXJ5IFVwZGF0ZXMgYSBtb2RlbCBwcm9wZXJ0eSB3aXRoIHRoZSBjdXJyZW50IHRpbWVzdGFtcCBmcm9tIHRoZSByZXBvc2l0b3J5IGNvbnRleHQuXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHRlbXBsYXRlIFIgLSBUaGUgcmVwb3NpdG9yeSB0eXBlIGV4dGVuZGluZyBJUmVwb3NpdG9yeVxuICogQHRlbXBsYXRlIFYgLSBUaGUgZGF0YSB0eXBlIGZvciB0aGUgb3BlcmF0aW9uXG4gKiBAdGVtcGxhdGUgRiAtIFRoZSByZXBvc2l0b3J5IGZsYWdzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBDIC0gVGhlIGNvbnRleHQgdHlwZVxuICogQHBhcmFtIHtDfSBjb250ZXh0IC0gVGhlIHJlcG9zaXRvcnkgY29udGV4dCBjb250YWluaW5nIHRoZSBjdXJyZW50IHRpbWVzdGFtcFxuICogQHBhcmFtIHtWfSBkYXRhIC0gVGhlIGRhdGEgYmVpbmcgcHJvY2Vzc2VkXG4gKiBAcGFyYW0ga2V5IC0gVGhlIHByb3BlcnR5IGtleSB0byB1cGRhdGVcbiAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UgYmVpbmcgdXBkYXRlZFxuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgdGltZXN0YW1wIGhhcyBiZWVuIHNldFxuICogQGZ1bmN0aW9uIHRpbWVzdGFtcEhhbmRsZXJcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGItZGVjb3JhdG9yc1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGltZXN0YW1wSGFuZGxlcjxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgSVJlcG9zaXRvcnk8TSwgRiwgQz4sXG4gIFYsXG4gIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MgPSBSZXBvc2l0b3J5RmxhZ3MsXG4gIEMgZXh0ZW5kcyBDb250ZXh0PEY+ID0gQ29udGV4dDxGPixcbj4odGhpczogUiwgY29udGV4dDogQywgZGF0YTogViwga2V5OiBrZXlvZiBNLCBtb2RlbDogTSk6IFByb21pc2U8dm9pZD4ge1xuICAobW9kZWwgYXMgYW55KVtrZXldID0gY29udGV4dC50aW1lc3RhbXA7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEF1dG9tYXRpY2FsbHkgbWFuYWdlcyB0aW1lc3RhbXAgcHJvcGVydGllcyBmb3IgdHJhY2tpbmcgY3JlYXRpb24gYW5kIHVwZGF0ZSB0aW1lcy5cbiAqIEBzdW1tYXJ5IE1hcmtzIHRoZSBwcm9wZXJ0eSBhcyBhIHRpbWVzdGFtcCwgbWFraW5nIGl0IHJlcXVpcmVkIGFuZCBlbnN1cmluZyBpdCdzIGEgdmFsaWQgZGF0ZS4gVGhlIHByb3BlcnR5IHdpbGwgYmUgYXV0b21hdGljYWxseSB1cGRhdGVkIHdpdGggdGhlIGN1cnJlbnQgdGltZXN0YW1wIGR1cmluZyBzcGVjaWZpZWQgb3BlcmF0aW9ucy5cbiAqXG4gKiBEYXRlIEZvcm1hdDpcbiAqXG4gKiA8cHJlPlxuICogICAgICBVc2luZyBzaW1pbGFyIGZvcm1hdHRpbmcgYXMgTW9tZW50LmpzLCBDbGFzcyBEYXRlVGltZUZvcm1hdHRlciAoSmF2YSksIGFuZCBDbGFzcyBTaW1wbGVEYXRlRm9ybWF0IChKYXZhKSxcbiAqICAgICAgSSBpbXBsZW1lbnRlZCBhIGNvbXByZWhlbnNpdmUgc29sdXRpb24gZm9ybWF0RGF0ZShkYXRlLCBwYXR0ZXJuU3RyKSB3aGVyZSB0aGUgY29kZSBpcyBlYXN5IHRvIHJlYWQgYW5kIG1vZGlmeS5cbiAqICAgICAgWW91IGNhbiBkaXNwbGF5IGRhdGUsIHRpbWUsIEFNL1BNLCBldGMuXG4gKlxuICogICAgICBEYXRlIGFuZCBUaW1lIFBhdHRlcm5zXG4gKiAgICAgIHl5ID0gMi1kaWdpdCB5ZWFyOyB5eXl5ID0gZnVsbCB5ZWFyXG4gKiAgICAgIE0gPSBkaWdpdCBtb250aDsgTU0gPSAyLWRpZ2l0IG1vbnRoOyBNTU0gPSBzaG9ydCBtb250aCBuYW1lOyBNTU1NID0gZnVsbCBtb250aCBuYW1lXG4gKiAgICAgIEVFRUUgPSBmdWxsIHdlZWtkYXkgbmFtZTsgRUVFID0gc2hvcnQgd2Vla2RheSBuYW1lXG4gKiAgICAgIGQgPSBkaWdpdCBkYXk7IGRkID0gMi1kaWdpdCBkYXlcbiAqICAgICAgaCA9IGhvdXJzIGFtL3BtOyBoaCA9IDItZGlnaXQgaG91cnMgYW0vcG07IEggPSBob3VyczsgSEggPSAyLWRpZ2l0IGhvdXJzXG4gKiAgICAgIG0gPSBtaW51dGVzOyBtbSA9IDItZGlnaXQgbWludXRlczsgYWFhID0gQU0vUE1cbiAqICAgICAgcyA9IHNlY29uZHM7IHNzID0gMi1kaWdpdCBzZWNvbmRzXG4gKiAgICAgIFMgPSBtaWxpc2Vjb25kc1xuICogPC9wcmU+XG4gKlxuICogQHBhcmFtIHtPcGVyYXRpb25LZXlzW119IG9wZXJhdGlvbiAtIFRoZSBvcGVyYXRpb25zIHRvIGFjdCBvbi4gRGVmYXVsdHMgdG8ge0BsaW5rIERCT3BlcmF0aW9ucy5DUkVBVEVfVVBEQVRFfVxuICogQHBhcmFtIHtzdHJpbmd9IFtmb3JtYXRdIC0gVGhlIHRpbWVzdGFtcCBmb3JtYXQuIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX1RJTUVTVEFNUF9GT1JNQVR9XG4gKiBAcmV0dXJuIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBjYW4gYmUgYXBwbGllZCB0byBjbGFzcyBwcm9wZXJ0aWVzXG4gKiBAZnVuY3Rpb24gdGltZXN0YW1wXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDIGFzIENsaWVudFxuICogICBwYXJ0aWNpcGFudCBNIGFzIE1vZGVsXG4gKiAgIHBhcnRpY2lwYW50IFQgYXMgVGltZXN0YW1wRGVjb3JhdG9yXG4gKiAgIHBhcnRpY2lwYW50IFYgYXMgVmFsaWRhdG9yXG4gKlxuICogICBDLT4+TTogQ3JlYXRlL1VwZGF0ZSBtb2RlbFxuICogICBNLT4+VDogUHJvY2VzcyB0aW1lc3RhbXAgcHJvcGVydHlcbiAqICAgVC0+Pk06IEFwcGx5IHJlcXVpcmVkIHZhbGlkYXRpb25cbiAqICAgVC0+Pk06IEFwcGx5IGRhdGUgZm9ybWF0IHZhbGlkYXRpb25cbiAqXG4gKiAgIGFsdCBVcGRhdGUgb3BlcmF0aW9uXG4gKiAgICAgVC0+PlY6IFJlZ2lzdGVyIHRpbWVzdGFtcCB2YWxpZGF0b3JcbiAqICAgICBWLT4+TTogVmFsaWRhdGUgdGltZXN0YW1wIGlzIG5ld2VyXG4gKiAgIGVuZFxuICpcbiAqICAgVC0+Pk06IFNldCBjdXJyZW50IHRpbWVzdGFtcFxuICogICBNLT4+QzogUmV0dXJuIHVwZGF0ZWQgbW9kZWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRpbWVzdGFtcChcbiAgb3BlcmF0aW9uOiBPcGVyYXRpb25LZXlzW10gPSBEQk9wZXJhdGlvbnMuQ1JFQVRFX1VQREFURSBhcyB1bmtub3duIGFzIE9wZXJhdGlvbktleXNbXSxcbiAgZm9ybWF0OiBzdHJpbmcgPSBERUZBVUxUX1RJTUVTVEFNUF9GT1JNQVRcbikge1xuICBjb25zdCBrZXkgPSBWYWxpZGF0aW9uLnVwZGF0ZUtleShEQktleXMuVElNRVNUQU1QKTtcblxuICBjb25zdCBkZWNvcmF0b3JzOiBhbnlbXSA9IFtcbiAgICBkYXRlKGZvcm1hdCwgREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5USU1FU1RBTVAuREFURSksXG4gICAgcmVxdWlyZWQoREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5USU1FU1RBTVAuUkVRVUlSRUQpLFxuICAgIG9uKG9wZXJhdGlvbiwgdGltZXN0YW1wSGFuZGxlciksXG4gIF07XG5cbiAgaWYgKG9wZXJhdGlvbi5pbmRleE9mKE9wZXJhdGlvbktleXMuVVBEQVRFKSAhPT0gLTEpXG4gICAgZGVjb3JhdG9ycy5wdXNoKFxuICAgICAgcHJvcE1ldGFkYXRhKFZhbGlkYXRpb24udXBkYXRlS2V5KERCS2V5cy5USU1FU1RBTVApLCB7XG4gICAgICAgIG1lc3NhZ2U6IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuVElNRVNUQU1QLklOVkFMSUQsXG4gICAgICB9KVxuICAgICk7XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZSguLi5kZWNvcmF0b3JzKVxuICAgIC5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBIYW5kbGVyIGZ1bmN0aW9uIHRoYXQgc2VyaWFsaXplcyBhIHByb3BlcnR5IHRvIEpTT04gc3RyaW5nIGR1cmluZyBjcmVhdGUgYW5kIHVwZGF0ZSBvcGVyYXRpb25zLlxuICogQHN1bW1hcnkgQ29udmVydHMgYSBjb21wbGV4IG9iamVjdCBwcm9wZXJ0eSB0byBhIEpTT04gc3RyaW5nIGJlZm9yZSBzdG9yaW5nIGl0IGluIHRoZSBkYXRhYmFzZS5cbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gKiBAdGVtcGxhdGUgUiAtIFRoZSByZXBvc2l0b3J5IHR5cGUgZXh0ZW5kaW5nIElSZXBvc2l0b3J5XG4gKiBAdGVtcGxhdGUgViAtIFRoZSBkYXRhIHR5cGUgZm9yIHRoZSBvcGVyYXRpb25cbiAqIEB0ZW1wbGF0ZSBGIC0gVGhlIHJlcG9zaXRvcnkgZmxhZ3MgdHlwZVxuICogQHRlbXBsYXRlIEMgLSBUaGUgY29udGV4dCB0eXBlXG4gKiBAcGFyYW0ge0N9IGNvbnRleHQgLSBUaGUgcmVwb3NpdG9yeSBjb250ZXh0XG4gKiBAcGFyYW0ge1Z9IGRhdGEgLSBUaGUgZGF0YSBiZWluZyBwcm9jZXNzZWRcbiAqIEBwYXJhbSBrZXkgLSBUaGUgcHJvcGVydHkga2V5IHRvIHNlcmlhbGl6ZVxuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSBiZWluZyBwcm9jZXNzZWRcbiAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHByb3BlcnR5IGhhcyBiZWVuIHNlcmlhbGl6ZWRcbiAqIEBmdW5jdGlvbiBzZXJpYWxpemVPbkNyZWF0ZVVwZGF0ZVxuICogQG1lbWJlck9mIG1vZHVsZTpkYi1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXJpYWxpemVPbkNyZWF0ZVVwZGF0ZTxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgSVJlcG9zaXRvcnk8TSwgRiwgQz4sXG4gIFYsXG4gIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MgPSBSZXBvc2l0b3J5RmxhZ3MsXG4gIEMgZXh0ZW5kcyBDb250ZXh0PEY+ID0gQ29udGV4dDxGPixcbj4odGhpczogUiwgY29udGV4dDogQywgZGF0YTogViwga2V5OiBrZXlvZiBNLCBtb2RlbDogTSk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIW1vZGVsW2tleV0pIHJldHVybjtcbiAgdHJ5IHtcbiAgICBtb2RlbFtrZXldID0gSlNPTi5zdHJpbmdpZnkobW9kZWxba2V5XSkgYXMgTVtrZXlvZiBNXTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKFxuICAgICAgYEZhaWxlZCB0byBzZXJpYWxpemUgJHtrZXkudG9TdHJpbmcoKX0gcHJvcGVydHkgb2YgbW9kZWwgJHttb2RlbC5jb25zdHJ1Y3Rvci5uYW1lfTogZWBcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEhhbmRsZXIgZnVuY3Rpb24gdGhhdCBkZXNlcmlhbGl6ZXMgYSBwcm9wZXJ0eSBmcm9tIEpTT04gc3RyaW5nIGFmdGVyIGRhdGFiYXNlIG9wZXJhdGlvbnMuXG4gKiBAc3VtbWFyeSBDb252ZXJ0cyBhIEpTT04gc3RyaW5nIHByb3BlcnR5IGJhY2sgdG8gaXRzIG9yaWdpbmFsIGNvbXBsZXggb2JqZWN0IGZvcm0gYWZ0ZXIgcmV0cmlldmluZyBpdCBmcm9tIHRoZSBkYXRhYmFzZS5cbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gKiBAdGVtcGxhdGUgUiAtIFRoZSByZXBvc2l0b3J5IHR5cGUgZXh0ZW5kaW5nIElSZXBvc2l0b3J5XG4gKiBAdGVtcGxhdGUgViAtIFRoZSBkYXRhIHR5cGUgZm9yIHRoZSBvcGVyYXRpb25cbiAqIEB0ZW1wbGF0ZSBGIC0gVGhlIHJlcG9zaXRvcnkgZmxhZ3MgdHlwZVxuICogQHRlbXBsYXRlIEMgLSBUaGUgY29udGV4dCB0eXBlXG4gKiBAcGFyYW0ge0N9IGNvbnRleHQgLSBUaGUgcmVwb3NpdG9yeSBjb250ZXh0XG4gKiBAcGFyYW0ge1Z9IGRhdGEgLSBUaGUgZGF0YSBiZWluZyBwcm9jZXNzZWRcbiAqIEBwYXJhbSBrZXkgLSBUaGUgcHJvcGVydHkga2V5IHRvIGRlc2VyaWFsaXplXG4gKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIGJlaW5nIHByb2Nlc3NlZFxuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgcHJvcGVydHkgaGFzIGJlZW4gZGVzZXJpYWxpemVkXG4gKiBAZnVuY3Rpb24gc2VyaWFsaXplQWZ0ZXJBbGxcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGItZGVjb3JhdG9yc1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VyaWFsaXplQWZ0ZXJBbGw8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIElSZXBvc2l0b3J5PE0sIEYsIEM+LFxuICBWLFxuICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzID0gUmVwb3NpdG9yeUZsYWdzLFxuICBDIGV4dGVuZHMgQ29udGV4dDxGPiA9IENvbnRleHQ8Rj4sXG4+KHRoaXM6IFIsIGNvbnRleHQ6IEMsIGRhdGE6IFYsIGtleToga2V5b2YgTSwgbW9kZWw6IE0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFtb2RlbFtrZXldKSByZXR1cm47XG4gIGlmICh0eXBlb2YgbW9kZWxba2V5XSAhPT0gXCJzdHJpbmdcIikgcmV0dXJuO1xuXG4gIHRyeSB7XG4gICAgbW9kZWxba2V5XSA9IEpTT04ucGFyc2UobW9kZWxba2V5XSk7XG4gIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKFxuICAgICAgYEZhaWxlZCB0byBkZXNlcmlhbGl6ZSAke2tleS50b1N0cmluZygpfSBwcm9wZXJ0eSBvZiBtb2RlbCAke21vZGVsLmNvbnN0cnVjdG9yLm5hbWV9OiAke2V9YFxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRW5hYmxlcyBhdXRvbWF0aWMgSlNPTiBzZXJpYWxpemF0aW9uIGFuZCBkZXNlcmlhbGl6YXRpb24gZm9yIGNvbXBsZXggb2JqZWN0IHByb3BlcnRpZXMuXG4gKiBAc3VtbWFyeSBEZWNvcmF0b3IgdGhhdCBhdXRvbWF0aWNhbGx5IGNvbnZlcnRzIGNvbXBsZXggb2JqZWN0cyB0byBKU09OIHN0cmluZ3MgYmVmb3JlIHN0b3JpbmcgaW4gdGhlIGRhdGFiYXNlIGFuZCBiYWNrIHRvIG9iamVjdHMgd2hlbiByZXRyaWV2aW5nIHRoZW0uXG4gKiBAcmV0dXJuIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBjYW4gYmUgYXBwbGllZCB0byBjbGFzcyBwcm9wZXJ0aWVzXG4gKiBAZnVuY3Rpb24gc2VyaWFsaXplXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDIGFzIENsaWVudFxuICogICBwYXJ0aWNpcGFudCBNIGFzIE1vZGVsXG4gKiAgIHBhcnRpY2lwYW50IFMgYXMgU2VyaWFsaXplRGVjb3JhdG9yXG4gKiAgIHBhcnRpY2lwYW50IERCIGFzIERhdGFiYXNlXG4gKlxuICogICBOb3RlIG92ZXIgQyxEQjogQ3JlYXRlL1VwZGF0ZSBGbG93XG4gKiAgIEMtPj5NOiBTZXQgY29tcGxleCBvYmplY3QgcHJvcGVydHlcbiAqICAgTS0+PlM6IFByb2Nlc3MgcHJvcGVydHkgKGNyZWF0ZS91cGRhdGUpXG4gKiAgIFMtPj5NOiBDb252ZXJ0IHRvIEpTT04gc3RyaW5nXG4gKiAgIE0tPj5EQjogU3RvcmUgc2VyaWFsaXplZCBkYXRhXG4gKlxuICogICBOb3RlIG92ZXIgQyxEQjogUmV0cmlldmFsIEZsb3dcbiAqICAgQy0+Pk06IFJlcXVlc3QgbW9kZWxcbiAqICAgTS0+PkRCOiBGZXRjaCBkYXRhXG4gKiAgIERCLT4+TTogUmV0dXJuIHdpdGggc2VyaWFsaXplZCBwcm9wZXJ0eVxuICogICBNLT4+UzogUHJvY2VzcyBwcm9wZXJ0eSAoYWZ0ZXIgYWxsIG9wcylcbiAqICAgUy0+Pk06IFBhcnNlIEpTT04gYmFjayB0byBvYmplY3RcbiAqICAgTS0+PkM6IFJldHVybiBtb2RlbCB3aXRoIGRlc2VyaWFsaXplZCBwcm9wZXJ0eVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplKCkge1xuICByZXR1cm4gYXBwbHkoXG4gICAgb25DcmVhdGVVcGRhdGUoc2VyaWFsaXplT25DcmVhdGVVcGRhdGUpLFxuICAgIGFmdGVyKERCT3BlcmF0aW9ucy5BTEwsIHNlcmlhbGl6ZUFmdGVyQWxsKSxcbiAgICB0eXBlKFtTdHJpbmcubmFtZSwgT2JqZWN0Lm5hbWVdKSxcbiAgICBtZXRhZGF0YShSZXBvc2l0b3J5LmtleShEQktleXMuU0VSSUFMSVpFKSwge30pXG4gICk7XG59XG4iXX0=
|
|
@@ -5,20 +5,34 @@ import { IRepository } from "../interfaces/IRepository";
|
|
|
5
5
|
import { Context } from "../repository/Context";
|
|
6
6
|
import { RepositoryFlags } from "../repository/types";
|
|
7
7
|
/**
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* @param {string} [message]
|
|
11
|
-
*
|
|
12
|
-
* @
|
|
13
|
-
*
|
|
14
|
-
* @category Decorators
|
|
8
|
+
* @description Prevents a property from being modified after initial creation.
|
|
9
|
+
* @summary Marks the property as readonly, causing validation errors if attempts are made to modify it during updates.
|
|
10
|
+
* @param {string} [message] - The error message to display when validation fails. Defaults to {@link DEFAULT_ERROR_MESSAGES.READONLY.INVALID}
|
|
11
|
+
* @return {PropertyDecorator} A decorator function that can be applied to class properties
|
|
12
|
+
* @function readonly
|
|
13
|
+
* @category Property Decorators
|
|
15
14
|
*/
|
|
16
15
|
export declare function readonly(message?: string): (target: any, propertyKey?: any, descriptor?: TypedPropertyDescriptor<any>) => any;
|
|
16
|
+
/**
|
|
17
|
+
* @description Handler function that sets a timestamp property to the current timestamp.
|
|
18
|
+
* @summary Updates a model property with the current timestamp from the repository context.
|
|
19
|
+
* @template M - The model type extending Model
|
|
20
|
+
* @template R - The repository type extending IRepository
|
|
21
|
+
* @template V - The data type for the operation
|
|
22
|
+
* @template F - The repository flags type
|
|
23
|
+
* @template C - The context type
|
|
24
|
+
* @param {C} context - The repository context containing the current timestamp
|
|
25
|
+
* @param {V} data - The data being processed
|
|
26
|
+
* @param key - The property key to update
|
|
27
|
+
* @param {M} model - The model instance being updated
|
|
28
|
+
* @return {Promise<void>} A promise that resolves when the timestamp has been set
|
|
29
|
+
* @function timestampHandler
|
|
30
|
+
* @memberOf module:db-decorators
|
|
31
|
+
*/
|
|
17
32
|
export declare function timestampHandler<M extends Model, R extends IRepository<M, F, C>, V, F extends RepositoryFlags = RepositoryFlags, C extends Context<F> = Context<F>>(this: R, context: C, data: V, key: keyof M, model: M): Promise<void>;
|
|
18
33
|
/**
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
* Makes it a {@link date}
|
|
34
|
+
* @description Automatically manages timestamp properties for tracking creation and update times.
|
|
35
|
+
* @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.
|
|
22
36
|
*
|
|
23
37
|
* Date Format:
|
|
24
38
|
*
|
|
@@ -38,23 +52,91 @@ export declare function timestampHandler<M extends Model, R extends IRepository<
|
|
|
38
52
|
* S = miliseconds
|
|
39
53
|
* </pre>
|
|
40
54
|
*
|
|
41
|
-
* @param {
|
|
42
|
-
* @param {string} [format] The
|
|
43
|
-
* @
|
|
55
|
+
* @param {OperationKeys[]} operation - The operations to act on. Defaults to {@link DBOperations.CREATE_UPDATE}
|
|
56
|
+
* @param {string} [format] - The timestamp format. Defaults to {@link DEFAULT_TIMESTAMP_FORMAT}
|
|
57
|
+
* @return {PropertyDecorator} A decorator function that can be applied to class properties
|
|
58
|
+
* @function timestamp
|
|
59
|
+
* @category Property Decorators
|
|
60
|
+
* @mermaid
|
|
61
|
+
* sequenceDiagram
|
|
62
|
+
* participant C as Client
|
|
63
|
+
* participant M as Model
|
|
64
|
+
* participant T as TimestampDecorator
|
|
65
|
+
* participant V as Validator
|
|
66
|
+
*
|
|
67
|
+
* C->>M: Create/Update model
|
|
68
|
+
* M->>T: Process timestamp property
|
|
69
|
+
* T->>M: Apply required validation
|
|
70
|
+
* T->>M: Apply date format validation
|
|
44
71
|
*
|
|
45
|
-
*
|
|
72
|
+
* alt Update operation
|
|
73
|
+
* T->>V: Register timestamp validator
|
|
74
|
+
* V->>M: Validate timestamp is newer
|
|
75
|
+
* end
|
|
46
76
|
*
|
|
47
|
-
*
|
|
77
|
+
* T->>M: Set current timestamp
|
|
78
|
+
* M->>C: Return updated model
|
|
48
79
|
*/
|
|
49
80
|
export declare function timestamp(operation?: OperationKeys[], format?: string): (target: any, propertyKey?: any, descriptor?: TypedPropertyDescriptor<any>) => any;
|
|
81
|
+
/**
|
|
82
|
+
* @description Handler function that serializes a property to JSON string during create and update operations.
|
|
83
|
+
* @summary Converts a complex object property to a JSON string before storing it in the database.
|
|
84
|
+
* @template M - The model type extending Model
|
|
85
|
+
* @template R - The repository type extending IRepository
|
|
86
|
+
* @template V - The data type for the operation
|
|
87
|
+
* @template F - The repository flags type
|
|
88
|
+
* @template C - The context type
|
|
89
|
+
* @param {C} context - The repository context
|
|
90
|
+
* @param {V} data - The data being processed
|
|
91
|
+
* @param key - The property key to serialize
|
|
92
|
+
* @param {M} model - The model instance being processed
|
|
93
|
+
* @return {Promise<void>} A promise that resolves when the property has been serialized
|
|
94
|
+
* @function serializeOnCreateUpdate
|
|
95
|
+
* @memberOf module:db-decorators
|
|
96
|
+
*/
|
|
50
97
|
export declare function serializeOnCreateUpdate<M extends Model, R extends IRepository<M, F, C>, V, F extends RepositoryFlags = RepositoryFlags, C extends Context<F> = Context<F>>(this: R, context: C, data: V, key: keyof M, model: M): Promise<void>;
|
|
98
|
+
/**
|
|
99
|
+
* @description Handler function that deserializes a property from JSON string after database operations.
|
|
100
|
+
* @summary Converts a JSON string property back to its original complex object form after retrieving it from the database.
|
|
101
|
+
* @template M - The model type extending Model
|
|
102
|
+
* @template R - The repository type extending IRepository
|
|
103
|
+
* @template V - The data type for the operation
|
|
104
|
+
* @template F - The repository flags type
|
|
105
|
+
* @template C - The context type
|
|
106
|
+
* @param {C} context - The repository context
|
|
107
|
+
* @param {V} data - The data being processed
|
|
108
|
+
* @param key - The property key to deserialize
|
|
109
|
+
* @param {M} model - The model instance being processed
|
|
110
|
+
* @return {Promise<void>} A promise that resolves when the property has been deserialized
|
|
111
|
+
* @function serializeAfterAll
|
|
112
|
+
* @memberOf module:db-decorators
|
|
113
|
+
*/
|
|
51
114
|
export declare function serializeAfterAll<M extends Model, R extends IRepository<M, F, C>, V, F extends RepositoryFlags = RepositoryFlags, C extends Context<F> = Context<F>>(this: R, context: C, data: V, key: keyof M, model: M): Promise<void>;
|
|
52
115
|
/**
|
|
53
|
-
* @
|
|
54
|
-
* @
|
|
55
|
-
*
|
|
116
|
+
* @description Enables automatic JSON serialization and deserialization for complex object properties.
|
|
117
|
+
* @summary Decorator that automatically converts complex objects to JSON strings before storing in the database and back to objects when retrieving them.
|
|
118
|
+
* @return {PropertyDecorator} A decorator function that can be applied to class properties
|
|
56
119
|
* @function serialize
|
|
120
|
+
* @category Property Decorators
|
|
121
|
+
* @mermaid
|
|
122
|
+
* sequenceDiagram
|
|
123
|
+
* participant C as Client
|
|
124
|
+
* participant M as Model
|
|
125
|
+
* participant S as SerializeDecorator
|
|
126
|
+
* participant DB as Database
|
|
127
|
+
*
|
|
128
|
+
* Note over C,DB: Create/Update Flow
|
|
129
|
+
* C->>M: Set complex object property
|
|
130
|
+
* M->>S: Process property (create/update)
|
|
131
|
+
* S->>M: Convert to JSON string
|
|
132
|
+
* M->>DB: Store serialized data
|
|
57
133
|
*
|
|
58
|
-
*
|
|
134
|
+
* Note over C,DB: Retrieval Flow
|
|
135
|
+
* C->>M: Request model
|
|
136
|
+
* M->>DB: Fetch data
|
|
137
|
+
* DB->>M: Return with serialized property
|
|
138
|
+
* M->>S: Process property (after all ops)
|
|
139
|
+
* S->>M: Parse JSON back to object
|
|
140
|
+
* M->>C: Return model with deserialized property
|
|
59
141
|
*/
|
|
60
142
|
export declare function serialize(): (target: object, propertyKey?: string | symbol | unknown, descriptor?: PropertyDescriptor) => void;
|
|
@@ -2,7 +2,15 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const decorator_validation_1 = require("@decaf-ts/decorator-validation");
|
|
4
4
|
const constants_1 = require("./constants.cjs");
|
|
5
|
+
/**
|
|
6
|
+
* @description Generates a key for update validation metadata.
|
|
7
|
+
* @summary Builds the key to store as metadata under Reflections for update validation by prefixing the provided key with the update validation prefix.
|
|
8
|
+
* @param {string} key - The base key to be prefixed
|
|
9
|
+
* @return {string} The complete metadata key for update validation
|
|
10
|
+
* @function updateKey
|
|
11
|
+
* @memberOf module:db-decorators
|
|
12
|
+
*/
|
|
5
13
|
decorator_validation_1.Validation.updateKey = function (key) {
|
|
6
14
|
return constants_1.UpdateValidationKeys.REFLECT + key;
|
|
7
15
|
};
|
|
8
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
16
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy92YWxpZGF0aW9uL3ZhbGlkYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSx5RUFLd0M7QUFDeEMsK0NBQW1EO0FBRW5EOzs7Ozs7O0dBT0c7QUFDSCxpQ0FBVSxDQUFDLFNBQVMsR0FBRyxVQUFVLEdBQVc7SUFDMUMsT0FBTyxnQ0FBb0IsQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDO0FBQzVDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIFZhbGlkYXRvcixcbiAgVmFsaWRhdGlvbixcbiAgVmFsaWRhdG9yRGVmaW5pdGlvbixcbiAgSVZhbGlkYXRvclJlZ2lzdHJ5LFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBVcGRhdGVWYWxpZGF0aW9uS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBHZW5lcmF0ZXMgYSBrZXkgZm9yIHVwZGF0ZSB2YWxpZGF0aW9uIG1ldGFkYXRhLlxuICogQHN1bW1hcnkgQnVpbGRzIHRoZSBrZXkgdG8gc3RvcmUgYXMgbWV0YWRhdGEgdW5kZXIgUmVmbGVjdGlvbnMgZm9yIHVwZGF0ZSB2YWxpZGF0aW9uIGJ5IHByZWZpeGluZyB0aGUgcHJvdmlkZWQga2V5IHdpdGggdGhlIHVwZGF0ZSB2YWxpZGF0aW9uIHByZWZpeC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUgYmFzZSBrZXkgdG8gYmUgcHJlZml4ZWRcbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGNvbXBsZXRlIG1ldGFkYXRhIGtleSBmb3IgdXBkYXRlIHZhbGlkYXRpb25cbiAqIEBmdW5jdGlvbiB1cGRhdGVLZXlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGItZGVjb3JhdG9yc1xuICovXG5WYWxpZGF0aW9uLnVwZGF0ZUtleSA9IGZ1bmN0aW9uIChrZXk6IHN0cmluZykge1xuICByZXR1cm4gVXBkYXRlVmFsaWRhdGlvbktleXMuUkVGTEVDVCArIGtleTtcbn07XG5cbmRlY2xhcmUgbW9kdWxlIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCIge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4gIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgZGVjbGFyZSBjbGFzcyBWYWxpZGF0aW9uIHtcbiAgICBwcml2YXRlIHN0YXRpYyBhY3RpbmdWYWxpZGF0b3JSZWdpc3RyeT87XG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpO1xuICAgIC8qKlxuICAgICAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIGFjdGluZyBWYWxpZGF0b3JSZWdpc3RyeVxuICAgICAqXG4gICAgICogQHBhcmFtIHtJVmFsaWRhdG9yUmVnaXN0cnl9IHZhbGlkYXRvclJlZ2lzdHJ5IHRoZSBuZXcgaW1wbGVtZW50YXRpb24gb2YgdGhlIHZhbGlkYXRvciBSZWdpc3RyeVxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oVmFsaWRhdG9yKTogVmFsaWRhdG9yfSBbbWlncmF0aW9uSGFuZGxlcl0gdGhlIG1ldGhvZCB0byBtYXAgdGhlIHZhbGlkYXRvciBpZiByZXF1aXJlZDtcbiAgICAgKi9cbiAgICBzdGF0aWMgc2V0UmVnaXN0cnkoXG4gICAgICB2YWxpZGF0b3JSZWdpc3RyeTogSVZhbGlkYXRvclJlZ2lzdHJ5PFZhbGlkYXRvcj4sXG4gICAgICBtaWdyYXRpb25IYW5kbGVyPzogKHZhbGlkYXRvcjogVmFsaWRhdG9yKSA9PiBWYWxpZGF0b3JcbiAgICApOiB2b2lkO1xuICAgIC8qKlxuICAgICAqIEBzdW1tYXJ5IFJldHVybnMgdGhlIGN1cnJlbnQgVmFsaWRhdG9yUmVnaXN0cnlcbiAgICAgKlxuICAgICAqIEByZXR1cm4gSVZhbGlkYXRvclJlZ2lzdHJ5LCBkZWZhdWx0cyB0byB7QGxpbmsgVmFsaWRhdG9yUmVnaXN0cnl9XG4gICAgICovXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0UmVnaXN0cnk7XG4gICAgLyoqXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmVzIGEgdmFsaWRhdG9yXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsaWRhdG9yS2V5IG9uZSBvZiB0aGUge0BsaW5rIFZhbGlkYXRpb25LZXlzfVxuICAgICAqIEByZXR1cm4ge1ZhbGlkYXRvciB8IHVuZGVmaW5lZH0gdGhlIHJlZ2lzdGVyZWQgVmFsaWRhdG9yIG9yIHVuZGVmaW5lZCBpZiB0aGVyZSBpcyBub25vIG1hdGNoaW5nIHRoZSBwcm92aWRlZCBrZXlcbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0PFQgZXh0ZW5kcyBWYWxpZGF0b3I+KHZhbGlkYXRvcktleTogc3RyaW5nKTogVCB8IHVuZGVmaW5lZDtcbiAgICAvKipcbiAgICAgKiBAc3VtbWFyeSBSZWdpc3RlcnMgdGhlIHByb3ZpZGVkIHZhbGlkYXRvcnMgb250byB0aGUgcmVnaXN0cnlcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7VFtdIHwgVmFsaWRhdG9yRGVmaW5pdGlvbltdfSB2YWxpZGF0b3JcbiAgICAgKi9cbiAgICBzdGF0aWMgcmVnaXN0ZXI8VCBleHRlbmRzIFZhbGlkYXRvcj4oXG4gICAgICAuLi52YWxpZGF0b3I6IChWYWxpZGF0b3JEZWZpbml0aW9uIHwgVClbXVxuICAgICk6IHZvaWQ7XG4gICAgLyoqXG4gICAgICogQHN1bW1hcnkgQnVpbGRzIHRoZSBrZXkgdG8gc3RvcmUgYXMgTWV0YWRhdGEgdW5kZXIgUmVmbGVjdGlvbnNcbiAgICAgKiBAZGVzY3JpcHRpb24gY29uY2F0ZW5hdGVzIHtAbGluayBWYWxpZGF0aW9uS2V5cyNSRUZMRUNUfSB3aXRoIHRoZSBwcm92aWRlZCBrZXlcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAgICAgKi9cbiAgICBzdGF0aWMga2V5KGtleTogc3RyaW5nKTogc3RyaW5nO1xuXG4gICAgc3RhdGljIHVwZGF0ZUtleShrZXk6IHN0cmluZyk6IHN0cmluZztcbiAgfVxufVxuIl19
|
|
@@ -14,11 +14,29 @@ const decorator_validation_1 = require("@decaf-ts/decorator-validation");
|
|
|
14
14
|
const constants_1 = require("./../constants.cjs");
|
|
15
15
|
const reflection_1 = require("@decaf-ts/reflection");
|
|
16
16
|
/**
|
|
17
|
-
* @
|
|
18
|
-
*
|
|
17
|
+
* @description A validator that ensures properties marked as readonly cannot be modified during updates.
|
|
18
|
+
* @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.
|
|
19
|
+
* @param {any} value - The value to be validated
|
|
20
|
+
* @param {any} oldValue - The previous value to compare against
|
|
21
|
+
* @param {string} [message] - Optional custom error message
|
|
19
22
|
* @class ReadOnlyValidator
|
|
20
|
-
* @
|
|
23
|
+
* @example
|
|
24
|
+
* // Using ReadOnlyValidator with a readonly property
|
|
25
|
+
* class User {
|
|
26
|
+
* @readonly()
|
|
27
|
+
* id: string;
|
|
28
|
+
*
|
|
29
|
+
* name: string;
|
|
30
|
+
*
|
|
31
|
+
* constructor(id: string, name: string) {
|
|
32
|
+
* this.id = id;
|
|
33
|
+
* this.name = name;
|
|
34
|
+
* }
|
|
35
|
+
* }
|
|
21
36
|
*
|
|
37
|
+
* // This will trigger validation error when trying to update
|
|
38
|
+
* const user = new User('123', 'John');
|
|
39
|
+
* user.id = '456'; // Will be prevented by ReadOnlyValidator
|
|
22
40
|
* @category Validators
|
|
23
41
|
*/
|
|
24
42
|
let ReadOnlyValidator = class ReadOnlyValidator extends decorator_validation_1.Validator {
|
|
@@ -26,17 +44,23 @@ let ReadOnlyValidator = class ReadOnlyValidator extends decorator_validation_1.V
|
|
|
26
44
|
super(constants_1.DEFAULT_ERROR_MESSAGES.READONLY.INVALID);
|
|
27
45
|
}
|
|
28
46
|
/**
|
|
29
|
-
* @
|
|
47
|
+
* @description Implementation of the base validator's hasErrors method.
|
|
48
|
+
* @summary This method is required by the Validator interface but not used in this validator as validation only happens during updates.
|
|
49
|
+
* @param {any} value - The value to validate
|
|
50
|
+
* @param {any[]} args - Additional arguments
|
|
51
|
+
* @return {string | undefined} Always returns undefined as this validator only works during updates
|
|
30
52
|
*/
|
|
31
53
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
32
54
|
hasErrors(value, ...args) {
|
|
33
55
|
return undefined;
|
|
34
56
|
}
|
|
35
57
|
/**
|
|
36
|
-
* @
|
|
37
|
-
* @
|
|
38
|
-
* @param {any}
|
|
39
|
-
* @param {
|
|
58
|
+
* @description Checks if a value has been modified during an update operation.
|
|
59
|
+
* @summary Validates a value has not changed by comparing it with the previous value using deep equality.
|
|
60
|
+
* @param {any} value - The new value to validate
|
|
61
|
+
* @param {any} oldValue - The original value to compare against
|
|
62
|
+
* @param {string} [message] - Optional custom error message to override the default
|
|
63
|
+
* @return {string | undefined} An error message if validation fails, undefined otherwise
|
|
40
64
|
*/
|
|
41
65
|
updateHasErrors(value, oldValue, message) {
|
|
42
66
|
if (value === undefined)
|
|
@@ -51,4 +75,4 @@ exports.ReadOnlyValidator = ReadOnlyValidator = __decorate([
|
|
|
51
75
|
(0, decorator_validation_1.validator)(constants_1.UpdateValidationKeys.READONLY),
|
|
52
76
|
__metadata("design:paramtypes", [])
|
|
53
77
|
], ReadOnlyValidator);
|
|
54
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
78
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVhZE9ubHlWYWxpZGF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdmFsaWRhdGlvbi92YWxpZGF0b3JzL1JlYWRPbmx5VmFsaWRhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUFBLHlFQUFzRTtBQUN0RSxrREFBNEU7QUFDNUUscURBQStDO0FBRS9DOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBeUJHO0FBRUksSUFBTSxpQkFBaUIsR0FBdkIsTUFBTSxpQkFBa0IsU0FBUSxnQ0FBUztJQUM5QztRQUNFLEtBQUssQ0FBQyxrQ0FBc0IsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILDZEQUE2RDtJQUM3RCxTQUFTLENBQUMsS0FBVSxFQUFFLEdBQUcsSUFBVztRQUNsQyxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNJLGVBQWUsQ0FDcEIsS0FBVSxFQUNWLFFBQWEsRUFDYixPQUFnQjtRQUVoQixJQUFJLEtBQUssS0FBSyxTQUFTO1lBQUUsT0FBTztRQUVoQyxPQUFPLElBQUEsb0JBQU8sRUFBQyxLQUFLLEVBQUUsUUFBUSxDQUFDO1lBQzdCLENBQUMsQ0FBQyxTQUFTO1lBQ1gsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMvQyxDQUFDO0NBQ0YsQ0FBQTtBQXBDWSw4Q0FBaUI7NEJBQWpCLGlCQUFpQjtJQUQ3QixJQUFBLGdDQUFTLEVBQUMsZ0NBQW9CLENBQUMsUUFBUSxDQUFDOztHQUM1QixpQkFBaUIsQ0FvQzdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdmFsaWRhdG9yLCBWYWxpZGF0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBERUZBVUxUX0VSUk9SX01FU1NBR0VTLCBVcGRhdGVWYWxpZGF0aW9uS2V5cyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IGlzRXF1YWwgfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQSB2YWxpZGF0b3IgdGhhdCBlbnN1cmVzIHByb3BlcnRpZXMgbWFya2VkIGFzIHJlYWRvbmx5IGNhbm5vdCBiZSBtb2RpZmllZCBkdXJpbmcgdXBkYXRlcy5cbiAqIEBzdW1tYXJ5IFZhbGlkYXRvciBmb3IgdGhlIHtAbGluayByZWFkb25seX0gZGVjb3JhdG9yIHRoYXQgY2hlY2tzIGlmIGEgdmFsdWUgaGFzIGJlZW4gY2hhbmdlZCBkdXJpbmcgYW4gdXBkYXRlIG9wZXJhdGlvbi4gSXQgY29tcGFyZXMgdGhlIG5ldyB2YWx1ZSB3aXRoIHRoZSBvbGQgdmFsdWUgYW5kIHJldHVybnMgYW4gZXJyb3IgbWVzc2FnZSBpZiB0aGV5IGFyZSBub3QgZXF1YWwuXG4gKiBAcGFyYW0ge2FueX0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gYmUgdmFsaWRhdGVkXG4gKiBAcGFyYW0ge2FueX0gb2xkVmFsdWUgLSBUaGUgcHJldmlvdXMgdmFsdWUgdG8gY29tcGFyZSBhZ2FpbnN0XG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIC0gT3B0aW9uYWwgY3VzdG9tIGVycm9yIG1lc3NhZ2VcbiAqIEBjbGFzcyBSZWFkT25seVZhbGlkYXRvclxuICogQGV4YW1wbGVcbiAqIC8vIFVzaW5nIFJlYWRPbmx5VmFsaWRhdG9yIHdpdGggYSByZWFkb25seSBwcm9wZXJ0eVxuICogY2xhc3MgVXNlciB7XG4gKiAgIEByZWFkb25seSgpXG4gKiAgIGlkOiBzdHJpbmc7XG4gKiAgIFxuICogICBuYW1lOiBzdHJpbmc7XG4gKiAgIFxuICogICBjb25zdHJ1Y3RvcihpZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcpIHtcbiAqICAgICB0aGlzLmlkID0gaWQ7XG4gKiAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAqICAgfVxuICogfVxuICogXG4gKiAvLyBUaGlzIHdpbGwgdHJpZ2dlciB2YWxpZGF0aW9uIGVycm9yIHdoZW4gdHJ5aW5nIHRvIHVwZGF0ZVxuICogY29uc3QgdXNlciA9IG5ldyBVc2VyKCcxMjMnLCAnSm9obicpO1xuICogdXNlci5pZCA9ICc0NTYnOyAvLyBXaWxsIGJlIHByZXZlbnRlZCBieSBSZWFkT25seVZhbGlkYXRvclxuICogQGNhdGVnb3J5IFZhbGlkYXRvcnNcbiAqL1xuQHZhbGlkYXRvcihVcGRhdGVWYWxpZGF0aW9uS2V5cy5SRUFET05MWSlcbmV4cG9ydCBjbGFzcyBSZWFkT25seVZhbGlkYXRvciBleHRlbmRzIFZhbGlkYXRvciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKERFRkFVTFRfRVJST1JfTUVTU0FHRVMuUkVBRE9OTFkuSU5WQUxJRCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEltcGxlbWVudGF0aW9uIG9mIHRoZSBiYXNlIHZhbGlkYXRvcidzIGhhc0Vycm9ycyBtZXRob2QuXG4gICAqIEBzdW1tYXJ5IFRoaXMgbWV0aG9kIGlzIHJlcXVpcmVkIGJ5IHRoZSBWYWxpZGF0b3IgaW50ZXJmYWNlIGJ1dCBub3QgdXNlZCBpbiB0aGlzIHZhbGlkYXRvciBhcyB2YWxpZGF0aW9uIG9ubHkgaGFwcGVucyBkdXJpbmcgdXBkYXRlcy5cbiAgICogQHBhcmFtIHthbnl9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIHZhbGlkYXRlXG4gICAqIEBwYXJhbSB7YW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJuIHtzdHJpbmcgfCB1bmRlZmluZWR9IEFsd2F5cyByZXR1cm5zIHVuZGVmaW5lZCBhcyB0aGlzIHZhbGlkYXRvciBvbmx5IHdvcmtzIGR1cmluZyB1cGRhdGVzXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGhhc0Vycm9ycyh2YWx1ZTogYW55LCAuLi5hcmdzOiBhbnlbXSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ2hlY2tzIGlmIGEgdmFsdWUgaGFzIGJlZW4gbW9kaWZpZWQgZHVyaW5nIGFuIHVwZGF0ZSBvcGVyYXRpb24uXG4gICAqIEBzdW1tYXJ5IFZhbGlkYXRlcyBhIHZhbHVlIGhhcyBub3QgY2hhbmdlZCBieSBjb21wYXJpbmcgaXQgd2l0aCB0aGUgcHJldmlvdXMgdmFsdWUgdXNpbmcgZGVlcCBlcXVhbGl0eS5cbiAgICogQHBhcmFtIHthbnl9IHZhbHVlIC0gVGhlIG5ldyB2YWx1ZSB0byB2YWxpZGF0ZVxuICAgKiBAcGFyYW0ge2FueX0gb2xkVmFsdWUgLSBUaGUgb3JpZ2luYWwgdmFsdWUgdG8gY29tcGFyZSBhZ2FpbnN0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gLSBPcHRpb25hbCBjdXN0b20gZXJyb3IgbWVzc2FnZSB0byBvdmVycmlkZSB0aGUgZGVmYXVsdFxuICAgKiBAcmV0dXJuIHtzdHJpbmcgfCB1bmRlZmluZWR9IEFuIGVycm9yIG1lc3NhZ2UgaWYgdmFsaWRhdGlvbiBmYWlscywgdW5kZWZpbmVkIG90aGVyd2lzZVxuICAgKi9cbiAgcHVibGljIHVwZGF0ZUhhc0Vycm9ycyhcbiAgICB2YWx1ZTogYW55LFxuICAgIG9sZFZhbHVlOiBhbnksXG4gICAgbWVzc2FnZT86IHN0cmluZyxcbiAgKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuXG4gICAgcmV0dXJuIGlzRXF1YWwodmFsdWUsIG9sZFZhbHVlKVxuICAgICAgPyB1bmRlZmluZWRcbiAgICAgIDogdGhpcy5nZXRNZXNzYWdlKG1lc3NhZ2UgfHwgdGhpcy5tZXNzYWdlKTtcbiAgfVxufVxuIl19
|
|
@@ -1,23 +1,47 @@
|
|
|
1
1
|
import { Validator } from "@decaf-ts/decorator-validation";
|
|
2
2
|
/**
|
|
3
|
-
* @
|
|
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
|
-
* @
|
|
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
|
-
* @
|
|
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
|
-
* @
|
|
18
|
-
* @
|
|
19
|
-
* @param {any}
|
|
20
|
-
* @param {
|
|
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
|
}
|