From 60651a4727049867a97aa8b5ecb4d179fdd17607 Mon Sep 17 00:00:00 2001 From: Paolo Ceschi Berrini Date: Tue, 14 Jan 2020 11:50:46 +0100 Subject: [PATCH 01/10] Added generationOption with default value --- src/IGenerationOptions.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/IGenerationOptions.ts b/src/IGenerationOptions.ts index 7e3ae8f..462f330 100644 --- a/src/IGenerationOptions.ts +++ b/src/IGenerationOptions.ts @@ -1,3 +1,5 @@ +import { EOL } from "os"; + import path = require("path"); // TODO: change name @@ -10,6 +12,7 @@ export default interface IGenerationOptions { convertCaseFile: "pascal" | "param" | "camel" | "none"; convertCaseEntity: "pascal" | "camel" | "none"; convertCaseProperty: "pascal" | "camel" | "none"; + convertEol: string; propertyVisibility: "public" | "protected" | "private" | "none"; lazy: boolean; activeRecord: boolean; @@ -29,6 +32,7 @@ export function getDefaultGenerationOptions(): IGenerationOptions { convertCaseFile: "pascal", convertCaseEntity: "pascal", convertCaseProperty: "camel", + convertEol: EOL, propertyVisibility: "none", lazy: false, activeRecord: false, From e76b68729e7fc9c8471d28c68b5770170b050d7e Mon Sep 17 00:00:00 2001 From: Paolo Ceschi Berrini Date: Tue, 14 Jan 2020 13:02:54 +0100 Subject: [PATCH 02/10] :white_check_mark: tests for EOL - LF and CRLF --- .../modelCustomization.test.ts | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/test/modelCustomization/modelCustomization.test.ts b/test/modelCustomization/modelCustomization.test.ts index 8082c48..ad54d58 100644 --- a/test/modelCustomization/modelCustomization.test.ts +++ b/test/modelCustomization/modelCustomization.test.ts @@ -283,6 +283,53 @@ describe("Model customization phase", async () => { compileGeneratedModel(generationOptions.resultsPath, [""]); }); }); + describe("EOL", async () => { + it("LF", () => { + const data = generateSampleData(); + const generationOptions = generateGenerationOptions(); + clearGenerationDir(); + generationOptions.convertEol = "\n"; + const customizedModel = modelCustomizationPhase( + data, + generationOptions, + {} + ); + modelGenerationPhase( + getDefaultConnectionOptions(), + generationOptions, + customizedModel + ); + const filesGenPath = path.resolve(resultsPath, "entities"); + const posterContent = fs + .readFileSync(path.resolve(filesGenPath, "Post.ts")) + .toString(); + expect(posterContent).to.not.contain("\r\n"); + expect(posterContent).to.contain("\n"); + compileGeneratedModel(generationOptions.resultsPath, [""]); + }); + it("CRLF", () => { + const data = generateSampleData(); + const generationOptions = generateGenerationOptions(); + clearGenerationDir(); + generationOptions.convertEol = "\r\n"; + const customizedModel = modelCustomizationPhase( + data, + generationOptions, + {} + ); + modelGenerationPhase( + getDefaultConnectionOptions(), + generationOptions, + customizedModel + ); + const filesGenPath = path.resolve(resultsPath, "entities"); + const posterContent = fs + .readFileSync(path.resolve(filesGenPath, "Post.ts")) + .toString(); + expect(posterContent).to.contain("\r\n"); + compileGeneratedModel(generationOptions.resultsPath, [""]); + }); + }); describe("property-visibility", () => { it("public", () => { const data = generateSampleData(); From 6289c351b1365b9d6b59ea3f3749e7eeb0b44052 Mon Sep 17 00:00:00 2001 From: Paolo Ceschi Berrini Date: Tue, 14 Jan 2020 13:31:04 +0100 Subject: [PATCH 03/10] Force EOL to be as defined, otherwise default from OS --- src/ModelGeneration.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/ModelGeneration.ts b/src/ModelGeneration.ts index c723447..559a4d6 100644 --- a/src/ModelGeneration.ts +++ b/src/ModelGeneration.ts @@ -3,6 +3,7 @@ import * as Prettier from "prettier"; import * as changeCase from "change-case"; import * as fs from "fs"; import * as path from "path"; +import { EOL } from "os"; import IConnectionOptions from "./IConnectionOptions"; import IGenerationOptions from "./IGenerationOptions"; import { Entity } from "./models/Entity"; @@ -71,7 +72,14 @@ function generateModels( `${casedFileName}.ts` ); const rendered = entityCompliedTemplate(element); - const withImportStatements = removeUnusedImports(rendered); + const withImportStatements = removeUnusedImports( + EOL !== generationOptions.convertEol + ? rendered.replace( + /(\r\n|\n|\r)/gm, + generationOptions.convertEol + ) + : rendered + ); const formatted = Prettier.format(withImportStatements, { parser: "typescript" }); From b9834ea5276dc55c246978579de9ab75f7abe04c Mon Sep 17 00:00:00 2001 From: Paolo Ceschi Berrini Date: Tue, 14 Jan 2020 14:04:17 +0100 Subject: [PATCH 04/10] Iniquirer and yargs choices for EOL --- src/index.ts | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/index.ts b/src/index.ts index 9f40faf..aaa92a1 100644 --- a/src/index.ts +++ b/src/index.ts @@ -20,6 +20,11 @@ type options = { generationOptions: IGenerationOptions; }; +const eolConverter = { + LF: "\n", + CRLF: "\r\n" +}; + async function CliLogic() { console.log(TomgUtils.packageVersion()); let options = makeDefaultConfigs(); @@ -215,6 +220,11 @@ function checkYargsParameters(options: options): options { default: options.generationOptions.convertCaseProperty, describe: "Convert property names to specified case" }, + eol: { + choices: ["LF", "CRLF"], + default: options.generationOptions.convertEol, + describe: "Force EOL to be LF or CRLF" + }, pv: { alias: "property-visibility", choices: ["public", "protected", "private", "none"], @@ -302,6 +312,8 @@ function checkYargsParameters(options: options): options { options.generationOptions.convertCaseEntity = argv.ce as IGenerationOptions["convertCaseEntity"]; options.generationOptions.convertCaseFile = argv.cf as IGenerationOptions["convertCaseFile"]; options.generationOptions.convertCaseProperty = argv.cp as IGenerationOptions["convertCaseProperty"]; + options.generationOptions.convertEol = (eolConverter[argv.eol] || + argv.eol) as IGenerationOptions["convertEol"]; options.generationOptions.lazy = argv.lazy; options.generationOptions.customNamingStrategyPath = argv.namingStrategy; options.generationOptions.noConfigs = argv.noConfig; @@ -525,6 +537,11 @@ async function useInquirer(options: options): Promise { options.generationOptions.convertCaseFile !== defaultGenerationOptions.convertCaseFile }, + { + name: "Change EOL to be \\n or \\r\\n", + value: "converteol", + checked: false + }, { name: "Pluralize OneToMany, ManyToMany relation names", @@ -659,6 +676,18 @@ async function useInquirer(options: options): Promise { options.generationOptions.convertCaseEntity = namingConventions.entityCase; } + if (customizations.includes("converteol")) { + const eolChoice = await inquirer.prompt([ + { + choices: ["LF", "CRLF"], + default: options.generationOptions.convertEol, + message: "Force EOL to be:", + name: "eol", + type: "list" + } + ]); + options.generationOptions.convertEol = eolConverter[eolChoice.eol]; + } } const { saveConfig } = await inquirer.prompt([ { From ee9a4a260556b0feba75bd0038bc22bc0fd90115 Mon Sep 17 00:00:00 2001 From: Paolo Ceschi Berrini Date: Wed, 15 Jan 2020 16:46:29 +0100 Subject: [PATCH 05/10] init converter before calling the CLI --- src/index.ts | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/index.ts b/src/index.ts index aaa92a1..6be3fa0 100644 --- a/src/index.ts +++ b/src/index.ts @@ -12,6 +12,10 @@ import fs = require("fs-extra"); import inquirer = require("inquirer"); import path = require("path"); +const eolConverter = { + LF: "\n", + CRLF: "\r\n" +}; // eslint-disable-next-line @typescript-eslint/no-floating-promises CliLogic(); @@ -20,11 +24,6 @@ type options = { generationOptions: IGenerationOptions; }; -const eolConverter = { - LF: "\n", - CRLF: "\r\n" -}; - async function CliLogic() { console.log(TomgUtils.packageVersion()); let options = makeDefaultConfigs(); From f42e3163c773dc210e1e806295b61ab061095b59 Mon Sep 17 00:00:00 2001 From: Paolo Ceschi Berrini Date: Wed, 15 Jan 2020 16:47:08 +0100 Subject: [PATCH 06/10] Default values as defined in index.ts --- src/IGenerationOptions.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/IGenerationOptions.ts b/src/IGenerationOptions.ts index 462f330..e6c644d 100644 --- a/src/IGenerationOptions.ts +++ b/src/IGenerationOptions.ts @@ -32,7 +32,7 @@ export function getDefaultGenerationOptions(): IGenerationOptions { convertCaseFile: "pascal", convertCaseEntity: "pascal", convertCaseProperty: "camel", - convertEol: EOL, + convertEol: EOL === "\n" ? "LF" : "CRLF", propertyVisibility: "none", lazy: false, activeRecord: false, From 4a317009e05ea2dba8b517c2a616013e82c256e0 Mon Sep 17 00:00:00 2001 From: Paolo Ceschi Berrini Date: Thu, 16 Jan 2020 10:41:21 +0100 Subject: [PATCH 07/10] refactoring export eolConverter --- src/IGenerationOptions.ts | 6 ++++++ src/index.ts | 10 ++-------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/IGenerationOptions.ts b/src/IGenerationOptions.ts index e6c644d..62800e6 100644 --- a/src/IGenerationOptions.ts +++ b/src/IGenerationOptions.ts @@ -24,6 +24,12 @@ export default interface IGenerationOptions { indexFile: boolean; exportType: "named" | "default"; } + +export const eolConverter = { + LF: "\n", + CRLF: "\r\n" +}; + export function getDefaultGenerationOptions(): IGenerationOptions { const generationOptions: IGenerationOptions = { resultsPath: path.resolve(process.cwd(), "output"), diff --git a/src/index.ts b/src/index.ts index 6be3fa0..6292a57 100644 --- a/src/index.ts +++ b/src/index.ts @@ -11,11 +11,6 @@ import IGenerationOptions, { import fs = require("fs-extra"); import inquirer = require("inquirer"); import path = require("path"); - -const eolConverter = { - LF: "\n", - CRLF: "\r\n" -}; // eslint-disable-next-line @typescript-eslint/no-floating-promises CliLogic(); @@ -311,8 +306,7 @@ function checkYargsParameters(options: options): options { options.generationOptions.convertCaseEntity = argv.ce as IGenerationOptions["convertCaseEntity"]; options.generationOptions.convertCaseFile = argv.cf as IGenerationOptions["convertCaseFile"]; options.generationOptions.convertCaseProperty = argv.cp as IGenerationOptions["convertCaseProperty"]; - options.generationOptions.convertEol = (eolConverter[argv.eol] || - argv.eol) as IGenerationOptions["convertEol"]; + options.generationOptions.convertEol = argv.eol as IGenerationOptions["convertEol"]; options.generationOptions.lazy = argv.lazy; options.generationOptions.customNamingStrategyPath = argv.namingStrategy; options.generationOptions.noConfigs = argv.noConfig; @@ -685,7 +679,7 @@ async function useInquirer(options: options): Promise { type: "list" } ]); - options.generationOptions.convertEol = eolConverter[eolChoice.eol]; + options.generationOptions.convertEol = eolChoice.eol; } } const { saveConfig } = await inquirer.prompt([ From 9762e64febd4b47ee52a66df66f92fa41d7b3094 Mon Sep 17 00:00:00 2001 From: Paolo Ceschi Berrini Date: Thu, 16 Jan 2020 10:42:20 +0100 Subject: [PATCH 08/10] render if EOL is different than the option --- src/ModelGeneration.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ModelGeneration.ts b/src/ModelGeneration.ts index 559a4d6..af573e9 100644 --- a/src/ModelGeneration.ts +++ b/src/ModelGeneration.ts @@ -5,7 +5,7 @@ import * as fs from "fs"; import * as path from "path"; import { EOL } from "os"; import IConnectionOptions from "./IConnectionOptions"; -import IGenerationOptions from "./IGenerationOptions"; +import IGenerationOptions, { eolConverter } from "./IGenerationOptions"; import { Entity } from "./models/Entity"; import { Relation } from "./models/Relation"; @@ -73,10 +73,10 @@ function generateModels( ); const rendered = entityCompliedTemplate(element); const withImportStatements = removeUnusedImports( - EOL !== generationOptions.convertEol + EOL !== eolConverter[generationOptions.convertEol] ? rendered.replace( /(\r\n|\n|\r)/gm, - generationOptions.convertEol + eolConverter[generationOptions.convertEol] ) : rendered ); From 81a07e6dba40c36ac8bb2283ab57ae23723431cb Mon Sep 17 00:00:00 2001 From: Paolo Ceschi Berrini Date: Thu, 16 Jan 2020 10:42:44 +0100 Subject: [PATCH 09/10] corrected values of tests for LF and CRLF --- test/modelCustomization/modelCustomization.test.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/test/modelCustomization/modelCustomization.test.ts b/test/modelCustomization/modelCustomization.test.ts index ad54d58..8443f1f 100644 --- a/test/modelCustomization/modelCustomization.test.ts +++ b/test/modelCustomization/modelCustomization.test.ts @@ -288,7 +288,7 @@ describe("Model customization phase", async () => { const data = generateSampleData(); const generationOptions = generateGenerationOptions(); clearGenerationDir(); - generationOptions.convertEol = "\n"; + generationOptions.convertEol = "LF"; const customizedModel = modelCustomizationPhase( data, generationOptions, @@ -300,18 +300,18 @@ describe("Model customization phase", async () => { customizedModel ); const filesGenPath = path.resolve(resultsPath, "entities"); - const posterContent = fs + const postContent = fs .readFileSync(path.resolve(filesGenPath, "Post.ts")) .toString(); - expect(posterContent).to.not.contain("\r\n"); - expect(posterContent).to.contain("\n"); + expect(postContent).to.not.contain("\r\n"); + expect(postContent).to.contain("\n"); compileGeneratedModel(generationOptions.resultsPath, [""]); }); it("CRLF", () => { const data = generateSampleData(); const generationOptions = generateGenerationOptions(); clearGenerationDir(); - generationOptions.convertEol = "\r\n"; + generationOptions.convertEol = "CRLF"; const customizedModel = modelCustomizationPhase( data, generationOptions, @@ -323,10 +323,10 @@ describe("Model customization phase", async () => { customizedModel ); const filesGenPath = path.resolve(resultsPath, "entities"); - const posterContent = fs + const postContent = fs .readFileSync(path.resolve(filesGenPath, "Post.ts")) .toString(); - expect(posterContent).to.contain("\r\n"); + expect(postContent).to.contain("\r\n"); compileGeneratedModel(generationOptions.resultsPath, [""]); }); }); From f2d97b267a3332392e965ad096199e18deb6b50c Mon Sep 17 00:00:00 2001 From: Kononnable Date: Sun, 9 Feb 2020 22:03:13 +0100 Subject: [PATCH 10/10] small refactor --- src/IGenerationOptions.ts | 2 +- src/index.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/IGenerationOptions.ts b/src/IGenerationOptions.ts index 62800e6..684494d 100644 --- a/src/IGenerationOptions.ts +++ b/src/IGenerationOptions.ts @@ -12,7 +12,7 @@ export default interface IGenerationOptions { convertCaseFile: "pascal" | "param" | "camel" | "none"; convertCaseEntity: "pascal" | "camel" | "none"; convertCaseProperty: "pascal" | "camel" | "none"; - convertEol: string; + convertEol: "LF" | "CRLF"; propertyVisibility: "public" | "protected" | "private" | "none"; lazy: boolean; activeRecord: boolean; diff --git a/src/index.ts b/src/index.ts index 6292a57..15e34c8 100644 --- a/src/index.ts +++ b/src/index.ts @@ -531,7 +531,7 @@ async function useInquirer(options: options): Promise { defaultGenerationOptions.convertCaseFile }, { - name: "Change EOL to be \\n or \\r\\n", + name: "Use specific EOL character", value: "converteol", checked: false },