durcno 1.0.0-alpha.4 → 1.0.0-alpha.5

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 (39) hide show
  1. package/README.md +1 -1
  2. package/dist/bin.cjs +1 -1
  3. package/dist/src/columns/common.d.mts +1 -0
  4. package/dist/src/columns/postgis/geography/linestring.d.mts +1 -0
  5. package/dist/src/columns/postgis/geography/multilinestring.d.mts +1 -0
  6. package/dist/src/columns/postgis/geography/multipoint.d.mts +1 -0
  7. package/dist/src/columns/postgis/geography/multipolygon.d.mts +1 -0
  8. package/dist/src/columns/postgis/geography/point.d.mts +1 -0
  9. package/dist/src/columns/postgis/geography/polygon.d.mts +1 -0
  10. package/dist/src/constraints/check.d.mts +1 -0
  11. package/dist/src/constraints/primary-key.d.mts +1 -0
  12. package/dist/src/constraints/unique.d.mts +1 -0
  13. package/dist/src/db.d.mts +16 -16
  14. package/dist/src/db.mjs +8 -8
  15. package/dist/src/filters/array.mjs +10 -23
  16. package/dist/src/filters/index.d.mts +1 -0
  17. package/dist/src/index.d.mts +2 -10
  18. package/dist/src/indexes.d.mts +1 -0
  19. package/dist/src/logger.d.mts +8 -4
  20. package/dist/src/logger.mjs +8 -4
  21. package/dist/src/query-builders/aggregates.d.mts +3 -2
  22. package/dist/src/query-builders/aggregates.mjs +5 -2
  23. package/dist/src/query-builders/count.d.mts +2 -2
  24. package/dist/src/query-builders/count.mjs +5 -2
  25. package/dist/src/query-builders/delete.d.mts +1 -0
  26. package/dist/src/query-builders/distinct.d.mts +3 -2
  27. package/dist/src/query-builders/distinct.mjs +5 -2
  28. package/dist/src/query-builders/exists.d.mts +2 -2
  29. package/dist/src/query-builders/exists.mjs +5 -2
  30. package/dist/src/query-builders/first.d.mts +2 -2
  31. package/dist/src/query-builders/first.mjs +5 -2
  32. package/dist/src/query-builders/insert.d.mts +1 -0
  33. package/dist/src/query-builders/insert.mjs +17 -27
  34. package/dist/src/query-builders/orderby-clause.d.mts +1 -0
  35. package/dist/src/query-builders/select.d.mts +1 -0
  36. package/dist/src/query-builders/update.d.mts +1 -0
  37. package/dist/src/table.d.mts +1 -1
  38. package/dist/src/types.d.mts +8 -1
  39. package/package.json +1 -1
package/README.md CHANGED
@@ -40,7 +40,7 @@ npm exec durcno init
40
40
 
41
41
  Get started with Durcno by following our comprehensive documentation.
42
42
 
43
- **[Read the Documentation](https://durcno.dev/docs)**
43
+ **[Read the Documentation](https://durcno.dev/docs/latest/intro)**
44
44
 
45
45
  > [!WARNING]
46
46
  > Durcno is currently in the alpha stage.
package/dist/bin.cjs CHANGED
@@ -13508,7 +13508,7 @@ async function status(options) {
13508
13508
  }
13509
13509
 
13510
13510
  // src/cli/index.ts
13511
- program.version("1.0.0-alpha.3");
13511
+ program.version("1.0.0-alpha.4");
13512
13512
  var Options = {
13513
13513
  config: ["--config <path>", "Path to the config file"]
13514
13514
  };
@@ -1,3 +1,4 @@
1
+ import { Key } from "../types.mjs";
1
2
  import { Sql } from "../sql.mjs";
2
3
  import { entityType } from "../symbols.mjs";
3
4
  import { Arg } from "../query-builders/pre.mjs";
@@ -1,3 +1,4 @@
1
+ import { SelfOrReadonly } from "../../../types.mjs";
1
2
  import { Sql } from "../../../sql.mjs";
2
3
  import { Column, ColumnConfig } from "../../common.mjs";
3
4
  import * as z from "zod";
@@ -1,3 +1,4 @@
1
+ import { SelfOrReadonly } from "../../../types.mjs";
1
2
  import { Sql } from "../../../sql.mjs";
2
3
  import { Column, ColumnConfig } from "../../common.mjs";
3
4
  import * as z from "zod";
@@ -1,3 +1,4 @@
1
+ import { SelfOrReadonly } from "../../../types.mjs";
1
2
  import { Sql } from "../../../sql.mjs";
2
3
  import { Column, ColumnConfig } from "../../common.mjs";
3
4
  import * as z from "zod";
@@ -1,3 +1,4 @@
1
+ import { SelfOrReadonly } from "../../../types.mjs";
1
2
  import { Sql } from "../../../sql.mjs";
2
3
  import { Column, ColumnConfig } from "../../common.mjs";
3
4
  import * as z from "zod";
@@ -1,3 +1,4 @@
1
+ import { SelfOrReadonly } from "../../../types.mjs";
1
2
  import { Sql } from "../../../sql.mjs";
2
3
  import { Column, ColumnConfig } from "../../common.mjs";
3
4
  import * as z from "zod";
@@ -1,3 +1,4 @@
1
+ import { SelfOrReadonly } from "../../../types.mjs";
1
2
  import { Sql } from "../../../sql.mjs";
2
3
  import { Column, ColumnConfig } from "../../common.mjs";
3
4
  import * as z from "zod";
@@ -1,3 +1,4 @@
1
+ import { Key } from "../types.mjs";
1
2
  import { AnyColumn, TableColumn } from "../table.mjs";
2
3
 
3
4
  //#region src/constraints/check.d.ts
@@ -1,3 +1,4 @@
1
+ import { Key } from "../types.mjs";
1
2
  import { AnyColumn, AnyTableWithColumns, TableColumn } from "../table.mjs";
2
3
 
3
4
  //#region src/constraints/primary-key.d.ts
@@ -1,3 +1,4 @@
1
+ import { Key } from "../types.mjs";
1
2
  import { AnyColumn, AnyTableWithColumns, TableColumn } from "../table.mjs";
2
3
 
3
4
  //#region src/constraints/unique.d.ts
package/dist/src/db.d.mts CHANGED
@@ -60,24 +60,24 @@ declare class Base<TTName extends string, TTables extends Record<TTName, TableWi
60
60
  * @param where Optional where clause to filter rows
61
61
  * @returns Promise<number> - the count of matching rows
62
62
  */
63
- $count<TTable extends TTables[keyof TTables]>(table: TTable): CountQuery<TTable>;
64
- $count<TTable extends TTables[keyof TTables], TWhere extends BuildFilterExpression<TColsToLeftRight<TTable["_"]["columns"]>>>(table: TTable, where: TWhere): CountQuery<TTable>;
63
+ $count<TTable extends TTables[keyof TTables]>(table: TTable): CountQuery<TTable, TPrepare>;
64
+ $count<TTable extends TTables[keyof TTables], TWhere extends BuildFilterExpression<TColsToLeftRight<TTable["_"]["columns"]>, TPrepare>>(table: TTable, where: TWhere): CountQuery<TTable, TPrepare>;
65
65
  /**
66
66
  * Check if any rows exist in a table, optionally filtered by a where clause.
67
67
  * @param table The table to check
68
68
  * @param where Optional where clause to filter rows
69
69
  * @returns Promise<boolean> - true if at least one row exists
70
70
  */
71
- $exists<TTable extends TTables[keyof TTables]>(table: TTable): ExistsQuery<TTable>;
72
- $exists<TTable extends TTables[keyof TTables], TWhere extends BuildFilterExpression<TColsToLeftRight<TTable["_"]["columns"]>>>(table: TTable, where: TWhere): ExistsQuery<TTable>;
71
+ $exists<TTable extends TTables[keyof TTables]>(table: TTable): ExistsQuery<TTable, TPrepare>;
72
+ $exists<TTable extends TTables[keyof TTables], TWhere extends BuildFilterExpression<TColsToLeftRight<TTable["_"]["columns"]>, TPrepare>>(table: TTable, where: TWhere): ExistsQuery<TTable, TPrepare>;
73
73
  /**
74
74
  * Get the first row from a table, optionally filtered by a where clause.
75
75
  * @param table The table to query
76
76
  * @param where Optional where clause to filter rows
77
77
  * @returns Promise<T | null> - the first row or null if no rows match
78
78
  */
79
- $first<TTable extends TTables[keyof TTables]>(table: TTable): FirstQuery<TTable>;
80
- $first<TTable extends TTables[keyof TTables], TWhere extends BuildFilterExpression<TColsToLeftRight<TTable["_"]["columns"]>>>(table: TTable, where: TWhere): FirstQuery<TTable>;
79
+ $first<TTable extends TTables[keyof TTables]>(table: TTable): FirstQuery<TTable, TPrepare>;
80
+ $first<TTable extends TTables[keyof TTables], TWhere extends BuildFilterExpression<TColsToLeftRight<TTable["_"]["columns"]>, TPrepare>>(table: TTable, where: TWhere): FirstQuery<TTable, TPrepare>;
81
81
  /**
82
82
  * Calculate the sum of a numeric column.
83
83
  * @param table The table to query
@@ -85,8 +85,8 @@ declare class Base<TTName extends string, TTables extends Record<TTName, TableWi
85
85
  * @param where Optional where clause to filter rows
86
86
  * @returns Promise<number | null> - the sum or null if no rows match
87
87
  */
88
- $sum<TTable extends TTables[keyof TTables], TColumn extends TTable["_"]["columns"][keyof TTable["_"]["columns"]]>(table: TTable, column: TColumn): AggregateQuery<TTable, TColumn, number | null>;
89
- $sum<TTable extends TTables[keyof TTables], TColumn extends TTable["_"]["columns"][keyof TTable["_"]["columns"]], TWhere extends BuildFilterExpression<TColsToLeftRight<TTable["_"]["columns"]>>>(table: TTable, column: TColumn, where: TWhere): AggregateQuery<TTable, TColumn, number | null>;
88
+ $sum<TTable extends TTables[keyof TTables], TColumn extends TTable["_"]["columns"][keyof TTable["_"]["columns"]]>(table: TTable, column: TColumn): AggregateQuery<TTable, TColumn, number | null, TPrepare>;
89
+ $sum<TTable extends TTables[keyof TTables], TColumn extends TTable["_"]["columns"][keyof TTable["_"]["columns"]], TWhere extends BuildFilterExpression<TColsToLeftRight<TTable["_"]["columns"]>, TPrepare>>(table: TTable, column: TColumn, where: TWhere): AggregateQuery<TTable, TColumn, number | null, TPrepare>;
90
90
  /**
91
91
  * Calculate the average of a numeric column.
92
92
  * @param table The table to query
@@ -94,8 +94,8 @@ declare class Base<TTName extends string, TTables extends Record<TTName, TableWi
94
94
  * @param where Optional where clause to filter rows
95
95
  * @returns Promise<number | null> - the average or null if no rows match
96
96
  */
97
- $avg<TTable extends TTables[keyof TTables], TColumn extends TTable["_"]["columns"][keyof TTable["_"]["columns"]]>(table: TTable, column: TColumn): AggregateQuery<TTable, TColumn, number | null>;
98
- $avg<TTable extends TTables[keyof TTables], TColumn extends TTable["_"]["columns"][keyof TTable["_"]["columns"]], TWhere extends BuildFilterExpression<TColsToLeftRight<TTable["_"]["columns"]>>>(table: TTable, column: TColumn, where: TWhere): AggregateQuery<TTable, TColumn, number | null>;
97
+ $avg<TTable extends TTables[keyof TTables], TColumn extends TTable["_"]["columns"][keyof TTable["_"]["columns"]]>(table: TTable, column: TColumn): AggregateQuery<TTable, TColumn, number | null, TPrepare>;
98
+ $avg<TTable extends TTables[keyof TTables], TColumn extends TTable["_"]["columns"][keyof TTable["_"]["columns"]], TWhere extends BuildFilterExpression<TColsToLeftRight<TTable["_"]["columns"]>, TPrepare>>(table: TTable, column: TColumn, where: TWhere): AggregateQuery<TTable, TColumn, number | null, TPrepare>;
99
99
  /**
100
100
  * Find the minimum value of a column.
101
101
  * @param table The table to query
@@ -103,8 +103,8 @@ declare class Base<TTName extends string, TTables extends Record<TTName, TableWi
103
103
  * @param where Optional where clause to filter rows
104
104
  * @returns Promise<number | null> - the minimum value or null if no rows match
105
105
  */
106
- $min<TTable extends TTables[keyof TTables], TColumn extends TTable["_"]["columns"][keyof TTable["_"]["columns"]]>(table: TTable, column: TColumn): AggregateQuery<TTable, TColumn, number | null>;
107
- $min<TTable extends TTables[keyof TTables], TColumn extends TTable["_"]["columns"][keyof TTable["_"]["columns"]], TWhere extends BuildFilterExpression<TColsToLeftRight<TTable["_"]["columns"]>>>(table: TTable, column: TColumn, where: TWhere): AggregateQuery<TTable, TColumn, number | null>;
106
+ $min<TTable extends TTables[keyof TTables], TColumn extends TTable["_"]["columns"][keyof TTable["_"]["columns"]]>(table: TTable, column: TColumn): AggregateQuery<TTable, TColumn, number | null, TPrepare>;
107
+ $min<TTable extends TTables[keyof TTables], TColumn extends TTable["_"]["columns"][keyof TTable["_"]["columns"]], TWhere extends BuildFilterExpression<TColsToLeftRight<TTable["_"]["columns"]>, TPrepare>>(table: TTable, column: TColumn, where: TWhere): AggregateQuery<TTable, TColumn, number | null, TPrepare>;
108
108
  /**
109
109
  * Find the maximum value of a column.
110
110
  * @param table The table to query
@@ -112,8 +112,8 @@ declare class Base<TTName extends string, TTables extends Record<TTName, TableWi
112
112
  * @param where Optional where clause to filter rows
113
113
  * @returns Promise<number | null> - the maximum value or null if no rows match
114
114
  */
115
- $max<TTable extends TTables[keyof TTables], TColumn extends TTable["_"]["columns"][keyof TTable["_"]["columns"]]>(table: TTable, column: TColumn): AggregateQuery<TTable, TColumn, number | null>;
116
- $max<TTable extends TTables[keyof TTables], TColumn extends TTable["_"]["columns"][keyof TTable["_"]["columns"]], TWhere extends BuildFilterExpression<TColsToLeftRight<TTable["_"]["columns"]>>>(table: TTable, column: TColumn, where: TWhere): AggregateQuery<TTable, TColumn, number | null>;
115
+ $max<TTable extends TTables[keyof TTables], TColumn extends TTable["_"]["columns"][keyof TTable["_"]["columns"]]>(table: TTable, column: TColumn): AggregateQuery<TTable, TColumn, number | null, TPrepare>;
116
+ $max<TTable extends TTables[keyof TTables], TColumn extends TTable["_"]["columns"][keyof TTable["_"]["columns"]], TWhere extends BuildFilterExpression<TColsToLeftRight<TTable["_"]["columns"]>, TPrepare>>(table: TTable, column: TColumn, where: TWhere): AggregateQuery<TTable, TColumn, number | null, TPrepare>;
117
117
  /**
118
118
  * Get distinct values of a column.
119
119
  * @param table The table to query
@@ -121,8 +121,8 @@ declare class Base<TTName extends string, TTables extends Record<TTName, TableWi
121
121
  * @param where Optional where clause to filter rows
122
122
  * @returns Promise<T[]> - array of distinct values
123
123
  */
124
- $distinct<TTable extends TTables[keyof TTables], TColumn extends TTable["_"]["columns"][keyof TTable["_"]["columns"]]>(table: TTable, column: TColumn): DistinctQuery<TTable, TColumn, TColumn["ValTypeSelect"][]>;
125
- $distinct<TTable extends TTables[keyof TTables], TColumn extends TTable["_"]["columns"][keyof TTable["_"]["columns"]], TWhere extends BuildFilterExpression<TColsToLeftRight<TTable["_"]["columns"]>>>(table: TTable, column: TColumn, where: TWhere): DistinctQuery<TTable, TColumn, TColumn["ValTypeSelect"][]>;
124
+ $distinct<TTable extends TTables[keyof TTables], TColumn extends TTable["_"]["columns"][keyof TTable["_"]["columns"]]>(table: TTable, column: TColumn): DistinctQuery<TTable, TColumn, TColumn["ValTypeSelect"][], TPrepare>;
125
+ $distinct<TTable extends TTables[keyof TTables], TColumn extends TTable["_"]["columns"][keyof TTable["_"]["columns"]], TWhere extends BuildFilterExpression<TColsToLeftRight<TTable["_"]["columns"]>, TPrepare>>(table: TTable, column: TColumn, where: TWhere): DistinctQuery<TTable, TColumn, TColumn["ValTypeSelect"][], TPrepare>;
126
126
  /**
127
127
  * Insert a row and return the inserted row with all columns.
128
128
  * @param table The table to insert into
package/dist/src/db.mjs CHANGED
@@ -67,28 +67,28 @@ var Base = class {
67
67
  return new DeleteQuery(table, void 0, void 0, this.#getExecutor(), this.$.pre);
68
68
  }
69
69
  $count(table, where) {
70
- return new CountQuery(table, where, this.#getExecutor());
70
+ return new CountQuery(table, where, this.#getExecutor(), this.$.pre);
71
71
  }
72
72
  $exists(table, where) {
73
- return new ExistsQuery(table, where, this.#getExecutor());
73
+ return new ExistsQuery(table, where, this.#getExecutor(), this.$.pre);
74
74
  }
75
75
  $first(table, where) {
76
- return new FirstQuery(table, where, this.#getExecutor());
76
+ return new FirstQuery(table, where, this.#getExecutor(), this.$.pre);
77
77
  }
78
78
  $sum(table, column, where) {
79
- return new AggregateQuery(table, column, "SUM", where, this.#getExecutor());
79
+ return new AggregateQuery(table, column, "SUM", where, this.#getExecutor(), this.$.pre);
80
80
  }
81
81
  $avg(table, column, where) {
82
- return new AggregateQuery(table, column, "AVG", where, this.#getExecutor());
82
+ return new AggregateQuery(table, column, "AVG", where, this.#getExecutor(), this.$.pre);
83
83
  }
84
84
  $min(table, column, where) {
85
- return new AggregateQuery(table, column, "MIN", where, this.#getExecutor());
85
+ return new AggregateQuery(table, column, "MIN", where, this.#getExecutor(), this.$.pre);
86
86
  }
87
87
  $max(table, column, where) {
88
- return new AggregateQuery(table, column, "MAX", where, this.#getExecutor());
88
+ return new AggregateQuery(table, column, "MAX", where, this.#getExecutor(), this.$.pre);
89
89
  }
90
90
  $distinct(table, column, where) {
91
- return new DistinctQuery(table, column, where, this.#getExecutor());
91
+ return new DistinctQuery(table, column, where, this.#getExecutor(), this.$.pre);
92
92
  }
93
93
  /**
94
94
  * Insert a row and return the inserted row with all columns.
@@ -1,18 +1,5 @@
1
1
  import { Filter } from "./custom.mjs";
2
2
  //#region src/filters/array.ts
3
- /** Converts an array of values to a PostgreSQL array literal. */
4
- function arrayToSql(values) {
5
- if (values.length === 0) return "'{}'";
6
- return `ARRAY[${values.map((v) => {
7
- if (typeof v === "string") return `'${v.replace(/'/g, "''")}'`;
8
- return String(v);
9
- }).join(", ")}]`;
10
- }
11
- /** Converts a single value to a SQL literal. */
12
- function valueToSql(value) {
13
- if (typeof value === "string") return `'${value.replace(/'/g, "''")}'`;
14
- return String(value);
15
- }
16
3
  /**
17
4
  * ArrayContains filter: col @> ARRAY[values]
18
5
  * Returns true if the array column contains all the specified values.
@@ -26,10 +13,10 @@ var ArrayContainsFilter = class extends Filter {
26
13
  this.right = values;
27
14
  }
28
15
  toSQL() {
29
- return `${this.left.fullName} @> ${arrayToSql(this.right)}`;
16
+ return `${this.left.fullName} @> ${this.left.toSQL(this.right)}::${this.left.sqlType}`;
30
17
  }
31
18
  toQuery(query) {
32
- query.sql += `${this.left.fullName} @> ${arrayToSql(this.right)}`;
19
+ query.sql += `${this.left.fullName} @> ${this.left.toSQL(this.right)}::${this.left.sqlType}`;
33
20
  }
34
21
  };
35
22
  /**
@@ -55,10 +42,10 @@ var ArrayContainedByFilter = class extends Filter {
55
42
  this.right = values;
56
43
  }
57
44
  toSQL() {
58
- return `${this.left.fullName} <@ ${arrayToSql(this.right)}`;
45
+ return `${this.left.fullName} <@ ${this.left.toSQL(this.right)}::${this.left.sqlType}`;
59
46
  }
60
47
  toQuery(query) {
61
- query.sql += `${this.left.fullName} <@ ${arrayToSql(this.right)}`;
48
+ query.sql += `${this.left.fullName} <@ ${this.left.toSQL(this.right)}::${this.left.sqlType}`;
62
49
  }
63
50
  };
64
51
  /**
@@ -81,10 +68,10 @@ var ArrayOverlapsFilter = class extends Filter {
81
68
  this.right = values;
82
69
  }
83
70
  toSQL() {
84
- return `${this.left.fullName} && ${arrayToSql(this.right)}`;
71
+ return `${this.left.fullName} && ${this.left.toSQL(this.right)}::${this.left.sqlType}`;
85
72
  }
86
73
  toQuery(query) {
87
- query.sql += `${this.left.fullName} && ${arrayToSql(this.right)}`;
74
+ query.sql += `${this.left.fullName} && ${this.left.toSQL(this.right)}::${this.left.sqlType}`;
88
75
  }
89
76
  };
90
77
  /**
@@ -107,10 +94,10 @@ var ArrayHasFilter = class extends Filter {
107
94
  this.right = value;
108
95
  }
109
96
  toSQL() {
110
- return `${valueToSql(this.right)} = ANY(${this.left.fullName})`;
97
+ return `${this.left.toSQLScalar(this.right)} = ANY(${this.left.fullName})`;
111
98
  }
112
99
  toQuery(query) {
113
- query.sql += `${valueToSql(this.right)} = ANY(${this.left.fullName})`;
100
+ query.sql += `${this.left.toSQLScalar(this.right)} = ANY(${this.left.fullName})`;
114
101
  }
115
102
  };
116
103
  /**
@@ -133,10 +120,10 @@ var ArrayAllFilter = class extends Filter {
133
120
  this.right = value;
134
121
  }
135
122
  toSQL() {
136
- return `${valueToSql(this.right)} = ALL(${this.left.fullName})`;
123
+ return `${this.left.toSQLScalar(this.right)} = ALL(${this.left.fullName})`;
137
124
  }
138
125
  toQuery(query) {
139
- query.sql += `${valueToSql(this.right)} = ALL(${this.left.fullName})`;
126
+ query.sql += `${this.left.toSQLScalar(this.right)} = ALL(${this.left.fullName})`;
140
127
  }
141
128
  };
142
129
  /**
@@ -1,4 +1,5 @@
1
1
  import { Query } from "../query-builders/query.mjs";
2
+ import { Key } from "../types.mjs";
2
3
  import { SelectQuery } from "../query-builders/select.mjs";
3
4
  import { Sql } from "../sql.mjs";
4
5
  import { Filter } from "./custom.mjs";
@@ -1,5 +1,6 @@
1
1
  import { DurcnoLogger } from "./logger.mjs";
2
2
  import { Query } from "./query-builders/query.mjs";
3
+ import { Is, Key, Prettify, SelfOrArray, SelfOrReadonly, UnionToIntersection, Valueof } from "./types.mjs";
3
4
  import { asc, desc } from "./query-builders/orderby-clause.mjs";
4
5
  import { Sql, sql } from "./sql.mjs";
5
6
  import { Filter } from "./filters/custom.mjs";
@@ -91,14 +92,5 @@ type Config<T extends Connector = Connector> = {
91
92
  */
92
93
  connector: T;
93
94
  };
94
- declare global {
95
- type Key = string | number | symbol;
96
- type Valueof<T> = T extends any ? T[keyof T] : never;
97
- type SelfOrArray<T> = T | T[];
98
- type SelfOrReadonly<T> = T | Readonly<T>;
99
- type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends ((k: infer I) => void) ? I : never;
100
- type Is<T, U> = T extends U ? true : false;
101
- type Prettify<T> = { [K in keyof T]: T[K] } & {};
102
- }
103
95
  //#endregion
104
- export { $, type $Client, type AnyColumn, type AnyTableColumn, Arg, Column, type ColumnConfig, Config, type ConnectorOptions, type DurcnoLogger, Filter, Migrations, PrimaryKeyConstraint, Query, Sql, type TableColumn, UniqueConstraint, type UuidVersion, and, arrayAll, arrayContainedBy, arrayContains, arrayHas, arrayOverlaps, asc, bigint, bigserial, boolean, bytea, char, cidr, database, date, defineConfig, desc, enumed, enumtype, eq, fk, geography, gt, gte, index, inet, integer, isIn, isNotNull, isNull, json, jsonb, lt, lte, macaddr, many, ne, notNull, now, numeric, one, or, pk, prequery, primaryKey, primaryKeyConstraint, relations, sequence, serial, smallint, smallserial, sql, table, text, time, timestamp, unique, uniqueConstraint, uniqueIndex, uuid, uuidv4, uuidv7, varchar };
96
+ export { $, type $Client, type AnyColumn, type AnyTableColumn, Arg, Column, type ColumnConfig, Config, type ConnectorOptions, type DurcnoLogger, Filter, type Is, type Key, Migrations, type Prettify, PrimaryKeyConstraint, Query, type SelfOrArray, type SelfOrReadonly, Sql, type TableColumn, type UnionToIntersection, UniqueConstraint, type UuidVersion, type Valueof, and, arrayAll, arrayContainedBy, arrayContains, arrayHas, arrayOverlaps, asc, bigint, bigserial, boolean, bytea, char, cidr, database, date, defineConfig, desc, enumed, enumtype, eq, fk, geography, gt, gte, index, inet, integer, isIn, isNotNull, isNull, json, jsonb, lt, lte, macaddr, many, ne, notNull, now, numeric, one, or, pk, prequery, primaryKey, primaryKeyConstraint, relations, sequence, serial, smallint, smallserial, sql, table, text, time, timestamp, unique, uniqueConstraint, uniqueIndex, uuid, uuidv4, uuidv7, varchar };
@@ -1,3 +1,4 @@
1
+ import { Key } from "./types.mjs";
1
2
  import { AnyColumn, StdTable, TableColumn } from "./table.mjs";
2
3
 
3
4
  //#region src/indexes.d.ts
@@ -15,7 +15,7 @@ interface DurcnoLogger {
15
15
  *
16
16
  * @example
17
17
  * ```ts
18
- * import { createDurcnoLogger } from "durcno/logger";
18
+ * import { createQueryLogger } from "durcno/logger";
19
19
  * import { defineConfig } from "durcno";
20
20
  * import { pg } from "durcno/connectors/pg";
21
21
  *
@@ -23,10 +23,14 @@ interface DurcnoLogger {
23
23
  * schema: "db/schema.ts",
24
24
  * out: "migrations",
25
25
  * dbCredentials: { url: process.env.DATABASE_URL! },
26
- * logger: createDurcnoLogger(),
26
+ * logger: createQueryLogger(),
27
27
  * });
28
28
  * ```
29
29
  */
30
- declare function createDurcnoLogger(): DurcnoLogger;
30
+ declare function createQueryLogger(): DurcnoLogger;
31
+ /**
32
+ * @deprecated Use `createQueryLogger` instead.
33
+ */
34
+ declare const createDurcnoLogger: typeof createQueryLogger;
31
35
  //#endregion
32
- export { DurcnoLogger, createDurcnoLogger };
36
+ export { DurcnoLogger, createDurcnoLogger, createQueryLogger };
@@ -35,7 +35,7 @@ const durcnoFormat = printf(({ level, message, label, timestamp, sql, arguments:
35
35
  *
36
36
  * @example
37
37
  * ```ts
38
- * import { createDurcnoLogger } from "durcno/logger";
38
+ * import { createQueryLogger } from "durcno/logger";
39
39
  * import { defineConfig } from "durcno";
40
40
  * import { pg } from "durcno/connectors/pg";
41
41
  *
@@ -43,15 +43,19 @@ const durcnoFormat = printf(({ level, message, label, timestamp, sql, arguments:
43
43
  * schema: "db/schema.ts",
44
44
  * out: "migrations",
45
45
  * dbCredentials: { url: process.env.DATABASE_URL! },
46
- * logger: createDurcnoLogger(),
46
+ * logger: createQueryLogger(),
47
47
  * });
48
48
  * ```
49
49
  */
50
- function createDurcnoLogger() {
50
+ function createQueryLogger() {
51
51
  return createLogger({
52
52
  format: combine(label({ label: "durcno" }), timestamp(), durcnoFormat),
53
53
  transports: [new transports.Console()]
54
54
  });
55
55
  }
56
+ /**
57
+ * @deprecated Use `createQueryLogger` instead.
58
+ */
59
+ const createDurcnoLogger = createQueryLogger;
56
60
  //#endregion
57
- export { createDurcnoLogger };
61
+ export { createDurcnoLogger, createQueryLogger };
@@ -1,4 +1,5 @@
1
1
  import { Query } from "./query.mjs";
2
+ import { Key } from "../types.mjs";
2
3
  import { QueryPromise } from "./query-promise.mjs";
3
4
  import { BuildFilterExpression } from "../filters/index.mjs";
4
5
  import { AnyColumn, TColsToLeftRight, TableColumn, TableWithColumns } from "../table.mjs";
@@ -6,9 +7,9 @@ import { QueryExecutor } from "../connectors/common.mjs";
6
7
 
7
8
  //#region src/query-builders/aggregates.d.ts
8
9
  type AggregateFunction = "SUM" | "AVG" | "MIN" | "MAX";
9
- declare class AggregateQuery<TTableWC extends TableWithColumns<string, string, Record<string, AnyColumn>>, TColumn extends TableColumn<string, string, Key, AnyColumn>, TReturn extends number | null> extends QueryPromise<TReturn> {
10
+ declare class AggregateQuery<TTableWC extends TableWithColumns<string, string, Record<string, AnyColumn>>, TColumn extends TableColumn<string, string, Key, AnyColumn>, TReturn extends number | null, TPrepare extends boolean = false> extends QueryPromise<TReturn> {
10
11
  #private;
11
- constructor(table: TTableWC, column: TColumn, fn: AggregateFunction, where: BuildFilterExpression<TColsToLeftRight<TTableWC["_"]["columns"]>> | undefined, executor: QueryExecutor);
12
+ constructor(table: TTableWC, column: TColumn, fn: AggregateFunction, where: BuildFilterExpression<TColsToLeftRight<TTableWC["_"]["columns"]>, TPrepare> | undefined, executor: QueryExecutor, prepare?: TPrepare);
12
13
  toQuery(): Query<TReturn>;
13
14
  execute(): Promise<TReturn>;
14
15
  handleRows(rows: {
@@ -7,13 +7,15 @@ var AggregateQuery = class extends QueryPromise {
7
7
  #$fn;
8
8
  #$where;
9
9
  #$executor;
10
- constructor(table, column, fn, where, executor) {
10
+ #$prepare;
11
+ constructor(table, column, fn, where, executor, prepare = false) {
11
12
  super();
12
13
  this.#$table = table;
13
14
  this.#$column = column;
14
15
  this.#$fn = fn;
15
16
  this.#$where = where;
16
17
  this.#$executor = executor;
18
+ this.#$prepare = prepare;
17
19
  }
18
20
  toQuery() {
19
21
  const columnName = this.#$column.fullName;
@@ -21,7 +23,8 @@ var AggregateQuery = class extends QueryPromise {
21
23
  query.sql += this.#$table._.fullName;
22
24
  if (this.#$where) {
23
25
  query.sql += " WHERE ";
24
- query.sql += this.#$where.toSQL();
26
+ if (this.#$prepare) this.#$where.toQuery(query);
27
+ else query.sql += this.#$where.toSQL();
25
28
  }
26
29
  return query;
27
30
  }
@@ -5,9 +5,9 @@ import { AnyColumn, TColsToLeftRight, TableWithColumns } from "../table.mjs";
5
5
  import { QueryExecutor } from "../connectors/common.mjs";
6
6
 
7
7
  //#region src/query-builders/count.d.ts
8
- declare class CountQuery<TTableWC extends TableWithColumns<string, string, Record<string, AnyColumn>>> extends QueryPromise<number> {
8
+ declare class CountQuery<TTableWC extends TableWithColumns<string, string, Record<string, AnyColumn>>, TPrepare extends boolean = false> extends QueryPromise<number> {
9
9
  #private;
10
- constructor(table: TTableWC, where: BuildFilterExpression<TColsToLeftRight<TTableWC["_"]["columns"]>> | undefined, executor: QueryExecutor);
10
+ constructor(table: TTableWC, where: BuildFilterExpression<TColsToLeftRight<TTableWC["_"]["columns"]>, TPrepare> | undefined, executor: QueryExecutor, prepare?: TPrepare);
11
11
  toQuery(): Query<number>;
12
12
  execute(): Promise<number>;
13
13
  handleRows(rows: {
@@ -5,18 +5,21 @@ var CountQuery = class extends QueryPromise {
5
5
  #$table;
6
6
  #$where;
7
7
  #$executor;
8
- constructor(table, where, executor) {
8
+ #$prepare;
9
+ constructor(table, where, executor, prepare = false) {
9
10
  super();
10
11
  this.#$table = table;
11
12
  this.#$where = where;
12
13
  this.#$executor = executor;
14
+ this.#$prepare = prepare;
13
15
  }
14
16
  toQuery() {
15
17
  const query = new Query("SELECT count(*) FROM ", this.handleRows.bind(this));
16
18
  query.sql += this.#$table._.fullName;
17
19
  if (this.#$where) {
18
20
  query.sql += " WHERE ";
19
- query.sql += this.#$where.toSQL();
21
+ if (this.#$prepare) this.#$where.toQuery(query);
22
+ else query.sql += this.#$where.toSQL();
20
23
  }
21
24
  return query;
22
25
  }
@@ -1,4 +1,5 @@
1
1
  import { Query } from "./query.mjs";
2
+ import { Key } from "../types.mjs";
2
3
  import { QueryPromise } from "./query-promise.mjs";
3
4
  import { BuildFilterExpression } from "../filters/index.mjs";
4
5
  import { AnyColumn, TColsToLeftRight, TableWithColumns } from "../table.mjs";
@@ -1,13 +1,14 @@
1
1
  import { Query } from "./query.mjs";
2
+ import { Key } from "../types.mjs";
2
3
  import { QueryPromise } from "./query-promise.mjs";
3
4
  import { BuildFilterExpression } from "../filters/index.mjs";
4
5
  import { AnyColumn, TColsToLeftRight, TableColumn, TableWithColumns } from "../table.mjs";
5
6
  import { QueryExecutor } from "../connectors/common.mjs";
6
7
 
7
8
  //#region src/query-builders/distinct.d.ts
8
- declare class DistinctQuery<TTableWC extends TableWithColumns<string, string, Record<string, AnyColumn>>, TColumn extends TableColumn<string, string, Key, AnyColumn>, TReturn = TColumn["ValTypeSelect"][]> extends QueryPromise<TReturn> {
9
+ declare class DistinctQuery<TTableWC extends TableWithColumns<string, string, Record<string, AnyColumn>>, TColumn extends TableColumn<string, string, Key, AnyColumn>, TReturn = TColumn["ValTypeSelect"][], TPrepare extends boolean = false> extends QueryPromise<TReturn> {
9
10
  #private;
10
- constructor(table: TTableWC, column: TColumn, where: BuildFilterExpression<TColsToLeftRight<TTableWC["_"]["columns"]>> | undefined, executor: QueryExecutor);
11
+ constructor(table: TTableWC, column: TColumn, where: BuildFilterExpression<TColsToLeftRight<TTableWC["_"]["columns"]>, TPrepare> | undefined, executor: QueryExecutor, prepare?: TPrepare);
11
12
  toQuery(): Query<TReturn>;
12
13
  execute(): Promise<TReturn>;
13
14
  handleRows(rows: {
@@ -6,12 +6,14 @@ var DistinctQuery = class extends QueryPromise {
6
6
  #$column;
7
7
  #$where;
8
8
  #$executor;
9
- constructor(table, column, where, executor) {
9
+ #$prepare;
10
+ constructor(table, column, where, executor, prepare = false) {
10
11
  super();
11
12
  this.#$table = table;
12
13
  this.#$column = column;
13
14
  this.#$where = where;
14
15
  this.#$executor = executor;
16
+ this.#$prepare = prepare;
15
17
  }
16
18
  toQuery() {
17
19
  const columnName = this.#$column.fullName;
@@ -19,7 +21,8 @@ var DistinctQuery = class extends QueryPromise {
19
21
  query.sql += this.#$table._.fullName;
20
22
  if (this.#$where) {
21
23
  query.sql += " WHERE ";
22
- query.sql += this.#$where.toSQL();
24
+ if (this.#$prepare) this.#$where.toQuery(query);
25
+ else query.sql += this.#$where.toSQL();
23
26
  }
24
27
  query.sql += ` ORDER BY ${columnName}`;
25
28
  return query;
@@ -5,9 +5,9 @@ import { AnyColumn, TColsToLeftRight, TableWithColumns } from "../table.mjs";
5
5
  import { QueryExecutor } from "../connectors/common.mjs";
6
6
 
7
7
  //#region src/query-builders/exists.d.ts
8
- declare class ExistsQuery<TTableWC extends TableWithColumns<string, string, Record<string, AnyColumn>>> extends QueryPromise<boolean> {
8
+ declare class ExistsQuery<TTableWC extends TableWithColumns<string, string, Record<string, AnyColumn>>, TPrepare extends boolean = false> extends QueryPromise<boolean> {
9
9
  #private;
10
- constructor(table: TTableWC, where: BuildFilterExpression<TColsToLeftRight<TTableWC["_"]["columns"]>> | undefined, executor: QueryExecutor);
10
+ constructor(table: TTableWC, where: BuildFilterExpression<TColsToLeftRight<TTableWC["_"]["columns"]>, TPrepare> | undefined, executor: QueryExecutor, prepare?: TPrepare);
11
11
  toQuery(): Query<boolean>;
12
12
  execute(): Promise<boolean>;
13
13
  handleRows(rows: {
@@ -5,18 +5,21 @@ var ExistsQuery = class extends QueryPromise {
5
5
  #$table;
6
6
  #$where;
7
7
  #$executor;
8
- constructor(table, where, executor) {
8
+ #$prepare;
9
+ constructor(table, where, executor, prepare = false) {
9
10
  super();
10
11
  this.#$table = table;
11
12
  this.#$where = where;
12
13
  this.#$executor = executor;
14
+ this.#$prepare = prepare;
13
15
  }
14
16
  toQuery() {
15
17
  const query = new Query("SELECT EXISTS(SELECT 1 FROM ", this.handleRows.bind(this));
16
18
  query.sql += this.#$table._.fullName;
17
19
  if (this.#$where) {
18
20
  query.sql += " WHERE ";
19
- query.sql += this.#$where.toSQL();
21
+ if (this.#$prepare) this.#$where.toQuery(query);
22
+ else query.sql += this.#$where.toSQL();
20
23
  }
21
24
  query.sql += ")";
22
25
  return query;
@@ -5,9 +5,9 @@ import { AnyColumn, TColsToLeftRight, TableWithColumns } from "../table.mjs";
5
5
  import { QueryExecutor } from "../connectors/common.mjs";
6
6
 
7
7
  //#region src/query-builders/first.d.ts
8
- declare class FirstQuery<TTableWC extends TableWithColumns<string, string, Record<string, AnyColumn>>, TReturn = { [ColName in keyof TTableWC["_"]["columns"]]: TTableWC["_"]["columns"][ColName]["ValTypeSelect"] } | null> extends QueryPromise<TReturn> {
8
+ declare class FirstQuery<TTableWC extends TableWithColumns<string, string, Record<string, AnyColumn>>, TPrepare extends boolean = false, TReturn = { [ColName in keyof TTableWC["_"]["columns"]]: TTableWC["_"]["columns"][ColName]["ValTypeSelect"] } | null> extends QueryPromise<TReturn> {
9
9
  #private;
10
- constructor(table: TTableWC, where: BuildFilterExpression<TColsToLeftRight<TTableWC["_"]["columns"]>> | undefined, executor: QueryExecutor);
10
+ constructor(table: TTableWC, where: BuildFilterExpression<TColsToLeftRight<TTableWC["_"]["columns"]>, TPrepare> | undefined, executor: QueryExecutor, prepare?: TPrepare);
11
11
  toQuery(): Query<TReturn>;
12
12
  execute(): Promise<TReturn>;
13
13
  handleRows(rows: Record<string, unknown>[]): TReturn;
@@ -6,18 +6,21 @@ var FirstQuery = class extends QueryPromise {
6
6
  #$table;
7
7
  #$where;
8
8
  #$executor;
9
- constructor(table, where, executor) {
9
+ #$prepare;
10
+ constructor(table, where, executor, prepare = false) {
10
11
  super();
11
12
  this.#$table = table;
12
13
  this.#$where = where;
13
14
  this.#$executor = executor;
15
+ this.#$prepare = prepare;
14
16
  }
15
17
  toQuery() {
16
18
  const query = new Query("SELECT * FROM ", this.handleRows.bind(this));
17
19
  query.sql += this.#$table._.fullName;
18
20
  if (this.#$where) {
19
21
  query.sql += " WHERE ";
20
- query.sql += this.#$where.toSQL();
22
+ if (this.#$prepare) this.#$where.toQuery(query);
23
+ else query.sql += this.#$where.toSQL();
21
24
  }
22
25
  query.sql += " LIMIT 1";
23
26
  return query;
@@ -1,4 +1,5 @@
1
1
  import { Query } from "./query.mjs";
2
+ import { Key } from "../types.mjs";
2
3
  import { QueryPromise } from "./query-promise.mjs";
3
4
  import { AnyColumn, TableWithColumns } from "../table.mjs";
4
5
  import { QueryExecutor } from "../connectors/common.mjs";
@@ -38,38 +38,28 @@ var InsertQuery = class InsertQuery extends QueryPromise {
38
38
  const query = new Query("INSERT INTO ", this.handleRows.bind(this));
39
39
  query.sql += this.#table._.fullName;
40
40
  const valuesArray = Array.isArray(this.#$values) ? this.#$values : [this.#$values];
41
- const allFields = /* @__PURE__ */ new Set();
42
- for (const row of valuesArray) for (const field of Object.keys(row)) allFields.add(field);
43
- for (const col in this.#table._.columns) {
44
- const column = this.#table._.columns[col];
45
- if (!allFields.has(col) && column.hasInsertFn) allFields.add(column.name);
46
- }
47
- const fields = Array.from(allFields);
41
+ const fields = Object.keys(this.#table._.columns);
48
42
  query.sql += " ( ";
49
43
  query.sql += fields.map((field) => `"${this.#table._.columns[field].nameSnake}"`).join(", ");
50
44
  query.sql += " ) VALUES";
51
- const rowsValue = [];
52
- for (let rowIndex = 0; rowIndex < valuesArray.length; rowIndex++) {
53
- const row = valuesArray[rowIndex];
54
- const rowValues = [];
55
- for (const field of fields) {
56
- let value = row[field];
57
- const column = this.#table._.columns[field];
58
- if (value === void 0) if (column?.hasInsertFn) value = column.getInsertFnVal();
59
- else {
60
- rowValues.push("NULL");
61
- continue;
62
- }
63
- if (this.#prepare && is(value, Arg)) {
64
- const cast = value.cast ?? column?.sqlCast ?? null;
45
+ valuesArray.forEach((row, i) => {
46
+ query.sql += "(";
47
+ fields.forEach((fieldName, j) => {
48
+ const value = row[fieldName];
49
+ const column = this.#table._.columns[fieldName];
50
+ if (value === void 0) if (column.hasInsertFn) query.sql += column.toSQL(column.getInsertFnVal(), { cast: true });
51
+ else query.sql += "DEFAULT";
52
+ else if (this.#prepare && is(value, Arg)) {
53
+ const cast = value.cast ?? column.sqlCast ?? null;
65
54
  const castSuffix = cast ? `::${cast}` : "";
66
- rowValues.push(`$${value.index}${castSuffix}`);
55
+ query.sql += `$${value.index}${castSuffix}`;
67
56
  query.arguments.push(value.key);
68
- } else rowValues.push(column?.toSQL(value, { cast: true }));
69
- }
70
- rowsValue.push(`(${rowValues.join(", ")})`);
71
- }
72
- query.sql += rowsValue.join(",\n ");
57
+ } else query.sql += column.toSQL(value, { cast: true });
58
+ if (j !== fields.length - 1) query.sql += ", ";
59
+ });
60
+ query.sql += ")";
61
+ if (i !== valuesArray.length - 1) query.sql += ",\n";
62
+ });
73
63
  if (this.#$returning) {
74
64
  query.sql += " RETURNING ";
75
65
  const returningFields = Object.keys(this.#$returning).filter((k) => this.#$returning?.[k] === true);
@@ -1,3 +1,4 @@
1
+ import { Key } from "../types.mjs";
1
2
  import { AnyColumn, AnyTableWithColumns, TableColumn } from "../table.mjs";
2
3
 
3
4
  //#region src/query-builders/orderby-clause.d.ts
@@ -1,4 +1,5 @@
1
1
  import { Query } from "./query.mjs";
2
+ import { Key, Prettify, SelfOrArray, UnionToIntersection, Valueof } from "../types.mjs";
2
3
  import { OrderBy } from "./orderby-clause.mjs";
3
4
  import { QueryPromise } from "./query-promise.mjs";
4
5
  import { BuildFilterExpression, StdCondition } from "../filters/index.mjs";
@@ -1,4 +1,5 @@
1
1
  import { Query } from "./query.mjs";
2
+ import { Key } from "../types.mjs";
2
3
  import { QueryPromise } from "./query-promise.mjs";
3
4
  import { BuildFilterExpression } from "../filters/index.mjs";
4
5
  import { AnyColumn, TColsToLeftRight, TableWithColumns } from "../table.mjs";
@@ -1,9 +1,9 @@
1
+ import { CamelToSnake, Key } from "./types.mjs";
1
2
  import { entityType } from "./symbols.mjs";
2
3
  import { PrimaryKeyConstraint, PrimaryKeyConstraintFn } from "./constraints/primary-key.mjs";
3
4
  import { UniqueConstraint, UniqueConstraintFn } from "./constraints/unique.mjs";
4
5
  import { Index } from "./indexes.mjs";
5
6
  import { Column } from "./columns/common.mjs";
6
- import { CamelToSnake } from "./types.mjs";
7
7
  import { Check, CheckBuilder, CheckExpr } from "./constraints/check.mjs";
8
8
 
9
9
  //#region src/table.d.ts
@@ -1,4 +1,11 @@
1
1
  //#region src/types.d.ts
2
2
  type CamelToSnake<S extends string> = S extends `${infer Head}${infer Tail}` ? Head extends Uppercase<Head> ? `_${Lowercase<Head>}${CamelToSnake<Tail>}` : `${Head}${CamelToSnake<Tail>}` : S;
3
+ type Key = string | number | symbol;
4
+ type Valueof<T> = T extends any ? T[keyof T] : never;
5
+ type SelfOrArray<T> = T | T[];
6
+ type SelfOrReadonly<T> = T | Readonly<T>;
7
+ type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends ((k: infer I) => void) ? I : never;
8
+ type Is<T, U> = T extends U ? true : false;
9
+ type Prettify<T> = { [K in keyof T]: T[K] } & {};
3
10
  //#endregion
4
- export { CamelToSnake };
11
+ export { CamelToSnake, Is, Key, Prettify, SelfOrArray, SelfOrReadonly, UnionToIntersection, Valueof };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "durcno",
3
- "version": "1.0.0-alpha.4",
3
+ "version": "1.0.0-alpha.5",
4
4
  "description": "A PostgreSQL Query Builder and Migration Manager for TypeScript, from the future.",
5
5
  "license": "Apache-2.0",
6
6
  "homepage": "https://durcno.dev",