@andymic/pigeon 2.1.0 → 2.2.0
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/package.json +4 -4
- package/src/index.js +96 -3
- package/src/pgAdmin.js +5 -5
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@andymic/pigeon",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.2.0",
|
|
4
4
|
"author": "Andreas Michael <ateasm03@gmail.com>",
|
|
5
5
|
"description": "Pigeon is a TypeScript-based tool for generating TypeScript classes and methods from PostgreSQL database schemas.",
|
|
6
6
|
"keywords": [
|
|
@@ -31,9 +31,9 @@
|
|
|
31
31
|
"watch": "tsc --build --watch"
|
|
32
32
|
},
|
|
33
33
|
"dependencies": {
|
|
34
|
-
"meow": "^
|
|
35
|
-
"pg": "^8.
|
|
34
|
+
"meow": "^14.0.0",
|
|
35
|
+
"pg": "^8.18.0",
|
|
36
36
|
"prompt-sync": "^4.2.0"
|
|
37
37
|
},
|
|
38
|
-
"gitHead": "
|
|
38
|
+
"gitHead": "951ece18edb4d33960490b857952d3c3db923b68"
|
|
39
39
|
}
|
package/src/index.js
CHANGED
|
@@ -307,7 +307,26 @@ export function runGeneration(dir, db, tables, enums) {
|
|
|
307
307
|
}
|
|
308
308
|
}
|
|
309
309
|
}
|
|
310
|
-
|
|
310
|
+
let generatedClass = createClass(table.name, table.columns);
|
|
311
|
+
const importMatches = RegExp(/import {v[47] as uuidv[47]} from "uuid";\n/gd).exec(generatedClass);
|
|
312
|
+
if (importMatches) {
|
|
313
|
+
let is4Processed = false;
|
|
314
|
+
let is7Processed = false;
|
|
315
|
+
const matches = importMatches.reverse();
|
|
316
|
+
const indices = importMatches.indices?.reverse();
|
|
317
|
+
for (let i = 0; i < importMatches.length; i++) {
|
|
318
|
+
if (matches[i].includes("4") && !is4Processed) {
|
|
319
|
+
ts = matches[i] + "\n" + ts;
|
|
320
|
+
is4Processed = true;
|
|
321
|
+
}
|
|
322
|
+
if (matches[i].includes("7") && !is7Processed) {
|
|
323
|
+
ts = matches[i] + "\n" + ts;
|
|
324
|
+
is7Processed = true;
|
|
325
|
+
}
|
|
326
|
+
generatedClass = generatedClass.slice(0, indices[i][0]) + generatedClass.slice(indices[i][1]);
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
ts += generatedClass;
|
|
311
330
|
ts += "\n\n";
|
|
312
331
|
ts += createGetTypecast(table.columns);
|
|
313
332
|
ts += "\n\n";
|
|
@@ -380,7 +399,8 @@ function createIndex(db) {
|
|
|
380
399
|
}
|
|
381
400
|
function createClass(tableName, columns) {
|
|
382
401
|
let text = "";
|
|
383
|
-
|
|
402
|
+
const className = singularize(nameBeautifier(tableName)).replaceAll(" ", "");
|
|
403
|
+
text += "export class " + className + " {\n";
|
|
384
404
|
for (const column of columns) {
|
|
385
405
|
text += "\t/**\n";
|
|
386
406
|
if (column.isPrimary)
|
|
@@ -401,11 +421,84 @@ function createClass(tableName, columns) {
|
|
|
401
421
|
if (column.jsType === "Date") {
|
|
402
422
|
if (columnDefault.toLowerCase() === "now()")
|
|
403
423
|
text += " = new Date()";
|
|
404
|
-
else
|
|
424
|
+
else if (RegExp(/now\(\) \+ interval '(?:\d*? (?:microseconds?|milliseconds?|seconds?|minutes?|hours?|days?|weeks?|months?|years?) ?)*?'/).test(columnDefault.toLowerCase())) {
|
|
425
|
+
if (columnDefault.toLowerCase().match(/months?|years?/) && !text.includes("private static now = new Date();")) {
|
|
426
|
+
text = text.slice(0, ("export class " + className + " {\n").length);
|
|
427
|
+
text += "\t/**\n";
|
|
428
|
+
text += "\t * A helper object to calculate default dates.\n";
|
|
429
|
+
text += "\t*/\n";
|
|
430
|
+
text += "\tprivate static now = new Date();\n";
|
|
431
|
+
text += text.slice(("export class " + className + " {\n").length);
|
|
432
|
+
}
|
|
433
|
+
const matches = RegExp(/(\d+) (microseconds?|milliseconds?|seconds?|minutes?|hours?|days?|weeks?|months?|years?)/gm).exec(columnDefault.toLowerCase());
|
|
434
|
+
let milliseconds = "new Date().getTime()";
|
|
435
|
+
const groups = [];
|
|
436
|
+
for (let i = 0; i < matches.length; i += 3) {
|
|
437
|
+
groups.push(matches.slice(i, i + 3));
|
|
438
|
+
}
|
|
439
|
+
for (const group of groups) {
|
|
440
|
+
const number = Number(group[1]);
|
|
441
|
+
const unit = group[2];
|
|
442
|
+
switch (unit) {
|
|
443
|
+
case "microsecond":
|
|
444
|
+
case "microseconds":
|
|
445
|
+
if (number >= 500)
|
|
446
|
+
milliseconds += " + 1";
|
|
447
|
+
break;
|
|
448
|
+
case "millisecond":
|
|
449
|
+
case "milliseconds":
|
|
450
|
+
milliseconds += " + " + number;
|
|
451
|
+
break;
|
|
452
|
+
case "second":
|
|
453
|
+
case "seconds":
|
|
454
|
+
milliseconds += " + " + number + " * 1000";
|
|
455
|
+
break;
|
|
456
|
+
case "minute":
|
|
457
|
+
case "minutes":
|
|
458
|
+
milliseconds += " + " + number + " * 1000 * 60";
|
|
459
|
+
break;
|
|
460
|
+
case "hour":
|
|
461
|
+
case "hours":
|
|
462
|
+
milliseconds += " + " + number + " * 1000 * 60 * 60";
|
|
463
|
+
break;
|
|
464
|
+
case "day":
|
|
465
|
+
case "days":
|
|
466
|
+
milliseconds += " + " + number + " * 1000 * 60 * 60 * 24";
|
|
467
|
+
break;
|
|
468
|
+
case "week":
|
|
469
|
+
case "weeks":
|
|
470
|
+
milliseconds += " + " + number + " * 1000 * 60 * 60 * 24 * 7";
|
|
471
|
+
break;
|
|
472
|
+
case "month":
|
|
473
|
+
case "months":
|
|
474
|
+
milliseconds += " + " + number + " * 1000 * 60 * 60 * 24 * (now.getFullYear(), now.getMonth() + 1, 0).getDate())";
|
|
475
|
+
break;
|
|
476
|
+
case "year":
|
|
477
|
+
case "years":
|
|
478
|
+
milliseconds += " + " + number + " * 1000 * 60 * 60 * 24 * (((now.getFullYear() % 4 === 0 && now.getFullYear() % 100 !== 0) || (now.getFullYear() % 400 === 0)) ? 366 : 365)";
|
|
479
|
+
break;
|
|
480
|
+
}
|
|
481
|
+
text += " = new Date(" + milliseconds + ")";
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
else {
|
|
405
485
|
text += " = new Date(" + columnDefault.replace(" ", "T") + ")";
|
|
486
|
+
}
|
|
406
487
|
}
|
|
407
488
|
else if (column.jsType.includes("number") || column.jsType.includes("boolean"))
|
|
408
489
|
text += " = " + columnDefault;
|
|
490
|
+
else if (column.pgType === "uuid") {
|
|
491
|
+
if (column.pgType === "uuid") {
|
|
492
|
+
if (columnDefault.toLowerCase() === "gen_random_uuid()" || columnDefault.toLowerCase() === "uuidv4()") {
|
|
493
|
+
text += "import {v4 as uuidv4} from \"uuid\";\n";
|
|
494
|
+
text += " = uuidv4()";
|
|
495
|
+
}
|
|
496
|
+
else if (columnDefault.toLowerCase() === "uuidv7()") {
|
|
497
|
+
text += "import {v7 as uuidv7} from \"uuid\";\n";
|
|
498
|
+
text += " = uuidv7()";
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
}
|
|
409
502
|
else if (type) {
|
|
410
503
|
if (jsTypes.get(type) === "string")
|
|
411
504
|
text += " = \"" + columnDefault + "\"";
|
package/src/pgAdmin.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Column, PigeonError, Table
|
|
1
|
+
import { Column, PigeonError, Table } from "./index.js";
|
|
2
2
|
import { getJSType, getPGType, getTypesByDataType } from "./utils.js";
|
|
3
3
|
function objectToArray(json) {
|
|
4
4
|
let arrayJSON = "";
|
|
@@ -50,7 +50,7 @@ export function tableProcessing(tables) {
|
|
|
50
50
|
for (const table of tables) {
|
|
51
51
|
const data = table.otherInfo.data;
|
|
52
52
|
const columns = [];
|
|
53
|
-
let
|
|
53
|
+
let ordinalPosition = 1;
|
|
54
54
|
for (const column of data.columns) {
|
|
55
55
|
const types = getTypesByDataType(column.cltype);
|
|
56
56
|
let isNullable = true;
|
|
@@ -76,7 +76,7 @@ export function tableProcessing(tables) {
|
|
|
76
76
|
identityGeneration = "BY DEFAULT";
|
|
77
77
|
}
|
|
78
78
|
let isPrimary = false;
|
|
79
|
-
if (column.name === data.primary_key[0]
|
|
79
|
+
if (column.name === data.primary_key[0]?.columns[0].column)
|
|
80
80
|
isPrimary = true;
|
|
81
81
|
let isForeign = false;
|
|
82
82
|
let foreignSchema = undefined;
|
|
@@ -99,8 +99,8 @@ export function tableProcessing(tables) {
|
|
|
99
99
|
for (const uniqueColumn of uniqueConstraint.columns)
|
|
100
100
|
if (uniqueColumn.column === column.name)
|
|
101
101
|
isUnique = true;
|
|
102
|
-
columns.push(new Column(column.name,
|
|
103
|
-
|
|
102
|
+
columns.push(new Column(column.name, ordinalPosition, columnDefault, isNullable, jsType, pgType, identity, identityGeneration, isPrimary, isUnique, isForeign, foreignSchema, foreignTable, foreignColumn));
|
|
103
|
+
ordinalPosition++;
|
|
104
104
|
}
|
|
105
105
|
pigeonTables.push(new Table(data.name, data.schema, columns));
|
|
106
106
|
}
|