@elsikora/nestjs-crud-automator
Version:
A library for automating the creation of CRUD operations in NestJS.
72 lines (69 loc) • 3.44 kB
JavaScript
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