@dxos/util 0.8.3 → 0.8.4-main.05e74ebcff

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 (158) hide show
  1. package/LICENSE +102 -5
  2. package/dist/lib/browser/index.mjs +672 -280
  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 +672 -280
  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 +3 -2
  10. package/dist/types/src/array.d.ts.map +1 -1
  11. package/dist/types/src/assume.d.ts.map +1 -1
  12. package/dist/types/src/binder.d.ts.map +1 -1
  13. package/dist/types/src/bitfield.d.ts.map +1 -1
  14. package/dist/types/src/browser-storage.d.ts +9 -0
  15. package/dist/types/src/browser-storage.d.ts.map +1 -0
  16. package/dist/types/src/callback-collection.d.ts.map +1 -1
  17. package/dist/types/src/callback.d.ts.map +1 -1
  18. package/dist/types/src/case.d.ts.map +1 -1
  19. package/dist/types/src/chunk-array.d.ts.map +1 -1
  20. package/dist/types/src/circular-buffer.d.ts +1 -0
  21. package/dist/types/src/circular-buffer.d.ts.map +1 -1
  22. package/dist/types/src/clear-undefined.d.ts.map +1 -1
  23. package/dist/types/src/complex.d.ts +15 -0
  24. package/dist/types/src/complex.d.ts.map +1 -1
  25. package/dist/types/src/composite-key.d.ts +10 -0
  26. package/dist/types/src/composite-key.d.ts.map +1 -0
  27. package/dist/types/src/composite-key.test.d.ts +2 -0
  28. package/dist/types/src/composite-key.test.d.ts.map +1 -0
  29. package/dist/types/src/deep.d.ts +0 -3
  30. package/dist/types/src/deep.d.ts.map +1 -1
  31. package/dist/types/src/defer-function.d.ts.map +1 -1
  32. package/dist/types/src/defer.d.ts +1 -1
  33. package/dist/types/src/defer.d.ts.map +1 -1
  34. package/dist/types/src/di-container.d.ts.map +1 -1
  35. package/dist/types/src/di-key.d.ts +7 -5
  36. package/dist/types/src/di-key.d.ts.map +1 -1
  37. package/dist/types/src/entry.d.ts.map +1 -1
  38. package/dist/types/src/error-format.d.ts +5 -0
  39. package/dist/types/src/error-format.d.ts.map +1 -0
  40. package/dist/types/src/filename.d.ts +9 -0
  41. package/dist/types/src/filename.d.ts.map +1 -0
  42. package/dist/types/src/for-each-async.d.ts.map +1 -1
  43. package/dist/types/src/human-hash.d.ts.map +1 -1
  44. package/dist/types/src/id.d.ts +30 -0
  45. package/dist/types/src/id.d.ts.map +1 -0
  46. package/dist/types/src/id.test.d.ts +2 -0
  47. package/dist/types/src/id.test.d.ts.map +1 -0
  48. package/dist/types/src/index.d.ts +10 -3
  49. package/dist/types/src/index.d.ts.map +1 -1
  50. package/dist/types/src/instance-id.d.ts.map +1 -1
  51. package/dist/types/src/interval.d.ts.map +1 -1
  52. package/dist/types/src/join-tables.d.ts.map +1 -1
  53. package/dist/types/src/json.d.ts +1 -1
  54. package/dist/types/src/json.d.ts.map +1 -1
  55. package/dist/types/src/map-values.d.ts.map +1 -1
  56. package/dist/types/src/map.d.ts.map +1 -1
  57. package/dist/types/src/object.d.ts +3 -0
  58. package/dist/types/src/object.d.ts.map +1 -1
  59. package/dist/types/src/order-keys.d.ts.map +1 -1
  60. package/dist/types/src/order.d.ts.map +1 -1
  61. package/dist/types/src/pick.d.ts.map +1 -1
  62. package/dist/types/src/platform.d.ts +5 -2
  63. package/dist/types/src/platform.d.ts.map +1 -1
  64. package/dist/types/src/position.d.ts +5 -5
  65. package/dist/types/src/position.d.ts.map +1 -1
  66. package/dist/types/src/random.d.ts.map +1 -1
  67. package/dist/types/src/range.d.ts.map +1 -1
  68. package/dist/types/src/reducers.d.ts.map +1 -1
  69. package/dist/types/src/remove-undefined-keys.d.ts.map +1 -1
  70. package/dist/types/src/retry.d.ts +32 -0
  71. package/dist/types/src/retry.d.ts.map +1 -0
  72. package/dist/types/src/safe-await.d.ts.map +1 -1
  73. package/dist/types/src/safe-instanceof.d.ts.map +1 -1
  74. package/dist/types/src/safe-parse.d.ts +7 -4
  75. package/dist/types/src/safe-parse.d.ts.map +1 -1
  76. package/dist/types/src/safe-stringify.d.ts +22 -0
  77. package/dist/types/src/safe-stringify.d.ts.map +1 -0
  78. package/dist/types/src/safe-stringify.test.d.ts +2 -0
  79. package/dist/types/src/safe-stringify.test.d.ts.map +1 -0
  80. package/dist/types/src/sliding-window-summary.d.ts.map +1 -1
  81. package/dist/types/src/sort.d.ts.map +1 -1
  82. package/dist/types/src/string.d.ts +8 -0
  83. package/dist/types/src/string.d.ts.map +1 -1
  84. package/dist/types/src/string.test.d.ts +2 -0
  85. package/dist/types/src/string.test.d.ts.map +1 -0
  86. package/dist/types/src/sum.d.ts.map +1 -1
  87. package/dist/types/src/throw-unhandled-error.d.ts.map +1 -1
  88. package/dist/types/src/to-fallback.d.ts +18 -4
  89. package/dist/types/src/to-fallback.d.ts.map +1 -1
  90. package/dist/types/src/tracer.d.ts.map +1 -1
  91. package/dist/types/src/tree.d.ts.map +1 -1
  92. package/dist/types/src/types.d.ts +24 -6
  93. package/dist/types/src/types.d.ts.map +1 -1
  94. package/dist/types/src/uint8array.d.ts.map +1 -1
  95. package/dist/types/src/unit.d.ts +14 -0
  96. package/dist/types/src/unit.d.ts.map +1 -0
  97. package/dist/types/src/unit.test.d.ts +2 -0
  98. package/dist/types/src/unit.test.d.ts.map +1 -0
  99. package/dist/types/src/url.d.ts +5 -0
  100. package/dist/types/src/url.d.ts.map +1 -0
  101. package/dist/types/src/url.test.d.ts +2 -0
  102. package/dist/types/src/url.test.d.ts.map +1 -0
  103. package/dist/types/src/weak.d.ts +15 -0
  104. package/dist/types/src/weak.d.ts.map +1 -1
  105. package/dist/types/tsconfig.tsbuildinfo +1 -1
  106. package/package.json +15 -17
  107. package/src/array.test.ts +1 -1
  108. package/src/array.ts +9 -4
  109. package/src/assume.ts +0 -1
  110. package/src/binder.ts +2 -2
  111. package/src/browser-storage.ts +60 -0
  112. package/src/circular-buffer.test.ts +27 -1
  113. package/src/circular-buffer.ts +5 -0
  114. package/src/complex.test.ts +1 -1
  115. package/src/complex.ts +32 -0
  116. package/src/composite-key.test.ts +31 -0
  117. package/src/composite-key.ts +16 -0
  118. package/src/deep.ts +2 -6
  119. package/src/defer.ts +1 -1
  120. package/src/di-key.ts +10 -8
  121. package/src/error-format.ts +24 -0
  122. package/src/filename.ts +16 -0
  123. package/src/human-hash.test.ts +1 -1
  124. package/src/id.test.ts +109 -0
  125. package/src/id.ts +48 -0
  126. package/src/index.ts +10 -3
  127. package/src/json.ts +2 -7
  128. package/src/object.ts +3 -0
  129. package/src/platform.ts +35 -3
  130. package/src/position.test.ts +39 -45
  131. package/src/position.ts +7 -11
  132. package/src/retry.ts +74 -0
  133. package/src/safe-parse.ts +29 -15
  134. package/src/safe-stringify.test.ts +96 -0
  135. package/src/safe-stringify.ts +153 -0
  136. package/src/sort.test.ts +1 -1
  137. package/src/string.test.ts +19 -0
  138. package/src/string.ts +40 -0
  139. package/src/to-fallback.ts +44 -160
  140. package/src/tree.test.ts +1 -1
  141. package/src/types.test.ts +11 -1
  142. package/src/types.ts +40 -12
  143. package/src/uint8array.test.ts +1 -1
  144. package/src/unit.test.ts +25 -0
  145. package/src/unit.ts +87 -0
  146. package/src/url.test.ts +22 -0
  147. package/src/url.ts +15 -0
  148. package/src/weak.test.ts +1 -1
  149. package/src/weak.ts +52 -14
  150. package/dist/lib/node/index.cjs +0 -2309
  151. package/dist/lib/node/index.cjs.map +0 -7
  152. package/dist/lib/node/meta.json +0 -1
  153. package/dist/types/src/explicit-resource-management-polyfill.d.ts +0 -1
  154. package/dist/types/src/explicit-resource-management-polyfill.d.ts.map +0 -1
  155. package/dist/types/src/first-two-chars.d.ts +0 -9
  156. package/dist/types/src/first-two-chars.d.ts.map +0 -1
  157. package/src/explicit-resource-management-polyfill.ts +0 -13
  158. package/src/first-two-chars.ts +0 -44
@@ -1,6 +1,6 @@
1
1
  import "@dxos/node-std/globals";
2
2
 
3
- // packages/common/util/src/array-to-hex.ts
3
+ // src/array-to-hex.ts
4
4
  var byteToHex = [];
5
5
  for (let n = 0; n <= 255; ++n) {
6
6
  const hexOctet = n.toString(16).padStart(2, "0");
@@ -15,7 +15,7 @@ var arrayToHex = (buf) => {
15
15
  return hexOctets.join("");
16
16
  };
17
17
 
18
- // packages/common/util/src/array.ts
18
+ // src/array.ts
19
19
  var diff = (previous, next, comparator) => {
20
20
  const remaining = [
21
21
  ...previous
@@ -97,17 +97,28 @@ var intersectBy = (arrays, selector) => {
97
97
  return lookups.every((lookup) => lookup.has(key));
98
98
  });
99
99
  };
100
+ var coerceArray = (arr) => {
101
+ if (arr === void 0) {
102
+ return [];
103
+ }
104
+ return Array.isArray(arr) ? arr : [
105
+ arr
106
+ ];
107
+ };
108
+
109
+ // src/assume.ts
110
+ function assumeType(value) {
111
+ }
100
112
 
101
- // packages/common/util/src/binder.ts
102
- import util from "@dxos/node-std/util";
113
+ // src/binder.ts
114
+ import { promisify } from "@dxos/node-std/util";
103
115
  var createBinder = (obj) => ({
104
116
  fn: (fn) => fn.bind(obj),
105
- async: (fn) => util.promisify(fn.bind(obj))
117
+ async: (fn) => promisify(fn.bind(obj))
106
118
  });
107
119
 
108
- // packages/common/util/src/bitfield.ts
120
+ // src/bitfield.ts
109
121
  import { invariant } from "@dxos/invariant";
110
- var __dxlog_file = "/home/runner/work/dxos/dxos/packages/common/util/src/bitfield.ts";
111
122
  var BitField = class _BitField {
112
123
  static get(data, idx) {
113
124
  const bit = data[idx >> 3] >> 7 - idx % 8 & 1;
@@ -139,15 +150,7 @@ var BitField = class _BitField {
139
150
  return result;
140
151
  }
141
152
  static and(first, second) {
142
- invariant(first.length === second.length, "Bitfields must be of the same length", {
143
- F: __dxlog_file,
144
- L: 52,
145
- S: this,
146
- A: [
147
- "first.length === second.length",
148
- "'Bitfields must be of the same length'"
149
- ]
150
- });
153
+ invariant(first.length === second.length, "Bitfields must be of the same length");
151
154
  const result = new Uint8Array(first.length);
152
155
  for (let i = 0; i < first.length; i++) {
153
156
  result[i] = first[i] & second[i];
@@ -175,7 +178,50 @@ var BitField = class _BitField {
175
178
  }
176
179
  };
177
180
 
178
- // packages/common/util/src/callback-collection.ts
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
+
224
+ // src/callback-collection.ts
179
225
  var CallbackCollection = class {
180
226
  #callbacks = [];
181
227
  append(callback) {
@@ -199,35 +245,19 @@ var CallbackCollection = class {
199
245
  }
200
246
  };
201
247
 
202
- // packages/common/util/src/callback.ts
248
+ // src/callback.ts
203
249
  import { invariant as invariant2 } from "@dxos/invariant";
204
- var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/common/util/src/callback.ts";
205
250
  var Callback = class {
251
+ _callback;
206
252
  call(...args) {
207
- invariant2(this._callback, "Callback not set", {
208
- F: __dxlog_file2,
209
- L: 20,
210
- S: this,
211
- A: [
212
- "this._callback",
213
- "'Callback not set'"
214
- ]
215
- });
253
+ invariant2(this._callback, "Callback not set");
216
254
  return this._callback(...args);
217
255
  }
218
256
  callIfSet(...args) {
219
257
  return this._callback?.(...args);
220
258
  }
221
259
  set(callback) {
222
- invariant2(!this._callback, "Callback already set", {
223
- F: __dxlog_file2,
224
- L: 29,
225
- S: this,
226
- A: [
227
- "!this._callback",
228
- "'Callback already set'"
229
- ]
230
- });
260
+ invariant2(!this._callback, "Callback already set");
231
261
  this._callback = callback;
232
262
  }
233
263
  isSet() {
@@ -251,7 +281,7 @@ var createSetDispatch = ({ handlers }) => {
251
281
  });
252
282
  };
253
283
 
254
- // packages/common/util/src/case.ts
284
+ // src/case.ts
255
285
  var LOW_DASH = "_".codePointAt(0);
256
286
  var HI_DASH = "-".codePointAt(0);
257
287
  var SMALL_A = "a".codePointAt(0);
@@ -284,7 +314,7 @@ var changeCase = (str, delim) => {
284
314
  var decamelize = (str) => changeCase(str, LOW_DASH);
285
315
  var hyphenize = (str) => changeCase(str, HI_DASH);
286
316
 
287
- // packages/common/util/src/chunk-array.ts
317
+ // src/chunk-array.ts
288
318
  var chunkArray = (array, size) => {
289
319
  const result = [];
290
320
  for (let i = 0; i < array.length; i += size) {
@@ -293,22 +323,14 @@ var chunkArray = (array, size) => {
293
323
  return result;
294
324
  };
295
325
 
296
- // packages/common/util/src/circular-buffer.ts
326
+ // src/circular-buffer.ts
297
327
  import { invariant as invariant3 } from "@dxos/invariant";
298
- var __dxlog_file3 = "/home/runner/work/dxos/dxos/packages/common/util/src/circular-buffer.ts";
299
328
  var CircularBuffer = class {
329
+ _buffer;
330
+ _nextIndex = 0;
331
+ _elementCount = 0;
300
332
  constructor(size) {
301
- this._nextIndex = 0;
302
- this._elementCount = 0;
303
- invariant3(size >= 1, void 0, {
304
- F: __dxlog_file3,
305
- L: 13,
306
- S: this,
307
- A: [
308
- "size >= 1",
309
- ""
310
- ]
311
- });
333
+ invariant3(size >= 1);
312
334
  this._buffer = new Array(size);
313
335
  }
314
336
  push(element) {
@@ -321,6 +343,10 @@ var CircularBuffer = class {
321
343
  get elementCount() {
322
344
  return this._elementCount;
323
345
  }
346
+ clear() {
347
+ this._nextIndex = 0;
348
+ this._elementCount = 0;
349
+ }
324
350
  getLast() {
325
351
  if (this._elementCount === 0) {
326
352
  return void 0;
@@ -352,7 +378,7 @@ var CircularBuffer = class {
352
378
  }
353
379
  };
354
380
 
355
- // packages/common/util/src/clear-undefined.ts
381
+ // src/clear-undefined.ts
356
382
  var clearUndefined = (obj) => {
357
383
  for (const key of [
358
384
  ...Object.getOwnPropertyNames(obj),
@@ -365,15 +391,16 @@ var clearUndefined = (obj) => {
365
391
  return obj;
366
392
  };
367
393
 
368
- // packages/common/util/src/complex.ts
394
+ // src/complex.ts
369
395
  import { inspect } from "@dxos/node-std/util";
370
396
  import { inspectObject, raise } from "@dxos/debug";
371
397
  var MAX_SERIALIZATION_LENGTH = 10;
372
398
  var ComplexSet = class {
399
+ _projection;
400
+ _values = /* @__PURE__ */ new Map();
373
401
  // prettier-ignore
374
402
  constructor(_projection, values) {
375
403
  this._projection = _projection;
376
- this._values = /* @__PURE__ */ new Map();
377
404
  if (values) {
378
405
  for (const value of values) {
379
406
  this.add(value);
@@ -463,11 +490,12 @@ var makeSet = (projection) => {
463
490
  };
464
491
  };
465
492
  var ComplexMap = class _ComplexMap {
493
+ _keyProjection;
494
+ _keys = /* @__PURE__ */ new Map();
495
+ _values = /* @__PURE__ */ new Map();
466
496
  // prettier-ignore
467
497
  constructor(_keyProjection, entries2) {
468
498
  this._keyProjection = _keyProjection;
469
- this._keys = /* @__PURE__ */ new Map();
470
- this._values = /* @__PURE__ */ new Map();
471
499
  if (entries2) {
472
500
  for (const [key, value] of entries2) {
473
501
  this.set(key, value);
@@ -512,6 +540,36 @@ var ComplexMap = class _ComplexMap {
512
540
  this._values.set(primitive, value);
513
541
  return this;
514
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
+ }
515
573
  get size() {
516
574
  return this._keys.size;
517
575
  }
@@ -551,21 +609,15 @@ var makeMap = (keyProjection) => class BoundComplexMap extends ComplexMap {
551
609
  }
552
610
  };
553
611
 
554
- // packages/common/util/src/deep.ts
555
- import get from "lodash.get";
556
- import set from "lodash.set";
612
+ // src/composite-key.ts
613
+ var SEPARATOR = ":";
614
+ var compositeKey = (...parts) => parts.join(SEPARATOR);
615
+ var splitCompositeKey = (key) => key.split(SEPARATOR);
616
+
617
+ // src/deep.ts
557
618
  import { invariant as invariant4 } from "@dxos/invariant";
558
- var __dxlog_file4 = "/home/runner/work/dxos/dxos/packages/common/util/src/deep.ts";
559
619
  var setDeep = (obj, path, value) => {
560
- invariant4(path.length > 0, void 0, {
561
- F: __dxlog_file4,
562
- L: 18,
563
- S: void 0,
564
- A: [
565
- "path.length > 0",
566
- ""
567
- ]
568
- });
620
+ invariant4(path.length > 0);
569
621
  let parent = obj;
570
622
  for (const key of path.slice(0, -1)) {
571
623
  if (parent[key] === void 0) {
@@ -585,16 +637,14 @@ var getDeep = (obj, path) => {
585
637
  return parent;
586
638
  };
587
639
 
588
- // packages/common/util/src/defer-function.ts
640
+ // src/defer-function.ts
589
641
  var deferFunction = (fnProvider) => (...args) => fnProvider()(...args);
590
642
 
591
- // packages/common/util/src/explicit-resource-management-polyfill.ts
592
- Symbol.dispose ??= Symbol("Symbol.dispose");
593
- Symbol.asyncDispose ??= Symbol("Symbol.asyncDispose");
594
-
595
- // packages/common/util/src/defer.ts
643
+ // src/defer.ts
644
+ import "@hazae41/symbol-dispose-polyfill";
596
645
  var defer = (fn) => new DeferGuard(fn);
597
646
  var DeferGuard = class {
647
+ _fn;
598
648
  /**
599
649
  * @internal
600
650
  */
@@ -610,6 +660,7 @@ var DeferGuard = class {
610
660
  };
611
661
  var deferAsync = (fn) => new DeferAsyncGuard(fn);
612
662
  var DeferAsyncGuard = class {
663
+ _fn;
613
664
  /**
614
665
  * @internal
615
666
  */
@@ -621,9 +672,11 @@ var DeferAsyncGuard = class {
621
672
  }
622
673
  };
623
674
 
624
- // packages/common/util/src/entry.ts
675
+ // src/entry.ts
625
676
  var entry = (map, key) => new MapEntry(map, key);
626
677
  var MapEntry = class {
678
+ _map;
679
+ _key;
627
680
  /**
628
681
  * @internal
629
682
  */
@@ -649,37 +702,33 @@ var MapEntry = class {
649
702
  }
650
703
  };
651
704
 
652
- // packages/common/util/src/first-two-chars.ts
653
- var renderableCharRegex = /^(?![\p{Control}\p{Mark}\p{Separator}\p{Surrogate}\p{Unassigned}\p{P}])[\p{L}\p{N}\p{S}\p{Emoji}]$/u;
654
- var getFirstTwoRenderableChars = (label) => {
655
- const characters = Array.from(label);
656
- const result = [
657
- "",
658
- ""
659
- ];
660
- let foundFirst = false;
661
- for (let i = 0; i < characters.length; i++) {
662
- const char = characters[i];
663
- if (renderableCharRegex.test(char)) {
664
- if (!foundFirst) {
665
- result[0] = char;
666
- foundFirst = true;
667
- } else {
668
- const textBetween = characters.slice(result[0].length, i).join("");
669
- if (/[^\p{L}\p{N}_]/u.test(textBetween)) {
670
- result[1] = char;
671
- break;
672
- }
673
- }
674
- }
675
- }
676
- return result;
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");
677
720
  };
678
721
 
679
- // packages/common/util/src/for-each-async.ts
722
+ // src/filename.ts
723
+ var createFilename = ({ parts = [], ext, date = /* @__PURE__ */ new Date() }) => [
724
+ date.toISOString().replace(/[:.]/g, "-"),
725
+ ...parts
726
+ ].join("_") + (ext ? `.${ext}` : "");
727
+
728
+ // src/for-each-async.ts
680
729
  var forEachAsync = (items, fn) => Promise.all(items.map(fn));
681
730
 
682
- // packages/common/util/src/human-hash.ts
731
+ // src/human-hash.ts
683
732
  import { PublicKey } from "@dxos/keys";
684
733
  var DEFAULT_WORDLIST = [
685
734
  "ack",
@@ -940,6 +989,7 @@ var DEFAULT_WORDLIST = [
940
989
  "zulu"
941
990
  ];
942
991
  var HumanHasher = class {
992
+ wordlist;
943
993
  /**
944
994
  * Transforms hex digests to human-readable strings.
945
995
  *
@@ -1010,7 +1060,20 @@ var humanize = (value) => {
1010
1060
  return hasher.humanize(value);
1011
1061
  };
1012
1062
 
1013
- // packages/common/util/src/map.ts
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
+
1076
+ // src/map.ts
1014
1077
  var defaultMap = (map, key, def) => {
1015
1078
  let value = map.get(key);
1016
1079
  if (value === void 0) {
@@ -1020,8 +1083,8 @@ var defaultMap = (map, key, def) => {
1020
1083
  return value;
1021
1084
  };
1022
1085
 
1023
- // packages/common/util/src/instance-id.ts
1024
- var symbol = Symbol.for("dxos.instance-contexts");
1086
+ // src/instance-id.ts
1087
+ var symbol = /* @__PURE__ */ Symbol.for("dxos.instance-contexts");
1025
1088
  var instanceContexts = globalThis[symbol] ??= /* @__PURE__ */ new WeakMap();
1026
1089
  var getPrototypeSpecificInstanceId = (instance) => {
1027
1090
  const prototype = Object.getPrototypeOf(instance);
@@ -1029,12 +1092,12 @@ var getPrototypeSpecificInstanceId = (instance) => {
1029
1092
  nextId: 0,
1030
1093
  instanceIds: /* @__PURE__ */ new WeakMap()
1031
1094
  }));
1032
- let id = instanceCtx.instanceIds.get(instance);
1033
- if (id === void 0) {
1034
- id = instanceCtx.nextId++;
1035
- 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);
1036
1099
  }
1037
- return id;
1100
+ return id2;
1038
1101
  };
1039
1102
  var getDebugName = (instance) => {
1040
1103
  if (instance == null) {
@@ -1044,7 +1107,7 @@ var getDebugName = (instance) => {
1044
1107
  return `${prototype.constructor?.name ?? "Object"}#${getPrototypeSpecificInstanceId(instance)}`;
1045
1108
  };
1046
1109
 
1047
- // packages/common/util/src/interval.ts
1110
+ // src/interval.ts
1048
1111
  var exponentialBackoffInterval = (cb, initialInterval) => {
1049
1112
  let interval = initialInterval;
1050
1113
  const repeat = () => {
@@ -1056,7 +1119,7 @@ var exponentialBackoffInterval = (cb, initialInterval) => {
1056
1119
  return () => clearTimeout(timeoutId);
1057
1120
  };
1058
1121
 
1059
- // packages/common/util/src/join-tables.ts
1122
+ // src/join-tables.ts
1060
1123
  var joinTables = (leftColumn, rightColumn, left, right) => {
1061
1124
  const map = /* @__PURE__ */ new Map();
1062
1125
  const used = /* @__PURE__ */ new Set();
@@ -1077,11 +1140,11 @@ var joinTables = (leftColumn, rightColumn, left, right) => {
1077
1140
  return result;
1078
1141
  };
1079
1142
 
1080
- // packages/common/util/src/json.ts
1143
+ // src/json.ts
1081
1144
  import { inspect as inspect2 } from "@dxos/node-std/util";
1082
1145
  import { PublicKey as PublicKey2 } from "@dxos/keys";
1083
1146
 
1084
- // packages/common/util/src/uint8array.ts
1147
+ // src/uint8array.ts
1085
1148
  var arraysEqual = (a, b) => {
1086
1149
  if (a.length !== b.length) {
1087
1150
  return false;
@@ -1102,10 +1165,10 @@ var bufferToArray = (buffer) => {
1102
1165
  var stringToArray = (string) => bufferToArray(Buffer.from(string, "hex"));
1103
1166
  var arrayToString = (array) => arrayToBuffer(array).toString("hex");
1104
1167
 
1105
- // packages/common/util/src/json.ts
1168
+ // src/json.ts
1106
1169
  var MAX_DEPTH = 5;
1107
1170
  var LOG_MAX_DEPTH = 7;
1108
- function jsonReplacer(key, value) {
1171
+ var jsonReplacer = (key, value) => {
1109
1172
  if (value !== null && typeof value === "object" && typeof value[inspect2.custom] === "function") {
1110
1173
  return value[inspect2.custom]();
1111
1174
  }
@@ -1118,7 +1181,7 @@ function jsonReplacer(key, value) {
1118
1181
  }
1119
1182
  }
1120
1183
  return value;
1121
- }
1184
+ };
1122
1185
  var jsonify = (value, depth = 0, visitedObjects = /* @__PURE__ */ new WeakSet()) => {
1123
1186
  if (depth > MAX_DEPTH) {
1124
1187
  return null;
@@ -1193,7 +1256,7 @@ var jsonKeyReplacer = (options = {}) => (key, value) => {
1193
1256
  return value;
1194
1257
  };
1195
1258
 
1196
- // packages/common/util/src/map-values.ts
1259
+ // src/map-values.ts
1197
1260
  var mapValues = (obj, fn) => {
1198
1261
  const result = {};
1199
1262
  Object.keys(obj).forEach((key) => {
@@ -1205,31 +1268,10 @@ var deepMapValues = (value, fn) => {
1205
1268
  return new DeepMapper(fn).map(value);
1206
1269
  };
1207
1270
  var DeepMapper = class {
1271
+ _fn;
1272
+ _cyclic = /* @__PURE__ */ new Map();
1208
1273
  constructor(_fn) {
1209
1274
  this._fn = _fn;
1210
- this._cyclic = /* @__PURE__ */ new Map();
1211
- this._recurse = (value) => {
1212
- if (this._cyclic.has(value)) {
1213
- return this._cyclic.get(value);
1214
- }
1215
- if (Array.isArray(value)) {
1216
- const res = new Array(value.length);
1217
- this._cyclic.set(value, res);
1218
- for (let i = 0; i < value.length; i++) {
1219
- res[i] = this._map(value[i], i);
1220
- }
1221
- return res;
1222
- } else if (value !== null && typeof value === "object") {
1223
- const res = {};
1224
- this._cyclic.set(value, res);
1225
- for (const key in value) {
1226
- res[key] = this._map(value[key], key);
1227
- }
1228
- return res;
1229
- } else {
1230
- return value;
1231
- }
1232
- };
1233
1275
  }
1234
1276
  map(value) {
1235
1277
  return this._map(value, void 0);
@@ -1240,36 +1282,37 @@ var DeepMapper = class {
1240
1282
  }
1241
1283
  return this._fn(value, this._recurse, key);
1242
1284
  }
1285
+ _recurse = (value) => {
1286
+ if (this._cyclic.has(value)) {
1287
+ return this._cyclic.get(value);
1288
+ }
1289
+ if (Array.isArray(value)) {
1290
+ const res = new Array(value.length);
1291
+ this._cyclic.set(value, res);
1292
+ for (let i = 0; i < value.length; i++) {
1293
+ res[i] = this._map(value[i], i);
1294
+ }
1295
+ return res;
1296
+ } else if (value !== null && typeof value === "object") {
1297
+ const res = {};
1298
+ this._cyclic.set(value, res);
1299
+ for (const key in value) {
1300
+ res[key] = this._map(value[key], key);
1301
+ }
1302
+ return res;
1303
+ } else {
1304
+ return value;
1305
+ }
1306
+ };
1243
1307
  };
1244
1308
  var deepMapValuesAsync = (value, fn) => {
1245
1309
  return new DeepMapperAsync(fn).map(value);
1246
1310
  };
1247
1311
  var DeepMapperAsync = class {
1312
+ _fn;
1313
+ _cyclic = /* @__PURE__ */ new Map();
1248
1314
  constructor(_fn) {
1249
1315
  this._fn = _fn;
1250
- this._cyclic = /* @__PURE__ */ new Map();
1251
- this._recurse = async (value) => {
1252
- if (this._cyclic.has(value)) {
1253
- return this._cyclic.get(value);
1254
- }
1255
- if (Array.isArray(value)) {
1256
- const res = new Array(value.length);
1257
- this._cyclic.set(value, res);
1258
- for (let i = 0; i < value.length; i++) {
1259
- res[i] = await this._map(value[i], i);
1260
- }
1261
- return res;
1262
- } else if (value !== null && typeof value === "object") {
1263
- const res = {};
1264
- this._cyclic.set(value, res);
1265
- for (const key in value) {
1266
- res[key] = await this._map(value[key], key);
1267
- }
1268
- return res;
1269
- } else {
1270
- return value;
1271
- }
1272
- };
1273
1316
  }
1274
1317
  map(value) {
1275
1318
  return this._map(value, void 0);
@@ -1280,6 +1323,28 @@ var DeepMapperAsync = class {
1280
1323
  }
1281
1324
  return this._fn(value, this._recurse, key);
1282
1325
  }
1326
+ _recurse = async (value) => {
1327
+ if (this._cyclic.has(value)) {
1328
+ return this._cyclic.get(value);
1329
+ }
1330
+ if (Array.isArray(value)) {
1331
+ const res = new Array(value.length);
1332
+ this._cyclic.set(value, res);
1333
+ for (let i = 0; i < value.length; i++) {
1334
+ res[i] = await this._map(value[i], i);
1335
+ }
1336
+ return res;
1337
+ } else if (value !== null && typeof value === "object") {
1338
+ const res = {};
1339
+ this._cyclic.set(value, res);
1340
+ for (const key in value) {
1341
+ res[key] = await this._map(value[key], key);
1342
+ }
1343
+ return res;
1344
+ } else {
1345
+ return value;
1346
+ }
1347
+ };
1283
1348
  };
1284
1349
  var visitValues = (object, visitor) => {
1285
1350
  if (Array.isArray(object)) {
@@ -1291,11 +1356,11 @@ var visitValues = (object, visitor) => {
1291
1356
  }
1292
1357
  };
1293
1358
 
1294
- // packages/common/util/src/object.ts
1359
+ // src/object.ts
1295
1360
  var keys = (obj) => Object.keys(obj);
1296
1361
  var entries = (obj) => Object.entries(obj);
1297
1362
 
1298
- // packages/common/util/src/order-keys.ts
1363
+ // src/order-keys.ts
1299
1364
  var orderKeys = (obj, order) => {
1300
1365
  const ordered = {};
1301
1366
  for (const key of order) {
@@ -1311,34 +1376,34 @@ var orderKeys = (obj, order) => {
1311
1376
  return ordered;
1312
1377
  };
1313
1378
 
1314
- // packages/common/util/src/order.ts
1379
+ // src/order.ts
1315
1380
  var inferObjectOrder = (objectMap, order = []) => {
1316
- const orderedObjects = order.reduce((acc, id) => {
1317
- if (id in objectMap) {
1318
- acc.objects.push(objectMap[id]);
1319
- acc.ids.add(id);
1381
+ const orderedObjects = order.reduce((acc, id2) => {
1382
+ if (id2 in objectMap) {
1383
+ acc.objects.push(objectMap[id2]);
1384
+ acc.ids.add(id2);
1320
1385
  }
1321
1386
  return acc;
1322
1387
  }, {
1323
1388
  objects: [],
1324
1389
  ids: /* @__PURE__ */ new Set()
1325
1390
  });
1326
- const { objects } = Object.keys(objectMap).reduce((acc, id) => {
1327
- if (!acc.ids.has(id)) {
1328
- acc.objects.push(objectMap[id]);
1391
+ const { objects } = Object.keys(objectMap).reduce((acc, id2) => {
1392
+ if (!acc.ids.has(id2)) {
1393
+ acc.objects.push(objectMap[id2]);
1329
1394
  }
1330
1395
  return acc;
1331
1396
  }, orderedObjects);
1332
1397
  return objects;
1333
1398
  };
1334
1399
  var inferRecordOrder = (objectMap, order = []) => {
1335
- return Object.assign(order.filter((id) => id in objectMap).reduce((acc, id) => {
1336
- acc[id] = null;
1400
+ return Object.assign(order.filter((id2) => id2 in objectMap).reduce((acc, id2) => {
1401
+ acc[id2] = null;
1337
1402
  return acc;
1338
1403
  }, {}), objectMap);
1339
1404
  };
1340
1405
 
1341
- // packages/common/util/src/pick.ts
1406
+ // src/pick.ts
1342
1407
  var pick = (obj, keys2) => {
1343
1408
  return keys2.reduce((result, key) => {
1344
1409
  if (obj && key in obj) {
@@ -1366,9 +1431,20 @@ var omit = (obj, keys2) => {
1366
1431
  return result;
1367
1432
  };
1368
1433
 
1369
- // packages/common/util/src/platform.ts
1434
+ // src/platform.ts
1370
1435
  var isNode = () => typeof process !== "undefined" && process.versions != null && process.versions.node != null;
1371
- var mobileAndTabletCheck = () => {
1436
+ var isBun = () => globalThis.Bun !== void 0;
1437
+ var isTauri = () => !!globalThis.__TAURI__;
1438
+ var isMobile = () => {
1439
+ let check = false;
1440
+ (function(a) {
1441
+ if (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0, 4))) {
1442
+ check = true;
1443
+ }
1444
+ })(navigator.userAgent || navigator.vendor || window.opera);
1445
+ return check;
1446
+ };
1447
+ var isMobileOrTablet = () => {
1372
1448
  let check = false;
1373
1449
  ((a) => {
1374
1450
  if (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0, 4))) {
@@ -1390,7 +1466,7 @@ var iosCheck = () => {
1390
1466
  };
1391
1467
  var safariCheck = () => typeof navigator !== "undefined" && /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
1392
1468
  var getHostPlatform = () => {
1393
- if (!("navigator" in window)) {
1469
+ if (!("navigator" in globalThis)) {
1394
1470
  return "unknown";
1395
1471
  }
1396
1472
  const platform = (navigator.userAgentData?.platform || navigator.platform)?.toLowerCase();
@@ -1407,27 +1483,27 @@ var getHostPlatform = () => {
1407
1483
  }
1408
1484
  };
1409
1485
 
1410
- // packages/common/util/src/position.ts
1411
- var byPosition = ({ position: a = "static" }, { position: b = "static" }) => {
1486
+ // src/position.ts
1487
+ var byPosition = ({ position: a }, { position: b }) => {
1412
1488
  if (a === b) {
1413
1489
  return 0;
1414
- } else if (a === "hoist" || b === "fallback") {
1490
+ } else if (a === "first" || b === "last") {
1415
1491
  return -1;
1416
- } else if (b === "hoist" || a === "fallback") {
1492
+ } else if (b === "first" || a === "last") {
1417
1493
  return 1;
1418
1494
  } else {
1419
1495
  return 0;
1420
1496
  }
1421
1497
  };
1422
1498
 
1423
- // packages/common/util/src/random.ts
1499
+ // src/random.ts
1424
1500
  var randomInt = (max, min = 0) => {
1425
1501
  min = Math.ceil(min);
1426
1502
  max = Math.floor(max);
1427
1503
  return Math.floor(Math.random() * (max - min + 1)) + min;
1428
1504
  };
1429
1505
 
1430
- // packages/common/util/src/range.ts
1506
+ // src/range.ts
1431
1507
  var range = (n = 0, mapper) => {
1432
1508
  const range2 = Array.from(Array(n).keys());
1433
1509
  return mapper == null ? range2 : range2.map(mapper);
@@ -1439,7 +1515,7 @@ var clamp = (value, min, max) => {
1439
1515
  return Math.min(Math.max(value, min), max);
1440
1516
  };
1441
1517
 
1442
- // packages/common/util/src/reducers.ts
1518
+ // src/reducers.ts
1443
1519
  var accessBy = (value, accessor) => typeof accessor === "function" ? accessor(value) : value[accessor];
1444
1520
  var median = (values) => {
1445
1521
  const mid = Math.floor(values.length / 2);
@@ -1525,7 +1601,7 @@ var createBucketReducer = (period) => ({
1525
1601
  }
1526
1602
  });
1527
1603
 
1528
- // packages/common/util/src/remove-undefined-keys.ts
1604
+ // src/remove-undefined-keys.ts
1529
1605
  var removeUndefinedProperties = (object) => {
1530
1606
  for (const prop of [
1531
1607
  ...Object.getOwnPropertyNames(object),
@@ -1566,7 +1642,44 @@ var removeProperties = (root, condition) => {
1566
1642
  return result;
1567
1643
  };
1568
1644
 
1569
- // packages/common/util/src/safe-await.ts
1645
+ // src/retry.ts
1646
+ var DEFAULT_RETRY_OPTIONS = {
1647
+ count: 3,
1648
+ delayMs: 100,
1649
+ exponent: 2,
1650
+ retryOnError: async () => true,
1651
+ retryOnValue: async () => false
1652
+ };
1653
+ var retry = async (options, cb) => {
1654
+ const fullOptions = {
1655
+ ...DEFAULT_RETRY_OPTIONS,
1656
+ ...options
1657
+ };
1658
+ let numRetries = 0, currentDelay = fullOptions.delayMs;
1659
+ while (true) {
1660
+ let result;
1661
+ try {
1662
+ result = await cb();
1663
+ } catch (err) {
1664
+ if (numRetries > fullOptions.count || !await fullOptions.retryOnError(err)) {
1665
+ throw err;
1666
+ }
1667
+ await new Promise((resolve) => setTimeout(resolve, currentDelay));
1668
+ currentDelay *= fullOptions.exponent;
1669
+ numRetries++;
1670
+ continue;
1671
+ }
1672
+ if (!await fullOptions.retryOnValue(result)) {
1673
+ return result;
1674
+ }
1675
+ await new Promise((resolve) => setTimeout(resolve, currentDelay));
1676
+ currentDelay *= fullOptions.exponent;
1677
+ numRetries++;
1678
+ continue;
1679
+ }
1680
+ };
1681
+
1682
+ // src/safe-await.ts
1570
1683
  var safeAwaitAll = async (source, taskFactory, onError) => {
1571
1684
  const failedItems = [];
1572
1685
  await Promise.all([
@@ -1584,8 +1697,8 @@ var safeAwaitAll = async (source, taskFactory, onError) => {
1584
1697
  return failedItems;
1585
1698
  };
1586
1699
 
1587
- // packages/common/util/src/safe-instanceof.ts
1588
- var instanceTag = Symbol("instanceTag");
1700
+ // src/safe-instanceof.ts
1701
+ var instanceTag = /* @__PURE__ */ Symbol("instanceTag");
1589
1702
  var safeInstanceof = (tag) => (target) => {
1590
1703
  target.prototype[instanceTag] = tag;
1591
1704
  Object.defineProperty(target.prototype, Symbol.hasInstance, {
@@ -1596,49 +1709,140 @@ var safeInstanceof = (tag) => (target) => {
1596
1709
  });
1597
1710
  };
1598
1711
 
1599
- // packages/common/util/src/safe-parse.ts
1600
- var safeParseInt = (value, defaultValue) => {
1712
+ // src/safe-parse.ts
1713
+ function safeParseInt(str, defaultValue) {
1601
1714
  try {
1602
- const n = parseInt(value ?? "");
1603
- return isNaN(n) ? defaultValue : n;
1604
- } catch (err) {
1715
+ const value = parseInt(str ?? "");
1716
+ return isNaN(value) ? defaultValue : value;
1717
+ } catch {
1605
1718
  return defaultValue;
1606
1719
  }
1720
+ }
1721
+ function safeParseFloat(str, defaultValue) {
1722
+ try {
1723
+ const value = parseFloat(str ?? "");
1724
+ return isNaN(value) ? defaultValue : value;
1725
+ } catch {
1726
+ return defaultValue;
1727
+ }
1728
+ }
1729
+ var safeParseJson = (str, defaultValue) => {
1730
+ if (str && str.length > 0) {
1731
+ try {
1732
+ return JSON.parse(str);
1733
+ } catch {
1734
+ }
1735
+ }
1736
+ return defaultValue;
1607
1737
  };
1608
- var safeParseFloat = (str, defaultValue) => {
1738
+ var safeUrl = (str) => {
1609
1739
  try {
1610
- return parseFloat(str);
1740
+ return new URL(str ?? "");
1611
1741
  } catch {
1612
- return defaultValue ?? 0;
1742
+ return void 0;
1613
1743
  }
1614
1744
  };
1615
- var safeParseJson = (data, defaultValue) => {
1616
- if (data && data.length > 0) {
1745
+
1746
+ // src/safe-stringify.ts
1747
+ var SKIP = Object.freeze({});
1748
+ function safeStringify(obj, filter = defaultFilter, indent = 2) {
1749
+ const seen = /* @__PURE__ */ new WeakMap();
1750
+ function replacer(key, value) {
1617
1751
  try {
1618
- return JSON.parse(data);
1619
- } catch (err) {
1752
+ let path = key;
1753
+ if (!key) {
1754
+ path = "$";
1755
+ if (value != null && typeof value === "object") {
1756
+ seen.set(value, path);
1757
+ }
1758
+ return value;
1759
+ } else if (this) {
1760
+ const parentPath = seen.get(this);
1761
+ path = parentPath ? `${parentPath}.${key}` : key;
1762
+ }
1763
+ if (value == null) {
1764
+ return value;
1765
+ }
1766
+ if (typeof value === "function") {
1767
+ return void 0;
1768
+ }
1769
+ if (typeof value === "object" && Object.getPrototypeOf(value) !== Object.prototype && !Array.isArray(value)) {
1770
+ return void 0;
1771
+ }
1772
+ if (typeof value === "object" && value !== null) {
1773
+ const exists = seen.get(value);
1774
+ if (exists) {
1775
+ return `[${path} => ${exists}]`;
1776
+ }
1777
+ seen.set(value, path);
1778
+ }
1779
+ if (filter) {
1780
+ const filteredValue = filter?.(key, value);
1781
+ if (filteredValue !== void 0) {
1782
+ return filteredValue === SKIP ? void 0 : filteredValue;
1783
+ }
1784
+ }
1785
+ return value;
1786
+ } catch (error) {
1787
+ return `ERROR: ${error.message}`;
1620
1788
  }
1621
1789
  }
1622
- return defaultValue;
1790
+ try {
1791
+ return JSON.stringify(obj, replacer, indent);
1792
+ } catch (error) {
1793
+ return `ERROR: ${error.message}`;
1794
+ }
1795
+ }
1796
+ var createReplacer = ({ omit: omit2, parse, maxDepth, maxArrayLen, maxStringLen } = {}) => {
1797
+ let currentDepth = 0;
1798
+ const depthMap = /* @__PURE__ */ new WeakMap();
1799
+ return function(key, value) {
1800
+ if (key === "") {
1801
+ currentDepth = 0;
1802
+ } else if (this && typeof this === "object") {
1803
+ const parentDepth = depthMap.get(this) ?? 0;
1804
+ currentDepth = parentDepth + 1;
1805
+ }
1806
+ if (typeof value === "function") {
1807
+ return SKIP;
1808
+ }
1809
+ if (maxArrayLen != null && Array.isArray(value) && value.length > maxArrayLen) {
1810
+ return `[length: ${value.length}]`;
1811
+ }
1812
+ if (value && typeof value === "object") {
1813
+ depthMap.set(value, currentDepth);
1814
+ if (maxDepth != null && currentDepth >= maxDepth) {
1815
+ return Array.isArray(value) ? `[{ length: ${value.length} }]` : `{ keys: ${Object.keys(value).length} }`;
1816
+ }
1817
+ }
1818
+ if (omit2?.includes(key)) {
1819
+ return SKIP;
1820
+ }
1821
+ if (parse?.includes(key) && typeof value === "string") {
1822
+ try {
1823
+ return JSON.parse(value);
1824
+ } catch {
1825
+ return value;
1826
+ }
1827
+ }
1828
+ if (maxStringLen != null && typeof value === "string" && value.length > maxStringLen) {
1829
+ return value.slice(0, maxStringLen) + "...";
1830
+ }
1831
+ return value;
1832
+ };
1623
1833
  };
1834
+ var defaultFilter = createReplacer();
1624
1835
 
1625
- // packages/common/util/src/sliding-window-summary.ts
1836
+ // src/sliding-window-summary.ts
1626
1837
  import { invariant as invariant5 } from "@dxos/invariant";
1627
- var __dxlog_file5 = "/home/runner/work/dxos/dxos/packages/common/util/src/sliding-window-summary.ts";
1628
1838
  var SlidingWindowSummary = class {
1839
+ _buffer;
1840
+ _sum = 0;
1841
+ _precision;
1629
1842
  constructor(options) {
1630
- this._sum = 0;
1631
1843
  this._buffer = new CircularBuffer(options.dataPoints);
1632
1844
  if (options.precision != null) {
1633
- invariant5(options.precision >= 0, void 0, {
1634
- F: __dxlog_file5,
1635
- L: 26,
1636
- S: this,
1637
- A: [
1638
- "options.precision >= 0",
1639
- ""
1640
- ]
1641
- });
1845
+ invariant5(options.precision >= 0);
1642
1846
  this._precision = Math.pow(10, options.precision);
1643
1847
  }
1644
1848
  }
@@ -1678,7 +1882,7 @@ var SlidingWindowSummary = class {
1678
1882
  }
1679
1883
  };
1680
1884
 
1681
- // packages/common/util/src/sort.ts
1885
+ // src/sort.ts
1682
1886
  var compareScalar = (inc = true) => (a, b) => (inc ? 1 : -1) * (a < b ? -1 : a > b ? 1 : 0);
1683
1887
  var compareString = (inc = true, caseInsensitive = true) => (a, b) => {
1684
1888
  if (caseInsensitive) {
@@ -1700,38 +1904,48 @@ var compareMulti = (sorters) => (a, b) => {
1700
1904
  return sort();
1701
1905
  };
1702
1906
 
1703
- // packages/common/util/src/string.ts
1907
+ // src/string.ts
1704
1908
  var capitalize = (str) => {
1705
1909
  if (str.length === 0) {
1706
1910
  return "";
1707
1911
  }
1708
1912
  return str.charAt(0).toUpperCase() + str.slice(1);
1709
1913
  };
1914
+ function trim(strings, ...values) {
1915
+ const raw = strings.reduce((out, str, i) => {
1916
+ out += str;
1917
+ if (i < values.length) {
1918
+ const match = str.match(/(^|\n)([ \t]*)$/);
1919
+ const baseIndent = match ? match[2] : "";
1920
+ const val = String(values[i]).replace(/\r?\n/g, "\n" + baseIndent);
1921
+ out += val;
1922
+ }
1923
+ return out;
1924
+ }, "");
1925
+ const lines = raw.split("\n");
1926
+ while (lines.length && !lines[0].trim()) {
1927
+ lines.shift();
1928
+ }
1929
+ while (lines.length && !lines[lines.length - 1].trim()) {
1930
+ lines.pop();
1931
+ }
1932
+ const minIndent = Math.min(...lines.filter((l) => l.trim()).map((l) => l.match(/^[ \t]*/)?.[0].length ?? 0));
1933
+ return lines.map((l) => l.slice(minIndent)).join("\n");
1934
+ }
1935
+ var kebabize = (str) => str.replace(/[A-Z]+(?![a-z])|[A-Z]/g, ($, ofs) => (ofs ? "-" : "") + $.toLowerCase());
1710
1936
 
1711
- // packages/common/util/src/sum.ts
1937
+ // src/sum.ts
1712
1938
  var sum = (values) => values.reduce((a, b) => a + b, 0);
1713
1939
 
1714
- // packages/common/util/src/throw-unhandled-error.ts
1940
+ // src/throw-unhandled-error.ts
1715
1941
  var throwUnhandledError = (error) => {
1716
1942
  queueMicrotask(() => {
1717
1943
  throw error;
1718
1944
  });
1719
1945
  };
1720
1946
 
1721
- // packages/common/util/src/to-fallback.ts
1947
+ // src/to-fallback.ts
1722
1948
  var idEmoji = [
1723
- // When changing this set, please check the result in a console or e.g. RunKit (https://runkit.com/thure/642214441dd6ae000855a8de)
1724
- // Emoji sometimes use a combination of code points, and some code points aren't visible on their own, so by adding or deleting you may unintentionally create non-visible items.
1725
- // This set was chosen from the characters in Unicode Emoji v15.0 based on the following criteria:
1726
- // – not people or isolated anthropomorphic faces
1727
- // – not flags
1728
- // – more concrete than abstract
1729
- // – less culturally specific
1730
- // – less easily confused with another emoji in the set
1731
- // – requires less special knowledge to identify
1732
- // – less likely to evoke negative feelings (no meat, no drugs, no weapons, etc)
1733
- // – less common as a signifier in UX
1734
- // NOTE that this is intentionally an array of strings because of the way emoji graphemes work.
1735
1949
  "\u{1F47B}",
1736
1950
  "\u{1F479}",
1737
1951
  "\u{1F47D}",
@@ -1867,17 +2081,18 @@ var idEmoji = [
1867
2081
  ];
1868
2082
  var idHue = [
1869
2083
  "red",
1870
- // 'orange' as const, /* More shades in these palettes are considered “ugly” */
2084
+ "orange",
1871
2085
  "amber",
1872
- // 'yellow' as const, /* More shades in these palettes are considered “ugly” */
2086
+ "yellow",
1873
2087
  "lime",
1874
2088
  "green",
1875
2089
  "emerald",
1876
2090
  "teal",
1877
2091
  "cyan",
1878
- // 'sky' as const, /* Omitted since it is quite similar to the primary accent palette */
1879
- // 'blue' as const, /* Omitted since it is quite similar to the primary accent palette */
1880
- // 'indigo' as const, /* Omitted since it is quite similar to the primary accent palette */
2092
+ // Omit colors similar to primary accent.
2093
+ // 'sky' as const,
2094
+ // 'blue' as const,
2095
+ // 'indigo' as const,
1881
2096
  "violet",
1882
2097
  "purple",
1883
2098
  "fuchsia",
@@ -1903,12 +2118,10 @@ var toFallback = (hash) => {
1903
2118
  };
1904
2119
  };
1905
2120
 
1906
- // packages/common/util/src/tracer.ts
2121
+ // src/tracer.ts
1907
2122
  var Tracer = class {
1908
- constructor() {
1909
- this._events = /* @__PURE__ */ new Map();
1910
- this._recording = false;
1911
- }
2123
+ _events = /* @__PURE__ */ new Map();
2124
+ _recording = false;
1912
2125
  // TODO(burdon): Start/stop methods for recording data? By id?
1913
2126
  // Alternatively, enable subscriptions to track/compute series.
1914
2127
  // TODO(burdon): Hierarchical traces?
@@ -1918,8 +2131,8 @@ var Tracer = class {
1918
2131
  keys() {
1919
2132
  return Array.from(this._events.keys());
1920
2133
  }
1921
- get(id, filter) {
1922
- const events = this._events.get(id);
2134
+ get(id2, filter) {
2135
+ const events = this._events.get(id2);
1923
2136
  if (filter) {
1924
2137
  return events?.filter((event) => Object.entries(filter).every(([key, value]) => event?.value[key] === value));
1925
2138
  }
@@ -1936,11 +2149,11 @@ var Tracer = class {
1936
2149
  this._recording = false;
1937
2150
  return this;
1938
2151
  }
1939
- emit(id, value) {
1940
- this._post(this._createEvent(id, value));
2152
+ emit(id2, value) {
2153
+ this._post(this._createEvent(id2, value));
1941
2154
  }
1942
- mark(id, value) {
1943
- const event = this._createEvent(id, value);
2155
+ mark(id2, value) {
2156
+ const event = this._createEvent(id2, value);
1944
2157
  const start = performance.now();
1945
2158
  return {
1946
2159
  start,
@@ -1950,9 +2163,9 @@ var Tracer = class {
1950
2163
  }
1951
2164
  };
1952
2165
  }
1953
- _createEvent(id, value) {
2166
+ _createEvent(id2, value) {
1954
2167
  const event = {
1955
- id,
2168
+ id: id2,
1956
2169
  timestamp: Date.now()
1957
2170
  };
1958
2171
  if (value !== void 0) {
@@ -1968,7 +2181,7 @@ var Tracer = class {
1968
2181
  };
1969
2182
  var tracer = new Tracer();
1970
2183
 
1971
- // packages/common/util/src/tree.ts
2184
+ // src/tree.ts
1972
2185
  import { truncateKey } from "@dxos/debug";
1973
2186
  var stringifyTree = (node, ancestors = [], rows = []) => {
1974
2187
  if (node.children?.length) {
@@ -2008,8 +2221,8 @@ var stringifyTree = (node, ancestors = [], rows = []) => {
2008
2221
  return rows;
2009
2222
  };
2010
2223
 
2011
- // packages/common/util/src/types.ts
2012
- var isNotFalsy = (value) => !!value;
2224
+ // src/types.ts
2225
+ var isTruthy = (value) => !!value;
2013
2226
  var isNonNullable = (value) => value != null;
2014
2227
  var doAsync = async (fn) => fn();
2015
2228
  var getProviderValue = (provider, arg) => {
@@ -2039,19 +2252,143 @@ var arrayMove = (array, from, to) => {
2039
2252
  array.splice(to < 0 ? array.length + to : to, 0, array.splice(from, 1)[0]);
2040
2253
  return array;
2041
2254
  };
2255
+ function arraySwap(array, from, to) {
2256
+ const current = array[from];
2257
+ array[from] = array[to];
2258
+ array[to] = current;
2259
+ return array;
2260
+ }
2042
2261
 
2043
- // packages/common/util/src/weak.ts
2262
+ // src/unit.ts
2263
+ var createFormat = (unit) => {
2264
+ return (n, precision = unit.precision ?? 0) => {
2265
+ const value = n / unit.quotient;
2266
+ const formattedValue = value.toLocaleString("en-US", {
2267
+ minimumFractionDigits: precision,
2268
+ maximumFractionDigits: precision
2269
+ });
2270
+ return {
2271
+ unit,
2272
+ value,
2273
+ formattedValue,
2274
+ toString: () => `${formattedValue}${unit.symbol}`
2275
+ };
2276
+ };
2277
+ };
2278
+ var MS_SECONDS = 1e3;
2279
+ var MS_MINUTES = 60 * MS_SECONDS;
2280
+ var MS_HOURS = 60 * MS_MINUTES;
2281
+ var Unit = {
2282
+ // General.
2283
+ Percent: createFormat({
2284
+ symbol: "%",
2285
+ quotient: 1 / 100,
2286
+ precision: 2
2287
+ }),
2288
+ Thousand: createFormat({
2289
+ symbol: "k",
2290
+ quotient: 1e3,
2291
+ precision: 2
2292
+ }),
2293
+ // Bytes (note KB vs KiB).
2294
+ Gigabyte: createFormat({
2295
+ symbol: "GB",
2296
+ quotient: 1e3 * 1e3 * 1e3,
2297
+ precision: 2
2298
+ }),
2299
+ Megabyte: createFormat({
2300
+ symbol: "MB",
2301
+ quotient: 1e3 * 1e3,
2302
+ precision: 2
2303
+ }),
2304
+ Kilobyte: createFormat({
2305
+ symbol: "KB",
2306
+ quotient: 1e3,
2307
+ precision: 2
2308
+ }),
2309
+ Byte: createFormat({
2310
+ symbol: "B",
2311
+ quotient: 1
2312
+ }),
2313
+ // Time.
2314
+ Hour: createFormat({
2315
+ symbol: "h",
2316
+ quotient: MS_HOURS
2317
+ }),
2318
+ Minute: createFormat({
2319
+ symbol: "m",
2320
+ quotient: MS_MINUTES
2321
+ }),
2322
+ Second: createFormat({
2323
+ symbol: "s",
2324
+ quotient: MS_SECONDS,
2325
+ precision: 1
2326
+ }),
2327
+ Millisecond: createFormat({
2328
+ symbol: "ms",
2329
+ quotient: 1
2330
+ }),
2331
+ Duration: (n) => {
2332
+ const hours = Math.floor(n / MS_HOURS);
2333
+ const minutes = Math.floor(n % MS_HOURS / MS_MINUTES);
2334
+ if (hours) {
2335
+ const formattedValue = minutes ? `${hours}h ${minutes}m` : `${hours}h`;
2336
+ return {
2337
+ unit: {
2338
+ symbol: "h",
2339
+ quotient: MS_HOURS
2340
+ },
2341
+ value: hours,
2342
+ formattedValue,
2343
+ toString: () => formattedValue
2344
+ };
2345
+ }
2346
+ if (minutes) {
2347
+ const seconds2 = (n - MS_MINUTES * minutes) / MS_SECONDS;
2348
+ const formattedValue = seconds2 ? `${minutes}m ${seconds2}s` : `${minutes}m`;
2349
+ return {
2350
+ unit: {
2351
+ symbol: "m",
2352
+ quotient: MS_MINUTES
2353
+ },
2354
+ value: minutes,
2355
+ formattedValue,
2356
+ toString: () => formattedValue
2357
+ };
2358
+ }
2359
+ const seconds = n >= MS_SECONDS;
2360
+ if (seconds) {
2361
+ return Unit.Second(n);
2362
+ }
2363
+ return Unit.Millisecond(n);
2364
+ }
2365
+ };
2366
+
2367
+ // src/url.ts
2368
+ var createUrl = (url, search) => {
2369
+ const base = typeof url === "string" ? new URL(url) : url;
2370
+ if (search) {
2371
+ base.search = new URLSearchParams(Object.entries(search).filter(([_, value]) => value != null)).toString();
2372
+ }
2373
+ return base;
2374
+ };
2375
+
2376
+ // src/weak.ts
2044
2377
  var WeakDictionary = class {
2378
+ _internal = /* @__PURE__ */ new Map();
2379
+ _finalization = new FinalizationRegistry(({ key, ref }) => {
2380
+ if (this._internal.get(key) === ref) {
2381
+ this._internal.delete(key);
2382
+ }
2383
+ });
2045
2384
  constructor(entries2) {
2046
- this._internal = /* @__PURE__ */ new Map();
2047
- this._finalization = new FinalizationRegistry((cleanUpCallback) => {
2048
- cleanUpCallback();
2049
- });
2050
- this._internal = new Map(entries2?.map(([key, value]) => [
2051
- key,
2052
- new WeakRef(value)
2053
- ]));
2054
- entries2?.forEach(([key, value]) => this._register(key, value));
2385
+ if (entries2) {
2386
+ for (const [key, value] of entries2) {
2387
+ const ref = new WeakRef(value);
2388
+ this._internal.set(key, ref);
2389
+ this._register(key, value, ref);
2390
+ }
2391
+ }
2055
2392
  }
2056
2393
  *entries() {
2057
2394
  for (const [key, value] of this._internal) {
@@ -2091,10 +2428,45 @@ var WeakDictionary = class {
2091
2428
  return this._internal.get(key)?.deref();
2092
2429
  }
2093
2430
  set(key, value) {
2094
- this._internal.set(key, new WeakRef(value));
2095
- this._register(key, value);
2431
+ const previous = this._internal.get(key)?.deref();
2432
+ if (previous) {
2433
+ this._unregister(previous);
2434
+ }
2435
+ const ref = new WeakRef(value);
2436
+ this._internal.set(key, ref);
2437
+ this._register(key, value, ref);
2096
2438
  return this;
2097
2439
  }
2440
+ /**
2441
+ * Returns the value for the given key if present, otherwise inserts and returns the default value.
2442
+ * @param key - The key to look up or insert.
2443
+ * @param defaultValue - The value to insert if the key is not present.
2444
+ * @returns The existing or newly inserted value.
2445
+ */
2446
+ getOrInsert(key, defaultValue) {
2447
+ const existing = this.get(key);
2448
+ if (existing !== void 0) {
2449
+ return existing;
2450
+ }
2451
+ this.set(key, defaultValue);
2452
+ return defaultValue;
2453
+ }
2454
+ /**
2455
+ * Returns the value for the given key if present, otherwise computes, inserts, and returns a new value.
2456
+ * The callback is only invoked when the key is missing.
2457
+ * @param key - The key to look up or insert.
2458
+ * @param callbackfn - Function to compute the value if the key is not present.
2459
+ * @returns The existing or newly computed value.
2460
+ */
2461
+ getOrInsertComputed(key, callbackfn) {
2462
+ const existing = this.get(key);
2463
+ if (existing !== void 0) {
2464
+ return existing;
2465
+ }
2466
+ const value = callbackfn(key);
2467
+ this.set(key, value);
2468
+ return value;
2469
+ }
2098
2470
  has(key) {
2099
2471
  return this._internal.has(key) && this._internal.get(key).deref() !== void 0;
2100
2472
  }
@@ -2125,19 +2497,16 @@ var WeakDictionary = class {
2125
2497
  }
2126
2498
  });
2127
2499
  }
2128
- _register(key, value) {
2129
- this._finalization.register(value, () => {
2130
- this._internal.delete(key);
2500
+ _register(key, value, ref) {
2501
+ this._finalization.register(value, {
2502
+ key,
2503
+ ref
2131
2504
  }, value);
2132
2505
  }
2133
2506
  _unregister(value) {
2134
2507
  this._finalization.unregister(value);
2135
2508
  }
2136
2509
  };
2137
-
2138
- // packages/common/util/src/assume.ts
2139
- function assumeType(value) {
2140
- }
2141
2510
  export {
2142
2511
  BitField,
2143
2512
  Callback,
@@ -2147,11 +2516,14 @@ export {
2147
2516
  ComplexSet,
2148
2517
  HumanHasher,
2149
2518
  MapEntry,
2519
+ SKIP,
2150
2520
  SlidingWindowSummary,
2151
2521
  Tracer,
2522
+ Unit,
2152
2523
  WeakDictionary,
2153
2524
  accessBy,
2154
2525
  arrayMove,
2526
+ arraySwap,
2155
2527
  arrayToBuffer,
2156
2528
  arrayToHex,
2157
2529
  arrayToString,
@@ -2162,18 +2534,28 @@ export {
2162
2534
  capitalize,
2163
2535
  chunkArray,
2164
2536
  clamp,
2537
+ clearCaches,
2538
+ clearIndexedDB,
2539
+ clearOPFS,
2540
+ clearServiceWorkers,
2165
2541
  clearUndefined,
2542
+ coerceArray,
2166
2543
  compareMulti,
2167
2544
  compareObject,
2168
2545
  compareScalar,
2169
2546
  compareString,
2547
+ compositeKey,
2170
2548
  createBinder,
2171
2549
  createBucketReducer,
2550
+ createFilename,
2172
2551
  createGroupReducer,
2552
+ createReplacer,
2173
2553
  createSetDispatch,
2554
+ createUrl,
2174
2555
  decamelize,
2175
2556
  deepMapValues,
2176
2557
  deepMapValuesAsync,
2558
+ defaultFilter,
2177
2559
  defaultMap,
2178
2560
  defer,
2179
2561
  deferAsync,
@@ -2185,12 +2567,11 @@ export {
2185
2567
  entry,
2186
2568
  exponentialBackoffInterval,
2187
2569
  forEachAsync,
2188
- get,
2570
+ formatErrorWithCauses,
2189
2571
  getAsyncProviderValue,
2190
2572
  getDate,
2191
2573
  getDebugName,
2192
2574
  getDeep,
2193
- getFirstTwoRenderableChars,
2194
2575
  getHostPlatform,
2195
2576
  getPrototypeSpecificInstanceId,
2196
2577
  getProviderValue,
@@ -2199,6 +2580,7 @@ export {
2199
2580
  hexToHue,
2200
2581
  humanize,
2201
2582
  hyphenize,
2583
+ id,
2202
2584
  idEmoji,
2203
2585
  idHue,
2204
2586
  inferObjectOrder,
@@ -2206,14 +2588,21 @@ export {
2206
2588
  intersectBy,
2207
2589
  intersection,
2208
2590
  iosCheck,
2591
+ isBun,
2592
+ isMobile,
2593
+ isMobileOrTablet,
2209
2594
  isNode,
2210
2595
  isNonNullable,
2211
- isNotFalsy,
2596
+ isTauri,
2597
+ isTruthy,
2598
+ isWellFormedId,
2599
+ isWellFormedIdPart,
2212
2600
  joinTables,
2213
2601
  jsonKeyReplacer,
2214
2602
  jsonReplacer,
2215
2603
  jsonify,
2216
2604
  jsonlogify,
2605
+ kebabize,
2217
2606
  keyToEmoji,
2218
2607
  keyToFallback,
2219
2608
  keyToHue,
@@ -2222,7 +2611,6 @@ export {
2222
2611
  makeSet,
2223
2612
  mapValues,
2224
2613
  median,
2225
- mobileAndTabletCheck,
2226
2614
  numericalValues,
2227
2615
  omit,
2228
2616
  orderKeys,
@@ -2238,15 +2626,18 @@ export {
2238
2626
  removeBy,
2239
2627
  removeProperties,
2240
2628
  removeUndefinedProperties,
2629
+ retry,
2241
2630
  safariCheck,
2242
2631
  safeAwaitAll,
2243
2632
  safeInstanceof,
2244
2633
  safeParseFloat,
2245
2634
  safeParseInt,
2246
2635
  safeParseJson,
2247
- set,
2636
+ safeStringify,
2637
+ safeUrl,
2248
2638
  setDeep,
2249
2639
  sortKeys,
2640
+ splitCompositeKey,
2250
2641
  stringToArray,
2251
2642
  stringifyTree,
2252
2643
  stripUndefined,
@@ -2256,6 +2647,7 @@ export {
2256
2647
  toFallback,
2257
2648
  toHue,
2258
2649
  tracer,
2650
+ trim,
2259
2651
  visitValues
2260
2652
  };
2261
2653
  //# sourceMappingURL=index.mjs.map