@dxos/util 0.8.4-main.f9ba587 → 0.8.4-main.fcc0d83b33

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 (142) hide show
  1. package/dist/lib/browser/index.mjs +569 -203
  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 +569 -203
  5. package/dist/lib/node-esm/index.mjs.map +4 -4
  6. package/dist/lib/node-esm/meta.json +1 -1
  7. package/dist/types/src/array-to-hex.d.ts.map +1 -1
  8. package/dist/types/src/array.d.ts +3 -2
  9. package/dist/types/src/array.d.ts.map +1 -1
  10. package/dist/types/src/assume.d.ts.map +1 -1
  11. package/dist/types/src/binder.d.ts.map +1 -1
  12. package/dist/types/src/bitfield.d.ts.map +1 -1
  13. package/dist/types/src/browser-storage.d.ts +9 -0
  14. package/dist/types/src/browser-storage.d.ts.map +1 -0
  15. package/dist/types/src/callback-collection.d.ts.map +1 -1
  16. package/dist/types/src/callback.d.ts.map +1 -1
  17. package/dist/types/src/case.d.ts.map +1 -1
  18. package/dist/types/src/chunk-array.d.ts.map +1 -1
  19. package/dist/types/src/circular-buffer.d.ts +1 -0
  20. package/dist/types/src/circular-buffer.d.ts.map +1 -1
  21. package/dist/types/src/clear-undefined.d.ts.map +1 -1
  22. package/dist/types/src/complex.d.ts +15 -0
  23. package/dist/types/src/complex.d.ts.map +1 -1
  24. package/dist/types/src/composite-key.d.ts +10 -0
  25. package/dist/types/src/composite-key.d.ts.map +1 -0
  26. package/dist/types/src/composite-key.test.d.ts +2 -0
  27. package/dist/types/src/composite-key.test.d.ts.map +1 -0
  28. package/dist/types/src/deep.d.ts +0 -3
  29. package/dist/types/src/deep.d.ts.map +1 -1
  30. package/dist/types/src/defer-function.d.ts.map +1 -1
  31. package/dist/types/src/defer.d.ts +1 -1
  32. package/dist/types/src/defer.d.ts.map +1 -1
  33. package/dist/types/src/di-container.d.ts.map +1 -1
  34. package/dist/types/src/di-key.d.ts +7 -5
  35. package/dist/types/src/di-key.d.ts.map +1 -1
  36. package/dist/types/src/entry.d.ts.map +1 -1
  37. package/dist/types/src/error-format.d.ts +5 -0
  38. package/dist/types/src/error-format.d.ts.map +1 -0
  39. package/dist/types/src/filename.d.ts +9 -0
  40. package/dist/types/src/filename.d.ts.map +1 -0
  41. package/dist/types/src/for-each-async.d.ts.map +1 -1
  42. package/dist/types/src/human-hash.d.ts.map +1 -1
  43. package/dist/types/src/index.d.ts +7 -2
  44. package/dist/types/src/index.d.ts.map +1 -1
  45. package/dist/types/src/instance-id.d.ts.map +1 -1
  46. package/dist/types/src/interval.d.ts.map +1 -1
  47. package/dist/types/src/join-tables.d.ts.map +1 -1
  48. package/dist/types/src/json.d.ts +1 -1
  49. package/dist/types/src/json.d.ts.map +1 -1
  50. package/dist/types/src/map-values.d.ts.map +1 -1
  51. package/dist/types/src/map.d.ts.map +1 -1
  52. package/dist/types/src/object.d.ts +3 -0
  53. package/dist/types/src/object.d.ts.map +1 -1
  54. package/dist/types/src/order-keys.d.ts.map +1 -1
  55. package/dist/types/src/order.d.ts.map +1 -1
  56. package/dist/types/src/pick.d.ts.map +1 -1
  57. package/dist/types/src/platform.d.ts +5 -2
  58. package/dist/types/src/platform.d.ts.map +1 -1
  59. package/dist/types/src/position.d.ts +1 -1
  60. package/dist/types/src/position.d.ts.map +1 -1
  61. package/dist/types/src/random.d.ts.map +1 -1
  62. package/dist/types/src/range.d.ts.map +1 -1
  63. package/dist/types/src/reducers.d.ts.map +1 -1
  64. package/dist/types/src/remove-undefined-keys.d.ts.map +1 -1
  65. package/dist/types/src/retry.d.ts +32 -0
  66. package/dist/types/src/retry.d.ts.map +1 -0
  67. package/dist/types/src/safe-await.d.ts.map +1 -1
  68. package/dist/types/src/safe-instanceof.d.ts.map +1 -1
  69. package/dist/types/src/safe-parse.d.ts +7 -4
  70. package/dist/types/src/safe-parse.d.ts.map +1 -1
  71. package/dist/types/src/safe-stringify.d.ts +22 -0
  72. package/dist/types/src/safe-stringify.d.ts.map +1 -0
  73. package/dist/types/src/safe-stringify.test.d.ts +2 -0
  74. package/dist/types/src/safe-stringify.test.d.ts.map +1 -0
  75. package/dist/types/src/sliding-window-summary.d.ts.map +1 -1
  76. package/dist/types/src/sort.d.ts.map +1 -1
  77. package/dist/types/src/string.d.ts +8 -0
  78. package/dist/types/src/string.d.ts.map +1 -1
  79. package/dist/types/src/string.test.d.ts +2 -0
  80. package/dist/types/src/string.test.d.ts.map +1 -0
  81. package/dist/types/src/sum.d.ts.map +1 -1
  82. package/dist/types/src/throw-unhandled-error.d.ts.map +1 -1
  83. package/dist/types/src/to-fallback.d.ts +18 -4
  84. package/dist/types/src/to-fallback.d.ts.map +1 -1
  85. package/dist/types/src/tracer.d.ts.map +1 -1
  86. package/dist/types/src/tree.d.ts.map +1 -1
  87. package/dist/types/src/types.d.ts +24 -6
  88. package/dist/types/src/types.d.ts.map +1 -1
  89. package/dist/types/src/uint8array.d.ts.map +1 -1
  90. package/dist/types/src/unit.d.ts +14 -0
  91. package/dist/types/src/unit.d.ts.map +1 -0
  92. package/dist/types/src/unit.test.d.ts +2 -0
  93. package/dist/types/src/unit.test.d.ts.map +1 -0
  94. package/dist/types/src/url.d.ts.map +1 -1
  95. package/dist/types/src/weak.d.ts +15 -0
  96. package/dist/types/src/weak.d.ts.map +1 -1
  97. package/dist/types/tsconfig.tsbuildinfo +1 -1
  98. package/package.json +14 -16
  99. package/src/array.test.ts +1 -1
  100. package/src/array.ts +9 -4
  101. package/src/assume.ts +0 -1
  102. package/src/binder.ts +2 -2
  103. package/src/browser-storage.ts +60 -0
  104. package/src/circular-buffer.test.ts +27 -1
  105. package/src/circular-buffer.ts +5 -0
  106. package/src/complex.test.ts +1 -1
  107. package/src/complex.ts +32 -0
  108. package/src/composite-key.test.ts +31 -0
  109. package/src/composite-key.ts +16 -0
  110. package/src/deep.ts +2 -6
  111. package/src/defer.ts +1 -1
  112. package/src/di-key.ts +10 -8
  113. package/src/error-format.ts +24 -0
  114. package/src/filename.ts +16 -0
  115. package/src/human-hash.test.ts +1 -1
  116. package/src/index.ts +7 -2
  117. package/src/json.ts +2 -7
  118. package/src/object.ts +3 -0
  119. package/src/platform.ts +35 -3
  120. package/src/position.test.ts +2 -2
  121. package/src/retry.ts +74 -0
  122. package/src/safe-parse.ts +29 -15
  123. package/src/safe-stringify.test.ts +96 -0
  124. package/src/safe-stringify.ts +153 -0
  125. package/src/sort.test.ts +1 -1
  126. package/src/string.test.ts +19 -0
  127. package/src/string.ts +40 -0
  128. package/src/to-fallback.ts +44 -160
  129. package/src/tree.test.ts +1 -1
  130. package/src/types.test.ts +11 -1
  131. package/src/types.ts +40 -12
  132. package/src/uint8array.test.ts +1 -1
  133. package/src/unit.test.ts +25 -0
  134. package/src/unit.ts +87 -0
  135. package/src/weak.test.ts +1 -1
  136. package/src/weak.ts +52 -14
  137. package/dist/types/src/explicit-resource-management-polyfill.d.ts +0 -1
  138. package/dist/types/src/explicit-resource-management-polyfill.d.ts.map +0 -1
  139. package/dist/types/src/first-two-chars.d.ts +0 -9
  140. package/dist/types/src/first-two-chars.d.ts.map +0 -1
  141. package/src/explicit-resource-management-polyfill.ts +0 -13
  142. package/src/first-two-chars.ts +0 -44
@@ -97,21 +97,28 @@ var intersectBy = (arrays, selector) => {
97
97
  return lookups.every((lookup) => lookup.has(key));
98
98
  });
99
99
  };
100
+ var coerceArray = (arr) => {
101
+ if (arr === void 0) {
102
+ return [];
103
+ }
104
+ return Array.isArray(arr) ? arr : [
105
+ arr
106
+ ];
107
+ };
100
108
 
101
109
  // src/assume.ts
102
110
  function assumeType(value) {
103
111
  }
104
112
 
105
113
  // src/binder.ts
106
- import util from "@dxos/node-std/util";
114
+ import { promisify } from "@dxos/node-std/util";
107
115
  var createBinder = (obj) => ({
108
116
  fn: (fn) => fn.bind(obj),
109
- async: (fn) => util.promisify(fn.bind(obj))
117
+ async: (fn) => promisify(fn.bind(obj))
110
118
  });
111
119
 
112
120
  // src/bitfield.ts
113
121
  import { invariant } from "@dxos/invariant";
114
- var __dxlog_file = "/__w/dxos/dxos/packages/common/util/src/bitfield.ts";
115
122
  var BitField = class _BitField {
116
123
  static get(data, idx) {
117
124
  const bit = data[idx >> 3] >> 7 - idx % 8 & 1;
@@ -143,15 +150,7 @@ var BitField = class _BitField {
143
150
  return result;
144
151
  }
145
152
  static and(first, second) {
146
- invariant(first.length === second.length, "Bitfields must be of the same length", {
147
- F: __dxlog_file,
148
- L: 52,
149
- S: this,
150
- A: [
151
- "first.length === second.length",
152
- "'Bitfields must be of the same length'"
153
- ]
154
- });
153
+ invariant(first.length === second.length, "Bitfields must be of the same length");
155
154
  const result = new Uint8Array(first.length);
156
155
  for (let i = 0; i < first.length; i++) {
157
156
  result[i] = first[i] & second[i];
@@ -179,6 +178,49 @@ var BitField = class _BitField {
179
178
  }
180
179
  };
181
180
 
181
+ // src/browser-storage.ts
182
+ var clearIndexedDB = async () => {
183
+ const dbs = await indexedDB.databases();
184
+ const results = await Promise.allSettled(dbs.filter((db) => db.name != null).map((db) => new Promise((resolve, reject) => {
185
+ const request = indexedDB.deleteDatabase(db.name);
186
+ request.onsuccess = () => resolve();
187
+ request.onerror = () => reject(request.error);
188
+ request.onblocked = () => reject(new Error(`IndexedDB deletion blocked: ${db.name}`));
189
+ })));
190
+ const failures = results.filter((r) => r.status === "rejected");
191
+ if (failures.length > 0) {
192
+ throw new AggregateError(failures.map((r) => r.reason), "Failed to delete some IndexedDB databases");
193
+ }
194
+ };
195
+ var clearOPFS = async () => {
196
+ const root = await navigator.storage.getDirectory();
197
+ const errors = [];
198
+ for await (const [name] of root.entries()) {
199
+ try {
200
+ await root.removeEntry(name, {
201
+ recursive: true
202
+ });
203
+ } catch (err) {
204
+ errors.push(err);
205
+ }
206
+ }
207
+ if (errors.length > 0) {
208
+ throw new AggregateError(errors, "Failed to remove some OPFS entries");
209
+ }
210
+ };
211
+ var clearServiceWorkers = async () => {
212
+ const regs = await navigator.serviceWorker.getRegistrations();
213
+ for (const reg of regs) {
214
+ await reg.unregister();
215
+ }
216
+ };
217
+ var clearCaches = async () => {
218
+ const keys2 = await caches.keys();
219
+ for (const key of keys2) {
220
+ await caches.delete(key);
221
+ }
222
+ };
223
+
182
224
  // src/callback-collection.ts
183
225
  var CallbackCollection = class {
184
226
  #callbacks = [];
@@ -205,33 +247,17 @@ var CallbackCollection = class {
205
247
 
206
248
  // src/callback.ts
207
249
  import { invariant as invariant2 } from "@dxos/invariant";
208
- var __dxlog_file2 = "/__w/dxos/dxos/packages/common/util/src/callback.ts";
209
250
  var Callback = class {
251
+ _callback;
210
252
  call(...args) {
211
- invariant2(this._callback, "Callback not set", {
212
- F: __dxlog_file2,
213
- L: 20,
214
- S: this,
215
- A: [
216
- "this._callback",
217
- "'Callback not set'"
218
- ]
219
- });
253
+ invariant2(this._callback, "Callback not set");
220
254
  return this._callback(...args);
221
255
  }
222
256
  callIfSet(...args) {
223
257
  return this._callback?.(...args);
224
258
  }
225
259
  set(callback) {
226
- invariant2(!this._callback, "Callback already set", {
227
- F: __dxlog_file2,
228
- L: 29,
229
- S: this,
230
- A: [
231
- "!this._callback",
232
- "'Callback already set'"
233
- ]
234
- });
260
+ invariant2(!this._callback, "Callback already set");
235
261
  this._callback = callback;
236
262
  }
237
263
  isSet() {
@@ -299,20 +325,12 @@ var chunkArray = (array, size) => {
299
325
 
300
326
  // src/circular-buffer.ts
301
327
  import { invariant as invariant3 } from "@dxos/invariant";
302
- var __dxlog_file3 = "/__w/dxos/dxos/packages/common/util/src/circular-buffer.ts";
303
328
  var CircularBuffer = class {
329
+ _buffer;
330
+ _nextIndex = 0;
331
+ _elementCount = 0;
304
332
  constructor(size) {
305
- this._nextIndex = 0;
306
- this._elementCount = 0;
307
- invariant3(size >= 1, void 0, {
308
- F: __dxlog_file3,
309
- L: 13,
310
- S: this,
311
- A: [
312
- "size >= 1",
313
- ""
314
- ]
315
- });
333
+ invariant3(size >= 1);
316
334
  this._buffer = new Array(size);
317
335
  }
318
336
  push(element) {
@@ -325,6 +343,10 @@ var CircularBuffer = class {
325
343
  get elementCount() {
326
344
  return this._elementCount;
327
345
  }
346
+ clear() {
347
+ this._nextIndex = 0;
348
+ this._elementCount = 0;
349
+ }
328
350
  getLast() {
329
351
  if (this._elementCount === 0) {
330
352
  return void 0;
@@ -374,10 +396,11 @@ import { inspect } from "@dxos/node-std/util";
374
396
  import { inspectObject, raise } from "@dxos/debug";
375
397
  var MAX_SERIALIZATION_LENGTH = 10;
376
398
  var ComplexSet = class {
399
+ _projection;
400
+ _values = /* @__PURE__ */ new Map();
377
401
  // prettier-ignore
378
402
  constructor(_projection, values) {
379
403
  this._projection = _projection;
380
- this._values = /* @__PURE__ */ new Map();
381
404
  if (values) {
382
405
  for (const value of values) {
383
406
  this.add(value);
@@ -467,11 +490,12 @@ var makeSet = (projection) => {
467
490
  };
468
491
  };
469
492
  var ComplexMap = class _ComplexMap {
493
+ _keyProjection;
494
+ _keys = /* @__PURE__ */ new Map();
495
+ _values = /* @__PURE__ */ new Map();
470
496
  // prettier-ignore
471
497
  constructor(_keyProjection, entries2) {
472
498
  this._keyProjection = _keyProjection;
473
- this._keys = /* @__PURE__ */ new Map();
474
- this._values = /* @__PURE__ */ new Map();
475
499
  if (entries2) {
476
500
  for (const [key, value] of entries2) {
477
501
  this.set(key, value);
@@ -516,6 +540,36 @@ var ComplexMap = class _ComplexMap {
516
540
  this._values.set(primitive, value);
517
541
  return this;
518
542
  }
543
+ /**
544
+ * Returns the value for the given key if present, otherwise inserts and returns the default value.
545
+ * @param key - The key to look up or insert.
546
+ * @param defaultValue - The value to insert if the key is not present.
547
+ * @returns The existing or newly inserted value.
548
+ */
549
+ getOrInsert(key, defaultValue) {
550
+ const primitive = this._keyProjection(key);
551
+ if (this._values.has(primitive)) {
552
+ return this._values.get(primitive);
553
+ }
554
+ this.set(key, defaultValue);
555
+ return defaultValue;
556
+ }
557
+ /**
558
+ * Returns the value for the given key if present, otherwise computes, inserts, and returns a new value.
559
+ * The callback is only invoked when the key is missing.
560
+ * @param key - The key to look up or insert.
561
+ * @param callbackfn - Function to compute the value if the key is not present.
562
+ * @returns The existing or newly computed value.
563
+ */
564
+ getOrInsertComputed(key, callbackfn) {
565
+ const primitive = this._keyProjection(key);
566
+ if (this._values.has(primitive)) {
567
+ return this._values.get(primitive);
568
+ }
569
+ const value = callbackfn(key);
570
+ this.set(key, value);
571
+ return value;
572
+ }
519
573
  get size() {
520
574
  return this._keys.size;
521
575
  }
@@ -555,21 +609,15 @@ var makeMap = (keyProjection) => class BoundComplexMap extends ComplexMap {
555
609
  }
556
610
  };
557
611
 
612
+ // src/composite-key.ts
613
+ var SEPARATOR = ":";
614
+ var compositeKey = (...parts) => parts.join(SEPARATOR);
615
+ var splitCompositeKey = (key) => key.split(SEPARATOR);
616
+
558
617
  // src/deep.ts
559
- import get from "lodash.get";
560
- import set from "lodash.set";
561
618
  import { invariant as invariant4 } from "@dxos/invariant";
562
- var __dxlog_file4 = "/__w/dxos/dxos/packages/common/util/src/deep.ts";
563
619
  var setDeep = (obj, path, value) => {
564
- invariant4(path.length > 0, void 0, {
565
- F: __dxlog_file4,
566
- L: 18,
567
- S: void 0,
568
- A: [
569
- "path.length > 0",
570
- ""
571
- ]
572
- });
620
+ invariant4(path.length > 0);
573
621
  let parent = obj;
574
622
  for (const key of path.slice(0, -1)) {
575
623
  if (parent[key] === void 0) {
@@ -592,13 +640,11 @@ var getDeep = (obj, path) => {
592
640
  // src/defer-function.ts
593
641
  var deferFunction = (fnProvider) => (...args) => fnProvider()(...args);
594
642
 
595
- // src/explicit-resource-management-polyfill.ts
596
- Symbol.dispose ??= Symbol("Symbol.dispose");
597
- Symbol.asyncDispose ??= Symbol("Symbol.asyncDispose");
598
-
599
643
  // src/defer.ts
644
+ import "@hazae41/symbol-dispose-polyfill";
600
645
  var defer = (fn) => new DeferGuard(fn);
601
646
  var DeferGuard = class {
647
+ _fn;
602
648
  /**
603
649
  * @internal
604
650
  */
@@ -614,6 +660,7 @@ var DeferGuard = class {
614
660
  };
615
661
  var deferAsync = (fn) => new DeferAsyncGuard(fn);
616
662
  var DeferAsyncGuard = class {
663
+ _fn;
617
664
  /**
618
665
  * @internal
619
666
  */
@@ -628,6 +675,8 @@ var DeferAsyncGuard = class {
628
675
  // src/entry.ts
629
676
  var entry = (map, key) => new MapEntry(map, key);
630
677
  var MapEntry = class {
678
+ _map;
679
+ _key;
631
680
  /**
632
681
  * @internal
633
682
  */
@@ -653,33 +702,29 @@ var MapEntry = class {
653
702
  }
654
703
  };
655
704
 
656
- // src/first-two-chars.ts
657
- var renderableCharRegex = /^(?![\p{Control}\p{Mark}\p{Separator}\p{Surrogate}\p{Unassigned}\p{P}])[\p{L}\p{N}\p{S}\p{Emoji}]$/u;
658
- var getFirstTwoRenderableChars = (label) => {
659
- const characters = Array.from(label);
660
- const result = [
661
- "",
662
- ""
663
- ];
664
- let foundFirst = false;
665
- for (let i = 0; i < characters.length; i++) {
666
- const char = characters[i];
667
- if (renderableCharRegex.test(char)) {
668
- if (!foundFirst) {
669
- result[0] = char;
670
- foundFirst = true;
671
- } else {
672
- const textBetween = characters.slice(result[0].length, i).join("");
673
- if (/[^\p{L}\p{N}_]/u.test(textBetween)) {
674
- result[1] = char;
675
- break;
676
- }
677
- }
678
- }
679
- }
680
- return result;
705
+ // src/error-format.ts
706
+ var formatErrorWithCauses = (error) => {
707
+ const lines = [];
708
+ let current = error;
709
+ let level = 0;
710
+ while (current) {
711
+ const prefix = level === 0 ? "" : `Caused by: `;
712
+ lines.push(prefix + (current.stack ?? String(current)));
713
+ if (!(current.cause instanceof Error)) {
714
+ break;
715
+ }
716
+ current = current.cause;
717
+ level += 1;
718
+ }
719
+ return lines.join("\n\n");
681
720
  };
682
721
 
722
+ // src/filename.ts
723
+ var createFilename = ({ parts = [], ext, date = /* @__PURE__ */ new Date() }) => [
724
+ date.toISOString().replace(/[:.]/g, "-"),
725
+ ...parts
726
+ ].join("_") + (ext ? `.${ext}` : "");
727
+
683
728
  // src/for-each-async.ts
684
729
  var forEachAsync = (items, fn) => Promise.all(items.map(fn));
685
730
 
@@ -944,6 +989,7 @@ var DEFAULT_WORDLIST = [
944
989
  "zulu"
945
990
  ];
946
991
  var HumanHasher = class {
992
+ wordlist;
947
993
  /**
948
994
  * Transforms hex digests to human-readable strings.
949
995
  *
@@ -1025,7 +1071,7 @@ var defaultMap = (map, key, def) => {
1025
1071
  };
1026
1072
 
1027
1073
  // src/instance-id.ts
1028
- var symbol = Symbol.for("dxos.instance-contexts");
1074
+ var symbol = /* @__PURE__ */ Symbol.for("dxos.instance-contexts");
1029
1075
  var instanceContexts = globalThis[symbol] ??= /* @__PURE__ */ new WeakMap();
1030
1076
  var getPrototypeSpecificInstanceId = (instance) => {
1031
1077
  const prototype = Object.getPrototypeOf(instance);
@@ -1109,7 +1155,7 @@ var arrayToString = (array) => arrayToBuffer(array).toString("hex");
1109
1155
  // src/json.ts
1110
1156
  var MAX_DEPTH = 5;
1111
1157
  var LOG_MAX_DEPTH = 7;
1112
- function jsonReplacer(key, value) {
1158
+ var jsonReplacer = (key, value) => {
1113
1159
  if (value !== null && typeof value === "object" && typeof value[inspect2.custom] === "function") {
1114
1160
  return value[inspect2.custom]();
1115
1161
  }
@@ -1122,7 +1168,7 @@ function jsonReplacer(key, value) {
1122
1168
  }
1123
1169
  }
1124
1170
  return value;
1125
- }
1171
+ };
1126
1172
  var jsonify = (value, depth = 0, visitedObjects = /* @__PURE__ */ new WeakSet()) => {
1127
1173
  if (depth > MAX_DEPTH) {
1128
1174
  return null;
@@ -1209,31 +1255,10 @@ var deepMapValues = (value, fn) => {
1209
1255
  return new DeepMapper(fn).map(value);
1210
1256
  };
1211
1257
  var DeepMapper = class {
1258
+ _fn;
1259
+ _cyclic = /* @__PURE__ */ new Map();
1212
1260
  constructor(_fn) {
1213
1261
  this._fn = _fn;
1214
- this._cyclic = /* @__PURE__ */ new Map();
1215
- this._recurse = (value) => {
1216
- if (this._cyclic.has(value)) {
1217
- return this._cyclic.get(value);
1218
- }
1219
- if (Array.isArray(value)) {
1220
- const res = new Array(value.length);
1221
- this._cyclic.set(value, res);
1222
- for (let i = 0; i < value.length; i++) {
1223
- res[i] = this._map(value[i], i);
1224
- }
1225
- return res;
1226
- } else if (value !== null && typeof value === "object") {
1227
- const res = {};
1228
- this._cyclic.set(value, res);
1229
- for (const key in value) {
1230
- res[key] = this._map(value[key], key);
1231
- }
1232
- return res;
1233
- } else {
1234
- return value;
1235
- }
1236
- };
1237
1262
  }
1238
1263
  map(value) {
1239
1264
  return this._map(value, void 0);
@@ -1244,36 +1269,37 @@ var DeepMapper = class {
1244
1269
  }
1245
1270
  return this._fn(value, this._recurse, key);
1246
1271
  }
1272
+ _recurse = (value) => {
1273
+ if (this._cyclic.has(value)) {
1274
+ return this._cyclic.get(value);
1275
+ }
1276
+ if (Array.isArray(value)) {
1277
+ const res = new Array(value.length);
1278
+ this._cyclic.set(value, res);
1279
+ for (let i = 0; i < value.length; i++) {
1280
+ res[i] = this._map(value[i], i);
1281
+ }
1282
+ return res;
1283
+ } else if (value !== null && typeof value === "object") {
1284
+ const res = {};
1285
+ this._cyclic.set(value, res);
1286
+ for (const key in value) {
1287
+ res[key] = this._map(value[key], key);
1288
+ }
1289
+ return res;
1290
+ } else {
1291
+ return value;
1292
+ }
1293
+ };
1247
1294
  };
1248
1295
  var deepMapValuesAsync = (value, fn) => {
1249
1296
  return new DeepMapperAsync(fn).map(value);
1250
1297
  };
1251
1298
  var DeepMapperAsync = class {
1299
+ _fn;
1300
+ _cyclic = /* @__PURE__ */ new Map();
1252
1301
  constructor(_fn) {
1253
1302
  this._fn = _fn;
1254
- this._cyclic = /* @__PURE__ */ new Map();
1255
- this._recurse = async (value) => {
1256
- if (this._cyclic.has(value)) {
1257
- return this._cyclic.get(value);
1258
- }
1259
- if (Array.isArray(value)) {
1260
- const res = new Array(value.length);
1261
- this._cyclic.set(value, res);
1262
- for (let i = 0; i < value.length; i++) {
1263
- res[i] = await this._map(value[i], i);
1264
- }
1265
- return res;
1266
- } else if (value !== null && typeof value === "object") {
1267
- const res = {};
1268
- this._cyclic.set(value, res);
1269
- for (const key in value) {
1270
- res[key] = await this._map(value[key], key);
1271
- }
1272
- return res;
1273
- } else {
1274
- return value;
1275
- }
1276
- };
1277
1303
  }
1278
1304
  map(value) {
1279
1305
  return this._map(value, void 0);
@@ -1284,6 +1310,28 @@ var DeepMapperAsync = class {
1284
1310
  }
1285
1311
  return this._fn(value, this._recurse, key);
1286
1312
  }
1313
+ _recurse = async (value) => {
1314
+ if (this._cyclic.has(value)) {
1315
+ return this._cyclic.get(value);
1316
+ }
1317
+ if (Array.isArray(value)) {
1318
+ const res = new Array(value.length);
1319
+ this._cyclic.set(value, res);
1320
+ for (let i = 0; i < value.length; i++) {
1321
+ res[i] = await this._map(value[i], i);
1322
+ }
1323
+ return res;
1324
+ } else if (value !== null && typeof value === "object") {
1325
+ const res = {};
1326
+ this._cyclic.set(value, res);
1327
+ for (const key in value) {
1328
+ res[key] = await this._map(value[key], key);
1329
+ }
1330
+ return res;
1331
+ } else {
1332
+ return value;
1333
+ }
1334
+ };
1287
1335
  };
1288
1336
  var visitValues = (object, visitor) => {
1289
1337
  if (Array.isArray(object)) {
@@ -1372,7 +1420,18 @@ var omit = (obj, keys2) => {
1372
1420
 
1373
1421
  // src/platform.ts
1374
1422
  var isNode = () => typeof process !== "undefined" && process.versions != null && process.versions.node != null;
1375
- var mobileAndTabletCheck = () => {
1423
+ var isBun = () => globalThis.Bun !== void 0;
1424
+ var isTauri = () => !!globalThis.__TAURI__;
1425
+ var isMobile = () => {
1426
+ let check = false;
1427
+ (function(a) {
1428
+ if (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0, 4))) {
1429
+ check = true;
1430
+ }
1431
+ })(navigator.userAgent || navigator.vendor || window.opera);
1432
+ return check;
1433
+ };
1434
+ var isMobileOrTablet = () => {
1376
1435
  let check = false;
1377
1436
  ((a) => {
1378
1437
  if (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0, 4))) {
@@ -1394,7 +1453,7 @@ var iosCheck = () => {
1394
1453
  };
1395
1454
  var safariCheck = () => typeof navigator !== "undefined" && /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
1396
1455
  var getHostPlatform = () => {
1397
- if (!("navigator" in window)) {
1456
+ if (!("navigator" in globalThis)) {
1398
1457
  return "unknown";
1399
1458
  }
1400
1459
  const platform = (navigator.userAgentData?.platform || navigator.platform)?.toLowerCase();
@@ -1570,6 +1629,43 @@ var removeProperties = (root, condition) => {
1570
1629
  return result;
1571
1630
  };
1572
1631
 
1632
+ // src/retry.ts
1633
+ var DEFAULT_RETRY_OPTIONS = {
1634
+ count: 3,
1635
+ delayMs: 100,
1636
+ exponent: 2,
1637
+ retryOnError: async () => true,
1638
+ retryOnValue: async () => false
1639
+ };
1640
+ var retry = async (options, cb) => {
1641
+ const fullOptions = {
1642
+ ...DEFAULT_RETRY_OPTIONS,
1643
+ ...options
1644
+ };
1645
+ let numRetries = 0, currentDelay = fullOptions.delayMs;
1646
+ while (true) {
1647
+ let result;
1648
+ try {
1649
+ result = await cb();
1650
+ } catch (err) {
1651
+ if (numRetries > fullOptions.count || !await fullOptions.retryOnError(err)) {
1652
+ throw err;
1653
+ }
1654
+ await new Promise((resolve) => setTimeout(resolve, currentDelay));
1655
+ currentDelay *= fullOptions.exponent;
1656
+ numRetries++;
1657
+ continue;
1658
+ }
1659
+ if (!await fullOptions.retryOnValue(result)) {
1660
+ return result;
1661
+ }
1662
+ await new Promise((resolve) => setTimeout(resolve, currentDelay));
1663
+ currentDelay *= fullOptions.exponent;
1664
+ numRetries++;
1665
+ continue;
1666
+ }
1667
+ };
1668
+
1573
1669
  // src/safe-await.ts
1574
1670
  var safeAwaitAll = async (source, taskFactory, onError) => {
1575
1671
  const failedItems = [];
@@ -1589,7 +1685,7 @@ var safeAwaitAll = async (source, taskFactory, onError) => {
1589
1685
  };
1590
1686
 
1591
1687
  // src/safe-instanceof.ts
1592
- var instanceTag = Symbol("instanceTag");
1688
+ var instanceTag = /* @__PURE__ */ Symbol("instanceTag");
1593
1689
  var safeInstanceof = (tag) => (target) => {
1594
1690
  target.prototype[instanceTag] = tag;
1595
1691
  Object.defineProperty(target.prototype, Symbol.hasInstance, {
@@ -1601,48 +1697,139 @@ var safeInstanceof = (tag) => (target) => {
1601
1697
  };
1602
1698
 
1603
1699
  // src/safe-parse.ts
1604
- var safeParseInt = (value, defaultValue) => {
1700
+ function safeParseInt(str, defaultValue) {
1605
1701
  try {
1606
- const n = parseInt(value ?? "");
1607
- return isNaN(n) ? defaultValue : n;
1608
- } catch (err) {
1702
+ const value = parseInt(str ?? "");
1703
+ return isNaN(value) ? defaultValue : value;
1704
+ } catch {
1705
+ return defaultValue;
1706
+ }
1707
+ }
1708
+ function safeParseFloat(str, defaultValue) {
1709
+ try {
1710
+ const value = parseFloat(str ?? "");
1711
+ return isNaN(value) ? defaultValue : value;
1712
+ } catch {
1609
1713
  return defaultValue;
1610
1714
  }
1715
+ }
1716
+ var safeParseJson = (str, defaultValue) => {
1717
+ if (str && str.length > 0) {
1718
+ try {
1719
+ return JSON.parse(str);
1720
+ } catch {
1721
+ }
1722
+ }
1723
+ return defaultValue;
1611
1724
  };
1612
- var safeParseFloat = (str, defaultValue) => {
1725
+ var safeUrl = (str) => {
1613
1726
  try {
1614
- return parseFloat(str);
1727
+ return new URL(str ?? "");
1615
1728
  } catch {
1616
- return defaultValue ?? 0;
1729
+ return void 0;
1617
1730
  }
1618
1731
  };
1619
- var safeParseJson = (data, defaultValue) => {
1620
- if (data && data.length > 0) {
1732
+
1733
+ // src/safe-stringify.ts
1734
+ var SKIP = Object.freeze({});
1735
+ function safeStringify(obj, filter = defaultFilter, indent = 2) {
1736
+ const seen = /* @__PURE__ */ new WeakMap();
1737
+ function replacer(key, value) {
1621
1738
  try {
1622
- return JSON.parse(data);
1623
- } catch (err) {
1739
+ let path = key;
1740
+ if (!key) {
1741
+ path = "$";
1742
+ if (value != null && typeof value === "object") {
1743
+ seen.set(value, path);
1744
+ }
1745
+ return value;
1746
+ } else if (this) {
1747
+ const parentPath = seen.get(this);
1748
+ path = parentPath ? `${parentPath}.${key}` : key;
1749
+ }
1750
+ if (value == null) {
1751
+ return value;
1752
+ }
1753
+ if (typeof value === "function") {
1754
+ return void 0;
1755
+ }
1756
+ if (typeof value === "object" && Object.getPrototypeOf(value) !== Object.prototype && !Array.isArray(value)) {
1757
+ return void 0;
1758
+ }
1759
+ if (typeof value === "object" && value !== null) {
1760
+ const exists = seen.get(value);
1761
+ if (exists) {
1762
+ return `[${path} => ${exists}]`;
1763
+ }
1764
+ seen.set(value, path);
1765
+ }
1766
+ if (filter) {
1767
+ const filteredValue = filter?.(key, value);
1768
+ if (filteredValue !== void 0) {
1769
+ return filteredValue === SKIP ? void 0 : filteredValue;
1770
+ }
1771
+ }
1772
+ return value;
1773
+ } catch (error) {
1774
+ return `ERROR: ${error.message}`;
1624
1775
  }
1625
1776
  }
1626
- return defaultValue;
1777
+ try {
1778
+ return JSON.stringify(obj, replacer, indent);
1779
+ } catch (error) {
1780
+ return `ERROR: ${error.message}`;
1781
+ }
1782
+ }
1783
+ var createReplacer = ({ omit: omit2, parse, maxDepth, maxArrayLen, maxStringLen } = {}) => {
1784
+ let currentDepth = 0;
1785
+ const depthMap = /* @__PURE__ */ new WeakMap();
1786
+ return function(key, value) {
1787
+ if (key === "") {
1788
+ currentDepth = 0;
1789
+ } else if (this && typeof this === "object") {
1790
+ const parentDepth = depthMap.get(this) ?? 0;
1791
+ currentDepth = parentDepth + 1;
1792
+ }
1793
+ if (typeof value === "function") {
1794
+ return SKIP;
1795
+ }
1796
+ if (maxArrayLen != null && Array.isArray(value) && value.length > maxArrayLen) {
1797
+ return `[length: ${value.length}]`;
1798
+ }
1799
+ if (value && typeof value === "object") {
1800
+ depthMap.set(value, currentDepth);
1801
+ if (maxDepth != null && currentDepth >= maxDepth) {
1802
+ return Array.isArray(value) ? `[{ length: ${value.length} }]` : `{ keys: ${Object.keys(value).length} }`;
1803
+ }
1804
+ }
1805
+ if (omit2?.includes(key)) {
1806
+ return SKIP;
1807
+ }
1808
+ if (parse?.includes(key) && typeof value === "string") {
1809
+ try {
1810
+ return JSON.parse(value);
1811
+ } catch {
1812
+ return value;
1813
+ }
1814
+ }
1815
+ if (maxStringLen != null && typeof value === "string" && value.length > maxStringLen) {
1816
+ return value.slice(0, maxStringLen) + "...";
1817
+ }
1818
+ return value;
1819
+ };
1627
1820
  };
1821
+ var defaultFilter = createReplacer();
1628
1822
 
1629
1823
  // src/sliding-window-summary.ts
1630
1824
  import { invariant as invariant5 } from "@dxos/invariant";
1631
- var __dxlog_file5 = "/__w/dxos/dxos/packages/common/util/src/sliding-window-summary.ts";
1632
1825
  var SlidingWindowSummary = class {
1826
+ _buffer;
1827
+ _sum = 0;
1828
+ _precision;
1633
1829
  constructor(options) {
1634
- this._sum = 0;
1635
1830
  this._buffer = new CircularBuffer(options.dataPoints);
1636
1831
  if (options.precision != null) {
1637
- invariant5(options.precision >= 0, void 0, {
1638
- F: __dxlog_file5,
1639
- L: 26,
1640
- S: this,
1641
- A: [
1642
- "options.precision >= 0",
1643
- ""
1644
- ]
1645
- });
1832
+ invariant5(options.precision >= 0);
1646
1833
  this._precision = Math.pow(10, options.precision);
1647
1834
  }
1648
1835
  }
@@ -1711,6 +1898,28 @@ var capitalize = (str) => {
1711
1898
  }
1712
1899
  return str.charAt(0).toUpperCase() + str.slice(1);
1713
1900
  };
1901
+ function trim(strings, ...values) {
1902
+ const raw = strings.reduce((out, str, i) => {
1903
+ out += str;
1904
+ if (i < values.length) {
1905
+ const match = str.match(/(^|\n)([ \t]*)$/);
1906
+ const baseIndent = match ? match[2] : "";
1907
+ const val = String(values[i]).replace(/\r?\n/g, "\n" + baseIndent);
1908
+ out += val;
1909
+ }
1910
+ return out;
1911
+ }, "");
1912
+ const lines = raw.split("\n");
1913
+ while (lines.length && !lines[0].trim()) {
1914
+ lines.shift();
1915
+ }
1916
+ while (lines.length && !lines[lines.length - 1].trim()) {
1917
+ lines.pop();
1918
+ }
1919
+ const minIndent = Math.min(...lines.filter((l) => l.trim()).map((l) => l.match(/^[ \t]*/)?.[0].length ?? 0));
1920
+ return lines.map((l) => l.slice(minIndent)).join("\n");
1921
+ }
1922
+ var kebabize = (str) => str.replace(/[A-Z]+(?![a-z])|[A-Z]/g, ($, ofs) => (ofs ? "-" : "") + $.toLowerCase());
1714
1923
 
1715
1924
  // src/sum.ts
1716
1925
  var sum = (values) => values.reduce((a, b) => a + b, 0);
@@ -1724,18 +1933,6 @@ var throwUnhandledError = (error) => {
1724
1933
 
1725
1934
  // src/to-fallback.ts
1726
1935
  var idEmoji = [
1727
- // When changing this set, please check the result in a console or e.g. RunKit (https://runkit.com/thure/642214441dd6ae000855a8de)
1728
- // 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.
1729
- // This set was chosen from the characters in Unicode Emoji v15.0 based on the following criteria:
1730
- // – not people or isolated anthropomorphic faces
1731
- // – not flags
1732
- // – more concrete than abstract
1733
- // – less culturally specific
1734
- // – less easily confused with another emoji in the set
1735
- // – requires less special knowledge to identify
1736
- // – less likely to evoke negative feelings (no meat, no drugs, no weapons, etc)
1737
- // – less common as a signifier in UX
1738
- // NOTE that this is intentionally an array of strings because of the way emoji graphemes work.
1739
1936
  "\u{1F47B}",
1740
1937
  "\u{1F479}",
1741
1938
  "\u{1F47D}",
@@ -1871,17 +2068,18 @@ var idEmoji = [
1871
2068
  ];
1872
2069
  var idHue = [
1873
2070
  "red",
1874
- // 'orange' as const, /* More shades in these palettes are considered “ugly” */
2071
+ "orange",
1875
2072
  "amber",
1876
- // 'yellow' as const, /* More shades in these palettes are considered “ugly” */
2073
+ "yellow",
1877
2074
  "lime",
1878
2075
  "green",
1879
2076
  "emerald",
1880
2077
  "teal",
1881
2078
  "cyan",
1882
- // 'sky' as const, /* Omitted since it is quite similar to the primary accent palette */
1883
- // 'blue' as const, /* Omitted since it is quite similar to the primary accent palette */
1884
- // 'indigo' as const, /* Omitted since it is quite similar to the primary accent palette */
2079
+ // Omit colors similar to primary accent.
2080
+ // 'sky' as const,
2081
+ // 'blue' as const,
2082
+ // 'indigo' as const,
1885
2083
  "violet",
1886
2084
  "purple",
1887
2085
  "fuchsia",
@@ -1909,10 +2107,8 @@ var toFallback = (hash) => {
1909
2107
 
1910
2108
  // src/tracer.ts
1911
2109
  var Tracer = class {
1912
- constructor() {
1913
- this._events = /* @__PURE__ */ new Map();
1914
- this._recording = false;
1915
- }
2110
+ _events = /* @__PURE__ */ new Map();
2111
+ _recording = false;
1916
2112
  // TODO(burdon): Start/stop methods for recording data? By id?
1917
2113
  // Alternatively, enable subscriptions to track/compute series.
1918
2114
  // TODO(burdon): Hierarchical traces?
@@ -2013,7 +2209,7 @@ var stringifyTree = (node, ancestors = [], rows = []) => {
2013
2209
  };
2014
2210
 
2015
2211
  // src/types.ts
2016
- var isNotFalsy = (value) => !!value;
2212
+ var isTruthy = (value) => !!value;
2017
2213
  var isNonNullable = (value) => value != null;
2018
2214
  var doAsync = async (fn) => fn();
2019
2215
  var getProviderValue = (provider, arg) => {
@@ -2043,6 +2239,117 @@ var arrayMove = (array, from, to) => {
2043
2239
  array.splice(to < 0 ? array.length + to : to, 0, array.splice(from, 1)[0]);
2044
2240
  return array;
2045
2241
  };
2242
+ function arraySwap(array, from, to) {
2243
+ const current = array[from];
2244
+ array[from] = array[to];
2245
+ array[to] = current;
2246
+ return array;
2247
+ }
2248
+
2249
+ // src/unit.ts
2250
+ var createFormat = (unit) => {
2251
+ return (n, precision = unit.precision ?? 0) => {
2252
+ const value = n / unit.quotient;
2253
+ const formattedValue = value.toLocaleString("en-US", {
2254
+ minimumFractionDigits: precision,
2255
+ maximumFractionDigits: precision
2256
+ });
2257
+ return {
2258
+ unit,
2259
+ value,
2260
+ formattedValue,
2261
+ toString: () => `${formattedValue}${unit.symbol}`
2262
+ };
2263
+ };
2264
+ };
2265
+ var MS_SECONDS = 1e3;
2266
+ var MS_MINUTES = 60 * MS_SECONDS;
2267
+ var MS_HOURS = 60 * MS_MINUTES;
2268
+ var Unit = {
2269
+ // General.
2270
+ Percent: createFormat({
2271
+ symbol: "%",
2272
+ quotient: 1 / 100,
2273
+ precision: 2
2274
+ }),
2275
+ Thousand: createFormat({
2276
+ symbol: "k",
2277
+ quotient: 1e3,
2278
+ precision: 2
2279
+ }),
2280
+ // Bytes (note KB vs KiB).
2281
+ Gigabyte: createFormat({
2282
+ symbol: "GB",
2283
+ quotient: 1e3 * 1e3 * 1e3,
2284
+ precision: 2
2285
+ }),
2286
+ Megabyte: createFormat({
2287
+ symbol: "MB",
2288
+ quotient: 1e3 * 1e3,
2289
+ precision: 2
2290
+ }),
2291
+ Kilobyte: createFormat({
2292
+ symbol: "KB",
2293
+ quotient: 1e3,
2294
+ precision: 2
2295
+ }),
2296
+ Byte: createFormat({
2297
+ symbol: "B",
2298
+ quotient: 1
2299
+ }),
2300
+ // Time.
2301
+ Hour: createFormat({
2302
+ symbol: "h",
2303
+ quotient: MS_HOURS
2304
+ }),
2305
+ Minute: createFormat({
2306
+ symbol: "m",
2307
+ quotient: MS_MINUTES
2308
+ }),
2309
+ Second: createFormat({
2310
+ symbol: "s",
2311
+ quotient: MS_SECONDS,
2312
+ precision: 1
2313
+ }),
2314
+ Millisecond: createFormat({
2315
+ symbol: "ms",
2316
+ quotient: 1
2317
+ }),
2318
+ Duration: (n) => {
2319
+ const hours = Math.floor(n / MS_HOURS);
2320
+ const minutes = Math.floor(n % MS_HOURS / MS_MINUTES);
2321
+ if (hours) {
2322
+ const formattedValue = minutes ? `${hours}h ${minutes}m` : `${hours}h`;
2323
+ return {
2324
+ unit: {
2325
+ symbol: "h",
2326
+ quotient: MS_HOURS
2327
+ },
2328
+ value: hours,
2329
+ formattedValue,
2330
+ toString: () => formattedValue
2331
+ };
2332
+ }
2333
+ if (minutes) {
2334
+ const seconds2 = (n - MS_MINUTES * minutes) / MS_SECONDS;
2335
+ const formattedValue = seconds2 ? `${minutes}m ${seconds2}s` : `${minutes}m`;
2336
+ return {
2337
+ unit: {
2338
+ symbol: "m",
2339
+ quotient: MS_MINUTES
2340
+ },
2341
+ value: minutes,
2342
+ formattedValue,
2343
+ toString: () => formattedValue
2344
+ };
2345
+ }
2346
+ const seconds = n >= MS_SECONDS;
2347
+ if (seconds) {
2348
+ return Unit.Second(n);
2349
+ }
2350
+ return Unit.Millisecond(n);
2351
+ }
2352
+ };
2046
2353
 
2047
2354
  // src/url.ts
2048
2355
  var createUrl = (url, search) => {
@@ -2055,16 +2362,20 @@ var createUrl = (url, search) => {
2055
2362
 
2056
2363
  // src/weak.ts
2057
2364
  var WeakDictionary = class {
2365
+ _internal = /* @__PURE__ */ new Map();
2366
+ _finalization = new FinalizationRegistry(({ key, ref }) => {
2367
+ if (this._internal.get(key) === ref) {
2368
+ this._internal.delete(key);
2369
+ }
2370
+ });
2058
2371
  constructor(entries2) {
2059
- this._internal = /* @__PURE__ */ new Map();
2060
- this._finalization = new FinalizationRegistry((cleanUpCallback) => {
2061
- cleanUpCallback();
2062
- });
2063
- this._internal = new Map(entries2?.map(([key, value]) => [
2064
- key,
2065
- new WeakRef(value)
2066
- ]));
2067
- entries2?.forEach(([key, value]) => this._register(key, value));
2372
+ if (entries2) {
2373
+ for (const [key, value] of entries2) {
2374
+ const ref = new WeakRef(value);
2375
+ this._internal.set(key, ref);
2376
+ this._register(key, value, ref);
2377
+ }
2378
+ }
2068
2379
  }
2069
2380
  *entries() {
2070
2381
  for (const [key, value] of this._internal) {
@@ -2104,10 +2415,45 @@ var WeakDictionary = class {
2104
2415
  return this._internal.get(key)?.deref();
2105
2416
  }
2106
2417
  set(key, value) {
2107
- this._internal.set(key, new WeakRef(value));
2108
- this._register(key, value);
2418
+ const previous = this._internal.get(key)?.deref();
2419
+ if (previous) {
2420
+ this._unregister(previous);
2421
+ }
2422
+ const ref = new WeakRef(value);
2423
+ this._internal.set(key, ref);
2424
+ this._register(key, value, ref);
2109
2425
  return this;
2110
2426
  }
2427
+ /**
2428
+ * Returns the value for the given key if present, otherwise inserts and returns the default value.
2429
+ * @param key - The key to look up or insert.
2430
+ * @param defaultValue - The value to insert if the key is not present.
2431
+ * @returns The existing or newly inserted value.
2432
+ */
2433
+ getOrInsert(key, defaultValue) {
2434
+ const existing = this.get(key);
2435
+ if (existing !== void 0) {
2436
+ return existing;
2437
+ }
2438
+ this.set(key, defaultValue);
2439
+ return defaultValue;
2440
+ }
2441
+ /**
2442
+ * Returns the value for the given key if present, otherwise computes, inserts, and returns a new value.
2443
+ * The callback is only invoked when the key is missing.
2444
+ * @param key - The key to look up or insert.
2445
+ * @param callbackfn - Function to compute the value if the key is not present.
2446
+ * @returns The existing or newly computed value.
2447
+ */
2448
+ getOrInsertComputed(key, callbackfn) {
2449
+ const existing = this.get(key);
2450
+ if (existing !== void 0) {
2451
+ return existing;
2452
+ }
2453
+ const value = callbackfn(key);
2454
+ this.set(key, value);
2455
+ return value;
2456
+ }
2111
2457
  has(key) {
2112
2458
  return this._internal.has(key) && this._internal.get(key).deref() !== void 0;
2113
2459
  }
@@ -2138,9 +2484,10 @@ var WeakDictionary = class {
2138
2484
  }
2139
2485
  });
2140
2486
  }
2141
- _register(key, value) {
2142
- this._finalization.register(value, () => {
2143
- this._internal.delete(key);
2487
+ _register(key, value, ref) {
2488
+ this._finalization.register(value, {
2489
+ key,
2490
+ ref
2144
2491
  }, value);
2145
2492
  }
2146
2493
  _unregister(value) {
@@ -2156,11 +2503,14 @@ export {
2156
2503
  ComplexSet,
2157
2504
  HumanHasher,
2158
2505
  MapEntry,
2506
+ SKIP,
2159
2507
  SlidingWindowSummary,
2160
2508
  Tracer,
2509
+ Unit,
2161
2510
  WeakDictionary,
2162
2511
  accessBy,
2163
2512
  arrayMove,
2513
+ arraySwap,
2164
2514
  arrayToBuffer,
2165
2515
  arrayToHex,
2166
2516
  arrayToString,
@@ -2171,19 +2521,28 @@ export {
2171
2521
  capitalize,
2172
2522
  chunkArray,
2173
2523
  clamp,
2524
+ clearCaches,
2525
+ clearIndexedDB,
2526
+ clearOPFS,
2527
+ clearServiceWorkers,
2174
2528
  clearUndefined,
2529
+ coerceArray,
2175
2530
  compareMulti,
2176
2531
  compareObject,
2177
2532
  compareScalar,
2178
2533
  compareString,
2534
+ compositeKey,
2179
2535
  createBinder,
2180
2536
  createBucketReducer,
2537
+ createFilename,
2181
2538
  createGroupReducer,
2539
+ createReplacer,
2182
2540
  createSetDispatch,
2183
2541
  createUrl,
2184
2542
  decamelize,
2185
2543
  deepMapValues,
2186
2544
  deepMapValuesAsync,
2545
+ defaultFilter,
2187
2546
  defaultMap,
2188
2547
  defer,
2189
2548
  deferAsync,
@@ -2195,12 +2554,11 @@ export {
2195
2554
  entry,
2196
2555
  exponentialBackoffInterval,
2197
2556
  forEachAsync,
2198
- get,
2557
+ formatErrorWithCauses,
2199
2558
  getAsyncProviderValue,
2200
2559
  getDate,
2201
2560
  getDebugName,
2202
2561
  getDeep,
2203
- getFirstTwoRenderableChars,
2204
2562
  getHostPlatform,
2205
2563
  getPrototypeSpecificInstanceId,
2206
2564
  getProviderValue,
@@ -2216,14 +2574,19 @@ export {
2216
2574
  intersectBy,
2217
2575
  intersection,
2218
2576
  iosCheck,
2577
+ isBun,
2578
+ isMobile,
2579
+ isMobileOrTablet,
2219
2580
  isNode,
2220
2581
  isNonNullable,
2221
- isNotFalsy,
2582
+ isTauri,
2583
+ isTruthy,
2222
2584
  joinTables,
2223
2585
  jsonKeyReplacer,
2224
2586
  jsonReplacer,
2225
2587
  jsonify,
2226
2588
  jsonlogify,
2589
+ kebabize,
2227
2590
  keyToEmoji,
2228
2591
  keyToFallback,
2229
2592
  keyToHue,
@@ -2232,7 +2595,6 @@ export {
2232
2595
  makeSet,
2233
2596
  mapValues,
2234
2597
  median,
2235
- mobileAndTabletCheck,
2236
2598
  numericalValues,
2237
2599
  omit,
2238
2600
  orderKeys,
@@ -2248,15 +2610,18 @@ export {
2248
2610
  removeBy,
2249
2611
  removeProperties,
2250
2612
  removeUndefinedProperties,
2613
+ retry,
2251
2614
  safariCheck,
2252
2615
  safeAwaitAll,
2253
2616
  safeInstanceof,
2254
2617
  safeParseFloat,
2255
2618
  safeParseInt,
2256
2619
  safeParseJson,
2257
- set,
2620
+ safeStringify,
2621
+ safeUrl,
2258
2622
  setDeep,
2259
2623
  sortKeys,
2624
+ splitCompositeKey,
2260
2625
  stringToArray,
2261
2626
  stringifyTree,
2262
2627
  stripUndefined,
@@ -2266,6 +2631,7 @@ export {
2266
2631
  toFallback,
2267
2632
  toHue,
2268
2633
  tracer,
2634
+ trim,
2269
2635
  visitValues
2270
2636
  };
2271
2637
  //# sourceMappingURL=index.mjs.map