@decaf-ts/db-decorators 0.2.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -4
- package/dist/db-decorators.bundle.min.js +1 -1
- package/dist/esm/db-decorators.bundle.min.esm.js +1 -1
- package/lib/esm/identity/decorators.d.ts +1 -1
- package/lib/esm/identity/decorators.js +10 -1
- package/lib/esm/identity/index.js +4 -1
- package/lib/esm/identity/utils.d.ts +6 -9
- package/lib/esm/identity/utils.js +63 -1
- package/lib/esm/index.js +35 -1
- package/lib/esm/interfaces/BulkCrudOperator.js +3 -0
- package/lib/esm/interfaces/CrudOperator.js +3 -0
- package/lib/esm/interfaces/IRepository.d.ts +2 -3
- package/lib/esm/interfaces/IRepository.js +3 -0
- package/lib/esm/interfaces/index.js +5 -1
- package/lib/esm/model/constants.d.ts +1 -1
- package/lib/esm/model/constants.js +39 -1
- package/lib/esm/model/decorators.d.ts +5 -7
- package/lib/esm/model/decorators.js +69 -1
- package/lib/esm/model/index.d.ts +2 -1
- package/lib/esm/model/index.js +6 -1
- package/lib/esm/model/model.d.ts +8 -0
- package/lib/esm/model/model.js +14 -0
- package/lib/esm/model/validation.d.ts +1 -2
- package/lib/esm/model/validation.js +122 -1
- package/lib/esm/operations/Operations.d.ts +3 -4
- package/lib/esm/operations/Operations.js +35 -1
- package/lib/esm/operations/OperationsRegistry.d.ts +2 -3
- package/lib/esm/operations/OperationsRegistry.js +65 -1
- package/lib/esm/operations/constants.d.ts +1 -1
- package/lib/esm/operations/constants.js +39 -1
- package/lib/esm/operations/decorators.js +226 -1
- package/lib/esm/operations/index.js +7 -1
- package/lib/esm/operations/types.d.ts +4 -5
- package/lib/esm/operations/types.js +3 -0
- package/lib/esm/repository/BaseRepository.d.ts +2 -3
- package/lib/esm/repository/BaseRepository.js +158 -1
- package/lib/esm/repository/DataCache.js +32 -1
- package/lib/esm/repository/Repository.d.ts +3 -2
- package/lib/esm/repository/Repository.js +89 -2
- package/lib/esm/repository/errors.js +88 -1
- package/lib/esm/repository/index.js +8 -1
- package/lib/esm/repository/utils.d.ts +3 -4
- package/lib/esm/repository/utils.js +167 -1
- package/lib/esm/repository/wrappers.js +90 -1
- package/lib/esm/validation/constants.js +33 -1
- package/lib/esm/validation/decorators.d.ts +6 -8
- package/lib/esm/validation/decorators.js +223 -1
- package/lib/esm/validation/index.js +5 -1
- package/lib/esm/validation/validators/ReadOnlyValidator.js +52 -1
- package/lib/esm/validation/validators/TimestampValidator.js +49 -1
- package/lib/esm/validation/validators/UpdateValidator.js +20 -1
- package/lib/esm/validation/validators/index.js +5 -1
- package/lib/identity/decorators.cjs +13 -1
- package/lib/identity/decorators.d.ts +1 -1
- package/lib/identity/index.cjs +20 -1
- package/lib/identity/utils.cjs +67 -1
- package/lib/identity/utils.d.ts +6 -9
- package/lib/index.cjs +51 -1
- package/lib/interfaces/BulkCrudOperator.cjs +4 -1
- package/lib/interfaces/CrudOperator.cjs +4 -1
- package/lib/interfaces/IRepository.cjs +4 -1
- package/lib/interfaces/IRepository.d.ts +2 -3
- package/lib/interfaces/index.cjs +21 -1
- package/lib/model/constants.cjs +42 -1
- package/lib/model/constants.d.ts +1 -1
- package/lib/model/decorators.cjs +76 -1
- package/lib/model/decorators.d.ts +5 -7
- package/lib/model/index.cjs +22 -1
- package/lib/model/index.d.ts +2 -1
- package/lib/model/model.cjs +16 -0
- package/lib/model/model.d.ts +8 -0
- package/lib/model/validation.cjs +125 -1
- package/lib/model/validation.d.ts +1 -2
- package/lib/operations/Operations.cjs +39 -1
- package/lib/operations/Operations.d.ts +3 -4
- package/lib/operations/OperationsRegistry.cjs +69 -1
- package/lib/operations/OperationsRegistry.d.ts +2 -3
- package/lib/operations/constants.cjs +42 -1
- package/lib/operations/constants.d.ts +1 -1
- package/lib/operations/decorators.cjs +241 -1
- package/lib/operations/index.cjs +23 -1
- package/lib/operations/types.cjs +4 -1
- package/lib/operations/types.d.ts +4 -5
- package/lib/repository/BaseRepository.cjs +162 -1
- package/lib/repository/BaseRepository.d.ts +2 -3
- package/lib/repository/DataCache.cjs +36 -1
- package/lib/repository/Repository.cjs +93 -2
- package/lib/repository/Repository.d.ts +3 -2
- package/lib/repository/errors.cjs +97 -1
- package/lib/repository/index.cjs +24 -1
- package/lib/repository/utils.cjs +174 -1
- package/lib/repository/utils.d.ts +3 -4
- package/lib/repository/wrappers.cjs +95 -1
- package/lib/validation/constants.cjs +36 -1
- package/lib/validation/decorators.cjs +232 -1
- package/lib/validation/decorators.d.ts +6 -8
- package/lib/validation/index.cjs +21 -1
- package/lib/validation/validators/ReadOnlyValidator.cjs +55 -1
- package/lib/validation/validators/TimestampValidator.cjs +52 -1
- package/lib/validation/validators/UpdateValidator.cjs +24 -1
- package/lib/validation/validators/index.cjs +21 -1
- package/package.json +22 -18
- package/lib/esm/model/DBModel.d.ts +0 -25
- package/lib/esm/model/DBModel.js +0 -1
- package/lib/esm/validation/comparison.d.ts +0 -1
- package/lib/esm/validation/comparison.js +0 -1
- package/lib/model/DBModel.cjs +0 -1
- package/lib/model/DBModel.d.ts +0 -25
- package/lib/validation/comparison.cjs +0 -1
- package/lib/validation/comparison.d.ts +0 -1
|
@@ -1 +1,167 @@
|
|
|
1
|
-
import{Operations}from"../operations/Operations";
|
|
1
|
+
import { Operations } from "../operations/Operations";
|
|
2
|
+
import { OperationKeys } from "../operations/constants";
|
|
3
|
+
import { getAllPropertyDecorators, } from "@decaf-ts/reflection";
|
|
4
|
+
import { InternalError } from "./errors";
|
|
5
|
+
import { ModelKeys, sf } from "@decaf-ts/decorator-validation";
|
|
6
|
+
/**
|
|
7
|
+
* @summary retrieves the arguments for the handler
|
|
8
|
+
* @param {any} dec the decorator
|
|
9
|
+
* @param {string} prop the property name
|
|
10
|
+
* @param {{}} m the model
|
|
11
|
+
* @param {{}} [accum] accumulator used for internal recursiveness
|
|
12
|
+
*
|
|
13
|
+
* @function getHandlerArgs
|
|
14
|
+
* @memberOf module:db-decorators.Repository
|
|
15
|
+
*/
|
|
16
|
+
export const getHandlerArgs = function (dec, prop, m, accum) {
|
|
17
|
+
const name = m.constructor.name;
|
|
18
|
+
if (!name)
|
|
19
|
+
throw new InternalError("Could not determine model class");
|
|
20
|
+
accum = accum || {};
|
|
21
|
+
if (dec.props.handlers[name] && dec.props.handlers[name][prop])
|
|
22
|
+
accum = { ...dec.props.handlers[name][prop], ...accum };
|
|
23
|
+
let proto = Object.getPrototypeOf(m);
|
|
24
|
+
if (proto === Object.prototype)
|
|
25
|
+
return accum;
|
|
26
|
+
if (proto.constructor.name === name)
|
|
27
|
+
proto = Object.getPrototypeOf(proto);
|
|
28
|
+
return getHandlerArgs(dec, prop, proto, accum);
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
*
|
|
32
|
+
* @param {IRepository<T>} repo
|
|
33
|
+
* @param {T} model
|
|
34
|
+
* @param operation
|
|
35
|
+
* @param prefix
|
|
36
|
+
*
|
|
37
|
+
* @param oldModel
|
|
38
|
+
* @function enforceDBPropertyDecoratorsAsync
|
|
39
|
+
*
|
|
40
|
+
* @memberOf db-decorators.utils
|
|
41
|
+
*/
|
|
42
|
+
export async function enforceDBDecorators(repo, model, operation, prefix, oldModel) {
|
|
43
|
+
const decorators = getDbDecorators(model, operation, prefix);
|
|
44
|
+
if (!decorators)
|
|
45
|
+
return;
|
|
46
|
+
for (const prop in decorators) {
|
|
47
|
+
const decs = decorators[prop];
|
|
48
|
+
for (const dec of decs) {
|
|
49
|
+
const { key } = dec;
|
|
50
|
+
const handlers = Operations.get(model, prop, prefix + key);
|
|
51
|
+
if (!handlers || !handlers.length)
|
|
52
|
+
throw new InternalError(`Could not find registered handler for the operation ${prefix + key} under property ${prop}`);
|
|
53
|
+
const handlerArgs = getHandlerArgs(dec, prop, model);
|
|
54
|
+
if (!handlerArgs || Object.values(handlerArgs).length !== handlers.length)
|
|
55
|
+
throw new InternalError(sf("Args and handlers length do not match"));
|
|
56
|
+
let handler;
|
|
57
|
+
let data;
|
|
58
|
+
for (let i = 0; i < handlers.length; i++) {
|
|
59
|
+
handler = handlers[i];
|
|
60
|
+
data = Object.values(handlerArgs)[i];
|
|
61
|
+
const args = [data.data, prop, model];
|
|
62
|
+
if (operation === OperationKeys.UPDATE) {
|
|
63
|
+
if (!oldModel)
|
|
64
|
+
throw new InternalError("Missing old model for update operation");
|
|
65
|
+
args.push(oldModel);
|
|
66
|
+
}
|
|
67
|
+
await handler.apply(repo, args);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Specific for DB Decorators
|
|
74
|
+
* @param {T} model
|
|
75
|
+
* @param {string} operation CRUD {@link OperationKeys}
|
|
76
|
+
* @param {string} [extraPrefix]
|
|
77
|
+
*
|
|
78
|
+
* @function getDbPropertyDecorators
|
|
79
|
+
*
|
|
80
|
+
* @memberOf db-decorators.utils
|
|
81
|
+
*/
|
|
82
|
+
export function getDbDecorators(model, operation, extraPrefix) {
|
|
83
|
+
const decorators = getAllPropertyDecorators(model,
|
|
84
|
+
// undefined,
|
|
85
|
+
OperationKeys.REFLECT + (extraPrefix ? extraPrefix : ""));
|
|
86
|
+
if (!decorators)
|
|
87
|
+
return;
|
|
88
|
+
return Object.keys(decorators).reduce((accum, decorator) => {
|
|
89
|
+
const dec = decorators[decorator].filter((d) => d.key === operation);
|
|
90
|
+
if (dec && dec.length) {
|
|
91
|
+
if (!accum)
|
|
92
|
+
accum = {};
|
|
93
|
+
accum[decorator] = dec;
|
|
94
|
+
}
|
|
95
|
+
return accum;
|
|
96
|
+
}, undefined);
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* @summary Retrieves the decorators for an object's properties prefixed by {@param prefixes} recursively
|
|
100
|
+
* @param model
|
|
101
|
+
* @param accum
|
|
102
|
+
* @param prefixes
|
|
103
|
+
*
|
|
104
|
+
* @function getAllPropertyDecoratorsRecursive
|
|
105
|
+
* @memberOf module:db-decorators.Repository
|
|
106
|
+
*/
|
|
107
|
+
export const getAllPropertyDecoratorsRecursive = function (model, accum, ...prefixes) {
|
|
108
|
+
const accumulator = accum || {};
|
|
109
|
+
const mergeDecorators = function (decs) {
|
|
110
|
+
const pushOrSquash = (key, ...values) => {
|
|
111
|
+
values.forEach((val) => {
|
|
112
|
+
let match;
|
|
113
|
+
if (!(match = accumulator[key].find((e) => e.key === val.key)) ||
|
|
114
|
+
match.props.operation !== val.props.operation) {
|
|
115
|
+
accumulator[key].push(val);
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
if (val.key === ModelKeys.TYPE)
|
|
119
|
+
return;
|
|
120
|
+
const { handlers, operation } = val.props;
|
|
121
|
+
if (!operation ||
|
|
122
|
+
!operation.match(new RegExp(`^(:?${OperationKeys.ON}|${OperationKeys.AFTER})(:?${OperationKeys.CREATE}|${OperationKeys.READ}|${OperationKeys.UPDATE}|${OperationKeys.DELETE})$`))) {
|
|
123
|
+
accumulator[key].push(val);
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
const accumHandlers = match.props.handlers;
|
|
127
|
+
Object.entries(handlers).forEach(([clazz, handlerDef]) => {
|
|
128
|
+
if (!(clazz in accumHandlers)) {
|
|
129
|
+
accumHandlers[clazz] = handlerDef;
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
Object.entries(handlerDef).forEach(([handlerProp, handler]) => {
|
|
133
|
+
if (!(handlerProp in accumHandlers[clazz])) {
|
|
134
|
+
accumHandlers[clazz][handlerProp] = handler;
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
Object.entries(handler).forEach(([handlerKey, argsObj]) => {
|
|
138
|
+
if (!(handlerKey in accumHandlers[clazz][handlerProp])) {
|
|
139
|
+
accumHandlers[clazz][handlerProp][handlerKey] = argsObj;
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
console.warn(sf("Skipping handler registration for {0} under prop {0} because handler is the same", clazz, handlerProp));
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
};
|
|
148
|
+
Object.entries(decs).forEach(([key, value]) => {
|
|
149
|
+
accumulator[key] = accumulator[key] || [];
|
|
150
|
+
pushOrSquash(key, ...value);
|
|
151
|
+
});
|
|
152
|
+
};
|
|
153
|
+
const decs = getAllPropertyDecorators(model, ...prefixes);
|
|
154
|
+
if (decs)
|
|
155
|
+
mergeDecorators(decs);
|
|
156
|
+
if (Object.getPrototypeOf(model) === Object.prototype)
|
|
157
|
+
return accumulator;
|
|
158
|
+
// const name = model.constructor.name;
|
|
159
|
+
const proto = Object.getPrototypeOf(model);
|
|
160
|
+
if (!proto)
|
|
161
|
+
return accumulator;
|
|
162
|
+
// if (proto.constructor && proto.constructor.name === name)
|
|
163
|
+
// proto = Object.getPrototypeOf(proto)
|
|
164
|
+
return getAllPropertyDecoratorsRecursive(proto, accumulator, ...prefixes);
|
|
165
|
+
};
|
|
166
|
+
|
|
167
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9yZXBvc2l0b3J5L3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUd0RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDeEQsT0FBTyxFQUVMLHdCQUF3QixHQUN6QixNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDekMsT0FBTyxFQUFlLFNBQVMsRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUU1RTs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsVUFDNUIsR0FBUSxFQUNSLElBQVksRUFDWixDQUFtQixFQUNuQixLQUEwQztJQUUxQyxNQUFNLElBQUksR0FBRyxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQztJQUNoQyxJQUFJLENBQUMsSUFBSTtRQUFFLE1BQU0sSUFBSSxhQUFhLENBQUMsaUNBQWlDLENBQUMsQ0FBQztJQUN0RSxLQUFLLEdBQUcsS0FBSyxJQUFJLEVBQUUsQ0FBQztJQUVwQixJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQztRQUM1RCxLQUFLLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsS0FBSyxFQUFFLENBQUM7SUFFMUQsSUFBSSxLQUFLLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyQyxJQUFJLEtBQUssS0FBSyxNQUFNLENBQUMsU0FBUztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQzdDLElBQUksS0FBSyxDQUFDLFdBQVcsQ0FB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LFNBQVM7UUFBRSxPQUFPLFdBQVcsQ0FBQztJQUUxRSx1Q0FBdUM7SUFDdkMsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMzQyxJQUFJLENBQUMsS0FBSztRQUFFLE9BQU8sV0FBVyxDQUFDO0lBQy9CLDREQUE0RDtJQUM1RCwyQ0FBMkM7SUFDM0MsT0FBTyxpQ0FBaUMsQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLEdBQUcsUUFBUSxDQUFDLENBQUM7QUFDNUUsQ0FBQyxDQUFDIiwiZmlsZSI6InJlcG9zaXRvcnkvdXRpbHMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPcGVyYXRpb25zIH0gZnJvbSBcIi4uL29wZXJhdGlvbnMvT3BlcmF0aW9uc1wiO1xuaW1wb3J0IHsgT3BlcmF0aW9uSGFuZGxlciwgVXBkYXRlT3BlcmF0aW9uSGFuZGxlciB9IGZyb20gXCIuLi9vcGVyYXRpb25zL3R5cGVzXCI7XG5pbXBvcnQgeyBJUmVwb3NpdG9yeSB9IGZyb20gXCIuLi9pbnRlcmZhY2VzL0lSZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBPcGVyYXRpb25LZXlzIH0gZnJvbSBcIi4uL29wZXJhdGlvbnMvY29uc3RhbnRzXCI7XG5pbXBvcnQge1xuICBEZWNvcmF0b3JNZXRhZGF0YSxcbiAgZ2V0QWxsUHJvcGVydHlEZWNvcmF0b3JzLFxufSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcbmltcG9ydCB7IEludGVybmFsRXJyb3IgfSBmcm9tIFwiLi9lcnJvcnNcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBNb2RlbEtleXMsIHNmIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuXG4vKipcbiAqIEBzdW1tYXJ5IHJldHJpZXZlcyB0aGUgYXJndW1lbnRzIGZvciB0aGUgaGFuZGxlclxuICogQHBhcmFtIHthbnl9IGRlYyB0aGUgZGVjb3JhdG9yXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvcCB0aGUgcHJvcGVydHkgbmFtZVxuICogQHBhcmFtIHt7fX0gbSB0aGUgbW9kZWxcbiAqIEBwYXJhbSB7e319IFthY2N1bV0gYWNjdW11bGF0b3IgdXNlZCBmb3IgaW50ZXJuYWwgcmVjdXJzaXZlbmVzc1xuICpcbiAqIEBmdW5jdGlvbiBnZXRIYW5kbGVyQXJnc1xuICogQG1lbWJlck9mIG1vZHVsZTpkYi1kZWNvcmF0b3JzLlJlcG9zaXRvcnlcbiAqL1xuZXhwb3J0IGNvbnN0IGdldEhhbmRsZXJBcmdzID0gZnVuY3Rpb24gKFxuICBkZWM6IGFueSxcbiAgcHJvcDogc3RyaW5nLFxuICBtOiBDb25zdHJ1Y3Rvcjxhbnk+LFxuICBhY2N1bT86IFJlY29yZDxzdHJpbmcsIHsgYXJnczogc3RyaW5nW10gfT5cbik6IFJlY29yZDxzdHJpbmcsIHsgYXJnczogc3RyaW5nW10gfT4gfCB2b2lkIHtcbiAgY29uc3QgbmFtZSA9IG0uY29uc3RydWN0b3IubmFtZTtcbiAgaWYgKCFuYW1lKSB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIkNvdWxkIG5vdCBkZXRlcm1pbmUgbW9kZWwgY2xhc3NcIik7XG4gIGFjY3VtID0gYWNjdW0gfHwge307XG5cbiAgaWYgKGRlYy5wcm9wcy5oYW5kbGVyc1tuYW1lXSAmJiBkZWMucHJvcHMuaGFuZGxlcnNbbmFtZV1bcHJvcF0pXG4gICAgYWNjdW0gPSB7IC4uLmRlYy5wcm9wcy5oYW5kbGVyc1tuYW1lXVtwcm9wXSwgLi4uYWNjdW0gfTtcblxuICBsZXQgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YobSk7XG4gIGlmIChwcm90byA9PT0gT2JqZWN0LnByb3RvdHlwZSkgcmV0dXJuIGFjY3VtO1xuICBpZiAocHJvdG8uY29uc3RydWN0b3IubmFtZSA9PT0gbmFtZSkgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pO1xuXG4gIHJldHVybiBnZXRIYW5kbGVyQXJncyhkZWMsIHByb3AsIHByb3RvLCBhY2N1bSk7XG59O1xuXG4vKipcbiAqXG4gKiBAcGFyYW0ge0lSZXBvc2l0b3J5PFQ+fSByZXBvXG4gKiBAcGFyYW0ge1R9IG1vZGVsXG4gKiBAcGFyYW0gb3BlcmF0aW9uXG4gKiBAcGFyYW0gcHJlZml4XG4gKlxuICogQHBhcmFtIG9sZE1vZGVsXG4gKiBAZnVuY3Rpb24gZW5mb3JjZURCUHJvcGVydHlEZWNvcmF0b3JzQXN5bmNcbiAqXG4gKiBAbWVtYmVyT2YgZGItZGVjb3JhdG9ycy51dGlsc1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5mb3JjZURCRGVjb3JhdG9yczxcbiAgVCBleHRlbmRzIE1vZGVsLFxuICBZIGV4dGVuZHMgSVJlcG9zaXRvcnk8VD4sXG4gIFYsXG4+KFxuICByZXBvOiBZLFxuICBtb2RlbDogVCxcbiAgb3BlcmF0aW9uOiBzdHJpbmcsXG4gIHByZWZpeDogc3RyaW5nLFxuICBvbGRNb2RlbD86IFRcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBkZWNvcmF0b3JzOiBSZWNvcmQ8c3RyaW5nLCBEZWNvcmF0b3JNZXRhZGF0YVtdPiB8IHVuZGVmaW5lZCA9XG4gICAgZ2V0RGJEZWNvcmF0b3JzKG1vZGVsLCBvcGVyYXRpb24sIHByZWZpeCk7XG5cbiAgaWYgKCFkZWNvcmF0b3JzKSByZXR1cm47XG5cbiAgZm9yIChjb25zdCBwcm9wIGluIGRlY29yYXRvcnMpIHtcbiAgICBjb25zdCBkZWNzOiBEZWNvcmF0b3JNZXRhZGF0YVtdID0gZGVjb3JhdG9yc1twcm9wXTtcbiAgICBmb3IgKGNvbnN0IGRlYyBvZiBkZWNzKSB7XG4gICAgICBjb25zdCB7IGtleSB9ID0gZGVjO1xuICAgICAgY29uc3QgaGFuZGxlcnM6IE9wZXJhdGlvbkhhbmRsZXI8VCwgWSwgVj5bXSB8IHVuZGVmaW5lZCA9IE9wZXJhdGlvbnMuZ2V0KFxuICAgICAgICBtb2RlbCxcbiAgICAgICAgcHJvcCxcbiAgICAgICAgcHJlZml4ICsga2V5XG4gICAgICApO1xuICAgICAgaWYgKCFoYW5kbGVycyB8fCAhaGFuZGxlcnMubGVuZ3RoKVxuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICBgQ291bGQgbm90IGZpbmQgcmVnaXN0ZXJlZCBoYW5kbGVyIGZvciB0aGUgb3BlcmF0aW9uICR7cHJlZml4ICsga2V5fSB1bmRlciBwcm9wZXJ0eSAke3Byb3B9YFxuICAgICAgICApO1xuXG4gICAgICBjb25zdCBoYW5kbGVyQXJncyA9IGdldEhhbmRsZXJBcmdzKGRlYywgcHJvcCwgbW9kZWwgYXMgYW55KTtcblxuICAgICAgaWYgKCFoYW5kbGVyQXJncyB8fCBPYmplY3QudmFsdWVzKGhhbmRsZXJBcmdzKS5sZW5ndGggIT09IGhhbmRsZXJzLmxlbmd0aClcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3Ioc2YoXCJBcmdzIGFuZCBoYW5kbGVycyBsZW5ndGggZG8gbm90IG1hdGNoXCIpKTtcblxuICAgICAgbGV0IGhhbmRsZXI6IE9wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIGFueT47XG4gICAgICBsZXQgZGF0YTogYW55O1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoYW5kbGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICBoYW5kbGVyID0gaGFuZGxlcnNbaV07XG4gICAgICAgIGRhdGEgPSBPYmplY3QudmFsdWVzKGhhbmRsZXJBcmdzKVtpXTtcblxuICAgICAgICBjb25zdCBhcmdzOiBhbnlbXSA9IFtkYXRhLmRhdGEsIHByb3AsIG1vZGVsXTtcblxuICAgICAgICBpZiAob3BlcmF0aW9uID09PSBPcGVyYXRpb25LZXlzLlVQREFURSkge1xuICAgICAgICAgIGlmICghb2xkTW9kZWwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIk1pc3Npbmcgb2xkIG1vZGVsIGZvciB1cGRhdGUgb3BlcmF0aW9uXCIpO1xuICAgICAgICAgIGFyZ3MucHVzaChvbGRNb2RlbCk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgKGhhbmRsZXIgYXMgVXBkYXRlT3BlcmF0aW9uSGFuZGxlcjxULCBZLCBWPikuYXBwbHkoXG4gICAgICAgICAgcmVwbyxcbiAgICAgICAgICBhcmdzIGFzIFtWLCBhbnksIFQsIFRdXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogU3BlY2lmaWMgZm9yIERCIERlY29yYXRvcnNcbiAqIEBwYXJhbSB7VH0gbW9kZWxcbiAqIEBwYXJhbSB7c3RyaW5nfSBvcGVyYXRpb24gQ1JVRCB7QGxpbmsgT3BlcmF0aW9uS2V5c31cbiAqIEBwYXJhbSB7c3RyaW5nfSBbZXh0cmFQcmVmaXhdXG4gKlxuICogQGZ1bmN0aW9uIGdldERiUHJvcGVydHlEZWNvcmF0b3JzXG4gKlxuICogQG1lbWJlck9mIGRiLWRlY29yYXRvcnMudXRpbHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERiRGVjb3JhdG9yczxUIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogVCxcbiAgb3BlcmF0aW9uOiBzdHJpbmcsXG4gIGV4dHJhUHJlZml4Pzogc3RyaW5nXG4pOiBSZWNvcmQ8c3RyaW5nLCBEZWNvcmF0b3JNZXRhZGF0YVtdPiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGRlY29yYXRvcnM6IFJlY29yZDxzdHJpbmcsIERlY29yYXRvck1ldGFkYXRhW10+IHwgdW5kZWZpbmVkID1cbiAgICBnZXRBbGxQcm9wZXJ0eURlY29yYXRvcnMoXG4gICAgICBtb2RlbCxcbiAgICAgIC8vIHVuZGVmaW5lZCxcbiAgICAgIE9wZXJhdGlvbktleXMuUkVGTEVDVCArIChleHRyYVByZWZpeCA/IGV4dHJhUHJlZml4IDogXCJcIilcbiAgICApO1xuICBpZiAoIWRlY29yYXRvcnMpIHJldHVybjtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKGRlY29yYXRvcnMpLnJlZHVjZShcbiAgICAoYWNjdW06IFJlY29yZDxzdHJpbmcsIERlY29yYXRvck1ldGFkYXRhW10+IHwgdW5kZWZpbmVkLCBkZWNvcmF0b3IpID0+IHtcbiAgICAgIGNvbnN0IGRlYyA9IGRlY29yYXRvcnNbZGVjb3JhdG9yXS5maWx0ZXIoKGQpID0+IGQua2V5ID09PSBvcGVyYXRpb24pO1xuICAgICAgaWYgKGRlYyAmJiBkZWMubGVuZ3RoKSB7XG4gICAgICAgIGlmICghYWNjdW0pIGFjY3VtID0ge307XG4gICAgICAgIGFjY3VtW2RlY29yYXRvcl0gPSBkZWM7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjdW07XG4gICAgfSxcbiAgICB1bmRlZmluZWRcbiAgKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBSZXRyaWV2ZXMgdGhlIGRlY29yYXRvcnMgZm9yIGFuIG9iamVjdCdzIHByb3BlcnRpZXMgcHJlZml4ZWQgYnkge0BwYXJhbSBwcmVmaXhlc30gcmVjdXJzaXZlbHlcbiAqIEBwYXJhbSBtb2RlbFxuICogQHBhcmFtIGFjY3VtXG4gKiBAcGFyYW0gcHJlZml4ZXNcbiAqXG4gKiBAZnVuY3Rpb24gZ2V0QWxsUHJvcGVydHlEZWNvcmF0b3JzUmVjdXJzaXZlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRiLWRlY29yYXRvcnMuUmVwb3NpdG9yeVxuICovXG5leHBvcnQgY29uc3QgZ2V0QWxsUHJvcGVydHlEZWNvcmF0b3JzUmVjdXJzaXZlID0gZnVuY3Rpb24gPFQgZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBULFxuICBhY2N1bTogeyBbaW5kZXhlcjogc3RyaW5nXTogYW55W10gfSB8IHVuZGVmaW5lZCxcbiAgLi4ucHJlZml4ZXM6IHN0cmluZ1tdXG4pOiB7IFtpbmRleGVyOiBzdHJpbmddOiBhbnlbXSB9IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgYWNjdW11bGF0b3IgPSBhY2N1bSB8fCB7fTtcbiAgY29uc3QgbWVyZ2VEZWNvcmF0b3JzID0gZnVuY3Rpb24gKGRlY3M6IHsgW2luZGV4ZXI6IHN0cmluZ106IGFueVtdIH0pIHtcbiAgICBjb25zdCBwdXNoT3JTcXVhc2ggPSAoa2V5OiBzdHJpbmcsIC4uLnZhbHVlczogYW55W10pID0+IHtcbiAgICAgIHZhbHVlcy5mb3JFYWNoKCh2YWwpID0+IHtcbiAgICAgICAgbGV0IG1hdGNoOiBhbnk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAhKG1hdGNoID0gYWNjdW11bGF0b3Jba2V5XS5maW5kKChlKSA9PiBlLmtleSA9PT0gdmFsLmtleSkpIHx8XG4gICAgICAgICAgbWF0Y2gucHJvcHMub3BlcmF0aW9uICE9PSB2YWwucHJvcHMub3BlcmF0aW9uXG4gICAgICAgICkge1xuICAgICAgICAgIGFjY3VtdWxhdG9yW2tleV0ucHVzaCh2YWwpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWwua2V5ID09PSBNb2RlbEtleXMuVFlQRSkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IHsgaGFuZGxlcnMsIG9wZXJhdGlvbiB9ID0gdmFsLnByb3BzO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAhb3BlcmF0aW9uIHx8XG4gICAgICAgICAgIW9wZXJhdGlvbi5tYXRjaChcbiAgICAgICAgICAgIG5ldyBSZWdFeHAoXG4gICAgICAgICAgICAgIGBeKDo/JHtPcGVyYXRpb25LZXlzLk9OfXwke09wZXJhdGlvbktleXMuQUZURVJ9KSg6PyR7T3BlcmF0aW9uS2V5cy5DUkVBVEV9fCR7T3BlcmF0aW9uS2V5cy5SRUFEfXwke09wZXJhdGlvbktleXMuVVBEQVRFfXwke09wZXJhdGlvbktleXMuREVMRVRFfSkkYFxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgKSB7XG4gICAgICAgICAgYWNjdW11bGF0b3Jba2V5XS5wdXNoKHZhbCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYWNjdW1IYW5kbGVycyA9IG1hdGNoLnByb3BzLmhhbmRsZXJzO1xuXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKGhhbmRsZXJzKS5mb3JFYWNoKChbY2xhenosIGhhbmRsZXJEZWZdKSA9PiB7XG4gICAgICAgICAgaWYgKCEoY2xhenogaW4gYWNjdW1IYW5kbGVycykpIHtcbiAgICAgICAgICAgIGFjY3VtSGFuZGxlcnNbY2xhenpdID0gaGFuZGxlckRlZjtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBPYmplY3QuZW50cmllcyhoYW5kbGVyRGVmIGFzIG9iamVjdCkuZm9yRWFjaChcbiAgICAgICAgICAgIChbaGFuZGxlclByb3AsIGhhbmRsZXJdKSA9PiB7XG4gICAgICAgICAgICAgIGlmICghKGhhbmRsZXJQcm9wIGluIGFjY3VtSGFuZGxlcnNbY2xhenpdKSkge1xuICAgICAgICAgICAgICAgIGFjY3VtSGFuZGxlcnNbY2xhenpdW2hhbmRsZXJQcm9wXSA9IGhhbmRsZXI7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMoaGFuZGxlciBhcyBvYmplY3QpLmZvckVhY2goXG4gICAgICAgICAgICAgICAgKFtoYW5kbGVyS2V5LCBhcmdzT2JqXSkgPT4ge1xuICAgICAgICAgICAgICAgICAgaWYgKCEoaGFuZGxlcktleSBpbiBhY2N1bUhhbmRsZXJzW2NsYXp6XVtoYW5kbGVyUHJvcF0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGFjY3VtSGFuZGxlcnNbY2xhenpdW2hhbmRsZXJQcm9wXVtoYW5kbGVyS2V5XSA9IGFyZ3NPYmo7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgICAgICAgc2YoXG4gICAgICAgICAgICAgICAgICAgICAgXCJTa2lwcGluZyBoYW5kbGVyIHJlZ2lzdHJhdGlvbiBmb3IgezB9IHVuZGVyIHByb3AgezB9IGJlY2F1c2UgaGFuZGxlciBpcyB0aGUgc2FtZVwiLFxuICAgICAgICAgICAgICAgICAgICAgIGNsYXp6LFxuICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJQcm9wXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIE9iamVjdC5lbnRyaWVzKGRlY3MpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgYWNjdW11bGF0b3Jba2V5XSA9IGFjY3VtdWxhdG9yW2tleV0gfHwgW107XG4gICAgICBwdXNoT3JTcXVhc2goa2V5LCAuLi52YWx1ZSk7XG4gICAgfSk7XG4gIH07XG5cbiAgY29uc3QgZGVjczogeyBbaW5kZXhlcjogc3RyaW5nXTogYW55W10gfSB8IHVuZGVmaW5lZCA9XG4gICAgZ2V0QWxsUHJvcGVydHlEZWNvcmF0b3JzKG1vZGVsLCAuLi5wcmVmaXhlcyk7XG4gIGlmIChkZWNzKSBtZXJnZURlY29yYXRvcnMoZGVjcyk7XG5cbiAgaWYgKE9iamVjdC5nZXRQcm90b3R5cGVPZihtb2RlbCkgPT09IE9iamVjdC5wcm90b3R5cGUpIHJldHVybiBhY2N1bXVsYXRvcjtcblxuICAvLyBjb25zdCBuYW1lID0gbW9kZWwuY29uc3RydWN0b3IubmFtZTtcbiAgY29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YobW9kZWwpO1xuICBpZiAoIXByb3RvKSByZXR1cm4gYWNjdW11bGF0b3I7XG4gIC8vIGlmIChwcm90by5jb25zdHJ1Y3RvciAmJiBwcm90by5jb25zdHJ1Y3Rvci5uYW1lID09PSBuYW1lKVxuICAvLyAgICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pXG4gIHJldHVybiBnZXRBbGxQcm9wZXJ0eURlY29yYXRvcnNSZWN1cnNpdmUocHJvdG8sIGFjY3VtdWxhdG9yLCAuLi5wcmVmaXhlcyk7XG59O1xuIl19
|
|
@@ -1 +1,90 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* @summary Util method to change a method of an object prefixing it with another
|
|
3
|
+
* @param {any} obj The Base Object
|
|
4
|
+
* @param {Function} after The original method
|
|
5
|
+
* @param {Function} prefix The Prefix method. The output will be used as arguments in the original method
|
|
6
|
+
* @param {string} [afterName] When the after function anme cannot be extracted, pass it here
|
|
7
|
+
*
|
|
8
|
+
* @function prefixMethod
|
|
9
|
+
*
|
|
10
|
+
* @memberOf module:db-decorators.Repository
|
|
11
|
+
*/
|
|
12
|
+
export function prefixMethod(obj, after, prefix, afterName) {
|
|
13
|
+
async function wrapper(...args) {
|
|
14
|
+
const results = await Promise.resolve(prefix.call(this, ...args));
|
|
15
|
+
return Promise.resolve(after.apply(this, results));
|
|
16
|
+
}
|
|
17
|
+
const wrapped = wrapper.bind(obj);
|
|
18
|
+
const name = afterName ? afterName : after.name;
|
|
19
|
+
Object.defineProperty(wrapped, "name", {
|
|
20
|
+
enumerable: true,
|
|
21
|
+
configurable: true,
|
|
22
|
+
writable: false,
|
|
23
|
+
value: name,
|
|
24
|
+
});
|
|
25
|
+
obj[name] = wrapped;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* @summary Util method to change a method of an object suffixing it with another
|
|
29
|
+
* @param {any} obj The Base Object
|
|
30
|
+
* @param {Function} before The original method
|
|
31
|
+
* @param {Function} suffix The Prefix method. The output will be used as arguments in the original method
|
|
32
|
+
* @param {string} [beforeName] When the after function anme cannot be extracted, pass it here
|
|
33
|
+
*
|
|
34
|
+
* @function suffixMethod
|
|
35
|
+
*
|
|
36
|
+
* @memberOf module:db-decorators.Repository
|
|
37
|
+
*/
|
|
38
|
+
export function suffixMethod(obj, before, suffix, beforeName) {
|
|
39
|
+
async function wrapper(...args) {
|
|
40
|
+
const results = await Promise.resolve(before.call(this, ...args));
|
|
41
|
+
return suffix.call(this, ...results);
|
|
42
|
+
}
|
|
43
|
+
const wrapped = wrapper.bind(obj);
|
|
44
|
+
const name = beforeName ? beforeName : before.name;
|
|
45
|
+
Object.defineProperty(wrapped, "name", {
|
|
46
|
+
enumerable: true,
|
|
47
|
+
configurable: true,
|
|
48
|
+
writable: false,
|
|
49
|
+
value: name,
|
|
50
|
+
});
|
|
51
|
+
obj[name] = wrapped;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* @summary Util method to wrap a method of an object with additional logic
|
|
55
|
+
*
|
|
56
|
+
* @param {any} obj The Base Object
|
|
57
|
+
* @param {Function} before the method to be prefixed
|
|
58
|
+
* @param {Function} method the method to be wrapped
|
|
59
|
+
* @param {Function} after The method to be suffixed
|
|
60
|
+
* @param {string} [methodName] When the after function anme cannot be extracted, pass it here
|
|
61
|
+
*
|
|
62
|
+
* @function wrapMethod
|
|
63
|
+
*
|
|
64
|
+
* @memberOf module:db-decorators.Repository
|
|
65
|
+
*/
|
|
66
|
+
export function wrapMethod(obj, before, method, after, methodName) {
|
|
67
|
+
async function wrapper(...args) {
|
|
68
|
+
let transformedArgs = before.call(obj, ...args);
|
|
69
|
+
if (transformedArgs instanceof Promise)
|
|
70
|
+
transformedArgs = await transformedArgs;
|
|
71
|
+
let results = await method.call(obj, ...transformedArgs);
|
|
72
|
+
if (results instanceof Promise)
|
|
73
|
+
results = await results;
|
|
74
|
+
results = after.call(this, results);
|
|
75
|
+
if (results instanceof Promise)
|
|
76
|
+
results = await results;
|
|
77
|
+
return results;
|
|
78
|
+
}
|
|
79
|
+
const wrapped = wrapper.bind(obj);
|
|
80
|
+
const name = methodName ? methodName : method.name;
|
|
81
|
+
Object.defineProperty(wrapped, "name", {
|
|
82
|
+
enumerable: true,
|
|
83
|
+
configurable: true,
|
|
84
|
+
writable: false,
|
|
85
|
+
value: name,
|
|
86
|
+
});
|
|
87
|
+
obj[name] = wrapped;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9yZXBvc2l0b3J5L3dyYXBwZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUMxQixHQUFRLEVBQ1IsS0FBOEIsRUFDOUIsTUFBK0IsRUFDL0IsU0FBa0I7SUFFbEIsS0FBSyxVQUFVLE9BQU8sQ0FBWSxHQUFHLElBQVc7UUFDOUMsTUFBTSxPQUFPLEdBQUcsTUFBTSxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNsRSxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBQ0QsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNsQyxNQUFNLElBQUksR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztJQUNoRCxNQUFNLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUU7UUFDckMsVUFBVSxFQUFFLElBQUk7UUFDaEIsWUFBWSxFQUFFLElBQUk7UUFDbEIsUUFBUSxFQUFFLEtBQUs7UUFDZixLQUFLLEVBQUUsSUFBSTtLQUNaLENBQUMsQ0FBQztJQUNILEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxPQUFPLENBQUM7QUFDdEIsQ0FBQztBQUVEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUMxQixHQUFRLEVBQ1IsTUFBK0IsRUFDL0IsTUFBK0IsRUFDL0IsVUFBbUI7SUFFbkIsS0FBSyxVQUFVLE9BQU8sQ0FBWSxHQUFHLElBQVc7UUFDOUMsTUFBTSxPQUFPLEdBQUcsTUFBTSxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNsRSxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEdBQUcsT0FBTyxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUNELE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbEMsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFDbkQsTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFO1FBQ3JDLFVBQVUsRUFBRSxJQUFJO1FBQ2hCLFlBQVksRUFBRSxJQUFJO1FBQ2xCLFFBQVEsRUFBRSxLQUFLO1FBQ2YsS0FBSyxFQUFFLElBQUk7S0FDWixDQUFDLENBQUM7SUFDSCxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsT0FBTyxDQUFDO0FBQ3RCLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFNLFVBQVUsVUFBVSxDQUN4QixHQUFRLEVBQ1IsTUFBK0IsRUFDL0IsTUFBK0IsRUFDL0IsS0FBOEIsRUFDOUIsVUFBbUI7SUFFbkIsS0FBSyxVQUFVLE9BQU8sQ0FBWSxHQUFHLElBQVc7UUFDOUMsSUFBSSxlQUFlLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUNoRCxJQUFJLGVBQWUsWUFBWSxPQUFPO1lBQ3BDLGVBQWUsR0FBRyxNQUFNLGVBQWUsQ0FBQztRQUMxQyxJQUFJLE9BQU8sR0FBRyxNQUFNLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUM7UUFDekQsSUFBSSxPQUFPLFlBQVksT0FBTztZQUFFLE9BQU8sR0FBRyxNQUFNLE9BQU8sQ0FBQztRQUN4RCxPQUFPLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDcEMsSUFBSSxPQUFPLFlBQVksT0FBTztZQUFFLE9BQU8sR0FBRyxNQUFNLE9BQU8sQ0FBQztRQUN4RCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBQ0QsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNsQyxNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztJQUNuRCxNQUFNLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUU7UUFDckMsVUFBVSxFQUFFLElBQUk7UUFDaEIsWUFBWSxFQUFFLElBQUk7UUFDbEIsUUFBUSxFQUFFLEtBQUs7UUFDZixLQUFLLEVBQUUsSUFBSTtLQUNaLENBQUMsQ0FBQztJQUNILEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxPQUFPLENBQUM7QUFDdEIsQ0FBQyIsImZpbGUiOiJyZXBvc2l0b3J5L3dyYXBwZXJzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAc3VtbWFyeSBVdGlsIG1ldGhvZCB0byBjaGFuZ2UgYSBtZXRob2Qgb2YgYW4gb2JqZWN0IHByZWZpeGluZyBpdCB3aXRoIGFub3RoZXJcbiAqIEBwYXJhbSB7YW55fSBvYmogVGhlIEJhc2UgT2JqZWN0XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBhZnRlciBUaGUgb3JpZ2luYWwgbWV0aG9kXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVmaXggVGhlIFByZWZpeCBtZXRob2QuIFRoZSBvdXRwdXQgd2lsbCBiZSB1c2VkIGFzIGFyZ3VtZW50cyBpbiB0aGUgb3JpZ2luYWwgbWV0aG9kXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FmdGVyTmFtZV0gV2hlbiB0aGUgYWZ0ZXIgZnVuY3Rpb24gYW5tZSBjYW5ub3QgYmUgZXh0cmFjdGVkLCBwYXNzIGl0IGhlcmVcbiAqXG4gKiBAZnVuY3Rpb24gcHJlZml4TWV0aG9kXG4gKlxuICogQG1lbWJlck9mIG1vZHVsZTpkYi1kZWNvcmF0b3JzLlJlcG9zaXRvcnlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByZWZpeE1ldGhvZChcbiAgb2JqOiBhbnksXG4gIGFmdGVyOiAoLi4uYXJnczogYW55W10pID0+IGFueSxcbiAgcHJlZml4OiAoLi4uYXJnczogYW55W10pID0+IGFueSxcbiAgYWZ0ZXJOYW1lPzogc3RyaW5nLFxuKSB7XG4gIGFzeW5jIGZ1bmN0aW9uIHdyYXBwZXIodGhpczogYW55LCAuLi5hcmdzOiBhbnlbXSkge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLnJlc29sdmUocHJlZml4LmNhbGwodGhpcywgLi4uYXJncykpO1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYWZ0ZXIuYXBwbHkodGhpcywgcmVzdWx0cykpO1xuICB9XG4gIGNvbnN0IHdyYXBwZWQgPSB3cmFwcGVyLmJpbmQob2JqKTtcbiAgY29uc3QgbmFtZSA9IGFmdGVyTmFtZSA/IGFmdGVyTmFtZSA6IGFmdGVyLm5hbWU7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3cmFwcGVkLCBcIm5hbWVcIiwge1xuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICB2YWx1ZTogbmFtZSxcbiAgfSk7XG4gIG9ialtuYW1lXSA9IHdyYXBwZWQ7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgVXRpbCBtZXRob2QgdG8gY2hhbmdlIGEgbWV0aG9kIG9mIGFuIG9iamVjdCBzdWZmaXhpbmcgaXQgd2l0aCBhbm90aGVyXG4gKiBAcGFyYW0ge2FueX0gb2JqIFRoZSBCYXNlIE9iamVjdFxuICogQHBhcmFtIHtGdW5jdGlvbn0gYmVmb3JlIFRoZSBvcmlnaW5hbCBtZXRob2RcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHN1ZmZpeCBUaGUgUHJlZml4IG1ldGhvZC4gVGhlIG91dHB1dCB3aWxsIGJlIHVzZWQgYXMgYXJndW1lbnRzIGluIHRoZSBvcmlnaW5hbCBtZXRob2RcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYmVmb3JlTmFtZV0gV2hlbiB0aGUgYWZ0ZXIgZnVuY3Rpb24gYW5tZSBjYW5ub3QgYmUgZXh0cmFjdGVkLCBwYXNzIGl0IGhlcmVcbiAqXG4gKiBAZnVuY3Rpb24gc3VmZml4TWV0aG9kXG4gKlxuICogQG1lbWJlck9mIG1vZHVsZTpkYi1kZWNvcmF0b3JzLlJlcG9zaXRvcnlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1ZmZpeE1ldGhvZChcbiAgb2JqOiBhbnksXG4gIGJlZm9yZTogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnksXG4gIHN1ZmZpeDogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnksXG4gIGJlZm9yZU5hbWU/OiBzdHJpbmcsXG4pIHtcbiAgYXN5bmMgZnVuY3Rpb24gd3JhcHBlcih0aGlzOiBhbnksIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UucmVzb2x2ZShiZWZvcmUuY2FsbCh0aGlzLCAuLi5hcmdzKSk7XG4gICAgcmV0dXJuIHN1ZmZpeC5jYWxsKHRoaXMsIC4uLnJlc3VsdHMpO1xuICB9XG4gIGNvbnN0IHdyYXBwZWQgPSB3cmFwcGVyLmJpbmQob2JqKTtcbiAgY29uc3QgbmFtZSA9IGJlZm9yZU5hbWUgPyBiZWZvcmVOYW1lIDogYmVmb3JlLm5hbWU7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3cmFwcGVkLCBcIm5hbWVcIiwge1xuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICB2YWx1ZTogbmFtZSxcbiAgfSk7XG4gIG9ialtuYW1lXSA9IHdyYXBwZWQ7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgVXRpbCBtZXRob2QgdG8gd3JhcCBhIG1ldGhvZCBvZiBhbiBvYmplY3Qgd2l0aCBhZGRpdGlvbmFsIGxvZ2ljXG4gKlxuICogQHBhcmFtIHthbnl9IG9iaiBUaGUgQmFzZSBPYmplY3RcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGJlZm9yZSB0aGUgbWV0aG9kIHRvIGJlIHByZWZpeGVkXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBtZXRob2QgdGhlIG1ldGhvZCB0byBiZSB3cmFwcGVkXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBhZnRlciBUaGUgbWV0aG9kIHRvIGJlIHN1ZmZpeGVkXG4gKiBAcGFyYW0ge3N0cmluZ30gW21ldGhvZE5hbWVdIFdoZW4gdGhlIGFmdGVyIGZ1bmN0aW9uIGFubWUgY2Fubm90IGJlIGV4dHJhY3RlZCwgcGFzcyBpdCBoZXJlXG4gKlxuICogQGZ1bmN0aW9uIHdyYXBNZXRob2RcbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRiLWRlY29yYXRvcnMuUmVwb3NpdG9yeVxuICovXG5leHBvcnQgZnVuY3Rpb24gd3JhcE1ldGhvZChcbiAgb2JqOiBhbnksXG4gIGJlZm9yZTogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnksXG4gIG1ldGhvZDogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnksXG4gIGFmdGVyOiAoLi4uYXJnczogYW55W10pID0+IGFueSxcbiAgbWV0aG9kTmFtZT86IHN0cmluZyxcbikge1xuICBhc3luYyBmdW5jdGlvbiB3cmFwcGVyKHRoaXM6IGFueSwgLi4uYXJnczogYW55W10pIHtcbiAgICBsZXQgdHJhbnNmb3JtZWRBcmdzID0gYmVmb3JlLmNhbGwob2JqLCAuLi5hcmdzKTtcbiAgICBpZiAodHJhbnNmb3JtZWRBcmdzIGluc3RhbmNlb2YgUHJvbWlzZSlcbiAgICAgIHRyYW5zZm9ybWVkQXJncyA9IGF3YWl0IHRyYW5zZm9ybWVkQXJncztcbiAgICBsZXQgcmVzdWx0cyA9IGF3YWl0IG1ldGhvZC5jYWxsKG9iaiwgLi4udHJhbnNmb3JtZWRBcmdzKTtcbiAgICBpZiAocmVzdWx0cyBpbnN0YW5jZW9mIFByb21pc2UpIHJlc3VsdHMgPSBhd2FpdCByZXN1bHRzO1xuICAgIHJlc3VsdHMgPSBhZnRlci5jYWxsKHRoaXMsIHJlc3VsdHMpO1xuICAgIGlmIChyZXN1bHRzIGluc3RhbmNlb2YgUHJvbWlzZSkgcmVzdWx0cyA9IGF3YWl0IHJlc3VsdHM7XG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH1cbiAgY29uc3Qgd3JhcHBlZCA9IHdyYXBwZXIuYmluZChvYmopO1xuICBjb25zdCBuYW1lID0gbWV0aG9kTmFtZSA/IG1ldGhvZE5hbWUgOiBtZXRob2QubmFtZTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHdyYXBwZWQsIFwibmFtZVwiLCB7XG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgd3JpdGFibGU6IGZhbHNlLFxuICAgIHZhbHVlOiBuYW1lLFxuICB9KTtcbiAgb2JqW25hbWVdID0gd3JhcHBlZDtcbn1cbiJdfQ==
|
|
@@ -1 +1,33 @@
|
|
|
1
|
-
import{DBKeys}from"../model/constants";
|
|
1
|
+
import { DBKeys } from "../model/constants";
|
|
2
|
+
/**
|
|
3
|
+
* @summary holds the default error messages
|
|
4
|
+
* @const DEFAULT_ERROR_MESSAGES
|
|
5
|
+
*
|
|
6
|
+
* @memberOf module:db-decorators.Model
|
|
7
|
+
*/
|
|
8
|
+
export const DEFAULT_ERROR_MESSAGES = {
|
|
9
|
+
ID: {
|
|
10
|
+
INVALID: "This Id is invalid",
|
|
11
|
+
REQUIRED: "The Id is mandatory",
|
|
12
|
+
},
|
|
13
|
+
READONLY: {
|
|
14
|
+
INVALID: "This cannot be updated",
|
|
15
|
+
},
|
|
16
|
+
TIMESTAMP: {
|
|
17
|
+
REQUIRED: "Timestamp is Mandatory",
|
|
18
|
+
DATE: "The Timestamp must the a valid date",
|
|
19
|
+
INVALID: "This value must always increase",
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* @summary Update reflection keys
|
|
24
|
+
* @const UpdateValidationKeys
|
|
25
|
+
* @memberOf module:db-decorators.Operations
|
|
26
|
+
*/
|
|
27
|
+
export const UpdateValidationKeys = {
|
|
28
|
+
REFLECT: "db.update.validation.",
|
|
29
|
+
TIMESTAMP: DBKeys.TIMESTAMP,
|
|
30
|
+
READONLY: DBKeys.READONLY,
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy92YWxpZGF0aW9uL2NvbnN0YW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFNUM7Ozs7O0dBS0c7QUFDSCxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRztJQUNwQyxFQUFFLEVBQUU7UUFDRixPQUFPLEVBQUUsb0JBQW9CO1FBQzdCLFFBQVEsRUFBRSxxQkFBcUI7S0FDaEM7SUFDRCxRQUFRLEVBQUU7UUFDUixPQUFPLEVBQUUsd0JBQXdCO0tBQ2xDO0lBQ0QsU0FBUyxFQUFFO1FBQ1QsUUFBUSxFQUFFLHdCQUF3QjtRQUNsQyxJQUFJLEVBQUUscUNBQXFDO1FBQzNDLE9BQU8sRUFBRSxpQ0FBaUM7S0FDM0M7Q0FDRixDQUFDO0FBRUY7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHO0lBQ2xDLE9BQU8sRUFBRSx1QkFBdUI7SUFDaEMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxTQUFTO0lBQzNCLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUTtDQUMxQixDQUFDIiwiZmlsZSI6InZhbGlkYXRpb24vY29uc3RhbnRzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgREJLZXlzIH0gZnJvbSBcIi4uL21vZGVsL2NvbnN0YW50c1wiO1xuXG4vKipcbiAqIEBzdW1tYXJ5IGhvbGRzIHRoZSBkZWZhdWx0IGVycm9yIG1lc3NhZ2VzXG4gKiBAY29uc3QgREVGQVVMVF9FUlJPUl9NRVNTQUdFU1xuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGItZGVjb3JhdG9ycy5Nb2RlbFxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyA9IHtcbiAgSUQ6IHtcbiAgICBJTlZBTElEOiBcIlRoaXMgSWQgaXMgaW52YWxpZFwiLFxuICAgIFJFUVVJUkVEOiBcIlRoZSBJZCBpcyBtYW5kYXRvcnlcIixcbiAgfSxcbiAgUkVBRE9OTFk6IHtcbiAgICBJTlZBTElEOiBcIlRoaXMgY2Fubm90IGJlIHVwZGF0ZWRcIixcbiAgfSxcbiAgVElNRVNUQU1QOiB7XG4gICAgUkVRVUlSRUQ6IFwiVGltZXN0YW1wIGlzIE1hbmRhdG9yeVwiLFxuICAgIERBVEU6IFwiVGhlIFRpbWVzdGFtcCBtdXN0IHRoZSBhIHZhbGlkIGRhdGVcIixcbiAgICBJTlZBTElEOiBcIlRoaXMgdmFsdWUgbXVzdCBhbHdheXMgaW5jcmVhc2VcIixcbiAgfSxcbn07XG5cbi8qKlxuICogQHN1bW1hcnkgVXBkYXRlIHJlZmxlY3Rpb24ga2V5c1xuICogQGNvbnN0IFVwZGF0ZVZhbGlkYXRpb25LZXlzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRiLWRlY29yYXRvcnMuT3BlcmF0aW9uc1xuICovXG5leHBvcnQgY29uc3QgVXBkYXRlVmFsaWRhdGlvbktleXMgPSB7XG4gIFJFRkxFQ1Q6IFwiZGIudXBkYXRlLnZhbGlkYXRpb24uXCIsXG4gIFRJTUVTVEFNUDogREJLZXlzLlRJTUVTVEFNUCxcbiAgUkVBRE9OTFk6IERCS2V5cy5SRUFET05MWSxcbn07XG4iXX0=
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import { OperationKeys } from "../operations/constants";
|
|
2
2
|
import { IRepository } from "../interfaces/IRepository";
|
|
3
|
-
import { DBModel } from "../model/DBModel";
|
|
4
|
-
import { CustomDecorator } from "@decaf-ts/reflection";
|
|
5
3
|
export declare function getDBUpdateKey(str: string): string;
|
|
6
4
|
/**
|
|
7
5
|
* Marks the property as readonly.
|
|
@@ -12,8 +10,8 @@ export declare function getDBUpdateKey(str: string): string;
|
|
|
12
10
|
*
|
|
13
11
|
* @category Decorators
|
|
14
12
|
*/
|
|
15
|
-
export declare function readonly(message?: string):
|
|
16
|
-
export declare function timestampHandler<T extends
|
|
13
|
+
export declare function readonly(message?: string): PropertyDecorator;
|
|
14
|
+
export declare function timestampHandler<T extends Model, V extends IRepository<T>, Y = any>(this: V, data: Y, key: string, model: T): void;
|
|
17
15
|
/**
|
|
18
16
|
* Marks the property as timestamp.
|
|
19
17
|
* Makes it {@link required}
|
|
@@ -45,9 +43,9 @@ export declare function timestampHandler<T extends DBModel, V extends IRepositor
|
|
|
45
43
|
*
|
|
46
44
|
* @category Decorators
|
|
47
45
|
*/
|
|
48
|
-
export declare function timestamp(operation?: OperationKeys[], format?: string):
|
|
49
|
-
export declare function serializeOnCreateUpdate<T extends
|
|
50
|
-
export declare function serializeAfterAll<T extends
|
|
46
|
+
export declare function timestamp(operation?: OperationKeys[], format?: string): (target: object, propertyKey?: any, descriptor?: any) => void;
|
|
47
|
+
export declare function serializeOnCreateUpdate<T extends Model, V extends IRepository<T>, Y = any>(this: V, data: Y, key: string, model: T, oldModel: T): Promise<void>;
|
|
48
|
+
export declare function serializeAfterAll<T extends Model, V extends IRepository<T>, Y = any>(this: V, data: Y, key: string, model: T): Promise<void>;
|
|
51
49
|
/**
|
|
52
50
|
* @summary Serialize Decorator
|
|
53
51
|
* @description properties decorated will the serialized before stored in the db
|
|
@@ -56,4 +54,4 @@ export declare function serializeAfterAll<T extends DBModel, V extends IReposito
|
|
|
56
54
|
*
|
|
57
55
|
* @memberOf module:wallet-db.Decorators
|
|
58
56
|
*/
|
|
59
|
-
export declare function serialize():
|
|
57
|
+
export declare function serialize(): (target: object, propertyKey?: any, descriptor?: any) => void;
|
|
@@ -1 +1,223 @@
|
|
|
1
|
-
import{date,required,sf,type}from"@decaf-ts/decorator-validation";
|
|
1
|
+
import { date, propMetadata, required, sf, type, } from "@decaf-ts/decorator-validation";
|
|
2
|
+
import { DBKeys, DEFAULT_TIMESTAMP_FORMAT } from "../model/constants";
|
|
3
|
+
import { DEFAULT_ERROR_MESSAGES, UpdateValidationKeys } from "./constants";
|
|
4
|
+
import { DBOperations, OperationKeys } from "../operations/constants";
|
|
5
|
+
import { after, on, onCreateUpdate } from "../operations/decorators";
|
|
6
|
+
import { SerializationError } from "../repository/errors";
|
|
7
|
+
import { apply, metadata } from "@decaf-ts/reflection";
|
|
8
|
+
import { Repository } from "../repository";
|
|
9
|
+
export function getDBUpdateKey(str) {
|
|
10
|
+
return UpdateValidationKeys.REFLECT + str;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Marks the property as readonly.
|
|
14
|
+
*
|
|
15
|
+
* @param {string} [message] the error message. Defaults to {@link DEFAULT_ERROR_MESSAGES.READONLY.INVALID}
|
|
16
|
+
*
|
|
17
|
+
* @decorator readonly
|
|
18
|
+
*
|
|
19
|
+
* @category Decorators
|
|
20
|
+
*/
|
|
21
|
+
export function readonly(message = DEFAULT_ERROR_MESSAGES.READONLY.INVALID) {
|
|
22
|
+
return propMetadata(getDBUpdateKey(DBKeys.READONLY), {
|
|
23
|
+
message: message,
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
export function timestampHandler(data, key, model) {
|
|
27
|
+
model[key] = new Date();
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Marks the property as timestamp.
|
|
31
|
+
* Makes it {@link required}
|
|
32
|
+
* Makes it a {@link date}
|
|
33
|
+
*
|
|
34
|
+
* Date Format:
|
|
35
|
+
*
|
|
36
|
+
* <pre>
|
|
37
|
+
* Using similar formatting as Moment.js, Class DateTimeFormatter (Java), and Class SimpleDateFormat (Java),
|
|
38
|
+
* I implemented a comprehensive solution formatDate(date, patternStr) where the code is easy to read and modify.
|
|
39
|
+
* You can display date, time, AM/PM, etc.
|
|
40
|
+
*
|
|
41
|
+
* Date and Time Patterns
|
|
42
|
+
* yy = 2-digit year; yyyy = full year
|
|
43
|
+
* M = digit month; MM = 2-digit month; MMM = short month name; MMMM = full month name
|
|
44
|
+
* EEEE = full weekday name; EEE = short weekday name
|
|
45
|
+
* d = digit day; dd = 2-digit day
|
|
46
|
+
* h = hours am/pm; hh = 2-digit hours am/pm; H = hours; HH = 2-digit hours
|
|
47
|
+
* m = minutes; mm = 2-digit minutes; aaa = AM/PM
|
|
48
|
+
* s = seconds; ss = 2-digit seconds
|
|
49
|
+
* S = miliseconds
|
|
50
|
+
* </pre>
|
|
51
|
+
*
|
|
52
|
+
* @param {string[]} operation The {@link DBOperations} to act on. Defaults to {@link DBOperations.CREATE_UPDATE}
|
|
53
|
+
* @param {string} [format] The TimeStamp format. defaults to {@link DEFAULT_TIMESTAMP_FORMAT}
|
|
54
|
+
* @param {{new: UpdateValidator}} [validator] defaults to {@link TimestampValidator}
|
|
55
|
+
*
|
|
56
|
+
* @decorator timestamp
|
|
57
|
+
*
|
|
58
|
+
* @category Decorators
|
|
59
|
+
*/
|
|
60
|
+
export function timestamp(operation = DBOperations.CREATE_UPDATE, format = DEFAULT_TIMESTAMP_FORMAT) {
|
|
61
|
+
const decorators = [
|
|
62
|
+
date(format, DEFAULT_ERROR_MESSAGES.TIMESTAMP.DATE),
|
|
63
|
+
required(DEFAULT_ERROR_MESSAGES.TIMESTAMP.REQUIRED),
|
|
64
|
+
on(operation, timestampHandler),
|
|
65
|
+
];
|
|
66
|
+
if (operation.indexOf(OperationKeys.UPDATE) !== -1)
|
|
67
|
+
decorators.push(metadata(getDBUpdateKey(DBKeys.TIMESTAMP), {
|
|
68
|
+
message: DEFAULT_ERROR_MESSAGES.TIMESTAMP.INVALID,
|
|
69
|
+
}));
|
|
70
|
+
return apply(...decorators);
|
|
71
|
+
}
|
|
72
|
+
export async function serializeOnCreateUpdate(data, key, model, oldModel) {
|
|
73
|
+
if (!model[key])
|
|
74
|
+
return;
|
|
75
|
+
try {
|
|
76
|
+
model[key] = JSON.stringify(model[key]);
|
|
77
|
+
}
|
|
78
|
+
catch (e) {
|
|
79
|
+
throw new SerializationError(sf("Failed to serialize {0} property on {1} model: {2}", key, model.constructor.name, e.message));
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
export async function serializeAfterAll(data, key, model) {
|
|
83
|
+
if (!model[key])
|
|
84
|
+
return;
|
|
85
|
+
if (typeof model[key] !== "string")
|
|
86
|
+
return;
|
|
87
|
+
try {
|
|
88
|
+
model[key] = JSON.parse(model[key]);
|
|
89
|
+
}
|
|
90
|
+
catch (e) {
|
|
91
|
+
throw new SerializationError(sf("Failed to deserialize {0} property on {1} model: {2}", key, model.constructor.name, e.message));
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* @summary Serialize Decorator
|
|
96
|
+
* @description properties decorated will the serialized before stored in the db
|
|
97
|
+
*
|
|
98
|
+
* @function serialize
|
|
99
|
+
*
|
|
100
|
+
* @memberOf module:wallet-db.Decorators
|
|
101
|
+
*/
|
|
102
|
+
export function serialize() {
|
|
103
|
+
return apply(onCreateUpdate(serializeOnCreateUpdate), after(DBOperations.ALL, serializeAfterAll), type([String.name, Object.name]), metadata(Repository.key(DBKeys.SERIALIZE), {}));
|
|
104
|
+
}
|
|
105
|
+
//
|
|
106
|
+
// /**
|
|
107
|
+
// * @summary One To One relation Decorators
|
|
108
|
+
// *
|
|
109
|
+
// * @param {Constructor<any>} clazz the {@link Sequence} to use. Defaults to {@link NoneSequence}
|
|
110
|
+
// * @param {CascadeMetadata} [cascadeOptions]
|
|
111
|
+
// * @param {boolean} _populate If true, replaces the specified key in the document with the corresponding record from the database
|
|
112
|
+
// *
|
|
113
|
+
// * @function onToOne
|
|
114
|
+
// *
|
|
115
|
+
// * @memberOf module:wallet-db.Decorators
|
|
116
|
+
// *
|
|
117
|
+
// * @see oneToMany
|
|
118
|
+
// * @see manyToOne
|
|
119
|
+
// */
|
|
120
|
+
// export function oneToOne(
|
|
121
|
+
// clazz: Constructor<any>,
|
|
122
|
+
// cascadeOptions: CascadeMetadata = DefaultCascade,
|
|
123
|
+
// _populate: boolean = true,
|
|
124
|
+
// ) {
|
|
125
|
+
// Model.register(clazz);
|
|
126
|
+
// return (target: any, propertyKey: string) => {
|
|
127
|
+
// type([clazz.name, String.name])(target, propertyKey);
|
|
128
|
+
// onCreate(oneToOneOnCreate)(target, propertyKey);
|
|
129
|
+
// onUpdate(oneToOneOnUpdate, cascadeOptions as any)(target, propertyKey);
|
|
130
|
+
// onDelete(oneToOneOnDelete, cascadeOptions)(target, propertyKey);
|
|
131
|
+
//
|
|
132
|
+
// afterCreate(populate, _populate)(target, propertyKey);
|
|
133
|
+
// afterUpdate(populate, _populate)(target, propertyKey);
|
|
134
|
+
// afterRead(populate, _populate)(target, propertyKey);
|
|
135
|
+
// afterDelete(populate, _populate)(target, propertyKey);
|
|
136
|
+
//
|
|
137
|
+
// Reflect.defineMetadata(
|
|
138
|
+
// getDBKey(WalletDbKeys.ONE_TO_ONE),
|
|
139
|
+
// {
|
|
140
|
+
// constructor: clazz.name,
|
|
141
|
+
// cascade: cascadeOptions,
|
|
142
|
+
// populate: _populate,
|
|
143
|
+
// },
|
|
144
|
+
// target,
|
|
145
|
+
// propertyKey,
|
|
146
|
+
// );
|
|
147
|
+
// };
|
|
148
|
+
// }
|
|
149
|
+
//
|
|
150
|
+
// /**
|
|
151
|
+
// * @summary One To Many relation Decorators
|
|
152
|
+
// *
|
|
153
|
+
// * @param {Constructor<any>} clazz the {@link Sequence} to use. Defaults to {@link NoneSequence}
|
|
154
|
+
// * @param {CascadeMetadata} [cascadeOptions]
|
|
155
|
+
// *
|
|
156
|
+
// * @function onToMany
|
|
157
|
+
// *
|
|
158
|
+
// * @memberOf module:wallet-db.Decorators
|
|
159
|
+
// *
|
|
160
|
+
// * @see oneToOne
|
|
161
|
+
// * @see manyToOne
|
|
162
|
+
// */
|
|
163
|
+
// export function oneToMany(
|
|
164
|
+
// clazz: Constructor<any>,
|
|
165
|
+
// cascadeOptions: CascadeMetadata = DefaultCascade,
|
|
166
|
+
// _populate: boolean = true,
|
|
167
|
+
// ) {
|
|
168
|
+
// Model.register(clazz);
|
|
169
|
+
// return (target: any, propertyKey: string) => {
|
|
170
|
+
// list([clazz, String])(target, propertyKey);
|
|
171
|
+
// onCreate(oneToManyOnCreate)(target, propertyKey);
|
|
172
|
+
// onUpdate(oneToManyOnUpdate, cascadeOptions)(target, propertyKey);
|
|
173
|
+
// onDelete(oneToManyOnDelete, cascadeOptions)(target, propertyKey);
|
|
174
|
+
//
|
|
175
|
+
// afterCreate(populate, _populate)(target, propertyKey);
|
|
176
|
+
// afterUpdate(populate, _populate)(target, propertyKey);
|
|
177
|
+
// afterRead(populate, _populate)(target, propertyKey);
|
|
178
|
+
// afterDelete(populate, _populate)(target, propertyKey);
|
|
179
|
+
//
|
|
180
|
+
// Reflect.defineMetadata(
|
|
181
|
+
// getDBKey(WalletDbKeys.ONE_TO_MANY),
|
|
182
|
+
// {
|
|
183
|
+
// constructor: clazz.name,
|
|
184
|
+
// cascade: cascadeOptions,
|
|
185
|
+
// },
|
|
186
|
+
// target,
|
|
187
|
+
// propertyKey,
|
|
188
|
+
// );
|
|
189
|
+
// };
|
|
190
|
+
// }
|
|
191
|
+
//
|
|
192
|
+
// /**
|
|
193
|
+
// * @summary Many To One relation Decorators
|
|
194
|
+
// *
|
|
195
|
+
// * @param {Constructor<any>} clazz the {@link Sequence} to use. Defaults to {@link NoneSequence}
|
|
196
|
+
// * @param {CascadeMetadata} [cascadeOptions]
|
|
197
|
+
// *
|
|
198
|
+
// * @function manyToOne
|
|
199
|
+
// *
|
|
200
|
+
// * @memberOf module:wallet-db.Decorators
|
|
201
|
+
// *
|
|
202
|
+
// * @see oneToMany
|
|
203
|
+
// * @see oneToOne
|
|
204
|
+
// */
|
|
205
|
+
// export function manyToOne(
|
|
206
|
+
// clazz: Constructor<any>,
|
|
207
|
+
// cascadeOptions: CascadeMetadata = DefaultCascade,
|
|
208
|
+
// ) {
|
|
209
|
+
// Model.register(clazz);
|
|
210
|
+
// return (target: any, propertyKey: string) => {
|
|
211
|
+
// Reflect.defineMetadata(
|
|
212
|
+
// getDBKey(WalletDbKeys.MANY_TO_ONE),
|
|
213
|
+
// {
|
|
214
|
+
// constructor: clazz.name,
|
|
215
|
+
// cascade: cascadeOptions,
|
|
216
|
+
// },
|
|
217
|
+
// target,
|
|
218
|
+
// propertyKey,
|
|
219
|
+
// );
|
|
220
|
+
// };
|
|
221
|
+
// }
|
|
222
|
+
|
|
223
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy92YWxpZGF0aW9uL2RlY29yYXRvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLElBQUksRUFDSixZQUFZLEVBQ1osUUFBUSxFQUNSLEVBQUUsRUFDRixJQUFJLEdBQ0wsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN4QyxPQUFPLEVBQUUsTUFBTSxFQUFFLHdCQUF3QixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDdEUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLG9CQUFvQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzNFLE9BQU8sRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDdEUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsY0FBYyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFckUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDMUQsT0FBTyxFQUFFLEtBQUssRUFBbUIsUUFBUSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDeEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxNQUFNLFVBQVUsY0FBYyxDQUFDLEdBQVc7SUFDeEMsT0FBTyxvQkFBb0IsQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDO0FBQzVDLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSxRQUFRLENBQ3RCLFVBQWtCLHNCQUFzQixDQUFDLFFBQVEsQ0FBQyxPQUFPO0lBRXpELE9BQU8sWUFBWSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUU7UUFDbkQsT0FBTyxFQUFFLE9BQU87S0FDakIsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELE1BQU0sVUFBVSxnQkFBZ0IsQ0FJckIsSUFBTyxFQUFFLEdBQVcsRUFBRSxLQUFRO0lBQ3RDLEtBQWEsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO0FBQ25D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O0FBQ0YsTUFBTTtBQUNOLDhDQUE4QztBQUM5QyxLQUFLO0FBQ0wsbUdBQW1HO0FBQ25HLCtDQUErQztBQUMvQyxLQUFLO0FBQ0wseUJBQXlCO0FBQ3pCLEtBQUs7QUFDTCwyQ0FBMkM7QUFDM0MsS0FBSztBQUNMLG9CQUFvQjtBQUNwQixtQkFBbUI7QUFDbkIsTUFBTTtBQUNOLDZCQUE2QjtBQUM3Qiw2QkFBNkI7QUFDN0Isc0RBQXNEO0FBQ3RELE1BQU07QUFDTiwyQkFBMkI7QUFDM0IsbURBQW1EO0FBQ25ELDhCQUE4QjtBQUM5Qiw0Q0FBNEM7QUFDNUMsVUFBVTtBQUNWLG1DQUFtQztBQUNuQyxtQ0FBbUM7QUFDbkMsV0FBVztBQUNYLGdCQUFnQjtBQUNoQixxQkFBcUI7QUFDckIsU0FBUztBQUNULE9BQU87QUFDUCxJQUFJIiwiZmlsZSI6InZhbGlkYXRpb24vZGVjb3JhdG9ycy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIGRhdGUsXG4gIHByb3BNZXRhZGF0YSxcbiAgcmVxdWlyZWQsXG4gIHNmLFxuICB0eXBlLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBEQktleXMsIERFRkFVTFRfVElNRVNUQU1QX0ZPUk1BVCB9IGZyb20gXCIuLi9tb2RlbC9jb25zdGFudHNcIjtcbmltcG9ydCB7IERFRkFVTFRfRVJST1JfTUVTU0FHRVMsIFVwZGF0ZVZhbGlkYXRpb25LZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBEQk9wZXJhdGlvbnMsIE9wZXJhdGlvbktleXMgfSBmcm9tIFwiLi4vb3BlcmF0aW9ucy9jb25zdGFudHNcIjtcbmltcG9ydCB7IGFmdGVyLCBvbiwgb25DcmVhdGVVcGRhdGUgfSBmcm9tIFwiLi4vb3BlcmF0aW9ucy9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBJUmVwb3NpdG9yeSB9IGZyb20gXCIuLi9pbnRlcmZhY2VzL0lSZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBTZXJpYWxpemF0aW9uRXJyb3IgfSBmcm9tIFwiLi4vcmVwb3NpdG9yeS9lcnJvcnNcIjtcbmltcG9ydCB7IGFwcGx5LCBDdXN0b21EZWNvcmF0b3IsIG1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBSZXBvc2l0b3J5IH0gZnJvbSBcIi4uL3JlcG9zaXRvcnlcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldERCVXBkYXRlS2V5KHN0cjogc3RyaW5nKSB7XG4gIHJldHVybiBVcGRhdGVWYWxpZGF0aW9uS2V5cy5SRUZMRUNUICsgc3RyO1xufVxuXG4vKipcbiAqIE1hcmtzIHRoZSBwcm9wZXJ0eSBhcyByZWFkb25seS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIHRoZSBlcnJvciBtZXNzYWdlLiBEZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5SRUFET05MWS5JTlZBTElEfVxuICpcbiAqIEBkZWNvcmF0b3IgcmVhZG9ubHlcbiAqXG4gKiBAY2F0ZWdvcnkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZG9ubHkoXG4gIG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuUkVBRE9OTFkuSU5WQUxJRFxuKSB7XG4gIHJldHVybiBwcm9wTWV0YWRhdGEoZ2V0REJVcGRhdGVLZXkoREJLZXlzLlJFQURPTkxZKSwge1xuICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdGltZXN0YW1wSGFuZGxlcjxcbiAgVCBleHRlbmRzIE1vZGVsLFxuICBWIGV4dGVuZHMgSVJlcG9zaXRvcnk8VD4sXG4gIFkgPSBhbnksXG4+KHRoaXM6IFYsIGRhdGE6IFksIGtleTogc3RyaW5nLCBtb2RlbDogVCk6IHZvaWQge1xuICAobW9kZWwgYXMgYW55KVtrZXldID0gbmV3IERhdGUoKTtcbn1cblxuLyoqXG4gKiBNYXJrcyB0aGUgcHJvcGVydHkgYXMgdGltZXN0YW1wLlxuICogTWFrZXMgaXQge0BsaW5rIHJlcXVpcmVkfVxuICogTWFrZXMgaXQgYSB7QGxpbmsgZGF0ZX1cbiAqXG4gKiBEYXRlIEZvcm1hdDpcbiAqXG4gKiA8cHJlPlxuICogICAgICBVc2luZyBzaW1pbGFyIGZvcm1hdHRpbmcgYXMgTW9tZW50LmpzLCBDbGFzcyBEYXRlVGltZUZvcm1hdHRlciAoSmF2YSksIGFuZCBDbGFzcyBTaW1wbGVEYXRlRm9ybWF0IChKYXZhKSxcbiAqICAgICAgSSBpbXBsZW1lbnRlZCBhIGNvbXByZWhlbnNpdmUgc29sdXRpb24gZm9ybWF0RGF0ZShkYXRlLCBwYXR0ZXJuU3RyKSB3aGVyZSB0aGUgY29kZSBpcyBlYXN5IHRvIHJlYWQgYW5kIG1vZGlmeS5cbiAqICAgICAgWW91IGNhbiBkaXNwbGF5IGRhdGUsIHRpbWUsIEFNL1BNLCBldGMuXG4gKlxuICogICAgICBEYXRlIGFuZCBUaW1lIFBhdHRlcm5zXG4gKiAgICAgIHl5ID0gMi1kaWdpdCB5ZWFyOyB5eXl5ID0gZnVsbCB5ZWFyXG4gKiAgICAgIE0gPSBkaWdpdCBtb250aDsgTU0gPSAyLWRpZ2l0IG1vbnRoOyBNTU0gPSBzaG9ydCBtb250aCBuYW1lOyBNTU1NID0gZnVsbCBtb250aCBuYW1lXG4gKiAgICAgIEVFRUUgPSBmdWxsIHdlZWtkYXkgbmFtZTsgRUVFID0gc2hvcnQgd2Vla2RheSBuYW1lXG4gKiAgICAgIGQgPSBkaWdpdCBkYXk7IGRkID0gMi1kaWdpdCBkYXlcbiAqICAgICAgaCA9IGhvdXJzIGFtL3BtOyBoaCA9IDItZGlnaXQgaG91cnMgYW0vcG07IEggPSBob3VyczsgSEggPSAyLWRpZ2l0IGhvdXJzXG4gKiAgICAgIG0gPSBtaW51dGVzOyBtbSA9IDItZGlnaXQgbWludXRlczsgYWFhID0gQU0vUE1cbiAqICAgICAgcyA9IHNlY29uZHM7IHNzID0gMi1kaWdpdCBzZWNvbmRzXG4gKiAgICAgIFMgPSBtaWxpc2Vjb25kc1xuICogPC9wcmU+XG4gKlxuICogQHBhcmFtIHtzdHJpbmdbXX0gb3BlcmF0aW9uIFRoZSB7QGxpbmsgREJPcGVyYXRpb25zfSB0byBhY3Qgb24uIERlZmF1bHRzIHRvIHtAbGluayBEQk9wZXJhdGlvbnMuQ1JFQVRFX1VQREFURX1cbiAqIEBwYXJhbSB7c3RyaW5nfSBbZm9ybWF0XSBUaGUgVGltZVN0YW1wIGZvcm1hdC4gZGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfVElNRVNUQU1QX0ZPUk1BVH1cbiAqIEBwYXJhbSB7e25ldzogVXBkYXRlVmFsaWRhdG9yfX0gW3ZhbGlkYXRvcl0gZGVmYXVsdHMgdG8ge0BsaW5rIFRpbWVzdGFtcFZhbGlkYXRvcn1cbiAqXG4gKiBAZGVjb3JhdG9yIHRpbWVzdGFtcFxuICpcbiAqIEBjYXRlZ29yeSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0aW1lc3RhbXAoXG4gIG9wZXJhdGlvbjogT3BlcmF0aW9uS2V5c1tdID0gREJPcGVyYXRpb25zLkNSRUFURV9VUERBVEUgYXMgdW5rbm93biBhcyBPcGVyYXRpb25LZXlzW10sXG4gIGZvcm1hdDogc3RyaW5nID0gREVGQVVMVF9USU1FU1RBTVBfRk9STUFUXG4pIHtcbiAgY29uc3QgZGVjb3JhdG9yczogQ3VzdG9tRGVjb3JhdG9yPGFueT5bXSA9IFtcbiAgICBkYXRlKGZvcm1hdCwgREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5USU1FU1RBTVAuREFURSkgYXMgQ3VzdG9tRGVjb3JhdG9yPGFueT4sXG4gICAgcmVxdWlyZWQoREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5USU1FU1RBTVAuUkVRVUlSRUQpIGFzIEN1c3RvbURlY29yYXRvcjxhbnk+LFxuICAgIG9uKG9wZXJhdGlvbiwgdGltZXN0YW1wSGFuZGxlcikgYXMgQ3VzdG9tRGVjb3JhdG9yPGFueT4sXG4gIF07XG5cbiAgaWYgKG9wZXJhdGlvbi5pbmRleE9mKE9wZXJhdGlvbktleXMuVVBEQVRFKSAhPT0gLTEpXG4gICAgZGVjb3JhdG9ycy5wdXNoKFxuICAgICAgbWV0YWRhdGEoZ2V0REJVcGRhdGVLZXkoREJLZXlzLlRJTUVTVEFNUCksIHtcbiAgICAgICAgbWVzc2FnZTogREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5USU1FU1RBTVAuSU5WQUxJRCxcbiAgICAgIH0pXG4gICAgKTtcblxuICByZXR1cm4gYXBwbHkoLi4uZGVjb3JhdG9ycyk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXJpYWxpemVPbkNyZWF0ZVVwZGF0ZTxcbiAgVCBleHRlbmRzIE1vZGVsLFxuICBWIGV4dGVuZHMgSVJlcG9zaXRvcnk8VD4sXG4gIFkgPSBhbnksXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbj4odGhpczogViwgZGF0YTogWSwga2V5OiBzdHJpbmcsIG1vZGVsOiBULCBvbGRNb2RlbDogVCk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIShtb2RlbCBhcyBhbnkpW2tleV0pIHJldHVybjtcbiAgdHJ5IHtcbiAgICAobW9kZWwgYXMgYW55KVtrZXldID0gSlNPTi5zdHJpbmdpZnkoKG1vZGVsIGFzIGFueSlba2V5XSk7XG4gIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoXG4gICAgICBzZihcbiAgICAgICAgXCJGYWlsZWQgdG8gc2VyaWFsaXplIHswfSBwcm9wZXJ0eSBvbiB7MX0gbW9kZWw6IHsyfVwiLFxuICAgICAgICBrZXksXG4gICAgICAgIG1vZGVsLmNvbnN0cnVjdG9yLm5hbWUsXG4gICAgICAgIGUubWVzc2FnZVxuICAgICAgKVxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlcmlhbGl6ZUFmdGVyQWxsPFxuICBUIGV4dGVuZHMgTW9kZWwsXG4gIFYgZXh0ZW5kcyBJUmVwb3NpdG9yeTxUPixcbiAgWSA9IGFueSxcbj4odGhpczogViwgZGF0YTogWSwga2V5OiBzdHJpbmcsIG1vZGVsOiBUKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghKG1vZGVsIGFzIGFueSlba2V5XSkgcmV0dXJuO1xuICBpZiAodHlwZW9mIChtb2RlbCBhcyBhbnkpW2tleV0gIT09IFwic3RyaW5nXCIpIHJldHVybjtcblxuICB0cnkge1xuICAgIChtb2RlbCBhcyBhbnkpW2tleV0gPSBKU09OLnBhcnNlKChtb2RlbCBhcyBhbnkpW2tleV0pO1xuICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKFxuICAgICAgc2YoXG4gICAgICAgIFwiRmFpbGVkIHRvIGRlc2VyaWFsaXplIHswfSBwcm9wZXJ0eSBvbiB7MX0gbW9kZWw6IHsyfVwiLFxuICAgICAgICBrZXksXG4gICAgICAgIG1vZGVsLmNvbnN0cnVjdG9yLm5hbWUsXG4gICAgICAgIGUubWVzc2FnZVxuICAgICAgKVxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBTZXJpYWxpemUgRGVjb3JhdG9yXG4gKiBAZGVzY3JpcHRpb24gcHJvcGVydGllcyBkZWNvcmF0ZWQgd2lsbCB0aGUgc2VyaWFsaXplZCBiZWZvcmUgc3RvcmVkIGluIHRoZSBkYlxuICpcbiAqIEBmdW5jdGlvbiBzZXJpYWxpemVcbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOndhbGxldC1kYi5EZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemUoKSB7XG4gIHJldHVybiBhcHBseShcbiAgICBvbkNyZWF0ZVVwZGF0ZShzZXJpYWxpemVPbkNyZWF0ZVVwZGF0ZSksXG4gICAgYWZ0ZXIoREJPcGVyYXRpb25zLkFMTCwgc2VyaWFsaXplQWZ0ZXJBbGwpLFxuICAgIHR5cGUoW1N0cmluZy5uYW1lLCBPYmplY3QubmFtZV0pLFxuICAgIG1ldGFkYXRhKFJlcG9zaXRvcnkua2V5KERCS2V5cy5TRVJJQUxJWkUpLCB7fSlcbiAgKTtcbn1cblxuLy9cbi8vIC8qKlxuLy8gICogQHN1bW1hcnkgT25lIFRvIE9uZSByZWxhdGlvbiBEZWNvcmF0b3JzXG4vLyAgKlxuLy8gICogQHBhcmFtIHtDb25zdHJ1Y3Rvcjxhbnk+fSBjbGF6eiB0aGUge0BsaW5rIFNlcXVlbmNlfSB0byB1c2UuIERlZmF1bHRzIHRvIHtAbGluayBOb25lU2VxdWVuY2V9XG4vLyAgKiBAcGFyYW0ge0Nhc2NhZGVNZXRhZGF0YX0gW2Nhc2NhZGVPcHRpb25zXVxuLy8gICogQHBhcmFtIHtib29sZWFufSBfcG9wdWxhdGUgSWYgdHJ1ZSwgcmVwbGFjZXMgdGhlIHNwZWNpZmllZCBrZXkgaW4gdGhlIGRvY3VtZW50IHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgcmVjb3JkIGZyb20gdGhlIGRhdGFiYXNlXG4vLyAgKlxuLy8gICogQGZ1bmN0aW9uIG9uVG9PbmVcbi8vICAqXG4vLyAgKiBAbWVtYmVyT2YgbW9kdWxlOndhbGxldC1kYi5EZWNvcmF0b3JzXG4vLyAgKlxuLy8gICogQHNlZSBvbmVUb01hbnlcbi8vICAqIEBzZWUgbWFueVRvT25lXG4vLyAgKi9cbi8vIGV4cG9ydCBmdW5jdGlvbiBvbmVUb09uZShcbi8vICAgY2xheno6IENvbnN0cnVjdG9yPGFueT4sXG4vLyAgIGNhc2NhZGVPcHRpb25zOiBDYXNjYWRlTWV0YWRhdGEgPSBEZWZhdWx0Q2FzY2FkZSxcbi8vICAgX3BvcHVsYXRlOiBib29sZWFuID0gdHJ1ZSxcbi8vICkge1xuLy8gICBNb2RlbC5yZWdpc3RlcihjbGF6eik7XG4vLyAgIHJldHVybiAodGFyZ2V0OiBhbnksIHByb3BlcnR5S2V5OiBzdHJpbmcpID0+IHtcbi8vICAgICB0eXBlKFtjbGF6ei5uYW1lLCBTdHJpbmcubmFtZV0pKHRhcmdldCwgcHJvcGVydHlLZXkpO1xuLy8gICAgIG9uQ3JlYXRlKG9uZVRvT25lT25DcmVhdGUpKHRhcmdldCwgcHJvcGVydHlLZXkpO1xuLy8gICAgIG9uVXBkYXRlKG9uZVRvT25lT25VcGRhdGUsIGNhc2NhZGVPcHRpb25zIGFzIGFueSkodGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4vLyAgICAgb25EZWxldGUob25lVG9PbmVPbkRlbGV0ZSwgY2FzY2FkZU9wdGlvbnMpKHRhcmdldCwgcHJvcGVydHlLZXkpO1xuLy9cbi8vICAgICBhZnRlckNyZWF0ZShwb3B1bGF0ZSwgX3BvcHVsYXRlKSh0YXJnZXQsIHByb3BlcnR5S2V5KTtcbi8vICAgICBhZnRlclVwZGF0ZShwb3B1bGF0ZSwgX3BvcHVsYXRlKSh0YXJnZXQsIHByb3BlcnR5S2V5KTtcbi8vICAgICBhZnRlclJlYWQocG9wdWxhdGUsIF9wb3B1bGF0ZSkodGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4vLyAgICAgYWZ0ZXJEZWxldGUocG9wdWxhdGUsIF9wb3B1bGF0ZSkodGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4vL1xuLy8gICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXG4vLyAgICAgICBnZXREQktleShXYWxsZXREYktleXMuT05FX1RPX09ORSksXG4vLyAgICAgICB7XG4vLyAgICAgICAgIGNvbnN0cnVjdG9yOiBjbGF6ei5uYW1lLFxuLy8gICAgICAgICBjYXNjYWRlOiBjYXNjYWRlT3B0aW9ucyxcbi8vICAgICAgICAgcG9wdWxhdGU6IF9wb3B1bGF0ZSxcbi8vICAgICAgIH0sXG4vLyAgICAgICB0YXJnZXQsXG4vLyAgICAgICBwcm9wZXJ0eUtleSxcbi8vICAgICApO1xuLy8gICB9O1xuLy8gfVxuLy9cbi8vIC8qKlxuLy8gICogQHN1bW1hcnkgT25lIFRvIE1hbnkgcmVsYXRpb24gRGVjb3JhdG9yc1xuLy8gICpcbi8vICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8YW55Pn0gY2xhenogdGhlIHtAbGluayBTZXF1ZW5jZX0gdG8gdXNlLiBEZWZhdWx0cyB0byB7QGxpbmsgTm9uZVNlcXVlbmNlfVxuLy8gICogQHBhcmFtIHtDYXNjYWRlTWV0YWRhdGF9IFtjYXNjYWRlT3B0aW9uc11cbi8vICAqXG4vLyAgKiBAZnVuY3Rpb24gb25Ub01hbnlcbi8vICAqXG4vLyAgKiBAbWVtYmVyT2YgbW9kdWxlOndhbGxldC1kYi5EZWNvcmF0b3JzXG4vLyAgKlxuLy8gICogQHNlZSBvbmVUb09uZVxuLy8gICogQHNlZSBtYW55VG9PbmVcbi8vICAqL1xuLy8gZXhwb3J0IGZ1bmN0aW9uIG9uZVRvTWFueShcbi8vICAgY2xheno6IENvbnN0cnVjdG9yPGFueT4sXG4vLyAgIGNhc2NhZGVPcHRpb25zOiBDYXNjYWRlTWV0YWRhdGEgPSBEZWZhdWx0Q2FzY2FkZSxcbi8vICAgX3BvcHVsYXRlOiBib29sZWFuID0gdHJ1ZSxcbi8vICkge1xuLy8gICBNb2RlbC5yZWdpc3RlcihjbGF6eik7XG4vLyAgIHJldHVybiAodGFyZ2V0OiBhbnksIHByb3BlcnR5S2V5OiBzdHJpbmcpID0+IHtcbi8vICAgICBsaXN0KFtjbGF6eiwgU3RyaW5nXSkodGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4vLyAgICAgb25DcmVhdGUob25lVG9NYW55T25DcmVhdGUpKHRhcmdldCwgcHJvcGVydHlLZXkpO1xuLy8gICAgIG9uVXBkYXRlKG9uZVRvTWFueU9uVXBkYXRlLCBjYXNjYWRlT3B0aW9ucykodGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4vLyAgICAgb25EZWxldGUob25lVG9NYW55T25EZWxldGUsIGNhc2NhZGVPcHRpb25zKSh0YXJnZXQsIHByb3BlcnR5S2V5KTtcbi8vXG4vLyAgICAgYWZ0ZXJDcmVhdGUocG9wdWxhdGUsIF9wb3B1bGF0ZSkodGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4vLyAgICAgYWZ0ZXJVcGRhdGUocG9wdWxhdGUsIF9wb3B1bGF0ZSkodGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4vLyAgICAgYWZ0ZXJSZWFkKHBvcHVsYXRlLCBfcG9wdWxhdGUpKHRhcmdldCwgcHJvcGVydHlLZXkpO1xuLy8gICAgIGFmdGVyRGVsZXRlKHBvcHVsYXRlLCBfcG9wdWxhdGUpKHRhcmdldCwgcHJvcGVydHlLZXkpO1xuLy9cbi8vICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuLy8gICAgICAgZ2V0REJLZXkoV2FsbGV0RGJLZXlzLk9ORV9UT19NQU5ZKSxcbi8vICAgICAgIHtcbi8vICAgICAgICAgY29uc3RydWN0b3I6IGNsYXp6Lm5hbWUsXG4vLyAgICAgICAgIGNhc2NhZGU6IGNhc2NhZGVPcHRpb25zLFxuLy8gICAgICAgfSxcbi8vICAgICAgIHRhcmdldCxcbi8vICAgICAgIHByb3BlcnR5S2V5LFxuLy8gICAgICk7XG4vLyAgIH07XG4vLyB9XG4vL1xuLy8gLyoqXG4vLyAgKiBAc3VtbWFyeSBNYW55IFRvIE9uZSByZWxhdGlvbiBEZWNvcmF0b3JzXG4vLyAgKlxuLy8gICogQHBhcmFtIHtDb25zdHJ1Y3Rvcjxhbnk+fSBjbGF6eiB0aGUge0BsaW5rIFNlcXVlbmNlfSB0byB1c2UuIERlZmF1bHRzIHRvIHtAbGluayBOb25lU2VxdWVuY2V9XG4vLyAgKiBAcGFyYW0ge0Nhc2NhZGVNZXRhZGF0YX0gW2Nhc2NhZGVPcHRpb25zXVxuLy8gICpcbi8vICAqIEBmdW5jdGlvbiBtYW55VG9PbmVcbi8vICAqXG4vLyAgKiBAbWVtYmVyT2YgbW9kdWxlOndhbGxldC1kYi5EZWNvcmF0b3JzXG4vLyAgKlxuLy8gICogQHNlZSBvbmVUb01hbnlcbi8vICAqIEBzZWUgb25lVG9PbmVcbi8vICAqL1xuLy8gZXhwb3J0IGZ1bmN0aW9uIG1hbnlUb09uZShcbi8vICAgY2xheno6IENvbnN0cnVjdG9yPGFueT4sXG4vLyAgIGNhc2NhZGVPcHRpb25zOiBDYXNjYWRlTWV0YWRhdGEgPSBEZWZhdWx0Q2FzY2FkZSxcbi8vICkge1xuLy8gICBNb2RlbC5yZWdpc3RlcihjbGF6eik7XG4vLyAgIHJldHVybiAodGFyZ2V0OiBhbnksIHByb3BlcnR5S2V5OiBzdHJpbmcpID0+IHtcbi8vICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuLy8gICAgICAgZ2V0REJLZXkoV2FsbGV0RGJLZXlzLk1BTllfVE9fT05FKSxcbi8vICAgICAgIHtcbi8vICAgICAgICAgY29uc3RydWN0b3I6IGNsYXp6Lm5hbWUsXG4vLyAgICAgICAgIGNhc2NhZGU6IGNhc2NhZGVPcHRpb25zLFxuLy8gICAgICAgfSxcbi8vICAgICAgIHRhcmdldCxcbi8vICAgICAgIHByb3BlcnR5S2V5LFxuLy8gICAgICk7XG4vLyAgIH07XG4vLyB9XG4iXX0=
|