UNPKG

claire-framework

Version:

- được viết bằng TypeScript - hỗ trợ websocket và HTTP request - hỗ trợ CLI để generate base project (claire-cli)

156 lines 14.1 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const ObjectValidationMetadata_1 = require("../validator/ObjectValidationMetadata"); const ClaireError_1 = require("../system/ClaireError"); const errors_1 = require("../system/errors"); const core_1 = require("../decorator/core"); const Utils_1 = require("../system/Utils"); class ModelMetadata extends ObjectValidationMetadata_1.ObjectValidationMetadata { constructor() { super(); } getPrimaryKey() { return this.fields.find(f => f.isPrimaryKey === true); } addField(field) { this.fields.push(field); } getFieldByLogicName(fieldLogicName) { return this.fields.find((f) => f.fieldLogicName === fieldLogicName); } getFieldByDataName(fieldDataName) { return this.fields.find((f) => f.fieldDataName === fieldDataName); } getDefaultLogicValues() { let result = {}; this.fields.forEach((field) => { if (field.defaultValue !== undefined) { // @ts-ignore result[field.fieldLogicName] = typeof field.defaultValue === "function" ? field.defaultValue() : field.defaultValue; } }); return result; } static isNotEmptyMetadata(meta) { return meta.tableName !== undefined || meta.fields.some((f) => f.fieldDataName !== undefined || f.isPrimaryKey !== undefined || f.isForeignKey !== undefined || f.isAutoIncrement !== undefined || f.isUnique !== undefined || f.referModel !== undefined || f.dataType !== undefined || f.nullable !== undefined || f.defaultValue !== undefined); } ; normalizeMetadata() { //-- normalize the metadata for (let i = this.fields.length - 1; i >= 0; i--) { let field = this.fields[i]; //-- if field data name is null then get from field logic name if (!field.fieldDataName) { field.fieldDataName = field.fieldLogicName; } //-- if field inner type is null then get from field data type if (!field.innerDataType) { field.innerDataType = field.dataType; } //-- if field is get set then set the logic name if (field.getSetField) { field.fieldLogicName = field.getSetField; } } } assertValid() { this.normalizeMetadata(); if (!this.tableName) { throw new ClaireError_1.ClaireError(errors_1.INVALID_MODEL_METADATA, this.modelName); } let primaryKey = this.getPrimaryKey(); if (!primaryKey) { throw new ClaireError_1.ClaireError(errors_1.TABLE_HAS_NO_PRIMARY_KEY, this.modelName); } if (!Utils_1.Utils.supportedPrimaryKeyDataTypes(primaryKey.dataType)) { throw new ClaireError_1.ClaireError(errors_1.UNSUPPORTED_PRIMARY_KEY_DATA_TYPE, this.modelName); } this.fields.forEach((f) => { if (f.fieldDataName === undefined || f.innerDataType === undefined) { throw new ClaireError_1.ClaireError(errors_1.INVALID_MODEL_METADATA, this.modelName); } }); } static fromModel(model) { return model.prototype[core_1.METADATA]; } static dependencySort(modelMetaData) { let result = []; let metaDataArray = modelMetaData.map((tableMetaData) => ({ metaData: tableMetaData, dependencies: new Array() })); //-- first find all the dependencies of current table and add to the dependencies array for (let i = 0; i < metaDataArray.length; i++) { let metaData = metaDataArray[i]; //-- check for dependencies let fields = metaData.metaData.fields; for (let j = 0; j < fields.length; j++) { let field = fields[j]; if (field.isForeignKey) { if (!!field.referModel) { let referredModel = modelMetaData.find(m => m.modelName === field.referModel); if (!!referredModel && referredModel.modelName) { if (referredModel.getPrimaryKey().innerDataType !== field.innerDataType) { throw new ClaireError_1.ClaireError(errors_1.FOREIGN_KEY_TYPE_MISMATCHED, metaData.metaData.modelName); } metaData.dependencies.push(referredModel); } else { throw new ClaireError_1.ClaireError(errors_1.CIRCULAR_DEPENDENCY_DETECTED, { modelName: metaData.metaData.modelName, fieldName: field.fieldDataName, }); } } else { throw new ClaireError_1.ClaireError(errors_1.CIRCULAR_DEPENDENCY_DETECTED, { modelName: metaData.metaData.modelName, fieldName: field.fieldDataName, }); } } } } //-- add the dependant to the result array first, then add the dependencies. If dependencies are found to be before //-- the dependant in the result array, circular happens for (let i = 0; i < metaDataArray.length; i++) { let currentElement = metaDataArray[i]; let currentElementIndex = result.findIndex(e => e === currentElement.metaData); if (currentElementIndex < 0) { //-- push the currentElement result = [ ...result, currentElement.metaData ]; currentElementIndex = result.length - 1; } //-- check dependencies index for (let i = 0; i < currentElement.dependencies.length; i++) { let dependencyIndex = result.findIndex(e => e === currentElement.dependencies[i]); if (dependencyIndex < 0) { //-- push dependency just before result = [ ...result.slice(0, currentElementIndex), currentElement.dependencies[i], ...result.slice(currentElementIndex), ]; } else { //-- check for circular dependency currentElementIndex = result.findIndex(e => e === currentElement.metaData); if (dependencyIndex > currentElementIndex) throw new ClaireError_1.ClaireError(errors_1.CIRCULAR_DEPENDENCY_DETECTED, { target1: currentElement.metaData.modelName, target2: result[dependencyIndex].modelName, }); } } } return result; } } exports.ModelMetadata = ModelMetadata; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTW9kZWxNZXRhZGF0YS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9tb2RlbC9Nb2RlbE1ldGFkYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQ0Esb0ZBQStFO0FBQy9FLHVEQUFrRDtBQUNsRCw2Q0FNMEI7QUFFMUIsNENBQTJDO0FBQzNDLDJDQUFzQztBQUV0QyxNQUFhLGFBQWMsU0FBUSxtREFBd0I7SUFNdkQ7UUFDSSxLQUFLLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFTSxhQUFhO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxLQUFLLElBQUksQ0FBRSxDQUFDO0lBQzNELENBQUM7SUFFTSxRQUFRLENBQUMsS0FBOEI7UUFDMUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVNLG1CQUFtQixDQUFDLGNBQXNCO1FBQzdDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxjQUFjLEtBQUssY0FBYyxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUVNLGtCQUFrQixDQUFDLGFBQXFCO1FBQzNDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxhQUFhLEtBQUssYUFBYSxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUVNLHFCQUFxQjtRQUN4QixJQUFJLE1BQU0sR0FBZSxFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUMxQixJQUFJLEtBQUssQ0FBQyxZQUFZLEtBQUssU0FBUyxFQUFFO2dCQUNsQyxhQUFhO2dCQUNiLE1BQU0sQ0FBQyxLQUFLLENB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