sumak 0.0.4 → 0.0.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.
- package/README.md +255 -5
- package/dist/ast/expression.d.mts +26 -0
- package/dist/ast/expression.mjs +140 -0
- package/dist/ast/nodes.d.mts +298 -0
- package/dist/ast/nodes.mjs +59 -0
- package/dist/ast/transformer.d.mts +10 -0
- package/dist/ast/transformer.mjs +140 -0
- package/dist/ast/typed-expression.d.mts +37 -0
- package/dist/ast/typed-expression.mjs +77 -0
- package/dist/ast/visitor.d.mts +13 -0
- package/dist/ast/visitor.mjs +11 -0
- package/dist/builder/delete.d.mts +18 -0
- package/dist/builder/delete.mjs +94 -0
- package/dist/builder/eb.d.mts +210 -0
- package/dist/builder/eb.mjs +399 -0
- package/dist/builder/expression.d.mts +5 -0
- package/dist/builder/expression.mjs +10 -0
- package/dist/builder/insert.d.mts +40 -0
- package/dist/builder/insert.mjs +146 -0
- package/dist/builder/merge.d.mts +20 -0
- package/dist/builder/merge.mjs +100 -0
- package/dist/builder/raw.d.mts +2 -0
- package/dist/builder/raw.mjs +4 -0
- package/dist/builder/select.d.mts +38 -0
- package/dist/builder/select.mjs +242 -0
- package/dist/builder/typed-delete.d.mts +43 -0
- package/dist/builder/typed-delete.mjs +77 -0
- package/dist/builder/typed-insert.d.mts +74 -0
- package/dist/builder/typed-insert.mjs +136 -0
- package/dist/builder/typed-merge.d.mts +31 -0
- package/dist/builder/typed-merge.mjs +93 -0
- package/dist/builder/typed-select.d.mts +125 -0
- package/dist/builder/typed-select.mjs +217 -0
- package/dist/builder/typed-update.d.mts +55 -0
- package/dist/builder/typed-update.mjs +102 -0
- package/dist/builder/update.d.mts +18 -0
- package/dist/builder/update.mjs +102 -0
- package/dist/dialect/mssql.d.mts +2 -0
- package/dist/dialect/mssql.mjs +9 -0
- package/dist/dialect/mysql.d.mts +2 -0
- package/dist/dialect/mysql.mjs +9 -0
- package/dist/dialect/pg.d.mts +2 -0
- package/dist/dialect/pg.mjs +9 -0
- package/dist/dialect/sqlite.d.mts +2 -0
- package/dist/dialect/sqlite.mjs +9 -0
- package/dist/dialect/types.d.mts +6 -0
- package/dist/dialect/types.mjs +1 -0
- package/dist/errors.d.mts +12 -0
- package/dist/errors.mjs +24 -0
- package/dist/index.d.mts +49 -806
- package/dist/index.mjs +46 -3
- package/dist/mssql.d.mts +2 -2
- package/dist/mssql.mjs +2 -1
- package/dist/mysql.d.mts +2 -2
- package/dist/mysql.mjs +2 -1
- package/dist/pg.d.mts +2 -2
- package/dist/pg.mjs +2 -1
- package/dist/plugin/camel-case.d.mts +11 -0
- package/dist/plugin/camel-case.mjs +16 -0
- package/dist/plugin/hooks.d.mts +72 -0
- package/dist/plugin/hooks.mjs +49 -0
- package/dist/plugin/plugin-manager.d.mts +17 -0
- package/dist/plugin/plugin-manager.mjs +37 -0
- package/dist/plugin/soft-delete.d.mts +27 -0
- package/dist/plugin/soft-delete.mjs +52 -0
- package/dist/plugin/types.d.mts +19 -0
- package/dist/plugin/types.mjs +1 -0
- package/dist/plugin/with-schema.d.mts +21 -0
- package/dist/plugin/with-schema.mjs +53 -0
- package/dist/printer/base.d.mts +48 -0
- package/dist/printer/base.mjs +450 -0
- package/dist/printer/document.d.mts +45 -0
- package/dist/printer/document.mjs +153 -0
- package/dist/printer/formatter.d.mts +5 -0
- package/dist/printer/formatter.mjs +134 -0
- package/dist/printer/mssql.d.mts +10 -0
- package/dist/printer/mssql.mjs +161 -0
- package/dist/printer/mysql.d.mts +8 -0
- package/dist/printer/mysql.mjs +41 -0
- package/dist/printer/pg.d.mts +6 -0
- package/dist/printer/pg.mjs +9 -0
- package/dist/printer/sqlite.d.mts +8 -0
- package/dist/printer/sqlite.mjs +29 -0
- package/dist/printer/types.d.mts +11 -0
- package/dist/printer/types.mjs +1 -0
- package/dist/schema/column.d.mts +52 -0
- package/dist/schema/column.mjs +120 -0
- package/dist/schema/index.d.mts +6 -0
- package/dist/schema/index.mjs +4 -0
- package/dist/schema/table.d.mts +37 -0
- package/dist/schema/table.mjs +7 -0
- package/dist/schema/type-utils.d.mts +46 -0
- package/dist/schema/type-utils.mjs +1 -0
- package/dist/schema/types.d.mts +64 -0
- package/dist/schema/types.mjs +1 -0
- package/dist/schema.d.mts +2 -2
- package/dist/schema.mjs +1 -1
- package/dist/sqlite.d.mts +2 -2
- package/dist/sqlite.mjs +2 -1
- package/dist/sumak.d.mts +98 -0
- package/dist/sumak.mjs +132 -0
- package/dist/types.d.mts +14 -0
- package/dist/types.mjs +1 -0
- package/dist/utils/identifier.d.mts +3 -0
- package/dist/utils/identifier.mjs +14 -0
- package/dist/utils/param.d.mts +2 -0
- package/dist/utils/param.mjs +8 -0
- package/package.json +1 -1
- package/dist/_chunks/base.mjs +0 -1
- package/dist/_chunks/errors.mjs +0 -1
- package/dist/_chunks/index.d.mts +0 -136
- package/dist/_chunks/mssql.d.mts +0 -11
- package/dist/_chunks/mssql.mjs +0 -1
- package/dist/_chunks/mysql.d.mts +0 -9
- package/dist/_chunks/mysql.mjs +0 -1
- package/dist/_chunks/pg.d.mts +0 -7
- package/dist/_chunks/pg.mjs +0 -1
- package/dist/_chunks/schema.mjs +0 -1
- package/dist/_chunks/sqlite.d.mts +0 -9
- package/dist/_chunks/sqlite.mjs +0 -1
- package/dist/_chunks/types.d.mts +0 -338
package/dist/index.d.mts
CHANGED
|
@@ -1,806 +1,49 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
* output type at compile time. At runtime, this is just an ExpressionNode.
|
|
51
|
-
*
|
|
52
|
-
* The `__type` field is a phantom — it never exists at runtime.
|
|
53
|
-
*/
|
|
54
|
-
interface Expression<T> {
|
|
55
|
-
readonly __type: T;
|
|
56
|
-
readonly node: ExpressionNode;
|
|
57
|
-
}
|
|
58
|
-
declare class MergeBuilder {
|
|
59
|
-
private node;
|
|
60
|
-
private paramIndex;
|
|
61
|
-
constructor(node?: MergeNode, paramIndex?: number);
|
|
62
|
-
into(table: string | TableRefNode): MergeBuilder;
|
|
63
|
-
using(source: string | TableRefNode | SubqueryNode, alias: string): MergeBuilder;
|
|
64
|
-
on(expr: ExpressionNode): MergeBuilder;
|
|
65
|
-
whenMatched(action: MergeWhenMatched): MergeBuilder;
|
|
66
|
-
whenNotMatched(action: MergeWhenNotMatched): MergeBuilder;
|
|
67
|
-
whenMatchedUpdate(set: {
|
|
68
|
-
column: string;
|
|
69
|
-
value: ExpressionNode;
|
|
70
|
-
}[], condition?: ExpressionNode): MergeBuilder;
|
|
71
|
-
whenMatchedDelete(condition?: ExpressionNode): MergeBuilder;
|
|
72
|
-
whenNotMatchedInsert(columns: string[], values: ExpressionNode[], condition?: ExpressionNode): MergeBuilder;
|
|
73
|
-
with(name: string, query: SelectNode, recursive?: boolean): MergeBuilder;
|
|
74
|
-
build(): MergeNode;
|
|
75
|
-
}
|
|
76
|
-
declare function merge(target: string | TableRefNode): MergeBuilder;
|
|
77
|
-
declare class SelectBuilder {
|
|
78
|
-
private node;
|
|
79
|
-
constructor(node?: SelectNode);
|
|
80
|
-
columns(...cols: (string | ExpressionNode)[]): SelectBuilder;
|
|
81
|
-
allColumns(): SelectBuilder;
|
|
82
|
-
distinct(): SelectBuilder;
|
|
83
|
-
from(table: string | TableRefNode | SubqueryNode, alias?: string): SelectBuilder;
|
|
84
|
-
where(expr: ExpressionNode): SelectBuilder;
|
|
85
|
-
join(type: JoinType, table: string | TableRefNode, on?: ExpressionNode, alias?: string): SelectBuilder;
|
|
86
|
-
innerJoin(table: string | TableRefNode, on: ExpressionNode, alias?: string): SelectBuilder;
|
|
87
|
-
leftJoin(table: string | TableRefNode, on: ExpressionNode, alias?: string): SelectBuilder;
|
|
88
|
-
rightJoin(table: string | TableRefNode, on: ExpressionNode, alias?: string): SelectBuilder;
|
|
89
|
-
groupBy(...exprs: (string | ExpressionNode)[]): SelectBuilder;
|
|
90
|
-
having(expr: ExpressionNode): SelectBuilder;
|
|
91
|
-
orderBy(expr: string | ExpressionNode, direction?: OrderDirection, nulls?: "FIRST" | "LAST"): SelectBuilder;
|
|
92
|
-
limit(expr: ExpressionNode): SelectBuilder;
|
|
93
|
-
offset(expr: ExpressionNode): SelectBuilder;
|
|
94
|
-
forSystemTime(clause: TemporalClause): SelectBuilder;
|
|
95
|
-
forUpdate(): SelectBuilder;
|
|
96
|
-
with(name: string, query: SelectNode, recursive?: boolean): SelectBuilder;
|
|
97
|
-
union(query: SelectNode): SelectBuilder;
|
|
98
|
-
unionAll(query: SelectNode): SelectBuilder;
|
|
99
|
-
intersect(query: SelectNode): SelectBuilder;
|
|
100
|
-
except(query: SelectNode): SelectBuilder;
|
|
101
|
-
private setOp;
|
|
102
|
-
build(): SelectNode;
|
|
103
|
-
}
|
|
104
|
-
declare function select(...cols: (string | ExpressionNode)[]): SelectBuilder;
|
|
105
|
-
declare class InsertBuilder {
|
|
106
|
-
private node;
|
|
107
|
-
private paramIndex;
|
|
108
|
-
constructor(node?: InsertNode, paramIndex?: number);
|
|
109
|
-
into(table: string | TableRefNode): InsertBuilder;
|
|
110
|
-
columns(...cols: string[]): InsertBuilder;
|
|
111
|
-
values(...vals: unknown[]): InsertBuilder;
|
|
112
|
-
returning(...exprs: ExpressionNode[]): InsertBuilder;
|
|
113
|
-
onConflictDoNothing(...columns: string[]): InsertBuilder;
|
|
114
|
-
onConflictDoUpdate(columns: string[], set: {
|
|
115
|
-
column: string;
|
|
116
|
-
value: ExpressionNode;
|
|
117
|
-
}[], where?: ExpressionNode): InsertBuilder;
|
|
118
|
-
with(name: string, query: SelectNode, recursive?: boolean): InsertBuilder;
|
|
119
|
-
build(): InsertNode;
|
|
120
|
-
}
|
|
121
|
-
declare function insert(table: string | TableRefNode): InsertBuilder;
|
|
122
|
-
declare class UpdateBuilder {
|
|
123
|
-
private node;
|
|
124
|
-
constructor(node?: UpdateNode);
|
|
125
|
-
table(table: string | TableRefNode): UpdateBuilder;
|
|
126
|
-
set(column: string, value: ExpressionNode): UpdateBuilder;
|
|
127
|
-
where(expr: ExpressionNode): UpdateBuilder;
|
|
128
|
-
from(table: string | TableRefNode): UpdateBuilder;
|
|
129
|
-
returning(...exprs: ExpressionNode[]): UpdateBuilder;
|
|
130
|
-
with(name: string, query: SelectNode, recursive?: boolean): UpdateBuilder;
|
|
131
|
-
build(): UpdateNode;
|
|
132
|
-
}
|
|
133
|
-
declare function update(table: string | TableRefNode): UpdateBuilder;
|
|
134
|
-
declare class DeleteBuilder {
|
|
135
|
-
private node;
|
|
136
|
-
constructor(node?: DeleteNode);
|
|
137
|
-
from(table: string | TableRefNode): DeleteBuilder;
|
|
138
|
-
where(expr: ExpressionNode): DeleteBuilder;
|
|
139
|
-
returning(...exprs: ExpressionNode[]): DeleteBuilder;
|
|
140
|
-
with(name: string, query: SelectNode, recursive?: boolean): DeleteBuilder;
|
|
141
|
-
build(): DeleteNode;
|
|
142
|
-
}
|
|
143
|
-
declare function deleteFrom(table: string | TableRefNode): DeleteBuilder;
|
|
144
|
-
interface FormatOptions {
|
|
145
|
-
indent?: string;
|
|
146
|
-
uppercase?: boolean;
|
|
147
|
-
}
|
|
148
|
-
declare function formatSQL(sql: string, options?: FormatOptions): string;
|
|
149
|
-
/**
|
|
150
|
-
* Wadler-style pretty printer document algebra.
|
|
151
|
-
*
|
|
152
|
-
* Based on "A prettier printer" (Wadler 1998) and "Strictly Pretty" (Lindig 2000).
|
|
153
|
-
* Used to format SQL output with width-sensitive line breaking.
|
|
154
|
-
*/
|
|
155
|
-
type Doc = {
|
|
156
|
-
tag: "empty";
|
|
157
|
-
} | {
|
|
158
|
-
tag: "text";
|
|
159
|
-
text: string;
|
|
160
|
-
} | {
|
|
161
|
-
tag: "line";
|
|
162
|
-
} | {
|
|
163
|
-
tag: "nest";
|
|
164
|
-
indent: number;
|
|
165
|
-
doc: Doc;
|
|
166
|
-
} | {
|
|
167
|
-
tag: "group";
|
|
168
|
-
doc: Doc;
|
|
169
|
-
} | {
|
|
170
|
-
tag: "concat";
|
|
171
|
-
docs: Doc[];
|
|
172
|
-
};
|
|
173
|
-
declare function empty(): Doc;
|
|
174
|
-
declare function text(s: string): Doc;
|
|
175
|
-
/** A line break. In flat mode, renders as a single space. */
|
|
176
|
-
declare function line(): Doc;
|
|
177
|
-
/** Increase indentation for the nested document. */
|
|
178
|
-
declare function nest(indent: number, doc: Doc): Doc;
|
|
179
|
-
/** Try to render flat; if too wide, break lines. */
|
|
180
|
-
declare function group(doc: Doc): Doc;
|
|
181
|
-
/** Concatenate documents. */
|
|
182
|
-
declare function concat(...docs: Doc[]): Doc;
|
|
183
|
-
/** Join documents with a separator. */
|
|
184
|
-
declare function join(sep: Doc, docs: Doc[]): Doc;
|
|
185
|
-
/** Convenience: text + line */
|
|
186
|
-
declare function textLine(s: string): Doc;
|
|
187
|
-
/**
|
|
188
|
-
* Render a document to a string.
|
|
189
|
-
*
|
|
190
|
-
* Uses Wadler/Lindig's algorithm: maintain a stack of (indent, mode, doc) triples.
|
|
191
|
-
* mode = "flat" (try single line) or "break" (use line breaks).
|
|
192
|
-
*/
|
|
193
|
-
declare function render(doc: Doc, width?: number): string;
|
|
194
|
-
declare function quoteIdentifier(name: string, dialect: SQLDialect): string;
|
|
195
|
-
declare function quoteTableRef(name: string, dialect: SQLDialect, schema?: string): string;
|
|
196
|
-
declare function formatParam(index: number, dialect: SQLDialect): string;
|
|
197
|
-
/**
|
|
198
|
-
* A typed column reference that exposes comparison methods.
|
|
199
|
-
*
|
|
200
|
-
* ```ts
|
|
201
|
-
* // users.id.eq(42) → ("id" = $1) with param [42]
|
|
202
|
-
* // users.name.like("%ali%") → ("name" LIKE '%ali%')
|
|
203
|
-
* ```
|
|
204
|
-
*/
|
|
205
|
-
declare class Col<T> {
|
|
206
|
-
/** @internal */
|
|
207
|
-
readonly _node: ExpressionNode;
|
|
208
|
-
readonly _type: T;
|
|
209
|
-
constructor(column: string, table?: string);
|
|
210
|
-
/** = */
|
|
211
|
-
eq(value: T): Expression<boolean>;
|
|
212
|
-
/** != */
|
|
213
|
-
neq(value: T): Expression<boolean>;
|
|
214
|
-
/** > */
|
|
215
|
-
gt(value: T): Expression<boolean>;
|
|
216
|
-
/** >= */
|
|
217
|
-
gte(value: T): Expression<boolean>;
|
|
218
|
-
/** < */
|
|
219
|
-
lt(value: T): Expression<boolean>;
|
|
220
|
-
/** <= */
|
|
221
|
-
lte(value: T): Expression<boolean>;
|
|
222
|
-
/** LIKE (string columns only) */
|
|
223
|
-
like(this: Col<string>, pattern: string): Expression<boolean>;
|
|
224
|
-
/** IN (value1, value2, ...) */
|
|
225
|
-
in(values: T[]): Expression<boolean>;
|
|
226
|
-
/** NOT IN */
|
|
227
|
-
notIn(values: T[]): Expression<boolean>;
|
|
228
|
-
/** IS NULL */
|
|
229
|
-
isNull(): Expression<boolean>;
|
|
230
|
-
/** IS NOT NULL */
|
|
231
|
-
isNotNull(): Expression<boolean>;
|
|
232
|
-
/** BETWEEN low AND high */
|
|
233
|
-
between(low: T, high: T): Expression<boolean>;
|
|
234
|
-
/** Compare with another column: col1.eqCol(col2) */
|
|
235
|
-
eqCol(other: Col<T>): Expression<boolean>;
|
|
236
|
-
/** As raw Expression<T> for advanced use */
|
|
237
|
-
toExpr(): Expression<T>;
|
|
238
|
-
}
|
|
239
|
-
declare function resetParams(): void;
|
|
240
|
-
/**
|
|
241
|
-
* Create typed column proxies for a table's columns.
|
|
242
|
-
*
|
|
243
|
-
* Type: { id: Col<number>, name: Col<string>, ... }
|
|
244
|
-
*/
|
|
245
|
-
type ColumnProxies<DB, TB extends keyof DB> = { [K in keyof DB[TB] & string]: Col<SelectType<DB[TB][K]>> };
|
|
246
|
-
/**
|
|
247
|
-
* Expression builder callback type.
|
|
248
|
-
*
|
|
249
|
-
* ```ts
|
|
250
|
-
* .where(({ id, name }) => id.eq(42))
|
|
251
|
-
* ```
|
|
252
|
-
*/
|
|
253
|
-
type WhereCallback<DB, TB extends keyof DB> = (cols: ColumnProxies<DB, TB>) => Expression<boolean>;
|
|
254
|
-
/** AND two expressions */
|
|
255
|
-
declare function and(left: Expression<boolean>, right: Expression<boolean>): Expression<boolean>;
|
|
256
|
-
/** OR two expressions */
|
|
257
|
-
declare function or(left: Expression<boolean>, right: Expression<boolean>): Expression<boolean>;
|
|
258
|
-
/** Raw literal value as expression */
|
|
259
|
-
declare function val<T extends string | number | boolean | null>(value: T): Expression<T>;
|
|
260
|
-
/** SQL function call */
|
|
261
|
-
declare function sqlFn(name: string, ...args: Expression<any>[]): Expression<any>;
|
|
262
|
-
/** COUNT(*) */
|
|
263
|
-
declare function count(): Expression<number>;
|
|
264
|
-
/** SUM(expr) */
|
|
265
|
-
declare function sum(expr: Expression<number>): Expression<number>;
|
|
266
|
-
/** AVG(expr) */
|
|
267
|
-
declare function avg(expr: Expression<number>): Expression<number>;
|
|
268
|
-
/** MIN(expr) */
|
|
269
|
-
declare function min<T>(expr: Expression<T>): Expression<T>;
|
|
270
|
-
/** MAX(expr) */
|
|
271
|
-
declare function max<T>(expr: Expression<T>): Expression<T>;
|
|
272
|
-
/** COALESCE(expr, fallback) */
|
|
273
|
-
declare function coalesce<T>(expr: Expression<T | null>, fallback: Expression<T>): Expression<T>;
|
|
274
|
-
/** NOT expr */
|
|
275
|
-
declare function not(expr: Expression<boolean>): Expression<boolean>;
|
|
276
|
-
/** EXISTS (subquery) */
|
|
277
|
-
declare function exists(query: SelectNode): Expression<boolean>;
|
|
278
|
-
/** NOT EXISTS (subquery) */
|
|
279
|
-
declare function notExists(query: SelectNode): Expression<boolean>;
|
|
280
|
-
/** CAST(expr AS type) */
|
|
281
|
-
declare function cast<T>(expr: Expression<any>, dataType: string): Expression<T>;
|
|
282
|
-
/**
|
|
283
|
-
* JSON access operator: expr->path, expr->>path, etc.
|
|
284
|
-
*
|
|
285
|
-
* ```ts
|
|
286
|
-
* jsonRef(cols.data, "name", "->>") // data->>'name'
|
|
287
|
-
* ```
|
|
288
|
-
*/
|
|
289
|
-
declare function jsonRef<T = unknown>(expr: Expression<any>, path: string, operator?: "->" | "->>" | "#>" | "#>>"): Expression<T>;
|
|
290
|
-
/**
|
|
291
|
-
* Full-text search expression.
|
|
292
|
-
*
|
|
293
|
-
* Dialect-aware: PG uses tsvector/tsquery, MySQL uses MATCH/AGAINST,
|
|
294
|
-
* SQLite uses FTS5 MATCH, MSSQL uses CONTAINS/FREETEXT.
|
|
295
|
-
*
|
|
296
|
-
* ```ts
|
|
297
|
-
* // PostgreSQL: to_tsvector("name") @@ to_tsquery($1)
|
|
298
|
-
* .where(() => textSearch([cols.name], val("alice")))
|
|
299
|
-
*
|
|
300
|
-
* // MySQL: MATCH(`name`) AGAINST(? IN BOOLEAN MODE)
|
|
301
|
-
* .where(() => textSearch([cols.name], val("alice"), { mode: "boolean" }))
|
|
302
|
-
* ```
|
|
303
|
-
*/
|
|
304
|
-
declare function textSearch(columns: Expression<any>[], query: Expression<any>, options?: {
|
|
305
|
-
mode?: FullTextSearchMode;
|
|
306
|
-
language?: string;
|
|
307
|
-
}): Expression<boolean>;
|
|
308
|
-
/**
|
|
309
|
-
* CASE expression builder.
|
|
310
|
-
*
|
|
311
|
-
* ```ts
|
|
312
|
-
* case_()
|
|
313
|
-
* .when(cols.status.eq("active"), val(1))
|
|
314
|
-
* .when(cols.status.eq("inactive"), val(0))
|
|
315
|
-
* .else_(val(-1))
|
|
316
|
-
* .end()
|
|
317
|
-
* ```
|
|
318
|
-
*/
|
|
319
|
-
declare function case_(operand?: Expression<any>): CaseBuilder<never>;
|
|
320
|
-
declare class CaseBuilder<T> {
|
|
321
|
-
/** @internal */
|
|
322
|
-
private _operand;
|
|
323
|
-
/** @internal */
|
|
324
|
-
private _whens;
|
|
325
|
-
/** @internal */
|
|
326
|
-
private _else;
|
|
327
|
-
/** @internal */
|
|
328
|
-
constructor(operand: ExpressionNode | undefined, whens: {
|
|
329
|
-
condition: ExpressionNode;
|
|
330
|
-
result: ExpressionNode;
|
|
331
|
-
}[], else_?: ExpressionNode);
|
|
332
|
-
when<R>(condition: Expression<boolean>, result: Expression<R>): CaseBuilder<T | R>;
|
|
333
|
-
else_<R>(result: Expression<R>): CaseBuilder<T | R>;
|
|
334
|
-
end(): Expression<T>;
|
|
335
|
-
}
|
|
336
|
-
/**
|
|
337
|
-
* Type-safe DELETE query builder.
|
|
338
|
-
*/
|
|
339
|
-
declare class TypedDeleteBuilder<DB, TB extends keyof DB> {
|
|
340
|
-
/** @internal */
|
|
341
|
-
readonly _builder: DeleteBuilder;
|
|
342
|
-
constructor(table: TB & string);
|
|
343
|
-
/** @internal */
|
|
344
|
-
private _with;
|
|
345
|
-
/**
|
|
346
|
-
* WHERE — callback or raw Expression.
|
|
347
|
-
*/
|
|
348
|
-
where(exprOrCallback: Expression<boolean> | WhereCallback<DB, TB>): TypedDeleteBuilder<DB, TB>;
|
|
349
|
-
/**
|
|
350
|
-
* RETURNING specific columns.
|
|
351
|
-
*/
|
|
352
|
-
returning<K extends keyof DB[TB] & string>(...cols: K[]): TypedDeleteReturningBuilder<DB, TB, Pick<SelectRow<DB, TB>, K>>;
|
|
353
|
-
/**
|
|
354
|
-
* RETURNING all columns.
|
|
355
|
-
*/
|
|
356
|
-
returningAll(): TypedDeleteReturningBuilder<DB, TB, SelectRow<DB, TB>>;
|
|
357
|
-
/** WITH (CTE) */
|
|
358
|
-
with(name: string, query: SelectNode, recursive?: boolean): TypedDeleteBuilder<DB, TB>;
|
|
359
|
-
build(): DeleteNode;
|
|
360
|
-
compile(printer: Printer): CompiledQuery;
|
|
361
|
-
}
|
|
362
|
-
declare class TypedDeleteReturningBuilder<DB, _TB extends keyof DB, _R> {
|
|
363
|
-
/** @internal */
|
|
364
|
-
readonly _builder: DeleteBuilder;
|
|
365
|
-
constructor(builder: DeleteBuilder);
|
|
366
|
-
build(): DeleteNode;
|
|
367
|
-
compile(printer: Printer): CompiledQuery;
|
|
368
|
-
}
|
|
369
|
-
/**
|
|
370
|
-
* Type-safe INSERT query builder.
|
|
371
|
-
*/
|
|
372
|
-
declare class TypedInsertBuilder<DB, TB extends keyof DB> {
|
|
373
|
-
/** @internal */
|
|
374
|
-
readonly _builder: InsertBuilder;
|
|
375
|
-
private _paramIdx;
|
|
376
|
-
constructor(table: TB & string, paramIdx?: number);
|
|
377
|
-
/** @internal */
|
|
378
|
-
private _withBuilder;
|
|
379
|
-
/**
|
|
380
|
-
* Insert a single row. Columns/values inferred from Insertable<DB[TB]>.
|
|
381
|
-
*/
|
|
382
|
-
values(row: Insertable<DB[TB]>): TypedInsertBuilder<DB, TB>;
|
|
383
|
-
/**
|
|
384
|
-
* RETURNING specific columns.
|
|
385
|
-
*/
|
|
386
|
-
returning<K extends keyof DB[TB] & string>(...cols: K[]): TypedInsertReturningBuilder<DB, TB, Pick<SelectRow<DB, TB>, K>>;
|
|
387
|
-
/**
|
|
388
|
-
* RETURNING all columns.
|
|
389
|
-
*/
|
|
390
|
-
returningAll(): TypedInsertReturningBuilder<DB, TB, SelectRow<DB, TB>>;
|
|
391
|
-
/**
|
|
392
|
-
* ON CONFLICT DO NOTHING.
|
|
393
|
-
*/
|
|
394
|
-
onConflictDoNothing(...columns: (keyof DB[TB] & string)[]): TypedInsertBuilder<DB, TB>;
|
|
395
|
-
/**
|
|
396
|
-
* ON CONFLICT DO UPDATE.
|
|
397
|
-
*/
|
|
398
|
-
onConflictDoUpdate(columns: (keyof DB[TB] & string)[], set: {
|
|
399
|
-
column: keyof DB[TB] & string;
|
|
400
|
-
value: Expression<any>;
|
|
401
|
-
}[]): TypedInsertBuilder<DB, TB>;
|
|
402
|
-
/** WITH (CTE) */
|
|
403
|
-
with(name: string, query: SelectNode, recursive?: boolean): TypedInsertBuilder<DB, TB>;
|
|
404
|
-
build(): InsertNode;
|
|
405
|
-
compile(printer: Printer): CompiledQuery;
|
|
406
|
-
}
|
|
407
|
-
declare class TypedInsertReturningBuilder<DB, _TB extends keyof DB, _R> {
|
|
408
|
-
/** @internal */
|
|
409
|
-
readonly _builder: InsertBuilder;
|
|
410
|
-
constructor(builder: InsertBuilder);
|
|
411
|
-
build(): InsertNode;
|
|
412
|
-
compile(printer: Printer): CompiledQuery;
|
|
413
|
-
}
|
|
414
|
-
type MergeProxies<DB, Target extends keyof DB, Source extends keyof DB> = {
|
|
415
|
-
target: { [K in keyof DB[Target] & string]: Col<any> };
|
|
416
|
-
source: { [K in keyof DB[Source] & string]: Col<any> };
|
|
417
|
-
};
|
|
418
|
-
declare class TypedMergeBuilder<DB, Target extends keyof DB, Source extends keyof DB> {
|
|
419
|
-
/** @internal */
|
|
420
|
-
readonly _builder: MergeBuilder;
|
|
421
|
-
private _targetTable;
|
|
422
|
-
private _sourceAlias;
|
|
423
|
-
private _paramIdx;
|
|
424
|
-
constructor(targetTable: Target & string, sourceTable: Source & string, sourceAlias: string, on: Expression<boolean>, paramIdx?: number);
|
|
425
|
-
/** @internal */
|
|
426
|
-
private _with;
|
|
427
|
-
whenMatchedThenUpdate(values: Updateable<DB[Target]>, condition?: (proxies: MergeProxies<DB, Target, Source>) => Expression<boolean>): TypedMergeBuilder<DB, Target, Source>;
|
|
428
|
-
whenMatchedThenDelete(condition?: (proxies: MergeProxies<DB, Target, Source>) => Expression<boolean>): TypedMergeBuilder<DB, Target, Source>;
|
|
429
|
-
whenNotMatchedThenInsert(row: Insertable<DB[Target]>, condition?: (proxies: MergeProxies<DB, Target, Source>) => Expression<boolean>): TypedMergeBuilder<DB, Target, Source>;
|
|
430
|
-
with(name: string, query: SelectNode, recursive?: boolean): TypedMergeBuilder<DB, Target, Source>;
|
|
431
|
-
build(): MergeNode;
|
|
432
|
-
compile(printer: Printer): CompiledQuery;
|
|
433
|
-
}
|
|
434
|
-
/**
|
|
435
|
-
* Type-safe SELECT query builder.
|
|
436
|
-
*
|
|
437
|
-
* DB = full database schema
|
|
438
|
-
* TB = tables currently in scope (FROM + JOINs)
|
|
439
|
-
* O = output row type
|
|
440
|
-
*/
|
|
441
|
-
declare class TypedSelectBuilder<DB, TB extends keyof DB, O> {
|
|
442
|
-
/** @internal */
|
|
443
|
-
readonly _builder: SelectBuilder;
|
|
444
|
-
private _table;
|
|
445
|
-
constructor(builder: SelectBuilder, table?: string);
|
|
446
|
-
/** Select specific columns. Narrows O. */
|
|
447
|
-
select<K extends keyof O & string>(...cols: K[]): TypedSelectBuilder<DB, TB, Pick<O, K>>;
|
|
448
|
-
/** Select all columns. */
|
|
449
|
-
selectAll(): TypedSelectBuilder<DB, TB, O>;
|
|
450
|
-
/** Select with Expression<T> for computed columns. */
|
|
451
|
-
selectExpr<Alias extends string, T>(expr: Expression<T>, alias: Alias): TypedSelectBuilder<DB, TB, O & Record<Alias, T>>;
|
|
452
|
-
/** DISTINCT */
|
|
453
|
-
distinct(): TypedSelectBuilder<DB, TB, O>;
|
|
454
|
-
/**
|
|
455
|
-
* WHERE — accepts callback with typed column proxies OR raw Expression.
|
|
456
|
-
*
|
|
457
|
-
* ```ts
|
|
458
|
-
* // Callback style (recommended)
|
|
459
|
-
* .where(({ id, name }) => id.eq(42))
|
|
460
|
-
* .where(({ age }) => age.between(18, 65))
|
|
461
|
-
*
|
|
462
|
-
* // Raw Expression style
|
|
463
|
-
* .where(typedEq(typedCol<number>("id"), typedParam(0, 42)))
|
|
464
|
-
* ```
|
|
465
|
-
*/
|
|
466
|
-
where(exprOrCallback: Expression<boolean> | WhereCallback<DB, TB>): TypedSelectBuilder<DB, TB, O>;
|
|
467
|
-
/**
|
|
468
|
-
* INNER JOIN.
|
|
469
|
-
*
|
|
470
|
-
* ```ts
|
|
471
|
-
* .innerJoin("posts", ({ users, posts }) => users.id.eqCol(posts.userId))
|
|
472
|
-
* ```
|
|
473
|
-
*/
|
|
474
|
-
innerJoin<T extends keyof DB & string>(table: T, onOrCallback: Expression<boolean> | ((cols: JoinProxies<DB, TB, T>) => Expression<boolean>)): TypedSelectBuilder<DB, TB | T, O & SelectRow<DB, T>>;
|
|
475
|
-
/**
|
|
476
|
-
* LEFT JOIN — joined columns become nullable.
|
|
477
|
-
*/
|
|
478
|
-
leftJoin<T extends keyof DB & string>(table: T, onOrCallback: Expression<boolean> | ((cols: JoinProxies<DB, TB, T>) => Expression<boolean>)): TypedSelectBuilder<DB, TB | T, O & Nullable<SelectRow<DB, T>>>;
|
|
479
|
-
/** RIGHT JOIN */
|
|
480
|
-
rightJoin<T extends keyof DB & string>(table: T, onOrCallback: Expression<boolean> | ((cols: JoinProxies<DB, TB, T>) => Expression<boolean>)): TypedSelectBuilder<DB, TB | T, Nullable<O> & SelectRow<DB, T>>;
|
|
481
|
-
/** GROUP BY */
|
|
482
|
-
groupBy(...cols: (keyof O & string)[]): TypedSelectBuilder<DB, TB, O>;
|
|
483
|
-
/** HAVING */
|
|
484
|
-
having(exprOrCallback: Expression<boolean> | WhereCallback<DB, TB>): TypedSelectBuilder<DB, TB, O>;
|
|
485
|
-
/** ORDER BY */
|
|
486
|
-
orderBy(col: keyof O & string, direction?: OrderDirection, nulls?: "FIRST" | "LAST"): TypedSelectBuilder<DB, TB, O>;
|
|
487
|
-
/** LIMIT */
|
|
488
|
-
limit(n: number): TypedSelectBuilder<DB, TB, O>;
|
|
489
|
-
/** OFFSET */
|
|
490
|
-
offset(n: number): TypedSelectBuilder<DB, TB, O>;
|
|
491
|
-
/** FOR SYSTEM_TIME (SQL:2011 temporal query) */
|
|
492
|
-
forSystemTime(clause: TemporalClause): TypedSelectBuilder<DB, TB, O>;
|
|
493
|
-
/** FOR UPDATE */
|
|
494
|
-
forUpdate(): TypedSelectBuilder<DB, TB, O>;
|
|
495
|
-
/** WITH (CTE) */
|
|
496
|
-
with(name: string, query: SelectNode, recursive?: boolean): TypedSelectBuilder<DB, TB, O>;
|
|
497
|
-
/** UNION */
|
|
498
|
-
union(query: TypedSelectBuilder<DB, any, O>): TypedSelectBuilder<DB, TB, O>;
|
|
499
|
-
/** UNION ALL */
|
|
500
|
-
unionAll(query: TypedSelectBuilder<DB, any, O>): TypedSelectBuilder<DB, TB, O>;
|
|
501
|
-
/** INTERSECT */
|
|
502
|
-
intersect(query: TypedSelectBuilder<DB, any, O>): TypedSelectBuilder<DB, TB, O>;
|
|
503
|
-
/** EXCEPT */
|
|
504
|
-
except(query: TypedSelectBuilder<DB, any, O>): TypedSelectBuilder<DB, TB, O>;
|
|
505
|
-
/** FULL JOIN — both sides become nullable. */
|
|
506
|
-
fullJoin<T extends keyof DB & string>(table: T, onOrCallback: Expression<boolean> | ((cols: JoinProxies<DB, TB, T>) => Expression<boolean>)): TypedSelectBuilder<DB, TB | T, Nullable<O> & Nullable<SelectRow<DB, T>>>;
|
|
507
|
-
/** CROSS JOIN — cartesian product. */
|
|
508
|
-
crossJoin<T extends keyof DB & string>(table: T): TypedSelectBuilder<DB, TB | T, O & SelectRow<DB, T>>;
|
|
509
|
-
/** Build the AST node. */
|
|
510
|
-
build(): SelectNode;
|
|
511
|
-
/** Compile to SQL. */
|
|
512
|
-
compile(printer: Printer): CompiledQuery;
|
|
513
|
-
}
|
|
514
|
-
type JoinProxies<DB, TB extends keyof DB, T extends keyof DB> = { [Table in (TB | T) & string]: ColumnProxies<DB, Table> };
|
|
515
|
-
/**
|
|
516
|
-
* Type-safe UPDATE query builder.
|
|
517
|
-
*/
|
|
518
|
-
declare class TypedUpdateBuilder<DB, TB extends keyof DB> {
|
|
519
|
-
/** @internal */
|
|
520
|
-
readonly _builder: UpdateBuilder;
|
|
521
|
-
private _paramIdx;
|
|
522
|
-
constructor(table: TB & string, paramIdx?: number);
|
|
523
|
-
/** @internal */
|
|
524
|
-
private _with;
|
|
525
|
-
/**
|
|
526
|
-
* SET columns from an object. All keys optional (Updateable).
|
|
527
|
-
*/
|
|
528
|
-
set(values: Updateable<DB[TB]>): TypedUpdateBuilder<DB, TB>;
|
|
529
|
-
/**
|
|
530
|
-
* SET a single column with an expression.
|
|
531
|
-
*/
|
|
532
|
-
setExpr(column: keyof DB[TB] & string, value: Expression<any>): TypedUpdateBuilder<DB, TB>;
|
|
533
|
-
/**
|
|
534
|
-
* WHERE — callback or raw Expression.
|
|
535
|
-
*/
|
|
536
|
-
where(exprOrCallback: Expression<boolean> | WhereCallback<DB, TB>): TypedUpdateBuilder<DB, TB>;
|
|
537
|
-
private get _table();
|
|
538
|
-
/**
|
|
539
|
-
* RETURNING specific columns.
|
|
540
|
-
*/
|
|
541
|
-
returning<K extends keyof DB[TB] & string>(...cols: K[]): TypedUpdateReturningBuilder<DB, TB, Pick<SelectRow<DB, TB>, K>>;
|
|
542
|
-
/**
|
|
543
|
-
* RETURNING all columns.
|
|
544
|
-
*/
|
|
545
|
-
returningAll(): TypedUpdateReturningBuilder<DB, TB, SelectRow<DB, TB>>;
|
|
546
|
-
/** FROM clause (for UPDATE ... FROM ... WHERE joins). */
|
|
547
|
-
from<T extends keyof DB & string>(table: T): TypedUpdateBuilder<DB, TB>;
|
|
548
|
-
/** WITH (CTE) */
|
|
549
|
-
with(name: string, query: SelectNode, recursive?: boolean): TypedUpdateBuilder<DB, TB>;
|
|
550
|
-
build(): UpdateNode;
|
|
551
|
-
compile(printer: Printer): CompiledQuery;
|
|
552
|
-
}
|
|
553
|
-
declare class TypedUpdateReturningBuilder<DB, _TB extends keyof DB, _R> {
|
|
554
|
-
/** @internal */
|
|
555
|
-
readonly _builder: UpdateBuilder;
|
|
556
|
-
constructor(builder: UpdateBuilder);
|
|
557
|
-
build(): UpdateNode;
|
|
558
|
-
compile(printer: Printer): CompiledQuery;
|
|
559
|
-
}
|
|
560
|
-
/**
|
|
561
|
-
* Hook context passed to hook handlers.
|
|
562
|
-
*/
|
|
563
|
-
interface HookContext<T extends ASTNode = ASTNode> {
|
|
564
|
-
/** The AST node being processed */
|
|
565
|
-
node: T;
|
|
566
|
-
/** Table name (if applicable) */
|
|
567
|
-
table?: string;
|
|
568
|
-
/** Compiled query (only in after hooks) */
|
|
569
|
-
query?: CompiledQuery;
|
|
570
|
-
}
|
|
571
|
-
/**
|
|
572
|
-
* All available hook points in the query lifecycle.
|
|
573
|
-
*/
|
|
574
|
-
interface SumakHooks {
|
|
575
|
-
/** Fires before any query is compiled. Can modify the AST. */
|
|
576
|
-
"query:before": (ctx: HookContext) => ASTNode | void;
|
|
577
|
-
/** Fires after a query is compiled to SQL. Can modify the compiled query. */
|
|
578
|
-
"query:after": (ctx: HookContext & {
|
|
579
|
-
query: CompiledQuery;
|
|
580
|
-
}) => CompiledQuery | void;
|
|
581
|
-
/** Fires before SELECT compilation. Can modify the SelectNode. */
|
|
582
|
-
"select:before": (ctx: HookContext<SelectNode>) => SelectNode | void;
|
|
583
|
-
/** Fires before INSERT compilation. Can modify the InsertNode. */
|
|
584
|
-
"insert:before": (ctx: HookContext<InsertNode>) => InsertNode | void;
|
|
585
|
-
/** Fires before UPDATE compilation. Can modify the UpdateNode. */
|
|
586
|
-
"update:before": (ctx: HookContext<UpdateNode>) => UpdateNode | void;
|
|
587
|
-
/** Fires before DELETE compilation. Can modify the DeleteNode. */
|
|
588
|
-
"delete:before": (ctx: HookContext<DeleteNode>) => DeleteNode | void;
|
|
589
|
-
/** Transform result rows. */
|
|
590
|
-
"result:transform": (rows: Record<string, unknown>[]) => Record<string, unknown>[];
|
|
591
|
-
}
|
|
592
|
-
type HookName = keyof SumakHooks;
|
|
593
|
-
/**
|
|
594
|
-
* Hookable system — register and execute hooks.
|
|
595
|
-
*
|
|
596
|
-
* ```ts
|
|
597
|
-
* const hooks = new Hookable();
|
|
598
|
-
* hooks.hook("select:before", (ctx) => {
|
|
599
|
-
* // Add soft delete filter
|
|
600
|
-
* return { ...ctx.node, where: addSoftDelete(ctx.node.where) };
|
|
601
|
-
* });
|
|
602
|
-
* ```
|
|
603
|
-
*/
|
|
604
|
-
declare class Hookable {
|
|
605
|
-
private _hooks;
|
|
606
|
-
/**
|
|
607
|
-
* Register a hook handler.
|
|
608
|
-
* Returns an unregister function.
|
|
609
|
-
*/
|
|
610
|
-
hook<K extends HookName>(name: K, handler: SumakHooks[K]): () => void;
|
|
611
|
-
/**
|
|
612
|
-
* Execute all handlers for a hook.
|
|
613
|
-
* For AST hooks: each handler can return a modified node, which feeds into the next.
|
|
614
|
-
* For result hooks: each handler transforms the rows.
|
|
615
|
-
*/
|
|
616
|
-
callHook<K extends HookName>(name: K, ...args: Parameters<SumakHooks[K]>): ReturnType<SumakHooks[K]> | undefined;
|
|
617
|
-
/**
|
|
618
|
-
* Check if any handlers are registered for a hook.
|
|
619
|
-
*/
|
|
620
|
-
hasHook(name: HookName): boolean;
|
|
621
|
-
/**
|
|
622
|
-
* Remove all handlers for a hook.
|
|
623
|
-
*/
|
|
624
|
-
removeHook(name: HookName): void;
|
|
625
|
-
/**
|
|
626
|
-
* Remove all hooks.
|
|
627
|
-
*/
|
|
628
|
-
removeAllHooks(): void;
|
|
629
|
-
}
|
|
630
|
-
/**
|
|
631
|
-
* Plugin interface for sumak.
|
|
632
|
-
*
|
|
633
|
-
* Plugins can intercept at three points:
|
|
634
|
-
* 1. transformNode — modify the AST before compilation
|
|
635
|
-
* 2. transformQuery — modify the compiled SQL after generation
|
|
636
|
-
* 3. transformResult — modify result rows after execution
|
|
637
|
-
*/
|
|
638
|
-
interface SumakPlugin {
|
|
639
|
-
readonly name: string;
|
|
640
|
-
/** Transform AST before compilation. Return a new node (never mutate). */
|
|
641
|
-
transformNode?(node: ASTNode): ASTNode;
|
|
642
|
-
/** Transform compiled query after SQL generation. */
|
|
643
|
-
transformQuery?(query: CompiledQuery): CompiledQuery;
|
|
644
|
-
/** Transform result rows after execution. */
|
|
645
|
-
transformResult?(rows: Record<string, unknown>[]): Record<string, unknown>[];
|
|
646
|
-
}
|
|
647
|
-
/**
|
|
648
|
-
* Tables config constraint.
|
|
649
|
-
* Each table = Record of ColumnBuilder instances.
|
|
650
|
-
*/
|
|
651
|
-
type TablesConfig = Record<string, Record<string, ColumnBuilder<any, any, any>>>;
|
|
652
|
-
interface SumakConfig<T extends TablesConfig> {
|
|
653
|
-
dialect: Dialect;
|
|
654
|
-
tables: T;
|
|
655
|
-
plugins?: SumakPlugin[];
|
|
656
|
-
}
|
|
657
|
-
/**
|
|
658
|
-
* Create a fully typed sumak instance.
|
|
659
|
-
*
|
|
660
|
-
* DB type = typeof tables directly. No `InferDB` mapped type.
|
|
661
|
-
* ColumnBuilder carries __select/__insert/__update phantom fields,
|
|
662
|
-
* so SelectType/InsertType/UpdateType resolve via O(1) indexed access
|
|
663
|
-
* instead of conditional type evaluation.
|
|
664
|
-
*
|
|
665
|
-
* ```ts
|
|
666
|
-
* const db = sumak({
|
|
667
|
-
* dialect: pgDialect(),
|
|
668
|
-
* tables: {
|
|
669
|
-
* users: { id: serial(), name: text().notNull() },
|
|
670
|
-
* },
|
|
671
|
-
* });
|
|
672
|
-
*
|
|
673
|
-
* db.selectFrom("users").select("id", "name")...
|
|
674
|
-
* ```
|
|
675
|
-
*/
|
|
676
|
-
declare function sumak<T extends TablesConfig>(config: SumakConfig<T>): Sumak<T>;
|
|
677
|
-
/**
|
|
678
|
-
* Core sumak instance with hook system.
|
|
679
|
-
*/
|
|
680
|
-
declare class Sumak<DB> {
|
|
681
|
-
private _dialect;
|
|
682
|
-
private _plugins;
|
|
683
|
-
private _hooks;
|
|
684
|
-
constructor(dialect: Dialect, plugins?: SumakPlugin[]);
|
|
685
|
-
/**
|
|
686
|
-
* Register a hook handler. Returns an unregister function.
|
|
687
|
-
*
|
|
688
|
-
* ```ts
|
|
689
|
-
* const off = db.hook("query:before", (ctx) => { ... });
|
|
690
|
-
* off(); // unregister
|
|
691
|
-
* ```
|
|
692
|
-
*/
|
|
693
|
-
hook<K extends HookName>(name: K, handler: SumakHooks[K]): () => void;
|
|
694
|
-
selectFrom<T extends keyof DB & string>(table: T, alias?: string): TypedSelectBuilder<DB, T, SelectRow<DB, T>>;
|
|
695
|
-
insertInto<T extends keyof DB & string>(table: T): TypedInsertBuilder<DB, T>;
|
|
696
|
-
update<T extends keyof DB & string>(table: T): TypedUpdateBuilder<DB, T>;
|
|
697
|
-
deleteFrom<T extends keyof DB & string>(table: T): TypedDeleteBuilder<DB, T>;
|
|
698
|
-
/**
|
|
699
|
-
* MERGE INTO target USING source ON condition.
|
|
700
|
-
*
|
|
701
|
-
* ```ts
|
|
702
|
-
* db.mergeInto("users", "staging", "s", ({ target, source }) =>
|
|
703
|
-
* target.id.eqCol(source.id),
|
|
704
|
-
* )
|
|
705
|
-
* .whenMatchedThenUpdate({ name: "updated" })
|
|
706
|
-
* .whenNotMatchedThenInsert({ name: "new", email: "e@x.com" })
|
|
707
|
-
* .compile(db.printer())
|
|
708
|
-
* ```
|
|
709
|
-
*/
|
|
710
|
-
mergeInto<T extends keyof DB & string, S extends keyof DB & string>(target: T, source: S, sourceAlias: string, on: (proxies: {
|
|
711
|
-
target: { [K in keyof DB[T] & string]: Col<any> };
|
|
712
|
-
source: { [K in keyof DB[S] & string]: Col<any> };
|
|
713
|
-
}) => Expression<boolean>): TypedMergeBuilder<DB, T, S>;
|
|
714
|
-
/**
|
|
715
|
-
* Compile an AST node through the full pipeline:
|
|
716
|
-
* plugins.transformNode → type-specific hooks → printer → plugins.transformQuery → query hooks
|
|
717
|
-
*/
|
|
718
|
-
compile(node: ASTNode): CompiledQuery;
|
|
719
|
-
/**
|
|
720
|
-
* Transform result rows through plugins and hooks.
|
|
721
|
-
*/
|
|
722
|
-
transformResult(rows: Record<string, unknown>[]): Record<string, unknown>[];
|
|
723
|
-
printer(): Printer;
|
|
724
|
-
private _extractTableName;
|
|
725
|
-
}
|
|
726
|
-
/**
|
|
727
|
-
* Manages plugin execution pipeline.
|
|
728
|
-
* Plugins are applied sequentially in registration order.
|
|
729
|
-
*/
|
|
730
|
-
declare class PluginManager {
|
|
731
|
-
private readonly plugins;
|
|
732
|
-
constructor(plugins: SumakPlugin[]);
|
|
733
|
-
/** Apply all transformNode phases in order. */
|
|
734
|
-
transformNode(node: ASTNode): ASTNode;
|
|
735
|
-
/** Apply all transformQuery phases in order. */
|
|
736
|
-
transformQuery(query: CompiledQuery): CompiledQuery;
|
|
737
|
-
/** Apply all transformResult phases in order. */
|
|
738
|
-
transformResult(rows: Record<string, unknown>[]): Record<string, unknown>[];
|
|
739
|
-
}
|
|
740
|
-
/**
|
|
741
|
-
* Plugin that prepends a schema name to all table references.
|
|
742
|
-
*
|
|
743
|
-
* ```ts
|
|
744
|
-
* const plugin = new WithSchemaPlugin("public");
|
|
745
|
-
* // SELECT * FROM "users" → SELECT * FROM "public"."users"
|
|
746
|
-
* ```
|
|
747
|
-
*/
|
|
748
|
-
declare class WithSchemaPlugin implements SumakPlugin {
|
|
749
|
-
readonly name = "with-schema";
|
|
750
|
-
private schema;
|
|
751
|
-
constructor(schema: string);
|
|
752
|
-
transformNode(node: ASTNode): ASTNode;
|
|
753
|
-
private addSchema;
|
|
754
|
-
private transformSelect;
|
|
755
|
-
private transformInsert;
|
|
756
|
-
private transformUpdate;
|
|
757
|
-
private transformDelete;
|
|
758
|
-
}
|
|
759
|
-
/**
|
|
760
|
-
* Plugin that automatically adds `WHERE deleted_at IS NULL` to
|
|
761
|
-
* SELECT, UPDATE, and DELETE queries for configured tables.
|
|
762
|
-
*
|
|
763
|
-
* ```ts
|
|
764
|
-
* const plugin = new SoftDeletePlugin({ tables: ["users", "posts"] });
|
|
765
|
-
* // SELECT * FROM "users" → SELECT * FROM "users" WHERE "deleted_at" IS NULL
|
|
766
|
-
* ```
|
|
767
|
-
*/
|
|
768
|
-
declare class SoftDeletePlugin implements SumakPlugin {
|
|
769
|
-
readonly name = "soft-delete";
|
|
770
|
-
private tables;
|
|
771
|
-
private column;
|
|
772
|
-
constructor(config: {
|
|
773
|
-
tables: string[];
|
|
774
|
-
column?: string;
|
|
775
|
-
});
|
|
776
|
-
transformNode(node: ASTNode): ASTNode;
|
|
777
|
-
private isTargetTable;
|
|
778
|
-
private softDeleteCondition;
|
|
779
|
-
private addCondition;
|
|
780
|
-
private transformSelect;
|
|
781
|
-
private transformUpdate;
|
|
782
|
-
private transformDelete;
|
|
783
|
-
}
|
|
784
|
-
/**
|
|
785
|
-
* Plugin that converts snake_case result column names to camelCase.
|
|
786
|
-
*
|
|
787
|
-
* This plugin operates on results only — it does NOT transform the AST.
|
|
788
|
-
* Use it when your database uses snake_case but your TypeScript code uses camelCase.
|
|
789
|
-
*/
|
|
790
|
-
declare class CamelCasePlugin implements SumakPlugin {
|
|
791
|
-
readonly name = "camel-case";
|
|
792
|
-
transformResult(rows: Record<string, unknown>[]): Record<string, unknown>[];
|
|
793
|
-
}
|
|
794
|
-
declare class SumakError extends Error {
|
|
795
|
-
constructor(message: string);
|
|
796
|
-
}
|
|
797
|
-
declare class InvalidExpressionError extends SumakError {
|
|
798
|
-
constructor(message: string);
|
|
799
|
-
}
|
|
800
|
-
declare class UnsupportedDialectFeatureError extends SumakError {
|
|
801
|
-
constructor(dialect: string, feature: string);
|
|
802
|
-
}
|
|
803
|
-
declare class EmptyQueryError extends SumakError {
|
|
804
|
-
constructor(queryType: string);
|
|
805
|
-
}
|
|
806
|
-
export { type ASTNode, ASTTransformer, type ASTVisitor, type AliasedExprNode, type ArrayExprNode, BasePrinter, type BetweenNode, type BinaryOpNode, type CTENode, CamelCasePlugin, CaseBuilder, type CaseNode, type CastNode, Col, ColumnBuilder, type ColumnDef, type ColumnProxies, type ColumnRefNode, type ColumnType, type CompiledQuery, DeleteBuilder, type DeleteNode, type Dialect, type DialectConfig, type Doc, EmptyQueryError, type ExistsNode, type Expression, type ExpressionNode, type FormatOptions, type FrameBound, type FrameKind, type FrameSpec, type FullTextSearchMode, type FullTextSearchNode, type FunctionCallNode, type Generated, type GeneratedAlways, type HookContext, type HookName, Hookable, type InNode, type InferTable, InsertBuilder, type InsertNode, type InsertType, type Insertable, InvalidExpressionError, type IsNullNode, type JoinNode, type JoinType, type JsonAccessNode, type LiteralNode, MergeBuilder, type MergeNode, type MergeWhenMatched, type MergeWhenNotMatched, MssqlPrinter, MysqlPrinter, type Nullable, type OnConflictNode, type OrderByNode, type OrderDirection, type ParamNode, PgPrinter, PluginManager, type Primitive, type PrintMode, type Printer, type PrinterOptions, type RawNode, type SQLDialect, SelectBuilder, type SelectNode, type SelectRow, type SelectType, type Selectable, type SetOperator, SoftDeletePlugin, SqlitePrinter, type StarNode, type SubqueryNode, Sumak, type SumakConfig, SumakError, type SumakHooks, type SumakPlugin, type TableDefinition, type TableRefNode, type TemporalClause, TypedDeleteBuilder, TypedDeleteReturningBuilder, TypedInsertBuilder, TypedInsertReturningBuilder, TypedMergeBuilder, TypedSelectBuilder, TypedUpdateBuilder, TypedUpdateReturningBuilder, type UnaryOpNode, UnsupportedDialectFeatureError, UpdateBuilder, type UpdateNode, type UpdateType, type Updateable, type WhereCallback, type WindowFunctionNode, WithSchemaPlugin, and, avg, between, bigint, bigserial, binOp, boolean, bytea, case_, cast, char, coalesce, col, colAs, count, createDeleteNode, createInsertNode, createMergeNode, createSelectNode, createUpdateNode, date, defineTable, deleteFrom, concat as docConcat, empty as docEmpty, group as docGroup, join as docJoin, line as docLine, nest as docNest, render as docRender, text as docText, textLine as docTextLine, doublePrecision, enumType, eq, exists, fn, formatParam, formatSQL, gt, gte, inList, insert, integer, isNull, json, jsonRef, jsonb, like, lit, lt, lte, max, merge, min, mssqlDialect, mysqlDialect, neq, not, notExists, numeric, or, param, pgDialect, quoteIdentifier, quoteTableRef, raw, real, resetParams, select, serial, smallint, sqlFn, sqliteDialect, star, subquery, sum, sumak, tableRef, text$1 as text, textSearch, time, timestamp, timestamptz, unaryOp, update, uuid, val, varchar, visitNode };
|
|
1
|
+
export type { AliasedExprNode, ArrayExprNode, ASTNode, BetweenNode, BinaryOpNode, CaseNode, CastNode, ColumnRefNode, CTENode, DeleteNode, ExistsNode, ExplainNode, ExpressionNode, FrameBound, FrameKind, FrameSpec, FullTextSearchMode, FullTextSearchNode, FunctionCallNode, InNode, InsertMode, InsertNode, IsNullNode, JoinNode, JsonAccessNode, LiteralNode, LockClause, LockMode, MergeNode, MergeWhenMatched, MergeWhenNotMatched, OnConflictNode, OrderByNode, ParamNode, RawNode, SelectNode, StarNode, SubqueryNode, TableRefNode, TemporalClause, UnaryOpNode, UpdateNode, WindowFunctionNode } from "./ast/nodes.mjs";
|
|
2
|
+
export { createDeleteNode, createInsertNode, createMergeNode, createSelectNode, createUpdateNode, tableRef } from "./ast/nodes.mjs";
|
|
3
|
+
export { between, binOp, col, colAs, eq, fn, gt, gte, inList, isNull, like, lit, lt, lte, neq, param, raw, star, subquery, unaryOp } from "./ast/expression.mjs";
|
|
4
|
+
export { ASTTransformer } from "./ast/transformer.mjs";
|
|
5
|
+
export { visitNode } from "./ast/visitor.mjs";
|
|
6
|
+
export type { ASTVisitor } from "./ast/visitor.mjs";
|
|
7
|
+
export type { Expression } from "./ast/typed-expression.mjs";
|
|
8
|
+
export { merge, MergeBuilder } from "./builder/merge.mjs";
|
|
9
|
+
export { select, SelectBuilder } from "./builder/select.mjs";
|
|
10
|
+
export { insert, InsertBuilder } from "./builder/insert.mjs";
|
|
11
|
+
export { update, UpdateBuilder } from "./builder/update.mjs";
|
|
12
|
+
export { deleteFrom, DeleteBuilder } from "./builder/delete.mjs";
|
|
13
|
+
export { BasePrinter } from "./printer/base.mjs";
|
|
14
|
+
export { PgPrinter } from "./printer/pg.mjs";
|
|
15
|
+
export { MssqlPrinter } from "./printer/mssql.mjs";
|
|
16
|
+
export { MysqlPrinter } from "./printer/mysql.mjs";
|
|
17
|
+
export { SqlitePrinter } from "./printer/sqlite.mjs";
|
|
18
|
+
export { formatSQL } from "./printer/formatter.mjs";
|
|
19
|
+
export type { FormatOptions } from "./printer/formatter.mjs";
|
|
20
|
+
export type { Printer, PrinterOptions, PrintMode } from "./printer/types.mjs";
|
|
21
|
+
export { concat as docConcat, empty as docEmpty, group as docGroup, join as docJoin, line as docLine, nest as docNest, render as docRender, text as docText, textLine as docTextLine } from "./printer/document.mjs";
|
|
22
|
+
export type { Doc } from "./printer/document.mjs";
|
|
23
|
+
export { pgDialect } from "./dialect/pg.mjs";
|
|
24
|
+
export { mssqlDialect } from "./dialect/mssql.mjs";
|
|
25
|
+
export { mysqlDialect } from "./dialect/mysql.mjs";
|
|
26
|
+
export { sqliteDialect } from "./dialect/sqlite.mjs";
|
|
27
|
+
export type { Dialect } from "./dialect/types.mjs";
|
|
28
|
+
export { quoteIdentifier, quoteTableRef } from "./utils/identifier.mjs";
|
|
29
|
+
export { formatParam } from "./utils/param.mjs";
|
|
30
|
+
export type { CompiledQuery, DialectConfig, JoinType, OrderDirection, Primitive, SetOperator, SQLDialect } from "./types.mjs";
|
|
31
|
+
export { bigint, bigserial, boolean, bytea, char, ColumnBuilder, date, defineTable, doublePrecision, enumType, integer, json, jsonb, numeric, real, serial, smallint, text, time, timestamp, timestamptz, uuid, varchar } from "./schema/index.mjs";
|
|
32
|
+
export type { ColumnDef, ColumnType, Generated, GeneratedAlways, InferTable, Insertable, InsertType, Nullable, Selectable, SelectRow, SelectType, TableDefinition, Updateable, UpdateType } from "./schema/index.mjs";
|
|
33
|
+
export { abs, and, avg, case_, CaseBuilder, cast, ceil, coalesce, Col, concat, count, countDistinct, currentTimestamp, denseRank, exists, filter, floor, greatest, jsonRef, lag, lead, least, length, lower, max, min, not, notExists, now, ntile, nullif, or, over, rank, resetParams, round, rowNumber, sqlFn, substring, sum, textSearch, trim, upper, val, WindowBuilder } from "./builder/eb.mjs";
|
|
34
|
+
export type { ColumnProxies, WhereCallback } from "./builder/eb.mjs";
|
|
35
|
+
export { sumak, Sumak } from "./sumak.mjs";
|
|
36
|
+
export type { SumakConfig } from "./sumak.mjs";
|
|
37
|
+
export { TypedSelectBuilder } from "./builder/typed-select.mjs";
|
|
38
|
+
export { TypedInsertBuilder, TypedInsertReturningBuilder } from "./builder/typed-insert.mjs";
|
|
39
|
+
export { TypedUpdateBuilder, TypedUpdateReturningBuilder } from "./builder/typed-update.mjs";
|
|
40
|
+
export { TypedDeleteBuilder, TypedDeleteReturningBuilder } from "./builder/typed-delete.mjs";
|
|
41
|
+
export { TypedMergeBuilder } from "./builder/typed-merge.mjs";
|
|
42
|
+
export type { SumakPlugin } from "./plugin/types.mjs";
|
|
43
|
+
export { PluginManager } from "./plugin/plugin-manager.mjs";
|
|
44
|
+
export { WithSchemaPlugin } from "./plugin/with-schema.mjs";
|
|
45
|
+
export { SoftDeletePlugin } from "./plugin/soft-delete.mjs";
|
|
46
|
+
export { CamelCasePlugin } from "./plugin/camel-case.mjs";
|
|
47
|
+
export { Hookable } from "./plugin/hooks.mjs";
|
|
48
|
+
export type { HookContext, HookName, SumakHooks } from "./plugin/hooks.mjs";
|
|
49
|
+
export { EmptyQueryError, InvalidExpressionError, SumakError, UnsupportedDialectFeatureError } from "./errors.mjs";
|