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.
- package/.idea/codeStyles/Project.xml +57 -0
- package/.idea/codeStyles/codeStyleConfig.xml +5 -0
- package/.idea/inspectionProfiles/Project_Default.xml +6 -0
- package/.idea/modules.xml +8 -0
- package/.idea/prettier.xml +6 -0
- package/.idea/test.iml +8 -0
- package/.idea/vcs.xml +6 -0
- package/CHANGELOG.md +161 -0
- package/CONTRIBUTING.md +51 -0
- package/DEVELOPER.md +30 -0
- package/LICENSE +21 -0
- package/README.md +94 -0
- package/USECASES.md +53 -0
- package/bin/typeorm-model-generator +6 -0
- package/dist/package.json +106 -0
- package/dist/src/Engine.d.ts +7 -0
- package/dist/src/Engine.js +47 -0
- package/dist/src/IConnectionOptions.d.ts +14 -0
- package/dist/src/IConnectionOptions.js +22 -0
- package/dist/src/IGenerationOptions.d.ts +24 -0
- package/dist/src/IGenerationOptions.js +33 -0
- package/dist/src/ModelCustomization.d.ts +4 -0
- package/dist/src/ModelCustomization.js +256 -0
- package/dist/src/ModelGeneration.d.ts +4 -0
- package/dist/src/ModelGeneration.js +247 -0
- package/dist/src/NamingStrategy.d.ts +10 -0
- package/dist/src/NamingStrategy.js +61 -0
- package/dist/src/Utils.d.ts +6 -0
- package/dist/src/Utils.js +68 -0
- package/dist/src/drivers/AbstractDriver.d.ts +30 -0
- package/dist/src/drivers/AbstractDriver.js +258 -0
- package/dist/src/drivers/MariaDbDriver.d.ts +4 -0
- package/dist/src/drivers/MariaDbDriver.js +11 -0
- package/dist/src/drivers/MssqlDriver.d.ts +25 -0
- package/dist/src/drivers/MssqlDriver.js +408 -0
- package/dist/src/drivers/MysqlDriver.d.ts +27 -0
- package/dist/src/drivers/MysqlDriver.js +439 -0
- package/dist/src/drivers/OracleDriver.d.ts +25 -0
- package/dist/src/drivers/OracleDriver.js +316 -0
- package/dist/src/drivers/PostgresDriver.d.ts +31 -0
- package/dist/src/drivers/PostgresDriver.js +542 -0
- package/dist/src/drivers/SqliteDriver.d.ts +28 -0
- package/dist/src/drivers/SqliteDriver.js +308 -0
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.js +667 -0
- package/dist/src/library.d.ts +11 -0
- package/dist/src/library.js +14 -0
- package/dist/src/models/Column.d.ts +24 -0
- package/dist/src/models/Column.js +3 -0
- package/dist/src/models/Entity.d.ts +21 -0
- package/dist/src/models/Entity.js +3 -0
- package/dist/src/models/Index.d.ts +9 -0
- package/dist/src/models/Index.js +3 -0
- package/dist/src/models/Relation.d.ts +11 -0
- package/dist/src/models/Relation.js +3 -0
- package/dist/src/models/RelationId.d.ts +5 -0
- package/dist/src/models/RelationId.js +3 -0
- package/dist/src/models/RelationInternal.d.ts +11 -0
- package/dist/src/models/RelationInternal.js +3 -0
- package/dist/src/templates/entity.mst +47 -0
- package/dist/src/templates/index.mst +5 -0
- package/dist/src/templates/ormconfig.mst +17 -0
- package/dist/src/templates/tsconfig.mst +10 -0
- package/npminstall-debug.log +175 -0
- 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 {};
|