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/dist/index.d.mts CHANGED
@@ -1,8 +1,9 @@
1
- import { A as RawNode, B as createSelectNode, C as IsNullNode, D as OnConflictNode, E as LiteralNode, F as UnaryOpNode, G as JoinType, H as tableRef, I as UpdateNode, J as SQLDialect, K as OrderDirection, L as WindowFunctionNode, M as StarNode, N as SubqueryNode, O as OrderByNode, P as TableRefNode, R as createDeleteNode, S as InsertNode, T as JsonAccessNode, U as CompiledQuery, V as createUpdateNode, W as DialectConfig, Y as SetOperator, _ as FrameBound, a as PrinterOptions, b as FunctionCallNode, c as BetweenNode, d as CaseNode, f as CastNode, g as ExpressionNode, h as ExistsNode, i as Printer, j as SelectNode, k as ParamNode, l as BinaryOpNode, m as DeleteNode, n as BasePrinter, o as ASTNode, p as ColumnRefNode, q as Primitive, r as PrintMode, s as ArrayExprNode, t as Dialect, u as CTENode, v as FrameKind, w as JoinNode, x as InNode, y as FrameSpec, z as createInsertNode } from "./_chunks/types.mjs";
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 GeneratedAlways, C as time, D as varchar, E as uuid, F as Selectable, I as UpdateType, L as Updateable, M as Insertable, N as Nullable$1, O as ColumnType, P as SelectType, S as text$1, T as timestamptz, _ as jsonb, a as ColumnBuilder, b as serial, c as bigserial, d as char, f as date, g as json, h as integer, i as defineTable, j as InsertType, k as Generated, l as boolean, m as enumType, n as InferTable, o as ColumnDef, p as doublePrecision, r as TableDefinition, s as bigint, t as Nullable, u as bytea, v as numeric, w as timestamp, x as smallint, y as real } from "./_chunks/index.mjs";
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$1<T> {
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$1<string>, pattern: string): Expression<boolean>;
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$1<T>): Expression<boolean>;
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$1<SelectType<DB[TB][K]>> };
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 & { [K in keyof DB[T]]: SelectType<DB[T][K]> }>;
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$1<{ [K in keyof DB[T]]: SelectType<DB[T][K]> }>>;
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$1<O> & { [K in keyof DB[T]]: SelectType<DB[T][K]> }>;
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 & keyof DB> };
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<{ [C in keyof DB[TB]]: SelectType<DB[TB][C]> }, K>>;
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, { [K in keyof DB[TB]]: SelectType<DB[TB][K]> }>;
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
- * Extract the DB type from a tables config object.
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
- type InferDB<T extends Record<string, Record<string, ColumnBuilder<any, any, any>>>> = { [Table in keyof T]: { [Col in keyof T[Table]]: T[Table][Col] extends ColumnBuilder<infer S, infer I, infer U> ? ColumnType<S, I, U> : never } };
521
- interface SumakConfig<T extends Record<string, Record<string, ColumnBuilder<any, any, any>>>> {
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. DB type is inferred automatically.
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 Record<string, Record<string, ColumnBuilder<any, any, any>>>>(config: SumakConfig<T>): Lale<InferDB<T>>;
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, { [K in keyof DB[T]]: SelectType<DB[T][K]> }>;
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$1 as 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 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, 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 SelectType, type Selectable, type SetOperator, SoftDeletePlugin, SqlitePrinter, type StarNode, type SubqueryNode, Sumak, type SumakConfig, SumakError, type SumakHooks, type SumakPlugin, type TableDefinition, type TableRefNode, TypedDeleteBuilder, TypedDeleteReturningBuilder, TypedInsertBuilder, TypedInsertReturningBuilder, TypedSelectBuilder, TypedUpdateBuilder, TypedUpdateReturningBuilder, type UnaryOpNode, UnsupportedDialectFeatureError, UpdateBuilder, type UpdateNode, type UpdateType, type Updateable, type WhereCallback, type WindowFunctionNode, WithSchemaPlugin, and, between, bigint, bigserial, binOp, boolean, bytea, cast, char, col, colAs, count, createDeleteNode, createInsertNode, 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, jsonb, like, lit, lt, lte, mysqlDialect, neq, not, numeric, or, param, pgDialect, quoteIdentifier, quoteTableRef, raw, real, resetParams, select, serial, smallint, sqlFn, sqliteDialect, star, subquery, sumak, tableRef, text$1 as text, time, timestamp, timestamptz, unaryOp, update, uuid, val, varchar, visitNode };
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 };