@decaf-ts/db-decorators 0.6.0 → 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 +1375 -327
- package/dist/db-decorators.esm.cjs +1375 -328
- 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 +19 -2
- 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 +43 -4
- 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 +34 -8
- package/lib/esm/operations/constants.js +23 -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 +324 -0
- package/lib/esm/repository/BaseRepository.js +309 -9
- 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 +9 -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 +26 -0
- package/lib/esm/repository/types.js +1 -1
- package/lib/esm/repository/utils.d.ts +11 -0
- package/lib/esm/repository/utils.js +7 -7
- 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 +19 -2
- 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 +41 -2
- 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 +24 -10
- package/lib/operations/constants.d.ts +34 -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 +303 -3
- package/lib/repository/BaseRepository.d.ts +324 -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 +9 -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 +26 -0
- package/lib/repository/utils.cjs +3 -3
- 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
|
@@ -13,21 +13,55 @@ exports.TimestampValidator = void 0;
|
|
|
13
13
|
const decorator_validation_1 = require("@decaf-ts/decorator-validation");
|
|
14
14
|
const constants_1 = require("./../constants.cjs");
|
|
15
15
|
/**
|
|
16
|
-
* @
|
|
17
|
-
*
|
|
16
|
+
* @description A validator that ensures timestamp values are only updated with newer timestamps.
|
|
17
|
+
* @summary Validates the update of a timestamp by comparing the new timestamp with the old one, ensuring the new timestamp is more recent.
|
|
18
|
+
* @param {Date|string|number} value - The timestamp value to validate
|
|
19
|
+
* @param {Date|string|number} oldValue - The previous timestamp to compare against
|
|
20
|
+
* @param {string} [message] - Optional custom error message
|
|
18
21
|
* @class TimestampValidator
|
|
19
|
-
* @
|
|
22
|
+
* @example
|
|
23
|
+
* // Using TimestampValidator with a timestamp property
|
|
24
|
+
* class Document {
|
|
25
|
+
* @timestamp()
|
|
26
|
+
* updatedAt: Date;
|
|
27
|
+
*
|
|
28
|
+
* title: string;
|
|
29
|
+
*
|
|
30
|
+
* constructor(title: string) {
|
|
31
|
+
* this.title = title;
|
|
32
|
+
* this.updatedAt = new Date();
|
|
33
|
+
* }
|
|
34
|
+
* }
|
|
20
35
|
*
|
|
36
|
+
* // This will trigger validation error when trying to update with an older timestamp
|
|
37
|
+
* const doc = new Document('My Document');
|
|
38
|
+
* const oldDate = new Date(2020, 0, 1);
|
|
39
|
+
* doc.updatedAt = oldDate; // Will be prevented by TimestampValidator
|
|
21
40
|
* @category Validators
|
|
22
41
|
*/
|
|
23
42
|
let TimestampValidator = class TimestampValidator extends decorator_validation_1.Validator {
|
|
24
43
|
constructor() {
|
|
25
44
|
super(constants_1.DEFAULT_ERROR_MESSAGES.TIMESTAMP.INVALID);
|
|
26
45
|
}
|
|
46
|
+
/**
|
|
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 timestamp value to validate
|
|
50
|
+
* @param {any[]} args - Additional arguments
|
|
51
|
+
* @return {string | undefined} Always returns undefined as this validator only works during updates
|
|
52
|
+
*/
|
|
27
53
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
28
54
|
hasErrors(value, ...args) {
|
|
29
55
|
return undefined;
|
|
30
56
|
}
|
|
57
|
+
/**
|
|
58
|
+
* @description Validates that a timestamp is newer than its previous value.
|
|
59
|
+
* @summary Checks if a timestamp has been updated with a more recent value by converting both values to Date objects and comparing them.
|
|
60
|
+
* @param {Date|string|number} value - The new timestamp value to validate
|
|
61
|
+
* @param {Date|string|number} oldValue - The original timestamp 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 (new timestamp is not newer), undefined otherwise
|
|
64
|
+
*/
|
|
31
65
|
updateHasErrors(value, oldValue, message) {
|
|
32
66
|
if (value === undefined)
|
|
33
67
|
return;
|
|
@@ -48,4 +82,4 @@ exports.TimestampValidator = TimestampValidator = __decorate([
|
|
|
48
82
|
(0, decorator_validation_1.validator)(constants_1.UpdateValidationKeys.TIMESTAMP),
|
|
49
83
|
__metadata("design:paramtypes", [])
|
|
50
84
|
], TimestampValidator);
|
|
51
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
85
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGltZXN0YW1wVmFsaWRhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3ZhbGlkYXRpb24vdmFsaWRhdG9ycy9UaW1lc3RhbXBWYWxpZGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUEseUVBQXNFO0FBQ3RFLGtEQUE0RTtBQUU1RTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwQkc7QUFFSSxJQUFNLGtCQUFrQixHQUF4QixNQUFNLGtCQUFtQixTQUFRLGdDQUFTO0lBQy9DO1FBQ0UsS0FBSyxDQUFDLGtDQUFzQixDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsNkRBQTZEO0lBQzdELFNBQVMsQ0FBQyxLQUFVLEVBQUUsR0FBRyxJQUFXO1FBQ2xDLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ksZUFBZSxDQUNwQixLQUE2QixFQUM3QixRQUFnQyxFQUNoQyxPQUFnQjtRQUVoQixJQUFJLEtBQUssS0FBSyxTQUFTO1lBQUUsT0FBTztRQUVoQyxPQUFPLEdBQUcsT0FBTyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUU5RCxJQUFJLENBQUM7WUFDSCxLQUFLLEdBQUcsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDeEIsUUFBUSxHQUFHLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzlCLDZEQUE2RDtRQUMvRCxDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNYLE9BQU8sT0FBTyxDQUFDO1FBQ2pCLENBQUM7UUFFRCxPQUFPLEtBQUssSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ2pELENBQUM7Q0FDRixDQUFBO0FBNUNZLGdEQUFrQjs2QkFBbEIsa0JBQWtCO0lBRDlCLElBQUEsZ0NBQVMsRUFBQyxnQ0FBb0IsQ0FBQyxTQUFTLENBQUM7O0dBQzdCLGtCQUFrQixDQTRDOUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB2YWxpZGF0b3IsIFZhbGlkYXRvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IERFRkFVTFRfRVJST1JfTUVTU0FHRVMsIFVwZGF0ZVZhbGlkYXRpb25LZXlzIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBIHZhbGlkYXRvciB0aGF0IGVuc3VyZXMgdGltZXN0YW1wIHZhbHVlcyBhcmUgb25seSB1cGRhdGVkIHdpdGggbmV3ZXIgdGltZXN0YW1wcy5cbiAqIEBzdW1tYXJ5IFZhbGlkYXRlcyB0aGUgdXBkYXRlIG9mIGEgdGltZXN0YW1wIGJ5IGNvbXBhcmluZyB0aGUgbmV3IHRpbWVzdGFtcCB3aXRoIHRoZSBvbGQgb25lLCBlbnN1cmluZyB0aGUgbmV3IHRpbWVzdGFtcCBpcyBtb3JlIHJlY2VudC5cbiAqIEBwYXJhbSB7RGF0ZXxzdHJpbmd8bnVtYmVyfSB2YWx1ZSAtIFRoZSB0aW1lc3RhbXAgdmFsdWUgdG8gdmFsaWRhdGVcbiAqIEBwYXJhbSB7RGF0ZXxzdHJpbmd8bnVtYmVyfSBvbGRWYWx1ZSAtIFRoZSBwcmV2aW91cyB0aW1lc3RhbXAgdG8gY29tcGFyZSBhZ2FpbnN0XG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIC0gT3B0aW9uYWwgY3VzdG9tIGVycm9yIG1lc3NhZ2VcbiAqIEBjbGFzcyBUaW1lc3RhbXBWYWxpZGF0b3JcbiAqIEBleGFtcGxlXG4gKiAvLyBVc2luZyBUaW1lc3RhbXBWYWxpZGF0b3Igd2l0aCBhIHRpbWVzdGFtcCBwcm9wZXJ0eVxuICogY2xhc3MgRG9jdW1lbnQge1xuICogICBAdGltZXN0YW1wKClcbiAqICAgdXBkYXRlZEF0OiBEYXRlO1xuICogICBcbiAqICAgdGl0bGU6IHN0cmluZztcbiAqICAgXG4gKiAgIGNvbnN0cnVjdG9yKHRpdGxlOiBzdHJpbmcpIHtcbiAqICAgICB0aGlzLnRpdGxlID0gdGl0bGU7XG4gKiAgICAgdGhpcy51cGRhdGVkQXQgPSBuZXcgRGF0ZSgpO1xuICogICB9XG4gKiB9XG4gKiBcbiAqIC8vIFRoaXMgd2lsbCB0cmlnZ2VyIHZhbGlkYXRpb24gZXJyb3Igd2hlbiB0cnlpbmcgdG8gdXBkYXRlIHdpdGggYW4gb2xkZXIgdGltZXN0YW1wXG4gKiBjb25zdCBkb2MgPSBuZXcgRG9jdW1lbnQoJ015IERvY3VtZW50Jyk7XG4gKiBjb25zdCBvbGREYXRlID0gbmV3IERhdGUoMjAyMCwgMCwgMSk7XG4gKiBkb2MudXBkYXRlZEF0ID0gb2xkRGF0ZTsgLy8gV2lsbCBiZSBwcmV2ZW50ZWQgYnkgVGltZXN0YW1wVmFsaWRhdG9yXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdG9yc1xuICovXG5AdmFsaWRhdG9yKFVwZGF0ZVZhbGlkYXRpb25LZXlzLlRJTUVTVEFNUClcbmV4cG9ydCBjbGFzcyBUaW1lc3RhbXBWYWxpZGF0b3IgZXh0ZW5kcyBWYWxpZGF0b3Ige1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihERUZBVUxUX0VSUk9SX01FU1NBR0VTLlRJTUVTVEFNUC5JTlZBTElEKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW1wbGVtZW50YXRpb24gb2YgdGhlIGJhc2UgdmFsaWRhdG9yJ3MgaGFzRXJyb3JzIG1ldGhvZC5cbiAgICogQHN1bW1hcnkgVGhpcyBtZXRob2QgaXMgcmVxdWlyZWQgYnkgdGhlIFZhbGlkYXRvciBpbnRlcmZhY2UgYnV0IG5vdCB1c2VkIGluIHRoaXMgdmFsaWRhdG9yIGFzIHZhbGlkYXRpb24gb25seSBoYXBwZW5zIGR1cmluZyB1cGRhdGVzLlxuICAgKiBAcGFyYW0ge2FueX0gdmFsdWUgLSBUaGUgdGltZXN0YW1wIHZhbHVlIHRvIHZhbGlkYXRlXG4gICAqIEBwYXJhbSB7YW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJuIHtzdHJpbmcgfCB1bmRlZmluZWR9IEFsd2F5cyByZXR1cm5zIHVuZGVmaW5lZCBhcyB0aGlzIHZhbGlkYXRvciBvbmx5IHdvcmtzIGR1cmluZyB1cGRhdGVzXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGhhc0Vycm9ycyh2YWx1ZTogYW55LCAuLi5hcmdzOiBhbnlbXSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVmFsaWRhdGVzIHRoYXQgYSB0aW1lc3RhbXAgaXMgbmV3ZXIgdGhhbiBpdHMgcHJldmlvdXMgdmFsdWUuXG4gICAqIEBzdW1tYXJ5IENoZWNrcyBpZiBhIHRpbWVzdGFtcCBoYXMgYmVlbiB1cGRhdGVkIHdpdGggYSBtb3JlIHJlY2VudCB2YWx1ZSBieSBjb252ZXJ0aW5nIGJvdGggdmFsdWVzIHRvIERhdGUgb2JqZWN0cyBhbmQgY29tcGFyaW5nIHRoZW0uXG4gICAqIEBwYXJhbSB7RGF0ZXxzdHJpbmd8bnVtYmVyfSB2YWx1ZSAtIFRoZSBuZXcgdGltZXN0YW1wIHZhbHVlIHRvIHZhbGlkYXRlXG4gICAqIEBwYXJhbSB7RGF0ZXxzdHJpbmd8bnVtYmVyfSBvbGRWYWx1ZSAtIFRoZSBvcmlnaW5hbCB0aW1lc3RhbXAgdG8gY29tcGFyZSBhZ2FpbnN0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gLSBPcHRpb25hbCBjdXN0b20gZXJyb3IgbWVzc2FnZSB0byBvdmVycmlkZSB0aGUgZGVmYXVsdFxuICAgKiBAcmV0dXJuIHtzdHJpbmcgfCB1bmRlZmluZWR9IEFuIGVycm9yIG1lc3NhZ2UgaWYgdmFsaWRhdGlvbiBmYWlscyAobmV3IHRpbWVzdGFtcCBpcyBub3QgbmV3ZXIpLCB1bmRlZmluZWQgb3RoZXJ3aXNlXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlSGFzRXJyb3JzKFxuICAgIHZhbHVlOiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyLFxuICAgIG9sZFZhbHVlOiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyLFxuICAgIG1lc3NhZ2U/OiBzdHJpbmdcbiAgKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuXG4gICAgbWVzc2FnZSA9IG1lc3NhZ2UgfHwgdGhpcy5nZXRNZXNzYWdlKG1lc3NhZ2UgfHwgdGhpcy5tZXNzYWdlKTtcblxuICAgIHRyeSB7XG4gICAgICB2YWx1ZSA9IG5ldyBEYXRlKHZhbHVlKTtcbiAgICAgIG9sZFZhbHVlID0gbmV3IERhdGUob2xkVmFsdWUpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZSA8PSBvbGRWYWx1ZSA/IG1lc3NhZ2UgOiB1bmRlZmluZWQ7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,14 +1,48 @@
|
|
|
1
1
|
import { Validator } from "@decaf-ts/decorator-validation";
|
|
2
2
|
/**
|
|
3
|
-
* @
|
|
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
|
-
* @
|
|
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
|
}
|
|
@@ -3,15 +3,30 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.UpdateValidator = void 0;
|
|
4
4
|
const decorator_validation_1 = require("@decaf-ts/decorator-validation");
|
|
5
5
|
/**
|
|
6
|
-
* @
|
|
7
|
-
*
|
|
8
|
-
* @param {string} [message]
|
|
9
|
-
* @param {string[]} [acceptedTypes]
|
|
10
|
-
*
|
|
6
|
+
* @description Abstract base class for validators that compare new values with old values during updates.
|
|
7
|
+
* @summary Base class for an Update validator that provides a framework for implementing validation logic that compares a new value with its previous state.
|
|
8
|
+
* @param {string} [message] - Error message. Defaults to {@link DecoratorMessages#DEFAULT}
|
|
9
|
+
* @param {string[]} [acceptedTypes] - The accepted value types by the decorator
|
|
11
10
|
* @class UpdateValidator
|
|
12
|
-
* @
|
|
13
|
-
*
|
|
11
|
+
* @example
|
|
12
|
+
* // Extending UpdateValidator to create a custom validator
|
|
13
|
+
* class MyCustomValidator extends UpdateValidator {
|
|
14
|
+
* constructor() {
|
|
15
|
+
* super("Custom validation failed");
|
|
16
|
+
* }
|
|
17
|
+
*
|
|
18
|
+
* public updateHasErrors(value: any, oldValue: any): string | undefined {
|
|
19
|
+
* // Custom validation logic
|
|
20
|
+
* if (value === oldValue) {
|
|
21
|
+
* return this.message;
|
|
22
|
+
* }
|
|
23
|
+
* return undefined;
|
|
24
|
+
* }
|
|
14
25
|
*
|
|
26
|
+
* hasErrors(value: any): string | undefined {
|
|
27
|
+
* return undefined; // Not used for update validators
|
|
28
|
+
* }
|
|
29
|
+
* }
|
|
15
30
|
* @category Validators
|
|
16
31
|
*/
|
|
17
32
|
class UpdateValidator extends decorator_validation_1.Validator {
|
|
@@ -20,4 +35,4 @@ class UpdateValidator extends decorator_validation_1.Validator {
|
|
|
20
35
|
}
|
|
21
36
|
}
|
|
22
37
|
exports.UpdateValidator = UpdateValidator;
|
|
23
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
38
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVXBkYXRlVmFsaWRhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3ZhbGlkYXRpb24vdmFsaWRhdG9ycy9VcGRhdGVWYWxpZGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEseUVBR3dDO0FBRXhDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBCRztBQUNILE1BQXNCLGVBQWdCLFNBQVEsZ0NBQVM7SUFDckQsWUFDRSxVQUFrQiw2Q0FBaUIsQ0FBQyxPQUFPLEVBQzNDLEdBQUcsYUFBdUI7UUFFMUIsS0FBSyxDQUFDLE9BQU8sRUFBRSxHQUFHLGFBQWEsQ0FBQyxDQUFDO0lBQ25DLENBQUM7Q0FlRjtBQXJCRCwwQ0FxQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBERUZBVUxUX0VSUk9SX01FU1NBR0VTIGFzIERlY29yYXRvck1lc3NhZ2VzLFxuICBWYWxpZGF0b3IsXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgdmFsaWRhdG9ycyB0aGF0IGNvbXBhcmUgbmV3IHZhbHVlcyB3aXRoIG9sZCB2YWx1ZXMgZHVyaW5nIHVwZGF0ZXMuXG4gKiBAc3VtbWFyeSBCYXNlIGNsYXNzIGZvciBhbiBVcGRhdGUgdmFsaWRhdG9yIHRoYXQgcHJvdmlkZXMgYSBmcmFtZXdvcmsgZm9yIGltcGxlbWVudGluZyB2YWxpZGF0aW9uIGxvZ2ljIHRoYXQgY29tcGFyZXMgYSBuZXcgdmFsdWUgd2l0aCBpdHMgcHJldmlvdXMgc3RhdGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIC0gRXJyb3IgbWVzc2FnZS4gRGVmYXVsdHMgdG8ge0BsaW5rIERlY29yYXRvck1lc3NhZ2VzI0RFRkFVTFR9XG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBbYWNjZXB0ZWRUeXBlc10gLSBUaGUgYWNjZXB0ZWQgdmFsdWUgdHlwZXMgYnkgdGhlIGRlY29yYXRvclxuICogQGNsYXNzIFVwZGF0ZVZhbGlkYXRvclxuICogQGV4YW1wbGVcbiAqIC8vIEV4dGVuZGluZyBVcGRhdGVWYWxpZGF0b3IgdG8gY3JlYXRlIGEgY3VzdG9tIHZhbGlkYXRvclxuICogY2xhc3MgTXlDdXN0b21WYWxpZGF0b3IgZXh0ZW5kcyBVcGRhdGVWYWxpZGF0b3Ige1xuICogICBjb25zdHJ1Y3RvcigpIHtcbiAqICAgICBzdXBlcihcIkN1c3RvbSB2YWxpZGF0aW9uIGZhaWxlZFwiKTtcbiAqICAgfVxuICogICBcbiAqICAgcHVibGljIHVwZGF0ZUhhc0Vycm9ycyh2YWx1ZTogYW55LCBvbGRWYWx1ZTogYW55KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAqICAgICAvLyBDdXN0b20gdmFsaWRhdGlvbiBsb2dpY1xuICogICAgIGlmICh2YWx1ZSA9PT0gb2xkVmFsdWUpIHtcbiAqICAgICAgIHJldHVybiB0aGlzLm1lc3NhZ2U7XG4gKiAgICAgfVxuICogICAgIHJldHVybiB1bmRlZmluZWQ7XG4gKiAgIH1cbiAqICAgXG4gKiAgIGhhc0Vycm9ycyh2YWx1ZTogYW55KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAqICAgICByZXR1cm4gdW5kZWZpbmVkOyAvLyBOb3QgdXNlZCBmb3IgdXBkYXRlIHZhbGlkYXRvcnNcbiAqICAgfVxuICogfVxuICogQGNhdGVnb3J5IFZhbGlkYXRvcnNcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFVwZGF0ZVZhbGlkYXRvciBleHRlbmRzIFZhbGlkYXRvciB7XG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcgPSBEZWNvcmF0b3JNZXNzYWdlcy5ERUZBVUxULFxuICAgIC4uLmFjY2VwdGVkVHlwZXM6IHN0cmluZ1tdXG4gICkge1xuICAgIHN1cGVyKG1lc3NhZ2UsIC4uLmFjY2VwdGVkVHlwZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBYnN0cmFjdCBtZXRob2QgdGhhdCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzZXMgdG8gcGVyZm9ybSB1cGRhdGUgdmFsaWRhdGlvbi5cbiAgICogQHN1bW1hcnkgVmFsaWRhdGVzIGEgdmFsdWUgYnkgY29tcGFyaW5nIGl0IHRvIGl0cyBvbGQgdmVyc2lvbiB0byBkZXRlcm1pbmUgaWYgdGhlIHVwZGF0ZSBpcyB2YWxpZC5cbiAgICogQHBhcmFtIHthbnl9IHZhbHVlIC0gVGhlIG5ldyB2YWx1ZSB0byB2YWxpZGF0ZVxuICAgKiBAcGFyYW0ge2FueX0gb2xkVmFsdWUgLSBUaGUgcHJldmlvdXMgdmFsdWUgdG8gY29tcGFyZSBhZ2FpbnN0XG4gICAqIEBwYXJhbSB7YW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0aGF0IG1heSBiZSBuZWVkZWQgZm9yIHZhbGlkYXRpb25cbiAgICogQHJldHVybiB7c3RyaW5nIHwgdW5kZWZpbmVkfSBBbiBlcnJvciBtZXNzYWdlIGlmIHZhbGlkYXRpb24gZmFpbHMsIHVuZGVmaW5lZCBpZiB2YWxpZGF0aW9uIHBhc3Nlc1xuICAgKi9cbiAgcHVibGljIGFic3RyYWN0IHVwZGF0ZUhhc0Vycm9ycyhcbiAgICB2YWx1ZTogYW55LFxuICAgIG9sZFZhbHVlOiBhbnksXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuIl19
|
|
@@ -1,23 +1,40 @@
|
|
|
1
1
|
import { Validator } from "@decaf-ts/decorator-validation";
|
|
2
2
|
/**
|
|
3
|
-
* @
|
|
4
|
-
*
|
|
5
|
-
* @param {string} [message]
|
|
6
|
-
* @param {string[]} [acceptedTypes]
|
|
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
|
-
* @
|
|
10
|
-
*
|
|
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
|
-
* @
|
|
18
|
-
* @
|
|
19
|
-
* @param {any}
|
|
20
|
-
* @param {any
|
|
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
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@decaf-ts/db-decorators",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.2",
|
|
4
4
|
"description": "Agnostic database decorators and repository",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -67,7 +67,7 @@
|
|
|
67
67
|
"ts"
|
|
68
68
|
],
|
|
69
69
|
"author": "Tiago Venceslau",
|
|
70
|
-
"license": "
|
|
70
|
+
"license": "MIT",
|
|
71
71
|
"bugs": {
|
|
72
72
|
"url": "https://github.com/decaf-ts/db-decorators/issues"
|
|
73
73
|
},
|