@noy-db/hub 0.2.0-pre.30 → 0.2.0-pre.31

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.
Files changed (143) hide show
  1. package/dist/adapter/index.d.ts +9 -0
  2. package/dist/adapter/index.js +14 -0
  3. package/dist/attestation/index.d.ts +1 -1
  4. package/dist/attestation/index.js +3 -3
  5. package/dist/blobs/index.d.ts +3 -3
  6. package/dist/bundle/index.d.ts +3 -3
  7. package/dist/bundle/index.js +1 -1
  8. package/dist/{chunk-Y6YUWZTS.js → chunk-L5HHBOMS.js} +2 -2
  9. package/dist/{chunk-BVKLJBJJ.js → chunk-W5NVNJDX.js} +2 -1
  10. package/dist/{chunk-BVKLJBJJ.js.map → chunk-W5NVNJDX.js.map} +1 -1
  11. package/dist/consent/index.d.ts +2 -2
  12. package/dist/{decrypt-partition-Mhjh6nnG.d.ts → decrypt-partition-CXS5KopB.d.ts} +1 -1
  13. package/dist/derivations/index.d.ts +3 -3
  14. package/dist/{dev-unlock-DJ3IhgY9.d.ts → dev-unlock-CnHTTVea.d.ts} +1 -1
  15. package/dist/guards/index.d.ts +3 -3
  16. package/dist/{hash-DLwkYf1d.d.ts → hash-oc5paYl0.d.ts} +1 -1
  17. package/dist/history/index.d.ts +3 -3
  18. package/dist/i18n/index.d.ts +2 -2
  19. package/dist/{index-CMRIx_zx.d.ts → index-BmhGztUi.d.ts} +1 -1
  20. package/dist/index.d.ts +11 -11
  21. package/dist/index.js +2 -2
  22. package/dist/kernel/index.d.ts +2 -2
  23. package/dist/materialized-views/index.d.ts +3 -3
  24. package/dist/{mime-magic-CacDBwYp.d.ts → mime-magic-JeLKHRng.d.ts} +1 -1
  25. package/dist/{noydb-5MIBD77B.js → noydb-NAU2DTFP.js} +2 -2
  26. package/dist/noydb-NAU2DTFP.js.map +1 -0
  27. package/dist/overlay-views/index.d.ts +3 -3
  28. package/dist/periods/index.d.ts +2 -2
  29. package/dist/session/index.d.ts +3 -3
  30. package/dist/shadow/index.d.ts +2 -2
  31. package/dist/snapshots/index.d.ts +2 -2
  32. package/dist/store/index.d.ts +2 -2
  33. package/dist/sync/index.d.ts +1 -1
  34. package/dist/team/index.d.ts +2 -2
  35. package/dist/{transition-guard-J04-jime.d.ts → transition-guard-Dy3NioQr.d.ts} +1 -1
  36. package/dist/tx/index.d.ts +2 -2
  37. package/dist/{with-materialized-view-DNfzC5lH.d.ts → with-materialized-view-DIVeez0W.d.ts} +1 -1
  38. package/dist/{with-overlayed-view-qk3lbhOd.d.ts → with-overlayed-view-DVZrc5Hb.d.ts} +1 -1
  39. package/dist/{with-rollup-Dd3_ZG4b.d.ts → with-rollup-CbU-O4wP.d.ts} +1 -1
  40. package/package.json +62 -221
  41. package/dist/aggregate/index.cjs +0 -1144
  42. package/dist/aggregate/index.cjs.map +0 -1
  43. package/dist/aggregate/index.d.cts +0 -39
  44. package/dist/attestation/index.cjs +0 -305
  45. package/dist/attestation/index.cjs.map +0 -1
  46. package/dist/attestation/index.d.cts +0 -54
  47. package/dist/blobs/index.cjs +0 -1967
  48. package/dist/blobs/index.cjs.map +0 -1
  49. package/dist/blobs/index.d.cts +0 -48
  50. package/dist/bundle/index.cjs +0 -41045
  51. package/dist/bundle/index.cjs.map +0 -1
  52. package/dist/bundle/index.d.cts +0 -187
  53. package/dist/consent/index.cjs +0 -204
  54. package/dist/consent/index.cjs.map +0 -1
  55. package/dist/consent/index.d.cts +0 -27
  56. package/dist/crdt/index.cjs +0 -152
  57. package/dist/crdt/index.cjs.map +0 -1
  58. package/dist/crdt/index.d.cts +0 -30
  59. package/dist/decrypt-partition-C0iDpbSd.d.cts +0 -558
  60. package/dist/derivations/index.cjs +0 -469
  61. package/dist/derivations/index.cjs.map +0 -1
  62. package/dist/derivations/index.d.cts +0 -74
  63. package/dist/dev-unlock-0Z6yxfS7.d.cts +0 -263
  64. package/dist/discriminant-BN9REW3o.d.cts +0 -60
  65. package/dist/errors-BAWO5Z5a.d.cts +0 -1500
  66. package/dist/forget/index.cjs +0 -43
  67. package/dist/forget/index.cjs.map +0 -1
  68. package/dist/forget/index.d.cts +0 -1
  69. package/dist/guards/index.cjs +0 -455
  70. package/dist/guards/index.cjs.map +0 -1
  71. package/dist/guards/index.d.cts +0 -39
  72. package/dist/hash-Db8ncXGr.d.cts +0 -63
  73. package/dist/history/index.cjs +0 -1245
  74. package/dist/history/index.cjs.map +0 -1
  75. package/dist/history/index.d.cts +0 -65
  76. package/dist/i18n/index.cjs +0 -1280
  77. package/dist/i18n/index.cjs.map +0 -1
  78. package/dist/i18n/index.d.cts +0 -41
  79. package/dist/index-BMmajblo.d.cts +0 -362
  80. package/dist/index-C1SC1EPe.d.cts +0 -1325
  81. package/dist/index-xJEPkvMb.d.cts +0 -93
  82. package/dist/index.cjs +0 -48100
  83. package/dist/index.cjs.map +0 -1
  84. package/dist/index.d.cts +0 -1050
  85. package/dist/indexing/index.cjs +0 -803
  86. package/dist/indexing/index.cjs.map +0 -1
  87. package/dist/indexing/index.d.cts +0 -36
  88. package/dist/kernel/index.cjs +0 -751
  89. package/dist/kernel/index.cjs.map +0 -1
  90. package/dist/kernel/index.d.cts +0 -11
  91. package/dist/lazy-builder-eYZzLEL1.d.cts +0 -304
  92. package/dist/materialized-views/index.cjs +0 -1518
  93. package/dist/materialized-views/index.cjs.map +0 -1
  94. package/dist/materialized-views/index.d.cts +0 -187
  95. package/dist/mime-magic-sdMzsfVK.d.cts +0 -103
  96. package/dist/overlay-views/index.cjs +0 -399
  97. package/dist/overlay-views/index.cjs.map +0 -1
  98. package/dist/overlay-views/index.d.cts +0 -102
  99. package/dist/periods/index.cjs +0 -1041
  100. package/dist/periods/index.cjs.map +0 -1
  101. package/dist/periods/index.d.cts +0 -24
  102. package/dist/predicate-BmhBSPCH.d.cts +0 -267
  103. package/dist/query/index.cjs +0 -3480
  104. package/dist/query/index.cjs.map +0 -1
  105. package/dist/query/index.d.cts +0 -4
  106. package/dist/sealed-record/index.cjs +0 -139
  107. package/dist/sealed-record/index.cjs.map +0 -1
  108. package/dist/sealed-record/index.d.cts +0 -123
  109. package/dist/session/index.cjs +0 -495
  110. package/dist/session/index.cjs.map +0 -1
  111. package/dist/session/index.d.cts +0 -48
  112. package/dist/shadow/index.cjs +0 -133
  113. package/dist/shadow/index.cjs.map +0 -1
  114. package/dist/shadow/index.d.cts +0 -19
  115. package/dist/snapshots/index.cjs +0 -937
  116. package/dist/snapshots/index.cjs.map +0 -1
  117. package/dist/snapshots/index.d.cts +0 -30
  118. package/dist/store/index.cjs +0 -1091
  119. package/dist/store/index.cjs.map +0 -1
  120. package/dist/store/index.d.cts +0 -501
  121. package/dist/strategy-BSxFXGzb.d.cts +0 -110
  122. package/dist/strategy-mJExw4LQ.d.cts +0 -1069
  123. package/dist/sync/index.cjs +0 -1062
  124. package/dist/sync/index.cjs.map +0 -1
  125. package/dist/sync/index.d.cts +0 -45
  126. package/dist/team/index.cjs +0 -2805
  127. package/dist/team/index.cjs.map +0 -1
  128. package/dist/team/index.d.cts +0 -120
  129. package/dist/transition-guard-tWZIsaXe.d.cts +0 -165
  130. package/dist/tx/index.cjs +0 -614
  131. package/dist/tx/index.cjs.map +0 -1
  132. package/dist/tx/index.d.cts +0 -39
  133. package/dist/types-CdVfiQgt.d.cts +0 -15275
  134. package/dist/ulid-DRH25k3y.d.cts +0 -66
  135. package/dist/util/index.cjs +0 -237
  136. package/dist/util/index.cjs.map +0 -1
  137. package/dist/util/index.d.cts +0 -79
  138. package/dist/with-materialized-view-DfgPcvi9.d.cts +0 -27
  139. package/dist/with-overlayed-view-Cvfkx1lg.d.cts +0 -13
  140. package/dist/with-rollup-nIxo7h9z.d.cts +0 -47
  141. /package/dist/{noydb-5MIBD77B.js.map → adapter/index.js.map} +0 -0
  142. /package/dist/{chunk-Y6YUWZTS.js.map → chunk-L5HHBOMS.js.map} +0 -0
  143. /package/dist/{types-DHn9lEP0.d.ts → index-DHn9lEP0.d.ts} +0 -0
@@ -1,751 +0,0 @@
1
- "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
-
20
- // src/kernel/index.ts
21
- var kernel_exports = {};
22
- __export(kernel_exports, {
23
- CrossShardJoinError: () => CrossShardJoinError,
24
- DataResidencyError: () => DataResidencyError,
25
- NoAccessError: () => NoAccessError,
26
- ReservedVaultNameError: () => ReservedVaultNameError,
27
- ShardProvisioningError: () => ShardProvisioningError,
28
- UnknownShardError: () => UnknownShardError,
29
- ValidationError: () => ValidationError,
30
- VaultTemplateNotFoundError: () => VaultTemplateNotFoundError,
31
- fuseRetrieval: () => fuseRetrieval,
32
- generateULID: () => generateULID,
33
- groupAndReduce: () => groupAndReduce,
34
- isQuorum: () => isQuorum,
35
- readPath: () => readPath,
36
- reduceRecords: () => reduceRecords,
37
- runDrainBarrier: () => runDrainBarrier,
38
- sha256Hex: () => sha256Hex
39
- });
40
- module.exports = __toCommonJS(kernel_exports);
41
-
42
- // src/money/fixed-point.ts
43
- function expandExponent(s) {
44
- const m = /^([+-]?)(\d+)(?:\.(\d+))?[eE]([+-]?\d+)$/.exec(s);
45
- if (!m) return s;
46
- const sign = m[1] === "-" ? "-" : "";
47
- const intp = m[2];
48
- const frac = m[3] ?? "";
49
- const exp = Number(m[4]);
50
- const digits = intp + frac;
51
- const pointPos = intp.length + exp;
52
- let body;
53
- if (pointPos <= 0) {
54
- body = "0." + "0".repeat(-pointPos) + digits;
55
- } else if (pointPos >= digits.length) {
56
- body = digits + "0".repeat(pointPos - digits.length);
57
- } else {
58
- body = digits.slice(0, pointPos) + "." + digits.slice(pointPos);
59
- }
60
- return sign + body;
61
- }
62
- function toCanonicalDecimalString(input) {
63
- let s;
64
- if (typeof input === "number") {
65
- if (!Number.isFinite(input)) return null;
66
- s = String(input);
67
- } else {
68
- s = input.trim();
69
- }
70
- s = expandExponent(s);
71
- if (s.startsWith("+")) s = s.slice(1);
72
- if (!/^-?(\d+(\.\d*)?|\.\d+)$/.test(s)) return null;
73
- return s;
74
- }
75
- function shouldRoundUp(negative, lastKeptDigit, firstDiscarded, hasMoreNonZeroAfterFirst, mode) {
76
- switch (mode) {
77
- case "up":
78
- return true;
79
- case "down":
80
- return false;
81
- case "ceil":
82
- return !negative;
83
- case "floor":
84
- return negative;
85
- case "half-up":
86
- return firstDiscarded >= 5;
87
- case "half-down":
88
- return firstDiscarded > 5 || firstDiscarded === 5 && hasMoreNonZeroAfterFirst;
89
- case "half-even":
90
- if (firstDiscarded > 5) return true;
91
- if (firstDiscarded < 5) return false;
92
- return hasMoreNonZeroAfterFirst || lastKeptDigit % 2 === 1;
93
- }
94
- }
95
- function parseToScaledInt(input, scale, rounding) {
96
- const canonical = toCanonicalDecimalString(input);
97
- if (canonical === null) return { ok: false, reason: "nonfinite" };
98
- const negative = canonical.startsWith("-");
99
- const unsigned = negative ? canonical.slice(1) : canonical;
100
- const dot = unsigned.indexOf(".");
101
- const intPart = dot === -1 ? unsigned : unsigned.slice(0, dot);
102
- const fracPart = dot === -1 ? "" : unsigned.slice(dot + 1);
103
- const intDigits = intPart === "" ? "0" : intPart;
104
- if (fracPart.length <= scale) {
105
- const keep2 = fracPart.padEnd(scale, "0");
106
- const magnitude2 = BigInt(intDigits + keep2);
107
- return { ok: true, value: negative && magnitude2 !== 0n ? -magnitude2 : magnitude2 };
108
- }
109
- const keep = fracPart.slice(0, scale);
110
- const tail = fracPart.slice(scale);
111
- const magnitudeDigits = intDigits + keep;
112
- let magnitude = BigInt(magnitudeDigits);
113
- if (/^0+$/.test(tail)) {
114
- return { ok: true, value: negative && magnitude !== 0n ? -magnitude : magnitude };
115
- }
116
- if (rounding === void 0) return { ok: false, reason: "precision" };
117
- const lastKeptDigit = Number(magnitudeDigits[magnitudeDigits.length - 1]);
118
- const firstDiscarded = Number(tail[0]);
119
- const hasMoreNonZeroAfterFirst = /[1-9]/.test(tail.slice(1));
120
- if (shouldRoundUp(negative, lastKeptDigit, firstDiscarded, hasMoreNonZeroAfterFirst, rounding)) {
121
- magnitude += 1n;
122
- }
123
- return { ok: true, value: negative && magnitude !== 0n ? -magnitude : magnitude };
124
- }
125
- function formatScaledInt(value, scale) {
126
- const negative = value < 0n;
127
- const abs = (negative ? -value : value).toString();
128
- if (scale === 0) return (negative ? "-" : "") + abs;
129
- const padded = abs.padStart(scale + 1, "0");
130
- const cut = padded.length - scale;
131
- const intPart = padded.slice(0, cut);
132
- const fracPart = padded.slice(cut);
133
- return (negative ? "-" : "") + intPart + "." + fracPart;
134
- }
135
-
136
- // src/money/iso4217.ts
137
- var MINOR_UNITS = {
138
- // 2-decimal majors
139
- EUR: 2,
140
- USD: 2,
141
- GBP: 2,
142
- CHF: 2,
143
- CAD: 2,
144
- AUD: 2,
145
- NZD: 2,
146
- SGD: 2,
147
- HKD: 2,
148
- CNY: 2,
149
- INR: 2,
150
- BRL: 2,
151
- MXN: 2,
152
- ZAR: 2,
153
- RUB: 2,
154
- TRY: 2,
155
- PLN: 2,
156
- SEK: 2,
157
- NOK: 2,
158
- DKK: 2,
159
- CZK: 2,
160
- HUF: 2,
161
- RON: 2,
162
- ILS: 2,
163
- THB: 2,
164
- PHP: 2,
165
- MYR: 2,
166
- IDR: 2,
167
- AED: 2,
168
- SAR: 2,
169
- QAR: 2,
170
- EGP: 2,
171
- // 0-decimal
172
- JPY: 0,
173
- KRW: 0,
174
- ISK: 0,
175
- CLP: 0,
176
- VND: 0,
177
- XOF: 0,
178
- XAF: 0,
179
- PYG: 0,
180
- // 3-decimal
181
- BHD: 3,
182
- KWD: 3,
183
- OMR: 3,
184
- TND: 3,
185
- JOD: 3,
186
- IQD: 3,
187
- LYD: 3
188
- };
189
- function scaleForCurrency(code) {
190
- const v = MINOR_UNITS[code];
191
- return v === void 0 ? null : v;
192
- }
193
-
194
- // src/errors.ts
195
- var NoydbError = class extends Error {
196
- /** Machine-readable error code. Stable across library versions. */
197
- code;
198
- constructor(code, message) {
199
- super(message);
200
- this.name = "NoydbError";
201
- this.code = code;
202
- }
203
- };
204
- var NoAccessError = class extends NoydbError {
205
- constructor(message = "No access \u2014 user does not have a key for this collection") {
206
- super("NO_ACCESS", message);
207
- this.name = "NoAccessError";
208
- }
209
- };
210
- var ReservedVaultNameError = class extends NoydbError {
211
- /** The rejected vault name. */
212
- vaultName;
213
- constructor(vaultName) {
214
- super(
215
- "RESERVED_VAULT_NAME",
216
- `"${vaultName}" is a reserved internal vault name and cannot be used as a group name or partition key`
217
- );
218
- this.name = "ReservedVaultNameError";
219
- this.vaultName = vaultName;
220
- }
221
- };
222
- var ValidationError = class extends NoydbError {
223
- constructor(message = "Validation error") {
224
- super("VALIDATION_ERROR", message);
225
- this.name = "ValidationError";
226
- }
227
- };
228
- var SchemaUpdateError = class extends NoydbError {
229
- constructor(code, message) {
230
- super(code, message);
231
- this.name = "SchemaUpdateError";
232
- }
233
- };
234
- var QuiesceTimeoutError = class extends SchemaUpdateError {
235
- constructor(message) {
236
- super("QUIESCE_TIMEOUT", message);
237
- this.name = "QuiesceTimeoutError";
238
- }
239
- };
240
- var GroupCardinalityError = class extends NoydbError {
241
- /** The field being grouped on. */
242
- field;
243
- /** Observed number of distinct groups at the moment the cap tripped. */
244
- cardinality;
245
- /** The cap that was exceeded. */
246
- maxGroups;
247
- constructor(field, cardinality, maxGroups) {
248
- super(
249
- "GROUP_CARDINALITY",
250
- `.groupBy("${field}") produced ${cardinality} distinct groups, exceeding the ${maxGroups}-group ceiling. This is almost always a query mistake \u2014 grouping on a high-uniqueness field like "id" or "createdAt" produces one bucket per record. Narrow the query with .where() before grouping, or group on a lower-cardinality field (status, category, clientId). If you genuinely need high-cardinality grouping, file an issue with your use case.`
251
- );
252
- this.name = "GroupCardinalityError";
253
- this.field = field;
254
- this.cardinality = cardinality;
255
- this.maxGroups = maxGroups;
256
- }
257
- };
258
- var UnknownShardError = class extends NoydbError {
259
- partitionKey;
260
- constructor(partitionKey, groupName) {
261
- super(
262
- "SHARD_UNKNOWN",
263
- `No shard for partition key "${partitionKey}" in vault group "${groupName}" and autoCreate is disabled. Call group.createShard(${JSON.stringify(partitionKey)}) first, or enable sharding.autoCreate.`
264
- );
265
- this.name = "UnknownShardError";
266
- this.partitionKey = partitionKey;
267
- }
268
- };
269
- var ShardProvisioningError = class extends NoydbError {
270
- vaultId;
271
- constructor(vaultId, partitionKey) {
272
- super(
273
- "SHARD_PROVISIONING",
274
- `Registry has a row for partition "${partitionKey}" (vault "${vaultId}") but that vault is not provisioned in the store. Refusing to recreate it \u2014 the registry and store have diverged. Investigate before retrying.`
275
- );
276
- this.name = "ShardProvisioningError";
277
- this.vaultId = vaultId;
278
- }
279
- };
280
- var DataResidencyError = class extends NoydbError {
281
- vaultId;
282
- requiredRegion;
283
- backendRegion;
284
- constructor(vaultId, requiredRegion, backendRegion) {
285
- super(
286
- "DATA_RESIDENCY",
287
- `Shard "${vaultId}" requires region "${requiredRegion}" but its placement backend declares region ${backendRegion === void 0 ? "(none)" : `"${backendRegion}"`}. Refusing to provision \u2014 route this shard to a region-correct backend via routeStore({ vaultRoutes }) (e.g. a region-encoded partition key) before retrying.`
288
- );
289
- this.name = "DataResidencyError";
290
- this.vaultId = vaultId;
291
- this.requiredRegion = requiredRegion;
292
- this.backendRegion = backendRegion;
293
- }
294
- };
295
- var CrossShardJoinError = class extends NoydbError {
296
- constructor(message) {
297
- super("CROSS_SHARD_JOIN", message);
298
- this.name = "CrossShardJoinError";
299
- }
300
- };
301
- var VaultTemplateNotFoundError = class extends NoydbError {
302
- templateName;
303
- constructor(templateName) {
304
- super(
305
- "VAULT_TEMPLATE_NOT_FOUND",
306
- `No vault template registered under "${templateName}". Register the template before opening the vault group.`
307
- );
308
- this.name = "VaultTemplateNotFoundError";
309
- this.templateName = templateName;
310
- }
311
- };
312
-
313
- // src/money/descriptor.ts
314
- var MoneyUnsupportedError = class extends NoydbError {
315
- constructor(field, message) {
316
- super(
317
- "MONEY_UNSUPPORTED",
318
- message ?? `money: operation is not supported on field "${field}" \u2014 use sum() and count() and divide at the boundary`
319
- );
320
- this.field = field;
321
- this.name = "MoneyUnsupportedError";
322
- }
323
- field;
324
- };
325
-
326
- // src/query/predicate.ts
327
- function readPath(record, path) {
328
- if (record === null || record === void 0) return void 0;
329
- if (!path.includes(".")) {
330
- return record[path];
331
- }
332
- const segments = path.split(".");
333
- let cursor = record;
334
- for (const segment of segments) {
335
- if (cursor === null || cursor === void 0) return void 0;
336
- cursor = cursor[segment];
337
- }
338
- return cursor;
339
- }
340
-
341
- // src/aggregate/aggregation.ts
342
- function reduceRecords(records, spec) {
343
- const state = {};
344
- for (const key of Object.keys(spec)) {
345
- state[key] = spec[key].init();
346
- }
347
- for (const record of records) {
348
- for (const key of Object.keys(spec)) {
349
- state[key] = spec[key].step(state[key], record);
350
- }
351
- }
352
- const result = {};
353
- for (const key of Object.keys(spec)) {
354
- result[key] = spec[key].finalize(state[key]);
355
- }
356
- return result;
357
- }
358
-
359
- // src/aggregate/canonical-key.ts
360
- function canonicalGroupKey(fields, row) {
361
- const sorted = [...fields].sort();
362
- const parts = [];
363
- for (const name of sorted) {
364
- const v = row[name];
365
- const serialised = v === void 0 ? "undefined" : JSON.stringify(v);
366
- parts.push(`${name}=${serialised}`);
367
- }
368
- return parts.join("|");
369
- }
370
-
371
- // src/money/money-reducer.ts
372
- function toScaledIntFromAny(v, scale) {
373
- if (typeof v === "bigint") return v;
374
- if (typeof v === "number") {
375
- const r = parseToScaledInt(v, scale);
376
- return r.ok ? r.value : null;
377
- }
378
- if (typeof v === "string") {
379
- if (!v.includes(".")) {
380
- try {
381
- return BigInt(v);
382
- } catch {
383
- return null;
384
- }
385
- }
386
- const r = parseToScaledInt(v, scale);
387
- return r.ok ? r.value : null;
388
- }
389
- return null;
390
- }
391
- function readMoney(record, field, desc) {
392
- const raw = readPath(record, field);
393
- if (raw === null || raw === void 0) return null;
394
- if (desc.mode === "fixed") {
395
- const cur = desc.fixedCurrency;
396
- const value2 = toScaledIntFromAny(raw, desc.scaleFor(cur));
397
- return value2 === null ? null : { currency: cur, value: value2 };
398
- }
399
- if (typeof raw !== "object") return null;
400
- const o = raw;
401
- if (typeof o.currency !== "string") return null;
402
- const scale = desc.allows(o.currency) ? desc.scaleFor(o.currency) : 0;
403
- const value = toScaledIntFromAny(o.amount, scale);
404
- return value === null ? null : { currency: o.currency, value };
405
- }
406
- function targetScaleFor(desc, currency) {
407
- if (desc.allows(currency)) return desc.scaleFor(currency);
408
- const s = scaleForCurrency(currency);
409
- if (s === null) {
410
- throw new Error(`money: cannot determine scale for conversion target "${currency}"`);
411
- }
412
- return s;
413
- }
414
- function parseRate(rate) {
415
- const s = String(rate).trim();
416
- const neg = s.startsWith("-");
417
- const body = neg ? s.slice(1) : s;
418
- const dot = body.indexOf(".");
419
- const intPart = dot === -1 ? body : body.slice(0, dot);
420
- const fracPart = dot === -1 ? "" : body.slice(dot + 1);
421
- const int = BigInt((intPart === "" ? "0" : intPart) + fracPart);
422
- return { int: neg ? -int : int, scale: fracPart.length };
423
- }
424
- function divRoundHalfEven(n, d) {
425
- const q = n / d;
426
- const r = n % d;
427
- const twiceR = (r < 0n ? -r : r) * 2n;
428
- if (twiceR < d) return q;
429
- if (twiceR > d) return q + (n < 0n ? -1n : 1n);
430
- return q % 2n === 0n ? q : q + (n < 0n ? -1n : 1n);
431
- }
432
- function convertScaled(value, srcScale, rate, targetScale) {
433
- const { int: rateInt, scale: rateScale } = parseRate(rate);
434
- const product = value * rateInt;
435
- const curScale = srcScale + rateScale;
436
- if (curScale === targetScale) return product;
437
- if (curScale < targetScale) return product * 10n ** BigInt(targetScale - curScale);
438
- return divRoundHalfEven(product, 10n ** BigInt(curScale - targetScale));
439
- }
440
- function finalizeSum(state, desc, convertTo, fx) {
441
- if (convertTo !== void 0) {
442
- if (fx === void 0) {
443
- throw new Error(`money: sum convertTo "${convertTo}" requires an fx rate map`);
444
- }
445
- const targetScale = targetScaleFor(desc, convertTo);
446
- let total = 0n;
447
- for (const [cur, v] of state) {
448
- if (cur === convertTo) {
449
- total += convertScaled(v, desc.scaleFor(cur), 1, targetScale);
450
- continue;
451
- }
452
- const rate = fx[`${cur}->${convertTo}`];
453
- if (rate === void 0) {
454
- throw new Error(`money: no fx rate for "${cur}->${convertTo}"`);
455
- }
456
- total += convertScaled(v, desc.scaleFor(cur), rate, targetScale);
457
- }
458
- return formatScaledInt(total, targetScale);
459
- }
460
- if (desc.mode === "fixed") {
461
- const cur = desc.fixedCurrency;
462
- return formatScaledInt(state.get(cur) ?? 0n, desc.scaleFor(cur));
463
- }
464
- const out = {};
465
- for (const [cur, v] of state) out[cur] = formatScaledInt(v, desc.scaleFor(cur));
466
- return out;
467
- }
468
- function moneySumReducer(field, desc, convertTo, fx) {
469
- return {
470
- op: "sum",
471
- field,
472
- init: () => /* @__PURE__ */ new Map(),
473
- step: (state, record) => {
474
- const m = readMoney(record, field, desc);
475
- if (m) state.set(m.currency, (state.get(m.currency) ?? 0n) + m.value);
476
- return state;
477
- },
478
- remove: (state, record) => {
479
- const m = readMoney(record, field, desc);
480
- if (m) state.set(m.currency, (state.get(m.currency) ?? 0n) - m.value);
481
- return state;
482
- },
483
- finalize: (state) => finalizeSum(state, desc, convertTo, fx)
484
- };
485
- }
486
- function extremum(values, op) {
487
- let out = values[0];
488
- for (let i = 1; i < values.length; i++) {
489
- const v = values[i];
490
- if (op === "min" ? v < out : v > out) out = v;
491
- }
492
- return out;
493
- }
494
- function moneyMinMaxReducer(op, field, desc) {
495
- return {
496
- op,
497
- field,
498
- init: () => /* @__PURE__ */ new Map(),
499
- step: (state, record) => {
500
- const m = readMoney(record, field, desc);
501
- if (m) {
502
- const arr = state.get(m.currency);
503
- if (arr) arr.push(m.value);
504
- else state.set(m.currency, [m.value]);
505
- }
506
- return state;
507
- },
508
- remove: (state, record) => {
509
- const m = readMoney(record, field, desc);
510
- if (m) {
511
- const arr = state.get(m.currency);
512
- if (arr) {
513
- const idx = arr.indexOf(m.value);
514
- if (idx >= 0) arr.splice(idx, 1);
515
- }
516
- }
517
- return state;
518
- },
519
- finalize: (state) => {
520
- if (desc.mode === "fixed") {
521
- const cur = desc.fixedCurrency;
522
- const arr = state.get(cur);
523
- if (!arr || arr.length === 0) return null;
524
- return formatScaledInt(extremum(arr, op), desc.scaleFor(cur));
525
- }
526
- const out = {};
527
- for (const [cur, arr] of state) {
528
- if (arr.length > 0) out[cur] = formatScaledInt(extremum(arr, op), desc.scaleFor(cur));
529
- }
530
- return out;
531
- }
532
- };
533
- }
534
- function wrapMoneyReducers(spec, moneyFields) {
535
- let changed = false;
536
- const out = {};
537
- for (const [key, reducer] of Object.entries(spec)) {
538
- const field = reducer.field;
539
- const desc = field ? moneyFields[field] : void 0;
540
- if (desc && reducer.op === "avg") {
541
- throw new MoneyUnsupportedError(
542
- field,
543
- `avg() is not supported on money field "${field}" in v1 \u2014 use sum() and count() and divide at the boundary.`
544
- );
545
- }
546
- if (desc && (reducer.op === "sum" || reducer.op === "min" || reducer.op === "max")) {
547
- changed = true;
548
- out[key] = reducer.op === "sum" ? moneySumReducer(field, desc, reducer.convertTo, reducer.fx) : moneyMinMaxReducer(reducer.op, field, desc);
549
- } else {
550
- out[key] = reducer;
551
- }
552
- }
553
- return changed ? out : spec;
554
- }
555
-
556
- // src/aggregate/groupby.ts
557
- var GROUPBY_WARN_CARDINALITY = 1e4;
558
- var GROUPBY_MAX_CARDINALITY = 1e5;
559
- var warnedCardinalityFields = /* @__PURE__ */ new Set();
560
- function warnCardinalityApproaching(fields, observed) {
561
- const key = JSON.stringify([...fields].sort());
562
- if (warnedCardinalityFields.has(key)) return;
563
- warnedCardinalityFields.add(key);
564
- const label = `[${fields.join(", ")}]`;
565
- console.warn(
566
- `[noy-db] .groupBy(${label}) produced ${observed} distinct groups, ${Math.round(observed / GROUPBY_MAX_CARDINALITY * 100)}% of the ${GROUPBY_MAX_CARDINALITY}-group ceiling. Narrow the query with .where() before grouping, or switch to a lower-cardinality field.`
567
- );
568
- }
569
- function groupAndReduce(records, fieldOrFields, spec, moneyFields) {
570
- const fields = typeof fieldOrFields === "string" ? [fieldOrFields] : fieldOrFields;
571
- if (fields.length === 0) {
572
- throw new Error(".groupBy() requires at least one field");
573
- }
574
- if (moneyFields) {
575
- spec = wrapMoneyReducers(spec, moneyFields);
576
- }
577
- const buckets = /* @__PURE__ */ new Map();
578
- const fieldLabel = fields.length === 1 ? fields[0] : `[${fields.join(", ")}]`;
579
- for (const record of records) {
580
- const keyValues = {};
581
- for (const f of fields) {
582
- keyValues[f] = readPath(record, f);
583
- }
584
- const dedupKey = canonicalGroupKey(fields, keyValues);
585
- let bucket = buckets.get(dedupKey);
586
- if (bucket === void 0) {
587
- if (buckets.size >= GROUPBY_MAX_CARDINALITY) {
588
- throw new GroupCardinalityError(
589
- fieldLabel,
590
- buckets.size + 1,
591
- GROUPBY_MAX_CARDINALITY
592
- );
593
- }
594
- bucket = { keyValues, records: [] };
595
- buckets.set(dedupKey, bucket);
596
- }
597
- bucket.records.push(record);
598
- }
599
- if (buckets.size >= GROUPBY_WARN_CARDINALITY) {
600
- warnCardinalityApproaching(fields, buckets.size);
601
- }
602
- const reducerKeys = Object.keys(spec);
603
- const out = [];
604
- for (const bucket of buckets.values()) {
605
- const state = {};
606
- for (const rk of reducerKeys) {
607
- state[rk] = spec[rk].init();
608
- }
609
- for (const record of bucket.records) {
610
- for (const rk of reducerKeys) {
611
- state[rk] = spec[rk].step(state[rk], record);
612
- }
613
- }
614
- const row = {};
615
- for (const f of fields) {
616
- row[f] = bucket.keyValues[f];
617
- }
618
- for (const rk of reducerKeys) {
619
- row[rk] = spec[rk].finalize(state[rk]);
620
- }
621
- out.push(row);
622
- }
623
- return out;
624
- }
625
-
626
- // src/bundle/ulid.ts
627
- var CROCKFORD_ALPHABET = "0123456789ABCDEFGHJKMNPQRSTVWXYZ";
628
- function encodeBase32(value, length) {
629
- let out = "";
630
- let v = value;
631
- for (let i = 0; i < length; i++) {
632
- out = CROCKFORD_ALPHABET[v % 32] + out;
633
- v = Math.floor(v / 32);
634
- }
635
- return out;
636
- }
637
- function generateULID() {
638
- const now = Date.now();
639
- const timestampHigh = Math.floor(now / 16777216);
640
- const timestampLow = now & 16777215;
641
- const tsPart = encodeBase32(timestampHigh, 5) + encodeBase32(timestampLow, 5);
642
- const randBytes = new Uint8Array(10);
643
- crypto.getRandomValues(randBytes);
644
- const rand1 = randBytes[0] * 2 ** 32 + (randBytes[1] << 24 >>> 0) + (randBytes[2] << 16) + (randBytes[3] << 8) + randBytes[4];
645
- const rand2 = randBytes[5] * 2 ** 32 + (randBytes[6] << 24 >>> 0) + (randBytes[7] << 16) + (randBytes[8] << 8) + randBytes[9];
646
- const randPart = encodeBase32(rand1, 8) + encodeBase32(rand2, 8);
647
- return tsPart + randPart;
648
- }
649
-
650
- // src/crypto.ts
651
- var subtle = globalThis.crypto.subtle;
652
- async function sha256Hex(data) {
653
- const hash = await subtle.digest("SHA-256", data);
654
- return Array.from(new Uint8Array(hash)).map((b) => b.toString(16).padStart(2, "0")).join("");
655
- }
656
-
657
- // src/coordination/types.ts
658
- function isQuorum(writers, generation, excludeWriterId) {
659
- return writers.filter((w) => w.writerId !== excludeWriterId).every((w) => w.quiescedAtVersion === generation);
660
- }
661
- async function runDrainBarrier(provider, o, run) {
662
- await provider.setFence(o.vault, { currentSchemaVersion: o.generation, fenceState: "draining" });
663
- await o.onFlush();
664
- const deadline = o.now() + o.quiesceTimeoutMs;
665
- const seeded = await provider.reachableWriters(o.vault, { staleMs: o.staleMs, now: o.now() });
666
- if (!isQuorum(seeded, o.generation, o.writerId)) {
667
- await new Promise((resolve, reject) => {
668
- let settled = false;
669
- const finish = (fn) => {
670
- if (!settled) {
671
- settled = true;
672
- unsub();
673
- fn();
674
- }
675
- };
676
- const unsub = provider.observePresence(o.vault, (writers) => {
677
- if (isQuorum(writers, o.generation, o.writerId)) finish(resolve);
678
- });
679
- const tick = async () => {
680
- if (settled) return;
681
- if (o.now() >= deadline) {
682
- finish(
683
- () => reject(
684
- new QuiesceTimeoutError(
685
- `Cutover of vault "${o.vault}" to generation ${o.generation} timed out after ${o.quiesceTimeoutMs}ms waiting for active writers to quiesce.`
686
- )
687
- )
688
- );
689
- return;
690
- }
691
- if (o.onPoll) await o.onPoll();
692
- const w = await provider.reachableWriters(o.vault, { staleMs: o.staleMs, now: o.now() });
693
- if (isQuorum(w, o.generation, o.writerId)) finish(resolve);
694
- else setTimeout(() => void tick(), 25);
695
- };
696
- void tick();
697
- });
698
- }
699
- await run();
700
- }
701
-
702
- // src/search/fuse.ts
703
- function fuseRetrieval(lists, opts = {}) {
704
- const k = opts.k ?? 60;
705
- const acc = /* @__PURE__ */ new Map();
706
- for (const list of lists) {
707
- for (const hit of list) {
708
- const contribution = 1 / (k + hit.rank);
709
- const prev = acc.get(hit.id);
710
- if (prev === void 0) {
711
- acc.set(hit.id, { score: contribution, hit });
712
- } else {
713
- prev.score += contribution;
714
- prev.hit = mergePresentation(prev.hit, hit);
715
- }
716
- }
717
- }
718
- const merged = [...acc.values()].sort(
719
- (a, b) => b.score - a.score || (a.hit.id < b.hit.id ? -1 : a.hit.id > b.hit.id ? 1 : 0)
720
- );
721
- const limited = opts.limit !== void 0 ? merged.slice(0, opts.limit) : merged;
722
- return limited.map((m, i) => ({ ...m.hit, score: m.score, rank: i + 1 }));
723
- }
724
- function mergePresentation(a, b) {
725
- const lexical = a.field !== "(vector)" ? a : b;
726
- const other = lexical === a ? b : a;
727
- return {
728
- ...lexical,
729
- ...lexical.record === void 0 && other.record !== void 0 ? { record: other.record } : {}
730
- };
731
- }
732
- // Annotate the CommonJS export names for ESM import in node:
733
- 0 && (module.exports = {
734
- CrossShardJoinError,
735
- DataResidencyError,
736
- NoAccessError,
737
- ReservedVaultNameError,
738
- ShardProvisioningError,
739
- UnknownShardError,
740
- ValidationError,
741
- VaultTemplateNotFoundError,
742
- fuseRetrieval,
743
- generateULID,
744
- groupAndReduce,
745
- isQuorum,
746
- readPath,
747
- reduceRecords,
748
- runDrainBarrier,
749
- sha256Hex
750
- });
751
- //# sourceMappingURL=index.cjs.map