@voltro/database 0.4.0 → 0.6.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/dist/index.js CHANGED
@@ -1,14 +1,14 @@
1
- import { $ as e, A as t, B as n, C as r, Ct as i, D as a, Dt as o, E as s, Et as c, F as l, G as u, H as d, I as f, J as p, K as m, L as h, M as g, N as _, O as ee, Ot as v, P as y, Q as b, R as x, S as te, St as S, T as C, Tt as ne, U as re, V as ie, W as ae, X as oe, Y as se, Z as ce, _ as le, _t as ue, a as de, at as fe, b as pe, bt as me, c as he, ct as ge, d as _e, dt as ve, et as ye, f as be, ft as xe, g as Se, gt as Ce, h as we, ht as Te, i as w, it as Ee, j as De, k as Oe, kt as ke, l as Ae, lt as je, m as Me, mt as Ne, n as Pe, nt as Fe, o as Ie, ot as Le, p as Re, pt as ze, q as Be, r as Ve, rt as He, s as Ue, st as We, t as Ge, tt as Ke, u as qe, ut as Je, v as Ye, vt as T, w as Xe, wt as Ze, x as Qe, xt as E, y as $e, yt as D, z as et } from "./fileBased-CRXgPJkv.js";
2
- import { Chunk as tt, Data as nt, Effect as rt, Option as O, Stream as it } from "effect";
3
- import { ansi as k } from "@voltro/logger";
1
+ import { $ as e, A as t, At as n, B as r, C as i, Ct as a, D as o, Dt as s, E as c, Et as l, F as u, G as d, H as f, I as p, J as m, K as h, L as g, M as ee, N as te, O as _, Ot as v, P as y, Q as b, R as ne, S as x, St as S, T as re, Tt as ie, U as ae, V as C, W as oe, X as se, Y as ce, Z as le, _ as ue, _t as de, a as fe, at as pe, b as me, bt as w, c as he, ct as ge, d as _e, dt as ve, et as ye, f as be, ft as xe, g as Se, gt as Ce, h as we, ht as Te, i as T, it as Ee, j as De, k as Oe, kt as E, l as ke, lt as Ae, m as je, mt as Me, n as Ne, nt as Pe, o as Fe, ot as Ie, p as Le, pt as Re, q as ze, r as Be, rt as Ve, s as He, st as Ue, t as We, tt as Ge, u as Ke, ut as qe, v as Je, vt as Ye, w as Xe, wt as Ze, x as Qe, xt as $e, y as et, yt as D, z as tt } from "./fileBased-Cc-F1oFv.js";
2
+ import { Chunk as nt, Data as rt, Effect as it, Option as O, Schema as k, Stream as at } from "effect";
3
+ import { ansi as A } from "@voltro/logger";
4
4
  //#region src/arrayCodec.ts
5
- var at = (e) => e === "mysql" || e === "mariadb" || e === "mssql" || e === "sqlite", ot = (e) => {
5
+ var ot = (e) => e === "mysql" || e === "mariadb" || e === "mssql" || e === "sqlite", st = (e) => {
6
6
  let t = [];
7
7
  for (let [n, r] of Object.entries(e.fields)) r.type === "array" && t.push(n);
8
8
  return t;
9
- }, st = (e, t, n) => {
10
- if (!at(n) || !t) return e;
11
- let r = ot(t);
9
+ }, ct = (e, t, n) => {
10
+ if (!ot(n) || !t) return e;
11
+ let r = st(t);
12
12
  if (r.length === 0) return e;
13
13
  let i = { ...e };
14
14
  for (let e of r) {
@@ -16,9 +16,9 @@ var at = (e) => e === "mysql" || e === "mariadb" || e === "mssql" || e === "sqli
16
16
  Array.isArray(t) && (i[e] = JSON.stringify(t));
17
17
  }
18
18
  return i;
19
- }, ct = (e, t, n) => {
20
- if (!at(n) || !t) return e;
21
- let r = ot(t);
19
+ }, lt = (e, t, n) => {
20
+ if (!ot(n) || !t) return e;
21
+ let r = st(t);
22
22
  return r.length === 0 ? e : e.map((e) => {
23
23
  let t;
24
24
  for (let n of r) {
@@ -30,61 +30,86 @@ var at = (e) => e === "mysql" || e === "mariadb" || e === "mssql" || e === "sqli
30
30
  }
31
31
  return t ?? e;
32
32
  });
33
- }, lt = "enc:v1:", ut = (e) => typeof e == "string" && e.startsWith("enc:v1:"), dt = (e) => {
33
+ }, ut = "enc:v1:", dt = (e) => typeof e == "string" && e.startsWith("enc:v1:"), ft = (e) => {
34
34
  let t = [];
35
35
  for (let [n, r] of Object.entries(e.fields)) r.encrypted === !0 && t.push(n);
36
36
  return t;
37
- }, ft = (e, t, n) => {
37
+ }, pt = (e, t, n) => {
38
38
  if (!t) return e;
39
- let r = dt(t);
39
+ let r = ft(t);
40
40
  if (r.length === 0) return e;
41
41
  let i = { ...e };
42
42
  for (let e of r) {
43
43
  let r = i[e];
44
- if (!(r == null || ut(r))) {
44
+ if (!(r == null || dt(r))) {
45
45
  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)`);
46
46
  i[e] = n.encrypt(JSON.stringify(r));
47
47
  }
48
48
  }
49
49
  return i;
50
- }, pt = (e, t, n) => {
50
+ }, mt = (e, t, n) => {
51
51
  if (!t) return e;
52
- let r = dt(t);
52
+ let r = ft(t);
53
53
  return r.length === 0 || !n ? e : e.map((e) => {
54
54
  let t;
55
55
  for (let i of r) {
56
56
  let r = e[i];
57
- ut(r) && (t ??= { ...e }, t[i] = JSON.parse(n.decrypt(r)));
57
+ dt(r) && (t ??= { ...e }, t[i] = JSON.parse(n.decrypt(r)));
58
58
  }
59
59
  return t ?? e;
60
60
  });
61
- }, mt = (e) => typeof e == "function" ? e : () => e, ht = (e, t) => ({
61
+ }, ht = (e) => {
62
+ let t = (() => {
63
+ switch (e.type) {
64
+ case "id":
65
+ case "reference":
66
+ case "text":
67
+ case "enum": return k.String;
68
+ case "integer":
69
+ case "real":
70
+ case "decimal": return k.Number;
71
+ case "boolean": return k.Boolean;
72
+ case "timestamp":
73
+ case "date": return k.DateFromNumber;
74
+ case "bigint": return k.BigInt;
75
+ case "bytes": return k.Uint8ArrayFromSelf;
76
+ case "array": return k.Array(k.Unknown);
77
+ case "interval": return k.String;
78
+ default: return k.Unknown;
79
+ }
80
+ })();
81
+ return e.nullable === !0 ? k.NullOr(t) : t;
82
+ }, gt = (e, t) => {
83
+ let n = new Set(t?.omit ?? []), r = {};
84
+ for (let [t, i] of Object.entries(e.fields)) n.has(t) || (r[t] = ht(i));
85
+ return k.Struct(r);
86
+ }, _t = (e) => typeof e == "function" ? e : () => e, vt = (e, t) => ({
62
87
  kind: "one",
63
- target: mt(e),
88
+ target: _t(e),
64
89
  ...t?.foreignKey === void 0 ? {} : { foreignKey: t.foreignKey },
65
90
  ...t?.sourceKey === void 0 ? {} : { sourceKey: t.sourceKey }
66
- }), gt = (e, t) => ({
91
+ }), yt = (e, t) => ({
67
92
  kind: "many",
68
- target: mt(e),
93
+ target: _t(e),
69
94
  ...t?.foreignKey === void 0 ? {} : { foreignKey: t.foreignKey },
70
95
  ...t?.sourceKey === void 0 ? {} : { sourceKey: t.sourceKey }
71
- }), _t = (e, t) => ({
96
+ }), bt = (e, t) => ({
72
97
  kind: "manyToMany",
73
- target: mt(e),
74
- through: mt(t.through),
98
+ target: _t(e),
99
+ through: _t(t.through),
75
100
  sourceKey: t.sourceKey,
76
101
  targetKey: t.targetKey
77
- }), vt = {
78
- one: ht,
79
- many: gt,
80
- manyToMany: _t
81
- }, yt = (e, t) => {
102
+ }), xt = {
103
+ one: vt,
104
+ many: yt,
105
+ manyToMany: bt
106
+ }, St = (e, t) => {
82
107
  let n = typeof e == "function" ? e : () => e;
83
108
  return {
84
109
  source: n,
85
- relations: t(vt, n())
110
+ relations: t(xt, n())
86
111
  };
87
- }, bt = (e) => {
112
+ }, Ct = (e) => {
88
113
  if (typeof e != "object" || !e) return !1;
89
114
  let t = e;
90
115
  if (typeof t.source != "function" || typeof t.relations != "object" || t.relations === null) return !1;
@@ -93,40 +118,64 @@ var at = (e) => e === "mysql" || e === "mariadb" || e === "mssql" || e === "sqli
93
118
  let t = e?.kind;
94
119
  return t === "one" || t === "many" || t === "manyToMany";
95
120
  });
96
- }, xt = ht, St = gt, Ct = _t, A = (e, t, n) => {
121
+ }, wt = vt, Tt = yt, Et = bt, j = (e, t, n) => {
97
122
  let r = [];
98
123
  for (let [n, i] of Object.entries(e.fields)) i.type === "reference" && i.references?.()?.tableName === t && r.push(n);
99
124
  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>' }.`);
100
125
  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.`);
101
126
  return r[0];
102
- }, wt = Symbol.for("@voltro/database/relationsRegistry"), Tt = globalThis, j = Tt[wt] ?? (Tt[wt] = /* @__PURE__ */ new Map()), Et = (e) => {
103
- let t = e.source(), n = j.get(t.tableName);
127
+ }, Dt = (e) => Object.keys(e.fields), M = (e, t) => Object.prototype.hasOwnProperty.call(e.fields, t), Ot = (e) => {
128
+ let t = Dt(e);
129
+ return t.length === 0 ? "<none>" : t.join(", ");
130
+ }, kt = (e, t, n) => {
131
+ let r = `relation '${t}' on '${e.tableName}'`, i = n.target();
132
+ if (n.kind === "manyToMany") {
133
+ let t = n.through();
134
+ for (let [a, o] of [["sourceKey", n.sourceKey], ["targetKey", n.targetKey]]) if (!M(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}': ${Ot(t)}.`);
135
+ return;
136
+ }
137
+ 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.`);
138
+ if (n.sourceKey !== void 0 && !M(e, n.sourceKey)) {
139
+ let t = M(i, n.sourceKey);
140
+ 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}': ${Ot(e)}.`));
141
+ }
142
+ if (n.foreignKey !== void 0 && !M(i, n.foreignKey)) {
143
+ let t = M(e, n.foreignKey);
144
+ 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}': ${Ot(i)}.`));
145
+ }
146
+ }, At = Symbol.for("@voltro/database/relationsRegistry"), jt = globalThis, N = jt[At] ?? (jt[At] = /* @__PURE__ */ new Map()), Mt = (e) => {
147
+ let t = e.source(), n = N.get(t.tableName);
104
148
  if (n === void 0) {
105
- j.set(t.tableName, new Map(Object.entries(e.relations)));
149
+ N.set(t.tableName, new Map(Object.entries(e.relations)));
106
150
  return;
107
151
  }
108
152
  for (let [r, i] of Object.entries(e.relations)) {
109
153
  if (n.has(r)) throw Error(`duplicate relation '${r}' on '${t.tableName}': two relations() blocks both declare it. Pick distinct names or merge them into one block.`);
110
154
  n.set(r, i);
111
155
  }
112
- }, Dt = (e) => {
156
+ }, Nt = (e) => {
113
157
  let t = 0;
114
- for (let n of Object.values(e)) bt(n) && (Et(n), t += 1);
158
+ for (let n of Object.values(e)) Ct(n) && (Mt(n), t += 1);
115
159
  return t;
116
- }, M = (e) => {
117
- let t = j.get(e);
160
+ }, Pt = (e) => {
161
+ let t = N.get(e);
118
162
  if (t !== void 0) return Object.fromEntries(t);
119
- }, Ot = (e, t) => j.get(e)?.get(t), kt = () => {
163
+ }, Ft = (e, t) => N.get(e)?.get(t), It = () => {
120
164
  let e = [];
121
- for (let [t, n] of j) for (let [r, i] of n) e.push({
165
+ for (let [t, n] of N) for (let [r, i] of n) e.push({
122
166
  source: t,
123
167
  name: r,
124
168
  relation: i
125
169
  });
126
170
  return e;
127
- }, At = () => {
128
- j.clear();
129
- }, jt = (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, Mt = (e) => {
171
+ }, Lt = () => {
172
+ for (let [e, t] of N) {
173
+ let n = u(e);
174
+ if (n !== void 0) for (let [e, r] of t) kt(n, e, r);
175
+ }
176
+ }, Rt = () => {
177
+ N.clear();
178
+ }, zt = (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, Bt = (e) => {
130
179
  if (e == null || typeof e != "string") return e;
131
180
  let t = e.trim();
132
181
  if (t.length === 0) return e;
@@ -137,7 +186,7 @@ var at = (e) => e === "mysql" || e === "mariadb" || e === "mssql" || e === "sqli
137
186
  } catch {
138
187
  return e;
139
188
  }
140
- }, Nt = (e) => e == null || typeof e == "string" ? e : typeof e == "number" || typeof e == "bigint" ? String(e) : e, Pt = (e) => {
189
+ }, Vt = (e) => e == null || typeof e == "string" ? e : typeof e == "number" || typeof e == "bigint" ? String(e) : e, Ht = (e) => {
141
190
  if (e == null || e instanceof Date) return e;
142
191
  if (typeof e == "string") {
143
192
  let t = new Date(e);
@@ -148,21 +197,21 @@ var at = (e) => e === "mysql" || e === "mariadb" || e === "mssql" || e === "sqli
148
197
  return isNaN(t.getTime()) ? e : t;
149
198
  }
150
199
  return e;
151
- }, Ft = (e, t, n) => {
200
+ }, Ut = (e, t, n) => {
152
201
  if (e == null) return e;
153
202
  switch (t) {
154
- case "boolean": return n === "postgres" ? e : jt(e);
203
+ case "boolean": return n === "postgres" ? e : zt(e);
155
204
  case "json":
156
- case "array": return n === "postgres" ? e : Mt(e);
205
+ case "array": return n === "postgres" ? e : Bt(e);
157
206
  case "timestamp":
158
- case "date": return n === "sqlite" || n === "turso" ? Pt(e) : e;
207
+ case "date": return n === "sqlite" || n === "turso" ? Ht(e) : e;
159
208
  case "decimal":
160
- case "bigint": return Nt(e);
209
+ case "bigint": return Vt(e);
161
210
  default: return e;
162
211
  }
163
- }, It = (e, t, n) => {
212
+ }, Wt = (e, t, n) => {
164
213
  if (e.length === 0) return e;
165
- let r = y(t);
214
+ let r = u(t);
166
215
  if (r === void 0) return e;
167
216
  let i = r.fields, a = [];
168
217
  for (let [e, t] of Object.entries(i)) a.push({
@@ -171,28 +220,36 @@ var at = (e) => e === "mysql" || e === "mariadb" || e === "mssql" || e === "sqli
171
220
  });
172
221
  return e.map((e) => {
173
222
  let t = { ...e };
174
- for (let { key: e, type: r } of a) e in t && (t[e] = Ft(t[e], r, n));
223
+ for (let { key: e, type: r } of a) e in t && (t[e] = Ut(t[e], r, n));
175
224
  return t;
176
225
  });
177
- }, Lt = (e, t) => {
226
+ }, Gt = (e, t) => {
178
227
  if (e == null) return e;
179
228
  switch (t) {
180
229
  case "json":
181
230
  case "array": return typeof e == "string" ? e : JSON.stringify(e);
182
231
  default: return e;
183
232
  }
184
- }, Rt = (e, t, n = ["json", "array"]) => {
185
- let r = y(t);
233
+ }, Kt = (e, t, n = ["json", "array"]) => {
234
+ let r = u(t);
186
235
  if (r === void 0) return e;
187
236
  let i = r.fields, a = null;
188
237
  for (let [t, r] of Object.entries(i)) if (n.includes(r.type) && t in e) {
189
- let n = Lt(e[t], r.type);
238
+ let n = Gt(e[t], r.type);
190
239
  n !== e[t] && (a === null && (a = { ...e }), a[t] = n);
191
240
  }
192
241
  return a ?? e;
193
- }, zt = async (e, t, n, r) => {
242
+ }, qt = class extends Error {
243
+ _tag = "EagerCardinalityError";
244
+ constructor(e) {
245
+ super(e), this.name = "EagerCardinalityError";
246
+ }
247
+ }, Jt = (e) => {
248
+ let { relationName: t, sourceTableName: n, targetTableName: r, foreignKey: i, sourceKey: a } = e, o = r === n;
249
+ 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.");
250
+ }, Yt = async (e, t, n, r) => {
194
251
  if (e.length === 0) return e;
195
- let i = M(n.tableName);
252
+ let i = Pt(n.tableName);
196
253
  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?`);
197
254
  let a = e.map((e) => ({ ...e }));
198
255
  for (let [e, o] of Object.entries(t)) {
@@ -201,41 +258,51 @@ var at = (e) => e === "mysql" || e === "mariadb" || e === "mssql" || e === "sqli
201
258
  let t = Object.keys(i).join(", ") || "<none>";
202
259
  throw Error(`unknown relation '${e}' on '${n.tableName}'. Registered relations: ${t}.`);
203
260
  }
204
- await Bt(a, e, t, o === !0 ? {} : o, n, r);
261
+ kt(n, e, t), await Xt(a, e, t, o === !0 ? {} : o, n, r);
205
262
  }
206
263
  return a;
207
- }, Bt = async (e, t, n, r, i, a) => {
264
+ }, Xt = async (e, t, n, r, i, a) => {
208
265
  switch (n.kind) {
209
266
  case "one":
210
- await Vt(e, t, n, r, i, a);
267
+ await Zt(e, t, n, r, i, a);
211
268
  return;
212
269
  case "many":
213
- await Ht(e, t, n, r, i, a);
270
+ await Qt(e, t, n, r, i, a);
214
271
  return;
215
272
  case "manyToMany":
216
- await Wt(e, t, n, r, i, a);
273
+ await en(e, t, n, r, i, a);
217
274
  return;
218
275
  }
219
- }, Vt = async (e, t, n, r, i, a) => {
220
- let o = n.target(), s = n.sourceKey ?? Gt(i, o.tableName);
276
+ }, Zt = async (e, t, n, r, i, a) => {
277
+ let o = n.target(), s = n.sourceKey ?? tn(i, o.tableName);
221
278
  if (s !== void 0) {
222
- let n = N(e, s), i = n.length === 0 ? [] : await P(o, "id", n, r, a), c = new Map(i.map((e) => [e.id, e]));
279
+ let n = P(e, s), i = n.length === 0 ? [] : await nn(o, "id", n, r, a), c = new Map(i.map((e) => [e.id, e]));
223
280
  for (let n of e) {
224
281
  let e = n[s];
225
282
  n[t] = e == null ? null : c.get(e) ?? null;
226
283
  }
227
- await F(i, r.with, o, a);
284
+ await rn(i, r.with, o, a);
228
285
  return;
229
286
  }
230
- let c = n.foreignKey ?? A(o, i.tableName, t), l = n.sourceKey ?? "id", u = N(e, l), d = u.length === 0 ? [] : await P(o, c, u, r, a), f = /* @__PURE__ */ new Map();
231
- for (let e of d) f.set(e[c], e);
287
+ let c = n.foreignKey ?? j(o, i.tableName, t), l = n.sourceKey ?? "id", u = P(e, l), d = u.length === 0 ? [] : await nn(o, c, u, r, a), f = /* @__PURE__ */ new Map();
288
+ for (let e of d) {
289
+ let n = e[c];
290
+ if (f.has(n)) throw new qt(Jt({
291
+ relationName: t,
292
+ sourceTableName: i.tableName,
293
+ targetTableName: o.tableName,
294
+ foreignKey: c,
295
+ sourceKey: l
296
+ }));
297
+ f.set(n, e);
298
+ }
232
299
  for (let n of e) {
233
300
  let e = n[l];
234
301
  n[t] = e == null ? null : f.get(e) ?? null;
235
302
  }
236
- await F(d, r.with, o, a);
237
- }, Ht = async (e, t, n, r, i, a) => {
238
- let o = n.target(), s = n.foreignKey ?? A(o, i.tableName, t), c = n.sourceKey ?? "id", l = N(e, c), u = Ut(r), d = l.length === 0 ? [] : await P(o, s, l, u, a), f = /* @__PURE__ */ new Map();
303
+ await rn(d, r.with, o, a);
304
+ }, Qt = async (e, t, n, r, i, a) => {
305
+ let o = n.target(), s = n.foreignKey ?? j(o, i.tableName, t), c = n.sourceKey ?? "id", l = P(e, c), u = $t(r), d = l.length === 0 ? [] : await nn(o, s, l, u, a), f = /* @__PURE__ */ new Map();
239
306
  for (let e of d) {
240
307
  let t = e[s], n = f.get(t);
241
308
  n ? n.push(e) : f.set(t, [e]);
@@ -251,12 +318,12 @@ var at = (e) => e === "mysql" || e === "mariadb" || e === "mssql" || e === "sqli
251
318
  let e = n[c];
252
319
  n[t] = f.get(e) ?? [];
253
320
  }
254
- await F(d, r.with, o, a);
255
- }, Ut = (e) => {
321
+ await rn(d, r.with, o, a);
322
+ }, $t = (e) => {
256
323
  let { limit: t, offset: n, ...r } = e;
257
324
  return r;
258
- }, Wt = async (e, t, n, r, i, a) => {
259
- let o = n.target(), s = n.through(), c = N(e, "id");
325
+ }, en = async (e, t, n, r, i, a) => {
326
+ let o = n.target(), s = n.through(), c = P(e, "id");
260
327
  if (c.length === 0) {
261
328
  for (let n of e) n[t] = [];
262
329
  return;
@@ -277,25 +344,29 @@ var at = (e) => e === "mysql" || e === "mariadb" || e === "mssql" || e === "sqli
277
344
  for (let n of e) n[t] = [];
278
345
  return;
279
346
  }
280
- let f = await P(o, "id", N(d, n.targetKey), r, a), p = new Map(f.map((e) => [e.id, e])), m = /* @__PURE__ */ new Map();
347
+ let f = await nn(o, "id", P(d, n.targetKey), r, a), p = new Map(f.map((e) => [e.id, e]));
348
+ await rn(f, r.with, o, a);
349
+ let m = r.junction === void 0 ? void 0 : r.junction === !0 ? Object.keys(s.fields) : r.junction, h = /* @__PURE__ */ new Map();
281
350
  for (let e of d) {
282
351
  let t = e[n.sourceKey], r = e[n.targetKey], i = p.get(r);
283
352
  if (i === void 0) continue;
284
- let a = m.get(t);
285
- a ? a.push(i) : m.set(t, [i]);
353
+ let a = m === void 0 ? i : {
354
+ ...i,
355
+ _junction: Object.fromEntries(m.map((t) => [t, e[t]]))
356
+ }, o = h.get(t);
357
+ o ? o.push(a) : h.set(t, [a]);
286
358
  }
287
- for (let n of e) n[t] = m.get(n.id) ?? [];
288
- await F(f, r.with, o, a);
289
- }, Gt = (e, t) => {
359
+ for (let n of e) n[t] = h.get(n.id) ?? [];
360
+ }, tn = (e, t) => {
290
361
  for (let [n, r] of Object.entries(e.fields)) if (r.type === "reference" && r.references?.()?.tableName === t) return n;
291
- }, N = (e, t) => {
362
+ }, P = (e, t) => {
292
363
  let n = /* @__PURE__ */ new Set();
293
364
  for (let r of e) {
294
365
  let e = r[t];
295
366
  e != null && n.add(e);
296
367
  }
297
368
  return [...n];
298
- }, P = (e, t, n, r, i) => {
369
+ }, nn = (e, t, n, r, i) => {
299
370
  let a = {
300
371
  column: t,
301
372
  op: "in",
@@ -309,54 +380,54 @@ var at = (e) => e === "mysql" || e === "mariadb" || e === "mssql" || e === "sqli
309
380
  skip: r.offset,
310
381
  projection: void 0
311
382
  });
312
- }, F = async (e, t, n, r) => {
313
- t !== void 0 && e.length !== 0 && (await zt(e, t, n, r)).forEach((t, n) => {
383
+ }, rn = async (e, t, n, r) => {
384
+ t !== void 0 && e.length !== 0 && (await Yt(e, t, n, r)).forEach((t, n) => {
314
385
  let r = e[n];
315
386
  for (let [e, n] of Object.entries(t)) e in r || (r[e] = n);
316
387
  });
317
- }, Kt = (e) => e.eager !== void 0 && Object.keys(e.eager).length > 0, qt = class extends Error {
388
+ }, an = (e) => e.eager !== void 0 && Object.keys(e.eager).length > 0, on = class extends Error {
318
389
  _tag = "TenantNamespaceUnresolved";
319
390
  constructor(e) {
320
391
  super(e), this.name = "TenantNamespaceUnresolved";
321
392
  }
322
- }, Jt = class extends Error {
393
+ }, sn = class extends Error {
323
394
  _tag = "TenantNamespaceInvalid";
324
395
  constructor(e) {
325
396
  super(e), this.name = "TenantNamespaceInvalid";
326
397
  }
327
- }, Yt = 63, Xt = "tenant_", Zt = (e) => e.toLowerCase().replace(/[^a-z0-9_]/g, "_"), Qt = (e) => {
328
- if (e == null || e === "") throw new qt("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.");
329
- let t = Zt(e);
330
- if (t.replace(/_/g, "") === "") throw new Jt(`tenant id '${e}' has no usable identifier characters after sanitisation — cannot derive a distinct namespace.`);
331
- let n = `${Xt}${t}`;
332
- if (n.length > Yt) throw new Jt(`namespace '${n}' for tenant '${e}' exceeds the ${Yt}-byte identifier limit. Use a shorter tenant id.`);
398
+ }, cn = 63, ln = "tenant_", un = (e) => e.toLowerCase().replace(/[^a-z0-9_]/g, "_"), dn = (e) => {
399
+ if (e == null || e === "") throw new on("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.");
400
+ let t = un(e);
401
+ if (t.replace(/_/g, "") === "") throw new sn(`tenant id '${e}' has no usable identifier characters after sanitisation — cannot derive a distinct namespace.`);
402
+ let n = `${ln}${t}`;
403
+ if (n.length > cn) throw new sn(`namespace '${n}' for tenant '${e}' exceeds the ${cn}-byte identifier limit. Use a shorter tenant id.`);
333
404
  return n;
334
- }, I = (e, t) => e === null ? t : `${e}.${t}`, $t = (e, t) => {
405
+ }, F = (e, t) => e === null ? t : `${e}.${t}`, fn = (e, t) => {
335
406
  let { strings: n, values: r } = e, i = t.unsafe(n[0] ?? "");
336
407
  for (let e = 0; e < r.length; e++) i = t`${i}${r[e]}${t.unsafe(n[e + 1] ?? "")}`;
337
408
  return t`${i}`;
338
- }, L = (e) => e.replace(/[\\%_]/g, (e) => `\\${e}`), R = (e, t, n = null) => {
339
- if ("not" in e) return t`NOT (${R(e.not, t, n)})`;
340
- if ("and" in e) return e.and.length === 0 ? t`TRUE` : t.and(e.and.map((e) => R(e, t, n)));
341
- if ("or" in e) return e.or.length === 0 ? t`FALSE` : t.or(e.or.map((e) => R(e, t, n)));
409
+ }, I = (e) => e.replace(/[\\%_]/g, (e) => `\\${e}`), L = (e, t, n = null) => {
410
+ if ("not" in e) return t`NOT (${L(e.not, t, n)})`;
411
+ if ("and" in e) return e.and.length === 0 ? t`TRUE` : t.and(e.and.map((e) => L(e, t, n)));
412
+ if ("or" in e) return e.or.length === 0 ? t`FALSE` : t.or(e.or.map((e) => L(e, t, n)));
342
413
  if (e.op === "subquery-in" || e.op === "subquery-not-in") {
343
- let r = e, i = z(r.subquery, t, n);
414
+ let r = e, i = R(r.subquery, t, n);
344
415
  return r.op === "subquery-in" ? t`${t(r.column)} IN (${i})` : t`${t(r.column)} NOT IN (${i})`;
345
416
  }
346
417
  if (e.op === "exists" || e.op === "not-exists") {
347
- let r = e, i = z(r.subquery, t, n);
418
+ let r = e, i = R(r.subquery, t, n);
348
419
  return r.op === "exists" ? t`EXISTS (${i})` : t`NOT EXISTS (${i})`;
349
420
  }
350
421
  let r = e, i = t(r.column), a = r.path, o = a !== void 0 && a.length > 0, s = () => t.onDialectOrElse({
351
- mysql: () => t.unsafe(w(r.column, a, "mysql")),
352
- mssql: () => t.unsafe(w(r.column, a, "mssql")),
353
- sqlite: () => t.unsafe(w(r.column, a, "sqlite")),
354
- orElse: () => t.unsafe(w(r.column, a, "postgres"))
422
+ mysql: () => t.unsafe(T(r.column, a, "mysql")),
423
+ mssql: () => t.unsafe(T(r.column, a, "mssql")),
424
+ sqlite: () => t.unsafe(T(r.column, a, "sqlite")),
425
+ orElse: () => t.unsafe(T(r.column, a, "postgres"))
355
426
  }), c = () => t.onDialectOrElse({
356
- mysql: () => t.unsafe(w(r.column, a, "mysql", { numeric: !0 })),
357
- mssql: () => t.unsafe(w(r.column, a, "mssql", { numeric: !0 })),
358
- sqlite: () => t.unsafe(w(r.column, a, "sqlite", { numeric: !0 })),
359
- orElse: () => t.unsafe(w(r.column, a, "postgres", { numeric: !0 }))
427
+ mysql: () => t.unsafe(T(r.column, a, "mysql", { numeric: !0 })),
428
+ mssql: () => t.unsafe(T(r.column, a, "mssql", { numeric: !0 })),
429
+ sqlite: () => t.unsafe(T(r.column, a, "sqlite", { numeric: !0 })),
430
+ orElse: () => t.unsafe(T(r.column, a, "postgres", { numeric: !0 }))
360
431
  }), l = o ? s() : i, u = o ? c() : i, d = (e) => o && e != null ? String(e) : e, f = (e) => o ? Number(e) : e;
361
432
  switch (r.op) {
362
433
  case "eq": return t`${l} = ${d(r.value)}`;
@@ -374,7 +445,7 @@ var at = (e) => e === "mysql" || e === "mariadb" || e === "mssql" || e === "sqli
374
445
  return e.length === 0 ? t`TRUE` : t`${l} NOT IN ${t.in(o ? e.map((e) => d(e)) : e)}`;
375
446
  }
376
447
  case "contains": {
377
- let e = `%${L(typeof r.value == "string" ? r.value : String(r.value ?? ""))}%`;
448
+ let e = `%${I(typeof r.value == "string" ? r.value : String(r.value ?? ""))}%`;
378
449
  return t.onDialectOrElse({
379
450
  mysql: () => t`LOWER(${l}) LIKE LOWER(${e})`,
380
451
  mssql: () => t`LOWER(${l}) LIKE LOWER(${e})`,
@@ -424,13 +495,13 @@ var at = (e) => e === "mysql" || e === "mariadb" || e === "mssql" || e === "sqli
424
495
  });
425
496
  }
426
497
  }
427
- }, en = (e, t) => {
498
+ }, pn = (e, t) => {
428
499
  let n = [];
429
500
  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}`);
430
- }, tn = (e, t) => t.csv(e.map((e) => {
501
+ }, mn = (e, t) => t.csv(e.map((e) => {
431
502
  let n = e.column === void 0 ? t.unsafe("*") : t`${t(e.column)}`;
432
503
  if (e.op.startsWith("window-")) {
433
- let r = en(e.window ?? {}, t);
504
+ let r = pn(e.window ?? {}, t);
434
505
  switch (e.op) {
435
506
  case "window-row-number": return t`ROW_NUMBER() OVER (${r}) AS ${t(e.alias)}`;
436
507
  case "window-rank": return t`RANK() OVER (${r}) AS ${t(e.alias)}`;
@@ -454,43 +525,43 @@ var at = (e) => e === "mysql" || e === "mariadb" || e === "mssql" || e === "sqli
454
525
  return t`${t(e.column)} AS ${t(e.alias)}`;
455
526
  default: throw Error(`compileAggregateProjection: unknown op '${e.op}'`);
456
527
  }
457
- })), nn = (e) => `[${e.join(",")}]`, rn = (e, t) => {
528
+ })), hn = (e) => `[${e.join(",")}]`, gn = (e, t) => {
458
529
  if (e.queryVector === void 0) return null;
459
- let n = t(e.column), r = nn(e.queryVector), i = e.distance === "cosine" ? "<=>" : e.distance === "l2" ? "<->" : "<#>", a = e.distance === "cosine" ? "VEC_DISTANCE_COSINE" : "VEC_DISTANCE_EUCLIDEAN";
530
+ let n = t(e.column), r = hn(e.queryVector), i = e.distance === "cosine" ? "<=>" : e.distance === "l2" ? "<->" : "<#>", a = e.distance === "cosine" ? "VEC_DISTANCE_COSINE" : "VEC_DISTANCE_EUCLIDEAN";
460
531
  return t.onDialectOrElse({
461
532
  mysql: () => t`${t.unsafe(a)}(${n}, ${r})`,
462
533
  mssql: () => t`NULL`,
463
534
  sqlite: () => t`NULL`,
464
535
  orElse: () => t`${n} ${t.unsafe(i)} ${r}::vector`
465
536
  });
466
- }, an = (e, t) => {
537
+ }, _n = (e, t) => {
467
538
  let n = t.unsafe(e.useGeography ? "::geography" : "::geometry");
468
539
  return t`ST_Distance(${t(e.column)}${n}, ${e.geom}${n})`;
469
- }, on = (e, t) => t`${t(e.column)} <-> ${e.geom}::geometry`, sn = (e, t) => t`${t(`${e.indexName}_tsv`)}`, cn = (e, t) => `${t}_${e.indexName}_fts`, ln = (e, t, n) => {
470
- let r = n.csv(e.columns.map((e) => n`${n(e)}`)), i = `%${L(e.query)}%`;
540
+ }, vn = (e, t) => t`${t(e.column)} <-> ${e.geom}::geometry`, yn = (e, t) => t`${t(`${e.indexName}_tsv`)}`, bn = (e, t) => `${t}_${e.indexName}_fts`, xn = (e, t, n) => {
541
+ let r = n.csv(e.columns.map((e) => n`${n(e)}`)), i = `%${I(e.query)}%`;
471
542
  return n.onDialectOrElse({
472
543
  mysql: () => n`MATCH(${r}) AGAINST(${e.query} IN NATURAL LANGUAGE MODE)`,
473
544
  sqlite: () => {
474
- let r = n(cn(e, t));
545
+ let r = n(bn(e, t));
475
546
  return n`${n("id")} IN (SELECT ${n("row_id")} FROM ${r} WHERE ${r} MATCH ${e.query})`;
476
547
  },
477
548
  mssql: () => n.or(e.columns.map((e) => n`LOWER(${n(e)}) LIKE LOWER(${i}) ESCAPE '\\'`)),
478
- orElse: () => n`${sn(e, n)} @@ plainto_tsquery(${e.config ?? "english"}, ${e.query})`
549
+ orElse: () => n`${yn(e, n)} @@ plainto_tsquery(${e.config ?? "english"}, ${e.query})`
479
550
  });
480
- }, un = (e, t, n) => {
481
- let r = `%${L(e.query)}%`;
551
+ }, Sn = (e, t, n) => {
552
+ let r = `%${I(e.query)}%`;
482
553
  return n.onDialectOrElse({
483
554
  mysql: () => n`MATCH(${n.csv(e.columns.map((e) => n`${n(e)}`))}) AGAINST(${e.query} IN NATURAL LANGUAGE MODE)`,
484
555
  sqlite: () => {
485
- let r = n(cn(e, t));
556
+ let r = n(bn(e, t));
486
557
  return n`COALESCE((SELECT -bm25(${r}) FROM ${r} WHERE ${r} MATCH ${e.query} AND ${r}.${n("row_id")} = ${n("id")}), 0)`;
487
558
  },
488
559
  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}`),
489
- orElse: () => n`ts_rank(${sn(e, n)}, plainto_tsquery(${e.config ?? "english"}, ${e.query}))`
560
+ orElse: () => n`ts_rank(${yn(e, n)}, plainto_tsquery(${e.config ?? "english"}, ${e.query}))`
490
561
  });
491
- }, z = (e, t, n = null) => {
562
+ }, R = (e, t, n = null) => {
492
563
  if (e.setOp && e.setOp.queries.length >= 2) {
493
- 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`(${z(e, t, n)})`).reduce((e, n, i) => i === 0 ? n : t`${e} ${t.unsafe(r)} ${n}`), a = [];
564
+ 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 = [];
494
565
  if (e.order.length > 0 && a.push(t` ORDER BY ${t.csv(e.order.map((e) => e.direction === "desc" ? t`${t(e.column)} DESC` : t`${t(e.column)} ASC`))}`), e.take !== void 0) {
495
566
  if (!Number.isInteger(e.take) || e.take < 0) throw Error(`compileSelect: invalid take ${e.take}`);
496
567
  a.push(t` LIMIT ${t.unsafe(String(e.take))}`);
@@ -501,7 +572,7 @@ var at = (e) => e === "mysql" || e === "mariadb" || e === "mssql" || e === "sqli
501
572
  }
502
573
  return t`${i}${a.reduce((e, n) => t`${e}${n}`, t``)}`;
503
574
  }
504
- let r = e.annClause === void 0 ? null : rn(e.annClause, t);
575
+ let r = e.annClause === void 0 ? null : gn(e.annClause, t);
505
576
  e.spatialClause !== void 0 && t.onDialectOrElse({
506
577
  mysql: () => {
507
578
  throw Error("@voltro/plugin-postgis: spatial distance / KNN ordering is postgres-only");
@@ -514,51 +585,57 @@ var at = (e) => e === "mysql" || e === "mariadb" || e === "mssql" || e === "sqli
514
585
  },
515
586
  orElse: () => t``
516
587
  });
517
- let i = e.spatialClause?.projectAs === void 0 ? null : an(e.spatialClause, t), a = e.aggregations && e.aggregations.length > 0 ? tn(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 ? un(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({
588
+ let i = e.spatialClause?.projectAs === void 0 ? null : _n(e.spatialClause, t), a = e.aggregations && e.aggregations.length > 0 ? mn(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 ? Sn(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({
518
589
  orElse: () => t`DISTINCT ON (${t.csv(e.distinctOn.map((e) => t`${t(e)}`))}) `,
519
590
  mysql: () => t`DISTINCT `,
520
591
  mssql: () => t`DISTINCT `,
521
592
  sqlite: () => t`DISTINCT `
522
- }) : e.distinct ? t`DISTINCT ` : t``, p = e.alias === void 0 ? t`${t(I(n, e.table))}` : t`${t(I(n, e.table))} AS ${t(e.alias)}`, m = (e.joins ?? []).map((e) => {
593
+ }) : e.distinct ? t`DISTINCT ` : t``, p = e.alias === void 0 ? t`${t(F(n, e.table))}` : t`${t(F(n, e.table))} AS ${t(e.alias)}`, m = (e.joins ?? []).map((e) => {
523
594
  let r = e.kind === "inner" ? "INNER" : "LEFT";
524
- return t` ${t.unsafe(r)} JOIN ${t(I(n, e.table))} AS ${t(e.alias)} ON ${R(e.on, t, n)}`;
525
- }), h = m.length > 0 ? m.reduce((e, n) => t`${e}${n}`, p) : p, g = c === void 0 ? null : ln(c, e.table, t), _ = [e.predicate ? R(e.predicate, t, n) : null, g].filter((e) => e !== null), ee = _.length > 0 ? t` WHERE ${t.and(_)}` : t``, v = e.groupBy && e.groupBy.length > 0 ? t` GROUP BY ${t.csv(e.groupBy.map((e) => t`${t(e)}`))}` : t``, y = e.having ? t` HAVING ${R(e.having, t, n)}` : t``, b = e.skip !== void 0, x = [];
526
- r !== null && x.push(t`${r} ASC`), e.spatialClause?.order !== void 0 && x.push(e.spatialClause.order === "desc" ? t`${on(e.spatialClause, t)} DESC` : t`${on(e.spatialClause, t)} ASC`), l !== null && c?.rank?.order === !0 && x.push(t`${l} DESC`);
527
- for (let n of e.order) x.push(n.direction === "desc" ? t`${t(n.column)} DESC` : t`${t(n.column)} ASC`);
528
- let te = x.length > 0 ? t` ORDER BY ${t.csv(x)}` : b ? t.onDialectOrElse({
595
+ return t` ${t.unsafe(r)} JOIN ${t(F(n, e.table))} AS ${t(e.alias)} ON ${L(e.on, t, n)}`;
596
+ }), h = m.length > 0 ? m.reduce((e, n) => t`${e}${n}`, p) : p, g = c === void 0 ? null : xn(c, e.table, t), ee = [e.predicate ? L(e.predicate, t, n) : null, g].filter((e) => e !== null), te = ee.length > 0 ? t` WHERE ${t.and(ee)}` : t``, _ = e.groupBy && e.groupBy.length > 0 ? t` GROUP BY ${t.csv(e.groupBy.map((e) => t`${t(e)}`))}` : t``, v = e.having ? t` HAVING ${L(e.having, t, n)}` : t``, y = e.skip !== void 0, b = [];
597
+ r !== null && b.push(t`${r} ASC`), e.spatialClause?.order !== void 0 && b.push(e.spatialClause.order === "desc" ? t`${vn(e.spatialClause, t)} DESC` : t`${vn(e.spatialClause, t)} ASC`), l !== null && c?.rank?.order === !0 && b.push(t`${l} DESC`);
598
+ for (let n of e.order) b.push(n.direction === "desc" ? t`${t(n.column)} DESC` : t`${t(n.column)} ASC`);
599
+ let ne = b.length > 0 ? t` ORDER BY ${t.csv(b)}` : y ? t.onDialectOrElse({
529
600
  mssql: () => t` ORDER BY (SELECT NULL)`,
530
601
  orElse: () => t``
531
- }) : t``, S = (e) => {
602
+ }) : t``, x = (e) => {
532
603
  if (!Number.isFinite(e) || !Number.isInteger(e) || e < 0) throw Error(`compileSelect: expected non-negative integer take/skip, got ${e}`);
533
604
  return t.unsafe(String(e));
534
- }, C = (e.ctes ?? []).map((e) => t`${t(e.name)} AS (${z(e.descriptor, t, n)})`), ne = (e.ctes ?? []).some((e) => e.recursive === !0), re = C.length > 0 ? t`WITH ${t.unsafe(ne ? "RECURSIVE " : "")}${t.csv(C)} ` : t``;
605
+ }, S = (e.ctes ?? []).map((e) => t`${t(e.name)} AS (${R(e.descriptor, t, n)})`), re = (e.ctes ?? []).some((e) => e.recursive === !0), ie = S.length > 0 ? t`WITH ${t.unsafe(re ? "RECURSIVE " : "")}${t.csv(S)} ` : t``;
535
606
  return t.onDialectOrElse({
536
607
  mssql: () => {
537
- let n = e.take !== void 0 && !b ? t`TOP ${S(e.take)} ` : t``, r = b ? t` OFFSET ${S(e.skip)} ROWS FETCH NEXT ${S(e.take ?? 2 ** 53 - 1)} ROWS ONLY` : t``;
538
- return t`${re}SELECT ${n}${f}${d} FROM ${h}${ee}${v}${y}${te}${r}`;
608
+ let n = e.take !== void 0 && !y ? t`TOP ${x(e.take)} ` : t``, r = y ? t` OFFSET ${x(e.skip)} ROWS FETCH NEXT ${x(e.take ?? 2 ** 53 - 1)} ROWS ONLY` : t``;
609
+ return t`${ie}SELECT ${n}${f}${d} FROM ${h}${te}${_}${v}${ne}${r}`;
539
610
  },
540
611
  orElse: () => {
541
- let n = e.take === void 0 ? t`` : t` LIMIT ${S(e.take)}`, r = b ? t` OFFSET ${S(e.skip)}` : t``;
542
- return t`${re}SELECT ${f}${d} FROM ${h}${ee}${v}${y}${te}${n}${r}`;
612
+ let n = e.take === void 0 ? t`` : t` LIMIT ${x(e.take)}`, r = y ? t` OFFSET ${x(e.skip)}` : t``;
613
+ return t`${ie}SELECT ${f}${d} FROM ${h}${te}${_}${v}${ne}${n}${r}`;
543
614
  }
544
615
  });
545
- }, dn = (e, t, n) => {
616
+ }, Cn = (e, t, n) => {
546
617
  if (e.eager === void 0) return null;
547
- let r = fn(e.table, e.eager, e.sourceTable);
618
+ let r = Tn(e.table, e.eager, e.sourceTable);
548
619
  if (r === null) return null;
549
- let i = gn(n, e, r, hn(t, n));
620
+ let i = Mn(n, e, r, jn(t, n));
550
621
  return i === null ? null : {
551
622
  fragment: i,
552
- decode: _n(r)
623
+ decode: Fn(r, n)
553
624
  };
554
- }, fn = (e, t, n) => {
555
- let r = n ?? f(e), i = M(e);
625
+ }, z = (e) => e.relation.kind === "one" && e.fkSide === "target", wn = (e) => ({
626
+ ...e,
627
+ branch: {
628
+ ...e.branch,
629
+ limit: 2
630
+ }
631
+ }), Tn = (e, t, n) => {
632
+ let r = n ?? g(e), i = Pt(e);
556
633
  if (i === void 0) return null;
557
634
  let a = [];
558
635
  for (let [e, n] of Object.entries(t)) {
559
636
  let t = i[e];
560
637
  if (t === void 0) return null;
561
- let o = pn(e, t, r, n === !0 ? {} : n);
638
+ let o = En(e, t, r, n === !0 ? {} : n);
562
639
  if (o === null) return null;
563
640
  a.push(o);
564
641
  }
@@ -566,30 +643,30 @@ var at = (e) => e === "mysql" || e === "mariadb" || e === "mssql" || e === "sqli
566
643
  table: r,
567
644
  children: a
568
645
  };
569
- }, pn = (e, t, n, r) => {
646
+ }, En = (e, t, n, r) => {
570
647
  let i = t.target(), a = (t.kind === "manyToMany" ? void 0 : t.sourceKey) ?? "id", o, s;
571
648
  if (t.kind === "manyToMany") o = t.targetKey, s = "target";
572
649
  else if (t.kind === "one") {
573
- let r = mn(n, i.tableName);
650
+ let r = t.sourceKey ?? An(n, i.tableName);
574
651
  if (r !== void 0) o = r, s = "source";
575
652
  else try {
576
- o = t.foreignKey ?? A(i, n.tableName, e), s = "target";
653
+ o = t.foreignKey ?? j(i, n.tableName, e), s = "target";
577
654
  } catch {
578
655
  return null;
579
656
  }
580
657
  } else try {
581
- o = t.foreignKey ?? A(i, n.tableName, e), s = "target";
658
+ o = t.foreignKey ?? j(i, n.tableName, e), s = "target";
582
659
  } catch {
583
660
  return null;
584
661
  }
585
662
  let c = r.with === void 0 ? [] : (() => {
586
- let e = M(i.tableName);
663
+ let e = Pt(i.tableName);
587
664
  if (e === void 0 && Object.keys(r.with).length > 0) return null;
588
665
  let t = [];
589
666
  for (let [n, a] of Object.entries(r.with)) {
590
667
  let r = e?.[n];
591
668
  if (r === void 0) return null;
592
- let o = pn(n, r, i, a === !0 ? {} : a);
669
+ let o = En(n, r, i, a === !0 ? {} : a);
593
670
  if (o === null) return null;
594
671
  t.push(o);
595
672
  }
@@ -604,238 +681,323 @@ var at = (e) => e === "mysql" || e === "mariadb" || e === "mssql" || e === "sqli
604
681
  sourceKey: a,
605
682
  fkSide: s,
606
683
  branch: r,
607
- children: c
684
+ children: c,
685
+ junction: Dn(t, r)
686
+ };
687
+ }, Dn = (e, t) => {
688
+ if (e.kind !== "manyToMany" || t.junction === void 0) return;
689
+ let n = e.through(), r = t.junction === !0 ? Object.keys(n.fields) : t.junction, i = r.filter((e) => e in n.fields);
690
+ return {
691
+ through: n,
692
+ requested: r,
693
+ present: i,
694
+ dateColumns: i.filter((e) => {
695
+ let t = n.fields[e];
696
+ return t !== void 0 && (t.type === "timestamp" || t.type === "date");
697
+ })
608
698
  };
609
- }, mn = (e, t) => {
699
+ }, On = (e) => `__j_${e}`, kn = "__j", An = (e, t) => {
610
700
  for (let [n, r] of Object.entries(e.fields)) if (r.type === "reference" && r.references?.()?.tableName === t) return n;
611
- }, hn = (e, t) => {
701
+ }, jn = (e, t) => {
612
702
  let n = 0;
613
703
  return {
614
704
  sql: e,
615
705
  dialect: t,
616
706
  nextAlias: () => `__a${n++}`
617
707
  };
618
- }, gn = (e, t, n, r) => {
708
+ }, Mn = (e, t, n, r) => {
619
709
  switch (e) {
620
- case "postgres": return yn(t, n, r);
710
+ case "postgres": return Rn(t, n, r);
621
711
  case "sqlite":
622
- case "turso": return Tn(t, n, r);
712
+ case "turso": return Kn(t, n, r);
623
713
  case "mysql":
624
- case "mariadb": return jn(t, n, r);
625
- case "mssql": return Rn(t, n, r);
714
+ case "mariadb": return nr(t, n, r);
715
+ case "mssql": return lr(t, n, r);
626
716
  }
627
- }, _n = (e) => {
628
- let t = vn(e.table, e.children);
717
+ }, Nn = (e, t) => t === "mssql" && !Pn.test(e) ? /* @__PURE__ */ new Date(`${e}Z`) : new Date(e), Pn = /(?:Z|[+-]\d{2}:?\d{2})$/, Fn = (e, t) => {
718
+ let n = In(e.table, e.children, t);
629
719
  return (e) => e.map((e) => {
630
- let n = e.__row, r = typeof n == "string" ? JSON.parse(n) : n;
631
- return t(r);
720
+ let t = e.__row, r = typeof t == "string" ? JSON.parse(t) : t;
721
+ return n(r);
632
722
  });
633
- }, vn = (e, t) => {
634
- let n = [];
635
- for (let [t, r] of Object.entries(e.fields)) (r.type === "timestamp" || r.type === "date") && n.push(t);
636
- let r = t.map((e) => {
637
- let t = vn(e.target, e.children), n = e.relation.kind === "one";
723
+ }, In = (e, t, n) => {
724
+ let r = [];
725
+ for (let [t, n] of Object.entries(e.fields)) (n.type === "timestamp" || n.type === "date") && r.push(t);
726
+ let i = t.map((e) => {
727
+ let t = In(e.target, e.children, n), r = e.relation.kind === "one", i = z(e), a = i ? Jt({
728
+ relationName: e.relationName,
729
+ sourceTableName: e.source.tableName,
730
+ targetTableName: e.target.tableName,
731
+ foreignKey: e.foreignKey,
732
+ sourceKey: e.sourceKey
733
+ }) : "";
638
734
  return {
639
735
  name: e.relationName,
640
736
  decode: t,
641
- isSingle: n
737
+ isSingle: r,
738
+ fromOverFetch: i,
739
+ cardinalityMessage: a,
740
+ junction: Ln(e.junction, n)
642
741
  };
643
742
  });
644
743
  return (e) => {
645
744
  let t = { ...e };
646
- for (let e of n) {
647
- let n = t[e];
648
- typeof n == "string" && (t[e] = new Date(n));
649
- }
650
745
  for (let e of r) {
746
+ let r = t[e];
747
+ typeof r == "string" && (t[e] = Nn(r, n));
748
+ }
749
+ for (let e of i) {
651
750
  let n = t[e.name];
652
751
  if (n == null) {
653
752
  t[e.name] = e.isSingle ? null : [];
654
753
  continue;
655
754
  }
656
- e.isSingle ? t[e.name] = e.decode(n) : t[e.name] = n.map((t) => e.decode(t));
755
+ if (e.fromOverFetch) {
756
+ let r = n;
757
+ if (r.length > 1) throw new qt(e.cardinalityMessage);
758
+ t[e.name] = r.length === 0 ? null : e.decode(r[0]);
759
+ continue;
760
+ }
761
+ if (e.isSingle) t[e.name] = e.decode(n);
762
+ else {
763
+ let r = n.map((t) => e.decode(t));
764
+ t[e.name] = e.junction === void 0 ? r : r.map((t) => e.junction(t));
765
+ }
657
766
  }
658
767
  return t;
659
768
  };
660
- }, yn = (e, t, n) => {
661
- let r = n.sql, i = n.nextAlias(), a = r(t.table.tableName), o = r(i), s = B(i, t.children, n);
662
- return s === null ? null : r`SELECT ${s} AS "__row" FROM ${a} AS ${o}${e.predicate ? r` WHERE ${K(e.predicate, i, r)}` : r``}${e.order.length > 0 ? r` ORDER BY ${r.csv(e.order.map((e) => e.direction === "desc" ? r`${U(i, e.column, r)} DESC` : r`${U(i, e.column, r)} ASC`))}` : r``}${e.take === void 0 ? r`` : r` LIMIT ${G(e.take, r)}`}${e.skip === void 0 ? r`` : r` OFFSET ${G(e.skip, r)}`}`;
663
- }, B = (e, t, n) => {
664
- let r = n.sql, i = r`to_jsonb(${r(e)}.*)`;
665
- if (t.length === 0) return i;
666
- let a = [];
667
- for (let i of t) {
668
- let t = bn(i, e, n);
769
+ }, Ln = (e, t) => {
770
+ if (e === void 0) return;
771
+ let n = new Set(e.dateColumns), r = e.requested;
772
+ return (e) => {
773
+ let i = e._junction ?? {}, a = {};
774
+ for (let e of r) {
775
+ let r = i[e];
776
+ a[e] = n.has(e) && typeof r == "string" ? Nn(r, t) : r;
777
+ }
778
+ return {
779
+ ...e,
780
+ _junction: a
781
+ };
782
+ };
783
+ }, Rn = (e, t, n) => {
784
+ let r = n.sql, i = n.nextAlias(), a = r(t.table.tableName), o = r(i), s = zn(i, t.children, n);
785
+ return s === null ? null : r`SELECT ${s} AS "__row" FROM ${a} AS ${o}${e.predicate ? r` WHERE ${G(e.predicate, i, r)}` : r``}${e.order.length > 0 ? r` ORDER BY ${r.csv(e.order.map((e) => e.direction === "desc" ? r`${H(i, e.column, r)} DESC` : r`${H(i, e.column, r)} ASC`))}` : r``}${e.take === void 0 ? r`` : r` LIMIT ${W(e.take, r)}`}${e.skip === void 0 ? r`` : r` OFFSET ${W(e.skip, r)}`}`;
786
+ }, zn = (e, t, n, r) => {
787
+ let i = n.sql, a = r === void 0 ? i`to_jsonb(${i(e)}.*)` : i`(to_jsonb(${i(e)}.*) - ${U(kn, i)}::text)`;
788
+ if (t.length === 0 && r === void 0) return a;
789
+ let o = [];
790
+ r !== void 0 && o.push(i`${U("_junction", i)}, ${H(e, kn, i)}`);
791
+ for (let r of t) {
792
+ let t = Bn(r, e, n);
669
793
  if (t === null) return null;
670
- a.push(r`${W(i.relationName, r)}, ${t}`);
794
+ o.push(i`${U(r.relationName, i)}, ${t}`);
671
795
  }
672
- return r`${i} || jsonb_build_object(${r.csv(a)})`;
673
- }, bn = (e, t, n) => {
674
- switch (n.sql, e.relation.kind) {
675
- case "one": return xn(e, t, n);
676
- case "many": return Sn(e, t, n);
677
- case "manyToMany": return Cn(e, t, n);
796
+ return i`${a} || jsonb_build_object(${i.csv(o)})`;
797
+ }, Bn = (e, t, n) => {
798
+ switch (e.relation.kind) {
799
+ case "one": return z(e) ? Hn(wn(e), t, n) : Vn(e, t, n);
800
+ case "many": return Hn(e, t, n);
801
+ case "manyToMany": return Un(e, t, n);
678
802
  }
679
- }, xn = (e, t, n) => {
680
- let r = n.sql, i = n.nextAlias(), a = B(i, e.children, n);
803
+ }, Vn = (e, t, n) => {
804
+ let r = n.sql, i = n.nextAlias(), a = zn(i, e.children, n);
681
805
  if (a === null) return null;
682
- let o = e.fkSide === "source" ? r`${U(i, "id", r)} = ${U(t, e.foreignKey, r)}` : r`${U(i, e.foreignKey, r)} = ${U(t, e.sourceKey, r)}`, s = e.branch.where === void 0 ? r`` : r` AND ${K(e.branch.where, i, r)}`, c = V(i, e.branch.orderBy, r);
806
+ let o = e.fkSide === "source" ? r`${H(i, "id", r)} = ${H(t, e.foreignKey, r)}` : r`${H(i, e.foreignKey, r)} = ${H(t, e.sourceKey, r)}`, s = e.branch.where === void 0 ? r`` : r` AND ${G(e.branch.where, i, r)}`, c = B(i, e.branch.orderBy, r);
683
807
  return r`(SELECT ${a} FROM ${r(e.target.tableName)} AS ${r(i)} WHERE ${o}${s}${c} LIMIT 1)`;
684
- }, Sn = (e, t, n) => {
685
- let r = n.sql, i = n.nextAlias(), a = B(i, e.children, n);
808
+ }, Hn = (e, t, n) => {
809
+ let r = n.sql, i = n.nextAlias(), a = zn(i, e.children, n);
686
810
  if (a === null) return null;
687
- let o = r`${U(void 0, e.foreignKey, r)} = ${U(t, e.sourceKey, r)}`, s = e.branch.where === void 0 ? r`` : r` AND ${R(e.branch.where, r)}`, c = wn(e.branch.orderBy, r), l = e.branch.limit === void 0 ? r`` : r` LIMIT ${G(e.branch.limit, r)}`, u = e.branch.offset === void 0 ? r`` : r` OFFSET ${G(e.branch.offset, r)}`;
811
+ let o = r`${H(void 0, e.foreignKey, r)} = ${H(t, e.sourceKey, r)}`, s = e.branch.where === void 0 ? r`` : r` AND ${L(e.branch.where, r)}`, c = Gn(e.branch.orderBy, r), l = e.branch.limit === void 0 ? r`` : r` LIMIT ${W(e.branch.limit, r)}`, u = e.branch.offset === void 0 ? r`` : r` OFFSET ${W(e.branch.offset, r)}`;
688
812
  return r`COALESCE((SELECT jsonb_agg(${a}) FROM (SELECT * FROM ${r(e.target.tableName)} WHERE ${o}${s}${c}${l}${u}) AS ${r(i)}), '[]'::jsonb)`;
689
- }, Cn = (e, t, n) => {
690
- let r = n.sql, i = e.relation, a = i.through(), o = n.nextAlias(), s = n.nextAlias(), c = B(o, e.children, n);
813
+ }, Un = (e, t, n) => {
814
+ let r = n.sql, i = e.relation, a = i.through(), o = n.nextAlias(), s = n.nextAlias(), c = zn(o, e.children, n, e.junction);
691
815
  if (c === null) return null;
692
- let l = e.branch.where === void 0 ? r`` : r` AND ${R(e.branch.where, r)}`, u = q(e, s, r), d = V(o, e.branch.orderBy, r), f = e.branch.limit === void 0 ? r`` : r` LIMIT ${G(e.branch.limit, r)}`, p = e.branch.offset === void 0 ? r`` : r` OFFSET ${G(e.branch.offset, r)}`;
693
- return r`COALESCE((SELECT jsonb_agg(${c}) FROM (SELECT ${r(o)}.* FROM ${r(a.tableName)} AS ${r(s)} INNER JOIN ${r(e.target.tableName)} AS ${r(o)} ON ${U(o, "id", r)} = ${U(s, i.targetKey, r)} WHERE ${U(s, i.sourceKey, r)} = ${U(t, "id", r)}${u}${l}${d}${f}${p}) AS ${r(o)}), '[]'::jsonb)`;
694
- }, V = (e, t, n) => t === void 0 || t.length === 0 ? n`` : n` ORDER BY ${n.csv(t.map((t) => t.direction === "desc" ? n`${U(e, t.column, n)} DESC` : n`${U(e, t.column, n)} ASC`))}`, wn = (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`))}`, Tn = (e, t, n) => {
695
- let r = n.sql, i = n.nextAlias(), a = En(i, t.table, t.children, n);
816
+ let l = e.branch.where === void 0 ? r`` : r` AND ${L(e.branch.where, r)}`, u = K(e, s, r), d = B(o, e.branch.orderBy, r), f = e.branch.limit === void 0 ? r`` : r` LIMIT ${W(e.branch.limit, r)}`, p = e.branch.offset === void 0 ? r`` : r` OFFSET ${W(e.branch.offset, r)}`, m = e.junction === void 0 ? r`` : r`, ${Wn(e.junction, s, r)} AS ${r(kn)}`;
817
+ 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 ${H(o, "id", r)} = ${H(s, i.targetKey, r)} WHERE ${H(s, i.sourceKey, r)} = ${H(t, "id", r)}${u}${l}${d}${f}${p}) AS ${r(o)}), '[]'::jsonb)`;
818
+ }, Wn = (e, t, n) => e.present.length === 0 ? n`jsonb_build_object()` : n`jsonb_build_object(${n.csv(e.present.map((e) => n`${U(e, n)}, ${H(t, e, n)}`))})`, B = (e, t, n) => t === void 0 || t.length === 0 ? n`` : n` ORDER BY ${n.csv(t.map((t) => t.direction === "desc" ? n`${H(e, t.column, n)} DESC` : n`${H(e, t.column, n)} ASC`))}`, Gn = (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`))}`, Kn = (e, t, n) => {
819
+ let r = n.sql, i = n.nextAlias(), a = qn(i, t.table, t.children, n);
696
820
  if (a === null) return null;
697
- let o = e.predicate ? r` WHERE ${K(e.predicate, i, r)}` : r``, s = e.order.length > 0 ? r` ORDER BY ${r.csv(e.order.map((e) => e.direction === "desc" ? r`${U(i, e.column, r)} DESC` : r`${U(i, e.column, r)} ASC`))}` : r``, c = e.take === void 0 ? r`` : r` LIMIT ${G(e.take, r)}`, l = e.skip === void 0 ? r`` : r` OFFSET ${G(e.skip, r)}`;
821
+ let o = e.predicate ? r` WHERE ${G(e.predicate, i, r)}` : r``, s = e.order.length > 0 ? r` ORDER BY ${r.csv(e.order.map((e) => e.direction === "desc" ? r`${H(i, e.column, r)} DESC` : r`${H(i, e.column, r)} ASC`))}` : r``, c = e.take === void 0 ? r`` : r` LIMIT ${W(e.take, r)}`, l = e.skip === void 0 ? r`` : r` OFFSET ${W(e.skip, r)}`;
698
822
  return r`SELECT ${a} AS "__row" FROM ${r(t.table.tableName)} AS ${r(i)}${o}${s}${c}${l}`;
699
- }, En = (e, t, n, r) => {
700
- let i = r.sql, a = [];
701
- for (let n of Object.keys(t.fields)) a.push(i`${W(n, i)}, ${U(e, n, i)}`);
823
+ }, qn = (e, t, n, r, i) => {
824
+ let a = r.sql, o = [];
825
+ for (let n of Object.keys(t.fields)) o.push(a`${U(n, a)}, ${H(e, n, a)}`);
826
+ if (i !== void 0) {
827
+ let e = Jn(i.projection, i.source, a);
828
+ o.push(a`${U("_junction", a)}, json_object(${e})`);
829
+ }
702
830
  for (let t of n) {
703
- let n = Dn(t, e, r);
831
+ let n = Qn(t, e, r);
704
832
  if (n === null) return null;
705
- a.push(i`${W(t.relationName, i)}, ${n}`);
833
+ o.push(a`${U(t.relationName, a)}, ${n}`);
706
834
  }
707
- return i`json_object(${i.csv(a)})`;
708
- }, Dn = (e, t, n) => {
835
+ return a`json_object(${a.csv(o)})`;
836
+ }, Jn = (e, t, n) => e.present.length === 0 ? n`` : n.csv(e.present.map((e) => n`${U(e, n)}, ${H(t.alias, t.physical(e), n)}`)), Yn = (e, t, n) => e.present.length === 0 ? n`` : n`, ${n.csv(e.present.map((e) => n`${H(t, e, n)} AS ${n(On(e))}`))}`, Xn = (e) => ({
837
+ alias: e,
838
+ physical: On
839
+ }), Zn = (e) => ({
840
+ alias: e,
841
+ physical: (e) => e
842
+ }), Qn = (e, t, n) => {
709
843
  switch (e.relation.kind) {
710
- case "one": return On(e, t, n);
711
- case "many": return kn(e, t, n);
712
- case "manyToMany": return An(e, t, n);
844
+ case "one": return z(e) ? er(wn(e), t, n) : $n(e, t, n);
845
+ case "many": return er(e, t, n);
846
+ case "manyToMany": return tr(e, t, n);
713
847
  }
714
- }, On = (e, t, n) => {
715
- let r = n.sql, i = n.nextAlias(), a = En(i, e.target, e.children, n);
848
+ }, $n = (e, t, n) => {
849
+ let r = n.sql, i = n.nextAlias(), a = qn(i, e.target, e.children, n);
716
850
  if (a === null) return null;
717
- let o = e.fkSide === "source" ? r`${U(i, "id", r)} = ${U(t, e.foreignKey, r)}` : r`${U(i, e.foreignKey, r)} = ${U(t, e.sourceKey, r)}`;
851
+ let o = e.fkSide === "source" ? r`${H(i, "id", r)} = ${H(t, e.foreignKey, r)}` : r`${H(i, e.foreignKey, r)} = ${H(t, e.sourceKey, r)}`;
718
852
  return r`(SELECT ${a} FROM ${r(e.target.tableName)} AS ${r(i)} WHERE ${o} LIMIT 1)`;
719
- }, kn = (e, t, n) => {
720
- let r = n.sql, i = n.nextAlias(), a = En(i, e.target, e.children, n);
853
+ }, er = (e, t, n) => {
854
+ let r = n.sql, i = n.nextAlias(), a = qn(i, e.target, e.children, n);
721
855
  if (a === null) return null;
722
- let o = r`${U(void 0, e.foreignKey, r)} = ${U(t, e.sourceKey, r)}`, s = e.branch.where === void 0 ? r`` : r` AND ${R(J(e.branch.where), r)}`, c = wn(e.branch.orderBy, r), l = e.branch.limit === void 0 ? r`` : r` LIMIT ${G(e.branch.limit, r)}`, u = e.branch.offset === void 0 ? r`` : r` OFFSET ${G(e.branch.offset, r)}`;
856
+ let o = r`${H(void 0, e.foreignKey, r)} = ${H(t, e.sourceKey, r)}`, s = e.branch.where === void 0 ? r`` : r` AND ${L(q(e.branch.where), r)}`, c = Gn(e.branch.orderBy, r), l = e.branch.limit === void 0 ? r`` : r` LIMIT ${W(e.branch.limit, r)}`, u = e.branch.offset === void 0 ? r`` : r` OFFSET ${W(e.branch.offset, r)}`;
723
857
  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('[]'))`;
724
- }, An = (e, t, n) => {
725
- let r = n.sql, i = e.relation, a = i.through(), o = n.nextAlias(), s = n.nextAlias(), c = En(o, e.target, e.children, n);
858
+ }, tr = (e, t, n) => {
859
+ let r = n.sql, i = e.relation, a = i.through(), o = n.nextAlias(), s = n.nextAlias(), c = qn(o, e.target, e.children, n, e.junction === void 0 ? void 0 : {
860
+ projection: e.junction,
861
+ source: Xn(o)
862
+ });
726
863
  if (c === null) return null;
727
- let l = e.branch.where === void 0 ? r`` : r` AND ${R(J(e.branch.where), r)}`, u = q(e, s, r, !0), d = V(o, e.branch.orderBy, r), f = e.branch.limit === void 0 ? r`` : r` LIMIT ${G(e.branch.limit, r)}`, p = e.branch.offset === void 0 ? r`` : r` OFFSET ${G(e.branch.offset, r)}`;
728
- return r`COALESCE((SELECT json_group_array(${c}) FROM (SELECT ${r(o)}.* FROM ${r(a.tableName)} AS ${r(s)} INNER JOIN ${r(e.target.tableName)} AS ${r(o)} ON ${U(o, "id", r)} = ${U(s, i.targetKey, r)} WHERE ${U(s, i.sourceKey, r)} = ${U(t, "id", r)}${u}${l}${d}${f}${p}) AS ${r(o)}), json('[]'))`;
729
- }, jn = (e, t, n) => {
730
- let r = n.sql, i = n.nextAlias(), a = H(i, t.table, t.children, n);
864
+ let l = e.branch.where === void 0 ? r`` : r` AND ${L(q(e.branch.where), r)}`, u = K(e, s, r, !0), d = B(o, e.branch.orderBy, r), f = e.branch.limit === void 0 ? r`` : r` LIMIT ${W(e.branch.limit, r)}`, p = e.branch.offset === void 0 ? r`` : r` OFFSET ${W(e.branch.offset, r)}`, m = e.junction === void 0 ? r`` : Yn(e.junction, s, r);
865
+ 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 ${H(o, "id", r)} = ${H(s, i.targetKey, r)} WHERE ${H(s, i.sourceKey, r)} = ${H(t, "id", r)}${u}${l}${d}${f}${p}) AS ${r(o)}), json('[]'))`;
866
+ }, nr = (e, t, n) => {
867
+ let r = n.sql, i = n.nextAlias(), a = V(i, t.table, t.children, n);
731
868
  if (a === null) return null;
732
- let o = e.predicate ? r` WHERE ${K(e.predicate, i, r)}` : r``, s = e.order.length > 0 ? r` ORDER BY ${r.csv(e.order.map((e) => e.direction === "desc" ? r`${U(i, e.column, r)} DESC` : r`${U(i, e.column, r)} ASC`))}` : r``, c = e.take === void 0 ? r`` : r` LIMIT ${G(e.take, r)}`, l = e.skip === void 0 ? r`` : r` OFFSET ${G(e.skip, r)}`;
869
+ let o = e.predicate ? r` WHERE ${G(e.predicate, i, r)}` : r``, s = e.order.length > 0 ? r` ORDER BY ${r.csv(e.order.map((e) => e.direction === "desc" ? r`${H(i, e.column, r)} DESC` : r`${H(i, e.column, r)} ASC`))}` : r``, c = e.take === void 0 ? r`` : r` LIMIT ${W(e.take, r)}`, l = e.skip === void 0 ? r`` : r` OFFSET ${W(e.skip, r)}`;
733
870
  return r`SELECT ${a} AS \`__row\` FROM ${r(t.table.tableName)} AS ${r(i)}${o}${s}${c}${l}`;
734
- }, H = (e, t, n, r) => {
735
- let i = r.sql, a = [];
736
- for (let n of Object.keys(t.fields)) a.push(i`${W(n, i)}, ${U(e, n, i)}`);
871
+ }, V = (e, t, n, r, i) => {
872
+ let a = r.sql, o = [];
873
+ for (let n of Object.keys(t.fields)) o.push(a`${U(n, a)}, ${H(e, n, a)}`);
874
+ if (i !== void 0) {
875
+ let e = Jn(i.projection, i.source, a);
876
+ o.push(a`${U("_junction", a)}, JSON_OBJECT(${e})`);
877
+ }
737
878
  for (let t of n) {
738
- let n = Mn(t, e, r);
879
+ let n = rr(t, e, r);
739
880
  if (n === null) return null;
740
- a.push(i`${W(t.relationName, i)}, ${n}`);
881
+ o.push(a`${U(t.relationName, a)}, ${n}`);
741
882
  }
742
- return i`JSON_OBJECT(${i.csv(a)})`;
743
- }, Mn = (e, t, n) => {
883
+ return a`JSON_OBJECT(${a.csv(o)})`;
884
+ }, rr = (e, t, n) => {
744
885
  switch (e.relation.kind) {
745
- case "one": return Nn(e, t, n);
746
- case "many": return n.dialect === "mariadb" ? In(e, t, n) : Pn(e, t, n);
747
- case "manyToMany": return n.dialect === "mariadb" ? Ln(e, t, n) : Fn(e, t, n);
886
+ case "one":
887
+ if (z(e)) {
888
+ let r = wn(e);
889
+ return n.dialect === "mariadb" ? sr(r, t, n) : ar(r, t, n);
890
+ }
891
+ return ir(e, t, n);
892
+ case "many": return n.dialect === "mariadb" ? sr(e, t, n) : ar(e, t, n);
893
+ case "manyToMany": return n.dialect === "mariadb" ? cr(e, t, n) : or(e, t, n);
748
894
  }
749
- }, Nn = (e, t, n) => {
750
- let r = n.sql, i = n.nextAlias(), a = H(i, e.target, e.children, n);
895
+ }, ir = (e, t, n) => {
896
+ let r = n.sql, i = n.nextAlias(), a = V(i, e.target, e.children, n);
751
897
  if (a === null) return null;
752
- let o = e.fkSide === "source" ? r`${U(i, "id", r)} = ${U(t, e.foreignKey, r)}` : r`${U(i, e.foreignKey, r)} = ${U(t, e.sourceKey, r)}`;
898
+ let o = e.fkSide === "source" ? r`${H(i, "id", r)} = ${H(t, e.foreignKey, r)}` : r`${H(i, e.foreignKey, r)} = ${H(t, e.sourceKey, r)}`;
753
899
  return r`(SELECT ${a} FROM ${r(e.target.tableName)} AS ${r(i)} WHERE ${o} LIMIT 1)`;
754
- }, Pn = (e, t, n) => {
755
- let r = n.sql, i = n.nextAlias(), a = H(i, e.target, e.children, n);
900
+ }, ar = (e, t, n) => {
901
+ let r = n.sql, i = n.nextAlias(), a = V(i, e.target, e.children, n);
756
902
  if (a === null) return null;
757
- let o = r`${U(void 0, e.foreignKey, r)} = ${U(t, e.sourceKey, r)}`, s = e.branch.where === void 0 ? r`` : r` AND ${R(J(e.branch.where), r)}`, c = wn(e.branch.orderBy, r), l = e.branch.limit === void 0 ? r`` : r` LIMIT ${G(e.branch.limit, r)}`, u = e.branch.offset === void 0 ? r`` : r` OFFSET ${G(e.branch.offset, r)}`;
903
+ let o = r`${H(void 0, e.foreignKey, r)} = ${H(t, e.sourceKey, r)}`, s = e.branch.where === void 0 ? r`` : r` AND ${L(q(e.branch.where), r)}`, c = Gn(e.branch.orderBy, r), l = e.branch.limit === void 0 ? r`` : r` LIMIT ${W(e.branch.limit, r)}`, u = e.branch.offset === void 0 ? r`` : r` OFFSET ${W(e.branch.offset, r)}`;
758
904
  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())`;
759
- }, Fn = (e, t, n) => {
760
- let r = n.sql, i = e.relation, a = i.through(), o = n.nextAlias(), s = n.nextAlias(), c = H(o, e.target, e.children, n);
905
+ }, or = (e, t, n) => {
906
+ let r = n.sql, i = e.relation, a = i.through(), o = n.nextAlias(), s = n.nextAlias(), c = V(o, e.target, e.children, n, e.junction === void 0 ? void 0 : {
907
+ projection: e.junction,
908
+ source: Xn(o)
909
+ });
761
910
  if (c === null) return null;
762
- let l = e.branch.where === void 0 ? r`` : r` AND ${R(J(e.branch.where), r)}`, u = q(e, s, r, !0), d = V(o, e.branch.orderBy, r), f = e.branch.limit === void 0 ? r`` : r` LIMIT ${G(e.branch.limit, r)}`, p = e.branch.offset === void 0 ? r`` : r` OFFSET ${G(e.branch.offset, r)}`;
763
- return r`COALESCE((SELECT JSON_ARRAYAGG(${c}) FROM (SELECT ${r(o)}.* FROM ${r(a.tableName)} AS ${r(s)} INNER JOIN ${r(e.target.tableName)} AS ${r(o)} ON ${U(o, "id", r)} = ${U(s, i.targetKey, r)} WHERE ${U(s, i.sourceKey, r)} = ${U(t, "id", r)}${u}${l}${d}${f}${p}) AS ${r(o)}), JSON_ARRAY())`;
764
- }, In = (e, t, n) => {
765
- let r = n.sql, i = n.nextAlias(), a = H(i, e.target, e.children, n);
911
+ let l = e.branch.where === void 0 ? r`` : r` AND ${L(q(e.branch.where), r)}`, u = K(e, s, r, !0), d = B(o, e.branch.orderBy, r), f = e.branch.limit === void 0 ? r`` : r` LIMIT ${W(e.branch.limit, r)}`, p = e.branch.offset === void 0 ? r`` : r` OFFSET ${W(e.branch.offset, r)}`, m = e.junction === void 0 ? r`` : Yn(e.junction, s, r);
912
+ 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 ${H(o, "id", r)} = ${H(s, i.targetKey, r)} WHERE ${H(s, i.sourceKey, r)} = ${H(t, "id", r)}${u}${l}${d}${f}${p}) AS ${r(o)}), JSON_ARRAY())`;
913
+ }, sr = (e, t, n) => {
914
+ let r = n.sql, i = n.nextAlias(), a = V(i, e.target, e.children, n);
766
915
  if (a === null) return null;
767
- let o = r`${U(i, e.foreignKey, r)} = ${U(t, e.sourceKey, r)}`, s = e.branch.where === void 0 ? r`` : r` AND ${R(J(e.branch.where), r)}`, c = e.branch.orderBy ?? [];
768
- 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`${U(i, e.column, r)} DESC` : r`${U(i, e.column, r)} ASC`))}` : r``}) FROM ${r(e.target.tableName)} AS ${r(i)} WHERE ${o}${s}), JSON_ARRAY())`;
769
- 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 ${U(i, "rn", r)} > ${G(d, r)} AND ${U(i, "rn", r)} <= ${G(d + u, r)}` : u === void 0 ? r` AND ${U(i, "rn", r)} > ${G(d, r)}` : r` AND ${U(i, "rn", r)} <= ${G(u, r)}`;
770
- return r`COALESCE((SELECT JSON_ARRAYAGG(${a} ORDER BY ${U(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())`;
771
- }, Ln = (e, t, n) => {
772
- let r = n.sql, i = e.relation, a = i.through(), o = n.nextAlias(), s = n.nextAlias(), c = H(o, e.target, e.children, n);
773
- if (c === null) return null;
774
- let l = r`${U(s, i.sourceKey, r)} = ${U(t, "id", r)}`, u = r`${U(o, "id", r)} = ${U(s, i.targetKey, r)}`, d = e.branch.where === void 0 ? r`` : r` AND ${R(J(e.branch.where), r)}`, f = q(e, s, r, !0), p = e.branch.orderBy ?? [];
775
- if (!(e.branch.limit !== void 0 || e.branch.offset !== void 0)) return r`COALESCE((SELECT JSON_ARRAYAGG(${c}${p.length > 0 ? r` ORDER BY ${r.csv(p.map((e) => e.direction === "desc" ? r`${U(o, e.column, r)} DESC` : r`${U(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())`;
776
- let m = p.length > 0 ? r` ORDER BY ${r.csv(p.map((e) => e.direction === "desc" ? r`${U(o, e.column, r)} DESC` : r`${U(o, e.column, r)} ASC`))}` : r` ORDER BY ${U(o, "id", r)}`, h = e.branch.limit, g = e.branch.offset, _ = n.nextAlias(), ee = h !== void 0 && g !== void 0 ? r` AND ${U(_, "rn", r)} > ${G(g, r)} AND ${U(_, "rn", r)} <= ${G(g + h, r)}` : h === void 0 ? r` AND ${U(_, "rn", r)} > ${G(g, r)}` : r` AND ${U(_, "rn", r)} <= ${G(h, r)}`, v = e.branch.onJunction === void 0 ? r`` : r` WHERE ${K(J(e.branch.onJunction), s, r)}`;
777
- return r`COALESCE((SELECT JSON_ARRAYAGG(${c} ORDER BY ${U(_, "rn", r)}) FROM (SELECT ${r(o)}.*, ${U(s, i.sourceKey, r)} AS ${r(`__src_${i.sourceKey}`)}, ROW_NUMBER() OVER (PARTITION BY ${U(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(_)} WHERE ${U(_, `__src_${i.sourceKey}`, r)} = ${U(t, "id", r)}${d}${ee}), JSON_ARRAY())`;
778
- }, Rn = (e, t, n) => {
779
- let r = n.sql, i = n.nextAlias(), a = zn(i, t.table, t.children, n);
916
+ let o = r`${H(i, e.foreignKey, r)} = ${H(t, e.sourceKey, r)}`, s = e.branch.where === void 0 ? r`` : r` AND ${L(q(e.branch.where), r)}`, c = e.branch.orderBy ?? [];
917
+ 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`${H(i, e.column, r)} DESC` : r`${H(i, e.column, r)} ASC`))}` : r``}) FROM ${r(e.target.tableName)} AS ${r(i)} WHERE ${o}${s}), JSON_ARRAY())`;
918
+ 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 ${H(i, "rn", r)} > ${W(d, r)} AND ${H(i, "rn", r)} <= ${W(d + u, r)}` : u === void 0 ? r` AND ${H(i, "rn", r)} > ${W(d, r)}` : r` AND ${H(i, "rn", r)} <= ${W(u, r)}`;
919
+ return r`COALESCE((SELECT JSON_ARRAYAGG(${a} ORDER BY ${H(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())`;
920
+ }, cr = (e, t, n) => {
921
+ let r = n.sql, i = e.relation, a = i.through(), o = n.nextAlias(), s = n.nextAlias(), c = (t) => e.junction === void 0 ? void 0 : {
922
+ projection: e.junction,
923
+ source: t
924
+ }, l = r`${H(s, i.sourceKey, r)} = ${H(t, "id", r)}`, u = r`${H(o, "id", r)} = ${H(s, i.targetKey, r)}`, d = e.branch.where === void 0 ? r`` : r` AND ${L(q(e.branch.where), r)}`, f = K(e, s, r, !0), p = e.branch.orderBy ?? [];
925
+ if (!(e.branch.limit !== void 0 || e.branch.offset !== void 0)) {
926
+ let t = V(o, e.target, e.children, n, c(Zn(s)));
927
+ 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`${H(o, e.column, r)} DESC` : r`${H(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())`;
928
+ }
929
+ let m = p.length > 0 ? r` ORDER BY ${r.csv(p.map((e) => e.direction === "desc" ? r`${H(o, e.column, r)} DESC` : r`${H(o, e.column, r)} ASC`))}` : r` ORDER BY ${H(o, "id", r)}`, h = e.branch.limit, g = e.branch.offset, ee = h !== void 0 && g !== void 0 ? r` AND ${H(o, "rn", r)} > ${W(g, r)} AND ${H(o, "rn", r)} <= ${W(g + h, r)}` : h === void 0 ? r` AND ${H(o, "rn", r)} > ${W(g, r)}` : r` AND ${H(o, "rn", r)} <= ${W(h, r)}`, te = e.branch.onJunction === void 0 ? r`` : r` WHERE ${G(q(e.branch.onJunction), s, r)}`, _ = V(o, e.target, e.children, n, c(Xn(o)));
930
+ if (_ === null) return null;
931
+ let v = e.junction === void 0 ? r`` : Yn(e.junction, s, r);
932
+ return r`COALESCE((SELECT JSON_ARRAYAGG(${_} ORDER BY ${H(o, "rn", r)}) FROM (SELECT ${r(o)}.*${v}, ${H(s, i.sourceKey, r)} AS ${r(`__src_${i.sourceKey}`)}, ROW_NUMBER() OVER (PARTITION BY ${H(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}${te}) AS ${r(o)} WHERE ${H(o, `__src_${i.sourceKey}`, r)} = ${H(t, "id", r)}${d}${ee}), JSON_ARRAY())`;
933
+ }, lr = (e, t, n) => {
934
+ let r = n.sql, i = n.nextAlias(), a = ur(i, t.table, t.children, n);
780
935
  if (a === null) return null;
781
- let o = e.predicate ? r` WHERE ${K(e.predicate, i, r)}` : r``, s = e.order.length > 0 ? r` ORDER BY ${r.csv(e.order.map((e) => e.direction === "desc" ? r`${U(i, e.column, r)} DESC` : r`${U(i, e.column, r)} ASC`))}` : r``, c = r``, l = r``;
936
+ let o = e.predicate ? r` WHERE ${G(e.predicate, i, r)}` : r``, s = e.order.length > 0 ? r` ORDER BY ${r.csv(e.order.map((e) => e.direction === "desc" ? r`${H(i, e.column, r)} DESC` : r`${H(i, e.column, r)} ASC`))}` : r``, c = r``, l = r``;
782
937
  if (e.skip !== void 0) {
783
938
  let t = e.order.length > 0 ? s : r` ORDER BY (SELECT NULL)`;
784
- l = e.take === void 0 ? r`${t} OFFSET ${G(e.skip, r)} ROWS` : r`${t} OFFSET ${G(e.skip, r)} ROWS FETCH NEXT ${G(e.take, r)} ROWS ONLY`;
785
- } else e.take !== void 0 && (c = r`TOP ${G(e.take, r)} `);
939
+ l = e.take === void 0 ? r`${t} OFFSET ${W(e.skip, r)} ROWS` : r`${t} OFFSET ${W(e.skip, r)} ROWS FETCH NEXT ${W(e.take, r)} ROWS ONLY`;
940
+ } else e.take !== void 0 && (c = r`TOP ${W(e.take, r)} `);
786
941
  let u = e.skip === void 0 ? s : r``;
787
- return r`SELECT [__row] = (SELECT ${c}${a} FROM ${r(t.table.tableName)} AS ${r(i)}${o}${u}${l} FOR JSON PATH, INCLUDE_NULL_VALUES, WITHOUT_ARRAY_WRAPPER)`;
788
- }, zn = (e, t, n, r) => {
789
- let i = r.sql, a = [];
790
- for (let n of Object.keys(t.fields)) a.push(i`${U(e, n, i)} AS ${i(n)}`);
942
+ 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}`;
943
+ }, ur = (e, t, n, r, i) => {
944
+ let a = r.sql, o = [];
945
+ for (let n of Object.keys(t.fields)) o.push(a`${H(e, n, a)} AS ${a(n)}`);
946
+ if (i !== void 0) for (let e of i.projection.present) o.push(a`${H(i.source.alias, i.source.physical(e), a)} AS ${dr(`_junction.${e}`, a)}`);
791
947
  for (let t of n) {
792
- let n = Bn(t, e, r);
948
+ let n = fr(t, e, r);
793
949
  if (n === null) return null;
794
- a.push(n);
950
+ o.push(n);
795
951
  }
796
- return i.csv(a);
797
- }, Bn = (e, t, n) => {
798
- let r = n.sql;
952
+ return a.csv(o);
953
+ }, dr = (e, t) => t.unsafe(`[${e.replace(/]/g, "]]")}]`), fr = (e, t, n) => {
799
954
  switch (e.relation.kind) {
800
- case "one": {
801
- let i = n.nextAlias(), a = zn(i, e.target, e.children, n);
802
- if (a === null) return null;
803
- let o = e.fkSide === "source" ? r`${U(i, "id", r)} = ${U(t, e.foreignKey, r)}` : r`${U(i, e.foreignKey, r)} = ${U(t, e.sourceKey, r)}`;
804
- 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)}`;
805
- }
806
- case "many": {
807
- let i = n.nextAlias(), a = zn(i, e.target, e.children, n);
808
- if (a === null) return null;
809
- let o = e.branch.where === void 0 ? r`` : r` AND ${K(e.branch.where, i, r)}`, s = V(i, e.branch.orderBy, r), c = r``, l = r``;
810
- if (e.branch.offset !== void 0) {
811
- let t = e.branch.orderBy && e.branch.orderBy.length > 0 ? s : r` ORDER BY (SELECT NULL)`;
812
- l = e.branch.limit === void 0 ? r`${t} OFFSET ${G(e.branch.offset, r)} ROWS` : r`${t} OFFSET ${G(e.branch.offset, r)} ROWS FETCH NEXT ${G(e.branch.limit, r)} ROWS ONLY`;
813
- } else e.branch.limit !== void 0 && (c = r`TOP ${G(e.branch.limit, r)} `);
814
- let u = e.branch.offset === void 0 ? s : r``;
815
- return r`ISNULL(JSON_QUERY((SELECT ${c}${a} FROM ${r(e.target.tableName)} AS ${r(i)} WHERE ${U(i, e.foreignKey, r)} = ${U(t, e.sourceKey, r)}${o}${u}${l} FOR JSON PATH, INCLUDE_NULL_VALUES)), JSON_QUERY('[]')) AS ${r(e.relationName)}`;
816
- }
817
- case "manyToMany": {
818
- let i = e.relation, a = i.through(), o = n.nextAlias(), s = n.nextAlias(), c = zn(o, e.target, e.children, n);
819
- if (c === null) return null;
820
- let l = e.branch.where === void 0 ? r`` : r` AND ${K(e.branch.where, o, r)}`, u = q(e, s, r), d = V(o, e.branch.orderBy, r), f = r``, p = r``;
821
- if (e.branch.offset !== void 0) {
822
- let t = e.branch.orderBy && e.branch.orderBy.length > 0 ? d : r` ORDER BY (SELECT NULL)`;
823
- p = e.branch.limit === void 0 ? r`${t} OFFSET ${G(e.branch.offset, r)} ROWS` : r`${t} OFFSET ${G(e.branch.offset, r)} ROWS FETCH NEXT ${G(e.branch.limit, r)} ROWS ONLY`;
824
- } else e.branch.limit !== void 0 && (f = r`TOP ${G(e.branch.limit, r)} `);
825
- let m = e.branch.offset === void 0 ? d : r``;
826
- 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 ${U(o, "id", r)} = ${U(s, i.targetKey, r)} WHERE ${U(s, i.sourceKey, r)} = ${U(t, "id", r)}${u}${l}${m}${p} FOR JSON PATH, INCLUDE_NULL_VALUES)), JSON_QUERY('[]')) AS ${r(e.relationName)}`;
827
- }
955
+ case "one": return z(e) ? hr(wn(e), t, n) : pr(e, t, n);
956
+ case "many": return hr(e, t, n);
957
+ case "manyToMany": return gr(e, t, n);
828
958
  }
829
- }, U = (e, t, n) => e === void 0 ? n`${n(t)}` : n`${n(e)}.${n(t)}`, W = (e, t) => t.unsafe(`'${e.replace(/'/g, "''")}'`), G = (e, t) => {
959
+ }, pr = (e, t, n) => {
960
+ let r = n.sql, i = n.nextAlias(), a = ur(i, e.target, e.children, n);
961
+ if (a === null) return null;
962
+ let o = e.fkSide === "source" ? r`${H(i, "id", r)} = ${H(t, e.foreignKey, r)}` : r`${H(i, e.foreignKey, r)} = ${H(t, e.sourceKey, r)}`;
963
+ 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)}`;
964
+ }, mr = (e, t, n) => {
965
+ if (e.offset !== void 0) {
966
+ let r = e.orderBy && e.orderBy.length > 0 ? t : n` ORDER BY (SELECT NULL)`, i = e.limit === void 0 ? n`${r} OFFSET ${W(e.offset, n)} ROWS` : n`${r} OFFSET ${W(e.offset, n)} ROWS FETCH NEXT ${W(e.limit, n)} ROWS ONLY`;
967
+ return {
968
+ top: n``,
969
+ pagination: i,
970
+ finalOrder: n``
971
+ };
972
+ }
973
+ return {
974
+ top: e.limit === void 0 ? n`` : n`TOP ${W(e.limit, n)} `,
975
+ pagination: n``,
976
+ finalOrder: t
977
+ };
978
+ }, hr = (e, t, n) => {
979
+ let r = n.sql, i = n.nextAlias(), a = ur(i, e.target, e.children, n);
980
+ if (a === null) return null;
981
+ let o = e.branch.where === void 0 ? r`` : r` AND ${G(e.branch.where, i, r)}`, s = B(i, e.branch.orderBy, r), { top: c, pagination: l, finalOrder: u } = mr(e.branch, s, r);
982
+ return r`ISNULL(JSON_QUERY((SELECT ${c}${a} FROM ${r(e.target.tableName)} AS ${r(i)} WHERE ${H(i, e.foreignKey, r)} = ${H(t, e.sourceKey, r)}${o}${u}${l} FOR JSON PATH, INCLUDE_NULL_VALUES)), JSON_QUERY('[]')) AS ${r(e.relationName)}`;
983
+ }, gr = (e, t, n) => {
984
+ 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 : {
985
+ projection: e.junction,
986
+ source: Zn(s)
987
+ });
988
+ if (c === null) return null;
989
+ let l = e.branch.where === void 0 ? r`` : r` AND ${G(e.branch.where, o, r)}`, u = K(e, s, r), d = B(o, e.branch.orderBy, r), { top: f, pagination: p, finalOrder: m } = mr(e.branch, d, r);
990
+ 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 ${H(o, "id", r)} = ${H(s, i.targetKey, r)} WHERE ${H(s, i.sourceKey, r)} = ${H(t, "id", r)}${u}${l}${m}${p} FOR JSON PATH, INCLUDE_NULL_VALUES)), JSON_QUERY('[]')) AS ${r(e.relationName)}`;
991
+ }, H = (e, t, n) => e === void 0 ? n`${n(t)}` : n`${n(e)}.${n(t)}`, U = (e, t) => t.unsafe(`'${e.replace(/'/g, "''")}'`), W = (e, t) => {
830
992
  if (!Number.isFinite(e) || !Number.isInteger(e) || e < 0) throw Error(`literalInt: expected non-negative integer, got ${e}`);
831
993
  return t.unsafe(String(e));
832
- }, K = (e, t, n) => R(Vn(e, t), n), q = (e, t, n, r = !1) => {
994
+ }, G = (e, t, n) => L(_r(e, t), n), K = (e, t, n, r = !1) => {
833
995
  let i = e.branch.onJunction;
834
- return i === void 0 ? n`` : n` AND ${K(r ? J(i) : i, t, n)}`;
835
- }, Vn = (e, t) => {
836
- if ("not" in e) return { not: Vn(e.not, t) };
837
- if ("and" in e) return { and: e.and.map((e) => Vn(e, t)) };
838
- if ("or" in e) return { or: e.or.map((e) => Vn(e, t)) };
996
+ return i === void 0 ? n`` : n` AND ${G(r ? q(i) : i, t, n)}`;
997
+ }, _r = (e, t) => {
998
+ if ("not" in e) return { not: _r(e.not, t) };
999
+ if ("and" in e) return { and: e.and.map((e) => _r(e, t)) };
1000
+ if ("or" in e) return { or: e.or.map((e) => _r(e, t)) };
839
1001
  if (e.op === "subquery-in" || e.op === "subquery-not-in") {
840
1002
  let n = e;
841
1003
  return {
@@ -849,91 +1011,91 @@ var at = (e) => e === "mysql" || e === "mariadb" || e === "mssql" || e === "sqli
849
1011
  ...n,
850
1012
  column: `${t}.${n.column}`
851
1013
  };
852
- }, J = (e) => {
853
- if ("not" in e) return { not: J(e.not) };
854
- if ("and" in e) return { and: e.and.map((e) => J(e)) };
855
- if ("or" in e) return { or: e.or.map((e) => J(e)) };
1014
+ }, q = (e) => {
1015
+ if ("not" in e) return { not: q(e.not) };
1016
+ if ("and" in e) return { and: e.and.map((e) => q(e)) };
1017
+ if ("or" in e) return { or: e.or.map((e) => q(e)) };
856
1018
  if (e.op === "subquery-in" || e.op === "subquery-not-in" || e.op === "exists" || e.op === "not-exists") return e;
857
1019
  let t = e;
858
1020
  return {
859
1021
  ...t,
860
- value: Hn(t.value)
1022
+ value: vr(t.value)
861
1023
  };
862
- }, Hn = (e) => e == null ? e : e instanceof Date ? e.toISOString() : typeof e == "boolean" ? +!!e : Array.isArray(e) ? e.map((e) => Hn(e)) : e, Un = Symbol.for("@voltro/database/coreTablesRegistry"), Wn = globalThis, Gn = Wn[Un] ?? (Wn[Un] = {}), Kn = (e) => {
863
- e.actors !== void 0 && (Gn.actors = e.actors), e.tenants !== void 0 && (Gn.tenants = e.tenants);
864
- }, qn = (e, t) => () => {
1024
+ }, vr = (e) => e == null ? e : e instanceof Date ? e.toISOString() : typeof e == "boolean" ? +!!e : Array.isArray(e) ? e.map((e) => vr(e)) : e, yr = Symbol.for("@voltro/database/coreTablesRegistry"), br = globalThis, xr = br[yr] ?? (br[yr] = {}), Sr = (e) => {
1025
+ e.actors !== void 0 && (xr.actors = e.actors), e.tenants !== void 0 && (xr.tenants = e.tenants);
1026
+ }, Cr = (e, t) => () => {
865
1027
  let n = e();
866
1028
  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`);
867
1029
  return n();
868
- }, Jn = () => qn(() => Gn.actors, "actors"), Yn = () => qn(() => Gn.tenants, "tenants"), Xn = n("actors", {
869
- id: T(),
870
- kind: o().oneOf([
1030
+ }, wr = () => Cr(() => xr.actors, "actors"), Tr = () => Cr(() => xr.tenants, "tenants"), Er = C("actors", {
1031
+ id: D(),
1032
+ kind: v().oneOf([
871
1033
  "user",
872
1034
  "serviceAccount",
873
1035
  "apiKey",
874
1036
  "system"
875
1037
  ]),
876
- displayName: o().nullable(),
877
- createdAt: v().default("now")
878
- }), Zn = (e, t) => ({
1038
+ displayName: v().nullable(),
1039
+ createdAt: E().default("now")
1040
+ }), Dr = (e, t) => ({
879
1041
  column: e,
880
1042
  op: "eq",
881
1043
  value: t
882
- }), Qn = (e, t) => ({
1044
+ }), Or = (e, t) => ({
883
1045
  column: e,
884
1046
  op: "neq",
885
1047
  value: t
886
- }), $n = (e, t) => ({
1048
+ }), kr = (e, t) => ({
887
1049
  column: e,
888
1050
  op: "gt",
889
1051
  value: t
890
- }), er = (e, t) => ({
1052
+ }), Ar = (e, t) => ({
891
1053
  column: e,
892
1054
  op: "gte",
893
1055
  value: t
894
- }), tr = (e, t) => ({
1056
+ }), jr = (e, t) => ({
895
1057
  column: e,
896
1058
  op: "lt",
897
1059
  value: t
898
- }), nr = (e, t) => ({
1060
+ }), Mr = (e, t) => ({
899
1061
  column: e,
900
1062
  op: "lte",
901
1063
  value: t
902
- }), rr = (e, t) => ({
1064
+ }), Nr = (e, t) => ({
903
1065
  column: e,
904
1066
  op: "in",
905
1067
  value: t
906
- }), ir = (e, t) => ({
1068
+ }), Pr = (e, t) => ({
907
1069
  column: e,
908
1070
  op: "notIn",
909
1071
  value: t
910
- }), ar = (e, t) => ({
1072
+ }), Fr = (e, t) => ({
911
1073
  column: e,
912
1074
  op: "contains",
913
1075
  value: t
914
- }), or = (e, t) => ({
1076
+ }), Ir = (e, t) => ({
915
1077
  column: e,
916
1078
  op: "arrayContains",
917
1079
  value: t
918
- }), sr = (e, t) => ({
1080
+ }), Lr = (e, t) => ({
919
1081
  column: e,
920
1082
  op: "arrayOverlaps",
921
1083
  value: t
922
- }), cr = (e, t) => ({
1084
+ }), Rr = (e, t) => ({
923
1085
  column: e,
924
1086
  op: "arrayHas",
925
1087
  value: t
926
- }), lr = (e) => ({
1088
+ }), zr = (e) => ({
927
1089
  column: e,
928
1090
  op: "isNull"
929
- }), ur = (e) => ({
1091
+ }), Br = (e) => ({
930
1092
  column: e,
931
1093
  op: "isNotNull"
932
- }), dr = (e, t) => ({
1094
+ }), Vr = (e, t) => ({
933
1095
  column: e,
934
1096
  op: "spatial",
935
1097
  value: t
936
- }), fr = (...e) => ({ and: e }), pr = (...e) => ({ or: e }), mr = (e) => ({ not: e }), hr = (e, ...t) => {
1098
+ }), Hr = (...e) => ({ and: e }), Ur = (...e) => ({ or: e }), Wr = (e) => ({ not: e }), Gr = (e, ...t) => {
937
1099
  if (t.length === 0) throw Error(`jsonField("${e}"): at least one path segment is required`);
938
1100
  let n = (n, r) => ({
939
1101
  column: e,
@@ -954,29 +1116,29 @@ var at = (e) => e === "mysql" || e === "mariadb" || e === "mssql" || e === "sqli
954
1116
  isNull: () => n("isNull"),
955
1117
  isNotNull: () => n("isNotNull")
956
1118
  };
957
- }, gr = (e) => "descriptor" in e ? e.descriptor : e, _r = (e, t) => ({
1119
+ }, Kr = (e) => "descriptor" in e ? e.descriptor : e, qr = (e, t) => ({
958
1120
  column: e,
959
1121
  op: "subquery-in",
960
- subquery: gr(t)
961
- }), vr = (e, t) => ({
1122
+ subquery: Kr(t)
1123
+ }), Jr = (e, t) => ({
962
1124
  column: e,
963
1125
  op: "subquery-not-in",
964
- subquery: gr(t)
965
- }), yr = (e) => ({
1126
+ subquery: Kr(t)
1127
+ }), Yr = (e) => ({
966
1128
  op: "exists",
967
- subquery: gr(e)
968
- }), br = (e) => ({
1129
+ subquery: Kr(e)
1130
+ }), Xr = (e) => ({
969
1131
  op: "not-exists",
970
- subquery: gr(e)
971
- }), xr = (e, t) => e == null || t == null ? null : typeof e == typeof t ? e === t ? 0 : e > t ? 1 : -1 : null, Sr = (e, t, n = null) => {
1132
+ subquery: Kr(e)
1133
+ }), J = (e, t) => e == null || t == null ? null : typeof e == typeof t ? e === t ? 0 : e > t ? 1 : -1 : null, Zr = (e, t, n = null) => {
972
1134
  if (!t) return !1;
973
- if ("not" in e) return !Sr(e.not, t, n);
1135
+ if ("not" in e) return !Zr(e.not, t, n);
974
1136
  if ("and" in e) {
975
- for (let r of e.and) if (!Sr(r, t, n)) return !1;
1137
+ for (let r of e.and) if (!Zr(r, t, n)) return !1;
976
1138
  return !0;
977
1139
  }
978
1140
  if ("or" in e) {
979
- for (let r of e.or) if (Sr(r, t, n)) return !0;
1141
+ for (let r of e.or) if (Zr(r, t, n)) return !0;
980
1142
  return !1;
981
1143
  }
982
1144
  if (e.op === "subquery-in" || e.op === "subquery-not-in") {
@@ -995,10 +1157,10 @@ var at = (e) => e === "mysql" || e === "mariadb" || e === "mssql" || e === "sqli
995
1157
  switch (r.op) {
996
1158
  case "eq": return i === r.value;
997
1159
  case "neq": return i !== r.value;
998
- case "gt": return (xr(i, r.value) ?? -1) > 0;
999
- case "gte": return (xr(i, r.value) ?? -1) >= 0;
1000
- case "lt": return (xr(i, r.value) ?? 1) < 0;
1001
- case "lte": return (xr(i, r.value) ?? 1) <= 0;
1160
+ case "gt": return (J(i, r.value) ?? -1) > 0;
1161
+ case "gte": return (J(i, r.value) ?? -1) >= 0;
1162
+ case "lt": return (J(i, r.value) ?? 1) < 0;
1163
+ case "lte": return (J(i, r.value) ?? 1) <= 0;
1002
1164
  case "in": return Array.isArray(r.value) && r.value.includes(i);
1003
1165
  case "notIn": return Array.isArray(r.value) && !r.value.includes(i);
1004
1166
  case "contains": return typeof i == "string" && typeof r.value == "string" && i.toLowerCase().includes(r.value.toLowerCase());
@@ -1015,17 +1177,17 @@ var at = (e) => e === "mysql" || e === "mariadb" || e === "mssql" || e === "sqli
1015
1177
  case "isNotNull": return i != null;
1016
1178
  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.");
1017
1179
  }
1018
- }, Cr = function* (e) {
1180
+ }, Qr = function* (e) {
1019
1181
  if ("not" in e) {
1020
- yield* Cr(e.not);
1182
+ yield* Qr(e.not);
1021
1183
  return;
1022
1184
  }
1023
1185
  if ("and" in e) {
1024
- for (let t of e.and) yield* Cr(t);
1186
+ for (let t of e.and) yield* Qr(t);
1025
1187
  return;
1026
1188
  }
1027
1189
  if ("or" in e) {
1028
- for (let t of e.or) yield* Cr(t);
1190
+ for (let t of e.or) yield* Qr(t);
1029
1191
  return;
1030
1192
  }
1031
1193
  e.op === "subquery-in" || e.op === "subquery-not-in" ? yield {
@@ -1035,27 +1197,27 @@ var at = (e) => e === "mysql" || e === "mariadb" || e === "mssql" || e === "sqli
1035
1197
  kind: "exists",
1036
1198
  descriptor: e.subquery
1037
1199
  });
1038
- }, wr = function* (e, t = !0) {
1200
+ }, $r = function* (e, t = !0) {
1039
1201
  if ("not" in e) {
1040
- yield* wr(e.not, !1);
1202
+ yield* $r(e.not, !1);
1041
1203
  return;
1042
1204
  }
1043
1205
  if ("and" in e) {
1044
- for (let n of e.and) yield* wr(n, t);
1206
+ for (let n of e.and) yield* $r(n, t);
1045
1207
  return;
1046
1208
  }
1047
1209
  if ("or" in e) {
1048
- for (let t of e.or) yield* wr(t, !1);
1210
+ for (let t of e.or) yield* $r(t, !1);
1049
1211
  return;
1050
1212
  }
1051
1213
  e.op === "subquery-in" || e.op === "subquery-not-in" || e.op === "exists" || e.op === "not-exists" || (yield {
1052
1214
  ...e,
1053
1215
  conjunctive: t
1054
1216
  });
1055
- }, Tr = class extends nt.TaggedError("TableStreamError") {}, Er = 1e3, Dr = (e, t, n, r) => {
1217
+ }, ei = class extends rt.TaggedError("TableStreamError") {}, ti = 1e3, ni = (e, t, n, r) => {
1056
1218
  let i = O.match(r, {
1057
1219
  onNone: () => e.where,
1058
- onSome: (n) => e.where ? fr(e.where, $n(t, n)) : $n(t, n)
1220
+ onSome: (n) => e.where ? Hr(e.where, kr(t, n)) : kr(t, n)
1059
1221
  });
1060
1222
  return {
1061
1223
  table: e.table,
@@ -1070,19 +1232,19 @@ var at = (e) => e === "mysql" || e === "mariadb" || e === "mssql" || e === "sqli
1070
1232
  ...e.includeDeleted === void 0 ? {} : { includeDeleted: e.includeDeleted },
1071
1233
  ...e.crossTenant === void 0 ? {} : { crossTenant: e.crossTenant }
1072
1234
  };
1073
- }, Or = (e, t) => {
1074
- let n = t.pk ?? "id", r = t.chunkSize ?? Er;
1075
- return it.paginateChunkEffect(O.none(), (i) => {
1076
- let a = rt.tryPromise({
1077
- try: () => e.query(Dr(t, n, r, i)),
1078
- catch: (e) => new Tr({
1235
+ }, ri = (e, t) => {
1236
+ let n = t.pk ?? "id", r = t.chunkSize ?? ti;
1237
+ return at.paginateChunkEffect(O.none(), (i) => {
1238
+ let a = it.tryPromise({
1239
+ try: () => e.query(ni(t, n, r, i)),
1240
+ catch: (e) => new ei({
1079
1241
  table: t.table,
1080
1242
  cause: e
1081
1243
  })
1082
1244
  });
1083
- return (t.retry ? a.pipe(rt.retry(t.retry)) : a).pipe(rt.map((e) => [tt.fromIterable(e), e.length === r && e.length > 0 ? O.some(O.some(e[e.length - 1][n])) : O.none()]));
1245
+ return (t.retry ? a.pipe(it.retry(t.retry)) : a).pipe(it.map((e) => [nt.fromIterable(e), e.length === r && e.length > 0 ? O.some(O.some(e[e.length - 1][n])) : O.none()]));
1084
1246
  });
1085
- }, kr = (e) => {
1247
+ }, ii = (e) => {
1086
1248
  let t = e.alpha ?? .5;
1087
1249
  if (t < 0 || t > 1) throw Error(`hybridSearch: alpha must be in [0, 1], got ${t}`);
1088
1250
  return (n) => {
@@ -1096,7 +1258,7 @@ var at = (e) => e === "mysql" || e === "mariadb" || e === "mssql" || e === "sqli
1096
1258
  queryText: e.vector.query,
1097
1259
  distance: e.vector.distance ?? "cosine",
1098
1260
  alpha: t
1099
- }, i = C(n.table, e.fts.indexName, n.fullTextIndexes);
1261
+ }, i = c(n.table, e.fts.indexName, n.fullTextIndexes);
1100
1262
  return {
1101
1263
  ...n,
1102
1264
  annClause: r,
@@ -1109,17 +1271,17 @@ var at = (e) => e === "mysql" || e === "mariadb" || e === "mssql" || e === "sqli
1109
1271
  }
1110
1272
  };
1111
1273
  };
1112
- }, Ar = async (e, t) => {
1274
+ }, ai = async (e, t) => {
1113
1275
  let n = e.as ?? "embedding", r = t.row[e.from];
1114
1276
  if (typeof r != "string" || r.length === 0) return {};
1115
1277
  let i = await t.embed(r);
1116
1278
  return { [n]: i };
1117
- }, jr = (e) => {
1279
+ }, oi = (e) => {
1118
1280
  if (!Number.isInteger(e.dimensions) || e.dimensions <= 0) throw Error(`vectorEmbedding: dimensions must be a positive integer, got ${String(e.dimensions)}.`);
1119
- let t = e.as ?? "embedding", n = (t) => Ar(e, t);
1120
- return d({
1281
+ let t = e.as ?? "embedding", r = (t) => ai(e, t);
1282
+ return ae({
1121
1283
  id: "voltro/vectorEmbedding",
1122
- fields: { [t]: ke(e.dimensions) },
1284
+ fields: { [t]: n(e.dimensions) },
1123
1285
  ...e.index === !1 ? {} : { indexes: [{
1124
1286
  fields: [t],
1125
1287
  kind: "hnsw",
@@ -1130,23 +1292,23 @@ var at = (e) => e === "mysql" || e === "mariadb" || e === "mssql" || e === "sqli
1130
1292
  } }
1131
1293
  }] },
1132
1294
  behaviors: {
1133
- beforeInsert: n,
1134
- beforeUpdate: n
1295
+ beforeInsert: r,
1296
+ beforeUpdate: r
1135
1297
  }
1136
1298
  });
1137
- }, Mr = 63, Nr = "br_pr", Y = class extends Error {
1299
+ }, si = 63, ci = "br_pr", Y = class extends Error {
1138
1300
  _tag = "BranchNameInvalid";
1139
1301
  constructor(e) {
1140
1302
  super(e), this.name = "BranchNameInvalid";
1141
1303
  }
1142
- }, Pr = (e, t) => {
1304
+ }, li = (e, t) => {
1143
1305
  if (!Number.isInteger(t) || t < 0) throw new Y(`prNumber must be a non-negative integer, got ${String(t)}`);
1144
- let n = Zt(e);
1306
+ let n = un(e);
1145
1307
  if (n.replace(/_/g, "") === "") throw new Y(`app slug '${e}' has no usable identifier characters`);
1146
- let r = `${Nr}${t}_${n}`;
1147
- if (r.length > Mr) throw new Y(`branch namespace '${r}' exceeds the ${Mr}-byte identifier limit — use a shorter app slug`);
1308
+ let r = `${ci}${t}_${n}`;
1309
+ if (r.length > si) throw new Y(`branch namespace '${r}' exceeds the ${si}-byte identifier limit — use a shorter app slug`);
1148
1310
  return r;
1149
- }, Fr = (e) => e.startsWith(Nr), Ir = {
1311
+ }, ui = (e) => e.startsWith(ci), di = {
1150
1312
  requested: {
1151
1313
  provision: "provisioning",
1152
1314
  destroy: "destroying"
@@ -1165,18 +1327,18 @@ var at = (e) => e === "mysql" || e === "mariadb" || e === "mssql" || e === "sqli
1165
1327
  fail: "failed"
1166
1328
  },
1167
1329
  destroyed: {}
1168
- }, Lr = class extends Error {
1330
+ }, fi = class extends Error {
1169
1331
  from;
1170
1332
  event;
1171
1333
  _tag = "BranchTransitionInvalid";
1172
1334
  constructor(e, t) {
1173
1335
  super(`invalid branch transition: ${e} --${t}-->`), this.from = e, this.event = t, this.name = "BranchTransitionInvalid";
1174
1336
  }
1175
- }, Rr = (e, t) => {
1176
- let n = Ir[e][t];
1177
- if (n === void 0) throw new Lr(e, t);
1337
+ }, pi = (e, t) => {
1338
+ let n = di[e][t];
1339
+ if (n === void 0) throw new fi(e, t);
1178
1340
  return n;
1179
- }, zr = (e, t, n, r) => {
1341
+ }, mi = (e, t, n, r) => {
1180
1342
  if (n === "copy" && (r === void 0 || r === "")) throw new Y("seed 'copy' requires a parentNamespace to snapshot from");
1181
1343
  let i = [{
1182
1344
  kind: "create-namespace",
@@ -1197,13 +1359,13 @@ var at = (e) => e === "mysql" || e === "mariadb" || e === "mssql" || e === "sqli
1197
1359
  detail: `run boot seeds into ${e}`
1198
1360
  });
1199
1361
  return i;
1200
- }, Br = (e) => {
1201
- if (!Fr(e)) throw new Y(`refusing to plan teardown of '${e}' — not a branch namespace`);
1362
+ }, hi = (e) => {
1363
+ if (!ui(e)) throw new Y(`refusing to plan teardown of '${e}' — not a branch namespace`);
1202
1364
  return [{
1203
1365
  kind: "drop-namespace",
1204
1366
  detail: e
1205
1367
  }];
1206
- }, Vr = (e) => {
1368
+ }, gi = (e) => {
1207
1369
  if (e === void 0 || e === "") return !1;
1208
1370
  try {
1209
1371
  let t = new URL(e).hostname.toLowerCase();
@@ -1211,27 +1373,27 @@ var at = (e) => e === "mysql" || e === "mariadb" || e === "mssql" || e === "sqli
1211
1373
  } catch {
1212
1374
  return /\bneon\.(tech|build)\b/i.test(e);
1213
1375
  }
1214
- }, Hr = (e) => e.prefer === void 0 ? e.seed === "copy" && Vr(e.dbUrl) ? "neon-cow" : "namespace" : e.prefer, Ur = (e, t = {}) => [{
1376
+ }, _i = (e) => e.prefer === void 0 ? e.seed === "copy" && gi(e.dbUrl) ? "neon-cow" : "namespace" : e.prefer, vi = (e, t = {}) => [{
1215
1377
  kind: "neon-branch-create",
1216
1378
  detail: `${t.parentBranch ?? "main"} → ${e} (copy-on-write)`
1217
- }], Wr = (e) => {
1218
- if (!Fr(e)) throw new Y(`refusing to plan teardown of '${e}' — not a branch namespace`);
1379
+ }], yi = (e) => {
1380
+ if (!ui(e)) throw new Y(`refusing to plan teardown of '${e}' — not a branch namespace`);
1219
1381
  return [{
1220
1382
  kind: "neon-branch-delete",
1221
1383
  detail: e
1222
1384
  }];
1223
- }, Gr = (e) => e.mechanism === "neon-cow" ? Ur(e.branchId, e.neonParentBranch === void 0 ? {} : { parentBranch: e.neonParentBranch }) : zr(e.branchId, e.tableNames, e.seed, e.parentNamespace), Kr = (e, t) => e === "neon-cow" ? Wr(t) : Br(t), qr = (e, t, n) => {
1385
+ }, bi = (e) => e.mechanism === "neon-cow" ? vi(e.branchId, e.neonParentBranch === void 0 ? {} : { parentBranch: e.neonParentBranch }) : mi(e.branchId, e.tableNames, e.seed, e.parentNamespace), xi = (e, t) => e === "neon-cow" ? yi(t) : hi(t), Si = (e, t, n) => {
1224
1386
  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);
1225
1387
  return {
1226
1388
  evict: i,
1227
1389
  rejectNew: r.filter((e) => !a.has(e.namespace)).length >= t.maxBranches
1228
1390
  };
1229
- }, Jr = async (e, t) => {
1230
- let n = Pr(e.appSlug, e.prNumber), r = Hr({
1391
+ }, Ci = async (e, t) => {
1392
+ let n = li(e.appSlug, e.prNumber), r = _i({
1231
1393
  seed: e.seed,
1232
1394
  ...e.dbUrl === void 0 ? {} : { dbUrl: e.dbUrl },
1233
1395
  ...e.prefer === void 0 ? {} : { prefer: e.prefer }
1234
- }), i = Gr({
1396
+ }), i = bi({
1235
1397
  mechanism: r,
1236
1398
  branchId: n,
1237
1399
  tableNames: e.tableNames,
@@ -1256,10 +1418,10 @@ var at = (e) => e === "mysql" || e === "mariadb" || e === "mssql" || e === "sqli
1256
1418
  mechanism: r,
1257
1419
  steps: i
1258
1420
  };
1259
- }, Yr = async (e, t, n) => {
1260
- let r = Kr(t, e);
1421
+ }, wi = async (e, t, n) => {
1422
+ let r = xi(t, e);
1261
1423
  return t === "neon-cow" ? await n.neonBranchDelete(e) : await n.dropNamespace(e), r;
1262
- }, Xr = (e, t, n) => qr(e, t, n), X = (e) => `"${e.replace(/"/g, "\"\"")}"`, Zr = (e) => {
1424
+ }, Ti = (e, t, n) => Si(e, t, n), X = (e) => `"${e.replace(/"/g, "\"\"")}"`, Ei = (e) => {
1263
1425
  let t = () => {
1264
1426
  throw Error("namespace branch executor: Neon ops require a neon-cow executor (use a Neon connection for copy-on-write branches)");
1265
1427
  };
@@ -1271,18 +1433,18 @@ var at = (e) => e === "mysql" || e === "mariadb" || e === "mssql" || e === "sqli
1271
1433
  neonBranchCreate: t,
1272
1434
  neonBranchDelete: t
1273
1435
  };
1274
- }, Qr = class extends Error {
1436
+ }, Di = class extends Error {
1275
1437
  _tag = "TenantResidencyUnresolved";
1276
1438
  constructor(e) {
1277
1439
  super(e), this.name = "TenantResidencyUnresolved";
1278
1440
  }
1279
- }, $r = class extends Error {
1441
+ }, Oi = class extends Error {
1280
1442
  region;
1281
1443
  _tag = "TenantRegionUnavailable";
1282
1444
  constructor(e, t) {
1283
1445
  super(t), this.region = e, this.name = "TenantRegionUnavailable";
1284
1446
  }
1285
- }, ei, ti = (e) => {
1447
+ }, ki, Ai = (e) => {
1286
1448
  if (e.homes === void 0) throw Error("setResidencyConfig: `homes` is required");
1287
1449
  if (e.servableRegions === void 0 || e.servableRegions.length === 0) throw Error("setResidencyConfig: `servableRegions` must be non-empty (which regions this deployment serves)");
1288
1450
  let t = /* @__PURE__ */ new Map();
@@ -1291,32 +1453,32 @@ var at = (e) => e === "mysql" || e === "mariadb" || e === "mssql" || e === "sqli
1291
1453
  if (e !== void 0 && e !== n.region) throw Error(`residency: tenant '${n.tenantId}' is mapped to two regions ('${e}' and '${n.region}')`);
1292
1454
  t.set(n.tenantId, n.region);
1293
1455
  }
1294
- return ei = e, e;
1295
- }, ni = () => ei, ri = () => {
1296
- ei = void 0;
1297
- }, ii = (e, t) => {
1298
- if (e == null || e === "") throw new Qr("residency is on but the request has no resolvable tenant — refusing to bind a store");
1456
+ return ki = e, e;
1457
+ }, ji = () => ki, Mi = () => {
1458
+ ki = void 0;
1459
+ }, Ni = (e, t) => {
1460
+ if (e == null || e === "") throw new Di("residency is on but the request has no resolvable tenant — refusing to bind a store");
1299
1461
  let n = t.homes.find((t) => t.tenantId === e);
1300
- if (n === void 0) throw new Qr(`no residency home is mapped for tenant '${e}' — refusing to fall back to a default store (would be a residency violation)`);
1462
+ if (n === void 0) throw new Di(`no residency home is mapped for tenant '${e}' — refusing to fall back to a default store (would be a residency violation)`);
1301
1463
  return n;
1302
- }, ai = (e, t) => t.servableRegions.includes(e), oi = (e, t) => {
1303
- let n = ii(e.tenantId, t), r = Qt(n.tenantId);
1464
+ }, Pi = (e, t) => t.servableRegions.includes(e), Fi = (e, t) => {
1465
+ let n = Ni(e.tenantId, t), r = dn(n.tenantId);
1304
1466
  return {
1305
1467
  region: n.region,
1306
1468
  namespace: r,
1307
1469
  ...n.connectionKey === void 0 ? {} : { connectionKey: n.connectionKey }
1308
1470
  };
1309
- }, si = (e, t, n) => {
1310
- let r = oi(e, t);
1311
- if (!ai(r.region, t)) throw new $r(r.region, `tenant homed in region '${r.region}', which this deployment does not serve — route to the home region`);
1471
+ }, Ii = (e, t, n) => {
1472
+ let r = Fi(e, t);
1473
+ if (!Pi(r.region, t)) throw new Oi(r.region, `tenant homed in region '${r.region}', which this deployment does not serve — route to the home region`);
1312
1474
  let i = n.get(r.region);
1313
- if (i === void 0) throw new $r(r.region, `no store handle for home region '${r.region}' (declared servable but not wired) — failing closed`);
1475
+ if (i === void 0) throw new Oi(r.region, `no store handle for home region '${r.region}' (declared servable but not wired) — failing closed`);
1314
1476
  return {
1315
1477
  store: i,
1316
1478
  placement: r
1317
1479
  };
1318
- }, ci = async (e, t, n, r) => {
1319
- let { store: i, placement: a } = si(e, t, n);
1480
+ }, Li = async (e, t, n, r) => {
1481
+ let { store: i, placement: a } = Ii(e, t, n);
1320
1482
  return await r(i, a), a;
1321
1483
  }, Z = (e) => {
1322
1484
  if (typeof e == "string") return e;
@@ -1325,21 +1487,21 @@ var at = (e) => e === "mysql" || e === "mariadb" || e === "mssql" || e === "sqli
1325
1487
  return `(json:${t}->${n.join(".")}${r ? "::num" : ""})`;
1326
1488
  }
1327
1489
  return `(${e.expr})`;
1328
- }, Q = (e) => e.map(Z), li = (e, t) => {
1490
+ }, Q = (e) => e.map(Z), Ri = (e, t) => {
1329
1491
  if (e.length !== t.length) return !1;
1330
1492
  for (let n = 0; n < e.length; n++) if (Z(e[n]) !== Z(t[n])) return !1;
1331
1493
  return !0;
1332
- }, ui = (e, t) => {
1494
+ }, zi = (e, t) => {
1333
1495
  if (e.length >= t.length) return !1;
1334
1496
  for (let n = 0; n < e.length; n++) if (Z(e[n]) !== Z(t[n])) return !1;
1335
1497
  return !0;
1336
- }, di = (e) => {
1498
+ }, Bi = (e) => {
1337
1499
  let t = [], n = e.appliedIndexes, r = e.tableName;
1338
1500
  for (let e = 0; e < n.length; e++) {
1339
1501
  let i = n[e];
1340
1502
  for (let a = e + 1; a < n.length; a++) {
1341
1503
  let e = n[a];
1342
- if (li(i.fields, e.fields)) {
1504
+ if (Ri(i.fields, e.fields)) {
1343
1505
  let [n, a] = i.name < e.name ? [i, e] : [e, i];
1344
1506
  t.push({
1345
1507
  kind: "duplicate-fields",
@@ -1350,13 +1512,13 @@ var at = (e) => e === "mysql" || e === "mariadb" || e === "mssql" || e === "sqli
1350
1512
  });
1351
1513
  continue;
1352
1514
  }
1353
- ui(i.fields, e.fields) ? t.push({
1515
+ zi(i.fields, e.fields) ? t.push({
1354
1516
  kind: "redundant-prefix",
1355
1517
  table: r,
1356
1518
  redundant: i,
1357
1519
  coveredBy: e,
1358
1520
  message: `'${r}' index '${i.name}' on [${Q(i.fields).join(", ")}] is a leading prefix of '${e.name}' on [${Q(e.fields).join(", ")}]. Every B-tree dialect we support (Postgres / MySQL / MariaDB / MSSQL / SQLite) can serve a [${Q(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).`
1359
- }) : ui(e.fields, i.fields) && t.push({
1521
+ }) : zi(e.fields, i.fields) && t.push({
1360
1522
  kind: "redundant-prefix",
1361
1523
  table: r,
1362
1524
  redundant: e,
@@ -1366,23 +1528,23 @@ var at = (e) => e === "mysql" || e === "mariadb" || e === "mssql" || e === "sqli
1366
1528
  }
1367
1529
  }
1368
1530
  return t;
1369
- }, fi = (e) => {
1531
+ }, Vi = (e) => {
1370
1532
  let t = [];
1371
- for (let n of e) t.push(...di(n));
1533
+ for (let n of e) t.push(...Bi(n));
1372
1534
  return t;
1373
- }, pi = "\x1B[", mi = `${pi}38;2;245;158;11m`, hi = `${pi}38;2;16;185;129m`, gi = (e, t) => `${e}${t}${k.reset}`, $ = (e, t, n) => e ? typeof t == "function" ? t(n) : gi(t, n) : n, _i = (e, t = {}) => {
1374
- let n = t.color ?? !0, r = t.indent ?? " ", i = (e) => $(n, k.dim, e.padEnd(11)), a = (e) => $(n, (e) => k.bold(k.brand(e)), e), o = (e) => $(n, k.brightRed24, e), s = (e) => $(n, hi, e), c = (e) => $(n, mi, e), l = (e) => $(n, k.dim, e), u = `${c("index audit")} ${l("·")} ${$(n, k.bold, e.kind)}`, d = e.redundant.fields.length, f = Q(e.coveredBy.fields.slice(d)), p = (e, t) => {
1535
+ }, Hi = "\x1B[", Ui = `${Hi}38;2;245;158;11m`, Wi = `${Hi}38;2;16;185;129m`, Gi = (e, t) => `${e}${t}${A.reset}`, $ = (e, t, n) => e ? typeof t == "function" ? t(n) : Gi(t, n) : n, Ki = (e, t = {}) => {
1536
+ let n = t.color ?? !0, r = t.indent ?? " ", i = (e) => $(n, A.dim, e.padEnd(11)), a = (e) => $(n, (e) => A.bold(A.brand(e)), e), o = (e) => $(n, A.brightRed24, e), s = (e) => $(n, Wi, e), c = (e) => $(n, Ui, e), l = (e) => $(n, A.dim, e), u = `${c("index audit")} ${l("·")} ${$(n, A.bold, e.kind)}`, d = e.redundant.fields.length, f = Q(e.coveredBy.fields.slice(d)), p = (e, t) => {
1375
1537
  let n = e.slice(0, t), r = e.slice(t), i = [];
1376
1538
  return n.length > 0 && i.push(s(`[${n.join(", ")}]`)), r.length > 0 && i.push(c(`+ [${r.join(", ")}]`)), i.join(" ");
1377
1539
  }, m = [];
1378
- 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(Q(e.redundant.fields), d)}`), m.push(""), m.push(`${i("covered by")}${s(e.coveredBy.name)}`), m.push(`${i("")}${p(Q(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 ${$(n, k.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");
1379
- }, vi = (e, t) => ({
1540
+ 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(Q(e.redundant.fields), d)}`), m.push(""), m.push(`${i("covered by")}${s(e.coveredBy.name)}`), m.push(`${i("")}${p(Q(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 ${$(n, A.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");
1541
+ }, qi = (e, t) => ({
1380
1542
  name: e,
1381
1543
  body: t
1382
- }), yi = (e) => {
1544
+ }), Ji = (e) => {
1383
1545
  if (e.lifecycle === "cron" && !e.cron) throw Error(`seed "${e.id}": lifecycle 'cron' requires a 'cron' field`);
1384
1546
  if (e.lifecycle === "onSchemaChange" && (!e.watchedTables || e.watchedTables.length === 0)) throw Error(`seed "${e.id}": lifecycle 'onSchemaChange' requires at least one entry in 'watchedTables'`);
1385
- let t = e.steps({ step: vi });
1547
+ let t = e.steps({ step: qi });
1386
1548
  if (t.length === 0) throw Error(`seed "${e.id}": at least one step is required`);
1387
1549
  return {
1388
1550
  __seed: !0,
@@ -1394,13 +1556,13 @@ var at = (e) => e === "mysql" || e === "mariadb" || e === "mssql" || e === "sqli
1394
1556
  ...e.fingerprint === void 0 ? {} : { fingerprint: e.fingerprint },
1395
1557
  steps: t
1396
1558
  };
1397
- }, bi = (e) => typeof e == "object" && !!e && "__seed" in e && e.__seed === !0, xi = (e, { apply: t, undo: n }) => ({
1559
+ }, Yi = (e) => typeof e == "object" && !!e && "__seed" in e && e.__seed === !0, Xi = (e, { apply: t, undo: n }) => ({
1398
1560
  name: e,
1399
1561
  apply: t,
1400
1562
  undo: n
1401
- }), Si = (e) => {
1563
+ }), Zi = (e) => {
1402
1564
  if (!/^\d{14}_/.test(e.id)) throw Error(`migration "${e.id}": id must start with a 14-digit timestamp followed by "_" (convention: <YYYYMMDDHHMMSS>_<slug>)`);
1403
- let t = e.steps({ step: xi });
1565
+ let t = e.steps({ step: Xi });
1404
1566
  if (t.length === 0) throw Error(`migration "${e.id}": at least one step is required`);
1405
1567
  return {
1406
1568
  __migration: !0,
@@ -1408,111 +1570,111 @@ var at = (e) => e === "mysql" || e === "mariadb" || e === "mssql" || e === "sqli
1408
1570
  name: e.name,
1409
1571
  steps: t
1410
1572
  };
1411
- }, Ci = (e) => typeof e == "object" && !!e && "__migration" in e && e.__migration === !0, wi = n("_voltro_migrations", {
1412
- id: T({ prefix: "mig" }),
1413
- name: o(),
1414
- hash: o(),
1415
- status: o(),
1416
- appliedAt: v().nullable(),
1417
- durationMs: D().nullable(),
1418
- errorMessage: o().nullable(),
1419
- errorStack: o().nullable(),
1420
- workflowRunId: o().nullable(),
1421
- createdAt: v().default("now"),
1422
- updatedAt: v().default("now").onUpdate("now")
1423
- }).index(["status"]).reactive(), Ti = n("_voltro_seeds", {
1424
- id: T({ prefix: "seed" }),
1425
- name: o(),
1426
- lifecycle: o(),
1427
- fingerprint: o(),
1428
- cronSchedule: o().nullable(),
1429
- watchedTables: E().nullable(),
1430
- nextRunAt: v().nullable(),
1431
- lastRunStatus: o().nullable(),
1432
- lastRunAt: v().nullable(),
1433
- lastRunDurationMs: D().nullable(),
1434
- lastRunRowsTouched: D().nullable(),
1435
- lastError: o().nullable(),
1436
- workflowRunId: o().nullable(),
1437
- createdAt: v().default("now"),
1438
- updatedAt: v().default("now").onUpdate("now")
1439
- }).index(["lifecycle"]).index(["nextRunAt"]).reactive(), Ei = n("_voltro_migration_plans", {
1440
- id: T({ prefix: "plan" }),
1441
- fingerprint: o(),
1442
- operations: E(),
1443
- rollbackPlan: E().nullable(),
1444
- appliedBy: o(),
1445
- environment: o(),
1446
- source: o(),
1447
- onlineStrategy: o().nullable(),
1448
- durationMs: D(),
1449
- notes: o().nullable(),
1450
- squashedAt: v().nullable(),
1451
- appliedAt: v().default("now"),
1452
- createdAt: v().default("now"),
1453
- updatedAt: v().default("now").onUpdate("now")
1454
- }).index(["fingerprint"]).index(["environment"]).reactive(), Di = n("_voltro_idempotency", {
1455
- id: T({ prefix: "idem" }),
1456
- scope: o(),
1457
- key: o(),
1458
- status: o(),
1459
- response: E().nullable(),
1460
- createdAt: v().default("now")
1461
- }).unique(["scope", "key"]).index(["createdAt"]).reactive(), Oi = n("_voltro_kv", {
1462
- id: T({ prefix: "kv" }),
1463
- key: o().unique(),
1464
- value: o().nullable(),
1465
- expiresAt: v().nullable(),
1466
- createdAt: v().default("now"),
1467
- updatedAt: v().default("now").onUpdate("now")
1468
- }).index(["expiresAt"]).reactive(), ki = n("_voltro_api_keys", {
1469
- id: T({ prefix: "apikey" }),
1470
- tenantId: o().nullable(),
1471
- name: o(),
1472
- hashedKey: o().unique(),
1473
- keyPrefix: o(),
1474
- scopes: E().nullable(),
1475
- lastUsedAt: v().nullable(),
1476
- expiresAt: v().nullable(),
1477
- revokedAt: v().nullable(),
1478
- createdBy: o().nullable(),
1479
- createdAt: v().default("now")
1480
- }).index("byTenant", ["tenantId"]).reactive(), Ai = [
1481
- wi,
1482
- Ti,
1483
- Ei
1484
- ], ji = (e, t, n) => ({
1573
+ }, Qi = (e) => typeof e == "object" && !!e && "__migration" in e && e.__migration === !0, $i = C("_voltro_migrations", {
1574
+ id: D({ prefix: "mig" }),
1575
+ name: v(),
1576
+ hash: v(),
1577
+ status: v(),
1578
+ appliedAt: E().nullable(),
1579
+ durationMs: w().nullable(),
1580
+ errorMessage: v().nullable(),
1581
+ errorStack: v().nullable(),
1582
+ workflowRunId: v().nullable(),
1583
+ createdAt: E().default("now"),
1584
+ updatedAt: E().default("now").onUpdate("now")
1585
+ }).index(["status"]).reactive(), ea = C("_voltro_seeds", {
1586
+ id: D({ prefix: "seed" }),
1587
+ name: v(),
1588
+ lifecycle: v(),
1589
+ fingerprint: v(),
1590
+ cronSchedule: v().nullable(),
1591
+ watchedTables: S().nullable(),
1592
+ nextRunAt: E().nullable(),
1593
+ lastRunStatus: v().nullable(),
1594
+ lastRunAt: E().nullable(),
1595
+ lastRunDurationMs: w().nullable(),
1596
+ lastRunRowsTouched: w().nullable(),
1597
+ lastError: v().nullable(),
1598
+ workflowRunId: v().nullable(),
1599
+ createdAt: E().default("now"),
1600
+ updatedAt: E().default("now").onUpdate("now")
1601
+ }).index(["lifecycle"]).index(["nextRunAt"]).reactive(), ta = C("_voltro_migration_plans", {
1602
+ id: D({ prefix: "plan" }),
1603
+ fingerprint: v(),
1604
+ operations: S(),
1605
+ rollbackPlan: S().nullable(),
1606
+ appliedBy: v(),
1607
+ environment: v(),
1608
+ source: v(),
1609
+ onlineStrategy: v().nullable(),
1610
+ durationMs: w(),
1611
+ notes: v().nullable(),
1612
+ squashedAt: E().nullable(),
1613
+ appliedAt: E().default("now"),
1614
+ createdAt: E().default("now"),
1615
+ updatedAt: E().default("now").onUpdate("now")
1616
+ }).index(["fingerprint"]).index(["environment"]).reactive(), na = C("_voltro_idempotency", {
1617
+ id: D({ prefix: "idem" }),
1618
+ scope: v(),
1619
+ key: v(),
1620
+ status: v(),
1621
+ response: S().nullable(),
1622
+ createdAt: E().default("now")
1623
+ }).unique(["scope", "key"]).index(["createdAt"]).reactive(), ra = C("_voltro_kv", {
1624
+ id: D({ prefix: "kv" }),
1625
+ key: v().unique(),
1626
+ value: v().nullable(),
1627
+ expiresAt: E().nullable(),
1628
+ createdAt: E().default("now"),
1629
+ updatedAt: E().default("now").onUpdate("now")
1630
+ }).index(["expiresAt"]).reactive(), ia = C("_voltro_api_keys", {
1631
+ id: D({ prefix: "apikey" }),
1632
+ tenantId: v().nullable(),
1633
+ name: v(),
1634
+ hashedKey: v().unique(),
1635
+ keyPrefix: v(),
1636
+ scopes: S().nullable(),
1637
+ lastUsedAt: E().nullable(),
1638
+ expiresAt: E().nullable(),
1639
+ revokedAt: E().nullable(),
1640
+ createdBy: v().nullable(),
1641
+ createdAt: E().default("now")
1642
+ }).index("byTenant", ["tenantId"]).reactive(), aa = [
1643
+ $i,
1644
+ ea,
1645
+ ta
1646
+ ], oa = (e, t, n) => ({
1485
1647
  _tag: "PrimaryKeyConflictError",
1486
1648
  table: e,
1487
1649
  key: t,
1488
1650
  cause: n
1489
- }), Mi = (e) => typeof e == "object" && !!e && e._tag === "PrimaryKeyConflictError", Ni = /* @__PURE__ */ new Map(), Pi = (e) => {
1651
+ }), sa = (e) => typeof e == "object" && !!e && e._tag === "PrimaryKeyConflictError", ca = /* @__PURE__ */ new Map(), la = (e) => {
1490
1652
  if (!e.table || !e.timeColumn) throw Error("registerRetention: table + timeColumn are required");
1491
1653
  if (!Number.isFinite(e.ttlMs) || e.ttlMs <= 0) throw Error(`registerRetention(${e.table}): ttlMs must be a positive number`);
1492
- Ni.set(e.table, e);
1493
- }, Fi = () => [...Ni.values()], Ii = () => Ni.clear(), Li = async (e, t, n, r = 2e4) => {
1654
+ ca.set(e.table, e);
1655
+ }, ua = () => [...ca.values()], da = () => ca.clear(), fa = async (e, t, n, r = 2e4) => {
1494
1656
  let i = new Date(t - e.ttlMs), a = 0;
1495
1657
  for (;;) {
1496
1658
  let t = await n(e.table, e.timeColumn, i, r, e.where);
1497
1659
  if (a += t, t < r) break;
1498
1660
  }
1499
1661
  return a;
1500
- }, Ri = (e, t) => {
1662
+ }, pa = (e, t) => {
1501
1663
  let n = Number(e ?? String(t));
1502
1664
  return (Number.isFinite(n) && n > 0 ? n : t) * 36e5;
1503
- }, zi = "_voltro_cdc_offsets", Bi = n(zi, {
1504
- id: T({ prefix: "cdcoff" }),
1505
- replicaId: o(),
1506
- streamName: o(),
1507
- binlogFile: o(),
1508
- binlogPosition: o(),
1509
- updatedAt: v()
1510
- }).index(["replicaId"]), Vi = n(zi, {
1511
- id: T({ prefix: "cdcoff" }),
1512
- replicaId: o(),
1513
- streamName: o(),
1514
- ctVersion: o(),
1515
- updatedAt: v()
1516
- }).index(["replicaId"]), Hi = "postgres";
1665
+ }, ma = "_voltro_cdc_offsets", ha = C(ma, {
1666
+ id: D({ prefix: "cdcoff" }),
1667
+ replicaId: v(),
1668
+ streamName: v(),
1669
+ binlogFile: v(),
1670
+ binlogPosition: v(),
1671
+ updatedAt: E()
1672
+ }).index(["replicaId"]), ga = C(ma, {
1673
+ id: D({ prefix: "cdcoff" }),
1674
+ replicaId: v(),
1675
+ streamName: v(),
1676
+ ctVersion: v(),
1677
+ updatedAt: E()
1678
+ }).index(["replicaId"]), _a = "postgres";
1517
1679
  //#endregion
1518
- export { Y as BranchNameInvalid, Lr as BranchTransitionInvalid, zi as CDC_OFFSETS_TABLE, We as ColumnBuilder, lt as ENCRYPTED_PREFIX, Hi as ENGINE, Ge as FILE_MIGRATION_PATTERN, oe as MAX_IDENTIFIER_LENGTH, Tr as TableStreamError, Jt as TenantNamespaceInvalid, qt as TenantNamespaceUnresolved, $r as TenantRegionUnavailable, Qr as TenantResidencyUnresolved, ce as WARN_IDENTIFIER_LENGTH, ki as _voltroApiKeysTable, Bi as _voltroCdcOffsetsTable, Di as _voltroIdempotencyTable, Oi as _voltroKvTable, Ei as _voltroMigrationPlansTable, wi as _voltroMigrationsTable, Vi as _voltroMssqlCdcOffsetsTable, Ti as _voltroSeedsTable, Xn as actorsTable, Xr as admitBranch, He as allEnumRenames, kt as allRegisteredRelations, De as allRegisteredTables, fr as and, ge as array, or as arrayContains, cr as arrayHas, sr as arrayOverlaps, zt as attachEagerLoads, fi as auditAllTableIndexes, di as auditTableIndexes, Ae as avg, qe as avgOver, je as bigint, si as bindResidentStore, Je as boolean, Pr as branchNamespaceName, ve as bytes, Ee as clearEnumRenames, At as clearRelationsRegistry, ri as clearResidencyConfig, Ii as clearRetentions, g as clearTableRegistry, Cr as collectSubqueries, _e as column, dn as compileEagerJson, R as compilePredicate, $t as compileRawFragment, z as compileSelect, Ar as computeEmbedding, ar as contains, be as count, Re as countDistinct, Me as databaseHandle, xe as date, ze as dbEnum, Ne as decimal, fe as declareEnumRename, It as decodeRowsFromSchema, pt as decryptFieldsOnRead, Si as defineMigration, d as defineMixin, yi as defineSeed, we as denseRank, u as deriveTypeIdPrefix, ct as deserializeArraysOnRead, b as drainIdentifierWarnings, Te as dropped, Rt as encodeRowForSchema, ft as encryptFieldsForWrite, dt as encryptedColumnsOf, qr as enforceBranchLimits, _ as ensureTableRegistered, Zn as eq, L as escapeLike, Sr as evaluatePredicate, Se as except, yr as exists, _i as formatIndexAuditIssue, Ai as frameworkTables, m as generateId, p as generateSnowflake, Ce as geography, ue as geometry, Le as getEnumRenames, Ot as getRelation, M as getRelations, ni as getResidencyConfig, y as getTable, $n as gt, er as gte, Kt as hasEagerLoads, kr as hybridSearch, T as id, rr as inSet, _r as inSubquery, A as inferForeignKey, D as integer, le as intersect, me as interval, Fr as isBranchNamespace, ut as isEncrypted, Pe as isFileMigration, Ci as isMigrationDefinition, Vr as isNeonConnection, ur as isNotNull, lr as isNull, Mi as isPrimaryKeyConflictError, ai as isRegionServable, bt as isRelationsSpec, bi as isSeedDefinition, h as isSqliteFamily, de as isView, E as json, hr as jsonField, et as jsonIndex, Ye as lag, $e as lead, Fi as listRetentions, tr as lt, nr as lte, Zr as makeNamespaceBranchExecutor, St as many, Ct as manyToMany, S as materializeFields, pe as max, Ve as migration, Qe as min, re as mixin, Qn as neq, Rr as nextBranchState, mr as not, br as notExists, ir as notInSet, vr as notInSubquery, i as numeric, xt as one, pr as or, te as paginateById, Gr as planBranch, zr as planBranchProvision, Br as planBranchTeardown, Kr as planBranchTeardownFor, Ur as planNeonBranchProvision, Wr as planNeonBranchTeardown, ji as primaryKeyConflictError, Jr as provisionBranch, ci as provisionResidentTenant, I as qualifyTable, r as queryFor, Ie as queryForView, x as quoteIdent, Xe as rank, Ze as raw, ne as real, c as reference, Kn as registerCoreTables, Dt as registerDiscoveredRelations, Et as registerRelations, Pi as registerRetention, l as registerTable, yt as relations, Jn as requireActors, f as requireTable, Yn as requireTenants, se as resetSnowflake, oi as residentPlacement, Hr as resolveBranchMechanism, C as resolveFullTextIndex, Be as resolveIdScheme, ae as resolveMixinGraph, ii as resolveTenantHome, Qt as resolveTenantNamespace, Ri as retentionTtlMsFromEnv, s as rowNumber, Zt as sanitizeIdentifierFragment, st as serializeArraysForWrite, ti as setResidencyConfig, dr as spatialPredicate, Or as streamTable, a as sum, ee as sumOver, Li as sweepRetention, n as table, Yr as teardownBranch, o as text, v as timestamp, Oe as union, t as unionAll, e as validateColumnName, ye as validateIndexName, Ke as validateTableName, Fe as validateTypeIdPrefix, ke as vector, ie as vectorDistanceToOpclass, jr as vectorEmbedding, Ue as view, he as viewSql, wr as walkLeaves };
1680
+ export { Y as BranchNameInvalid, fi as BranchTransitionInvalid, ma as CDC_OFFSETS_TABLE, ge as ColumnBuilder, ut as ENCRYPTED_PREFIX, _a as ENGINE, qt as EagerCardinalityError, We as FILE_MIGRATION_PATTERN, le as MAX_IDENTIFIER_LENGTH, ei as TableStreamError, sn as TenantNamespaceInvalid, on as TenantNamespaceUnresolved, Oi as TenantRegionUnavailable, Di as TenantResidencyUnresolved, b as WARN_IDENTIFIER_LENGTH, ia as _voltroApiKeysTable, ha as _voltroCdcOffsetsTable, na as _voltroIdempotencyTable, ra as _voltroKvTable, ta as _voltroMigrationPlansTable, $i as _voltroMigrationsTable, ga as _voltroMssqlCdcOffsetsTable, ea as _voltroSeedsTable, Er as actorsTable, Ti as admitBranch, Ee as allEnumRenames, It as allRegisteredRelations, ee as allRegisteredTables, Hr as and, Ae as array, Ir as arrayContains, Rr as arrayHas, Lr as arrayOverlaps, Yt as attachEagerLoads, Vi as auditAllTableIndexes, Bi as auditTableIndexes, ke as avg, Ke as avgOver, qe as bigint, Ii as bindResidentStore, ve as boolean, li as branchNamespaceName, xe as bytes, pe as clearEnumRenames, Rt as clearRelationsRegistry, Mi as clearResidencyConfig, da as clearRetentions, te as clearTableRegistry, Qr as collectSubqueries, _e as column, ht as columnSchema, Cn as compileEagerJson, L as compilePredicate, fn as compileRawFragment, R as compileSelect, ai as computeEmbedding, Fr as contains, be as count, Le as countDistinct, je as databaseHandle, Re as date, Me as dbEnum, Te as decimal, Ie as declareEnumRename, Wt as decodeRowsFromSchema, mt as decryptFieldsOnRead, Zi as defineMigration, ae as defineMixin, Ji as defineSeed, we as denseRank, h as deriveTypeIdPrefix, lt as deserializeArraysOnRead, e as drainIdentifierWarnings, Ce as dropped, Kt as encodeRowForSchema, pt as encryptFieldsForWrite, ft as encryptedColumnsOf, Si as enforceBranchLimits, y as ensureTableRegistered, Dr as eq, I as escapeLike, Zr as evaluatePredicate, Se as except, Yr as exists, Ki as formatIndexAuditIssue, aa as frameworkTables, ze as generateId, ce as generateSnowflake, de as geography, Ye as geometry, Ue as getEnumRenames, Ft as getRelation, Pt as getRelations, ji as getResidencyConfig, u as getTable, kr as gt, Ar as gte, an as hasEagerLoads, ii as hybridSearch, D as id, Nr as inSet, qr as inSubquery, j as inferForeignKey, w as integer, ue as intersect, $e as interval, ui as isBranchNamespace, dt as isEncrypted, Ne as isFileMigration, Qi as isMigrationDefinition, gi as isNeonConnection, Br as isNotNull, zr as isNull, sa as isPrimaryKeyConflictError, Pi as isRegionServable, Ct as isRelationsSpec, Yi as isSeedDefinition, ne as isSqliteFamily, fe as isView, S as json, Gr as jsonField, r as jsonIndex, Je as lag, et as lead, ua as listRetentions, jr as lt, Mr as lte, Ei as makeNamespaceBranchExecutor, Tt as many, Et as manyToMany, a as materializeFields, me as max, Be as migration, Qe as min, oe as mixin, Or as neq, pi as nextBranchState, Wr as not, Xr as notExists, Pr as notInSet, Jr as notInSubquery, Ze as numeric, wt as one, Jt as oneCardinalityMessage, Ur as or, x as paginateBy, i as paginateById, bi as planBranch, mi as planBranchProvision, hi as planBranchTeardown, xi as planBranchTeardownFor, vi as planNeonBranchProvision, yi as planNeonBranchTeardown, oa as primaryKeyConflictError, Ci as provisionBranch, Li as provisionResidentTenant, F as qualifyTable, Xe as queryFor, Fe as queryForView, tt as quoteIdent, re as rank, ie as raw, l as real, s as reference, Sr as registerCoreTables, Nt as registerDiscoveredRelations, Mt as registerRelations, la as registerRetention, p as registerTable, St as relations, wr as requireActors, g as requireTable, Tr as requireTenants, se as resetSnowflake, Fi as residentPlacement, _i as resolveBranchMechanism, c as resolveFullTextIndex, m as resolveIdScheme, d as resolveMixinGraph, Ni as resolveTenantHome, dn as resolveTenantNamespace, pa as retentionTtlMsFromEnv, o as rowNumber, gt as rowSchema, un as sanitizeIdentifierFragment, ct as serializeArraysForWrite, Ai as setResidencyConfig, Vr as spatialPredicate, ri as streamTable, _ as sum, Oe as sumOver, fa as sweepRetention, C as table, wi as teardownBranch, v as text, E as timestamp, t as union, De as unionAll, ye as validateColumnName, Ge as validateIndexName, Lt as validateRegisteredRelations, kt as validateRelationConfig, Pe as validateTableName, Ve as validateTypeIdPrefix, n as vector, f as vectorDistanceToOpclass, oi as vectorEmbedding, He as view, he as viewSql, $r as walkLeaves };