UNPKG

@udraft/core

Version:

uDraft is a language and stack agnostic code-generation tool that simplifies full-stack development by converting a single YAML file into code for rapid development.

96 lines (80 loc) 2.17 kB
import { uModel } from "../shortcuts/entities"; import { UAttribute } from "./attribute"; import { UField } from "./field"; export class UModel { private _name: string; private _fields: UField[] = []; private _attributes: UAttribute<any>[] = []; constructor(name: string) { this._name = name; } $name() { return this._name; } $field(field: UField | string) { return ( this._fields.find((f) => { return typeof field == "string" ? f.$name() == field : f.$name() == field.$name(); }) ?? null ); } $fields() { return [...this._fields]; } $attribute<Type>(attribute: UAttribute<Type> | string) { const a = this._attributes.find((attr) => typeof attribute == "string" ? attr.$name() == attribute : attr.$name() == attribute.$name() ); return a ? a : null; } $attributes() { return [...this._attributes]; } attributes(attributes: UAttribute<any>[]) { this.removeAttributes(attributes); this._attributes = this._attributes.concat(attributes); return this; } name(name: string) { this._name = name; return this; } fields(fields: UField[]) { this.remove(fields); this._fields = this._fields.concat(fields); return this; } extends(model: UModel) { return this.fields(model.$fields()); } remove(fields: (UField | string)[]) { this._fields = this._fields.filter( (field) => !fields.some((f) => { if (typeof f == "string") return f == field.$name(); else return f.$name() == field.$name(); }) ); return this; } pick(srcModel: UModel, fields: (UField | string)[]) { const picked = this._fields.filter((field) => fields.some((f) => { if (typeof f == "string") return f == field.$name(); else return f.$name() == field.$name(); }) ); srcModel.fields(picked); return this; } removeAttributes(attributes: UAttribute<any>[]) { this._attributes = this._attributes.filter( (attribute) => !attributes.some((a) => a.$name() == attribute.$name()) ); return this; } }