@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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@andymic/pigeon",
3
- "version": "2.1.0",
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": "^13.2.0",
35
- "pg": "^8.16.0",
34
+ "meow": "^14.0.0",
35
+ "pg": "^8.18.0",
36
36
  "prompt-sync": "^4.2.0"
37
37
  },
38
- "gitHead": "029bee420b59d84dfb269ec7eb3190aee486de10"
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
- ts += createClass(table.name, table.columns);
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
- text += "export class " + singularize(nameBeautifier(tableName)).replaceAll(" ", "") + " {\n";
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, } from "./index.js";
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 ordinalPossition = 1;
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].columns[0].column)
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, ordinalPossition, columnDefault, isNullable, jsType, pgType, identity, identityGeneration, isPrimary, isUnique, isForeign, foreignSchema, foreignTable, foreignColumn));
103
- ordinalPossition++;
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
  }