From f66ee271b51792fe895c437e57d4cb8add8a0f15 Mon Sep 17 00:00:00 2001 From: Jared Malcolm Date: Wed, 19 Dec 2018 10:25:49 -0600 Subject: [PATCH] Add flag to models that use the ActiveRecord syntax. Closes #131 --- README.md | 2 ++ src/Engine.ts | 2 ++ src/entity.mst | 18 ++++++++++++++++-- src/index.ts | 7 +++++++ src/models/EntityInfo.ts | 1 + 5 files changed, 28 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 3ccb0bc..a57a805 100644 --- a/README.md +++ b/README.md @@ -56,6 +56,8 @@ Options: --cp, --case-property Convert property names to specified case [choices: "pascal", "camel", "none"] [default: "none"] --lazy Generate lazy relations [boolean] [default: false] + -a, --active-record Generate models that use the ActiveRecord syntax + [boolean] [default: false] --namingStrategy Use custom naming strategy --relationIds Generate RelationId fields [boolean] [default: false] --generateConstructor Generate constructor allowing partial initialization diff --git a/src/Engine.ts b/src/Engine.ts index 58a8d52..a0a9aae 100644 --- a/src/Engine.ts +++ b/src/Engine.ts @@ -88,6 +88,7 @@ export class Engine { }); }); element.GenerateConstructor = this.Options.constructor; + element.IsActiveRecord = this.Options.activeRecord; element.Imports.filter((elem, index, self) => { return index === self.indexOf(elem); }); @@ -274,6 +275,7 @@ export interface IEngineOptions { convertCaseProperty: "pascal" | "camel" | "none"; propertyVisibility: "public" | "protected" | "private" | "none"; lazy: boolean; + activeRecord: boolean; constructor: boolean; namingStrategy: AbstractNamingStrategy; relationIds: boolean; diff --git a/src/entity.mst b/src/entity.mst index 0dd8ee7..99af1be 100644 --- a/src/entity.mst +++ b/src/entity.mst @@ -1,11 +1,25 @@ -import {Index,Entity, PrimaryColumn, PrimaryGeneratedColumn, Column, OneToOne, OneToMany, ManyToOne, ManyToMany, JoinColumn, JoinTable, RelationId} from "typeorm"; +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}} @Entity("{{EntityName}}"{{#Schema}},{schema:"{{.}}"}{{/Schema}}) {{#Indexes}}{{^isPrimaryKey}}@Index("{{name}}",[{{#columns}}"{{toPropertyName name}}",{{/columns}}]{{#isUnique}},{unique:true}{{/isUnique}}) -{{/isPrimaryKey}}{{/Indexes}}export class {{toEntityName EntityName}} { +{{/isPrimaryKey}}{{/Indexes}}export class {{toEntityName EntityName}}{{#if IsActiveRecord}} extends BaseEntity{{/if}} { {{#Columns}} {{^relations}}{{#isGenerated}} @PrimaryGeneratedColumn({ diff --git a/src/index.ts b/src/index.ts index 6e36e54..8a4e903 100644 --- a/src/index.ts +++ b/src/index.ts @@ -92,6 +92,12 @@ const argv = Yargs.usage( default: false, describe: "Generate lazy relations" }) + .option("a", { + alias: "active-record", + boolean: true, + default: false, + describe: "Use ActiveRecord syntax for generated models" + }) .option("namingStrategy", { describe: "Use custom naming strategy" }) @@ -164,6 +170,7 @@ const engine = new Engine(driver, { databaseType: argv.e, host: argv.h, lazy: argv.lazy, + activeRecord: argv.a, namingStrategy, noConfigs: argv.noConfig, password: argv.x ? argv.x.toString() : null, diff --git a/src/models/EntityInfo.ts b/src/models/EntityInfo.ts index 82d90ed..30eec70 100644 --- a/src/models/EntityInfo.ts +++ b/src/models/EntityInfo.ts @@ -8,6 +8,7 @@ export class EntityInfo { public Indexes: IndexInfo[]; public Schema: string; public GenerateConstructor: boolean; + public IsActiveRecord: boolean; public relationImports() { const imports: string[] = [];