@dxos/util 0.8.3 → 0.8.4-main.1068cf700f

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 (90) hide show
  1. package/dist/lib/browser/index.mjs +460 -169
  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 +460 -169
  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/assume.d.ts.map +1 -1
  10. package/dist/types/src/deep.d.ts.map +1 -1
  11. package/dist/types/src/defer.d.ts +1 -1
  12. package/dist/types/src/defer.d.ts.map +1 -1
  13. package/dist/types/src/di-key.d.ts +3 -3
  14. package/dist/types/src/di-key.d.ts.map +1 -1
  15. package/dist/types/src/error-format.d.ts +5 -0
  16. package/dist/types/src/error-format.d.ts.map +1 -0
  17. package/dist/types/src/filename.d.ts +9 -0
  18. package/dist/types/src/filename.d.ts.map +1 -0
  19. package/dist/types/src/index.d.ts +7 -3
  20. package/dist/types/src/index.d.ts.map +1 -1
  21. package/dist/types/src/json.d.ts +1 -1
  22. package/dist/types/src/json.d.ts.map +1 -1
  23. package/dist/types/src/object.d.ts +3 -0
  24. package/dist/types/src/object.d.ts.map +1 -1
  25. package/dist/types/src/platform.d.ts +4 -1
  26. package/dist/types/src/platform.d.ts.map +1 -1
  27. package/dist/types/src/retry.d.ts +32 -0
  28. package/dist/types/src/retry.d.ts.map +1 -0
  29. package/dist/types/src/safe-parse.d.ts +6 -4
  30. package/dist/types/src/safe-parse.d.ts.map +1 -1
  31. package/dist/types/src/safe-stringify.d.ts +22 -0
  32. package/dist/types/src/safe-stringify.d.ts.map +1 -0
  33. package/dist/types/src/string.d.ts +8 -0
  34. package/dist/types/src/string.d.ts.map +1 -1
  35. package/dist/types/src/string.test.d.ts +2 -0
  36. package/dist/types/src/string.test.d.ts.map +1 -0
  37. package/dist/types/src/to-fallback.d.ts.map +1 -1
  38. package/dist/types/src/types.d.ts +23 -5
  39. package/dist/types/src/types.d.ts.map +1 -1
  40. package/dist/types/src/unit.d.ts +14 -0
  41. package/dist/types/src/unit.d.ts.map +1 -0
  42. package/dist/types/src/unit.test.d.ts +2 -0
  43. package/dist/types/src/unit.test.d.ts.map +1 -0
  44. package/dist/types/src/url.d.ts +5 -0
  45. package/dist/types/src/url.d.ts.map +1 -0
  46. package/dist/types/src/url.test.d.ts +2 -0
  47. package/dist/types/src/url.test.d.ts.map +1 -0
  48. package/dist/types/tsconfig.tsbuildinfo +1 -1
  49. package/package.json +14 -9
  50. package/src/array.test.ts +1 -1
  51. package/src/array.ts +9 -4
  52. package/src/assume.ts +0 -1
  53. package/src/binder.ts +2 -2
  54. package/src/circular-buffer.test.ts +1 -1
  55. package/src/complex.test.ts +1 -1
  56. package/src/deep.ts +2 -0
  57. package/src/defer.ts +1 -1
  58. package/src/error-format.ts +22 -0
  59. package/src/filename.ts +16 -0
  60. package/src/human-hash.test.ts +1 -1
  61. package/src/index.ts +7 -3
  62. package/src/json.ts +2 -7
  63. package/src/object.ts +3 -0
  64. package/src/platform.ts +12 -2
  65. package/src/position.test.ts +2 -2
  66. package/src/retry.ts +74 -0
  67. package/src/safe-parse.ts +21 -15
  68. package/src/safe-stringify.ts +146 -0
  69. package/src/sort.test.ts +1 -1
  70. package/src/string.test.ts +19 -0
  71. package/src/string.ts +36 -0
  72. package/src/to-fallback.ts +5 -4
  73. package/src/tree.test.ts +1 -1
  74. package/src/types.test.ts +11 -1
  75. package/src/types.ts +38 -10
  76. package/src/uint8array.test.ts +1 -1
  77. package/src/unit.test.ts +25 -0
  78. package/src/unit.ts +83 -0
  79. package/src/url.test.ts +22 -0
  80. package/src/url.ts +15 -0
  81. package/src/weak.test.ts +1 -1
  82. package/dist/lib/node/index.cjs +0 -2309
  83. package/dist/lib/node/index.cjs.map +0 -7
  84. package/dist/lib/node/meta.json +0 -1
  85. package/dist/types/src/explicit-resource-management-polyfill.d.ts +0 -1
  86. package/dist/types/src/explicit-resource-management-polyfill.d.ts.map +0 -1
  87. package/dist/types/src/first-two-chars.d.ts +0 -9
  88. package/dist/types/src/first-two-chars.d.ts.map +0 -1
  89. package/src/explicit-resource-management-polyfill.ts +0 -13
  90. package/src/first-two-chars.ts +0 -44
@@ -1,6 +1,6 @@
1
1
  import "@dxos/node-std/globals";
2
2
 
3
- // packages/common/util/src/array-to-hex.ts
3
+ // src/array-to-hex.ts
4
4
  var byteToHex = [];
5
5
  for (let n = 0; n <= 255; ++n) {
6
6
  const hexOctet = n.toString(16).padStart(2, "0");
@@ -15,7 +15,7 @@ var arrayToHex = (buf) => {
15
15
  return hexOctets.join("");
16
16
  };
17
17
 
18
- // packages/common/util/src/array.ts
18
+ // src/array.ts
19
19
  var diff = (previous, next, comparator) => {
20
20
  const remaining = [
21
21
  ...previous
@@ -97,17 +97,29 @@ 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
- // packages/common/util/src/binder.ts
102
- import util from "@dxos/node-std/util";
109
+ // src/assume.ts
110
+ function assumeType(value) {
111
+ }
112
+
113
+ // src/binder.ts
114
+ import { promisify } from "@dxos/node-std/util";
103
115
  var createBinder = (obj) => ({
104
116
  fn: (fn) => fn.bind(obj),
105
- async: (fn) => util.promisify(fn.bind(obj))
117
+ async: (fn) => promisify(fn.bind(obj))
106
118
  });
107
119
 
108
- // packages/common/util/src/bitfield.ts
120
+ // src/bitfield.ts
109
121
  import { invariant } from "@dxos/invariant";
110
- var __dxlog_file = "/home/runner/work/dxos/dxos/packages/common/util/src/bitfield.ts";
122
+ var __dxlog_file = "/__w/dxos/dxos/packages/common/util/src/bitfield.ts";
111
123
  var BitField = class _BitField {
112
124
  static get(data, idx) {
113
125
  const bit = data[idx >> 3] >> 7 - idx % 8 & 1;
@@ -175,7 +187,7 @@ var BitField = class _BitField {
175
187
  }
176
188
  };
177
189
 
178
- // packages/common/util/src/callback-collection.ts
190
+ // src/callback-collection.ts
179
191
  var CallbackCollection = class {
180
192
  #callbacks = [];
181
193
  append(callback) {
@@ -199,10 +211,11 @@ var CallbackCollection = class {
199
211
  }
200
212
  };
201
213
 
202
- // packages/common/util/src/callback.ts
214
+ // src/callback.ts
203
215
  import { invariant as invariant2 } from "@dxos/invariant";
204
- var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/common/util/src/callback.ts";
216
+ var __dxlog_file2 = "/__w/dxos/dxos/packages/common/util/src/callback.ts";
205
217
  var Callback = class {
218
+ _callback;
206
219
  call(...args) {
207
220
  invariant2(this._callback, "Callback not set", {
208
221
  F: __dxlog_file2,
@@ -251,7 +264,7 @@ var createSetDispatch = ({ handlers }) => {
251
264
  });
252
265
  };
253
266
 
254
- // packages/common/util/src/case.ts
267
+ // src/case.ts
255
268
  var LOW_DASH = "_".codePointAt(0);
256
269
  var HI_DASH = "-".codePointAt(0);
257
270
  var SMALL_A = "a".codePointAt(0);
@@ -284,7 +297,7 @@ var changeCase = (str, delim) => {
284
297
  var decamelize = (str) => changeCase(str, LOW_DASH);
285
298
  var hyphenize = (str) => changeCase(str, HI_DASH);
286
299
 
287
- // packages/common/util/src/chunk-array.ts
300
+ // src/chunk-array.ts
288
301
  var chunkArray = (array, size) => {
289
302
  const result = [];
290
303
  for (let i = 0; i < array.length; i += size) {
@@ -293,13 +306,14 @@ var chunkArray = (array, size) => {
293
306
  return result;
294
307
  };
295
308
 
296
- // packages/common/util/src/circular-buffer.ts
309
+ // src/circular-buffer.ts
297
310
  import { invariant as invariant3 } from "@dxos/invariant";
298
- var __dxlog_file3 = "/home/runner/work/dxos/dxos/packages/common/util/src/circular-buffer.ts";
311
+ var __dxlog_file3 = "/__w/dxos/dxos/packages/common/util/src/circular-buffer.ts";
299
312
  var CircularBuffer = class {
313
+ _buffer;
314
+ _nextIndex = 0;
315
+ _elementCount = 0;
300
316
  constructor(size) {
301
- this._nextIndex = 0;
302
- this._elementCount = 0;
303
317
  invariant3(size >= 1, void 0, {
304
318
  F: __dxlog_file3,
305
319
  L: 13,
@@ -352,7 +366,7 @@ var CircularBuffer = class {
352
366
  }
353
367
  };
354
368
 
355
- // packages/common/util/src/clear-undefined.ts
369
+ // src/clear-undefined.ts
356
370
  var clearUndefined = (obj) => {
357
371
  for (const key of [
358
372
  ...Object.getOwnPropertyNames(obj),
@@ -365,15 +379,16 @@ var clearUndefined = (obj) => {
365
379
  return obj;
366
380
  };
367
381
 
368
- // packages/common/util/src/complex.ts
382
+ // src/complex.ts
369
383
  import { inspect } from "@dxos/node-std/util";
370
384
  import { inspectObject, raise } from "@dxos/debug";
371
385
  var MAX_SERIALIZATION_LENGTH = 10;
372
386
  var ComplexSet = class {
387
+ _projection;
388
+ _values = /* @__PURE__ */ new Map();
373
389
  // prettier-ignore
374
390
  constructor(_projection, values) {
375
391
  this._projection = _projection;
376
- this._values = /* @__PURE__ */ new Map();
377
392
  if (values) {
378
393
  for (const value of values) {
379
394
  this.add(value);
@@ -463,11 +478,12 @@ var makeSet = (projection) => {
463
478
  };
464
479
  };
465
480
  var ComplexMap = class _ComplexMap {
481
+ _keyProjection;
482
+ _keys = /* @__PURE__ */ new Map();
483
+ _values = /* @__PURE__ */ new Map();
466
484
  // prettier-ignore
467
485
  constructor(_keyProjection, entries2) {
468
486
  this._keyProjection = _keyProjection;
469
- this._keys = /* @__PURE__ */ new Map();
470
- this._values = /* @__PURE__ */ new Map();
471
487
  if (entries2) {
472
488
  for (const [key, value] of entries2) {
473
489
  this.set(key, value);
@@ -551,11 +567,11 @@ var makeMap = (keyProjection) => class BoundComplexMap extends ComplexMap {
551
567
  }
552
568
  };
553
569
 
554
- // packages/common/util/src/deep.ts
570
+ // src/deep.ts
555
571
  import get from "lodash.get";
556
572
  import set from "lodash.set";
557
573
  import { invariant as invariant4 } from "@dxos/invariant";
558
- var __dxlog_file4 = "/home/runner/work/dxos/dxos/packages/common/util/src/deep.ts";
574
+ var __dxlog_file4 = "/__w/dxos/dxos/packages/common/util/src/deep.ts";
559
575
  var setDeep = (obj, path, value) => {
560
576
  invariant4(path.length > 0, void 0, {
561
577
  F: __dxlog_file4,
@@ -585,16 +601,14 @@ var getDeep = (obj, path) => {
585
601
  return parent;
586
602
  };
587
603
 
588
- // packages/common/util/src/defer-function.ts
604
+ // src/defer-function.ts
589
605
  var deferFunction = (fnProvider) => (...args) => fnProvider()(...args);
590
606
 
591
- // packages/common/util/src/explicit-resource-management-polyfill.ts
592
- Symbol.dispose ??= Symbol("Symbol.dispose");
593
- Symbol.asyncDispose ??= Symbol("Symbol.asyncDispose");
594
-
595
- // packages/common/util/src/defer.ts
607
+ // src/defer.ts
608
+ import "@hazae41/symbol-dispose-polyfill";
596
609
  var defer = (fn) => new DeferGuard(fn);
597
610
  var DeferGuard = class {
611
+ _fn;
598
612
  /**
599
613
  * @internal
600
614
  */
@@ -610,6 +624,7 @@ var DeferGuard = class {
610
624
  };
611
625
  var deferAsync = (fn) => new DeferAsyncGuard(fn);
612
626
  var DeferAsyncGuard = class {
627
+ _fn;
613
628
  /**
614
629
  * @internal
615
630
  */
@@ -621,9 +636,11 @@ var DeferAsyncGuard = class {
621
636
  }
622
637
  };
623
638
 
624
- // packages/common/util/src/entry.ts
639
+ // src/entry.ts
625
640
  var entry = (map, key) => new MapEntry(map, key);
626
641
  var MapEntry = class {
642
+ _map;
643
+ _key;
627
644
  /**
628
645
  * @internal
629
646
  */
@@ -649,37 +666,16 @@ var MapEntry = class {
649
666
  }
650
667
  };
651
668
 
652
- // packages/common/util/src/first-two-chars.ts
653
- var renderableCharRegex = /^(?![\p{Control}\p{Mark}\p{Separator}\p{Surrogate}\p{Unassigned}\p{P}])[\p{L}\p{N}\p{S}\p{Emoji}]$/u;
654
- var getFirstTwoRenderableChars = (label) => {
655
- const characters = Array.from(label);
656
- const result = [
657
- "",
658
- ""
659
- ];
660
- let foundFirst = false;
661
- for (let i = 0; i < characters.length; i++) {
662
- const char = characters[i];
663
- if (renderableCharRegex.test(char)) {
664
- if (!foundFirst) {
665
- result[0] = char;
666
- foundFirst = true;
667
- } else {
668
- const textBetween = characters.slice(result[0].length, i).join("");
669
- if (/[^\p{L}\p{N}_]/u.test(textBetween)) {
670
- result[1] = char;
671
- break;
672
- }
673
- }
674
- }
675
- }
676
- return result;
677
- };
669
+ // src/filename.ts
670
+ var createFilename = ({ parts = [], ext, date = /* @__PURE__ */ new Date() }) => [
671
+ date.toISOString().replace(/[:.]/g, "-"),
672
+ ...parts
673
+ ].join("_") + (ext ? `.${ext}` : "");
678
674
 
679
- // packages/common/util/src/for-each-async.ts
675
+ // src/for-each-async.ts
680
676
  var forEachAsync = (items, fn) => Promise.all(items.map(fn));
681
677
 
682
- // packages/common/util/src/human-hash.ts
678
+ // src/human-hash.ts
683
679
  import { PublicKey } from "@dxos/keys";
684
680
  var DEFAULT_WORDLIST = [
685
681
  "ack",
@@ -940,6 +936,7 @@ var DEFAULT_WORDLIST = [
940
936
  "zulu"
941
937
  ];
942
938
  var HumanHasher = class {
939
+ wordlist;
943
940
  /**
944
941
  * Transforms hex digests to human-readable strings.
945
942
  *
@@ -1010,7 +1007,7 @@ var humanize = (value) => {
1010
1007
  return hasher.humanize(value);
1011
1008
  };
1012
1009
 
1013
- // packages/common/util/src/map.ts
1010
+ // src/map.ts
1014
1011
  var defaultMap = (map, key, def) => {
1015
1012
  let value = map.get(key);
1016
1013
  if (value === void 0) {
@@ -1020,7 +1017,7 @@ var defaultMap = (map, key, def) => {
1020
1017
  return value;
1021
1018
  };
1022
1019
 
1023
- // packages/common/util/src/instance-id.ts
1020
+ // src/instance-id.ts
1024
1021
  var symbol = Symbol.for("dxos.instance-contexts");
1025
1022
  var instanceContexts = globalThis[symbol] ??= /* @__PURE__ */ new WeakMap();
1026
1023
  var getPrototypeSpecificInstanceId = (instance) => {
@@ -1044,7 +1041,7 @@ var getDebugName = (instance) => {
1044
1041
  return `${prototype.constructor?.name ?? "Object"}#${getPrototypeSpecificInstanceId(instance)}`;
1045
1042
  };
1046
1043
 
1047
- // packages/common/util/src/interval.ts
1044
+ // src/interval.ts
1048
1045
  var exponentialBackoffInterval = (cb, initialInterval) => {
1049
1046
  let interval = initialInterval;
1050
1047
  const repeat = () => {
@@ -1056,7 +1053,7 @@ var exponentialBackoffInterval = (cb, initialInterval) => {
1056
1053
  return () => clearTimeout(timeoutId);
1057
1054
  };
1058
1055
 
1059
- // packages/common/util/src/join-tables.ts
1056
+ // src/join-tables.ts
1060
1057
  var joinTables = (leftColumn, rightColumn, left, right) => {
1061
1058
  const map = /* @__PURE__ */ new Map();
1062
1059
  const used = /* @__PURE__ */ new Set();
@@ -1077,11 +1074,11 @@ var joinTables = (leftColumn, rightColumn, left, right) => {
1077
1074
  return result;
1078
1075
  };
1079
1076
 
1080
- // packages/common/util/src/json.ts
1077
+ // src/json.ts
1081
1078
  import { inspect as inspect2 } from "@dxos/node-std/util";
1082
1079
  import { PublicKey as PublicKey2 } from "@dxos/keys";
1083
1080
 
1084
- // packages/common/util/src/uint8array.ts
1081
+ // src/uint8array.ts
1085
1082
  var arraysEqual = (a, b) => {
1086
1083
  if (a.length !== b.length) {
1087
1084
  return false;
@@ -1102,10 +1099,10 @@ var bufferToArray = (buffer) => {
1102
1099
  var stringToArray = (string) => bufferToArray(Buffer.from(string, "hex"));
1103
1100
  var arrayToString = (array) => arrayToBuffer(array).toString("hex");
1104
1101
 
1105
- // packages/common/util/src/json.ts
1102
+ // src/json.ts
1106
1103
  var MAX_DEPTH = 5;
1107
1104
  var LOG_MAX_DEPTH = 7;
1108
- function jsonReplacer(key, value) {
1105
+ var jsonReplacer = (key, value) => {
1109
1106
  if (value !== null && typeof value === "object" && typeof value[inspect2.custom] === "function") {
1110
1107
  return value[inspect2.custom]();
1111
1108
  }
@@ -1118,7 +1115,7 @@ function jsonReplacer(key, value) {
1118
1115
  }
1119
1116
  }
1120
1117
  return value;
1121
- }
1118
+ };
1122
1119
  var jsonify = (value, depth = 0, visitedObjects = /* @__PURE__ */ new WeakSet()) => {
1123
1120
  if (depth > MAX_DEPTH) {
1124
1121
  return null;
@@ -1193,7 +1190,7 @@ var jsonKeyReplacer = (options = {}) => (key, value) => {
1193
1190
  return value;
1194
1191
  };
1195
1192
 
1196
- // packages/common/util/src/map-values.ts
1193
+ // src/map-values.ts
1197
1194
  var mapValues = (obj, fn) => {
1198
1195
  const result = {};
1199
1196
  Object.keys(obj).forEach((key) => {
@@ -1205,31 +1202,10 @@ var deepMapValues = (value, fn) => {
1205
1202
  return new DeepMapper(fn).map(value);
1206
1203
  };
1207
1204
  var DeepMapper = class {
1205
+ _fn;
1206
+ _cyclic = /* @__PURE__ */ new Map();
1208
1207
  constructor(_fn) {
1209
1208
  this._fn = _fn;
1210
- this._cyclic = /* @__PURE__ */ new Map();
1211
- this._recurse = (value) => {
1212
- if (this._cyclic.has(value)) {
1213
- return this._cyclic.get(value);
1214
- }
1215
- if (Array.isArray(value)) {
1216
- const res = new Array(value.length);
1217
- this._cyclic.set(value, res);
1218
- for (let i = 0; i < value.length; i++) {
1219
- res[i] = this._map(value[i], i);
1220
- }
1221
- return res;
1222
- } else if (value !== null && typeof value === "object") {
1223
- const res = {};
1224
- this._cyclic.set(value, res);
1225
- for (const key in value) {
1226
- res[key] = this._map(value[key], key);
1227
- }
1228
- return res;
1229
- } else {
1230
- return value;
1231
- }
1232
- };
1233
1209
  }
1234
1210
  map(value) {
1235
1211
  return this._map(value, void 0);
@@ -1240,36 +1216,37 @@ var DeepMapper = class {
1240
1216
  }
1241
1217
  return this._fn(value, this._recurse, key);
1242
1218
  }
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);
1228
+ }
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);
1235
+ }
1236
+ return res;
1237
+ } else {
1238
+ return value;
1239
+ }
1240
+ };
1243
1241
  };
1244
1242
  var deepMapValuesAsync = (value, fn) => {
1245
1243
  return new DeepMapperAsync(fn).map(value);
1246
1244
  };
1247
1245
  var DeepMapperAsync = class {
1246
+ _fn;
1247
+ _cyclic = /* @__PURE__ */ new Map();
1248
1248
  constructor(_fn) {
1249
1249
  this._fn = _fn;
1250
- this._cyclic = /* @__PURE__ */ new Map();
1251
- this._recurse = async (value) => {
1252
- if (this._cyclic.has(value)) {
1253
- return this._cyclic.get(value);
1254
- }
1255
- if (Array.isArray(value)) {
1256
- const res = new Array(value.length);
1257
- this._cyclic.set(value, res);
1258
- for (let i = 0; i < value.length; i++) {
1259
- res[i] = await this._map(value[i], i);
1260
- }
1261
- return res;
1262
- } else if (value !== null && typeof value === "object") {
1263
- const res = {};
1264
- this._cyclic.set(value, res);
1265
- for (const key in value) {
1266
- res[key] = await this._map(value[key], key);
1267
- }
1268
- return res;
1269
- } else {
1270
- return value;
1271
- }
1272
- };
1273
1250
  }
1274
1251
  map(value) {
1275
1252
  return this._map(value, void 0);
@@ -1280,6 +1257,28 @@ var DeepMapperAsync = class {
1280
1257
  }
1281
1258
  return this._fn(value, this._recurse, key);
1282
1259
  }
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);
1269
+ }
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);
1276
+ }
1277
+ return res;
1278
+ } else {
1279
+ return value;
1280
+ }
1281
+ };
1283
1282
  };
1284
1283
  var visitValues = (object, visitor) => {
1285
1284
  if (Array.isArray(object)) {
@@ -1291,11 +1290,11 @@ var visitValues = (object, visitor) => {
1291
1290
  }
1292
1291
  };
1293
1292
 
1294
- // packages/common/util/src/object.ts
1293
+ // src/object.ts
1295
1294
  var keys = (obj) => Object.keys(obj);
1296
1295
  var entries = (obj) => Object.entries(obj);
1297
1296
 
1298
- // packages/common/util/src/order-keys.ts
1297
+ // src/order-keys.ts
1299
1298
  var orderKeys = (obj, order) => {
1300
1299
  const ordered = {};
1301
1300
  for (const key of order) {
@@ -1311,7 +1310,7 @@ var orderKeys = (obj, order) => {
1311
1310
  return ordered;
1312
1311
  };
1313
1312
 
1314
- // packages/common/util/src/order.ts
1313
+ // src/order.ts
1315
1314
  var inferObjectOrder = (objectMap, order = []) => {
1316
1315
  const orderedObjects = order.reduce((acc, id) => {
1317
1316
  if (id in objectMap) {
@@ -1338,7 +1337,7 @@ var inferRecordOrder = (objectMap, order = []) => {
1338
1337
  }, {}), objectMap);
1339
1338
  };
1340
1339
 
1341
- // packages/common/util/src/pick.ts
1340
+ // src/pick.ts
1342
1341
  var pick = (obj, keys2) => {
1343
1342
  return keys2.reduce((result, key) => {
1344
1343
  if (obj && key in obj) {
@@ -1366,9 +1365,20 @@ var omit = (obj, keys2) => {
1366
1365
  return result;
1367
1366
  };
1368
1367
 
1369
- // packages/common/util/src/platform.ts
1368
+ // src/platform.ts
1370
1369
  var isNode = () => typeof process !== "undefined" && process.versions != null && process.versions.node != null;
1371
- 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 = () => {
1372
1382
  let check = false;
1373
1383
  ((a) => {
1374
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))) {
@@ -1390,7 +1400,7 @@ var iosCheck = () => {
1390
1400
  };
1391
1401
  var safariCheck = () => typeof navigator !== "undefined" && /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
1392
1402
  var getHostPlatform = () => {
1393
- if (!("navigator" in window)) {
1403
+ if (!("navigator" in globalThis)) {
1394
1404
  return "unknown";
1395
1405
  }
1396
1406
  const platform = (navigator.userAgentData?.platform || navigator.platform)?.toLowerCase();
@@ -1407,7 +1417,7 @@ var getHostPlatform = () => {
1407
1417
  }
1408
1418
  };
1409
1419
 
1410
- // packages/common/util/src/position.ts
1420
+ // src/position.ts
1411
1421
  var byPosition = ({ position: a = "static" }, { position: b = "static" }) => {
1412
1422
  if (a === b) {
1413
1423
  return 0;
@@ -1420,14 +1430,14 @@ var byPosition = ({ position: a = "static" }, { position: b = "static" }) => {
1420
1430
  }
1421
1431
  };
1422
1432
 
1423
- // packages/common/util/src/random.ts
1433
+ // src/random.ts
1424
1434
  var randomInt = (max, min = 0) => {
1425
1435
  min = Math.ceil(min);
1426
1436
  max = Math.floor(max);
1427
1437
  return Math.floor(Math.random() * (max - min + 1)) + min;
1428
1438
  };
1429
1439
 
1430
- // packages/common/util/src/range.ts
1440
+ // src/range.ts
1431
1441
  var range = (n = 0, mapper) => {
1432
1442
  const range2 = Array.from(Array(n).keys());
1433
1443
  return mapper == null ? range2 : range2.map(mapper);
@@ -1439,7 +1449,7 @@ var clamp = (value, min, max) => {
1439
1449
  return Math.min(Math.max(value, min), max);
1440
1450
  };
1441
1451
 
1442
- // packages/common/util/src/reducers.ts
1452
+ // src/reducers.ts
1443
1453
  var accessBy = (value, accessor) => typeof accessor === "function" ? accessor(value) : value[accessor];
1444
1454
  var median = (values) => {
1445
1455
  const mid = Math.floor(values.length / 2);
@@ -1525,7 +1535,7 @@ var createBucketReducer = (period) => ({
1525
1535
  }
1526
1536
  });
1527
1537
 
1528
- // packages/common/util/src/remove-undefined-keys.ts
1538
+ // src/remove-undefined-keys.ts
1529
1539
  var removeUndefinedProperties = (object) => {
1530
1540
  for (const prop of [
1531
1541
  ...Object.getOwnPropertyNames(object),
@@ -1566,7 +1576,7 @@ var removeProperties = (root, condition) => {
1566
1576
  return result;
1567
1577
  };
1568
1578
 
1569
- // packages/common/util/src/safe-await.ts
1579
+ // src/safe-await.ts
1570
1580
  var safeAwaitAll = async (source, taskFactory, onError) => {
1571
1581
  const failedItems = [];
1572
1582
  await Promise.all([
@@ -1584,7 +1594,7 @@ var safeAwaitAll = async (source, taskFactory, onError) => {
1584
1594
  return failedItems;
1585
1595
  };
1586
1596
 
1587
- // packages/common/util/src/safe-instanceof.ts
1597
+ // src/safe-instanceof.ts
1588
1598
  var instanceTag = Symbol("instanceTag");
1589
1599
  var safeInstanceof = (tag) => (target) => {
1590
1600
  target.prototype[instanceTag] = tag;
@@ -1596,38 +1606,124 @@ var safeInstanceof = (tag) => (target) => {
1596
1606
  });
1597
1607
  };
1598
1608
 
1599
- // packages/common/util/src/safe-parse.ts
1600
- var safeParseInt = (value, defaultValue) => {
1609
+ // src/safe-parse.ts
1610
+ function safeParseInt(str, defaultValue) {
1601
1611
  try {
1602
- const n = parseInt(value ?? "");
1603
- return isNaN(n) ? defaultValue : n;
1604
- } catch (err) {
1612
+ const value = parseInt(str ?? "");
1613
+ return isNaN(value) ? defaultValue : value;
1614
+ } catch {
1605
1615
  return defaultValue;
1606
1616
  }
1607
- };
1608
- var safeParseFloat = (str, defaultValue) => {
1617
+ }
1618
+ function safeParseFloat(str, defaultValue) {
1609
1619
  try {
1610
- return parseFloat(str);
1620
+ const value = parseFloat(str ?? "");
1621
+ return isNaN(value) ? defaultValue : value;
1611
1622
  } catch {
1612
- return defaultValue ?? 0;
1623
+ return defaultValue;
1613
1624
  }
1614
- };
1615
- var safeParseJson = (data, defaultValue) => {
1616
- if (data && data.length > 0) {
1625
+ }
1626
+ var safeParseJson = (str, defaultValue) => {
1627
+ if (str && str.length > 0) {
1617
1628
  try {
1618
- return JSON.parse(data);
1619
- } catch (err) {
1629
+ return JSON.parse(str);
1630
+ } catch {
1620
1631
  }
1621
1632
  }
1622
1633
  return defaultValue;
1623
1634
  };
1624
1635
 
1625
- // packages/common/util/src/sliding-window-summary.ts
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
+ }
1676
+ }
1677
+ return JSON.stringify(obj, replacer, indent);
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
1626
1720
  import { invariant as invariant5 } from "@dxos/invariant";
1627
- var __dxlog_file5 = "/home/runner/work/dxos/dxos/packages/common/util/src/sliding-window-summary.ts";
1721
+ var __dxlog_file5 = "/__w/dxos/dxos/packages/common/util/src/sliding-window-summary.ts";
1628
1722
  var SlidingWindowSummary = class {
1723
+ _buffer;
1724
+ _sum = 0;
1725
+ _precision;
1629
1726
  constructor(options) {
1630
- this._sum = 0;
1631
1727
  this._buffer = new CircularBuffer(options.dataPoints);
1632
1728
  if (options.precision != null) {
1633
1729
  invariant5(options.precision >= 0, void 0, {
@@ -1678,7 +1774,7 @@ var SlidingWindowSummary = class {
1678
1774
  }
1679
1775
  };
1680
1776
 
1681
- // packages/common/util/src/sort.ts
1777
+ // src/sort.ts
1682
1778
  var compareScalar = (inc = true) => (a, b) => (inc ? 1 : -1) * (a < b ? -1 : a > b ? 1 : 0);
1683
1779
  var compareString = (inc = true, caseInsensitive = true) => (a, b) => {
1684
1780
  if (caseInsensitive) {
@@ -1700,25 +1796,43 @@ var compareMulti = (sorters) => (a, b) => {
1700
1796
  return sort();
1701
1797
  };
1702
1798
 
1703
- // packages/common/util/src/string.ts
1799
+ // src/string.ts
1704
1800
  var capitalize = (str) => {
1705
1801
  if (str.length === 0) {
1706
1802
  return "";
1707
1803
  }
1708
1804
  return str.charAt(0).toUpperCase() + str.slice(1);
1709
1805
  };
1806
+ function trim(strings, ...values) {
1807
+ const raw = strings.reduce((out, str, i) => {
1808
+ out += str;
1809
+ if (i < values.length) {
1810
+ const match = str.match(/(^|\n)([ \t]*)$/);
1811
+ const baseIndent = match ? match[2] : "";
1812
+ const val = String(values[i]).replace(/\r?\n/g, "\n" + baseIndent);
1813
+ out += val;
1814
+ }
1815
+ return out;
1816
+ }, "");
1817
+ const lines = raw.split("\n");
1818
+ while (lines.length && !lines[0].trim()) lines.shift();
1819
+ while (lines.length && !lines[lines.length - 1].trim()) lines.pop();
1820
+ const minIndent = Math.min(...lines.filter((l) => l.trim()).map((l) => l.match(/^[ \t]*/)?.[0].length ?? 0));
1821
+ return lines.map((l) => l.slice(minIndent)).join("\n");
1822
+ }
1823
+ var kebabize = (str) => str.replace(/[A-Z]+(?![a-z])|[A-Z]/g, ($, ofs) => (ofs ? "-" : "") + $.toLowerCase());
1710
1824
 
1711
- // packages/common/util/src/sum.ts
1825
+ // src/sum.ts
1712
1826
  var sum = (values) => values.reduce((a, b) => a + b, 0);
1713
1827
 
1714
- // packages/common/util/src/throw-unhandled-error.ts
1828
+ // src/throw-unhandled-error.ts
1715
1829
  var throwUnhandledError = (error) => {
1716
1830
  queueMicrotask(() => {
1717
1831
  throw error;
1718
1832
  });
1719
1833
  };
1720
1834
 
1721
- // packages/common/util/src/to-fallback.ts
1835
+ // src/to-fallback.ts
1722
1836
  var idEmoji = [
1723
1837
  // When changing this set, please check the result in a console or e.g. RunKit (https://runkit.com/thure/642214441dd6ae000855a8de)
1724
1838
  // 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.
@@ -1903,12 +2017,10 @@ var toFallback = (hash) => {
1903
2017
  };
1904
2018
  };
1905
2019
 
1906
- // packages/common/util/src/tracer.ts
2020
+ // src/tracer.ts
1907
2021
  var Tracer = class {
1908
- constructor() {
1909
- this._events = /* @__PURE__ */ new Map();
1910
- this._recording = false;
1911
- }
2022
+ _events = /* @__PURE__ */ new Map();
2023
+ _recording = false;
1912
2024
  // TODO(burdon): Start/stop methods for recording data? By id?
1913
2025
  // Alternatively, enable subscriptions to track/compute series.
1914
2026
  // TODO(burdon): Hierarchical traces?
@@ -1968,7 +2080,7 @@ var Tracer = class {
1968
2080
  };
1969
2081
  var tracer = new Tracer();
1970
2082
 
1971
- // packages/common/util/src/tree.ts
2083
+ // src/tree.ts
1972
2084
  import { truncateKey } from "@dxos/debug";
1973
2085
  var stringifyTree = (node, ancestors = [], rows = []) => {
1974
2086
  if (node.children?.length) {
@@ -2008,8 +2120,8 @@ var stringifyTree = (node, ancestors = [], rows = []) => {
2008
2120
  return rows;
2009
2121
  };
2010
2122
 
2011
- // packages/common/util/src/types.ts
2012
- var isNotFalsy = (value) => !!value;
2123
+ // src/types.ts
2124
+ var isTruthy = (value) => !!value;
2013
2125
  var isNonNullable = (value) => value != null;
2014
2126
  var doAsync = async (fn) => fn();
2015
2127
  var getProviderValue = (provider, arg) => {
@@ -2039,14 +2151,130 @@ var arrayMove = (array, from, to) => {
2039
2151
  array.splice(to < 0 ? array.length + to : to, 0, array.splice(from, 1)[0]);
2040
2152
  return array;
2041
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
+ }
2042
2160
 
2043
- // packages/common/util/src/weak.ts
2161
+ // src/unit.ts
2162
+ var createFormat = (unit) => {
2163
+ return (n, precision = unit.precision ?? 0) => {
2164
+ const value = n / unit.quotient;
2165
+ return {
2166
+ unit,
2167
+ value,
2168
+ formattedValue: value.toFixed(precision),
2169
+ toString: () => `${value.toFixed(precision)}${unit.symbol}`
2170
+ };
2171
+ };
2172
+ };
2173
+ var MS_SECONDS = 1e3;
2174
+ var MS_MINUTES = 60 * MS_SECONDS;
2175
+ var MS_HOURS = 60 * MS_MINUTES;
2176
+ var Unit = {
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({
2210
+ symbol: "h",
2211
+ quotient: MS_HOURS
2212
+ }),
2213
+ Minute: createFormat({
2214
+ symbol: "m",
2215
+ quotient: MS_MINUTES
2216
+ }),
2217
+ Second: createFormat({
2218
+ symbol: "s",
2219
+ quotient: MS_SECONDS,
2220
+ precision: 1
2221
+ }),
2222
+ Millisecond: createFormat({
2223
+ symbol: "ms",
2224
+ quotient: 1
2225
+ }),
2226
+ Duration: (n) => {
2227
+ const hours = Math.floor(n / MS_HOURS);
2228
+ const minutes = Math.floor(n % MS_HOURS / MS_MINUTES);
2229
+ if (hours) {
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
+ };
2240
+ }
2241
+ if (minutes) {
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
+ };
2253
+ }
2254
+ const seconds = n >= MS_SECONDS;
2255
+ if (seconds) {
2256
+ return Unit.Second(n);
2257
+ }
2258
+ return Unit.Millisecond(n);
2259
+ }
2260
+ };
2261
+
2262
+ // src/url.ts
2263
+ var createUrl = (url, search) => {
2264
+ const base = typeof url === "string" ? new URL(url) : url;
2265
+ if (search) {
2266
+ base.search = new URLSearchParams(Object.entries(search).filter(([_, value]) => value != null)).toString();
2267
+ }
2268
+ return base;
2269
+ };
2270
+
2271
+ // src/weak.ts
2044
2272
  var WeakDictionary = class {
2273
+ _internal = /* @__PURE__ */ new Map();
2274
+ _finalization = new FinalizationRegistry((cleanUpCallback) => {
2275
+ cleanUpCallback();
2276
+ });
2045
2277
  constructor(entries2) {
2046
- this._internal = /* @__PURE__ */ new Map();
2047
- this._finalization = new FinalizationRegistry((cleanUpCallback) => {
2048
- cleanUpCallback();
2049
- });
2050
2278
  this._internal = new Map(entries2?.map(([key, value]) => [
2051
2279
  key,
2052
2280
  new WeakRef(value)
@@ -2135,9 +2363,57 @@ var WeakDictionary = class {
2135
2363
  }
2136
2364
  };
2137
2365
 
2138
- // packages/common/util/src/assume.ts
2139
- function assumeType(value) {
2140
- }
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;
2415
+ }
2416
+ };
2141
2417
  export {
2142
2418
  BitField,
2143
2419
  Callback,
@@ -2147,11 +2423,14 @@ export {
2147
2423
  ComplexSet,
2148
2424
  HumanHasher,
2149
2425
  MapEntry,
2426
+ SKIP,
2150
2427
  SlidingWindowSummary,
2151
2428
  Tracer,
2429
+ Unit,
2152
2430
  WeakDictionary,
2153
2431
  accessBy,
2154
2432
  arrayMove,
2433
+ arraySwap,
2155
2434
  arrayToBuffer,
2156
2435
  arrayToHex,
2157
2436
  arrayToString,
@@ -2163,17 +2442,22 @@ export {
2163
2442
  chunkArray,
2164
2443
  clamp,
2165
2444
  clearUndefined,
2445
+ coerceArray,
2166
2446
  compareMulti,
2167
2447
  compareObject,
2168
2448
  compareScalar,
2169
2449
  compareString,
2170
2450
  createBinder,
2171
2451
  createBucketReducer,
2452
+ createFilename,
2172
2453
  createGroupReducer,
2454
+ createReplacer,
2173
2455
  createSetDispatch,
2456
+ createUrl,
2174
2457
  decamelize,
2175
2458
  deepMapValues,
2176
2459
  deepMapValuesAsync,
2460
+ defaultFilter,
2177
2461
  defaultMap,
2178
2462
  defer,
2179
2463
  deferAsync,
@@ -2185,12 +2469,12 @@ export {
2185
2469
  entry,
2186
2470
  exponentialBackoffInterval,
2187
2471
  forEachAsync,
2472
+ formatErrorWithCauses,
2188
2473
  get,
2189
2474
  getAsyncProviderValue,
2190
2475
  getDate,
2191
2476
  getDebugName,
2192
2477
  getDeep,
2193
- getFirstTwoRenderableChars,
2194
2478
  getHostPlatform,
2195
2479
  getPrototypeSpecificInstanceId,
2196
2480
  getProviderValue,
@@ -2206,14 +2490,19 @@ export {
2206
2490
  intersectBy,
2207
2491
  intersection,
2208
2492
  iosCheck,
2493
+ isBun,
2494
+ isMobile,
2495
+ isMobileOrTablet,
2209
2496
  isNode,
2210
2497
  isNonNullable,
2211
- isNotFalsy,
2498
+ isTauri,
2499
+ isTruthy,
2212
2500
  joinTables,
2213
2501
  jsonKeyReplacer,
2214
2502
  jsonReplacer,
2215
2503
  jsonify,
2216
2504
  jsonlogify,
2505
+ kebabize,
2217
2506
  keyToEmoji,
2218
2507
  keyToFallback,
2219
2508
  keyToHue,
@@ -2222,7 +2511,6 @@ export {
2222
2511
  makeSet,
2223
2512
  mapValues,
2224
2513
  median,
2225
- mobileAndTabletCheck,
2226
2514
  numericalValues,
2227
2515
  omit,
2228
2516
  orderKeys,
@@ -2238,12 +2526,14 @@ export {
2238
2526
  removeBy,
2239
2527
  removeProperties,
2240
2528
  removeUndefinedProperties,
2529
+ retry,
2241
2530
  safariCheck,
2242
2531
  safeAwaitAll,
2243
2532
  safeInstanceof,
2244
2533
  safeParseFloat,
2245
2534
  safeParseInt,
2246
2535
  safeParseJson,
2536
+ safeStringify,
2247
2537
  set,
2248
2538
  setDeep,
2249
2539
  sortKeys,
@@ -2256,6 +2546,7 @@ export {
2256
2546
  toFallback,
2257
2547
  toHue,
2258
2548
  tracer,
2549
+ trim,
2259
2550
  visitValues
2260
2551
  };
2261
2552
  //# sourceMappingURL=index.mjs.map