UNPKG

ph-dev-tools

Version:
125 lines (105 loc) 4.23 kB
/** * Created by Papa on 4/26/2016. */ import {QBuilder, getPropertyFieldType, getRelationFieldType} from "./../QBuilder"; import {QEntityBuilder} from "./QEntityBuilder"; import {EntityCandidate} from "../../parser/EntityCandidate"; import {resolveRelativePath, resolveRelativeEntityPath} from "../../resolve/pathResolver"; import {QRelationBuilder} from "./QRelationBuilder"; import {QPropertyBuilder} from "./QPropertyBuilder"; import {PropertyDocEntry} from "../../parser/DocEntry"; import {IQEntityBuilder} from "./IQEntityBuilder"; export class QEntityFileBuilder implements QBuilder { qEntityBuilder:QEntityBuilder; iqEntityBuilder:IQEntityBuilder; importStatements:string[] = []; constructor( private entity:EntityCandidate, private fullGenerationPath:string, private workingDirPath:string ) { this.qEntityBuilder = new QEntityBuilder(entity, fullGenerationPath, workingDirPath, this); this.iqEntityBuilder = new IQEntityBuilder(entity, this.qEntityBuilder); this.addImport(`IEntity, IQEntity, IEntityQuery, QEntity, FieldType, IQBooleanField, QBooleanField, IQDateField, QDateField, IQNumberField, QNumberField, IQStringField, QStringField, IBooleanOperation,JSONBooleanOperation, IDateOperation,JSONDateOperation, INumberOperation,JSONNumberOperation, IStringOperation,JSONStringOperation, RelationType, IQRelation, QRelation`, 'querydsl-typescript'); let entityRelativePath = resolveRelativePath(fullGenerationPath, entity.path); this.addImport(entity.type, entityRelativePath); this.addImport('PH, ProxyGenerator', 'phibernate'); } build():string { let imports = this.buildImports(); let proxySetup = this.buildProxySetup(); let interfaceSource = this.iqEntityBuilder.build(); let classSource = this.qEntityBuilder.build(); let entityName = this.entity.docEntry.name; let fileSource = `${imports} // Entity Proxy setup ${proxySetup} ${interfaceSource} export interface I${entityName}Query extends IEntityQuery<I${entityName}> { } ${classSource} PH.addQEntity(${entityName}, Q${entityName}.q); `; return fileSource; } private buildProxySetup():string { let proxySetup = ''; let clazz = this.entity.docEntry.name; this.qEntityBuilder.propertyBuilders.forEach(( propertyBuilder:QPropertyBuilder // ) => { let docEntry = propertyBuilder.propertyDocEntry; let fieldType = getPropertyFieldType(docEntry); let propertyName = docEntry.name; proxySetup += `ProxyGenerator.setupEntityField(${clazz}, '${propertyName}', FieldType.${fieldType});\n`; }); this.qEntityBuilder.relationBuilders.forEach(( relationBuilder:QRelationBuilder // ) => { let docEntry = relationBuilder.entityProperty; let fieldType = getRelationFieldType(docEntry); let propertyName = docEntry.name; proxySetup += `ProxyGenerator.setupEntityRelation(${clazz}, '${propertyName}', RelationType.${fieldType}, ${docEntry.entity.type});\n`; }); return proxySetup; } private buildImports():string { let imports = ``; this.importStatements.forEach(( importStatement:string ) => { imports += '\n' + importStatement; }); this.qEntityBuilder.relationBuilders.forEach(( builder:QRelationBuilder ) => { if (this.entity !== builder.entityProperty.entity) { let entityRelativePath = resolveRelativePath(this.fullGenerationPath, builder.entityProperty.entity.path); let type = builder.entityProperty.entity.type; let typeImportStatement = `import {${type}} from '${entityRelativePath}';`; imports += '\n' + typeImportStatement; let qEntityRelativePath = resolveRelativeEntityPath(this.entity, builder.entityProperty.entity); let qType = 'Q' + builder.entityProperty.entity.type; let qTypeImportStatement = `import {I${type}, I${qType}, ${qType}} from '${qEntityRelativePath}';`; imports += '\n' + qTypeImportStatement; } }); return imports; } addImport( classString:string, fileName:string = `./${classString}` ):void { let importStatement = `import {${classString}} from '${fileName}';`; this.importStatements.push(importStatement); } }