diff --git a/src/IGenerationOptions.ts b/src/IGenerationOptions.ts index 1cb8568..7e3ae8f 100644 --- a/src/IGenerationOptions.ts +++ b/src/IGenerationOptions.ts @@ -19,6 +19,7 @@ export default interface IGenerationOptions { strictMode: "none" | "?" | "!"; skipSchema: boolean; indexFile: boolean; + exportType: "named" | "default"; } export function getDefaultGenerationOptions(): IGenerationOptions { const generationOptions: IGenerationOptions = { @@ -36,7 +37,8 @@ export function getDefaultGenerationOptions(): IGenerationOptions { relationIds: false, strictMode: "none", skipSchema: false, - indexFile: false + indexFile: false, + exportType: "named" }; return generationOptions; } diff --git a/src/ModelGeneration.ts b/src/ModelGeneration.ts index 758dc2a..c723447 100644 --- a/src/ModelGeneration.ts +++ b/src/ModelGeneration.ts @@ -211,6 +211,14 @@ function createHandlebarsHelpers(generationOptions: IGenerationOptions): void { return retVal; } ); + Handlebars.registerHelper("defaultExport", () => + generationOptions.exportType === "default" ? "default" : "" + ); + Handlebars.registerHelper("localImport", (entityName: string) => + generationOptions.exportType === "default" + ? entityName + : `{${entityName}}` + ); Handlebars.registerHelper("strictMode", () => generationOptions.strictMode !== "none" ? generationOptions.strictMode diff --git a/src/index.ts b/src/index.ts index 07375ba..954f298 100644 --- a/src/index.ts +++ b/src/index.ts @@ -260,6 +260,11 @@ function checkYargsParameters(options: options): options { boolean: true, default: options.generationOptions.indexFile, describe: "Generate index file" + }, + defaultExport: { + boolean: true, + default: options.generationOptions.exportType === "default", + describe: "Generate index file" } }); @@ -293,6 +298,9 @@ function checkYargsParameters(options: options): options { options.generationOptions.pluralizeNames = !argv.disablePluralization; options.generationOptions.strictMode = argv.strictMode as IGenerationOptions["strictMode"]; options.generationOptions.indexFile = argv.index; + options.generationOptions.exportType = argv.defaultExport + ? "default" + : "named"; return options; } @@ -513,6 +521,13 @@ async function useInquirer(options: options): Promise { name: "Generate index file", value: "index", checked: options.generationOptions.indexFile + }, + { + name: "Prefer default exports", + value: "defaultExport", + checked: + options.generationOptions.exportType === + "default" } ], message: "Available customizations", @@ -567,6 +582,11 @@ async function useInquirer(options: options): Promise { "constructor" ); options.generationOptions.indexFile = customizations.includes("index"); + options.generationOptions.exportType = customizations.includes( + "defaultExport" + ) + ? "default" + : "named"; if (customizations.includes("namingStrategy")) { const namingStrategyPath = ( diff --git a/src/templates/entity.mst b/src/templates/entity.mst index ce84e6b..2c2c1c9 100644 --- a/src/templates/entity.mst +++ b/src/templates/entity.mst @@ -2,7 +2,7 @@ @Index("{{name}}",[{{#columns}}"{{toPropertyName .}}",{{/columns~}}],{ {{json options}} }) {{/inline}} {{#*inline "Import"}} -import { {{toEntityName .}} } from './{{toFileName .}}' +import {{localImport (toEntityName .)}} from './{{toFileName .}}' {{/inline}} {{#*inline "Column"}} {{#generated}}@PrimaryGeneratedColumn({ type:"{{type}}", {{/generated}}{{^generated}}@Column("{{type}}",{ {{#primary}}primary:{{primary}},{{/primary}}{{/generated}}{{json options}}{{#default}},default: {{.}},{{/default}} }) @@ -33,7 +33,7 @@ import { {{toEntityName .}} } from './{{toFileName .}}' {{#*inline "Entity"}} {{#indices}}{{> Index}}{{/indices~}} @Entity("{{sqlName}}"{{#schema}} ,{schema:"{{.}}"{{#if ../database}}, database:"{{../database}}"{{/if}} } {{/schema}}) -export class {{toEntityName tscName}}{{#activeRecord}} extends BaseEntity{{/activeRecord}} { +export {{defaultExport}} class {{toEntityName tscName}}{{#activeRecord}} extends BaseEntity{{/activeRecord}} { {{#columns}}{{> Column}}{{/columns~}} {{#relations}}{{> Relation}}{{/relations~}} diff --git a/src/templates/index.mst b/src/templates/index.mst index 928dd19..4c7d5fe 100644 --- a/src/templates/index.mst +++ b/src/templates/index.mst @@ -1,3 +1,5 @@ {{#entities~}} -export { {{toEntityName tscName}} } from './{{toFileName tscName}}' -{{/entities~}} \ No newline at end of file +import {{localImport (toEntityName tscName)}} from './{{toFileName tscName}}' +{{/entities}} + +export { {{#entities}}{{toEntityName tscName}},{{/entities~}} } diff --git a/test/modelCustomization/modelCustomization.test.ts b/test/modelCustomization/modelCustomization.test.ts index acbde5f..1f6cd47 100644 --- a/test/modelCustomization/modelCustomization.test.ts +++ b/test/modelCustomization/modelCustomization.test.ts @@ -666,7 +666,7 @@ describe("Model customization phase", async () => { }) }) describe("index file generation", () => { - it("enabled", async () => { + it("named export", async () => { const data = generateSampleData(); const generationOptions = generateGenerationOptions(); @@ -687,8 +687,36 @@ describe("Model customization phase", async () => { const indexFileContent = fs .readFileSync(path.resolve(filesGenPath, "Index.ts")) .toString(); - expect(indexFileContent).to.contain('export { Post } from "./Post";'); - expect(indexFileContent).to.contain('export { PostAuthor } from "./PostAuthor";'); + expect(indexFileContent).to.contain('import { PostAuthor } from "./PostAuthor'); + expect(indexFileContent).to.contain('import { Post } from "./Post'); + expect(indexFileContent).to.contain('export { PostAuthor, Post }'); + compileGeneratedModel(generationOptions.resultsPath, [""]); + }) + it("default export", async () => { + + const data = generateSampleData(); + const generationOptions = generateGenerationOptions(); + generationOptions.indexFile = true; + generationOptions.exportType = "default" + clearGenerationDir(); + + const customizedModel = modelCustomizationPhase( + data, + generationOptions, + {} + ); + modelGenerationPhase( + getDefaultConnectionOptions(), + generationOptions, + customizedModel + ); + const filesGenPath = path.resolve(resultsPath, "entities"); + const indexFileContent = fs + .readFileSync(path.resolve(filesGenPath, "Index.ts")) + .toString(); + expect(indexFileContent).to.contain('import PostAuthor from "./PostAuthor'); + expect(indexFileContent).to.contain('import Post from "./Post'); + expect(indexFileContent).to.contain('export { PostAuthor, Post }'); compileGeneratedModel(generationOptions.resultsPath, [""]); }) it("disabled", async () => { @@ -713,4 +741,5 @@ describe("Model customization phase", async () => { compileGeneratedModel(generationOptions.resultsPath, [""]); }) }) + });