UNPKG

@decaf-ts/decorator-validation

Version:
130 lines 10.8 kB
"use strict"; // 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==