@dxos/util 0.8.4-main.e99c46d → 0.8.4-main.ef1bc66f44

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 (59) hide show
  1. package/dist/lib/browser/index.mjs +450 -459
  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 +450 -459
  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/deep.d.ts.map +1 -1
  10. package/dist/types/src/defer.d.ts +1 -1
  11. package/dist/types/src/defer.d.ts.map +1 -1
  12. package/dist/types/src/di-key.d.ts +3 -3
  13. package/dist/types/src/di-key.d.ts.map +1 -1
  14. package/dist/types/src/error-format.d.ts +5 -0
  15. package/dist/types/src/error-format.d.ts.map +1 -0
  16. package/dist/types/src/filename.d.ts +9 -0
  17. package/dist/types/src/filename.d.ts.map +1 -0
  18. package/dist/types/src/index.d.ts +4 -1
  19. package/dist/types/src/index.d.ts.map +1 -1
  20. package/dist/types/src/platform.d.ts +4 -1
  21. package/dist/types/src/platform.d.ts.map +1 -1
  22. package/dist/types/src/retry.d.ts +32 -0
  23. package/dist/types/src/retry.d.ts.map +1 -0
  24. package/dist/types/src/safe-parse.d.ts +6 -4
  25. package/dist/types/src/safe-parse.d.ts.map +1 -1
  26. package/dist/types/src/safe-stringify.d.ts +22 -0
  27. package/dist/types/src/safe-stringify.d.ts.map +1 -0
  28. package/dist/types/src/string.d.ts +4 -0
  29. package/dist/types/src/string.d.ts.map +1 -1
  30. package/dist/types/src/to-fallback.d.ts.map +1 -1
  31. package/dist/types/src/types.d.ts +23 -6
  32. package/dist/types/src/types.d.ts.map +1 -1
  33. package/dist/types/src/unit.d.ts +12 -13
  34. package/dist/types/src/unit.d.ts.map +1 -1
  35. package/dist/types/tsconfig.tsbuildinfo +1 -1
  36. package/package.json +12 -7
  37. package/src/array.ts +9 -2
  38. package/src/binder.ts +2 -2
  39. package/src/deep.ts +2 -0
  40. package/src/defer.ts +1 -1
  41. package/src/error-format.ts +22 -0
  42. package/src/filename.ts +16 -0
  43. package/src/index.ts +4 -1
  44. package/src/platform.ts +12 -2
  45. package/src/retry.ts +74 -0
  46. package/src/safe-parse.ts +19 -16
  47. package/src/safe-stringify.ts +146 -0
  48. package/src/string.ts +7 -0
  49. package/src/to-fallback.ts +5 -4
  50. package/src/types.test.ts +11 -1
  51. package/src/types.ts +38 -11
  52. package/src/unit.test.ts +1 -1
  53. package/src/unit.ts +59 -28
  54. package/dist/types/src/explicit-resource-management-polyfill.d.ts +0 -1
  55. package/dist/types/src/explicit-resource-management-polyfill.d.ts.map +0 -1
  56. package/dist/types/src/first-two-chars.d.ts +0 -9
  57. package/dist/types/src/first-two-chars.d.ts.map +0 -1
  58. package/src/explicit-resource-management-polyfill.ts +0 -13
  59. package/src/first-two-chars.ts +0 -44
@@ -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;
@@ -415,21 +364,6 @@ var CircularBuffer = class {
415
364
  yield this._buffer[i];
416
365
  }
417
366
  }
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
367
  };
434
368
 
435
369
  // src/clear-undefined.ts
@@ -448,22 +382,19 @@ var clearUndefined = (obj) => {
448
382
  // src/complex.ts
449
383
  import { inspect } from "@dxos/node-std/util";
450
384
  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
385
  var MAX_SERIALIZATION_LENGTH = 10;
465
- var _inspect_custom = inspect.custom;
466
386
  var ComplexSet = class {
387
+ _projection;
388
+ _values = /* @__PURE__ */ new Map();
389
+ // prettier-ignore
390
+ constructor(_projection, values) {
391
+ this._projection = _projection;
392
+ if (values) {
393
+ for (const value of values) {
394
+ this.add(value);
395
+ }
396
+ }
397
+ }
467
398
  toString() {
468
399
  return inspectObject(this);
469
400
  }
@@ -472,7 +403,7 @@ var ComplexSet = class {
472
403
  size: this._values.size
473
404
  } : Array.from(this._values.values());
474
405
  }
475
- [_inspect_custom]() {
406
+ [inspect.custom]() {
476
407
  return inspectObject(this);
477
408
  }
478
409
  add(value) {
@@ -538,18 +469,6 @@ var ComplexSet = class {
538
469
  isDisjointFrom(other) {
539
470
  throw new Error("Method not implemented.");
540
471
  }
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
472
  };
554
473
  var makeSet = (projection) => {
555
474
  return class BoundComplexSet extends ComplexSet {
@@ -558,8 +477,19 @@ var makeSet = (projection) => {
558
477
  }
559
478
  };
560
479
  };
561
- var _inspect_custom1 = inspect.custom;
562
480
  var ComplexMap = class _ComplexMap {
481
+ _keyProjection;
482
+ _keys = /* @__PURE__ */ new Map();
483
+ _values = /* @__PURE__ */ new Map();
484
+ // prettier-ignore
485
+ constructor(_keyProjection, entries2) {
486
+ this._keyProjection = _keyProjection;
487
+ if (entries2) {
488
+ for (const [key, value] of entries2) {
489
+ this.set(key, value);
490
+ }
491
+ }
492
+ }
563
493
  toString() {
564
494
  return inspectObject(this);
565
495
  }
@@ -568,7 +498,7 @@ var ComplexMap = class _ComplexMap {
568
498
  size: this._values.size
569
499
  } : Array.from(this._values.values());
570
500
  }
571
- [_inspect_custom1]() {
501
+ [inspect.custom]() {
572
502
  return inspectObject(this);
573
503
  }
574
504
  clear() {
@@ -630,28 +560,11 @@ var ComplexMap = class _ComplexMap {
630
560
  get [Symbol.toStringTag]() {
631
561
  return "ComplexMap";
632
562
  }
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
563
  };
648
- var makeMap = (keyProjection) => {
649
- class BoundComplexMap extends ComplexMap {
650
- constructor(entries2) {
651
- super(keyProjection, entries2);
652
- }
564
+ var makeMap = (keyProjection) => class BoundComplexMap extends ComplexMap {
565
+ constructor(entries2) {
566
+ super(keyProjection, entries2);
653
567
  }
654
- return BoundComplexMap;
655
568
  };
656
569
 
657
570
  // src/deep.ts
@@ -691,72 +604,51 @@ var getDeep = (obj, path) => {
691
604
  // src/defer-function.ts
692
605
  var deferFunction = (fnProvider) => (...args) => fnProvider()(...args);
693
606
 
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
607
  // 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
- }
608
+ import "@hazae41/symbol-dispose-polyfill";
714
609
  var defer = (fn) => new DeferGuard(fn);
715
610
  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
- }
611
+ _fn;
722
612
  /**
723
613
  * @internal
724
614
  */
725
615
  constructor(_fn) {
726
- _define_property4(this, "_fn", void 0);
727
616
  this._fn = _fn;
728
617
  }
618
+ [Symbol.dispose]() {
619
+ const result = this._fn();
620
+ if (result instanceof Promise) {
621
+ throw new Error("Async functions in defer are not supported. Use deferAsync instead.");
622
+ }
623
+ }
729
624
  };
730
625
  var deferAsync = (fn) => new DeferAsyncGuard(fn);
731
626
  var DeferAsyncGuard = class {
732
- async [Symbol.asyncDispose]() {
733
- await this._fn();
734
- }
627
+ _fn;
735
628
  /**
736
629
  * @internal
737
630
  */
738
631
  constructor(_fn) {
739
- _define_property4(this, "_fn", void 0);
740
632
  this._fn = _fn;
741
633
  }
634
+ async [Symbol.asyncDispose]() {
635
+ await this._fn();
636
+ }
742
637
  };
743
638
 
744
639
  // 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
640
  var entry = (map, key) => new MapEntry(map, key);
759
641
  var MapEntry = class {
642
+ _map;
643
+ _key;
644
+ /**
645
+ * @internal
646
+ */
647
+ // prettier-ignore
648
+ constructor(_map, _key) {
649
+ this._map = _map;
650
+ this._key = _key;
651
+ }
760
652
  get key() {
761
653
  return this._key;
762
654
  }
@@ -772,63 +664,19 @@ var MapEntry = class {
772
664
  deep(key) {
773
665
  return entry(this.value, key);
774
666
  }
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
667
  };
786
668
 
787
- // src/first-two-chars.ts
788
- var renderableCharRegex = /^(?![\p{Control}\p{Mark}\p{Separator}\p{Surrogate}\p{Unassigned}\p{P}])[\p{L}\p{N}\p{S}\p{Emoji}]$/u;
789
- var getFirstTwoRenderableChars = (label) => {
790
- const characters = Array.from(label);
791
- const result = [
792
- "",
793
- ""
794
- ];
795
- let foundFirst = false;
796
- for (let i = 0; i < characters.length; i++) {
797
- const char = characters[i];
798
- if (renderableCharRegex.test(char)) {
799
- if (!foundFirst) {
800
- result[0] = char;
801
- foundFirst = true;
802
- } else {
803
- const textBetween = characters.slice(result[0].length, i).join("");
804
- if (/[^\p{L}\p{N}_]/u.test(textBetween)) {
805
- result[1] = char;
806
- break;
807
- }
808
- }
809
- }
810
- }
811
- return result;
812
- };
669
+ // src/filename.ts
670
+ var createFilename = ({ parts = [], ext, date = /* @__PURE__ */ new Date() }) => [
671
+ date.toISOString().replace(/[:.]/g, "-"),
672
+ ...parts
673
+ ].join("_") + (ext ? `.${ext}` : "");
813
674
 
814
675
  // src/for-each-async.ts
815
676
  var forEachAsync = (items, fn) => Promise.all(items.map(fn));
816
677
 
817
678
  // src/human-hash.ts
818
679
  import { PublicKey } from "@dxos/keys";
819
- function _define_property6(obj, key, value) {
820
- if (key in obj) {
821
- Object.defineProperty(obj, key, {
822
- value,
823
- enumerable: true,
824
- configurable: true,
825
- writable: true
826
- });
827
- } else {
828
- obj[key] = value;
829
- }
830
- return obj;
831
- }
832
680
  var DEFAULT_WORDLIST = [
833
681
  "ack",
834
682
  "alabama",
@@ -1088,6 +936,27 @@ var DEFAULT_WORDLIST = [
1088
936
  "zulu"
1089
937
  ];
1090
938
  var HumanHasher = class {
939
+ wordlist;
940
+ /**
941
+ * Transforms hex digests to human-readable strings.
942
+ *
943
+ * The format of these strings will look something like:
944
+ * `victor-bacon-zulu-lima`. The output is obtained by compressing the input
945
+ * digest to a fixed number of bytes, then mapping those bytes to one of 256
946
+ * words. A default wordlist is provided, but you can override this if you
947
+ * prefer.
948
+ * As long as you use the same wordlist, the output will be consistent (i.e.
949
+ * the same digest will always render the same representation).
950
+ *
951
+ * @param wordlist A list of exactly 256 words to choose from
952
+ */
953
+ constructor(wordlist = DEFAULT_WORDLIST) {
954
+ this.wordlist = wordlist;
955
+ if (wordlist.length !== 256) {
956
+ throw new Error("Wordlist must have exactly 256 items");
957
+ }
958
+ this.wordlist = wordlist;
959
+ }
1091
960
  /**
1092
961
  * Humanize a given hexadecimal digest.
1093
962
  *
@@ -1127,27 +996,6 @@ var HumanHasher = class {
1127
996
  const checksums = segments.map((x) => x.reduce((acc, curr) => acc ^ curr));
1128
997
  return checksums;
1129
998
  }
1130
- /**
1131
- * Transforms hex digests to human-readable strings.
1132
- *
1133
- * The format of these strings will look something like:
1134
- * `victor-bacon-zulu-lima`. The output is obtained by compressing the input
1135
- * digest to a fixed number of bytes, then mapping those bytes to one of 256
1136
- * words. A default wordlist is provided, but you can override this if you
1137
- * prefer.
1138
- * As long as you use the same wordlist, the output will be consistent (i.e.
1139
- * the same digest will always render the same representation).
1140
- *
1141
- * @param wordlist A list of exactly 256 words to choose from
1142
- */
1143
- constructor(wordlist = DEFAULT_WORDLIST) {
1144
- _define_property6(this, "wordlist", void 0);
1145
- this.wordlist = wordlist;
1146
- if (wordlist.length !== 256) {
1147
- throw new Error("Wordlist must have exactly 256 items");
1148
- }
1149
- this.wordlist = wordlist;
1150
- }
1151
999
  };
1152
1000
  var hasher = new HumanHasher();
1153
1001
  var humanize = (value) => {
@@ -1170,10 +1018,8 @@ var defaultMap = (map, key, def) => {
1170
1018
  };
1171
1019
 
1172
1020
  // src/instance-id.ts
1173
- var _globalThis;
1174
- var _symbol;
1175
1021
  var symbol = Symbol.for("dxos.instance-contexts");
1176
- var instanceContexts = (_globalThis = globalThis)[_symbol = symbol] ?? (_globalThis[_symbol] = /* @__PURE__ */ new WeakMap());
1022
+ var instanceContexts = globalThis[symbol] ??= /* @__PURE__ */ new WeakMap();
1177
1023
  var getPrototypeSpecificInstanceId = (instance) => {
1178
1024
  const prototype = Object.getPrototypeOf(instance);
1179
1025
  const instanceCtx = defaultMap(instanceContexts, prototype, () => ({
@@ -1345,19 +1191,6 @@ var jsonKeyReplacer = (options = {}) => (key, value) => {
1345
1191
  };
1346
1192
 
1347
1193
  // src/map-values.ts
1348
- function _define_property7(obj, key, value) {
1349
- if (key in obj) {
1350
- Object.defineProperty(obj, key, {
1351
- value,
1352
- enumerable: true,
1353
- configurable: true,
1354
- writable: true
1355
- });
1356
- } else {
1357
- obj[key] = value;
1358
- }
1359
- return obj;
1360
- }
1361
1194
  var mapValues = (obj, fn) => {
1362
1195
  const result = {};
1363
1196
  Object.keys(obj).forEach((key) => {
@@ -1369,6 +1202,11 @@ var deepMapValues = (value, fn) => {
1369
1202
  return new DeepMapper(fn).map(value);
1370
1203
  };
1371
1204
  var DeepMapper = class {
1205
+ _fn;
1206
+ _cyclic = /* @__PURE__ */ new Map();
1207
+ constructor(_fn) {
1208
+ this._fn = _fn;
1209
+ }
1372
1210
  map(value) {
1373
1211
  return this._map(value, void 0);
1374
1212
  }
@@ -1378,40 +1216,38 @@ var DeepMapper = class {
1378
1216
  }
1379
1217
  return this._fn(value, this._recurse, key);
1380
1218
  }
1381
- constructor(_fn) {
1382
- _define_property7(this, "_fn", void 0);
1383
- _define_property7(this, "_cyclic", void 0);
1384
- _define_property7(this, "_recurse", void 0);
1385
- this._fn = _fn;
1386
- this._cyclic = /* @__PURE__ */ new Map();
1387
- this._recurse = (value) => {
1388
- if (this._cyclic.has(value)) {
1389
- return this._cyclic.get(value);
1219
+ _recurse = (value) => {
1220
+ if (this._cyclic.has(value)) {
1221
+ return this._cyclic.get(value);
1222
+ }
1223
+ if (Array.isArray(value)) {
1224
+ const res = new Array(value.length);
1225
+ this._cyclic.set(value, res);
1226
+ for (let i = 0; i < value.length; i++) {
1227
+ res[i] = this._map(value[i], i);
1390
1228
  }
1391
- if (Array.isArray(value)) {
1392
- const res = new Array(value.length);
1393
- this._cyclic.set(value, res);
1394
- for (let i = 0; i < value.length; i++) {
1395
- res[i] = this._map(value[i], i);
1396
- }
1397
- return res;
1398
- } else if (value !== null && typeof value === "object") {
1399
- const res = {};
1400
- this._cyclic.set(value, res);
1401
- for (const key in value) {
1402
- res[key] = this._map(value[key], key);
1403
- }
1404
- return res;
1405
- } else {
1406
- return value;
1229
+ return res;
1230
+ } else if (value !== null && typeof value === "object") {
1231
+ const res = {};
1232
+ this._cyclic.set(value, res);
1233
+ for (const key in value) {
1234
+ res[key] = this._map(value[key], key);
1407
1235
  }
1408
- };
1409
- }
1236
+ return res;
1237
+ } else {
1238
+ return value;
1239
+ }
1240
+ };
1410
1241
  };
1411
1242
  var deepMapValuesAsync = (value, fn) => {
1412
1243
  return new DeepMapperAsync(fn).map(value);
1413
1244
  };
1414
1245
  var DeepMapperAsync = class {
1246
+ _fn;
1247
+ _cyclic = /* @__PURE__ */ new Map();
1248
+ constructor(_fn) {
1249
+ this._fn = _fn;
1250
+ }
1415
1251
  map(value) {
1416
1252
  return this._map(value, void 0);
1417
1253
  }
@@ -1421,35 +1257,28 @@ var DeepMapperAsync = class {
1421
1257
  }
1422
1258
  return this._fn(value, this._recurse, key);
1423
1259
  }
1424
- constructor(_fn) {
1425
- _define_property7(this, "_fn", void 0);
1426
- _define_property7(this, "_cyclic", void 0);
1427
- _define_property7(this, "_recurse", void 0);
1428
- this._fn = _fn;
1429
- this._cyclic = /* @__PURE__ */ new Map();
1430
- this._recurse = async (value) => {
1431
- if (this._cyclic.has(value)) {
1432
- return this._cyclic.get(value);
1260
+ _recurse = async (value) => {
1261
+ if (this._cyclic.has(value)) {
1262
+ return this._cyclic.get(value);
1263
+ }
1264
+ if (Array.isArray(value)) {
1265
+ const res = new Array(value.length);
1266
+ this._cyclic.set(value, res);
1267
+ for (let i = 0; i < value.length; i++) {
1268
+ res[i] = await this._map(value[i], i);
1433
1269
  }
1434
- if (Array.isArray(value)) {
1435
- const res = new Array(value.length);
1436
- this._cyclic.set(value, res);
1437
- for (let i = 0; i < value.length; i++) {
1438
- res[i] = await this._map(value[i], i);
1439
- }
1440
- return res;
1441
- } else if (value !== null && typeof value === "object") {
1442
- const res = {};
1443
- this._cyclic.set(value, res);
1444
- for (const key in value) {
1445
- res[key] = await this._map(value[key], key);
1446
- }
1447
- return res;
1448
- } else {
1449
- return value;
1270
+ return res;
1271
+ } else if (value !== null && typeof value === "object") {
1272
+ const res = {};
1273
+ this._cyclic.set(value, res);
1274
+ for (const key in value) {
1275
+ res[key] = await this._map(value[key], key);
1450
1276
  }
1451
- };
1452
- }
1277
+ return res;
1278
+ } else {
1279
+ return value;
1280
+ }
1281
+ };
1453
1282
  };
1454
1283
  var visitValues = (object, visitor) => {
1455
1284
  if (Array.isArray(object)) {
@@ -1538,7 +1367,18 @@ var omit = (obj, keys2) => {
1538
1367
 
1539
1368
  // src/platform.ts
1540
1369
  var isNode = () => typeof process !== "undefined" && process.versions != null && process.versions.node != null;
1541
- var mobileAndTabletCheck = () => {
1370
+ var isBun = () => globalThis.Bun !== void 0;
1371
+ var isTauri = () => !!globalThis.__TAURI__;
1372
+ var isMobile = () => {
1373
+ let check = false;
1374
+ (function(a) {
1375
+ 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))) {
1376
+ check = true;
1377
+ }
1378
+ })(navigator.userAgent || navigator.vendor || window.opera);
1379
+ return check;
1380
+ };
1381
+ var isMobileOrTablet = () => {
1542
1382
  let check = false;
1543
1383
  ((a) => {
1544
1384
  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))) {
@@ -1560,7 +1400,7 @@ var iosCheck = () => {
1560
1400
  };
1561
1401
  var safariCheck = () => typeof navigator !== "undefined" && /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
1562
1402
  var getHostPlatform = () => {
1563
- if (!("navigator" in window)) {
1403
+ if (!("navigator" in globalThis)) {
1564
1404
  return "unknown";
1565
1405
  }
1566
1406
  const platform = (navigator.userAgentData?.platform || navigator.platform)?.toLowerCase();
@@ -1767,48 +1607,137 @@ var safeInstanceof = (tag) => (target) => {
1767
1607
  };
1768
1608
 
1769
1609
  // src/safe-parse.ts
1770
- var safeParseInt = (value, defaultValue) => {
1610
+ function safeParseInt(str, defaultValue) {
1771
1611
  try {
1772
- const n = parseInt(value ?? "");
1773
- return isNaN(n) ? defaultValue : n;
1612
+ const value = parseInt(str ?? "");
1613
+ return isNaN(value) ? defaultValue : value;
1774
1614
  } catch {
1775
1615
  return defaultValue;
1776
1616
  }
1777
- };
1778
- var safeParseFloat = (str, defaultValue) => {
1617
+ }
1618
+ function safeParseFloat(str, defaultValue) {
1779
1619
  try {
1780
- return parseFloat(str);
1620
+ const value = parseFloat(str ?? "");
1621
+ return isNaN(value) ? defaultValue : value;
1781
1622
  } catch {
1782
- return defaultValue ?? 0;
1623
+ return defaultValue;
1783
1624
  }
1784
- };
1785
- var safeParseJson = (data, defaultValue) => {
1786
- if (data && data.length > 0) {
1625
+ }
1626
+ var safeParseJson = (str, defaultValue) => {
1627
+ if (str && str.length > 0) {
1787
1628
  try {
1788
- return JSON.parse(data);
1629
+ return JSON.parse(str);
1789
1630
  } catch {
1790
1631
  }
1791
1632
  }
1792
1633
  return defaultValue;
1793
1634
  };
1794
1635
 
1795
- // src/sliding-window-summary.ts
1796
- import { invariant as invariant5 } from "@dxos/invariant";
1797
- function _define_property8(obj, key, value) {
1798
- if (key in obj) {
1799
- Object.defineProperty(obj, key, {
1800
- value,
1801
- enumerable: true,
1802
- configurable: true,
1803
- writable: true
1804
- });
1805
- } else {
1806
- obj[key] = value;
1636
+ // src/safe-stringify.ts
1637
+ var SKIP = Object.freeze({});
1638
+ function safeStringify(obj, filter = defaultFilter, indent = 2) {
1639
+ const seen = /* @__PURE__ */ new WeakMap();
1640
+ function replacer(key, value) {
1641
+ try {
1642
+ let path = key;
1643
+ if (!key) {
1644
+ path = "$";
1645
+ return value;
1646
+ } else if (this) {
1647
+ const parentPath = seen.get(this);
1648
+ path = parentPath ? `${parentPath}.${key}` : key;
1649
+ }
1650
+ if (value == null) {
1651
+ return value;
1652
+ }
1653
+ if (typeof value === "function") {
1654
+ return void 0;
1655
+ }
1656
+ if (typeof value === "object" && Object.getPrototypeOf(value) !== Object.prototype) {
1657
+ return void 0;
1658
+ }
1659
+ if (typeof value === "object" && value !== null) {
1660
+ const exists = seen.get(value);
1661
+ if (exists) {
1662
+ return `[${path} => ${exists}]`;
1663
+ }
1664
+ seen.set(value, path);
1665
+ }
1666
+ if (filter) {
1667
+ const filteredValue = filter?.(key, value);
1668
+ if (filteredValue !== void 0) {
1669
+ return filteredValue === SKIP ? void 0 : filteredValue;
1670
+ }
1671
+ }
1672
+ return value;
1673
+ } catch (error) {
1674
+ return `ERROR: ${error.message}`;
1675
+ }
1807
1676
  }
1808
- return obj;
1677
+ return JSON.stringify(obj, replacer, indent);
1809
1678
  }
1679
+ var createReplacer = ({ omit: omit2, parse, maxDepth, maxArrayLen, maxStringLen } = {}) => {
1680
+ let currentDepth = 0;
1681
+ const depthMap = /* @__PURE__ */ new WeakMap();
1682
+ return function(key, value) {
1683
+ if (key === "") {
1684
+ currentDepth = 0;
1685
+ } else if (this && typeof this === "object") {
1686
+ const parentDepth = depthMap.get(this) ?? 0;
1687
+ currentDepth = parentDepth + 1;
1688
+ }
1689
+ if (typeof value === "function") {
1690
+ return SKIP;
1691
+ }
1692
+ if (value && typeof value === "object") {
1693
+ depthMap.set(value, currentDepth);
1694
+ if (maxDepth != null && currentDepth >= maxDepth) {
1695
+ return Array.isArray(value) ? `[{ length: ${value.length} }]` : `{ keys: ${Object.keys(value).length} }`;
1696
+ }
1697
+ }
1698
+ if (omit2?.includes(key)) {
1699
+ return SKIP;
1700
+ }
1701
+ if (parse?.includes(key) && typeof value === "string") {
1702
+ try {
1703
+ return JSON.parse(value);
1704
+ } catch {
1705
+ return value;
1706
+ }
1707
+ }
1708
+ if (maxArrayLen != null && Array.isArray(value) && value.length > maxArrayLen) {
1709
+ return `[length: ${value.length}]`;
1710
+ }
1711
+ if (maxStringLen != null && typeof value === "string" && value.length > maxStringLen) {
1712
+ return value.slice(0, maxStringLen) + "...";
1713
+ }
1714
+ return value;
1715
+ };
1716
+ };
1717
+ var defaultFilter = createReplacer();
1718
+
1719
+ // src/sliding-window-summary.ts
1720
+ import { invariant as invariant5 } from "@dxos/invariant";
1810
1721
  var __dxlog_file5 = "/__w/dxos/dxos/packages/common/util/src/sliding-window-summary.ts";
1811
1722
  var SlidingWindowSummary = class {
1723
+ _buffer;
1724
+ _sum = 0;
1725
+ _precision;
1726
+ constructor(options) {
1727
+ this._buffer = new CircularBuffer(options.dataPoints);
1728
+ if (options.precision != null) {
1729
+ invariant5(options.precision >= 0, void 0, {
1730
+ F: __dxlog_file5,
1731
+ L: 26,
1732
+ S: this,
1733
+ A: [
1734
+ "options.precision >= 0",
1735
+ ""
1736
+ ]
1737
+ });
1738
+ this._precision = Math.pow(10, options.precision);
1739
+ }
1740
+ }
1812
1741
  record(value) {
1813
1742
  const evicted = this._buffer.push(value);
1814
1743
  this._sum += value - (evicted ?? 0);
@@ -1843,24 +1772,6 @@ var SlidingWindowSummary = class {
1843
1772
  }
1844
1773
  return Math.round(value * this._precision) / this._precision;
1845
1774
  }
1846
- constructor(options) {
1847
- _define_property8(this, "_buffer", void 0);
1848
- _define_property8(this, "_sum", 0);
1849
- _define_property8(this, "_precision", void 0);
1850
- this._buffer = new CircularBuffer(options.dataPoints);
1851
- if (options.precision != null) {
1852
- invariant5(options.precision >= 0, void 0, {
1853
- F: __dxlog_file5,
1854
- L: 26,
1855
- S: this,
1856
- A: [
1857
- "options.precision >= 0",
1858
- ""
1859
- ]
1860
- });
1861
- this._precision = Math.pow(10, options.precision);
1862
- }
1863
- }
1864
1775
  };
1865
1776
 
1866
1777
  // src/sort.ts
@@ -1909,6 +1820,7 @@ function trim(strings, ...values) {
1909
1820
  const minIndent = Math.min(...lines.filter((l) => l.trim()).map((l) => l.match(/^[ \t]*/)?.[0].length ?? 0));
1910
1821
  return lines.map((l) => l.slice(minIndent)).join("\n");
1911
1822
  }
1823
+ var kebabize = (str) => str.replace(/[A-Z]+(?![a-z])|[A-Z]/g, ($, ofs) => (ofs ? "-" : "") + $.toLowerCase());
1912
1824
 
1913
1825
  // src/sum.ts
1914
1826
  var sum = (values) => values.reduce((a, b) => a + b, 0);
@@ -2106,20 +2018,9 @@ var toFallback = (hash) => {
2106
2018
  };
2107
2019
 
2108
2020
  // src/tracer.ts
2109
- function _define_property9(obj, key, value) {
2110
- if (key in obj) {
2111
- Object.defineProperty(obj, key, {
2112
- value,
2113
- enumerable: true,
2114
- configurable: true,
2115
- writable: true
2116
- });
2117
- } else {
2118
- obj[key] = value;
2119
- }
2120
- return obj;
2121
- }
2122
2021
  var Tracer = class {
2022
+ _events = /* @__PURE__ */ new Map();
2023
+ _recording = false;
2123
2024
  // TODO(burdon): Start/stop methods for recording data? By id?
2124
2025
  // Alternatively, enable subscriptions to track/compute series.
2125
2026
  // TODO(burdon): Hierarchical traces?
@@ -2176,10 +2077,6 @@ var Tracer = class {
2176
2077
  defaultMap(this._events, event.id, []).push(event);
2177
2078
  }
2178
2079
  }
2179
- constructor() {
2180
- _define_property9(this, "_events", /* @__PURE__ */ new Map());
2181
- _define_property9(this, "_recording", false);
2182
- }
2183
2080
  };
2184
2081
  var tracer = new Tracer();
2185
2082
 
@@ -2224,7 +2121,7 @@ var stringifyTree = (node, ancestors = [], rows = []) => {
2224
2121
  };
2225
2122
 
2226
2123
  // src/types.ts
2227
- var isNotFalsy = (value) => !!value;
2124
+ var isTruthy = (value) => !!value;
2228
2125
  var isNonNullable = (value) => value != null;
2229
2126
  var doAsync = async (fn) => fn();
2230
2127
  var getProviderValue = (provider, arg) => {
@@ -2254,69 +2151,112 @@ var arrayMove = (array, from, to) => {
2254
2151
  array.splice(to < 0 ? array.length + to : to, 0, array.splice(from, 1)[0]);
2255
2152
  return array;
2256
2153
  };
2154
+ function arraySwap(array, from, to) {
2155
+ const current = array[from];
2156
+ array[from] = array[to];
2157
+ array[to] = current;
2158
+ return array;
2159
+ }
2257
2160
 
2258
2161
  // src/unit.ts
2259
- var Formatter = (unit) => {
2260
- return (n, precision = 2) => {
2162
+ var createFormat = (unit) => {
2163
+ return (n, precision = unit.precision ?? 0) => {
2261
2164
  const value = n / unit.quotient;
2262
- return `${value.toFixed(precision)}${unit.symbol}`;
2165
+ return {
2166
+ unit,
2167
+ value,
2168
+ formattedValue: value.toFixed(precision),
2169
+ toString: () => `${value.toFixed(precision)}${unit.symbol}`
2170
+ };
2263
2171
  };
2264
2172
  };
2173
+ var MS_SECONDS = 1e3;
2174
+ var MS_MINUTES = 60 * MS_SECONDS;
2175
+ var MS_HOURS = 60 * MS_MINUTES;
2265
2176
  var Unit = {
2266
- // ms.
2267
- Hour: Formatter({
2177
+ // General.
2178
+ Percent: createFormat({
2179
+ symbol: "%",
2180
+ quotient: 1 / 100,
2181
+ precision: 2
2182
+ }),
2183
+ Thousand: createFormat({
2184
+ symbol: "k",
2185
+ quotient: 1e3,
2186
+ precision: 2
2187
+ }),
2188
+ // Bytes (note KB vs KiB).
2189
+ Gigabyte: createFormat({
2190
+ symbol: "GB",
2191
+ quotient: 1e3 * 1e3 * 1e3,
2192
+ precision: 2
2193
+ }),
2194
+ Megabyte: createFormat({
2195
+ symbol: "MB",
2196
+ quotient: 1e3 * 1e3,
2197
+ precision: 2
2198
+ }),
2199
+ Kilobyte: createFormat({
2200
+ symbol: "KB",
2201
+ quotient: 1e3,
2202
+ precision: 2
2203
+ }),
2204
+ Byte: createFormat({
2205
+ symbol: "B",
2206
+ quotient: 1
2207
+ }),
2208
+ // Time.
2209
+ Hour: createFormat({
2268
2210
  symbol: "h",
2269
- quotient: 60 * 60 * 1e3
2211
+ quotient: MS_HOURS
2270
2212
  }),
2271
- Minute: Formatter({
2213
+ Minute: createFormat({
2272
2214
  symbol: "m",
2273
- quotient: 60 * 1e3
2215
+ quotient: MS_MINUTES
2274
2216
  }),
2275
- Second: Formatter({
2217
+ Second: createFormat({
2276
2218
  symbol: "s",
2277
- quotient: 1e3
2219
+ quotient: MS_SECONDS,
2220
+ precision: 1
2278
2221
  }),
2279
- Millisecond: Formatter({
2222
+ Millisecond: createFormat({
2280
2223
  symbol: "ms",
2281
2224
  quotient: 1
2282
2225
  }),
2283
2226
  Duration: (n) => {
2284
- const hours = Math.floor(n / (60 * 60 * 1e3));
2285
- const minutes = Math.floor(n % (60 * 60 * 1e3) / (60 * 1e3));
2227
+ const hours = Math.floor(n / MS_HOURS);
2228
+ const minutes = Math.floor(n % MS_HOURS / MS_MINUTES);
2286
2229
  if (hours) {
2287
- return minutes ? `${hours}h ${minutes}m` : `${hours}h`;
2230
+ const formattedValue = minutes ? `${hours}h ${minutes}m` : `${hours}h`;
2231
+ return {
2232
+ unit: {
2233
+ symbol: "h",
2234
+ quotient: MS_HOURS
2235
+ },
2236
+ value: hours,
2237
+ formattedValue,
2238
+ toString: () => formattedValue
2239
+ };
2288
2240
  }
2289
- const seconds = Math.floor(n % (60 * 1e3) / 1e3);
2290
2241
  if (minutes) {
2291
- return seconds ? `${minutes}m ${seconds}s` : `${minutes}m`;
2242
+ const seconds2 = (n - MS_MINUTES * minutes) / MS_SECONDS;
2243
+ const formattedValue = seconds2 ? `${minutes}m ${seconds2}s` : `${minutes}m`;
2244
+ return {
2245
+ unit: {
2246
+ symbol: "m",
2247
+ quotient: MS_MINUTES
2248
+ },
2249
+ value: minutes,
2250
+ formattedValue,
2251
+ toString: () => formattedValue
2252
+ };
2292
2253
  }
2254
+ const seconds = n >= MS_SECONDS;
2293
2255
  if (seconds) {
2294
- return `${(n / 1e3).toFixed(1)}s`;
2256
+ return Unit.Second(n);
2295
2257
  }
2296
- return `${n}ms`;
2297
- },
2298
- // bytes (note KB via KiB).
2299
- Gigabyte: Formatter({
2300
- symbol: "GB",
2301
- quotient: 1e3 * 1e3 * 1e3
2302
- }),
2303
- Megabyte: Formatter({
2304
- symbol: "MB",
2305
- quotient: 1e3 * 1e3
2306
- }),
2307
- Kilobyte: Formatter({
2308
- symbol: "KB",
2309
- quotient: 1e3
2310
- }),
2311
- // general.
2312
- Thousand: Formatter({
2313
- symbol: "k",
2314
- quotient: 1e3
2315
- }),
2316
- Percent: Formatter({
2317
- symbol: "%",
2318
- quotient: 1 / 100
2319
- })
2258
+ return Unit.Millisecond(n);
2259
+ }
2320
2260
  };
2321
2261
 
2322
2262
  // src/url.ts
@@ -2329,20 +2269,18 @@ var createUrl = (url, search) => {
2329
2269
  };
2330
2270
 
2331
2271
  // src/weak.ts
2332
- function _define_property10(obj, key, value) {
2333
- if (key in obj) {
2334
- Object.defineProperty(obj, key, {
2335
- value,
2336
- enumerable: true,
2337
- configurable: true,
2338
- writable: true
2339
- });
2340
- } else {
2341
- obj[key] = value;
2342
- }
2343
- return obj;
2344
- }
2345
2272
  var WeakDictionary = class {
2273
+ _internal = /* @__PURE__ */ new Map();
2274
+ _finalization = new FinalizationRegistry((cleanUpCallback) => {
2275
+ cleanUpCallback();
2276
+ });
2277
+ constructor(entries2) {
2278
+ this._internal = new Map(entries2?.map(([key, value]) => [
2279
+ key,
2280
+ new WeakRef(value)
2281
+ ]));
2282
+ entries2?.forEach(([key, value]) => this._register(key, value));
2283
+ }
2346
2284
  *entries() {
2347
2285
  for (const [key, value] of this._internal) {
2348
2286
  yield [
@@ -2423,16 +2361,57 @@ var WeakDictionary = class {
2423
2361
  _unregister(value) {
2424
2362
  this._finalization.unregister(value);
2425
2363
  }
2426
- constructor(entries2) {
2427
- _define_property10(this, "_internal", /* @__PURE__ */ new Map());
2428
- _define_property10(this, "_finalization", new FinalizationRegistry((cleanUpCallback) => {
2429
- cleanUpCallback();
2430
- }));
2431
- this._internal = new Map(entries2?.map(([key, value]) => [
2432
- key,
2433
- new WeakRef(value)
2434
- ]));
2435
- entries2?.forEach(([key, value]) => this._register(key, value));
2364
+ };
2365
+
2366
+ // src/error-format.ts
2367
+ var formatErrorWithCauses = (error) => {
2368
+ const lines = [];
2369
+ let current = error;
2370
+ let level = 0;
2371
+ while (current) {
2372
+ const prefix = level === 0 ? "" : `Caused by: `;
2373
+ lines.push(prefix + (current.stack ?? String(current)));
2374
+ if (!(current.cause instanceof Error)) break;
2375
+ current = current.cause;
2376
+ level += 1;
2377
+ }
2378
+ return lines.join("\n\n");
2379
+ };
2380
+
2381
+ // src/retry.ts
2382
+ var DEFAULT_RETRY_OPTIONS = {
2383
+ count: 3,
2384
+ delayMs: 100,
2385
+ exponent: 2,
2386
+ retryOnError: async () => true,
2387
+ retryOnValue: async () => false
2388
+ };
2389
+ var retry = async (options, cb) => {
2390
+ const fullOptions = {
2391
+ ...DEFAULT_RETRY_OPTIONS,
2392
+ ...options
2393
+ };
2394
+ let numRetries = 0, currentDelay = fullOptions.delayMs;
2395
+ while (true) {
2396
+ let result;
2397
+ try {
2398
+ result = await cb();
2399
+ } catch (err) {
2400
+ if (numRetries > fullOptions.count || !await fullOptions.retryOnError(err)) {
2401
+ throw err;
2402
+ }
2403
+ await new Promise((resolve) => setTimeout(resolve, currentDelay));
2404
+ currentDelay *= fullOptions.exponent;
2405
+ numRetries++;
2406
+ continue;
2407
+ }
2408
+ if (!await fullOptions.retryOnValue(result)) {
2409
+ return result;
2410
+ }
2411
+ await new Promise((resolve) => setTimeout(resolve, currentDelay));
2412
+ currentDelay *= fullOptions.exponent;
2413
+ numRetries++;
2414
+ continue;
2436
2415
  }
2437
2416
  };
2438
2417
  export {
@@ -2444,12 +2423,14 @@ export {
2444
2423
  ComplexSet,
2445
2424
  HumanHasher,
2446
2425
  MapEntry,
2426
+ SKIP,
2447
2427
  SlidingWindowSummary,
2448
2428
  Tracer,
2449
2429
  Unit,
2450
2430
  WeakDictionary,
2451
2431
  accessBy,
2452
2432
  arrayMove,
2433
+ arraySwap,
2453
2434
  arrayToBuffer,
2454
2435
  arrayToHex,
2455
2436
  arrayToString,
@@ -2461,18 +2442,22 @@ export {
2461
2442
  chunkArray,
2462
2443
  clamp,
2463
2444
  clearUndefined,
2445
+ coerceArray,
2464
2446
  compareMulti,
2465
2447
  compareObject,
2466
2448
  compareScalar,
2467
2449
  compareString,
2468
2450
  createBinder,
2469
2451
  createBucketReducer,
2452
+ createFilename,
2470
2453
  createGroupReducer,
2454
+ createReplacer,
2471
2455
  createSetDispatch,
2472
2456
  createUrl,
2473
2457
  decamelize,
2474
2458
  deepMapValues,
2475
2459
  deepMapValuesAsync,
2460
+ defaultFilter,
2476
2461
  defaultMap,
2477
2462
  defer,
2478
2463
  deferAsync,
@@ -2484,12 +2469,12 @@ export {
2484
2469
  entry,
2485
2470
  exponentialBackoffInterval,
2486
2471
  forEachAsync,
2472
+ formatErrorWithCauses,
2487
2473
  get,
2488
2474
  getAsyncProviderValue,
2489
2475
  getDate,
2490
2476
  getDebugName,
2491
2477
  getDeep,
2492
- getFirstTwoRenderableChars,
2493
2478
  getHostPlatform,
2494
2479
  getPrototypeSpecificInstanceId,
2495
2480
  getProviderValue,
@@ -2505,14 +2490,19 @@ export {
2505
2490
  intersectBy,
2506
2491
  intersection,
2507
2492
  iosCheck,
2493
+ isBun,
2494
+ isMobile,
2495
+ isMobileOrTablet,
2508
2496
  isNode,
2509
2497
  isNonNullable,
2510
- isNotFalsy,
2498
+ isTauri,
2499
+ isTruthy,
2511
2500
  joinTables,
2512
2501
  jsonKeyReplacer,
2513
2502
  jsonReplacer,
2514
2503
  jsonify,
2515
2504
  jsonlogify,
2505
+ kebabize,
2516
2506
  keyToEmoji,
2517
2507
  keyToFallback,
2518
2508
  keyToHue,
@@ -2521,7 +2511,6 @@ export {
2521
2511
  makeSet,
2522
2512
  mapValues,
2523
2513
  median,
2524
- mobileAndTabletCheck,
2525
2514
  numericalValues,
2526
2515
  omit,
2527
2516
  orderKeys,
@@ -2537,12 +2526,14 @@ export {
2537
2526
  removeBy,
2538
2527
  removeProperties,
2539
2528
  removeUndefinedProperties,
2529
+ retry,
2540
2530
  safariCheck,
2541
2531
  safeAwaitAll,
2542
2532
  safeInstanceof,
2543
2533
  safeParseFloat,
2544
2534
  safeParseInt,
2545
2535
  safeParseJson,
2536
+ safeStringify,
2546
2537
  set,
2547
2538
  setDeep,
2548
2539
  sortKeys,