@voltro/database 0.33.0 → 0.34.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/CHANGELOG.md +1801 -0
- package/dist/{frameworkLiveTables-DbAgeVOU.js → frameworkLiveTables-CeuTYhWm.js} +159 -130
- package/dist/index.d.ts +774 -11
- package/dist/index.js +1039 -710
- package/dist/sql.d.ts +247 -10
- package/dist/sql.js +1269 -912
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
|
-
import { $ as e, A as t, At as n, B as r, Bt as i, C as a, Ct as o, D as s, Dt as c, E as l, Et as u, F as d, Ft as f, G as p,
|
|
2
|
-
import { timestampMs as
|
|
3
|
-
import { Cause as
|
|
4
|
-
import { AsyncLocalStorage as
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
1
|
+
import { $ as e, A as t, At as n, B as r, Bt as i, C as a, Ct as o, D as s, Dt as c, E as l, Et as u, F as d, Ft as f, G as p, Gt as m, H as h, Ht as g, I as _, It as v, J as y, Jt as b, K as x, Kt as S, L as ee, Lt as C, M as te, Mt as ne, N as re, Nt as ie, O as ae, Ot as oe, P as se, Pt as ce, Q as le, R as ue, Rt as de, S as fe, St as pe, T as me, Tt as he, U as ge, Ut as _e, V as ve, Vt as ye, W as be, Wt as xe, X as Se, Y as Ce, Yt as we, Z as Te, _ as Ee, _t as De, a as Oe, at as ke, b as Ae, bt as je, c as Me, ct as Ne, d as Pe, dt as Fe, et as w, f as Ie, ft as Le, g as Re, gt as ze, h as Be, ht as Ve, i as He, it as Ue, j as T, jt as We, k as Ge, kt as Ke, l as qe, lt as Je, m as Ye, mt as Xe, n as Ze, nt as Qe, o as $e, ot as et, p as E, pt as tt, q as nt, qt as D, rt, s as it, st as at, t as ot, tt as st, u as ct, ut as lt, v as ut, vt as dt, w as ft, wt as pt, x as mt, xt as ht, y as gt, yt as _t, z as vt, zt as O } from "./frameworkLiveTables-CeuTYhWm.js";
|
|
2
|
+
import { timestampMs as yt, timestampMsOrNull as bt } from "./wire.js";
|
|
3
|
+
import { Cause as xt, Chunk as St, Data as Ct, Effect as k, Exit as wt, Metric as A, MetricBoundaries as Tt, Option as j, Schedule as Et, Schema as M, Stream as Dt } from "effect";
|
|
4
|
+
import { AsyncLocalStorage as Ot } from "node:async_hooks";
|
|
5
|
+
import { TransactionConnection as kt } from "@effect/sql/SqlClient";
|
|
6
|
+
import { ansi as N } from "@voltro/logger";
|
|
7
|
+
import { SqlClient as At } from "@effect/sql";
|
|
8
|
+
import { createHash as jt } from "node:crypto";
|
|
7
9
|
//#region src/actorSnapshot.ts
|
|
8
|
-
var
|
|
10
|
+
var Mt = (e) => typeof e == "string" && e !== "" ? e : null, Nt = async (e, t, n) => {
|
|
9
11
|
if (!(t == null || t === "")) try {
|
|
10
12
|
let r = (await e.query({
|
|
11
13
|
table: "actors",
|
|
@@ -21,20 +23,20 @@ var wt = (e) => typeof e == "string" && e !== "" ? e : null, Tt = async (e, t, n
|
|
|
21
23
|
}))[0];
|
|
22
24
|
return r === void 0 ? void 0 : {
|
|
23
25
|
id: t,
|
|
24
|
-
type:
|
|
25
|
-
displayName:
|
|
26
|
-
email:
|
|
26
|
+
type: Mt(r.kind) ?? n,
|
|
27
|
+
displayName: Mt(r.displayName),
|
|
28
|
+
email: Mt(r.email)
|
|
27
29
|
};
|
|
28
30
|
} catch {
|
|
29
31
|
return;
|
|
30
32
|
}
|
|
31
|
-
},
|
|
33
|
+
}, Pt = (e) => e === "mysql" || e === "mariadb" || e === "mssql" || e === "sqlite", Ft = (e) => {
|
|
32
34
|
let t = [];
|
|
33
35
|
for (let [n, r] of Object.entries(e.fields)) r.type === "array" && t.push(n);
|
|
34
36
|
return t;
|
|
35
|
-
},
|
|
36
|
-
if (!
|
|
37
|
-
let r =
|
|
37
|
+
}, It = (e, t, n) => {
|
|
38
|
+
if (!Pt(n) || !t) return e;
|
|
39
|
+
let r = Ft(t);
|
|
38
40
|
if (r.length === 0) return e;
|
|
39
41
|
let i = { ...e };
|
|
40
42
|
for (let e of r) {
|
|
@@ -42,9 +44,9 @@ var wt = (e) => typeof e == "string" && e !== "" ? e : null, Tt = async (e, t, n
|
|
|
42
44
|
Array.isArray(t) && (i[e] = JSON.stringify(t));
|
|
43
45
|
}
|
|
44
46
|
return i;
|
|
45
|
-
},
|
|
46
|
-
if (!
|
|
47
|
-
let r =
|
|
47
|
+
}, Lt = (e, t, n) => {
|
|
48
|
+
if (!Pt(n) || !t) return e;
|
|
49
|
+
let r = Ft(t);
|
|
48
50
|
return r.length === 0 ? e : e.map((e) => {
|
|
49
51
|
let t;
|
|
50
52
|
for (let n of r) {
|
|
@@ -56,7 +58,7 @@ var wt = (e) => typeof e == "string" && e !== "" ? e : null, Tt = async (e, t, n
|
|
|
56
58
|
}
|
|
57
59
|
return t ?? e;
|
|
58
60
|
});
|
|
59
|
-
},
|
|
61
|
+
}, Rt = "enc:v1:", zt = class extends Error {
|
|
60
62
|
_tag = "FieldDecryptionError";
|
|
61
63
|
table;
|
|
62
64
|
column;
|
|
@@ -64,33 +66,33 @@ var wt = (e) => typeof e == "string" && e !== "" ? e : null, Tt = async (e, t, n
|
|
|
64
66
|
constructor(e) {
|
|
65
67
|
super(`column "${e.table}.${e.column}" is .encrypted() but could not be decrypted (${e.reason}) — the stored value was most likely encrypted under a different key`), this.name = "FieldDecryptionError", this.table = e.table, this.column = e.column, this.reason = e.reason;
|
|
66
68
|
}
|
|
67
|
-
},
|
|
69
|
+
}, Bt = (e) => typeof e == "object" && !!e && e._tag === "FieldDecryptionError", Vt = (e) => typeof e == "string" && e.startsWith("enc:v1:"), Ht = (e) => {
|
|
68
70
|
let t = [];
|
|
69
71
|
for (let [n, r] of Object.entries(e.fields)) r.encrypted === !0 && t.push(n);
|
|
70
72
|
return t;
|
|
71
|
-
},
|
|
73
|
+
}, Ut = (e, t, n) => {
|
|
72
74
|
if (!t) return e;
|
|
73
|
-
let r =
|
|
75
|
+
let r = Ht(t);
|
|
74
76
|
if (r.length === 0) return e;
|
|
75
77
|
let i = { ...e };
|
|
76
78
|
for (let e of r) {
|
|
77
79
|
let r = i[e];
|
|
78
|
-
if (!(r == null ||
|
|
80
|
+
if (!(r == null || Vt(r))) {
|
|
79
81
|
if (!n) throw Error(`column "${t.tableName ?? "?"}.${e}" is .encrypted() but no field cipher is registered — wire @voltro/plugin-governance's fieldEncryption (key via the Secrets-Resolver)`);
|
|
80
82
|
i[e] = n.encrypt(JSON.stringify(r));
|
|
81
83
|
}
|
|
82
84
|
}
|
|
83
85
|
return i;
|
|
84
|
-
},
|
|
86
|
+
}, Wt = (e, t, n, r) => {
|
|
85
87
|
if (!t) return e;
|
|
86
|
-
let i =
|
|
88
|
+
let i = Ht(t);
|
|
87
89
|
if (i.length === 0 || !n) return e;
|
|
88
90
|
let a = r?.onError ?? "throw", o = t.tableName ?? "?";
|
|
89
91
|
return e.map((e) => {
|
|
90
92
|
let t;
|
|
91
93
|
for (let s of i) {
|
|
92
94
|
let i = e[s];
|
|
93
|
-
if (
|
|
95
|
+
if (Vt(i)) {
|
|
94
96
|
t ??= { ...e };
|
|
95
97
|
try {
|
|
96
98
|
t[s] = JSON.parse(n.decrypt(i));
|
|
@@ -104,7 +106,7 @@ var wt = (e) => typeof e == "string" && e !== "" ? e : null, Tt = async (e, t, n
|
|
|
104
106
|
});
|
|
105
107
|
continue;
|
|
106
108
|
}
|
|
107
|
-
throw new
|
|
109
|
+
throw new zt({
|
|
108
110
|
table: o,
|
|
109
111
|
column: s,
|
|
110
112
|
reason: n
|
|
@@ -114,62 +116,62 @@ var wt = (e) => typeof e == "string" && e !== "" ? e : null, Tt = async (e, t, n
|
|
|
114
116
|
}
|
|
115
117
|
return t ?? e;
|
|
116
118
|
});
|
|
117
|
-
},
|
|
119
|
+
}, Gt = (e) => {
|
|
118
120
|
let t = (() => {
|
|
119
121
|
switch (e.type) {
|
|
120
122
|
case "id":
|
|
121
123
|
case "reference":
|
|
122
124
|
case "text":
|
|
123
|
-
case "enum": return
|
|
125
|
+
case "enum": return M.String;
|
|
124
126
|
case "integer":
|
|
125
127
|
case "real":
|
|
126
|
-
case "decimal": return
|
|
127
|
-
case "boolean": return
|
|
128
|
+
case "decimal": return M.Number;
|
|
129
|
+
case "boolean": return M.Boolean;
|
|
128
130
|
case "timestamp":
|
|
129
|
-
case "date": return
|
|
130
|
-
case "bigint": return
|
|
131
|
-
case "bytes": return
|
|
132
|
-
case "array": return
|
|
133
|
-
case "interval": return
|
|
134
|
-
default: return
|
|
131
|
+
case "date": return yt;
|
|
132
|
+
case "bigint": return M.BigInt;
|
|
133
|
+
case "bytes": return M.Uint8ArrayFromBase64;
|
|
134
|
+
case "array": return M.Array(M.Unknown);
|
|
135
|
+
case "interval": return M.String;
|
|
136
|
+
default: return M.Unknown;
|
|
135
137
|
}
|
|
136
138
|
})();
|
|
137
|
-
return e.nullable === !0 ?
|
|
138
|
-
},
|
|
139
|
+
return e.nullable === !0 ? M.NullOr(t) : t;
|
|
140
|
+
}, Kt = (e, t) => {
|
|
139
141
|
let n = new Set(t?.omit ?? []), r = {};
|
|
140
|
-
for (let [t, i] of Object.entries(e.fields)) n.has(t) || (r[t] =
|
|
141
|
-
return
|
|
142
|
-
},
|
|
142
|
+
for (let [t, i] of Object.entries(e.fields)) n.has(t) || (r[t] = Gt(i));
|
|
143
|
+
return M.Struct(r);
|
|
144
|
+
}, qt = (e) => typeof e == "function" ? e : () => e, Jt = (e, t) => ({
|
|
143
145
|
kind: "one",
|
|
144
|
-
target:
|
|
146
|
+
target: qt(e),
|
|
145
147
|
...t?.foreignKey === void 0 ? {} : { foreignKey: t.foreignKey },
|
|
146
148
|
...t?.sourceKey === void 0 ? {} : { sourceKey: t.sourceKey }
|
|
147
|
-
}),
|
|
149
|
+
}), Yt = (e, t) => ({
|
|
148
150
|
kind: "many",
|
|
149
|
-
target:
|
|
151
|
+
target: qt(e),
|
|
150
152
|
...t?.foreignKey === void 0 ? {} : { foreignKey: t.foreignKey },
|
|
151
153
|
...t?.sourceKey === void 0 ? {} : { sourceKey: t.sourceKey }
|
|
152
|
-
}),
|
|
154
|
+
}), Xt = (e, t) => ({
|
|
153
155
|
kind: "manyToMany",
|
|
154
|
-
target:
|
|
155
|
-
through:
|
|
156
|
+
target: qt(e),
|
|
157
|
+
through: qt(t.through),
|
|
156
158
|
sourceKey: t.sourceKey,
|
|
157
159
|
targetKey: t.targetKey
|
|
158
|
-
}),
|
|
159
|
-
one:
|
|
160
|
-
many:
|
|
161
|
-
manyToMany:
|
|
162
|
-
},
|
|
160
|
+
}), Zt = {
|
|
161
|
+
one: Jt,
|
|
162
|
+
many: Yt,
|
|
163
|
+
manyToMany: Xt
|
|
164
|
+
}, Qt = (e, t) => {
|
|
163
165
|
let n = typeof e == "function" ? e : () => e;
|
|
164
166
|
return {
|
|
165
167
|
source: n,
|
|
166
|
-
relations: t(
|
|
168
|
+
relations: t(Zt, n())
|
|
167
169
|
};
|
|
168
|
-
},
|
|
170
|
+
}, $t = (e) => {
|
|
169
171
|
if (typeof e != "object" || !e) return !1;
|
|
170
172
|
let t = e;
|
|
171
173
|
return typeof t.source != "function" || typeof t.relations != "object" || t.relations === null ? !1 : Object.keys(t.relations).length === 0;
|
|
172
|
-
},
|
|
174
|
+
}, en = (e) => {
|
|
173
175
|
if (typeof e != "object" || !e) return !1;
|
|
174
176
|
let t = e;
|
|
175
177
|
if (typeof t.source != "function" || typeof t.relations != "object" || t.relations === null) return !1;
|
|
@@ -178,35 +180,35 @@ var wt = (e) => typeof e == "string" && e !== "" ? e : null, Tt = async (e, t, n
|
|
|
178
180
|
let t = e?.kind;
|
|
179
181
|
return t === "one" || t === "many" || t === "manyToMany";
|
|
180
182
|
});
|
|
181
|
-
},
|
|
183
|
+
}, tn = Jt, nn = Yt, rn = Xt, an = (e, t, n) => {
|
|
182
184
|
let r = [];
|
|
183
185
|
for (let [n, i] of Object.entries(e.fields)) i.type === "reference" && i.references?.()?.tableName === t && r.push(n);
|
|
184
186
|
if (r.length === 0) throw Error(`relation '${n}': no reference() column on '${e.tableName}' points at '${t}'. Either add one or pass an explicit { foreignKey: '<column>' }.`);
|
|
185
187
|
if (r.length > 1) throw Error(`relation '${n}': multiple reference() columns on '${e.tableName}' point at '${t}' (${r.join(", ")}). Pass an explicit { foreignKey: '<column>' } to disambiguate.`);
|
|
186
188
|
return r[0];
|
|
187
|
-
},
|
|
188
|
-
let t =
|
|
189
|
+
}, on = (e) => Object.keys(e.fields), sn = (e, t) => Object.prototype.hasOwnProperty.call(e.fields, t), cn = (e) => {
|
|
190
|
+
let t = on(e);
|
|
189
191
|
return t.length === 0 ? "<none>" : t.join(", ");
|
|
190
|
-
},
|
|
192
|
+
}, ln = (e, t, n) => {
|
|
191
193
|
let r = `relation '${t}' on '${e.tableName}'`, i = n.target();
|
|
192
194
|
if (n.kind === "manyToMany") {
|
|
193
195
|
let t = n.through();
|
|
194
|
-
for (let [a, o] of [["sourceKey", n.sourceKey], ["targetKey", n.targetKey]]) if (!
|
|
196
|
+
for (let [a, o] of [["sourceKey", n.sourceKey], ["targetKey", n.targetKey]]) if (!sn(t, o)) throw Error(`${r}: manyToMany ${a} '${o}' is not a column on the junction table '${t.tableName}'. Both keys name columns on the JUNCTION — ${a === "sourceKey" ? `sourceKey points at '${e.tableName}'` : `targetKey points at '${i.tableName}'`}. Columns on '${t.tableName}': ${cn(t)}.`);
|
|
195
197
|
return;
|
|
196
198
|
}
|
|
197
199
|
if (n.sourceKey !== void 0 && n.foreignKey !== void 0) throw Error(`${r}: pass EITHER sourceKey OR foreignKey, not both. sourceKey '${n.sourceKey}' names a column on the source ('${e.tableName}') holding the target's id; foreignKey '${n.foreignKey}' names a column on the target ('${i.tableName}') holding the source's id. With both, foreignKey is ignored.`);
|
|
198
|
-
if (n.sourceKey !== void 0 && !
|
|
199
|
-
let t =
|
|
200
|
-
throw Error(`${r}: sourceKey '${n.sourceKey}' is not a column on the source table '${e.tableName}'.` + (t ? ` It IS a column on the target '${i.tableName}' — you probably want { foreignKey: '${n.sourceKey}' }, which names the column on the TARGET that holds this table's id.` : ` Columns on '${e.tableName}': ${
|
|
200
|
+
if (n.sourceKey !== void 0 && !sn(e, n.sourceKey)) {
|
|
201
|
+
let t = sn(i, n.sourceKey);
|
|
202
|
+
throw Error(`${r}: sourceKey '${n.sourceKey}' is not a column on the source table '${e.tableName}'.` + (t ? ` It IS a column on the target '${i.tableName}' — you probably want { foreignKey: '${n.sourceKey}' }, which names the column on the TARGET that holds this table's id.` : ` Columns on '${e.tableName}': ${cn(e)}.`));
|
|
201
203
|
}
|
|
202
|
-
if (n.foreignKey !== void 0 && !
|
|
203
|
-
let t =
|
|
204
|
-
throw Error(`${r}: foreignKey '${n.foreignKey}' is not a column on the target table '${i.tableName}'.` + (t ? ` It IS a column on the source '${e.tableName}' — you want { sourceKey: '${n.foreignKey}' }. foreignKey names the column on the TARGET that points back at this table; sourceKey names the column on THIS table that holds the target's id.` : ` Columns on '${i.tableName}': ${
|
|
204
|
+
if (n.foreignKey !== void 0 && !sn(i, n.foreignKey)) {
|
|
205
|
+
let t = sn(e, n.foreignKey);
|
|
206
|
+
throw Error(`${r}: foreignKey '${n.foreignKey}' is not a column on the target table '${i.tableName}'.` + (t ? ` It IS a column on the source '${e.tableName}' — you want { sourceKey: '${n.foreignKey}' }. foreignKey names the column on the TARGET that points back at this table; sourceKey names the column on THIS table that holds the target's id.` : ` Columns on '${i.tableName}': ${cn(i)}.`));
|
|
205
207
|
}
|
|
206
|
-
},
|
|
207
|
-
let t = e.source(), n =
|
|
208
|
+
}, un = Symbol.for("@voltro/database/relationsRegistry"), dn = globalThis, P = dn[un] ?? (dn[un] = /* @__PURE__ */ new Map()), fn = (e) => {
|
|
209
|
+
let t = e.source(), n = P.get(t.tableName);
|
|
208
210
|
if (n === void 0) {
|
|
209
|
-
|
|
211
|
+
P.set(t.tableName, new Map(Object.entries(e.relations)));
|
|
210
212
|
return;
|
|
211
213
|
}
|
|
212
214
|
for (let [r, i] of Object.entries(e.relations)) {
|
|
@@ -216,29 +218,147 @@ var wt = (e) => typeof e == "string" && e !== "" ? e : null, Tt = async (e, t, n
|
|
|
216
218
|
n.set(r, i);
|
|
217
219
|
}
|
|
218
220
|
}
|
|
219
|
-
},
|
|
221
|
+
}, pn = (e) => {
|
|
220
222
|
let t = 0;
|
|
221
|
-
for (let n of Object.values(e))
|
|
223
|
+
for (let n of Object.values(e)) en(n) && (fn(n), t += 1);
|
|
222
224
|
return t;
|
|
223
|
-
},
|
|
224
|
-
let t =
|
|
225
|
+
}, mn = (e) => {
|
|
226
|
+
let t = P.get(e);
|
|
225
227
|
if (t !== void 0) return Object.fromEntries(t);
|
|
226
|
-
},
|
|
228
|
+
}, hn = (e, t) => P.get(e)?.get(t), gn = () => {
|
|
227
229
|
let e = [];
|
|
228
|
-
for (let [t, n] of
|
|
230
|
+
for (let [t, n] of P) for (let [r, i] of n) e.push({
|
|
229
231
|
source: t,
|
|
230
232
|
name: r,
|
|
231
233
|
relation: i
|
|
232
234
|
});
|
|
233
235
|
return e;
|
|
234
|
-
},
|
|
235
|
-
for (let [e, t] of
|
|
236
|
-
let n =
|
|
237
|
-
if (n !== void 0) for (let [e, r] of t)
|
|
238
|
-
}
|
|
239
|
-
},
|
|
240
|
-
|
|
241
|
-
},
|
|
236
|
+
}, _n = () => {
|
|
237
|
+
for (let [e, t] of P) {
|
|
238
|
+
let n = p(e);
|
|
239
|
+
if (n !== void 0) for (let [e, r] of t) ln(n, e, r);
|
|
240
|
+
}
|
|
241
|
+
}, vn = () => {
|
|
242
|
+
P.clear();
|
|
243
|
+
}, yn = 4, bn = (e) => Object.keys(e.fields), xn = (e, t) => Object.prototype.hasOwnProperty.call(e.fields, t), Sn = (e, t) => {
|
|
244
|
+
let n = [];
|
|
245
|
+
for (let [r, i] of Object.entries(e.fields)) i.type === "reference" && i.references?.()?.tableName === t && n.push(r);
|
|
246
|
+
return n;
|
|
247
|
+
}, Cn = (e, t) => {
|
|
248
|
+
let n = [];
|
|
249
|
+
for (let r of t) {
|
|
250
|
+
if (r.source !== e) continue;
|
|
251
|
+
let t = r.relation, i;
|
|
252
|
+
try {
|
|
253
|
+
i = t.target();
|
|
254
|
+
} catch {
|
|
255
|
+
continue;
|
|
256
|
+
}
|
|
257
|
+
if (t.kind === "manyToMany") {
|
|
258
|
+
let e;
|
|
259
|
+
try {
|
|
260
|
+
e = t.through();
|
|
261
|
+
} catch {
|
|
262
|
+
continue;
|
|
263
|
+
}
|
|
264
|
+
if (!xn(e, t.sourceKey)) continue;
|
|
265
|
+
n.push({
|
|
266
|
+
table: e.tableName,
|
|
267
|
+
foreignKey: t.sourceKey,
|
|
268
|
+
parentKey: "id"
|
|
269
|
+
});
|
|
270
|
+
continue;
|
|
271
|
+
}
|
|
272
|
+
if (t.sourceKey !== void 0) continue;
|
|
273
|
+
let a = Sn(i, e), o = t.foreignKey ?? (a.length === 1 ? a[0] : void 0);
|
|
274
|
+
o === void 0 || !xn(i, o) || n.push({
|
|
275
|
+
table: i.tableName,
|
|
276
|
+
foreignKey: o,
|
|
277
|
+
parentKey: "id"
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
return n;
|
|
281
|
+
}, wn = (e, t) => {
|
|
282
|
+
let n = [];
|
|
283
|
+
for (let r of t) if (r.tableName !== e) for (let t of Sn(r, e)) n.push({
|
|
284
|
+
table: r.tableName,
|
|
285
|
+
foreignKey: t,
|
|
286
|
+
parentKey: "id"
|
|
287
|
+
});
|
|
288
|
+
return n;
|
|
289
|
+
}, Tn = (e) => `${e.table}\u0000${e.hops.map((e) => `${e.table}.${e.foreignKey}<-${e.parentKey}`).join("|")}`, En = (e) => {
|
|
290
|
+
let t = e.tables ?? h(), n = e.relations ?? gn(), r = e.maxDepth ?? 4, i = new Set(e.exclude ?? []), a = new Map(t.map((e) => [e.tableName, e])), o = [];
|
|
291
|
+
if (!a.has(e.subjectTable)) return {
|
|
292
|
+
subjectTable: e.subjectTable,
|
|
293
|
+
paths: [],
|
|
294
|
+
limitations: [{
|
|
295
|
+
kind: "unreachable",
|
|
296
|
+
table: e.subjectTable,
|
|
297
|
+
detail: `the subject table '${e.subjectTable}' is not registered — no schema was loaded, or the name is wrong. Registered: ${t.length === 0 ? "<none>" : t.map((e) => e.tableName).join(", ")}`
|
|
298
|
+
}]
|
|
299
|
+
};
|
|
300
|
+
let s = {
|
|
301
|
+
table: e.subjectTable,
|
|
302
|
+
hops: [],
|
|
303
|
+
depth: 0,
|
|
304
|
+
via: "relation"
|
|
305
|
+
}, c = [s], l = /* @__PURE__ */ new Set([Tn(s)]), u = /* @__PURE__ */ new Set(), d = [s];
|
|
306
|
+
for (let e = 1; e <= r; e++) {
|
|
307
|
+
let r = [];
|
|
308
|
+
for (let a of d) {
|
|
309
|
+
let s = Cn(a.table, n), d = wn(a.table, t), f = [...s.map((e) => [e, "relation"]), ...d.map((e) => [e, "reference"])];
|
|
310
|
+
for (let [t, n] of f) {
|
|
311
|
+
if (i.has(t.table)) {
|
|
312
|
+
o.push({
|
|
313
|
+
kind: "excluded",
|
|
314
|
+
table: t.table,
|
|
315
|
+
detail: `excluded by configuration (reached from '${a.table}')`
|
|
316
|
+
});
|
|
317
|
+
continue;
|
|
318
|
+
}
|
|
319
|
+
let s = `${t.table}\u0000${t.foreignKey}`;
|
|
320
|
+
if (u.has(s)) continue;
|
|
321
|
+
u.add(s);
|
|
322
|
+
let d = {
|
|
323
|
+
table: t.table,
|
|
324
|
+
hops: [...a.hops, t],
|
|
325
|
+
depth: e,
|
|
326
|
+
via: n
|
|
327
|
+
}, f = Tn(d);
|
|
328
|
+
l.has(f) || (l.add(f), c.push(d), r.push(d));
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
if (r.length === 0) {
|
|
332
|
+
d = [];
|
|
333
|
+
break;
|
|
334
|
+
}
|
|
335
|
+
d = r;
|
|
336
|
+
}
|
|
337
|
+
for (let e of d) (Cn(e.table, n).length > 0 || wn(e.table, t).length > 0) && o.push({
|
|
338
|
+
kind: "depth-truncated",
|
|
339
|
+
table: e.table,
|
|
340
|
+
detail: `stopped at maxDepth ${r}; tables linked FROM '${e.table}' were not explored`
|
|
341
|
+
});
|
|
342
|
+
let f = new Set(c.map((e) => e.table));
|
|
343
|
+
for (let n of t) f.has(n.tableName) || i.has(n.tableName) || o.push({
|
|
344
|
+
kind: "unreachable",
|
|
345
|
+
table: n.tableName,
|
|
346
|
+
detail: `no relation() and no reference() column links '${n.tableName}' to '${e.subjectTable}'. If it holds subject data through a plain column, a polymorphic (type,id) pair, JSON or free text, add an explicit subjectScopes entry — this derivation cannot see it. Columns: ${bn(n).join(", ")}`
|
|
347
|
+
});
|
|
348
|
+
return {
|
|
349
|
+
subjectTable: e.subjectTable,
|
|
350
|
+
paths: c,
|
|
351
|
+
limitations: o
|
|
352
|
+
};
|
|
353
|
+
}, Dn = (e) => {
|
|
354
|
+
let t = [`subject graph · ${e.subjectTable} · ${e.paths.length} table(s) reachable`];
|
|
355
|
+
for (let n of e.paths) {
|
|
356
|
+
let r = n.hops.length === 0 ? `${e.subjectTable} (the subject row itself)` : [e.subjectTable, ...n.hops.map((e) => `${e.table}.${e.foreignKey}`)].join(" → ");
|
|
357
|
+
t.push(` • ${n.table} [depth ${n.depth}, via ${n.via}]`), t.push(` ${r}`);
|
|
358
|
+
}
|
|
359
|
+
let n = e.limitations.filter((e) => e.kind === "depth-truncated"), r = e.limitations.filter((e) => e.kind === "unreachable"), i = e.limitations.filter((e) => e.kind === "excluded");
|
|
360
|
+
return t.push(""), t.push(" WHAT THIS CANNOT SEE — a DSAR is only as complete as this list is short:"), n.length > 0 && t.push(` depth-truncated (${n.length}): ${n.map((e) => e.table).join(", ")}`), i.length > 0 && t.push(` excluded (${i.length}): ${[...new Set(i.map((e) => e.table))].join(", ")}`), t.push(r.length === 0 ? " unreachable: none — every registered table is linked to the subject." : ` unreachable (${r.length}): ${r.map((e) => e.table).join(", ")}`), t.push(" Always outside this graph: object storage / uploaded files, external processors,"), t.push(" log and metric sinks, backups, and any subject id embedded in JSON or free text."), t.join("\n");
|
|
361
|
+
}, On = (e) => e == null || typeof e == "boolean" ? e : typeof e == "number" ? e !== 0 : typeof e == "bigint" ? e !== 0n : typeof e == "string" ? e === "1" || e.toLowerCase() === "true" : e, kn = (e) => {
|
|
242
362
|
if (e == null || typeof e != "string") return e;
|
|
243
363
|
let t = e.trim();
|
|
244
364
|
if (t.length === 0) return e;
|
|
@@ -249,7 +369,7 @@ var wt = (e) => typeof e == "string" && e !== "" ? e : null, Tt = async (e, t, n
|
|
|
249
369
|
} catch {
|
|
250
370
|
return e;
|
|
251
371
|
}
|
|
252
|
-
},
|
|
372
|
+
}, An = (e) => e == null || typeof e == "string" ? e : typeof e == "number" || typeof e == "bigint" ? String(e) : e, jn = (e) => {
|
|
253
373
|
if (e == null || e instanceof Date) return e;
|
|
254
374
|
if (typeof e == "string") {
|
|
255
375
|
let t = new Date(e);
|
|
@@ -260,21 +380,21 @@ var wt = (e) => typeof e == "string" && e !== "" ? e : null, Tt = async (e, t, n
|
|
|
260
380
|
return isNaN(t.getTime()) ? e : t;
|
|
261
381
|
}
|
|
262
382
|
return e;
|
|
263
|
-
},
|
|
383
|
+
}, Mn = (e, t, n) => {
|
|
264
384
|
if (e == null) return e;
|
|
265
385
|
switch (t) {
|
|
266
|
-
case "boolean": return n === "postgres" ? e :
|
|
386
|
+
case "boolean": return n === "postgres" ? e : On(e);
|
|
267
387
|
case "json":
|
|
268
|
-
case "array": return n === "postgres" ? e :
|
|
388
|
+
case "array": return n === "postgres" ? e : kn(e);
|
|
269
389
|
case "timestamp":
|
|
270
|
-
case "date": return n === "sqlite" || n === "turso" ?
|
|
390
|
+
case "date": return n === "sqlite" || n === "turso" ? jn(e) : e;
|
|
271
391
|
case "decimal":
|
|
272
|
-
case "bigint": return
|
|
392
|
+
case "bigint": return An(e);
|
|
273
393
|
default: return e;
|
|
274
394
|
}
|
|
275
|
-
},
|
|
395
|
+
}, Nn = (e, t, n) => {
|
|
276
396
|
if (e.length === 0) return e;
|
|
277
|
-
let r =
|
|
397
|
+
let r = p(t);
|
|
278
398
|
if (r === void 0) return e;
|
|
279
399
|
let i = r.fields, a = [];
|
|
280
400
|
for (let [e, t] of Object.entries(i)) a.push({
|
|
@@ -283,36 +403,36 @@ var wt = (e) => typeof e == "string" && e !== "" ? e : null, Tt = async (e, t, n
|
|
|
283
403
|
});
|
|
284
404
|
return e.map((e) => {
|
|
285
405
|
let t = { ...e };
|
|
286
|
-
for (let { key: e, type: r } of a) e in t && (t[e] =
|
|
406
|
+
for (let { key: e, type: r } of a) e in t && (t[e] = Mn(t[e], r, n));
|
|
287
407
|
return t;
|
|
288
408
|
});
|
|
289
|
-
},
|
|
409
|
+
}, Pn = (e, t) => {
|
|
290
410
|
if (e == null) return e;
|
|
291
411
|
switch (t) {
|
|
292
412
|
case "json":
|
|
293
413
|
case "array": return typeof e == "string" ? e : JSON.stringify(e);
|
|
294
414
|
default: return e;
|
|
295
415
|
}
|
|
296
|
-
},
|
|
297
|
-
let r =
|
|
416
|
+
}, Fn = (e, t, n = ["json", "array"]) => {
|
|
417
|
+
let r = p(t);
|
|
298
418
|
if (r === void 0) return e;
|
|
299
419
|
let i = r.fields, a = null;
|
|
300
420
|
for (let [t, r] of Object.entries(i)) if (n.includes(r.type) && t in e) {
|
|
301
|
-
let n =
|
|
421
|
+
let n = Pn(e[t], r.type);
|
|
302
422
|
n !== e[t] && (a === null && (a = { ...e }), a[t] = n);
|
|
303
423
|
}
|
|
304
424
|
return a ?? e;
|
|
305
|
-
},
|
|
425
|
+
}, In = class extends Error {
|
|
306
426
|
_tag = "EagerCardinalityError";
|
|
307
427
|
constructor(e) {
|
|
308
428
|
super(e), this.name = "EagerCardinalityError";
|
|
309
429
|
}
|
|
310
|
-
},
|
|
430
|
+
}, Ln = (e) => {
|
|
311
431
|
let { relationName: t, sourceTableName: n, targetTableName: r, foreignKey: i, sourceKey: a } = e, o = r === n;
|
|
312
432
|
return `relation '${t}' on '${n}' is declared \`one\`, but ${r}.${i} matches MORE than one row for the same ${n}.${a} — so there is no single related row to return.` + (o ? ` Because this relation is self-referential, check which side the key is on: \`foreignKey: '${i}'\` means "rows whose ${i} points AT me" (my children — there can be many). If you meant "the row my ${i} points to" (my parent), that is \`sourceKey: '${i}'\`.` : " Use `many(...)` if several are expected, or narrow the key.");
|
|
313
|
-
},
|
|
433
|
+
}, Rn = async (e, t, n, r) => {
|
|
314
434
|
if (e.length === 0) return e;
|
|
315
|
-
let i =
|
|
435
|
+
let i = mn(n.tableName);
|
|
316
436
|
if (i === void 0) throw Error(`cannot eager-load on '${n.tableName}': no relations registered. Did you forget to declare \`relations(${n.tableName}, ...)\` or import the file that does?`);
|
|
317
437
|
let a = e.map((e) => ({ ...e }));
|
|
318
438
|
for (let [e, o] of Object.entries(t)) {
|
|
@@ -321,36 +441,36 @@ var wt = (e) => typeof e == "string" && e !== "" ? e : null, Tt = async (e, t, n
|
|
|
321
441
|
let t = Object.keys(i).join(", ") || "<none>";
|
|
322
442
|
throw Error(`unknown relation '${e}' on '${n.tableName}'. Registered relations: ${t}.`);
|
|
323
443
|
}
|
|
324
|
-
|
|
444
|
+
ln(n, e, t), await zn(a, e, t, o === !0 ? {} : o, n, r);
|
|
325
445
|
}
|
|
326
446
|
return a;
|
|
327
|
-
},
|
|
447
|
+
}, zn = async (e, t, n, r, i, a) => {
|
|
328
448
|
switch (n.kind) {
|
|
329
449
|
case "one":
|
|
330
|
-
await
|
|
450
|
+
await Bn(e, t, n, r, i, a);
|
|
331
451
|
return;
|
|
332
452
|
case "many":
|
|
333
|
-
await
|
|
453
|
+
await Vn(e, t, n, r, i, a);
|
|
334
454
|
return;
|
|
335
455
|
case "manyToMany":
|
|
336
|
-
await
|
|
456
|
+
await Un(e, t, n, r, i, a);
|
|
337
457
|
return;
|
|
338
458
|
}
|
|
339
|
-
},
|
|
340
|
-
let o = n.target(), s = n.sourceKey ??
|
|
459
|
+
}, Bn = async (e, t, n, r, i, a) => {
|
|
460
|
+
let o = n.target(), s = n.sourceKey ?? Wn(i, o.tableName);
|
|
341
461
|
if (s !== void 0) {
|
|
342
|
-
let n =
|
|
462
|
+
let n = F(e, s), i = n.length === 0 ? [] : await Gn(o, "id", n, r, a), c = new Map(i.map((e) => [e.id, e]));
|
|
343
463
|
for (let n of e) {
|
|
344
464
|
let e = n[s];
|
|
345
465
|
n[t] = e == null ? null : c.get(e) ?? null;
|
|
346
466
|
}
|
|
347
|
-
await
|
|
467
|
+
await Kn(i, r.with, o, a);
|
|
348
468
|
return;
|
|
349
469
|
}
|
|
350
|
-
let c = n.foreignKey ??
|
|
470
|
+
let c = n.foreignKey ?? an(o, i.tableName, t), l = n.sourceKey ?? "id", u = F(e, l), d = u.length === 0 ? [] : await Gn(o, c, u, r, a), f = /* @__PURE__ */ new Map();
|
|
351
471
|
for (let e of d) {
|
|
352
472
|
let n = e[c];
|
|
353
|
-
if (f.has(n)) throw new
|
|
473
|
+
if (f.has(n)) throw new In(Ln({
|
|
354
474
|
relationName: t,
|
|
355
475
|
sourceTableName: i.tableName,
|
|
356
476
|
targetTableName: o.tableName,
|
|
@@ -363,9 +483,9 @@ var wt = (e) => typeof e == "string" && e !== "" ? e : null, Tt = async (e, t, n
|
|
|
363
483
|
let e = n[l];
|
|
364
484
|
n[t] = e == null ? null : f.get(e) ?? null;
|
|
365
485
|
}
|
|
366
|
-
await
|
|
367
|
-
},
|
|
368
|
-
let o = n.target(), s = n.foreignKey ??
|
|
486
|
+
await Kn(d, r.with, o, a);
|
|
487
|
+
}, Vn = async (e, t, n, r, i, a) => {
|
|
488
|
+
let o = n.target(), s = n.foreignKey ?? an(o, i.tableName, t), c = n.sourceKey ?? "id", l = F(e, c), u = Hn(r), d = l.length === 0 ? [] : await Gn(o, s, l, u, a), f = /* @__PURE__ */ new Map();
|
|
369
489
|
for (let e of d) {
|
|
370
490
|
let t = e[s], n = f.get(t);
|
|
371
491
|
n ? n.push(e) : f.set(t, [e]);
|
|
@@ -381,12 +501,12 @@ var wt = (e) => typeof e == "string" && e !== "" ? e : null, Tt = async (e, t, n
|
|
|
381
501
|
let e = n[c];
|
|
382
502
|
n[t] = f.get(e) ?? [];
|
|
383
503
|
}
|
|
384
|
-
await
|
|
385
|
-
},
|
|
504
|
+
await Kn(d, r.with, o, a);
|
|
505
|
+
}, Hn = (e) => {
|
|
386
506
|
let { limit: t, offset: n, ...r } = e;
|
|
387
507
|
return r;
|
|
388
|
-
},
|
|
389
|
-
let o = n.target(), s = n.through(), c =
|
|
508
|
+
}, Un = async (e, t, n, r, i, a) => {
|
|
509
|
+
let o = n.target(), s = n.through(), c = F(e, "id");
|
|
390
510
|
if (c.length === 0) {
|
|
391
511
|
for (let n of e) n[t] = [];
|
|
392
512
|
return;
|
|
@@ -407,8 +527,8 @@ var wt = (e) => typeof e == "string" && e !== "" ? e : null, Tt = async (e, t, n
|
|
|
407
527
|
for (let n of e) n[t] = [];
|
|
408
528
|
return;
|
|
409
529
|
}
|
|
410
|
-
let f = await
|
|
411
|
-
await
|
|
530
|
+
let f = await Gn(o, "id", F(d, n.targetKey), r, a), p = new Map(f.map((e) => [e.id, e]));
|
|
531
|
+
await Kn(f, r.with, o, a);
|
|
412
532
|
let m = r.junction === void 0 ? void 0 : r.junction === !0 ? Object.keys(s.fields) : r.junction, h = /* @__PURE__ */ new Map();
|
|
413
533
|
for (let e of d) {
|
|
414
534
|
let t = e[n.sourceKey], r = e[n.targetKey], i = p.get(r);
|
|
@@ -420,16 +540,16 @@ var wt = (e) => typeof e == "string" && e !== "" ? e : null, Tt = async (e, t, n
|
|
|
420
540
|
o ? o.push(a) : h.set(t, [a]);
|
|
421
541
|
}
|
|
422
542
|
for (let n of e) n[t] = h.get(n.id) ?? [];
|
|
423
|
-
},
|
|
543
|
+
}, Wn = (e, t) => {
|
|
424
544
|
for (let [n, r] of Object.entries(e.fields)) if (r.type === "reference" && r.references?.()?.tableName === t) return n;
|
|
425
|
-
},
|
|
545
|
+
}, F = (e, t) => {
|
|
426
546
|
let n = /* @__PURE__ */ new Set();
|
|
427
547
|
for (let r of e) {
|
|
428
548
|
let e = r[t];
|
|
429
549
|
e != null && n.add(e);
|
|
430
550
|
}
|
|
431
551
|
return [...n];
|
|
432
|
-
},
|
|
552
|
+
}, Gn = (e, t, n, r, i) => {
|
|
433
553
|
let a = {
|
|
434
554
|
column: t,
|
|
435
555
|
op: "in",
|
|
@@ -443,70 +563,70 @@ var wt = (e) => typeof e == "string" && e !== "" ? e : null, Tt = async (e, t, n
|
|
|
443
563
|
skip: r.offset,
|
|
444
564
|
projection: void 0
|
|
445
565
|
});
|
|
446
|
-
},
|
|
447
|
-
t !== void 0 && e.length !== 0 && (await
|
|
566
|
+
}, Kn = async (e, t, n, r) => {
|
|
567
|
+
t !== void 0 && e.length !== 0 && (await Rn(e, t, n, r)).forEach((t, n) => {
|
|
448
568
|
let r = e[n];
|
|
449
569
|
for (let [e, n] of Object.entries(t)) e in r || (r[e] = n);
|
|
450
570
|
});
|
|
451
|
-
},
|
|
571
|
+
}, qn = (e) => e.eager !== void 0 && Object.keys(e.eager).length > 0, Jn = class extends Error {
|
|
452
572
|
_tag = "TenantNamespaceUnresolved";
|
|
453
573
|
constructor(e) {
|
|
454
574
|
super(e), this.name = "TenantNamespaceUnresolved";
|
|
455
575
|
}
|
|
456
|
-
},
|
|
576
|
+
}, Yn = class extends Error {
|
|
457
577
|
_tag = "TenantNamespaceInvalid";
|
|
458
578
|
constructor(e) {
|
|
459
579
|
super(e), this.name = "TenantNamespaceInvalid";
|
|
460
580
|
}
|
|
461
|
-
},
|
|
462
|
-
if (e == null || e === "") throw new
|
|
463
|
-
let t =
|
|
464
|
-
if (t.replace(/_/g, "") === "") throw new
|
|
465
|
-
let n = `${
|
|
466
|
-
if (n.length >
|
|
581
|
+
}, Xn = 63, Zn = "tenant_", Qn = (e) => e.toLowerCase().replace(/[^a-z0-9_]/g, "_"), $n = (e) => {
|
|
582
|
+
if (e == null || e === "") throw new Jn("namespace isolation is on but the request has no resolvable tenant (subject.tenantId is null/empty). Refusing to run against a shared/default namespace — this would be a cross-tenant read. Authenticate with a tenant-scoped subject, or disable namespace isolation for this surface.");
|
|
583
|
+
let t = Qn(e);
|
|
584
|
+
if (t.replace(/_/g, "") === "") throw new Yn(`tenant id '${e}' has no usable identifier characters after sanitisation — cannot derive a distinct namespace.`);
|
|
585
|
+
let n = `${Zn}${t}`;
|
|
586
|
+
if (n.length > Xn) throw new Yn(`namespace '${n}' for tenant '${e}' exceeds the ${Xn}-byte identifier limit. Use a shorter tenant id.`);
|
|
467
587
|
return n;
|
|
468
|
-
},
|
|
469
|
-
if (e === void 0 || t == null || !
|
|
588
|
+
}, er = (e, t) => e === null ? t : `${e}.${t}`, tr = /* @__PURE__ */ new Set(["timestamp", "date"]), nr = /^\d{4}-\d{2}-\d{2}([T ]\d{2}:\d{2})?/, rr = (e, t) => {
|
|
589
|
+
if (e === void 0 || t == null || !tr.has(e) || t instanceof Date) return t;
|
|
470
590
|
if (typeof t == "number" && Number.isFinite(t)) return new Date(t);
|
|
471
|
-
if (typeof t == "string" &&
|
|
591
|
+
if (typeof t == "string" && nr.test(t)) {
|
|
472
592
|
let e = new Date(t);
|
|
473
593
|
return Number.isNaN(e.getTime()) ? t : e;
|
|
474
594
|
}
|
|
475
595
|
return t;
|
|
476
|
-
},
|
|
596
|
+
}, ir = (e, t) => e === void 0 || !tr.has(e) ? t : t.map((t) => rr(e, t)), ar = (e, t) => {
|
|
477
597
|
let { strings: n, values: r } = e, i = t.unsafe(n[0] ?? "");
|
|
478
598
|
for (let e = 0; e < r.length; e++) i = t`${i}${r[e]}${t.unsafe(n[e + 1] ?? "")}`;
|
|
479
599
|
return t`${i}`;
|
|
480
|
-
},
|
|
481
|
-
if ("not" in e) return t`NOT (${
|
|
482
|
-
if ("and" in e) return e.and.length === 0 ? t`TRUE` : t.and(e.and.map((e) =>
|
|
483
|
-
if ("or" in e) return e.or.length === 0 ? t`FALSE` : t.or(e.or.map((e) =>
|
|
600
|
+
}, or = (e) => e.replace(/[\\%_]/g, (e) => `\\${e}`), I = (e, t, n = null, r) => {
|
|
601
|
+
if ("not" in e) return t`NOT (${I(e.not, t, n, r)})`;
|
|
602
|
+
if ("and" in e) return e.and.length === 0 ? t`TRUE` : t.and(e.and.map((e) => I(e, t, n, r)));
|
|
603
|
+
if ("or" in e) return e.or.length === 0 ? t`FALSE` : t.or(e.or.map((e) => I(e, t, n, r)));
|
|
484
604
|
if (e.op === "subquery-in" || e.op === "subquery-not-in") {
|
|
485
|
-
let r = e, i =
|
|
605
|
+
let r = e, i = _r(r.subquery, t, n);
|
|
486
606
|
return r.op === "subquery-in" ? t`${t(r.column)} IN (${i})` : t`${t(r.column)} NOT IN (${i})`;
|
|
487
607
|
}
|
|
488
608
|
if (e.op === "exists" || e.op === "not-exists") {
|
|
489
|
-
let r = e, i =
|
|
609
|
+
let r = e, i = _r(r.subquery, t, n);
|
|
490
610
|
return r.op === "exists" ? t`EXISTS (${i})` : t`NOT EXISTS (${i})`;
|
|
491
611
|
}
|
|
492
612
|
let i = e, a = t(i.column), o = i.path, s = o !== void 0 && o.length > 0, c = () => t.onDialectOrElse({
|
|
493
|
-
mysql: () => t.unsafe(
|
|
494
|
-
mssql: () => t.unsafe(
|
|
495
|
-
sqlite: () => t.unsafe(
|
|
496
|
-
orElse: () => t.unsafe(
|
|
613
|
+
mysql: () => t.unsafe(E(i.column, o, "mysql")),
|
|
614
|
+
mssql: () => t.unsafe(E(i.column, o, "mssql")),
|
|
615
|
+
sqlite: () => t.unsafe(E(i.column, o, "sqlite")),
|
|
616
|
+
orElse: () => t.unsafe(E(i.column, o, "postgres"))
|
|
497
617
|
}), l = () => t.onDialectOrElse({
|
|
498
|
-
mysql: () => t.unsafe(
|
|
499
|
-
mssql: () => t.unsafe(
|
|
500
|
-
sqlite: () => t.unsafe(
|
|
501
|
-
orElse: () => t.unsafe(
|
|
502
|
-
}), u = s ? c() : a, d = s ? l() : a, f = (e) => s && e != null ? String(e) : e,
|
|
618
|
+
mysql: () => t.unsafe(E(i.column, o, "mysql", { numeric: !0 })),
|
|
619
|
+
mssql: () => t.unsafe(E(i.column, o, "mssql", { numeric: !0 })),
|
|
620
|
+
sqlite: () => t.unsafe(E(i.column, o, "sqlite", { numeric: !0 })),
|
|
621
|
+
orElse: () => t.unsafe(E(i.column, o, "postgres", { numeric: !0 }))
|
|
622
|
+
}), u = s ? c() : a, d = s ? l() : a, f = (e) => s && e != null ? String(e) : e, m = (e) => s ? Number(e) : e, h = s || r === void 0 ? void 0 : p(r)?.fields?.[i.column]?.type, g = (e) => rr(h, e);
|
|
503
623
|
switch (i.op) {
|
|
504
|
-
case "eq": return t`${u} = ${f(
|
|
505
|
-
case "neq": return t`${u} <> ${f(
|
|
506
|
-
case "gt": return t`${d} > ${
|
|
507
|
-
case "gte": return t`${d} >= ${
|
|
508
|
-
case "lt": return t`${d} < ${
|
|
509
|
-
case "lte": return t`${d} <= ${
|
|
624
|
+
case "eq": return t`${u} = ${f(g(i.value))}`;
|
|
625
|
+
case "neq": return t`${u} <> ${f(g(i.value))}`;
|
|
626
|
+
case "gt": return t`${d} > ${m(i.value)}`;
|
|
627
|
+
case "gte": return t`${d} >= ${m(i.value)}`;
|
|
628
|
+
case "lt": return t`${d} < ${m(i.value)}`;
|
|
629
|
+
case "lte": return t`${d} <= ${m(i.value)}`;
|
|
510
630
|
case "in": {
|
|
511
631
|
let e = i.value ?? [];
|
|
512
632
|
return e.length === 0 ? t`FALSE` : t`${u} IN ${t.in(s ? e.map((e) => f(e)) : e)}`;
|
|
@@ -516,7 +636,7 @@ var wt = (e) => typeof e == "string" && e !== "" ? e : null, Tt = async (e, t, n
|
|
|
516
636
|
return e.length === 0 ? t`TRUE` : t`${u} NOT IN ${t.in(s ? e.map((e) => f(e)) : e)}`;
|
|
517
637
|
}
|
|
518
638
|
case "contains": {
|
|
519
|
-
let e = `%${
|
|
639
|
+
let e = `%${or(typeof i.value == "string" ? i.value : String(i.value ?? ""))}%`;
|
|
520
640
|
return t.onDialectOrElse({
|
|
521
641
|
mysql: () => t`LOWER(${u}) LIKE LOWER(${e})`,
|
|
522
642
|
mssql: () => t`LOWER(${u}) LIKE LOWER(${e})`,
|
|
@@ -525,7 +645,7 @@ var wt = (e) => typeof e == "string" && e !== "" ? e : null, Tt = async (e, t, n
|
|
|
525
645
|
});
|
|
526
646
|
}
|
|
527
647
|
case "startsWith": {
|
|
528
|
-
let e = `${
|
|
648
|
+
let e = `${or(typeof i.value == "string" ? i.value : String(i.value ?? ""))}%`;
|
|
529
649
|
return t.onDialectOrElse({
|
|
530
650
|
mysql: () => t`${u} LIKE ${e}`,
|
|
531
651
|
orElse: () => t`${u} LIKE ${e} ESCAPE '\\'`
|
|
@@ -573,13 +693,13 @@ var wt = (e) => typeof e == "string" && e !== "" ? e : null, Tt = async (e, t, n
|
|
|
573
693
|
});
|
|
574
694
|
}
|
|
575
695
|
}
|
|
576
|
-
},
|
|
696
|
+
}, sr = (e, t) => {
|
|
577
697
|
let n = [];
|
|
578
698
|
return e.partitionBy && e.partitionBy.length > 0 && n.push(t`PARTITION BY ${t.csv(e.partitionBy.map((e) => t`${t(e)}`))}`), e.orderBy && e.orderBy.length > 0 && n.push(t`ORDER BY ${t.csv(e.orderBy.map((e) => e.direction === "desc" ? t`${t(e.column)} DESC` : t`${t(e.column)} ASC`))}`), n.length === 0 ? t`` : n.length === 1 ? n[0] : n.reduce((e, n, r) => r === 0 ? n : t`${e} ${n}`);
|
|
579
|
-
},
|
|
699
|
+
}, cr = (e, t) => t.csv(e.map((e) => {
|
|
580
700
|
let n = e.column === void 0 ? t.unsafe("*") : t`${t(e.column)}`;
|
|
581
701
|
if (e.op.startsWith("window-")) {
|
|
582
|
-
let r =
|
|
702
|
+
let r = sr(e.window ?? {}, t);
|
|
583
703
|
switch (e.op) {
|
|
584
704
|
case "window-row-number": return t`ROW_NUMBER() OVER (${r}) AS ${t(e.alias)}`;
|
|
585
705
|
case "window-rank": return t`RANK() OVER (${r}) AS ${t(e.alias)}`;
|
|
@@ -603,44 +723,44 @@ var wt = (e) => typeof e == "string" && e !== "" ? e : null, Tt = async (e, t, n
|
|
|
603
723
|
return t`${t(e.column)} AS ${t(e.alias)}`;
|
|
604
724
|
default: throw Error(`compileAggregateProjection: unknown op '${e.op}'`);
|
|
605
725
|
}
|
|
606
|
-
})),
|
|
726
|
+
})), lr = (e) => `[${e.join(",")}]`, ur = (e, t) => {
|
|
607
727
|
if (e.queryVector === void 0) return null;
|
|
608
|
-
let n = t(e.column), r =
|
|
728
|
+
let n = t(e.column), r = lr(e.queryVector), i = e.distance === "cosine" ? "<=>" : e.distance === "l2" ? "<->" : "<#>", a = e.distance === "cosine" ? "VEC_DISTANCE_COSINE" : "VEC_DISTANCE_EUCLIDEAN";
|
|
609
729
|
return t.onDialectOrElse({
|
|
610
730
|
mysql: () => t`${t.unsafe(a)}(${n}, ${r})`,
|
|
611
731
|
mssql: () => t`NULL`,
|
|
612
732
|
sqlite: () => t`NULL`,
|
|
613
733
|
orElse: () => t`${n} ${t.unsafe(i)} ${r}::vector`
|
|
614
734
|
});
|
|
615
|
-
},
|
|
735
|
+
}, dr = (e, t) => {
|
|
616
736
|
let n = t.unsafe(e.useGeography ? "::geography" : "::geometry");
|
|
617
737
|
return t`ST_Distance(${t(e.column)}${n}, ${e.geom}${n})`;
|
|
618
|
-
},
|
|
619
|
-
let r = n.csv(e.columns.map((e) => n`${n(e)}`)), i = `%${
|
|
738
|
+
}, fr = (e, t) => t`${t(e.column)} <-> ${e.geom}::geometry`, pr = (e, t) => t`${t(`${e.indexName}_tsv`)}`, mr = (e, t) => `${t}_${e.indexName}_fts`, hr = (e, t, n) => {
|
|
739
|
+
let r = n.csv(e.columns.map((e) => n`${n(e)}`)), i = `%${or(e.query)}%`;
|
|
620
740
|
return n.onDialectOrElse({
|
|
621
741
|
mysql: () => n`MATCH(${r}) AGAINST(${e.query} IN NATURAL LANGUAGE MODE)`,
|
|
622
742
|
sqlite: () => {
|
|
623
|
-
let r = n(
|
|
743
|
+
let r = n(mr(e, t));
|
|
624
744
|
return n`${n("id")} IN (SELECT ${n("row_id")} FROM ${r} WHERE ${r} MATCH ${e.query})`;
|
|
625
745
|
},
|
|
626
746
|
mssql: () => n.or(e.columns.map((e) => n`LOWER(${n(e)}) LIKE LOWER(${i}) ESCAPE '\\'`)),
|
|
627
|
-
orElse: () => n`${
|
|
747
|
+
orElse: () => n`${pr(e, n)} @@ plainto_tsquery(${e.config ?? "english"}, ${e.query})`
|
|
628
748
|
});
|
|
629
|
-
},
|
|
630
|
-
let r = `%${
|
|
749
|
+
}, gr = (e, t, n) => {
|
|
750
|
+
let r = `%${or(e.query)}%`;
|
|
631
751
|
return n.onDialectOrElse({
|
|
632
752
|
mysql: () => n`MATCH(${n.csv(e.columns.map((e) => n`${n(e)}`))}) AGAINST(${e.query} IN NATURAL LANGUAGE MODE)`,
|
|
633
753
|
sqlite: () => {
|
|
634
|
-
let r = n(
|
|
754
|
+
let r = n(mr(e, t));
|
|
635
755
|
return n`COALESCE((SELECT -bm25(${r}) FROM ${r} WHERE ${r} MATCH ${e.query} AND ${r}.${n("row_id")} = ${n("id")}), 0)`;
|
|
636
756
|
},
|
|
637
757
|
mssql: () => e.columns.map((e) => n`(CASE WHEN LOWER(${n(e)}) LIKE LOWER(${r}) ESCAPE '\\' THEN 1 ELSE 0 END)`).reduce((e, t, r) => r === 0 ? t : n`${e} + ${t}`),
|
|
638
|
-
orElse: () => n`ts_rank(${
|
|
758
|
+
orElse: () => n`ts_rank(${pr(e, n)}, plainto_tsquery(${e.config ?? "english"}, ${e.query}))`
|
|
639
759
|
});
|
|
640
|
-
},
|
|
760
|
+
}, _r = (e, t, n = null) => {
|
|
641
761
|
if (e.setOp && e.setOp.queries.length >= 2) {
|
|
642
|
-
let r = e.setOp.kind === "union" ? "UNION" : e.setOp.kind === "union-all" ? "UNION ALL" : e.setOp.kind === "intersect" ? "INTERSECT" : "EXCEPT", i = e.setOp.queries.map((e) => t`(${
|
|
643
|
-
if (
|
|
762
|
+
let r = e.setOp.kind === "union" ? "UNION" : e.setOp.kind === "union-all" ? "UNION ALL" : e.setOp.kind === "intersect" ? "INTERSECT" : "EXCEPT", i = e.setOp.queries.map((e) => t`(${_r(e, t, n)})`).reduce((e, n, i) => i === 0 ? n : t`${e} ${t.unsafe(r)} ${n}`), a = [];
|
|
763
|
+
if (T(e).length > 0 && a.push(t` ORDER BY ${t.csv(T(e).map((e) => e.direction === "desc" ? t`${t(e.column)} DESC` : t`${t(e.column)} ASC`))}`), e.take !== void 0) {
|
|
644
764
|
if (!Number.isInteger(e.take) || e.take < 0) throw Error(`compileSelect: invalid take ${e.take}`);
|
|
645
765
|
a.push(t` LIMIT ${t.unsafe(String(e.take))}`);
|
|
646
766
|
}
|
|
@@ -650,7 +770,7 @@ var wt = (e) => typeof e == "string" && e !== "" ? e : null, Tt = async (e, t, n
|
|
|
650
770
|
}
|
|
651
771
|
return t`${i}${a.reduce((e, n) => t`${e}${n}`, t``)}`;
|
|
652
772
|
}
|
|
653
|
-
let r = e.annClause === void 0 ? null :
|
|
773
|
+
let r = e.annClause === void 0 ? null : ur(e.annClause, t);
|
|
654
774
|
e.spatialClause !== void 0 && t.onDialectOrElse({
|
|
655
775
|
mysql: () => {
|
|
656
776
|
throw Error("@voltro/plugin-postgis: spatial distance / KNN ordering is postgres-only");
|
|
@@ -663,57 +783,57 @@ var wt = (e) => typeof e == "string" && e !== "" ? e : null, Tt = async (e, t, n
|
|
|
663
783
|
},
|
|
664
784
|
orElse: () => t``
|
|
665
785
|
});
|
|
666
|
-
let i = e.spatialClause?.projectAs === void 0 ? null :
|
|
786
|
+
let i = e.spatialClause?.projectAs === void 0 ? null : dr(e.spatialClause, t), a = e.aggregations && e.aggregations.length > 0 ? cr(e.aggregations, t) : e.joinedProjection && e.joinedProjection.length > 0 ? t.csv(e.joinedProjection.map((e) => t`${t(e.source)} AS ${t(e.outputKey)}`)) : e.projection && e.projection.length > 0 ? t.csv(e.projection.map((e) => t`${t(e)}`)) : t`*`, o = (e.aggregations && e.aggregations.length > 0) === !0, s = r !== null && !o ? t`${a}, ${r} AS ${t("distance")}` : a, c = e.fullTextSearch, l = c?.rank !== void 0 && !o ? gr(c, e.table, t) : null, u = l !== null && c?.rank !== void 0 ? t`${s}, ${l} AS ${t(c.rank.alias)}` : s, d = i !== null && !o && e.spatialClause?.projectAs !== void 0 ? t`${u}, ${i} AS ${t(e.spatialClause.projectAs)}` : u, f = e.distinctOn && e.distinctOn.length > 0 ? t.onDialectOrElse({
|
|
667
787
|
orElse: () => t`DISTINCT ON (${t.csv(e.distinctOn.map((e) => t`${t(e)}`))}) `,
|
|
668
788
|
mysql: () => t`DISTINCT `,
|
|
669
789
|
mssql: () => t`DISTINCT `,
|
|
670
790
|
sqlite: () => t`DISTINCT `
|
|
671
|
-
}) : e.distinct ? t`DISTINCT ` : t``, p = e.alias === void 0 ? t`${t(
|
|
791
|
+
}) : e.distinct ? t`DISTINCT ` : t``, p = e.alias === void 0 ? t`${t(er(n, e.table))}` : t`${t(er(n, e.table))} AS ${t(e.alias)}`, m = (e.joins ?? []).map((e) => {
|
|
672
792
|
let r = e.kind === "inner" ? "INNER" : "LEFT";
|
|
673
|
-
return t` ${t.unsafe(r)} JOIN ${t(
|
|
674
|
-
}), h = m.length > 0 ? m.reduce((e, n) => t`${e}${n}`, p) : p, g = c === void 0 ? null :
|
|
675
|
-
r !== null &&
|
|
676
|
-
for (let n of
|
|
677
|
-
let
|
|
793
|
+
return t` ${t.unsafe(r)} JOIN ${t(er(n, e.table))} AS ${t(e.alias)} ON ${I(e.on, t, n)}`;
|
|
794
|
+
}), h = m.length > 0 ? m.reduce((e, n) => t`${e}${n}`, p) : p, g = c === void 0 ? null : hr(c, e.table, t), _ = [e.predicate ? I(e.predicate, t, n, e.table) : null, g].filter((e) => e !== null), v = _.length > 0 ? t` WHERE ${t.and(_)}` : t``, y = e.groupBy && e.groupBy.length > 0 ? t` GROUP BY ${t.csv(e.groupBy.map((e) => t`${t(e)}`))}` : t``, b = e.having ? t` HAVING ${I(e.having, t, n, e.table)}` : t``, x = e.skip !== void 0, S = [];
|
|
795
|
+
r !== null && S.push(t`${r} ASC`), e.spatialClause?.order !== void 0 && S.push(e.spatialClause.order === "desc" ? t`${fr(e.spatialClause, t)} DESC` : t`${fr(e.spatialClause, t)} ASC`), l !== null && c?.rank?.order === !0 && S.push(t`${l} DESC`);
|
|
796
|
+
for (let n of T(e)) S.push(n.direction === "desc" ? t`${t(n.column)} DESC` : t`${t(n.column)} ASC`);
|
|
797
|
+
let ee = S.length > 0 ? t` ORDER BY ${t.csv(S)}` : x ? t.onDialectOrElse({
|
|
678
798
|
mssql: () => t` ORDER BY (SELECT NULL)`,
|
|
679
799
|
orElse: () => t``
|
|
680
|
-
}) : t``,
|
|
800
|
+
}) : t``, C = (e) => {
|
|
681
801
|
if (!Number.isFinite(e) || !Number.isInteger(e) || e < 0) throw Error(`compileSelect: expected non-negative integer take/skip, got ${e}`);
|
|
682
802
|
return t.unsafe(String(e));
|
|
683
|
-
},
|
|
803
|
+
}, te = (e.ctes ?? []).map((e) => t`${t(e.name)} AS (${_r(e.descriptor, t, n)})`), ne = (e.ctes ?? []).some((e) => e.recursive === !0), re = te.length > 0 ? t`WITH ${t.unsafe(ne ? "RECURSIVE " : "")}${t.csv(te)} ` : t``;
|
|
684
804
|
return t.onDialectOrElse({
|
|
685
805
|
mssql: () => {
|
|
686
|
-
let n = e.take !== void 0 && !
|
|
687
|
-
return t`${
|
|
806
|
+
let n = e.take !== void 0 && !x ? t`TOP ${C(e.take)} ` : t``, r = x ? t` OFFSET ${C(e.skip)} ROWS FETCH NEXT ${C(e.take ?? 2 ** 53 - 1)} ROWS ONLY` : t``;
|
|
807
|
+
return t`${re}SELECT ${n}${f}${d} FROM ${h}${v}${y}${b}${ee}${r}`;
|
|
688
808
|
},
|
|
689
809
|
orElse: () => {
|
|
690
|
-
let n = e.take === void 0 ? t`` : t` LIMIT ${
|
|
691
|
-
return t`${
|
|
810
|
+
let n = e.take === void 0 ? t`` : t` LIMIT ${C(e.take)}`, r = x ? t` OFFSET ${C(e.skip)}` : t``;
|
|
811
|
+
return t`${re}SELECT ${f}${d} FROM ${h}${v}${y}${b}${ee}${n}${r}`;
|
|
692
812
|
}
|
|
693
813
|
});
|
|
694
|
-
},
|
|
814
|
+
}, vr = (e, t, n) => {
|
|
695
815
|
if (e.eager === void 0) return null;
|
|
696
|
-
let r =
|
|
816
|
+
let r = xr(e.table, e.eager, e.sourceTable);
|
|
697
817
|
if (r === null) return null;
|
|
698
|
-
let i =
|
|
818
|
+
let i = Or(n, e, r, Dr(t, n));
|
|
699
819
|
return i === null ? null : {
|
|
700
820
|
fragment: i,
|
|
701
|
-
decode:
|
|
821
|
+
decode: jr(r, n)
|
|
702
822
|
};
|
|
703
|
-
},
|
|
823
|
+
}, yr = (e) => e.relation.kind === "one" && e.fkSide === "target", br = (e) => ({
|
|
704
824
|
...e,
|
|
705
825
|
branch: {
|
|
706
826
|
...e.branch,
|
|
707
827
|
limit: 2
|
|
708
828
|
}
|
|
709
|
-
}),
|
|
710
|
-
let r = n ??
|
|
829
|
+
}), xr = (e, t, n) => {
|
|
830
|
+
let r = n ?? y(e), i = mn(e);
|
|
711
831
|
if (i === void 0) return null;
|
|
712
832
|
let a = [];
|
|
713
833
|
for (let [e, n] of Object.entries(t)) {
|
|
714
834
|
let t = i[e];
|
|
715
835
|
if (t === void 0) return null;
|
|
716
|
-
let o =
|
|
836
|
+
let o = Sr(e, t, r, n === !0 ? {} : n);
|
|
717
837
|
if (o === null) return null;
|
|
718
838
|
a.push(o);
|
|
719
839
|
}
|
|
@@ -721,30 +841,30 @@ var wt = (e) => typeof e == "string" && e !== "" ? e : null, Tt = async (e, t, n
|
|
|
721
841
|
table: r,
|
|
722
842
|
children: a
|
|
723
843
|
};
|
|
724
|
-
},
|
|
844
|
+
}, Sr = (e, t, n, r) => {
|
|
725
845
|
let i = t.target(), a = (t.kind === "manyToMany" ? void 0 : t.sourceKey) ?? "id", o, s;
|
|
726
846
|
if (t.kind === "manyToMany") o = t.targetKey, s = "target";
|
|
727
847
|
else if (t.kind === "one") {
|
|
728
|
-
let r = t.sourceKey ??
|
|
848
|
+
let r = t.sourceKey ?? Er(n, i.tableName);
|
|
729
849
|
if (r !== void 0) o = r, s = "source";
|
|
730
850
|
else try {
|
|
731
|
-
o = t.foreignKey ??
|
|
851
|
+
o = t.foreignKey ?? an(i, n.tableName, e), s = "target";
|
|
732
852
|
} catch {
|
|
733
853
|
return null;
|
|
734
854
|
}
|
|
735
855
|
} else try {
|
|
736
|
-
o = t.foreignKey ??
|
|
856
|
+
o = t.foreignKey ?? an(i, n.tableName, e), s = "target";
|
|
737
857
|
} catch {
|
|
738
858
|
return null;
|
|
739
859
|
}
|
|
740
860
|
let c = r.with === void 0 ? [] : (() => {
|
|
741
|
-
let e =
|
|
861
|
+
let e = mn(i.tableName);
|
|
742
862
|
if (e === void 0 && Object.keys(r.with).length > 0) return null;
|
|
743
863
|
let t = [];
|
|
744
864
|
for (let [n, a] of Object.entries(r.with)) {
|
|
745
865
|
let r = e?.[n];
|
|
746
866
|
if (r === void 0) return null;
|
|
747
|
-
let o =
|
|
867
|
+
let o = Sr(n, r, i, a === !0 ? {} : a);
|
|
748
868
|
if (o === null) return null;
|
|
749
869
|
t.push(o);
|
|
750
870
|
}
|
|
@@ -760,9 +880,9 @@ var wt = (e) => typeof e == "string" && e !== "" ? e : null, Tt = async (e, t, n
|
|
|
760
880
|
fkSide: s,
|
|
761
881
|
branch: r,
|
|
762
882
|
children: c,
|
|
763
|
-
junction:
|
|
883
|
+
junction: Cr(t, r)
|
|
764
884
|
};
|
|
765
|
-
},
|
|
885
|
+
}, Cr = (e, t) => {
|
|
766
886
|
if (e.kind !== "manyToMany" || t.junction === void 0) return;
|
|
767
887
|
let n = e.through(), r = t.junction === !0 ? Object.keys(n.fields) : t.junction, i = r.filter((e) => e in n.fields);
|
|
768
888
|
return {
|
|
@@ -774,35 +894,35 @@ var wt = (e) => typeof e == "string" && e !== "" ? e : null, Tt = async (e, t, n
|
|
|
774
894
|
return t !== void 0 && (t.type === "timestamp" || t.type === "date");
|
|
775
895
|
})
|
|
776
896
|
};
|
|
777
|
-
},
|
|
897
|
+
}, wr = (e) => `__j_${e}`, Tr = "__j", Er = (e, t) => {
|
|
778
898
|
for (let [n, r] of Object.entries(e.fields)) if (r.type === "reference" && r.references?.()?.tableName === t) return n;
|
|
779
|
-
},
|
|
899
|
+
}, Dr = (e, t) => {
|
|
780
900
|
let n = 0;
|
|
781
901
|
return {
|
|
782
902
|
sql: e,
|
|
783
903
|
dialect: t,
|
|
784
904
|
nextAlias: () => `__a${n++}`
|
|
785
905
|
};
|
|
786
|
-
},
|
|
906
|
+
}, Or = (e, t, n, r) => {
|
|
787
907
|
switch (e) {
|
|
788
|
-
case "postgres": return
|
|
908
|
+
case "postgres": return Pr(t, n, r);
|
|
789
909
|
case "sqlite":
|
|
790
|
-
case "turso": return
|
|
910
|
+
case "turso": return Hr(t, n, r);
|
|
791
911
|
case "mysql":
|
|
792
|
-
case "mariadb": return
|
|
793
|
-
case "mssql": return
|
|
912
|
+
case "mariadb": return Qr(t, n, r);
|
|
913
|
+
case "mssql": return ai(t, n, r);
|
|
794
914
|
}
|
|
795
|
-
},
|
|
796
|
-
let n =
|
|
915
|
+
}, kr = (e, t) => t === "mssql" && !Ar.test(e) ? /* @__PURE__ */ new Date(`${e}Z`) : new Date(e), Ar = /(?:Z|[+-]\d{2}:?\d{2})$/, jr = (e, t) => {
|
|
916
|
+
let n = Mr(e.table, e.children, t);
|
|
797
917
|
return (e) => e.map((e) => {
|
|
798
918
|
let t = e.__row, r = typeof t == "string" ? JSON.parse(t) : t;
|
|
799
919
|
return n(r);
|
|
800
920
|
});
|
|
801
|
-
},
|
|
921
|
+
}, Mr = (e, t, n) => {
|
|
802
922
|
let r = [];
|
|
803
923
|
for (let [t, n] of Object.entries(e.fields)) (n.type === "timestamp" || n.type === "date") && r.push(t);
|
|
804
924
|
let i = t.map((e) => {
|
|
805
|
-
let t =
|
|
925
|
+
let t = Mr(e.target, e.children, n), r = e.relation.kind === "one", i = yr(e), a = i ? Ln({
|
|
806
926
|
relationName: e.relationName,
|
|
807
927
|
sourceTableName: e.source.tableName,
|
|
808
928
|
targetTableName: e.target.tableName,
|
|
@@ -815,14 +935,14 @@ var wt = (e) => typeof e == "string" && e !== "" ? e : null, Tt = async (e, t, n
|
|
|
815
935
|
isSingle: r,
|
|
816
936
|
fromOverFetch: i,
|
|
817
937
|
cardinalityMessage: a,
|
|
818
|
-
junction:
|
|
938
|
+
junction: Nr(e.junction, n)
|
|
819
939
|
};
|
|
820
940
|
});
|
|
821
941
|
return (e) => {
|
|
822
942
|
let t = { ...e };
|
|
823
943
|
for (let e of r) {
|
|
824
944
|
let r = t[e];
|
|
825
|
-
typeof r == "string" && (t[e] =
|
|
945
|
+
typeof r == "string" && (t[e] = kr(r, n));
|
|
826
946
|
}
|
|
827
947
|
for (let e of i) {
|
|
828
948
|
let n = t[e.name];
|
|
@@ -832,7 +952,7 @@ var wt = (e) => typeof e == "string" && e !== "" ? e : null, Tt = async (e, t, n
|
|
|
832
952
|
}
|
|
833
953
|
if (e.fromOverFetch) {
|
|
834
954
|
let r = n;
|
|
835
|
-
if (r.length > 1) throw new
|
|
955
|
+
if (r.length > 1) throw new In(e.cardinalityMessage);
|
|
836
956
|
t[e.name] = r.length === 0 ? null : e.decode(r[0]);
|
|
837
957
|
continue;
|
|
838
958
|
}
|
|
@@ -844,204 +964,204 @@ var wt = (e) => typeof e == "string" && e !== "" ? e : null, Tt = async (e, t, n
|
|
|
844
964
|
}
|
|
845
965
|
return t;
|
|
846
966
|
};
|
|
847
|
-
},
|
|
967
|
+
}, Nr = (e, t) => {
|
|
848
968
|
if (e === void 0) return;
|
|
849
969
|
let n = new Set(e.dateColumns), r = e.requested;
|
|
850
970
|
return (e) => {
|
|
851
971
|
let i = e._junction ?? {}, a = {};
|
|
852
972
|
for (let e of r) {
|
|
853
973
|
let r = i[e];
|
|
854
|
-
a[e] = n.has(e) && typeof r == "string" ?
|
|
974
|
+
a[e] = n.has(e) && typeof r == "string" ? kr(r, t) : r;
|
|
855
975
|
}
|
|
856
976
|
return {
|
|
857
977
|
...e,
|
|
858
978
|
_junction: a
|
|
859
979
|
};
|
|
860
980
|
};
|
|
861
|
-
},
|
|
862
|
-
let r = n.sql, i = n.nextAlias(), a = r(t.table.tableName), o = r(i), s =
|
|
863
|
-
return s === null ? null : r`SELECT ${s} AS "__row" FROM ${a} AS ${o}${e.predicate ? r` WHERE ${
|
|
864
|
-
},
|
|
865
|
-
let i = n.sql, a = r === void 0 ? i`to_jsonb(${i(e)}.*)` : i`(to_jsonb(${i(e)}.*) - ${
|
|
981
|
+
}, Pr = (e, t, n) => {
|
|
982
|
+
let r = n.sql, i = n.nextAlias(), a = r(t.table.tableName), o = r(i), s = Fr(i, t.children, n);
|
|
983
|
+
return s === null ? null : r`SELECT ${s} AS "__row" FROM ${a} AS ${o}${e.predicate ? r` WHERE ${H(e.predicate, i, r)}` : r``}${T(e).length > 0 ? r` ORDER BY ${r.csv(T(e).map((e) => e.direction === "desc" ? r`${z(i, e.column, r)} DESC` : r`${z(i, e.column, r)} ASC`))}` : r``}${e.take === void 0 ? r`` : r` LIMIT ${V(e.take, r)}`}${e.skip === void 0 ? r`` : r` OFFSET ${V(e.skip, r)}`}`;
|
|
984
|
+
}, Fr = (e, t, n, r) => {
|
|
985
|
+
let i = n.sql, a = r === void 0 ? i`to_jsonb(${i(e)}.*)` : i`(to_jsonb(${i(e)}.*) - ${B(Tr, i)}::text)`;
|
|
866
986
|
if (t.length === 0 && r === void 0) return a;
|
|
867
987
|
let o = [];
|
|
868
|
-
r !== void 0 && o.push(i`${
|
|
988
|
+
r !== void 0 && o.push(i`${B("_junction", i)}, ${z(e, Tr, i)}`);
|
|
869
989
|
for (let r of t) {
|
|
870
|
-
let t =
|
|
990
|
+
let t = Ir(r, e, n);
|
|
871
991
|
if (t === null) return null;
|
|
872
|
-
o.push(i`${
|
|
992
|
+
o.push(i`${B(r.relationName, i)}, ${t}`);
|
|
873
993
|
}
|
|
874
994
|
return i`${a} || jsonb_build_object(${i.csv(o)})`;
|
|
875
|
-
},
|
|
995
|
+
}, Ir = (e, t, n) => {
|
|
876
996
|
switch (e.relation.kind) {
|
|
877
|
-
case "one": return
|
|
878
|
-
case "many": return
|
|
879
|
-
case "manyToMany": return
|
|
997
|
+
case "one": return yr(e) ? Rr(br(e), t, n) : Lr(e, t, n);
|
|
998
|
+
case "many": return Rr(e, t, n);
|
|
999
|
+
case "manyToMany": return zr(e, t, n);
|
|
880
1000
|
}
|
|
881
|
-
},
|
|
882
|
-
let r = n.sql, i = n.nextAlias(), a =
|
|
1001
|
+
}, Lr = (e, t, n) => {
|
|
1002
|
+
let r = n.sql, i = n.nextAlias(), a = Fr(i, e.children, n);
|
|
883
1003
|
if (a === null) return null;
|
|
884
|
-
let o = e.fkSide === "source" ? r`${
|
|
1004
|
+
let o = e.fkSide === "source" ? r`${z(i, "id", r)} = ${z(t, e.foreignKey, r)}` : r`${z(i, e.foreignKey, r)} = ${z(t, e.sourceKey, r)}`, s = e.branch.where === void 0 ? r`` : r` AND ${H(e.branch.where, i, r)}`, c = L(i, e.branch.orderBy, r);
|
|
885
1005
|
return r`(SELECT ${a} FROM ${r(e.target.tableName)} AS ${r(i)} WHERE ${o}${s}${c} LIMIT 1)`;
|
|
886
|
-
},
|
|
887
|
-
let r = n.sql, i = n.nextAlias(), a =
|
|
1006
|
+
}, Rr = (e, t, n) => {
|
|
1007
|
+
let r = n.sql, i = n.nextAlias(), a = Fr(i, e.children, n);
|
|
888
1008
|
if (a === null) return null;
|
|
889
|
-
let o = r`${
|
|
1009
|
+
let o = r`${z(void 0, e.foreignKey, r)} = ${z(t, e.sourceKey, r)}`, s = e.branch.where === void 0 ? r`` : r` AND ${I(e.branch.where, r)}`, c = Vr(e.branch.orderBy, r), l = e.branch.limit === void 0 ? r`` : r` LIMIT ${V(e.branch.limit, r)}`, u = e.branch.offset === void 0 ? r`` : r` OFFSET ${V(e.branch.offset, r)}`;
|
|
890
1010
|
return r`COALESCE((SELECT jsonb_agg(${a}) FROM (SELECT * FROM ${r(e.target.tableName)} WHERE ${o}${s}${c}${l}${u}) AS ${r(i)}), '[]'::jsonb)`;
|
|
891
|
-
},
|
|
892
|
-
let r = n.sql, i = e.relation, a = i.through(), o = n.nextAlias(), s = n.nextAlias(), c =
|
|
1011
|
+
}, zr = (e, t, n) => {
|
|
1012
|
+
let r = n.sql, i = e.relation, a = i.through(), o = n.nextAlias(), s = n.nextAlias(), c = Fr(o, e.children, n, e.junction);
|
|
893
1013
|
if (c === null) return null;
|
|
894
|
-
let l = e.branch.where === void 0 ? r`` : r` AND ${
|
|
895
|
-
return r`COALESCE((SELECT jsonb_agg(${c}) FROM (SELECT ${r(o)}.*${m} FROM ${r(a.tableName)} AS ${r(s)} INNER JOIN ${r(e.target.tableName)} AS ${r(o)} ON ${
|
|
896
|
-
},
|
|
897
|
-
let r = n.sql, i = n.nextAlias(), a =
|
|
1014
|
+
let l = e.branch.where === void 0 ? r`` : r` AND ${I(e.branch.where, r)}`, u = pi(e, s, r), d = L(o, e.branch.orderBy, r), f = e.branch.limit === void 0 ? r`` : r` LIMIT ${V(e.branch.limit, r)}`, p = e.branch.offset === void 0 ? r`` : r` OFFSET ${V(e.branch.offset, r)}`, m = e.junction === void 0 ? r`` : r`, ${Br(e.junction, s, r)} AS ${r(Tr)}`;
|
|
1015
|
+
return r`COALESCE((SELECT jsonb_agg(${c}) FROM (SELECT ${r(o)}.*${m} FROM ${r(a.tableName)} AS ${r(s)} INNER JOIN ${r(e.target.tableName)} AS ${r(o)} ON ${z(o, "id", r)} = ${z(s, i.targetKey, r)} WHERE ${z(s, i.sourceKey, r)} = ${z(t, "id", r)}${u}${l}${d}${f}${p}) AS ${r(o)}), '[]'::jsonb)`;
|
|
1016
|
+
}, Br = (e, t, n) => e.present.length === 0 ? n`jsonb_build_object()` : n`jsonb_build_object(${n.csv(e.present.map((e) => n`${B(e, n)}, ${z(t, e, n)}`))})`, L = (e, t, n) => t === void 0 || t.length === 0 ? n`` : n` ORDER BY ${n.csv(t.map((t) => t.direction === "desc" ? n`${z(e, t.column, n)} DESC` : n`${z(e, t.column, n)} ASC`))}`, Vr = (e, t) => e === void 0 || e.length === 0 ? t`` : t` ORDER BY ${t.csv(e.map((e) => e.direction === "desc" ? t`${t(e.column)} DESC` : t`${t(e.column)} ASC`))}`, Hr = (e, t, n) => {
|
|
1017
|
+
let r = n.sql, i = n.nextAlias(), a = Ur(i, t.table, t.children, n);
|
|
898
1018
|
if (a === null) return null;
|
|
899
|
-
let o = e.predicate ? r` WHERE ${
|
|
1019
|
+
let o = e.predicate ? r` WHERE ${H(e.predicate, i, r)}` : r``, s = T(e).length > 0 ? r` ORDER BY ${r.csv(T(e).map((e) => e.direction === "desc" ? r`${z(i, e.column, r)} DESC` : r`${z(i, e.column, r)} ASC`))}` : r``, c = e.take === void 0 ? r`` : r` LIMIT ${V(e.take, r)}`, l = e.skip === void 0 ? r`` : r` OFFSET ${V(e.skip, r)}`;
|
|
900
1020
|
return r`SELECT ${a} AS "__row" FROM ${r(t.table.tableName)} AS ${r(i)}${o}${s}${c}${l}`;
|
|
901
|
-
},
|
|
1021
|
+
}, Ur = (e, t, n, r, i) => {
|
|
902
1022
|
let a = r.sql, o = [];
|
|
903
|
-
for (let n of Object.keys(t.fields)) o.push(a`${
|
|
1023
|
+
for (let n of Object.keys(t.fields)) o.push(a`${B(n, a)}, ${z(e, n, a)}`);
|
|
904
1024
|
if (i !== void 0) {
|
|
905
|
-
let e =
|
|
906
|
-
o.push(a`${
|
|
1025
|
+
let e = Wr(i.projection, i.source, a);
|
|
1026
|
+
o.push(a`${B("_junction", a)}, json_object(${e})`);
|
|
907
1027
|
}
|
|
908
1028
|
for (let t of n) {
|
|
909
|
-
let n =
|
|
1029
|
+
let n = Jr(t, e, r);
|
|
910
1030
|
if (n === null) return null;
|
|
911
|
-
o.push(a`${
|
|
1031
|
+
o.push(a`${B(t.relationName, a)}, ${n}`);
|
|
912
1032
|
}
|
|
913
1033
|
return a`json_object(${a.csv(o)})`;
|
|
914
|
-
},
|
|
1034
|
+
}, Wr = (e, t, n) => e.present.length === 0 ? n`` : n.csv(e.present.map((e) => n`${B(e, n)}, ${z(t.alias, t.physical(e), n)}`)), Gr = (e, t, n) => e.present.length === 0 ? n`` : n`, ${n.csv(e.present.map((e) => n`${z(t, e, n)} AS ${n(wr(e))}`))}`, Kr = (e) => ({
|
|
915
1035
|
alias: e,
|
|
916
|
-
physical:
|
|
917
|
-
}),
|
|
1036
|
+
physical: wr
|
|
1037
|
+
}), qr = (e) => ({
|
|
918
1038
|
alias: e,
|
|
919
1039
|
physical: (e) => e
|
|
920
|
-
}),
|
|
1040
|
+
}), Jr = (e, t, n) => {
|
|
921
1041
|
switch (e.relation.kind) {
|
|
922
|
-
case "one": return
|
|
923
|
-
case "many": return
|
|
924
|
-
case "manyToMany": return
|
|
1042
|
+
case "one": return yr(e) ? Xr(br(e), t, n) : Yr(e, t, n);
|
|
1043
|
+
case "many": return Xr(e, t, n);
|
|
1044
|
+
case "manyToMany": return Zr(e, t, n);
|
|
925
1045
|
}
|
|
926
|
-
},
|
|
927
|
-
let r = n.sql, i = n.nextAlias(), a =
|
|
1046
|
+
}, Yr = (e, t, n) => {
|
|
1047
|
+
let r = n.sql, i = n.nextAlias(), a = Ur(i, e.target, e.children, n);
|
|
928
1048
|
if (a === null) return null;
|
|
929
|
-
let o = e.fkSide === "source" ? r`${
|
|
1049
|
+
let o = e.fkSide === "source" ? r`${z(i, "id", r)} = ${z(t, e.foreignKey, r)}` : r`${z(i, e.foreignKey, r)} = ${z(t, e.sourceKey, r)}`;
|
|
930
1050
|
return r`(SELECT ${a} FROM ${r(e.target.tableName)} AS ${r(i)} WHERE ${o} LIMIT 1)`;
|
|
931
|
-
},
|
|
932
|
-
let r = n.sql, i = n.nextAlias(), a =
|
|
1051
|
+
}, Xr = (e, t, n) => {
|
|
1052
|
+
let r = n.sql, i = n.nextAlias(), a = Ur(i, e.target, e.children, n);
|
|
933
1053
|
if (a === null) return null;
|
|
934
|
-
let o = r`${
|
|
1054
|
+
let o = r`${z(void 0, e.foreignKey, r)} = ${z(t, e.sourceKey, r)}`, s = e.branch.where === void 0 ? r`` : r` AND ${I(U(e.branch.where), r)}`, c = Vr(e.branch.orderBy, r), l = e.branch.limit === void 0 ? r`` : r` LIMIT ${V(e.branch.limit, r)}`, u = e.branch.offset === void 0 ? r`` : r` OFFSET ${V(e.branch.offset, r)}`;
|
|
935
1055
|
return r`COALESCE((SELECT json_group_array(${a}) FROM (SELECT * FROM ${r(e.target.tableName)} WHERE ${o}${s}${c}${l}${u}) AS ${r(i)}), json('[]'))`;
|
|
936
|
-
},
|
|
937
|
-
let r = n.sql, i = e.relation, a = i.through(), o = n.nextAlias(), s = n.nextAlias(), c =
|
|
1056
|
+
}, Zr = (e, t, n) => {
|
|
1057
|
+
let r = n.sql, i = e.relation, a = i.through(), o = n.nextAlias(), s = n.nextAlias(), c = Ur(o, e.target, e.children, n, e.junction === void 0 ? void 0 : {
|
|
938
1058
|
projection: e.junction,
|
|
939
|
-
source:
|
|
1059
|
+
source: Kr(o)
|
|
940
1060
|
});
|
|
941
1061
|
if (c === null) return null;
|
|
942
|
-
let l = e.branch.where === void 0 ? r`` : r` AND ${
|
|
943
|
-
return r`COALESCE((SELECT json_group_array(${c}) FROM (SELECT ${r(o)}.*${m} FROM ${r(a.tableName)} AS ${r(s)} INNER JOIN ${r(e.target.tableName)} AS ${r(o)} ON ${
|
|
944
|
-
},
|
|
945
|
-
let r = n.sql, i = n.nextAlias(), a =
|
|
1062
|
+
let l = e.branch.where === void 0 ? r`` : r` AND ${I(U(e.branch.where), r)}`, u = pi(e, s, r, !0), d = L(o, e.branch.orderBy, r), f = e.branch.limit === void 0 ? r`` : r` LIMIT ${V(e.branch.limit, r)}`, p = e.branch.offset === void 0 ? r`` : r` OFFSET ${V(e.branch.offset, r)}`, m = e.junction === void 0 ? r`` : Gr(e.junction, s, r);
|
|
1063
|
+
return r`COALESCE((SELECT json_group_array(${c}) FROM (SELECT ${r(o)}.*${m} FROM ${r(a.tableName)} AS ${r(s)} INNER JOIN ${r(e.target.tableName)} AS ${r(o)} ON ${z(o, "id", r)} = ${z(s, i.targetKey, r)} WHERE ${z(s, i.sourceKey, r)} = ${z(t, "id", r)}${u}${l}${d}${f}${p}) AS ${r(o)}), json('[]'))`;
|
|
1064
|
+
}, Qr = (e, t, n) => {
|
|
1065
|
+
let r = n.sql, i = n.nextAlias(), a = R(i, t.table, t.children, n);
|
|
946
1066
|
if (a === null) return null;
|
|
947
|
-
let o = e.predicate ? r` WHERE ${
|
|
1067
|
+
let o = e.predicate ? r` WHERE ${H(e.predicate, i, r)}` : r``, s = T(e).length > 0 ? r` ORDER BY ${r.csv(T(e).map((e) => e.direction === "desc" ? r`${z(i, e.column, r)} DESC` : r`${z(i, e.column, r)} ASC`))}` : r``, c = e.take === void 0 ? r`` : r` LIMIT ${V(e.take, r)}`, l = e.skip === void 0 ? r`` : r` OFFSET ${V(e.skip, r)}`;
|
|
948
1068
|
return r`SELECT ${a} AS \`__row\` FROM ${r(t.table.tableName)} AS ${r(i)}${o}${s}${c}${l}`;
|
|
949
|
-
},
|
|
1069
|
+
}, R = (e, t, n, r, i) => {
|
|
950
1070
|
let a = r.sql, o = [];
|
|
951
|
-
for (let n of Object.keys(t.fields)) o.push(a`${
|
|
1071
|
+
for (let n of Object.keys(t.fields)) o.push(a`${B(n, a)}, ${z(e, n, a)}`);
|
|
952
1072
|
if (i !== void 0) {
|
|
953
|
-
let e =
|
|
954
|
-
o.push(a`${
|
|
1073
|
+
let e = Wr(i.projection, i.source, a);
|
|
1074
|
+
o.push(a`${B("_junction", a)}, JSON_OBJECT(${e})`);
|
|
955
1075
|
}
|
|
956
1076
|
for (let t of n) {
|
|
957
|
-
let n =
|
|
1077
|
+
let n = $r(t, e, r);
|
|
958
1078
|
if (n === null) return null;
|
|
959
|
-
o.push(a`${
|
|
1079
|
+
o.push(a`${B(t.relationName, a)}, ${n}`);
|
|
960
1080
|
}
|
|
961
1081
|
return a`JSON_OBJECT(${a.csv(o)})`;
|
|
962
|
-
},
|
|
1082
|
+
}, $r = (e, t, n) => {
|
|
963
1083
|
switch (e.relation.kind) {
|
|
964
1084
|
case "one":
|
|
965
|
-
if (
|
|
966
|
-
let r =
|
|
967
|
-
return n.dialect === "mariadb" ?
|
|
1085
|
+
if (yr(e)) {
|
|
1086
|
+
let r = br(e);
|
|
1087
|
+
return n.dialect === "mariadb" ? ri(r, t, n) : ti(r, t, n);
|
|
968
1088
|
}
|
|
969
|
-
return
|
|
970
|
-
case "many": return n.dialect === "mariadb" ?
|
|
971
|
-
case "manyToMany": return n.dialect === "mariadb" ?
|
|
1089
|
+
return ei(e, t, n);
|
|
1090
|
+
case "many": return n.dialect === "mariadb" ? ri(e, t, n) : ti(e, t, n);
|
|
1091
|
+
case "manyToMany": return n.dialect === "mariadb" ? ii(e, t, n) : ni(e, t, n);
|
|
972
1092
|
}
|
|
973
|
-
},
|
|
974
|
-
let r = n.sql, i = n.nextAlias(), a =
|
|
1093
|
+
}, ei = (e, t, n) => {
|
|
1094
|
+
let r = n.sql, i = n.nextAlias(), a = R(i, e.target, e.children, n);
|
|
975
1095
|
if (a === null) return null;
|
|
976
|
-
let o = e.fkSide === "source" ? r`${
|
|
1096
|
+
let o = e.fkSide === "source" ? r`${z(i, "id", r)} = ${z(t, e.foreignKey, r)}` : r`${z(i, e.foreignKey, r)} = ${z(t, e.sourceKey, r)}`;
|
|
977
1097
|
return r`(SELECT ${a} FROM ${r(e.target.tableName)} AS ${r(i)} WHERE ${o} LIMIT 1)`;
|
|
978
|
-
},
|
|
979
|
-
let r = n.sql, i = n.nextAlias(), a =
|
|
1098
|
+
}, ti = (e, t, n) => {
|
|
1099
|
+
let r = n.sql, i = n.nextAlias(), a = R(i, e.target, e.children, n);
|
|
980
1100
|
if (a === null) return null;
|
|
981
|
-
let o = r`${
|
|
1101
|
+
let o = r`${z(void 0, e.foreignKey, r)} = ${z(t, e.sourceKey, r)}`, s = e.branch.where === void 0 ? r`` : r` AND ${I(U(e.branch.where), r)}`, c = Vr(e.branch.orderBy, r), l = e.branch.limit === void 0 ? r`` : r` LIMIT ${V(e.branch.limit, r)}`, u = e.branch.offset === void 0 ? r`` : r` OFFSET ${V(e.branch.offset, r)}`;
|
|
982
1102
|
return r`COALESCE((SELECT JSON_ARRAYAGG(${a}) FROM (SELECT * FROM ${r(e.target.tableName)} WHERE ${o}${s}${c}${l}${u}) AS ${r(i)}), JSON_ARRAY())`;
|
|
983
|
-
},
|
|
984
|
-
let r = n.sql, i = e.relation, a = i.through(), o = n.nextAlias(), s = n.nextAlias(), c =
|
|
1103
|
+
}, ni = (e, t, n) => {
|
|
1104
|
+
let r = n.sql, i = e.relation, a = i.through(), o = n.nextAlias(), s = n.nextAlias(), c = R(o, e.target, e.children, n, e.junction === void 0 ? void 0 : {
|
|
985
1105
|
projection: e.junction,
|
|
986
|
-
source:
|
|
1106
|
+
source: Kr(o)
|
|
987
1107
|
});
|
|
988
1108
|
if (c === null) return null;
|
|
989
|
-
let l = e.branch.where === void 0 ? r`` : r` AND ${
|
|
990
|
-
return r`COALESCE((SELECT JSON_ARRAYAGG(${c}) FROM (SELECT ${r(o)}.*${m} FROM ${r(a.tableName)} AS ${r(s)} INNER JOIN ${r(e.target.tableName)} AS ${r(o)} ON ${
|
|
991
|
-
},
|
|
992
|
-
let r = n.sql, i = n.nextAlias(), a =
|
|
1109
|
+
let l = e.branch.where === void 0 ? r`` : r` AND ${I(U(e.branch.where), r)}`, u = pi(e, s, r, !0), d = L(o, e.branch.orderBy, r), f = e.branch.limit === void 0 ? r`` : r` LIMIT ${V(e.branch.limit, r)}`, p = e.branch.offset === void 0 ? r`` : r` OFFSET ${V(e.branch.offset, r)}`, m = e.junction === void 0 ? r`` : Gr(e.junction, s, r);
|
|
1110
|
+
return r`COALESCE((SELECT JSON_ARRAYAGG(${c}) FROM (SELECT ${r(o)}.*${m} FROM ${r(a.tableName)} AS ${r(s)} INNER JOIN ${r(e.target.tableName)} AS ${r(o)} ON ${z(o, "id", r)} = ${z(s, i.targetKey, r)} WHERE ${z(s, i.sourceKey, r)} = ${z(t, "id", r)}${u}${l}${d}${f}${p}) AS ${r(o)}), JSON_ARRAY())`;
|
|
1111
|
+
}, ri = (e, t, n) => {
|
|
1112
|
+
let r = n.sql, i = n.nextAlias(), a = R(i, e.target, e.children, n);
|
|
993
1113
|
if (a === null) return null;
|
|
994
|
-
let o = r`${
|
|
995
|
-
if (!(e.branch.limit !== void 0 || e.branch.offset !== void 0)) return r`COALESCE((SELECT JSON_ARRAYAGG(${a}${c.length > 0 ? r` ORDER BY ${r.csv(c.map((e) => e.direction === "desc" ? r`${
|
|
996
|
-
let l = c.length > 0 ? r` ORDER BY ${r.csv(c.map((e) => e.direction === "desc" ? r`${r(e.column)} DESC` : r`${r(e.column)} ASC`))}` : r` ORDER BY ${r("id")}`, u = e.branch.limit, d = e.branch.offset, f = u !== void 0 && d !== void 0 ? r` AND ${
|
|
997
|
-
return r`COALESCE((SELECT JSON_ARRAYAGG(${a} ORDER BY ${
|
|
998
|
-
},
|
|
1114
|
+
let o = r`${z(i, e.foreignKey, r)} = ${z(t, e.sourceKey, r)}`, s = e.branch.where === void 0 ? r`` : r` AND ${I(U(e.branch.where), r)}`, c = e.branch.orderBy ?? [];
|
|
1115
|
+
if (!(e.branch.limit !== void 0 || e.branch.offset !== void 0)) return r`COALESCE((SELECT JSON_ARRAYAGG(${a}${c.length > 0 ? r` ORDER BY ${r.csv(c.map((e) => e.direction === "desc" ? r`${z(i, e.column, r)} DESC` : r`${z(i, e.column, r)} ASC`))}` : r``}) FROM ${r(e.target.tableName)} AS ${r(i)} WHERE ${o}${s}), JSON_ARRAY())`;
|
|
1116
|
+
let l = c.length > 0 ? r` ORDER BY ${r.csv(c.map((e) => e.direction === "desc" ? r`${r(e.column)} DESC` : r`${r(e.column)} ASC`))}` : r` ORDER BY ${r("id")}`, u = e.branch.limit, d = e.branch.offset, f = u !== void 0 && d !== void 0 ? r` AND ${z(i, "rn", r)} > ${V(d, r)} AND ${z(i, "rn", r)} <= ${V(d + u, r)}` : u === void 0 ? r` AND ${z(i, "rn", r)} > ${V(d, r)}` : r` AND ${z(i, "rn", r)} <= ${V(u, r)}`;
|
|
1117
|
+
return r`COALESCE((SELECT JSON_ARRAYAGG(${a} ORDER BY ${z(i, "rn", r)}) FROM (SELECT *, ROW_NUMBER() OVER (PARTITION BY ${r(e.foreignKey)}${l}) AS rn FROM ${r(e.target.tableName)}) AS ${r(i)} WHERE ${o}${s}${f}), JSON_ARRAY())`;
|
|
1118
|
+
}, ii = (e, t, n) => {
|
|
999
1119
|
let r = n.sql, i = e.relation, a = i.through(), o = n.nextAlias(), s = n.nextAlias(), c = (t) => e.junction === void 0 ? void 0 : {
|
|
1000
1120
|
projection: e.junction,
|
|
1001
1121
|
source: t
|
|
1002
|
-
}, l = r`${
|
|
1122
|
+
}, l = r`${z(s, i.sourceKey, r)} = ${z(t, "id", r)}`, u = r`${z(o, "id", r)} = ${z(s, i.targetKey, r)}`, d = e.branch.where === void 0 ? r`` : r` AND ${I(U(e.branch.where), r)}`, f = pi(e, s, r, !0), p = e.branch.orderBy ?? [];
|
|
1003
1123
|
if (!(e.branch.limit !== void 0 || e.branch.offset !== void 0)) {
|
|
1004
|
-
let t =
|
|
1005
|
-
return t === null ? null : r`COALESCE((SELECT JSON_ARRAYAGG(${t}${p.length > 0 ? r` ORDER BY ${r.csv(p.map((e) => e.direction === "desc" ? r`${
|
|
1006
|
-
}
|
|
1007
|
-
let m = p.length > 0 ? r` ORDER BY ${r.csv(p.map((e) => e.direction === "desc" ? r`${
|
|
1008
|
-
if (
|
|
1009
|
-
let
|
|
1010
|
-
return r`COALESCE((SELECT JSON_ARRAYAGG(${
|
|
1011
|
-
},
|
|
1012
|
-
let r = n.sql, i = n.nextAlias(), a =
|
|
1124
|
+
let t = R(o, e.target, e.children, n, c(qr(s)));
|
|
1125
|
+
return t === null ? null : r`COALESCE((SELECT JSON_ARRAYAGG(${t}${p.length > 0 ? r` ORDER BY ${r.csv(p.map((e) => e.direction === "desc" ? r`${z(o, e.column, r)} DESC` : r`${z(o, e.column, r)} ASC`))}` : r``}) FROM ${r(a.tableName)} AS ${r(s)} INNER JOIN ${r(e.target.tableName)} AS ${r(o)} ON ${u} WHERE ${l}${f}${d}), JSON_ARRAY())`;
|
|
1126
|
+
}
|
|
1127
|
+
let m = p.length > 0 ? r` ORDER BY ${r.csv(p.map((e) => e.direction === "desc" ? r`${z(o, e.column, r)} DESC` : r`${z(o, e.column, r)} ASC`))}` : r` ORDER BY ${z(o, "id", r)}`, h = e.branch.limit, g = e.branch.offset, _ = h !== void 0 && g !== void 0 ? r` AND ${z(o, "rn", r)} > ${V(g, r)} AND ${z(o, "rn", r)} <= ${V(g + h, r)}` : h === void 0 ? r` AND ${z(o, "rn", r)} > ${V(g, r)}` : r` AND ${z(o, "rn", r)} <= ${V(h, r)}`, v = e.branch.onJunction === void 0 ? r`` : r` WHERE ${H(U(e.branch.onJunction), s, r)}`, y = R(o, e.target, e.children, n, c(Kr(o)));
|
|
1128
|
+
if (y === null) return null;
|
|
1129
|
+
let b = e.junction === void 0 ? r`` : Gr(e.junction, s, r);
|
|
1130
|
+
return r`COALESCE((SELECT JSON_ARRAYAGG(${y} ORDER BY ${z(o, "rn", r)}) FROM (SELECT ${r(o)}.*${b}, ${z(s, i.sourceKey, r)} AS ${r(`__src_${i.sourceKey}`)}, ROW_NUMBER() OVER (PARTITION BY ${z(s, i.sourceKey, r)}${m}) AS rn FROM ${r(a.tableName)} AS ${r(s)} INNER JOIN ${r(e.target.tableName)} AS ${r(o)} ON ${u}${v}) AS ${r(o)} WHERE ${z(o, `__src_${i.sourceKey}`, r)} = ${z(t, "id", r)}${d}${_}), JSON_ARRAY())`;
|
|
1131
|
+
}, ai = (e, t, n) => {
|
|
1132
|
+
let r = n.sql, i = n.nextAlias(), a = oi(i, t.table, t.children, n);
|
|
1013
1133
|
if (a === null) return null;
|
|
1014
|
-
let o = e.predicate ? r` WHERE ${
|
|
1134
|
+
let o = e.predicate ? r` WHERE ${H(e.predicate, i, r)}` : r``, s = T(e).length > 0 ? r` ORDER BY ${r.csv(T(e).map((e) => e.direction === "desc" ? r`${z(i, e.column, r)} DESC` : r`${z(i, e.column, r)} ASC`))}` : r``, c = r``, l = r``;
|
|
1015
1135
|
if (e.skip !== void 0) {
|
|
1016
|
-
let t =
|
|
1017
|
-
l = e.take === void 0 ? r`${t} OFFSET ${
|
|
1018
|
-
} else e.take !== void 0 && (c = r`TOP ${
|
|
1136
|
+
let t = T(e).length > 0 ? s : r` ORDER BY (SELECT NULL)`;
|
|
1137
|
+
l = e.take === void 0 ? r`${t} OFFSET ${V(e.skip, r)} ROWS` : r`${t} OFFSET ${V(e.skip, r)} ROWS FETCH NEXT ${V(e.take, r)} ROWS ONLY`;
|
|
1138
|
+
} else e.take !== void 0 && (c = r`TOP ${V(e.take, r)} `);
|
|
1019
1139
|
let u = e.skip === void 0 ? s : r``;
|
|
1020
1140
|
return r`SELECT ${c}(SELECT ${a} FOR JSON PATH, INCLUDE_NULL_VALUES, WITHOUT_ARRAY_WRAPPER) AS ${r("__row")} FROM ${r(t.table.tableName)} AS ${r(i)}${o}${u}${l}`;
|
|
1021
|
-
},
|
|
1141
|
+
}, oi = (e, t, n, r, i) => {
|
|
1022
1142
|
let a = r.sql, o = [];
|
|
1023
|
-
for (let n of Object.keys(t.fields)) o.push(a`${
|
|
1024
|
-
if (i !== void 0) for (let e of i.projection.present) o.push(a`${
|
|
1143
|
+
for (let n of Object.keys(t.fields)) o.push(a`${z(e, n, a)} AS ${a(n)}`);
|
|
1144
|
+
if (i !== void 0) for (let e of i.projection.present) o.push(a`${z(i.source.alias, i.source.physical(e), a)} AS ${si(`_junction.${e}`, a)}`);
|
|
1025
1145
|
for (let t of n) {
|
|
1026
|
-
let n =
|
|
1146
|
+
let n = ci(t, e, r);
|
|
1027
1147
|
if (n === null) return null;
|
|
1028
1148
|
o.push(n);
|
|
1029
1149
|
}
|
|
1030
1150
|
return a.csv(o);
|
|
1031
|
-
},
|
|
1151
|
+
}, si = (e, t) => t.unsafe(`[${e.replace(/]/g, "]]")}]`), ci = (e, t, n) => {
|
|
1032
1152
|
switch (e.relation.kind) {
|
|
1033
|
-
case "one": return
|
|
1034
|
-
case "many": return
|
|
1035
|
-
case "manyToMany": return
|
|
1153
|
+
case "one": return yr(e) ? di(br(e), t, n) : li(e, t, n);
|
|
1154
|
+
case "many": return di(e, t, n);
|
|
1155
|
+
case "manyToMany": return fi(e, t, n);
|
|
1036
1156
|
}
|
|
1037
|
-
},
|
|
1038
|
-
let r = n.sql, i = n.nextAlias(), a =
|
|
1157
|
+
}, li = (e, t, n) => {
|
|
1158
|
+
let r = n.sql, i = n.nextAlias(), a = oi(i, e.target, e.children, n);
|
|
1039
1159
|
if (a === null) return null;
|
|
1040
|
-
let o = e.fkSide === "source" ? r`${
|
|
1160
|
+
let o = e.fkSide === "source" ? r`${z(i, "id", r)} = ${z(t, e.foreignKey, r)}` : r`${z(i, e.foreignKey, r)} = ${z(t, e.sourceKey, r)}`;
|
|
1041
1161
|
return r`JSON_QUERY((SELECT TOP 1 ${a} FROM ${r(e.target.tableName)} AS ${r(i)} WHERE ${o} FOR JSON PATH, INCLUDE_NULL_VALUES, WITHOUT_ARRAY_WRAPPER)) AS ${r(e.relationName)}`;
|
|
1042
|
-
},
|
|
1162
|
+
}, ui = (e, t, n) => {
|
|
1043
1163
|
if (e.offset !== void 0) {
|
|
1044
|
-
let r = e.orderBy && e.orderBy.length > 0 ? t : n` ORDER BY (SELECT NULL)`, i = e.limit === void 0 ? n`${r} OFFSET ${
|
|
1164
|
+
let r = e.orderBy && e.orderBy.length > 0 ? t : n` ORDER BY (SELECT NULL)`, i = e.limit === void 0 ? n`${r} OFFSET ${V(e.offset, n)} ROWS` : n`${r} OFFSET ${V(e.offset, n)} ROWS FETCH NEXT ${V(e.limit, n)} ROWS ONLY`;
|
|
1045
1165
|
return {
|
|
1046
1166
|
top: n``,
|
|
1047
1167
|
pagination: i,
|
|
@@ -1049,33 +1169,33 @@ var wt = (e) => typeof e == "string" && e !== "" ? e : null, Tt = async (e, t, n
|
|
|
1049
1169
|
};
|
|
1050
1170
|
}
|
|
1051
1171
|
return {
|
|
1052
|
-
top: e.limit === void 0 ? n`` : n`TOP ${
|
|
1172
|
+
top: e.limit === void 0 ? n`` : n`TOP ${V(e.limit, n)} `,
|
|
1053
1173
|
pagination: n``,
|
|
1054
1174
|
finalOrder: t
|
|
1055
1175
|
};
|
|
1056
|
-
},
|
|
1057
|
-
let r = n.sql, i = n.nextAlias(), a =
|
|
1176
|
+
}, di = (e, t, n) => {
|
|
1177
|
+
let r = n.sql, i = n.nextAlias(), a = oi(i, e.target, e.children, n);
|
|
1058
1178
|
if (a === null) return null;
|
|
1059
|
-
let o = e.branch.where === void 0 ? r`` : r` AND ${
|
|
1060
|
-
return r`ISNULL(JSON_QUERY((SELECT ${c}${a} FROM ${r(e.target.tableName)} AS ${r(i)} WHERE ${
|
|
1061
|
-
},
|
|
1062
|
-
let r = n.sql, i = e.relation, a = i.through(), o = n.nextAlias(), s = n.nextAlias(), c =
|
|
1179
|
+
let o = e.branch.where === void 0 ? r`` : r` AND ${H(e.branch.where, i, r)}`, s = L(i, e.branch.orderBy, r), { top: c, pagination: l, finalOrder: u } = ui(e.branch, s, r);
|
|
1180
|
+
return r`ISNULL(JSON_QUERY((SELECT ${c}${a} FROM ${r(e.target.tableName)} AS ${r(i)} WHERE ${z(i, e.foreignKey, r)} = ${z(t, e.sourceKey, r)}${o}${u}${l} FOR JSON PATH, INCLUDE_NULL_VALUES)), JSON_QUERY('[]')) AS ${r(e.relationName)}`;
|
|
1181
|
+
}, fi = (e, t, n) => {
|
|
1182
|
+
let r = n.sql, i = e.relation, a = i.through(), o = n.nextAlias(), s = n.nextAlias(), c = oi(o, e.target, e.children, n, e.junction === void 0 ? void 0 : {
|
|
1063
1183
|
projection: e.junction,
|
|
1064
|
-
source:
|
|
1184
|
+
source: qr(s)
|
|
1065
1185
|
});
|
|
1066
1186
|
if (c === null) return null;
|
|
1067
|
-
let l = e.branch.where === void 0 ? r`` : r` AND ${
|
|
1068
|
-
return r`ISNULL(JSON_QUERY((SELECT ${f}${c} FROM ${r(a.tableName)} AS ${r(s)} INNER JOIN ${r(e.target.tableName)} AS ${r(o)} ON ${
|
|
1069
|
-
},
|
|
1187
|
+
let l = e.branch.where === void 0 ? r`` : r` AND ${H(e.branch.where, o, r)}`, u = pi(e, s, r), d = L(o, e.branch.orderBy, r), { top: f, pagination: p, finalOrder: m } = ui(e.branch, d, r);
|
|
1188
|
+
return r`ISNULL(JSON_QUERY((SELECT ${f}${c} FROM ${r(a.tableName)} AS ${r(s)} INNER JOIN ${r(e.target.tableName)} AS ${r(o)} ON ${z(o, "id", r)} = ${z(s, i.targetKey, r)} WHERE ${z(s, i.sourceKey, r)} = ${z(t, "id", r)}${u}${l}${m}${p} FOR JSON PATH, INCLUDE_NULL_VALUES)), JSON_QUERY('[]')) AS ${r(e.relationName)}`;
|
|
1189
|
+
}, z = (e, t, n) => e === void 0 ? n`${n(t)}` : n`${n(e)}.${n(t)}`, B = (e, t) => t.unsafe(`'${e.replace(/'/g, "''")}'`), V = (e, t) => {
|
|
1070
1190
|
if (!Number.isFinite(e) || !Number.isInteger(e) || e < 0) throw Error(`literalInt: expected non-negative integer, got ${e}`);
|
|
1071
1191
|
return t.unsafe(String(e));
|
|
1072
|
-
},
|
|
1192
|
+
}, H = (e, t, n) => I(mi(e, t), n), pi = (e, t, n, r = !1) => {
|
|
1073
1193
|
let i = e.branch.onJunction;
|
|
1074
|
-
return i === void 0 ? n`` : n` AND ${
|
|
1075
|
-
},
|
|
1076
|
-
if ("not" in e) return { not:
|
|
1077
|
-
if ("and" in e) return { and: e.and.map((e) =>
|
|
1078
|
-
if ("or" in e) return { or: e.or.map((e) =>
|
|
1194
|
+
return i === void 0 ? n`` : n` AND ${H(r ? U(i) : i, t, n)}`;
|
|
1195
|
+
}, mi = (e, t) => {
|
|
1196
|
+
if ("not" in e) return { not: mi(e.not, t) };
|
|
1197
|
+
if ("and" in e) return { and: e.and.map((e) => mi(e, t)) };
|
|
1198
|
+
if ("or" in e) return { or: e.or.map((e) => mi(e, t)) };
|
|
1079
1199
|
if (e.op === "subquery-in" || e.op === "subquery-not-in") {
|
|
1080
1200
|
let n = e;
|
|
1081
1201
|
return {
|
|
@@ -1097,91 +1217,91 @@ var wt = (e) => typeof e == "string" && e !== "" ? e : null, Tt = async (e, t, n
|
|
|
1097
1217
|
let t = e;
|
|
1098
1218
|
return {
|
|
1099
1219
|
...t,
|
|
1100
|
-
value:
|
|
1220
|
+
value: hi(t.value)
|
|
1101
1221
|
};
|
|
1102
|
-
},
|
|
1103
|
-
e.actors !== void 0 && (
|
|
1104
|
-
},
|
|
1222
|
+
}, hi = (e) => e == null ? e : e instanceof Date ? e.toISOString() : typeof e == "boolean" ? +!!e : Array.isArray(e) ? e.map((e) => hi(e)) : e, gi = Symbol.for("@voltro/database/coreTablesRegistry"), _i = globalThis, vi = _i[gi] ?? (_i[gi] = {}), yi = (e) => {
|
|
1223
|
+
e.actors !== void 0 && (vi.actors = e.actors), e.tenants !== void 0 && (vi.tenants = e.tenants);
|
|
1224
|
+
}, bi = (e, t) => () => {
|
|
1105
1225
|
let n = e();
|
|
1106
1226
|
if (n === void 0) throw Error(`core '${t}' table not registered; expected the framework CLI or your migrate step to call registerCoreTables({ ${t}: () => ${t}Table }) before the database handle is constructed`);
|
|
1107
1227
|
return n();
|
|
1108
|
-
},
|
|
1109
|
-
id:
|
|
1110
|
-
kind:
|
|
1228
|
+
}, xi = () => bi(() => vi.actors, "actors"), Si = () => bi(() => vi.tenants, "tenants"), Ci = w("actors", {
|
|
1229
|
+
id: v(),
|
|
1230
|
+
kind: D().oneOf([
|
|
1111
1231
|
"user",
|
|
1112
1232
|
"serviceAccount",
|
|
1113
1233
|
"apiKey",
|
|
1114
1234
|
"system"
|
|
1115
1235
|
]),
|
|
1116
|
-
displayName:
|
|
1117
|
-
createdAt:
|
|
1118
|
-
}),
|
|
1236
|
+
displayName: D().nullable(),
|
|
1237
|
+
createdAt: b().default("now")
|
|
1238
|
+
}), wi = (e, t) => ({
|
|
1119
1239
|
column: e,
|
|
1120
1240
|
op: "eq",
|
|
1121
1241
|
value: t
|
|
1122
|
-
}),
|
|
1242
|
+
}), Ti = (e, t) => ({
|
|
1123
1243
|
column: e,
|
|
1124
1244
|
op: "neq",
|
|
1125
1245
|
value: t
|
|
1126
|
-
}),
|
|
1246
|
+
}), Ei = (e, t) => ({
|
|
1127
1247
|
column: e,
|
|
1128
1248
|
op: "gt",
|
|
1129
1249
|
value: t
|
|
1130
|
-
}),
|
|
1250
|
+
}), Di = (e, t) => ({
|
|
1131
1251
|
column: e,
|
|
1132
1252
|
op: "gte",
|
|
1133
1253
|
value: t
|
|
1134
|
-
}),
|
|
1254
|
+
}), Oi = (e, t) => ({
|
|
1135
1255
|
column: e,
|
|
1136
1256
|
op: "lt",
|
|
1137
1257
|
value: t
|
|
1138
|
-
}),
|
|
1258
|
+
}), ki = (e, t) => ({
|
|
1139
1259
|
column: e,
|
|
1140
1260
|
op: "lte",
|
|
1141
1261
|
value: t
|
|
1142
|
-
}),
|
|
1262
|
+
}), Ai = (e, t) => ({
|
|
1143
1263
|
column: e,
|
|
1144
1264
|
op: "in",
|
|
1145
1265
|
value: t
|
|
1146
|
-
}),
|
|
1266
|
+
}), ji = (e, t) => ({
|
|
1147
1267
|
column: e,
|
|
1148
1268
|
op: "notIn",
|
|
1149
1269
|
value: t
|
|
1150
|
-
}),
|
|
1270
|
+
}), Mi = (e, t) => ({
|
|
1151
1271
|
column: e,
|
|
1152
1272
|
op: "contains",
|
|
1153
1273
|
value: t
|
|
1154
|
-
}),
|
|
1274
|
+
}), Ni = (e, t) => ({
|
|
1155
1275
|
column: e,
|
|
1156
1276
|
op: "startsWith",
|
|
1157
1277
|
value: t
|
|
1158
|
-
}),
|
|
1278
|
+
}), Pi = (e, t) => ({
|
|
1159
1279
|
column: e,
|
|
1160
1280
|
op: "arrayContains",
|
|
1161
1281
|
value: t
|
|
1162
|
-
}),
|
|
1282
|
+
}), Fi = (e, t) => ({
|
|
1163
1283
|
column: e,
|
|
1164
1284
|
op: "arrayOverlaps",
|
|
1165
1285
|
value: t
|
|
1166
|
-
}),
|
|
1286
|
+
}), Ii = (e, t) => ({
|
|
1167
1287
|
column: e,
|
|
1168
1288
|
op: "arrayHas",
|
|
1169
1289
|
value: t
|
|
1170
|
-
}),
|
|
1290
|
+
}), Li = {
|
|
1171
1291
|
column: "id",
|
|
1172
1292
|
op: "in",
|
|
1173
1293
|
value: []
|
|
1174
|
-
},
|
|
1294
|
+
}, Ri = (e) => ({
|
|
1175
1295
|
column: e,
|
|
1176
1296
|
op: "isNull"
|
|
1177
|
-
}),
|
|
1297
|
+
}), zi = (e) => ({
|
|
1178
1298
|
column: e,
|
|
1179
1299
|
op: "isNotNull"
|
|
1180
|
-
}),
|
|
1300
|
+
}), Bi = (e, t) => ({
|
|
1181
1301
|
column: e,
|
|
1182
1302
|
op: "spatial",
|
|
1183
1303
|
value: t
|
|
1184
|
-
}),
|
|
1304
|
+
}), Vi = (...e) => ({ and: e }), Hi = (...e) => ({ or: e }), Ui = (e) => ({ not: e }), Wi = (e, ...t) => {
|
|
1185
1305
|
if (t.length === 0) throw Error(`jsonField("${e}"): at least one path segment is required`);
|
|
1186
1306
|
let n = (n, r) => ({
|
|
1187
1307
|
column: e,
|
|
@@ -1203,33 +1323,33 @@ var wt = (e) => typeof e == "string" && e !== "" ? e : null, Tt = async (e, t, n
|
|
|
1203
1323
|
isNull: () => n("isNull"),
|
|
1204
1324
|
isNotNull: () => n("isNotNull")
|
|
1205
1325
|
};
|
|
1206
|
-
},
|
|
1326
|
+
}, Gi = (e) => "descriptor" in e ? e.descriptor : e, Ki = (e, t) => ({
|
|
1207
1327
|
column: e,
|
|
1208
1328
|
op: "subquery-in",
|
|
1209
|
-
subquery:
|
|
1210
|
-
}),
|
|
1329
|
+
subquery: Gi(t)
|
|
1330
|
+
}), qi = (e, t) => ({
|
|
1211
1331
|
column: e,
|
|
1212
1332
|
op: "subquery-not-in",
|
|
1213
|
-
subquery:
|
|
1214
|
-
}),
|
|
1333
|
+
subquery: Gi(t)
|
|
1334
|
+
}), Ji = (e) => ({
|
|
1215
1335
|
op: "exists",
|
|
1216
|
-
subquery:
|
|
1217
|
-
}),
|
|
1336
|
+
subquery: Gi(e)
|
|
1337
|
+
}), Yi = (e) => ({
|
|
1218
1338
|
op: "not-exists",
|
|
1219
|
-
subquery:
|
|
1220
|
-
}),
|
|
1339
|
+
subquery: Gi(e)
|
|
1340
|
+
}), Xi = (e, t) => e === t || e instanceof Date && t instanceof Date && e.getTime() === t.getTime(), Zi = (e, t) => {
|
|
1221
1341
|
if (e == null || t == null) return null;
|
|
1222
1342
|
let n = e instanceof Date ? e.getTime() : e, r = t instanceof Date ? t.getTime() : t;
|
|
1223
1343
|
return typeof n == typeof r ? n === r ? 0 : n > r ? 1 : -1 : null;
|
|
1224
|
-
},
|
|
1344
|
+
}, Qi = (e, t, n = null) => {
|
|
1225
1345
|
if (!t) return !1;
|
|
1226
|
-
if ("not" in e) return !
|
|
1346
|
+
if ("not" in e) return !Qi(e.not, t, n);
|
|
1227
1347
|
if ("and" in e) {
|
|
1228
|
-
for (let r of e.and) if (!
|
|
1348
|
+
for (let r of e.and) if (!Qi(r, t, n)) return !1;
|
|
1229
1349
|
return !0;
|
|
1230
1350
|
}
|
|
1231
1351
|
if ("or" in e) {
|
|
1232
|
-
for (let r of e.or) if (
|
|
1352
|
+
for (let r of e.or) if (Qi(r, t, n)) return !0;
|
|
1233
1353
|
return !1;
|
|
1234
1354
|
}
|
|
1235
1355
|
if (e.op === "subquery-in" || e.op === "subquery-not-in") {
|
|
@@ -1246,14 +1366,14 @@ var wt = (e) => typeof e == "string" && e !== "" ? e : null, Tt = async (e, t, n
|
|
|
1246
1366
|
}
|
|
1247
1367
|
let r = e, i = t[r.column];
|
|
1248
1368
|
switch (r.op) {
|
|
1249
|
-
case "eq": return
|
|
1250
|
-
case "neq": return !
|
|
1251
|
-
case "gt": return (
|
|
1252
|
-
case "gte": return (
|
|
1253
|
-
case "lt": return (
|
|
1254
|
-
case "lte": return (
|
|
1255
|
-
case "in": return Array.isArray(r.value) && r.value.some((e) =>
|
|
1256
|
-
case "notIn": return Array.isArray(r.value) && !r.value.some((e) =>
|
|
1369
|
+
case "eq": return Xi(i, r.value);
|
|
1370
|
+
case "neq": return !Xi(i, r.value);
|
|
1371
|
+
case "gt": return (Zi(i, r.value) ?? -1) > 0;
|
|
1372
|
+
case "gte": return (Zi(i, r.value) ?? -1) >= 0;
|
|
1373
|
+
case "lt": return (Zi(i, r.value) ?? 1) < 0;
|
|
1374
|
+
case "lte": return (Zi(i, r.value) ?? 1) <= 0;
|
|
1375
|
+
case "in": return Array.isArray(r.value) && r.value.some((e) => Xi(i, e));
|
|
1376
|
+
case "notIn": return Array.isArray(r.value) && !r.value.some((e) => Xi(i, e));
|
|
1257
1377
|
case "contains": return typeof i == "string" && typeof r.value == "string" && i.toLowerCase().includes(r.value.toLowerCase());
|
|
1258
1378
|
case "startsWith": return typeof i == "string" && typeof r.value == "string" && i.startsWith(r.value);
|
|
1259
1379
|
case "arrayContains": {
|
|
@@ -1269,17 +1389,17 @@ var wt = (e) => typeof e == "string" && e !== "" ? e : null, Tt = async (e, t, n
|
|
|
1269
1389
|
case "isNotNull": return i != null;
|
|
1270
1390
|
case "spatial": throw Error("@voltro/plugin-postgis: spatial predicates (ST_DWithin / ST_Contains / ST_Within / ST_Intersects / bbox &&) are not evaluable in-memory — use them in one-shot ctx.store.query reads, not reactive subscriptions.");
|
|
1271
1391
|
}
|
|
1272
|
-
},
|
|
1392
|
+
}, $i = function* (e) {
|
|
1273
1393
|
if ("not" in e) {
|
|
1274
|
-
yield*
|
|
1394
|
+
yield* $i(e.not);
|
|
1275
1395
|
return;
|
|
1276
1396
|
}
|
|
1277
1397
|
if ("and" in e) {
|
|
1278
|
-
for (let t of e.and) yield*
|
|
1398
|
+
for (let t of e.and) yield* $i(t);
|
|
1279
1399
|
return;
|
|
1280
1400
|
}
|
|
1281
1401
|
if ("or" in e) {
|
|
1282
|
-
for (let t of e.or) yield*
|
|
1402
|
+
for (let t of e.or) yield* $i(t);
|
|
1283
1403
|
return;
|
|
1284
1404
|
}
|
|
1285
1405
|
e.op === "subquery-in" || e.op === "subquery-not-in" ? yield {
|
|
@@ -1289,42 +1409,42 @@ var wt = (e) => typeof e == "string" && e !== "" ? e : null, Tt = async (e, t, n
|
|
|
1289
1409
|
kind: "exists",
|
|
1290
1410
|
descriptor: e.subquery
|
|
1291
1411
|
});
|
|
1292
|
-
},
|
|
1412
|
+
}, ea = function* (e, t = !0) {
|
|
1293
1413
|
if ("not" in e) {
|
|
1294
|
-
yield*
|
|
1414
|
+
yield* ea(e.not, !1);
|
|
1295
1415
|
return;
|
|
1296
1416
|
}
|
|
1297
1417
|
if ("and" in e) {
|
|
1298
|
-
for (let n of e.and) yield*
|
|
1418
|
+
for (let n of e.and) yield* ea(n, t);
|
|
1299
1419
|
return;
|
|
1300
1420
|
}
|
|
1301
1421
|
if ("or" in e) {
|
|
1302
|
-
for (let t of e.or) yield*
|
|
1422
|
+
for (let t of e.or) yield* ea(t, !1);
|
|
1303
1423
|
return;
|
|
1304
1424
|
}
|
|
1305
1425
|
e.op === "subquery-in" || e.op === "subquery-not-in" || e.op === "exists" || e.op === "not-exists" || (yield {
|
|
1306
1426
|
...e,
|
|
1307
1427
|
conjunctive: t
|
|
1308
1428
|
});
|
|
1309
|
-
},
|
|
1429
|
+
}, ta = (e, t, n = {}) => ({
|
|
1310
1430
|
table: e,
|
|
1311
1431
|
op: "insert",
|
|
1312
1432
|
old: null,
|
|
1313
1433
|
new: t,
|
|
1314
1434
|
...n
|
|
1315
|
-
}),
|
|
1435
|
+
}), na = (e, t, n, r = {}) => ({
|
|
1316
1436
|
table: e,
|
|
1317
1437
|
op: "update",
|
|
1318
1438
|
old: t,
|
|
1319
1439
|
new: n,
|
|
1320
1440
|
...r
|
|
1321
|
-
}),
|
|
1441
|
+
}), ra = (e, t, n = {}) => ({
|
|
1322
1442
|
table: e,
|
|
1323
1443
|
op: "delete",
|
|
1324
1444
|
old: t,
|
|
1325
1445
|
new: null,
|
|
1326
1446
|
...n
|
|
1327
|
-
}),
|
|
1447
|
+
}), ia = (e, t, n = {}) => {
|
|
1328
1448
|
let { at: r = "2026-01-01T00:00:00.000Z", column: i = "deletedAt", ...a } = n;
|
|
1329
1449
|
return {
|
|
1330
1450
|
table: e,
|
|
@@ -1339,66 +1459,67 @@ var wt = (e) => typeof e == "string" && e !== "" ? e : null, Tt = async (e, t, n
|
|
|
1339
1459
|
},
|
|
1340
1460
|
...a
|
|
1341
1461
|
};
|
|
1342
|
-
},
|
|
1343
|
-
let t = e ??
|
|
1462
|
+
}, aa = new Ot(), oa = (e, t) => aa.run(e, t), sa = () => aa.getStore(), ca = (e) => {
|
|
1463
|
+
let t = e ?? aa.getStore();
|
|
1344
1464
|
return t === void 0 ? {} : {
|
|
1345
1465
|
...t.traceId === void 0 ? {} : { traceId: t.traceId },
|
|
1346
1466
|
...t.subjectId === void 0 ? {} : { subjectId: t.subjectId },
|
|
1347
|
-
...t.procedure === void 0 ? {} : { procedure: t.procedure }
|
|
1467
|
+
...t.procedure === void 0 ? {} : { procedure: t.procedure },
|
|
1468
|
+
...t.via === void 0 ? {} : { via: t.via }
|
|
1348
1469
|
};
|
|
1349
|
-
},
|
|
1350
|
-
let t =
|
|
1351
|
-
return t === void 0 ? e(void 0) :
|
|
1352
|
-
},
|
|
1353
|
-
for (let [t, n] of
|
|
1354
|
-
let r = n.filter((t) => e - t.at <
|
|
1355
|
-
|
|
1356
|
-
}
|
|
1357
|
-
},
|
|
1470
|
+
}, la = (e) => {
|
|
1471
|
+
let t = aa.getStore();
|
|
1472
|
+
return t === void 0 ? e(void 0) : aa.run(t, () => e(t));
|
|
1473
|
+
}, ua = 3e4, da = 1e4, W = /* @__PURE__ */ new Map(), G = 0, fa = (e, t, n) => `${e}\u0000${t}\u0000${String(n)}`, pa = (e) => {
|
|
1474
|
+
for (let [t, n] of W) {
|
|
1475
|
+
let r = n.filter((t) => e - t.at < ua);
|
|
1476
|
+
G -= n.length - r.length, r.length === 0 ? W.delete(t) : r.length !== n.length && W.set(t, r);
|
|
1477
|
+
}
|
|
1478
|
+
}, ma = (e, t) => {
|
|
1358
1479
|
if (t.traceId === void 0 && t.subjectId === void 0 && t.procedure === void 0) return;
|
|
1359
1480
|
let n = Date.now();
|
|
1360
|
-
if (
|
|
1361
|
-
let r =
|
|
1362
|
-
r === void 0 ?
|
|
1481
|
+
if (G >= da && pa(n), G >= da) return;
|
|
1482
|
+
let r = W.get(e);
|
|
1483
|
+
r === void 0 ? W.set(e, [{
|
|
1363
1484
|
attribution: t,
|
|
1364
1485
|
at: n
|
|
1365
1486
|
}]) : r.push({
|
|
1366
1487
|
attribution: t,
|
|
1367
1488
|
at: n
|
|
1368
|
-
}),
|
|
1369
|
-
},
|
|
1370
|
-
let t =
|
|
1489
|
+
}), G += 1;
|
|
1490
|
+
}, ha = (e) => {
|
|
1491
|
+
let t = W.get(e);
|
|
1371
1492
|
if (t === void 0 || t.length === 0) return;
|
|
1372
1493
|
let n = t.shift();
|
|
1373
|
-
if (--
|
|
1374
|
-
},
|
|
1375
|
-
let t =
|
|
1494
|
+
if (--G, t.length === 0 && W.delete(e), !(Date.now() - n.at >= ua)) return n.attribution;
|
|
1495
|
+
}, ga = (e) => (W.get(e)?.length ?? 0) > 0, K = /* @__PURE__ */ new Map(), _a = /* @__PURE__ */ new Map(), va = /* @__PURE__ */ new Map(), ya = 250, ba = (e) => {
|
|
1496
|
+
let t = _a.get(e);
|
|
1376
1497
|
if (t === void 0) return;
|
|
1377
|
-
|
|
1378
|
-
let n =
|
|
1379
|
-
n !== void 0 && (clearTimeout(n),
|
|
1498
|
+
_a.delete(e);
|
|
1499
|
+
let n = va.get(e);
|
|
1500
|
+
n !== void 0 && (clearTimeout(n), va.delete(e));
|
|
1380
1501
|
for (let e of t) e();
|
|
1381
|
-
},
|
|
1382
|
-
|
|
1383
|
-
},
|
|
1384
|
-
let t = (
|
|
1502
|
+
}, xa = (e) => {
|
|
1503
|
+
K.set(e, (K.get(e) ?? 0) + 1);
|
|
1504
|
+
}, Sa = (e) => {
|
|
1505
|
+
let t = (K.get(e) ?? 0) - 1;
|
|
1385
1506
|
if (t > 0) {
|
|
1386
|
-
|
|
1507
|
+
K.set(e, t);
|
|
1387
1508
|
return;
|
|
1388
1509
|
}
|
|
1389
|
-
|
|
1390
|
-
},
|
|
1391
|
-
let i = n == null ? void 0 :
|
|
1510
|
+
K.delete(e), ba(e);
|
|
1511
|
+
}, Ca = (e, t, n, r) => {
|
|
1512
|
+
let i = n == null ? void 0 : fa(e, t, n), a = () => r(i === void 0 ? void 0 : ha(i));
|
|
1392
1513
|
if (i === void 0) {
|
|
1393
1514
|
a();
|
|
1394
1515
|
return;
|
|
1395
1516
|
}
|
|
1396
|
-
if (
|
|
1517
|
+
if (ga(i)) {
|
|
1397
1518
|
a();
|
|
1398
1519
|
return;
|
|
1399
1520
|
}
|
|
1400
|
-
let o =
|
|
1401
|
-
if (o === void 0 && (
|
|
1521
|
+
let o = _a.get(e);
|
|
1522
|
+
if (o === void 0 && (K.get(e) ?? 0) === 0) {
|
|
1402
1523
|
a();
|
|
1403
1524
|
return;
|
|
1404
1525
|
}
|
|
@@ -1406,38 +1527,124 @@ var wt = (e) => typeof e == "string" && e !== "" ? e : null, Tt = async (e, t, n
|
|
|
1406
1527
|
o.push(a);
|
|
1407
1528
|
return;
|
|
1408
1529
|
}
|
|
1409
|
-
|
|
1410
|
-
let s = setTimeout(() =>
|
|
1411
|
-
typeof s == "object" && typeof s.unref == "function" && s.unref(),
|
|
1412
|
-
},
|
|
1413
|
-
|
|
1414
|
-
for (let e of
|
|
1415
|
-
|
|
1416
|
-
},
|
|
1417
|
-
|
|
1530
|
+
_a.set(e, [a]);
|
|
1531
|
+
let s = setTimeout(() => ba(e), ya);
|
|
1532
|
+
typeof s == "object" && typeof s.unref == "function" && s.unref(), va.set(e, s);
|
|
1533
|
+
}, wa = () => {
|
|
1534
|
+
W.clear(), G = 0, K.clear();
|
|
1535
|
+
for (let e of va.values()) clearTimeout(e);
|
|
1536
|
+
va.clear(), _a.clear();
|
|
1537
|
+
}, Ta = () => G, q = /* @__PURE__ */ new Map(), Ea = (e, t) => {
|
|
1538
|
+
q.set(e, {
|
|
1418
1539
|
recorder: t.recorder,
|
|
1419
1540
|
tables: new Set(t.tables),
|
|
1420
1541
|
ownTables: new Set(t.ownTables)
|
|
1421
1542
|
});
|
|
1422
|
-
},
|
|
1423
|
-
|
|
1424
|
-
},
|
|
1425
|
-
if (
|
|
1426
|
-
for (let t of
|
|
1543
|
+
}, Da = (e) => {
|
|
1544
|
+
q.delete(e);
|
|
1545
|
+
}, Oa = () => q.clear(), ka = (e) => {
|
|
1546
|
+
if (q.size === 0) return !1;
|
|
1547
|
+
for (let t of q.values()) if (!t.ownTables.has(e) && t.tables.has(e)) return !0;
|
|
1427
1548
|
return !1;
|
|
1428
|
-
},
|
|
1429
|
-
if (
|
|
1430
|
-
},
|
|
1431
|
-
|
|
1432
|
-
|
|
1433
|
-
|
|
1434
|
-
|
|
1435
|
-
|
|
1436
|
-
|
|
1437
|
-
|
|
1438
|
-
|
|
1549
|
+
}, Aa = async (e, t) => {
|
|
1550
|
+
if (q.size !== 0) for (let n of q.values()) n.ownTables.has(t.table) || n.tables.has(t.table) && await n.recorder(e, t);
|
|
1551
|
+
}, ja = Tt.exponential({
|
|
1552
|
+
start: 5e-4,
|
|
1553
|
+
factor: 2,
|
|
1554
|
+
count: 16
|
|
1555
|
+
}), Ma = A.counter("voltro_db_queries_total", { description: "Database operations executed, by dialect and operation kind." }), Na = A.histogram("voltro_db_query_duration_seconds", ja, "Database operation duration in seconds, by dialect and operation kind."), Pa = A.counter("voltro_db_errors_total", { description: "Database operations that threw, by dialect and operation kind." }), Fa = A.gauge("voltro_db_operations_in_flight", { description: "Database operations currently executing, by dialect. An upper bound on connections the framework holds; NOT the driver pool's waiting count." }), Ia = A.counter("voltro_db_eager_fallback_total", { description: "Eager-load queries that degraded from the single-roundtrip JSON-agg path to the multi-query walker, by dialect and reason." }), La = [], Ra = /* @__PURE__ */ new Map(), za = /* @__PURE__ */ new Map(), Ba = /* @__PURE__ */ new Map(), Va = (e, t) => {
|
|
1556
|
+
let n = `${e}\u0000${t}`, r = Ra.get(n);
|
|
1557
|
+
if (r !== void 0) return r;
|
|
1558
|
+
let i = (n) => A.tagged(A.tagged(n, "dialect", e), "op", t), a = {
|
|
1559
|
+
count: i(Ma),
|
|
1560
|
+
duration: i(Na),
|
|
1561
|
+
errors: i(Pa)
|
|
1562
|
+
};
|
|
1563
|
+
return Ra.set(n, a), a;
|
|
1564
|
+
}, Ha = () => {
|
|
1565
|
+
Ra.clear(), za.clear(), Ba.clear();
|
|
1566
|
+
}, Ua = () => Ra.size + za.size + Ba.size, Wa = /* @__PURE__ */ new Map(), Ga = (e, t) => {
|
|
1567
|
+
let n = Math.max(0, (Wa.get(e) ?? 0) + t);
|
|
1568
|
+
n === 0 ? Wa.delete(e) : Wa.set(e, n);
|
|
1569
|
+
let r = za.get(e);
|
|
1570
|
+
r === void 0 && (r = A.tagged(Fa, "dialect", e), za.set(e, r)), r.unsafeUpdate(n, La);
|
|
1571
|
+
}, Ka = (e) => Wa.get(e) ?? 0, qa = (e) => {
|
|
1572
|
+
let t = Va(String(e.dialect), e.op);
|
|
1573
|
+
t.count.unsafeUpdate(1, La), t.duration.unsafeUpdate(e.durationMs / 1e3, La), e.status === "error" && t.errors.unsafeUpdate(1, La);
|
|
1574
|
+
}, Ja = async (e, t, n) => {
|
|
1575
|
+
let r = performance.now(), i = String(e);
|
|
1576
|
+
Ga(i, 1);
|
|
1577
|
+
let a = "ok";
|
|
1578
|
+
try {
|
|
1579
|
+
return await n();
|
|
1580
|
+
} catch (e) {
|
|
1581
|
+
throw a = "error", e;
|
|
1582
|
+
} finally {
|
|
1583
|
+
Ga(i, -1), qa({
|
|
1584
|
+
dialect: e,
|
|
1585
|
+
op: t,
|
|
1586
|
+
durationMs: performance.now() - r,
|
|
1587
|
+
status: a
|
|
1588
|
+
});
|
|
1589
|
+
}
|
|
1590
|
+
}, Ya = 3e5, Xa = (e) => {
|
|
1591
|
+
if (e == null || e === "") return;
|
|
1592
|
+
let t = Number(e);
|
|
1593
|
+
return Number.isFinite(t) && t >= 0 ? Math.floor(t) : void 0;
|
|
1594
|
+
}, Za = (e, t = process.env) => Xa(t.VOLTRO_DB_EAGER_FALLBACK_WARN_INTERVAL_MS) ?? Xa(e) ?? 3e5, Qa = (e, t = {}) => {
|
|
1595
|
+
let n = Za(t.warnIntervalMs), r = t.now ?? (() => Date.now()), i = /* @__PURE__ */ new Map();
|
|
1596
|
+
return (t) => {
|
|
1597
|
+
let a = `${t.dialect} ${t.reason}`, o = Ba.get(a);
|
|
1598
|
+
o === void 0 && (o = A.tagged(A.tagged(Ia, "dialect", String(t.dialect)), "reason", t.reason), Ba.set(a, o)), o.unsafeUpdate(1, La);
|
|
1599
|
+
let s = `${t.table}\u0000${t.reason}`, c = i.get(s), l = c === void 0 || n > 0 && r() - c >= n, u = {
|
|
1600
|
+
table: t.table,
|
|
1601
|
+
dialect: String(t.dialect),
|
|
1602
|
+
reason: t.reason,
|
|
1603
|
+
metric: "voltro_db_eager_fallback_total",
|
|
1604
|
+
...t.error === void 0 ? {} : { err: t.error }
|
|
1605
|
+
};
|
|
1606
|
+
if (!l) {
|
|
1607
|
+
e.debug("eager-load is still running on the walker (rate-limited; the counter is not)", u);
|
|
1608
|
+
return;
|
|
1609
|
+
}
|
|
1610
|
+
i.set(s, r()), e.warn(t.reason === "execute-failed" ? "eager-load JSON-agg statement FAILED and was re-run on the multi-query walker — this query pays both paths on every call. Counted as voltro_db_eager_fallback_total{reason=\"execute-failed\"}." : "eager-load could not be compiled to a single JSON-agg roundtrip and is running on the multi-query walker — one round trip per relation level, on every call. Counted as voltro_db_eager_fallback_total{reason=\"not-compilable\"}.", u);
|
|
1611
|
+
};
|
|
1612
|
+
}, $a = (e) => {
|
|
1613
|
+
if (wt.isSuccess(e)) return e.value;
|
|
1614
|
+
throw xt.squash(e.cause);
|
|
1615
|
+
}, eo = "10 millis", to = 3, no = async (e) => {
|
|
1616
|
+
let t = 0, n = k.suspend(() => {
|
|
1617
|
+
let n = ++t;
|
|
1618
|
+
return e.withTransaction(k.flatMap(k.serviceOption(kt), (t) => {
|
|
1619
|
+
if (j.isNone(t)) return k.fail(/* @__PURE__ */ Error(`${e.label}: TransactionConnection unexpectedly missing inside withTransaction.`));
|
|
1620
|
+
let r = t.value, i = k.tryPromise({
|
|
1621
|
+
try: () => e.body(r, n),
|
|
1622
|
+
catch: (e) => e
|
|
1623
|
+
});
|
|
1624
|
+
return e.prepare === void 0 ? i : k.flatMap(e.prepare(r), () => i);
|
|
1625
|
+
})).pipe(k.catchAllDefect((t) => e.isRetryable(t) ? k.fail(t) : k.die(t)));
|
|
1626
|
+
}), r = Et.exponential(eo).pipe(Et.compose(Et.recurs(to)), Et.whileInput(e.isRetryable)), i = n.pipe(k.retry(r), k.withSpan(e.span.name, { attributes: { ...e.span.attributes } }));
|
|
1627
|
+
return Ja(e.dialect, "transaction", async () => $a(await e.runPromiseExit(e.wrapProgram === void 0 ? i : e.wrapProgram(i))));
|
|
1628
|
+
}, ro = async (e) => {
|
|
1629
|
+
let t = sa(), n = t === void 0 ? (e) => e() : (e) => oa(t, e), r = await no({
|
|
1630
|
+
...e,
|
|
1631
|
+
body: (r) => {
|
|
1632
|
+
let i = e.makeView(r, t);
|
|
1633
|
+
return n(() => e.work(i)).then((e) => ({
|
|
1634
|
+
result: e,
|
|
1635
|
+
view: i
|
|
1636
|
+
}));
|
|
1637
|
+
}
|
|
1638
|
+
});
|
|
1639
|
+
return r.view.commitEvents(), r.result;
|
|
1640
|
+
}, io = class extends M.TaggedError()("VersionConflict", {
|
|
1641
|
+
table: M.String,
|
|
1642
|
+
id: M.String,
|
|
1643
|
+
expected: M.Number,
|
|
1644
|
+
actual: M.NullOr(M.Number)
|
|
1645
|
+
}) {}, ao = (e) => {
|
|
1439
1646
|
for (let [t, n] of Object.entries(e)) if (n?.definition?.versionColumn === !0) return t;
|
|
1440
|
-
},
|
|
1647
|
+
}, oo = (e) => {
|
|
1441
1648
|
let { versionColumn: t, patch: n } = e;
|
|
1442
1649
|
if (t === void 0) return {
|
|
1443
1650
|
nextVersion: void 0,
|
|
@@ -1450,28 +1657,28 @@ var wt = (e) => typeof e == "string" && e !== "" ? e : null, Tt = async (e, t, n
|
|
|
1450
1657
|
expected: i,
|
|
1451
1658
|
patch: a
|
|
1452
1659
|
};
|
|
1453
|
-
},
|
|
1454
|
-
if (e.expected !== void 0 && !(e.current !== null && e.current === e.expected)) return new
|
|
1660
|
+
}, so = (e) => {
|
|
1661
|
+
if (e.expected !== void 0 && !(e.current !== null && e.current === e.expected)) return new io({
|
|
1455
1662
|
table: e.table,
|
|
1456
1663
|
id: e.id,
|
|
1457
1664
|
expected: e.expected,
|
|
1458
1665
|
actual: e.current
|
|
1459
1666
|
});
|
|
1460
|
-
},
|
|
1461
|
-
id:
|
|
1462
|
-
fields: { expiresAt:
|
|
1667
|
+
}, co = 1, lo = "voltro/expires", uo = () => Qe({
|
|
1668
|
+
id: lo,
|
|
1669
|
+
fields: { expiresAt: b().nullable() },
|
|
1463
1670
|
behaviors: { defaultWhere: () => "expiresAt IS NULL OR expiresAt > now()" }
|
|
1464
|
-
}),
|
|
1465
|
-
id:
|
|
1671
|
+
}), fo = "voltro/localFirst", po = () => Qe({
|
|
1672
|
+
id: fo,
|
|
1466
1673
|
fields: {}
|
|
1467
|
-
}),
|
|
1674
|
+
}), mo = (e) => e.appliedMixins.some((e) => e.id === fo), ho = (e) => {
|
|
1468
1675
|
let t = [];
|
|
1469
|
-
for (let n of Object.values(e))
|
|
1676
|
+
for (let n of Object.values(e)) mo(n) && t.push(n.tableName);
|
|
1470
1677
|
return t;
|
|
1471
|
-
},
|
|
1472
|
-
let i =
|
|
1678
|
+
}, go = class extends Ct.TaggedError("TableStreamError") {}, _o = 1e3, vo = (e, t, n, r) => {
|
|
1679
|
+
let i = j.match(r, {
|
|
1473
1680
|
onNone: () => e.where,
|
|
1474
|
-
onSome: (n) => e.where ?
|
|
1681
|
+
onSome: (n) => e.where ? Vi(e.where, Ei(t, n)) : Ei(t, n)
|
|
1475
1682
|
});
|
|
1476
1683
|
return {
|
|
1477
1684
|
table: e.table,
|
|
@@ -1486,56 +1693,56 @@ var wt = (e) => typeof e == "string" && e !== "" ? e : null, Tt = async (e, t, n
|
|
|
1486
1693
|
...e.includeDeleted === void 0 ? {} : { includeDeleted: e.includeDeleted },
|
|
1487
1694
|
...e.crossTenant === void 0 ? {} : { crossTenant: e.crossTenant }
|
|
1488
1695
|
};
|
|
1489
|
-
},
|
|
1490
|
-
let n = t.pk ?? "id", r = t.chunkSize ??
|
|
1491
|
-
return
|
|
1492
|
-
let a =
|
|
1493
|
-
try: () => e.query(
|
|
1494
|
-
catch: (e) => new
|
|
1696
|
+
}, yo = (e, t) => {
|
|
1697
|
+
let n = t.pk ?? "id", r = t.chunkSize ?? _o;
|
|
1698
|
+
return Dt.paginateChunkEffect(j.none(), (i) => {
|
|
1699
|
+
let a = k.tryPromise({
|
|
1700
|
+
try: () => e.query(vo(t, n, r, i)),
|
|
1701
|
+
catch: (e) => new go({
|
|
1495
1702
|
table: t.table,
|
|
1496
1703
|
cause: e
|
|
1497
1704
|
})
|
|
1498
1705
|
});
|
|
1499
|
-
return (t.retry ? a.pipe(
|
|
1706
|
+
return (t.retry ? a.pipe(k.retry(t.retry)) : a).pipe(k.map((e) => [St.fromIterable(e), e.length === r && e.length > 0 ? j.some(j.some(e[e.length - 1][n])) : j.none()]));
|
|
1500
1707
|
});
|
|
1501
|
-
},
|
|
1502
|
-
let
|
|
1503
|
-
if (
|
|
1504
|
-
return (
|
|
1505
|
-
let
|
|
1708
|
+
}, bo = (e) => {
|
|
1709
|
+
let t = e.alpha ?? .5;
|
|
1710
|
+
if (t < 0 || t > 1) throw Error(`hybridSearch: alpha must be in [0, 1], got ${t}`);
|
|
1711
|
+
return (n) => {
|
|
1712
|
+
let r = Array.isArray(e.vector.query) ? {
|
|
1506
1713
|
column: e.vector.col,
|
|
1507
1714
|
queryVector: e.vector.query,
|
|
1508
1715
|
distance: e.vector.distance ?? "cosine",
|
|
1509
|
-
alpha:
|
|
1716
|
+
alpha: t
|
|
1510
1717
|
} : {
|
|
1511
1718
|
column: e.vector.col,
|
|
1512
1719
|
queryText: e.vector.query,
|
|
1513
1720
|
distance: e.vector.distance ?? "cosine",
|
|
1514
|
-
alpha:
|
|
1515
|
-
},
|
|
1721
|
+
alpha: t
|
|
1722
|
+
}, i = _(n.table, e.fts.indexName, n.fullTextIndexes);
|
|
1516
1723
|
return {
|
|
1517
|
-
...
|
|
1518
|
-
annClause:
|
|
1724
|
+
...n,
|
|
1725
|
+
annClause: r,
|
|
1519
1726
|
fullTextSearch: {
|
|
1520
1727
|
indexName: e.fts.indexName,
|
|
1521
1728
|
query: e.fts.query,
|
|
1522
|
-
columns:
|
|
1523
|
-
...
|
|
1524
|
-
...
|
|
1729
|
+
columns: i.columns,
|
|
1730
|
+
...i.config === void 0 ? {} : { config: i.config },
|
|
1731
|
+
...i.weights === void 0 ? {} : { weights: i.weights }
|
|
1525
1732
|
}
|
|
1526
1733
|
};
|
|
1527
1734
|
};
|
|
1528
|
-
},
|
|
1735
|
+
}, xo = async (e, t) => {
|
|
1529
1736
|
let n = e.as ?? "embedding", r = t.row[e.from];
|
|
1530
1737
|
if (typeof r != "string" || r.length === 0) return {};
|
|
1531
1738
|
let i = await t.embed(r);
|
|
1532
1739
|
return { [n]: i };
|
|
1533
|
-
},
|
|
1740
|
+
}, So = (e) => {
|
|
1534
1741
|
if (!Number.isInteger(e.dimensions) || e.dimensions <= 0) throw Error(`vectorEmbedding: dimensions must be a positive integer, got ${String(e.dimensions)}.`);
|
|
1535
|
-
let t = e.as ?? "embedding", n = (t) =>
|
|
1536
|
-
return
|
|
1742
|
+
let t = e.as ?? "embedding", n = (t) => xo(e, t);
|
|
1743
|
+
return Qe({
|
|
1537
1744
|
id: "voltro/vectorEmbedding",
|
|
1538
|
-
fields: { [t]:
|
|
1745
|
+
fields: { [t]: we(e.dimensions) },
|
|
1539
1746
|
...e.index === !1 ? {} : { indexes: [{
|
|
1540
1747
|
fields: [t],
|
|
1541
1748
|
kind: "hnsw",
|
|
@@ -1550,19 +1757,19 @@ var wt = (e) => typeof e == "string" && e !== "" ? e : null, Tt = async (e, t, n
|
|
|
1550
1757
|
beforeUpdate: n
|
|
1551
1758
|
}
|
|
1552
1759
|
});
|
|
1553
|
-
},
|
|
1760
|
+
}, Co = 63, wo = "br_pr", J = class extends Error {
|
|
1554
1761
|
_tag = "BranchNameInvalid";
|
|
1555
1762
|
constructor(e) {
|
|
1556
1763
|
super(e), this.name = "BranchNameInvalid";
|
|
1557
1764
|
}
|
|
1558
|
-
},
|
|
1559
|
-
if (!Number.isInteger(t) || t < 0) throw new
|
|
1560
|
-
let n =
|
|
1561
|
-
if (n.replace(/_/g, "") === "") throw new
|
|
1562
|
-
let r = `${
|
|
1563
|
-
if (r.length >
|
|
1765
|
+
}, To = (e, t) => {
|
|
1766
|
+
if (!Number.isInteger(t) || t < 0) throw new J(`prNumber must be a non-negative integer, got ${String(t)}`);
|
|
1767
|
+
let n = Qn(e);
|
|
1768
|
+
if (n.replace(/_/g, "") === "") throw new J(`app slug '${e}' has no usable identifier characters`);
|
|
1769
|
+
let r = `${wo}${t}_${n}`;
|
|
1770
|
+
if (r.length > Co) throw new J(`branch namespace '${r}' exceeds the ${Co}-byte identifier limit — use a shorter app slug`);
|
|
1564
1771
|
return r;
|
|
1565
|
-
},
|
|
1772
|
+
}, Eo = (e) => e.startsWith(wo), Do = {
|
|
1566
1773
|
requested: {
|
|
1567
1774
|
provision: "provisioning",
|
|
1568
1775
|
destroy: "destroying"
|
|
@@ -1581,45 +1788,54 @@ var wt = (e) => typeof e == "string" && e !== "" ? e : null, Tt = async (e, t, n
|
|
|
1581
1788
|
fail: "failed"
|
|
1582
1789
|
},
|
|
1583
1790
|
destroyed: {}
|
|
1584
|
-
},
|
|
1791
|
+
}, Oo = class extends Error {
|
|
1585
1792
|
from;
|
|
1586
1793
|
event;
|
|
1587
1794
|
_tag = "BranchTransitionInvalid";
|
|
1588
1795
|
constructor(e, t) {
|
|
1589
1796
|
super(`invalid branch transition: ${e} --${t}-->`), this.from = e, this.event = t, this.name = "BranchTransitionInvalid";
|
|
1590
1797
|
}
|
|
1591
|
-
},
|
|
1592
|
-
let n =
|
|
1593
|
-
if (n === void 0) throw new
|
|
1798
|
+
}, ko = (e, t) => {
|
|
1799
|
+
let n = Do[e][t];
|
|
1800
|
+
if (n === void 0) throw new Oo(e, t);
|
|
1594
1801
|
return n;
|
|
1595
|
-
},
|
|
1596
|
-
if (n === "copy" && (r === void 0 || r === "")) throw new
|
|
1597
|
-
let
|
|
1802
|
+
}, Ao = (e, t, n, r, i = [], a = []) => {
|
|
1803
|
+
if (n === "copy" && (r === void 0 || r === "")) throw new J("seed 'copy' requires a parentNamespace to snapshot from");
|
|
1804
|
+
let o = [{
|
|
1598
1805
|
kind: "create-namespace",
|
|
1599
1806
|
detail: e
|
|
1600
1807
|
}];
|
|
1601
|
-
for (let n of t)
|
|
1808
|
+
for (let n of t) o.push({
|
|
1602
1809
|
kind: "create-table",
|
|
1603
1810
|
table: n,
|
|
1604
1811
|
detail: `${e}.${n}`
|
|
1605
1812
|
});
|
|
1606
|
-
|
|
1813
|
+
for (let t of a) o.push({
|
|
1814
|
+
kind: "restore-index-name",
|
|
1815
|
+
table: t.table,
|
|
1816
|
+
detail: `${e}.${t.table} ${t.unique ? "UNIQUE " : ""}(${t.columns.join(", ")}) → ${t.name}`
|
|
1817
|
+
});
|
|
1818
|
+
if (n === "copy") for (let n of t) o.push({
|
|
1607
1819
|
kind: "copy-table",
|
|
1608
1820
|
table: n,
|
|
1609
1821
|
detail: `${r}.${n} → ${e}.${n}`
|
|
1610
1822
|
});
|
|
1611
|
-
|
|
1823
|
+
for (let t of i) o.push({
|
|
1824
|
+
kind: "copy-foreign-key",
|
|
1825
|
+
table: t.table,
|
|
1826
|
+
detail: `${e}.${t.table}.${t.column} → ${e}.${t.targetTable}.${t.targetColumn}`
|
|
1827
|
+
});
|
|
1828
|
+
return n === "fresh" && o.push({
|
|
1612
1829
|
kind: "seed",
|
|
1613
1830
|
detail: `run boot seeds into ${e}`
|
|
1614
|
-
});
|
|
1615
|
-
|
|
1616
|
-
|
|
1617
|
-
if (!ja(e)) throw new Y(`refusing to plan teardown of '${e}' — not a branch namespace`);
|
|
1831
|
+
}), o;
|
|
1832
|
+
}, jo = (e) => {
|
|
1833
|
+
if (!Eo(e)) throw new J(`refusing to plan teardown of '${e}' — not a branch namespace`);
|
|
1618
1834
|
return [{
|
|
1619
1835
|
kind: "drop-namespace",
|
|
1620
1836
|
detail: e
|
|
1621
1837
|
}];
|
|
1622
|
-
},
|
|
1838
|
+
}, Mo = (e) => {
|
|
1623
1839
|
if (e === void 0 || e === "") return !1;
|
|
1624
1840
|
try {
|
|
1625
1841
|
let t = new URL(e).hostname.toLowerCase();
|
|
@@ -1627,32 +1843,34 @@ var wt = (e) => typeof e == "string" && e !== "" ? e : null, Tt = async (e, t, n
|
|
|
1627
1843
|
} catch {
|
|
1628
1844
|
return /\bneon\.(tech|build)\b/i.test(e);
|
|
1629
1845
|
}
|
|
1630
|
-
},
|
|
1846
|
+
}, No = (e) => e.prefer === void 0 ? e.seed === "copy" && Mo(e.dbUrl) ? "neon-cow" : "namespace" : e.prefer, Po = (e, t = {}) => [{
|
|
1631
1847
|
kind: "neon-branch-create",
|
|
1632
1848
|
detail: `${t.parentBranch ?? "main"} → ${e} (copy-on-write)`
|
|
1633
|
-
}],
|
|
1634
|
-
if (!
|
|
1849
|
+
}], Fo = (e) => {
|
|
1850
|
+
if (!Eo(e)) throw new J(`refusing to plan teardown of '${e}' — not a branch namespace`);
|
|
1635
1851
|
return [{
|
|
1636
1852
|
kind: "neon-branch-delete",
|
|
1637
1853
|
detail: e
|
|
1638
1854
|
}];
|
|
1639
|
-
},
|
|
1855
|
+
}, Io = (e) => e.mechanism === "neon-cow" ? Po(e.branchId, e.neonParentBranch === void 0 ? {} : { parentBranch: e.neonParentBranch }) : Ao(e.branchId, e.tableNames, e.seed, e.parentNamespace, e.foreignKeys, e.indexNames), Lo = (e, t) => e === "neon-cow" ? Fo(t) : jo(t), Ro = (e, t, n) => {
|
|
1640
1856
|
let r = e.filter((e) => e.state !== "destroyed" && e.state !== "destroying"), i = r.filter((e) => n - e.createdAtMs > t.ttlMs).map((e) => e.namespace), a = new Set(i);
|
|
1641
1857
|
return {
|
|
1642
1858
|
evict: i,
|
|
1643
1859
|
rejectNew: r.filter((e) => !a.has(e.namespace)).length >= t.maxBranches
|
|
1644
1860
|
};
|
|
1645
|
-
},
|
|
1646
|
-
let n =
|
|
1861
|
+
}, zo = async (e, t) => {
|
|
1862
|
+
let n = To(e.appSlug, e.prNumber), r = No({
|
|
1647
1863
|
seed: e.seed,
|
|
1648
1864
|
...e.dbUrl === void 0 ? {} : { dbUrl: e.dbUrl },
|
|
1649
1865
|
...e.prefer === void 0 ? {} : { prefer: e.prefer }
|
|
1650
|
-
}), i =
|
|
1866
|
+
}), i = Io({
|
|
1651
1867
|
mechanism: r,
|
|
1652
1868
|
branchId: n,
|
|
1653
1869
|
tableNames: e.tableNames,
|
|
1654
1870
|
seed: e.seed,
|
|
1655
1871
|
...e.parentNamespace === void 0 ? {} : { parentNamespace: e.parentNamespace },
|
|
1872
|
+
...e.foreignKeys === void 0 ? {} : { foreignKeys: e.foreignKeys },
|
|
1873
|
+
...e.indexNames === void 0 ? {} : { indexNames: e.indexNames },
|
|
1656
1874
|
...e.neonParentBranch === void 0 ? {} : { neonParentBranch: e.neonParentBranch }
|
|
1657
1875
|
});
|
|
1658
1876
|
if (r === "neon-cow") return {
|
|
@@ -1663,42 +1881,81 @@ var wt = (e) => typeof e == "string" && e !== "" ? e : null, Tt = async (e, t, n
|
|
|
1663
1881
|
};
|
|
1664
1882
|
await t.createNamespace(n);
|
|
1665
1883
|
for (let r of e.tableNames) await t.createTable(n, r);
|
|
1884
|
+
for (let r of e.indexNames ?? []) await t.restoreIndexName(n, r);
|
|
1666
1885
|
if (e.seed === "copy") {
|
|
1667
1886
|
if (e.parentNamespace === void 0 || e.parentNamespace === "") throw Error("provisionBranch: seed 'copy' requires parentNamespace");
|
|
1668
1887
|
for (let r of e.tableNames) await t.copyTable(e.parentNamespace, n, r);
|
|
1669
1888
|
}
|
|
1889
|
+
for (let r of e.foreignKeys ?? []) await t.addForeignKey(n, r);
|
|
1670
1890
|
return {
|
|
1671
1891
|
branchId: n,
|
|
1672
1892
|
mechanism: r,
|
|
1673
1893
|
steps: i
|
|
1674
1894
|
};
|
|
1675
|
-
},
|
|
1676
|
-
let r =
|
|
1895
|
+
}, Bo = async (e, t, n) => {
|
|
1896
|
+
let r = Lo(t, e);
|
|
1677
1897
|
return t === "neon-cow" ? await n.neonBranchDelete(e) : await n.dropNamespace(e), r;
|
|
1678
|
-
},
|
|
1898
|
+
}, Vo = (e, t, n) => Ro(e, t, n), Y = (e) => `"${e.replace(/"/g, "\"\"")}"`, Ho = {
|
|
1899
|
+
cascade: "CASCADE",
|
|
1900
|
+
restrict: "RESTRICT",
|
|
1901
|
+
setNull: "SET NULL",
|
|
1902
|
+
noAction: "NO ACTION"
|
|
1903
|
+
}, X = (e) => `'${e.replace(/'/g, "''")}'`, Uo = (e, t) => {
|
|
1904
|
+
let n = t.columns.map(X).join(", ");
|
|
1905
|
+
return `DO $voltro_branch$
|
|
1906
|
+
DECLARE derived name;
|
|
1907
|
+
BEGIN
|
|
1908
|
+
SELECT i.relname INTO derived
|
|
1909
|
+
FROM pg_index x
|
|
1910
|
+
JOIN pg_class i ON i.oid = x.indexrelid
|
|
1911
|
+
JOIN pg_class c ON c.oid = x.indrelid
|
|
1912
|
+
JOIN pg_namespace nsp ON nsp.oid = c.relnamespace
|
|
1913
|
+
WHERE nsp.nspname = ${X(e)}
|
|
1914
|
+
AND c.relname = ${X(t.table)}
|
|
1915
|
+
AND NOT x.indisprimary
|
|
1916
|
+
AND x.indisunique = ${t.unique ? "true" : "false"}
|
|
1917
|
+
AND i.relname <> ${X(t.name)}
|
|
1918
|
+
AND (
|
|
1919
|
+
SELECT array_agg(att.attname::text ORDER BY k.ord)
|
|
1920
|
+
FROM unnest(x.indkey::int2[]) WITH ORDINALITY AS k(attnum, ord)
|
|
1921
|
+
JOIN pg_attribute att ON att.attrelid = c.oid AND att.attnum = k.attnum
|
|
1922
|
+
) = ARRAY[${n}]::text[]
|
|
1923
|
+
LIMIT 1;
|
|
1924
|
+
IF derived IS NOT NULL THEN
|
|
1925
|
+
EXECUTE format('ALTER INDEX %I.%I RENAME TO %I',
|
|
1926
|
+
${X(e)}, derived, ${X(t.name)});
|
|
1927
|
+
END IF;
|
|
1928
|
+
END
|
|
1929
|
+
$voltro_branch$`;
|
|
1930
|
+
}, Wo = (e, t) => {
|
|
1931
|
+
let n = t.onDelete === void 0 ? "" : ` ON DELETE ${Ho[t.onDelete]}`, r = t.onUpdate === void 0 ? "" : ` ON UPDATE ${Ho[t.onUpdate]}`;
|
|
1932
|
+
return `ALTER TABLE ${Y(e)}.${Y(t.table)} ADD FOREIGN KEY (${Y(t.column)}) REFERENCES ${Y(e)}.${Y(t.targetTable)} (${Y(t.targetColumn)})${n}${r}`;
|
|
1933
|
+
}, Go = (e) => {
|
|
1679
1934
|
let t = () => {
|
|
1680
1935
|
throw Error("namespace branch executor: Neon ops require a neon-cow executor (use a Neon connection for copy-on-write branches)");
|
|
1681
1936
|
};
|
|
1682
1937
|
return {
|
|
1683
|
-
createNamespace: (t) => e.run(`CREATE SCHEMA IF NOT EXISTS ${
|
|
1684
|
-
createTable: (t, n) => e.run(`CREATE TABLE IF NOT EXISTS ${
|
|
1685
|
-
copyTable: (t, n, r) => e.run(`INSERT INTO ${
|
|
1686
|
-
|
|
1938
|
+
createNamespace: (t) => e.run(`CREATE SCHEMA IF NOT EXISTS ${Y(t)}`),
|
|
1939
|
+
createTable: (t, n) => e.run(`CREATE TABLE IF NOT EXISTS ${Y(t)}.${Y(n)} (LIKE ${Y(n)} INCLUDING ALL)`),
|
|
1940
|
+
copyTable: (t, n, r) => e.run(`INSERT INTO ${Y(n)}.${Y(r)} SELECT * FROM ${Y(t)}.${Y(r)}`),
|
|
1941
|
+
addForeignKey: (t, n) => e.run(Wo(t, n)),
|
|
1942
|
+
restoreIndexName: (t, n) => e.run(Uo(t, n)),
|
|
1943
|
+
dropNamespace: (t) => e.run(`DROP SCHEMA IF EXISTS ${Y(t)} CASCADE`),
|
|
1687
1944
|
neonBranchCreate: t,
|
|
1688
1945
|
neonBranchDelete: t
|
|
1689
1946
|
};
|
|
1690
|
-
},
|
|
1947
|
+
}, Ko = class extends Error {
|
|
1691
1948
|
_tag = "TenantResidencyUnresolved";
|
|
1692
1949
|
constructor(e) {
|
|
1693
1950
|
super(e), this.name = "TenantResidencyUnresolved";
|
|
1694
1951
|
}
|
|
1695
|
-
},
|
|
1952
|
+
}, qo = class extends Error {
|
|
1696
1953
|
region;
|
|
1697
1954
|
_tag = "TenantRegionUnavailable";
|
|
1698
1955
|
constructor(e, t) {
|
|
1699
1956
|
super(t), this.region = e, this.name = "TenantRegionUnavailable";
|
|
1700
1957
|
}
|
|
1701
|
-
},
|
|
1958
|
+
}, Jo, Yo = (e) => {
|
|
1702
1959
|
if (e.homes === void 0) throw Error("setResidencyConfig: `homes` is required");
|
|
1703
1960
|
if (e.servableRegions === void 0 || e.servableRegions.length === 0) throw Error("setResidencyConfig: `servableRegions` must be non-empty (which regions this deployment serves)");
|
|
1704
1961
|
let t = /* @__PURE__ */ new Map();
|
|
@@ -1707,55 +1964,55 @@ var wt = (e) => typeof e == "string" && e !== "" ? e : null, Tt = async (e, t, n
|
|
|
1707
1964
|
if (e !== void 0 && e !== n.region) throw Error(`residency: tenant '${n.tenantId}' is mapped to two regions ('${e}' and '${n.region}')`);
|
|
1708
1965
|
t.set(n.tenantId, n.region);
|
|
1709
1966
|
}
|
|
1710
|
-
return
|
|
1711
|
-
},
|
|
1712
|
-
|
|
1713
|
-
},
|
|
1714
|
-
if (e == null || e === "") throw new
|
|
1967
|
+
return Jo = e, e;
|
|
1968
|
+
}, Xo = () => Jo, Zo = () => {
|
|
1969
|
+
Jo = void 0;
|
|
1970
|
+
}, Qo = (e, t) => {
|
|
1971
|
+
if (e == null || e === "") throw new Ko("residency is on but the request has no resolvable tenant — refusing to bind a store");
|
|
1715
1972
|
let n = t.homes.find((t) => t.tenantId === e);
|
|
1716
|
-
if (n === void 0) throw new
|
|
1973
|
+
if (n === void 0) throw new Ko(`no residency home is mapped for tenant '${e}' — refusing to fall back to a default store (would be a residency violation)`);
|
|
1717
1974
|
return n;
|
|
1718
|
-
},
|
|
1719
|
-
let n =
|
|
1975
|
+
}, $o = (e, t) => t.servableRegions.includes(e), es = (e, t) => {
|
|
1976
|
+
let n = Qo(e.tenantId, t), r = $n(n.tenantId);
|
|
1720
1977
|
return {
|
|
1721
1978
|
region: n.region,
|
|
1722
1979
|
namespace: r,
|
|
1723
1980
|
...n.connectionKey === void 0 ? {} : { connectionKey: n.connectionKey }
|
|
1724
1981
|
};
|
|
1725
|
-
},
|
|
1726
|
-
let r =
|
|
1727
|
-
if (
|
|
1982
|
+
}, ts = (e, t, n) => {
|
|
1983
|
+
let r = es(e, t);
|
|
1984
|
+
if (!$o(r.region, t)) throw new qo(r.region, `tenant homed in region '${r.region}', which this deployment does not serve — route to the home region`);
|
|
1728
1985
|
let i = n.get(r.region);
|
|
1729
|
-
if (i === void 0) throw new
|
|
1986
|
+
if (i === void 0) throw new qo(r.region, `no store handle for home region '${r.region}' (declared servable but not wired) — failing closed`);
|
|
1730
1987
|
return {
|
|
1731
1988
|
store: i,
|
|
1732
1989
|
placement: r
|
|
1733
1990
|
};
|
|
1734
|
-
},
|
|
1735
|
-
let { store: i, placement: a } =
|
|
1991
|
+
}, ns = async (e, t, n, r) => {
|
|
1992
|
+
let { store: i, placement: a } = ts(e, t, n);
|
|
1736
1993
|
return await r(i, a), a;
|
|
1737
|
-
},
|
|
1994
|
+
}, rs = (e) => {
|
|
1738
1995
|
if (typeof e == "string") return e;
|
|
1739
1996
|
if ("jsonPath" in e) {
|
|
1740
1997
|
let { column: t, path: n, numeric: r } = e.jsonPath;
|
|
1741
1998
|
return `(json:${t}->${n.join(".")}${r ? "::num" : ""})`;
|
|
1742
1999
|
}
|
|
1743
2000
|
return `(${e.expr})`;
|
|
1744
|
-
}, Z = (e) => e.map(
|
|
2001
|
+
}, Z = (e) => e.map(rs), is = (e, t) => {
|
|
1745
2002
|
if (e.length !== t.length) return !1;
|
|
1746
|
-
for (let n = 0; n < e.length; n++) if (
|
|
2003
|
+
for (let n = 0; n < e.length; n++) if (rs(e[n]) !== rs(t[n])) return !1;
|
|
1747
2004
|
return !0;
|
|
1748
|
-
},
|
|
2005
|
+
}, as = (e, t) => {
|
|
1749
2006
|
if (e.length >= t.length) return !1;
|
|
1750
|
-
for (let n = 0; n < e.length; n++) if (
|
|
2007
|
+
for (let n = 0; n < e.length; n++) if (rs(e[n]) !== rs(t[n])) return !1;
|
|
1751
2008
|
return !0;
|
|
1752
|
-
},
|
|
2009
|
+
}, os = (e) => {
|
|
1753
2010
|
let t = [], n = e.appliedIndexes, r = e.tableName;
|
|
1754
2011
|
for (let e = 0; e < n.length; e++) {
|
|
1755
2012
|
let i = n[e];
|
|
1756
2013
|
for (let a = e + 1; a < n.length; a++) {
|
|
1757
2014
|
let e = n[a];
|
|
1758
|
-
if (
|
|
2015
|
+
if (is(i.fields, e.fields)) {
|
|
1759
2016
|
let [n, a] = i.name < e.name ? [i, e] : [e, i];
|
|
1760
2017
|
t.push({
|
|
1761
2018
|
kind: "duplicate-fields",
|
|
@@ -1766,13 +2023,13 @@ var wt = (e) => typeof e == "string" && e !== "" ? e : null, Tt = async (e, t, n
|
|
|
1766
2023
|
});
|
|
1767
2024
|
continue;
|
|
1768
2025
|
}
|
|
1769
|
-
|
|
2026
|
+
as(i.fields, e.fields) ? t.push({
|
|
1770
2027
|
kind: "redundant-prefix",
|
|
1771
2028
|
table: r,
|
|
1772
2029
|
redundant: i,
|
|
1773
2030
|
coveredBy: e,
|
|
1774
2031
|
message: `'${r}' index '${i.name}' on [${Z(i.fields).join(", ")}] is a leading prefix of '${e.name}' on [${Z(e.fields).join(", ")}]. Every B-tree dialect we support (Postgres / MySQL / MariaDB / MSSQL / SQLite) can serve a [${Z(i.fields).join(", ")}] query from '${e.name}' too via the leading-prefix rule, so '${i.name}' adds write cost without read benefit. Drop '${i.name}' — unless you specifically need a smaller index for cache locality on a write-heavy table (rare; profile first).`
|
|
1775
|
-
}) :
|
|
2032
|
+
}) : as(e.fields, i.fields) && t.push({
|
|
1776
2033
|
kind: "redundant-prefix",
|
|
1777
2034
|
table: r,
|
|
1778
2035
|
redundant: e,
|
|
@@ -1782,41 +2039,23 @@ var wt = (e) => typeof e == "string" && e !== "" ? e : null, Tt = async (e, t, n
|
|
|
1782
2039
|
}
|
|
1783
2040
|
}
|
|
1784
2041
|
return t;
|
|
1785
|
-
},
|
|
2042
|
+
}, ss = (e) => {
|
|
1786
2043
|
let t = [];
|
|
1787
|
-
for (let n of e) t.push(...
|
|
2044
|
+
for (let n of e) t.push(...os(n));
|
|
1788
2045
|
return t;
|
|
1789
|
-
},
|
|
1790
|
-
let n = t.color ?? !0, r = t.indent ?? " ", i = (e) => Q(n,
|
|
2046
|
+
}, cs = "\x1B[", ls = `${cs}38;2;245;158;11m`, us = `${cs}38;2;16;185;129m`, ds = (e, t) => `${e}${t}${N.reset}`, Q = (e, t, n) => e ? typeof t == "function" ? t(n) : ds(t, n) : n, fs = (e, t = {}) => {
|
|
2047
|
+
let n = t.color ?? !0, r = t.indent ?? " ", i = (e) => Q(n, N.dim, e.padEnd(11)), a = (e) => Q(n, (e) => N.bold(N.brand(e)), e), o = (e) => Q(n, N.brightRed24, e), s = (e) => Q(n, us, e), c = (e) => Q(n, ls, e), l = (e) => Q(n, N.dim, e), u = `${c("index audit")} ${l("·")} ${Q(n, N.bold, e.kind)}`, d = e.redundant.fields.length, f = Z(e.coveredBy.fields.slice(d)), p = (e, t) => {
|
|
1791
2048
|
let n = e.slice(0, t), r = e.slice(t), i = [];
|
|
1792
2049
|
return n.length > 0 && i.push(s(`[${n.join(", ")}]`)), r.length > 0 && i.push(c(`+ [${r.join(", ")}]`)), i.join(" ");
|
|
1793
2050
|
}, m = [];
|
|
1794
|
-
return m.push(u), m.push(""), m.push(`${i("table")}${a(e.table)}`), m.push(""), m.push(`${i("redundant")}${o(e.redundant.name)}`), m.push(`${i("")}${p(Z(e.redundant.fields), d)}`), m.push(""), m.push(`${i("covered by")}${s(e.coveredBy.name)}`), m.push(`${i("")}${p(Z(e.coveredBy.fields), d)}`), f.length > 0 && m.push(`${i("")}${l(`└ extra columns: ${f.join(", ")}`)}`), m.push(""), e.kind === "redundant-prefix" ? (m.push(`${i("why")}B-tree indexes serve queries that filter on a LEADING PREFIX of`), m.push(`${i("")}their column list. The wider index already covers every`), m.push(`${i("")}query the narrower one can serve.`), m.push(`${i("")}${l("Same rule on Postgres / MySQL / MariaDB / MSSQL / SQLite.")}`)) : (m.push(`${i("why")}Two indexes on the same columns under different names.`), m.push(`${i("")}The B-tree engine builds both — same coverage, double cost.`), m.push(`${i("")}${l("Same rule on Postgres / MySQL / MariaDB / MSSQL / SQLite.")}`)), m.push(""), m.push(`${i("cost")}Every ${a("INSERT")} / ${a("UPDATE")} / ${a("DELETE")} on this table writes`), m.push(`${i("")}to ${Q(n,
|
|
1795
|
-
},
|
|
1796
|
-
name: e,
|
|
1797
|
-
body: t
|
|
1798
|
-
}), _o = (e) => {
|
|
1799
|
-
if (e.lifecycle === "cron" && !e.cron) throw Error(`seed "${e.id}": lifecycle 'cron' requires a 'cron' field`);
|
|
1800
|
-
if (e.lifecycle === "onSchemaChange" && (!e.watchedTables || e.watchedTables.length === 0)) throw Error(`seed "${e.id}": lifecycle 'onSchemaChange' requires at least one entry in 'watchedTables'`);
|
|
1801
|
-
let t = e.steps({ step: go });
|
|
1802
|
-
if (t.length === 0) throw Error(`seed "${e.id}": at least one step is required`);
|
|
1803
|
-
return {
|
|
1804
|
-
__seed: !0,
|
|
1805
|
-
id: e.id,
|
|
1806
|
-
name: e.name,
|
|
1807
|
-
lifecycle: e.lifecycle,
|
|
1808
|
-
...e.cron === void 0 ? {} : { cron: e.cron },
|
|
1809
|
-
...e.watchedTables === void 0 ? {} : { watchedTables: e.watchedTables },
|
|
1810
|
-
...e.fingerprint === void 0 ? {} : { fingerprint: e.fingerprint },
|
|
1811
|
-
steps: t
|
|
1812
|
-
};
|
|
1813
|
-
}, vo = (e) => typeof e == "object" && !!e && "__seed" in e && e.__seed === !0, yo = (e, { apply: t, undo: n }) => ({
|
|
2051
|
+
return m.push(u), m.push(""), m.push(`${i("table")}${a(e.table)}`), m.push(""), m.push(`${i("redundant")}${o(e.redundant.name)}`), m.push(`${i("")}${p(Z(e.redundant.fields), d)}`), m.push(""), m.push(`${i("covered by")}${s(e.coveredBy.name)}`), m.push(`${i("")}${p(Z(e.coveredBy.fields), d)}`), f.length > 0 && m.push(`${i("")}${l(`└ extra columns: ${f.join(", ")}`)}`), m.push(""), e.kind === "redundant-prefix" ? (m.push(`${i("why")}B-tree indexes serve queries that filter on a LEADING PREFIX of`), m.push(`${i("")}their column list. The wider index already covers every`), m.push(`${i("")}query the narrower one can serve.`), m.push(`${i("")}${l("Same rule on Postgres / MySQL / MariaDB / MSSQL / SQLite.")}`)) : (m.push(`${i("why")}Two indexes on the same columns under different names.`), m.push(`${i("")}The B-tree engine builds both — same coverage, double cost.`), m.push(`${i("")}${l("Same rule on Postgres / MySQL / MariaDB / MSSQL / SQLite.")}`)), m.push(""), m.push(`${i("cost")}Every ${a("INSERT")} / ${a("UPDATE")} / ${a("DELETE")} on this table writes`), m.push(`${i("")}to ${Q(n, N.bold, "both")} B-trees. Pure write overhead, zero read benefit.`), m.push(""), m.push(`${i("fix")}Drop ${o(e.redundant.name)}`), m.push(`${i("")}${l("Keep only if profiling shows the smaller index gives a")}`), m.push(`${i("")}${l("measurable cache-locality boost on a write-heavy hot path.")}`), m.push(`${i("")}${l("Silence with VOLTRO_INDEX_AUDIT=off if intentional.")}`), m.map((e) => `${r}${e}`).join("\n");
|
|
2052
|
+
}, ps = (e, { apply: t, undo: n }) => ({
|
|
1814
2053
|
name: e,
|
|
1815
2054
|
apply: t,
|
|
1816
2055
|
undo: n
|
|
1817
|
-
}),
|
|
2056
|
+
}), ms = (e) => {
|
|
1818
2057
|
if (!/^\d{14}_/.test(e.id)) throw Error(`migration "${e.id}": id must start with a 14-digit timestamp followed by "_" (convention: <YYYYMMDDHHMMSS>_<slug>)`);
|
|
1819
|
-
let t = e.steps({ step:
|
|
2058
|
+
let t = e.steps({ step: ps });
|
|
1820
2059
|
if (t.length === 0) throw Error(`migration "${e.id}": at least one step is required`);
|
|
1821
2060
|
return {
|
|
1822
2061
|
__migration: !0,
|
|
@@ -1824,145 +2063,235 @@ var wt = (e) => typeof e == "string" && e !== "" ? e : null, Tt = async (e, t, n
|
|
|
1824
2063
|
name: e.name,
|
|
1825
2064
|
steps: t
|
|
1826
2065
|
};
|
|
1827
|
-
},
|
|
1828
|
-
id:
|
|
1829
|
-
name:
|
|
1830
|
-
hash:
|
|
1831
|
-
status:
|
|
1832
|
-
appliedAt:
|
|
1833
|
-
durationMs:
|
|
1834
|
-
errorMessage:
|
|
1835
|
-
errorStack:
|
|
1836
|
-
workflowRunId:
|
|
1837
|
-
createdAt:
|
|
1838
|
-
updatedAt:
|
|
1839
|
-
}).index(["status"]),
|
|
1840
|
-
id:
|
|
1841
|
-
name:
|
|
1842
|
-
lifecycle:
|
|
1843
|
-
fingerprint:
|
|
1844
|
-
cronSchedule:
|
|
1845
|
-
watchedTables:
|
|
1846
|
-
nextRunAt:
|
|
1847
|
-
lastRunStatus:
|
|
1848
|
-
lastRunAt:
|
|
1849
|
-
lastRunDurationMs:
|
|
1850
|
-
lastRunRowsTouched:
|
|
1851
|
-
lastError:
|
|
1852
|
-
workflowRunId:
|
|
1853
|
-
createdAt:
|
|
1854
|
-
updatedAt:
|
|
1855
|
-
}).index(["lifecycle"]).index(["nextRunAt"]),
|
|
1856
|
-
id:
|
|
1857
|
-
fingerprint:
|
|
1858
|
-
liveFingerprint:
|
|
1859
|
-
operations:
|
|
1860
|
-
rollbackPlan:
|
|
1861
|
-
appliedBy:
|
|
1862
|
-
environment:
|
|
1863
|
-
source:
|
|
1864
|
-
onlineStrategy:
|
|
1865
|
-
durationMs:
|
|
1866
|
-
notes:
|
|
1867
|
-
squashedAt:
|
|
1868
|
-
appliedAt:
|
|
1869
|
-
createdAt:
|
|
1870
|
-
updatedAt:
|
|
1871
|
-
}).index(["fingerprint"]).index(["environment"]),
|
|
1872
|
-
id:
|
|
1873
|
-
scope:
|
|
1874
|
-
key:
|
|
1875
|
-
status:
|
|
1876
|
-
response:
|
|
1877
|
-
createdAt:
|
|
1878
|
-
}).unique(["scope", "key"]).index(["createdAt"]),
|
|
1879
|
-
id:
|
|
1880
|
-
key:
|
|
1881
|
-
value:
|
|
1882
|
-
expiresAt:
|
|
1883
|
-
createdAt:
|
|
1884
|
-
updatedAt:
|
|
1885
|
-
}).index(["expiresAt"]),
|
|
1886
|
-
id:
|
|
1887
|
-
tenantId:
|
|
1888
|
-
name:
|
|
1889
|
-
hashedKey:
|
|
1890
|
-
keyPrefix:
|
|
1891
|
-
scopes:
|
|
1892
|
-
lastUsedAt:
|
|
1893
|
-
requestCount:
|
|
1894
|
-
expiresAt:
|
|
1895
|
-
revokedAt:
|
|
1896
|
-
createdBy:
|
|
1897
|
-
onBehalfOf:
|
|
1898
|
-
metadata:
|
|
1899
|
-
createdAt:
|
|
1900
|
-
}).index("byApiKeyTenant", ["tenantId"]),
|
|
1901
|
-
|
|
1902
|
-
|
|
1903
|
-
|
|
1904
|
-
], $ = "id",
|
|
1905
|
-
let
|
|
1906
|
-
if (
|
|
1907
|
-
let
|
|
1908
|
-
if (
|
|
1909
|
-
if (
|
|
1910
|
-
if (!($ in
|
|
1911
|
-
let e = { ...
|
|
2066
|
+
}, hs = (e) => typeof e == "object" && !!e && "__migration" in e && e.__migration === !0, gs = w("_voltro_migrations", {
|
|
2067
|
+
id: v({ prefix: "mig" }),
|
|
2068
|
+
name: D(),
|
|
2069
|
+
hash: D(),
|
|
2070
|
+
status: D(),
|
|
2071
|
+
appliedAt: b().nullable(),
|
|
2072
|
+
durationMs: C().nullable(),
|
|
2073
|
+
errorMessage: D().nullable(),
|
|
2074
|
+
errorStack: D().nullable(),
|
|
2075
|
+
workflowRunId: D().nullable(),
|
|
2076
|
+
createdAt: b().default("now"),
|
|
2077
|
+
updatedAt: b().default("now").onUpdate("now")
|
|
2078
|
+
}).index(["status"]), _s = w("_voltro_seeds", {
|
|
2079
|
+
id: v({ prefix: "seed" }),
|
|
2080
|
+
name: D(),
|
|
2081
|
+
lifecycle: D(),
|
|
2082
|
+
fingerprint: D(),
|
|
2083
|
+
cronSchedule: D().nullable(),
|
|
2084
|
+
watchedTables: O().nullable(),
|
|
2085
|
+
nextRunAt: b().nullable(),
|
|
2086
|
+
lastRunStatus: D().nullable(),
|
|
2087
|
+
lastRunAt: b().nullable(),
|
|
2088
|
+
lastRunDurationMs: C().nullable(),
|
|
2089
|
+
lastRunRowsTouched: C().nullable(),
|
|
2090
|
+
lastError: D().nullable(),
|
|
2091
|
+
workflowRunId: D().nullable(),
|
|
2092
|
+
createdAt: b().default("now"),
|
|
2093
|
+
updatedAt: b().default("now").onUpdate("now")
|
|
2094
|
+
}).index(["lifecycle"]).index(["nextRunAt"]), vs = w("_voltro_migration_plans", {
|
|
2095
|
+
id: v({ prefix: "plan" }),
|
|
2096
|
+
fingerprint: D(),
|
|
2097
|
+
liveFingerprint: D().nullable(),
|
|
2098
|
+
operations: O(),
|
|
2099
|
+
rollbackPlan: O().nullable(),
|
|
2100
|
+
appliedBy: D(),
|
|
2101
|
+
environment: D(),
|
|
2102
|
+
source: D(),
|
|
2103
|
+
onlineStrategy: D().nullable(),
|
|
2104
|
+
durationMs: C(),
|
|
2105
|
+
notes: D().nullable(),
|
|
2106
|
+
squashedAt: b().nullable(),
|
|
2107
|
+
appliedAt: b().default("now"),
|
|
2108
|
+
createdAt: b().default("now"),
|
|
2109
|
+
updatedAt: b().default("now").onUpdate("now")
|
|
2110
|
+
}).index(["fingerprint"]).index(["environment"]), ys = w("_voltro_idempotency", {
|
|
2111
|
+
id: v({ prefix: "idem" }),
|
|
2112
|
+
scope: D(),
|
|
2113
|
+
key: D(),
|
|
2114
|
+
status: D(),
|
|
2115
|
+
response: O().nullable(),
|
|
2116
|
+
createdAt: b().default("now")
|
|
2117
|
+
}).unique(["scope", "key"]).index(["createdAt"]), bs = w("_voltro_kv", {
|
|
2118
|
+
id: v({ prefix: "kv" }),
|
|
2119
|
+
key: D().unique(),
|
|
2120
|
+
value: D().nullable(),
|
|
2121
|
+
expiresAt: b().nullable(),
|
|
2122
|
+
createdAt: b().default("now"),
|
|
2123
|
+
updatedAt: b().default("now").onUpdate("now")
|
|
2124
|
+
}).index(["expiresAt"]), xs = w("_voltro_api_keys", {
|
|
2125
|
+
id: v({ prefix: "apikey" }),
|
|
2126
|
+
tenantId: D().nullable(),
|
|
2127
|
+
name: D(),
|
|
2128
|
+
hashedKey: D().maxLength(64).unique(),
|
|
2129
|
+
keyPrefix: D(),
|
|
2130
|
+
scopes: O().nullable(),
|
|
2131
|
+
lastUsedAt: b().nullable(),
|
|
2132
|
+
requestCount: C().default(0),
|
|
2133
|
+
expiresAt: b().nullable(),
|
|
2134
|
+
revokedAt: b().nullable(),
|
|
2135
|
+
createdBy: D().nullable(),
|
|
2136
|
+
onBehalfOf: D().nullable(),
|
|
2137
|
+
metadata: O().nullable(),
|
|
2138
|
+
createdAt: b().default("now")
|
|
2139
|
+
}).index("byApiKeyTenant", ["tenantId"]), Ss = [
|
|
2140
|
+
gs,
|
|
2141
|
+
_s,
|
|
2142
|
+
vs
|
|
2143
|
+
], $ = "id", Cs = (e, t) => {
|
|
2144
|
+
let n = p(e);
|
|
2145
|
+
if (n === void 0) return t;
|
|
2146
|
+
let r = n.fields[$]?.idScheme;
|
|
2147
|
+
if (r === void 0 || t[$] != null) return t;
|
|
2148
|
+
if (r.kind === "numeric") {
|
|
2149
|
+
if (!($ in t)) return t;
|
|
2150
|
+
let e = { ...t };
|
|
1912
2151
|
return delete e[$], e;
|
|
1913
2152
|
}
|
|
1914
|
-
let
|
|
1915
|
-
return
|
|
1916
|
-
...
|
|
1917
|
-
[$]:
|
|
2153
|
+
let i = et(r, e);
|
|
2154
|
+
return i === null ? t : {
|
|
2155
|
+
...t,
|
|
2156
|
+
[$]: i
|
|
1918
2157
|
};
|
|
1919
|
-
},
|
|
2158
|
+
}, ws = (e, t) => t.map((t) => Cs(e, t)), Ts = {
|
|
2159
|
+
postgres: { maxBindParameters: 65535 },
|
|
2160
|
+
mysql: { maxBindParameters: 65535 },
|
|
2161
|
+
mariadb: { maxBindParameters: 65535 },
|
|
2162
|
+
mssql: {
|
|
2163
|
+
maxBindParameters: 2098,
|
|
2164
|
+
maxRowsPerStatement: 1e3
|
|
2165
|
+
},
|
|
2166
|
+
sqlite: { maxBindParameters: 32766 },
|
|
2167
|
+
turso: { maxBindParameters: 32766 }
|
|
2168
|
+
}, Es = (e) => Ts[e], Ds = (e) => {
|
|
2169
|
+
let t = /* @__PURE__ */ new Set();
|
|
2170
|
+
for (let n of e) for (let e of Object.keys(n)) t.add(e);
|
|
2171
|
+
return t.size;
|
|
2172
|
+
}, Os = (e, t) => {
|
|
2173
|
+
if (t === void 0 || e.length === 0) return [e];
|
|
2174
|
+
let n = Math.max(1, Ds(e)), r = Math.floor(t.maxBindParameters / n), i = t.maxRowsPerStatement ?? Infinity, a = Math.max(1, Math.min(r, i));
|
|
2175
|
+
if (e.length <= a) return [e];
|
|
2176
|
+
let o = [];
|
|
2177
|
+
for (let t = 0; t < e.length; t += a) o.push(e.slice(t, t + a));
|
|
2178
|
+
return o;
|
|
2179
|
+
}, ks = (e, t) => {
|
|
1920
2180
|
let n = [], r = t;
|
|
1921
2181
|
for (let [t, i] of Object.entries(e.fields)) {
|
|
1922
2182
|
let e = i;
|
|
1923
2183
|
e.nullable || e.hasDefault || e.idScheme !== void 0 || e.generatedAs !== void 0 || (r[t] === void 0 || r[t] === null) && n.push(t);
|
|
1924
2184
|
}
|
|
1925
2185
|
return n;
|
|
1926
|
-
},
|
|
2186
|
+
}, As = (e, t) => {
|
|
1927
2187
|
let n = t;
|
|
1928
2188
|
return e.filter((e) => n[e] === void 0 || n[e] === null);
|
|
1929
|
-
},
|
|
2189
|
+
}, js = (e, t, n) => e.insert(t.tableName, n), Ms = (e, t, n, r) => e.upsert(t.tableName, n, {
|
|
1930
2190
|
conflictColumns: r.conflictColumns,
|
|
1931
2191
|
...r.update === void 0 ? {} : { update: r.update }
|
|
1932
|
-
}),
|
|
2192
|
+
}), Ns = (e, t, n, r) => e.updateMany(t.tableName, n, { where: r.where }), Ps = 512, Fs = (e) => {
|
|
1933
2193
|
e.setMaxListeners(512);
|
|
1934
|
-
},
|
|
2194
|
+
}, Is = (e, t, n) => ({
|
|
1935
2195
|
_tag: "PrimaryKeyConflictError",
|
|
1936
2196
|
table: e,
|
|
1937
2197
|
key: t,
|
|
1938
2198
|
cause: n
|
|
1939
|
-
}),
|
|
2199
|
+
}), Ls = (e) => typeof e == "object" && !!e && e._tag === "PrimaryKeyConflictError", Rs = {
|
|
2200
|
+
postgres: 5432,
|
|
2201
|
+
mysql: 3306,
|
|
2202
|
+
mariadb: 3306,
|
|
2203
|
+
mssql: 1433
|
|
2204
|
+
}, zs = /* @__PURE__ */ new Set([
|
|
2205
|
+
"localhost",
|
|
2206
|
+
"127.0.0.1",
|
|
2207
|
+
"::1",
|
|
2208
|
+
"[::1]",
|
|
2209
|
+
"0.0.0.0"
|
|
2210
|
+
]), Bs = (e) => {
|
|
2211
|
+
let t = e.host, n = e.port, r = e.database;
|
|
2212
|
+
if (e.url !== void 0 && e.url !== "") try {
|
|
2213
|
+
let i = new URL(e.url);
|
|
2214
|
+
t ??= decodeURIComponent(i.hostname), n === void 0 && i.port !== "" && (n = Number(i.port)), r ??= decodeURIComponent(i.pathname.replace(/^\//, ""));
|
|
2215
|
+
} catch {
|
|
2216
|
+
return;
|
|
2217
|
+
}
|
|
2218
|
+
if (t === void 0 || t === "" || r === void 0 || r === "") return;
|
|
2219
|
+
let i = n ?? Rs[(e.dialect ?? "").toLowerCase()];
|
|
2220
|
+
if (i === void 0 || !Number.isFinite(i)) return;
|
|
2221
|
+
let a = t.toLowerCase();
|
|
2222
|
+
return {
|
|
2223
|
+
host: zs.has(a) ? "localhost" : a,
|
|
2224
|
+
port: i,
|
|
2225
|
+
database: r.toLowerCase()
|
|
2226
|
+
};
|
|
2227
|
+
}, Vs = (e) => {
|
|
2228
|
+
let t = Bs(e);
|
|
2229
|
+
if (t !== void 0) return jt("sha256").update(`${t.host}\u0000${t.port}\u0000${t.database}`).digest("hex").slice(0, 32);
|
|
2230
|
+
}, Hs = (e, t) => e === void 0 || t === void 0 ? "unknown" : e === t ? "same" : "different", Us = {
|
|
2231
|
+
app: 3,
|
|
2232
|
+
plugin: 2,
|
|
2233
|
+
framework: 1
|
|
2234
|
+
}, Ws = /* @__PURE__ */ new Map(), Gs = [], Ks = () => [...Gs], qs = (e) => {
|
|
1940
2235
|
if (!e.table || !e.timeColumn) throw Error("registerRetention: table + timeColumn are required");
|
|
1941
2236
|
if (!Number.isFinite(e.ttlMs) || e.ttlMs <= 0) throw Error(`registerRetention(${e.table}): ttlMs must be a positive number`);
|
|
1942
|
-
|
|
1943
|
-
|
|
2237
|
+
let t = e.source ?? "app", n = Ws.get(e.table);
|
|
2238
|
+
if (n !== void 0) {
|
|
2239
|
+
let r = n.source ?? "app", i = n.ttlMs !== e.ttlMs || n.where !== void 0 != (e.where !== void 0);
|
|
2240
|
+
if (Us[t] < Us[r]) {
|
|
2241
|
+
i && Gs.push({
|
|
2242
|
+
table: e.table,
|
|
2243
|
+
kept: {
|
|
2244
|
+
source: r,
|
|
2245
|
+
ttlMs: n.ttlMs
|
|
2246
|
+
},
|
|
2247
|
+
dropped: {
|
|
2248
|
+
source: t,
|
|
2249
|
+
ttlMs: e.ttlMs
|
|
2250
|
+
}
|
|
2251
|
+
});
|
|
2252
|
+
return;
|
|
2253
|
+
}
|
|
2254
|
+
i && r !== t && Gs.push({
|
|
2255
|
+
table: e.table,
|
|
2256
|
+
kept: {
|
|
2257
|
+
source: t,
|
|
2258
|
+
ttlMs: e.ttlMs
|
|
2259
|
+
},
|
|
2260
|
+
dropped: {
|
|
2261
|
+
source: r,
|
|
2262
|
+
ttlMs: n.ttlMs
|
|
2263
|
+
}
|
|
2264
|
+
});
|
|
2265
|
+
}
|
|
2266
|
+
Ws.set(e.table, {
|
|
2267
|
+
...e,
|
|
2268
|
+
source: t
|
|
2269
|
+
});
|
|
2270
|
+
}, Js = () => [...Ws.values()], Ys = () => {
|
|
2271
|
+
Ws.clear(), Gs.length = 0;
|
|
2272
|
+
}, Xs = async (e, t, n, r = 2e4) => {
|
|
1944
2273
|
let i = new Date(t - e.ttlMs), a = 0;
|
|
1945
2274
|
for (;;) {
|
|
1946
2275
|
let t = await n(e.table, e.timeColumn, i, r, e.where);
|
|
1947
2276
|
if (a += t, t < r) break;
|
|
1948
2277
|
}
|
|
1949
2278
|
return a;
|
|
1950
|
-
},
|
|
2279
|
+
}, Zs = (e, t) => {
|
|
1951
2280
|
let n = Number(e ?? String(t));
|
|
1952
2281
|
return (Number.isFinite(n) && n > 0 ? n : t) * 36e5;
|
|
1953
|
-
},
|
|
1954
|
-
id:
|
|
1955
|
-
replicaId:
|
|
1956
|
-
streamName:
|
|
1957
|
-
binlogFile:
|
|
1958
|
-
binlogPosition:
|
|
1959
|
-
updatedAt:
|
|
1960
|
-
}).index(["replicaId"]),
|
|
1961
|
-
id:
|
|
1962
|
-
replicaId:
|
|
1963
|
-
streamName:
|
|
1964
|
-
ctVersion:
|
|
1965
|
-
updatedAt:
|
|
1966
|
-
}).index(["replicaId"]),
|
|
2282
|
+
}, Qs = "_voltro_cdc_offsets", $s = w(Qs, {
|
|
2283
|
+
id: v({ prefix: "cdcoff" }),
|
|
2284
|
+
replicaId: D(),
|
|
2285
|
+
streamName: D(),
|
|
2286
|
+
binlogFile: D(),
|
|
2287
|
+
binlogPosition: D(),
|
|
2288
|
+
updatedAt: b()
|
|
2289
|
+
}).index(["replicaId"]), ec = w(Qs, {
|
|
2290
|
+
id: v({ prefix: "cdcoff" }),
|
|
2291
|
+
replicaId: D(),
|
|
2292
|
+
streamName: D(),
|
|
2293
|
+
ctVersion: D(),
|
|
2294
|
+
updatedAt: b()
|
|
2295
|
+
}).index(["replicaId"]), tc = "postgres";
|
|
1967
2296
|
//#endregion
|
|
1968
|
-
export {
|
|
2297
|
+
export { le as AUTO_FILLED_COLUMNS, Ts as BULK_INSERT_LIMITS, J as BranchNameInvalid, Oo as BranchTransitionInvalid, Qs as CDC_OFFSETS_TABLE, Ps as CHANGE_LISTENER_CEILING, o as ColumnBuilder, Ce as DEFAULT_ACQUIRE_TIMEOUT_MS, Ya as DEFAULT_EAGER_FALLBACK_WARN_INTERVAL_MS, yn as DEFAULT_SUBJECT_GRAPH_DEPTH, Rt as ENCRYPTED_PREFIX, tc as ENGINE, In as EagerCardinalityError, He as FILE_MIGRATION_PATTERN, ot as FRAMEWORK_LIVE_TABLES, zt as FieldDecryptionError, co as INITIAL_VERSION, Li as MATCHES_NO_ROWS, lt as MAX_IDENTIFIER_LENGTH, At as SqlClient, go as TableStreamError, Yn as TenantNamespaceInvalid, Jn as TenantNamespaceUnresolved, qo as TenantRegionUnavailable, Ko as TenantResidencyUnresolved, lo as VOLTRO_EXPIRES_MIXIN_ID, fo as VOLTRO_LOCAL_FIRST_MIXIN_ID, io as VersionConflict, Fe as WARN_IDENTIFIER_LENGTH, xs as _voltroApiKeysTable, $s as _voltroCdcOffsetsTable, ys as _voltroIdempotencyTable, bs as _voltroKvTable, vs as _voltroMigrationPlansTable, gs as _voltroMigrationsTable, ec as _voltroMssqlCdcOffsetsTable, _s as _voltroSeedsTable, Ci as actorsTable, Vo as admitBranch, De as allEnumRenames, gn as allRegisteredRelations, h as allRegisteredTables, Vi as and, pt as array, Pi as arrayContains, Ii as arrayHas, Fi as arrayOverlaps, Rn as attachEagerLoads, ca as attributionFields, fa as attributionKey, ss as auditAllTableIndexes, os as auditTableIndexes, ut as avg, gt as avgOver, xa as beginLocalWrite, he as bigint, ts as bindResidentStore, u as boolean, To as branchNamespaceName, Es as bulkInsertLimitsFor, c as bytes, ra as changeDelete, ta as changeInsert, ia as changeSoftDelete, na as changeUpdate, Os as chunkRowsForInsert, ha as claimPendingAttribution, dt as clearEnumRenames, wa as clearPendingAttribution, vn as clearRelationsRegistry, Zo as clearResidencyConfig, Ys as clearRetentions, ge as clearTableRegistry, Oa as clearWriteRecorders, rr as coercePredicateValue, ir as coercePredicateValues, $i as collectSubqueries, Ae as column, Gt as columnSchema, Ds as columnsPerRow, vr as compileEagerJson, I as compilePredicate, ar as compileRawFragment, _r as compileSelect, xo as computeEmbedding, Vs as connectionIdentity, Mi as contains, mt as count, fe as countDistinct, oe as crdtManagedColumns, Ke as crdtText, sa as currentWriteAttribution, a as databaseHandle, n as date, We as dbEnum, Ua as dbMetricTagCacheSizeForTests, Ka as dbOperationsInFlight, ne as decimal, _t as declareEnumRename, Nn as decodeRowsFromSchema, Wt as decryptFieldsOnRead, ms as defineMigration, Qe as defineMixin, it as defineSeed, ft as denseRank, En as deriveSubjectGraph, ke as deriveTypeIdPrefix, Lt as deserializeArraysOnRead, Le as drainIdentifierWarnings, ie as dropped, Fn as encodeRowForSchema, Ut as encryptFieldsForWrite, Ht as encryptedColumnsOf, Sa as endLocalWrite, Ro as enforceBranchLimits, be as ensureTableRegistered, wi as eq, or as escapeLike, Qi as evaluatePredicate, me as except, Ji as exists, uo as expires, Me as fireSchemaChangeSeeds, qe as fireTenantCreateSeeds, fs as formatIndexAuditIssue, Dn as formatSubjectGraph, Ss as frameworkTables, et as generateId, Ne as generateSnowflake, ce as geography, f as geometry, je as getEnumRenames, hn as getRelation, mn as getRelations, Xo as getResidencyConfig, p as getTable, Ei as gt, Di as gte, qn as hasEagerLoads, bo as hybridSearch, v as id, Ai as inSet, Ki as inSubquery, an as inferForeignKey, js as insertRow, C as integer, l as intersect, de as interval, Eo as isBranchNamespace, $t as isEmptyRelationsSpec, Vt as isEncrypted, Bt as isFieldDecryptionError, Oe as isFileMigration, Ze as isFrameworkOwnedLiveTable, mo as isLocalFirst, hs as isMigrationDefinition, Mo as isNeonConnection, zi as isNotNull, Ri as isNull, Ls as isPrimaryKeyConflictError, $o as isRegionServable, en as isRelationsSpec, ct as isSeedDefinition, Se as isSqliteFamily, x as isTableReactive, Ye as isView, O as json, Wi as jsonField, e as jsonIndex, s as lag, ae as lead, Ks as listRetentionConflicts, Js as listRetentions, po as localFirst, ho as localFirstTables, Oi as lt, ki as lte, Qa as makeEagerFallbackReporter, Go as makeNamespaceBranchExecutor, nn as many, rn as manyToMany, i as materializeFields, Ge as max, $e as migration, t as min, As as missingConflictColumns, ks as missingRequiredColumns, rt as mixin, Ti as neq, ko as nextBranchState, Bs as normaliseTarget, Ui as not, Yi as notExists, ji as notInSet, qi as notInSubquery, ye as numeric, Ja as observeDbOp, tn as one, Ln as oneCardinalityMessage, Hi as or, T as orderClausesOf, te as paginateBy, re as paginateById, Ta as pendingAttributionCount, Io as planBranch, Ao as planBranchProvision, jo as planBranchTeardown, Lo as planBranchTeardownFor, Po as planNeonBranchProvision, Fo as planNeonBranchTeardown, oo as planVersionedUpdate, ht as pluginRef, pe as pluginRefSpecOf, Is as primaryKeyConflictError, zo as provisionBranch, ns as provisionResidentTenant, er as qualifyTable, se as queryFor, Be as queryForView, Te as quoteIdent, Fs as raiseChangeListenerCeiling, d as rank, g as raw, _e as readableByColumns, xe as real, qa as recordDbOp, ka as recordsTable, m as reference, yi as registerCoreTables, pn as registerDiscoveredRelations, ma as registerPendingAttribution, fn as registerRelations, qs as registerRetention, nt as registerTable, Ea as registerWriteRecorder, Qt as relations, xi as requireActors, y as requireTable, Si as requireTenants, Ha as resetDbMetricTagCacheForTests, Je as resetSnowflake, es as residentPlacement, Nt as resolveActorSnapshot, No as resolveBranchMechanism, Za as resolveEagerFallbackWarnIntervalMs, Ca as resolveEchoAttribution, _ as resolveFullTextIndex, at as resolveIdScheme, Ue as resolveMixinGraph, Qo as resolveTenantHome, $n as resolveTenantNamespace, Zs as retentionTtlMsFromEnv, ee as rowNumber, Kt as rowSchema, no as runRetryingTransaction, ro as runStoreTransaction, oa as runWithWriteAttribution, Aa as runWriteRecorders, Hs as sameDatabase, Qn as sanitizeIdentifierFragment, It as serializeArraysForWrite, S as serverOnlyColumns, Yo as setResidencyConfig, Pe as setSchemaChangeSeedHook, Ie as setTenantCreateSeedHook, $a as settleTransactionExit, so as settleVersionedUpdate, Bi as spatialPredicate, Cs as stampGeneratedId, ws as stampGeneratedIds, Ni as startsWith, yo as streamTable, ue as sum, vt as sumOver, Xs as sweepRetention, w as table, Bo as teardownBranch, D as text, b as timestamp, yt as timestampMs, bt as timestampMsOrNull, r as union, ve as unionAll, Da as unregisterWriteRecorder, Ns as updateManyRow, Ms as upsertRow, tt as validateColumnName, Xe as validateIndexName, _n as validateRegisteredRelations, ln as validateRelationConfig, Ve as validateTableName, ze as validateTypeIdPrefix, we as vector, st as vectorDistanceToOpclass, So as vectorEmbedding, ao as versionColumnOf, Re as view, Ee as viewSql, ea as walkLeaves, la as withCapturedAttribution };
|