@voltro/database 0.28.0 → 0.29.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.
@@ -6,7 +6,21 @@ var r = (e) => {
6
6
  let t = [];
7
7
  for (let [n, r] of Object.entries(e.fields)) r.serverOnly === !0 && t.push(n);
8
8
  return t;
9
- }, i = class e {
9
+ }, i = (e) => {
10
+ let t = [];
11
+ for (let [n, r] of Object.entries(e.fields)) {
12
+ let e = r.readableBy;
13
+ e !== void 0 && e.length > 0 && t.push({
14
+ column: n,
15
+ scopes: e
16
+ });
17
+ }
18
+ return t;
19
+ }, a = (e) => {
20
+ let t = [];
21
+ for (let [n, r] of Object.entries(e.fields)) r.crdtManaged === !0 && t.push(n);
22
+ return t;
23
+ }, o = class e {
10
24
  definition;
11
25
  constructor(e) {
12
26
  this.definition = e;
@@ -32,6 +46,15 @@ var r = (e) => {
32
46
  serverOnly: !0
33
47
  });
34
48
  }
49
+ readableBy(...t) {
50
+ if (this.rejectIfRaw("readableBy"), t.length === 0) throw Error(".readableBy() needs at least one scope — a column readable by nobody is .serverOnly(). List the scopes that may read it, e.g. .readableBy('billing:read').");
51
+ if (t.find((e) => typeof e != "string" || e.trim() === "") !== void 0) throw Error(`.readableBy(...) rejects a blank scope — every scope must be a non-empty string (a blank scope can never be held, so it would hide the column from everyone). Got: ${JSON.stringify(t)}.`);
52
+ let n = [...new Set(t)];
53
+ return new e({
54
+ ...this.definition,
55
+ readableBy: n
56
+ });
57
+ }
35
58
  version() {
36
59
  if (this.rejectIfRaw("version"), this.definition.type !== "integer") throw Error(`.version() requires an integer() column (got ${this.definition.type}). The store increments it, so it has to be a number — and a timestamp version reintroduces exactly the clock problem optimistic locking exists to avoid: two writes in the same millisecond are indistinguishable, and replica clocks disagree.`);
37
60
  return new e({
@@ -150,21 +173,21 @@ var r = (e) => {
150
173
  __definition() {
151
174
  return this.definition;
152
175
  }
153
- }, a = (e) => new i({
176
+ }, s = (e) => new o({
154
177
  type: e,
155
178
  nullable: !1,
156
179
  unique: !1,
157
180
  hasDefault: !1
158
- }), o = (e) => new i({
181
+ }), ee = (e) => new o({
159
182
  type: "id",
160
183
  nullable: !1,
161
184
  unique: !0,
162
185
  hasDefault: !1,
163
186
  idSchemeInput: e
164
- }), s = () => a("text"), ee = () => a("integer"), te = () => a("real"), c = (e, t = 0) => {
187
+ }), c = () => s("text"), te = () => s("integer"), ne = () => s("real"), l = (e, t = 0) => {
165
188
  if (!Number.isInteger(e) || e <= 0) throw Error(`decimal(${String(e)}, ${String(t)}): precision must be a positive integer (the total number of significant digits, e.g. decimal(12, 2)).`);
166
189
  if (!Number.isInteger(t) || t < 0 || t > e) throw Error(`decimal(${String(e)}, ${String(t)}): scale must be an integer between 0 and precision (${e}).`);
167
- return new i({
190
+ return new o({
168
191
  type: "decimal",
169
192
  nullable: !1,
170
193
  unique: !1,
@@ -172,12 +195,12 @@ var r = (e) => {
172
195
  precision: e,
173
196
  scale: t
174
197
  });
175
- }, ne = c, re = () => a("bigint"), ie = (e, t) => {
198
+ }, re = l, ie = () => s("bigint"), ae = (e, t) => {
176
199
  if (t.length === 0) throw Error(`dbEnum('${e}', []): enum must have at least one value`);
177
200
  return {
178
201
  name: e,
179
202
  values: t,
180
- column: () => new i({
203
+ column: () => new o({
181
204
  type: "enum",
182
205
  nullable: !1,
183
206
  unique: !1,
@@ -186,7 +209,13 @@ var r = (e) => {
186
209
  enumValues: t
187
210
  })
188
211
  };
189
- }, ae = () => a("boolean"), oe = () => a("timestamp"), se = () => a("date"), ce = () => a("json"), le = () => a("bytes"), ue = (e, t) => new i({
212
+ }, oe = () => s("boolean"), se = () => s("timestamp"), ce = () => s("date"), le = () => s("json"), ue = () => s("bytes"), u = () => new o({
213
+ type: "bytes",
214
+ nullable: !0,
215
+ unique: !1,
216
+ hasDefault: !1,
217
+ crdtManaged: !0
218
+ }), d = (e, t) => new o({
190
219
  type: "reference",
191
220
  nullable: !1,
192
221
  unique: !1,
@@ -196,15 +225,15 @@ var r = (e) => {
196
225
  refOnUpdate: t?.onUpdate ?? "noAction",
197
226
  fkAutoIndex: t?.index ?? !0,
198
227
  ...t?.orphanPolicy ? { orphanPolicy: t.orphanPolicy } : {}
199
- }), l = () => new i({
228
+ }), de = () => new o({
200
229
  type: "text",
201
230
  nullable: !0,
202
231
  unique: !1,
203
232
  hasDefault: !1,
204
233
  dropped: !0
205
- }), u = (e, t) => {
234
+ }), fe = (e, t) => {
206
235
  if (!Number.isInteger(e) || e <= 0) throw Error(`vector(${String(e)}): dimension must be a positive integer (the embedding length, e.g. vector(1536)).`);
207
- return new i({
236
+ return new o({
208
237
  type: "vector",
209
238
  nullable: !1,
210
239
  unique: !1,
@@ -212,13 +241,13 @@ var r = (e) => {
212
241
  vectorDim: e,
213
242
  vectorPrecision: t?.precision ?? "float32"
214
243
  });
215
- }, de = (e) => new i({
244
+ }, pe = (e) => new o({
216
245
  type: "array",
217
246
  nullable: !1,
218
247
  unique: !1,
219
248
  hasDefault: !1,
220
249
  arrayElement: e.__definition().type
221
- }), fe = () => a("interval"), pe = (e, t = 4326) => new i({
250
+ }), me = () => s("interval"), he = (e, t = 4326) => new o({
222
251
  type: "text",
223
252
  nullable: !1,
224
253
  unique: !1,
@@ -228,7 +257,7 @@ var r = (e) => {
228
257
  geomKind: e,
229
258
  srid: t
230
259
  }
231
- }), me = (e, t = 4326) => new i({
260
+ }), ge = (e, t = 4326) => new o({
232
261
  type: "text",
233
262
  nullable: !1,
234
263
  unique: !1,
@@ -238,51 +267,51 @@ var r = (e) => {
238
267
  geomKind: e,
239
268
  srid: t
240
269
  }
241
- }), he = (e) => new i({
270
+ }), _e = (e) => new o({
242
271
  type: "raw",
243
272
  nullable: !1,
244
273
  unique: !1,
245
274
  hasDefault: !1,
246
275
  rawDdl: e
247
- }), d = (e) => {
276
+ }), f = (e) => {
248
277
  let t = {};
249
278
  for (let [n, r] of Object.entries(e)) t[n] = r.__definition();
250
279
  return t;
251
- }, f = /* @__PURE__ */ new WeakMap(), p = (e) => typeof e == "object" && e ? f.get(e) : void 0, ge = (e, t = {}) => {
252
- let n = s();
253
- return f.set(n, {
280
+ }, p = /* @__PURE__ */ new WeakMap(), m = (e) => typeof e == "object" && e ? p.get(e) : void 0, ve = (e, t = {}) => {
281
+ let n = c();
282
+ return p.set(n, {
254
283
  target: e,
255
284
  orphanPolicy: t.orphanPolicy ?? "keep",
256
285
  onSoftDelete: t.onSoftDelete ?? !1
257
286
  }), n;
258
- }, m = /* @__PURE__ */ new Map(), _e = (e, t) => {
287
+ }, h = /* @__PURE__ */ new Map(), ye = (e, t) => {
259
288
  if (t.from === t.to) throw Error(`declareEnumRename('${e}'): \`from\` and \`to\` are both '${t.from}' — a rename must change the value.`);
260
- let n = m.get(e) ?? [];
289
+ let n = h.get(e) ?? [];
261
290
  for (let r of n) {
262
291
  if (r.from === t.from && r.to === t.to) return;
263
292
  if (r.from === t.from && r.to !== t.to) throw Error(`declareEnumRename('${e}'): value '${t.from}' is already declared as renamed to '${r.to}', cannot also rename it to '${t.to}'.`);
264
293
  }
265
- n.push(t), m.set(e, n);
266
- }, ve = (e) => m.get(e) ?? [], ye = () => m, be = () => {
267
- m.clear();
268
- }, xe = 63, Se = 60, h = [], g = (e) => {
269
- h.includes(e) || h.push(e);
270
- }, Ce = () => {
271
- let e = h.slice();
272
- return h.length = 0, e;
273
- }, we = /^[a-zA-Z_][a-zA-Z0-9_]*$/, _ = (e, t) => {
294
+ n.push(t), h.set(e, n);
295
+ }, be = (e) => h.get(e) ?? [], xe = () => h, Se = () => {
296
+ h.clear();
297
+ }, Ce = 63, we = 60, g = [], _ = (e) => {
298
+ g.includes(e) || g.push(e);
299
+ }, Te = () => {
300
+ let e = g.slice();
301
+ return g.length = 0, e;
302
+ }, Ee = /^[a-zA-Z_][a-zA-Z0-9_]*$/, v = (e, t) => {
274
303
  if (t.length === 0) throw Error(`${e} cannot be empty.`);
275
- if (!we.test(t)) throw Error(`${e} '${t}' contains characters outside [A-Za-z0-9_] or starts with a digit. Dialect-portable identifiers must match /^[a-zA-Z_][a-zA-Z0-9_]*$/.`);
276
- }, v = (e) => {
277
- if (_("table name", e), e.length > 63) throw Error(`table name '${e}' is ${e.length} chars — exceeds the 63-byte cross-dialect limit (Postgres floor). Shorten the name; long table names also cascade into auto-named indexes and FK constraints that would themselves exceed the limit.`);
278
- e.length > 60 && g(`table name '${e}' is ${e.length} chars — ${63 - e.length} from the Postgres 63-byte limit. Auto-named indexes on this table will run out of room fast.`);
279
- }, y = (e, t) => {
280
- if (_("column name", t), t.length > 63) throw Error(`column '${t}' on table '${e}' is ${t.length} chars — exceeds the 63-byte cross-dialect limit (Postgres floor). Rename it.`);
281
- t.length > 60 && g(`column '${t}' on table '${e}' is ${t.length} chars — close to the 63-byte limit.`);
282
- }, b = (e, t, n, r) => {
283
- if (_("index name", t), t.length > 63) throw Error(n ? `auto-named index '${t}' on table '${e}' is ${t.length} chars — exceeds the 63-byte cross-dialect limit (Postgres floor). Supply an explicit short name: .index('<shortName>', ${JSON.stringify([...r])}).` : `index name '${t}' on table '${e}' is ${t.length} chars — exceeds the 63-byte cross-dialect limit (Postgres floor). Shorten it.`);
284
- t.length > 60 && g(`index '${t}' on table '${e}' is ${t.length} chars — ${63 - t.length} from the 63-byte limit. ${n ? `Consider .index('<shortName>', ${JSON.stringify([...r])}) before it grows.` : ""}`);
285
- }, x = (e, t) => {
304
+ if (!Ee.test(t)) throw Error(`${e} '${t}' contains characters outside [A-Za-z0-9_] or starts with a digit. Dialect-portable identifiers must match /^[a-zA-Z_][a-zA-Z0-9_]*$/.`);
305
+ }, y = (e) => {
306
+ if (v("table name", e), e.length > 63) throw Error(`table name '${e}' is ${e.length} chars — exceeds the 63-byte cross-dialect limit (Postgres floor). Shorten the name; long table names also cascade into auto-named indexes and FK constraints that would themselves exceed the limit.`);
307
+ e.length > 60 && _(`table name '${e}' is ${e.length} chars — ${63 - e.length} from the Postgres 63-byte limit. Auto-named indexes on this table will run out of room fast.`);
308
+ }, b = (e, t) => {
309
+ if (v("column name", t), t.length > 63) throw Error(`column '${t}' on table '${e}' is ${t.length} chars — exceeds the 63-byte cross-dialect limit (Postgres floor). Rename it.`);
310
+ t.length > 60 && _(`column '${t}' on table '${e}' is ${t.length} chars — close to the 63-byte limit.`);
311
+ }, x = (e, t, n, r) => {
312
+ if (v("index name", t), t.length > 63) throw Error(n ? `auto-named index '${t}' on table '${e}' is ${t.length} chars — exceeds the 63-byte cross-dialect limit (Postgres floor). Supply an explicit short name: .index('<shortName>', ${JSON.stringify([...r])}).` : `index name '${t}' on table '${e}' is ${t.length} chars — exceeds the 63-byte cross-dialect limit (Postgres floor). Shorten it.`);
313
+ t.length > 60 && _(`index '${t}' on table '${e}' is ${t.length} chars — ${63 - t.length} from the 63-byte limit. ${n ? `Consider .index('<shortName>', ${JSON.stringify([...r])}) before it grows.` : ""}`);
314
+ }, S = (e, t) => {
286
315
  if (e.length === 0) throw Error(`typeid prefix on table '${t.tableName}' cannot be empty.`);
287
316
  if (!/^[a-z][a-z0-9_]*$/.test(e)) {
288
317
  let n = t.kind === "derived" ? "the derived prefix doesn't match typeid's required shape — supply an explicit one via id({ prefix: '...' })." : "the prefix must match typeid's required shape /^[a-z][a-z0-9_]*$/.";
@@ -292,35 +321,35 @@ var r = (e) => {
292
321
  let n = t.kind === "derived" ? "shorten the table name, or supply an explicit short prefix via id({ prefix: '...' })." : "pick a shorter prefix.";
293
322
  throw Error(`typeid prefix '${e}' on table '${t.tableName}' is ${e.length} chars — exceeds the 63-byte limit; ${n}`);
294
323
  }
295
- e.length > 60 && g(`typeid prefix '${e}' on table '${t.tableName}' is ${e.length} chars — close to the 63-byte limit. Generated ids will be even longer (prefix + '_' + 26).`);
296
- }, Te = 1704067200000n, Ee = 10n, S = 12n, C = (1n << Ee) - 1n, w = (1n << S) - 1n, T = S, E = 22n, D = () => {
324
+ e.length > 60 && _(`typeid prefix '${e}' on table '${t.tableName}' is ${e.length} chars — close to the 63-byte limit. Generated ids will be even longer (prefix + '_' + 26).`);
325
+ }, C = 1704067200000n, w = 10n, T = 12n, E = (1n << w) - 1n, D = (1n << T) - 1n, De = T, Oe = 22n, ke = () => {
297
326
  let e = process.env.SNOWFLAKE_MACHINE_ID;
298
327
  if (e === void 0 || e === "") return 0n;
299
328
  let t = BigInt(e);
300
- if (t < 0n || t > C) throw Error(`SNOWFLAKE_MACHINE_ID out of range: ${e}. Must be 0..${C}.`);
329
+ if (t < 0n || t > E) throw Error(`SNOWFLAKE_MACHINE_ID out of range: ${e}. Must be 0..${E}.`);
301
330
  return t;
302
331
  }, O = () => ({
303
332
  lastMs: 0n,
304
333
  sequence: 0n,
305
- machineId: D()
306
- }), k, De = () => (k === void 0 && (k = O()), k), Oe = () => {
334
+ machineId: ke()
335
+ }), k, Ae = () => (k === void 0 && (k = O()), k), je = () => {
307
336
  k = O();
308
- }, A = () => BigInt(Date.now()), ke = (e) => {
337
+ }, A = () => BigInt(Date.now()), Me = (e) => {
309
338
  let t = A();
310
339
  for (; t <= e;) t = A();
311
340
  return t;
312
341
  }, j = () => {
313
- let e = De(), t = A();
314
- t === e.lastMs ? (e.sequence = e.sequence + 1n & w, e.sequence === 0n && (t = ke(e.lastMs), e.lastMs = t)) : (e.sequence = 0n, e.lastMs = t);
315
- let n = t - Te;
342
+ let e = Ae(), t = A();
343
+ t === e.lastMs ? (e.sequence = e.sequence + 1n & D, e.sequence === 0n && (t = Me(e.lastMs), e.lastMs = t)) : (e.sequence = 0n, e.lastMs = t);
344
+ let n = t - C;
316
345
  if (n < 0n) throw Error("Snowflake timestamp before configured epoch (2024-01-01). System clock is wrong.");
317
- return (n << E | e.machineId << T | e.sequence).toString();
346
+ return (n << Oe | e.machineId << De | e.sequence).toString();
318
347
  }, M = (e) => {
319
348
  let t = e.toLowerCase();
320
349
  if (t.startsWith("_")) throw Error(`cannot derive a typeid prefix for table '${e}' (table names starting with '_' are not valid typeid prefixes). Pick an explicit prefix via id({ prefix: '...' }) or use a different scheme like id({ scheme: 'numeric' }) for internal tables.`);
321
350
  if (!/^[a-z][a-z0-9_]*$/.test(t)) throw Error(`cannot derive a typeid prefix from table name '${e}' (must match [a-z][a-z0-9_]*). Pick an explicit prefix via id({ prefix: '...' }).`);
322
351
  let n = t.endsWith("ies") && t.length > 3 ? t.slice(0, -3) + "y" : t.endsWith("ses") || t.endsWith("xes") || t.endsWith("zes") || t.endsWith("shes") || t.endsWith("ches") ? t.slice(0, -2) : t.endsWith("s") && t.length > 1 ? t.slice(0, -1) : t;
323
- return x(n, {
352
+ return S(n, {
324
353
  kind: "derived",
325
354
  tableName: e
326
355
  }), n;
@@ -329,7 +358,7 @@ var r = (e) => {
329
358
  kind: "typeid",
330
359
  prefix: M(t)
331
360
  };
332
- if ("prefix" in e && !("scheme" in e)) return x(e.prefix, {
361
+ if ("prefix" in e && !("scheme" in e)) return S(e.prefix, {
333
362
  kind: "explicit",
334
363
  tableName: t
335
364
  }), {
@@ -340,7 +369,7 @@ var r = (e) => {
340
369
  switch (e.scheme) {
341
370
  case "typeid": {
342
371
  let n = e.prefix ?? M(t);
343
- return e.prefix !== void 0 && x(e.prefix, {
372
+ return e.prefix !== void 0 && S(e.prefix, {
344
373
  kind: "explicit",
345
374
  tableName: t
346
375
  }), {
@@ -356,7 +385,7 @@ var r = (e) => {
356
385
  generate: e.generate
357
386
  };
358
387
  }
359
- }, Ae = (n, r) => {
388
+ }, Ne = (n, r) => {
360
389
  switch (n.kind) {
361
390
  case "typeid": return e(n.prefix).toString();
362
391
  case "ulid": return t();
@@ -365,13 +394,13 @@ var r = (e) => {
365
394
  case "custom": return n.generate(r);
366
395
  }
367
396
  }, P = (e) => ({
368
- fields: d(e.fields),
397
+ fields: f(e.fields),
369
398
  ...e.id === void 0 ? {} : { id: e.id },
370
399
  ...e.requires === void 0 ? {} : { requires: e.requires },
371
400
  ...e.indexes === void 0 ? {} : { indexes: e.indexes },
372
401
  ...e.behaviors === void 0 ? {} : { behaviors: e.behaviors },
373
402
  ...e.policies === void 0 ? {} : { policies: e.policies }
374
- }), je = P, F = (e) => {
403
+ }), Pe = P, F = (e) => {
375
404
  let t = /* @__PURE__ */ new Set(), n = [], r = (e) => {
376
405
  let i = e.id ?? e;
377
406
  if (!t.has(i)) {
@@ -381,7 +410,7 @@ var r = (e) => {
381
410
  };
382
411
  for (let t of e) r(t);
383
412
  return n;
384
- }, Me = (e, ...t) => {
413
+ }, Fe = (e, ...t) => {
385
414
  if (t.length === 0) throw Error(`jsonIndex("${e}"): at least one path segment is required`);
386
415
  let n = (r) => ({
387
416
  jsonPath: {
@@ -392,14 +421,14 @@ var r = (e) => {
392
421
  numeric: () => n(!0)
393
422
  });
394
423
  return n(!1);
395
- }, Ne = (e = "cosine", t = "float32") => {
424
+ }, Ie = (e = "cosine", t = "float32") => {
396
425
  let n = t === "half" ? "halfvec" : "vector";
397
426
  switch (e) {
398
427
  case "cosine": return `${n}_cosine_ops`;
399
428
  case "l2": return `${n}_l2_ops`;
400
429
  case "inner": return `${n}_ip_ops`;
401
430
  }
402
- }, Pe = [
431
+ }, Le = [
403
432
  "id",
404
433
  "tenantId",
405
434
  "createdAt",
@@ -408,7 +437,7 @@ var r = (e) => {
408
437
  "updatedBy",
409
438
  "deletedAt",
410
439
  "deletedBy"
411
- ], I = (e) => e.id ?? `<anonymous mixin: ${Object.keys(e.fields).join(", ")}>`, L = (e, t) => `${e}_${t.join("_")}_idx`, Fe = (e, t) => `${e}_${t.join("_")}_uq`, R = (e, t, n, r, i) => {
440
+ ], I = (e) => e.id ?? `<anonymous mixin: ${Object.keys(e.fields).join(", ")}>`, L = (e, t) => `${e}_${t.join("_")}_idx`, Re = (e, t) => `${e}_${t.join("_")}_uq`, R = (e, t, n, r, i) => {
412
441
  if (n !== "hnsw") return;
413
442
  if (r.length !== 1) throw Error(`hnsw index '${t}' on table '${e}' must cover exactly one vector column — got ${r.length} fields. pgvector's HNSW access method indexes a single vector column.`);
414
443
  let a = r[0];
@@ -416,14 +445,14 @@ var r = (e) => {
416
445
  let o = i[a];
417
446
  if (o === void 0) throw Error(`hnsw index '${t}' on table '${e}' references unknown column '${a}'.`);
418
447
  if (o.type !== "vector") throw Error(`hnsw index '${t}' on table '${e}' requires a vector() column — column '${a}' is '${o.type}'. HNSW is the pgvector approximate-nearest-neighbour method and only applies to vectors.`);
419
- }, Ie = (e, t) => {
448
+ }, z = (e, t) => {
420
449
  let n;
421
450
  for (let [r, i] of Object.entries(e)) i.type === "id" && i.idScheme === void 0 && (n === void 0 && (n = { ...e }), n[r] = {
422
451
  ...i,
423
452
  idScheme: N(i.idSchemeInput, t)
424
453
  });
425
454
  return n ?? e;
426
- }, z = (e) => {
455
+ }, B = (e) => {
427
456
  let t = e.appliedPrimaryKey ?? [];
428
457
  return {
429
458
  tableName: e.tableName,
@@ -434,6 +463,7 @@ var r = (e) => {
434
463
  appliedUniques: e.appliedUniques,
435
464
  appliedFullText: e.appliedFullText,
436
465
  appliedChecks: e.appliedChecks,
466
+ appliedRules: e.appliedRules ?? [],
437
467
  appliedPluginRefs: e.appliedPluginRefs ?? [],
438
468
  appliedPrimaryKey: t,
439
469
  ...e.previousTableName === void 0 ? {} : { previousTableName: e.previousTableName },
@@ -441,8 +471,8 @@ var r = (e) => {
441
471
  ...e.validatePatchSchema === void 0 ? {} : { validatePatchSchema: e.validatePatchSchema },
442
472
  fullTextIndex: ((t, n, r) => {
443
473
  if (n.length === 0) throw Error(`fullTextIndex '${t}' on '${e.tableName}' has no columns.`);
444
- if (b(e.tableName, t, !1, n), e.appliedFullText.some((e) => e.name === t)) throw Error(`duplicate full-text index '${t}' on table '${e.tableName}'.`);
445
- return z({
474
+ if (x(e.tableName, t, !1, n), e.appliedFullText.some((e) => e.name === t)) throw Error(`duplicate full-text index '${t}' on table '${e.tableName}'.`);
475
+ return B({
446
476
  ...e,
447
477
  tableName: e.tableName,
448
478
  fields: e.fields,
@@ -471,19 +501,19 @@ var r = (e) => {
471
501
  for (let t of n) for (let [n, a] of Object.entries(t.fields)) {
472
502
  let o = i.get(n);
473
503
  if (o !== void 0) throw Error(`mixin collision on column '${n}' in table '${e.tableName}': '${I(o)}' and '${I(t)}' both define it. If they're the same mixin reached via different paths, set a shared 'id' on both. If they're genuinely different concerns, rename one of the columns.`);
474
- y(e.tableName, n), r[n] = a, i.set(n, t);
504
+ b(e.tableName, n), r[n] = a, i.set(n, t);
475
505
  }
476
506
  let a = [...e.appliedIndexes];
477
507
  for (let t of n) for (let n of t.indexes ?? []) {
478
508
  let t = n.name ?? L(e.tableName, n.fields);
479
- a.some((e) => e.name === t) || (b(e.tableName, t, n.name === void 0, n.fields), R(e.tableName, t, n.kind, n.fields, r), a.push({
509
+ a.some((e) => e.name === t) || (x(e.tableName, t, n.name === void 0, n.fields), R(e.tableName, t, n.kind, n.fields, r), a.push({
480
510
  name: t,
481
511
  fields: n.fields,
482
512
  ...n.kind === void 0 ? {} : { kind: n.kind },
483
513
  ...n.kindOptions === void 0 ? {} : { kindOptions: n.kindOptions }
484
514
  }));
485
515
  }
486
- return z({
516
+ return B({
487
517
  ...e,
488
518
  tableName: e.tableName,
489
519
  fields: r,
@@ -502,8 +532,8 @@ var r = (e) => {
502
532
  let n, r, i, a = Array.isArray(t[0]);
503
533
  if (a ? (r = t[0], i = t[1], n = L(e.tableName, r)) : (n = t[0], r = t[1], i = t[2]), r.length === 0) throw Error(`index '${n}' on table '${e.tableName}' has no fields — an index must cover at least one column.`);
504
534
  let o = r.filter((e) => typeof e == "string");
505
- if (b(e.tableName, n, a, o), R(e.tableName, n, i?.kind, r, e.fields), e.appliedIndexes.some((e) => e.name === n)) throw t.length === 1 ? Error(`duplicate auto-named index '${n}' on table '${e.tableName}' — you've called .index(${JSON.stringify(r)}) twice. Pass an explicit name to the second one if both are intended (rare).`) : Error(`duplicate index '${n}' on table '${e.tableName}': each index name must be unique within a table.`);
506
- return z({
535
+ if (x(e.tableName, n, a, o), R(e.tableName, n, i?.kind, r, e.fields), e.appliedIndexes.some((e) => e.name === n)) throw t.length === 1 ? Error(`duplicate auto-named index '${n}' on table '${e.tableName}' — you've called .index(${JSON.stringify(r)}) twice. Pass an explicit name to the second one if both are intended (rare).`) : Error(`duplicate index '${n}' on table '${e.tableName}': each index name must be unique within a table.`);
536
+ return B({
507
537
  ...e,
508
538
  tableName: e.tableName,
509
539
  fields: e.fields,
@@ -527,8 +557,8 @@ var r = (e) => {
527
557
  expressionIndex: ((t, n, r) => {
528
558
  if (n.length === 0) throw Error(`expressionIndex '${t}' on table '${e.tableName}' has no fields — an index must cover at least one column or expression.`);
529
559
  let i = n.filter((e) => typeof e == "string");
530
- if (b(e.tableName, t, !1, i), R(e.tableName, t, r?.kind, n, e.fields), e.appliedIndexes.some((e) => e.name === t)) throw Error(`duplicate index '${t}' on table '${e.tableName}': each index name must be unique within a table.`);
531
- return z({
560
+ if (x(e.tableName, t, !1, i), R(e.tableName, t, r?.kind, n, e.fields), e.appliedIndexes.some((e) => e.name === t)) throw Error(`duplicate index '${t}' on table '${e.tableName}': each index name must be unique within a table.`);
561
+ return B({
532
562
  ...e,
533
563
  tableName: e.tableName,
534
564
  fields: e.fields,
@@ -551,9 +581,9 @@ var r = (e) => {
551
581
  }),
552
582
  unique: ((...t) => {
553
583
  let n, r, i, a = Array.isArray(t[0]);
554
- if (a ? (r = t[0], i = t[1], n = Fe(e.tableName, r)) : (n = t[0], r = t[1], i = t[2]), r.length === 0) throw Error(`unique '${n}' on table '${e.tableName}' has no fields — a UNIQUE constraint must cover at least one column.`);
555
- if (b(e.tableName, n, a, r), e.appliedUniques.some((e) => e.name === n)) throw Error(a ? `duplicate auto-named UNIQUE '${n}' on table '${e.tableName}' — you've called .unique(${JSON.stringify(r)}) twice. Pass an explicit name to the second one if both are intended (very rare).` : `duplicate UNIQUE '${n}' on table '${e.tableName}': each constraint name must be unique within a table.`);
556
- return z({
584
+ if (a ? (r = t[0], i = t[1], n = Re(e.tableName, r)) : (n = t[0], r = t[1], i = t[2]), r.length === 0) throw Error(`unique '${n}' on table '${e.tableName}' has no fields — a UNIQUE constraint must cover at least one column.`);
585
+ if (x(e.tableName, n, a, r), e.appliedUniques.some((e) => e.name === n)) throw Error(a ? `duplicate auto-named UNIQUE '${n}' on table '${e.tableName}' — you've called .unique(${JSON.stringify(r)}) twice. Pass an explicit name to the second one if both are intended (very rare).` : `duplicate UNIQUE '${n}' on table '${e.tableName}': each constraint name must be unique within a table.`);
586
+ return B({
557
587
  ...e,
558
588
  tableName: e.tableName,
559
589
  fields: e.fields,
@@ -575,9 +605,9 @@ var r = (e) => {
575
605
  uniqueActive: ((...t) => {
576
606
  let n, r, i, a = Array.isArray(t[0]);
577
607
  if (a ? (r = t[0], i = t[1], n = L(e.tableName, r)) : (n = t[0], r = t[1], i = t[2]), r.length === 0) throw Error(`uniqueActive '${n}' on table '${e.tableName}' has no fields — a partial UNIQUE must cover at least one column.`);
578
- if (b(e.tableName, n, a, r), e.appliedIndexes.some((e) => e.name === n)) throw Error(`duplicate index '${n}' on table '${e.tableName}': each index name must be unique within a table (uniqueActive shares the index namespace).`);
608
+ if (x(e.tableName, n, a, r), e.appliedIndexes.some((e) => e.name === n)) throw Error(`duplicate index '${n}' on table '${e.tableName}': each index name must be unique within a table (uniqueActive shares the index namespace).`);
579
609
  let o = i?.where ?? "\"deletedAt\" IS NULL";
580
- return z({
610
+ return B({
581
611
  ...e,
582
612
  tableName: e.tableName,
583
613
  fields: e.fields,
@@ -599,8 +629,8 @@ var r = (e) => {
599
629
  }),
600
630
  check: ((t, n) => {
601
631
  if (n.trim().length === 0) throw Error(`CHECK '${t}' on table '${e.tableName}' has an empty expression.`);
602
- if (b(e.tableName, t, !1, []), e.appliedChecks.some((e) => e.name === t)) throw Error(`duplicate CHECK '${t}' on table '${e.tableName}': each constraint name must be unique within a table.`);
603
- return z({
632
+ if (x(e.tableName, t, !1, []), e.appliedChecks.some((e) => e.name === t)) throw Error(`duplicate CHECK '${t}' on table '${e.tableName}': each constraint name must be unique within a table.`);
633
+ return B({
604
634
  ...e,
605
635
  tableName: e.tableName,
606
636
  fields: e.fields,
@@ -618,9 +648,22 @@ var r = (e) => {
618
648
  ...e.validatePatchSchema === void 0 ? {} : { validatePatchSchema: e.validatePatchSchema }
619
649
  });
620
650
  }),
651
+ rule: ((t, n, r) => {
652
+ if (t.trim().length === 0) throw Error(`rule on table '${e.tableName}' has an empty name.`);
653
+ let i = e.appliedRules ?? [];
654
+ if (i.some((e) => e.name === t)) throw Error(`duplicate rule '${t}' on table '${e.tableName}': each rule name must be unique within a table.`);
655
+ return B({
656
+ ...e,
657
+ appliedRules: [...i, {
658
+ name: t,
659
+ predicate: n,
660
+ severity: r?.severity ?? "error"
661
+ }]
662
+ });
663
+ }),
621
664
  renamedFrom: ((t) => {
622
665
  if (t === e.tableName) throw Error(`renamedFrom('${t}') on table '${e.tableName}' names the table itself — drop the marker, there is nothing to rename.`);
623
- return v(t), z({
666
+ return y(t), B({
624
667
  ...e,
625
668
  previousTableName: t
626
669
  });
@@ -635,7 +678,7 @@ var r = (e) => {
635
678
  }
636
679
  if (t.length > 0) throw Error(`primaryKey([...]) declared twice on table '${e.tableName}'.`);
637
680
  for (let [t, r] of Object.entries(e.fields)) if (r.type === "id" && !n.includes(t)) throw Error(`primaryKey([...]) on table '${e.tableName}' conflicts with the id() column '${t}'. A composite primary key IS the key — drop the id() column, or include '${t}' in the composite key.`);
638
- return z({
681
+ return B({
639
682
  ...e,
640
683
  tableName: e.tableName,
641
684
  fields: e.fields,
@@ -650,7 +693,7 @@ var r = (e) => {
650
693
  ...e.validatePatchSchema === void 0 ? {} : { validatePatchSchema: e.validatePatchSchema }
651
694
  });
652
695
  }),
653
- nonReactive: (() => z({
696
+ nonReactive: (() => B({
654
697
  ...e,
655
698
  tableName: e.tableName,
656
699
  fields: e.fields,
@@ -664,7 +707,7 @@ var r = (e) => {
664
707
  ...e.insertSchema === void 0 ? {} : { insertSchema: e.insertSchema },
665
708
  ...e.validatePatchSchema === void 0 ? {} : { validatePatchSchema: e.validatePatchSchema }
666
709
  })),
667
- validate: ((t) => z({
710
+ validate: ((t) => B({
668
711
  ...e,
669
712
  tableName: e.tableName,
670
713
  fields: e.fields,
@@ -678,7 +721,7 @@ var r = (e) => {
678
721
  insertSchema: t,
679
722
  ...e.validatePatchSchema === void 0 ? {} : { validatePatchSchema: e.validatePatchSchema }
680
723
  })),
681
- validatePatch: ((t) => z({
724
+ validatePatch: ((t) => B({
682
725
  ...e,
683
726
  tableName: e.tableName,
684
727
  fields: e.fields,
@@ -693,17 +736,17 @@ var r = (e) => {
693
736
  validatePatchSchema: n.partial(t)
694
737
  }))
695
738
  };
696
- }, Le = (e, t) => {
697
- v(e);
739
+ }, ze = (e, t) => {
740
+ y(e);
698
741
  let n = Object.entries(t).flatMap(([e, t]) => {
699
- let n = p(t);
742
+ let n = m(t);
700
743
  return n === void 0 ? [] : [{
701
744
  column: e,
702
745
  ...n
703
746
  }];
704
- }), r = Ie(d(t), e);
705
- for (let t of Object.keys(r)) y(e, t);
706
- return z({
747
+ }), r = z(f(t), e);
748
+ for (let t of Object.keys(r)) b(e, t);
749
+ return B({
707
750
  appliedPluginRefs: n,
708
751
  tableName: e,
709
752
  fields: r,
@@ -712,9 +755,10 @@ var r = (e) => {
712
755
  appliedIndexes: [],
713
756
  appliedUniques: [],
714
757
  appliedFullText: [],
715
- appliedChecks: []
758
+ appliedChecks: [],
759
+ appliedRules: []
716
760
  });
717
- }, B = (e) => e === "sqlite" || e === "turso", V = (e, t) => {
761
+ }, Be = (e) => e === "sqlite" || e === "turso", V = (e, t) => {
718
762
  switch (t) {
719
763
  case "mysql":
720
764
  case "mariadb": return `\`${e}\``;
@@ -730,38 +774,38 @@ var r = (e) => {
730
774
  return;
731
775
  }
732
776
  if (t !== e) throw Error(`duplicate table '${e.tableName}' registration: two different table descriptors claim the same name. Rename one or import the shared module that defines it.`);
733
- }, Re = (e) => {
777
+ }, Ve = (e) => {
734
778
  W.get(e.tableName) === void 0 && W.set(e.tableName, e);
735
- }, K = (e) => W.get(e), ze = (e) => {
779
+ }, K = (e) => W.get(e), He = (e) => {
736
780
  let t = W.get(e);
737
781
  if (t === void 0) throw Error(`table '${e}' is not registered. Register it by wrapping it in \`databaseHandle({ ... })\` (the usual path) or call \`registerTable(t)\` explicitly before this runs. Note a \`queryFor(t)\` query carries its own source table, so eager-loads don't hit this — this error means a reconstructed descriptor or by-name tooling reached an unregistered table.`);
738
782
  return t;
739
- }, Be = () => [...W.values()], Ve = () => {
783
+ }, Ue = () => [...W.values()], We = () => {
740
784
  W.clear();
741
- }, He = (e) => W.get(e)?.isReactive !== !1, Ue = (e) => ({
785
+ }, Ge = (e) => W.get(e)?.isReactive !== !1, Ke = (e) => ({
742
786
  op: "count",
743
787
  alias: e ?? "count"
744
- }), We = (e, t) => ({
788
+ }), qe = (e, t) => ({
745
789
  op: "count-distinct",
746
790
  column: e,
747
791
  alias: t ?? `count_distinct_${e}`
748
- }), Ge = (e, t) => ({
792
+ }), Je = (e, t) => ({
749
793
  op: "sum",
750
794
  column: e,
751
795
  alias: t ?? `sum_${e}`
752
- }), Ke = (e, t) => ({
796
+ }), Ye = (e, t) => ({
753
797
  op: "avg",
754
798
  column: e,
755
799
  alias: t ?? `avg_${e}`
756
- }), qe = (e, t) => ({
800
+ }), Xe = (e, t) => ({
757
801
  op: "min",
758
802
  column: e,
759
803
  alias: t ?? `min_${e}`
760
- }), Je = (e, t) => ({
804
+ }), Ze = (e, t) => ({
761
805
  op: "max",
762
806
  column: e,
763
807
  alias: t ?? `max_${e}`
764
- }), Ye = (e, t) => ({
808
+ }), Qe = (e, t) => ({
765
809
  op: "column",
766
810
  column: e,
767
811
  alias: t ?? e
@@ -779,33 +823,33 @@ var r = (e) => {
779
823
  queries: t.map((e) => e.descriptor)
780
824
  }
781
825
  });
782
- }, Xe = q("union"), Ze = q("union-all"), Qe = q("intersect"), $e = q("except"), J = (e) => ({ over: (t) => ({
826
+ }, $e = q("union"), et = q("union-all"), tt = q("intersect"), nt = q("except"), J = (e) => ({ over: (t) => ({
783
827
  ...e,
784
828
  window: t
785
- }) }), et = (e = "rowNumber") => J({
829
+ }) }), rt = (e = "rowNumber") => J({
786
830
  op: "window-row-number",
787
831
  alias: e
788
- }), tt = (e = "rank") => J({
832
+ }), it = (e = "rank") => J({
789
833
  op: "window-rank",
790
834
  alias: e
791
- }), nt = (e = "denseRank") => J({
835
+ }), at = (e = "denseRank") => J({
792
836
  op: "window-dense-rank",
793
837
  alias: e
794
- }), rt = (e, t = 1, n) => J({
838
+ }), ot = (e, t = 1, n) => J({
795
839
  op: "window-lag",
796
840
  column: e,
797
841
  alias: n ?? `lag_${e}`,
798
842
  offset: t
799
- }), it = (e, t = 1, n) => J({
843
+ }), st = (e, t = 1, n) => J({
800
844
  op: "window-lead",
801
845
  column: e,
802
846
  alias: n ?? `lead_${e}`,
803
847
  offset: t
804
- }), at = (e, t) => J({
848
+ }), ct = (e, t) => J({
805
849
  op: "window-sum-over",
806
850
  column: e,
807
851
  alias: t ?? `sum_${e}_over`
808
- }), ot = (e, t) => J({
852
+ }), lt = (e, t) => J({
809
853
  op: "window-avg-over",
810
854
  column: e,
811
855
  alias: t ?? `avg_${e}_over`
@@ -1087,7 +1131,7 @@ function Z(e) {
1087
1131
  sourceTable: e
1088
1132
  });
1089
1133
  }
1090
- var st = (e, t, n) => Q(e, "id", t, n), Q = (e, t, n, r, i = "asc") => {
1134
+ var ut = (e, t, n) => Q(e, "id", t, n), Q = (e, t, n, r, i = "asc") => {
1091
1135
  let a = [...e.order.filter((e) => e.column !== t), {
1092
1136
  column: t,
1093
1137
  direction: i
@@ -1102,21 +1146,21 @@ var st = (e, t, n) => Q(e, "id", t, n), Q = (e, t, n, r, i = "asc") => {
1102
1146
  order: a,
1103
1147
  take: r
1104
1148
  };
1105
- }, ct = (e) => {
1149
+ }, dt = (e) => {
1106
1150
  let t = {};
1107
1151
  for (let [n, r] of Object.entries(e)) G(r), t[n] = Z(r);
1108
1152
  return t;
1109
- }, lt = (e) => e.isView === !0, ut = (e, t, n) => {
1110
- if (v(e), n.trim().length === 0) throw Error(`view('${e}', …): the SELECT body is empty — a view must define a query.`);
1111
- let r = d(t);
1112
- for (let t of Object.keys(r)) y(e, t);
1153
+ }, ft = (e) => e.isView === !0, pt = (e, t, n) => {
1154
+ if (y(e), n.trim().length === 0) throw Error(`view('${e}', …): the SELECT body is empty — a view must define a query.`);
1155
+ let r = f(t);
1156
+ for (let t of Object.keys(r)) b(e, t);
1113
1157
  return {
1114
1158
  tableName: e,
1115
1159
  fields: r,
1116
1160
  isView: !0,
1117
1161
  viewSelect: n
1118
1162
  };
1119
- }, dt = (e) => Z({
1163
+ }, mt = (e) => Z({
1120
1164
  ...e,
1121
1165
  isReactive: !1,
1122
1166
  appliedMixins: [],
@@ -1124,7 +1168,7 @@ var st = (e, t, n) => Q(e, "id", t, n), Q = (e, t, n, r, i = "asc") => {
1124
1168
  appliedUniques: [],
1125
1169
  appliedFullText: [],
1126
1170
  appliedChecks: []
1127
- }), ft = (e, t, n = null) => {
1171
+ }), ht = (e, t, n = null) => {
1128
1172
  let r = n === null ? V(e.tableName, t) : `${V(n, t)}.${V(e.tableName, t)}`, i = e.viewSelect.trim();
1129
1173
  switch (t) {
1130
1174
  case "postgres":
@@ -1134,16 +1178,16 @@ var st = (e, t, n) => Q(e, "id", t, n), Q = (e, t, n, r, i = "asc") => {
1134
1178
  case "sqlite":
1135
1179
  case "turso": return `DROP VIEW IF EXISTS ${r};\nCREATE VIEW ${r} AS ${i};`;
1136
1180
  }
1137
- }, pt = /^[A-Za-z_][A-Za-z0-9_]*$/, mt = (e) => "$" + e.map((e) => typeof e == "number" ? `[${e}]` : pt.test(e) ? `.${e}` : `."${e.replace(/"/g, "\\\"")}"`).join(""), ht = (e) => "{" + e.map((e) => {
1181
+ }, gt = /^[A-Za-z_][A-Za-z0-9_]*$/, _t = (e) => "$" + e.map((e) => typeof e == "number" ? `[${e}]` : gt.test(e) ? `.${e}` : `."${e.replace(/"/g, "\\\"")}"`).join(""), vt = (e) => "{" + e.map((e) => {
1138
1182
  let t = String(e);
1139
1183
  return /^[A-Za-z0-9_]+$/.test(t) ? t : `"${t.replace(/(["\\])/g, "\\$1")}"`;
1140
- }).join(",") + "}", gt = (e, t, n, r = {}) => {
1184
+ }).join(",") + "}", yt = (e, t, n, r = {}) => {
1141
1185
  let i = V(e, n), a = r.numeric ?? !1;
1142
1186
  if (n === "postgres") {
1143
- let e = `(${i} #>> '${ht(t)}'::text[])`;
1187
+ let e = `(${i} #>> '${vt(t)}'::text[])`;
1144
1188
  return a ? `${e}::numeric` : e;
1145
1189
  }
1146
- let o = mt(t);
1190
+ let o = _t(t);
1147
1191
  switch (n) {
1148
1192
  case "mysql":
1149
1193
  case "mariadb": {
@@ -1160,10 +1204,10 @@ var st = (e, t, n) => Q(e, "id", t, n), Q = (e, t, n, r, i = "asc") => {
1160
1204
  return a ? `CAST(${e} AS REAL)` : e;
1161
1205
  }
1162
1206
  }
1163
- }, _t = (e) => {
1207
+ }, bt = (e) => {
1164
1208
  if (!e.id || e.id.length === 0) throw Error("migration: `id` is required + must be non-empty");
1165
1209
  if (!e.up || !e.down) throw Error(`migration ${e.id}: both \`up\` and \`down\` must be functions`);
1166
1210
  return e;
1167
- }, vt = /^\d{8}_\d{6}_[a-z0-9_]+\.ts$/, yt = (e) => typeof e == "object" && !!e && "id" in e && "up" in e && "down" in e && typeof e.id == "string" && typeof e.up == "function" && typeof e.down == "function", $ = /* @__PURE__ */ new Set(["voltro_isr_cache"]), bt = (e) => $.has(e) || e.startsWith("_voltro_") || e.startsWith("_cloud_") || e.startsWith("cluster_"), xt = /__dropped_\d{14}$/, St = (e) => xt.test(e);
1211
+ }, xt = /^\d{8}_\d{6}_[a-z0-9_]+\.ts$/, St = (e) => typeof e == "object" && !!e && "id" in e && "up" in e && "down" in e && typeof e.id == "string" && typeof e.up == "function" && typeof e.down == "function", $ = /* @__PURE__ */ new Set(["voltro_isr_cache"]), Ct = (e) => $.has(e) || e.startsWith("_voltro_") || e.startsWith("_cloud_") || e.startsWith("cluster_"), wt = /__dropped_\d{14}$/, Tt = (e) => wt.test(e);
1168
1212
  //#endregion
1169
- export { N as $, et as A, d as At, G as B, Je as C, l as Ct, Z as D, ee as Dt, st as E, o as Et, Be as F, r as Ft, Me as G, B as H, Ve as I, s as It, je as J, Le as K, Re as L, oe as Lt, at as M, he as Mt, Xe as N, te as Nt, tt as O, fe as Ot, Ze as P, ue as Pt, Ae as Q, K as R, u as Rt, it as S, c as St, Q as T, me as Tt, V as U, ze as V, Pe as W, F as X, P as Y, M as Z, ct as _, re as _t, yt as a, y as at, Qe as b, se as bt, lt as c, x as ct, ft as d, _e as dt, j as et, Ke as f, ve as ft, We as g, de as gt, Ue as h, i as ht, vt as i, Ce as it, Ge as j, ne as jt, Y as k, ce as kt, dt as l, ye as lt, Ye as m, p as mt, bt as n, xe as nt, _t as o, b as ot, ot as p, ge as pt, Ne as q, St as r, Se as rt, gt as s, v as st, $ as t, Oe as tt, ut as u, be as ut, nt as v, ae as vt, qe as w, pe as wt, rt as x, ie as xt, $e as y, le as yt, He as z };
1213
+ export { N as $, rt as A, me as At, G as B, se as Bt, Ze as C, ae as Ct, Z as D, ge as Dt, ut as E, he as Et, Ue as F, i as Ft, Fe as G, Be as H, We as I, ne as It, Pe as J, ze as K, Ve as L, d as Lt, ct as M, f as Mt, $e as N, re as Nt, it as O, ee as Ot, et as P, _e as Pt, Ne as Q, K as R, r as Rt, st as S, ce as St, Q as T, de as Tt, V as U, He as V, fe as Vt, Le as W, F as X, P as Y, M as Z, dt as _, ie as _t, St as a, b as at, tt as b, a as bt, ft as c, S as ct, ht as d, ye as dt, j as et, Ye as f, be as ft, qe as g, pe as gt, Ke as h, o as ht, xt as i, Te as it, Je as j, le as jt, Y as k, te as kt, mt as l, xe as lt, Qe as m, m as mt, Ct as n, Ce as nt, bt as o, x as ot, lt as p, ve as pt, Ie as q, Tt as r, we as rt, yt as s, y as st, $ as t, je as tt, pt as u, Se as ut, at as v, oe as vt, Xe as w, l as wt, ot as x, u as xt, nt as y, ue as yt, Ge as z, c as zt };