@dxos/util 0.8.4-main.72ec0f3 → 0.8.4-main.8342792842

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 (46) hide show
  1. package/dist/lib/browser/index.mjs +147 -34
  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 +147 -34
  5. package/dist/lib/node-esm/index.mjs.map +4 -4
  6. package/dist/lib/node-esm/meta.json +1 -1
  7. package/dist/types/src/array.d.ts +3 -2
  8. package/dist/types/src/array.d.ts.map +1 -1
  9. package/dist/types/src/deep.d.ts.map +1 -1
  10. package/dist/types/src/defer.d.ts +1 -1
  11. package/dist/types/src/defer.d.ts.map +1 -1
  12. package/dist/types/src/error-format.d.ts +5 -0
  13. package/dist/types/src/error-format.d.ts.map +1 -0
  14. package/dist/types/src/filename.d.ts +9 -0
  15. package/dist/types/src/filename.d.ts.map +1 -0
  16. package/dist/types/src/index.d.ts +3 -0
  17. package/dist/types/src/index.d.ts.map +1 -1
  18. package/dist/types/src/platform.d.ts +4 -1
  19. package/dist/types/src/platform.d.ts.map +1 -1
  20. package/dist/types/src/retry.d.ts +32 -0
  21. package/dist/types/src/retry.d.ts.map +1 -0
  22. package/dist/types/src/safe-parse.d.ts +6 -4
  23. package/dist/types/src/safe-parse.d.ts.map +1 -1
  24. package/dist/types/src/safe-stringify.d.ts +9 -0
  25. package/dist/types/src/safe-stringify.d.ts.map +1 -1
  26. package/dist/types/src/types.d.ts +22 -4
  27. package/dist/types/src/types.d.ts.map +1 -1
  28. package/dist/types/src/unit.d.ts.map +1 -1
  29. package/dist/types/tsconfig.tsbuildinfo +1 -1
  30. package/package.json +11 -6
  31. package/src/array.ts +9 -2
  32. package/src/deep.ts +2 -0
  33. package/src/defer.ts +1 -1
  34. package/src/error-format.ts +22 -0
  35. package/src/filename.ts +16 -0
  36. package/src/index.ts +3 -0
  37. package/src/platform.ts +12 -2
  38. package/src/retry.ts +74 -0
  39. package/src/safe-parse.ts +19 -16
  40. package/src/safe-stringify.ts +65 -23
  41. package/src/types.test.ts +11 -1
  42. package/src/types.ts +37 -9
  43. package/src/unit.ts +1 -0
  44. package/dist/types/src/explicit-resource-management-polyfill.d.ts +0 -1
  45. package/dist/types/src/explicit-resource-management-polyfill.d.ts.map +0 -1
  46. 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) {
@@ -597,6 +605,7 @@ var getDeep = (obj, path) => {
597
605
  var deferFunction = (fnProvider) => (...args) => fnProvider()(...args);
598
606
 
599
607
  // src/defer.ts
608
+ import "@hazae41/symbol-dispose-polyfill";
600
609
  var defer = (fn) => new DeferGuard(fn);
601
610
  var DeferGuard = class {
602
611
  _fn;
@@ -657,6 +666,12 @@ var MapEntry = class {
657
666
  }
658
667
  };
659
668
 
669
+ // src/filename.ts
670
+ var createFilename = ({ parts = [], ext, date = /* @__PURE__ */ new Date() }) => [
671
+ date.toISOString().replace(/[:.]/g, "-"),
672
+ ...parts
673
+ ].join("_") + (ext ? `.${ext}` : "");
674
+
660
675
  // src/for-each-async.ts
661
676
  var forEachAsync = (items, fn) => Promise.all(items.map(fn));
662
677
 
@@ -1352,7 +1367,18 @@ var omit = (obj, keys2) => {
1352
1367
 
1353
1368
  // src/platform.ts
1354
1369
  var isNode = () => typeof process !== "undefined" && process.versions != null && process.versions.node != null;
1355
- 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 = () => {
1356
1382
  let check = false;
1357
1383
  ((a) => {
1358
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))) {
@@ -1374,7 +1400,7 @@ var iosCheck = () => {
1374
1400
  };
1375
1401
  var safariCheck = () => typeof navigator !== "undefined" && /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
1376
1402
  var getHostPlatform = () => {
1377
- if (!("navigator" in window)) {
1403
+ if (!("navigator" in globalThis)) {
1378
1404
  return "unknown";
1379
1405
  }
1380
1406
  const platform = (navigator.userAgentData?.platform || navigator.platform)?.toLowerCase();
@@ -1581,25 +1607,26 @@ var safeInstanceof = (tag) => (target) => {
1581
1607
  };
1582
1608
 
1583
1609
  // src/safe-parse.ts
1584
- var safeParseInt = (value, defaultValue) => {
1610
+ function safeParseInt(str, defaultValue) {
1585
1611
  try {
1586
- const n = parseInt(value ?? "");
1587
- return isNaN(n) ? defaultValue : n;
1612
+ const value = parseInt(str ?? "");
1613
+ return isNaN(value) ? defaultValue : value;
1588
1614
  } catch {
1589
1615
  return defaultValue;
1590
1616
  }
1591
- };
1592
- var safeParseFloat = (str, defaultValue) => {
1617
+ }
1618
+ function safeParseFloat(str, defaultValue) {
1593
1619
  try {
1594
- return parseFloat(str);
1620
+ const value = parseFloat(str ?? "");
1621
+ return isNaN(value) ? defaultValue : value;
1595
1622
  } catch {
1596
- return defaultValue ?? 0;
1623
+ return defaultValue;
1597
1624
  }
1598
- };
1599
- var safeParseJson = (data, defaultValue) => {
1600
- if (data && data.length > 0) {
1625
+ }
1626
+ var safeParseJson = (str, defaultValue) => {
1627
+ if (str && str.length > 0) {
1601
1628
  try {
1602
- return JSON.parse(data);
1629
+ return JSON.parse(str);
1603
1630
  } catch {
1604
1631
  }
1605
1632
  }
@@ -1609,29 +1636,45 @@ var safeParseJson = (data, defaultValue) => {
1609
1636
  // src/safe-stringify.ts
1610
1637
  var SKIP = Object.freeze({});
1611
1638
  function safeStringify(obj, filter = defaultFilter, indent = 2) {
1612
- const seen = /* @__PURE__ */ new WeakSet();
1639
+ const seen = /* @__PURE__ */ new WeakMap();
1613
1640
  function replacer(key, value) {
1614
- if (typeof value === "object" && value !== null) {
1615
- if (seen.has(value)) {
1616
- return "[Circular]";
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;
1617
1649
  }
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;
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);
1624
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}`;
1625
1675
  }
1626
- return value;
1627
- }
1628
- let result = "";
1629
- try {
1630
- result = JSON.stringify(obj, replacer, indent);
1631
- } catch (error) {
1632
- result = `Error: ${error.message}`;
1633
1676
  }
1634
- return result;
1677
+ return JSON.stringify(obj, replacer, indent);
1635
1678
  }
1636
1679
  var createReplacer = ({ omit: omit2, parse, maxDepth, maxArrayLen, maxStringLen } = {}) => {
1637
1680
  let currentDepth = 0;
@@ -1644,7 +1687,7 @@ var createReplacer = ({ omit: omit2, parse, maxDepth, maxArrayLen, maxStringLen
1644
1687
  currentDepth = parentDepth + 1;
1645
1688
  }
1646
1689
  if (typeof value === "function") {
1647
- return void 0;
1690
+ return SKIP;
1648
1691
  }
1649
1692
  if (value && typeof value === "object") {
1650
1693
  depthMap.set(value, currentDepth);
@@ -1653,7 +1696,7 @@ var createReplacer = ({ omit: omit2, parse, maxDepth, maxArrayLen, maxStringLen
1653
1696
  }
1654
1697
  }
1655
1698
  if (omit2?.includes(key)) {
1656
- return void 0;
1699
+ return SKIP;
1657
1700
  }
1658
1701
  if (parse?.includes(key) && typeof value === "string") {
1659
1702
  try {
@@ -2108,6 +2151,12 @@ var arrayMove = (array, from, to) => {
2108
2151
  array.splice(to < 0 ? array.length + to : to, 0, array.splice(from, 1)[0]);
2109
2152
  return array;
2110
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
+ }
2111
2160
 
2112
2161
  // src/unit.ts
2113
2162
  var createFormat = (unit) => {
@@ -2152,6 +2201,10 @@ var Unit = {
2152
2201
  quotient: 1e3,
2153
2202
  precision: 2
2154
2203
  }),
2204
+ Byte: createFormat({
2205
+ symbol: "B",
2206
+ quotient: 1
2207
+ }),
2155
2208
  // Time.
2156
2209
  Hour: createFormat({
2157
2210
  symbol: "h",
@@ -2309,6 +2362,58 @@ var WeakDictionary = class {
2309
2362
  this._finalization.unregister(value);
2310
2363
  }
2311
2364
  };
2365
+
2366
+ // src/error-format.ts
2367
+ var formatErrorWithCauses = (error) => {
2368
+ const lines = [];
2369
+ let current = error;
2370
+ let level = 0;
2371
+ while (current) {
2372
+ const prefix = level === 0 ? "" : `Caused by: `;
2373
+ lines.push(prefix + (current.stack ?? String(current)));
2374
+ if (!(current.cause instanceof Error)) break;
2375
+ current = current.cause;
2376
+ level += 1;
2377
+ }
2378
+ return lines.join("\n\n");
2379
+ };
2380
+
2381
+ // src/retry.ts
2382
+ var DEFAULT_RETRY_OPTIONS = {
2383
+ count: 3,
2384
+ delayMs: 100,
2385
+ exponent: 2,
2386
+ retryOnError: async () => true,
2387
+ retryOnValue: async () => false
2388
+ };
2389
+ var retry = async (options, cb) => {
2390
+ const fullOptions = {
2391
+ ...DEFAULT_RETRY_OPTIONS,
2392
+ ...options
2393
+ };
2394
+ let numRetries = 0, currentDelay = fullOptions.delayMs;
2395
+ while (true) {
2396
+ let result;
2397
+ try {
2398
+ result = await cb();
2399
+ } catch (err) {
2400
+ if (numRetries > fullOptions.count || !await fullOptions.retryOnError(err)) {
2401
+ throw err;
2402
+ }
2403
+ await new Promise((resolve) => setTimeout(resolve, currentDelay));
2404
+ currentDelay *= fullOptions.exponent;
2405
+ numRetries++;
2406
+ continue;
2407
+ }
2408
+ if (!await fullOptions.retryOnValue(result)) {
2409
+ return result;
2410
+ }
2411
+ await new Promise((resolve) => setTimeout(resolve, currentDelay));
2412
+ currentDelay *= fullOptions.exponent;
2413
+ numRetries++;
2414
+ continue;
2415
+ }
2416
+ };
2312
2417
  export {
2313
2418
  BitField,
2314
2419
  Callback,
@@ -2325,6 +2430,7 @@ export {
2325
2430
  WeakDictionary,
2326
2431
  accessBy,
2327
2432
  arrayMove,
2433
+ arraySwap,
2328
2434
  arrayToBuffer,
2329
2435
  arrayToHex,
2330
2436
  arrayToString,
@@ -2336,12 +2442,14 @@ export {
2336
2442
  chunkArray,
2337
2443
  clamp,
2338
2444
  clearUndefined,
2445
+ coerceArray,
2339
2446
  compareMulti,
2340
2447
  compareObject,
2341
2448
  compareScalar,
2342
2449
  compareString,
2343
2450
  createBinder,
2344
2451
  createBucketReducer,
2452
+ createFilename,
2345
2453
  createGroupReducer,
2346
2454
  createReplacer,
2347
2455
  createSetDispatch,
@@ -2361,6 +2469,7 @@ export {
2361
2469
  entry,
2362
2470
  exponentialBackoffInterval,
2363
2471
  forEachAsync,
2472
+ formatErrorWithCauses,
2364
2473
  get,
2365
2474
  getAsyncProviderValue,
2366
2475
  getDate,
@@ -2381,8 +2490,12 @@ export {
2381
2490
  intersectBy,
2382
2491
  intersection,
2383
2492
  iosCheck,
2493
+ isBun,
2494
+ isMobile,
2495
+ isMobileOrTablet,
2384
2496
  isNode,
2385
2497
  isNonNullable,
2498
+ isTauri,
2386
2499
  isTruthy,
2387
2500
  joinTables,
2388
2501
  jsonKeyReplacer,
@@ -2398,7 +2511,6 @@ export {
2398
2511
  makeSet,
2399
2512
  mapValues,
2400
2513
  median,
2401
- mobileAndTabletCheck,
2402
2514
  numericalValues,
2403
2515
  omit,
2404
2516
  orderKeys,
@@ -2414,6 +2526,7 @@ export {
2414
2526
  removeBy,
2415
2527
  removeProperties,
2416
2528
  removeUndefinedProperties,
2529
+ retry,
2417
2530
  safariCheck,
2418
2531
  safeAwaitAll,
2419
2532
  safeInstanceof,