@dxos/util 0.8.4-main.7ace549 → 0.8.4-main.8360d9e660

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 (52) hide show
  1. package/dist/lib/browser/index.mjs +155 -58
  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 +155 -58
  5. package/dist/lib/node-esm/index.mjs.map +4 -4
  6. package/dist/lib/node-esm/meta.json +1 -1
  7. package/dist/types/src/array.d.ts +3 -2
  8. package/dist/types/src/array.d.ts.map +1 -1
  9. package/dist/types/src/circular-buffer.d.ts +1 -0
  10. package/dist/types/src/circular-buffer.d.ts.map +1 -1
  11. package/dist/types/src/deep.d.ts +0 -3
  12. package/dist/types/src/deep.d.ts.map +1 -1
  13. package/dist/types/src/defer.d.ts +1 -1
  14. package/dist/types/src/defer.d.ts.map +1 -1
  15. package/dist/types/src/filename.d.ts +9 -0
  16. package/dist/types/src/filename.d.ts.map +1 -0
  17. package/dist/types/src/index.d.ts +2 -0
  18. package/dist/types/src/index.d.ts.map +1 -1
  19. package/dist/types/src/platform.d.ts +4 -1
  20. package/dist/types/src/platform.d.ts.map +1 -1
  21. package/dist/types/src/retry.d.ts +32 -0
  22. package/dist/types/src/retry.d.ts.map +1 -0
  23. package/dist/types/src/safe-parse.d.ts +7 -4
  24. package/dist/types/src/safe-parse.d.ts.map +1 -1
  25. package/dist/types/src/safe-stringify.d.ts +10 -1
  26. package/dist/types/src/safe-stringify.d.ts.map +1 -1
  27. package/dist/types/src/safe-stringify.test.d.ts +2 -0
  28. package/dist/types/src/safe-stringify.test.d.ts.map +1 -0
  29. package/dist/types/src/to-fallback.d.ts +18 -4
  30. package/dist/types/src/to-fallback.d.ts.map +1 -1
  31. package/dist/types/src/types.d.ts +19 -5
  32. package/dist/types/src/types.d.ts.map +1 -1
  33. package/dist/types/tsconfig.tsbuildinfo +1 -1
  34. package/package.json +11 -10
  35. package/src/array.ts +9 -2
  36. package/src/circular-buffer.test.ts +26 -0
  37. package/src/circular-buffer.ts +5 -0
  38. package/src/deep.ts +2 -6
  39. package/src/defer.ts +1 -1
  40. package/src/filename.ts +16 -0
  41. package/src/index.ts +2 -0
  42. package/src/platform.ts +35 -3
  43. package/src/retry.ts +74 -0
  44. package/src/safe-parse.ts +27 -16
  45. package/src/safe-stringify.test.ts +96 -0
  46. package/src/safe-stringify.ts +74 -25
  47. package/src/to-fallback.ts +39 -156
  48. package/src/types.test.ts +11 -1
  49. package/src/types.ts +30 -10
  50. package/dist/types/src/explicit-resource-management-polyfill.d.ts +0 -1
  51. package/dist/types/src/explicit-resource-management-polyfill.d.ts.map +0 -1
  52. package/src/explicit-resource-management-polyfill.ts +0 -13
@@ -97,6 +97,14 @@ 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) {
@@ -327,6 +335,10 @@ var CircularBuffer = class {
327
335
  get elementCount() {
328
336
  return this._elementCount;
329
337
  }
338
+ clear() {
339
+ this._nextIndex = 0;
340
+ this._elementCount = 0;
341
+ }
330
342
  getLast() {
331
343
  if (this._elementCount === 0) {
332
344
  return void 0;
@@ -560,14 +572,12 @@ var makeMap = (keyProjection) => class BoundComplexMap extends ComplexMap {
560
572
  };
561
573
 
562
574
  // src/deep.ts
563
- import get from "lodash.get";
564
- import set from "lodash.set";
565
575
  import { invariant as invariant4 } from "@dxos/invariant";
566
576
  var __dxlog_file4 = "/__w/dxos/dxos/packages/common/util/src/deep.ts";
567
577
  var setDeep = (obj, path, value) => {
568
578
  invariant4(path.length > 0, void 0, {
569
579
  F: __dxlog_file4,
570
- L: 18,
580
+ L: 12,
571
581
  S: void 0,
572
582
  A: [
573
583
  "path.length > 0",
@@ -597,6 +607,7 @@ var getDeep = (obj, path) => {
597
607
  var deferFunction = (fnProvider) => (...args) => fnProvider()(...args);
598
608
 
599
609
  // src/defer.ts
610
+ import "@hazae41/symbol-dispose-polyfill";
600
611
  var defer = (fn) => new DeferGuard(fn);
601
612
  var DeferGuard = class {
602
613
  _fn;
@@ -657,6 +668,12 @@ var MapEntry = class {
657
668
  }
658
669
  };
659
670
 
671
+ // src/filename.ts
672
+ var createFilename = ({ parts = [], ext, date = /* @__PURE__ */ new Date() }) => [
673
+ date.toISOString().replace(/[:.]/g, "-"),
674
+ ...parts
675
+ ].join("_") + (ext ? `.${ext}` : "");
676
+
660
677
  // src/for-each-async.ts
661
678
  var forEachAsync = (items, fn) => Promise.all(items.map(fn));
662
679
 
@@ -1003,7 +1020,7 @@ var defaultMap = (map, key, def) => {
1003
1020
  };
1004
1021
 
1005
1022
  // src/instance-id.ts
1006
- var symbol = Symbol.for("dxos.instance-contexts");
1023
+ var symbol = /* @__PURE__ */ Symbol.for("dxos.instance-contexts");
1007
1024
  var instanceContexts = globalThis[symbol] ??= /* @__PURE__ */ new WeakMap();
1008
1025
  var getPrototypeSpecificInstanceId = (instance) => {
1009
1026
  const prototype = Object.getPrototypeOf(instance);
@@ -1352,7 +1369,18 @@ var omit = (obj, keys2) => {
1352
1369
 
1353
1370
  // src/platform.ts
1354
1371
  var isNode = () => typeof process !== "undefined" && process.versions != null && process.versions.node != null;
1355
- var mobileAndTabletCheck = () => {
1372
+ var isBun = () => globalThis.Bun !== void 0;
1373
+ var isTauri = () => !!globalThis.__TAURI__;
1374
+ var isMobile = () => {
1375
+ let check = false;
1376
+ (function(a) {
1377
+ if (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0, 4))) {
1378
+ check = true;
1379
+ }
1380
+ })(navigator.userAgent || navigator.vendor || window.opera);
1381
+ return check;
1382
+ };
1383
+ var isMobileOrTablet = () => {
1356
1384
  let check = false;
1357
1385
  ((a) => {
1358
1386
  if (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0, 4))) {
@@ -1374,7 +1402,7 @@ var iosCheck = () => {
1374
1402
  };
1375
1403
  var safariCheck = () => typeof navigator !== "undefined" && /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
1376
1404
  var getHostPlatform = () => {
1377
- if (!("navigator" in window)) {
1405
+ if (!("navigator" in globalThis)) {
1378
1406
  return "unknown";
1379
1407
  }
1380
1408
  const platform = (navigator.userAgentData?.platform || navigator.platform)?.toLowerCase();
@@ -1569,7 +1597,7 @@ var safeAwaitAll = async (source, taskFactory, onError) => {
1569
1597
  };
1570
1598
 
1571
1599
  // src/safe-instanceof.ts
1572
- var instanceTag = Symbol("instanceTag");
1600
+ var instanceTag = /* @__PURE__ */ Symbol("instanceTag");
1573
1601
  var safeInstanceof = (tag) => (target) => {
1574
1602
  target.prototype[instanceTag] = tag;
1575
1603
  Object.defineProperty(target.prototype, Symbol.hasInstance, {
@@ -1581,57 +1609,88 @@ var safeInstanceof = (tag) => (target) => {
1581
1609
  };
1582
1610
 
1583
1611
  // src/safe-parse.ts
1584
- var safeParseInt = (value, defaultValue) => {
1612
+ function safeParseInt(str, defaultValue) {
1585
1613
  try {
1586
- const n = parseInt(value ?? "");
1587
- return isNaN(n) ? defaultValue : n;
1614
+ const value = parseInt(str ?? "");
1615
+ return isNaN(value) ? defaultValue : value;
1588
1616
  } catch {
1589
1617
  return defaultValue;
1590
1618
  }
1591
- };
1592
- var safeParseFloat = (str, defaultValue) => {
1619
+ }
1620
+ function safeParseFloat(str, defaultValue) {
1593
1621
  try {
1594
- return parseFloat(str);
1622
+ const value = parseFloat(str ?? "");
1623
+ return isNaN(value) ? defaultValue : value;
1595
1624
  } catch {
1596
- return defaultValue ?? 0;
1625
+ return defaultValue;
1597
1626
  }
1598
- };
1599
- var safeParseJson = (data, defaultValue) => {
1600
- if (data && data.length > 0) {
1627
+ }
1628
+ var safeParseJson = (str, defaultValue) => {
1629
+ if (str && str.length > 0) {
1601
1630
  try {
1602
- return JSON.parse(data);
1631
+ return JSON.parse(str);
1603
1632
  } catch {
1604
1633
  }
1605
1634
  }
1606
1635
  return defaultValue;
1607
1636
  };
1637
+ var safeUrl = (str) => {
1638
+ try {
1639
+ return new URL(str ?? "");
1640
+ } catch {
1641
+ return void 0;
1642
+ }
1643
+ };
1608
1644
 
1609
1645
  // src/safe-stringify.ts
1610
1646
  var SKIP = Object.freeze({});
1611
1647
  function safeStringify(obj, filter = defaultFilter, indent = 2) {
1612
- const seen = /* @__PURE__ */ new WeakSet();
1648
+ const seen = /* @__PURE__ */ new WeakMap();
1613
1649
  function replacer(key, value) {
1614
- if (typeof value === "object" && value !== null) {
1615
- if (seen.has(value)) {
1616
- return "[Circular]";
1650
+ try {
1651
+ let path = key;
1652
+ if (!key) {
1653
+ path = "$";
1654
+ if (value != null && typeof value === "object") {
1655
+ seen.set(value, path);
1656
+ }
1657
+ return value;
1658
+ } else if (this) {
1659
+ const parentPath = seen.get(this);
1660
+ path = parentPath ? `${parentPath}.${key}` : key;
1617
1661
  }
1618
- seen.add(value);
1619
- }
1620
- if (filter) {
1621
- const v2 = filter?.(key, value);
1622
- if (v2 !== void 0) {
1623
- return v2 === SKIP ? void 0 : v2;
1662
+ if (value == null) {
1663
+ return value;
1664
+ }
1665
+ if (typeof value === "function") {
1666
+ return void 0;
1624
1667
  }
1668
+ if (typeof value === "object" && Object.getPrototypeOf(value) !== Object.prototype && !Array.isArray(value)) {
1669
+ return void 0;
1670
+ }
1671
+ if (typeof value === "object" && value !== null) {
1672
+ const exists = seen.get(value);
1673
+ if (exists) {
1674
+ return `[${path} => ${exists}]`;
1675
+ }
1676
+ seen.set(value, path);
1677
+ }
1678
+ if (filter) {
1679
+ const filteredValue = filter?.(key, value);
1680
+ if (filteredValue !== void 0) {
1681
+ return filteredValue === SKIP ? void 0 : filteredValue;
1682
+ }
1683
+ }
1684
+ return value;
1685
+ } catch (error) {
1686
+ return `ERROR: ${error.message}`;
1625
1687
  }
1626
- return value;
1627
1688
  }
1628
- let result = "";
1629
1689
  try {
1630
- result = JSON.stringify(obj, replacer, indent);
1690
+ return JSON.stringify(obj, replacer, indent);
1631
1691
  } catch (error) {
1632
- result = `Error: ${error.message}`;
1692
+ return `ERROR: ${error.message}`;
1633
1693
  }
1634
- return result;
1635
1694
  }
1636
1695
  var createReplacer = ({ omit: omit2, parse, maxDepth, maxArrayLen, maxStringLen } = {}) => {
1637
1696
  let currentDepth = 0;
@@ -1644,7 +1703,10 @@ var createReplacer = ({ omit: omit2, parse, maxDepth, maxArrayLen, maxStringLen
1644
1703
  currentDepth = parentDepth + 1;
1645
1704
  }
1646
1705
  if (typeof value === "function") {
1647
- return void 0;
1706
+ return SKIP;
1707
+ }
1708
+ if (maxArrayLen != null && Array.isArray(value) && value.length > maxArrayLen) {
1709
+ return `[length: ${value.length}]`;
1648
1710
  }
1649
1711
  if (value && typeof value === "object") {
1650
1712
  depthMap.set(value, currentDepth);
@@ -1653,7 +1715,7 @@ var createReplacer = ({ omit: omit2, parse, maxDepth, maxArrayLen, maxStringLen
1653
1715
  }
1654
1716
  }
1655
1717
  if (omit2?.includes(key)) {
1656
- return void 0;
1718
+ return SKIP;
1657
1719
  }
1658
1720
  if (parse?.includes(key) && typeof value === "string") {
1659
1721
  try {
@@ -1662,9 +1724,6 @@ var createReplacer = ({ omit: omit2, parse, maxDepth, maxArrayLen, maxStringLen
1662
1724
  return value;
1663
1725
  }
1664
1726
  }
1665
- if (maxArrayLen != null && Array.isArray(value) && value.length > maxArrayLen) {
1666
- return `[length: ${value.length}]`;
1667
- }
1668
1727
  if (maxStringLen != null && typeof value === "string" && value.length > maxStringLen) {
1669
1728
  return value.slice(0, maxStringLen) + "...";
1670
1729
  }
@@ -1791,18 +1850,6 @@ var throwUnhandledError = (error) => {
1791
1850
 
1792
1851
  // src/to-fallback.ts
1793
1852
  var idEmoji = [
1794
- // When changing this set, please check the result in a console or e.g. RunKit (https://runkit.com/thure/642214441dd6ae000855a8de)
1795
- // 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.
1796
- // This set was chosen from the characters in Unicode Emoji v15.0 based on the following criteria:
1797
- // – not people or isolated anthropomorphic faces
1798
- // – not flags
1799
- // – more concrete than abstract
1800
- // – less culturally specific
1801
- // – less easily confused with another emoji in the set
1802
- // – requires less special knowledge to identify
1803
- // – less likely to evoke negative feelings (no meat, no drugs, no weapons, etc)
1804
- // – less common as a signifier in UX
1805
- // NOTE that this is intentionally an array of strings because of the way emoji graphemes work.
1806
1853
  "\u{1F47B}",
1807
1854
  "\u{1F479}",
1808
1855
  "\u{1F47D}",
@@ -1938,17 +1985,18 @@ var idEmoji = [
1938
1985
  ];
1939
1986
  var idHue = [
1940
1987
  "red",
1941
- // 'orange' as const, /* More shades in these palettes are considered “ugly” */
1988
+ "orange",
1942
1989
  "amber",
1943
- // 'yellow' as const, /* More shades in these palettes are considered “ugly” */
1990
+ "yellow",
1944
1991
  "lime",
1945
1992
  "green",
1946
1993
  "emerald",
1947
1994
  "teal",
1948
1995
  "cyan",
1949
- // 'sky' as const, /* Omitted since it is quite similar to the primary accent palette */
1950
- // 'blue' as const, /* Omitted since it is quite similar to the primary accent palette */
1951
- // 'indigo' as const, /* Omitted since it is quite similar to the primary accent palette */
1996
+ // Omit colors similar to primary accent.
1997
+ // 'sky' as const,
1998
+ // 'blue' as const,
1999
+ // 'indigo' as const,
1952
2000
  "violet",
1953
2001
  "purple",
1954
2002
  "fuchsia",
@@ -2108,6 +2156,12 @@ var arrayMove = (array, from, to) => {
2108
2156
  array.splice(to < 0 ? array.length + to : to, 0, array.splice(from, 1)[0]);
2109
2157
  return array;
2110
2158
  };
2159
+ function arraySwap(array, from, to) {
2160
+ const current = array[from];
2161
+ array[from] = array[to];
2162
+ array[to] = current;
2163
+ return array;
2164
+ }
2111
2165
 
2112
2166
  // src/unit.ts
2113
2167
  var createFormat = (unit) => {
@@ -2328,6 +2382,43 @@ var formatErrorWithCauses = (error) => {
2328
2382
  }
2329
2383
  return lines.join("\n\n");
2330
2384
  };
2385
+
2386
+ // src/retry.ts
2387
+ var DEFAULT_RETRY_OPTIONS = {
2388
+ count: 3,
2389
+ delayMs: 100,
2390
+ exponent: 2,
2391
+ retryOnError: async () => true,
2392
+ retryOnValue: async () => false
2393
+ };
2394
+ var retry = async (options, cb) => {
2395
+ const fullOptions = {
2396
+ ...DEFAULT_RETRY_OPTIONS,
2397
+ ...options
2398
+ };
2399
+ let numRetries = 0, currentDelay = fullOptions.delayMs;
2400
+ while (true) {
2401
+ let result;
2402
+ try {
2403
+ result = await cb();
2404
+ } catch (err) {
2405
+ if (numRetries > fullOptions.count || !await fullOptions.retryOnError(err)) {
2406
+ throw err;
2407
+ }
2408
+ await new Promise((resolve) => setTimeout(resolve, currentDelay));
2409
+ currentDelay *= fullOptions.exponent;
2410
+ numRetries++;
2411
+ continue;
2412
+ }
2413
+ if (!await fullOptions.retryOnValue(result)) {
2414
+ return result;
2415
+ }
2416
+ await new Promise((resolve) => setTimeout(resolve, currentDelay));
2417
+ currentDelay *= fullOptions.exponent;
2418
+ numRetries++;
2419
+ continue;
2420
+ }
2421
+ };
2331
2422
  export {
2332
2423
  BitField,
2333
2424
  Callback,
@@ -2344,6 +2435,7 @@ export {
2344
2435
  WeakDictionary,
2345
2436
  accessBy,
2346
2437
  arrayMove,
2438
+ arraySwap,
2347
2439
  arrayToBuffer,
2348
2440
  arrayToHex,
2349
2441
  arrayToString,
@@ -2355,12 +2447,14 @@ export {
2355
2447
  chunkArray,
2356
2448
  clamp,
2357
2449
  clearUndefined,
2450
+ coerceArray,
2358
2451
  compareMulti,
2359
2452
  compareObject,
2360
2453
  compareScalar,
2361
2454
  compareString,
2362
2455
  createBinder,
2363
2456
  createBucketReducer,
2457
+ createFilename,
2364
2458
  createGroupReducer,
2365
2459
  createReplacer,
2366
2460
  createSetDispatch,
@@ -2381,7 +2475,6 @@ export {
2381
2475
  exponentialBackoffInterval,
2382
2476
  forEachAsync,
2383
2477
  formatErrorWithCauses,
2384
- get,
2385
2478
  getAsyncProviderValue,
2386
2479
  getDate,
2387
2480
  getDebugName,
@@ -2401,8 +2494,12 @@ export {
2401
2494
  intersectBy,
2402
2495
  intersection,
2403
2496
  iosCheck,
2497
+ isBun,
2498
+ isMobile,
2499
+ isMobileOrTablet,
2404
2500
  isNode,
2405
2501
  isNonNullable,
2502
+ isTauri,
2406
2503
  isTruthy,
2407
2504
  joinTables,
2408
2505
  jsonKeyReplacer,
@@ -2418,7 +2515,6 @@ export {
2418
2515
  makeSet,
2419
2516
  mapValues,
2420
2517
  median,
2421
- mobileAndTabletCheck,
2422
2518
  numericalValues,
2423
2519
  omit,
2424
2520
  orderKeys,
@@ -2434,6 +2530,7 @@ export {
2434
2530
  removeBy,
2435
2531
  removeProperties,
2436
2532
  removeUndefinedProperties,
2533
+ retry,
2437
2534
  safariCheck,
2438
2535
  safeAwaitAll,
2439
2536
  safeInstanceof,
@@ -2441,7 +2538,7 @@ export {
2441
2538
  safeParseInt,
2442
2539
  safeParseJson,
2443
2540
  safeStringify,
2444
- set,
2541
+ safeUrl,
2445
2542
  setDeep,
2446
2543
  sortKeys,
2447
2544
  stringToArray,