From fb529bca0bdf8f5d86fe5545dd186408be4b5ee1 Mon Sep 17 00:00:00 2001 From: Kononnable Date: Tue, 1 Oct 2019 22:36:37 +0200 Subject: [PATCH] changes in model, basic template file --- src/Engine.ts | 104 +++++++++++++++++++++++++++++++++-------- src/entity.mst | 27 +++++++++++ src/models/Column.ts | 44 +++++++---------- src/models/Entity.ts | 2 +- src/models/Relation.ts | 23 ++++----- 5 files changed, 138 insertions(+), 62 deletions(-) diff --git a/src/Engine.ts b/src/Engine.ts index ecfcfee..23c4bc5 100644 --- a/src/Engine.ts +++ b/src/Engine.ts @@ -17,6 +17,7 @@ import AbstractNamingStrategy from "./AbstractNamingStrategy"; import changeCase = require("change-case"); import fs = require("fs"); import path = require("path"); +import { Entity } from "./models/Entity"; export function createDriver(driverName: string): AbstractDriver { switch (driverName) { @@ -43,20 +44,80 @@ export async function createModelFromDatabase( connectionOptions: IConnectionOptions, generationOptions: IGenerationOptions ) { - let dbModel = await dataCollectionPhase(driver, connectionOptions); - if (dbModel.length === 0) { - TomgUtils.LogError( - "Tables not found in selected database. Skipping creation of typeorm model.", - false - ); - return; - } - dbModel = modelCustomizationPhase( - dbModel, - generationOptions, - driver.defaultValues - ); - modelGenerationPhase(connectionOptions, generationOptions, dbModel); + // let dbModel = await dataCollectionPhase(driver, connectionOptions); + // if (dbModel.length === 0) { + // TomgUtils.LogError( + // "Tables not found in selected database. Skipping creation of typeorm model.", + // false + // ); + // return; + // } + // dbModel = modelCustomizationPhase( + // dbModel, + // generationOptions, + // driver.defaultValues + // ); + const dbModel: Entity = { + sqlName: "sqlName", + tscName: "typescriptName", + schema: "schema", + database: "database", + columns: [ + { + tscType: "typescriptType", + tscName: "tscName", + options: { + name: "sqlName", + type: "integer", + length: 2, + scale: 2 + } + }, + { + tscType: "typescriptType", + tscName: "tscName", + options: { + name: "sqlName", + type: "integer", + length: 2, + scale: 2 + } + } + ], + indices: [ + { + columns: ["columns"], + name: "name" + }, + { + columns: ["columns"], + name: "name" + } + ], + relations: [ + { + relationType: "OneToMany", + relatedField: "relatedField", + fieldName: "relation", + relatedTable: "any", + relationOptions: { + onUpdate: "CASCADE", + onDelete: "NO ACTION" + } + }, + { + relationType: "OneToOne", + relatedField: "relatedField", + fieldName: "relation", + relatedTable: "any", + relationOptions: { + onUpdate: "CASCADE", + onDelete: "NO ACTION" + } + } + ] + }; + modelGenerationPhase(connectionOptions, generationOptions, [dbModel]); } export async function dataCollectionPhase( driver: AbstractDriver, @@ -172,7 +233,7 @@ function setRelationId( export function modelGenerationPhase( connectionOptions: IConnectionOptions, generationOptions: IGenerationOptions, - databaseModel: EntityInfo[] + databaseModel: Entity[] ) { createHandlebarsHelpers(generationOptions); const templatePath = path.resolve(__dirname, "entity.mst"); @@ -197,16 +258,16 @@ export function modelGenerationPhase( let casedFileName = ""; switch (generationOptions.convertCaseFile) { case "camel": - casedFileName = changeCase.camelCase(element.tsEntityName); + casedFileName = changeCase.camelCase(element.tscName); break; case "param": - casedFileName = changeCase.paramCase(element.tsEntityName); + casedFileName = changeCase.paramCase(element.tscName); break; case "pascal": - casedFileName = changeCase.pascalCase(element.tsEntityName); + casedFileName = changeCase.pascalCase(element.tscName); break; case "none": - casedFileName = element.tsEntityName; + casedFileName = element.tscName; break; default: throw new Error("Unknown case style"); @@ -221,6 +282,11 @@ export function modelGenerationPhase( } function createHandlebarsHelpers(generationOptions: IGenerationOptions) { + Handlebars.registerHelper("json", context => { + const json = JSON.stringify(context); + const withoutQuotes = json.replace(/"([^(")"]+)":/g, "$1:"); + return withoutQuotes.slice(1, withoutQuotes.length - 1); + }); Handlebars.registerHelper("curly", open => (open ? "{" : "}")); Handlebars.registerHelper("toEntityName", str => { let retStr = ""; diff --git a/src/entity.mst b/src/entity.mst index e809475..f68900e 100644 --- a/src/entity.mst +++ b/src/entity.mst @@ -1,3 +1,30 @@ +{{#*inline "Index"}} +@Index("{{name}}") +{{/inline}} +{{#*inline "Column"}} +{{#generated}}@PrimaryGeneratedColumn({ {{/generated}}{{^generated}}@Column({ {{#primary}}primary:{{primary}},{{/primary}}{{/generated}}{{json options}} }) +{{tscName}}:{{tscType}}; + +{{/inline}} +{{#*inline "Relation"}} +@{{relationType}}(()=>{{relatedTable}},{{relatedTable}}=>{{relatedTable}}.{{relatedField}},{ {{json relationOptions}} }) +{{fieldName}}:{{relatedTable}}; + +{{/inline}} +{{#*inline "Entity"}} +{{#indices}}{{> Index}}{{/indices~}} +@Entity("{{sqlName}}",{schema:"{{schema}}",database:"{{database}}"}) +export class {{tscName}} { + +{{#columns}}{{> Column}}{{/columns~}} +{{#relations}}{{> Relation}}{{/relations~}} +} +{{/inline}} + +{{~> Entity}} + + + import {BaseEntity,Column,Entity,Index,JoinColumn,JoinTable,ManyToMany,ManyToOne,OneToMany,OneToOne,PrimaryColumn,PrimaryGeneratedColumn,RelationId} from "typeorm"; {{relationImports}}{{#each UniqueImports}}import {{curly true}}{{toEntityName this}}{{curly false}} from "./{{toFileName this}}"; {{/each}} diff --git a/src/models/Column.ts b/src/models/Column.ts index 5f3fa82..e5f8c5c 100644 --- a/src/models/Column.ts +++ b/src/models/Column.ts @@ -1,33 +1,23 @@ import { ColumnType } from "typeorm"; export type Column = { + tscType: any; + tscName: string; + primary?: boolean; - - sqlType: ColumnType; - - typescriptType: any; - - name?: string; - - length?: number; - - width?: number; - - nullable?: boolean; - generated?: true | "increment" | "uuid"; - - unique?: boolean; - - default?: boolean; - - precision?: number; - - scale?: number; - - unsigned?: boolean; - - enum?: string[]; - - array?: boolean; + options: { + type: ColumnType; + name: string; + length?: number; + width?: number; + nullable?: boolean; + unique?: boolean; // ? + default?: boolean; + precision?: number; + scale?: number; + unsigned?: boolean; + enum?: string[]; + array?: boolean; // ? + }; }; diff --git a/src/models/Entity.ts b/src/models/Entity.ts index c3a28db..126f6ad 100644 --- a/src/models/Entity.ts +++ b/src/models/Entity.ts @@ -4,7 +4,7 @@ import { Index } from "./Index"; export type Entity = { sqlName: string; - typescriptName?: string; + tscName: string; database?: string; schema?: string; diff --git a/src/models/Relation.ts b/src/models/Relation.ts index 153d4ec..d3ef883 100644 --- a/src/models/Relation.ts +++ b/src/models/Relation.ts @@ -1,19 +1,12 @@ -import { OnUpdateType } from "typeorm/metadata/types/OnUpdateType"; -import { OnDeleteType } from "typeorm/metadata/types/OnDeleteType"; -import { RelationType } from "typeorm/metadata/types/RelationTypes"; -import { JoinTableOptions, JoinColumnOptions } from "typeorm"; +import { JoinColumnOptions, RelationOptions } from "typeorm"; import { JoinTableMultipleColumnsOptions } from "typeorm/decorator/options/JoinTableMultipleColumnsOptions"; export type Relation = { - target: Function | string; - type: RelationType; - inverseSide?: string; - // lazy?: boolean; - // eager?: boolean; - // primary?: boolean; - joinTable?: boolean | JoinTableOptions | JoinTableMultipleColumnsOptions; - joinColumn?: boolean | JoinColumnOptions; - nullable?: boolean; - onDelete?: OnDeleteType; - onUpdate?: OnUpdateType; + relationType: "OneToOne" | "OneToMany" | "ManyToOne" | "ManyToMany"; + relatedTable: string; + relatedField: string; + fieldName: string; + relationOptions: RelationOptions; + joinColumnOptions?: JoinColumnOptions[]; + joinTableOptions?: JoinTableMultipleColumnsOptions; };