@decaf-ts/decorator-validation
Version:
simple decorator based validation engine
130 lines • 10.8 kB
JavaScript
;
// import { Model } from "./Model";
// import { Constructor, ModelArg } from "./types";
// import { ObjectAccumulator } from "typed-object-accumulator";
//
// export interface DecorateOption<M extends Model> {
// decorate(...decorators: PropertyDecorator[]): ModelBuilder<M>;
// }
//
// export class AttributeBuilder<M extends Model, N extends keyof M, T>
// implements DecorateOption<M>
// {
// constructor(
// protected parent: ModelBuilder<M>,
// readonly attr: keyof M,
// readonly type: T
// ) {}
//
// private decorators: Set<PropertyDecorator> = new Set();
//
// decorate(...decorators: PropertyDecorator[]): ModelBuilder<M> {
// for (const decorator of decorators) {
// if (this.decorators.has(decorator))
// throw new Error(`Decorator "${decorator}" has already been used`);
// this.decorators.add(decorator);
// }
// return this.parent;
// }
//
// undecorate(...decorators: PropertyDecorator[]) {
// for (const decorator of decorators) {
// if (!this.decorators.has(decorator))
// throw new Error(
// `Decorator "${decorator}" is not applied to ${this.attr as string}`
// );
// this.decorators.delete(decorator);
// }
// return this.parent;
// }
//
// apply(obj: Constructor<M>): ModelBuilder<M> {
// Object.defineProperty(obj, this.attr, {
// value: undefined,
// });
// this.decorators.forEach((decorator) => {
// try {
// decorator(obj, this.attr as any);
// } catch (e: unknown) {
// throw new Error(
// `Failed to apply decorator to property "${this.attr as any}": ${e}`
// );
// }
// });
// //
// // const c = `${this.attr.toString()}` as const;
// //
// // const temp: {
// // [c]: T
// // } = {
// // [this.attr]: 0
// // }
//
// return this.parent.accumulate() as unknown as ModelBuilder<M & Record<N, T>>;
// }
// }
//
// export class ModelBuilder<M extends Model = Model> extends ObjectAccumulator<M>{
// private attributes: Map<string, AttributeBuilder<M, any, any>> = new Map();
// private _name?: string;
//
// private _parent?: Constructor<M>;
//
// setName(name: string) {
// this._name = name;
// return this;
// }
//
// private attribute<T, N extends symbol>(
// attr: string,
// type: T
// ): AttributeBuilder<M, N, T> {
// return new AttributeBuilder<M, N, T>(this, attr as any, type);
// }
//
// string(attr: string) {
// return this.attribute(attr, String.name);
// }
//
// number(attr: string) {
// return this.attribute(attr, Number.name);
// }
//
// date(attr: string) {
// return this.attribute(attr, Date.name);
// }
//
// bigint(attr: string) {
// return this.attribute(attr, BigInt.name);
// }
//
// instance(clazz: Constructor<any>, attr: string) {
// return this.attribute(attr, clazz.name);
// }
//
// build(): Constructor<M> {
// if (!this._name) throw new Error("name is required");
//
// const DynamicBuiltClass = class<M> extends Model {
// constructor(arg?: ModelArg<M>) {
// super(arg as any);
// }
// };
//
// Object.defineProperty(DynamicBuiltClass, "name", {
// value: this._name,
// writable: false,
// });
//
// this.attributes.forEach((attribute) => {
// attribute.apply(DynamicBuiltClass as any);
// });
//
// return DynamicBuiltClass as unknown as Constructor<M>;
// }
//
// static get builder() {
// return new ModelBuilder();
// }
// }
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tb2RlbC9CdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxtQ0FBbUM7QUFDbkMsbURBQW1EO0FBQ25ELGdFQUFnRTtBQUNoRSxFQUFFO0FBQ0YscURBQXFEO0FBQ3JELG1FQUFtRTtBQUNuRSxJQUFJO0FBQ0osRUFBRTtBQUNGLHVFQUF1RTtBQUN2RSxpQ0FBaUM7QUFDakMsSUFBSTtBQUNKLGlCQUFpQjtBQUNqQix5Q0FBeUM7QUFDekMsOEJBQThCO0FBQzlCLHVCQUF1QjtBQUN2QixTQUFTO0FBQ1QsRUFBRTtBQUNGLDREQUE0RDtBQUM1RCxFQUFFO0FBQ0Ysb0VBQW9FO0FBQ3BFLDRDQUE0QztBQUM1Qyw0Q0FBNEM7QUFDNUMsNkVBQTZFO0FBQzdFLHdDQUF3QztBQUN4QyxRQUFRO0FBQ1IsMEJBQTBCO0FBQzFCLE1BQU07QUFDTixFQUFFO0FBQ0YscURBQXFEO0FBQ3JELDRDQUE0QztBQUM1Qyw2Q0FBNkM7QUFDN0MsMkJBQTJCO0FBQzNCLGdGQUFnRjtBQUNoRixhQUFhO0FBQ2IsMkNBQTJDO0FBQzNDLFFBQVE7QUFDUiwwQkFBMEI7QUFDMUIsTUFBTTtBQUNOLEVBQUU7QUFDRixrREFBa0Q7QUFDbEQsOENBQThDO0FBQzlDLDBCQUEwQjtBQUMxQixVQUFVO0FBQ1YsK0NBQStDO0FBQy9DLGNBQWM7QUFDZCw0Q0FBNEM7QUFDNUMsK0JBQStCO0FBQy9CLDJCQUEyQjtBQUMzQixnRkFBZ0Y7QUFDaEYsYUFBYTtBQUNiLFVBQVU7QUFDVixVQUFVO0FBQ1YsU0FBUztBQUNULHVEQUF1RDtBQUN2RCxTQUFTO0FBQ1QsdUJBQXVCO0FBQ3ZCLGtCQUFrQjtBQUNsQixlQUFlO0FBQ2YsMEJBQTBCO0FBQzFCLFdBQVc7QUFDWCxFQUFFO0FBQ0Ysb0ZBQW9GO0FBQ3BGLE1BQU07QUFDTixJQUFJO0FBQ0osRUFBRTtBQUNGLG1GQUFtRjtBQUNuRixnRkFBZ0Y7QUFDaEYsNEJBQTRCO0FBQzVCLEVBQUU7QUFDRixzQ0FBc0M7QUFDdEMsRUFBRTtBQUNGLDRCQUE0QjtBQUM1Qix5QkFBeUI7QUFDekIsbUJBQW1CO0FBQ25CLE1BQU07QUFDTixFQUFFO0FBQ0YsNENBQTRDO0FBQzVDLG9CQUFvQjtBQUNwQixjQUFjO0FBQ2QsbUNBQW1DO0FBQ25DLHFFQUFxRTtBQUNyRSxNQUFNO0FBQ04sRUFBRTtBQUNGLDJCQUEyQjtBQUMzQixnREFBZ0Q7QUFDaEQsTUFBTTtBQUNOLEVBQUU7QUFDRiwyQkFBMkI7QUFDM0IsZ0RBQWdEO0FBQ2hELE1BQU07QUFDTixFQUFFO0FBQ0YseUJBQXlCO0FBQ3pCLDhDQUE4QztBQUM5QyxNQUFNO0FBQ04sRUFBRTtBQUNGLDJCQUEyQjtBQUMzQixnREFBZ0Q7QUFDaEQsTUFBTTtBQUNOLEVBQUU7QUFDRixzREFBc0Q7QUFDdEQsK0NBQStDO0FBQy9DLE1BQU07QUFDTixFQUFFO0FBQ0YsOEJBQThCO0FBQzlCLDREQUE0RDtBQUM1RCxFQUFFO0FBQ0YseURBQXlEO0FBQ3pELHlDQUF5QztBQUN6Qyw2QkFBNkI7QUFDN0IsVUFBVTtBQUNWLFNBQVM7QUFDVCxFQUFFO0FBQ0YseURBQXlEO0FBQ3pELDJCQUEyQjtBQUMzQix5QkFBeUI7QUFDekIsVUFBVTtBQUNWLEVBQUU7QUFDRiwrQ0FBK0M7QUFDL0MsbURBQW1EO0FBQ25ELFVBQVU7QUFDVixFQUFFO0FBQ0YsNkRBQTZEO0FBQzdELE1BQU07QUFDTixFQUFFO0FBQ0YsMkJBQTJCO0FBQzNCLGlDQUFpQztBQUNqQyxNQUFNO0FBQ04sSUFBSSIsInNvdXJjZXNDb250ZW50IjpbIi8vIGltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIi4vTW9kZWxcIjtcbi8vIGltcG9ydCB7IENvbnN0cnVjdG9yLCBNb2RlbEFyZyB9IGZyb20gXCIuL3R5cGVzXCI7XG4vLyBpbXBvcnQgeyBPYmplY3RBY2N1bXVsYXRvciB9IGZyb20gXCJ0eXBlZC1vYmplY3QtYWNjdW11bGF0b3JcIjtcbi8vXG4vLyBleHBvcnQgaW50ZXJmYWNlIERlY29yYXRlT3B0aW9uPE0gZXh0ZW5kcyBNb2RlbD4ge1xuLy8gICBkZWNvcmF0ZSguLi5kZWNvcmF0b3JzOiBQcm9wZXJ0eURlY29yYXRvcltdKTogTW9kZWxCdWlsZGVyPE0+O1xuLy8gfVxuLy9cbi8vIGV4cG9ydCBjbGFzcyBBdHRyaWJ1dGVCdWlsZGVyPE0gZXh0ZW5kcyBNb2RlbCwgTiBleHRlbmRzIGtleW9mIE0sIFQ+XG4vLyAgIGltcGxlbWVudHMgRGVjb3JhdGVPcHRpb248TT5cbi8vIHtcbi8vICAgY29uc3RydWN0b3IoXG4vLyAgICAgcHJvdGVjdGVkIHBhcmVudDogTW9kZWxCdWlsZGVyPE0+LFxuLy8gICAgIHJlYWRvbmx5IGF0dHI6IGtleW9mIE0sXG4vLyAgICAgcmVhZG9ubHkgdHlwZTogVFxuLy8gICApIHt9XG4vL1xuLy8gICBwcml2YXRlIGRlY29yYXRvcnM6IFNldDxQcm9wZXJ0eURlY29yYXRvcj4gPSBuZXcgU2V0KCk7XG4vL1xuLy8gICBkZWNvcmF0ZSguLi5kZWNvcmF0b3JzOiBQcm9wZXJ0eURlY29yYXRvcltdKTogTW9kZWxCdWlsZGVyPE0+IHtcbi8vICAgICBmb3IgKGNvbnN0IGRlY29yYXRvciBvZiBkZWNvcmF0b3JzKSB7XG4vLyAgICAgICBpZiAodGhpcy5kZWNvcmF0b3JzLmhhcyhkZWNvcmF0b3IpKVxuLy8gICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYERlY29yYXRvciBcIiR7ZGVjb3JhdG9yfVwiIGhhcyBhbHJlYWR5IGJlZW4gdXNlZGApO1xuLy8gICAgICAgdGhpcy5kZWNvcmF0b3JzLmFkZChkZWNvcmF0b3IpO1xuLy8gICAgIH1cbi8vICAgICByZXR1cm4gdGhpcy5wYXJlbnQ7XG4vLyAgIH1cbi8vXG4vLyAgIHVuZGVjb3JhdGUoLi4uZGVjb3JhdG9yczogUHJvcGVydHlEZWNvcmF0b3JbXSkge1xuLy8gICAgIGZvciAoY29uc3QgZGVjb3JhdG9yIG9mIGRlY29yYXRvcnMpIHtcbi8vICAgICAgIGlmICghdGhpcy5kZWNvcmF0b3JzLmhhcyhkZWNvcmF0b3IpKVxuLy8gICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4vLyAgICAgICAgICAgYERlY29yYXRvciBcIiR7ZGVjb3JhdG9yfVwiIGlzIG5vdCBhcHBsaWVkIHRvICR7dGhpcy5hdHRyIGFzIHN0cmluZ31gXG4vLyAgICAgICAgICk7XG4vLyAgICAgICB0aGlzLmRlY29yYXRvcnMuZGVsZXRlKGRlY29yYXRvcik7XG4vLyAgICAgfVxuLy8gICAgIHJldHVybiB0aGlzLnBhcmVudDtcbi8vICAgfVxuLy9cbi8vICAgYXBwbHkob2JqOiBDb25zdHJ1Y3RvcjxNPik6IE1vZGVsQnVpbGRlcjxNPiB7XG4vLyAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgdGhpcy5hdHRyLCB7XG4vLyAgICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuLy8gICAgIH0pO1xuLy8gICAgIHRoaXMuZGVjb3JhdG9ycy5mb3JFYWNoKChkZWNvcmF0b3IpID0+IHtcbi8vICAgICAgIHRyeSB7XG4vLyAgICAgICAgIGRlY29yYXRvcihvYmosIHRoaXMuYXR0ciBhcyBhbnkpO1xuLy8gICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuLy8gICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4vLyAgICAgICAgICAgYEZhaWxlZCB0byBhcHBseSBkZWNvcmF0b3IgdG8gcHJvcGVydHkgXCIke3RoaXMuYXR0ciBhcyBhbnl9XCI6ICR7ZX1gXG4vLyAgICAgICAgICk7XG4vLyAgICAgICB9XG4vLyAgICAgfSk7XG4vLyAgICAgLy9cbi8vICAgICAvLyBjb25zdCBjID0gYCR7dGhpcy5hdHRyLnRvU3RyaW5nKCl9YCBhcyBjb25zdDtcbi8vICAgICAvL1xuLy8gICAgIC8vIGNvbnN0IHRlbXA6IHtcbi8vICAgICAvLyAgIFtjXTogVFxuLy8gICAgIC8vIH0gPSB7XG4vLyAgICAgLy8gICBbdGhpcy5hdHRyXTogMFxuLy8gICAgIC8vIH1cbi8vXG4vLyAgICAgcmV0dXJuIHRoaXMucGFyZW50LmFjY3VtdWxhdGUoKSBhcyB1bmtub3duIGFzIE1vZGVsQnVpbGRlcjxNICYgUmVjb3JkPE4sIFQ+Pjtcbi8vICAgfVxuLy8gfVxuLy9cbi8vIGV4cG9ydCBjbGFzcyBNb2RlbEJ1aWxkZXI8TSBleHRlbmRzIE1vZGVsID0gTW9kZWw+IGV4dGVuZHMgT2JqZWN0QWNjdW11bGF0b3I8TT57XG4vLyAgIHByaXZhdGUgYXR0cmlidXRlczogTWFwPHN0cmluZywgQXR0cmlidXRlQnVpbGRlcjxNLCBhbnksIGFueT4+ID0gbmV3IE1hcCgpO1xuLy8gICBwcml2YXRlIF9uYW1lPzogc3RyaW5nO1xuLy9cbi8vICAgcHJpdmF0ZSBfcGFyZW50PzogQ29uc3RydWN0b3I8TT47XG4vL1xuLy8gICBzZXROYW1lKG5hbWU6IHN0cmluZykge1xuLy8gICAgIHRoaXMuX25hbWUgPSBuYW1lO1xuLy8gICAgIHJldHVybiB0aGlzO1xuLy8gICB9XG4vL1xuLy8gICBwcml2YXRlIGF0dHJpYnV0ZTxULCBOIGV4dGVuZHMgc3ltYm9sPihcbi8vICAgICBhdHRyOiBzdHJpbmcsXG4vLyAgICAgdHlwZTogVFxuLy8gICApOiBBdHRyaWJ1dGVCdWlsZGVyPE0sIE4sIFQ+IHtcbi8vICAgICByZXR1cm4gbmV3IEF0dHJpYnV0ZUJ1aWxkZXI8TSwgTiwgVD4odGhpcywgYXR0ciBhcyBhbnksIHR5cGUpO1xuLy8gICB9XG4vL1xuLy8gICBzdHJpbmcoYXR0cjogc3RyaW5nKSB7XG4vLyAgICAgcmV0dXJuIHRoaXMuYXR0cmlidXRlKGF0dHIsIFN0cmluZy5uYW1lKTtcbi8vICAgfVxuLy9cbi8vICAgbnVtYmVyKGF0dHI6IHN0cmluZykge1xuLy8gICAgIHJldHVybiB0aGlzLmF0dHJpYnV0ZShhdHRyLCBOdW1iZXIubmFtZSk7XG4vLyAgIH1cbi8vXG4vLyAgIGRhdGUoYXR0cjogc3RyaW5nKSB7XG4vLyAgICAgcmV0dXJuIHRoaXMuYXR0cmlidXRlKGF0dHIsIERhdGUubmFtZSk7XG4vLyAgIH1cbi8vXG4vLyAgIGJpZ2ludChhdHRyOiBzdHJpbmcpIHtcbi8vICAgICByZXR1cm4gdGhpcy5hdHRyaWJ1dGUoYXR0ciwgQmlnSW50Lm5hbWUpO1xuLy8gICB9XG4vL1xuLy8gICBpbnN0YW5jZShjbGF6ejogQ29uc3RydWN0b3I8YW55PiwgYXR0cjogc3RyaW5nKSB7XG4vLyAgICAgcmV0dXJuIHRoaXMuYXR0cmlidXRlKGF0dHIsIGNsYXp6Lm5hbWUpO1xuLy8gICB9XG4vL1xuLy8gICBidWlsZCgpOiBDb25zdHJ1Y3RvcjxNPiB7XG4vLyAgICAgaWYgKCF0aGlzLl9uYW1lKSB0aHJvdyBuZXcgRXJyb3IoXCJuYW1lIGlzIHJlcXVpcmVkXCIpO1xuLy9cbi8vICAgICBjb25zdCBEeW5hbWljQnVpbHRDbGFzcyA9IGNsYXNzPE0+IGV4dGVuZHMgTW9kZWwge1xuLy8gICAgICAgY29uc3RydWN0b3IoYXJnPzogTW9kZWxBcmc8TT4pIHtcbi8vICAgICAgICAgc3VwZXIoYXJnIGFzIGFueSk7XG4vLyAgICAgICB9XG4vLyAgICAgfTtcbi8vXG4vLyAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KER5bmFtaWNCdWlsdENsYXNzLCBcIm5hbWVcIiwge1xuLy8gICAgICAgdmFsdWU6IHRoaXMuX25hbWUsXG4vLyAgICAgICB3cml0YWJsZTogZmFsc2UsXG4vLyAgICAgfSk7XG4vL1xuLy8gICAgIHRoaXMuYXR0cmlidXRlcy5mb3JFYWNoKChhdHRyaWJ1dGUpID0+IHtcbi8vICAgICAgIGF0dHJpYnV0ZS5hcHBseShEeW5hbWljQnVpbHRDbGFzcyBhcyBhbnkpO1xuLy8gICAgIH0pO1xuLy9cbi8vICAgICByZXR1cm4gRHluYW1pY0J1aWx0Q2xhc3MgYXMgdW5rbm93biBhcyBDb25zdHJ1Y3RvcjxNPjtcbi8vICAgfVxuLy9cbi8vICAgc3RhdGljIGdldCBidWlsZGVyKCkge1xuLy8gICAgIHJldHVybiBuZXcgTW9kZWxCdWlsZGVyKCk7XG4vLyAgIH1cbi8vIH1cbiJdfQ==