@voltro/database 0.86.0 → 0.87.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.
@@ -122,18 +122,28 @@ var w = {
122
122
  ...e,
123
123
  columns: e.columns.map((e) => r.get(e) ?? e)
124
124
  });
125
- let o = new Map(t.indexes.map((e) => [i(e.name), a?.get(e) ?? e])), s = new Map(e.indexes.map((e) => [i(e.name), e])), c = [], l = [];
125
+ let o = new Map(t.indexes.map((e) => [i(e.name), a?.get(e) ?? e])), s = new Map(e.indexes.map((e) => [i(e.name), e])), c = /* @__PURE__ */ new Map();
126
+ if (n === "sqlite" || n === "turso") {
127
+ let n = t.indexes.filter((e) => e.unique && e.columns.length > 1 && !e.expression && e.where === void 0 && !s.has(i(e.name)) && i(e.name).startsWith(i(`sqlite_autoindex_${t.name}_`)) && /^\d+$/.test(e.name.slice(`sqlite_autoindex_${t.name}_`.length))), r = e.indexes.filter((e) => !o.has(i(e.name)));
128
+ for (let e of n) {
129
+ let t = r.filter((t) => I(t, a?.get(e) ?? e));
130
+ if (t.length !== 1) continue;
131
+ let s = t[0];
132
+ n.filter((e) => I(s, a?.get(e) ?? e)).length === 1 && (c.set(e, s), o.set(i(s.name), a?.get(e) ?? e));
133
+ }
134
+ }
135
+ let l = [], u = [];
126
136
  for (let t of e.indexes) {
127
137
  let e = o.get(i(t.name));
128
- (!e || !I(t, e)) && c.push(t);
138
+ (!e || !I(t, e)) && l.push(t);
129
139
  }
130
140
  for (let e of t.indexes) {
131
- let t = s.get(i(e.name));
132
- (!t || !I(t, a?.get(e) ?? e)) && l.push(e);
141
+ let t = s.get(i(e.name)) ?? c.get(e);
142
+ (!t || !I(t, a?.get(e) ?? e)) && u.push(e);
133
143
  }
134
144
  return {
135
- added: c,
136
- removed: l
145
+ added: l,
146
+ removed: u
137
147
  };
138
148
  }, L = (e, t, n, r) => ({
139
149
  op: e,
@@ -712,14 +722,14 @@ var w = {
712
722
  "add-column": 0,
713
723
  "rename-column": 1,
714
724
  "rename-index": 1,
715
- "alter-column-nullability": 2,
716
- "alter-column-type": 2,
717
- "alter-column-default": 2,
718
- "drop-index": 3,
719
- "drop-check": 3,
720
- "drop-unique": 3,
721
- "drop-unique-composite": 3,
722
- "drop-foreign-key": 3,
725
+ "drop-index": 2,
726
+ "drop-check": 2,
727
+ "drop-unique": 2,
728
+ "drop-unique-composite": 2,
729
+ "drop-foreign-key": 2,
730
+ "alter-column-nullability": 3,
731
+ "alter-column-type": 3,
732
+ "alter-column-default": 3,
723
733
  "drop-column": 4,
724
734
  "convert-charset": 5,
725
735
  "add-index": 6,
@@ -4,7 +4,10 @@ var e = (e, t) => {
4
4
  if (!i("check")) return null;
5
5
  let a = n[r++];
6
6
  if (a === void 0 || (a.startsWith("\"") ? a.slice(1, -1).replace(/""/g, "\"") : a.toLowerCase()) !== t) return null;
7
- let o = () => !i("::") || i("text") || i("character") && i("varying");
7
+ let o = () => {
8
+ for (; i("::");) if (!(i("text") || i("character") && i("varying"))) return !1;
9
+ return !0;
10
+ };
8
11
  if (!o() || !i("=")) return null;
9
12
  let s = i("any");
10
13
  if (s && (!i("array") || !i("["))) return null;
@@ -0,0 +1,13 @@
1
+ //#region src/migrations/sqliteCatalogName.ts
2
+ var e = (e) => e.replace(/[A-Z]/g, (e) => e.toLowerCase()), t = String.raw`(?:"(?:""|[^"])*"|\x60(?:\x60\x60|[^\x60])*\x60|\[[^\]]*\]|'(?:''|[^'])*'|[^\s.(]+)`, n = {
3
+ table: String.raw`CREATE\s+(?:TEMP(?:ORARY)?\s+)?TABLE`,
4
+ index: String.raw`CREATE\s+(?:UNIQUE\s+)?INDEX`
5
+ }, r = (r, i, a) => {
6
+ if (a === null) return i;
7
+ let o = new RegExp(String.raw`^\s*${n[r]}\s+(?:IF\s+NOT\s+EXISTS\s+)?(${t})(?:\s*\.\s*(${t}))?\s*(?=\(|ON\b|AS\b)`, "i").exec(a), s = o?.[2] ?? o?.[1];
8
+ if (s === void 0) return i;
9
+ let c = s[0], l = c === "\"" ? s.slice(1, -1).replaceAll("\"\"", "\"") : c === "`" ? s.slice(1, -1).replaceAll("``", "`") : c === "[" ? s.slice(1, -1) : c === "'" ? s.slice(1, -1).replaceAll("''", "'") : s;
10
+ return e(l) === e(i) ? l : i;
11
+ }, i = e;
12
+ //#endregion
13
+ export { i as sqliteCatalogKey, r as sqliteCatalogName };
package/dist/predicate.js CHANGED
@@ -129,7 +129,14 @@ var a = (e, t) => ({
129
129
  if (n !== void 0) return n[0] === n[1] ? 0 : n[0] > n[1] ? 1 : -1;
130
130
  let r = e instanceof Date ? e.getTime() : e, i = t instanceof Date ? t.getTime() : t;
131
131
  return typeof r == typeof i ? r === i ? 0 : r > i ? 1 : -1 : null;
132
- }, I = (e, t, n = null, r = {}) => z(e, t, n, r) === !0, L = (e, t = null, n = {}) => {
132
+ }, I = (e, t) => {
133
+ let n = e;
134
+ for (let e of t) {
135
+ if (n == null) return;
136
+ n = typeof e == "number" ? Array.isArray(n) ? n[e] : void 0 : typeof n == "object" && !Array.isArray(n) && Object.hasOwn(n, e) ? n[e] : void 0;
137
+ }
138
+ return n;
139
+ }, L = (e, t) => e != null && t != null ? i(e, t) === 0 : P(e, t), R = (e, t, n = null, r = {}) => V(e, t, n, r) === !0, z = (e, t = null, n = {}) => {
133
140
  let r = /* @__PURE__ */ new Map(), i = (e) => {
134
141
  if ("not" in e) {
135
142
  i(e.not);
@@ -158,8 +165,8 @@ var a = (e, t) => ({
158
165
  let s = Array.prototype.filter.call(a, (e) => !(typeof e == "number" && Number.isNaN(e)));
159
166
  r.set(e, new Set(s));
160
167
  };
161
- return i(e), (i) => z(e, i, t, n, r) === !0;
162
- }, R = (e, t, n) => {
168
+ return i(e), (i) => V(e, i, t, n, r) === !0;
169
+ }, B = (e, t, n) => {
163
170
  if (e.length < 128 || t.length < 16 || Object.getPrototypeOf(e) !== Array.prototype || Object.getPrototypeOf(t) !== Array.prototype || Object.getOwnPropertyDescriptor(e, "includes") !== void 0 || Object.getOwnPropertyDescriptor(t, n) !== void 0) return;
164
171
  for (let n of [e, t]) for (let e = 0; e < n.length; e += 1) {
165
172
  let t = Object.getOwnPropertyDescriptor(n, String(e));
@@ -168,16 +175,16 @@ var a = (e, t) => ({
168
175
  let r = /* @__PURE__ */ new Set();
169
176
  for (let t = 0; t < e.length; t += 1) r.add(e[t]);
170
177
  return r;
171
- }, z = (t, a, o = null, s = {}, c) => {
178
+ }, V = (t, a, o = null, s = {}, c) => {
172
179
  if (!a) return !1;
173
180
  if ("not" in t) {
174
- let e = z(t.not, a, o, s, c);
181
+ let e = V(t.not, a, o, s, c);
175
182
  return e === null ? null : !e;
176
183
  }
177
184
  if ("and" in t) {
178
185
  let e = !1;
179
186
  for (let n of t.and) {
180
- let t = z(n, a, o, s, c);
187
+ let t = V(n, a, o, s, c);
181
188
  if (t === !1) return !1;
182
189
  t === null && (e = !0);
183
190
  }
@@ -186,7 +193,7 @@ var a = (e, t) => ({
186
193
  if ("or" in t) {
187
194
  let e = !1;
188
195
  for (let n of t.or) {
189
- let t = z(n, a, o, s, c);
196
+ let t = V(n, a, o, s, c);
190
197
  if (t === !0) return !0;
191
198
  t === null && (e = !0);
192
199
  }
@@ -204,7 +211,7 @@ var a = (e, t) => ({
204
211
  let e = o.get(t.subquery), n = typeof e == "number" ? e > 0 : e instanceof Set && e.size > 0;
205
212
  return t.op === "exists" ? n : !n;
206
213
  }
207
- let l = t, u = a[l.column], d = n(l.value) ? l.value : void 0;
214
+ let l = t, u = l.path === void 0 ? a[l.column] : I(a[l.column], l.path), d = n(l.value) ? l.value : void 0;
208
215
  if (d !== void 0 && (!e.some((e) => e === l.op) || l.path !== void 0)) throw r("Column references require a scalar comparison without a JSON path");
209
216
  let f = d === void 0 ? l.value : a[d.column];
210
217
  if (d !== void 0 && (u == null || f == null)) return null;
@@ -213,7 +220,7 @@ var a = (e, t) => ({
213
220
  let e = typeof u == "number" && Number.isNaN(u) ? !1 : m.has(u);
214
221
  return l.op === "in" ? e : !e;
215
222
  }
216
- let h = (e, t) => p && e != null && t != null ? i(e, t) === 0 : P(e, t), g = p ? i : F;
223
+ let h = p ? L : P, g = p ? i : F;
217
224
  switch (l.op) {
218
225
  case "eq": return h(u, f);
219
226
  case "neq": return !h(u, f);
@@ -229,23 +236,23 @@ var a = (e, t) => ({
229
236
  let e = Array.isArray(u) ? u : [], t = Array.isArray(f) ? f : [];
230
237
  if (e.length < 128 || t.length < 16) return t.every((t) => e.includes(t));
231
238
  let n, r = 0;
232
- return t.every((i) => (++r === 5 && (n = R(e, t, "every")), n === void 0 ? e.includes(i) : n.has(i)));
239
+ return t.every((i) => (++r === 5 && (n = B(e, t, "every")), n === void 0 ? e.includes(i) : n.has(i)));
233
240
  }
234
241
  case "arrayOverlaps": {
235
242
  let e = Array.isArray(u) ? u : [], t = Array.isArray(f) ? f : [];
236
243
  if (e.length < 128 || t.length < 16) return t.some((t) => e.includes(t));
237
244
  let n, r = 0;
238
- return t.some((i) => (++r === 5 && (n = R(e, t, "some")), n === void 0 ? e.includes(i) : n.has(i)));
245
+ return t.some((i) => (++r === 5 && (n = B(e, t, "some")), n === void 0 ? e.includes(i) : n.has(i)));
239
246
  }
240
247
  case "arrayHas": return Array.isArray(u) && u.includes(f);
241
248
  case "isNull": return u == null;
242
249
  case "isNotNull": return u != null;
243
250
  case "spatial": throw r("@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.");
244
251
  }
245
- }, B = function* (e) {
246
- if ("not" in e) yield* B(e.not);
247
- else if ("and" in e) for (let t of e.and) yield* B(t);
248
- else if ("or" in e) for (let t of e.or) yield* B(t);
252
+ }, H = function* (e) {
253
+ if ("not" in e) yield* H(e.not);
254
+ else if ("and" in e) for (let t of e.and) yield* H(t);
255
+ else if ("or" in e) for (let t of e.or) yield* H(t);
249
256
  else e.op === "subquery-in" || e.op === "subquery-not-in" ? yield {
250
257
  kind: "in",
251
258
  descriptor: e.subquery
@@ -253,14 +260,14 @@ var a = (e, t) => ({
253
260
  kind: "exists",
254
261
  descriptor: e.subquery
255
262
  });
256
- }, V = function* (e, t = !0) {
257
- if ("not" in e) yield* V(e.not, !1);
258
- else if ("and" in e) for (let n of e.and) yield* V(n, t);
259
- else if ("or" in e) for (let t of e.or) yield* V(t, !1);
263
+ }, U = function* (e, t = !0) {
264
+ if ("not" in e) yield* U(e.not, !1);
265
+ else if ("and" in e) for (let n of e.and) yield* U(n, t);
266
+ else if ("or" in e) for (let t of e.or) yield* U(t, !1);
260
267
  else e.op !== "subquery-in" && e.op !== "subquery-not-in" && e.op !== "exists" && e.op !== "not-exists" && (yield {
261
268
  ...e,
262
269
  conjunctive: t && !n(e.value)
263
270
  });
264
271
  };
265
272
  //#endregion
266
- export { v as MATCHES_NO_ROWS, S as and, h as arrayContains, _ as arrayHas, g as arrayOverlaps, B as collectSubqueries, t as columnRef, p as contains, a as eq, I as evaluatePredicate, k as exists, s as gt, c as gte, d as inSet, D as inSubquery, n as isColumnReference, b as isNotNull, y as isNull, T as jsonField, l as lt, u as lte, o as neq, w as not, A as notExists, f as notInSet, O as notInSubquery, C as or, L as preparePredicate, x as spatialPredicate, m as startsWith, V as walkLeaves };
273
+ export { v as MATCHES_NO_ROWS, S as and, h as arrayContains, _ as arrayHas, g as arrayOverlaps, H as collectSubqueries, t as columnRef, p as contains, a as eq, R as evaluatePredicate, k as exists, s as gt, c as gte, d as inSet, D as inSubquery, n as isColumnReference, b as isNotNull, y as isNull, T as jsonField, l as lt, u as lte, o as neq, w as not, A as notExists, f as notInSet, O as notInSubquery, C as or, z as preparePredicate, x as spatialPredicate, m as startsWith, U as walkLeaves };
@@ -133,6 +133,12 @@ var n = (e) => e.order ?? [], r = (e) => ({
133
133
  lock: "update"
134
134
  });
135
135
  },
136
+ forShare() {
137
+ return w({
138
+ ...e,
139
+ lock: "share"
140
+ });
141
+ },
136
142
  unscoped() {
137
143
  return w({
138
144
  ...e,
@@ -58,17 +58,25 @@ var c = (e) => e == null || typeof e == "boolean" ? e : typeof e == "number" ? e
58
58
  }
59
59
  }, g = (t, n, r, c) => {
60
60
  if (t.length === 0) return t;
61
+ let l = c;
62
+ for (; l?.setOp !== void 0;) {
63
+ if (l.setOp.queries.length < 2) throw Error("A set operation requires at least two inputs");
64
+ l = l.setOp.queries[0];
65
+ }
66
+ if (c?.setOp && l) return g(t, l.table, r, l);
61
67
  if (c && (r === "sqlite" || r === "turso") && a(c)) {
62
- let e = o(s(c, void 0), void 0);
68
+ let e = o(s(c, void 0), void 0), n = (c.aggregations ?? []).filter((e) => v.has(e.op)).map((e) => e.alias);
63
69
  return t.map((t) => {
64
- let n = { ...t };
70
+ let i = { ...t };
65
71
  for (let t of e) {
66
72
  let e = t.decimal ? "decimal" : t.definition?.type;
67
- e && t.name in n && (n[t.name] = m(n[t.name], e, r));
73
+ e && t.name in i && (i[t.name] = m(i[t.name], e, r));
68
74
  }
69
- return n;
75
+ for (let e of n) e in i && (i[e] = S(i[e]));
76
+ return i;
70
77
  });
71
78
  }
79
+ if (c?.aggregations?.length) return C(t, c, r);
72
80
  if (c?.joinedProjection?.length) {
73
81
  let e = c.joinedProjection.map((e) => ({
74
82
  outputKey: e.outputKey,
@@ -80,9 +88,51 @@ var c = (e) => e == null || typeof e == "boolean" ? e : typeof e == "number" ? e
80
88
  return n;
81
89
  });
82
90
  }
83
- let l = c?.sourceTable?.tableName === n ? c.sourceTable : e(n);
84
- return l === void 0 ? t : _(t, l, r);
85
- }, _ = (e, n, i) => {
91
+ let u = c?.sourceTable?.tableName === n ? c.sourceTable : e(n);
92
+ return u === void 0 ? t : w(t, u, r);
93
+ }, _ = (e, t, n) => g(e, t.table, n, t), v = /* @__PURE__ */ new Set([
94
+ "count",
95
+ "count-distinct",
96
+ "window-row-number",
97
+ "window-rank",
98
+ "window-dense-rank"
99
+ ]), y = /* @__PURE__ */ new Set(["sum", "window-sum-over"]), b = /* @__PURE__ */ new Set(["avg", "window-avg-over"]), x = (e) => e == null ? e : Number(e), S = (e) => {
100
+ if (e == null) return e;
101
+ let t = typeof e == "number" ? e : typeof e == "bigint" ? e <= BigInt(2 ** 53 - 1) ? Number(e) : NaN : typeof e == "string" && /^\d+$/.test(e) ? Number(e) : NaN;
102
+ if (!Number.isSafeInteger(t) || t < 0) throw RangeError(`aggregate counter ${String(e)} is not a non-negative safe integer`);
103
+ return t;
104
+ }, C = (e, t, n) => {
105
+ let r = (t.aggregations ?? []).map((e) => {
106
+ let r = e.column === void 0 ? void 0 : i(e.column, t);
107
+ if (v.has(e.op)) return {
108
+ alias: e.alias,
109
+ decode: S
110
+ };
111
+ if (b.has(e.op)) return {
112
+ alias: e.alias,
113
+ decode: x
114
+ };
115
+ if (y.has(e.op)) {
116
+ let t = r?.type === "decimal" || r?.type === "bigint";
117
+ return {
118
+ alias: e.alias,
119
+ decode: t ? (e) => m(e, r.type, n) : x
120
+ };
121
+ }
122
+ return r === void 0 ? {
123
+ alias: e.alias,
124
+ decode: (e) => e
125
+ } : {
126
+ alias: e.alias,
127
+ decode: f(r) ? d : (e) => m(e, r.type, n)
128
+ };
129
+ });
130
+ return e.map((e) => {
131
+ let t = { ...e };
132
+ for (let { alias: e, decode: n } of r) e in t && (t[e] = n(t[e]));
133
+ return t;
134
+ });
135
+ }, w = (e, n, i) => {
86
136
  if (e.length === 0) return e;
87
137
  let a = n.fields, o = [];
88
138
  for (let [e, t] of Object.entries(a)) {
@@ -99,7 +149,7 @@ var c = (e) => e == null || typeof e == "boolean" ? e : typeof e == "number" ? e
99
149
  for (let { key: e, type: r, decimalShape: a, numericId: s } of o) e in n && (n[e] = s ? d(n[e]) : a && n[e] !== null && n[e] !== void 0 ? t(n[e], a) : m(n[e], r, i));
100
150
  return n;
101
151
  });
102
- }, v = (e, t) => {
152
+ }, T = (e, t) => {
103
153
  if (e == null) return e;
104
154
  switch (t) {
105
155
  case "json": return JSON.stringify(e);
@@ -107,17 +157,17 @@ var c = (e) => e == null || typeof e == "boolean" ? e : typeof e == "number" ? e
107
157
  case "vector": return typeof e == "string" ? e : JSON.stringify(e);
108
158
  default: return e;
109
159
  }
110
- }, y = (t, i, a = ["json", "array"]) => {
160
+ }, E = (t, i, a = ["json", "array"]) => {
111
161
  let o = e(i);
112
162
  if (o === void 0) return t;
113
163
  let s = o.fields, c = null;
114
164
  for (let [e, i] of Object.entries(s)) if (a.includes(i.type) && e in t) {
115
165
  let a = i.type === "decimal" ? r(i) : void 0, o = t[e];
116
166
  if (a && o != null && typeof o != "string") throw TypeError("Encoded decimal writes require exact decimal strings");
117
- let s = a && typeof o == "string" ? n(o, a) : v(o, i.type);
167
+ let s = a && typeof o == "string" ? n(o, a) : T(o, i.type);
118
168
  s !== t[e] && (c === null && (c = { ...t }), c[e] = s);
119
169
  }
120
170
  return c ?? t;
121
171
  };
122
172
  //#endregion
123
- export { m as decodeCell, _ as decodeRowsForTable, g as decodeRowsFromSchema, y as encodeRowForSchema };
173
+ export { m as decodeCell, w as decodeRowsForTable, g as decodeRowsFromSchema, _ as decodeSelectRows, E as encodeRowForSchema };