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 +400 -56
- package/dist/_chunks/base.mjs +1 -1
- package/dist/_chunks/mssql.d.mts +11 -0
- package/dist/_chunks/mssql.mjs +1 -0
- package/dist/_chunks/mysql.d.mts +2 -1
- package/dist/_chunks/mysql.mjs +1 -1
- package/dist/_chunks/pg.d.mts +1 -1
- package/dist/_chunks/sqlite.d.mts +2 -1
- package/dist/_chunks/sqlite.mjs +1 -1
- package/dist/_chunks/types.d.mts +68 -4
- package/dist/index.d.mts +151 -5
- package/dist/index.mjs +3 -3
- package/dist/mssql.d.mts +2 -0
- package/dist/mssql.mjs +1 -0
- package/package.json +7 -1
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 {
|
|
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
|
|
package/dist/_chunks/base.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
function e(e,t){switch(t){case`pg`:case`sqlite`:return`"${e.replaceAll(`"`,`""`)}"`;case`mysql`:return`\`${e.replaceAll("`","``")}
|
|
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};
|
package/dist/_chunks/mysql.d.mts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { S as
|
|
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 };
|
package/dist/_chunks/mysql.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
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};
|
package/dist/_chunks/pg.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
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
|
|
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 };
|
package/dist/_chunks/sqlite.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
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};
|
package/dist/_chunks/types.d.mts
CHANGED
|
@@ -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 {
|
|
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
|
|
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
|
|
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};
|
package/dist/mssql.d.mts
ADDED
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
|
+
"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",
|