@dxos/util 0.8.4-main.8360d9e660 → 0.8.4-main.8baae0fced

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 (98) hide show
  1. package/LICENSE +102 -5
  2. package/dist/lib/browser/index.mjs +276 -152
  3. package/dist/lib/browser/index.mjs.map +4 -4
  4. package/dist/lib/browser/meta.json +1 -1
  5. package/dist/lib/node-esm/index.mjs +276 -152
  6. package/dist/lib/node-esm/index.mjs.map +4 -4
  7. package/dist/lib/node-esm/meta.json +1 -1
  8. package/dist/types/src/array-to-hex.d.ts.map +1 -1
  9. package/dist/types/src/array.d.ts.map +1 -1
  10. package/dist/types/src/binder.d.ts.map +1 -1
  11. package/dist/types/src/bitfield.d.ts.map +1 -1
  12. package/dist/types/src/browser-storage.d.ts +9 -0
  13. package/dist/types/src/browser-storage.d.ts.map +1 -0
  14. package/dist/types/src/callback-collection.d.ts.map +1 -1
  15. package/dist/types/src/callback.d.ts.map +1 -1
  16. package/dist/types/src/case.d.ts.map +1 -1
  17. package/dist/types/src/chunk-array.d.ts.map +1 -1
  18. package/dist/types/src/circular-buffer.d.ts.map +1 -1
  19. package/dist/types/src/clear-undefined.d.ts.map +1 -1
  20. package/dist/types/src/complex.d.ts +15 -0
  21. package/dist/types/src/complex.d.ts.map +1 -1
  22. package/dist/types/src/composite-key.d.ts +10 -0
  23. package/dist/types/src/composite-key.d.ts.map +1 -0
  24. package/dist/types/src/composite-key.test.d.ts +2 -0
  25. package/dist/types/src/composite-key.test.d.ts.map +1 -0
  26. package/dist/types/src/deep.d.ts.map +1 -1
  27. package/dist/types/src/defer-function.d.ts.map +1 -1
  28. package/dist/types/src/defer.d.ts.map +1 -1
  29. package/dist/types/src/di-container.d.ts.map +1 -1
  30. package/dist/types/src/di-key.d.ts +7 -5
  31. package/dist/types/src/di-key.d.ts.map +1 -1
  32. package/dist/types/src/entry.d.ts.map +1 -1
  33. package/dist/types/src/error-format.d.ts.map +1 -1
  34. package/dist/types/src/filename.d.ts.map +1 -1
  35. package/dist/types/src/for-each-async.d.ts.map +1 -1
  36. package/dist/types/src/human-hash.d.ts.map +1 -1
  37. package/dist/types/src/id.d.ts +30 -0
  38. package/dist/types/src/id.d.ts.map +1 -0
  39. package/dist/types/src/id.test.d.ts +2 -0
  40. package/dist/types/src/id.test.d.ts.map +1 -0
  41. package/dist/types/src/index.d.ts +5 -2
  42. package/dist/types/src/index.d.ts.map +1 -1
  43. package/dist/types/src/instance-id.d.ts.map +1 -1
  44. package/dist/types/src/interval.d.ts.map +1 -1
  45. package/dist/types/src/join-tables.d.ts.map +1 -1
  46. package/dist/types/src/json.d.ts.map +1 -1
  47. package/dist/types/src/map-values.d.ts.map +1 -1
  48. package/dist/types/src/map.d.ts.map +1 -1
  49. package/dist/types/src/object.d.ts.map +1 -1
  50. package/dist/types/src/order-keys.d.ts.map +1 -1
  51. package/dist/types/src/order.d.ts.map +1 -1
  52. package/dist/types/src/pick.d.ts.map +1 -1
  53. package/dist/types/src/platform.d.ts +1 -1
  54. package/dist/types/src/position.d.ts +5 -5
  55. package/dist/types/src/position.d.ts.map +1 -1
  56. package/dist/types/src/random.d.ts.map +1 -1
  57. package/dist/types/src/range.d.ts.map +1 -1
  58. package/dist/types/src/reducers.d.ts.map +1 -1
  59. package/dist/types/src/remove-undefined-keys.d.ts.map +1 -1
  60. package/dist/types/src/retry.d.ts.map +1 -1
  61. package/dist/types/src/safe-await.d.ts.map +1 -1
  62. package/dist/types/src/safe-instanceof.d.ts.map +1 -1
  63. package/dist/types/src/safe-parse.d.ts.map +1 -1
  64. package/dist/types/src/safe-stringify.d.ts.map +1 -1
  65. package/dist/types/src/sliding-window-summary.d.ts.map +1 -1
  66. package/dist/types/src/sort.d.ts.map +1 -1
  67. package/dist/types/src/string.d.ts.map +1 -1
  68. package/dist/types/src/sum.d.ts.map +1 -1
  69. package/dist/types/src/throw-unhandled-error.d.ts.map +1 -1
  70. package/dist/types/src/to-fallback.d.ts +4 -4
  71. package/dist/types/src/to-fallback.d.ts.map +1 -1
  72. package/dist/types/src/tracer.d.ts.map +1 -1
  73. package/dist/types/src/tree.d.ts.map +1 -1
  74. package/dist/types/src/types.d.ts.map +1 -1
  75. package/dist/types/src/uint8array.d.ts +27 -0
  76. package/dist/types/src/uint8array.d.ts.map +1 -1
  77. package/dist/types/src/unit.d.ts.map +1 -1
  78. package/dist/types/src/url.d.ts.map +1 -1
  79. package/dist/types/src/weak.d.ts +15 -0
  80. package/dist/types/src/weak.d.ts.map +1 -1
  81. package/dist/types/tsconfig.tsbuildinfo +1 -1
  82. package/package.json +7 -10
  83. package/src/browser-storage.ts +60 -0
  84. package/src/complex.ts +32 -0
  85. package/src/composite-key.test.ts +31 -0
  86. package/src/composite-key.ts +16 -0
  87. package/src/di-key.ts +10 -8
  88. package/src/error-format.ts +3 -1
  89. package/src/id.test.ts +109 -0
  90. package/src/id.ts +48 -0
  91. package/src/index.ts +5 -2
  92. package/src/map-values.ts +6 -0
  93. package/src/position.test.ts +38 -44
  94. package/src/position.ts +7 -11
  95. package/src/string.ts +6 -2
  96. package/src/uint8array.ts +44 -0
  97. package/src/unit.ts +6 -2
  98. package/src/weak.ts +52 -14
@@ -119,7 +119,6 @@ var createBinder = (obj) => ({
119
119
 
120
120
  // src/bitfield.ts
121
121
  import { invariant } from "@dxos/invariant";
122
- var __dxlog_file = "/__w/dxos/dxos/packages/common/util/src/bitfield.ts";
123
122
  var BitField = class _BitField {
124
123
  static get(data, idx) {
125
124
  const bit = data[idx >> 3] >> 7 - idx % 8 & 1;
@@ -151,15 +150,7 @@ var BitField = class _BitField {
151
150
  return result;
152
151
  }
153
152
  static and(first, second) {
154
- invariant(first.length === second.length, "Bitfields must be of the same length", {
155
- F: __dxlog_file,
156
- L: 52,
157
- S: this,
158
- A: [
159
- "first.length === second.length",
160
- "'Bitfields must be of the same length'"
161
- ]
162
- });
153
+ invariant(first.length === second.length, "Bitfields must be of the same length");
163
154
  const result = new Uint8Array(first.length);
164
155
  for (let i = 0; i < first.length; i++) {
165
156
  result[i] = first[i] & second[i];
@@ -187,6 +178,49 @@ var BitField = class _BitField {
187
178
  }
188
179
  };
189
180
 
181
+ // src/browser-storage.ts
182
+ var clearIndexedDB = async () => {
183
+ const dbs = await indexedDB.databases();
184
+ const results = await Promise.allSettled(dbs.filter((db) => db.name != null).map((db) => new Promise((resolve, reject) => {
185
+ const request = indexedDB.deleteDatabase(db.name);
186
+ request.onsuccess = () => resolve();
187
+ request.onerror = () => reject(request.error);
188
+ request.onblocked = () => reject(new Error(`IndexedDB deletion blocked: ${db.name}`));
189
+ })));
190
+ const failures = results.filter((r) => r.status === "rejected");
191
+ if (failures.length > 0) {
192
+ throw new AggregateError(failures.map((r) => r.reason), "Failed to delete some IndexedDB databases");
193
+ }
194
+ };
195
+ var clearOPFS = async () => {
196
+ const root = await navigator.storage.getDirectory();
197
+ const errors = [];
198
+ for await (const [name] of root.entries()) {
199
+ try {
200
+ await root.removeEntry(name, {
201
+ recursive: true
202
+ });
203
+ } catch (err) {
204
+ errors.push(err);
205
+ }
206
+ }
207
+ if (errors.length > 0) {
208
+ throw new AggregateError(errors, "Failed to remove some OPFS entries");
209
+ }
210
+ };
211
+ var clearServiceWorkers = async () => {
212
+ const regs = await navigator.serviceWorker.getRegistrations();
213
+ for (const reg of regs) {
214
+ await reg.unregister();
215
+ }
216
+ };
217
+ var clearCaches = async () => {
218
+ const keys2 = await caches.keys();
219
+ for (const key of keys2) {
220
+ await caches.delete(key);
221
+ }
222
+ };
223
+
190
224
  // src/callback-collection.ts
191
225
  var CallbackCollection = class {
192
226
  #callbacks = [];
@@ -213,34 +247,17 @@ var CallbackCollection = class {
213
247
 
214
248
  // src/callback.ts
215
249
  import { invariant as invariant2 } from "@dxos/invariant";
216
- var __dxlog_file2 = "/__w/dxos/dxos/packages/common/util/src/callback.ts";
217
250
  var Callback = class {
218
251
  _callback;
219
252
  call(...args) {
220
- invariant2(this._callback, "Callback not set", {
221
- F: __dxlog_file2,
222
- L: 20,
223
- S: this,
224
- A: [
225
- "this._callback",
226
- "'Callback not set'"
227
- ]
228
- });
253
+ invariant2(this._callback, "Callback not set");
229
254
  return this._callback(...args);
230
255
  }
231
256
  callIfSet(...args) {
232
257
  return this._callback?.(...args);
233
258
  }
234
259
  set(callback) {
235
- invariant2(!this._callback, "Callback already set", {
236
- F: __dxlog_file2,
237
- L: 29,
238
- S: this,
239
- A: [
240
- "!this._callback",
241
- "'Callback already set'"
242
- ]
243
- });
260
+ invariant2(!this._callback, "Callback already set");
244
261
  this._callback = callback;
245
262
  }
246
263
  isSet() {
@@ -308,21 +325,12 @@ var chunkArray = (array, size) => {
308
325
 
309
326
  // src/circular-buffer.ts
310
327
  import { invariant as invariant3 } from "@dxos/invariant";
311
- var __dxlog_file3 = "/__w/dxos/dxos/packages/common/util/src/circular-buffer.ts";
312
328
  var CircularBuffer = class {
313
329
  _buffer;
314
330
  _nextIndex = 0;
315
331
  _elementCount = 0;
316
332
  constructor(size) {
317
- invariant3(size >= 1, void 0, {
318
- F: __dxlog_file3,
319
- L: 13,
320
- S: this,
321
- A: [
322
- "size >= 1",
323
- ""
324
- ]
325
- });
333
+ invariant3(size >= 1);
326
334
  this._buffer = new Array(size);
327
335
  }
328
336
  push(element) {
@@ -532,6 +540,36 @@ var ComplexMap = class _ComplexMap {
532
540
  this._values.set(primitive, value);
533
541
  return this;
534
542
  }
543
+ /**
544
+ * Returns the value for the given key if present, otherwise inserts and returns the default value.
545
+ * @param key - The key to look up or insert.
546
+ * @param defaultValue - The value to insert if the key is not present.
547
+ * @returns The existing or newly inserted value.
548
+ */
549
+ getOrInsert(key, defaultValue) {
550
+ const primitive = this._keyProjection(key);
551
+ if (this._values.has(primitive)) {
552
+ return this._values.get(primitive);
553
+ }
554
+ this.set(key, defaultValue);
555
+ return defaultValue;
556
+ }
557
+ /**
558
+ * Returns the value for the given key if present, otherwise computes, inserts, and returns a new value.
559
+ * The callback is only invoked when the key is missing.
560
+ * @param key - The key to look up or insert.
561
+ * @param callbackfn - Function to compute the value if the key is not present.
562
+ * @returns The existing or newly computed value.
563
+ */
564
+ getOrInsertComputed(key, callbackfn) {
565
+ const primitive = this._keyProjection(key);
566
+ if (this._values.has(primitive)) {
567
+ return this._values.get(primitive);
568
+ }
569
+ const value = callbackfn(key);
570
+ this.set(key, value);
571
+ return value;
572
+ }
535
573
  get size() {
536
574
  return this._keys.size;
537
575
  }
@@ -571,19 +609,15 @@ var makeMap = (keyProjection) => class BoundComplexMap extends ComplexMap {
571
609
  }
572
610
  };
573
611
 
612
+ // src/composite-key.ts
613
+ var SEPARATOR = ":";
614
+ var compositeKey = (...parts) => parts.join(SEPARATOR);
615
+ var splitCompositeKey = (key) => key.split(SEPARATOR);
616
+
574
617
  // src/deep.ts
575
618
  import { invariant as invariant4 } from "@dxos/invariant";
576
- var __dxlog_file4 = "/__w/dxos/dxos/packages/common/util/src/deep.ts";
577
619
  var setDeep = (obj, path, value) => {
578
- invariant4(path.length > 0, void 0, {
579
- F: __dxlog_file4,
580
- L: 12,
581
- S: void 0,
582
- A: [
583
- "path.length > 0",
584
- ""
585
- ]
586
- });
620
+ invariant4(path.length > 0);
587
621
  let parent = obj;
588
622
  for (const key of path.slice(0, -1)) {
589
623
  if (parent[key] === void 0) {
@@ -668,6 +702,23 @@ var MapEntry = class {
668
702
  }
669
703
  };
670
704
 
705
+ // src/error-format.ts
706
+ var formatErrorWithCauses = (error) => {
707
+ const lines = [];
708
+ let current = error;
709
+ let level = 0;
710
+ while (current) {
711
+ const prefix = level === 0 ? "" : `Caused by: `;
712
+ lines.push(prefix + (current.stack ?? String(current)));
713
+ if (!(current.cause instanceof Error)) {
714
+ break;
715
+ }
716
+ current = current.cause;
717
+ level += 1;
718
+ }
719
+ return lines.join("\n\n");
720
+ };
721
+
671
722
  // src/filename.ts
672
723
  var createFilename = ({ parts = [], ext, date = /* @__PURE__ */ new Date() }) => [
673
724
  date.toISOString().replace(/[:.]/g, "-"),
@@ -1009,6 +1060,19 @@ var humanize = (value) => {
1009
1060
  return hasher.humanize(value);
1010
1061
  };
1011
1062
 
1063
+ // src/id.ts
1064
+ var PART = /^[a-zA-Z][a-zA-Z0-9]{0,62}$/;
1065
+ var ID = /^[a-zA-Z]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(\.[a-zA-Z]([a-zA-Z0-9]{0,62})?)$/;
1066
+ function id(strings, ...values) {
1067
+ const raw = strings.reduce((out, str, i) => out + str + (i < values.length ? String(values[i]) : ""), "");
1068
+ if (!ID.test(raw)) {
1069
+ throw new Error(`Invalid id (expected AT Protocol NSID): ${JSON.stringify(raw)}`);
1070
+ }
1071
+ return raw;
1072
+ }
1073
+ var isWellFormedId = (value) => ID.test(value);
1074
+ var isWellFormedIdPart = (value) => PART.test(value);
1075
+
1012
1076
  // src/map.ts
1013
1077
  var defaultMap = (map, key, def) => {
1014
1078
  let value = map.get(key);
@@ -1028,12 +1092,12 @@ var getPrototypeSpecificInstanceId = (instance) => {
1028
1092
  nextId: 0,
1029
1093
  instanceIds: /* @__PURE__ */ new WeakMap()
1030
1094
  }));
1031
- let id = instanceCtx.instanceIds.get(instance);
1032
- if (id === void 0) {
1033
- id = instanceCtx.nextId++;
1034
- instanceCtx.instanceIds.set(instance, id);
1095
+ let id2 = instanceCtx.instanceIds.get(instance);
1096
+ if (id2 === void 0) {
1097
+ id2 = instanceCtx.nextId++;
1098
+ instanceCtx.instanceIds.set(instance, id2);
1035
1099
  }
1036
- return id;
1100
+ return id2;
1037
1101
  };
1038
1102
  var getDebugName = (instance) => {
1039
1103
  if (instance == null) {
@@ -1100,6 +1164,26 @@ var bufferToArray = (buffer) => {
1100
1164
  };
1101
1165
  var stringToArray = (string) => bufferToArray(Buffer.from(string, "hex"));
1102
1166
  var arrayToString = (array) => arrayToBuffer(array).toString("hex");
1167
+ var toUnpaddedBase64 = (bytes) => arrayToBuffer(bytes).toString("base64").replace(/=+$/, "");
1168
+ var encodeUint8ArrayToJson = (bytes) => ({
1169
+ "/": {
1170
+ bytes: toUnpaddedBase64(bytes)
1171
+ }
1172
+ });
1173
+ var isEncodedUint8Array = (value) => {
1174
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
1175
+ return false;
1176
+ }
1177
+ if (Object.keys(value).length !== 1) {
1178
+ return false;
1179
+ }
1180
+ const inner = value["/"];
1181
+ if (typeof inner !== "object" || inner === null || Array.isArray(inner)) {
1182
+ return false;
1183
+ }
1184
+ return Object.keys(inner).length === 1 && typeof inner.bytes === "string";
1185
+ };
1186
+ var decodeUint8ArrayFromJson = (encoded) => bufferToArray(Buffer.from(encoded["/"].bytes, "base64"));
1103
1187
 
1104
1188
  // src/json.ts
1105
1189
  var MAX_DEPTH = 5;
@@ -1229,6 +1313,8 @@ var DeepMapper = class {
1229
1313
  res[i] = this._map(value[i], i);
1230
1314
  }
1231
1315
  return res;
1316
+ } else if (ArrayBuffer.isView(value)) {
1317
+ return value;
1232
1318
  } else if (value !== null && typeof value === "object") {
1233
1319
  const res = {};
1234
1320
  this._cyclic.set(value, res);
@@ -1270,6 +1356,8 @@ var DeepMapperAsync = class {
1270
1356
  res[i] = await this._map(value[i], i);
1271
1357
  }
1272
1358
  return res;
1359
+ } else if (ArrayBuffer.isView(value)) {
1360
+ return value;
1273
1361
  } else if (value !== null && typeof value === "object") {
1274
1362
  const res = {};
1275
1363
  this._cyclic.set(value, res);
@@ -1314,27 +1402,27 @@ var orderKeys = (obj, order) => {
1314
1402
 
1315
1403
  // src/order.ts
1316
1404
  var inferObjectOrder = (objectMap, order = []) => {
1317
- const orderedObjects = order.reduce((acc, id) => {
1318
- if (id in objectMap) {
1319
- acc.objects.push(objectMap[id]);
1320
- acc.ids.add(id);
1405
+ const orderedObjects = order.reduce((acc, id2) => {
1406
+ if (id2 in objectMap) {
1407
+ acc.objects.push(objectMap[id2]);
1408
+ acc.ids.add(id2);
1321
1409
  }
1322
1410
  return acc;
1323
1411
  }, {
1324
1412
  objects: [],
1325
1413
  ids: /* @__PURE__ */ new Set()
1326
1414
  });
1327
- const { objects } = Object.keys(objectMap).reduce((acc, id) => {
1328
- if (!acc.ids.has(id)) {
1329
- acc.objects.push(objectMap[id]);
1415
+ const { objects } = Object.keys(objectMap).reduce((acc, id2) => {
1416
+ if (!acc.ids.has(id2)) {
1417
+ acc.objects.push(objectMap[id2]);
1330
1418
  }
1331
1419
  return acc;
1332
1420
  }, orderedObjects);
1333
1421
  return objects;
1334
1422
  };
1335
1423
  var inferRecordOrder = (objectMap, order = []) => {
1336
- return Object.assign(order.filter((id) => id in objectMap).reduce((acc, id) => {
1337
- acc[id] = null;
1424
+ return Object.assign(order.filter((id2) => id2 in objectMap).reduce((acc, id2) => {
1425
+ acc[id2] = null;
1338
1426
  return acc;
1339
1427
  }, {}), objectMap);
1340
1428
  };
@@ -1420,12 +1508,12 @@ var getHostPlatform = () => {
1420
1508
  };
1421
1509
 
1422
1510
  // src/position.ts
1423
- var byPosition = ({ position: a = "static" }, { position: b = "static" }) => {
1511
+ var byPosition = ({ position: a }, { position: b }) => {
1424
1512
  if (a === b) {
1425
1513
  return 0;
1426
- } else if (a === "hoist" || b === "fallback") {
1514
+ } else if (a === "first" || b === "last") {
1427
1515
  return -1;
1428
- } else if (b === "hoist" || a === "fallback") {
1516
+ } else if (b === "first" || a === "last") {
1429
1517
  return 1;
1430
1518
  } else {
1431
1519
  return 0;
@@ -1578,6 +1666,43 @@ var removeProperties = (root, condition) => {
1578
1666
  return result;
1579
1667
  };
1580
1668
 
1669
+ // src/retry.ts
1670
+ var DEFAULT_RETRY_OPTIONS = {
1671
+ count: 3,
1672
+ delayMs: 100,
1673
+ exponent: 2,
1674
+ retryOnError: async () => true,
1675
+ retryOnValue: async () => false
1676
+ };
1677
+ var retry = async (options, cb) => {
1678
+ const fullOptions = {
1679
+ ...DEFAULT_RETRY_OPTIONS,
1680
+ ...options
1681
+ };
1682
+ let numRetries = 0, currentDelay = fullOptions.delayMs;
1683
+ while (true) {
1684
+ let result;
1685
+ try {
1686
+ result = await cb();
1687
+ } catch (err) {
1688
+ if (numRetries > fullOptions.count || !await fullOptions.retryOnError(err)) {
1689
+ throw err;
1690
+ }
1691
+ await new Promise((resolve) => setTimeout(resolve, currentDelay));
1692
+ currentDelay *= fullOptions.exponent;
1693
+ numRetries++;
1694
+ continue;
1695
+ }
1696
+ if (!await fullOptions.retryOnValue(result)) {
1697
+ return result;
1698
+ }
1699
+ await new Promise((resolve) => setTimeout(resolve, currentDelay));
1700
+ currentDelay *= fullOptions.exponent;
1701
+ numRetries++;
1702
+ continue;
1703
+ }
1704
+ };
1705
+
1581
1706
  // src/safe-await.ts
1582
1707
  var safeAwaitAll = async (source, taskFactory, onError) => {
1583
1708
  const failedItems = [];
@@ -1734,7 +1859,6 @@ var defaultFilter = createReplacer();
1734
1859
 
1735
1860
  // src/sliding-window-summary.ts
1736
1861
  import { invariant as invariant5 } from "@dxos/invariant";
1737
- var __dxlog_file5 = "/__w/dxos/dxos/packages/common/util/src/sliding-window-summary.ts";
1738
1862
  var SlidingWindowSummary = class {
1739
1863
  _buffer;
1740
1864
  _sum = 0;
@@ -1742,15 +1866,7 @@ var SlidingWindowSummary = class {
1742
1866
  constructor(options) {
1743
1867
  this._buffer = new CircularBuffer(options.dataPoints);
1744
1868
  if (options.precision != null) {
1745
- invariant5(options.precision >= 0, void 0, {
1746
- F: __dxlog_file5,
1747
- L: 26,
1748
- S: this,
1749
- A: [
1750
- "options.precision >= 0",
1751
- ""
1752
- ]
1753
- });
1869
+ invariant5(options.precision >= 0);
1754
1870
  this._precision = Math.pow(10, options.precision);
1755
1871
  }
1756
1872
  }
@@ -1831,8 +1947,12 @@ function trim(strings, ...values) {
1831
1947
  return out;
1832
1948
  }, "");
1833
1949
  const lines = raw.split("\n");
1834
- while (lines.length && !lines[0].trim()) lines.shift();
1835
- while (lines.length && !lines[lines.length - 1].trim()) lines.pop();
1950
+ while (lines.length && !lines[0].trim()) {
1951
+ lines.shift();
1952
+ }
1953
+ while (lines.length && !lines[lines.length - 1].trim()) {
1954
+ lines.pop();
1955
+ }
1836
1956
  const minIndent = Math.min(...lines.filter((l) => l.trim()).map((l) => l.match(/^[ \t]*/)?.[0].length ?? 0));
1837
1957
  return lines.map((l) => l.slice(minIndent)).join("\n");
1838
1958
  }
@@ -2035,8 +2155,8 @@ var Tracer = class {
2035
2155
  keys() {
2036
2156
  return Array.from(this._events.keys());
2037
2157
  }
2038
- get(id, filter) {
2039
- const events = this._events.get(id);
2158
+ get(id2, filter) {
2159
+ const events = this._events.get(id2);
2040
2160
  if (filter) {
2041
2161
  return events?.filter((event) => Object.entries(filter).every(([key, value]) => event?.value[key] === value));
2042
2162
  }
@@ -2053,11 +2173,11 @@ var Tracer = class {
2053
2173
  this._recording = false;
2054
2174
  return this;
2055
2175
  }
2056
- emit(id, value) {
2057
- this._post(this._createEvent(id, value));
2176
+ emit(id2, value) {
2177
+ this._post(this._createEvent(id2, value));
2058
2178
  }
2059
- mark(id, value) {
2060
- const event = this._createEvent(id, value);
2179
+ mark(id2, value) {
2180
+ const event = this._createEvent(id2, value);
2061
2181
  const start = performance.now();
2062
2182
  return {
2063
2183
  start,
@@ -2067,9 +2187,9 @@ var Tracer = class {
2067
2187
  }
2068
2188
  };
2069
2189
  }
2070
- _createEvent(id, value) {
2190
+ _createEvent(id2, value) {
2071
2191
  const event = {
2072
- id,
2192
+ id: id2,
2073
2193
  timestamp: Date.now()
2074
2194
  };
2075
2195
  if (value !== void 0) {
@@ -2167,11 +2287,15 @@ function arraySwap(array, from, to) {
2167
2287
  var createFormat = (unit) => {
2168
2288
  return (n, precision = unit.precision ?? 0) => {
2169
2289
  const value = n / unit.quotient;
2290
+ const formattedValue = value.toLocaleString("en-US", {
2291
+ minimumFractionDigits: precision,
2292
+ maximumFractionDigits: precision
2293
+ });
2170
2294
  return {
2171
2295
  unit,
2172
2296
  value,
2173
- formattedValue: value.toFixed(precision),
2174
- toString: () => `${value.toFixed(precision)}${unit.symbol}`
2297
+ formattedValue,
2298
+ toString: () => `${formattedValue}${unit.symbol}`
2175
2299
  };
2176
2300
  };
2177
2301
  };
@@ -2276,15 +2400,19 @@ var createUrl = (url, search) => {
2276
2400
  // src/weak.ts
2277
2401
  var WeakDictionary = class {
2278
2402
  _internal = /* @__PURE__ */ new Map();
2279
- _finalization = new FinalizationRegistry((cleanUpCallback) => {
2280
- cleanUpCallback();
2403
+ _finalization = new FinalizationRegistry(({ key, ref }) => {
2404
+ if (this._internal.get(key) === ref) {
2405
+ this._internal.delete(key);
2406
+ }
2281
2407
  });
2282
2408
  constructor(entries2) {
2283
- this._internal = new Map(entries2?.map(([key, value]) => [
2284
- key,
2285
- new WeakRef(value)
2286
- ]));
2287
- entries2?.forEach(([key, value]) => this._register(key, value));
2409
+ if (entries2) {
2410
+ for (const [key, value] of entries2) {
2411
+ const ref = new WeakRef(value);
2412
+ this._internal.set(key, ref);
2413
+ this._register(key, value, ref);
2414
+ }
2415
+ }
2288
2416
  }
2289
2417
  *entries() {
2290
2418
  for (const [key, value] of this._internal) {
@@ -2324,10 +2452,45 @@ var WeakDictionary = class {
2324
2452
  return this._internal.get(key)?.deref();
2325
2453
  }
2326
2454
  set(key, value) {
2327
- this._internal.set(key, new WeakRef(value));
2328
- this._register(key, value);
2455
+ const previous = this._internal.get(key)?.deref();
2456
+ if (previous) {
2457
+ this._unregister(previous);
2458
+ }
2459
+ const ref = new WeakRef(value);
2460
+ this._internal.set(key, ref);
2461
+ this._register(key, value, ref);
2329
2462
  return this;
2330
2463
  }
2464
+ /**
2465
+ * Returns the value for the given key if present, otherwise inserts and returns the default value.
2466
+ * @param key - The key to look up or insert.
2467
+ * @param defaultValue - The value to insert if the key is not present.
2468
+ * @returns The existing or newly inserted value.
2469
+ */
2470
+ getOrInsert(key, defaultValue) {
2471
+ const existing = this.get(key);
2472
+ if (existing !== void 0) {
2473
+ return existing;
2474
+ }
2475
+ this.set(key, defaultValue);
2476
+ return defaultValue;
2477
+ }
2478
+ /**
2479
+ * Returns the value for the given key if present, otherwise computes, inserts, and returns a new value.
2480
+ * The callback is only invoked when the key is missing.
2481
+ * @param key - The key to look up or insert.
2482
+ * @param callbackfn - Function to compute the value if the key is not present.
2483
+ * @returns The existing or newly computed value.
2484
+ */
2485
+ getOrInsertComputed(key, callbackfn) {
2486
+ const existing = this.get(key);
2487
+ if (existing !== void 0) {
2488
+ return existing;
2489
+ }
2490
+ const value = callbackfn(key);
2491
+ this.set(key, value);
2492
+ return value;
2493
+ }
2331
2494
  has(key) {
2332
2495
  return this._internal.has(key) && this._internal.get(key).deref() !== void 0;
2333
2496
  }
@@ -2358,67 +2521,16 @@ var WeakDictionary = class {
2358
2521
  }
2359
2522
  });
2360
2523
  }
2361
- _register(key, value) {
2362
- this._finalization.register(value, () => {
2363
- this._internal.delete(key);
2524
+ _register(key, value, ref) {
2525
+ this._finalization.register(value, {
2526
+ key,
2527
+ ref
2364
2528
  }, value);
2365
2529
  }
2366
2530
  _unregister(value) {
2367
2531
  this._finalization.unregister(value);
2368
2532
  }
2369
2533
  };
2370
-
2371
- // src/error-format.ts
2372
- var formatErrorWithCauses = (error) => {
2373
- const lines = [];
2374
- let current = error;
2375
- let level = 0;
2376
- while (current) {
2377
- const prefix = level === 0 ? "" : `Caused by: `;
2378
- lines.push(prefix + (current.stack ?? String(current)));
2379
- if (!(current.cause instanceof Error)) break;
2380
- current = current.cause;
2381
- level += 1;
2382
- }
2383
- return lines.join("\n\n");
2384
- };
2385
-
2386
- // src/retry.ts
2387
- var DEFAULT_RETRY_OPTIONS = {
2388
- count: 3,
2389
- delayMs: 100,
2390
- exponent: 2,
2391
- retryOnError: async () => true,
2392
- retryOnValue: async () => false
2393
- };
2394
- var retry = async (options, cb) => {
2395
- const fullOptions = {
2396
- ...DEFAULT_RETRY_OPTIONS,
2397
- ...options
2398
- };
2399
- let numRetries = 0, currentDelay = fullOptions.delayMs;
2400
- while (true) {
2401
- let result;
2402
- try {
2403
- result = await cb();
2404
- } catch (err) {
2405
- if (numRetries > fullOptions.count || !await fullOptions.retryOnError(err)) {
2406
- throw err;
2407
- }
2408
- await new Promise((resolve) => setTimeout(resolve, currentDelay));
2409
- currentDelay *= fullOptions.exponent;
2410
- numRetries++;
2411
- continue;
2412
- }
2413
- if (!await fullOptions.retryOnValue(result)) {
2414
- return result;
2415
- }
2416
- await new Promise((resolve) => setTimeout(resolve, currentDelay));
2417
- currentDelay *= fullOptions.exponent;
2418
- numRetries++;
2419
- continue;
2420
- }
2421
- };
2422
2534
  export {
2423
2535
  BitField,
2424
2536
  Callback,
@@ -2446,12 +2558,17 @@ export {
2446
2558
  capitalize,
2447
2559
  chunkArray,
2448
2560
  clamp,
2561
+ clearCaches,
2562
+ clearIndexedDB,
2563
+ clearOPFS,
2564
+ clearServiceWorkers,
2449
2565
  clearUndefined,
2450
2566
  coerceArray,
2451
2567
  compareMulti,
2452
2568
  compareObject,
2453
2569
  compareScalar,
2454
2570
  compareString,
2571
+ compositeKey,
2455
2572
  createBinder,
2456
2573
  createBucketReducer,
2457
2574
  createFilename,
@@ -2460,6 +2577,7 @@ export {
2460
2577
  createSetDispatch,
2461
2578
  createUrl,
2462
2579
  decamelize,
2580
+ decodeUint8ArrayFromJson,
2463
2581
  deepMapValues,
2464
2582
  deepMapValuesAsync,
2465
2583
  defaultFilter,
@@ -2470,6 +2588,7 @@ export {
2470
2588
  diff,
2471
2589
  distinctBy,
2472
2590
  doAsync,
2591
+ encodeUint8ArrayToJson,
2473
2592
  entries,
2474
2593
  entry,
2475
2594
  exponentialBackoffInterval,
@@ -2487,6 +2606,7 @@ export {
2487
2606
  hexToHue,
2488
2607
  humanize,
2489
2608
  hyphenize,
2609
+ id,
2490
2610
  idEmoji,
2491
2611
  idHue,
2492
2612
  inferObjectOrder,
@@ -2495,12 +2615,15 @@ export {
2495
2615
  intersection,
2496
2616
  iosCheck,
2497
2617
  isBun,
2618
+ isEncodedUint8Array,
2498
2619
  isMobile,
2499
2620
  isMobileOrTablet,
2500
2621
  isNode,
2501
2622
  isNonNullable,
2502
2623
  isTauri,
2503
2624
  isTruthy,
2625
+ isWellFormedId,
2626
+ isWellFormedIdPart,
2504
2627
  joinTables,
2505
2628
  jsonKeyReplacer,
2506
2629
  jsonReplacer,
@@ -2541,6 +2664,7 @@ export {
2541
2664
  safeUrl,
2542
2665
  setDeep,
2543
2666
  sortKeys,
2667
+ splitCompositeKey,
2544
2668
  stringToArray,
2545
2669
  stringifyTree,
2546
2670
  stripUndefined,