UNPKG

ph-dev-tools

Version:
100 lines (85 loc) 2.5 kB
/** * Created by Papa on 4/25/2016. */ import {PropertyDocEntry} from "../../parser/DocEntry"; import {QPropertyBuilder} from "./QPropertyBuilder"; import {QRelationBuilder} from "./QRelationBuilder"; import {QBuilder} from "./../QBuilder"; import {EntityCandidate} from "../../parser/EntityCandidate"; import {QEntityFileBuilder} from "./QEntityFileBuilder"; export class QEntityBuilder implements QBuilder { propertyBuilders:QPropertyBuilder[] = []; relationBuilders:QRelationBuilder[] = []; constructor( public entity:EntityCandidate, private fullGenerationPath:string, private workingDirPath:string, private fileBuilder:QEntityFileBuilder ) { entity.docEntry.properties.forEach(( property:PropertyDocEntry ) => { if (property.primitive) { let propertyBuilder = new QPropertyBuilder(this, property); this.propertyBuilders.push(propertyBuilder); } else { if (property.entity) { let relationBuilder = new QRelationBuilder(this, property); this.relationBuilders.push(relationBuilder); } else { throw `Unexpected PropertyDocEntry: ${property.name}`; } } }); } addImport( importString:string ):void { this.fileBuilder.addImport(importString); } build():string { let properties = ``; let staticProperties = ``; let qName = `Q${this.entity.docEntry.name}`; this.propertyBuilders.forEach(( builder:QPropertyBuilder ) => { properties += ` ${builder.build()}\n`; let propertyName = builder.propertyDocEntry.name; staticProperties += ` static ${propertyName} = ${qName}.q.${propertyName};\n`; }); let relations = ``; let staticRelations = ``; this.relationBuilders.forEach(( builder:QRelationBuilder ) => { relations += ` ${builder.build()}\n`; let relationName = builder.entityProperty.name; staticRelations += ` static ${relationName} = ${qName}.q.${relationName};\n`; }); let classSource = `// Entity Query Implementation export class ${qName} extends QEntity<${qName}> implements I${qName} { static q = new ${qName}(true); // Static Field accessors ${staticProperties} // Static Relation accessors ${staticRelations} // Fields ${properties} // Relations ${relations} constructor( isTemplate:boolean = false ) { super(${this.entity.type}, '${this.entity.type}', isTemplate); } toJSON():any { throw 'Not Implemented'; } } `; return classSource; } }