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,308 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const TypeormDriver = require("typeorm/driver/sqlite/SqliteDriver");
4
+ const TomgUtils = require("../Utils");
5
+ const AbstractDriver_1 = require("./AbstractDriver");
6
+ class SqliteDriver extends AbstractDriver_1.default {
7
+ constructor() {
8
+ super();
9
+ this.defaultValues = new TypeormDriver.SqliteDriver({
10
+ options: { database: "true" },
11
+ }).dataTypeDefaults;
12
+ this.standardPort = 0;
13
+ this.standardUser = "";
14
+ this.standardSchema = "";
15
+ this.tablesWithGeneratedPrimaryKey = new Array();
16
+ try {
17
+ // eslint-disable-next-line import/no-extraneous-dependencies, global-require, import/no-unresolved
18
+ this.sqliteLib = require("sqlite3");
19
+ this.sqlite = this.sqliteLib.verbose();
20
+ }
21
+ catch (error) {
22
+ TomgUtils.LogError("", false, error);
23
+ throw error;
24
+ }
25
+ }
26
+ async GetAllTables(
27
+ /* eslint-disable-next-line @typescript-eslint/no-unused-vars */
28
+ schemas,
29
+ /* eslint-disable-next-line @typescript-eslint/no-unused-vars */
30
+ dbNames) {
31
+ const ret = [];
32
+ // eslint-disable-next-line camelcase
33
+ const rows = await this.ExecQuery(`SELECT tbl_name, sql FROM "sqlite_master" WHERE "type" = 'table' AND name NOT LIKE 'sqlite_%'`);
34
+ rows.forEach((val) => {
35
+ if (val.sql.includes("AUTOINCREMENT")) {
36
+ this.tablesWithGeneratedPrimaryKey.push(val.tbl_name);
37
+ }
38
+ ret.push({
39
+ columns: [],
40
+ indices: [],
41
+ relations: [],
42
+ relationIds: [],
43
+ sqlName: val.tbl_name,
44
+ tscName: val.tbl_name,
45
+ fileName: val.tbl_name,
46
+ fileImports: [],
47
+ });
48
+ });
49
+ return ret;
50
+ }
51
+ async GetCoulmnsFromEntity(entities) {
52
+ await Promise.all(entities.map(async (ent) => {
53
+ const response = await this.ExecQuery(`PRAGMA table_info('${ent.tscName}');`);
54
+ response.forEach((resp) => {
55
+ const tscName = resp.name;
56
+ let tscType = "";
57
+ const options = { name: resp.name };
58
+ if (resp.notnull === 0)
59
+ options.nullable = true;
60
+ const isPrimary = resp.pk > 0 ? true : undefined;
61
+ const defaultValue = SqliteDriver.ReturnDefaultValueFunction(resp.dflt_value);
62
+ const columnType = resp.type
63
+ .replace(/\([0-9 ,]+\)/g, "")
64
+ .toLowerCase()
65
+ .trim();
66
+ const generated = isPrimary &&
67
+ this.tablesWithGeneratedPrimaryKey.includes(ent.tscName)
68
+ ? true
69
+ : undefined;
70
+ switch (columnType) {
71
+ case "int":
72
+ tscType = "number";
73
+ break;
74
+ case "integer":
75
+ tscType = "number";
76
+ break;
77
+ case "int2":
78
+ tscType = "number";
79
+ break;
80
+ case "int8":
81
+ tscType = "number";
82
+ break;
83
+ case "tinyint":
84
+ tscType = "number";
85
+ break;
86
+ case "smallint":
87
+ tscType = "number";
88
+ break;
89
+ case "mediumint":
90
+ tscType = "number";
91
+ break;
92
+ case "bigint":
93
+ tscType = "string";
94
+ break;
95
+ case "unsigned big int":
96
+ tscType = "string";
97
+ break;
98
+ case "character":
99
+ tscType = "string";
100
+ break;
101
+ case "varchar":
102
+ tscType = "string";
103
+ break;
104
+ case "varying character":
105
+ tscType = "string";
106
+ break;
107
+ case "nchar":
108
+ tscType = "string";
109
+ break;
110
+ case "native character":
111
+ tscType = "string";
112
+ break;
113
+ case "nvarchar":
114
+ tscType = "string";
115
+ break;
116
+ case "text":
117
+ tscType = "string";
118
+ break;
119
+ case "blob":
120
+ tscType = "Buffer";
121
+ break;
122
+ case "clob":
123
+ tscType = "string";
124
+ break;
125
+ case "real":
126
+ tscType = "number";
127
+ break;
128
+ case "double":
129
+ tscType = "number";
130
+ break;
131
+ case "double precision":
132
+ tscType = "number";
133
+ break;
134
+ case "float":
135
+ tscType = "number";
136
+ break;
137
+ case "numeric":
138
+ tscType = "number";
139
+ break;
140
+ case "decimal":
141
+ tscType = "number";
142
+ break;
143
+ case "boolean":
144
+ tscType = "boolean";
145
+ break;
146
+ case "date":
147
+ tscType = "string";
148
+ break;
149
+ case "datetime":
150
+ tscType = "Date";
151
+ break;
152
+ default:
153
+ tscType = "NonNullable<unknown>";
154
+ TomgUtils.LogError(`Unknown column type: ${columnType} table name: ${ent.tscName} column name: ${resp.name}`);
155
+ break;
156
+ }
157
+ const sqlOptions = resp.type.match(/\([0-9 ,]+\)/g);
158
+ if (this.ColumnTypesWithPrecision.some((v) => v === columnType) &&
159
+ sqlOptions) {
160
+ options.precision = Number.parseInt(sqlOptions[0]
161
+ .substring(1, sqlOptions[0].length - 1)
162
+ .split(",")[0], 10);
163
+ options.scale = Number.parseInt(sqlOptions[0]
164
+ .substring(1, sqlOptions[0].length - 1)
165
+ .split(",")[1], 10);
166
+ }
167
+ if (this.ColumnTypesWithLength.some((v) => v === columnType) &&
168
+ sqlOptions) {
169
+ options.length = Number.parseInt(sqlOptions[0].substring(1, sqlOptions[0].length - 1), 10);
170
+ }
171
+ if (this.ColumnTypesWithWidth.some((v) => v === columnType && tscType !== "boolean") &&
172
+ sqlOptions) {
173
+ options.width = Number.parseInt(sqlOptions[0].substring(1, sqlOptions[0].length - 1), 10);
174
+ }
175
+ ent.columns.push({
176
+ generated,
177
+ primary: isPrimary,
178
+ type: columnType,
179
+ default: defaultValue,
180
+ options,
181
+ tscName,
182
+ tscType,
183
+ });
184
+ });
185
+ }));
186
+ return entities;
187
+ }
188
+ async GetIndexesFromEntity(entities) {
189
+ await Promise.all(entities.map(async (ent) => {
190
+ const response = await this.ExecQuery(`PRAGMA index_list('${ent.tscName}');`);
191
+ await Promise.all(response.map(async (resp) => {
192
+ const indexColumnsResponse = await this.ExecQuery(`PRAGMA index_info('${resp.name}');`);
193
+ const indexInfo = {
194
+ name: resp.name,
195
+ columns: [],
196
+ options: {},
197
+ };
198
+ if (resp.unique === 1)
199
+ indexInfo.options.unique = true;
200
+ indexColumnsResponse.forEach((record) => {
201
+ indexInfo.columns.push(record.name);
202
+ });
203
+ if (indexColumnsResponse.length === 1 &&
204
+ indexInfo.options.unique) {
205
+ ent.columns
206
+ .filter((v) => v.tscName === indexInfo.columns[0])
207
+ .forEach((v) => {
208
+ // eslint-disable-next-line no-param-reassign
209
+ v.options.unique = true;
210
+ });
211
+ }
212
+ ent.indices.push(indexInfo);
213
+ }));
214
+ }));
215
+ return entities;
216
+ }
217
+ async GetRelations(entities, schemas, dbNames, generationOptions) {
218
+ let retVal = entities;
219
+ await Promise.all(retVal.map(async (entity) => {
220
+ const response = await this.ExecQuery(`PRAGMA foreign_key_list('${entity.tscName}');`);
221
+ const relationsTemp = [];
222
+ const relationKeys = new Set(response.map((v) => v.id));
223
+ relationKeys.forEach((relationId) => {
224
+ const rows = response.filter((v) => v.id === relationId);
225
+ const ownerTable = entities.find((v) => v.sqlName === entity.tscName);
226
+ const relatedTable = entities.find((v) => v.sqlName === rows[0].table);
227
+ if (!ownerTable || !relatedTable) {
228
+ TomgUtils.LogError(`Relation between tables ${entity.tscName} and ${rows[0].table} wasn't found in entity model.`, true);
229
+ return;
230
+ }
231
+ const internal = {
232
+ ownerColumns: [],
233
+ relatedColumns: [],
234
+ ownerTable,
235
+ relatedTable,
236
+ };
237
+ if (rows[0].on_delete !== "NO ACTION") {
238
+ internal.onDelete = rows[0].on_delete;
239
+ }
240
+ if (rows[0].on_update !== "NO ACTION") {
241
+ internal.onUpdate = rows[0].on_update;
242
+ }
243
+ rows.forEach((row) => {
244
+ internal.ownerColumns.push(row.from);
245
+ internal.relatedColumns.push(row.to);
246
+ });
247
+ relationsTemp.push(internal);
248
+ });
249
+ retVal = SqliteDriver.GetRelationsFromRelationTempInfo(relationsTemp, retVal, generationOptions);
250
+ }));
251
+ return retVal;
252
+ }
253
+ async DisconnectFromServer() {
254
+ this.db.close();
255
+ }
256
+ async ConnectToServer(connectionOptons) {
257
+ const promise = new Promise((resolve, reject) => {
258
+ this.db = new this.sqlite.Database(connectionOptons.databaseNames[0], (err) => {
259
+ if (err) {
260
+ TomgUtils.LogError("Error connecting to SQLite database.", false, err.message);
261
+ reject(err);
262
+ return;
263
+ }
264
+ resolve();
265
+ });
266
+ });
267
+ return promise;
268
+ }
269
+ // eslint-disable-next-line class-methods-use-this
270
+ async CreateDB() {
271
+ // not supported
272
+ }
273
+ // eslint-disable-next-line class-methods-use-this
274
+ async DropDB() {
275
+ // not supported
276
+ }
277
+ // eslint-disable-next-line class-methods-use-this
278
+ async CheckIfDBExists() {
279
+ return true;
280
+ }
281
+ async ExecQuery(sql) {
282
+ let ret = [];
283
+ const promise = new Promise((resolve, reject) => {
284
+ this.db.serialize(() => {
285
+ this.db.all(sql, [], (err, row) => {
286
+ if (!err) {
287
+ ret = row;
288
+ resolve(true);
289
+ }
290
+ else {
291
+ TomgUtils.LogError("Error executing query on SQLite.", false, err.message);
292
+ reject(err);
293
+ }
294
+ });
295
+ });
296
+ });
297
+ await promise;
298
+ return ret;
299
+ }
300
+ static ReturnDefaultValueFunction(defVal) {
301
+ if (!defVal) {
302
+ return undefined;
303
+ }
304
+ return `() => "${defVal}"`;
305
+ }
306
+ }
307
+ exports.default = SqliteDriver;
308
+ //# sourceMappingURL=SqliteDriver.js.map
@@ -0,0 +1 @@
1
+ export {};