@dxos/util 0.8.4-main.c4373fc → 0.8.4-main.cb12b3f963

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 (119) hide show
  1. package/dist/lib/browser/index.mjs +601 -499
  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 +601 -499
  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/binder.d.ts.map +1 -1
  11. package/dist/types/src/bitfield.d.ts.map +1 -1
  12. package/dist/types/src/browser-storage.d.ts +9 -0
  13. package/dist/types/src/browser-storage.d.ts.map +1 -0
  14. package/dist/types/src/callback-collection.d.ts.map +1 -1
  15. package/dist/types/src/callback.d.ts.map +1 -1
  16. package/dist/types/src/case.d.ts.map +1 -1
  17. package/dist/types/src/chunk-array.d.ts.map +1 -1
  18. package/dist/types/src/circular-buffer.d.ts +1 -0
  19. package/dist/types/src/circular-buffer.d.ts.map +1 -1
  20. package/dist/types/src/clear-undefined.d.ts.map +1 -1
  21. package/dist/types/src/complex.d.ts +15 -0
  22. package/dist/types/src/complex.d.ts.map +1 -1
  23. package/dist/types/src/composite-key.d.ts +10 -0
  24. package/dist/types/src/composite-key.d.ts.map +1 -0
  25. package/dist/types/src/composite-key.test.d.ts +2 -0
  26. package/dist/types/src/composite-key.test.d.ts.map +1 -0
  27. package/dist/types/src/deep.d.ts +0 -3
  28. package/dist/types/src/deep.d.ts.map +1 -1
  29. package/dist/types/src/defer-function.d.ts.map +1 -1
  30. package/dist/types/src/defer.d.ts +1 -1
  31. package/dist/types/src/defer.d.ts.map +1 -1
  32. package/dist/types/src/di-container.d.ts.map +1 -1
  33. package/dist/types/src/di-key.d.ts +7 -5
  34. package/dist/types/src/di-key.d.ts.map +1 -1
  35. package/dist/types/src/entry.d.ts.map +1 -1
  36. package/dist/types/src/error-format.d.ts +5 -0
  37. package/dist/types/src/error-format.d.ts.map +1 -0
  38. package/dist/types/src/filename.d.ts +9 -0
  39. package/dist/types/src/filename.d.ts.map +1 -0
  40. package/dist/types/src/for-each-async.d.ts.map +1 -1
  41. package/dist/types/src/human-hash.d.ts.map +1 -1
  42. package/dist/types/src/index.d.ts +6 -0
  43. package/dist/types/src/index.d.ts.map +1 -1
  44. package/dist/types/src/instance-id.d.ts.map +1 -1
  45. package/dist/types/src/interval.d.ts.map +1 -1
  46. package/dist/types/src/join-tables.d.ts.map +1 -1
  47. package/dist/types/src/json.d.ts.map +1 -1
  48. package/dist/types/src/map-values.d.ts.map +1 -1
  49. package/dist/types/src/map.d.ts.map +1 -1
  50. package/dist/types/src/object.d.ts.map +1 -1
  51. package/dist/types/src/order-keys.d.ts.map +1 -1
  52. package/dist/types/src/order.d.ts.map +1 -1
  53. package/dist/types/src/pick.d.ts.map +1 -1
  54. package/dist/types/src/platform.d.ts +5 -2
  55. package/dist/types/src/platform.d.ts.map +1 -1
  56. package/dist/types/src/position.d.ts +1 -1
  57. package/dist/types/src/position.d.ts.map +1 -1
  58. package/dist/types/src/random.d.ts.map +1 -1
  59. package/dist/types/src/range.d.ts.map +1 -1
  60. package/dist/types/src/reducers.d.ts.map +1 -1
  61. package/dist/types/src/remove-undefined-keys.d.ts.map +1 -1
  62. package/dist/types/src/retry.d.ts +32 -0
  63. package/dist/types/src/retry.d.ts.map +1 -0
  64. package/dist/types/src/safe-await.d.ts.map +1 -1
  65. package/dist/types/src/safe-instanceof.d.ts.map +1 -1
  66. package/dist/types/src/safe-parse.d.ts +7 -4
  67. package/dist/types/src/safe-parse.d.ts.map +1 -1
  68. package/dist/types/src/safe-stringify.d.ts +22 -0
  69. package/dist/types/src/safe-stringify.d.ts.map +1 -0
  70. package/dist/types/src/safe-stringify.test.d.ts +2 -0
  71. package/dist/types/src/safe-stringify.test.d.ts.map +1 -0
  72. package/dist/types/src/sliding-window-summary.d.ts.map +1 -1
  73. package/dist/types/src/sort.d.ts.map +1 -1
  74. package/dist/types/src/string.d.ts.map +1 -1
  75. package/dist/types/src/sum.d.ts.map +1 -1
  76. package/dist/types/src/throw-unhandled-error.d.ts.map +1 -1
  77. package/dist/types/src/to-fallback.d.ts +18 -4
  78. package/dist/types/src/to-fallback.d.ts.map +1 -1
  79. package/dist/types/src/tracer.d.ts.map +1 -1
  80. package/dist/types/src/tree.d.ts.map +1 -1
  81. package/dist/types/src/types.d.ts +23 -5
  82. package/dist/types/src/types.d.ts.map +1 -1
  83. package/dist/types/src/uint8array.d.ts.map +1 -1
  84. package/dist/types/src/unit.d.ts +12 -13
  85. package/dist/types/src/unit.d.ts.map +1 -1
  86. package/dist/types/src/url.d.ts.map +1 -1
  87. package/dist/types/src/weak.d.ts +15 -0
  88. package/dist/types/src/weak.d.ts.map +1 -1
  89. package/dist/types/tsconfig.tsbuildinfo +1 -1
  90. package/package.json +12 -14
  91. package/src/array.ts +9 -2
  92. package/src/binder.ts +2 -2
  93. package/src/browser-storage.ts +60 -0
  94. package/src/circular-buffer.test.ts +26 -0
  95. package/src/circular-buffer.ts +5 -0
  96. package/src/complex.ts +32 -0
  97. package/src/composite-key.test.ts +31 -0
  98. package/src/composite-key.ts +16 -0
  99. package/src/deep.ts +2 -6
  100. package/src/defer.ts +1 -1
  101. package/src/di-key.ts +10 -8
  102. package/src/error-format.ts +24 -0
  103. package/src/filename.ts +16 -0
  104. package/src/index.ts +6 -0
  105. package/src/platform.ts +35 -3
  106. package/src/retry.ts +74 -0
  107. package/src/safe-parse.ts +27 -16
  108. package/src/safe-stringify.test.ts +96 -0
  109. package/src/safe-stringify.ts +153 -0
  110. package/src/string.ts +6 -2
  111. package/src/to-fallback.ts +39 -156
  112. package/src/types.test.ts +11 -1
  113. package/src/types.ts +39 -12
  114. package/src/unit.test.ts +1 -1
  115. package/src/unit.ts +63 -28
  116. package/src/weak.ts +52 -14
  117. package/dist/types/src/explicit-resource-management-polyfill.d.ts +0 -1
  118. package/dist/types/src/explicit-resource-management-polyfill.d.ts.map +0 -1
  119. package/src/explicit-resource-management-polyfill.ts +0 -13
@@ -97,21 +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
+ };
100
108
 
101
109
  // src/assume.ts
102
110
  function assumeType(value) {
103
111
  }
104
112
 
105
113
  // src/binder.ts
106
- import util from "@dxos/node-std/util";
114
+ import { promisify } from "@dxos/node-std/util";
107
115
  var createBinder = (obj) => ({
108
116
  fn: (fn) => fn.bind(obj),
109
- async: (fn) => util.promisify(fn.bind(obj))
117
+ async: (fn) => promisify(fn.bind(obj))
110
118
  });
111
119
 
112
120
  // src/bitfield.ts
113
121
  import { invariant } from "@dxos/invariant";
114
- var __dxlog_file = "/__w/dxos/dxos/packages/common/util/src/bitfield.ts";
115
122
  var BitField = class _BitField {
116
123
  static get(data, idx) {
117
124
  const bit = data[idx >> 3] >> 7 - idx % 8 & 1;
@@ -143,15 +150,7 @@ var BitField = class _BitField {
143
150
  return result;
144
151
  }
145
152
  static and(first, second) {
146
- invariant(first.length === second.length, "Bitfields must be of the same length", {
147
- F: __dxlog_file,
148
- L: 52,
149
- S: this,
150
- A: [
151
- "first.length === second.length",
152
- "'Bitfields must be of the same length'"
153
- ]
154
- });
153
+ invariant(first.length === second.length, "Bitfields must be of the same length");
155
154
  const result = new Uint8Array(first.length);
156
155
  for (let i = 0; i < first.length; i++) {
157
156
  result[i] = first[i] & second[i];
@@ -179,126 +178,91 @@ var BitField = class _BitField {
179
178
  }
180
179
  };
181
180
 
182
- // src/callback-collection.ts
183
- function _check_private_redeclaration(obj, privateCollection) {
184
- if (privateCollection.has(obj)) {
185
- throw new TypeError("Cannot initialize the same private elements twice on an object");
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
+ }
186
206
  }
187
- }
188
- function _class_apply_descriptor_get(receiver, descriptor) {
189
- if (descriptor.get) {
190
- return descriptor.get.call(receiver);
207
+ if (errors.length > 0) {
208
+ throw new AggregateError(errors, "Failed to remove some OPFS entries");
191
209
  }
192
- return descriptor.value;
193
- }
194
- function _class_apply_descriptor_set(receiver, descriptor, value) {
195
- if (descriptor.set) {
196
- descriptor.set.call(receiver, value);
197
- } else {
198
- if (!descriptor.writable) {
199
- throw new TypeError("attempted to set read only private field");
200
- }
201
- descriptor.value = value;
210
+ };
211
+ var clearServiceWorkers = async () => {
212
+ const regs = await navigator.serviceWorker.getRegistrations();
213
+ for (const reg of regs) {
214
+ await reg.unregister();
202
215
  }
203
- }
204
- function _class_extract_field_descriptor(receiver, privateMap, action) {
205
- if (!privateMap.has(receiver)) {
206
- throw new TypeError("attempted to " + action + " private field on non-instance");
216
+ };
217
+ var clearCaches = async () => {
218
+ const keys2 = await caches.keys();
219
+ for (const key of keys2) {
220
+ await caches.delete(key);
207
221
  }
208
- return privateMap.get(receiver);
209
- }
210
- function _class_private_field_get(receiver, privateMap) {
211
- var descriptor = _class_extract_field_descriptor(receiver, privateMap, "get");
212
- return _class_apply_descriptor_get(receiver, descriptor);
213
- }
214
- function _class_private_field_init(obj, privateMap, value) {
215
- _check_private_redeclaration(obj, privateMap);
216
- privateMap.set(obj, value);
217
- }
218
- function _class_private_field_set(receiver, privateMap, value) {
219
- var descriptor = _class_extract_field_descriptor(receiver, privateMap, "set");
220
- _class_apply_descriptor_set(receiver, descriptor, value);
221
- return value;
222
- }
223
- var _callbacks = /* @__PURE__ */ new WeakMap();
222
+ };
223
+
224
+ // src/callback-collection.ts
224
225
  var CallbackCollection = class {
226
+ #callbacks = [];
225
227
  append(callback) {
226
- _class_private_field_get(this, _callbacks).push(callback);
228
+ this.#callbacks.push(callback);
227
229
  }
228
230
  prepend(callback) {
229
- _class_private_field_get(this, _callbacks).unshift(callback);
231
+ this.#callbacks.unshift(callback);
230
232
  }
231
233
  remove(callback) {
232
- _class_private_field_set(this, _callbacks, _class_private_field_get(this, _callbacks).filter((c) => c !== callback));
234
+ this.#callbacks = this.#callbacks.filter((c) => c !== callback);
233
235
  }
234
236
  callParallel(...args) {
235
- return Promise.all(_class_private_field_get(this, _callbacks).map((callback) => callback(...args)));
237
+ return Promise.all(this.#callbacks.map((callback) => callback(...args)));
236
238
  }
237
239
  async callSerial(...args) {
238
240
  const results = [];
239
- for (const callback of _class_private_field_get(this, _callbacks)) {
241
+ for (const callback of this.#callbacks) {
240
242
  results.push(await callback(...args));
241
243
  }
242
244
  return results;
243
245
  }
244
- constructor() {
245
- _class_private_field_init(this, _callbacks, {
246
- writable: true,
247
- value: []
248
- });
249
- }
250
246
  };
251
247
 
252
248
  // src/callback.ts
253
249
  import { invariant as invariant2 } from "@dxos/invariant";
254
- function _define_property(obj, key, value) {
255
- if (key in obj) {
256
- Object.defineProperty(obj, key, {
257
- value,
258
- enumerable: true,
259
- configurable: true,
260
- writable: true
261
- });
262
- } else {
263
- obj[key] = value;
264
- }
265
- return obj;
266
- }
267
- var __dxlog_file2 = "/__w/dxos/dxos/packages/common/util/src/callback.ts";
268
250
  var Callback = class {
251
+ _callback;
269
252
  call(...args) {
270
- invariant2(this._callback, "Callback not set", {
271
- F: __dxlog_file2,
272
- L: 20,
273
- S: this,
274
- A: [
275
- "this._callback",
276
- "'Callback not set'"
277
- ]
278
- });
253
+ invariant2(this._callback, "Callback not set");
279
254
  return this._callback(...args);
280
255
  }
281
256
  callIfSet(...args) {
282
257
  return this._callback?.(...args);
283
258
  }
284
259
  set(callback) {
285
- invariant2(!this._callback, "Callback already set", {
286
- F: __dxlog_file2,
287
- L: 29,
288
- S: this,
289
- A: [
290
- "!this._callback",
291
- "'Callback already set'"
292
- ]
293
- });
260
+ invariant2(!this._callback, "Callback already set");
294
261
  this._callback = callback;
295
262
  }
296
263
  isSet() {
297
264
  return !!this._callback;
298
265
  }
299
- constructor() {
300
- _define_property(this, "_callback", void 0);
301
- }
302
266
  };
303
267
  var createSetDispatch = ({ handlers }) => {
304
268
  return new Proxy({
@@ -361,21 +325,14 @@ var chunkArray = (array, size) => {
361
325
 
362
326
  // src/circular-buffer.ts
363
327
  import { invariant as invariant3 } from "@dxos/invariant";
364
- function _define_property2(obj, key, value) {
365
- if (key in obj) {
366
- Object.defineProperty(obj, key, {
367
- value,
368
- enumerable: true,
369
- configurable: true,
370
- writable: true
371
- });
372
- } else {
373
- obj[key] = value;
374
- }
375
- return obj;
376
- }
377
- var __dxlog_file3 = "/__w/dxos/dxos/packages/common/util/src/circular-buffer.ts";
378
328
  var CircularBuffer = class {
329
+ _buffer;
330
+ _nextIndex = 0;
331
+ _elementCount = 0;
332
+ constructor(size) {
333
+ invariant3(size >= 1);
334
+ this._buffer = new Array(size);
335
+ }
379
336
  push(element) {
380
337
  const evicted = this._elementCount === this._buffer.length ? this._buffer[this._nextIndex] : void 0;
381
338
  this._buffer[this._nextIndex] = element;
@@ -386,6 +343,10 @@ var CircularBuffer = class {
386
343
  get elementCount() {
387
344
  return this._elementCount;
388
345
  }
346
+ clear() {
347
+ this._nextIndex = 0;
348
+ this._elementCount = 0;
349
+ }
389
350
  getLast() {
390
351
  if (this._elementCount === 0) {
391
352
  return void 0;
@@ -415,21 +376,6 @@ var CircularBuffer = class {
415
376
  yield this._buffer[i];
416
377
  }
417
378
  }
418
- constructor(size) {
419
- _define_property2(this, "_buffer", void 0);
420
- _define_property2(this, "_nextIndex", 0);
421
- _define_property2(this, "_elementCount", 0);
422
- invariant3(size >= 1, void 0, {
423
- F: __dxlog_file3,
424
- L: 13,
425
- S: this,
426
- A: [
427
- "size >= 1",
428
- ""
429
- ]
430
- });
431
- this._buffer = new Array(size);
432
- }
433
379
  };
434
380
 
435
381
  // src/clear-undefined.ts
@@ -448,22 +394,19 @@ var clearUndefined = (obj) => {
448
394
  // src/complex.ts
449
395
  import { inspect } from "@dxos/node-std/util";
450
396
  import { inspectObject, raise } from "@dxos/debug";
451
- function _define_property3(obj, key, value) {
452
- if (key in obj) {
453
- Object.defineProperty(obj, key, {
454
- value,
455
- enumerable: true,
456
- configurable: true,
457
- writable: true
458
- });
459
- } else {
460
- obj[key] = value;
461
- }
462
- return obj;
463
- }
464
397
  var MAX_SERIALIZATION_LENGTH = 10;
465
- var _inspect_custom = inspect.custom;
466
398
  var ComplexSet = class {
399
+ _projection;
400
+ _values = /* @__PURE__ */ new Map();
401
+ // prettier-ignore
402
+ constructor(_projection, values) {
403
+ this._projection = _projection;
404
+ if (values) {
405
+ for (const value of values) {
406
+ this.add(value);
407
+ }
408
+ }
409
+ }
467
410
  toString() {
468
411
  return inspectObject(this);
469
412
  }
@@ -472,7 +415,7 @@ var ComplexSet = class {
472
415
  size: this._values.size
473
416
  } : Array.from(this._values.values());
474
417
  }
475
- [_inspect_custom]() {
418
+ [inspect.custom]() {
476
419
  return inspectObject(this);
477
420
  }
478
421
  add(value) {
@@ -538,18 +481,6 @@ var ComplexSet = class {
538
481
  isDisjointFrom(other) {
539
482
  throw new Error("Method not implemented.");
540
483
  }
541
- // prettier-ignore
542
- constructor(_projection, values) {
543
- _define_property3(this, "_projection", void 0);
544
- _define_property3(this, "_values", void 0);
545
- this._projection = _projection;
546
- this._values = /* @__PURE__ */ new Map();
547
- if (values) {
548
- for (const value of values) {
549
- this.add(value);
550
- }
551
- }
552
- }
553
484
  };
554
485
  var makeSet = (projection) => {
555
486
  return class BoundComplexSet extends ComplexSet {
@@ -558,8 +489,19 @@ var makeSet = (projection) => {
558
489
  }
559
490
  };
560
491
  };
561
- var _inspect_custom1 = inspect.custom;
562
492
  var ComplexMap = class _ComplexMap {
493
+ _keyProjection;
494
+ _keys = /* @__PURE__ */ new Map();
495
+ _values = /* @__PURE__ */ new Map();
496
+ // prettier-ignore
497
+ constructor(_keyProjection, entries2) {
498
+ this._keyProjection = _keyProjection;
499
+ if (entries2) {
500
+ for (const [key, value] of entries2) {
501
+ this.set(key, value);
502
+ }
503
+ }
504
+ }
563
505
  toString() {
564
506
  return inspectObject(this);
565
507
  }
@@ -568,7 +510,7 @@ var ComplexMap = class _ComplexMap {
568
510
  size: this._values.size
569
511
  } : Array.from(this._values.values());
570
512
  }
571
- [_inspect_custom1]() {
513
+ [inspect.custom]() {
572
514
  return inspectObject(this);
573
515
  }
574
516
  clear() {
@@ -598,6 +540,36 @@ var ComplexMap = class _ComplexMap {
598
540
  this._values.set(primitive, value);
599
541
  return this;
600
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
+ }
601
573
  get size() {
602
574
  return this._keys.size;
603
575
  }
@@ -630,45 +602,22 @@ var ComplexMap = class _ComplexMap {
630
602
  get [Symbol.toStringTag]() {
631
603
  return "ComplexMap";
632
604
  }
633
- // prettier-ignore
634
- constructor(_keyProjection, entries2) {
635
- _define_property3(this, "_keyProjection", void 0);
636
- _define_property3(this, "_keys", void 0);
637
- _define_property3(this, "_values", void 0);
638
- this._keyProjection = _keyProjection;
639
- this._keys = /* @__PURE__ */ new Map();
640
- this._values = /* @__PURE__ */ new Map();
641
- if (entries2) {
642
- for (const [key, value] of entries2) {
643
- this.set(key, value);
644
- }
645
- }
646
- }
647
605
  };
648
- var makeMap = (keyProjection) => {
649
- class BoundComplexMap extends ComplexMap {
650
- constructor(entries2) {
651
- super(keyProjection, entries2);
652
- }
606
+ var makeMap = (keyProjection) => class BoundComplexMap extends ComplexMap {
607
+ constructor(entries2) {
608
+ super(keyProjection, entries2);
653
609
  }
654
- return BoundComplexMap;
655
610
  };
656
611
 
612
+ // src/composite-key.ts
613
+ var SEPARATOR = ":";
614
+ var compositeKey = (...parts) => parts.join(SEPARATOR);
615
+ var splitCompositeKey = (key) => key.split(SEPARATOR);
616
+
657
617
  // src/deep.ts
658
- import get from "lodash.get";
659
- import set from "lodash.set";
660
618
  import { invariant as invariant4 } from "@dxos/invariant";
661
- var __dxlog_file4 = "/__w/dxos/dxos/packages/common/util/src/deep.ts";
662
619
  var setDeep = (obj, path, value) => {
663
- invariant4(path.length > 0, void 0, {
664
- F: __dxlog_file4,
665
- L: 18,
666
- S: void 0,
667
- A: [
668
- "path.length > 0",
669
- ""
670
- ]
671
- });
620
+ invariant4(path.length > 0);
672
621
  let parent = obj;
673
622
  for (const key of path.slice(0, -1)) {
674
623
  if (parent[key] === void 0) {
@@ -691,72 +640,51 @@ var getDeep = (obj, path) => {
691
640
  // src/defer-function.ts
692
641
  var deferFunction = (fnProvider) => (...args) => fnProvider()(...args);
693
642
 
694
- // src/explicit-resource-management-polyfill.ts
695
- var _Symbol;
696
- var _Symbol1;
697
- (_Symbol = Symbol).dispose ?? (_Symbol.dispose = Symbol("Symbol.dispose"));
698
- (_Symbol1 = Symbol).asyncDispose ?? (_Symbol1.asyncDispose = Symbol("Symbol.asyncDispose"));
699
-
700
643
  // src/defer.ts
701
- function _define_property4(obj, key, value) {
702
- if (key in obj) {
703
- Object.defineProperty(obj, key, {
704
- value,
705
- enumerable: true,
706
- configurable: true,
707
- writable: true
708
- });
709
- } else {
710
- obj[key] = value;
711
- }
712
- return obj;
713
- }
644
+ import "@hazae41/symbol-dispose-polyfill";
714
645
  var defer = (fn) => new DeferGuard(fn);
715
646
  var DeferGuard = class {
716
- [Symbol.dispose]() {
717
- const result = this._fn();
718
- if (result instanceof Promise) {
719
- throw new Error("Async functions in defer are not supported. Use deferAsync instead.");
720
- }
721
- }
647
+ _fn;
722
648
  /**
723
649
  * @internal
724
650
  */
725
651
  constructor(_fn) {
726
- _define_property4(this, "_fn", void 0);
727
652
  this._fn = _fn;
728
653
  }
654
+ [Symbol.dispose]() {
655
+ const result = this._fn();
656
+ if (result instanceof Promise) {
657
+ throw new Error("Async functions in defer are not supported. Use deferAsync instead.");
658
+ }
659
+ }
729
660
  };
730
661
  var deferAsync = (fn) => new DeferAsyncGuard(fn);
731
662
  var DeferAsyncGuard = class {
732
- async [Symbol.asyncDispose]() {
733
- await this._fn();
734
- }
663
+ _fn;
735
664
  /**
736
665
  * @internal
737
666
  */
738
667
  constructor(_fn) {
739
- _define_property4(this, "_fn", void 0);
740
668
  this._fn = _fn;
741
669
  }
670
+ async [Symbol.asyncDispose]() {
671
+ await this._fn();
672
+ }
742
673
  };
743
674
 
744
675
  // src/entry.ts
745
- function _define_property5(obj, key, value) {
746
- if (key in obj) {
747
- Object.defineProperty(obj, key, {
748
- value,
749
- enumerable: true,
750
- configurable: true,
751
- writable: true
752
- });
753
- } else {
754
- obj[key] = value;
755
- }
756
- return obj;
757
- }
758
676
  var entry = (map, key) => new MapEntry(map, key);
759
677
  var MapEntry = class {
678
+ _map;
679
+ _key;
680
+ /**
681
+ * @internal
682
+ */
683
+ // prettier-ignore
684
+ constructor(_map, _key) {
685
+ this._map = _map;
686
+ this._key = _key;
687
+ }
760
688
  get key() {
761
689
  return this._key;
762
690
  }
@@ -772,36 +700,36 @@ var MapEntry = class {
772
700
  deep(key) {
773
701
  return entry(this.value, key);
774
702
  }
775
- /**
776
- * @internal
777
- */
778
- // prettier-ignore
779
- constructor(_map, _key) {
780
- _define_property5(this, "_map", void 0);
781
- _define_property5(this, "_key", void 0);
782
- this._map = _map;
783
- this._key = _key;
784
- }
785
703
  };
786
704
 
705
+ // src/error-format.ts
706
+ var formatErrorWithCauses = (error) => {
707
+ const lines = [];
708
+ let current = error;
709
+ let level = 0;
710
+ while (current) {
711
+ const prefix = level === 0 ? "" : `Caused by: `;
712
+ lines.push(prefix + (current.stack ?? String(current)));
713
+ if (!(current.cause instanceof Error)) {
714
+ break;
715
+ }
716
+ current = current.cause;
717
+ level += 1;
718
+ }
719
+ return lines.join("\n\n");
720
+ };
721
+
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
+
787
728
  // src/for-each-async.ts
788
729
  var forEachAsync = (items, fn) => Promise.all(items.map(fn));
789
730
 
790
731
  // src/human-hash.ts
791
732
  import { PublicKey } from "@dxos/keys";
792
- function _define_property6(obj, key, value) {
793
- if (key in obj) {
794
- Object.defineProperty(obj, key, {
795
- value,
796
- enumerable: true,
797
- configurable: true,
798
- writable: true
799
- });
800
- } else {
801
- obj[key] = value;
802
- }
803
- return obj;
804
- }
805
733
  var DEFAULT_WORDLIST = [
806
734
  "ack",
807
735
  "alabama",
@@ -1061,6 +989,27 @@ var DEFAULT_WORDLIST = [
1061
989
  "zulu"
1062
990
  ];
1063
991
  var HumanHasher = class {
992
+ wordlist;
993
+ /**
994
+ * Transforms hex digests to human-readable strings.
995
+ *
996
+ * The format of these strings will look something like:
997
+ * `victor-bacon-zulu-lima`. The output is obtained by compressing the input
998
+ * digest to a fixed number of bytes, then mapping those bytes to one of 256
999
+ * words. A default wordlist is provided, but you can override this if you
1000
+ * prefer.
1001
+ * As long as you use the same wordlist, the output will be consistent (i.e.
1002
+ * the same digest will always render the same representation).
1003
+ *
1004
+ * @param wordlist A list of exactly 256 words to choose from
1005
+ */
1006
+ constructor(wordlist = DEFAULT_WORDLIST) {
1007
+ this.wordlist = wordlist;
1008
+ if (wordlist.length !== 256) {
1009
+ throw new Error("Wordlist must have exactly 256 items");
1010
+ }
1011
+ this.wordlist = wordlist;
1012
+ }
1064
1013
  /**
1065
1014
  * Humanize a given hexadecimal digest.
1066
1015
  *
@@ -1100,27 +1049,6 @@ var HumanHasher = class {
1100
1049
  const checksums = segments.map((x) => x.reduce((acc, curr) => acc ^ curr));
1101
1050
  return checksums;
1102
1051
  }
1103
- /**
1104
- * Transforms hex digests to human-readable strings.
1105
- *
1106
- * The format of these strings will look something like:
1107
- * `victor-bacon-zulu-lima`. The output is obtained by compressing the input
1108
- * digest to a fixed number of bytes, then mapping those bytes to one of 256
1109
- * words. A default wordlist is provided, but you can override this if you
1110
- * prefer.
1111
- * As long as you use the same wordlist, the output will be consistent (i.e.
1112
- * the same digest will always render the same representation).
1113
- *
1114
- * @param wordlist A list of exactly 256 words to choose from
1115
- */
1116
- constructor(wordlist = DEFAULT_WORDLIST) {
1117
- _define_property6(this, "wordlist", void 0);
1118
- this.wordlist = wordlist;
1119
- if (wordlist.length !== 256) {
1120
- throw new Error("Wordlist must have exactly 256 items");
1121
- }
1122
- this.wordlist = wordlist;
1123
- }
1124
1052
  };
1125
1053
  var hasher = new HumanHasher();
1126
1054
  var humanize = (value) => {
@@ -1143,10 +1071,8 @@ var defaultMap = (map, key, def) => {
1143
1071
  };
1144
1072
 
1145
1073
  // src/instance-id.ts
1146
- var _globalThis;
1147
- var _symbol;
1148
- var symbol = Symbol.for("dxos.instance-contexts");
1149
- var instanceContexts = (_globalThis = globalThis)[_symbol = symbol] ?? (_globalThis[_symbol] = /* @__PURE__ */ new WeakMap());
1074
+ var symbol = /* @__PURE__ */ Symbol.for("dxos.instance-contexts");
1075
+ var instanceContexts = globalThis[symbol] ??= /* @__PURE__ */ new WeakMap();
1150
1076
  var getPrototypeSpecificInstanceId = (instance) => {
1151
1077
  const prototype = Object.getPrototypeOf(instance);
1152
1078
  const instanceCtx = defaultMap(instanceContexts, prototype, () => ({
@@ -1318,19 +1244,6 @@ var jsonKeyReplacer = (options = {}) => (key, value) => {
1318
1244
  };
1319
1245
 
1320
1246
  // src/map-values.ts
1321
- function _define_property7(obj, key, value) {
1322
- if (key in obj) {
1323
- Object.defineProperty(obj, key, {
1324
- value,
1325
- enumerable: true,
1326
- configurable: true,
1327
- writable: true
1328
- });
1329
- } else {
1330
- obj[key] = value;
1331
- }
1332
- return obj;
1333
- }
1334
1247
  var mapValues = (obj, fn) => {
1335
1248
  const result = {};
1336
1249
  Object.keys(obj).forEach((key) => {
@@ -1342,6 +1255,11 @@ var deepMapValues = (value, fn) => {
1342
1255
  return new DeepMapper(fn).map(value);
1343
1256
  };
1344
1257
  var DeepMapper = class {
1258
+ _fn;
1259
+ _cyclic = /* @__PURE__ */ new Map();
1260
+ constructor(_fn) {
1261
+ this._fn = _fn;
1262
+ }
1345
1263
  map(value) {
1346
1264
  return this._map(value, void 0);
1347
1265
  }
@@ -1351,40 +1269,38 @@ var DeepMapper = class {
1351
1269
  }
1352
1270
  return this._fn(value, this._recurse, key);
1353
1271
  }
1354
- constructor(_fn) {
1355
- _define_property7(this, "_fn", void 0);
1356
- _define_property7(this, "_cyclic", void 0);
1357
- _define_property7(this, "_recurse", void 0);
1358
- this._fn = _fn;
1359
- this._cyclic = /* @__PURE__ */ new Map();
1360
- this._recurse = (value) => {
1361
- if (this._cyclic.has(value)) {
1362
- return this._cyclic.get(value);
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);
1363
1281
  }
1364
- if (Array.isArray(value)) {
1365
- const res = new Array(value.length);
1366
- this._cyclic.set(value, res);
1367
- for (let i = 0; i < value.length; i++) {
1368
- res[i] = this._map(value[i], i);
1369
- }
1370
- return res;
1371
- } else if (value !== null && typeof value === "object") {
1372
- const res = {};
1373
- this._cyclic.set(value, res);
1374
- for (const key in value) {
1375
- res[key] = this._map(value[key], key);
1376
- }
1377
- return res;
1378
- } else {
1379
- return value;
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);
1380
1288
  }
1381
- };
1382
- }
1289
+ return res;
1290
+ } else {
1291
+ return value;
1292
+ }
1293
+ };
1383
1294
  };
1384
1295
  var deepMapValuesAsync = (value, fn) => {
1385
1296
  return new DeepMapperAsync(fn).map(value);
1386
1297
  };
1387
1298
  var DeepMapperAsync = class {
1299
+ _fn;
1300
+ _cyclic = /* @__PURE__ */ new Map();
1301
+ constructor(_fn) {
1302
+ this._fn = _fn;
1303
+ }
1388
1304
  map(value) {
1389
1305
  return this._map(value, void 0);
1390
1306
  }
@@ -1394,35 +1310,28 @@ var DeepMapperAsync = class {
1394
1310
  }
1395
1311
  return this._fn(value, this._recurse, key);
1396
1312
  }
1397
- constructor(_fn) {
1398
- _define_property7(this, "_fn", void 0);
1399
- _define_property7(this, "_cyclic", void 0);
1400
- _define_property7(this, "_recurse", void 0);
1401
- this._fn = _fn;
1402
- this._cyclic = /* @__PURE__ */ new Map();
1403
- this._recurse = async (value) => {
1404
- if (this._cyclic.has(value)) {
1405
- return this._cyclic.get(value);
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);
1406
1322
  }
1407
- if (Array.isArray(value)) {
1408
- const res = new Array(value.length);
1409
- this._cyclic.set(value, res);
1410
- for (let i = 0; i < value.length; i++) {
1411
- res[i] = await this._map(value[i], i);
1412
- }
1413
- return res;
1414
- } else if (value !== null && typeof value === "object") {
1415
- const res = {};
1416
- this._cyclic.set(value, res);
1417
- for (const key in value) {
1418
- res[key] = await this._map(value[key], key);
1419
- }
1420
- return res;
1421
- } else {
1422
- return value;
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);
1423
1329
  }
1424
- };
1425
- }
1330
+ return res;
1331
+ } else {
1332
+ return value;
1333
+ }
1334
+ };
1426
1335
  };
1427
1336
  var visitValues = (object, visitor) => {
1428
1337
  if (Array.isArray(object)) {
@@ -1511,7 +1420,18 @@ var omit = (obj, keys2) => {
1511
1420
 
1512
1421
  // src/platform.ts
1513
1422
  var isNode = () => typeof process !== "undefined" && process.versions != null && process.versions.node != null;
1514
- 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 = () => {
1515
1435
  let check = false;
1516
1436
  ((a) => {
1517
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))) {
@@ -1533,7 +1453,7 @@ var iosCheck = () => {
1533
1453
  };
1534
1454
  var safariCheck = () => typeof navigator !== "undefined" && /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
1535
1455
  var getHostPlatform = () => {
1536
- if (!("navigator" in window)) {
1456
+ if (!("navigator" in globalThis)) {
1537
1457
  return "unknown";
1538
1458
  }
1539
1459
  const platform = (navigator.userAgentData?.platform || navigator.platform)?.toLowerCase();
@@ -1709,6 +1629,43 @@ var removeProperties = (root, condition) => {
1709
1629
  return result;
1710
1630
  };
1711
1631
 
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
+
1712
1669
  // src/safe-await.ts
1713
1670
  var safeAwaitAll = async (source, taskFactory, onError) => {
1714
1671
  const failedItems = [];
@@ -1728,7 +1685,7 @@ var safeAwaitAll = async (source, taskFactory, onError) => {
1728
1685
  };
1729
1686
 
1730
1687
  // src/safe-instanceof.ts
1731
- var instanceTag = Symbol("instanceTag");
1688
+ var instanceTag = /* @__PURE__ */ Symbol("instanceTag");
1732
1689
  var safeInstanceof = (tag) => (target) => {
1733
1690
  target.prototype[instanceTag] = tag;
1734
1691
  Object.defineProperty(target.prototype, Symbol.hasInstance, {
@@ -1740,48 +1697,142 @@ var safeInstanceof = (tag) => (target) => {
1740
1697
  };
1741
1698
 
1742
1699
  // src/safe-parse.ts
1743
- var safeParseInt = (value, defaultValue) => {
1700
+ function safeParseInt(str, defaultValue) {
1744
1701
  try {
1745
- const n = parseInt(value ?? "");
1746
- return isNaN(n) ? defaultValue : n;
1702
+ const value = parseInt(str ?? "");
1703
+ return isNaN(value) ? defaultValue : value;
1747
1704
  } catch {
1748
1705
  return defaultValue;
1749
1706
  }
1750
- };
1751
- var safeParseFloat = (str, defaultValue) => {
1707
+ }
1708
+ function safeParseFloat(str, defaultValue) {
1752
1709
  try {
1753
- return parseFloat(str);
1710
+ const value = parseFloat(str ?? "");
1711
+ return isNaN(value) ? defaultValue : value;
1754
1712
  } catch {
1755
- return defaultValue ?? 0;
1713
+ return defaultValue;
1756
1714
  }
1757
- };
1758
- var safeParseJson = (data, defaultValue) => {
1759
- if (data && data.length > 0) {
1715
+ }
1716
+ var safeParseJson = (str, defaultValue) => {
1717
+ if (str && str.length > 0) {
1760
1718
  try {
1761
- return JSON.parse(data);
1719
+ return JSON.parse(str);
1762
1720
  } catch {
1763
1721
  }
1764
1722
  }
1765
1723
  return defaultValue;
1766
1724
  };
1725
+ var safeUrl = (str) => {
1726
+ try {
1727
+ return new URL(str ?? "");
1728
+ } catch {
1729
+ return void 0;
1730
+ }
1731
+ };
1767
1732
 
1768
- // src/sliding-window-summary.ts
1769
- import { invariant as invariant5 } from "@dxos/invariant";
1770
- function _define_property8(obj, key, value) {
1771
- if (key in obj) {
1772
- Object.defineProperty(obj, key, {
1773
- value,
1774
- enumerable: true,
1775
- configurable: true,
1776
- writable: true
1777
- });
1778
- } else {
1779
- obj[key] = value;
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) {
1738
+ try {
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}`;
1775
+ }
1776
+ }
1777
+ try {
1778
+ return JSON.stringify(obj, replacer, indent);
1779
+ } catch (error) {
1780
+ return `ERROR: ${error.message}`;
1780
1781
  }
1781
- return obj;
1782
1782
  }
1783
- var __dxlog_file5 = "/__w/dxos/dxos/packages/common/util/src/sliding-window-summary.ts";
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
+ };
1820
+ };
1821
+ var defaultFilter = createReplacer();
1822
+
1823
+ // src/sliding-window-summary.ts
1824
+ import { invariant as invariant5 } from "@dxos/invariant";
1784
1825
  var SlidingWindowSummary = class {
1826
+ _buffer;
1827
+ _sum = 0;
1828
+ _precision;
1829
+ constructor(options) {
1830
+ this._buffer = new CircularBuffer(options.dataPoints);
1831
+ if (options.precision != null) {
1832
+ invariant5(options.precision >= 0);
1833
+ this._precision = Math.pow(10, options.precision);
1834
+ }
1835
+ }
1785
1836
  record(value) {
1786
1837
  const evicted = this._buffer.push(value);
1787
1838
  this._sum += value - (evicted ?? 0);
@@ -1816,24 +1867,6 @@ var SlidingWindowSummary = class {
1816
1867
  }
1817
1868
  return Math.round(value * this._precision) / this._precision;
1818
1869
  }
1819
- constructor(options) {
1820
- _define_property8(this, "_buffer", void 0);
1821
- _define_property8(this, "_sum", 0);
1822
- _define_property8(this, "_precision", void 0);
1823
- this._buffer = new CircularBuffer(options.dataPoints);
1824
- if (options.precision != null) {
1825
- invariant5(options.precision >= 0, void 0, {
1826
- F: __dxlog_file5,
1827
- L: 26,
1828
- S: this,
1829
- A: [
1830
- "options.precision >= 0",
1831
- ""
1832
- ]
1833
- });
1834
- this._precision = Math.pow(10, options.precision);
1835
- }
1836
- }
1837
1870
  };
1838
1871
 
1839
1872
  // src/sort.ts
@@ -1877,8 +1910,12 @@ function trim(strings, ...values) {
1877
1910
  return out;
1878
1911
  }, "");
1879
1912
  const lines = raw.split("\n");
1880
- while (lines.length && !lines[0].trim()) lines.shift();
1881
- while (lines.length && !lines[lines.length - 1].trim()) lines.pop();
1913
+ while (lines.length && !lines[0].trim()) {
1914
+ lines.shift();
1915
+ }
1916
+ while (lines.length && !lines[lines.length - 1].trim()) {
1917
+ lines.pop();
1918
+ }
1882
1919
  const minIndent = Math.min(...lines.filter((l) => l.trim()).map((l) => l.match(/^[ \t]*/)?.[0].length ?? 0));
1883
1920
  return lines.map((l) => l.slice(minIndent)).join("\n");
1884
1921
  }
@@ -1896,18 +1933,6 @@ var throwUnhandledError = (error) => {
1896
1933
 
1897
1934
  // src/to-fallback.ts
1898
1935
  var idEmoji = [
1899
- // When changing this set, please check the result in a console or e.g. RunKit (https://runkit.com/thure/642214441dd6ae000855a8de)
1900
- // 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.
1901
- // This set was chosen from the characters in Unicode Emoji v15.0 based on the following criteria:
1902
- // – not people or isolated anthropomorphic faces
1903
- // – not flags
1904
- // – more concrete than abstract
1905
- // – less culturally specific
1906
- // – less easily confused with another emoji in the set
1907
- // – requires less special knowledge to identify
1908
- // – less likely to evoke negative feelings (no meat, no drugs, no weapons, etc)
1909
- // – less common as a signifier in UX
1910
- // NOTE that this is intentionally an array of strings because of the way emoji graphemes work.
1911
1936
  "\u{1F47B}",
1912
1937
  "\u{1F479}",
1913
1938
  "\u{1F47D}",
@@ -2043,17 +2068,18 @@ var idEmoji = [
2043
2068
  ];
2044
2069
  var idHue = [
2045
2070
  "red",
2046
- // 'orange' as const, /* More shades in these palettes are considered “ugly” */
2071
+ "orange",
2047
2072
  "amber",
2048
- // 'yellow' as const, /* More shades in these palettes are considered “ugly” */
2073
+ "yellow",
2049
2074
  "lime",
2050
2075
  "green",
2051
2076
  "emerald",
2052
2077
  "teal",
2053
2078
  "cyan",
2054
- // 'sky' as const, /* Omitted since it is quite similar to the primary accent palette */
2055
- // 'blue' as const, /* Omitted since it is quite similar to the primary accent palette */
2056
- // '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,
2057
2083
  "violet",
2058
2084
  "purple",
2059
2085
  "fuchsia",
@@ -2080,20 +2106,9 @@ var toFallback = (hash) => {
2080
2106
  };
2081
2107
 
2082
2108
  // src/tracer.ts
2083
- function _define_property9(obj, key, value) {
2084
- if (key in obj) {
2085
- Object.defineProperty(obj, key, {
2086
- value,
2087
- enumerable: true,
2088
- configurable: true,
2089
- writable: true
2090
- });
2091
- } else {
2092
- obj[key] = value;
2093
- }
2094
- return obj;
2095
- }
2096
2109
  var Tracer = class {
2110
+ _events = /* @__PURE__ */ new Map();
2111
+ _recording = false;
2097
2112
  // TODO(burdon): Start/stop methods for recording data? By id?
2098
2113
  // Alternatively, enable subscriptions to track/compute series.
2099
2114
  // TODO(burdon): Hierarchical traces?
@@ -2150,10 +2165,6 @@ var Tracer = class {
2150
2165
  defaultMap(this._events, event.id, []).push(event);
2151
2166
  }
2152
2167
  }
2153
- constructor() {
2154
- _define_property9(this, "_events", /* @__PURE__ */ new Map());
2155
- _define_property9(this, "_recording", false);
2156
- }
2157
2168
  };
2158
2169
  var tracer = new Tracer();
2159
2170
 
@@ -2228,69 +2239,116 @@ var arrayMove = (array, from, to) => {
2228
2239
  array.splice(to < 0 ? array.length + to : to, 0, array.splice(from, 1)[0]);
2229
2240
  return array;
2230
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
+ }
2231
2248
 
2232
2249
  // src/unit.ts
2233
- var Formatter = (unit) => {
2234
- return (n, precision = 2) => {
2250
+ var createFormat = (unit) => {
2251
+ return (n, precision = unit.precision ?? 0) => {
2235
2252
  const value = n / unit.quotient;
2236
- return `${value.toFixed(precision)}${unit.symbol}`;
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
+ };
2237
2263
  };
2238
2264
  };
2265
+ var MS_SECONDS = 1e3;
2266
+ var MS_MINUTES = 60 * MS_SECONDS;
2267
+ var MS_HOURS = 60 * MS_MINUTES;
2239
2268
  var Unit = {
2240
- // ms.
2241
- Hour: Formatter({
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({
2242
2302
  symbol: "h",
2243
- quotient: 60 * 60 * 1e3
2303
+ quotient: MS_HOURS
2244
2304
  }),
2245
- Minute: Formatter({
2305
+ Minute: createFormat({
2246
2306
  symbol: "m",
2247
- quotient: 60 * 1e3
2307
+ quotient: MS_MINUTES
2248
2308
  }),
2249
- Second: Formatter({
2309
+ Second: createFormat({
2250
2310
  symbol: "s",
2251
- quotient: 1e3
2311
+ quotient: MS_SECONDS,
2312
+ precision: 1
2252
2313
  }),
2253
- Millisecond: Formatter({
2314
+ Millisecond: createFormat({
2254
2315
  symbol: "ms",
2255
2316
  quotient: 1
2256
2317
  }),
2257
2318
  Duration: (n) => {
2258
- const hours = Math.floor(n / (60 * 60 * 1e3));
2259
- const minutes = Math.floor(n % (60 * 60 * 1e3) / (60 * 1e3));
2319
+ const hours = Math.floor(n / MS_HOURS);
2320
+ const minutes = Math.floor(n % MS_HOURS / MS_MINUTES);
2260
2321
  if (hours) {
2261
- return minutes ? `${hours}h ${minutes}m` : `${hours}h`;
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
+ };
2262
2332
  }
2263
- const seconds = Math.floor(n % (60 * 1e3) / 1e3);
2264
2333
  if (minutes) {
2265
- return seconds ? `${minutes}m ${seconds}s` : `${minutes}m`;
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
+ };
2266
2345
  }
2346
+ const seconds = n >= MS_SECONDS;
2267
2347
  if (seconds) {
2268
- return `${(n / 1e3).toFixed(1)}s`;
2348
+ return Unit.Second(n);
2269
2349
  }
2270
- return `${n}ms`;
2271
- },
2272
- // bytes (note KB via KiB).
2273
- Gigabyte: Formatter({
2274
- symbol: "GB",
2275
- quotient: 1e3 * 1e3 * 1e3
2276
- }),
2277
- Megabyte: Formatter({
2278
- symbol: "MB",
2279
- quotient: 1e3 * 1e3
2280
- }),
2281
- Kilobyte: Formatter({
2282
- symbol: "KB",
2283
- quotient: 1e3
2284
- }),
2285
- // general.
2286
- Thousand: Formatter({
2287
- symbol: "k",
2288
- quotient: 1e3
2289
- }),
2290
- Percent: Formatter({
2291
- symbol: "%",
2292
- quotient: 1 / 100
2293
- })
2350
+ return Unit.Millisecond(n);
2351
+ }
2294
2352
  };
2295
2353
 
2296
2354
  // src/url.ts
@@ -2303,20 +2361,22 @@ var createUrl = (url, search) => {
2303
2361
  };
2304
2362
 
2305
2363
  // src/weak.ts
2306
- function _define_property10(obj, key, value) {
2307
- if (key in obj) {
2308
- Object.defineProperty(obj, key, {
2309
- value,
2310
- enumerable: true,
2311
- configurable: true,
2312
- writable: true
2313
- });
2314
- } else {
2315
- obj[key] = value;
2316
- }
2317
- return obj;
2318
- }
2319
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
+ });
2371
+ constructor(entries2) {
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
+ }
2379
+ }
2320
2380
  *entries() {
2321
2381
  for (const [key, value] of this._internal) {
2322
2382
  yield [
@@ -2355,10 +2415,45 @@ var WeakDictionary = class {
2355
2415
  return this._internal.get(key)?.deref();
2356
2416
  }
2357
2417
  set(key, value) {
2358
- this._internal.set(key, new WeakRef(value));
2359
- 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);
2360
2425
  return this;
2361
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
+ }
2362
2457
  has(key) {
2363
2458
  return this._internal.has(key) && this._internal.get(key).deref() !== void 0;
2364
2459
  }
@@ -2389,25 +2484,15 @@ var WeakDictionary = class {
2389
2484
  }
2390
2485
  });
2391
2486
  }
2392
- _register(key, value) {
2393
- this._finalization.register(value, () => {
2394
- this._internal.delete(key);
2487
+ _register(key, value, ref) {
2488
+ this._finalization.register(value, {
2489
+ key,
2490
+ ref
2395
2491
  }, value);
2396
2492
  }
2397
2493
  _unregister(value) {
2398
2494
  this._finalization.unregister(value);
2399
2495
  }
2400
- constructor(entries2) {
2401
- _define_property10(this, "_internal", /* @__PURE__ */ new Map());
2402
- _define_property10(this, "_finalization", new FinalizationRegistry((cleanUpCallback) => {
2403
- cleanUpCallback();
2404
- }));
2405
- this._internal = new Map(entries2?.map(([key, value]) => [
2406
- key,
2407
- new WeakRef(value)
2408
- ]));
2409
- entries2?.forEach(([key, value]) => this._register(key, value));
2410
- }
2411
2496
  };
2412
2497
  export {
2413
2498
  BitField,
@@ -2418,12 +2503,14 @@ export {
2418
2503
  ComplexSet,
2419
2504
  HumanHasher,
2420
2505
  MapEntry,
2506
+ SKIP,
2421
2507
  SlidingWindowSummary,
2422
2508
  Tracer,
2423
2509
  Unit,
2424
2510
  WeakDictionary,
2425
2511
  accessBy,
2426
2512
  arrayMove,
2513
+ arraySwap,
2427
2514
  arrayToBuffer,
2428
2515
  arrayToHex,
2429
2516
  arrayToString,
@@ -2434,19 +2521,28 @@ export {
2434
2521
  capitalize,
2435
2522
  chunkArray,
2436
2523
  clamp,
2524
+ clearCaches,
2525
+ clearIndexedDB,
2526
+ clearOPFS,
2527
+ clearServiceWorkers,
2437
2528
  clearUndefined,
2529
+ coerceArray,
2438
2530
  compareMulti,
2439
2531
  compareObject,
2440
2532
  compareScalar,
2441
2533
  compareString,
2534
+ compositeKey,
2442
2535
  createBinder,
2443
2536
  createBucketReducer,
2537
+ createFilename,
2444
2538
  createGroupReducer,
2539
+ createReplacer,
2445
2540
  createSetDispatch,
2446
2541
  createUrl,
2447
2542
  decamelize,
2448
2543
  deepMapValues,
2449
2544
  deepMapValuesAsync,
2545
+ defaultFilter,
2450
2546
  defaultMap,
2451
2547
  defer,
2452
2548
  deferAsync,
@@ -2458,7 +2554,7 @@ export {
2458
2554
  entry,
2459
2555
  exponentialBackoffInterval,
2460
2556
  forEachAsync,
2461
- get,
2557
+ formatErrorWithCauses,
2462
2558
  getAsyncProviderValue,
2463
2559
  getDate,
2464
2560
  getDebugName,
@@ -2478,8 +2574,12 @@ export {
2478
2574
  intersectBy,
2479
2575
  intersection,
2480
2576
  iosCheck,
2577
+ isBun,
2578
+ isMobile,
2579
+ isMobileOrTablet,
2481
2580
  isNode,
2482
2581
  isNonNullable,
2582
+ isTauri,
2483
2583
  isTruthy,
2484
2584
  joinTables,
2485
2585
  jsonKeyReplacer,
@@ -2495,7 +2595,6 @@ export {
2495
2595
  makeSet,
2496
2596
  mapValues,
2497
2597
  median,
2498
- mobileAndTabletCheck,
2499
2598
  numericalValues,
2500
2599
  omit,
2501
2600
  orderKeys,
@@ -2511,15 +2610,18 @@ export {
2511
2610
  removeBy,
2512
2611
  removeProperties,
2513
2612
  removeUndefinedProperties,
2613
+ retry,
2514
2614
  safariCheck,
2515
2615
  safeAwaitAll,
2516
2616
  safeInstanceof,
2517
2617
  safeParseFloat,
2518
2618
  safeParseInt,
2519
2619
  safeParseJson,
2520
- set,
2620
+ safeStringify,
2621
+ safeUrl,
2521
2622
  setDeep,
2522
2623
  sortKeys,
2624
+ splitCompositeKey,
2523
2625
  stringToArray,
2524
2626
  stringifyTree,
2525
2627
  stripUndefined,