sumak 0.0.2 → 0.0.4
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 +424 -51
- package/dist/_chunks/base.mjs +1 -1
- package/dist/_chunks/index.d.mts +31 -14
- package/dist/_chunks/mssql.d.mts +11 -0
- package/dist/_chunks/mssql.mjs +1 -0
- package/dist/_chunks/mysql.d.mts +2 -1
- package/dist/_chunks/mysql.mjs +1 -1
- package/dist/_chunks/pg.d.mts +1 -1
- package/dist/_chunks/sqlite.d.mts +2 -1
- package/dist/_chunks/sqlite.mjs +1 -1
- package/dist/_chunks/types.d.mts +68 -4
- package/dist/index.d.mts +265 -118
- package/dist/index.mjs +3 -3
- package/dist/mssql.d.mts +2 -0
- package/dist/mssql.mjs +1 -0
- package/dist/schema.d.mts +1 -1
- package/package.json +18 -13
package/dist/index.d.mts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { A as
|
|
1
|
+
import { $ as JoinType, A as MergeNode, B as TableRefNode, C as FunctionCallNode, D as JoinNode, E as IsNullNode, F as ParamNode, G as createDeleteNode, H as UnaryOpNode, I as RawNode, J as createSelectNode, K as createInsertNode, L as SelectNode, M as MergeWhenNotMatched, N as OnConflictNode, O as JsonAccessNode, P as OrderByNode, Q as DialectConfig, R as StarNode, S as FullTextSearchNode, T as InsertNode, U as UpdateNode, V as TemporalClause, W as WindowFunctionNode, X as tableRef, Y as createUpdateNode, Z as CompiledQuery, _ as ExpressionNode, a as PrinterOptions, b as FrameSpec, c as ArrayExprNode, d as CTENode, et as OrderDirection, f as CaseNode, g as ExistsNode, h as DeleteNode, i as Printer, j as MergeWhenMatched, k as LiteralNode, l as BetweenNode, m as ColumnRefNode, n as BasePrinter, nt as SQLDialect, o as ASTNode, p as CastNode, q as createMergeNode, r as PrintMode, rt as SetOperator, s as AliasedExprNode, t as Dialect, tt as Primitive, u as BinaryOpNode, v as FrameBound, w as InNode, x as FullTextSearchMode, y as FrameKind, z as SubqueryNode } from "./_chunks/types.mjs";
|
|
2
2
|
import { n as PgPrinter, t as pgDialect } from "./_chunks/pg.mjs";
|
|
3
|
+
import { n as MssqlPrinter, t as mssqlDialect } from "./_chunks/mssql.mjs";
|
|
3
4
|
import { n as MysqlPrinter, t as mysqlDialect } from "./_chunks/mysql.mjs";
|
|
4
5
|
import { n as SqlitePrinter, t as sqliteDialect } from "./_chunks/sqlite.mjs";
|
|
5
|
-
import { A as
|
|
6
|
+
import { A as InsertType, C as timestamp, D as ColumnType, E as varchar, F as Selectable, I as UpdateType, L as Updateable, M as Nullable, N as SelectRow, O as Generated, P as SelectType, S as time, T as uuid, _ as numeric, a as ColumnDef, b as smallint, c as boolean, d as date, f as doublePrecision, g as jsonb, h as json, i as ColumnBuilder, j as Insertable, k as GeneratedAlways, l as bytea, m as integer, n as TableDefinition, o as bigint, p as enumType, r as defineTable, s as bigserial, t as InferTable, u as char, v as real, w as timestamptz, x as text$1, y as serial } from "./_chunks/index.mjs";
|
|
6
7
|
declare function col(column: string, table?: string): ColumnRefNode;
|
|
7
8
|
declare function colAs(column: string, alias: string, table?: string): ColumnRefNode;
|
|
8
9
|
declare function lit(value: string | number | boolean | null): LiteralNode;
|
|
@@ -23,15 +24,13 @@ declare function like(expr: ExpressionNode, pattern: ExpressionNode): BinaryOpNo
|
|
|
23
24
|
declare function between(expr: ExpressionNode, low: ExpressionNode, high: ExpressionNode, negated?: boolean): BetweenNode;
|
|
24
25
|
declare function inList(expr: ExpressionNode, values: ExpressionNode[] | SelectNode, negated?: boolean): InNode;
|
|
25
26
|
declare function isNull(expr: ExpressionNode, negated?: boolean): IsNullNode;
|
|
26
|
-
declare function cast(expr: ExpressionNode, dataType: string): CastNode;
|
|
27
|
-
declare function exists(query: SelectNode, negated?: boolean): ExistsNode;
|
|
28
|
-
declare function not(operand: ExpressionNode): UnaryOpNode;
|
|
29
27
|
declare class ASTTransformer {
|
|
30
28
|
transform(node: ASTNode): ASTNode;
|
|
31
29
|
transformSelect(node: SelectNode): SelectNode;
|
|
32
30
|
transformInsert(node: InsertNode): InsertNode;
|
|
33
31
|
transformUpdate(node: UpdateNode): UpdateNode;
|
|
34
32
|
transformDelete(node: DeleteNode): DeleteNode;
|
|
33
|
+
transformMerge(node: MergeNode): MergeNode;
|
|
35
34
|
transformExpression(node: ExpressionNode): ExpressionNode;
|
|
36
35
|
}
|
|
37
36
|
interface ASTVisitor<R = void> {
|
|
@@ -39,6 +38,7 @@ interface ASTVisitor<R = void> {
|
|
|
39
38
|
visitInsert(node: InsertNode): R;
|
|
40
39
|
visitUpdate(node: UpdateNode): R;
|
|
41
40
|
visitDelete(node: DeleteNode): R;
|
|
41
|
+
visitMerge(node: MergeNode): R;
|
|
42
42
|
visitExpression(node: ExpressionNode): R;
|
|
43
43
|
visitJoin(node: JoinNode): R;
|
|
44
44
|
visitOrderBy(node: OrderByNode): R;
|
|
@@ -55,6 +55,25 @@ interface Expression<T> {
|
|
|
55
55
|
readonly __type: T;
|
|
56
56
|
readonly node: ExpressionNode;
|
|
57
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;
|
|
58
77
|
declare class SelectBuilder {
|
|
59
78
|
private node;
|
|
60
79
|
constructor(node?: SelectNode);
|
|
@@ -72,6 +91,7 @@ declare class SelectBuilder {
|
|
|
72
91
|
orderBy(expr: string | ExpressionNode, direction?: OrderDirection, nulls?: "FIRST" | "LAST"): SelectBuilder;
|
|
73
92
|
limit(expr: ExpressionNode): SelectBuilder;
|
|
74
93
|
offset(expr: ExpressionNode): SelectBuilder;
|
|
94
|
+
forSystemTime(clause: TemporalClause): SelectBuilder;
|
|
75
95
|
forUpdate(): SelectBuilder;
|
|
76
96
|
with(name: string, query: SelectNode, recursive?: boolean): SelectBuilder;
|
|
77
97
|
union(query: SelectNode): SelectBuilder;
|
|
@@ -182,7 +202,7 @@ declare function formatParam(index: number, dialect: SQLDialect): string;
|
|
|
182
202
|
* // users.name.like("%ali%") → ("name" LIKE '%ali%')
|
|
183
203
|
* ```
|
|
184
204
|
*/
|
|
185
|
-
declare class Col
|
|
205
|
+
declare class Col<T> {
|
|
186
206
|
/** @internal */
|
|
187
207
|
readonly _node: ExpressionNode;
|
|
188
208
|
readonly _type: T;
|
|
@@ -200,7 +220,7 @@ declare class Col$1<T> {
|
|
|
200
220
|
/** <= */
|
|
201
221
|
lte(value: T): Expression<boolean>;
|
|
202
222
|
/** LIKE (string columns only) */
|
|
203
|
-
like(this: Col
|
|
223
|
+
like(this: Col<string>, pattern: string): Expression<boolean>;
|
|
204
224
|
/** IN (value1, value2, ...) */
|
|
205
225
|
in(values: T[]): Expression<boolean>;
|
|
206
226
|
/** NOT IN */
|
|
@@ -212,7 +232,7 @@ declare class Col$1<T> {
|
|
|
212
232
|
/** BETWEEN low AND high */
|
|
213
233
|
between(low: T, high: T): Expression<boolean>;
|
|
214
234
|
/** Compare with another column: col1.eqCol(col2) */
|
|
215
|
-
eqCol(other: Col
|
|
235
|
+
eqCol(other: Col<T>): Expression<boolean>;
|
|
216
236
|
/** As raw Expression<T> for advanced use */
|
|
217
237
|
toExpr(): Expression<T>;
|
|
218
238
|
}
|
|
@@ -222,7 +242,7 @@ declare function resetParams(): void;
|
|
|
222
242
|
*
|
|
223
243
|
* Type: { id: Col<number>, name: Col<string>, ... }
|
|
224
244
|
*/
|
|
225
|
-
type ColumnProxies<DB, TB extends keyof DB> = { [K in keyof DB[TB] & string]: Col
|
|
245
|
+
type ColumnProxies<DB, TB extends keyof DB> = { [K in keyof DB[TB] & string]: Col<SelectType<DB[TB][K]>> };
|
|
226
246
|
/**
|
|
227
247
|
* Expression builder callback type.
|
|
228
248
|
*
|
|
@@ -241,6 +261,176 @@ declare function val<T extends string | number | boolean | null>(value: T): Expr
|
|
|
241
261
|
declare function sqlFn(name: string, ...args: Expression<any>[]): Expression<any>;
|
|
242
262
|
/** COUNT(*) */
|
|
243
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
|
+
}
|
|
244
434
|
/**
|
|
245
435
|
* Type-safe SELECT query builder.
|
|
246
436
|
*
|
|
@@ -281,13 +471,13 @@ declare class TypedSelectBuilder<DB, TB extends keyof DB, O> {
|
|
|
281
471
|
* .innerJoin("posts", ({ users, posts }) => users.id.eqCol(posts.userId))
|
|
282
472
|
* ```
|
|
283
473
|
*/
|
|
284
|
-
innerJoin<T extends keyof DB & string>(table: T, onOrCallback: Expression<boolean> | ((cols: JoinProxies<DB, TB, T>) => Expression<boolean>)): TypedSelectBuilder<DB, TB | T, O &
|
|
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>>;
|
|
285
475
|
/**
|
|
286
476
|
* LEFT JOIN — joined columns become nullable.
|
|
287
477
|
*/
|
|
288
|
-
leftJoin<T extends keyof DB & string>(table: T, onOrCallback: Expression<boolean> | ((cols: JoinProxies<DB, TB, T>) => Expression<boolean>)): TypedSelectBuilder<DB, TB | T, O & Nullable
|
|
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>>>;
|
|
289
479
|
/** RIGHT JOIN */
|
|
290
|
-
rightJoin<T extends keyof DB & string>(table: T, onOrCallback: Expression<boolean> | ((cols: JoinProxies<DB, TB, T>) => Expression<boolean>)): TypedSelectBuilder<DB, TB | T, Nullable
|
|
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>>;
|
|
291
481
|
/** GROUP BY */
|
|
292
482
|
groupBy(...cols: (keyof O & string)[]): TypedSelectBuilder<DB, TB, O>;
|
|
293
483
|
/** HAVING */
|
|
@@ -298,6 +488,8 @@ declare class TypedSelectBuilder<DB, TB extends keyof DB, O> {
|
|
|
298
488
|
limit(n: number): TypedSelectBuilder<DB, TB, O>;
|
|
299
489
|
/** OFFSET */
|
|
300
490
|
offset(n: number): TypedSelectBuilder<DB, TB, O>;
|
|
491
|
+
/** FOR SYSTEM_TIME (SQL:2011 temporal query) */
|
|
492
|
+
forSystemTime(clause: TemporalClause): TypedSelectBuilder<DB, TB, O>;
|
|
301
493
|
/** FOR UPDATE */
|
|
302
494
|
forUpdate(): TypedSelectBuilder<DB, TB, O>;
|
|
303
495
|
/** WITH (CTE) */
|
|
@@ -306,55 +498,20 @@ declare class TypedSelectBuilder<DB, TB extends keyof DB, O> {
|
|
|
306
498
|
union(query: TypedSelectBuilder<DB, any, O>): TypedSelectBuilder<DB, TB, O>;
|
|
307
499
|
/** UNION ALL */
|
|
308
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>>;
|
|
309
509
|
/** Build the AST node. */
|
|
310
510
|
build(): SelectNode;
|
|
311
511
|
/** Compile to SQL. */
|
|
312
512
|
compile(printer: Printer): CompiledQuery;
|
|
313
513
|
}
|
|
314
|
-
type JoinProxies<DB, TB extends keyof DB, T extends keyof DB> = { [Table in (TB | T) & string]: ColumnProxies<DB, Table
|
|
315
|
-
/**
|
|
316
|
-
* Type-safe INSERT query builder.
|
|
317
|
-
*/
|
|
318
|
-
declare class TypedInsertBuilder<DB, TB extends keyof DB> {
|
|
319
|
-
/** @internal */
|
|
320
|
-
readonly _builder: InsertBuilder;
|
|
321
|
-
private _paramIdx;
|
|
322
|
-
constructor(table: TB & string, paramIdx?: number);
|
|
323
|
-
/** @internal */
|
|
324
|
-
private _withBuilder;
|
|
325
|
-
/**
|
|
326
|
-
* Insert a single row. Columns/values inferred from Insertable<DB[TB]>.
|
|
327
|
-
*/
|
|
328
|
-
values(row: Insertable<DB[TB]>): TypedInsertBuilder<DB, TB>;
|
|
329
|
-
/**
|
|
330
|
-
* RETURNING specific columns.
|
|
331
|
-
*/
|
|
332
|
-
returning<K extends keyof DB[TB] & string>(...cols: K[]): TypedInsertReturningBuilder<DB, TB, Pick<{ [C in keyof DB[TB]]: SelectType<DB[TB][C]> }, K>>;
|
|
333
|
-
/**
|
|
334
|
-
* RETURNING all columns.
|
|
335
|
-
*/
|
|
336
|
-
returningAll(): TypedInsertReturningBuilder<DB, TB, { [K in keyof DB[TB]]: SelectType<DB[TB][K]> }>;
|
|
337
|
-
/**
|
|
338
|
-
* ON CONFLICT DO NOTHING.
|
|
339
|
-
*/
|
|
340
|
-
onConflictDoNothing(...columns: (keyof DB[TB] & string)[]): TypedInsertBuilder<DB, TB>;
|
|
341
|
-
/**
|
|
342
|
-
* ON CONFLICT DO UPDATE.
|
|
343
|
-
*/
|
|
344
|
-
onConflictDoUpdate(columns: (keyof DB[TB] & string)[], set: {
|
|
345
|
-
column: keyof DB[TB] & string;
|
|
346
|
-
value: Expression<any>;
|
|
347
|
-
}[]): TypedInsertBuilder<DB, TB>;
|
|
348
|
-
build(): InsertNode;
|
|
349
|
-
compile(printer: Printer): CompiledQuery;
|
|
350
|
-
}
|
|
351
|
-
declare class TypedInsertReturningBuilder<DB, _TB extends keyof DB, _R> {
|
|
352
|
-
/** @internal */
|
|
353
|
-
readonly _builder: InsertBuilder;
|
|
354
|
-
constructor(builder: InsertBuilder);
|
|
355
|
-
build(): InsertNode;
|
|
356
|
-
compile(printer: Printer): CompiledQuery;
|
|
357
|
-
}
|
|
514
|
+
type JoinProxies<DB, TB extends keyof DB, T extends keyof DB> = { [Table in (TB | T) & string]: ColumnProxies<DB, Table> };
|
|
358
515
|
/**
|
|
359
516
|
* Type-safe UPDATE query builder.
|
|
360
517
|
*/
|
|
@@ -381,11 +538,15 @@ declare class TypedUpdateBuilder<DB, TB extends keyof DB> {
|
|
|
381
538
|
/**
|
|
382
539
|
* RETURNING specific columns.
|
|
383
540
|
*/
|
|
384
|
-
returning<K extends keyof DB[TB] & string>(...cols: K[]): TypedUpdateReturningBuilder<DB, TB, Pick<
|
|
541
|
+
returning<K extends keyof DB[TB] & string>(...cols: K[]): TypedUpdateReturningBuilder<DB, TB, Pick<SelectRow<DB, TB>, K>>;
|
|
385
542
|
/**
|
|
386
543
|
* RETURNING all columns.
|
|
387
544
|
*/
|
|
388
|
-
returningAll(): TypedUpdateReturningBuilder<DB, TB,
|
|
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>;
|
|
389
550
|
build(): UpdateNode;
|
|
390
551
|
compile(printer: Printer): CompiledQuery;
|
|
391
552
|
}
|
|
@@ -396,54 +557,6 @@ declare class TypedUpdateReturningBuilder<DB, _TB extends keyof DB, _R> {
|
|
|
396
557
|
build(): UpdateNode;
|
|
397
558
|
compile(printer: Printer): CompiledQuery;
|
|
398
559
|
}
|
|
399
|
-
/**
|
|
400
|
-
* Type-safe DELETE query builder.
|
|
401
|
-
*/
|
|
402
|
-
declare class TypedDeleteBuilder<DB, TB extends keyof DB> {
|
|
403
|
-
/** @internal */
|
|
404
|
-
readonly _builder: DeleteBuilder;
|
|
405
|
-
constructor(table: TB & string);
|
|
406
|
-
/** @internal */
|
|
407
|
-
private _with;
|
|
408
|
-
/**
|
|
409
|
-
* WHERE — callback or raw Expression.
|
|
410
|
-
*/
|
|
411
|
-
where(exprOrCallback: Expression<boolean> | WhereCallback<DB, TB>): TypedDeleteBuilder<DB, TB>;
|
|
412
|
-
/**
|
|
413
|
-
* RETURNING specific columns.
|
|
414
|
-
*/
|
|
415
|
-
returning<K extends keyof DB[TB] & string>(...cols: K[]): TypedDeleteReturningBuilder<DB, TB, Pick<{ [C in keyof DB[TB]]: SelectType<DB[TB][C]> }, K>>;
|
|
416
|
-
/**
|
|
417
|
-
* RETURNING all columns.
|
|
418
|
-
*/
|
|
419
|
-
returningAll(): TypedDeleteReturningBuilder<DB, TB, { [K in keyof DB[TB]]: SelectType<DB[TB][K]> }>;
|
|
420
|
-
build(): DeleteNode;
|
|
421
|
-
compile(printer: Printer): CompiledQuery;
|
|
422
|
-
}
|
|
423
|
-
declare class TypedDeleteReturningBuilder<DB, _TB extends keyof DB, _R> {
|
|
424
|
-
/** @internal */
|
|
425
|
-
readonly _builder: DeleteBuilder;
|
|
426
|
-
constructor(builder: DeleteBuilder);
|
|
427
|
-
build(): DeleteNode;
|
|
428
|
-
compile(printer: Printer): CompiledQuery;
|
|
429
|
-
}
|
|
430
|
-
/**
|
|
431
|
-
* Plugin interface for sumak.
|
|
432
|
-
*
|
|
433
|
-
* Plugins can intercept at three points:
|
|
434
|
-
* 1. transformNode — modify the AST before compilation
|
|
435
|
-
* 2. transformQuery — modify the compiled SQL after generation
|
|
436
|
-
* 3. transformResult — modify result rows after execution
|
|
437
|
-
*/
|
|
438
|
-
interface SumakPlugin {
|
|
439
|
-
readonly name: string;
|
|
440
|
-
/** Transform AST before compilation. Return a new node (never mutate). */
|
|
441
|
-
transformNode?(node: ASTNode): ASTNode;
|
|
442
|
-
/** Transform compiled query after SQL generation. */
|
|
443
|
-
transformQuery?(query: CompiledQuery): CompiledQuery;
|
|
444
|
-
/** Transform result rows after execution. */
|
|
445
|
-
transformResult?(rows: Record<string, unknown>[]): Record<string, unknown>[];
|
|
446
|
-
}
|
|
447
560
|
/**
|
|
448
561
|
* Hook context passed to hook handlers.
|
|
449
562
|
*/
|
|
@@ -515,16 +628,39 @@ declare class Hookable {
|
|
|
515
628
|
removeAllHooks(): void;
|
|
516
629
|
}
|
|
517
630
|
/**
|
|
518
|
-
*
|
|
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
|
|
519
637
|
*/
|
|
520
|
-
|
|
521
|
-
|
|
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> {
|
|
522
653
|
dialect: Dialect;
|
|
523
654
|
tables: T;
|
|
524
655
|
plugins?: SumakPlugin[];
|
|
525
656
|
}
|
|
526
657
|
/**
|
|
527
|
-
* Create a fully typed sumak instance.
|
|
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.
|
|
528
664
|
*
|
|
529
665
|
* ```ts
|
|
530
666
|
* const db = sumak({
|
|
@@ -534,15 +670,10 @@ interface SumakConfig<T extends Record<string, Record<string, ColumnBuilder<any,
|
|
|
534
670
|
* },
|
|
535
671
|
* });
|
|
536
672
|
*
|
|
537
|
-
* // Hook into the query lifecycle
|
|
538
|
-
* db.hook("select:before", (ctx) => {
|
|
539
|
-
* console.log("Selecting from:", ctx.table);
|
|
540
|
-
* });
|
|
541
|
-
*
|
|
542
673
|
* db.selectFrom("users").select("id", "name")...
|
|
543
674
|
* ```
|
|
544
675
|
*/
|
|
545
|
-
declare function sumak<T extends
|
|
676
|
+
declare function sumak<T extends TablesConfig>(config: SumakConfig<T>): Sumak<T>;
|
|
546
677
|
/**
|
|
547
678
|
* Core sumak instance with hook system.
|
|
548
679
|
*/
|
|
@@ -560,10 +691,26 @@ declare class Sumak<DB> {
|
|
|
560
691
|
* ```
|
|
561
692
|
*/
|
|
562
693
|
hook<K extends HookName>(name: K, handler: SumakHooks[K]): () => void;
|
|
563
|
-
selectFrom<T extends keyof DB & string>(table: T, alias?: string): TypedSelectBuilder<DB, T,
|
|
694
|
+
selectFrom<T extends keyof DB & string>(table: T, alias?: string): TypedSelectBuilder<DB, T, SelectRow<DB, T>>;
|
|
564
695
|
insertInto<T extends keyof DB & string>(table: T): TypedInsertBuilder<DB, T>;
|
|
565
696
|
update<T extends keyof DB & string>(table: T): TypedUpdateBuilder<DB, T>;
|
|
566
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>;
|
|
567
714
|
/**
|
|
568
715
|
* Compile an AST node through the full pipeline:
|
|
569
716
|
* plugins.transformNode → type-specific hooks → printer → plugins.transformQuery → query hooks
|
|
@@ -656,4 +803,4 @@ declare class UnsupportedDialectFeatureError extends SumakError {
|
|
|
656
803
|
declare class EmptyQueryError extends SumakError {
|
|
657
804
|
constructor(queryType: string);
|
|
658
805
|
}
|
|
659
|
-
export { type ASTNode, ASTTransformer, type ASTVisitor, type ArrayExprNode, BasePrinter, type BetweenNode, type BinaryOpNode, type CTENode, CamelCasePlugin, type CaseNode, type CastNode, Col
|
|
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 };
|