sumak 0.0.3 → 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 CHANGED
@@ -21,7 +21,7 @@ npm install sumak
21
21
  ```
22
22
 
23
23
  ```ts
24
- import { sumak, pgDialect, serial, text, boolean, integer } from "sumak"
24
+ import { sumak, pgDialect, serial, text, boolean, integer, jsonb } from "sumak"
25
25
 
26
26
  const db = sumak({
27
27
  dialect: pgDialect(),
@@ -30,7 +30,9 @@ const db = sumak({
30
30
  id: serial().primaryKey(),
31
31
  name: text().notNull(),
32
32
  email: text().notNull(),
33
+ age: integer(),
33
34
  active: boolean().defaultTo(true),
35
+ meta: jsonb(),
34
36
  },
35
37
  posts: {
36
38
  id: serial().primaryKey(),
@@ -43,16 +45,20 @@ const db = sumak({
43
45
 
44
46
  ## Query Building
45
47
 
48
+ ### SELECT
49
+
46
50
  ```ts
47
- // SELECT
48
51
  db.selectFrom("users")
49
52
  .select("id", "name")
50
53
  .where(({ age, active }) => and(age.gte(18), active.eq(true)))
51
54
  .orderBy("name")
52
55
  .limit(10)
53
56
  .compile(db.printer())
57
+ ```
58
+
59
+ ### INSERT
54
60
 
55
- // INSERT
61
+ ```ts
56
62
  db.insertInto("users")
57
63
  .values({
58
64
  name: "Alice",
@@ -60,14 +66,20 @@ db.insertInto("users")
60
66
  })
61
67
  .returningAll()
62
68
  .compile(db.printer())
69
+ ```
63
70
 
64
- // UPDATE
71
+ ### UPDATE
72
+
73
+ ```ts
65
74
  db.update("users")
66
75
  .set({ active: false })
67
76
  .where(({ id }) => id.eq(1))
68
77
  .compile(db.printer())
78
+ ```
79
+
80
+ ### DELETE
69
81
 
70
- // DELETE
82
+ ```ts
71
83
  db.deleteFrom("users")
72
84
  .where(({ id }) => id.eq(1))
73
85
  .returning("id")
@@ -77,11 +89,362 @@ db.deleteFrom("users")
77
89
  ## Joins
78
90
 
79
91
  ```ts
92
+ // INNER JOIN
80
93
  db.selectFrom("users")
81
94
  .innerJoin("posts", ({ users, posts }) => users.id.eqCol(posts.userId))
95
+ .select("id", "title")
96
+ .compile(db.printer())
97
+
98
+ // LEFT JOIN — joined columns become nullable
99
+ db.selectFrom("users")
100
+ .leftJoin("posts", ({ users, posts }) => users.id.eqCol(posts.userId))
101
+ .compile(db.printer())
102
+
103
+ // RIGHT JOIN
104
+ db.selectFrom("users")
105
+ .rightJoin("posts", ({ users, posts }) => users.id.eqCol(posts.userId))
106
+ .compile(db.printer())
107
+
108
+ // FULL JOIN — both sides become nullable
109
+ db.selectFrom("users")
110
+ .fullJoin("posts", ({ users, posts }) => users.id.eqCol(posts.userId))
111
+ .compile(db.printer())
112
+
113
+ // CROSS JOIN — cartesian product
114
+ db.selectFrom("users").crossJoin("posts").compile(db.printer())
115
+ ```
116
+
117
+ ## Expression API
118
+
119
+ ### Comparisons
120
+
121
+ ```ts
122
+ .where(({ id }) =>
123
+ id.eq(42),
124
+ )
125
+
126
+ .where(({ age }) =>
127
+ age.gt(18),
128
+ )
129
+
130
+ .where(({ age }) =>
131
+ age.gte(18),
132
+ )
133
+
134
+ .where(({ age }) =>
135
+ age.lt(65),
136
+ )
137
+
138
+ .where(({ age }) =>
139
+ age.lte(65),
140
+ )
141
+
142
+ .where(({ active }) =>
143
+ active.neq(false),
144
+ )
145
+ ```
146
+
147
+ ### String Matching
148
+
149
+ ```ts
150
+ .where(({ name }) =>
151
+ name.like("%ali%"),
152
+ )
153
+ ```
154
+
155
+ ### Range & List
156
+
157
+ ```ts
158
+ .where(({ age }) =>
159
+ age.between(18, 65),
160
+ )
161
+
162
+ .where(({ id }) =>
163
+ id.in([1, 2, 3]),
164
+ )
165
+
166
+ .where(({ id }) =>
167
+ id.notIn([99, 100]),
168
+ )
169
+ ```
170
+
171
+ ### Null Checks
172
+
173
+ ```ts
174
+ .where(({ bio }) =>
175
+ bio.isNull(),
176
+ )
177
+
178
+ .where(({ email }) =>
179
+ email.isNotNull(),
180
+ )
181
+ ```
182
+
183
+ ### Logical Combinators
184
+
185
+ ```ts
186
+ // AND
187
+ .where(({ age, active }) =>
188
+ and(
189
+ age.gt(0),
190
+ active.eq(true),
191
+ ),
192
+ )
193
+
194
+ // OR
195
+ .where(({ name, email }) =>
196
+ or(
197
+ name.like("%alice%"),
198
+ email.like("%alice%"),
199
+ ),
200
+ )
201
+
202
+ // NOT
203
+ .where(({ active }) =>
204
+ not(active.eq(true)),
205
+ )
206
+ ```
207
+
208
+ ### Aggregates
209
+
210
+ ```ts
211
+ import { count, sum, avg, min, max, coalesce } from "sumak"
212
+
213
+ db.selectFrom("users").selectExpr(count(), "total").compile(db.printer())
214
+
215
+ db.selectFrom("orders").selectExpr(sum(col.amount), "totalAmount").compile(db.printer())
216
+
217
+ db.selectFrom("orders").selectExpr(avg(col.amount), "avgAmount").compile(db.printer())
218
+
219
+ db.selectFrom("orders")
220
+ .selectExpr(coalesce(col.discount, val(0)), "safeDiscount")
221
+ .compile(db.printer())
222
+ ```
223
+
224
+ ### EXISTS / NOT EXISTS
225
+
226
+ ```ts
227
+ import { exists, notExists } from "sumak"
228
+
229
+ db.selectFrom("users")
230
+ .where(() =>
231
+ exists(
232
+ db
233
+ .selectFrom("posts")
234
+ .where(({ userId }) => userId.eq(1))
235
+ .build(),
236
+ ),
237
+ )
238
+ .compile(db.printer())
239
+
240
+ db.selectFrom("users")
241
+ .where(() =>
242
+ notExists(
243
+ db
244
+ .selectFrom("posts")
245
+ .where(({ userId }) => userId.eq(1))
246
+ .build(),
247
+ ),
248
+ )
249
+ .compile(db.printer())
250
+ ```
251
+
252
+ ### CASE Expression
253
+
254
+ ```ts
255
+ import { case_, val } from "sumak"
256
+
257
+ db.selectFrom("users")
258
+ .selectExpr(
259
+ case_()
260
+ .when(col.active.eq(true), val("active"))
261
+ .when(col.active.eq(false), val("inactive"))
262
+ .else_(val("unknown"))
263
+ .end(),
264
+ "status",
265
+ )
266
+ .compile(db.printer())
267
+ ```
268
+
269
+ ### CAST
270
+
271
+ ```ts
272
+ import { cast, val } from "sumak"
273
+
274
+ db.selectFrom("users")
275
+ .selectExpr(cast(val(42), "text"), "idAsText")
82
276
  .compile(db.printer())
83
277
  ```
84
278
 
279
+ ### JSON Operations
280
+
281
+ ```ts
282
+ import { jsonRef } from "sumak"
283
+
284
+ // -> (JSON object)
285
+ db.selectFrom("users")
286
+ .selectExpr(jsonRef(col.meta, "address", "->"), "address")
287
+ .compile(db.printer())
288
+
289
+ // ->> (text value)
290
+ db.selectFrom("users")
291
+ .selectExpr(jsonRef(col.meta, "name", "->>"), "metaName")
292
+ .compile(db.printer())
293
+ ```
294
+
295
+ ## Set Operations
296
+
297
+ ```ts
298
+ const active = db
299
+ .selectFrom("users")
300
+ .select("id")
301
+ .where(({ active }) => active.eq(true))
302
+
303
+ const premium = db
304
+ .selectFrom("users")
305
+ .select("id")
306
+ .where(({ active }) => active.eq(true))
307
+
308
+ // UNION
309
+ active.union(premium).compile(db.printer())
310
+
311
+ // UNION ALL
312
+ active.unionAll(premium).compile(db.printer())
313
+
314
+ // INTERSECT
315
+ active.intersect(premium).compile(db.printer())
316
+
317
+ // EXCEPT
318
+ active.except(premium).compile(db.printer())
319
+ ```
320
+
321
+ ## CTEs (WITH)
322
+
323
+ ```ts
324
+ // SELECT with CTE
325
+ db.selectFrom("users")
326
+ .with(
327
+ "active_users",
328
+ db
329
+ .selectFrom("users")
330
+ .where(({ active }) => active.eq(true))
331
+ .build(),
332
+ )
333
+ .compile(db.printer())
334
+
335
+ // INSERT with CTE
336
+ db.insertInto("users")
337
+ .with("source", sourceCte)
338
+ .values({ name: "Alice", email: "a@b.com" })
339
+ .compile(db.printer())
340
+
341
+ // UPDATE with CTE
342
+ db.update("users").with("target", targetCte).set({ active: false }).compile(db.printer())
343
+
344
+ // DELETE with CTE
345
+ db.deleteFrom("users")
346
+ .with("to_delete", deleteCte)
347
+ .where(({ id }) => id.eq(1))
348
+ .compile(db.printer())
349
+
350
+ // Recursive CTE
351
+ db.selectFrom("users").with("tree", recursiveQuery, true).compile(db.printer())
352
+ ```
353
+
354
+ ## UPDATE FROM
355
+
356
+ ```ts
357
+ db.update("users")
358
+ .set({ name: "Bob" })
359
+ .from("posts")
360
+ .where(({ id }) => id.eq(1))
361
+ .compile(db.printer())
362
+ // UPDATE "users" SET "name" = $1 FROM "posts" WHERE ("id" = $2)
363
+ ```
364
+
365
+ ## ON CONFLICT
366
+
367
+ ```ts
368
+ // DO NOTHING
369
+ db.insertInto("users")
370
+ .values({ name: "Alice", email: "a@b.com" })
371
+ .onConflictDoNothing("email")
372
+ .compile(db.printer())
373
+
374
+ // DO UPDATE
375
+ db.insertInto("users")
376
+ .values({ name: "Alice", email: "a@b.com" })
377
+ .onConflictDoUpdate(["email"], [{ column: "name", value: val("Alice") }])
378
+ .compile(db.printer())
379
+ ```
380
+
381
+ ## MERGE (SQL:2003)
382
+
383
+ ```ts
384
+ db.mergeInto("users", "staging", "s", ({ target, source }) => target.id.eqCol(source.id))
385
+ .whenMatchedThenUpdate({ name: "updated" })
386
+ .whenNotMatchedThenInsert({
387
+ name: "Alice",
388
+ email: "alice@example.com",
389
+ })
390
+ .compile(db.printer())
391
+
392
+ // MERGE with conditional delete
393
+ db.mergeInto("users", "staging", "s", ({ target, source }) => target.id.eqCol(source.id))
394
+ .whenMatchedThenDelete()
395
+ .compile(db.printer())
396
+ ```
397
+
398
+ ## Full-Text Search
399
+
400
+ Dialect-aware FTS — same API, different SQL per dialect:
401
+
402
+ ```ts
403
+ import { textSearch } from "sumak"
404
+
405
+ // PostgreSQL: to_tsvector("name") @@ to_tsquery('alice')
406
+ db.selectFrom("users")
407
+ .where(({ name }) => textSearch([name.toExpr()], val("alice")))
408
+ .compile(db.printer())
409
+
410
+ // With language config
411
+ db.selectFrom("users")
412
+ .where(({ name }) => textSearch([name.toExpr()], val("alice"), { language: "english" }))
413
+ .compile(db.printer())
414
+
415
+ // MySQL: MATCH(`name`) AGAINST(? IN BOOLEAN MODE)
416
+ // SQLite: ("name" MATCH ?)
417
+ // MSSQL: CONTAINS(([name]), @p0)
418
+ ```
419
+
420
+ ## Temporal Tables (SQL:2011)
421
+
422
+ Query historical data with `FOR SYSTEM_TIME`:
423
+
424
+ ```ts
425
+ // AS OF — point-in-time query
426
+ db.selectFrom("users")
427
+ .forSystemTime({
428
+ kind: "as_of",
429
+ timestamp: lit("2024-01-01"),
430
+ })
431
+ .compile(db.printer())
432
+
433
+ // BETWEEN — time range
434
+ db.selectFrom("users")
435
+ .forSystemTime({
436
+ kind: "between",
437
+ start: lit("2024-01-01"),
438
+ end: lit("2024-12-31"),
439
+ })
440
+ .compile(db.printer())
441
+
442
+ // ALL — full history
443
+ db.selectFrom("users").forSystemTime({ kind: "all" }).compile(db.printer())
444
+ ```
445
+
446
+ Supported modes: `as_of`, `from_to`, `between`, `contained_in`, `all`.
447
+
85
448
  ## Tree Shaking
86
449
 
87
450
  Import only the dialect you need:
@@ -89,6 +452,7 @@ Import only the dialect you need:
89
452
  ```ts
90
453
  import { sumak } from "sumak"
91
454
  import { pgDialect } from "sumak/pg"
455
+ import { mssqlDialect } from "sumak/mssql"
92
456
  import { mysqlDialect } from "sumak/mysql"
93
457
  import { sqliteDialect } from "sumak/sqlite"
94
458
  import { serial, text } from "sumak/schema"
@@ -102,12 +466,40 @@ Same query, different SQL:
102
466
  // PostgreSQL → SELECT "id" FROM "users" WHERE ("id" = $1)
103
467
  // MySQL → SELECT `id` FROM `users` WHERE (`id` = ?)
104
468
  // SQLite → SELECT "id" FROM "users" WHERE ("id" = ?)
469
+ // MSSQL → SELECT [id] FROM [users] WHERE ([id] = @p0)
470
+ ```
471
+
472
+ ### MSSQL Specifics
473
+
474
+ ```ts
475
+ import { mssqlDialect } from "sumak/mssql"
476
+
477
+ const db = sumak({
478
+ dialect: mssqlDialect(),
479
+ tables: { ... },
480
+ })
481
+
482
+ // LIMIT → TOP N
483
+ // SELECT TOP 10 * FROM [users]
484
+
485
+ // LIMIT + OFFSET → OFFSET/FETCH
486
+ // SELECT * FROM [users] ORDER BY [id] ASC OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY
487
+
488
+ // RETURNING → OUTPUT INSERTED.*
489
+ // INSERT INTO [users] ([name]) OUTPUT INSERTED.* VALUES (@p0)
490
+
491
+ // DELETE RETURNING → OUTPUT DELETED.*
492
+ // DELETE FROM [users] OUTPUT DELETED.* WHERE ([id] = @p0)
105
493
  ```
106
494
 
107
495
  ## Plugins
108
496
 
109
497
  ```ts
110
- import { WithSchemaPlugin, SoftDeletePlugin, CamelCasePlugin } from "sumak";
498
+ import {
499
+ WithSchemaPlugin,
500
+ SoftDeletePlugin,
501
+ CamelCasePlugin,
502
+ } from "sumak"
111
503
 
112
504
  const db = sumak({
113
505
  dialect: pgDialect(),
@@ -116,7 +508,7 @@ const db = sumak({
116
508
  new SoftDeletePlugin({ tables: ["users"] }),
117
509
  ],
118
510
  tables: { ... },
119
- });
511
+ })
120
512
 
121
513
  // SELECT * FROM "public"."users" WHERE ("deleted_at" IS NULL)
122
514
  ```
@@ -152,54 +544,6 @@ const off = db.hook("query:before", handler)
152
544
  off()
153
545
  ```
154
546
 
155
- ## Expression API
156
-
157
- ```ts
158
- // Equality
159
- .where(({ id }) =>
160
- id.eq(42),
161
- )
162
-
163
- // String matching
164
- .where(({ name }) =>
165
- name.like("%ali%"),
166
- )
167
-
168
- // Range
169
- .where(({ age }) =>
170
- age.between(18, 65),
171
- )
172
-
173
- // List
174
- .where(({ id }) =>
175
- id.in([1, 2, 3]),
176
- )
177
-
178
- // Null checks
179
- .where(({ bio }) =>
180
- bio.isNull(),
181
- )
182
- .where(({ email }) =>
183
- email.isNotNull(),
184
- )
185
-
186
- // AND
187
- .where(({ a, b }) =>
188
- and(
189
- a.gt(0),
190
- b.neq("x"),
191
- ),
192
- )
193
-
194
- // OR
195
- .where(({ a, b }) =>
196
- or(
197
- a.eq(1),
198
- b.eq(2),
199
- ),
200
- )
201
- ```
202
-
203
547
  ## Why sumak?
204
548
 
205
549
  | | sumak | Drizzle | Kysely |
@@ -222,7 +566,7 @@ Schema → Builder → AST → Plugin/Hook → Printer → SQL
222
566
  - **Builder Layer** — `Sumak<DB>`, `TypedSelectBuilder<DB,TB,O>`, proxy-based expressions
223
567
  - **AST Layer** — ~35 frozen node types, discriminated unions, visitor pattern
224
568
  - **Plugin Layer** — `SumakPlugin` interface, `Hookable` lifecycle hooks
225
- - **Printer Layer** — `BasePrinter` with dialect subclasses, Wadler document algebra
569
+ - **Printer Layer** — `BasePrinter` with 4 dialect subclasses (PG, MySQL, SQLite, MSSQL), Wadler document algebra
226
570
 
227
571
  ## License
228
572
 
@@ -1 +1 @@
1
- function e(e,t){switch(t){case`pg`:case`sqlite`:return`"${e.replaceAll(`"`,`""`)}"`;case`mysql`:return`\`${e.replaceAll("`","``")}\``}}function t(t,n,r){return r?`${e(r,n)}.${e(t,n)}`:e(t,n)}function n(e,t){switch(t){case`pg`:return`$${e+1}`;case`mysql`:case`sqlite`:return`?`}}var r=class{params=[];dialect;constructor(e){this.dialect=e}print(e){return this.params=[],{sql:this.printNode(e),params:[...this.params]}}printNode(e){switch(e.type){case`select`:return this.printSelect(e);case`insert`:return this.printInsert(e);case`update`:return this.printUpdate(e);case`delete`:return this.printDelete(e);default:return this.printExpression(e)}}printSelect(e){let t=[];e.ctes.length>0&&t.push(this.printCTEs(e.ctes)),t.push(`SELECT`),e.distinct&&t.push(`DISTINCT`),e.columns.length===0?t.push(`*`):t.push(e.columns.map(e=>this.printExpression(e)).join(`, `)),e.from&&(t.push(`FROM`),e.from.type===`subquery`?t.push(this.printSubquery(e.from)):t.push(this.printTableRef(e.from)));for(let n of e.joins)t.push(this.printJoin(n));return e.where&&t.push(`WHERE`,this.printExpression(e.where)),e.groupBy.length>0&&t.push(`GROUP BY`,e.groupBy.map(e=>this.printExpression(e)).join(`, `)),e.having&&t.push(`HAVING`,this.printExpression(e.having)),e.orderBy.length>0&&t.push(`ORDER BY`,e.orderBy.map(e=>this.printOrderBy(e)).join(`, `)),e.limit&&t.push(`LIMIT`,this.printExpression(e.limit)),e.offset&&t.push(`OFFSET`,this.printExpression(e.offset)),e.setOp&&t.push(e.setOp.op,this.printSelect(e.setOp.query)),e.forUpdate&&t.push(`FOR UPDATE`),t.join(` `)}printInsert(t){let n=[];t.ctes.length>0&&n.push(this.printCTEs(t.ctes)),n.push(`INSERT INTO`,this.printTableRef(t.table)),t.columns.length>0&&n.push(`(${t.columns.map(t=>e(t,this.dialect)).join(`, `)})`),n.push(`VALUES`);let r=t.values.map(e=>`(${e.map(e=>this.printExpression(e)).join(`, `)})`);return n.push(r.join(`, `)),t.onConflict&&n.push(this.printOnConflict(t.onConflict)),t.returning.length>0&&n.push(`RETURNING`,t.returning.map(e=>this.printExpression(e)).join(`, `)),n.join(` `)}printOnConflict(t){let n=[`ON CONFLICT`];if(t.columns.length>0&&n.push(`(${t.columns.map(t=>e(t,this.dialect)).join(`, `)})`),t.action===`nothing`)n.push(`DO NOTHING`);else{n.push(`DO UPDATE SET`);let r=t.action.set.map(t=>`${e(t.column,this.dialect)} = ${this.printExpression(t.value)}`);n.push(r.join(`, `))}return t.where&&n.push(`WHERE`,this.printExpression(t.where)),n.join(` `)}printUpdate(t){let n=[];t.ctes.length>0&&n.push(this.printCTEs(t.ctes)),n.push(`UPDATE`,this.printTableRef(t.table),`SET`);let r=t.set.map(t=>`${e(t.column,this.dialect)} = ${this.printExpression(t.value)}`);return n.push(r.join(`, `)),t.from&&n.push(`FROM`,this.printTableRef(t.from)),t.where&&n.push(`WHERE`,this.printExpression(t.where)),t.returning.length>0&&n.push(`RETURNING`,t.returning.map(e=>this.printExpression(e)).join(`, `)),n.join(` `)}printDelete(e){let t=[];return e.ctes.length>0&&t.push(this.printCTEs(e.ctes)),t.push(`DELETE FROM`,this.printTableRef(e.table)),e.where&&t.push(`WHERE`,this.printExpression(e.where)),e.returning.length>0&&t.push(`RETURNING`,e.returning.map(e=>this.printExpression(e)).join(`, `)),t.join(` `)}printExpression(e){switch(e.type){case`column_ref`:return this.printColumnRef(e);case`literal`:return this.printLiteral(e);case`binary_op`:return this.printBinaryOp(e);case`unary_op`:return this.printUnaryOp(e);case`function_call`:return this.printFunctionCall(e);case`param`:return this.printParam(e);case`raw`:return this.printRaw(e);case`subquery`:return this.printSubquery(e);case`between`:return this.printBetween(e);case`in`:return this.printIn(e);case`is_null`:return this.printIsNull(e);case`cast`:return this.printCast(e);case`exists`:return this.printExists(e);case`star`:return this.printStar(e);case`case`:return this.printCase(e);case`json_access`:return this.printJsonAccess(e);case`array_expr`:return this.printArrayExpr(e);case`window_function`:return this.printWindowFunction(e)}}printColumnRef(t){let n=t.table?`${e(t.table,this.dialect)}.${e(t.column,this.dialect)}`:e(t.column,this.dialect);return t.alias&&(n+=` AS ${e(t.alias,this.dialect)}`),n}printLiteral(e){return e.value===null?`NULL`:typeof e.value==`boolean`?e.value?`TRUE`:`FALSE`:typeof e.value==`number`?String(e.value):`'${String(e.value).replaceAll(`'`,`''`)}'`}printBinaryOp(e){return`(${this.printExpression(e.left)} ${e.op} ${this.printExpression(e.right)})`}printUnaryOp(e){return e.position===`postfix`?`(${this.printExpression(e.operand)} ${e.op})`:`(${e.op} ${this.printExpression(e.operand)})`}printFunctionCall(t){let n=`${t.name}(${t.args.map(e=>this.printExpression(e)).join(`, `)})`;return t.alias&&(n+=` AS ${e(t.alias,this.dialect)}`),n}printParam(e){return this.params.push(e.value),n(this.params.length-1,this.dialect)}printRaw(e){return this.params.push(...e.params),e.sql}printSubquery(t){let n=`(${this.printSelect(t.query)})`;return t.alias&&(n+=` AS ${e(t.alias,this.dialect)}`),n}printBetween(e){let t=e.negated?`NOT `:``;return`(${this.printExpression(e.expr)} ${t}BETWEEN ${this.printExpression(e.low)} AND ${this.printExpression(e.high)})`}printIn(e){let t=e.negated?`NOT `:``;return Array.isArray(e.values)?`(${this.printExpression(e.expr)} ${t}IN (${e.values.map(e=>this.printExpression(e)).join(`, `)}))`:`(${this.printExpression(e.expr)} ${t}IN (${this.printSelect(e.values)}))`}printIsNull(e){let t=e.negated?` NOT`:``;return`(${this.printExpression(e.expr)} IS${t} NULL)`}printCase(e){let t=[`CASE`];e.operand&&t.push(this.printExpression(e.operand));for(let n of e.whens)t.push(`WHEN`,this.printExpression(n.condition),`THEN`,this.printExpression(n.result));return e.else_&&t.push(`ELSE`,this.printExpression(e.else_)),t.push(`END`),t.join(` `)}printCast(e){return`CAST(${this.printExpression(e.expr)} AS ${e.dataType})`}printExists(e){return`(${e.negated?`NOT `:``}EXISTS (${this.printSelect(e.query)}))`}printStar(t){return t.table?`${e(t.table,this.dialect)}.*`:`*`}printTableRef(n){let r=t(n.name,this.dialect,n.schema);return n.alias&&(r+=` AS ${e(n.alias,this.dialect)}`),r}printJoin(e){let t=[];return t.push(`${e.joinType} JOIN`),e.table.type===`subquery`?t.push(this.printSubquery(e.table)):t.push(this.printTableRef(e.table)),e.on&&t.push(`ON`,this.printExpression(e.on)),t.join(` `)}printOrderBy(e){let t=`${this.printExpression(e.expr)} ${e.direction}`;return e.nulls&&(t+=` NULLS ${e.nulls}`),t}printCTEs(t){return`${t.some(e=>e.recursive)?`WITH RECURSIVE`:`WITH`} ${t.map(t=>`${e(t.name,this.dialect)} AS (${this.printSelect(t.query)})`).join(`, `)}`}printJsonAccess(t){let n=`${this.printExpression(t.expr)}${t.operator}${this.printLiteral({type:`literal`,value:t.path})}`;return t.alias&&(n+=` AS ${e(t.alias,this.dialect)}`),n}printArrayExpr(e){return`ARRAY[${e.elements.map(e=>this.printExpression(e)).join(`, `)}]`}printWindowFunction(t){let n=[];n.push(this.printFunctionCall(t.fn)),n.push(`OVER`);let r=[];return t.partitionBy.length>0&&r.push(`PARTITION BY ${t.partitionBy.map(e=>this.printExpression(e)).join(`, `)}`),t.orderBy.length>0&&r.push(`ORDER BY ${t.orderBy.map(e=>this.printOrderBy(e)).join(`, `)}`),t.frame&&r.push(this.printFrameSpec(t.frame)),n.push(`(${r.join(` `)})`),t.alias&&n.push(`AS`,e(t.alias,this.dialect)),n.join(` `)}printFrameSpec(e){let t=this.printFrameBound(e.start);return e.end?`${e.kind} BETWEEN ${t} AND ${this.printFrameBound(e.end)}`:`${e.kind} ${t}`}printFrameBound(e){switch(e.type){case`unbounded_preceding`:return`UNBOUNDED PRECEDING`;case`preceding`:return`${e.value} PRECEDING`;case`current_row`:return`CURRENT ROW`;case`following`:return`${e.value} FOLLOWING`;case`unbounded_following`:return`UNBOUNDED FOLLOWING`}}};export{t as i,n,e as r,r as t};
1
+ function e(e,t){switch(t){case`pg`:case`sqlite`:return`"${e.replaceAll(`"`,`""`)}"`;case`mysql`:return`\`${e.replaceAll("`","``")}\``;case`mssql`:return`[${e.replaceAll(`]`,`]]`)}]`}}function t(t,n,r){return r?`${e(r,n)}.${e(t,n)}`:e(t,n)}function n(e,t){switch(t){case`pg`:return`$${e+1}`;case`mysql`:case`sqlite`:return`?`;case`mssql`:return`@p${e}`}}var r=class{params=[];dialect;constructor(e){this.dialect=e}print(e){return this.params=[],{sql:this.printNode(e),params:[...this.params]}}printNode(e){switch(e.type){case`select`:return this.printSelect(e);case`insert`:return this.printInsert(e);case`update`:return this.printUpdate(e);case`delete`:return this.printDelete(e);case`merge`:return this.printMerge(e);default:return this.printExpression(e)}}printSelect(e){let t=[];e.ctes.length>0&&t.push(this.printCTEs(e.ctes)),t.push(`SELECT`),e.distinct&&t.push(`DISTINCT`),e.columns.length===0?t.push(`*`):t.push(e.columns.map(e=>this.printExpression(e)).join(`, `)),e.from&&(t.push(`FROM`),e.from.type===`subquery`?t.push(this.printSubquery(e.from)):t.push(this.printTableRef(e.from)));for(let n of e.joins)t.push(this.printJoin(n));return e.where&&t.push(`WHERE`,this.printExpression(e.where)),e.groupBy.length>0&&t.push(`GROUP BY`,e.groupBy.map(e=>this.printExpression(e)).join(`, `)),e.having&&t.push(`HAVING`,this.printExpression(e.having)),e.orderBy.length>0&&t.push(`ORDER BY`,e.orderBy.map(e=>this.printOrderBy(e)).join(`, `)),e.limit&&t.push(`LIMIT`,this.printExpression(e.limit)),e.offset&&t.push(`OFFSET`,this.printExpression(e.offset)),e.setOp&&t.push(e.setOp.op,this.printSelect(e.setOp.query)),e.forUpdate&&t.push(`FOR UPDATE`),t.join(` `)}printInsert(t){let n=[];t.ctes.length>0&&n.push(this.printCTEs(t.ctes)),n.push(`INSERT INTO`,this.printTableRef(t.table)),t.columns.length>0&&n.push(`(${t.columns.map(t=>e(t,this.dialect)).join(`, `)})`),n.push(`VALUES`);let r=t.values.map(e=>`(${e.map(e=>this.printExpression(e)).join(`, `)})`);return n.push(r.join(`, `)),t.onConflict&&n.push(this.printOnConflict(t.onConflict)),t.returning.length>0&&n.push(`RETURNING`,t.returning.map(e=>this.printExpression(e)).join(`, `)),n.join(` `)}printOnConflict(t){let n=[`ON CONFLICT`];if(t.columns.length>0&&n.push(`(${t.columns.map(t=>e(t,this.dialect)).join(`, `)})`),t.action===`nothing`)n.push(`DO NOTHING`);else{n.push(`DO UPDATE SET`);let r=t.action.set.map(t=>`${e(t.column,this.dialect)} = ${this.printExpression(t.value)}`);n.push(r.join(`, `))}return t.where&&n.push(`WHERE`,this.printExpression(t.where)),n.join(` `)}printUpdate(t){let n=[];t.ctes.length>0&&n.push(this.printCTEs(t.ctes)),n.push(`UPDATE`,this.printTableRef(t.table),`SET`);let r=t.set.map(t=>`${e(t.column,this.dialect)} = ${this.printExpression(t.value)}`);return n.push(r.join(`, `)),t.from&&n.push(`FROM`,this.printTableRef(t.from)),t.where&&n.push(`WHERE`,this.printExpression(t.where)),t.returning.length>0&&n.push(`RETURNING`,t.returning.map(e=>this.printExpression(e)).join(`, `)),n.join(` `)}printDelete(e){let t=[];return e.ctes.length>0&&t.push(this.printCTEs(e.ctes)),t.push(`DELETE FROM`,this.printTableRef(e.table)),e.where&&t.push(`WHERE`,this.printExpression(e.where)),e.returning.length>0&&t.push(`RETURNING`,e.returning.map(e=>this.printExpression(e)).join(`, `)),t.join(` `)}printExpression(e){switch(e.type){case`column_ref`:return this.printColumnRef(e);case`literal`:return this.printLiteral(e);case`binary_op`:return this.printBinaryOp(e);case`unary_op`:return this.printUnaryOp(e);case`function_call`:return this.printFunctionCall(e);case`param`:return this.printParam(e);case`raw`:return this.printRaw(e);case`subquery`:return this.printSubquery(e);case`between`:return this.printBetween(e);case`in`:return this.printIn(e);case`is_null`:return this.printIsNull(e);case`cast`:return this.printCast(e);case`exists`:return this.printExists(e);case`star`:return this.printStar(e);case`case`:return this.printCase(e);case`json_access`:return this.printJsonAccess(e);case`array_expr`:return this.printArrayExpr(e);case`window_function`:return this.printWindowFunction(e);case`aliased_expr`:return this.printAliasedExpr(e);case`full_text_search`:return this.printFullTextSearch(e)}}printColumnRef(t){let n=t.table?`${e(t.table,this.dialect)}.${e(t.column,this.dialect)}`:e(t.column,this.dialect);return t.alias&&(n+=` AS ${e(t.alias,this.dialect)}`),n}printLiteral(e){return e.value===null?`NULL`:typeof e.value==`boolean`?e.value?`TRUE`:`FALSE`:typeof e.value==`number`?String(e.value):`'${String(e.value).replaceAll(`'`,`''`)}'`}printBinaryOp(e){return`(${this.printExpression(e.left)} ${e.op} ${this.printExpression(e.right)})`}printUnaryOp(e){return e.position===`postfix`?`(${this.printExpression(e.operand)} ${e.op})`:`(${e.op} ${this.printExpression(e.operand)})`}printFunctionCall(t){let n=`${t.name}(${t.args.map(e=>this.printExpression(e)).join(`, `)})`;return t.alias&&(n+=` AS ${e(t.alias,this.dialect)}`),n}printParam(e){return this.params.push(e.value),n(this.params.length-1,this.dialect)}printRaw(e){return this.params.push(...e.params),e.sql}printSubquery(t){let n=`(${this.printSelect(t.query)})`;return t.alias&&(n+=` AS ${e(t.alias,this.dialect)}`),n}printBetween(e){let t=e.negated?`NOT `:``;return`(${this.printExpression(e.expr)} ${t}BETWEEN ${this.printExpression(e.low)} AND ${this.printExpression(e.high)})`}printIn(e){let t=e.negated?`NOT `:``;return Array.isArray(e.values)?`(${this.printExpression(e.expr)} ${t}IN (${e.values.map(e=>this.printExpression(e)).join(`, `)}))`:`(${this.printExpression(e.expr)} ${t}IN (${this.printSelect(e.values)}))`}printIsNull(e){let t=e.negated?` NOT`:``;return`(${this.printExpression(e.expr)} IS${t} NULL)`}printCase(e){let t=[`CASE`];e.operand&&t.push(this.printExpression(e.operand));for(let n of e.whens)t.push(`WHEN`,this.printExpression(n.condition),`THEN`,this.printExpression(n.result));return e.else_&&t.push(`ELSE`,this.printExpression(e.else_)),t.push(`END`),t.join(` `)}printCast(e){return`CAST(${this.printExpression(e.expr)} AS ${e.dataType})`}printExists(e){return`(${e.negated?`NOT `:``}EXISTS (${this.printSelect(e.query)}))`}printStar(t){return t.table?`${e(t.table,this.dialect)}.*`:`*`}printTableRef(n){let r=t(n.name,this.dialect,n.schema);return n.temporal&&(r+=` ${this.printTemporalClause(n.temporal)}`),n.alias&&(r+=` AS ${e(n.alias,this.dialect)}`),r}printTemporalClause(e){switch(e.kind){case`as_of`:return`FOR SYSTEM_TIME AS OF ${this.printExpression(e.timestamp)}`;case`from_to`:return`FOR SYSTEM_TIME FROM ${this.printExpression(e.start)} TO ${this.printExpression(e.end)}`;case`between`:return`FOR SYSTEM_TIME BETWEEN ${this.printExpression(e.start)} AND ${this.printExpression(e.end)}`;case`contained_in`:return`FOR SYSTEM_TIME CONTAINED IN (${this.printExpression(e.start)}, ${this.printExpression(e.end)})`;case`all`:return`FOR SYSTEM_TIME ALL`}}printJoin(e){let t=[];return t.push(`${e.joinType} JOIN`),e.table.type===`subquery`?t.push(this.printSubquery(e.table)):t.push(this.printTableRef(e.table)),e.on&&t.push(`ON`,this.printExpression(e.on)),t.join(` `)}printOrderBy(e){let t=`${this.printExpression(e.expr)} ${e.direction}`;return e.nulls&&(t+=` NULLS ${e.nulls}`),t}printCTEs(t){return`${t.some(e=>e.recursive)?`WITH RECURSIVE`:`WITH`} ${t.map(t=>`${e(t.name,this.dialect)} AS (${this.printSelect(t.query)})`).join(`, `)}`}printJsonAccess(t){let n=`${this.printExpression(t.expr)}${t.operator}${this.printLiteral({type:`literal`,value:t.path})}`;return t.alias&&(n+=` AS ${e(t.alias,this.dialect)}`),n}printArrayExpr(e){return`ARRAY[${e.elements.map(e=>this.printExpression(e)).join(`, `)}]`}printWindowFunction(t){let n=[];n.push(this.printFunctionCall(t.fn)),n.push(`OVER`);let r=[];return t.partitionBy.length>0&&r.push(`PARTITION BY ${t.partitionBy.map(e=>this.printExpression(e)).join(`, `)}`),t.orderBy.length>0&&r.push(`ORDER BY ${t.orderBy.map(e=>this.printOrderBy(e)).join(`, `)}`),t.frame&&r.push(this.printFrameSpec(t.frame)),n.push(`(${r.join(` `)})`),t.alias&&n.push(`AS`,e(t.alias,this.dialect)),n.join(` `)}printFrameSpec(e){let t=this.printFrameBound(e.start);return e.end?`${e.kind} BETWEEN ${t} AND ${this.printFrameBound(e.end)}`:`${e.kind} ${t}`}printFrameBound(e){switch(e.type){case`unbounded_preceding`:return`UNBOUNDED PRECEDING`;case`preceding`:return`${e.value} PRECEDING`;case`current_row`:return`CURRENT ROW`;case`following`:return`${e.value} FOLLOWING`;case`unbounded_following`:return`UNBOUNDED FOLLOWING`}}printMerge(t){let n=[];t.ctes.length>0&&n.push(this.printCTEs(t.ctes)),n.push(`MERGE INTO`,this.printTableRef(t.target)),n.push(`USING`),t.source.type===`subquery`?n.push(this.printSubquery(t.source)):n.push(this.printTableRef(t.source)),n.push(`AS`,e(t.sourceAlias,this.dialect)),n.push(`ON`,this.printExpression(t.on));for(let e of t.whens)e.type===`matched`?n.push(this.printMergeWhenMatched(e)):n.push(this.printMergeWhenNotMatched(e));return n.join(` `)}printMergeWhenMatched(t){let n=[`WHEN MATCHED`];if(t.condition&&n.push(`AND`,this.printExpression(t.condition)),t.action===`delete`)n.push(`THEN DELETE`);else{n.push(`THEN UPDATE SET`);let r=(t.set??[]).map(t=>`${e(t.column,this.dialect)} = ${this.printExpression(t.value)}`);n.push(r.join(`, `))}return n.join(` `)}printMergeWhenNotMatched(t){let n=[`WHEN NOT MATCHED`];return t.condition&&n.push(`AND`,this.printExpression(t.condition)),n.push(`THEN INSERT`),n.push(`(${t.columns.map(t=>e(t,this.dialect)).join(`, `)})`),n.push(`VALUES (${t.values.map(e=>this.printExpression(e)).join(`, `)})`),n.join(` `)}printAliasedExpr(t){return`${this.printExpression(t.expr)} AS ${e(t.alias,this.dialect)}`}printFullTextSearch(t){let n=t.columns.map(e=>this.printExpression(e)).join(` || ' ' || `),r=t.language?`'${t.language}', `:``,i=`(to_tsvector(${r}${n}) @@ to_tsquery(${r}${this.printExpression(t.query)}))`;return t.alias&&(i+=` AS ${e(t.alias,this.dialect)}`),i}};export{t as i,n,e as r,r as t};
@@ -0,0 +1,11 @@
1
+ import { L as SelectNode, S as FullTextSearchNode, T as InsertNode, U as UpdateNode, h as DeleteNode, n as BasePrinter, t as Dialect } from "./types.mjs";
2
+ declare class MssqlPrinter extends BasePrinter {
3
+ constructor();
4
+ protected printSelect(node: SelectNode): string;
5
+ protected printInsert(node: InsertNode): string;
6
+ protected printUpdate(node: UpdateNode): string;
7
+ protected printDelete(node: DeleteNode): string;
8
+ protected printFullTextSearch(node: FullTextSearchNode): string;
9
+ }
10
+ declare function mssqlDialect(): Dialect;
11
+ export { MssqlPrinter as n, mssqlDialect as t };
@@ -0,0 +1 @@
1
+ import{r as e,t}from"./base.mjs";import{i as n}from"./errors.mjs";var r=class extends t{constructor(){super(`mssql`)}printSelect(e){let t=[];e.ctes.length>0&&t.push(this.printCTEs(e.ctes)),t.push(`SELECT`),e.distinct&&t.push(`DISTINCT`),e.limit&&!e.offset&&t.push(`TOP ${this.printExpression(e.limit)}`),e.columns.length===0?t.push(`*`):t.push(e.columns.map(e=>this.printExpression(e)).join(`, `)),e.from&&(t.push(`FROM`),e.from.type===`subquery`?t.push(this.printSubquery(e.from)):t.push(this.printTableRef(e.from)));for(let n of e.joins)t.push(this.printJoin(n));if(e.where&&t.push(`WHERE`,this.printExpression(e.where)),e.groupBy.length>0&&t.push(`GROUP BY`,e.groupBy.map(e=>this.printExpression(e)).join(`, `)),e.having&&t.push(`HAVING`,this.printExpression(e.having)),e.orderBy.length>0&&t.push(`ORDER BY`,e.orderBy.map(e=>this.printOrderBy(e)).join(`, `)),e.offset&&(t.push(`OFFSET ${this.printExpression(e.offset)} ROWS`),e.limit&&t.push(`FETCH NEXT ${this.printExpression(e.limit)} ROWS ONLY`)),e.setOp&&t.push(e.setOp.op,this.printSelect(e.setOp.query)),e.forUpdate)throw new n(`mssql`,`FOR UPDATE (use WITH (UPDLOCK) instead)`);return t.join(` `)}printInsert(t){if(t.onConflict)throw new n(`mssql`,`ON CONFLICT (use MERGE for upsert in MSSQL)`);let r=[];if(t.ctes.length>0&&r.push(this.printCTEs(t.ctes)),r.push(`INSERT INTO`,this.printTableRef(t.table)),t.columns.length>0&&r.push(`(${t.columns.map(t=>e(t,this.dialect)).join(`, `)})`),t.returning.length>0){let e=t.returning.map(e=>{let t=this.printExpression(e);return t===`*`?`INSERTED.*`:`INSERTED.${t}`});r.push(`OUTPUT`,e.join(`, `))}r.push(`VALUES`);let i=t.values.map(e=>`(${e.map(e=>this.printExpression(e)).join(`, `)})`);return r.push(i.join(`, `)),r.join(` `)}printUpdate(t){let n=[];t.ctes.length>0&&n.push(this.printCTEs(t.ctes)),n.push(`UPDATE`,this.printTableRef(t.table),`SET`);let r=t.set.map(t=>`${e(t.column,this.dialect)} = ${this.printExpression(t.value)}`);if(n.push(r.join(`, `)),t.returning.length>0){let e=t.returning.map(e=>{let t=this.printExpression(e);return t===`*`?`INSERTED.*`:`INSERTED.${t}`});n.push(`OUTPUT`,e.join(`, `))}return t.from&&n.push(`FROM`,this.printTableRef(t.from)),t.where&&n.push(`WHERE`,this.printExpression(t.where)),n.join(` `)}printDelete(e){let t=[];if(e.ctes.length>0&&t.push(this.printCTEs(e.ctes)),t.push(`DELETE FROM`,this.printTableRef(e.table)),e.returning.length>0){let n=e.returning.map(e=>{let t=this.printExpression(e);return t===`*`?`DELETED.*`:`DELETED.${t}`});t.push(`OUTPUT`,n.join(`, `))}return e.where&&t.push(`WHERE`,this.printExpression(e.where)),t.join(` `)}printFullTextSearch(t){let n=t.columns.map(e=>this.printExpression(e)).join(`, `),r=this.printExpression(t.query),i=`${t.mode===`natural`?`FREETEXT`:`CONTAINS`}((${n}), ${r})`;return t.alias&&(i+=` AS ${e(t.alias,this.dialect)}`),i}};function i(){return{name:`mssql`,createPrinter(){return new r}}}export{r as n,i as t};
@@ -1,8 +1,9 @@
1
- import { S as InsertNode, j as SelectNode, n as BasePrinter, t as Dialect } from "./types.mjs";
1
+ import { L as SelectNode, S as FullTextSearchNode, T as InsertNode, n as BasePrinter, t as Dialect } from "./types.mjs";
2
2
  declare class MysqlPrinter extends BasePrinter {
3
3
  constructor();
4
4
  protected printInsert(node: InsertNode): string;
5
5
  protected printSelect(node: SelectNode): string;
6
+ protected printFullTextSearch(node: FullTextSearchNode): string;
6
7
  }
7
8
  declare function mysqlDialect(): Dialect;
8
9
  export { MysqlPrinter as n, mysqlDialect as t };
@@ -1 +1 @@
1
- import{t as e}from"./base.mjs";import{i as t}from"./errors.mjs";var n=class extends e{constructor(){super(`mysql`)}printInsert(e){if(e.returning.length>0)throw new t(`mysql`,`RETURNING`);return super.printInsert(e)}printSelect(e){return e.forUpdate,super.printSelect(e)}};function r(){return{name:`mysql`,createPrinter(){return new n}}}export{n,r as t};
1
+ import{r as e,t}from"./base.mjs";import{i as n}from"./errors.mjs";var r=class extends t{constructor(){super(`mysql`)}printInsert(e){if(e.returning.length>0)throw new n(`mysql`,`RETURNING`);return super.printInsert(e)}printSelect(e){return e.forUpdate,super.printSelect(e)}printFullTextSearch(t){let n=t.columns.map(e=>this.printExpression(e)).join(`, `),r=this.printExpression(t.query),i=``;t.mode===`boolean`?i=` IN BOOLEAN MODE`:t.mode===`expansion`?i=` WITH QUERY EXPANSION`:t.mode===`natural`&&(i=` IN NATURAL LANGUAGE MODE`);let a=`MATCH(${n}) AGAINST(${r}${i})`;return t.alias&&(a+=` AS ${e(t.alias,this.dialect)}`),a}};function i(){return{name:`mysql`,createPrinter(){return new r}}}export{r as n,i as t};
@@ -1,4 +1,4 @@
1
- import { S as InsertNode, n as BasePrinter, t as Dialect } from "./types.mjs";
1
+ import { T as InsertNode, n as BasePrinter, t as Dialect } from "./types.mjs";
2
2
  declare class PgPrinter extends BasePrinter {
3
3
  constructor();
4
4
  protected printInsert(node: InsertNode): string;
@@ -1,8 +1,9 @@
1
- import { S as InsertNode, j as SelectNode, n as BasePrinter, t as Dialect } from "./types.mjs";
1
+ import { L as SelectNode, S as FullTextSearchNode, T as InsertNode, n as BasePrinter, t as Dialect } from "./types.mjs";
2
2
  declare class SqlitePrinter extends BasePrinter {
3
3
  constructor();
4
4
  protected printSelect(node: SelectNode): string;
5
5
  protected printInsert(node: InsertNode): string;
6
+ protected printFullTextSearch(node: FullTextSearchNode): string;
6
7
  }
7
8
  declare function sqliteDialect(): Dialect;
8
9
  export { SqlitePrinter as n, sqliteDialect as t };
@@ -1 +1 @@
1
- import{t as e}from"./base.mjs";import{i as t}from"./errors.mjs";var n=class extends e{constructor(){super(`sqlite`)}printSelect(e){if(e.forUpdate)throw new t(`sqlite`,`FOR UPDATE`);return super.printSelect(e)}printInsert(e){return super.printInsert(e)}};function r(){return{name:`sqlite`,createPrinter(){return new n}}}export{n,r as t};
1
+ import{r as e,t}from"./base.mjs";import{i as n}from"./errors.mjs";var r=class extends t{constructor(){super(`sqlite`)}printSelect(e){if(e.forUpdate)throw new n(`sqlite`,`FOR UPDATE`);return super.printSelect(e)}printInsert(e){return super.printInsert(e)}printFullTextSearch(t){let n=`(${t.columns.length>0?this.printExpression(t.columns[0]):`'*'`} MATCH ${this.printExpression(t.query)})`;return t.alias&&(n+=` AS ${e(t.alias,this.dialect)}`),n}};function i(){return{name:`sqlite`,createPrinter(){return new r}}}export{r as n,i as t};
@@ -1,4 +1,4 @@
1
- type SQLDialect = "pg" | "mysql" | "sqlite";
1
+ type SQLDialect = "pg" | "mysql" | "sqlite" | "mssql";
2
2
  interface CompiledQuery {
3
3
  sql: string;
4
4
  params: readonly unknown[];
@@ -12,8 +12,8 @@ interface DialectConfig {
12
12
  quoteIdentifier(name: string): string;
13
13
  formatParam(index: number): string;
14
14
  }
15
- type ASTNode = SelectNode | InsertNode | UpdateNode | DeleteNode | ExpressionNode;
16
- type ExpressionNode = ColumnRefNode | LiteralNode | BinaryOpNode | UnaryOpNode | FunctionCallNode | ParamNode | RawNode | SubqueryNode | BetweenNode | InNode | IsNullNode | CaseNode | CastNode | ExistsNode | StarNode | JsonAccessNode | ArrayExprNode | WindowFunctionNode;
15
+ type ASTNode = SelectNode | InsertNode | UpdateNode | DeleteNode | MergeNode | ExpressionNode;
16
+ type ExpressionNode = ColumnRefNode | LiteralNode | BinaryOpNode | UnaryOpNode | FunctionCallNode | ParamNode | RawNode | SubqueryNode | BetweenNode | InNode | IsNullNode | CaseNode | CastNode | ExistsNode | StarNode | JsonAccessNode | ArrayExprNode | WindowFunctionNode | AliasedExprNode | FullTextSearchNode;
17
17
  interface ColumnRefNode {
18
18
  type: "column_ref";
19
19
  table?: string;
@@ -98,11 +98,44 @@ interface StarNode {
98
98
  type: "star";
99
99
  table?: string;
100
100
  }
101
+ type FullTextSearchMode = "natural" | "boolean" | "expansion";
102
+ interface FullTextSearchNode {
103
+ type: "full_text_search";
104
+ columns: ExpressionNode[];
105
+ query: ExpressionNode;
106
+ mode?: FullTextSearchMode;
107
+ language?: string;
108
+ alias?: string;
109
+ }
110
+ interface AliasedExprNode {
111
+ type: "aliased_expr";
112
+ expr: ExpressionNode;
113
+ alias: string;
114
+ }
115
+ type TemporalClause = {
116
+ kind: "as_of";
117
+ timestamp: ExpressionNode;
118
+ } | {
119
+ kind: "from_to";
120
+ start: ExpressionNode;
121
+ end: ExpressionNode;
122
+ } | {
123
+ kind: "between";
124
+ start: ExpressionNode;
125
+ end: ExpressionNode;
126
+ } | {
127
+ kind: "contained_in";
128
+ start: ExpressionNode;
129
+ end: ExpressionNode;
130
+ } | {
131
+ kind: "all";
132
+ };
101
133
  interface TableRefNode {
102
134
  type: "table_ref";
103
135
  name: string;
104
136
  alias?: string;
105
137
  schema?: string;
138
+ temporal?: TemporalClause;
106
139
  }
107
140
  interface JoinNode {
108
141
  type: "join";
@@ -215,6 +248,31 @@ interface DeleteNode {
215
248
  returning: ExpressionNode[];
216
249
  ctes: CTENode[];
217
250
  }
251
+ interface MergeWhenMatched {
252
+ type: "matched";
253
+ condition?: ExpressionNode;
254
+ action: "update" | "delete";
255
+ set?: {
256
+ column: string;
257
+ value: ExpressionNode;
258
+ }[];
259
+ }
260
+ interface MergeWhenNotMatched {
261
+ type: "not_matched";
262
+ condition?: ExpressionNode;
263
+ columns: string[];
264
+ values: ExpressionNode[];
265
+ }
266
+ interface MergeNode {
267
+ type: "merge";
268
+ target: TableRefNode;
269
+ source: TableRefNode | SubqueryNode;
270
+ sourceAlias: string;
271
+ on: ExpressionNode;
272
+ whens: (MergeWhenMatched | MergeWhenNotMatched)[];
273
+ ctes: CTENode[];
274
+ }
275
+ declare function createMergeNode(target: TableRefNode, source: TableRefNode | SubqueryNode, sourceAlias: string, on: ExpressionNode): MergeNode;
218
276
  declare function tableRef(name: string, alias?: string, schema?: string): TableRefNode;
219
277
  declare function createSelectNode(): SelectNode;
220
278
  declare function createInsertNode(table: TableRefNode): InsertNode;
@@ -258,6 +316,7 @@ declare class BasePrinter implements Printer {
258
316
  protected printExists(node: ExistsNode): string;
259
317
  protected printStar(node: StarNode): string;
260
318
  protected printTableRef(ref: TableRefNode): string;
319
+ protected printTemporalClause(clause: TemporalClause): string;
261
320
  protected printJoin(node: JoinNode): string;
262
321
  protected printOrderBy(node: OrderByNode): string;
263
322
  protected printCTEs(ctes: CTENode[]): string;
@@ -266,9 +325,14 @@ declare class BasePrinter implements Printer {
266
325
  protected printWindowFunction(node: WindowFunctionNode): string;
267
326
  protected printFrameSpec(frame: FrameSpec): string;
268
327
  protected printFrameBound(bound: FrameBound): string;
328
+ protected printMerge(node: MergeNode): string;
329
+ protected printMergeWhenMatched(when: MergeWhenMatched): string;
330
+ protected printMergeWhenNotMatched(when: MergeWhenNotMatched): string;
331
+ protected printAliasedExpr(node: AliasedExprNode): string;
332
+ protected printFullTextSearch(node: FullTextSearchNode): string;
269
333
  }
270
334
  interface Dialect {
271
335
  name: SQLDialect;
272
336
  createPrinter(): Printer;
273
337
  }
274
- export { RawNode as A, createSelectNode as B, IsNullNode as C, OnConflictNode as D, LiteralNode as E, UnaryOpNode as F, JoinType as G, tableRef as H, UpdateNode as I, SQLDialect as J, OrderDirection as K, WindowFunctionNode as L, StarNode as M, SubqueryNode as N, OrderByNode as O, TableRefNode as P, createDeleteNode as R, InsertNode as S, JsonAccessNode as T, CompiledQuery as U, createUpdateNode as V, DialectConfig as W, SetOperator as Y, FrameBound as _, PrinterOptions as a, FunctionCallNode as b, BetweenNode as c, CaseNode as d, CastNode as f, ExpressionNode as g, ExistsNode as h, Printer as i, SelectNode as j, ParamNode as k, BinaryOpNode as l, DeleteNode as m, BasePrinter as n, ASTNode as o, ColumnRefNode as p, Primitive as q, PrintMode as r, ArrayExprNode as s, Dialect as t, CTENode as u, FrameKind as v, JoinNode as w, InNode as x, FrameSpec as y, createInsertNode as z };
338
+ export { JoinType as $, MergeNode as A, TableRefNode as B, FunctionCallNode as C, JoinNode as D, IsNullNode as E, ParamNode as F, createDeleteNode as G, UnaryOpNode as H, RawNode as I, createSelectNode as J, createInsertNode as K, SelectNode as L, MergeWhenNotMatched as M, OnConflictNode as N, JsonAccessNode as O, OrderByNode as P, DialectConfig as Q, StarNode as R, FullTextSearchNode as S, InsertNode as T, UpdateNode as U, TemporalClause as V, WindowFunctionNode as W, tableRef as X, createUpdateNode as Y, CompiledQuery as Z, ExpressionNode as _, PrinterOptions as a, FrameSpec as b, ArrayExprNode as c, CTENode as d, OrderDirection as et, CaseNode as f, ExistsNode as g, DeleteNode as h, Printer as i, MergeWhenMatched as j, LiteralNode as k, BetweenNode as l, ColumnRefNode as m, BasePrinter as n, SQLDialect as nt, ASTNode as o, CastNode as p, createMergeNode as q, PrintMode as r, SetOperator as rt, AliasedExprNode as s, Dialect as t, Primitive as tt, BinaryOpNode as u, FrameBound as v, InNode as w, FullTextSearchMode as x, FrameKind as y, SubqueryNode as z };
package/dist/index.d.mts CHANGED
@@ -1,5 +1,6 @@
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
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";
@@ -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;
@@ -241,6 +261,78 @@ 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
+ }
244
336
  /**
245
337
  * Type-safe DELETE query builder.
246
338
  */
@@ -262,6 +354,8 @@ declare class TypedDeleteBuilder<DB, TB extends keyof DB> {
262
354
  * RETURNING all columns.
263
355
  */
264
356
  returningAll(): TypedDeleteReturningBuilder<DB, TB, SelectRow<DB, TB>>;
357
+ /** WITH (CTE) */
358
+ with(name: string, query: SelectNode, recursive?: boolean): TypedDeleteBuilder<DB, TB>;
265
359
  build(): DeleteNode;
266
360
  compile(printer: Printer): CompiledQuery;
267
361
  }
@@ -305,6 +399,8 @@ declare class TypedInsertBuilder<DB, TB extends keyof DB> {
305
399
  column: keyof DB[TB] & string;
306
400
  value: Expression<any>;
307
401
  }[]): TypedInsertBuilder<DB, TB>;
402
+ /** WITH (CTE) */
403
+ with(name: string, query: SelectNode, recursive?: boolean): TypedInsertBuilder<DB, TB>;
308
404
  build(): InsertNode;
309
405
  compile(printer: Printer): CompiledQuery;
310
406
  }
@@ -315,6 +411,26 @@ declare class TypedInsertReturningBuilder<DB, _TB extends keyof DB, _R> {
315
411
  build(): InsertNode;
316
412
  compile(printer: Printer): CompiledQuery;
317
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
+ }
318
434
  /**
319
435
  * Type-safe SELECT query builder.
320
436
  *
@@ -372,6 +488,8 @@ declare class TypedSelectBuilder<DB, TB extends keyof DB, O> {
372
488
  limit(n: number): TypedSelectBuilder<DB, TB, O>;
373
489
  /** OFFSET */
374
490
  offset(n: number): TypedSelectBuilder<DB, TB, O>;
491
+ /** FOR SYSTEM_TIME (SQL:2011 temporal query) */
492
+ forSystemTime(clause: TemporalClause): TypedSelectBuilder<DB, TB, O>;
375
493
  /** FOR UPDATE */
376
494
  forUpdate(): TypedSelectBuilder<DB, TB, O>;
377
495
  /** WITH (CTE) */
@@ -380,6 +498,14 @@ declare class TypedSelectBuilder<DB, TB extends keyof DB, O> {
380
498
  union(query: TypedSelectBuilder<DB, any, O>): TypedSelectBuilder<DB, TB, O>;
381
499
  /** UNION ALL */
382
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>>;
383
509
  /** Build the AST node. */
384
510
  build(): SelectNode;
385
511
  /** Compile to SQL. */
@@ -417,6 +543,10 @@ declare class TypedUpdateBuilder<DB, TB extends keyof DB> {
417
543
  * RETURNING all columns.
418
544
  */
419
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>;
420
550
  build(): UpdateNode;
421
551
  compile(printer: Printer): CompiledQuery;
422
552
  }
@@ -565,6 +695,22 @@ declare class Sumak<DB> {
565
695
  insertInto<T extends keyof DB & string>(table: T): TypedInsertBuilder<DB, T>;
566
696
  update<T extends keyof DB & string>(table: T): TypedUpdateBuilder<DB, T>;
567
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>;
568
714
  /**
569
715
  * Compile an AST node through the full pipeline:
570
716
  * plugins.transformNode → type-specific hooks → printer → plugins.transformQuery → query hooks
@@ -657,4 +803,4 @@ declare class UnsupportedDialectFeatureError extends SumakError {
657
803
  declare class EmptyQueryError extends SumakError {
658
804
  constructor(queryType: string);
659
805
  }
660
- export { type ASTNode, ASTTransformer, type ASTVisitor, type ArrayExprNode, BasePrinter, type BetweenNode, type BinaryOpNode, type CTENode, CamelCasePlugin, 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 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 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, 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 };
package/dist/index.mjs CHANGED
@@ -1,3 +1,3 @@
1
- import{i as e,n as t,r as n,t as r}from"./_chunks/base.mjs";import{n as i,t as a}from"./_chunks/pg.mjs";import{i as o,n as s,r as ee,t as te}from"./_chunks/errors.mjs";import{n as ne,t as re}from"./_chunks/mysql.mjs";import{n as ie,t as ae}from"./_chunks/sqlite.mjs";import{C as oe,S as se,_ as ce,a as le,b as ue,c as de,d as fe,f as pe,g as me,h as he,i as ge,l as _e,m as ve,n as ye,o as be,p as xe,r as Se,s as c,t as Ce,u as we,v as Te,x as Ee,y as De}from"./_chunks/schema.mjs";function Oe(e,t,n){return Object.freeze({type:`table_ref`,name:e,alias:t,schema:n})}function l(){return{type:`select`,distinct:!1,columns:[],joins:[],groupBy:[],orderBy:[],ctes:[],forUpdate:!1}}function u(e){return{type:`insert`,table:e,columns:[],values:[],returning:[],ctes:[]}}function d(e){return{type:`update`,table:e,set:[],returning:[],ctes:[]}}function f(e){return{type:`delete`,table:e,returning:[],ctes:[]}}function p(e,t){return{type:`column_ref`,column:e,table:t}}function ke(e,t,n){return{type:`column_ref`,column:e,table:n,alias:t}}function m(e){return{type:`literal`,value:e}}function h(e){return{type:`star`,table:e}}function g(e,t){return{type:`param`,index:e,value:t}}function Ae(e,t=[]){return{type:`raw`,sql:e,params:t}}function je(e,t){return{type:`subquery`,query:e,alias:t}}function _(e,t,n){return{type:`function_call`,name:e,args:t,alias:n}}function v(e,t,n){return{type:`binary_op`,op:e,left:t,right:n}}function y(e,t,n=`prefix`){return{type:`unary_op`,op:e,operand:t,position:n}}function b(e,t){return v(`AND`,e,t)}function x(e,t){return v(`OR`,e,t)}function S(e,t){return v(`=`,e,t)}function Me(e,t){return v(`!=`,e,t)}function Ne(e,t){return v(`>`,e,t)}function Pe(e,t){return v(`>=`,e,t)}function Fe(e,t){return v(`<`,e,t)}function Ie(e,t){return v(`<=`,e,t)}function Le(e,t){return v(`LIKE`,e,t)}function Re(e,t,n,r=!1){return{type:`between`,expr:e,low:t,high:n,negated:r}}function ze(e,t,n=!1){return{type:`in`,expr:e,values:t,negated:n}}function C(e,t=!1){return{type:`is_null`,expr:e,negated:t}}function Be(e,t){return{type:`cast`,expr:e,dataType:t}}function Ve(e,t=!1){return{type:`exists`,query:e,negated:t}}function He(e){return y(`NOT`,e)}var Ue=class{transform(e){switch(e.type){case`select`:return this.transformSelect(e);case`insert`:return this.transformInsert(e);case`update`:return this.transformUpdate(e);case`delete`:return this.transformDelete(e);default:return this.transformExpression(e)}}transformSelect(e){return{...e,columns:e.columns.map(e=>this.transformExpression(e)),where:e.where?this.transformExpression(e.where):void 0,having:e.having?this.transformExpression(e.having):void 0,joins:e.joins.map(e=>({...e,on:e.on?this.transformExpression(e.on):void 0})),orderBy:e.orderBy.map(e=>({...e,expr:this.transformExpression(e.expr)}))}}transformInsert(e){return{...e,values:e.values.map(e=>e.map(e=>this.transformExpression(e)))}}transformUpdate(e){return{...e,set:e.set.map(e=>({...e,value:this.transformExpression(e.value)})),where:e.where?this.transformExpression(e.where):void 0}}transformDelete(e){return{...e,where:e.where?this.transformExpression(e.where):void 0}}transformExpression(e){switch(e.type){case`binary_op`:return{...e,left:this.transformExpression(e.left),right:this.transformExpression(e.right)};case`unary_op`:return{...e,operand:this.transformExpression(e.operand)};case`function_call`:return{...e,args:e.args.map(e=>this.transformExpression(e))};case`between`:return{...e,expr:this.transformExpression(e.expr),low:this.transformExpression(e.low),high:this.transformExpression(e.high)};case`in`:return{...e,expr:this.transformExpression(e.expr),values:Array.isArray(e.values)?e.values.map(e=>this.transformExpression(e)):e.values};case`is_null`:return{...e,expr:this.transformExpression(e.expr)};case`cast`:return{...e,expr:this.transformExpression(e.expr)};case`json_access`:return{...e,expr:this.transformExpression(e.expr)};case`array_expr`:return{...e,elements:e.elements.map(e=>this.transformExpression(e))};case`window_function`:return{...e,fn:this.transformExpression(e.fn),partitionBy:e.partitionBy.map(e=>this.transformExpression(e)),orderBy:e.orderBy.map(e=>({...e,expr:this.transformExpression(e.expr)}))};default:return e}}};function We(e,t){switch(e.type){case`select`:return t.visitSelect(e);case`insert`:return t.visitInsert(e);case`update`:return t.visitUpdate(e);case`delete`:return t.visitDelete(e);default:return t.visitExpression(e)}}var w=class e{node;constructor(e){this.node=e??l()}columns(...t){let n=t.map(e=>typeof e==`string`?p(e):e);return new e({...this.node,columns:[...this.node.columns,...n]})}allColumns(){return new e({...this.node,columns:[...this.node.columns,h()]})}distinct(){return new e({...this.node,distinct:!0})}from(t,n){if(typeof t==`string`){let r={type:`table_ref`,name:t,alias:n};return new e({...this.node,from:r})}return n&&t.type!==`subquery`?new e({...this.node,from:{...t,alias:n}}):new e({...this.node,from:t})}where(t){return new e({...this.node,where:t})}join(t,n,r,i){let a={type:`join`,joinType:t,table:typeof n==`string`?{type:`table_ref`,name:n,alias:i}:n,on:r};return new e({...this.node,joins:[...this.node.joins,a]})}innerJoin(e,t,n){return this.join(`INNER`,e,t,n)}leftJoin(e,t,n){return this.join(`LEFT`,e,t,n)}rightJoin(e,t,n){return this.join(`RIGHT`,e,t,n)}groupBy(...t){let n=t.map(e=>typeof e==`string`?p(e):e);return new e({...this.node,groupBy:[...this.node.groupBy,...n]})}having(t){return new e({...this.node,having:t})}orderBy(t,n=`ASC`,r){let i={expr:typeof t==`string`?p(t):t,direction:n,nulls:r};return new e({...this.node,orderBy:[...this.node.orderBy,i]})}limit(t){return new e({...this.node,limit:t})}offset(t){return new e({...this.node,offset:t})}forUpdate(){return new e({...this.node,forUpdate:!0})}with(t,n,r=!1){let i={name:t,query:n,recursive:r};return new e({...this.node,ctes:[...this.node.ctes,i]})}union(e){return this.setOp(`UNION`,e)}unionAll(e){return this.setOp(`UNION ALL`,e)}intersect(e){return this.setOp(`INTERSECT`,e)}except(e){return this.setOp(`EXCEPT`,e)}setOp(t,n){return new e({...this.node,setOp:{op:t,query:n}})}build(){return{...this.node}}};function Ge(...e){let t=new w;return e.length>0?t.columns(...e):t.allColumns()}var T=class e{node;paramIndex;constructor(e,t=0){this.node=e??u({type:`table_ref`,name:``}),this.paramIndex=t}into(t){let n=typeof t==`string`?{type:`table_ref`,name:t}:t;return new e({...this.node,table:n},this.paramIndex)}columns(...t){return new e({...this.node,columns:[...this.node.columns,...t]},this.paramIndex)}values(...t){let n=this.paramIndex,r=t.map(e=>{let t=g(n,e);return n++,t});return new e({...this.node,values:[...this.node.values,r]},n)}returning(...t){return new e({...this.node,returning:[...this.node.returning,...t]},this.paramIndex)}onConflictDoNothing(...t){let n={columns:t,action:`nothing`};return new e({...this.node,onConflict:n},this.paramIndex)}onConflictDoUpdate(t,n,r){let i={columns:t,action:{set:n},where:r};return new e({...this.node,onConflict:i},this.paramIndex)}with(t,n,r=!1){let i={name:t,query:n,recursive:r};return new e({...this.node,ctes:[...this.node.ctes,i]},this.paramIndex)}build(){return{...this.node}}};function Ke(e){return new T().into(e)}var E=class e{node;constructor(e){this.node=e??d({type:`table_ref`,name:``})}table(t){let n=typeof t==`string`?{type:`table_ref`,name:t}:t;return new e({...this.node,table:n})}set(t,n){return new e({...this.node,set:[...this.node.set,{column:t,value:n}]})}where(t){return new e({...this.node,where:t})}from(t){let n=typeof t==`string`?{type:`table_ref`,name:t}:t;return new e({...this.node,from:n})}returning(...t){return new e({...this.node,returning:[...this.node.returning,...t]})}with(t,n,r=!1){let i={name:t,query:n,recursive:r};return new e({...this.node,ctes:[...this.node.ctes,i]})}build(){return{...this.node}}};function qe(e){return new E().table(e)}var D=class e{node;constructor(e){this.node=e??f({type:`table_ref`,name:``})}from(t){let n=typeof t==`string`?{type:`table_ref`,name:t}:t;return new e({...this.node,table:n})}where(t){return new e({...this.node,where:t})}returning(...t){return new e({...this.node,returning:[...this.node.returning,...t]})}with(t,n,r=!1){let i={name:t,query:n,recursive:r};return new e({...this.node,ctes:[...this.node.ctes,i]})}build(){return{...this.node}}};function O(e){return new D().from(e)}const k=new Set(`SELECT.FROM.WHERE.AND.OR.JOIN.INNER JOIN.LEFT JOIN.RIGHT JOIN.FULL JOIN.CROSS JOIN.ON.GROUP BY.HAVING.ORDER BY.LIMIT.OFFSET.INSERT INTO.VALUES.UPDATE.SET.DELETE FROM.RETURNING.WITH.WITH RECURSIVE.UNION.UNION ALL.INTERSECT.EXCEPT.FOR UPDATE.ON CONFLICT.DO NOTHING.DO UPDATE SET`.split(`.`));function Je(e,t={}){let n=t.indent??` `,r=[],i=0,a=Ye(e),o=0;for(;o<a.length;){let e=a[o];if(e===`(`){i++,A(r,e),o++;continue}if(e===`)`){i=Math.max(0,i-1),A(r,e),o++;continue}let t=o+1<a.length?`${e} ${a[o+1]}`:``,s=o+2<a.length?`${e} ${a[o+1]} ${a[o+2]}`:``;if(k.has(s.toUpperCase())){r.push(`${n.repeat(i)}${s}`),o+=3;continue}if(k.has(t.toUpperCase())){r.push(`${n.repeat(i)}${t}`),o+=2;continue}if(k.has(e.toUpperCase())){r.push(`${n.repeat(i)}${e}`),o++;continue}A(r,e),o++}return r.join(`
2
- `)}function A(e,t){e.length===0?e.push(t):e[e.length-1]+=` ${t}`}function Ye(e){let t=[],n=``;for(let r=0;r<e.length;r++){let i=e[r];if(i===`'`||i===`"`){for(n+=i,r++;r<e.length&&e[r]!==i;){if(e[r]===i&&r+1<e.length&&e[r+1]===i){n+=i+i,r+=2;continue}n+=e[r],r++}r<e.length&&(n+=e[r]);continue}if(i===`(`||i===`)`){n.trim()&&(t.push(n.trim()),n=``),t.push(i);continue}if(i===`,`||i===`;`){n.trim()&&(t.push(n.trim()),n=``),t.push(i);continue}if(/\s/.test(i)){n.trim()&&(t.push(n.trim()),n=``);continue}n+=i}return n.trim()&&t.push(n.trim()),t}function j(){return{tag:`empty`}}function M(e){return{tag:`text`,text:e}}function N(){return{tag:`line`}}function Xe(e,t){return{tag:`nest`,indent:e,doc:t}}function Ze(e){return{tag:`group`,doc:e}}function P(...e){let t=e.filter(e=>e.tag!==`empty`);return t.length===0?j():t.length===1?t[0]:{tag:`concat`,docs:t}}function Qe(e,t){if(t.length===0)return j();let n=[];for(let r=0;r<t.length;r++)r>0&&n.push(e),n.push(t[r]);return P(...n)}function $e(e){return P(M(e),N())}function et(e,t=80){let n=``,r=0,i=[[0,`break`,e]];for(;i.length>0;){let[e,a,o]=i.pop();switch(o.tag){case`empty`:break;case`text`:n+=o.text,r+=o.text.length;break;case`line`:a===`flat`?(n+=` `,r+=1):(n+=`
3
- `+` `.repeat(e),r=e);break;case`nest`:i.push([e+o.indent,a,o.doc]);break;case`group`:if(a===`flat`)i.push([e,`flat`,o.doc]);else{let n=tt(o.doc);n!==null&&r+n<=t?i.push([e,`flat`,o.doc]):i.push([e,`break`,o.doc])}break;case`concat`:for(let t=o.docs.length-1;t>=0;t--)i.push([e,a,o.docs[t]]);break}}return n}function tt(e){let t=0,n=[e];for(;n.length>0;){let e=n.pop();switch(e.tag){case`empty`:break;case`text`:t+=e.text.length;break;case`line`:t+=1;break;case`nest`:n.push(e.doc);break;case`group`:n.push(e.doc);break;case`concat`:for(let t=e.docs.length-1;t>=0;t--)n.push(e.docs[t]);break}}return t}var F=class{_node;constructor(e,t){this._node=p(e,t)}eq(e){return B(z(`=`,this._node,R(e)))}neq(e){return B(z(`!=`,this._node,R(e)))}gt(e){return B(z(`>`,this._node,R(e)))}gte(e){return B(z(`>=`,this._node,R(e)))}lt(e){return B(z(`<`,this._node,R(e)))}lte(e){return B(z(`<=`,this._node,R(e)))}like(e){return B(z(`LIKE`,this._node,m(e)))}in(e){return B({type:`in`,expr:this._node,values:e.map(e=>R(e)),negated:!1})}notIn(e){return B({type:`in`,expr:this._node,values:e.map(e=>R(e)),negated:!0})}isNull(){return B({type:`is_null`,expr:this._node,negated:!1})}isNotNull(){return B({type:`is_null`,expr:this._node,negated:!0})}between(e,t){return B({type:`between`,expr:this._node,low:R(e),high:R(t),negated:!1})}eqCol(e){return B(z(`=`,this._node,e._node))}toExpr(){return B(this._node)}};let I=0;function L(){I=0}function R(e){return g(I++,e)}function z(e,t,n){return{type:`binary_op`,op:e,left:t,right:n}}function B(e){return{node:e}}function V(e){return new Proxy({},{get(e,t){return new F(t,void 0)}})}function nt(e,t){return B(b(e.node,t.node))}function rt(e,t){return B(x(e.node,t.node))}function it(e){return B(m(e))}function at(e,...t){return B(_(e,t.map(e=>e.node)))}function ot(){return B(_(`COUNT`,[h()]))}function H(e){return e.node}var U=class e{_builder;constructor(e){this._builder=new D().from(e)}_with(t){let n=new e(``);return n._builder=t,n}where(e){if(typeof e==`function`){L();let t=this._builder.build().table.name,n=e(V(t));return this._with(this._builder.where(H(n)))}return this._with(this._builder.where(H(e)))}returning(...e){let t=e.map(e=>({type:`column_ref`,column:e}));return new W(new D({...this._builder.build(),returning:t}))}returningAll(){return new W(new D({...this._builder.build(),returning:[h()]}))}build(){return this._builder.build()}compile(e){return e.print(this.build())}},W=class{_builder;constructor(e){this._builder=e}build(){return this._builder.build()}compile(e){return e.print(this.build())}},G=class e{_builder;_paramIdx;constructor(e,t=0){this._builder=new T().into(e),this._paramIdx=t}_withBuilder(t,n){let r=new e(``);return r._builder=t,r._paramIdx=n,r}values(e){let t=Object.entries(e),n=t.map(([e])=>e),r=t.map(([e,t])=>{let n=g(this._paramIdx,t);return this._paramIdx++,n}),i=this._builder;return i.build().columns.length===0&&(i=i.columns(...n)),i=new T({...i.build(),values:[...i.build().values,r]},this._paramIdx),this._withBuilder(i,this._paramIdx)}returning(...e){let t=e.map(e=>({type:`column_ref`,column:e}));return new K(new T({...this._builder.build(),returning:t},this._paramIdx))}returningAll(){return new K(new T({...this._builder.build(),returning:[h()]},this._paramIdx))}onConflictDoNothing(...e){return this._withBuilder(this._builder.onConflictDoNothing(...e),this._paramIdx)}onConflictDoUpdate(e,t){return this._withBuilder(this._builder.onConflictDoUpdate(e,t.map(e=>({column:e.column,value:H(e.value)}))),this._paramIdx)}build(){return this._builder.build()}compile(e){return e.print(this.build())}},K=class{_builder;constructor(e){this._builder=e}build(){return this._builder.build()}compile(e){return e.print(this.build())}},q=class e{_builder;_table;constructor(e,t){this._builder=e,this._table=t??``}select(...t){return new e(this._builder.columns(...t),this._table)}selectAll(){return new e(this._builder.allColumns(),this._table)}selectExpr(t,n){let r=H(t),i=r.type===`column_ref`||r.type===`function_call`?{...r,alias:n}:{type:`raw`,sql:``,params:[]};return new e(this._builder.columns(i),this._table)}distinct(){return new e(this._builder.distinct(),this._table)}where(t){if(typeof t==`function`){L();let n=t(V(this._table));return new e(this._builder.where(H(n)),this._table)}return new e(this._builder.where(H(t)),this._table)}innerJoin(t,n){let r=J(n,this._table,t);return new e(this._builder.innerJoin(t,H(r)),this._table)}leftJoin(t,n){let r=J(n,this._table,t);return new e(this._builder.leftJoin(t,H(r)),this._table)}rightJoin(t,n){let r=J(n,this._table,t);return new e(this._builder.rightJoin(t,H(r)),this._table)}groupBy(...t){return new e(this._builder.groupBy(...t),this._table)}having(t){if(typeof t==`function`){L();let n=t(V(this._table));return new e(this._builder.having(H(n)),this._table)}return new e(this._builder.having(H(t)),this._table)}orderBy(t,n=`ASC`,r){return new e(this._builder.orderBy(t,n,r),this._table)}limit(t){return new e(this._builder.limit({type:`literal`,value:t}),this._table)}offset(t){return new e(this._builder.offset({type:`literal`,value:t}),this._table)}forUpdate(){return new e(this._builder.forUpdate(),this._table)}with(t,n,r=!1){return new e(this._builder.with(t,n,r),this._table)}union(t){return new e(this._builder.union(t.build()),this._table)}unionAll(t){return new e(this._builder.unionAll(t.build()),this._table)}build(){return this._builder.build()}compile(e){return e.print(this.build())}};function st(e,t){return new Proxy({},{get(e,t){return new Proxy({},{get(e,n){return new F(n,t)}})}})}function J(e,t,n){return typeof e==`function`?e(st(t,n)):e}var Y=class e{_builder;_paramIdx;constructor(e,t=0){this._builder=new E().table(e),this._paramIdx=t}_with(t,n){let r=new e(``);return r._builder=t,r._paramIdx=n,r}set(e){let t=this._builder,n=this._paramIdx;for(let[r,i]of Object.entries(e))i!==void 0&&(t=t.set(r,g(n,i)),n++);return this._with(t,n)}setExpr(e,t){return this._with(this._builder.set(e,H(t)),this._paramIdx)}where(e){if(typeof e==`function`){L();let t=e(V(this._table));return this._with(this._builder.where(H(t)),this._paramIdx)}return this._with(this._builder.where(H(e)),this._paramIdx)}get _table(){return this._builder.build().table.name}returning(...e){let t=e.map(e=>({type:`column_ref`,column:e}));return new X(new E({...this._builder.build(),returning:t}))}returningAll(){return new X(new E({...this._builder.build(),returning:[h()]}))}build(){return this._builder.build()}compile(e){return e.print(this.build())}},X=class{_builder;constructor(e){this._builder=e}build(){return this._builder.build()}compile(e){return e.print(this.build())}},Z=class{_hooks=new Map;hook(e,t){return this._hooks.has(e)||this._hooks.set(e,[]),this._hooks.get(e).push(t),()=>{let n=this._hooks.get(e);if(n){let e=n.indexOf(t);e!==-1&&n.splice(e,1)}}}callHook(e,...t){let n=this._hooks.get(e);if(!n||n.length===0)return;let r;for(let i of n){let n=i(...t);n!==void 0&&(r=n,e!==`result:transform`&&t[0]&&typeof t[0]==`object`&&`node`in t[0]&&(t[0].node=n))}return r}hasHook(e){let t=this._hooks.get(e);return t!==void 0&&t.length>0}removeHook(e){this._hooks.delete(e)}removeAllHooks(){this._hooks.clear()}},Q=class{plugins;constructor(e){this.plugins=Object.freeze([...e])}transformNode(e){let t=e;for(let e of this.plugins)e.transformNode&&(t=e.transformNode(t));return t}transformQuery(e){let t=e;for(let e of this.plugins)e.transformQuery&&(t=e.transformQuery(t));return t}transformResult(e){let t=e;for(let e of this.plugins)e.transformResult&&(t=e.transformResult(t));return t}};function ct(e){return new $(e.dialect,e.plugins??[])}var $=class{_dialect;_plugins;_hooks;constructor(e,t=[]){this._dialect=e,this._plugins=new Q(t),this._hooks=new Z}hook(e,t){return this._hooks.hook(e,t)}selectFrom(e,t){return new q(new w().from(e,t),e)}insertInto(e){return new G(e)}update(e){return new Y(e)}deleteFrom(e){return new U(e)}compile(e){let t=this._plugins.transformNode(e),n=this._extractTableName(t);switch(t.type){case`select`:{let e=this._hooks.callHook(`select:before`,{node:t,table:n});e&&(t=e);break}case`insert`:{let e=this._hooks.callHook(`insert:before`,{node:t,table:n});e&&(t=e);break}case`update`:{let e=this._hooks.callHook(`update:before`,{node:t,table:n});e&&(t=e);break}case`delete`:{let e=this._hooks.callHook(`delete:before`,{node:t,table:n});e&&(t=e);break}}let r=this._hooks.callHook(`query:before`,{node:t,table:n});r&&(t=r);let i=this._dialect.createPrinter().print(t);i=this._plugins.transformQuery(i);let a=this._hooks.callHook(`query:after`,{node:t,table:n,query:i});return a&&(i=a),i}transformResult(e){let t=this._plugins.transformResult(e),n=this._hooks.callHook(`result:transform`,t);return n&&(t=n),t}printer(){return this._dialect.createPrinter()}_extractTableName(e){switch(e.type){case`select`:return e.from?.type===`table_ref`?e.from.name:void 0;case`insert`:return e.table.name;case`update`:return e.table.name;case`delete`:return e.table.name;default:return}}},lt=class{name=`with-schema`;schema;constructor(e){this.schema=e}transformNode(e){switch(e.type){case`select`:return this.transformSelect(e);case`insert`:return this.transformInsert(e);case`update`:return this.transformUpdate(e);case`delete`:return this.transformDelete(e);default:return e}}addSchema(e){return e.schema?e:{...e,schema:this.schema}}transformSelect(e){return{...e,from:e.from?e.from.type===`table_ref`?this.addSchema(e.from):e.from:void 0,joins:e.joins.map(e=>({...e,table:e.table.type===`table_ref`?this.addSchema(e.table):e.table}))}}transformInsert(e){return{...e,table:this.addSchema(e.table)}}transformUpdate(e){return{...e,table:this.addSchema(e.table),from:e.from?this.addSchema(e.from):void 0}}transformDelete(e){return{...e,table:this.addSchema(e.table)}}},ut=class{name=`soft-delete`;tables;column;constructor(e){this.tables=new Set(e.tables),this.column=e.column??`deleted_at`}transformNode(e){switch(e.type){case`select`:return this.transformSelect(e);case`update`:return this.transformUpdate(e);case`delete`:return this.transformDelete(e);default:return e}}isTargetTable(e){return this.tables.has(e)}softDeleteCondition(){return C(p(this.column))}addCondition(e){let t=this.softDeleteCondition();return e?b(e,t):t}transformSelect(e){return!e.from||e.from.type!==`table_ref`||!this.isTargetTable(e.from.name)?e:{...e,where:this.addCondition(e.where)}}transformUpdate(e){return this.isTargetTable(e.table.name)?{...e,where:this.addCondition(e.where)}:e}transformDelete(e){return this.isTargetTable(e.table.name)?{...e,where:this.addCondition(e.where)}:e}},dt=class{name=`camel-case`;transformResult(e){return e.map(e=>{let t={};for(let n of Object.keys(e))t[ft(n)]=e[n];return t})}};function ft(e){return e.replace(/_([a-z])/g,(e,t)=>t.toUpperCase())}export{Ue as ASTTransformer,r as BasePrinter,dt as CamelCasePlugin,F as Col,ye as ColumnBuilder,D as DeleteBuilder,te as EmptyQueryError,Z as Hookable,T as InsertBuilder,s as InvalidExpressionError,ne as MysqlPrinter,i as PgPrinter,Q as PluginManager,w as SelectBuilder,ut as SoftDeletePlugin,ie as SqlitePrinter,$ as Sumak,ee as SumakError,U as TypedDeleteBuilder,W as TypedDeleteReturningBuilder,G as TypedInsertBuilder,K as TypedInsertReturningBuilder,q as TypedSelectBuilder,Y as TypedUpdateBuilder,X as TypedUpdateReturningBuilder,o as UnsupportedDialectFeatureError,E as UpdateBuilder,lt as WithSchemaPlugin,nt as and,Re as between,Se as bigint,ge as bigserial,v as binOp,le as boolean,be as bytea,Be as cast,c as char,p as col,ke as colAs,ot as count,f as createDeleteNode,u as createInsertNode,l as createSelectNode,d as createUpdateNode,de as date,Ce as defineTable,O as deleteFrom,P as docConcat,j as docEmpty,Ze as docGroup,Qe as docJoin,N as docLine,Xe as docNest,et as docRender,M as docText,$e as docTextLine,_e as doublePrecision,we as enumType,S as eq,Ve as exists,_ as fn,t as formatParam,Je as formatSQL,Ne as gt,Pe as gte,ze as inList,Ke as insert,fe as integer,C as isNull,pe as json,xe as jsonb,Le as like,m as lit,Fe as lt,Ie as lte,re as mysqlDialect,Me as neq,He as not,ve as numeric,rt as or,g as param,a as pgDialect,n as quoteIdentifier,e as quoteTableRef,Ae as raw,he as real,L as resetParams,Ge as select,me as serial,ce as smallint,at as sqlFn,ae as sqliteDialect,h as star,je as subquery,ct as sumak,Oe as tableRef,Te as text,De as time,ue as timestamp,Ee as timestamptz,y as unaryOp,qe as update,se as uuid,it as val,oe as varchar,We as visitNode};
1
+ import{i as e,n as t,r as n,t as r}from"./_chunks/base.mjs";import{n as i,t as a}from"./_chunks/pg.mjs";import{i as o,n as s,r as ee,t as te}from"./_chunks/errors.mjs";import{n as ne,t as re}from"./_chunks/mssql.mjs";import{n as ie,t as ae}from"./_chunks/mysql.mjs";import{n as oe,t as se}from"./_chunks/sqlite.mjs";import{C as ce,S as le,_ as ue,a as de,b as fe,c as pe,d as me,f as he,g as ge,h as _e,i as ve,l as ye,m as be,n as xe,o as Se,p as Ce,r as we,s as Te,t as Ee,u as De,v as Oe,x as ke,y as Ae}from"./_chunks/schema.mjs";function c(e,t,n,r){return{type:`merge`,target:e,source:t,sourceAlias:n,on:r,whens:[],ctes:[]}}function je(e,t,n){return Object.freeze({type:`table_ref`,name:e,alias:t,schema:n})}function l(){return{type:`select`,distinct:!1,columns:[],joins:[],groupBy:[],orderBy:[],ctes:[],forUpdate:!1}}function u(e){return{type:`insert`,table:e,columns:[],values:[],returning:[],ctes:[]}}function d(e){return{type:`update`,table:e,set:[],returning:[],ctes:[]}}function f(e){return{type:`delete`,table:e,returning:[],ctes:[]}}function p(e,t){return{type:`column_ref`,column:e,table:t}}function Me(e,t,n){return{type:`column_ref`,column:e,table:n,alias:t}}function m(e){return{type:`literal`,value:e}}function h(e){return{type:`star`,table:e}}function g(e,t){return{type:`param`,index:e,value:t}}function Ne(e,t=[]){return{type:`raw`,sql:e,params:t}}function Pe(e,t){return{type:`subquery`,query:e,alias:t}}function _(e,t,n){return{type:`function_call`,name:e,args:t,alias:n}}function v(e,t,n){return{type:`binary_op`,op:e,left:t,right:n}}function y(e,t,n=`prefix`){return{type:`unary_op`,op:e,operand:t,position:n}}function b(e,t){return v(`AND`,e,t)}function Fe(e,t){return v(`OR`,e,t)}function Ie(e,t){return v(`=`,e,t)}function Le(e,t){return v(`!=`,e,t)}function Re(e,t){return v(`>`,e,t)}function ze(e,t){return v(`>=`,e,t)}function Be(e,t){return v(`<`,e,t)}function Ve(e,t){return v(`<=`,e,t)}function He(e,t){return v(`LIKE`,e,t)}function Ue(e,t,n,r=!1){return{type:`between`,expr:e,low:t,high:n,negated:r}}function We(e,t,n=!1){return{type:`in`,expr:e,values:t,negated:n}}function x(e,t=!1){return{type:`is_null`,expr:e,negated:t}}function Ge(e,t){return{type:`cast`,expr:e,dataType:t}}function S(e,t=!1){return{type:`exists`,query:e,negated:t}}function Ke(e){return y(`NOT`,e)}var qe=class{transform(e){switch(e.type){case`select`:return this.transformSelect(e);case`insert`:return this.transformInsert(e);case`update`:return this.transformUpdate(e);case`delete`:return this.transformDelete(e);case`merge`:return this.transformMerge(e);default:return this.transformExpression(e)}}transformSelect(e){return{...e,columns:e.columns.map(e=>this.transformExpression(e)),where:e.where?this.transformExpression(e.where):void 0,having:e.having?this.transformExpression(e.having):void 0,joins:e.joins.map(e=>({...e,on:e.on?this.transformExpression(e.on):void 0})),orderBy:e.orderBy.map(e=>({...e,expr:this.transformExpression(e.expr)}))}}transformInsert(e){return{...e,values:e.values.map(e=>e.map(e=>this.transformExpression(e)))}}transformUpdate(e){return{...e,set:e.set.map(e=>({...e,value:this.transformExpression(e.value)})),where:e.where?this.transformExpression(e.where):void 0}}transformDelete(e){return{...e,where:e.where?this.transformExpression(e.where):void 0}}transformMerge(e){return{...e,on:this.transformExpression(e.on),whens:e.whens.map(e=>e.type===`matched`?{...e,condition:e.condition?this.transformExpression(e.condition):void 0,set:e.set?.map(e=>({...e,value:this.transformExpression(e.value)}))}:{...e,condition:e.condition?this.transformExpression(e.condition):void 0,values:e.values.map(e=>this.transformExpression(e))})}}transformExpression(e){switch(e.type){case`binary_op`:return{...e,left:this.transformExpression(e.left),right:this.transformExpression(e.right)};case`unary_op`:return{...e,operand:this.transformExpression(e.operand)};case`function_call`:return{...e,args:e.args.map(e=>this.transformExpression(e))};case`between`:return{...e,expr:this.transformExpression(e.expr),low:this.transformExpression(e.low),high:this.transformExpression(e.high)};case`in`:return{...e,expr:this.transformExpression(e.expr),values:Array.isArray(e.values)?e.values.map(e=>this.transformExpression(e)):e.values};case`is_null`:return{...e,expr:this.transformExpression(e.expr)};case`cast`:return{...e,expr:this.transformExpression(e.expr)};case`json_access`:return{...e,expr:this.transformExpression(e.expr)};case`array_expr`:return{...e,elements:e.elements.map(e=>this.transformExpression(e))};case`window_function`:return{...e,fn:this.transformExpression(e.fn),partitionBy:e.partitionBy.map(e=>this.transformExpression(e)),orderBy:e.orderBy.map(e=>({...e,expr:this.transformExpression(e.expr)}))};case`aliased_expr`:return{...e,expr:this.transformExpression(e.expr)};case`full_text_search`:return{...e,columns:e.columns.map(e=>this.transformExpression(e)),query:this.transformExpression(e.query)};default:return e}}};function Je(e,t){switch(e.type){case`select`:return t.visitSelect(e);case`insert`:return t.visitInsert(e);case`update`:return t.visitUpdate(e);case`delete`:return t.visitDelete(e);case`merge`:return t.visitMerge(e);default:return t.visitExpression(e)}}var C=class e{node;paramIndex;constructor(e,t=0){this.node=e??c({type:`table_ref`,name:``},{type:`table_ref`,name:``},`src`,{type:`literal`,value:!0}),this.paramIndex=t}into(t){let n=typeof t==`string`?{type:`table_ref`,name:t}:t;return new e({...this.node,target:n},this.paramIndex)}using(t,n){let r=typeof t==`string`?{type:`table_ref`,name:t}:t;return new e({...this.node,source:r,sourceAlias:n},this.paramIndex)}on(t){return new e({...this.node,on:t},this.paramIndex)}whenMatched(t){return new e({...this.node,whens:[...this.node.whens,t]},this.paramIndex)}whenNotMatched(t){return new e({...this.node,whens:[...this.node.whens,t]},this.paramIndex)}whenMatchedUpdate(e,t){let n={type:`matched`,action:`update`,set:e,condition:t};return this.whenMatched(n)}whenMatchedDelete(e){let t={type:`matched`,action:`delete`,condition:e};return this.whenMatched(t)}whenNotMatchedInsert(e,t,n){let r={type:`not_matched`,columns:e,values:t,condition:n};return this.whenNotMatched(r)}with(t,n,r=!1){let i={name:t,query:n,recursive:r};return new e({...this.node,ctes:[...this.node.ctes,i]},this.paramIndex)}build(){return{...this.node}}};function Ye(e){return new C().into(e)}var w=class e{node;constructor(e){this.node=e??l()}columns(...t){let n=t.map(e=>typeof e==`string`?p(e):e);return new e({...this.node,columns:[...this.node.columns,...n]})}allColumns(){return new e({...this.node,columns:[...this.node.columns,h()]})}distinct(){return new e({...this.node,distinct:!0})}from(t,n){if(typeof t==`string`){let r={type:`table_ref`,name:t,alias:n};return new e({...this.node,from:r})}return n&&t.type!==`subquery`?new e({...this.node,from:{...t,alias:n}}):new e({...this.node,from:t})}where(t){return new e({...this.node,where:t})}join(t,n,r,i){let a={type:`join`,joinType:t,table:typeof n==`string`?{type:`table_ref`,name:n,alias:i}:n,on:r};return new e({...this.node,joins:[...this.node.joins,a]})}innerJoin(e,t,n){return this.join(`INNER`,e,t,n)}leftJoin(e,t,n){return this.join(`LEFT`,e,t,n)}rightJoin(e,t,n){return this.join(`RIGHT`,e,t,n)}groupBy(...t){let n=t.map(e=>typeof e==`string`?p(e):e);return new e({...this.node,groupBy:[...this.node.groupBy,...n]})}having(t){return new e({...this.node,having:t})}orderBy(t,n=`ASC`,r){let i={expr:typeof t==`string`?p(t):t,direction:n,nulls:r};return new e({...this.node,orderBy:[...this.node.orderBy,i]})}limit(t){return new e({...this.node,limit:t})}offset(t){return new e({...this.node,offset:t})}forSystemTime(t){return!this.node.from||this.node.from.type!==`table_ref`?this:new e({...this.node,from:{...this.node.from,temporal:t}})}forUpdate(){return new e({...this.node,forUpdate:!0})}with(t,n,r=!1){let i={name:t,query:n,recursive:r};return new e({...this.node,ctes:[...this.node.ctes,i]})}union(e){return this.setOp(`UNION`,e)}unionAll(e){return this.setOp(`UNION ALL`,e)}intersect(e){return this.setOp(`INTERSECT`,e)}except(e){return this.setOp(`EXCEPT`,e)}setOp(t,n){return new e({...this.node,setOp:{op:t,query:n}})}build(){return{...this.node}}};function Xe(...e){let t=new w;return e.length>0?t.columns(...e):t.allColumns()}var T=class e{node;paramIndex;constructor(e,t=0){this.node=e??u({type:`table_ref`,name:``}),this.paramIndex=t}into(t){let n=typeof t==`string`?{type:`table_ref`,name:t}:t;return new e({...this.node,table:n},this.paramIndex)}columns(...t){return new e({...this.node,columns:[...this.node.columns,...t]},this.paramIndex)}values(...t){let n=this.paramIndex,r=t.map(e=>{let t=g(n,e);return n++,t});return new e({...this.node,values:[...this.node.values,r]},n)}returning(...t){return new e({...this.node,returning:[...this.node.returning,...t]},this.paramIndex)}onConflictDoNothing(...t){let n={columns:t,action:`nothing`};return new e({...this.node,onConflict:n},this.paramIndex)}onConflictDoUpdate(t,n,r){let i={columns:t,action:{set:n},where:r};return new e({...this.node,onConflict:i},this.paramIndex)}with(t,n,r=!1){let i={name:t,query:n,recursive:r};return new e({...this.node,ctes:[...this.node.ctes,i]},this.paramIndex)}build(){return{...this.node}}};function Ze(e){return new T().into(e)}var E=class e{node;constructor(e){this.node=e??d({type:`table_ref`,name:``})}table(t){let n=typeof t==`string`?{type:`table_ref`,name:t}:t;return new e({...this.node,table:n})}set(t,n){return new e({...this.node,set:[...this.node.set,{column:t,value:n}]})}where(t){return new e({...this.node,where:t})}from(t){let n=typeof t==`string`?{type:`table_ref`,name:t}:t;return new e({...this.node,from:n})}returning(...t){return new e({...this.node,returning:[...this.node.returning,...t]})}with(t,n,r=!1){let i={name:t,query:n,recursive:r};return new e({...this.node,ctes:[...this.node.ctes,i]})}build(){return{...this.node}}};function Qe(e){return new E().table(e)}var D=class e{node;constructor(e){this.node=e??f({type:`table_ref`,name:``})}from(t){let n=typeof t==`string`?{type:`table_ref`,name:t}:t;return new e({...this.node,table:n})}where(t){return new e({...this.node,where:t})}returning(...t){return new e({...this.node,returning:[...this.node.returning,...t]})}with(t,n,r=!1){let i={name:t,query:n,recursive:r};return new e({...this.node,ctes:[...this.node.ctes,i]})}build(){return{...this.node}}};function $e(e){return new D().from(e)}const O=new Set(`SELECT.FROM.WHERE.AND.OR.JOIN.INNER JOIN.LEFT JOIN.RIGHT JOIN.FULL JOIN.CROSS JOIN.ON.GROUP BY.HAVING.ORDER BY.LIMIT.OFFSET.INSERT INTO.VALUES.UPDATE.SET.DELETE FROM.RETURNING.WITH.WITH RECURSIVE.UNION.UNION ALL.INTERSECT.EXCEPT.FOR UPDATE.ON CONFLICT.DO NOTHING.DO UPDATE SET`.split(`.`));function et(e,t={}){let n=t.indent??` `,r=[],i=0,a=tt(e),o=0;for(;o<a.length;){let e=a[o];if(e===`(`){i++,k(r,e),o++;continue}if(e===`)`){i=Math.max(0,i-1),k(r,e),o++;continue}let t=o+1<a.length?`${e} ${a[o+1]}`:``,s=o+2<a.length?`${e} ${a[o+1]} ${a[o+2]}`:``;if(O.has(s.toUpperCase())){r.push(`${n.repeat(i)}${s}`),o+=3;continue}if(O.has(t.toUpperCase())){r.push(`${n.repeat(i)}${t}`),o+=2;continue}if(O.has(e.toUpperCase())){r.push(`${n.repeat(i)}${e}`),o++;continue}k(r,e),o++}return r.join(`
2
+ `)}function k(e,t){e.length===0?e.push(t):e[e.length-1]+=` ${t}`}function tt(e){let t=[],n=``;for(let r=0;r<e.length;r++){let i=e[r];if(i===`'`||i===`"`){for(n+=i,r++;r<e.length&&e[r]!==i;){if(e[r]===i&&r+1<e.length&&e[r+1]===i){n+=i+i,r+=2;continue}n+=e[r],r++}r<e.length&&(n+=e[r]);continue}if(i===`(`||i===`)`){n.trim()&&(t.push(n.trim()),n=``),t.push(i);continue}if(i===`,`||i===`;`){n.trim()&&(t.push(n.trim()),n=``),t.push(i);continue}if(/\s/.test(i)){n.trim()&&(t.push(n.trim()),n=``);continue}n+=i}return n.trim()&&t.push(n.trim()),t}function A(){return{tag:`empty`}}function j(e){return{tag:`text`,text:e}}function M(){return{tag:`line`}}function nt(e,t){return{tag:`nest`,indent:e,doc:t}}function rt(e){return{tag:`group`,doc:e}}function N(...e){let t=e.filter(e=>e.tag!==`empty`);return t.length===0?A():t.length===1?t[0]:{tag:`concat`,docs:t}}function it(e,t){if(t.length===0)return A();let n=[];for(let r=0;r<t.length;r++)r>0&&n.push(e),n.push(t[r]);return N(...n)}function at(e){return N(j(e),M())}function ot(e,t=80){let n=``,r=0,i=[[0,`break`,e]];for(;i.length>0;){let[e,a,o]=i.pop();switch(o.tag){case`empty`:break;case`text`:n+=o.text,r+=o.text.length;break;case`line`:a===`flat`?(n+=` `,r+=1):(n+=`
3
+ `+` `.repeat(e),r=e);break;case`nest`:i.push([e+o.indent,a,o.doc]);break;case`group`:if(a===`flat`)i.push([e,`flat`,o.doc]);else{let n=st(o.doc);n!==null&&r+n<=t?i.push([e,`flat`,o.doc]):i.push([e,`break`,o.doc])}break;case`concat`:for(let t=o.docs.length-1;t>=0;t--)i.push([e,a,o.docs[t]]);break}}return n}function st(e){let t=0,n=[e];for(;n.length>0;){let e=n.pop();switch(e.tag){case`empty`:break;case`text`:t+=e.text.length;break;case`line`:t+=1;break;case`nest`:n.push(e.doc);break;case`group`:n.push(e.doc);break;case`concat`:for(let t=e.docs.length-1;t>=0;t--)n.push(e.docs[t]);break}}return t}var P=class{_node;constructor(e,t){this._node=p(e,t)}eq(e){return z(R(`=`,this._node,L(e)))}neq(e){return z(R(`!=`,this._node,L(e)))}gt(e){return z(R(`>`,this._node,L(e)))}gte(e){return z(R(`>=`,this._node,L(e)))}lt(e){return z(R(`<`,this._node,L(e)))}lte(e){return z(R(`<=`,this._node,L(e)))}like(e){return z(R(`LIKE`,this._node,m(e)))}in(e){return z({type:`in`,expr:this._node,values:e.map(e=>L(e)),negated:!1})}notIn(e){return z({type:`in`,expr:this._node,values:e.map(e=>L(e)),negated:!0})}isNull(){return z({type:`is_null`,expr:this._node,negated:!1})}isNotNull(){return z({type:`is_null`,expr:this._node,negated:!0})}between(e,t){return z({type:`between`,expr:this._node,low:L(e),high:L(t),negated:!1})}eqCol(e){return z(R(`=`,this._node,e._node))}toExpr(){return z(this._node)}};let F=0;function I(){F=0}function L(e){return g(F++,e)}function R(e,t,n){return{type:`binary_op`,op:e,left:t,right:n}}function z(e){return{node:e}}function B(e){return new Proxy({},{get(e,t){return new P(t,void 0)}})}function ct(e,t){return z(b(e.node,t.node))}function lt(e,t){return z(Fe(e.node,t.node))}function ut(e){return z(m(e))}function dt(e,...t){return z(_(e,t.map(e=>e.node)))}function ft(){return z(_(`COUNT`,[h()]))}function pt(e){return z(_(`SUM`,[e.node]))}function mt(e){return z(_(`AVG`,[e.node]))}function ht(e){return z(_(`MIN`,[e.node]))}function gt(e){return z(_(`MAX`,[e.node]))}function _t(e,t){return z(_(`COALESCE`,[e.node,t.node]))}function vt(e){return z(Ke(e.node))}function yt(e){return z(S(e))}function bt(e){return z(S(e,!0))}function xt(e,t){return z(Ge(e.node,t))}function St(e,t,n=`->`){return z({type:`json_access`,expr:e.node,path:t,operator:n})}function Ct(e,t,n){return z({type:`full_text_search`,columns:e.map(e=>e.node),query:t.node,mode:n?.mode,language:n?.language})}function wt(e){return new V(e?e.node:void 0,[])}var V=class e{_operand;_whens;_else;constructor(e,t,n){this._operand=e,this._whens=t,this._else=n}when(t,n){return new e(this._operand,[...this._whens,{condition:t.node,result:n.node}])}else_(t){return new e(this._operand,this._whens,t.node)}end(){return z({type:`case`,operand:this._operand,whens:this._whens,else_:this._else})}};function H(e){return e.node}var U=class e{_builder;constructor(e){this._builder=new D().from(e)}_with(t){let n=new e(``);return n._builder=t,n}where(e){if(typeof e==`function`){I();let t=this._builder.build().table.name,n=e(B(t));return this._with(this._builder.where(H(n)))}return this._with(this._builder.where(H(e)))}returning(...e){let t=e.map(e=>({type:`column_ref`,column:e}));return new W(new D({...this._builder.build(),returning:t}))}returningAll(){return new W(new D({...this._builder.build(),returning:[h()]}))}with(e,t,n=!1){return this._with(this._builder.with(e,t,n))}build(){return this._builder.build()}compile(e){return e.print(this.build())}},W=class{_builder;constructor(e){this._builder=e}build(){return this._builder.build()}compile(e){return e.print(this.build())}},G=class e{_builder;_paramIdx;constructor(e,t=0){this._builder=new T().into(e),this._paramIdx=t}_withBuilder(t,n){let r=new e(``);return r._builder=t,r._paramIdx=n,r}values(e){let t=Object.entries(e),n=t.map(([e])=>e),r=t.map(([e,t])=>{let n=g(this._paramIdx,t);return this._paramIdx++,n}),i=this._builder;return i.build().columns.length===0&&(i=i.columns(...n)),i=new T({...i.build(),values:[...i.build().values,r]},this._paramIdx),this._withBuilder(i,this._paramIdx)}returning(...e){let t=e.map(e=>({type:`column_ref`,column:e}));return new K(new T({...this._builder.build(),returning:t},this._paramIdx))}returningAll(){return new K(new T({...this._builder.build(),returning:[h()]},this._paramIdx))}onConflictDoNothing(...e){return this._withBuilder(this._builder.onConflictDoNothing(...e),this._paramIdx)}onConflictDoUpdate(e,t){return this._withBuilder(this._builder.onConflictDoUpdate(e,t.map(e=>({column:e.column,value:H(e.value)}))),this._paramIdx)}with(e,t,n=!1){return this._withBuilder(this._builder.with(e,t,n),this._paramIdx)}build(){return this._builder.build()}compile(e){return e.print(this.build())}},K=class{_builder;constructor(e){this._builder=e}build(){return this._builder.build()}compile(e){return e.print(this.build())}};function q(e,t){let n=e=>new Proxy({},{get(t,n){return new P(n,e)}});return{target:n(e),source:n(t)}}var J=class e{_builder;_targetTable;_sourceAlias;_paramIdx;constructor(e,t,n,r,i=0){this._targetTable=e,this._sourceAlias=n,this._paramIdx=i,this._builder=new C().into(e).using(t,n).on(H(r))}_with(t,n){let r=new e(``,``,``,{node:{type:`literal`,value:!0}});return r._builder=t,r._targetTable=this._targetTable,r._sourceAlias=this._sourceAlias,r._paramIdx=n,r}whenMatchedThenUpdate(e,t){let n=this._paramIdx,r=[];for(let[t,i]of Object.entries(e))i!==void 0&&(r.push({column:t,value:g(n,i)}),n++);let i;return t&&(I(),i=H(t(q(this._targetTable,this._sourceAlias)))),this._with(this._builder.whenMatchedUpdate(r,i),n)}whenMatchedThenDelete(e){let t;return e&&(I(),t=H(e(q(this._targetTable,this._sourceAlias)))),this._with(this._builder.whenMatchedDelete(t),this._paramIdx)}whenNotMatchedThenInsert(e,t){let n=this._paramIdx,r=Object.entries(e),i=r.map(([e])=>e),a=r.map(([e,t])=>{let r=g(n,t);return n++,r}),o;return t&&(I(),o=H(t(q(this._targetTable,this._sourceAlias)))),this._with(this._builder.whenNotMatchedInsert(i,a,o),n)}with(e,t,n=!1){return this._with(this._builder.with(e,t,n),this._paramIdx)}build(){return this._builder.build()}compile(e){return e.print(this.build())}},Y=class e{_builder;_table;constructor(e,t){this._builder=e,this._table=t??``}select(...t){return new e(this._builder.columns(...t),this._table)}selectAll(){return new e(this._builder.allColumns(),this._table)}selectExpr(t,n){let r=Et(H(t),n);return new e(this._builder.columns(r),this._table)}distinct(){return new e(this._builder.distinct(),this._table)}where(t){if(typeof t==`function`){I();let n=t(B(this._table));return new e(this._builder.where(H(n)),this._table)}return new e(this._builder.where(H(t)),this._table)}innerJoin(t,n){let r=X(n,this._table,t);return new e(this._builder.innerJoin(t,H(r)),this._table)}leftJoin(t,n){let r=X(n,this._table,t);return new e(this._builder.leftJoin(t,H(r)),this._table)}rightJoin(t,n){let r=X(n,this._table,t);return new e(this._builder.rightJoin(t,H(r)),this._table)}groupBy(...t){return new e(this._builder.groupBy(...t),this._table)}having(t){if(typeof t==`function`){I();let n=t(B(this._table));return new e(this._builder.having(H(n)),this._table)}return new e(this._builder.having(H(t)),this._table)}orderBy(t,n=`ASC`,r){return new e(this._builder.orderBy(t,n,r),this._table)}limit(t){return new e(this._builder.limit({type:`literal`,value:t}),this._table)}offset(t){return new e(this._builder.offset({type:`literal`,value:t}),this._table)}forSystemTime(t){return new e(this._builder.forSystemTime(t),this._table)}forUpdate(){return new e(this._builder.forUpdate(),this._table)}with(t,n,r=!1){return new e(this._builder.with(t,n,r),this._table)}union(t){return new e(this._builder.union(t.build()),this._table)}unionAll(t){return new e(this._builder.unionAll(t.build()),this._table)}intersect(t){return new e(this._builder.intersect(t.build()),this._table)}except(t){return new e(this._builder.except(t.build()),this._table)}fullJoin(t,n){let r=X(n,this._table,t);return new e(this._builder.join(`FULL`,t,H(r)),this._table)}crossJoin(t){return new e(this._builder.join(`CROSS`,t),this._table)}build(){return this._builder.build()}compile(e){return e.print(this.build())}};function Tt(e,t){return new Proxy({},{get(e,t){return new Proxy({},{get(e,n){return new P(n,t)}})}})}function Et(e,t){return e.type===`column_ref`||e.type===`function_call`||e.type===`json_access`||e.type===`window_function`?{...e,alias:t}:{type:`aliased_expr`,expr:e,alias:t}}function X(e,t,n){return typeof e==`function`?e(Tt(t,n)):e}var Z=class e{_builder;_paramIdx;constructor(e,t=0){this._builder=new E().table(e),this._paramIdx=t}_with(t,n){let r=new e(``);return r._builder=t,r._paramIdx=n,r}set(e){let t=this._builder,n=this._paramIdx;for(let[r,i]of Object.entries(e))i!==void 0&&(t=t.set(r,g(n,i)),n++);return this._with(t,n)}setExpr(e,t){return this._with(this._builder.set(e,H(t)),this._paramIdx)}where(e){if(typeof e==`function`){I();let t=e(B(this._table));return this._with(this._builder.where(H(t)),this._paramIdx)}return this._with(this._builder.where(H(e)),this._paramIdx)}get _table(){return this._builder.build().table.name}returning(...e){let t=e.map(e=>({type:`column_ref`,column:e}));return new Q(new E({...this._builder.build(),returning:t}))}returningAll(){return new Q(new E({...this._builder.build(),returning:[h()]}))}from(e){return this._with(this._builder.from(e),this._paramIdx)}with(e,t,n=!1){return this._with(this._builder.with(e,t,n),this._paramIdx)}build(){return this._builder.build()}compile(e){return e.print(this.build())}},Q=class{_builder;constructor(e){this._builder=e}build(){return this._builder.build()}compile(e){return e.print(this.build())}},Dt=class{_hooks=new Map;hook(e,t){return this._hooks.has(e)||this._hooks.set(e,[]),this._hooks.get(e).push(t),()=>{let n=this._hooks.get(e);if(n){let e=n.indexOf(t);e!==-1&&n.splice(e,1)}}}callHook(e,...t){let n=this._hooks.get(e);if(!n||n.length===0)return;let r;for(let i of n){let n=i(...t);n!==void 0&&(r=n,e!==`result:transform`&&t[0]&&typeof t[0]==`object`&&`node`in t[0]&&(t[0].node=n))}return r}hasHook(e){let t=this._hooks.get(e);return t!==void 0&&t.length>0}removeHook(e){this._hooks.delete(e)}removeAllHooks(){this._hooks.clear()}},Ot=class{plugins;constructor(e){this.plugins=Object.freeze([...e])}transformNode(e){let t=e;for(let e of this.plugins)e.transformNode&&(t=e.transformNode(t));return t}transformQuery(e){let t=e;for(let e of this.plugins)e.transformQuery&&(t=e.transformQuery(t));return t}transformResult(e){let t=e;for(let e of this.plugins)e.transformResult&&(t=e.transformResult(t));return t}};function kt(e){return new $(e.dialect,e.plugins??[])}var $=class{_dialect;_plugins;_hooks;constructor(e,t=[]){this._dialect=e,this._plugins=new Ot(t),this._hooks=new Dt}hook(e,t){return this._hooks.hook(e,t)}selectFrom(e,t){return new Y(new w().from(e,t),e)}insertInto(e){return new G(e)}update(e){return new Z(e)}deleteFrom(e){return new U(e)}mergeInto(e,t,n,r){let i=e=>new Proxy({},{get(t,n){return new P(n,e)}});return new J(e,t,n,r({target:i(e),source:i(n)}))}compile(e){let t=this._plugins.transformNode(e),n=this._extractTableName(t);switch(t.type){case`select`:{let e=this._hooks.callHook(`select:before`,{node:t,table:n});e&&(t=e);break}case`insert`:{let e=this._hooks.callHook(`insert:before`,{node:t,table:n});e&&(t=e);break}case`update`:{let e=this._hooks.callHook(`update:before`,{node:t,table:n});e&&(t=e);break}case`delete`:{let e=this._hooks.callHook(`delete:before`,{node:t,table:n});e&&(t=e);break}}let r=this._hooks.callHook(`query:before`,{node:t,table:n});r&&(t=r);let i=this._dialect.createPrinter().print(t);i=this._plugins.transformQuery(i);let a=this._hooks.callHook(`query:after`,{node:t,table:n,query:i});return a&&(i=a),i}transformResult(e){let t=this._plugins.transformResult(e),n=this._hooks.callHook(`result:transform`,t);return n&&(t=n),t}printer(){return this._dialect.createPrinter()}_extractTableName(e){switch(e.type){case`select`:return e.from?.type===`table_ref`?e.from.name:void 0;case`insert`:return e.table.name;case`update`:return e.table.name;case`delete`:return e.table.name;case`merge`:return e.target.name;default:return}}},At=class{name=`with-schema`;schema;constructor(e){this.schema=e}transformNode(e){switch(e.type){case`select`:return this.transformSelect(e);case`insert`:return this.transformInsert(e);case`update`:return this.transformUpdate(e);case`delete`:return this.transformDelete(e);default:return e}}addSchema(e){return e.schema?e:{...e,schema:this.schema}}transformSelect(e){return{...e,from:e.from?e.from.type===`table_ref`?this.addSchema(e.from):e.from:void 0,joins:e.joins.map(e=>({...e,table:e.table.type===`table_ref`?this.addSchema(e.table):e.table}))}}transformInsert(e){return{...e,table:this.addSchema(e.table)}}transformUpdate(e){return{...e,table:this.addSchema(e.table),from:e.from?this.addSchema(e.from):void 0}}transformDelete(e){return{...e,table:this.addSchema(e.table)}}},jt=class{name=`soft-delete`;tables;column;constructor(e){this.tables=new Set(e.tables),this.column=e.column??`deleted_at`}transformNode(e){switch(e.type){case`select`:return this.transformSelect(e);case`update`:return this.transformUpdate(e);case`delete`:return this.transformDelete(e);default:return e}}isTargetTable(e){return this.tables.has(e)}softDeleteCondition(){return x(p(this.column))}addCondition(e){let t=this.softDeleteCondition();return e?b(e,t):t}transformSelect(e){return!e.from||e.from.type!==`table_ref`||!this.isTargetTable(e.from.name)?e:{...e,where:this.addCondition(e.where)}}transformUpdate(e){return this.isTargetTable(e.table.name)?{...e,where:this.addCondition(e.where)}:e}transformDelete(e){return this.isTargetTable(e.table.name)?{...e,where:this.addCondition(e.where)}:e}},Mt=class{name=`camel-case`;transformResult(e){return e.map(e=>{let t={};for(let n of Object.keys(e))t[Nt(n)]=e[n];return t})}};function Nt(e){return e.replace(/_([a-z])/g,(e,t)=>t.toUpperCase())}export{qe as ASTTransformer,r as BasePrinter,Mt as CamelCasePlugin,V as CaseBuilder,P as Col,xe as ColumnBuilder,D as DeleteBuilder,te as EmptyQueryError,Dt as Hookable,T as InsertBuilder,s as InvalidExpressionError,C as MergeBuilder,ne as MssqlPrinter,ie as MysqlPrinter,i as PgPrinter,Ot as PluginManager,w as SelectBuilder,jt as SoftDeletePlugin,oe as SqlitePrinter,$ as Sumak,ee as SumakError,U as TypedDeleteBuilder,W as TypedDeleteReturningBuilder,G as TypedInsertBuilder,K as TypedInsertReturningBuilder,J as TypedMergeBuilder,Y as TypedSelectBuilder,Z as TypedUpdateBuilder,Q as TypedUpdateReturningBuilder,o as UnsupportedDialectFeatureError,E as UpdateBuilder,At as WithSchemaPlugin,ct as and,mt as avg,Ue as between,we as bigint,ve as bigserial,v as binOp,de as boolean,Se as bytea,wt as case_,xt as cast,Te as char,_t as coalesce,p as col,Me as colAs,ft as count,f as createDeleteNode,u as createInsertNode,c as createMergeNode,l as createSelectNode,d as createUpdateNode,pe as date,Ee as defineTable,$e as deleteFrom,N as docConcat,A as docEmpty,rt as docGroup,it as docJoin,M as docLine,nt as docNest,ot as docRender,j as docText,at as docTextLine,ye as doublePrecision,De as enumType,Ie as eq,yt as exists,_ as fn,t as formatParam,et as formatSQL,Re as gt,ze as gte,We as inList,Ze as insert,me as integer,x as isNull,he as json,St as jsonRef,Ce as jsonb,He as like,m as lit,Be as lt,Ve as lte,gt as max,Ye as merge,ht as min,re as mssqlDialect,ae as mysqlDialect,Le as neq,vt as not,bt as notExists,be as numeric,lt as or,g as param,a as pgDialect,n as quoteIdentifier,e as quoteTableRef,Ne as raw,_e as real,I as resetParams,Xe as select,ge as serial,ue as smallint,dt as sqlFn,se as sqliteDialect,h as star,Pe as subquery,pt as sum,kt as sumak,je as tableRef,Oe as text,Ct as textSearch,Ae as time,fe as timestamp,ke as timestamptz,y as unaryOp,Qe as update,le as uuid,ut as val,ce as varchar,Je as visitNode};
@@ -0,0 +1,2 @@
1
+ import { n as MssqlPrinter, t as mssqlDialect } from "./_chunks/mssql.mjs";
2
+ export { MssqlPrinter, mssqlDialect };
package/dist/mssql.mjs ADDED
@@ -0,0 +1 @@
1
+ import{n as e,t}from"./_chunks/mssql.mjs";export{e as MssqlPrinter,t as mssqlDialect};
package/package.json CHANGED
@@ -1,10 +1,11 @@
1
1
  {
2
2
  "name": "sumak",
3
- "version": "0.0.3",
3
+ "version": "0.0.4",
4
4
  "description": "Type-safe SQL query builder with powerful SQL printers. Zero dependencies, tree-shakeable. Pure TypeScript.",
5
5
  "keywords": [
6
6
  "database",
7
7
  "esm",
8
+ "mssql",
8
9
  "mysql",
9
10
  "orm",
10
11
  "postgresql",
@@ -42,6 +43,10 @@
42
43
  "types": "./dist/pg.d.mts",
43
44
  "default": "./dist/pg.mjs"
44
45
  },
46
+ "./mssql": {
47
+ "types": "./dist/mssql.d.mts",
48
+ "default": "./dist/mssql.mjs"
49
+ },
45
50
  "./mysql": {
46
51
  "types": "./dist/mysql.d.mts",
47
52
  "default": "./dist/mysql.mjs"
@@ -56,6 +61,7 @@
56
61
  }
57
62
  },
58
63
  "devDependencies": {
64
+ "@electric-sql/pglite": "^0.4.3",
59
65
  "@typescript/native-preview": "7.0.0-dev.20260316.1",
60
66
  "@vitest/coverage-v8": "^4.1.1",
61
67
  "bumpp": "^11.0.1",