midway-model-gen 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/.idea/codeStyles/Project.xml +57 -0
  2. package/.idea/codeStyles/codeStyleConfig.xml +5 -0
  3. package/.idea/inspectionProfiles/Project_Default.xml +6 -0
  4. package/.idea/modules.xml +8 -0
  5. package/.idea/prettier.xml +6 -0
  6. package/.idea/test.iml +8 -0
  7. package/.idea/vcs.xml +6 -0
  8. package/CHANGELOG.md +161 -0
  9. package/CONTRIBUTING.md +51 -0
  10. package/DEVELOPER.md +30 -0
  11. package/LICENSE +21 -0
  12. package/README.md +94 -0
  13. package/USECASES.md +53 -0
  14. package/bin/typeorm-model-generator +6 -0
  15. package/dist/package.json +106 -0
  16. package/dist/src/Engine.d.ts +7 -0
  17. package/dist/src/Engine.js +47 -0
  18. package/dist/src/IConnectionOptions.d.ts +14 -0
  19. package/dist/src/IConnectionOptions.js +22 -0
  20. package/dist/src/IGenerationOptions.d.ts +24 -0
  21. package/dist/src/IGenerationOptions.js +33 -0
  22. package/dist/src/ModelCustomization.d.ts +4 -0
  23. package/dist/src/ModelCustomization.js +256 -0
  24. package/dist/src/ModelGeneration.d.ts +4 -0
  25. package/dist/src/ModelGeneration.js +247 -0
  26. package/dist/src/NamingStrategy.d.ts +10 -0
  27. package/dist/src/NamingStrategy.js +61 -0
  28. package/dist/src/Utils.d.ts +6 -0
  29. package/dist/src/Utils.js +68 -0
  30. package/dist/src/drivers/AbstractDriver.d.ts +30 -0
  31. package/dist/src/drivers/AbstractDriver.js +258 -0
  32. package/dist/src/drivers/MariaDbDriver.d.ts +4 -0
  33. package/dist/src/drivers/MariaDbDriver.js +11 -0
  34. package/dist/src/drivers/MssqlDriver.d.ts +25 -0
  35. package/dist/src/drivers/MssqlDriver.js +408 -0
  36. package/dist/src/drivers/MysqlDriver.d.ts +27 -0
  37. package/dist/src/drivers/MysqlDriver.js +439 -0
  38. package/dist/src/drivers/OracleDriver.d.ts +25 -0
  39. package/dist/src/drivers/OracleDriver.js +316 -0
  40. package/dist/src/drivers/PostgresDriver.d.ts +31 -0
  41. package/dist/src/drivers/PostgresDriver.js +542 -0
  42. package/dist/src/drivers/SqliteDriver.d.ts +28 -0
  43. package/dist/src/drivers/SqliteDriver.js +308 -0
  44. package/dist/src/index.d.ts +1 -0
  45. package/dist/src/index.js +667 -0
  46. package/dist/src/library.d.ts +11 -0
  47. package/dist/src/library.js +14 -0
  48. package/dist/src/models/Column.d.ts +24 -0
  49. package/dist/src/models/Column.js +3 -0
  50. package/dist/src/models/Entity.d.ts +21 -0
  51. package/dist/src/models/Entity.js +3 -0
  52. package/dist/src/models/Index.d.ts +9 -0
  53. package/dist/src/models/Index.js +3 -0
  54. package/dist/src/models/Relation.d.ts +11 -0
  55. package/dist/src/models/Relation.js +3 -0
  56. package/dist/src/models/RelationId.d.ts +5 -0
  57. package/dist/src/models/RelationId.js +3 -0
  58. package/dist/src/models/RelationInternal.d.ts +11 -0
  59. package/dist/src/models/RelationInternal.js +3 -0
  60. package/dist/src/templates/entity.mst +47 -0
  61. package/dist/src/templates/index.mst +5 -0
  62. package/dist/src/templates/ormconfig.mst +17 -0
  63. package/dist/src/templates/tsconfig.mst +10 -0
  64. package/npminstall-debug.log +175 -0
  65. package/package.json +106 -0
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.dataCollectionPhase = exports.createModelFromDatabase = exports.createDriver = void 0;
4
+ const TomgUtils = require("./Utils");
5
+ const MssqlDriver_1 = require("./drivers/MssqlDriver");
6
+ const MariaDbDriver_1 = require("./drivers/MariaDbDriver");
7
+ const PostgresDriver_1 = require("./drivers/PostgresDriver");
8
+ const MysqlDriver_1 = require("./drivers/MysqlDriver");
9
+ const OracleDriver_1 = require("./drivers/OracleDriver");
10
+ const SqliteDriver_1 = require("./drivers/SqliteDriver");
11
+ const ModelCustomization_1 = require("./ModelCustomization");
12
+ const ModelGeneration_1 = require("./ModelGeneration");
13
+ function createDriver(driverName) {
14
+ switch (driverName) {
15
+ case "mssql":
16
+ return new MssqlDriver_1.default();
17
+ case "postgres":
18
+ return new PostgresDriver_1.default();
19
+ case "mysql":
20
+ return new MysqlDriver_1.default();
21
+ case "mariadb":
22
+ return new MariaDbDriver_1.default();
23
+ case "oracle":
24
+ return new OracleDriver_1.default();
25
+ case "sqlite":
26
+ return new SqliteDriver_1.default();
27
+ default:
28
+ TomgUtils.LogError("Database engine not recognized.", false);
29
+ throw new Error("Database engine not recognized.");
30
+ }
31
+ }
32
+ exports.createDriver = createDriver;
33
+ async function createModelFromDatabase(driver, connectionOptions, generationOptions) {
34
+ let dbModel = await dataCollectionPhase(driver, connectionOptions, generationOptions);
35
+ if (dbModel.length === 0) {
36
+ TomgUtils.LogError("Tables not found in selected database. Skipping creation of typeorm model.", false);
37
+ return;
38
+ }
39
+ dbModel = (0, ModelCustomization_1.default)(dbModel, generationOptions, driver.defaultValues);
40
+ (0, ModelGeneration_1.default)(connectionOptions, generationOptions, dbModel);
41
+ }
42
+ exports.createModelFromDatabase = createModelFromDatabase;
43
+ async function dataCollectionPhase(driver, connectionOptions, generationOptions) {
44
+ return driver.GetDataFromServer(connectionOptions, generationOptions);
45
+ }
46
+ exports.dataCollectionPhase = dataCollectionPhase;
47
+ //# sourceMappingURL=Engine.js.map
@@ -0,0 +1,14 @@
1
+ export default interface IConnectionOptions {
2
+ host: string;
3
+ port: number;
4
+ databaseNames: string[];
5
+ user: string;
6
+ password: string;
7
+ databaseType: "mssql" | "postgres" | "mysql" | "mariadb" | "oracle" | "sqlite";
8
+ schemaNames: string[];
9
+ instanceName?: string;
10
+ ssl: boolean;
11
+ skipTables: string[];
12
+ onlyTables: string[];
13
+ }
14
+ export declare function getDefaultConnectionOptions(): IConnectionOptions;
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ // TODO: change name
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.getDefaultConnectionOptions = void 0;
5
+ function getDefaultConnectionOptions() {
6
+ const connectionOptions = {
7
+ host: "127.0.0.1",
8
+ port: 0,
9
+ databaseNames: [""],
10
+ user: "",
11
+ password: "",
12
+ databaseType: undefined,
13
+ schemaNames: [""],
14
+ instanceName: undefined,
15
+ ssl: false,
16
+ skipTables: [],
17
+ onlyTables: [],
18
+ };
19
+ return connectionOptions;
20
+ }
21
+ exports.getDefaultConnectionOptions = getDefaultConnectionOptions;
22
+ //# sourceMappingURL=IConnectionOptions.js.map
@@ -0,0 +1,24 @@
1
+ export default interface IGenerationOptions {
2
+ resultsPath: string;
3
+ pluralizeNames: boolean;
4
+ noConfigs: boolean;
5
+ convertCaseFile: "pascal" | "param" | "camel" | "none";
6
+ convertCaseEntity: "pascal" | "camel" | "none";
7
+ convertCaseProperty: "pascal" | "camel" | "snake" | "none";
8
+ convertEol: "LF" | "CRLF";
9
+ propertyVisibility: "public" | "protected" | "private" | "none";
10
+ lazy: boolean;
11
+ activeRecord: boolean;
12
+ generateConstructor: boolean;
13
+ customNamingStrategyPath: string;
14
+ relationIds: boolean;
15
+ strictMode: "none" | "?" | "!";
16
+ skipSchema: boolean;
17
+ indexFile: boolean;
18
+ exportType: "named" | "default";
19
+ }
20
+ export declare const eolConverter: {
21
+ LF: string;
22
+ CRLF: string;
23
+ };
24
+ export declare function getDefaultGenerationOptions(): IGenerationOptions;
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getDefaultGenerationOptions = exports.eolConverter = void 0;
4
+ const os_1 = require("os");
5
+ const path = require("path");
6
+ exports.eolConverter = {
7
+ LF: "\n",
8
+ CRLF: "\r\n",
9
+ };
10
+ function getDefaultGenerationOptions() {
11
+ const generationOptions = {
12
+ resultsPath: path.resolve(process.cwd(), "output"),
13
+ pluralizeNames: true,
14
+ noConfigs: false,
15
+ convertCaseFile: "param",
16
+ convertCaseEntity: "pascal",
17
+ convertCaseProperty: "camel",
18
+ convertEol: os_1.EOL === "\n" ? "LF" : "CRLF",
19
+ propertyVisibility: "none",
20
+ lazy: false,
21
+ activeRecord: false,
22
+ generateConstructor: false,
23
+ customNamingStrategyPath: "",
24
+ relationIds: false,
25
+ strictMode: "none",
26
+ skipSchema: false,
27
+ indexFile: false,
28
+ exportType: "named",
29
+ };
30
+ return generationOptions;
31
+ }
32
+ exports.getDefaultGenerationOptions = getDefaultGenerationOptions;
33
+ //# sourceMappingURL=IGenerationOptions.js.map
@@ -0,0 +1,4 @@
1
+ import { DataTypeDefaults } from "typeorm/driver/types/DataTypeDefaults";
2
+ import { Entity } from "./models/Entity";
3
+ import IGenerationOptions from "./IGenerationOptions";
4
+ export default function modelCustomizationPhase(dbModel: Entity[], generationOptions: IGenerationOptions, defaultValues: DataTypeDefaults): Entity[];
@@ -0,0 +1,256 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const DefaultNamingStrategy_1 = require("typeorm/naming-strategy/DefaultNamingStrategy");
4
+ const NamingStrategy = require("./NamingStrategy");
5
+ const TomgUtils = require("./Utils");
6
+ function modelCustomizationPhase(dbModel, generationOptions, defaultValues) {
7
+ const namingStrategy = {
8
+ enablePluralization: NamingStrategy.enablePluralization,
9
+ columnName: NamingStrategy.columnName,
10
+ entityName: NamingStrategy.entityName,
11
+ relationIdName: NamingStrategy.relationIdName,
12
+ relationName: NamingStrategy.relationName,
13
+ fileName: NamingStrategy.fileName,
14
+ };
15
+ if (generationOptions.customNamingStrategyPath &&
16
+ generationOptions.customNamingStrategyPath !== "") {
17
+ // TODO: change form of logging
18
+ const req = TomgUtils.requireLocalFile(generationOptions.customNamingStrategyPath);
19
+ if (req.columnName) {
20
+ console.log(`[${new Date().toLocaleTimeString()}] Using custom naming strategy for column names.`);
21
+ namingStrategy.columnName = req.columnName;
22
+ }
23
+ else {
24
+ console.log(`[${new Date().toLocaleTimeString()}] Using standard naming strategy for column names.`);
25
+ }
26
+ if (req.entityName) {
27
+ console.log(`[${new Date().toLocaleTimeString()}] Using custom naming strategy for entity names.`);
28
+ namingStrategy.entityName = req.entityName;
29
+ }
30
+ else {
31
+ console.log(`[${new Date().toLocaleTimeString()}] Using standard naming strategy for entity names.`);
32
+ }
33
+ if (req.relationIdName) {
34
+ console.log(`[${new Date().toLocaleTimeString()}] Using custom naming strategy for relationId field names.`);
35
+ namingStrategy.relationIdName = req.relationIdName;
36
+ }
37
+ else {
38
+ console.log(`[${new Date().toLocaleTimeString()}] Using standard naming strategy for relationId field names.`);
39
+ }
40
+ if (req.relationName) {
41
+ console.log(`[${new Date().toLocaleTimeString()}] Using custom naming strategy for relation field names.`);
42
+ namingStrategy.relationName = req.relationName;
43
+ }
44
+ else {
45
+ console.log(`[${new Date().toLocaleTimeString()}] Using standard naming strategy for relation field names.`);
46
+ }
47
+ if (req.fileName) {
48
+ console.log(`[${new Date().toLocaleTimeString()}] Using custom naming strategy for entity file names.`);
49
+ namingStrategy.fileName = req.fileName;
50
+ }
51
+ else {
52
+ console.log(`[${new Date().toLocaleTimeString()}] Using standard naming strategy for entity file names.`);
53
+ }
54
+ if (req.enablePluralization) {
55
+ console.log(`[${new Date().toLocaleTimeString()}] Using custom pluralization method for OneToMany, ManyToMany relation field names.`);
56
+ namingStrategy.enablePluralization = req.enablePluralization;
57
+ }
58
+ else {
59
+ console.log(`[${new Date().toLocaleTimeString()}] Using custom pluralization method for OneToMany, ManyToMany relation field names.`);
60
+ }
61
+ }
62
+ namingStrategy.enablePluralization(generationOptions.pluralizeNames);
63
+ let retVal = removeIndicesGeneratedByTypeorm(dbModel);
64
+ retVal = removeColumnsInRelation(dbModel);
65
+ retVal = applyNamingStrategy(namingStrategy, dbModel);
66
+ retVal = addImportsAndGenerationOptions(retVal, generationOptions);
67
+ retVal = removeColumnDefaultProperties(retVal, defaultValues);
68
+ return retVal;
69
+ }
70
+ exports.default = modelCustomizationPhase;
71
+ function removeIndicesGeneratedByTypeorm(dbModel) {
72
+ // TODO: Support typeorm CustomNamingStrategy
73
+ const namingStrategy = new DefaultNamingStrategy_1.DefaultNamingStrategy();
74
+ dbModel.forEach((entity) => {
75
+ entity.indices = entity.indices.filter((v) => !(v.name.startsWith(`sqlite_autoindex_`) ||
76
+ (v.primary && v.name === "PRIMARY")));
77
+ const primaryColumns = entity.columns
78
+ .filter((v) => v.primary)
79
+ .map((v) => v.tscName);
80
+ entity.indices = entity.indices.filter((v) => !(v.primary &&
81
+ v.name ===
82
+ namingStrategy.primaryKeyName(entity.tscName, primaryColumns)));
83
+ entity.relations
84
+ .filter((v) => v.joinColumnOptions)
85
+ .forEach((rel) => {
86
+ const columnNames = rel.joinColumnOptions.map((v) => v.name);
87
+ const idxName = namingStrategy.relationConstraintName(entity.tscName, columnNames);
88
+ const fkName = namingStrategy.foreignKeyName(entity.tscName, columnNames);
89
+ entity.indices = entity.indices.filter((v) => v.name !== idxName && v.name !== fkName);
90
+ });
91
+ });
92
+ return dbModel;
93
+ }
94
+ function removeColumnsInRelation(dbModel) {
95
+ dbModel.forEach((entity) => {
96
+ entity.columns = entity.columns.filter((col) => !col.isUsedInRelationAsOwner ||
97
+ col.isUsedInRelationAsReferenced ||
98
+ entity.indices.some((idx) => idx.columns.some((v) => v === col.tscName)) ||
99
+ col.primary);
100
+ });
101
+ return dbModel;
102
+ }
103
+ function removeColumnDefaultProperties(dbModel, defaultValues) {
104
+ if (!defaultValues) {
105
+ return dbModel;
106
+ }
107
+ dbModel.forEach((entity) => {
108
+ entity.columns.forEach((column) => {
109
+ const defVal = defaultValues[column.tscType];
110
+ if (defVal) {
111
+ if (column.options.length &&
112
+ defVal.length &&
113
+ column.options.length === defVal.length) {
114
+ column.options.length = undefined;
115
+ }
116
+ if (column.options.precision &&
117
+ defVal.precision &&
118
+ column.options.precision === defVal.precision &&
119
+ column.options.scale &&
120
+ defVal.scale &&
121
+ column.options.scale === defVal.scale) {
122
+ column.options.precision = undefined;
123
+ column.options.scale = undefined;
124
+ }
125
+ if (column.options.width &&
126
+ defVal.width &&
127
+ column.options.width === defVal.width) {
128
+ column.options.width = undefined;
129
+ }
130
+ }
131
+ });
132
+ });
133
+ return dbModel;
134
+ }
135
+ function findFileImports(dbModel) {
136
+ dbModel.forEach((entity) => {
137
+ entity.relations.forEach((relation) => {
138
+ if (relation.relatedTable !== entity.tscName &&
139
+ !entity.fileImports.some((v) => v.entityName === relation.relatedTable)) {
140
+ let relatedTable = dbModel.find((related) => related.tscName == relation.relatedTable);
141
+ entity.fileImports.push({
142
+ entityName: relatedTable.tscName,
143
+ fileName: relatedTable.fileName,
144
+ });
145
+ }
146
+ });
147
+ });
148
+ return dbModel;
149
+ }
150
+ function addImportsAndGenerationOptions(dbModel, generationOptions) {
151
+ dbModel = findFileImports(dbModel);
152
+ dbModel.forEach((entity) => {
153
+ entity.relations.forEach((relation) => {
154
+ if (generationOptions.lazy) {
155
+ if (!relation.relationOptions) {
156
+ relation.relationOptions = {};
157
+ }
158
+ relation.relationOptions.lazy = true;
159
+ }
160
+ });
161
+ if (generationOptions.skipSchema) {
162
+ entity.schema = undefined;
163
+ entity.database = undefined;
164
+ }
165
+ if (generationOptions.activeRecord) {
166
+ entity.activeRecord = true;
167
+ }
168
+ if (generationOptions.generateConstructor) {
169
+ entity.generateConstructor = true;
170
+ }
171
+ });
172
+ return dbModel;
173
+ }
174
+ function applyNamingStrategy(namingStrategy, dbModel) {
175
+ let retVal = changeRelationNames(dbModel);
176
+ retVal = changeRelationIdNames(retVal);
177
+ retVal = changeEntityNames(retVal);
178
+ retVal = changeColumnNames(retVal);
179
+ retVal = changeFileNames(retVal);
180
+ return retVal;
181
+ function changeRelationIdNames(model) {
182
+ model.forEach((entity) => {
183
+ entity.relationIds.forEach((relationId) => {
184
+ const oldName = relationId.fieldName;
185
+ const relation = entity.relations.find((v) => v.fieldName === relationId.relationField);
186
+ let newName = namingStrategy.relationIdName(relationId, relation, entity);
187
+ newName = TomgUtils.findNameForNewField(newName, entity, oldName);
188
+ entity.indices.forEach((index) => {
189
+ index.columns = index.columns.map((column2) => column2 === oldName ? newName : column2);
190
+ });
191
+ relationId.fieldName = newName;
192
+ });
193
+ });
194
+ return dbModel;
195
+ }
196
+ function changeRelationNames(model) {
197
+ model.forEach((entity) => {
198
+ entity.relations.forEach((relation) => {
199
+ const oldName = relation.fieldName;
200
+ let newName = namingStrategy.relationName(relation, entity);
201
+ newName = TomgUtils.findNameForNewField(newName, entity, oldName);
202
+ const relatedEntity = model.find((v) => v.tscName === relation.relatedTable);
203
+ const relation2 = relatedEntity.relations.find((v) => v.fieldName === relation.relatedField);
204
+ entity.relationIds
205
+ .filter((v) => v.relationField === oldName)
206
+ .forEach((v) => {
207
+ v.relationField = newName;
208
+ });
209
+ relation.fieldName = newName;
210
+ relation2.relatedField = newName;
211
+ if (relation.relationOptions) {
212
+ entity.indices.forEach((ind) => {
213
+ ind.columns.map((column2) => column2 === oldName ? newName : column2);
214
+ });
215
+ }
216
+ });
217
+ });
218
+ return dbModel;
219
+ }
220
+ function changeColumnNames(model) {
221
+ model.forEach((entity) => {
222
+ entity.columns.forEach((column) => {
223
+ const oldName = column.tscName;
224
+ let newName = namingStrategy.columnName(column.tscName, column);
225
+ newName = TomgUtils.findNameForNewField(newName, entity, oldName);
226
+ entity.indices.forEach((index) => {
227
+ index.columns = index.columns.map((column2) => column2 === oldName ? newName : column2);
228
+ });
229
+ column.tscName = newName;
230
+ });
231
+ });
232
+ return model;
233
+ }
234
+ function changeEntityNames(entities) {
235
+ entities.forEach((entity) => {
236
+ const newName = namingStrategy.entityName(entity.tscName, entity);
237
+ entities.forEach((entity2) => {
238
+ entity2.relations.forEach((relation) => {
239
+ if (relation.relatedTable === entity.tscName) {
240
+ relation.relatedTable = newName;
241
+ }
242
+ });
243
+ });
244
+ entity.tscName = newName;
245
+ entity.fileName = newName;
246
+ });
247
+ return entities;
248
+ }
249
+ function changeFileNames(entities) {
250
+ entities.forEach((entity) => {
251
+ entity.fileName = namingStrategy.fileName(entity.fileName);
252
+ });
253
+ return entities;
254
+ }
255
+ }
256
+ //# sourceMappingURL=ModelCustomization.js.map
@@ -0,0 +1,4 @@
1
+ import IConnectionOptions from "./IConnectionOptions";
2
+ import IGenerationOptions from "./IGenerationOptions";
3
+ import { Entity } from "./models/Entity";
4
+ export default function modelGenerationPhase(connectionOptions: IConnectionOptions, generationOptions: IGenerationOptions, databaseModel: Entity[]): void;
@@ -0,0 +1,247 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const Handlebars = require("handlebars");
4
+ const Prettier = require("prettier");
5
+ const changeCase = require("change-case");
6
+ const fs = require("fs");
7
+ const path = require("path");
8
+ const os_1 = require("os");
9
+ const IGenerationOptions_1 = require("./IGenerationOptions");
10
+ const prettierOptions = {
11
+ parser: "typescript",
12
+ endOfLine: "auto",
13
+ };
14
+ function modelGenerationPhase(connectionOptions, generationOptions, databaseModel) {
15
+ createHandlebarsHelpers(generationOptions);
16
+ const resultPath = generationOptions.resultsPath;
17
+ if (!fs.existsSync(resultPath)) {
18
+ fs.mkdirSync(resultPath);
19
+ }
20
+ let entitiesPath = resultPath;
21
+ if (!generationOptions.noConfigs) {
22
+ const tsconfigPath = path.resolve(resultPath, "tsconfig.json");
23
+ const typeormConfigPath = path.resolve(resultPath, "ormconfig.json");
24
+ createTsConfigFile(tsconfigPath);
25
+ createTypeOrmConfig(typeormConfigPath, connectionOptions);
26
+ entitiesPath = path.resolve(resultPath, "./entities");
27
+ if (!fs.existsSync(entitiesPath)) {
28
+ fs.mkdirSync(entitiesPath);
29
+ }
30
+ }
31
+ if (generationOptions.indexFile) {
32
+ createIndexFile(databaseModel, generationOptions, entitiesPath);
33
+ }
34
+ generateModels(databaseModel, generationOptions, entitiesPath);
35
+ }
36
+ exports.default = modelGenerationPhase;
37
+ function generateModels(databaseModel, generationOptions, entitiesPath) {
38
+ const entityTemplatePath = path.resolve(__dirname, "templates", "entity.mst");
39
+ const entityTemplate = fs.readFileSync(entityTemplatePath, "utf-8");
40
+ const entityCompliedTemplate = Handlebars.compile(entityTemplate, {
41
+ noEscape: true,
42
+ });
43
+ databaseModel.forEach((element) => {
44
+ let casedFileName = "";
45
+ switch (generationOptions.convertCaseFile) {
46
+ case "camel":
47
+ casedFileName = changeCase.camelCase(element.fileName);
48
+ break;
49
+ case "param":
50
+ casedFileName = changeCase.paramCase(element.fileName);
51
+ break;
52
+ case "pascal":
53
+ casedFileName = changeCase.pascalCase(element.fileName);
54
+ break;
55
+ case "none":
56
+ casedFileName = element.fileName;
57
+ break;
58
+ default:
59
+ throw new Error("Unknown case style");
60
+ }
61
+ const resultFilePath = path.resolve(entitiesPath, `${casedFileName}.entity.ts`);
62
+ const rendered = entityCompliedTemplate(element);
63
+ const withImportStatements = removeUnusedImports(os_1.EOL !== IGenerationOptions_1.eolConverter[generationOptions.convertEol]
64
+ ? rendered.replace(/(\r\n|\n|\r)/gm, IGenerationOptions_1.eolConverter[generationOptions.convertEol])
65
+ : rendered);
66
+ let formatted = "";
67
+ try {
68
+ formatted = Prettier.format(withImportStatements, prettierOptions);
69
+ }
70
+ catch (error) {
71
+ console.error("There were some problems with model generation for table: ", element.sqlName);
72
+ console.error(error);
73
+ formatted = withImportStatements;
74
+ }
75
+ fs.writeFileSync(resultFilePath, formatted, {
76
+ encoding: "utf-8",
77
+ flag: "w",
78
+ });
79
+ });
80
+ }
81
+ function createIndexFile(databaseModel, generationOptions, entitiesPath) {
82
+ const templatePath = path.resolve(__dirname, "templates", "index.mst");
83
+ const template = fs.readFileSync(templatePath, "utf-8");
84
+ const compliedTemplate = Handlebars.compile(template, {
85
+ noEscape: true,
86
+ });
87
+ const rendered = compliedTemplate({ entities: databaseModel });
88
+ const formatted = Prettier.format(rendered, prettierOptions);
89
+ let fileName = "index";
90
+ switch (generationOptions.convertCaseFile) {
91
+ case "camel":
92
+ fileName = changeCase.camelCase(fileName);
93
+ break;
94
+ case "param":
95
+ fileName = changeCase.paramCase(fileName);
96
+ break;
97
+ case "pascal":
98
+ fileName = changeCase.pascalCase(fileName);
99
+ break;
100
+ default:
101
+ }
102
+ const resultFilePath = path.resolve(entitiesPath, `${fileName}.entity.ts`);
103
+ fs.writeFileSync(resultFilePath, formatted, {
104
+ encoding: "utf-8",
105
+ flag: "w",
106
+ });
107
+ }
108
+ function removeUnusedImports(rendered) {
109
+ const openBracketIndex = rendered.indexOf("{") + 1;
110
+ const closeBracketIndex = rendered.indexOf("}");
111
+ const imports = rendered
112
+ .substring(openBracketIndex, closeBracketIndex)
113
+ .split(",");
114
+ const restOfEntityDefinition = rendered.substring(closeBracketIndex);
115
+ const distinctImports = imports.filter((v) => restOfEntityDefinition.indexOf(`@${v}(`) !== -1 ||
116
+ (v === "BaseEntity" && restOfEntityDefinition.indexOf(v) !== -1));
117
+ return `${rendered.substring(0, openBracketIndex)}${distinctImports.join(",")}${restOfEntityDefinition}`;
118
+ }
119
+ function createHandlebarsHelpers(generationOptions) {
120
+ Handlebars.registerHelper("json", (context) => {
121
+ const json = JSON.stringify(context);
122
+ const withoutQuotes = json.replace(/"([^(")"]+)":/g, "$1:");
123
+ return withoutQuotes.slice(1, withoutQuotes.length - 1);
124
+ });
125
+ Handlebars.registerHelper("toEntityName", (str) => {
126
+ let retStr = "";
127
+ switch (generationOptions.convertCaseEntity) {
128
+ case "camel":
129
+ retStr = changeCase.camelCase(str);
130
+ break;
131
+ case "pascal":
132
+ retStr = changeCase.pascalCase(str);
133
+ break;
134
+ case "none":
135
+ retStr = str;
136
+ break;
137
+ default:
138
+ throw new Error("Unknown case style");
139
+ }
140
+ return retStr + 'Entity';
141
+ });
142
+ Handlebars.registerHelper("toFileName", (str) => {
143
+ let retStr = "";
144
+ switch (generationOptions.convertCaseFile) {
145
+ case "camel":
146
+ retStr = changeCase.camelCase(str);
147
+ break;
148
+ case "param":
149
+ retStr = changeCase.paramCase(str);
150
+ break;
151
+ case "pascal":
152
+ retStr = changeCase.pascalCase(str);
153
+ break;
154
+ case "none":
155
+ retStr = str;
156
+ break;
157
+ default:
158
+ throw new Error("Unknown case style");
159
+ }
160
+ return retStr;
161
+ });
162
+ Handlebars.registerHelper("printPropertyVisibility", () => generationOptions.propertyVisibility !== "none"
163
+ ? `${generationOptions.propertyVisibility} `
164
+ : "");
165
+ Handlebars.registerHelper("toPropertyName", (str) => {
166
+ let retStr = "";
167
+ switch (generationOptions.convertCaseProperty) {
168
+ case "camel":
169
+ retStr = changeCase.camelCase(str);
170
+ break;
171
+ case "pascal":
172
+ retStr = changeCase.pascalCase(str);
173
+ break;
174
+ case "none":
175
+ retStr = str;
176
+ break;
177
+ case "snake":
178
+ retStr = changeCase.snakeCase(str);
179
+ break;
180
+ default:
181
+ throw new Error("Unknown case style");
182
+ }
183
+ return retStr;
184
+ });
185
+ Handlebars.registerHelper("toRelation", (entityType, relationType) => {
186
+ let retVal = entityType;
187
+ if (relationType === "ManyToMany" || relationType === "OneToMany") {
188
+ retVal = `${retVal}[]`;
189
+ }
190
+ if (generationOptions.lazy) {
191
+ retVal = `Promise<${retVal}>`;
192
+ }
193
+ return retVal;
194
+ });
195
+ Handlebars.registerHelper("defaultExport", () => generationOptions.exportType === "default" ? "default" : "");
196
+ Handlebars.registerHelper("localImport", (entityName) => generationOptions.exportType === "default"
197
+ ? entityName
198
+ : `{${entityName}}`);
199
+ Handlebars.registerHelper("strictMode", () => generationOptions.strictMode !== "none"
200
+ ? generationOptions.strictMode
201
+ : "");
202
+ Handlebars.registerHelper({
203
+ and: (v1, v2) => v1 && v2,
204
+ eq: (v1, v2) => v1 === v2,
205
+ gt: (v1, v2) => v1 > v2,
206
+ gte: (v1, v2) => v1 >= v2,
207
+ lt: (v1, v2) => v1 < v2,
208
+ lte: (v1, v2) => v1 <= v2,
209
+ ne: (v1, v2) => v1 !== v2,
210
+ or: (v1, v2) => v1 || v2,
211
+ });
212
+ }
213
+ function createTsConfigFile(tsconfigPath) {
214
+ if (fs.existsSync(tsconfigPath)) {
215
+ console.warn(`\x1b[33m[${new Date().toLocaleTimeString()}] WARNING: Skipping generation of tsconfig.json file. File already exists. \x1b[0m`);
216
+ return;
217
+ }
218
+ const templatePath = path.resolve(__dirname, "templates", "tsconfig.mst");
219
+ const template = fs.readFileSync(templatePath, "utf-8");
220
+ const compliedTemplate = Handlebars.compile(template, {
221
+ noEscape: true,
222
+ });
223
+ const rendered = compliedTemplate({});
224
+ const formatted = Prettier.format(rendered, { parser: "json" });
225
+ fs.writeFileSync(tsconfigPath, formatted, {
226
+ encoding: "utf-8",
227
+ flag: "w",
228
+ });
229
+ }
230
+ function createTypeOrmConfig(typeormConfigPath, connectionOptions) {
231
+ if (fs.existsSync(typeormConfigPath)) {
232
+ console.warn(`\x1b[33m[${new Date().toLocaleTimeString()}] WARNING: Skipping generation of ormconfig.json file. File already exists. \x1b[0m`);
233
+ return;
234
+ }
235
+ const templatePath = path.resolve(__dirname, "templates", "ormconfig.mst");
236
+ const template = fs.readFileSync(templatePath, "utf-8");
237
+ const compiledTemplate = Handlebars.compile(template, {
238
+ noEscape: true,
239
+ });
240
+ const rendered = compiledTemplate(connectionOptions);
241
+ const formatted = Prettier.format(rendered, { parser: "json" });
242
+ fs.writeFileSync(typeormConfigPath, formatted, {
243
+ encoding: "utf-8",
244
+ flag: "w",
245
+ });
246
+ }
247
+ //# sourceMappingURL=ModelGeneration.js.map
@@ -0,0 +1,10 @@
1
+ import { Relation } from "./models/Relation";
2
+ import { RelationId } from "./models/RelationId";
3
+ import { Entity } from "./models/Entity";
4
+ import { Column } from "./models/Column";
5
+ export declare function enablePluralization(value: boolean): void;
6
+ export declare function relationIdName(relationId: RelationId, relation: Relation, owner?: Entity): string;
7
+ export declare function relationName(relation: Relation, owner?: Entity): string;
8
+ export declare function entityName(oldEntityName: string, entity?: Entity): string;
9
+ export declare function columnName(oldColumnName: string, column?: Column): string;
10
+ export declare function fileName(oldFileName: string): string;