@dxos/util 0.8.3 → 0.8.4-main.03d5cd7b56

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 (150) hide show
  1. package/dist/lib/browser/index.mjs +631 -255
  2. package/dist/lib/browser/index.mjs.map +4 -4
  3. package/dist/lib/browser/meta.json +1 -1
  4. package/dist/lib/node-esm/index.mjs +631 -255
  5. package/dist/lib/node-esm/index.mjs.map +4 -4
  6. package/dist/lib/node-esm/meta.json +1 -1
  7. package/dist/types/src/array-to-hex.d.ts.map +1 -1
  8. package/dist/types/src/array.d.ts +3 -2
  9. package/dist/types/src/array.d.ts.map +1 -1
  10. package/dist/types/src/assume.d.ts.map +1 -1
  11. package/dist/types/src/binder.d.ts.map +1 -1
  12. package/dist/types/src/bitfield.d.ts.map +1 -1
  13. package/dist/types/src/browser-storage.d.ts +9 -0
  14. package/dist/types/src/browser-storage.d.ts.map +1 -0
  15. package/dist/types/src/callback-collection.d.ts.map +1 -1
  16. package/dist/types/src/callback.d.ts.map +1 -1
  17. package/dist/types/src/case.d.ts.map +1 -1
  18. package/dist/types/src/chunk-array.d.ts.map +1 -1
  19. package/dist/types/src/circular-buffer.d.ts +1 -0
  20. package/dist/types/src/circular-buffer.d.ts.map +1 -1
  21. package/dist/types/src/clear-undefined.d.ts.map +1 -1
  22. package/dist/types/src/complex.d.ts +15 -0
  23. package/dist/types/src/complex.d.ts.map +1 -1
  24. package/dist/types/src/composite-key.d.ts +10 -0
  25. package/dist/types/src/composite-key.d.ts.map +1 -0
  26. package/dist/types/src/composite-key.test.d.ts +2 -0
  27. package/dist/types/src/composite-key.test.d.ts.map +1 -0
  28. package/dist/types/src/deep.d.ts +0 -3
  29. package/dist/types/src/deep.d.ts.map +1 -1
  30. package/dist/types/src/defer-function.d.ts.map +1 -1
  31. package/dist/types/src/defer.d.ts +1 -1
  32. package/dist/types/src/defer.d.ts.map +1 -1
  33. package/dist/types/src/di-container.d.ts.map +1 -1
  34. package/dist/types/src/di-key.d.ts +7 -5
  35. package/dist/types/src/di-key.d.ts.map +1 -1
  36. package/dist/types/src/entry.d.ts.map +1 -1
  37. package/dist/types/src/error-format.d.ts +5 -0
  38. package/dist/types/src/error-format.d.ts.map +1 -0
  39. package/dist/types/src/filename.d.ts +9 -0
  40. package/dist/types/src/filename.d.ts.map +1 -0
  41. package/dist/types/src/for-each-async.d.ts.map +1 -1
  42. package/dist/types/src/human-hash.d.ts.map +1 -1
  43. package/dist/types/src/index.d.ts +9 -3
  44. package/dist/types/src/index.d.ts.map +1 -1
  45. package/dist/types/src/instance-id.d.ts.map +1 -1
  46. package/dist/types/src/interval.d.ts.map +1 -1
  47. package/dist/types/src/join-tables.d.ts.map +1 -1
  48. package/dist/types/src/json.d.ts +1 -1
  49. package/dist/types/src/json.d.ts.map +1 -1
  50. package/dist/types/src/map-values.d.ts.map +1 -1
  51. package/dist/types/src/map.d.ts.map +1 -1
  52. package/dist/types/src/object.d.ts +3 -0
  53. package/dist/types/src/object.d.ts.map +1 -1
  54. package/dist/types/src/order-keys.d.ts.map +1 -1
  55. package/dist/types/src/order.d.ts.map +1 -1
  56. package/dist/types/src/pick.d.ts.map +1 -1
  57. package/dist/types/src/platform.d.ts +5 -2
  58. package/dist/types/src/platform.d.ts.map +1 -1
  59. package/dist/types/src/position.d.ts +1 -1
  60. package/dist/types/src/position.d.ts.map +1 -1
  61. package/dist/types/src/random.d.ts.map +1 -1
  62. package/dist/types/src/range.d.ts.map +1 -1
  63. package/dist/types/src/reducers.d.ts.map +1 -1
  64. package/dist/types/src/remove-undefined-keys.d.ts.map +1 -1
  65. package/dist/types/src/retry.d.ts +32 -0
  66. package/dist/types/src/retry.d.ts.map +1 -0
  67. package/dist/types/src/safe-await.d.ts.map +1 -1
  68. package/dist/types/src/safe-instanceof.d.ts.map +1 -1
  69. package/dist/types/src/safe-parse.d.ts +7 -4
  70. package/dist/types/src/safe-parse.d.ts.map +1 -1
  71. package/dist/types/src/safe-stringify.d.ts +22 -0
  72. package/dist/types/src/safe-stringify.d.ts.map +1 -0
  73. package/dist/types/src/safe-stringify.test.d.ts +2 -0
  74. package/dist/types/src/safe-stringify.test.d.ts.map +1 -0
  75. package/dist/types/src/sliding-window-summary.d.ts.map +1 -1
  76. package/dist/types/src/sort.d.ts.map +1 -1
  77. package/dist/types/src/string.d.ts +8 -0
  78. package/dist/types/src/string.d.ts.map +1 -1
  79. package/dist/types/src/string.test.d.ts +2 -0
  80. package/dist/types/src/string.test.d.ts.map +1 -0
  81. package/dist/types/src/sum.d.ts.map +1 -1
  82. package/dist/types/src/throw-unhandled-error.d.ts.map +1 -1
  83. package/dist/types/src/to-fallback.d.ts +18 -4
  84. package/dist/types/src/to-fallback.d.ts.map +1 -1
  85. package/dist/types/src/tracer.d.ts.map +1 -1
  86. package/dist/types/src/tree.d.ts.map +1 -1
  87. package/dist/types/src/types.d.ts +24 -6
  88. package/dist/types/src/types.d.ts.map +1 -1
  89. package/dist/types/src/uint8array.d.ts.map +1 -1
  90. package/dist/types/src/unit.d.ts +14 -0
  91. package/dist/types/src/unit.d.ts.map +1 -0
  92. package/dist/types/src/unit.test.d.ts +2 -0
  93. package/dist/types/src/unit.test.d.ts.map +1 -0
  94. package/dist/types/src/url.d.ts +5 -0
  95. package/dist/types/src/url.d.ts.map +1 -0
  96. package/dist/types/src/url.test.d.ts +2 -0
  97. package/dist/types/src/url.test.d.ts.map +1 -0
  98. package/dist/types/src/weak.d.ts +15 -0
  99. package/dist/types/src/weak.d.ts.map +1 -1
  100. package/dist/types/tsconfig.tsbuildinfo +1 -1
  101. package/package.json +14 -16
  102. package/src/array.test.ts +1 -1
  103. package/src/array.ts +9 -4
  104. package/src/assume.ts +0 -1
  105. package/src/binder.ts +2 -2
  106. package/src/browser-storage.ts +60 -0
  107. package/src/circular-buffer.test.ts +27 -1
  108. package/src/circular-buffer.ts +5 -0
  109. package/src/complex.test.ts +1 -1
  110. package/src/complex.ts +32 -0
  111. package/src/composite-key.test.ts +31 -0
  112. package/src/composite-key.ts +16 -0
  113. package/src/deep.ts +2 -6
  114. package/src/defer.ts +1 -1
  115. package/src/di-key.ts +10 -8
  116. package/src/error-format.ts +24 -0
  117. package/src/filename.ts +16 -0
  118. package/src/human-hash.test.ts +1 -1
  119. package/src/index.ts +9 -3
  120. package/src/json.ts +2 -7
  121. package/src/object.ts +3 -0
  122. package/src/platform.ts +35 -3
  123. package/src/position.test.ts +2 -2
  124. package/src/retry.ts +74 -0
  125. package/src/safe-parse.ts +29 -15
  126. package/src/safe-stringify.test.ts +96 -0
  127. package/src/safe-stringify.ts +153 -0
  128. package/src/sort.test.ts +1 -1
  129. package/src/string.test.ts +19 -0
  130. package/src/string.ts +40 -0
  131. package/src/to-fallback.ts +44 -160
  132. package/src/tree.test.ts +1 -1
  133. package/src/types.test.ts +11 -1
  134. package/src/types.ts +40 -12
  135. package/src/uint8array.test.ts +1 -1
  136. package/src/unit.test.ts +25 -0
  137. package/src/unit.ts +87 -0
  138. package/src/url.test.ts +22 -0
  139. package/src/url.ts +15 -0
  140. package/src/weak.test.ts +1 -1
  141. package/src/weak.ts +52 -14
  142. package/dist/lib/node/index.cjs +0 -2309
  143. package/dist/lib/node/index.cjs.map +0 -7
  144. package/dist/lib/node/meta.json +0 -1
  145. package/dist/types/src/explicit-resource-management-polyfill.d.ts +0 -1
  146. package/dist/types/src/explicit-resource-management-polyfill.d.ts.map +0 -1
  147. package/dist/types/src/first-two-chars.d.ts +0 -9
  148. package/dist/types/src/first-two-chars.d.ts.map +0 -1
  149. package/src/explicit-resource-management-polyfill.ts +0 -13
  150. 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,7 @@ var humanize = (value) => {
1010
1060
  return hasher.humanize(value);
1011
1061
  };
1012
1062
 
1013
- // packages/common/util/src/map.ts
1063
+ // src/map.ts
1014
1064
  var defaultMap = (map, key, def) => {
1015
1065
  let value = map.get(key);
1016
1066
  if (value === void 0) {
@@ -1020,8 +1070,8 @@ var defaultMap = (map, key, def) => {
1020
1070
  return value;
1021
1071
  };
1022
1072
 
1023
- // packages/common/util/src/instance-id.ts
1024
- var symbol = Symbol.for("dxos.instance-contexts");
1073
+ // src/instance-id.ts
1074
+ var symbol = /* @__PURE__ */ Symbol.for("dxos.instance-contexts");
1025
1075
  var instanceContexts = globalThis[symbol] ??= /* @__PURE__ */ new WeakMap();
1026
1076
  var getPrototypeSpecificInstanceId = (instance) => {
1027
1077
  const prototype = Object.getPrototypeOf(instance);
@@ -1044,7 +1094,7 @@ var getDebugName = (instance) => {
1044
1094
  return `${prototype.constructor?.name ?? "Object"}#${getPrototypeSpecificInstanceId(instance)}`;
1045
1095
  };
1046
1096
 
1047
- // packages/common/util/src/interval.ts
1097
+ // src/interval.ts
1048
1098
  var exponentialBackoffInterval = (cb, initialInterval) => {
1049
1099
  let interval = initialInterval;
1050
1100
  const repeat = () => {
@@ -1056,7 +1106,7 @@ var exponentialBackoffInterval = (cb, initialInterval) => {
1056
1106
  return () => clearTimeout(timeoutId);
1057
1107
  };
1058
1108
 
1059
- // packages/common/util/src/join-tables.ts
1109
+ // src/join-tables.ts
1060
1110
  var joinTables = (leftColumn, rightColumn, left, right) => {
1061
1111
  const map = /* @__PURE__ */ new Map();
1062
1112
  const used = /* @__PURE__ */ new Set();
@@ -1077,11 +1127,11 @@ var joinTables = (leftColumn, rightColumn, left, right) => {
1077
1127
  return result;
1078
1128
  };
1079
1129
 
1080
- // packages/common/util/src/json.ts
1130
+ // src/json.ts
1081
1131
  import { inspect as inspect2 } from "@dxos/node-std/util";
1082
1132
  import { PublicKey as PublicKey2 } from "@dxos/keys";
1083
1133
 
1084
- // packages/common/util/src/uint8array.ts
1134
+ // src/uint8array.ts
1085
1135
  var arraysEqual = (a, b) => {
1086
1136
  if (a.length !== b.length) {
1087
1137
  return false;
@@ -1102,10 +1152,10 @@ var bufferToArray = (buffer) => {
1102
1152
  var stringToArray = (string) => bufferToArray(Buffer.from(string, "hex"));
1103
1153
  var arrayToString = (array) => arrayToBuffer(array).toString("hex");
1104
1154
 
1105
- // packages/common/util/src/json.ts
1155
+ // src/json.ts
1106
1156
  var MAX_DEPTH = 5;
1107
1157
  var LOG_MAX_DEPTH = 7;
1108
- function jsonReplacer(key, value) {
1158
+ var jsonReplacer = (key, value) => {
1109
1159
  if (value !== null && typeof value === "object" && typeof value[inspect2.custom] === "function") {
1110
1160
  return value[inspect2.custom]();
1111
1161
  }
@@ -1118,7 +1168,7 @@ function jsonReplacer(key, value) {
1118
1168
  }
1119
1169
  }
1120
1170
  return value;
1121
- }
1171
+ };
1122
1172
  var jsonify = (value, depth = 0, visitedObjects = /* @__PURE__ */ new WeakSet()) => {
1123
1173
  if (depth > MAX_DEPTH) {
1124
1174
  return null;
@@ -1193,7 +1243,7 @@ var jsonKeyReplacer = (options = {}) => (key, value) => {
1193
1243
  return value;
1194
1244
  };
1195
1245
 
1196
- // packages/common/util/src/map-values.ts
1246
+ // src/map-values.ts
1197
1247
  var mapValues = (obj, fn) => {
1198
1248
  const result = {};
1199
1249
  Object.keys(obj).forEach((key) => {
@@ -1205,31 +1255,10 @@ var deepMapValues = (value, fn) => {
1205
1255
  return new DeepMapper(fn).map(value);
1206
1256
  };
1207
1257
  var DeepMapper = class {
1258
+ _fn;
1259
+ _cyclic = /* @__PURE__ */ new Map();
1208
1260
  constructor(_fn) {
1209
1261
  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
1262
  }
1234
1263
  map(value) {
1235
1264
  return this._map(value, void 0);
@@ -1240,36 +1269,37 @@ var DeepMapper = class {
1240
1269
  }
1241
1270
  return this._fn(value, this._recurse, key);
1242
1271
  }
1272
+ _recurse = (value) => {
1273
+ if (this._cyclic.has(value)) {
1274
+ return this._cyclic.get(value);
1275
+ }
1276
+ if (Array.isArray(value)) {
1277
+ const res = new Array(value.length);
1278
+ this._cyclic.set(value, res);
1279
+ for (let i = 0; i < value.length; i++) {
1280
+ res[i] = this._map(value[i], i);
1281
+ }
1282
+ return res;
1283
+ } else if (value !== null && typeof value === "object") {
1284
+ const res = {};
1285
+ this._cyclic.set(value, res);
1286
+ for (const key in value) {
1287
+ res[key] = this._map(value[key], key);
1288
+ }
1289
+ return res;
1290
+ } else {
1291
+ return value;
1292
+ }
1293
+ };
1243
1294
  };
1244
1295
  var deepMapValuesAsync = (value, fn) => {
1245
1296
  return new DeepMapperAsync(fn).map(value);
1246
1297
  };
1247
1298
  var DeepMapperAsync = class {
1299
+ _fn;
1300
+ _cyclic = /* @__PURE__ */ new Map();
1248
1301
  constructor(_fn) {
1249
1302
  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
1303
  }
1274
1304
  map(value) {
1275
1305
  return this._map(value, void 0);
@@ -1280,6 +1310,28 @@ var DeepMapperAsync = class {
1280
1310
  }
1281
1311
  return this._fn(value, this._recurse, key);
1282
1312
  }
1313
+ _recurse = async (value) => {
1314
+ if (this._cyclic.has(value)) {
1315
+ return this._cyclic.get(value);
1316
+ }
1317
+ if (Array.isArray(value)) {
1318
+ const res = new Array(value.length);
1319
+ this._cyclic.set(value, res);
1320
+ for (let i = 0; i < value.length; i++) {
1321
+ res[i] = await this._map(value[i], i);
1322
+ }
1323
+ return res;
1324
+ } else if (value !== null && typeof value === "object") {
1325
+ const res = {};
1326
+ this._cyclic.set(value, res);
1327
+ for (const key in value) {
1328
+ res[key] = await this._map(value[key], key);
1329
+ }
1330
+ return res;
1331
+ } else {
1332
+ return value;
1333
+ }
1334
+ };
1283
1335
  };
1284
1336
  var visitValues = (object, visitor) => {
1285
1337
  if (Array.isArray(object)) {
@@ -1291,11 +1343,11 @@ var visitValues = (object, visitor) => {
1291
1343
  }
1292
1344
  };
1293
1345
 
1294
- // packages/common/util/src/object.ts
1346
+ // src/object.ts
1295
1347
  var keys = (obj) => Object.keys(obj);
1296
1348
  var entries = (obj) => Object.entries(obj);
1297
1349
 
1298
- // packages/common/util/src/order-keys.ts
1350
+ // src/order-keys.ts
1299
1351
  var orderKeys = (obj, order) => {
1300
1352
  const ordered = {};
1301
1353
  for (const key of order) {
@@ -1311,7 +1363,7 @@ var orderKeys = (obj, order) => {
1311
1363
  return ordered;
1312
1364
  };
1313
1365
 
1314
- // packages/common/util/src/order.ts
1366
+ // src/order.ts
1315
1367
  var inferObjectOrder = (objectMap, order = []) => {
1316
1368
  const orderedObjects = order.reduce((acc, id) => {
1317
1369
  if (id in objectMap) {
@@ -1338,7 +1390,7 @@ var inferRecordOrder = (objectMap, order = []) => {
1338
1390
  }, {}), objectMap);
1339
1391
  };
1340
1392
 
1341
- // packages/common/util/src/pick.ts
1393
+ // src/pick.ts
1342
1394
  var pick = (obj, keys2) => {
1343
1395
  return keys2.reduce((result, key) => {
1344
1396
  if (obj && key in obj) {
@@ -1366,9 +1418,20 @@ var omit = (obj, keys2) => {
1366
1418
  return result;
1367
1419
  };
1368
1420
 
1369
- // packages/common/util/src/platform.ts
1421
+ // src/platform.ts
1370
1422
  var isNode = () => typeof process !== "undefined" && process.versions != null && process.versions.node != null;
1371
- var mobileAndTabletCheck = () => {
1423
+ var isBun = () => globalThis.Bun !== void 0;
1424
+ var isTauri = () => !!globalThis.__TAURI__;
1425
+ var isMobile = () => {
1426
+ let check = false;
1427
+ (function(a) {
1428
+ 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))) {
1429
+ check = true;
1430
+ }
1431
+ })(navigator.userAgent || navigator.vendor || window.opera);
1432
+ return check;
1433
+ };
1434
+ var isMobileOrTablet = () => {
1372
1435
  let check = false;
1373
1436
  ((a) => {
1374
1437
  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 +1453,7 @@ var iosCheck = () => {
1390
1453
  };
1391
1454
  var safariCheck = () => typeof navigator !== "undefined" && /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
1392
1455
  var getHostPlatform = () => {
1393
- if (!("navigator" in window)) {
1456
+ if (!("navigator" in globalThis)) {
1394
1457
  return "unknown";
1395
1458
  }
1396
1459
  const platform = (navigator.userAgentData?.platform || navigator.platform)?.toLowerCase();
@@ -1407,7 +1470,7 @@ var getHostPlatform = () => {
1407
1470
  }
1408
1471
  };
1409
1472
 
1410
- // packages/common/util/src/position.ts
1473
+ // src/position.ts
1411
1474
  var byPosition = ({ position: a = "static" }, { position: b = "static" }) => {
1412
1475
  if (a === b) {
1413
1476
  return 0;
@@ -1420,14 +1483,14 @@ var byPosition = ({ position: a = "static" }, { position: b = "static" }) => {
1420
1483
  }
1421
1484
  };
1422
1485
 
1423
- // packages/common/util/src/random.ts
1486
+ // src/random.ts
1424
1487
  var randomInt = (max, min = 0) => {
1425
1488
  min = Math.ceil(min);
1426
1489
  max = Math.floor(max);
1427
1490
  return Math.floor(Math.random() * (max - min + 1)) + min;
1428
1491
  };
1429
1492
 
1430
- // packages/common/util/src/range.ts
1493
+ // src/range.ts
1431
1494
  var range = (n = 0, mapper) => {
1432
1495
  const range2 = Array.from(Array(n).keys());
1433
1496
  return mapper == null ? range2 : range2.map(mapper);
@@ -1439,7 +1502,7 @@ var clamp = (value, min, max) => {
1439
1502
  return Math.min(Math.max(value, min), max);
1440
1503
  };
1441
1504
 
1442
- // packages/common/util/src/reducers.ts
1505
+ // src/reducers.ts
1443
1506
  var accessBy = (value, accessor) => typeof accessor === "function" ? accessor(value) : value[accessor];
1444
1507
  var median = (values) => {
1445
1508
  const mid = Math.floor(values.length / 2);
@@ -1525,7 +1588,7 @@ var createBucketReducer = (period) => ({
1525
1588
  }
1526
1589
  });
1527
1590
 
1528
- // packages/common/util/src/remove-undefined-keys.ts
1591
+ // src/remove-undefined-keys.ts
1529
1592
  var removeUndefinedProperties = (object) => {
1530
1593
  for (const prop of [
1531
1594
  ...Object.getOwnPropertyNames(object),
@@ -1566,7 +1629,44 @@ var removeProperties = (root, condition) => {
1566
1629
  return result;
1567
1630
  };
1568
1631
 
1569
- // packages/common/util/src/safe-await.ts
1632
+ // src/retry.ts
1633
+ var DEFAULT_RETRY_OPTIONS = {
1634
+ count: 3,
1635
+ delayMs: 100,
1636
+ exponent: 2,
1637
+ retryOnError: async () => true,
1638
+ retryOnValue: async () => false
1639
+ };
1640
+ var retry = async (options, cb) => {
1641
+ const fullOptions = {
1642
+ ...DEFAULT_RETRY_OPTIONS,
1643
+ ...options
1644
+ };
1645
+ let numRetries = 0, currentDelay = fullOptions.delayMs;
1646
+ while (true) {
1647
+ let result;
1648
+ try {
1649
+ result = await cb();
1650
+ } catch (err) {
1651
+ if (numRetries > fullOptions.count || !await fullOptions.retryOnError(err)) {
1652
+ throw err;
1653
+ }
1654
+ await new Promise((resolve) => setTimeout(resolve, currentDelay));
1655
+ currentDelay *= fullOptions.exponent;
1656
+ numRetries++;
1657
+ continue;
1658
+ }
1659
+ if (!await fullOptions.retryOnValue(result)) {
1660
+ return result;
1661
+ }
1662
+ await new Promise((resolve) => setTimeout(resolve, currentDelay));
1663
+ currentDelay *= fullOptions.exponent;
1664
+ numRetries++;
1665
+ continue;
1666
+ }
1667
+ };
1668
+
1669
+ // src/safe-await.ts
1570
1670
  var safeAwaitAll = async (source, taskFactory, onError) => {
1571
1671
  const failedItems = [];
1572
1672
  await Promise.all([
@@ -1584,8 +1684,8 @@ var safeAwaitAll = async (source, taskFactory, onError) => {
1584
1684
  return failedItems;
1585
1685
  };
1586
1686
 
1587
- // packages/common/util/src/safe-instanceof.ts
1588
- var instanceTag = Symbol("instanceTag");
1687
+ // src/safe-instanceof.ts
1688
+ var instanceTag = /* @__PURE__ */ Symbol("instanceTag");
1589
1689
  var safeInstanceof = (tag) => (target) => {
1590
1690
  target.prototype[instanceTag] = tag;
1591
1691
  Object.defineProperty(target.prototype, Symbol.hasInstance, {
@@ -1596,49 +1696,140 @@ var safeInstanceof = (tag) => (target) => {
1596
1696
  });
1597
1697
  };
1598
1698
 
1599
- // packages/common/util/src/safe-parse.ts
1600
- var safeParseInt = (value, defaultValue) => {
1699
+ // src/safe-parse.ts
1700
+ function safeParseInt(str, defaultValue) {
1601
1701
  try {
1602
- const n = parseInt(value ?? "");
1603
- return isNaN(n) ? defaultValue : n;
1604
- } catch (err) {
1702
+ const value = parseInt(str ?? "");
1703
+ return isNaN(value) ? defaultValue : value;
1704
+ } catch {
1605
1705
  return defaultValue;
1606
1706
  }
1707
+ }
1708
+ function safeParseFloat(str, defaultValue) {
1709
+ try {
1710
+ const value = parseFloat(str ?? "");
1711
+ return isNaN(value) ? defaultValue : value;
1712
+ } catch {
1713
+ return defaultValue;
1714
+ }
1715
+ }
1716
+ var safeParseJson = (str, defaultValue) => {
1717
+ if (str && str.length > 0) {
1718
+ try {
1719
+ return JSON.parse(str);
1720
+ } catch {
1721
+ }
1722
+ }
1723
+ return defaultValue;
1607
1724
  };
1608
- var safeParseFloat = (str, defaultValue) => {
1725
+ var safeUrl = (str) => {
1609
1726
  try {
1610
- return parseFloat(str);
1727
+ return new URL(str ?? "");
1611
1728
  } catch {
1612
- return defaultValue ?? 0;
1729
+ return void 0;
1613
1730
  }
1614
1731
  };
1615
- var safeParseJson = (data, defaultValue) => {
1616
- if (data && data.length > 0) {
1732
+
1733
+ // src/safe-stringify.ts
1734
+ var SKIP = Object.freeze({});
1735
+ function safeStringify(obj, filter = defaultFilter, indent = 2) {
1736
+ const seen = /* @__PURE__ */ new WeakMap();
1737
+ function replacer(key, value) {
1617
1738
  try {
1618
- return JSON.parse(data);
1619
- } catch (err) {
1739
+ let path = key;
1740
+ if (!key) {
1741
+ path = "$";
1742
+ if (value != null && typeof value === "object") {
1743
+ seen.set(value, path);
1744
+ }
1745
+ return value;
1746
+ } else if (this) {
1747
+ const parentPath = seen.get(this);
1748
+ path = parentPath ? `${parentPath}.${key}` : key;
1749
+ }
1750
+ if (value == null) {
1751
+ return value;
1752
+ }
1753
+ if (typeof value === "function") {
1754
+ return void 0;
1755
+ }
1756
+ if (typeof value === "object" && Object.getPrototypeOf(value) !== Object.prototype && !Array.isArray(value)) {
1757
+ return void 0;
1758
+ }
1759
+ if (typeof value === "object" && value !== null) {
1760
+ const exists = seen.get(value);
1761
+ if (exists) {
1762
+ return `[${path} => ${exists}]`;
1763
+ }
1764
+ seen.set(value, path);
1765
+ }
1766
+ if (filter) {
1767
+ const filteredValue = filter?.(key, value);
1768
+ if (filteredValue !== void 0) {
1769
+ return filteredValue === SKIP ? void 0 : filteredValue;
1770
+ }
1771
+ }
1772
+ return value;
1773
+ } catch (error) {
1774
+ return `ERROR: ${error.message}`;
1620
1775
  }
1621
1776
  }
1622
- return defaultValue;
1777
+ try {
1778
+ return JSON.stringify(obj, replacer, indent);
1779
+ } catch (error) {
1780
+ return `ERROR: ${error.message}`;
1781
+ }
1782
+ }
1783
+ var createReplacer = ({ omit: omit2, parse, maxDepth, maxArrayLen, maxStringLen } = {}) => {
1784
+ let currentDepth = 0;
1785
+ const depthMap = /* @__PURE__ */ new WeakMap();
1786
+ return function(key, value) {
1787
+ if (key === "") {
1788
+ currentDepth = 0;
1789
+ } else if (this && typeof this === "object") {
1790
+ const parentDepth = depthMap.get(this) ?? 0;
1791
+ currentDepth = parentDepth + 1;
1792
+ }
1793
+ if (typeof value === "function") {
1794
+ return SKIP;
1795
+ }
1796
+ if (maxArrayLen != null && Array.isArray(value) && value.length > maxArrayLen) {
1797
+ return `[length: ${value.length}]`;
1798
+ }
1799
+ if (value && typeof value === "object") {
1800
+ depthMap.set(value, currentDepth);
1801
+ if (maxDepth != null && currentDepth >= maxDepth) {
1802
+ return Array.isArray(value) ? `[{ length: ${value.length} }]` : `{ keys: ${Object.keys(value).length} }`;
1803
+ }
1804
+ }
1805
+ if (omit2?.includes(key)) {
1806
+ return SKIP;
1807
+ }
1808
+ if (parse?.includes(key) && typeof value === "string") {
1809
+ try {
1810
+ return JSON.parse(value);
1811
+ } catch {
1812
+ return value;
1813
+ }
1814
+ }
1815
+ if (maxStringLen != null && typeof value === "string" && value.length > maxStringLen) {
1816
+ return value.slice(0, maxStringLen) + "...";
1817
+ }
1818
+ return value;
1819
+ };
1623
1820
  };
1821
+ var defaultFilter = createReplacer();
1624
1822
 
1625
- // packages/common/util/src/sliding-window-summary.ts
1823
+ // src/sliding-window-summary.ts
1626
1824
  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
1825
  var SlidingWindowSummary = class {
1826
+ _buffer;
1827
+ _sum = 0;
1828
+ _precision;
1629
1829
  constructor(options) {
1630
- this._sum = 0;
1631
1830
  this._buffer = new CircularBuffer(options.dataPoints);
1632
1831
  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
- });
1832
+ invariant5(options.precision >= 0);
1642
1833
  this._precision = Math.pow(10, options.precision);
1643
1834
  }
1644
1835
  }
@@ -1678,7 +1869,7 @@ var SlidingWindowSummary = class {
1678
1869
  }
1679
1870
  };
1680
1871
 
1681
- // packages/common/util/src/sort.ts
1872
+ // src/sort.ts
1682
1873
  var compareScalar = (inc = true) => (a, b) => (inc ? 1 : -1) * (a < b ? -1 : a > b ? 1 : 0);
1683
1874
  var compareString = (inc = true, caseInsensitive = true) => (a, b) => {
1684
1875
  if (caseInsensitive) {
@@ -1700,38 +1891,48 @@ var compareMulti = (sorters) => (a, b) => {
1700
1891
  return sort();
1701
1892
  };
1702
1893
 
1703
- // packages/common/util/src/string.ts
1894
+ // src/string.ts
1704
1895
  var capitalize = (str) => {
1705
1896
  if (str.length === 0) {
1706
1897
  return "";
1707
1898
  }
1708
1899
  return str.charAt(0).toUpperCase() + str.slice(1);
1709
1900
  };
1901
+ function trim(strings, ...values) {
1902
+ const raw = strings.reduce((out, str, i) => {
1903
+ out += str;
1904
+ if (i < values.length) {
1905
+ const match = str.match(/(^|\n)([ \t]*)$/);
1906
+ const baseIndent = match ? match[2] : "";
1907
+ const val = String(values[i]).replace(/\r?\n/g, "\n" + baseIndent);
1908
+ out += val;
1909
+ }
1910
+ return out;
1911
+ }, "");
1912
+ const lines = raw.split("\n");
1913
+ while (lines.length && !lines[0].trim()) {
1914
+ lines.shift();
1915
+ }
1916
+ while (lines.length && !lines[lines.length - 1].trim()) {
1917
+ lines.pop();
1918
+ }
1919
+ const minIndent = Math.min(...lines.filter((l) => l.trim()).map((l) => l.match(/^[ \t]*/)?.[0].length ?? 0));
1920
+ return lines.map((l) => l.slice(minIndent)).join("\n");
1921
+ }
1922
+ var kebabize = (str) => str.replace(/[A-Z]+(?![a-z])|[A-Z]/g, ($, ofs) => (ofs ? "-" : "") + $.toLowerCase());
1710
1923
 
1711
- // packages/common/util/src/sum.ts
1924
+ // src/sum.ts
1712
1925
  var sum = (values) => values.reduce((a, b) => a + b, 0);
1713
1926
 
1714
- // packages/common/util/src/throw-unhandled-error.ts
1927
+ // src/throw-unhandled-error.ts
1715
1928
  var throwUnhandledError = (error) => {
1716
1929
  queueMicrotask(() => {
1717
1930
  throw error;
1718
1931
  });
1719
1932
  };
1720
1933
 
1721
- // packages/common/util/src/to-fallback.ts
1934
+ // src/to-fallback.ts
1722
1935
  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
1936
  "\u{1F47B}",
1736
1937
  "\u{1F479}",
1737
1938
  "\u{1F47D}",
@@ -1867,17 +2068,18 @@ var idEmoji = [
1867
2068
  ];
1868
2069
  var idHue = [
1869
2070
  "red",
1870
- // 'orange' as const, /* More shades in these palettes are considered “ugly” */
2071
+ "orange",
1871
2072
  "amber",
1872
- // 'yellow' as const, /* More shades in these palettes are considered “ugly” */
2073
+ "yellow",
1873
2074
  "lime",
1874
2075
  "green",
1875
2076
  "emerald",
1876
2077
  "teal",
1877
2078
  "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 */
2079
+ // Omit colors similar to primary accent.
2080
+ // 'sky' as const,
2081
+ // 'blue' as const,
2082
+ // 'indigo' as const,
1881
2083
  "violet",
1882
2084
  "purple",
1883
2085
  "fuchsia",
@@ -1903,12 +2105,10 @@ var toFallback = (hash) => {
1903
2105
  };
1904
2106
  };
1905
2107
 
1906
- // packages/common/util/src/tracer.ts
2108
+ // src/tracer.ts
1907
2109
  var Tracer = class {
1908
- constructor() {
1909
- this._events = /* @__PURE__ */ new Map();
1910
- this._recording = false;
1911
- }
2110
+ _events = /* @__PURE__ */ new Map();
2111
+ _recording = false;
1912
2112
  // TODO(burdon): Start/stop methods for recording data? By id?
1913
2113
  // Alternatively, enable subscriptions to track/compute series.
1914
2114
  // TODO(burdon): Hierarchical traces?
@@ -1968,7 +2168,7 @@ var Tracer = class {
1968
2168
  };
1969
2169
  var tracer = new Tracer();
1970
2170
 
1971
- // packages/common/util/src/tree.ts
2171
+ // src/tree.ts
1972
2172
  import { truncateKey } from "@dxos/debug";
1973
2173
  var stringifyTree = (node, ancestors = [], rows = []) => {
1974
2174
  if (node.children?.length) {
@@ -2008,8 +2208,8 @@ var stringifyTree = (node, ancestors = [], rows = []) => {
2008
2208
  return rows;
2009
2209
  };
2010
2210
 
2011
- // packages/common/util/src/types.ts
2012
- var isNotFalsy = (value) => !!value;
2211
+ // src/types.ts
2212
+ var isTruthy = (value) => !!value;
2013
2213
  var isNonNullable = (value) => value != null;
2014
2214
  var doAsync = async (fn) => fn();
2015
2215
  var getProviderValue = (provider, arg) => {
@@ -2039,19 +2239,143 @@ var arrayMove = (array, from, to) => {
2039
2239
  array.splice(to < 0 ? array.length + to : to, 0, array.splice(from, 1)[0]);
2040
2240
  return array;
2041
2241
  };
2242
+ function arraySwap(array, from, to) {
2243
+ const current = array[from];
2244
+ array[from] = array[to];
2245
+ array[to] = current;
2246
+ return array;
2247
+ }
2042
2248
 
2043
- // packages/common/util/src/weak.ts
2249
+ // src/unit.ts
2250
+ var createFormat = (unit) => {
2251
+ return (n, precision = unit.precision ?? 0) => {
2252
+ const value = n / unit.quotient;
2253
+ const formattedValue = value.toLocaleString("en-US", {
2254
+ minimumFractionDigits: precision,
2255
+ maximumFractionDigits: precision
2256
+ });
2257
+ return {
2258
+ unit,
2259
+ value,
2260
+ formattedValue,
2261
+ toString: () => `${formattedValue}${unit.symbol}`
2262
+ };
2263
+ };
2264
+ };
2265
+ var MS_SECONDS = 1e3;
2266
+ var MS_MINUTES = 60 * MS_SECONDS;
2267
+ var MS_HOURS = 60 * MS_MINUTES;
2268
+ var Unit = {
2269
+ // General.
2270
+ Percent: createFormat({
2271
+ symbol: "%",
2272
+ quotient: 1 / 100,
2273
+ precision: 2
2274
+ }),
2275
+ Thousand: createFormat({
2276
+ symbol: "k",
2277
+ quotient: 1e3,
2278
+ precision: 2
2279
+ }),
2280
+ // Bytes (note KB vs KiB).
2281
+ Gigabyte: createFormat({
2282
+ symbol: "GB",
2283
+ quotient: 1e3 * 1e3 * 1e3,
2284
+ precision: 2
2285
+ }),
2286
+ Megabyte: createFormat({
2287
+ symbol: "MB",
2288
+ quotient: 1e3 * 1e3,
2289
+ precision: 2
2290
+ }),
2291
+ Kilobyte: createFormat({
2292
+ symbol: "KB",
2293
+ quotient: 1e3,
2294
+ precision: 2
2295
+ }),
2296
+ Byte: createFormat({
2297
+ symbol: "B",
2298
+ quotient: 1
2299
+ }),
2300
+ // Time.
2301
+ Hour: createFormat({
2302
+ symbol: "h",
2303
+ quotient: MS_HOURS
2304
+ }),
2305
+ Minute: createFormat({
2306
+ symbol: "m",
2307
+ quotient: MS_MINUTES
2308
+ }),
2309
+ Second: createFormat({
2310
+ symbol: "s",
2311
+ quotient: MS_SECONDS,
2312
+ precision: 1
2313
+ }),
2314
+ Millisecond: createFormat({
2315
+ symbol: "ms",
2316
+ quotient: 1
2317
+ }),
2318
+ Duration: (n) => {
2319
+ const hours = Math.floor(n / MS_HOURS);
2320
+ const minutes = Math.floor(n % MS_HOURS / MS_MINUTES);
2321
+ if (hours) {
2322
+ const formattedValue = minutes ? `${hours}h ${minutes}m` : `${hours}h`;
2323
+ return {
2324
+ unit: {
2325
+ symbol: "h",
2326
+ quotient: MS_HOURS
2327
+ },
2328
+ value: hours,
2329
+ formattedValue,
2330
+ toString: () => formattedValue
2331
+ };
2332
+ }
2333
+ if (minutes) {
2334
+ const seconds2 = (n - MS_MINUTES * minutes) / MS_SECONDS;
2335
+ const formattedValue = seconds2 ? `${minutes}m ${seconds2}s` : `${minutes}m`;
2336
+ return {
2337
+ unit: {
2338
+ symbol: "m",
2339
+ quotient: MS_MINUTES
2340
+ },
2341
+ value: minutes,
2342
+ formattedValue,
2343
+ toString: () => formattedValue
2344
+ };
2345
+ }
2346
+ const seconds = n >= MS_SECONDS;
2347
+ if (seconds) {
2348
+ return Unit.Second(n);
2349
+ }
2350
+ return Unit.Millisecond(n);
2351
+ }
2352
+ };
2353
+
2354
+ // src/url.ts
2355
+ var createUrl = (url, search) => {
2356
+ const base = typeof url === "string" ? new URL(url) : url;
2357
+ if (search) {
2358
+ base.search = new URLSearchParams(Object.entries(search).filter(([_, value]) => value != null)).toString();
2359
+ }
2360
+ return base;
2361
+ };
2362
+
2363
+ // src/weak.ts
2044
2364
  var WeakDictionary = class {
2365
+ _internal = /* @__PURE__ */ new Map();
2366
+ _finalization = new FinalizationRegistry(({ key, ref }) => {
2367
+ if (this._internal.get(key) === ref) {
2368
+ this._internal.delete(key);
2369
+ }
2370
+ });
2045
2371
  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));
2372
+ if (entries2) {
2373
+ for (const [key, value] of entries2) {
2374
+ const ref = new WeakRef(value);
2375
+ this._internal.set(key, ref);
2376
+ this._register(key, value, ref);
2377
+ }
2378
+ }
2055
2379
  }
2056
2380
  *entries() {
2057
2381
  for (const [key, value] of this._internal) {
@@ -2091,10 +2415,45 @@ var WeakDictionary = class {
2091
2415
  return this._internal.get(key)?.deref();
2092
2416
  }
2093
2417
  set(key, value) {
2094
- this._internal.set(key, new WeakRef(value));
2095
- this._register(key, value);
2418
+ const previous = this._internal.get(key)?.deref();
2419
+ if (previous) {
2420
+ this._unregister(previous);
2421
+ }
2422
+ const ref = new WeakRef(value);
2423
+ this._internal.set(key, ref);
2424
+ this._register(key, value, ref);
2096
2425
  return this;
2097
2426
  }
2427
+ /**
2428
+ * Returns the value for the given key if present, otherwise inserts and returns the default value.
2429
+ * @param key - The key to look up or insert.
2430
+ * @param defaultValue - The value to insert if the key is not present.
2431
+ * @returns The existing or newly inserted value.
2432
+ */
2433
+ getOrInsert(key, defaultValue) {
2434
+ const existing = this.get(key);
2435
+ if (existing !== void 0) {
2436
+ return existing;
2437
+ }
2438
+ this.set(key, defaultValue);
2439
+ return defaultValue;
2440
+ }
2441
+ /**
2442
+ * Returns the value for the given key if present, otherwise computes, inserts, and returns a new value.
2443
+ * The callback is only invoked when the key is missing.
2444
+ * @param key - The key to look up or insert.
2445
+ * @param callbackfn - Function to compute the value if the key is not present.
2446
+ * @returns The existing or newly computed value.
2447
+ */
2448
+ getOrInsertComputed(key, callbackfn) {
2449
+ const existing = this.get(key);
2450
+ if (existing !== void 0) {
2451
+ return existing;
2452
+ }
2453
+ const value = callbackfn(key);
2454
+ this.set(key, value);
2455
+ return value;
2456
+ }
2098
2457
  has(key) {
2099
2458
  return this._internal.has(key) && this._internal.get(key).deref() !== void 0;
2100
2459
  }
@@ -2125,19 +2484,16 @@ var WeakDictionary = class {
2125
2484
  }
2126
2485
  });
2127
2486
  }
2128
- _register(key, value) {
2129
- this._finalization.register(value, () => {
2130
- this._internal.delete(key);
2487
+ _register(key, value, ref) {
2488
+ this._finalization.register(value, {
2489
+ key,
2490
+ ref
2131
2491
  }, value);
2132
2492
  }
2133
2493
  _unregister(value) {
2134
2494
  this._finalization.unregister(value);
2135
2495
  }
2136
2496
  };
2137
-
2138
- // packages/common/util/src/assume.ts
2139
- function assumeType(value) {
2140
- }
2141
2497
  export {
2142
2498
  BitField,
2143
2499
  Callback,
@@ -2147,11 +2503,14 @@ export {
2147
2503
  ComplexSet,
2148
2504
  HumanHasher,
2149
2505
  MapEntry,
2506
+ SKIP,
2150
2507
  SlidingWindowSummary,
2151
2508
  Tracer,
2509
+ Unit,
2152
2510
  WeakDictionary,
2153
2511
  accessBy,
2154
2512
  arrayMove,
2513
+ arraySwap,
2155
2514
  arrayToBuffer,
2156
2515
  arrayToHex,
2157
2516
  arrayToString,
@@ -2162,18 +2521,28 @@ export {
2162
2521
  capitalize,
2163
2522
  chunkArray,
2164
2523
  clamp,
2524
+ clearCaches,
2525
+ clearIndexedDB,
2526
+ clearOPFS,
2527
+ clearServiceWorkers,
2165
2528
  clearUndefined,
2529
+ coerceArray,
2166
2530
  compareMulti,
2167
2531
  compareObject,
2168
2532
  compareScalar,
2169
2533
  compareString,
2534
+ compositeKey,
2170
2535
  createBinder,
2171
2536
  createBucketReducer,
2537
+ createFilename,
2172
2538
  createGroupReducer,
2539
+ createReplacer,
2173
2540
  createSetDispatch,
2541
+ createUrl,
2174
2542
  decamelize,
2175
2543
  deepMapValues,
2176
2544
  deepMapValuesAsync,
2545
+ defaultFilter,
2177
2546
  defaultMap,
2178
2547
  defer,
2179
2548
  deferAsync,
@@ -2185,12 +2554,11 @@ export {
2185
2554
  entry,
2186
2555
  exponentialBackoffInterval,
2187
2556
  forEachAsync,
2188
- get,
2557
+ formatErrorWithCauses,
2189
2558
  getAsyncProviderValue,
2190
2559
  getDate,
2191
2560
  getDebugName,
2192
2561
  getDeep,
2193
- getFirstTwoRenderableChars,
2194
2562
  getHostPlatform,
2195
2563
  getPrototypeSpecificInstanceId,
2196
2564
  getProviderValue,
@@ -2206,14 +2574,19 @@ export {
2206
2574
  intersectBy,
2207
2575
  intersection,
2208
2576
  iosCheck,
2577
+ isBun,
2578
+ isMobile,
2579
+ isMobileOrTablet,
2209
2580
  isNode,
2210
2581
  isNonNullable,
2211
- isNotFalsy,
2582
+ isTauri,
2583
+ isTruthy,
2212
2584
  joinTables,
2213
2585
  jsonKeyReplacer,
2214
2586
  jsonReplacer,
2215
2587
  jsonify,
2216
2588
  jsonlogify,
2589
+ kebabize,
2217
2590
  keyToEmoji,
2218
2591
  keyToFallback,
2219
2592
  keyToHue,
@@ -2222,7 +2595,6 @@ export {
2222
2595
  makeSet,
2223
2596
  mapValues,
2224
2597
  median,
2225
- mobileAndTabletCheck,
2226
2598
  numericalValues,
2227
2599
  omit,
2228
2600
  orderKeys,
@@ -2238,15 +2610,18 @@ export {
2238
2610
  removeBy,
2239
2611
  removeProperties,
2240
2612
  removeUndefinedProperties,
2613
+ retry,
2241
2614
  safariCheck,
2242
2615
  safeAwaitAll,
2243
2616
  safeInstanceof,
2244
2617
  safeParseFloat,
2245
2618
  safeParseInt,
2246
2619
  safeParseJson,
2247
- set,
2620
+ safeStringify,
2621
+ safeUrl,
2248
2622
  setDeep,
2249
2623
  sortKeys,
2624
+ splitCompositeKey,
2250
2625
  stringToArray,
2251
2626
  stringifyTree,
2252
2627
  stripUndefined,
@@ -2256,6 +2631,7 @@ export {
2256
2631
  toFallback,
2257
2632
  toHue,
2258
2633
  tracer,
2634
+ trim,
2259
2635
  visitValues
2260
2636
  };
2261
2637
  //# sourceMappingURL=index.mjs.map