UNPKG

claire-framework

Version:

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

159 lines 14.4 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); } if (primaryKey.isAutoGen) { throw new ClaireError_1.ClaireError(errors_1.NO_SKIP_PRIMARY_KEY, 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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