manifest
Version:
The backend for AI code editors
166 lines (165 loc) • 7.13 kB
JavaScript
;
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.EntityTypeService = void 0;
const common_1 = require("@nestjs/common");
const manifest_service_1 = require("../../manifest/services/manifest.service");
const src_1 = require("../../../../types/src");
const prop_type_ts_type_1 = require("../types/prop-type-ts-type");
const constants_1 = require("../../constants");
const src_2 = require("../../../../common/src");
let EntityTypeService = class EntityTypeService {
constructor(manifestService) {
this.manifestService = manifestService;
}
generateEntityTypeInfos() {
const appManifest = this.manifestService.getAppManifest();
const entityTsTypeInfos = [];
Object.values(appManifest.entities).map((entity) => entityTsTypeInfos.push(this.generateEntityTypeInfoFromManifest(entity)));
Object.values(appManifest.entities)
.filter((entity) => !entity.nested)
.map((entity) => {
entityTsTypeInfos.push(this.generateCreateDtoTypeInfoFromManifest(entity));
});
return entityTsTypeInfos;
}
generateEntityTypeInfoFromManifest(entityManifest) {
const properties = [
{
name: 'id',
type: src_1.PropType.String
}
];
if (entityManifest.authenticable) {
properties.push(...constants_1.AUTHENTICABLE_PROPS);
}
const propertyTypeInfos = [
...properties,
...entityManifest.properties
].map((prop) => {
const propertyTsTypeInfo = {
name: prop.name,
type: prop_type_ts_type_1.propTypeTsType[prop.type] || 'any',
manifestPropType: prop.type
};
if (prop.type === src_1.PropType.Choice) {
propertyTsTypeInfo.values = prop.options?.values || null;
}
else if (prop.type === src_1.PropType.Image) {
propertyTsTypeInfo.type = Object.keys(prop.options?.sizes || {}).reduce((acc, size) => {
acc[size] = {
width: prop.options?.sizes[size].width || 0,
height: prop.options?.sizes[size].height || 0
};
return acc;
}, {});
propertyTsTypeInfo.sizes = prop.options?.sizes;
}
return propertyTsTypeInfo;
});
if (!entityManifest.nested) {
entityManifest.relationships.forEach((relationship) => {
if (relationship.type === 'many-to-many' ||
relationship.type === 'one-to-many') {
propertyTypeInfos.push({
name: relationship.name,
type: `${relationship.entity}[]`,
isRelationship: true,
optional: true
});
}
else {
propertyTypeInfos.push({
name: relationship.name,
type: relationship.entity,
isRelationship: true,
optional: true
});
}
});
}
return {
name: entityManifest.className,
properties: propertyTypeInfos,
nested: entityManifest.nested
};
}
generateCreateDtoTypeInfoFromManifest(entityManifest) {
const properties = [];
if (entityManifest.authenticable) {
properties.push(...constants_1.AUTHENTICABLE_PROPS);
}
const propertyTypeInfos = [
...properties,
...entityManifest.properties
].map((prop) => {
const propertyTsTypeInfo = {
name: prop.name,
type: prop_type_ts_type_1.propTypeTsType[prop.type] || 'any',
manifestPropType: prop.type
};
if (prop.type === src_1.PropType.Choice) {
propertyTsTypeInfo.values = prop.options?.values || null;
}
else if (prop.type === src_1.PropType.Image) {
propertyTsTypeInfo.sizes = prop.options?.sizes;
}
return propertyTsTypeInfo;
});
entityManifest.relationships.forEach((relationship) => {
if (relationship.type === 'one-to-many' && !relationship.nested) {
return;
}
const dtoPropertyName = (0, src_2.getDtoPropertyNameFromRelationship)(relationship);
const isMultiple = relationship.type === 'many-to-many' ||
relationship.type === 'one-to-many';
const type = relationship.nested
? relationship.entity
: `string`;
propertyTypeInfos.push({
name: dtoPropertyName,
type: isMultiple ? `${type}[]` : type,
isRelationship: true,
optional: true
});
});
return {
name: `CreateUpdate${entityManifest.className}Dto`,
properties: propertyTypeInfos
};
}
generateTSInterfaceFromEntityTypeInfo(entityTypeInfo) {
const tsProperties = entityTypeInfo.properties.map((prop) => {
let tsType;
if (prop.manifestPropType === src_1.PropType.Image && prop.sizes) {
tsType = `{ ${Object.keys(prop.sizes)
.map((size) => `${size}: string`)
.join('; ')} }`;
}
else if (prop.manifestPropType === src_1.PropType.Location) {
tsType = '{ lat: number; lng: number; }';
}
else {
tsType = prop.type;
}
if (prop.values) {
tsType = prop.values.map((val) => `'${val}'`).join(' | ');
}
return ` ${prop.name}${prop.optional ? '?' : ''}: ${tsType};`;
});
return `export interface ${entityTypeInfo.name} {\n${tsProperties.join('\n')}\n}\n`;
}
};
exports.EntityTypeService = EntityTypeService;
exports.EntityTypeService = EntityTypeService = __decorate([
(0, common_1.Injectable)(),
__metadata("design:paramtypes", [manifest_service_1.ManifestService])
], EntityTypeService);