@dxos/util 0.8.4-main.406dc2a → 0.8.4-main.4a85c3132b

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 (60) hide show
  1. package/dist/lib/browser/index.mjs +475 -454
  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 +475 -454
  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.d.ts +3 -2
  8. package/dist/types/src/array.d.ts.map +1 -1
  9. package/dist/types/src/circular-buffer.d.ts +1 -0
  10. package/dist/types/src/circular-buffer.d.ts.map +1 -1
  11. package/dist/types/src/deep.d.ts +0 -3
  12. package/dist/types/src/deep.d.ts.map +1 -1
  13. package/dist/types/src/defer.d.ts +1 -1
  14. package/dist/types/src/defer.d.ts.map +1 -1
  15. package/dist/types/src/error-format.d.ts +5 -0
  16. package/dist/types/src/error-format.d.ts.map +1 -0
  17. package/dist/types/src/filename.d.ts +9 -0
  18. package/dist/types/src/filename.d.ts.map +1 -0
  19. package/dist/types/src/index.d.ts +4 -0
  20. package/dist/types/src/index.d.ts.map +1 -1
  21. package/dist/types/src/platform.d.ts +4 -1
  22. package/dist/types/src/platform.d.ts.map +1 -1
  23. package/dist/types/src/retry.d.ts +32 -0
  24. package/dist/types/src/retry.d.ts.map +1 -0
  25. package/dist/types/src/safe-parse.d.ts +7 -4
  26. package/dist/types/src/safe-parse.d.ts.map +1 -1
  27. package/dist/types/src/safe-stringify.d.ts +22 -0
  28. package/dist/types/src/safe-stringify.d.ts.map +1 -0
  29. package/dist/types/src/safe-stringify.test.d.ts +2 -0
  30. package/dist/types/src/safe-stringify.test.d.ts.map +1 -0
  31. package/dist/types/src/to-fallback.d.ts +18 -4
  32. package/dist/types/src/to-fallback.d.ts.map +1 -1
  33. package/dist/types/src/types.d.ts +23 -5
  34. package/dist/types/src/types.d.ts.map +1 -1
  35. package/dist/types/src/unit.d.ts +12 -13
  36. package/dist/types/src/unit.d.ts.map +1 -1
  37. package/dist/types/tsconfig.tsbuildinfo +1 -1
  38. package/package.json +12 -11
  39. package/src/array.ts +9 -2
  40. package/src/binder.ts +2 -2
  41. package/src/circular-buffer.test.ts +26 -0
  42. package/src/circular-buffer.ts +5 -0
  43. package/src/deep.ts +2 -6
  44. package/src/defer.ts +1 -1
  45. package/src/error-format.ts +22 -0
  46. package/src/filename.ts +16 -0
  47. package/src/index.ts +4 -0
  48. package/src/platform.ts +35 -3
  49. package/src/retry.ts +74 -0
  50. package/src/safe-parse.ts +27 -16
  51. package/src/safe-stringify.test.ts +96 -0
  52. package/src/safe-stringify.ts +153 -0
  53. package/src/to-fallback.ts +39 -156
  54. package/src/types.test.ts +11 -1
  55. package/src/types.ts +39 -12
  56. package/src/unit.test.ts +1 -1
  57. package/src/unit.ts +59 -28
  58. package/dist/types/src/explicit-resource-management-polyfill.d.ts +0 -1
  59. package/dist/types/src/explicit-resource-management-polyfill.d.ts.map +0 -1
  60. package/src/explicit-resource-management-polyfill.ts +0 -13
@@ -97,16 +97,24 @@ 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
@@ -180,92 +188,34 @@ var BitField = class _BitField {
180
188
  };
181
189
 
182
190
  // 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");
186
- }
187
- }
188
- function _class_apply_descriptor_get(receiver, descriptor) {
189
- if (descriptor.get) {
190
- return descriptor.get.call(receiver);
191
- }
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;
202
- }
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");
207
- }
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();
224
191
  var CallbackCollection = class {
192
+ #callbacks = [];
225
193
  append(callback) {
226
- _class_private_field_get(this, _callbacks).push(callback);
194
+ this.#callbacks.push(callback);
227
195
  }
228
196
  prepend(callback) {
229
- _class_private_field_get(this, _callbacks).unshift(callback);
197
+ this.#callbacks.unshift(callback);
230
198
  }
231
199
  remove(callback) {
232
- _class_private_field_set(this, _callbacks, _class_private_field_get(this, _callbacks).filter((c) => c !== callback));
200
+ this.#callbacks = this.#callbacks.filter((c) => c !== callback);
233
201
  }
234
202
  callParallel(...args) {
235
- return Promise.all(_class_private_field_get(this, _callbacks).map((callback) => callback(...args)));
203
+ return Promise.all(this.#callbacks.map((callback) => callback(...args)));
236
204
  }
237
205
  async callSerial(...args) {
238
206
  const results = [];
239
- for (const callback of _class_private_field_get(this, _callbacks)) {
207
+ for (const callback of this.#callbacks) {
240
208
  results.push(await callback(...args));
241
209
  }
242
210
  return results;
243
211
  }
244
- constructor() {
245
- _class_private_field_init(this, _callbacks, {
246
- writable: true,
247
- value: []
248
- });
249
- }
250
212
  };
251
213
 
252
214
  // src/callback.ts
253
215
  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
216
  var __dxlog_file2 = "/__w/dxos/dxos/packages/common/util/src/callback.ts";
268
217
  var Callback = class {
218
+ _callback;
269
219
  call(...args) {
270
220
  invariant2(this._callback, "Callback not set", {
271
221
  F: __dxlog_file2,
@@ -296,9 +246,6 @@ var Callback = class {
296
246
  isSet() {
297
247
  return !!this._callback;
298
248
  }
299
- constructor() {
300
- _define_property(this, "_callback", void 0);
301
- }
302
249
  };
303
250
  var createSetDispatch = ({ handlers }) => {
304
251
  return new Proxy({
@@ -361,21 +308,23 @@ var chunkArray = (array, size) => {
361
308
 
362
309
  // src/circular-buffer.ts
363
310
  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
311
  var __dxlog_file3 = "/__w/dxos/dxos/packages/common/util/src/circular-buffer.ts";
378
312
  var CircularBuffer = class {
313
+ _buffer;
314
+ _nextIndex = 0;
315
+ _elementCount = 0;
316
+ constructor(size) {
317
+ invariant3(size >= 1, void 0, {
318
+ F: __dxlog_file3,
319
+ L: 13,
320
+ S: this,
321
+ A: [
322
+ "size >= 1",
323
+ ""
324
+ ]
325
+ });
326
+ this._buffer = new Array(size);
327
+ }
379
328
  push(element) {
380
329
  const evicted = this._elementCount === this._buffer.length ? this._buffer[this._nextIndex] : void 0;
381
330
  this._buffer[this._nextIndex] = element;
@@ -386,6 +335,10 @@ var CircularBuffer = class {
386
335
  get elementCount() {
387
336
  return this._elementCount;
388
337
  }
338
+ clear() {
339
+ this._nextIndex = 0;
340
+ this._elementCount = 0;
341
+ }
389
342
  getLast() {
390
343
  if (this._elementCount === 0) {
391
344
  return void 0;
@@ -415,21 +368,6 @@ var CircularBuffer = class {
415
368
  yield this._buffer[i];
416
369
  }
417
370
  }
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
371
  };
434
372
 
435
373
  // src/clear-undefined.ts
@@ -448,22 +386,19 @@ var clearUndefined = (obj) => {
448
386
  // src/complex.ts
449
387
  import { inspect } from "@dxos/node-std/util";
450
388
  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
389
  var MAX_SERIALIZATION_LENGTH = 10;
465
- var _inspect_custom = inspect.custom;
466
390
  var ComplexSet = class {
391
+ _projection;
392
+ _values = /* @__PURE__ */ new Map();
393
+ // prettier-ignore
394
+ constructor(_projection, values) {
395
+ this._projection = _projection;
396
+ if (values) {
397
+ for (const value of values) {
398
+ this.add(value);
399
+ }
400
+ }
401
+ }
467
402
  toString() {
468
403
  return inspectObject(this);
469
404
  }
@@ -472,7 +407,7 @@ var ComplexSet = class {
472
407
  size: this._values.size
473
408
  } : Array.from(this._values.values());
474
409
  }
475
- [_inspect_custom]() {
410
+ [inspect.custom]() {
476
411
  return inspectObject(this);
477
412
  }
478
413
  add(value) {
@@ -538,18 +473,6 @@ var ComplexSet = class {
538
473
  isDisjointFrom(other) {
539
474
  throw new Error("Method not implemented.");
540
475
  }
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
476
  };
554
477
  var makeSet = (projection) => {
555
478
  return class BoundComplexSet extends ComplexSet {
@@ -558,8 +481,19 @@ var makeSet = (projection) => {
558
481
  }
559
482
  };
560
483
  };
561
- var _inspect_custom1 = inspect.custom;
562
484
  var ComplexMap = class _ComplexMap {
485
+ _keyProjection;
486
+ _keys = /* @__PURE__ */ new Map();
487
+ _values = /* @__PURE__ */ new Map();
488
+ // prettier-ignore
489
+ constructor(_keyProjection, entries2) {
490
+ this._keyProjection = _keyProjection;
491
+ if (entries2) {
492
+ for (const [key, value] of entries2) {
493
+ this.set(key, value);
494
+ }
495
+ }
496
+ }
563
497
  toString() {
564
498
  return inspectObject(this);
565
499
  }
@@ -568,7 +502,7 @@ var ComplexMap = class _ComplexMap {
568
502
  size: this._values.size
569
503
  } : Array.from(this._values.values());
570
504
  }
571
- [_inspect_custom1]() {
505
+ [inspect.custom]() {
572
506
  return inspectObject(this);
573
507
  }
574
508
  clear() {
@@ -630,39 +564,20 @@ var ComplexMap = class _ComplexMap {
630
564
  get [Symbol.toStringTag]() {
631
565
  return "ComplexMap";
632
566
  }
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
567
  };
648
- var makeMap = (keyProjection) => {
649
- class BoundComplexMap extends ComplexMap {
650
- constructor(entries2) {
651
- super(keyProjection, entries2);
652
- }
568
+ var makeMap = (keyProjection) => class BoundComplexMap extends ComplexMap {
569
+ constructor(entries2) {
570
+ super(keyProjection, entries2);
653
571
  }
654
- return BoundComplexMap;
655
572
  };
656
573
 
657
574
  // src/deep.ts
658
- import get from "lodash.get";
659
- import set from "lodash.set";
660
575
  import { invariant as invariant4 } from "@dxos/invariant";
661
576
  var __dxlog_file4 = "/__w/dxos/dxos/packages/common/util/src/deep.ts";
662
577
  var setDeep = (obj, path, value) => {
663
578
  invariant4(path.length > 0, void 0, {
664
579
  F: __dxlog_file4,
665
- L: 18,
580
+ L: 12,
666
581
  S: void 0,
667
582
  A: [
668
583
  "path.length > 0",
@@ -691,72 +606,51 @@ var getDeep = (obj, path) => {
691
606
  // src/defer-function.ts
692
607
  var deferFunction = (fnProvider) => (...args) => fnProvider()(...args);
693
608
 
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
609
  // 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
- }
610
+ import "@hazae41/symbol-dispose-polyfill";
714
611
  var defer = (fn) => new DeferGuard(fn);
715
612
  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
- }
613
+ _fn;
722
614
  /**
723
615
  * @internal
724
616
  */
725
617
  constructor(_fn) {
726
- _define_property4(this, "_fn", void 0);
727
618
  this._fn = _fn;
728
619
  }
620
+ [Symbol.dispose]() {
621
+ const result = this._fn();
622
+ if (result instanceof Promise) {
623
+ throw new Error("Async functions in defer are not supported. Use deferAsync instead.");
624
+ }
625
+ }
729
626
  };
730
627
  var deferAsync = (fn) => new DeferAsyncGuard(fn);
731
628
  var DeferAsyncGuard = class {
732
- async [Symbol.asyncDispose]() {
733
- await this._fn();
734
- }
629
+ _fn;
735
630
  /**
736
631
  * @internal
737
632
  */
738
633
  constructor(_fn) {
739
- _define_property4(this, "_fn", void 0);
740
634
  this._fn = _fn;
741
635
  }
636
+ async [Symbol.asyncDispose]() {
637
+ await this._fn();
638
+ }
742
639
  };
743
640
 
744
641
  // 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
642
  var entry = (map, key) => new MapEntry(map, key);
759
643
  var MapEntry = class {
644
+ _map;
645
+ _key;
646
+ /**
647
+ * @internal
648
+ */
649
+ // prettier-ignore
650
+ constructor(_map, _key) {
651
+ this._map = _map;
652
+ this._key = _key;
653
+ }
760
654
  get key() {
761
655
  return this._key;
762
656
  }
@@ -772,36 +666,19 @@ var MapEntry = class {
772
666
  deep(key) {
773
667
  return entry(this.value, key);
774
668
  }
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
669
  };
786
670
 
671
+ // src/filename.ts
672
+ var createFilename = ({ parts = [], ext, date = /* @__PURE__ */ new Date() }) => [
673
+ date.toISOString().replace(/[:.]/g, "-"),
674
+ ...parts
675
+ ].join("_") + (ext ? `.${ext}` : "");
676
+
787
677
  // src/for-each-async.ts
788
678
  var forEachAsync = (items, fn) => Promise.all(items.map(fn));
789
679
 
790
680
  // src/human-hash.ts
791
681
  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
682
  var DEFAULT_WORDLIST = [
806
683
  "ack",
807
684
  "alabama",
@@ -1061,6 +938,27 @@ var DEFAULT_WORDLIST = [
1061
938
  "zulu"
1062
939
  ];
1063
940
  var HumanHasher = class {
941
+ wordlist;
942
+ /**
943
+ * Transforms hex digests to human-readable strings.
944
+ *
945
+ * The format of these strings will look something like:
946
+ * `victor-bacon-zulu-lima`. The output is obtained by compressing the input
947
+ * digest to a fixed number of bytes, then mapping those bytes to one of 256
948
+ * words. A default wordlist is provided, but you can override this if you
949
+ * prefer.
950
+ * As long as you use the same wordlist, the output will be consistent (i.e.
951
+ * the same digest will always render the same representation).
952
+ *
953
+ * @param wordlist A list of exactly 256 words to choose from
954
+ */
955
+ constructor(wordlist = DEFAULT_WORDLIST) {
956
+ this.wordlist = wordlist;
957
+ if (wordlist.length !== 256) {
958
+ throw new Error("Wordlist must have exactly 256 items");
959
+ }
960
+ this.wordlist = wordlist;
961
+ }
1064
962
  /**
1065
963
  * Humanize a given hexadecimal digest.
1066
964
  *
@@ -1100,27 +998,6 @@ var HumanHasher = class {
1100
998
  const checksums = segments.map((x) => x.reduce((acc, curr) => acc ^ curr));
1101
999
  return checksums;
1102
1000
  }
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
1001
  };
1125
1002
  var hasher = new HumanHasher();
1126
1003
  var humanize = (value) => {
@@ -1143,10 +1020,8 @@ var defaultMap = (map, key, def) => {
1143
1020
  };
1144
1021
 
1145
1022
  // 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());
1023
+ var symbol = /* @__PURE__ */ Symbol.for("dxos.instance-contexts");
1024
+ var instanceContexts = globalThis[symbol] ??= /* @__PURE__ */ new WeakMap();
1150
1025
  var getPrototypeSpecificInstanceId = (instance) => {
1151
1026
  const prototype = Object.getPrototypeOf(instance);
1152
1027
  const instanceCtx = defaultMap(instanceContexts, prototype, () => ({
@@ -1318,19 +1193,6 @@ var jsonKeyReplacer = (options = {}) => (key, value) => {
1318
1193
  };
1319
1194
 
1320
1195
  // 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
1196
  var mapValues = (obj, fn) => {
1335
1197
  const result = {};
1336
1198
  Object.keys(obj).forEach((key) => {
@@ -1342,6 +1204,11 @@ var deepMapValues = (value, fn) => {
1342
1204
  return new DeepMapper(fn).map(value);
1343
1205
  };
1344
1206
  var DeepMapper = class {
1207
+ _fn;
1208
+ _cyclic = /* @__PURE__ */ new Map();
1209
+ constructor(_fn) {
1210
+ this._fn = _fn;
1211
+ }
1345
1212
  map(value) {
1346
1213
  return this._map(value, void 0);
1347
1214
  }
@@ -1351,40 +1218,38 @@ var DeepMapper = class {
1351
1218
  }
1352
1219
  return this._fn(value, this._recurse, key);
1353
1220
  }
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);
1221
+ _recurse = (value) => {
1222
+ if (this._cyclic.has(value)) {
1223
+ return this._cyclic.get(value);
1224
+ }
1225
+ if (Array.isArray(value)) {
1226
+ const res = new Array(value.length);
1227
+ this._cyclic.set(value, res);
1228
+ for (let i = 0; i < value.length; i++) {
1229
+ res[i] = this._map(value[i], i);
1363
1230
  }
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;
1231
+ return res;
1232
+ } else if (value !== null && typeof value === "object") {
1233
+ const res = {};
1234
+ this._cyclic.set(value, res);
1235
+ for (const key in value) {
1236
+ res[key] = this._map(value[key], key);
1380
1237
  }
1381
- };
1382
- }
1238
+ return res;
1239
+ } else {
1240
+ return value;
1241
+ }
1242
+ };
1383
1243
  };
1384
1244
  var deepMapValuesAsync = (value, fn) => {
1385
1245
  return new DeepMapperAsync(fn).map(value);
1386
1246
  };
1387
1247
  var DeepMapperAsync = class {
1248
+ _fn;
1249
+ _cyclic = /* @__PURE__ */ new Map();
1250
+ constructor(_fn) {
1251
+ this._fn = _fn;
1252
+ }
1388
1253
  map(value) {
1389
1254
  return this._map(value, void 0);
1390
1255
  }
@@ -1394,35 +1259,28 @@ var DeepMapperAsync = class {
1394
1259
  }
1395
1260
  return this._fn(value, this._recurse, key);
1396
1261
  }
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);
1262
+ _recurse = async (value) => {
1263
+ if (this._cyclic.has(value)) {
1264
+ return this._cyclic.get(value);
1265
+ }
1266
+ if (Array.isArray(value)) {
1267
+ const res = new Array(value.length);
1268
+ this._cyclic.set(value, res);
1269
+ for (let i = 0; i < value.length; i++) {
1270
+ res[i] = await this._map(value[i], i);
1406
1271
  }
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;
1272
+ return res;
1273
+ } else if (value !== null && typeof value === "object") {
1274
+ const res = {};
1275
+ this._cyclic.set(value, res);
1276
+ for (const key in value) {
1277
+ res[key] = await this._map(value[key], key);
1423
1278
  }
1424
- };
1425
- }
1279
+ return res;
1280
+ } else {
1281
+ return value;
1282
+ }
1283
+ };
1426
1284
  };
1427
1285
  var visitValues = (object, visitor) => {
1428
1286
  if (Array.isArray(object)) {
@@ -1511,7 +1369,18 @@ var omit = (obj, keys2) => {
1511
1369
 
1512
1370
  // src/platform.ts
1513
1371
  var isNode = () => typeof process !== "undefined" && process.versions != null && process.versions.node != null;
1514
- var mobileAndTabletCheck = () => {
1372
+ var isBun = () => globalThis.Bun !== void 0;
1373
+ var isTauri = () => !!globalThis.__TAURI__;
1374
+ var isMobile = () => {
1375
+ let check = false;
1376
+ (function(a) {
1377
+ 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))) {
1378
+ check = true;
1379
+ }
1380
+ })(navigator.userAgent || navigator.vendor || window.opera);
1381
+ return check;
1382
+ };
1383
+ var isMobileOrTablet = () => {
1515
1384
  let check = false;
1516
1385
  ((a) => {
1517
1386
  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 +1402,7 @@ var iosCheck = () => {
1533
1402
  };
1534
1403
  var safariCheck = () => typeof navigator !== "undefined" && /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
1535
1404
  var getHostPlatform = () => {
1536
- if (!("navigator" in window)) {
1405
+ if (!("navigator" in globalThis)) {
1537
1406
  return "unknown";
1538
1407
  }
1539
1408
  const platform = (navigator.userAgentData?.platform || navigator.platform)?.toLowerCase();
@@ -1728,7 +1597,7 @@ var safeAwaitAll = async (source, taskFactory, onError) => {
1728
1597
  };
1729
1598
 
1730
1599
  // src/safe-instanceof.ts
1731
- var instanceTag = Symbol("instanceTag");
1600
+ var instanceTag = /* @__PURE__ */ Symbol("instanceTag");
1732
1601
  var safeInstanceof = (tag) => (target) => {
1733
1602
  target.prototype[instanceTag] = tag;
1734
1603
  Object.defineProperty(target.prototype, Symbol.hasInstance, {
@@ -1740,48 +1609,151 @@ var safeInstanceof = (tag) => (target) => {
1740
1609
  };
1741
1610
 
1742
1611
  // src/safe-parse.ts
1743
- var safeParseInt = (value, defaultValue) => {
1612
+ function safeParseInt(str, defaultValue) {
1744
1613
  try {
1745
- const n = parseInt(value ?? "");
1746
- return isNaN(n) ? defaultValue : n;
1614
+ const value = parseInt(str ?? "");
1615
+ return isNaN(value) ? defaultValue : value;
1747
1616
  } catch {
1748
1617
  return defaultValue;
1749
1618
  }
1750
- };
1751
- var safeParseFloat = (str, defaultValue) => {
1619
+ }
1620
+ function safeParseFloat(str, defaultValue) {
1752
1621
  try {
1753
- return parseFloat(str);
1622
+ const value = parseFloat(str ?? "");
1623
+ return isNaN(value) ? defaultValue : value;
1754
1624
  } catch {
1755
- return defaultValue ?? 0;
1625
+ return defaultValue;
1756
1626
  }
1757
- };
1758
- var safeParseJson = (data, defaultValue) => {
1759
- if (data && data.length > 0) {
1627
+ }
1628
+ var safeParseJson = (str, defaultValue) => {
1629
+ if (str && str.length > 0) {
1760
1630
  try {
1761
- return JSON.parse(data);
1631
+ return JSON.parse(str);
1762
1632
  } catch {
1763
1633
  }
1764
1634
  }
1765
1635
  return defaultValue;
1766
1636
  };
1637
+ var safeUrl = (str) => {
1638
+ try {
1639
+ return new URL(str ?? "");
1640
+ } catch {
1641
+ return void 0;
1642
+ }
1643
+ };
1767
1644
 
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;
1645
+ // src/safe-stringify.ts
1646
+ var SKIP = Object.freeze({});
1647
+ function safeStringify(obj, filter = defaultFilter, indent = 2) {
1648
+ const seen = /* @__PURE__ */ new WeakMap();
1649
+ function replacer(key, value) {
1650
+ try {
1651
+ let path = key;
1652
+ if (!key) {
1653
+ path = "$";
1654
+ if (value != null && typeof value === "object") {
1655
+ seen.set(value, path);
1656
+ }
1657
+ return value;
1658
+ } else if (this) {
1659
+ const parentPath = seen.get(this);
1660
+ path = parentPath ? `${parentPath}.${key}` : key;
1661
+ }
1662
+ if (value == null) {
1663
+ return value;
1664
+ }
1665
+ if (typeof value === "function") {
1666
+ return void 0;
1667
+ }
1668
+ if (typeof value === "object" && Object.getPrototypeOf(value) !== Object.prototype && !Array.isArray(value)) {
1669
+ return void 0;
1670
+ }
1671
+ if (typeof value === "object" && value !== null) {
1672
+ const exists = seen.get(value);
1673
+ if (exists) {
1674
+ return `[${path} => ${exists}]`;
1675
+ }
1676
+ seen.set(value, path);
1677
+ }
1678
+ if (filter) {
1679
+ const filteredValue = filter?.(key, value);
1680
+ if (filteredValue !== void 0) {
1681
+ return filteredValue === SKIP ? void 0 : filteredValue;
1682
+ }
1683
+ }
1684
+ return value;
1685
+ } catch (error) {
1686
+ return `ERROR: ${error.message}`;
1687
+ }
1688
+ }
1689
+ try {
1690
+ return JSON.stringify(obj, replacer, indent);
1691
+ } catch (error) {
1692
+ return `ERROR: ${error.message}`;
1780
1693
  }
1781
- return obj;
1782
1694
  }
1695
+ var createReplacer = ({ omit: omit2, parse, maxDepth, maxArrayLen, maxStringLen } = {}) => {
1696
+ let currentDepth = 0;
1697
+ const depthMap = /* @__PURE__ */ new WeakMap();
1698
+ return function(key, value) {
1699
+ if (key === "") {
1700
+ currentDepth = 0;
1701
+ } else if (this && typeof this === "object") {
1702
+ const parentDepth = depthMap.get(this) ?? 0;
1703
+ currentDepth = parentDepth + 1;
1704
+ }
1705
+ if (typeof value === "function") {
1706
+ return SKIP;
1707
+ }
1708
+ if (maxArrayLen != null && Array.isArray(value) && value.length > maxArrayLen) {
1709
+ return `[length: ${value.length}]`;
1710
+ }
1711
+ if (value && typeof value === "object") {
1712
+ depthMap.set(value, currentDepth);
1713
+ if (maxDepth != null && currentDepth >= maxDepth) {
1714
+ return Array.isArray(value) ? `[{ length: ${value.length} }]` : `{ keys: ${Object.keys(value).length} }`;
1715
+ }
1716
+ }
1717
+ if (omit2?.includes(key)) {
1718
+ return SKIP;
1719
+ }
1720
+ if (parse?.includes(key) && typeof value === "string") {
1721
+ try {
1722
+ return JSON.parse(value);
1723
+ } catch {
1724
+ return value;
1725
+ }
1726
+ }
1727
+ if (maxStringLen != null && typeof value === "string" && value.length > maxStringLen) {
1728
+ return value.slice(0, maxStringLen) + "...";
1729
+ }
1730
+ return value;
1731
+ };
1732
+ };
1733
+ var defaultFilter = createReplacer();
1734
+
1735
+ // src/sliding-window-summary.ts
1736
+ import { invariant as invariant5 } from "@dxos/invariant";
1783
1737
  var __dxlog_file5 = "/__w/dxos/dxos/packages/common/util/src/sliding-window-summary.ts";
1784
1738
  var SlidingWindowSummary = class {
1739
+ _buffer;
1740
+ _sum = 0;
1741
+ _precision;
1742
+ constructor(options) {
1743
+ this._buffer = new CircularBuffer(options.dataPoints);
1744
+ if (options.precision != null) {
1745
+ invariant5(options.precision >= 0, void 0, {
1746
+ F: __dxlog_file5,
1747
+ L: 26,
1748
+ S: this,
1749
+ A: [
1750
+ "options.precision >= 0",
1751
+ ""
1752
+ ]
1753
+ });
1754
+ this._precision = Math.pow(10, options.precision);
1755
+ }
1756
+ }
1785
1757
  record(value) {
1786
1758
  const evicted = this._buffer.push(value);
1787
1759
  this._sum += value - (evicted ?? 0);
@@ -1816,24 +1788,6 @@ var SlidingWindowSummary = class {
1816
1788
  }
1817
1789
  return Math.round(value * this._precision) / this._precision;
1818
1790
  }
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
1791
  };
1838
1792
 
1839
1793
  // src/sort.ts
@@ -1896,18 +1850,6 @@ var throwUnhandledError = (error) => {
1896
1850
 
1897
1851
  // src/to-fallback.ts
1898
1852
  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
1853
  "\u{1F47B}",
1912
1854
  "\u{1F479}",
1913
1855
  "\u{1F47D}",
@@ -2043,17 +1985,18 @@ var idEmoji = [
2043
1985
  ];
2044
1986
  var idHue = [
2045
1987
  "red",
2046
- // 'orange' as const, /* More shades in these palettes are considered “ugly” */
1988
+ "orange",
2047
1989
  "amber",
2048
- // 'yellow' as const, /* More shades in these palettes are considered “ugly” */
1990
+ "yellow",
2049
1991
  "lime",
2050
1992
  "green",
2051
1993
  "emerald",
2052
1994
  "teal",
2053
1995
  "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 */
1996
+ // Omit colors similar to primary accent.
1997
+ // 'sky' as const,
1998
+ // 'blue' as const,
1999
+ // 'indigo' as const,
2057
2000
  "violet",
2058
2001
  "purple",
2059
2002
  "fuchsia",
@@ -2080,20 +2023,9 @@ var toFallback = (hash) => {
2080
2023
  };
2081
2024
 
2082
2025
  // 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
2026
  var Tracer = class {
2027
+ _events = /* @__PURE__ */ new Map();
2028
+ _recording = false;
2097
2029
  // TODO(burdon): Start/stop methods for recording data? By id?
2098
2030
  // Alternatively, enable subscriptions to track/compute series.
2099
2031
  // TODO(burdon): Hierarchical traces?
@@ -2150,10 +2082,6 @@ var Tracer = class {
2150
2082
  defaultMap(this._events, event.id, []).push(event);
2151
2083
  }
2152
2084
  }
2153
- constructor() {
2154
- _define_property9(this, "_events", /* @__PURE__ */ new Map());
2155
- _define_property9(this, "_recording", false);
2156
- }
2157
2085
  };
2158
2086
  var tracer = new Tracer();
2159
2087
 
@@ -2228,69 +2156,112 @@ var arrayMove = (array, from, to) => {
2228
2156
  array.splice(to < 0 ? array.length + to : to, 0, array.splice(from, 1)[0]);
2229
2157
  return array;
2230
2158
  };
2159
+ function arraySwap(array, from, to) {
2160
+ const current = array[from];
2161
+ array[from] = array[to];
2162
+ array[to] = current;
2163
+ return array;
2164
+ }
2231
2165
 
2232
2166
  // src/unit.ts
2233
- var Formatter = (unit) => {
2234
- return (n, precision = 2) => {
2167
+ var createFormat = (unit) => {
2168
+ return (n, precision = unit.precision ?? 0) => {
2235
2169
  const value = n / unit.quotient;
2236
- return `${value.toFixed(precision)}${unit.symbol}`;
2170
+ return {
2171
+ unit,
2172
+ value,
2173
+ formattedValue: value.toFixed(precision),
2174
+ toString: () => `${value.toFixed(precision)}${unit.symbol}`
2175
+ };
2237
2176
  };
2238
2177
  };
2178
+ var MS_SECONDS = 1e3;
2179
+ var MS_MINUTES = 60 * MS_SECONDS;
2180
+ var MS_HOURS = 60 * MS_MINUTES;
2239
2181
  var Unit = {
2240
- // ms.
2241
- Hour: Formatter({
2182
+ // General.
2183
+ Percent: createFormat({
2184
+ symbol: "%",
2185
+ quotient: 1 / 100,
2186
+ precision: 2
2187
+ }),
2188
+ Thousand: createFormat({
2189
+ symbol: "k",
2190
+ quotient: 1e3,
2191
+ precision: 2
2192
+ }),
2193
+ // Bytes (note KB vs KiB).
2194
+ Gigabyte: createFormat({
2195
+ symbol: "GB",
2196
+ quotient: 1e3 * 1e3 * 1e3,
2197
+ precision: 2
2198
+ }),
2199
+ Megabyte: createFormat({
2200
+ symbol: "MB",
2201
+ quotient: 1e3 * 1e3,
2202
+ precision: 2
2203
+ }),
2204
+ Kilobyte: createFormat({
2205
+ symbol: "KB",
2206
+ quotient: 1e3,
2207
+ precision: 2
2208
+ }),
2209
+ Byte: createFormat({
2210
+ symbol: "B",
2211
+ quotient: 1
2212
+ }),
2213
+ // Time.
2214
+ Hour: createFormat({
2242
2215
  symbol: "h",
2243
- quotient: 60 * 60 * 1e3
2216
+ quotient: MS_HOURS
2244
2217
  }),
2245
- Minute: Formatter({
2218
+ Minute: createFormat({
2246
2219
  symbol: "m",
2247
- quotient: 60 * 1e3
2220
+ quotient: MS_MINUTES
2248
2221
  }),
2249
- Second: Formatter({
2222
+ Second: createFormat({
2250
2223
  symbol: "s",
2251
- quotient: 1e3
2224
+ quotient: MS_SECONDS,
2225
+ precision: 1
2252
2226
  }),
2253
- Millisecond: Formatter({
2227
+ Millisecond: createFormat({
2254
2228
  symbol: "ms",
2255
2229
  quotient: 1
2256
2230
  }),
2257
2231
  Duration: (n) => {
2258
- const hours = Math.floor(n / (60 * 60 * 1e3));
2259
- const minutes = Math.floor(n % (60 * 60 * 1e3) / (60 * 1e3));
2232
+ const hours = Math.floor(n / MS_HOURS);
2233
+ const minutes = Math.floor(n % MS_HOURS / MS_MINUTES);
2260
2234
  if (hours) {
2261
- return minutes ? `${hours}h ${minutes}m` : `${hours}h`;
2235
+ const formattedValue = minutes ? `${hours}h ${minutes}m` : `${hours}h`;
2236
+ return {
2237
+ unit: {
2238
+ symbol: "h",
2239
+ quotient: MS_HOURS
2240
+ },
2241
+ value: hours,
2242
+ formattedValue,
2243
+ toString: () => formattedValue
2244
+ };
2262
2245
  }
2263
- const seconds = Math.floor(n % (60 * 1e3) / 1e3);
2264
2246
  if (minutes) {
2265
- return seconds ? `${minutes}m ${seconds}s` : `${minutes}m`;
2247
+ const seconds2 = (n - MS_MINUTES * minutes) / MS_SECONDS;
2248
+ const formattedValue = seconds2 ? `${minutes}m ${seconds2}s` : `${minutes}m`;
2249
+ return {
2250
+ unit: {
2251
+ symbol: "m",
2252
+ quotient: MS_MINUTES
2253
+ },
2254
+ value: minutes,
2255
+ formattedValue,
2256
+ toString: () => formattedValue
2257
+ };
2266
2258
  }
2259
+ const seconds = n >= MS_SECONDS;
2267
2260
  if (seconds) {
2268
- return `${(n / 1e3).toFixed(1)}s`;
2261
+ return Unit.Second(n);
2269
2262
  }
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
- })
2263
+ return Unit.Millisecond(n);
2264
+ }
2294
2265
  };
2295
2266
 
2296
2267
  // src/url.ts
@@ -2303,20 +2274,18 @@ var createUrl = (url, search) => {
2303
2274
  };
2304
2275
 
2305
2276
  // 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
2277
  var WeakDictionary = class {
2278
+ _internal = /* @__PURE__ */ new Map();
2279
+ _finalization = new FinalizationRegistry((cleanUpCallback) => {
2280
+ cleanUpCallback();
2281
+ });
2282
+ constructor(entries2) {
2283
+ this._internal = new Map(entries2?.map(([key, value]) => [
2284
+ key,
2285
+ new WeakRef(value)
2286
+ ]));
2287
+ entries2?.forEach(([key, value]) => this._register(key, value));
2288
+ }
2320
2289
  *entries() {
2321
2290
  for (const [key, value] of this._internal) {
2322
2291
  yield [
@@ -2397,16 +2366,57 @@ var WeakDictionary = class {
2397
2366
  _unregister(value) {
2398
2367
  this._finalization.unregister(value);
2399
2368
  }
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));
2369
+ };
2370
+
2371
+ // src/error-format.ts
2372
+ var formatErrorWithCauses = (error) => {
2373
+ const lines = [];
2374
+ let current = error;
2375
+ let level = 0;
2376
+ while (current) {
2377
+ const prefix = level === 0 ? "" : `Caused by: `;
2378
+ lines.push(prefix + (current.stack ?? String(current)));
2379
+ if (!(current.cause instanceof Error)) break;
2380
+ current = current.cause;
2381
+ level += 1;
2382
+ }
2383
+ return lines.join("\n\n");
2384
+ };
2385
+
2386
+ // src/retry.ts
2387
+ var DEFAULT_RETRY_OPTIONS = {
2388
+ count: 3,
2389
+ delayMs: 100,
2390
+ exponent: 2,
2391
+ retryOnError: async () => true,
2392
+ retryOnValue: async () => false
2393
+ };
2394
+ var retry = async (options, cb) => {
2395
+ const fullOptions = {
2396
+ ...DEFAULT_RETRY_OPTIONS,
2397
+ ...options
2398
+ };
2399
+ let numRetries = 0, currentDelay = fullOptions.delayMs;
2400
+ while (true) {
2401
+ let result;
2402
+ try {
2403
+ result = await cb();
2404
+ } catch (err) {
2405
+ if (numRetries > fullOptions.count || !await fullOptions.retryOnError(err)) {
2406
+ throw err;
2407
+ }
2408
+ await new Promise((resolve) => setTimeout(resolve, currentDelay));
2409
+ currentDelay *= fullOptions.exponent;
2410
+ numRetries++;
2411
+ continue;
2412
+ }
2413
+ if (!await fullOptions.retryOnValue(result)) {
2414
+ return result;
2415
+ }
2416
+ await new Promise((resolve) => setTimeout(resolve, currentDelay));
2417
+ currentDelay *= fullOptions.exponent;
2418
+ numRetries++;
2419
+ continue;
2410
2420
  }
2411
2421
  };
2412
2422
  export {
@@ -2418,12 +2428,14 @@ export {
2418
2428
  ComplexSet,
2419
2429
  HumanHasher,
2420
2430
  MapEntry,
2431
+ SKIP,
2421
2432
  SlidingWindowSummary,
2422
2433
  Tracer,
2423
2434
  Unit,
2424
2435
  WeakDictionary,
2425
2436
  accessBy,
2426
2437
  arrayMove,
2438
+ arraySwap,
2427
2439
  arrayToBuffer,
2428
2440
  arrayToHex,
2429
2441
  arrayToString,
@@ -2435,18 +2447,22 @@ export {
2435
2447
  chunkArray,
2436
2448
  clamp,
2437
2449
  clearUndefined,
2450
+ coerceArray,
2438
2451
  compareMulti,
2439
2452
  compareObject,
2440
2453
  compareScalar,
2441
2454
  compareString,
2442
2455
  createBinder,
2443
2456
  createBucketReducer,
2457
+ createFilename,
2444
2458
  createGroupReducer,
2459
+ createReplacer,
2445
2460
  createSetDispatch,
2446
2461
  createUrl,
2447
2462
  decamelize,
2448
2463
  deepMapValues,
2449
2464
  deepMapValuesAsync,
2465
+ defaultFilter,
2450
2466
  defaultMap,
2451
2467
  defer,
2452
2468
  deferAsync,
@@ -2458,7 +2474,7 @@ export {
2458
2474
  entry,
2459
2475
  exponentialBackoffInterval,
2460
2476
  forEachAsync,
2461
- get,
2477
+ formatErrorWithCauses,
2462
2478
  getAsyncProviderValue,
2463
2479
  getDate,
2464
2480
  getDebugName,
@@ -2478,8 +2494,12 @@ export {
2478
2494
  intersectBy,
2479
2495
  intersection,
2480
2496
  iosCheck,
2497
+ isBun,
2498
+ isMobile,
2499
+ isMobileOrTablet,
2481
2500
  isNode,
2482
2501
  isNonNullable,
2502
+ isTauri,
2483
2503
  isTruthy,
2484
2504
  joinTables,
2485
2505
  jsonKeyReplacer,
@@ -2495,7 +2515,6 @@ export {
2495
2515
  makeSet,
2496
2516
  mapValues,
2497
2517
  median,
2498
- mobileAndTabletCheck,
2499
2518
  numericalValues,
2500
2519
  omit,
2501
2520
  orderKeys,
@@ -2511,13 +2530,15 @@ export {
2511
2530
  removeBy,
2512
2531
  removeProperties,
2513
2532
  removeUndefinedProperties,
2533
+ retry,
2514
2534
  safariCheck,
2515
2535
  safeAwaitAll,
2516
2536
  safeInstanceof,
2517
2537
  safeParseFloat,
2518
2538
  safeParseInt,
2519
2539
  safeParseJson,
2520
- set,
2540
+ safeStringify,
2541
+ safeUrl,
2521
2542
  setDeep,
2522
2543
  sortKeys,
2523
2544
  stringToArray,