durcno 1.0.0-alpha.16 → 1.0.0-alpha.18

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 (69) hide show
  1. package/dist/bin.cjs +4 -2
  2. package/dist/src/columns/common.d.mts +1 -1
  3. package/dist/src/constraints/check.d.mts +1 -1
  4. package/dist/src/cte.d.mts +16 -0
  5. package/dist/src/cte.mjs +5 -0
  6. package/dist/src/db.d.mts +24 -1
  7. package/dist/src/db.mjs +10 -1
  8. package/dist/src/filters/array.d.mts +1 -1
  9. package/dist/src/filters/index.d.mts +27 -5
  10. package/dist/src/filters/index.mjs +1 -1
  11. package/dist/src/filters/string.d.mts +1 -1
  12. package/dist/src/functions/aggregate.d.mts +24 -8
  13. package/dist/src/functions/aggregate.mjs +68 -9
  14. package/dist/src/functions/arithmetic.d.mts +67 -0
  15. package/dist/src/functions/arithmetic.mjs +123 -0
  16. package/dist/src/functions/index.d.mts +17 -19
  17. package/dist/src/functions/index.mjs +19 -23
  18. package/dist/src/functions/numeric.d.mts +16 -1
  19. package/dist/src/functions/numeric.mjs +45 -0
  20. package/dist/src/functions/pgvector.d.mts +4 -1
  21. package/dist/src/functions/pgvector.mjs +9 -0
  22. package/dist/src/functions/postgis.d.mts +3 -0
  23. package/dist/src/functions/postgis.mjs +9 -0
  24. package/dist/src/functions/string.d.mts +22 -1
  25. package/dist/src/functions/string.mjs +63 -0
  26. package/dist/src/index.d.mts +8 -5
  27. package/dist/src/index.mjs +3 -1
  28. package/dist/src/migration/ddl/index.d.mts +20 -147
  29. package/dist/src/migration/ddl/index.mjs +20 -173
  30. package/dist/src/migration/ddl/indexes.d.mts +23 -1
  31. package/dist/src/migration/ddl/indexes.mjs +27 -1
  32. package/dist/src/migration/ddl/schema.d.mts +15 -1
  33. package/dist/src/migration/ddl/schema.mjs +19 -1
  34. package/dist/src/migration/ddl/sequence.d.mts +18 -1
  35. package/dist/src/migration/ddl/sequence.mjs +22 -1
  36. package/dist/src/migration/ddl/statement.d.mts +6 -51
  37. package/dist/src/migration/ddl/statement.mjs +7 -33
  38. package/dist/src/migration/ddl/table.d.mts +34 -1
  39. package/dist/src/migration/ddl/table.mjs +42 -1
  40. package/dist/src/migration/ddl/types.d.mts +49 -1
  41. package/dist/src/migration/ddl/types.mjs +53 -1
  42. package/dist/src/query-builders/aggregates.d.mts +1 -1
  43. package/dist/src/query-builders/count.d.mts +1 -1
  44. package/dist/src/query-builders/delete.d.mts +14 -7
  45. package/dist/src/query-builders/delete.mjs +26 -9
  46. package/dist/src/query-builders/distinct.d.mts +1 -1
  47. package/dist/src/query-builders/exists.d.mts +1 -1
  48. package/dist/src/query-builders/first.d.mts +1 -1
  49. package/dist/src/query-builders/groupby-clause.d.mts +33 -0
  50. package/dist/src/query-builders/groupby-clause.mjs +37 -0
  51. package/dist/src/query-builders/helpers.mjs +28 -0
  52. package/dist/src/query-builders/insert.d.mts +9 -5
  53. package/dist/src/query-builders/insert.mjs +19 -7
  54. package/dist/src/query-builders/orderby-clause.d.mts +1 -1
  55. package/dist/src/query-builders/pre.d.mts +1 -1
  56. package/dist/src/query-builders/query-promise.d.mts +2 -2
  57. package/dist/src/query-builders/query.d.mts +2 -1
  58. package/dist/src/query-builders/rq.d.mts +3 -3
  59. package/dist/src/query-builders/select.d.mts +45 -10
  60. package/dist/src/query-builders/select.mjs +73 -14
  61. package/dist/src/query-builders/update.d.mts +15 -8
  62. package/dist/src/query-builders/update.mjs +22 -9
  63. package/dist/src/query-builders/with.d.mts +51 -0
  64. package/dist/src/query-builders/with.mjs +47 -0
  65. package/dist/src/table.d.mts +3 -1
  66. package/dist/src/table.mjs +2 -2
  67. package/dist/src/virtual-table.d.mts +51 -0
  68. package/dist/src/virtual-table.mjs +55 -0
  69. package/package.json +1 -1
package/dist/bin.cjs CHANGED
@@ -9631,7 +9631,9 @@ function orderTables(tables, order) {
9631
9631
  Object.entries(tables).map(([tableName, table]) => {
9632
9632
  const references = Object.values(table.columns).map(
9633
9633
  (column) => column.references ? `${column.references.schema}.${column.references.table}` : void 0
9634
- ).filter((table2) => table2 !== void 0);
9634
+ ).filter(
9635
+ (table2) => table2 !== void 0 && table2 !== tableName
9636
+ );
9635
9637
  return [tableName, references];
9636
9638
  })
9637
9639
  );
@@ -10455,7 +10457,7 @@ async function status(options) {
10455
10457
  }
10456
10458
 
10457
10459
  // src/cli/index.ts
10458
- program.version("1.0.0-alpha.15");
10460
+ program.version("1.0.0-alpha.17");
10459
10461
  var Options = {
10460
10462
  config: ["--config <path>", "Path to the config file"]
10461
10463
  };
@@ -1,7 +1,7 @@
1
+ import { AnyFilter } from "../filters/index.mjs";
1
2
  import { CheckExpression } from "../constraints/check.mjs";
2
3
  import { entityType } from "../symbols.mjs";
3
4
  import { AnyColumn, StdTable, StdTableColumn } from "../table.mjs";
4
- import { AnyFilter } from "../filters/index.mjs";
5
5
  import { Arg } from "../query-builders/pre.mjs";
6
6
  import { Query, QueryContext } from "../query-builders/query.mjs";
7
7
  import { Sql } from "../sql.mjs";
@@ -1,5 +1,5 @@
1
- import { AnyColumn, TableAnyColumn } from "../table.mjs";
2
1
  import { AnyFilter, Filter } from "../filters/index.mjs";
2
+ import { AnyColumn, TableAnyColumn } from "../table.mjs";
3
3
  import { QueryContext } from "../query-builders/query.mjs";
4
4
  import { Sql } from "../sql.mjs";
5
5
 
@@ -0,0 +1,16 @@
1
+ import { VirtualTable } from "./virtual-table.mjs";
2
+ import { AnyColumn } from "./table.mjs";
3
+
4
+ //#region src/cte.d.ts
5
+ declare class Cte<TName extends string, TColumns extends Record<string, AnyColumn>> extends VirtualTable<TName, TColumns> {
6
+ /** Phantom type — extracts `TName` safely through `CteWithColumns` intersections. */
7
+ readonly $cteName: TName;
8
+ }
9
+ type CteWithColumns<TName extends string, TColumns extends Record<string, AnyColumn>> = Cte<TName, TColumns> & TColumns;
10
+ type AnyCteWithColumns = CteWithColumns<any, Record<any, any>>;
11
+ /** Maps a tuple of `CteWithColumns` to an object keyed by CTE name. */
12
+ type CtesByName<TCtes extends AnyCteWithColumns[]> = { [K in TCtes[number] as K extends {
13
+ $cteName: infer TName extends string;
14
+ } ? TName : never]: K };
15
+ //#endregion
16
+ export { AnyCteWithColumns, Cte, CteWithColumns, CtesByName };
@@ -0,0 +1,5 @@
1
+ import { VirtualTable } from "./virtual-table.mjs";
2
+ //#region src/cte.ts
3
+ var Cte = class extends VirtualTable {};
4
+ //#endregion
5
+ export { Cte };
package/dist/src/db.d.mts CHANGED
@@ -1,7 +1,9 @@
1
1
  import { CamelToSnake, Valueof } from "./types.mjs";
2
- import { AnyColumn, AnyRelations, IsTableWC, Relations, TableWCorNever, TableWithColumns } from "./table.mjs";
2
+ import { AnySubquery, InferQueryColumns } from "./virtual-table.mjs";
3
3
  import { SelectBuilder } from "./query-builders/select.mjs";
4
4
  import { FilterExpression } from "./filters/index.mjs";
5
+ import { AnyColumn, AnyRelations, IsTableWC, Relations, TableWCorNever, TableWithColumns } from "./table.mjs";
6
+ import { AnyCteWithColumns, CteWithColumns } from "./cte.mjs";
5
7
  import { Config } from "./index.mjs";
6
8
  import { AggregateQuery } from "./query-builders/aggregates.mjs";
7
9
  import { CountQuery } from "./query-builders/count.mjs";
@@ -13,6 +15,7 @@ import { InsertBuilder } from "./query-builders/insert.mjs";
13
15
  import { RawQuery } from "./query-builders/raw.mjs";
14
16
  import { RelationQueryBuilder } from "./query-builders/rq.mjs";
15
17
  import { UpdateBuilder } from "./query-builders/update.mjs";
18
+ import { WithStatement } from "./query-builders/with.mjs";
16
19
  import { $Pool, QueryExecutor } from "./connectors/common.mjs";
17
20
 
18
21
  //#region src/db.d.ts
@@ -149,6 +152,26 @@ declare class Base<TTName extends string, TTables extends Record<TTName, TableWi
149
152
  * @returns A RawQuery instance that resolves to the query result (or transformed result if handler provided)
150
153
  */
151
154
  raw<TReturn = unknown>(query: string, args: (string | number | null)[] | undefined, rowsHandler: ((rows: any[]) => TReturn) | undefined): RawQuery<TReturn>;
155
+ /**
156
+ * Create a CTE definition by name.
157
+ * @param name The CTE name to be used in the WITH clause
158
+ * @returns An object with `.as()` to bind a subquery
159
+ *
160
+ * @example
161
+ * const activeCte = db.with("activeUsers").as(db.from(Users).select(...));
162
+ */
163
+ with<TCteName extends string>(name: TCteName): {
164
+ as: <TQuery extends AnySubquery>(query: TQuery) => CteWithColumns<TCteName, InferQueryColumns<TCteName, TQuery>>;
165
+ };
166
+ /**
167
+ * Attach one or more CTEs to a statement.
168
+ * @param ctes One or more CTE instances created via `db.with("name").as(...)`
169
+ * @returns A `WithStatement` to build the SELECT/INSERT/UPDATE/DELETE against
170
+ *
171
+ * @example
172
+ * const rows = await db.with(activeCte).from(ctes => ctes.activeUsers).select();
173
+ */
174
+ with<TCtes extends [AnyCteWithColumns, ...AnyCteWithColumns[]]>(...ctes: TCtes): WithStatement<TCtes, TPrepare>;
152
175
  }
153
176
  declare class DB<TTName extends string, TTables extends Record<TTName, TableWithColumns<string, string, Record<string, AnyColumn>>>, TAllRelations extends Record<StdTableFullName, AnyRelations>> extends Base<TTName, TTables, TAllRelations, false> {
154
177
  #private;
package/dist/src/db.mjs CHANGED
@@ -1,5 +1,8 @@
1
1
  import { Query } from "./query-builders/query.mjs";
2
2
  import { is } from "./entity.mjs";
3
+ import { Relations, Table } from "./table.mjs";
4
+ import { bindVirtualTableColumns } from "./virtual-table.mjs";
5
+ import { Cte } from "./cte.mjs";
3
6
  import { AggregateQuery } from "./query-builders/aggregates.mjs";
4
7
  import { CountQuery } from "./query-builders/count.mjs";
5
8
  import { DeleteQuery } from "./query-builders/delete.mjs";
@@ -11,7 +14,7 @@ import { RawQuery } from "./query-builders/raw.mjs";
11
14
  import { RelationQueryBuilder } from "./query-builders/rq.mjs";
12
15
  import { SelectBuilder } from "./query-builders/select.mjs";
13
16
  import { UpdateBuilder } from "./query-builders/update.mjs";
14
- import { Relations, Table } from "./table.mjs";
17
+ import { WithStatement } from "./query-builders/with.mjs";
15
18
  //#region src/db.ts
16
19
  var Base = class {
17
20
  #allRelations;
@@ -119,6 +122,12 @@ var Base = class {
119
122
  raw(query, args = [], rowsHandler) {
120
123
  return new RawQuery(query, args, rowsHandler, this.#getExecutor());
121
124
  }
125
+ with(nameOrFirstCte, ...restCtes) {
126
+ if (typeof nameOrFirstCte === "string") return { as: (query) => {
127
+ return bindVirtualTableColumns(new Cte(nameOrFirstCte, query.getResolvedColumns(), query));
128
+ } };
129
+ return new WithStatement([nameOrFirstCte, ...restCtes], this.#getExecutor(), this.$.pre);
130
+ }
122
131
  };
123
132
  var DB = class extends Base {
124
133
  #pool;
@@ -1,5 +1,5 @@
1
- import { AnyColumn } from "../table.mjs";
2
1
  import { Filter } from "./index.mjs";
2
+ import { AnyColumn } from "../table.mjs";
3
3
  import { Arg, IsArg } from "../query-builders/pre.mjs";
4
4
  import { Query, QueryContext } from "../query-builders/query.mjs";
5
5
 
@@ -1,7 +1,7 @@
1
1
  import { BasicTypes, Or } from "../types.mjs";
2
- import { AnyColumn } from "../table.mjs";
3
- import { AnyScalarSqlFn } from "../functions/index.mjs";
2
+ import { AnyAggregateSqlFn, AnyScalarSqlFn, AnySqlFn } from "../functions/index.mjs";
4
3
  import { SelectQuery } from "../query-builders/select.mjs";
4
+ import { AnyColumn } from "../table.mjs";
5
5
  import { Arg, IsArg } from "../query-builders/pre.mjs";
6
6
  import { Query, QueryContext } from "../query-builders/query.mjs";
7
7
  import { Sql } from "../sql.mjs";
@@ -25,6 +25,16 @@ type AnyFilter = Filter<any, any>;
25
25
  */
26
26
  type FilterExpression<TScopeColumns extends AnyColumn, TPrepare extends boolean = false> = Filter<TScopeColumns, TPrepare extends true ? boolean : false> | Sql;
27
27
  type StdCondition = FilterExpression<AnyColumn>;
28
+ /**
29
+ * A HAVING clause expression. Structurally identical to `FilterExpression` but
30
+ * signals intent — it is used in `.having()` rather than `.where()`.
31
+ *
32
+ * Note: TypeScript does not prevent aggregate `SqlFn` expressions from being
33
+ * passed to `.where()` at the type level (the `$Columns` phantom traces back to
34
+ * `AnyColumn` regardless of aggregate/scalar kind). PostgreSQL will reject such
35
+ * queries at runtime. This is a known limitation.
36
+ */
37
+ type HavingExpression<TScopeColumns extends AnyColumn, TPrepare extends boolean = false> = FilterExpression<TScopeColumns, TPrepare>;
28
38
  type HasArg<T> = T extends {
29
39
  $HasArg: true;
30
40
  } ? true : false;
@@ -35,7 +45,7 @@ declare class ComparisonLeftIsColumn<TLeft extends AnyColumn, TOp extends string
35
45
  constructor(field: TLeft, op: TOp, right: TRight);
36
46
  toQuery(query: Query, ctx?: QueryContext): void;
37
47
  }
38
- declare class ComparisonLeftIsSqlFn<TLeft extends AnyScalarSqlFn, TOp extends string, TRight extends BasicTypes | AnyScalarSqlFn> extends Filter<TLeft["$Columns"] | (TRight extends AnyScalarSqlFn ? TRight["$Columns"] : never), HasArg<TLeft> extends true ? true : HasArg<TRight>> {
48
+ declare class ComparisonLeftIsSqlFn<TLeft extends AnySqlFn, TOp extends string, TRight extends BasicTypes | AnySqlFn> extends Filter<TLeft["$Columns"] | (TRight extends AnyScalarSqlFn ? TRight["$Columns"] : never), HasArg<TLeft> extends true ? true : HasArg<TRight>> {
39
49
  readonly left: TLeft;
40
50
  readonly op: TOp;
41
51
  readonly right: TRight;
@@ -46,26 +56,38 @@ declare function eq<TLeft extends AnyColumn, TRight extends TLeft["ValType"]>(le
46
56
  declare function eq<TLeft extends AnyColumn, TRight extends Arg<TLeft["ValType"]> | AnyColumn | AnyScalarSqlFn>(left: TLeft, right: TRight): ComparisonLeftIsColumn<TLeft, "=", TRight>;
47
57
  declare function eq<TLeft extends AnyScalarSqlFn, TRight extends BasicTypes>(left: TLeft, right: TRight): ComparisonLeftIsSqlFn<TLeft, "=", TRight>;
48
58
  declare function eq<TLeft extends AnyScalarSqlFn, TRight extends AnyScalarSqlFn>(left: TLeft, right: TRight): ComparisonLeftIsSqlFn<TLeft, "=", TRight>;
59
+ declare function eq<TLeft extends AnyAggregateSqlFn, TRight extends BasicTypes>(left: TLeft, right: TRight): ComparisonLeftIsSqlFn<TLeft, "=", TRight>;
60
+ declare function eq<TLeft extends AnyAggregateSqlFn, TRight extends AnyAggregateSqlFn>(left: TLeft, right: TRight): ComparisonLeftIsSqlFn<TLeft, "=", TRight>;
49
61
  declare function ne<TLeft extends AnyColumn, TRight extends TLeft["ValType"]>(left: TLeft, right: TRight): ComparisonLeftIsColumn<TLeft, "!=", TRight>;
50
62
  declare function ne<TLeft extends AnyColumn, TRight extends Arg<TLeft["ValType"]> | AnyColumn | AnyScalarSqlFn>(left: TLeft, right: TRight): ComparisonLeftIsColumn<TLeft, "!=", TRight>;
51
63
  declare function ne<TLeft extends AnyScalarSqlFn, TRight extends BasicTypes>(left: TLeft, right: TRight): ComparisonLeftIsSqlFn<TLeft, "!=", TRight>;
52
64
  declare function ne<TLeft extends AnyScalarSqlFn, TRight extends AnyScalarSqlFn>(left: TLeft, right: TRight): ComparisonLeftIsSqlFn<TLeft, "!=", TRight>;
65
+ declare function ne<TLeft extends AnyAggregateSqlFn, TRight extends BasicTypes>(left: TLeft, right: TRight): ComparisonLeftIsSqlFn<TLeft, "!=", TRight>;
66
+ declare function ne<TLeft extends AnyAggregateSqlFn, TRight extends AnyAggregateSqlFn>(left: TLeft, right: TRight): ComparisonLeftIsSqlFn<TLeft, "!=", TRight>;
53
67
  declare function gt<TLeft extends AnyColumn, TRight extends TLeft["ValType"]>(left: TLeft, right: TRight): ComparisonLeftIsColumn<TLeft, ">", TRight>;
54
68
  declare function gt<TLeft extends AnyColumn, TRight extends Arg<TLeft["ValType"]> | AnyColumn | AnyScalarSqlFn>(left: TLeft, right: TRight): ComparisonLeftIsColumn<TLeft, ">", TRight>;
55
69
  declare function gt<TLeft extends AnyScalarSqlFn, TRight extends BasicTypes>(left: TLeft, right: TRight): ComparisonLeftIsSqlFn<TLeft, ">", TRight>;
56
70
  declare function gt<TLeft extends AnyScalarSqlFn, TRight extends AnyScalarSqlFn>(left: TLeft, right: TRight): ComparisonLeftIsSqlFn<TLeft, ">", TRight>;
71
+ declare function gt<TLeft extends AnyAggregateSqlFn, TRight extends BasicTypes>(left: TLeft, right: TRight): ComparisonLeftIsSqlFn<TLeft, ">", TRight>;
72
+ declare function gt<TLeft extends AnyAggregateSqlFn, TRight extends AnyAggregateSqlFn>(left: TLeft, right: TRight): ComparisonLeftIsSqlFn<TLeft, ">", TRight>;
57
73
  declare function gte<TLeft extends AnyColumn, TRight extends TLeft["ValType"]>(left: TLeft, right: TRight): ComparisonLeftIsColumn<TLeft, ">=", TRight>;
58
74
  declare function gte<TLeft extends AnyColumn, TRight extends Arg<TLeft["ValType"]> | AnyColumn | AnyScalarSqlFn>(left: TLeft, right: TRight): ComparisonLeftIsColumn<TLeft, ">=", TRight>;
59
75
  declare function gte<TLeft extends AnyScalarSqlFn, TRight extends BasicTypes>(left: TLeft, right: TRight): ComparisonLeftIsSqlFn<TLeft, ">=", TRight>;
60
76
  declare function gte<TLeft extends AnyScalarSqlFn, TRight extends AnyScalarSqlFn>(left: TLeft, right: TRight): ComparisonLeftIsSqlFn<TLeft, ">=", TRight>;
77
+ declare function gte<TLeft extends AnyAggregateSqlFn, TRight extends BasicTypes>(left: TLeft, right: TRight): ComparisonLeftIsSqlFn<TLeft, ">=", TRight>;
78
+ declare function gte<TLeft extends AnyAggregateSqlFn, TRight extends AnyAggregateSqlFn>(left: TLeft, right: TRight): ComparisonLeftIsSqlFn<TLeft, ">=", TRight>;
61
79
  declare function lt<TLeft extends AnyColumn, TRight extends TLeft["ValType"]>(left: TLeft, right: TRight): ComparisonLeftIsColumn<TLeft, "<", TRight>;
62
80
  declare function lt<TLeft extends AnyColumn, TRight extends Arg<TLeft["ValType"]> | AnyColumn | AnyScalarSqlFn>(left: TLeft, right: TRight): ComparisonLeftIsColumn<TLeft, "<", TRight>;
63
81
  declare function lt<TLeft extends AnyScalarSqlFn, TRight extends BasicTypes>(left: TLeft, right: TRight): ComparisonLeftIsSqlFn<TLeft, "<", TRight>;
64
82
  declare function lt<TLeft extends AnyScalarSqlFn, TRight extends AnyScalarSqlFn>(left: TLeft, right: TRight): ComparisonLeftIsSqlFn<TLeft, "<", TRight>;
83
+ declare function lt<TLeft extends AnyAggregateSqlFn, TRight extends BasicTypes>(left: TLeft, right: TRight): ComparisonLeftIsSqlFn<TLeft, "<", TRight>;
84
+ declare function lt<TLeft extends AnyAggregateSqlFn, TRight extends AnyAggregateSqlFn>(left: TLeft, right: TRight): ComparisonLeftIsSqlFn<TLeft, "<", TRight>;
65
85
  declare function lte<TLeft extends AnyColumn, TRight extends TLeft["ValType"]>(left: TLeft, right: TRight): ComparisonLeftIsColumn<TLeft, "<=", TRight>;
66
86
  declare function lte<TLeft extends AnyColumn, TRight extends Arg<TLeft["ValType"]> | AnyColumn | AnyScalarSqlFn>(left: TLeft, right: TRight): ComparisonLeftIsColumn<TLeft, "<=", TRight>;
67
87
  declare function lte<TLeft extends AnyScalarSqlFn, TRight extends BasicTypes>(left: TLeft, right: TRight): ComparisonLeftIsSqlFn<TLeft, "<=", TRight>;
68
88
  declare function lte<TLeft extends AnyScalarSqlFn, TRight extends AnyScalarSqlFn>(left: TLeft, right: TRight): ComparisonLeftIsSqlFn<TLeft, "<=", TRight>;
89
+ declare function lte<TLeft extends AnyAggregateSqlFn, TRight extends BasicTypes>(left: TLeft, right: TRight): ComparisonLeftIsSqlFn<TLeft, "<=", TRight>;
90
+ declare function lte<TLeft extends AnyAggregateSqlFn, TRight extends AnyAggregateSqlFn>(left: TLeft, right: TRight): ComparisonLeftIsSqlFn<TLeft, "<=", TRight>;
69
91
  declare class IsNullCondition<TCol extends AnyColumn> extends Filter<TCol, false> {
70
92
  readonly field: TCol;
71
93
  constructor(field: TCol);
@@ -78,7 +100,7 @@ declare class IsNotNullCondition<TCol extends AnyColumn> extends Filter<TCol, fa
78
100
  toQuery(query: Query, ctx?: QueryContext): void;
79
101
  }
80
102
  declare function isNotNull<TCol extends AnyColumn>(field: TCol): IsNotNullCondition<TCol>;
81
- type InSelectQuery<TArg extends boolean, TReturn> = SelectQuery<any, any, any, any, any, TArg, any, any, Record<string, TReturn>[]>;
103
+ type InSelectQuery<TArg extends boolean, TReturn> = SelectQuery<any, any, any, any, any, TArg, any, any, any, any, Record<string, TReturn>[]>;
82
104
  declare class InCondition<TCol extends AnyColumn, TArg extends boolean> extends Filter<TCol, TArg> {
83
105
  readonly field: TCol;
84
106
  readonly values: TCol["ValType"][] | InSelectQuery<TArg, TCol["ValType"]>;
@@ -106,4 +128,4 @@ declare class OrCondition<TConditions extends (AnyFilter | Sql)[]> extends Filte
106
128
  }
107
129
  declare function or<TConditions extends (AnyFilter | Sql)[]>(...conditions: TConditions): OrCondition<TConditions>;
108
130
  //#endregion
109
- export { AnyFilter, Filter, FilterExpression, StdCondition, and, eq, gt, gte, isIn, isNotNull, isNull, lt, lte, ne, notIn, or };
131
+ export { AnyFilter, Filter, FilterExpression, HavingExpression, StdCondition, and, eq, gt, gte, isIn, isNotNull, isNull, lt, lte, ne, notIn, or };
@@ -119,7 +119,7 @@ var InCondition = class extends Filter {
119
119
  } else {
120
120
  this.field.toQuery(query, ctx);
121
121
  query.sql += " IN (";
122
- query.sql += this.values.toQuery();
122
+ this.values.toQuery(query);
123
123
  query.sql += ")";
124
124
  }
125
125
  }
@@ -1,5 +1,5 @@
1
- import { Column } from "../columns/common.mjs";
2
1
  import { Filter } from "./index.mjs";
2
+ import { Column } from "../columns/common.mjs";
3
3
  import { Arg, IsArg } from "../query-builders/pre.mjs";
4
4
  import { Query, QueryContext } from "../query-builders/query.mjs";
5
5
 
@@ -1,5 +1,5 @@
1
- import { AnyColumn } from "../table.mjs";
2
1
  import { AnyScalarSqlFn, ExprColumns, HasArg, SqlFn } from "./index.mjs";
2
+ import { AnyColumn } from "../table.mjs";
3
3
  import { Query, QueryContext } from "../query-builders/query.mjs";
4
4
 
5
5
  //#region src/functions/aggregate.d.ts
@@ -36,6 +36,9 @@ declare class CountFn<TExpr extends AnyColumn> extends SqlFn<TExpr, false, "aggr
36
36
  private readonly expr;
37
37
  readonly isAggregate = true;
38
38
  constructor(expr: TExpr);
39
+ toDriverValue(value: number | null): unknown;
40
+ toSQLValue(value: number | null): string;
41
+ fromDriverValue(value: unknown): number | null;
39
42
  /** Appends `count(expr)` to the query SQL. */
40
43
  toQuery(query: Query, ctx?: QueryContext): void;
41
44
  }
@@ -50,6 +53,9 @@ declare class CountFn<TExpr extends AnyColumn> extends SqlFn<TExpr, false, "aggr
50
53
  */
51
54
  declare class CountStarFn extends SqlFn<never, false, "aggregate", "numeric", number> {
52
55
  readonly isAggregate = true;
56
+ toDriverValue(value: number | null): unknown;
57
+ toSQLValue(value: number | null): string;
58
+ fromDriverValue(value: unknown): number | null;
53
59
  /** Appends `count(*)` to the query SQL. */
54
60
  toQuery(query: Query, _ctx?: QueryContext): void;
55
61
  }
@@ -66,6 +72,9 @@ declare class CountDistinctFn<TExpr extends AnyColumn> extends SqlFn<TExpr, fals
66
72
  private readonly expr;
67
73
  readonly isAggregate = true;
68
74
  constructor(expr: TExpr);
75
+ toDriverValue(value: number | null): unknown;
76
+ toSQLValue(value: number | null): string;
77
+ fromDriverValue(value: unknown): number | null;
69
78
  /** Appends `count(DISTINCT expr)` to the query SQL. */
70
79
  toQuery(query: Query, ctx?: QueryContext): void;
71
80
  }
@@ -111,6 +120,9 @@ declare class SumFn<TExpr extends NumericAggregateInput> extends SqlFn<ExprColum
111
120
  private readonly expr;
112
121
  readonly isAggregate = true;
113
122
  constructor(expr: TExpr);
123
+ toDriverValue(value: TExpr["$"]["TsType"] | null): unknown;
124
+ toSQLValue(value: TExpr["$"]["TsType"] | null): string;
125
+ fromDriverValue(value: unknown): TExpr["$"]["TsType"] | null;
114
126
  /** Appends `sum(expr)` to the query SQL. */
115
127
  toQuery(query: Query, ctx?: QueryContext): void;
116
128
  }
@@ -140,12 +152,12 @@ declare class AvgFn<TExpr extends NumericAggregateInput> extends SqlFn<ExprColum
140
152
  private readonly expr;
141
153
  readonly isAggregate = true;
142
154
  constructor(expr: TExpr);
155
+ toDriverValue(value: TExpr["$"]["TsType"] | null): unknown;
156
+ toSQLValue(value: TExpr["$"]["TsType"] | null): string;
143
157
  /**
144
158
  * Preserves the raw PostgreSQL `numeric` string (e.g. `"2.5000000000"`).
145
- * The default `SqlFn.fromDriver` would coerce numeric strings to `number`,
146
- * which contradicts the declared `string | null` return type.
147
159
  */
148
- fromDriver(value: unknown): string | null;
160
+ fromDriverValue(value: unknown): TExpr["$"]["TsType"] | null;
149
161
  /** Appends `avg(expr)` to the query SQL. */
150
162
  toQuery(query: Query, ctx?: QueryContext): void;
151
163
  }
@@ -176,11 +188,13 @@ declare class MinFn<TExpr extends AggregateInput> extends SqlFn<ExprColumns<TExp
176
188
  private readonly expr;
177
189
  readonly isAggregate = true;
178
190
  constructor(expr: TExpr);
191
+ toDriverValue(value: TExpr["$"]["TsType"] | null): unknown;
192
+ toSQLValue(value: TExpr["$"]["TsType"] | null): string;
179
193
  /**
180
- * Delegates to the inner expression's own `fromDriver` so that the result
194
+ * Delegates to the inner expression's own conversion so that the result
181
195
  * is deserialized to the same TypeScript type as the wrapped column/function.
182
196
  */
183
- fromDriver(value: unknown): TExpr["$"]["TsType"] | null;
197
+ fromDriverValue(value: unknown): TExpr["$"]["TsType"] | null;
184
198
  /** Appends `min(expr)` to the query SQL. */
185
199
  toQuery(query: Query, ctx?: QueryContext): void;
186
200
  }
@@ -211,11 +225,13 @@ declare class MaxFn<TExpr extends AggregateInput> extends SqlFn<ExprColumns<TExp
211
225
  private readonly expr;
212
226
  readonly isAggregate = true;
213
227
  constructor(expr: TExpr);
228
+ toDriverValue(value: TExpr["$"]["TsType"] | null): unknown;
229
+ toSQLValue(value: TExpr["$"]["TsType"] | null): string;
214
230
  /**
215
- * Delegates to the inner expression's own `fromDriver` so that the result
231
+ * Delegates to the inner expression's own conversion so that the result
216
232
  * is deserialized to the same TypeScript type as the wrapped column/function.
217
233
  */
218
- fromDriver(value: unknown): TExpr["$"]["TsType"] | null;
234
+ fromDriverValue(value: unknown): TExpr["$"]["TsType"] | null;
219
235
  /** Appends `max(expr)` to the query SQL. */
220
236
  toQuery(query: Query, ctx?: QueryContext): void;
221
237
  }
@@ -1,4 +1,5 @@
1
1
  import { SqlFn } from "./index.mjs";
2
+ import { isCol } from "../entity.mjs";
2
3
  //#region src/functions/aggregate.ts
3
4
  /**
4
5
  * SQL aggregate expression: `count(col)`
@@ -17,6 +18,15 @@ var CountFn = class extends SqlFn {
17
18
  super();
18
19
  this.expr = expr;
19
20
  }
21
+ toDriverValue(value) {
22
+ return value;
23
+ }
24
+ toSQLValue(value) {
25
+ return SqlFn._numericToSQL(value);
26
+ }
27
+ fromDriverValue(value) {
28
+ return SqlFn._numericFromDriver(value);
29
+ }
20
30
  /** Appends `count(expr)` to the query SQL. */
21
31
  toQuery(query, ctx) {
22
32
  query.sql += "count(";
@@ -35,6 +45,15 @@ var CountFn = class extends SqlFn {
35
45
  */
36
46
  var CountStarFn = class extends SqlFn {
37
47
  isAggregate = true;
48
+ toDriverValue(value) {
49
+ return value;
50
+ }
51
+ toSQLValue(value) {
52
+ return SqlFn._numericToSQL(value);
53
+ }
54
+ fromDriverValue(value) {
55
+ return SqlFn._numericFromDriver(value);
56
+ }
38
57
  /** Appends `count(*)` to the query SQL. */
39
58
  toQuery(query, _ctx) {
40
59
  query.sql += "count(*)";
@@ -55,6 +74,15 @@ var CountDistinctFn = class extends SqlFn {
55
74
  super();
56
75
  this.expr = expr;
57
76
  }
77
+ toDriverValue(value) {
78
+ return value;
79
+ }
80
+ toSQLValue(value) {
81
+ return SqlFn._numericToSQL(value);
82
+ }
83
+ fromDriverValue(value) {
84
+ return SqlFn._numericFromDriver(value);
85
+ }
58
86
  /** Appends `count(DISTINCT expr)` to the query SQL. */
59
87
  toQuery(query, ctx) {
60
88
  query.sql += "count(DISTINCT ";
@@ -96,6 +124,17 @@ var SumFn = class extends SqlFn {
96
124
  super();
97
125
  this.expr = expr;
98
126
  }
127
+ toDriverValue(value) {
128
+ return value;
129
+ }
130
+ toSQLValue(value) {
131
+ return SqlFn._numericToSQL(value);
132
+ }
133
+ fromDriverValue(value) {
134
+ if (value === null) return null;
135
+ if (typeof value === "bigint") return value;
136
+ return Number(value);
137
+ }
99
138
  /** Appends `sum(expr)` to the query SQL. */
100
139
  toQuery(query, ctx) {
101
140
  query.sql += "sum(";
@@ -133,12 +172,16 @@ var AvgFn = class extends SqlFn {
133
172
  super();
134
173
  this.expr = expr;
135
174
  }
175
+ toDriverValue(value) {
176
+ return value;
177
+ }
178
+ toSQLValue(value) {
179
+ return SqlFn._stringToSQL(value);
180
+ }
136
181
  /**
137
182
  * Preserves the raw PostgreSQL `numeric` string (e.g. `"2.5000000000"`).
138
- * The default `SqlFn.fromDriver` would coerce numeric strings to `number`,
139
- * which contradicts the declared `string | null` return type.
140
183
  */
141
- fromDriver(value) {
184
+ fromDriverValue(value) {
142
185
  if (value === null) return null;
143
186
  return value;
144
187
  }
@@ -180,13 +223,21 @@ var MinFn = class extends SqlFn {
180
223
  super();
181
224
  this.expr = expr;
182
225
  }
226
+ toDriverValue(value) {
227
+ return value;
228
+ }
229
+ toSQLValue(value) {
230
+ if (isCol(this.expr)) return this.expr.toSQLScalar(value);
231
+ return this.expr.toSQLValue(value);
232
+ }
183
233
  /**
184
- * Delegates to the inner expression's own `fromDriver` so that the result
234
+ * Delegates to the inner expression's own conversion so that the result
185
235
  * is deserialized to the same TypeScript type as the wrapped column/function.
186
236
  */
187
- fromDriver(value) {
237
+ fromDriverValue(value) {
188
238
  if (value === null) return null;
189
- return this.expr.fromDriver(value);
239
+ if (isCol(this.expr)) return this.expr.fromDriverScalar(value);
240
+ return this.expr.fromDriverValue(value);
190
241
  }
191
242
  /** Appends `min(expr)` to the query SQL. */
192
243
  toQuery(query, ctx) {
@@ -226,13 +277,21 @@ var MaxFn = class extends SqlFn {
226
277
  super();
227
278
  this.expr = expr;
228
279
  }
280
+ toDriverValue(value) {
281
+ return value;
282
+ }
283
+ toSQLValue(value) {
284
+ if (isCol(this.expr)) return this.expr.toSQLScalar(value);
285
+ return this.expr.toSQLValue(value);
286
+ }
229
287
  /**
230
- * Delegates to the inner expression's own `fromDriver` so that the result
288
+ * Delegates to the inner expression's own conversion so that the result
231
289
  * is deserialized to the same TypeScript type as the wrapped column/function.
232
290
  */
233
- fromDriver(value) {
291
+ fromDriverValue(value) {
234
292
  if (value === null) return null;
235
- return this.expr.fromDriver(value);
293
+ if (isCol(this.expr)) return this.expr.fromDriverScalar(value);
294
+ return this.expr.fromDriverValue(value);
236
295
  }
237
296
  /** Appends `max(expr)` to the query SQL. */
238
297
  toQuery(query, ctx) {
@@ -0,0 +1,67 @@
1
+ import { Or } from "../types.mjs";
2
+ import { AnySqlFn, ExprColumns, HasArg, SqlFn } from "./index.mjs";
3
+ import { AnyScalarColumn } from "../table.mjs";
4
+ import { Arg, IsArg } from "../query-builders/pre.mjs";
5
+ import { Query, QueryContext } from "../query-builders/query.mjs";
6
+
7
+ //#region src/functions/arithmetic.d.ts
8
+ /**
9
+ * Union of every valid operand for arithmetic operators:
10
+ * a numeric column or SqlFn, a plain number literal, or an `Arg<number>`.
11
+ */
12
+ type NumericOperand = ((AnyScalarColumn | AnySqlFn) & {
13
+ $: {
14
+ PgType: "numeric";
15
+ };
16
+ }) | number | Arg<number>;
17
+ /**
18
+ * Computes the `THasArg` slot for a two-operand arithmetic expression.
19
+ * Resolves to `true` if either operand embeds an `Arg` or is itself an `Arg`.
20
+ */
21
+ type BinaryOpHasArg<TLeft extends NumericOperand, TRight extends NumericOperand> = Or<Or<HasArg<TLeft>, IsArg<TLeft>>, Or<HasArg<TRight>, IsArg<TRight>>>;
22
+ declare class AddFn<TLeft extends NumericOperand, TRight extends NumericOperand> extends SqlFn<ExprColumns<TLeft> | ExprColumns<TRight>, BinaryOpHasArg<TLeft, TRight>, "scalar", "numeric", number> {
23
+ private readonly left;
24
+ private readonly right;
25
+ constructor(left: TLeft, right: TRight);
26
+ toDriverValue(value: number | null): unknown;
27
+ toSQLValue(value: number | null): string;
28
+ fromDriverValue(value: unknown): number | null;
29
+ toQuery(query: Query, ctx?: QueryContext): void;
30
+ }
31
+ /** Returns the sum of two numeric expressions. */
32
+ declare function add<TLeft extends NumericOperand, TRight extends NumericOperand>(left: TLeft, right: TRight): AddFn<TLeft, TRight>;
33
+ declare class SubFn<TLeft extends NumericOperand, TRight extends NumericOperand> extends SqlFn<ExprColumns<TLeft> | ExprColumns<TRight>, BinaryOpHasArg<TLeft, TRight>, "scalar", "numeric", number> {
34
+ private readonly left;
35
+ private readonly right;
36
+ constructor(left: TLeft, right: TRight);
37
+ toDriverValue(value: number | null): unknown;
38
+ toSQLValue(value: number | null): string;
39
+ fromDriverValue(value: unknown): number | null;
40
+ toQuery(query: Query, ctx?: QueryContext): void;
41
+ }
42
+ /** Returns the difference of two numeric expressions. */
43
+ declare function sub<TLeft extends NumericOperand, TRight extends NumericOperand>(left: TLeft, right: TRight): SubFn<TLeft, TRight>;
44
+ declare class MulFn<TLeft extends NumericOperand, TRight extends NumericOperand> extends SqlFn<ExprColumns<TLeft> | ExprColumns<TRight>, BinaryOpHasArg<TLeft, TRight>, "scalar", "numeric", number> {
45
+ private readonly left;
46
+ private readonly right;
47
+ constructor(left: TLeft, right: TRight);
48
+ toDriverValue(value: number | null): unknown;
49
+ toSQLValue(value: number | null): string;
50
+ fromDriverValue(value: unknown): number | null;
51
+ toQuery(query: Query, ctx?: QueryContext): void;
52
+ }
53
+ /** Returns the product of two numeric expressions. */
54
+ declare function mul<TLeft extends NumericOperand, TRight extends NumericOperand>(left: TLeft, right: TRight): MulFn<TLeft, TRight>;
55
+ declare class DivFn<TLeft extends NumericOperand, TRight extends NumericOperand> extends SqlFn<ExprColumns<TLeft> | ExprColumns<TRight>, BinaryOpHasArg<TLeft, TRight>, "scalar", "numeric", number> {
56
+ private readonly left;
57
+ private readonly right;
58
+ constructor(left: TLeft, right: TRight);
59
+ toDriverValue(value: number | null): unknown;
60
+ toSQLValue(value: number | null): string;
61
+ fromDriverValue(value: unknown): number | null;
62
+ toQuery(query: Query, ctx?: QueryContext): void;
63
+ }
64
+ /** Returns the quotient of two numeric expressions. */
65
+ declare function div<TLeft extends NumericOperand, TRight extends NumericOperand>(left: TLeft, right: TRight): DivFn<TLeft, TRight>;
66
+ //#endregion
67
+ export { add, div, mul, sub };