UNPKG

@elsikora/nestjs-crud-automator

Version:

A library for automating the creation of CRUD operations in NestJS.

72 lines (69 loc) 3.44 kB
import { MetadataStorage } from '../class/metadata-storage.class.js'; import { ErrorException } from './error-exception.utility.js'; import { getMetadataArgsStorage, DefaultNamingStrategy } from 'typeorm'; /** * Generates metadata information about an entity including columns, table name, and primary key * @param {IApiBaseEntity} entity - The entity to generate information for * @returns {IApiEntity<E>} The generated entity information object * @template E - The entity type */ function GenerateEntityInformation(entity) { const generatedEntity = { columns: [], name: "", primaryKey: undefined, tableName: "", }; generatedEntity.tableName = (() => { // eslint-disable-next-line @elsikora/typescript/no-unsafe-function-type const table = getMetadataArgsStorage().tables.find(({ target }) => target.name === entity.name); if (!table) { throw ErrorException(`Table for entity ${String(entity.name)} not found in metadata storage`); } const namingStrategy = (tableName) => new DefaultNamingStrategy().tableName(entity.name ?? "UnknownResource", tableName); if (!table.name && table.type === "entity-child") { const discriminatorValue = getMetadataArgsStorage().discriminatorValues.find(({ target }) => target == entity); if (!discriminatorValue?.value) { throw ErrorException(`Discriminator value for entity ${String(entity.name)} not found in metadata storage`); } else if (typeof discriminatorValue.value === "string") { return namingStrategy(discriminatorValue.value); } else { // eslint-disable-next-line @elsikora/typescript/no-unsafe-argument,@elsikora/typescript/no-unsafe-member-access return namingStrategy(discriminatorValue.value?.name); } } return namingStrategy(table.name); })(); generatedEntity.name = entity.name; const storage = MetadataStorage.getInstance(); // eslint-disable-next-line @elsikora/typescript/no-unsafe-function-type const columnList = getMetadataArgsStorage().columns.filter(({ target }) => target.name === entity.name); // eslint-disable-next-line @elsikora/typescript/no-unsafe-function-type const relationList = getMetadataArgsStorage().relations.filter(({ target }) => target.name === entity.name); const entityColumns = [ ...columnList.map(({ options, propertyName }) => ({ isPrimary: Boolean(options.primary), metadata: storage.getMetadata(entity.name ?? "UnknownResource", propertyName) || undefined, name: propertyName, // eslint-disable-next-line @elsikora/typescript/no-non-null-assertion type: options.type, })), ...relationList.map(({ propertyName, relationType }) => ({ isPrimary: false, metadata: storage.getMetadata(entity.name ?? "UnknownResource", propertyName) || undefined, name: propertyName, type: relationType, })), ]; for (const column of entityColumns) { if (column.isPrimary) { generatedEntity.primaryKey = column; } } generatedEntity.columns = entityColumns; return generatedEntity; } export { GenerateEntityInformation }; //# sourceMappingURL=generate-entity-information.utility.js.map