okmodel 0.6.0 → 0.8.0
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 +100 -1131
- package/dist/adapters/capabilities.d.ts +35 -0
- package/dist/adapters/failure.d.ts +13 -2
- package/dist/adapters/lazy-errors.d.ts +22 -0
- package/dist/adapters/pg/bun-sql.d.ts +53 -0
- package/dist/adapters/pg/bunsql-extra.d.ts +54 -3
- package/dist/adapters/pg/bunsql.d.ts +15 -2
- package/dist/adapters/pg/cursor.d.ts +17 -0
- package/dist/adapters/pg/neon-extra.d.ts +18 -0
- package/dist/adapters/pg/neon.d.ts +104 -0
- package/dist/adapters/pg/no-inflight-timeout.d.ts +11 -8
- package/dist/adapters/pg/nodepostgres-extra.d.ts +22 -1
- package/dist/adapters/pg/nodepostgres.d.ts +12 -0
- package/dist/adapters/pg/pglite-wire.d.ts +24 -0
- package/dist/adapters/pg/pglite.d.ts +10 -0
- package/dist/adapters/pg/postgres-extra.d.ts +27 -11
- package/dist/adapters/pg/reserved.d.ts +42 -0
- package/dist/adapters/pg/session.d.ts +0 -18
- package/dist/contracts/connection.d.ts +7 -6
- package/dist/contracts/error.d.ts +1 -1
- package/dist/dialects/pg/floor.d.ts +68 -0
- package/dist/dialects/pg/fn/index.d.ts +39 -1
- package/dist/dialects/pg/fn/index.js +118 -26
- package/dist/dialects/pg/index.d.ts +8 -1
- package/dist/dialects/pg/index.js +435 -170
- package/dist/dialects/pg/introspect.d.ts +11 -0
- package/dist/dialects/pg/keys.d.ts +11 -8
- package/dist/dialects/pg/model.d.ts +40 -0
- package/dist/dialects/pg/morph.d.ts +43 -0
- package/dist/dialects/pg/operator-fit.d.ts +2 -2
- package/dist/dialects/pg/operators.d.ts +14 -7
- package/dist/dialects/pg/ops/bucket.d.ts +65 -0
- package/dist/dialects/pg/ops/fragment.d.ts +119 -0
- package/dist/dialects/pg/ops/inc.d.ts +2 -2
- package/dist/dialects/pg/ops/lane.d.ts +49 -0
- package/dist/dialects/pg/ops/matches.d.ts +9 -12
- package/dist/dialects/pg/ops/relevance.d.ts +13 -0
- package/dist/dialects/pg/ops/search-query.d.ts +22 -0
- package/dist/dialects/pg/ops/window.d.ts +103 -0
- package/dist/dialects/pg/preset.d.ts +1 -1
- package/dist/dialects/pg/relations.d.ts +100 -3
- package/dist/dialects/pg/schema.d.ts +31 -3
- package/dist/dialects/pg/view/client.d.ts +14 -6
- package/dist/dialects/pg/view/index.d.ts +73 -1
- package/dist/dialects/pg/view/index.js +156 -5
- package/dist/dialects/pg/view/scratch.d.ts +8 -5
- package/dist/runtime/aggregate.d.ts +8 -2
- package/dist/runtime/bucket-group.d.ts +70 -0
- package/dist/runtime/conflict.d.ts +22 -4
- package/dist/runtime/include.d.ts +0 -8
- package/dist/runtime/inflight.d.ts +1 -1
- package/dist/runtime/otel.d.ts +105 -0
- package/dist/runtime/otel.js +97 -0
- package/dist/runtime/page.d.ts +4 -1
- package/dist/runtime/pg/bun.js +12 -6
- package/dist/runtime/pg/neon.d.ts +38 -0
- package/dist/runtime/pg/neon.js +64 -0
- package/dist/runtime/pg/pg.js +5 -5
- package/dist/runtime/pg/pglite.d.ts +1 -0
- package/dist/runtime/pg/pglite.js +9 -9
- package/dist/runtime/pg/postgresjs.js +5 -5
- package/dist/runtime/plan.d.ts +95 -5
- package/dist/runtime/read-stream.d.ts +13 -16
- package/dist/runtime/result-name.d.ts +17 -0
- package/dist/runtime/server-check.d.ts +3 -3
- package/dist/runtime/sort-bind.d.ts +21 -0
- package/dist/runtime/sort.d.ts +56 -0
- package/dist/runtime/sql-fragment.d.ts +43 -0
- package/dist/runtime/sync.d.ts +70 -0
- package/dist/runtime/tenancy/index.js +15 -13
- package/dist/runtime/text-search.d.ts +20 -0
- package/dist/runtime/topology.d.ts +1 -1
- package/dist/runtime/traits/index.d.ts +80 -0
- package/dist/runtime/traits/index.js +184 -21
- package/dist/runtime/tree.d.ts +38 -0
- package/dist/runtime/types.d.ts +232 -22
- package/dist/runtime/validate/index.js +4 -4
- package/dist/runtime/version.d.ts +39 -0
- package/dist/runtime/window.d.ts +21 -0
- package/dist/runtime/write.d.ts +54 -2
- package/dist/shared/{929h19xp.js → 0wrea3jq.js} +141 -13
- package/dist/shared/{qq3899ht.js → 12z7aznj.js} +243 -14
- package/dist/shared/{1z04fa85.js → 14x60fbf.js} +12 -57
- package/dist/shared/{ek2wt2dz.js → 16kvjebh.js} +4 -4
- package/dist/shared/{wynzeggs.js → 195pzzzz.js} +8 -8
- package/dist/shared/1d9q9cv2.js +312 -0
- package/dist/shared/2c13q96h.js +18 -0
- package/dist/shared/{b4v57v3x.js → 2d3xq4ps.js} +2 -2
- package/dist/shared/{1f0xa3cb.js → 3449rcae.js} +5 -5
- package/dist/shared/{wkme6tep.js → 35q0n9tz.js} +8 -16
- package/dist/shared/3bb7wsqt.js +99 -0
- package/dist/shared/3t6kw83m.js +249 -0
- package/dist/shared/{5j36z8dn.js → 4m6hskg8.js} +39 -70
- package/dist/shared/{n076ydsc.js → 4vbf83xx.js} +69 -28
- package/dist/shared/{vmfkhszw.js → 63f4ksbz.js} +33 -26
- package/dist/shared/{c58secgj.js → 63qtkrca.js} +38 -4
- package/dist/shared/6m78c8ss.js +6 -0
- package/dist/shared/{x3jc53kg.js → 760ppr76.js} +15 -7
- package/dist/shared/7ghwamrf.js +40 -0
- package/dist/shared/7kms6fvj.js +20 -0
- package/dist/shared/7n7ddwt4.js +6 -0
- package/dist/shared/9a4ae4p8.js +31 -0
- package/dist/shared/{hazqqecq.js → 9dr2qnx7.js} +63 -34
- package/dist/shared/{h15jx9bc.js → 9dvh1dr6.js} +1 -1
- package/dist/shared/a62rb2da.js +13 -0
- package/dist/shared/{cgbamx3e.js → ae4j5f42.js} +23 -4
- package/dist/shared/agsfb86s.js +233 -0
- package/dist/shared/{8x72s86k.js → b6d6p0zc.js} +13 -7
- package/dist/shared/{ag4c7516.js → b76b8d95.js} +2 -2
- package/dist/shared/{j60w0dvr.js → bah9nbg3.js} +58 -38
- package/dist/shared/bnby0esn.js +10 -0
- package/dist/shared/bsek72fg.js +225 -0
- package/dist/shared/{2cg3wnxc.js → bxas03mq.js} +608 -141
- package/dist/shared/{31vm914h.js → cm3w0ywp.js} +15 -16
- package/dist/shared/{gwn6v667.js → cnkky55j.js} +25 -14
- package/dist/shared/{dk8v79p3.js → d5nmj7vv.js} +1 -1
- package/dist/shared/{ttmg09vd.js → dpc2r7rb.js} +8 -8
- package/dist/shared/dzj09cye.js +10 -0
- package/dist/shared/{sbdme3vy.js → e8zyaqvj.js} +60 -10
- package/dist/shared/{2jd1sn0e.js → ecn8mfdq.js} +6 -6
- package/dist/shared/exn3sd90.js +359 -0
- package/dist/shared/{t3g0k88x.js → f4jy1j7x.js} +39 -22
- package/dist/shared/{y2t3jktd.js → fjpnhqan.js} +20 -13
- package/dist/shared/g5yc06ka.js +272 -0
- package/dist/shared/ga9j92qj.js +25 -0
- package/dist/shared/{3fqwmr09.js → hfqmpasr.js} +6 -6
- package/dist/shared/{wt5rzv1h.js → hm5f8jby.js} +7 -7
- package/dist/shared/{ys0xzyaj.js → hqpxf4a4.js} +224 -19
- package/dist/shared/jebgrkeq.js +179 -0
- package/dist/shared/{09p049xa.js → jp36k7dp.js} +44 -16
- package/dist/shared/jx2m62cs.js +96 -0
- package/dist/shared/{r11n8grd.js → k86n8vq3.js} +7 -4
- package/dist/shared/{2z7wv5tj.js → kgwp4jdd.js} +56 -35
- package/dist/shared/{knmes2kh.js → kj9d8maq.js} +1 -1
- package/dist/shared/{g90m9b0g.js → m4xff2a6.js} +6 -5
- package/dist/shared/{r6nwkxnt.js → m7n9h2a5.js} +4 -4
- package/dist/shared/mfedzr74.js +145 -0
- package/dist/shared/{f0f1n281.js → mkrn359n.js} +60 -11
- package/dist/shared/{p248q79y.js → mnvjvqyp.js} +10 -10
- package/dist/shared/{672t5vym.js → mss6ctgv.js} +2 -2
- package/dist/shared/{4az561fn.js → mtw6jz76.js} +8 -23
- package/dist/shared/n05z9nwz.js +313 -0
- package/dist/shared/{pjr6xrm5.js → n0jmpgj1.js} +20 -17
- package/dist/shared/{p6bjzq9q.js → n41w4fbz.js} +14 -6
- package/dist/shared/{b3awxn7h.js → n454kcnw.js} +1 -1
- package/dist/shared/n7kg8mmx.js +61 -0
- package/dist/shared/nbw1z4yd.js +18 -0
- package/dist/shared/needfe47.js +66 -0
- package/dist/shared/{1nw1f3vs.js → njga14v4.js} +9 -9
- package/dist/shared/{5yv4k6a6.js → nmnsgj7x.js} +145 -3
- package/dist/shared/{vjpnzwjz.js → p3xbdcvt.js} +14 -18
- package/dist/shared/p5nh3r8q.js +622 -0
- package/dist/shared/{nx9hh281.js → pan0370z.js} +13 -12
- package/dist/shared/q0cqt2sp.js +12 -0
- package/dist/shared/qd9hhd8f.js +37 -0
- package/dist/shared/{mb2ycs1p.js → qfw14tna.js} +15 -15
- package/dist/shared/{9s0ypp87.js → sjk86yrx.js} +1 -1
- package/dist/shared/th3be82n.js +208 -0
- package/dist/shared/{ed0b8k4s.js → typ3vy7t.js} +1 -1
- package/dist/shared/{5d8t84hg.js → v1wad97q.js} +14 -14
- package/dist/shared/{x72jb7ad.js → v8g1vgv8.js} +1 -1
- package/dist/shared/{9628a9xt.js → vk7rag46.js} +1 -1
- package/dist/shared/{ze4hxsmy.js → w9ejzaqf.js} +1 -1
- package/dist/shared/{q3j1tq7a.js → wcrheftc.js} +148 -23
- package/dist/shared/wvdjznah.js +213 -0
- package/dist/shared/wz2a78mp.js +8 -0
- package/dist/shared/xfhe73sb.js +436 -0
- package/dist/shared/{r1fdd0f6.js → z581d7ny.js} +5 -2
- package/dist/shared/{8etn7d8w.js → z7s6fpxv.js} +1 -1
- package/dist/shared/{32cnm7kn.js → zbqbmmrp.js} +76 -40
- package/dist/shared/{n7mcc1gk.js → zchaghkf.js} +4 -3
- package/dist/shared/{xq0mvhts.js → zgex00fd.js} +6 -6
- package/dist/shared/{nsva2a6b.js → znm0bpp5.js} +3 -0
- package/dist/shared/zq1he88x.js +155 -0
- package/dist/tooling/cli.js +26 -13
- package/dist/tooling/driver-run.js +4971 -0
- package/dist/tooling/driver-test.d.ts +36 -0
- package/dist/tooling/migrate/commands.d.ts +2 -2
- package/dist/tooling/migrate/engine.d.ts +3 -2
- package/dist/tooling/migrate/index.js +9 -9
- package/dist/tooling/migrate/project.d.ts +3 -0
- package/dist/tooling/shared/03k6res6.js +210 -0
- package/dist/tooling/shared/08kemxjd.js +10 -0
- package/dist/tooling/shared/2revefqt.js +209 -0
- package/dist/tooling/shared/2wtvc7rw.js +1425 -0
- package/dist/tooling/shared/345tbc2k.js +16 -0
- package/dist/tooling/shared/3m1hkg7z.js +344 -0
- package/dist/tooling/shared/3rrw5w8f.js +81 -0
- package/dist/tooling/shared/3tq8pnb8.js +131 -0
- package/dist/tooling/shared/417zdsk7.js +194 -0
- package/dist/tooling/shared/4d2w25vw.js +40 -0
- package/dist/tooling/shared/54tqkxja.js +51 -0
- package/dist/tooling/shared/5bvw2nev.js +12 -0
- package/dist/tooling/shared/6nyfyw70.js +231 -0
- package/dist/tooling/shared/72fyg4zv.js +160 -0
- package/dist/tooling/shared/733a1tq3.js +38 -0
- package/dist/tooling/shared/7ae7rjmn.js +20 -0
- package/dist/tooling/shared/7kms6fvj.js +20 -0
- package/dist/tooling/shared/8sqrsw3s.js +49 -0
- package/dist/tooling/shared/96ps4g1z.js +32 -0
- package/dist/tooling/shared/9kazs5p6.js +195 -0
- package/dist/tooling/shared/9xzm7hjg.js +38 -0
- package/dist/tooling/shared/a6pp9d12.js +49 -0
- package/dist/tooling/shared/a7q7t4n3.js +22 -0
- package/dist/tooling/shared/aftb2mwr.js +18 -0
- package/dist/tooling/shared/bz2dqhab.js +311 -0
- package/dist/tooling/shared/cmptmb4f.js +12 -0
- package/dist/tooling/shared/ddjtfgnx.js +177 -0
- package/dist/tooling/shared/djydjpqt.js +261 -0
- package/dist/tooling/shared/dw08f3m8.js +9 -0
- package/dist/tooling/shared/dy672fz6.js +16 -0
- package/dist/tooling/shared/dzx85q70.js +66 -0
- package/dist/tooling/shared/ec71zqgt.js +270 -0
- package/dist/{shared/d5azex6s.js → tooling/shared/ep8zh3bk.js} +1 -1
- package/dist/tooling/shared/f9mphxej.js +3789 -0
- package/dist/tooling/shared/fb9k2qwd.js +89 -0
- package/dist/tooling/shared/g9ad4n80.js +211 -0
- package/dist/tooling/shared/gfvtj6d0.js +94 -0
- package/dist/tooling/shared/gmcf9cxf.js +294 -0
- package/dist/tooling/shared/htnaj77v.js +17 -0
- package/dist/tooling/shared/j9t5s12a.js +7 -0
- package/dist/tooling/shared/jne7b93p.js +42 -0
- package/dist/tooling/shared/ma2340rx.js +118 -0
- package/dist/tooling/shared/mtrqn2hn.js +505 -0
- package/dist/tooling/shared/n4jqhpqz.js +27 -0
- package/dist/tooling/shared/nf7jmhfa.js +20 -0
- package/dist/tooling/shared/p7f08ktn.js +332 -0
- package/dist/tooling/shared/ppnnnvj8.js +13 -0
- package/dist/tooling/shared/pqy21k24.js +312 -0
- package/dist/tooling/shared/pw8fgahx.js +69 -0
- package/dist/tooling/shared/pwsytxm5.js +17 -0
- package/dist/tooling/shared/rf83gr2d.js +94 -0
- package/dist/tooling/shared/rq5kk8j6.js +401 -0
- package/dist/tooling/shared/rs1jb051.js +12 -0
- package/dist/tooling/shared/smn6kz1p.js +157 -0
- package/dist/tooling/shared/spk1jg3r.js +1696 -0
- package/dist/tooling/shared/tn8gay14.js +143 -0
- package/dist/tooling/shared/vraj6d74.js +42 -0
- package/dist/tooling/shared/vs0t6qt8.js +64 -0
- package/dist/tooling/shared/vx86qjv8.js +150 -0
- package/dist/tooling/shared/w7qe8sj1.js +140 -0
- package/dist/tooling/shared/wt7j7nf6.js +15 -0
- package/dist/tooling/shared/wwnekq5n.js +6 -0
- package/dist/tooling/shared/xhrnjch9.js +185 -0
- package/dist/tooling/shared/xjs6zqtc.js +190 -0
- package/dist/tooling/shared/y031jct9.js +16 -0
- package/dist/tooling/shared/y5656f0e.js +233 -0
- package/dist/tooling/shared/yfr8hzhm.js +604 -0
- package/dist/tooling/shared/yk9mp7vb.js +250 -0
- package/dist/tooling/shared/yw30vnq2.js +139 -0
- package/dist/tooling/shared/z8d7ptht.js +618 -0
- package/dist/tooling/shared/zhwnfyb2.js +9 -0
- package/dist/tooling/shared/zvnhh1n0.js +198 -0
- package/dist/tooling/testing/index.js +3 -3
- package/package.json +17 -3
- package/dist/shared/3qnhc7w5.js +0 -38
- package/dist/shared/7m88x3e9.js +0 -45
- package/dist/shared/8dqhth8c.js +0 -12
- package/dist/shared/j3rkk835.js +0 -99
- package/dist/shared/k68eedmy.js +0 -85
- package/dist/shared/venqrjna.js +0 -216
- package/dist/shared/wxr8cwns.js +0 -6
- package/dist/shared/y34a8714.js +0 -150
- package/dist/shared/zm0mafk4.js +0 -92
- package/dist/shared/zy8r7qvz.js +0 -116
- package/dist/shared/{ywr8hmey.js → 606g0nbf.js} +3 -3
- package/dist/shared/{rpycarcr.js → gcefca6p.js} +4 -4
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
import {
|
|
2
|
+
assertNoControl
|
|
3
|
+
} from "./zchaghkf.js";
|
|
4
|
+
import {
|
|
5
|
+
isOperator,
|
|
6
|
+
operatorName,
|
|
7
|
+
operatorValue,
|
|
8
|
+
tag
|
|
9
|
+
} from "./cn0n68ft.js";
|
|
10
|
+
import {
|
|
11
|
+
OkmError2
|
|
12
|
+
} from "./52szzakm.js";
|
|
13
|
+
|
|
14
|
+
// src/dialects/pg/ops/fragment.ts
|
|
15
|
+
var IDENT = Symbol("okmodel.sql.ident");
|
|
16
|
+
var COLUMN = Symbol("okmodel.sql.column");
|
|
17
|
+
function fragmentError(message, fix) {
|
|
18
|
+
throw new OkmError2("OKM1125", message, { fix: { summary: fix } });
|
|
19
|
+
}
|
|
20
|
+
function isFragmentParts(value) {
|
|
21
|
+
return Array.isArray(value) && value.every(isPart);
|
|
22
|
+
}
|
|
23
|
+
function isPart(value) {
|
|
24
|
+
if (typeof value !== "object" || value === null || !("k" in value))
|
|
25
|
+
return false;
|
|
26
|
+
const kind = value.k;
|
|
27
|
+
if (kind === "t")
|
|
28
|
+
return "s" in value && typeof value.s === "string";
|
|
29
|
+
if (kind === "p")
|
|
30
|
+
return "v" in value && typeof value.v === "string";
|
|
31
|
+
if (kind === "n" || kind === "c")
|
|
32
|
+
return true;
|
|
33
|
+
if (kind === "i")
|
|
34
|
+
return "n" in value && typeof value.n === "string";
|
|
35
|
+
if (kind === "f")
|
|
36
|
+
return "parts" in value && isFragmentParts(value.parts);
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
function readSelectFragment(value) {
|
|
40
|
+
if (!isOperator(value) || operatorName(value) !== "sql")
|
|
41
|
+
return;
|
|
42
|
+
const named = value;
|
|
43
|
+
if (typeof named.as !== "string") {
|
|
44
|
+
fragmentError("A select fragment needs as(name).", 'Call .as("len") and pass that value in select.');
|
|
45
|
+
}
|
|
46
|
+
const stored = operatorValue(value);
|
|
47
|
+
if (!isFragmentParts(stored)) {
|
|
48
|
+
fragmentError("A fragment was not created by fragment``.", "Call fragment`...`.");
|
|
49
|
+
}
|
|
50
|
+
const textual = named.text === true;
|
|
51
|
+
return textual ? { as: named.as, parts: stored, textual: true } : { as: named.as, parts: stored };
|
|
52
|
+
}
|
|
53
|
+
function scanLiteral(literal, state) {
|
|
54
|
+
for (let index = 0;index < literal.length; index += 1) {
|
|
55
|
+
const char = literal[index] ?? "";
|
|
56
|
+
const code = literal.charCodeAt(index);
|
|
57
|
+
if (state.quote !== undefined) {
|
|
58
|
+
if (char !== state.quote)
|
|
59
|
+
continue;
|
|
60
|
+
if (literal[index + 1] === state.quote) {
|
|
61
|
+
index += 1;
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
state.quote = undefined;
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
if (code <= 31 && code !== 9 && code !== 10 && code !== 13 || code === 127) {
|
|
68
|
+
fragmentError("A fragment literal contains a control character.", "Remove NUL and other control characters. A newline, tab, or return is allowed.");
|
|
69
|
+
}
|
|
70
|
+
if (char === "'" || char === '"') {
|
|
71
|
+
state.quote = char;
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
if (char === "(") {
|
|
75
|
+
state.paren += 1;
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
if (char === ")") {
|
|
79
|
+
state.paren -= 1;
|
|
80
|
+
if (state.paren < 0) {
|
|
81
|
+
fragmentError("A fragment has unbalanced SQL.", "Keep parentheses and quotes balanced. A fragment cannot close the surrounding predicate.");
|
|
82
|
+
}
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
if (char === ";") {
|
|
86
|
+
fragmentError("A fragment cannot include a semicolon.", "Pass the value as an interpolation. The fragment is one expression.");
|
|
87
|
+
}
|
|
88
|
+
if (char === "$") {
|
|
89
|
+
fragmentError("A fragment cannot include a dollar quote or a parameter marker.", "Interpolate the value. The planner numbers parameters.");
|
|
90
|
+
}
|
|
91
|
+
if (char === "-" && literal[index + 1] === "-" || char === "/" && literal[index + 1] === "*") {
|
|
92
|
+
fragmentError("A fragment cannot include a comment.", "Remove the comment. A comment can hide the rest of the predicate.");
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
function appendText(parts, literal) {
|
|
97
|
+
if (literal.length === 0)
|
|
98
|
+
return;
|
|
99
|
+
parts.push({ k: "t", s: literal });
|
|
100
|
+
}
|
|
101
|
+
function appendValue(parts, value) {
|
|
102
|
+
if (value === null) {
|
|
103
|
+
parts.push({ k: "n" });
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
if (typeof value === "string") {
|
|
107
|
+
parts.push({ k: "p", v: value });
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
if (typeof value === "number") {
|
|
111
|
+
if (!Number.isFinite(value)) {
|
|
112
|
+
fragmentError("A fragment needs a finite number.", "Pass a finite number, or leave it out.");
|
|
113
|
+
}
|
|
114
|
+
parts.push({ k: "p", v: String(value) });
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
if (typeof value === "boolean") {
|
|
118
|
+
parts.push({ k: "p", v: value ? "true" : "false" });
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
if (typeof value === "bigint") {
|
|
122
|
+
parts.push({ k: "p", v: String(value) });
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
if (typeof value === "object") {
|
|
126
|
+
if (COLUMN in value) {
|
|
127
|
+
parts.push({ k: "c" });
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
if (IDENT in value) {
|
|
131
|
+
const name = value[IDENT];
|
|
132
|
+
if (typeof name === "string") {
|
|
133
|
+
parts.push({ k: "i", n: name });
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
if (isOperator(value) && operatorName(value) === "sql") {
|
|
138
|
+
const nested = operatorValue(value);
|
|
139
|
+
if (!isFragmentParts(nested)) {
|
|
140
|
+
fragmentError("A fragment was not created by fragment``.", "Call fragment`...`.");
|
|
141
|
+
}
|
|
142
|
+
parts.push({ k: "f", parts: nested });
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
fragmentError("A fragment cannot interpolate that value.", "Interpolate a string, number, boolean, null, ident(name), fragment.column, or another fragment.");
|
|
147
|
+
}
|
|
148
|
+
function hasSql(parts) {
|
|
149
|
+
for (const part of parts) {
|
|
150
|
+
if (part.k === "t") {
|
|
151
|
+
if (part.s.trim().length > 0)
|
|
152
|
+
return true;
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
return true;
|
|
156
|
+
}
|
|
157
|
+
return false;
|
|
158
|
+
}
|
|
159
|
+
function compile(strings, values) {
|
|
160
|
+
const state = { quote: undefined, paren: 0 };
|
|
161
|
+
const parts = [];
|
|
162
|
+
for (let index = 0;index < values.length + 1; index += 1) {
|
|
163
|
+
const literal = strings[index] ?? "";
|
|
164
|
+
scanLiteral(literal, state);
|
|
165
|
+
appendText(parts, literal);
|
|
166
|
+
if (index === values.length)
|
|
167
|
+
continue;
|
|
168
|
+
if (state.quote !== undefined) {
|
|
169
|
+
fragmentError("A fragment cannot interpolate inside quotes.", "Do not put an interpolation inside quotes. Write title = ${name}.");
|
|
170
|
+
}
|
|
171
|
+
appendValue(parts, values[index]);
|
|
172
|
+
}
|
|
173
|
+
if (state.quote !== undefined || state.paren !== 0) {
|
|
174
|
+
fragmentError("A fragment has unbalanced SQL.", "Keep parentheses and quotes balanced. A fragment cannot close the surrounding predicate.");
|
|
175
|
+
}
|
|
176
|
+
if (!hasSql(parts)) {
|
|
177
|
+
fragmentError("A fragment needs SQL text.", "Write an expression, or interpolate a value.");
|
|
178
|
+
}
|
|
179
|
+
return parts;
|
|
180
|
+
}
|
|
181
|
+
function isTemplate(value) {
|
|
182
|
+
return Array.isArray(value) && "raw" in value;
|
|
183
|
+
}
|
|
184
|
+
function bind(parts, textual = false) {
|
|
185
|
+
const tagged = tag("sql", parts);
|
|
186
|
+
return Object.assign(tagged, {
|
|
187
|
+
as(name) {
|
|
188
|
+
if (typeof name !== "string" || name.length === 0) {
|
|
189
|
+
fragmentError("as(name) needs a result name.", 'Call .as("len") with a name that is not a column.');
|
|
190
|
+
}
|
|
191
|
+
assertNoControl(name, "fragment as");
|
|
192
|
+
const selected = Object.assign(tag("sql", parts), { as: name });
|
|
193
|
+
return textual ? Object.assign(selected, { text: true }) : selected;
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
function sqlExpression(parts, textual = false) {
|
|
198
|
+
return bind(parts, textual);
|
|
199
|
+
}
|
|
200
|
+
function identName(value) {
|
|
201
|
+
if (typeof value !== "object" || value === null || !(IDENT in value))
|
|
202
|
+
return;
|
|
203
|
+
const stored = value[IDENT];
|
|
204
|
+
return typeof stored === "string" ? stored : undefined;
|
|
205
|
+
}
|
|
206
|
+
function fragmentTag(strings, ...values) {
|
|
207
|
+
if (!isTemplate(strings)) {
|
|
208
|
+
fragmentError("Call fragment as a template: fragment`...`.", "Write fragment`length(${fragment.column}) > ${1}`.");
|
|
209
|
+
}
|
|
210
|
+
return bind(compile(strings, values));
|
|
211
|
+
}
|
|
212
|
+
var fragment2 = Object.assign(fragmentTag, {
|
|
213
|
+
column: { [COLUMN]: true }
|
|
214
|
+
});
|
|
215
|
+
function ident2(name) {
|
|
216
|
+
if (typeof name !== "string" || name.length === 0) {
|
|
217
|
+
throw new OkmError2("OKM1122", "ident needs a name.", {
|
|
218
|
+
fix: { summary: "Pass the field name, such as title." }
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
assertNoControl(name, "ident");
|
|
222
|
+
return { [IDENT]: name };
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
export { isFragmentParts, readSelectFragment, sqlExpression, identName, fragment2, ident2 };
|