diff --git a/src/ModelCustomization.ts b/src/ModelCustomization.ts index c2f9bfe..2ad4f3b 100644 --- a/src/ModelCustomization.ts +++ b/src/ModelCustomization.ts @@ -18,7 +18,8 @@ export default function modelCustomizationPhase( ) { // eslint-disable-next-line global-require, import/no-dynamic-require, @typescript-eslint/no-var-requires const req = require(generationOptions.customNamingStrategyPath); - namingStrategy = new req.NamingStrategy(); + // eslint-disable-next-line new-cap + namingStrategy = new req.default(); } else { namingStrategy = new NamingStrategy(); } diff --git a/src/NamingStrategy.ts b/src/NamingStrategy.ts index 38423a7..6035634 100644 --- a/src/NamingStrategy.ts +++ b/src/NamingStrategy.ts @@ -5,6 +5,10 @@ import { RelationId } from "./models/RelationId"; import changeCase = require("change-case"); +// TODO: Use function instead of class +// TODO: Allow users to change only specific functions instead of all of them(with logging if used standard or user function) +// TODO: Fix naming strategy relative path + /* eslint-disable class-methods-use-this */ export default class NamingStrategy extends AbstractNamingStrategy { public relationIdName(relationId: RelationId, relation: Relation): string { diff --git a/test/modelCustomization/modelCustomization.test.ts b/test/modelCustomization/modelCustomization.test.ts index 5ba0ff1..00d5bbd 100644 --- a/test/modelCustomization/modelCustomization.test.ts +++ b/test/modelCustomization/modelCustomization.test.ts @@ -51,7 +51,7 @@ describe("Model customization phase", async () => { tscName: "PostAuthor", database: "", schema: "public", - fileImports: ["Post"] + fileImports: [] }, { columns: [ @@ -105,7 +105,7 @@ describe("Model customization phase", async () => { tscName: "Post", database: "", schema: "public", - fileImports: ["PostAuthor"] + fileImports: [] } ]; @@ -564,4 +564,46 @@ describe("Model customization phase", async () => { compileGeneratedModel(generationOptions.resultsPath, [""]); }); }); + it("naming strategy", async () => { + const data = generateSampleData(); + const generationOptions = generateGenerationOptions(); + clearGenerationDir(); + + generationOptions.customNamingStrategyPath = + "../test/modelCustomization/testNamingStrategy.ts"; + // TODO: relationId + + const customizedModel = modelCustomizationPhase( + data, + generationOptions, + {} + ); + modelGenerationPhase( + new IConnectionOptions(), + generationOptions, + customizedModel + ); + const filesGenPath = path.resolve(resultsPath, "entities"); + const postContent = fs + .readFileSync(path.resolve(filesGenPath, "Post_B.ts")) + .toString(); + const postAuthorContent = fs + .readFileSync(path.resolve(filesGenPath, "PostAuthor_B.ts")) + .toString(); + expect(postContent).to.have.string(`@Entity("Post"`); + expect(postContent).to.have.string(`class Post_B {`); + expect(postContent).to.have.string(`id_C: number;`); + expect(postContent).to.have.string(`author_A: PostAuthor_B`); + expect(postContent).to.have.string( + `import { PostAuthor_B } from "./PostAuthor_B";` + ); + expect(postAuthorContent).to.have.string(`@Entity("PostAuthor"`); + expect(postAuthorContent).to.have.string(`class PostAuthor_B`); + expect(postAuthorContent).to.have.string(`id_C: number;`); + expect(postAuthorContent).to.have.string( + `import { Post_B } from "./Post_B";` + ); + + compileGeneratedModel(generationOptions.resultsPath, [""]); + }); }); diff --git a/test/modelCustomization/testNamingStrategy.ts b/test/modelCustomization/testNamingStrategy.ts new file mode 100644 index 0000000..970204d --- /dev/null +++ b/test/modelCustomization/testNamingStrategy.ts @@ -0,0 +1,24 @@ +import StandardNamingStrategy from "../../src/NamingStrategy"; +import { RelationId } from "../../src/models/RelationId"; +import { Relation } from "../../src/models/Relation"; + +/* eslint-disable class-methods-use-this */ +export default class NamingStrategy extends StandardNamingStrategy { + public relationIdName(relationId: RelationId, relation: Relation): string { + return `${super.relationIdName(relationId, relation)}`; + } + + public relationName(relation: Relation): string { + return `${super.relationName(relation)}_A`; + } + + public entityName(entityName: string): string { + return `${super.entityName(entityName)}_B`; + } + + public columnName(columnName: string): string { + return `${super.columnName(columnName)}_C`; + } +} + +/* eslint-enable class-methods-use-this */