@andrew_l/toolkit 0.2.21 → 0.3.0

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.
package/dist/index.cjs CHANGED
@@ -792,12 +792,42 @@ function uniqBy(array, comparator) {
792
792
  });
793
793
  }
794
794
 
795
- let AssertionError;
796
- (async () => {
797
- AssertionError = globalThis.window ? await Promise.resolve().then(function () { return BrowserAssertionError$1; }).then(
798
- (r) => r.BrowserAssertionError
799
- ) : await import('node:assert').then((r) => r.AssertionError);
800
- })();
795
+ class BrowserAssertionError extends Error {
796
+ /**
797
+ * Set to the `actual` argument for methods such as {@link assert.strictEqual()}.
798
+ */
799
+ actual;
800
+ /**
801
+ * Set to the `expected` argument for methods such as {@link assert.strictEqual()}.
802
+ */
803
+ expected;
804
+ /**
805
+ * Set to the passed in operator value.
806
+ */
807
+ operator;
808
+ /**
809
+ * Indicates if the message was auto-generated (`true`) or not.
810
+ */
811
+ generatedMessage;
812
+ /**
813
+ * Value is always `ERR_ASSERTION` to show that the error is an assertion error.
814
+ */
815
+ code;
816
+ constructor(options) {
817
+ super(options?.message);
818
+ this.actual = options?.actual;
819
+ this.expected = options?.expected;
820
+ this.operator = options?.operator ?? "none";
821
+ this.generatedMessage = false;
822
+ this.code = "ERR_ASSERTION";
823
+ }
824
+ }
825
+
826
+ let AssertionError = BrowserAssertionError;
827
+ if (!globalThis.window) {
828
+ import('node:assert').then((r) => AssertionError = r.AssertionError).catch(() => {
829
+ });
830
+ }
801
831
 
802
832
  function ok(value, message) {
803
833
  if (!value) {
@@ -1037,13 +1067,360 @@ function basex(alphabet) {
1037
1067
  }
1038
1068
  }
1039
1069
 
1040
- const base62 = basex(
1041
- "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
1042
- );
1070
+ const base62 = basex(
1071
+ "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
1072
+ );
1073
+
1074
+ function capitalize(str) {
1075
+ return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase();
1076
+ }
1077
+
1078
+ const CASE_SPLIT_PATTERN = /\p{Lu}?\p{Ll}+|[0-9]+|\p{Lu}+(?!\p{Ll})|\p{Emoji_Presentation}|\p{Extended_Pictographic}|\p{L}+/gu;
1079
+ function getWords(str) {
1080
+ if (!isString(str)) return [];
1081
+ return Array.from(str.match(CASE_SPLIT_PATTERN) ?? []);
1082
+ }
1083
+
1084
+ function camelCase(str) {
1085
+ const words = getWords(str);
1086
+ if (words.length === 0) {
1087
+ return "";
1088
+ }
1089
+ const [first, ...rest] = words;
1090
+ return `${first.toLowerCase()}${rest.map((word) => capitalize(word)).join("")}`;
1091
+ }
1092
+
1093
+ function convertToUnit(str, unit = "px") {
1094
+ if (str == null || str === "") {
1095
+ return void 0;
1096
+ } else if (isNaN(+str)) {
1097
+ return String(str);
1098
+ } else {
1099
+ return `${Number(str)}${unit}`;
1100
+ }
1101
+ }
1102
+
1103
+ const htmlEscapes = Object.freeze({
1104
+ 38: "&",
1105
+ // &
1106
+ 60: "<",
1107
+ // <
1108
+ 62: "&gt;",
1109
+ // >
1110
+ 34: "&quot;",
1111
+ // "
1112
+ 39: "&#39;"
1113
+ // '
1114
+ });
1115
+ function escapeHtml(unsafe) {
1116
+ if (typeof unsafe !== "string") {
1117
+ return "";
1118
+ }
1119
+ let result = "";
1120
+ let strLen = unsafe.length;
1121
+ let char;
1122
+ for (let idx = 0; idx < strLen; idx++) {
1123
+ char = unsafe.charCodeAt(idx);
1124
+ result += htmlEscapes[char] || String.fromCharCode(char);
1125
+ }
1126
+ return result;
1127
+ }
1128
+
1129
+ function escapeNumeric(str) {
1130
+ const result = String(str).replace(/\D/g, "");
1131
+ if (!result.length) {
1132
+ return void 0;
1133
+ }
1134
+ return result;
1135
+ }
1136
+
1137
+ function escapeRegExp(str) {
1138
+ return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
1139
+ }
1140
+
1141
+ const vs16RegExp = /\uFE0F/g;
1142
+ const zeroWidthJoiner = String.fromCharCode(8205);
1143
+ function removeVS16s(rawEmoji) {
1144
+ return rawEmoji.indexOf(zeroWidthJoiner) < 0 ? rawEmoji.replace(vs16RegExp, "") : rawEmoji;
1145
+ }
1146
+ const TWEMOJI_REGEX = /(?:\ud83d\udc68\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83e\uddd1\ud83c[\udffc-\udfff]|\ud83e\uddd1\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83e\uddd1\ud83c[\udffb\udffd-\udfff]|\ud83e\uddd1\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83e\uddd1\ud83c[\udffb\udffc\udffe\udfff]|\ud83e\uddd1\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83e\uddd1\ud83c[\udffb-\udffd\udfff]|\ud83e\uddd1\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83e\uddd1\ud83c[\udffb-\udffe]|\ud83d\udc68\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffc-\udfff]|\ud83d\udc68\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb\udffd-\udfff]|\ud83d\udc68\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb\udffc\udffe\udfff]|\ud83d\udc68\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb-\udffd\udfff]|\ud83d\udc68\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb-\udffe]|\ud83d\udc69\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffc-\udfff]|\ud83d\udc69\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffc-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb\udffd-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffb\udffd-\udfff]|\ud83d\udc69\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb\udffc\udffe\udfff]|\ud83d\udc69\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffb\udffc\udffe\udfff]|\ud83d\udc69\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb-\udffd\udfff]|\ud83d\udc69\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffb-\udffd\udfff]|\ud83d\udc69\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb-\udffe]|\ud83d\udc69\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffb-\udffe]|\ud83e\uddd1\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83e\uddd1\ud83c[\udffc-\udfff]|\ud83e\uddd1\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83e\uddd1\ud83c[\udffb\udffd-\udfff]|\ud83e\uddd1\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83e\uddd1\ud83c[\udffb\udffc\udffe\udfff]|\ud83e\uddd1\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83e\uddd1\ud83c[\udffb-\udffd\udfff]|\ud83e\uddd1\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83e\uddd1\ud83c[\udffb-\udffe]|\ud83e\uddd1\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68|\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d[\udc68\udc69]|\ud83e\udef1\ud83c\udffb\u200d\ud83e\udef2\ud83c[\udffc-\udfff]|\ud83e\udef1\ud83c\udffc\u200d\ud83e\udef2\ud83c[\udffb\udffd-\udfff]|\ud83e\udef1\ud83c\udffd\u200d\ud83e\udef2\ud83c[\udffb\udffc\udffe\udfff]|\ud83e\udef1\ud83c\udffe\u200d\ud83e\udef2\ud83c[\udffb-\udffd\udfff]|\ud83e\udef1\ud83c\udfff\u200d\ud83e\udef2\ud83c[\udffb-\udffe]|\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc68|\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d[\udc68\udc69]|\ud83e\uddd1\u200d\ud83e\udd1d\u200d\ud83e\uddd1|\ud83d\udc6b\ud83c[\udffb-\udfff]|\ud83d\udc6c\ud83c[\udffb-\udfff]|\ud83d\udc6d\ud83c[\udffb-\udfff]|\ud83d\udc8f\ud83c[\udffb-\udfff]|\ud83d\udc91\ud83c[\udffb-\udfff]|\ud83e\udd1d\ud83c[\udffb-\udfff]|\ud83d[\udc6b-\udc6d\udc8f\udc91]|\ud83e\udd1d)|(?:\ud83d[\udc68\udc69]|\ud83e\uddd1)(?:\ud83c[\udffb-\udfff])?\u200d(?:\u2695\ufe0f|\u2696\ufe0f|\u2708\ufe0f|\ud83c[\udf3e\udf73\udf7c\udf84\udf93\udfa4\udfa8\udfeb\udfed]|\ud83d[\udcbb\udcbc\udd27\udd2c\ude80\ude92]|\ud83e[\uddaf-\uddb3\uddbc\uddbd])|(?:\ud83c[\udfcb\udfcc]|\ud83d[\udd74\udd75]|\u26f9)((?:\ud83c[\udffb-\udfff]|\ufe0f)\u200d[\u2640\u2642]\ufe0f)|(?:\ud83c[\udfc3\udfc4\udfca]|\ud83d[\udc6e\udc70\udc71\udc73\udc77\udc81\udc82\udc86\udc87\ude45-\ude47\ude4b\ude4d\ude4e\udea3\udeb4-\udeb6]|\ud83e[\udd26\udd35\udd37-\udd39\udd3d\udd3e\uddb8\uddb9\uddcd-\uddcf\uddd4\uddd6-\udddd])(?:\ud83c[\udffb-\udfff])?\u200d[\u2640\u2642]\ufe0f|(?:\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d[\udc66\udc67]|\ud83c\udff3\ufe0f\u200d\u26a7\ufe0f|\ud83c\udff3\ufe0f\u200d\ud83c\udf08|\ud83d\ude36\u200d\ud83c\udf2b\ufe0f|\u2764\ufe0f\u200d\ud83d\udd25|\u2764\ufe0f\u200d\ud83e\ude79|\ud83c\udff4\u200d\u2620\ufe0f|\ud83d\udc15\u200d\ud83e\uddba|\ud83d\udc3b\u200d\u2744\ufe0f|\ud83d\udc41\u200d\ud83d\udde8|\ud83d\udc68\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\ud83d[\udc66\udc67]|\ud83d\udc6f\u200d\u2640\ufe0f|\ud83d\udc6f\u200d\u2642\ufe0f|\ud83d\ude2e\u200d\ud83d\udca8|\ud83d\ude35\u200d\ud83d\udcab|\ud83e\udd3c\u200d\u2640\ufe0f|\ud83e\udd3c\u200d\u2642\ufe0f|\ud83e\uddde\u200d\u2640\ufe0f|\ud83e\uddde\u200d\u2642\ufe0f|\ud83e\udddf\u200d\u2640\ufe0f|\ud83e\udddf\u200d\u2642\ufe0f|\ud83d\udc08\u200d\u2b1b)|[#*0-9]\ufe0f?\u20e3|(?:[©®\u2122\u265f]\ufe0f)|(?:\ud83c[\udc04\udd70\udd71\udd7e\udd7f\ude02\ude1a\ude2f\ude37\udf21\udf24-\udf2c\udf36\udf7d\udf96\udf97\udf99-\udf9b\udf9e\udf9f\udfcd\udfce\udfd4-\udfdf\udff3\udff5\udff7]|\ud83d[\udc3f\udc41\udcfd\udd49\udd4a\udd6f\udd70\udd73\udd76-\udd79\udd87\udd8a-\udd8d\udda5\udda8\uddb1\uddb2\uddbc\uddc2-\uddc4\uddd1-\uddd3\udddc-\uddde\udde1\udde3\udde8\uddef\uddf3\uddfa\udecb\udecd-\udecf\udee0-\udee5\udee9\udef0\udef3]|[\u203c\u2049\u2139\u2194-\u2199\u21a9\u21aa\u231a\u231b\u2328\u23cf\u23ed-\u23ef\u23f1\u23f2\u23f8-\u23fa\u24c2\u25aa\u25ab\u25b6\u25c0\u25fb-\u25fe\u2600-\u2604\u260e\u2611\u2614\u2615\u2618\u2620\u2622\u2623\u2626\u262a\u262e\u262f\u2638-\u263a\u2640\u2642\u2648-\u2653\u2660\u2663\u2665\u2666\u2668\u267b\u267f\u2692-\u2697\u2699\u269b\u269c\u26a0\u26a1\u26a7\u26aa\u26ab\u26b0\u26b1\u26bd\u26be\u26c4\u26c5\u26c8\u26cf\u26d1\u26d3\u26d4\u26e9\u26ea\u26f0-\u26f5\u26f8\u26fa\u26fd\u2702\u2708\u2709\u270f\u2712\u2714\u2716\u271d\u2721\u2733\u2734\u2744\u2747\u2757\u2763\u2764\u27a1\u2934\u2935\u2b05-\u2b07\u2b1b\u2b1c\u2b50\u2b55\u3030\u303d\u3297\u3299])(?:\ufe0f|(?!\ufe0e))|(?:(?:\ud83c[\udfcb\udfcc]|\ud83d[\udd74\udd75\udd90]|[\u261d\u26f7\u26f9\u270c\u270d])(?:\ufe0f|(?!\ufe0e))|(?:\ud83c[\udf85\udfc2-\udfc4\udfc7\udfca]|\ud83d[\udc42\udc43\udc46-\udc50\udc66-\udc69\udc6e\udc70-\udc78\udc7c\udc81-\udc83\udc85-\udc87\udcaa\udd7a\udd95\udd96\ude45-\ude47\ude4b-\ude4f\udea3\udeb4-\udeb6\udec0\udecc]|\ud83e[\udd0c\udd0f\udd18-\udd1c\udd1e\udd1f\udd26\udd30-\udd39\udd3d\udd3e\udd77\uddb5\uddb6\uddb8\uddb9\uddbb\uddcd-\uddcf\uddd1-\udddd\udec3-\udec5\udef0-\udef6]|[\u270a\u270b]))(?:\ud83c[\udffb-\udfff])?|(?:\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f|\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc73\udb40\udc63\udb40\udc74\udb40\udc7f|\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc77\udb40\udc6c\udb40\udc73\udb40\udc7f|\ud83c\udde6\ud83c[\udde8-\uddec\uddee\uddf1\uddf2\uddf4\uddf6-\uddfa\uddfc\uddfd\uddff]|\ud83c\udde7\ud83c[\udde6\udde7\udde9-\uddef\uddf1-\uddf4\uddf6-\uddf9\uddfb\uddfc\uddfe\uddff]|\ud83c\udde8\ud83c[\udde6\udde8\udde9\uddeb-\uddee\uddf0-\uddf5\uddf7\uddfa-\uddff]|\ud83c\udde9\ud83c[\uddea\uddec\uddef\uddf0\uddf2\uddf4\uddff]|\ud83c\uddea\ud83c[\udde6\udde8\uddea\uddec\udded\uddf7-\uddfa]|\ud83c\uddeb\ud83c[\uddee-\uddf0\uddf2\uddf4\uddf7]|\ud83c\uddec\ud83c[\udde6\udde7\udde9-\uddee\uddf1-\uddf3\uddf5-\uddfa\uddfc\uddfe]|\ud83c\udded\ud83c[\uddf0\uddf2\uddf3\uddf7\uddf9\uddfa]|\ud83c\uddee\ud83c[\udde8-\uddea\uddf1-\uddf4\uddf6-\uddf9]|\ud83c\uddef\ud83c[\uddea\uddf2\uddf4\uddf5]|\ud83c\uddf0\ud83c[\uddea\uddec-\uddee\uddf2\uddf3\uddf5\uddf7\uddfc\uddfe\uddff]|\ud83c\uddf1\ud83c[\udde6-\udde8\uddee\uddf0\uddf7-\uddfb\uddfe]|\ud83c\uddf2\ud83c[\udde6\udde8-\udded\uddf0-\uddff]|\ud83c\uddf3\ud83c[\udde6\udde8\uddea-\uddec\uddee\uddf1\uddf4\uddf5\uddf7\uddfa\uddff]|\ud83c\uddf4\ud83c\uddf2|\ud83c\uddf5\ud83c[\udde6\uddea-\udded\uddf0-\uddf3\uddf7-\uddf9\uddfc\uddfe]|\ud83c\uddf6\ud83c\udde6|\ud83c\uddf7\ud83c[\uddea\uddf4\uddf8\uddfa\uddfc]|\ud83c\uddf8\ud83c[\udde6-\uddea\uddec-\uddf4\uddf7-\uddf9\uddfb\uddfd-\uddff]|\ud83c\uddf9\ud83c[\udde6\udde8\udde9\uddeb-\udded\uddef-\uddf4\uddf7\uddf9\uddfb\uddfc\uddff]|\ud83c\uddfa\ud83c[\udde6\uddec\uddf2\uddf3\uddf8\uddfe\uddff]|\ud83c\uddfb\ud83c[\udde6\udde8\uddea\uddec\uddee\uddf3\uddfa]|\ud83c\uddfc\ud83c[\uddeb\uddf8]|\ud83c\uddfd\ud83c\uddf0|\ud83c\uddfe\ud83c[\uddea\uddf9]|\ud83c\uddff\ud83c[\udde6\uddf2\uddfc]|\ud83c[\udccf\udd8e\udd91-\udd9a\udde6-\uddff\ude01\ude32-\ude36\ude38-\ude3a\ude50\ude51\udf00-\udf20\udf2d-\udf35\udf37-\udf7c\udf7e-\udf84\udf86-\udf93\udfa0-\udfc1\udfc5\udfc6\udfc8\udfc9\udfcf-\udfd3\udfe0-\udff0\udff4\udff8-\udfff]|\ud83d[\udc00-\udc3e\udc40\udc44\udc45\udc51-\udc65\udc6a\udc6f\udc79-\udc7b\udc7d-\udc80\udc84\udc88-\udc8e\udc90\udc92-\udca9\udcab-\udcfc\udcff-\udd3d\udd4b-\udd4e\udd50-\udd67\udda4\uddfb-\ude44\ude48-\ude4a\ude80-\udea2\udea4-\udeb3\udeb7-\udebf\udec1-\udec5\uded0-\uded2\uded5-\uded7\udedd-\udedf\udeeb\udeec\udef4-\udefc\udfe0-\udfeb\udff0]|\ud83e[\udd0d\udd0e\udd10-\udd17\udd20-\udd25\udd27-\udd2f\udd3a\udd3c\udd3f-\udd45\udd47-\udd76\udd78-\uddb4\uddb7\uddba\uddbc-\uddcc\uddd0\uddde-\uddff\ude70-\ude74\ude78-\ude7c\ude80-\ude86\ude90-\udeac\udeb0-\udeba\udec0-\udec2\uded0-\uded9\udee0-\udee7]|[\u23e9-\u23ec\u23f0\u23f3\u267e\u26ce\u2705\u2728\u274c\u274e\u2753-\u2755\u2795-\u2797\u27b0\u27bf\ue50a])|\ufe0f/g;
1147
+
1148
+ function isOneEmoji(text) {
1149
+ return !!(typeof text === "string" && text && (text.match(TWEMOJI_REGEX) || [])[0]?.length === text.length);
1150
+ }
1151
+
1152
+ const IGNORED_TITLES = Object.freeze(
1153
+ /* @__PURE__ */ new Set([
1154
+ "dr.",
1155
+ "mr.",
1156
+ "mrs.",
1157
+ "miss",
1158
+ "ms.",
1159
+ "prof.",
1160
+ "sir",
1161
+ "rev.",
1162
+ "hon."
1163
+ ])
1164
+ );
1165
+ function getInitials(fullName) {
1166
+ if (!isString(fullName)) return "";
1167
+ let [first, ...rest] = fullName.replace(/\s{2,}/g, " ").replace(/[,+/#!$@%^&*;:{}=\-_`~()]/g, "").trim().split(" ").filter((word) => !IGNORED_TITLES.has(word.toLowerCase())).map((v) => v.replaceAll(".", "").trim()).filter(Boolean);
1168
+ let last = rest[rest.length - 1];
1169
+ if (rest.length > 1) {
1170
+ if (isOneEmoji(first)) {
1171
+ first = rest[0];
1172
+ } else if (isOneEmoji(last)) {
1173
+ last = rest[0];
1174
+ }
1175
+ }
1176
+ return [first, last].filter(Boolean).map((letter = "") => [...letter.toUpperCase()][0]).join("");
1177
+ }
1178
+
1179
+ const DEF_PROTOCOLS = ["http://", "https://"];
1180
+ function hasProtocol(url, protocols = DEF_PROTOCOLS) {
1181
+ if (!isString(url)) return false;
1182
+ return protocols.some((v) => url.startsWith(v));
1183
+ }
1184
+
1185
+ const byteToHex = [];
1186
+ for (let n = 0; n <= 255; ++n) {
1187
+ const hexOctet = n.toString(16).padStart(2, "0");
1188
+ byteToHex.push(hexOctet);
1189
+ }
1190
+ function hex(value) {
1191
+ const buff = Array.isArray(value) ? new Uint8Array(value) : value;
1192
+ const hexOctets = new Array(buff.length);
1193
+ for (let i = 0; i < buff.length; ++i) {
1194
+ hexOctets[i] = byteToHex[buff[i]];
1195
+ }
1196
+ return hexOctets.join("");
1197
+ }
1198
+
1199
+ function isoToFlagEmoji(iso) {
1200
+ const code = iso.toUpperCase();
1201
+ if (!/^[A-Z]{2}$/.test(code)) return iso;
1202
+ const codePoints = [...code].map((c) => c.codePointAt(0) + 127397);
1203
+ return String.fromCodePoint(...codePoints);
1204
+ }
1205
+
1206
+ function kebabCase(str) {
1207
+ const words = getWords(str);
1208
+ return words.map((word) => word.toLowerCase()).join("-");
1209
+ }
1210
+
1211
+ const lowerCase = (str) => {
1212
+ return getWords(str).map((word) => word.toLowerCase()).join(" ");
1213
+ };
1214
+
1215
+ function maskingWords(value, withChar = "*") {
1216
+ return getWords(value).map((word) => {
1217
+ const len = word.length;
1218
+ if (len < 2) {
1219
+ return "".padEnd(len, withChar);
1220
+ } else if (len < 3) {
1221
+ return word[0].padEnd(len, withChar);
1222
+ } else {
1223
+ return word[0].padEnd(len - 2, withChar) + word.at(-1);
1224
+ }
1225
+ }).join(" ");
1226
+ }
1227
+
1228
+ function maskingEmail(value) {
1229
+ if (!isString(value)) return "";
1230
+ const [username, host] = value.split("@", 2);
1231
+ if (!username || !host) return "";
1232
+ return `${maskingWords(username)}@${host}`;
1233
+ }
1234
+
1235
+ function maskingPhone(value, fromPosition = 2, toPosition = 4, withChar = "X") {
1236
+ if (!isString(value)) return "";
1237
+ const numbersAmount = value.replace(/\D/g, "").length;
1238
+ const fromIdx = fromPosition - 1;
1239
+ let toIdx = numbersAmount - toPosition;
1240
+ if (toIdx <= 0) {
1241
+ toIdx = numbersAmount;
1242
+ }
1243
+ let i = -1;
1244
+ return value.replace(/\d/g, (char) => {
1245
+ i++;
1246
+ return i > fromIdx && i < toIdx ? withChar : char;
1247
+ });
1248
+ }
1249
+
1250
+ function timestamp(fromValue = Date.now()) {
1251
+ if (isDate(fromValue)) {
1252
+ fromValue = fromValue.getTime();
1253
+ }
1254
+ return Math.floor(fromValue / 1e3);
1255
+ }
1256
+
1257
+ let index = Math.floor(Math.random() * 16777215);
1258
+ const buffer = new Uint8Array(12);
1259
+ function objectId(fromValue = Date.now()) {
1260
+ const value = timestamp(fromValue);
1261
+ const inc = getInc();
1262
+ buffer[0] = value >> 24;
1263
+ buffer[1] = value >> 16;
1264
+ buffer[2] = value >> 8;
1265
+ buffer[3] = value;
1266
+ buffer[4] = Math.floor(Math.random() * 256);
1267
+ buffer[5] = Math.floor(Math.random() * 256);
1268
+ buffer[6] = Math.floor(Math.random() * 256);
1269
+ buffer[7] = Math.floor(Math.random() * 256);
1270
+ buffer[8] = Math.floor(Math.random() * 256);
1271
+ buffer[11] = inc & 255;
1272
+ buffer[10] = inc >> 8 & 255;
1273
+ buffer[9] = inc >> 16 & 255;
1274
+ return hex(buffer);
1275
+ }
1276
+ function getInc() {
1277
+ return index = (index + 1) % 16777215;
1278
+ }
1279
+
1280
+ const rndCharacters = "abcdefghijklmnopqrstuvwxyz0123456789";
1281
+ const charactersLength = rndCharacters.length;
1282
+ function randomString(length) {
1283
+ let str = "";
1284
+ let num = isNumber(length) ? Math.max(0, length) : 0;
1285
+ while (num--) {
1286
+ str += rndCharacters[charactersLength * Math.random() | 0];
1287
+ }
1288
+ return str;
1289
+ }
1290
+
1291
+ const snakeCase = (str) => {
1292
+ return getWords(str).map((word) => word.toLowerCase()).join("_");
1293
+ };
1294
+
1295
+ function sprintf(line, args, unusedArgs = []) {
1296
+ let result = "";
1297
+ const argsLen = args.length;
1298
+ const lineLen = line.length;
1299
+ let opened = false;
1300
+ let currentChar = -1;
1301
+ let lastPos = 0;
1302
+ let argsIndex = 0;
1303
+ for (let idx = 0; idx < lineLen; idx++) {
1304
+ currentChar = line.charCodeAt(idx);
1305
+ if (currentChar === 37) {
1306
+ opened = true;
1307
+ continue;
1308
+ }
1309
+ if (!opened) continue;
1310
+ opened = false;
1311
+ switch (currentChar) {
1312
+ // 'd'
1313
+ case 100:
1314
+ // 'f'
1315
+ case 102: {
1316
+ result += line.slice(lastPos, idx - 1);
1317
+ result += Number(args[argsIndex]);
1318
+ lastPos = idx + 1;
1319
+ argsIndex++;
1320
+ break;
1321
+ }
1322
+ // 'i'
1323
+ case 105: {
1324
+ result += line.slice(lastPos, idx - 1);
1325
+ result += Math.floor(Number(args[argsIndex]));
1326
+ lastPos = idx + 1;
1327
+ argsIndex++;
1328
+ break;
1329
+ }
1330
+ // 'O'
1331
+ case 79:
1332
+ // 'o'
1333
+ case 111:
1334
+ // 'j'
1335
+ case 106: {
1336
+ result += line.slice(lastPos, idx - 1);
1337
+ result += tryStringify(args[argsIndex]);
1338
+ lastPos = idx + 1;
1339
+ argsIndex++;
1340
+ break;
1341
+ }
1342
+ // 's'
1343
+ case 115: {
1344
+ result += line.slice(lastPos, idx - 1);
1345
+ result += String(args[argsIndex]);
1346
+ lastPos = idx + 1;
1347
+ argsIndex++;
1348
+ break;
1349
+ }
1350
+ }
1351
+ if (argsIndex >= argsLen) break;
1352
+ }
1353
+ if (lastPos < lineLen) {
1354
+ result += line.slice(lastPos, lineLen);
1355
+ }
1356
+ if (argsIndex < argsLen) {
1357
+ unusedArgs.push(...args.slice(argsIndex, argsLen));
1358
+ }
1359
+ return result;
1360
+ }
1361
+ function tryStringify(o) {
1362
+ switch (typeof o) {
1363
+ case "function": {
1364
+ return o.name || "<anonymous>";
1365
+ }
1366
+ case "string": {
1367
+ return "'" + o + "'";
1368
+ }
1369
+ default: {
1370
+ try {
1371
+ return JSON.stringify(o);
1372
+ } catch (e) {
1373
+ return '"[Circular]"';
1374
+ }
1375
+ }
1376
+ }
1377
+ }
1378
+
1379
+ const startCase = (value) => {
1380
+ return getWords(value).map(capitalize).join(" ");
1381
+ };
1382
+
1383
+ const DEF_STR_ASSIGN_REGEXP = /\{{([A-z-_. ]*)\}}/g;
1384
+ const DEF_STR_ASSIGN_METHOD = (obj, key) => obj[key];
1385
+ function strAssign(str, obj, method = DEF_STR_ASSIGN_METHOD) {
1386
+ return str.replace(DEF_STR_ASSIGN_REGEXP, (match, p1) => {
1387
+ const key = p1.trim();
1388
+ const value = method(obj, key);
1389
+ if (value === void 0 || value === null) {
1390
+ return match;
1391
+ }
1392
+ return value;
1393
+ });
1394
+ }
1395
+
1396
+ var textEncoder = new TextEncoder();
1397
+ var textDecoder = new TextDecoder();
1398
+
1399
+ function truncate(value, maxLength = 120, insignificantThreshold = 0.05) {
1400
+ if (!shouldTruncate(value, maxLength, insignificantThreshold)) {
1401
+ return value;
1402
+ }
1403
+ let truncated = value.slice(0, maxLength).trim();
1404
+ const lastSpace = truncated.lastIndexOf(" ");
1405
+ if (lastSpace > 0) {
1406
+ truncated = truncated.slice(0, lastSpace);
1407
+ }
1408
+ return `${truncated}...`;
1409
+ }
1410
+ function shouldTruncate(text, maxLength, insignificantThreshold) {
1411
+ return text.length - maxLength > maxLength * insignificantThreshold;
1412
+ }
1413
+
1414
+ function wrapText(value, maxLength = 30) {
1415
+ if (value.length > maxLength) {
1416
+ return value.slice(0, maxLength) + "...";
1417
+ }
1418
+ return value;
1419
+ }
1043
1420
 
1044
1421
  var ALPHABET = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
1045
1422
  var ENCODE_TABLE = new TextEncoder().encode(ALPHABET);
1046
- var DECODE_TABLE = new Uint8Array(256);
1423
+ var DECODE_TABLE = new Uint8Array(128);
1047
1424
  for (let i = 0; i < ENCODE_TABLE.length; ++i) {
1048
1425
  DECODE_TABLE[ENCODE_TABLE[i]] = i;
1049
1426
  }
@@ -1052,49 +1429,52 @@ LOG2_TABLE[0] = 1;
1052
1429
  for (let i = 1; i < 62; ++i) {
1053
1430
  LOG2_TABLE[i] = Math.ceil(Math.log2(i + 1));
1054
1431
  }
1055
- const allocEncode = createAllocator();
1432
+ var allocEncode = createAllocator();
1056
1433
  const base62Fast = {
1057
1434
  alphabet: ALPHABET,
1058
1435
  padding: "",
1059
1436
  /**
1060
1437
  * Encodes a Uint8Array into a Base62 string using a custom 5/6-bit variable length scheme.
1061
- * Processes bits from right to left (most significant bit first conceptually).
1438
+ * Processes bits from left to right maintaining correct order.
1062
1439
  * @param input The Uint8Array to encode.
1063
1440
  * @returns The encoded Base62 string.
1064
1441
  */
1065
1442
  encode(input) {
1066
- var position = input.length * 8;
1067
- var output = allocEncode((position / 5 | 0) + 1);
1443
+ var totalBits = input.length * 8;
1444
+ var output = allocEncode((totalBits / 5 | 0) + 1);
1068
1445
  var outputIndex = 0;
1446
+ var bitPosition = 0;
1447
+ var buffer = 0;
1448
+ var inputIndex = 0;
1069
1449
  var chunkSize;
1070
- var remainderBits;
1071
- var byteIndex;
1072
- var extractedBits;
1073
1450
  var value;
1074
- while (position > 0) {
1075
- chunkSize = 6;
1076
- remainderBits = position & 7;
1077
- byteIndex = position >>> 3;
1078
- if (remainderBits === 0) {
1079
- byteIndex -= 1;
1080
- remainderBits = 8;
1081
- }
1082
- extractedBits = input[byteIndex] >> 8 - remainderBits;
1083
- if (remainderBits < 6 && byteIndex > 0) {
1084
- extractedBits |= input[byteIndex - 1] << remainderBits;
1451
+ if (input.length > 0) {
1452
+ buffer = input[0];
1453
+ inputIndex = 1;
1454
+ bitPosition = 8;
1455
+ }
1456
+ while (bitPosition > 0 || inputIndex < input.length) {
1457
+ while (bitPosition < 6 && inputIndex < input.length) {
1458
+ buffer |= input[inputIndex] << bitPosition;
1459
+ inputIndex++;
1460
+ bitPosition += 8;
1085
1461
  }
1086
- value = extractedBits & 63;
1462
+ if (bitPosition === 0) break;
1463
+ value = buffer & 63;
1464
+ chunkSize = 6;
1087
1465
  if ((value & 30) === 30) {
1088
- if (position > 6 || value > 31) {
1466
+ var remainingBits = bitPosition + (input.length - inputIndex) * 8;
1467
+ if (remainingBits > 6 || value > 31) {
1089
1468
  chunkSize = 5;
1090
1469
  value &= 31;
1091
1470
  }
1092
1471
  }
1093
- output[outputIndex] = ENCODE_TABLE[additiveCipher(value, outputIndex % 63)];
1472
+ output[outputIndex] = ENCODE_TABLE[value];
1094
1473
  outputIndex++;
1095
- position -= chunkSize;
1474
+ buffer >>= chunkSize;
1475
+ bitPosition -= chunkSize;
1096
1476
  }
1097
- return new TextDecoder().decode(output.subarray(0, outputIndex));
1477
+ return textDecoder.decode(output.subarray(0, outputIndex));
1098
1478
  },
1099
1479
  /**
1100
1480
  * Decodes a Base62 string generated by the custom encoder back into a Uint8Array.
@@ -1104,49 +1484,52 @@ const base62Fast = {
1104
1484
  decode(input) {
1105
1485
  var inputLength = input.length;
1106
1486
  var maxOutputLength = inputLength * 6 / 8 | 0;
1107
- var output = new Uint8Array(maxOutputLength);
1108
- var writeIndex = maxOutputLength;
1487
+ var output = new Uint8Array(maxOutputLength + 1);
1488
+ var writeIndex = 0;
1109
1489
  var bitPosition = 0;
1110
1490
  var buffer = 0;
1111
1491
  var charCode = 0;
1112
1492
  var value = 0;
1493
+ var bitsToAdd = 0;
1113
1494
  for (var readIndex = 0; readIndex < inputLength; readIndex++) {
1114
1495
  charCode = input.charCodeAt(readIndex);
1115
1496
  value = DECODE_TABLE[charCode];
1116
- value = DECODE_TABLE[ENCODE_TABLE[additiveCipherReverse(value, readIndex % 63)]];
1117
1497
  if (isNaN(charCode) || value === void 0) {
1118
1498
  throw new Error(
1119
1499
  "Invalid Base62 input: contains non-alphabet characters. Index: " + readIndex
1120
1500
  );
1121
1501
  }
1122
- buffer |= value << bitPosition;
1123
1502
  if (readIndex === inputLength - 1) {
1124
1503
  if (LOG2_TABLE[value] === void 0) {
1125
1504
  throw new Error(
1126
1505
  "Invalid Base62 input: unexpected value for last character."
1127
1506
  );
1128
1507
  }
1129
- bitPosition += LOG2_TABLE[value];
1508
+ bitsToAdd = LOG2_TABLE[value];
1130
1509
  } else if ((value & 30) === 30) {
1131
- bitPosition += 5;
1510
+ bitsToAdd = 5;
1132
1511
  } else {
1133
- bitPosition += 6;
1512
+ bitsToAdd = 6;
1134
1513
  }
1135
- if (bitPosition >= 8) {
1136
- output[--writeIndex] = buffer;
1137
- bitPosition &= 7;
1514
+ buffer |= value << bitPosition;
1515
+ bitPosition += bitsToAdd;
1516
+ while (bitPosition >= 8) {
1517
+ output[writeIndex] = buffer & 255;
1518
+ writeIndex++;
1138
1519
  buffer >>= 8;
1520
+ bitPosition -= 8;
1139
1521
  }
1140
1522
  }
1141
1523
  if (bitPosition > 0) {
1142
- output[--writeIndex] = buffer;
1524
+ output[writeIndex] = buffer & 255;
1525
+ writeIndex++;
1143
1526
  }
1144
- return output.subarray(writeIndex);
1527
+ return output.subarray(0, writeIndex);
1145
1528
  }
1146
1529
  };
1147
1530
  function createAllocator() {
1148
- var currentBuffer = new Uint8Array(512);
1149
- var currentSize = 512;
1531
+ var currentBuffer = new Uint8Array(256);
1532
+ var currentSize = 256;
1150
1533
  return (size) => {
1151
1534
  if (currentSize < size) {
1152
1535
  currentBuffer = new Uint8Array(size);
@@ -1155,12 +1538,6 @@ function createAllocator() {
1155
1538
  return currentBuffer;
1156
1539
  };
1157
1540
  }
1158
- function additiveCipher(value, shift) {
1159
- return (value + shift) % 62;
1160
- }
1161
- function additiveCipherReverse(obscured, shift) {
1162
- return (obscured - shift + 62) % 62;
1163
- }
1164
1541
 
1165
1542
  class Base64Encoding {
1166
1543
  alphabet;
@@ -1383,17 +1760,6 @@ function uint8ToUint32(value) {
1383
1760
  return uint32Array;
1384
1761
  }
1385
1762
 
1386
- const rndCharacters = "abcdefghijklmnopqrstuvwxyz0123456789";
1387
- const charactersLength = rndCharacters.length;
1388
- function randomString(length) {
1389
- let str = "";
1390
- let num = isNumber(length) ? Math.max(0, length) : 0;
1391
- while (num--) {
1392
- str += rndCharacters[charactersLength * Math.random() | 0];
1393
- }
1394
- return str;
1395
- }
1396
-
1397
1763
  const objectKeys = /* @__PURE__ */ new WeakMap();
1398
1764
  const BSON_TYPES = Object.freeze(/* @__PURE__ */ new Set(["ObjectID", "ObjectId"]));
1399
1765
  const SYM_WITH_CACHE = Symbol();
@@ -2792,7 +3158,6 @@ const ColorParser = {
2792
3158
  HEX: parseHEX
2793
3159
  };
2794
3160
 
2795
- var encoder = new TextEncoder();
2796
3161
  var TABLE = new Int32Array([
2797
3162
  0,
2798
3163
  1996959894,
@@ -3051,13 +3416,21 @@ var TABLE = new Int32Array([
3051
3416
  1510334235,
3052
3417
  755167117
3053
3418
  ]);
3054
- function crc32(current, seed) {
3055
- if (isString(current)) {
3056
- return crc32(encoder.encode(current), seed);
3419
+ function crc32(value, seed) {
3420
+ if (isString(value)) {
3421
+ return crc32(textEncoder.encode(value), seed);
3057
3422
  }
3058
3423
  var crc = seed === 0 ? 0 : ~~seed ^ -1;
3059
- for (var index = 0; index < current.length; index++) {
3060
- crc = TABLE[(crc ^ current[index]) & 255] ^ crc >>> 8;
3424
+ if (value instanceof Uint8Array) {
3425
+ for (var index = 0; index < value.length; index++) {
3426
+ crc = TABLE[(crc ^ value[index]) & 255] ^ crc >>> 8;
3427
+ }
3428
+ } else {
3429
+ for (var current of value) {
3430
+ for (var index = 0; index < current.length; index++) {
3431
+ crc = TABLE[(crc ^ current[index]) & 255] ^ crc >>> 8;
3432
+ }
3433
+ }
3061
3434
  }
3062
3435
  return crc ^ -1;
3063
3436
  }
@@ -3326,13 +3699,6 @@ function timeFromMinutes(value, returnsNullWhenInvalid = false) {
3326
3699
  return { h, m };
3327
3700
  }
3328
3701
 
3329
- function timestamp(fromValue = Date.now()) {
3330
- if (isDate(fromValue)) {
3331
- fromValue = fromValue.getTime();
3332
- }
3333
- return Math.floor(fromValue / 1e3);
3334
- }
3335
-
3336
3702
  function timestampToDate(value) {
3337
3703
  if (!isNumber(value)) return null;
3338
3704
  return new Date(value * 1e3);
@@ -3609,11 +3975,14 @@ class EJSONStream extends TransformStream {
3609
3975
  constructor({ ejson, cl, op, sep, onFlush, onStart }) {
3610
3976
  let firstChunk = true;
3611
3977
  super({
3612
- async start(controller) {
3613
- if (onStart) {
3614
- await onStart(controller);
3615
- }
3616
- controller.enqueue(op);
3978
+ start(controller) {
3979
+ return Promise.resolve().then(() => {
3980
+ if (onStart) {
3981
+ return onStart(controller);
3982
+ }
3983
+ }).then(() => {
3984
+ controller.enqueue(op);
3985
+ });
3617
3986
  },
3618
3987
  transform(chunk, controller) {
3619
3988
  const jsonString = ejson.stringify(chunk);
@@ -3665,47 +4034,49 @@ function createEJSONStreamPayload(options) {
3665
4034
  cl,
3666
4035
  op,
3667
4036
  sep,
3668
- async onStart(controller) {
4037
+ onStart(controller) {
3669
4038
  if (!prepend) {
3670
4039
  controller.enqueue(`{"${resultKey}":`);
3671
- return;
3672
- }
3673
- const data = await prepend();
3674
- if (data === null || data === void 0) {
3675
- controller.enqueue(`{"${resultKey}":`);
3676
- return;
3677
- }
3678
- ok(
3679
- isPlainObject(data),
3680
- "prepend result expected to be plain object"
3681
- );
3682
- const dataPart = instance.stringify(data).slice(0, -1);
3683
- if (dataPart === "{") {
3684
- controller.enqueue(`{"${resultKey}":`);
3685
- return;
4040
+ return Promise.resolve();
3686
4041
  }
3687
- controller.enqueue(`${dataPart}${sep}"${resultKey}":`);
4042
+ return Promise.resolve().then(() => prepend()).then((data) => {
4043
+ if (data === null || data === void 0) {
4044
+ controller.enqueue(`{"${resultKey}":`);
4045
+ return;
4046
+ }
4047
+ ok(
4048
+ isPlainObject(data),
4049
+ "prepend result expected to be plain object"
4050
+ );
4051
+ const dataPart = instance.stringify(data).slice(0, -1);
4052
+ if (dataPart === "{") {
4053
+ controller.enqueue(`{"${resultKey}":`);
4054
+ return;
4055
+ }
4056
+ controller.enqueue(`${dataPart}${sep}"${resultKey}":`);
4057
+ });
3688
4058
  },
3689
- async onFlush(controller) {
4059
+ onFlush(controller) {
3690
4060
  if (!append) {
3691
4061
  controller.enqueue("}");
3692
- return;
3693
- }
3694
- const data = await append();
3695
- if (data === null || data === void 0) {
3696
- controller.enqueue("}");
3697
- return;
3698
- }
3699
- ok(
3700
- isPlainObject(data),
3701
- "prepend result expected to be plain object"
3702
- );
3703
- const dataPart = instance.stringify(data).slice(1);
3704
- if (dataPart === "}") {
3705
- controller.enqueue(`}`);
3706
- return;
4062
+ return Promise.resolve();
3707
4063
  }
3708
- controller.enqueue(`${sep}${dataPart}`);
4064
+ return Promise.resolve().then(() => append()).then((data) => {
4065
+ if (data === null || data === void 0) {
4066
+ controller.enqueue("}");
4067
+ return;
4068
+ }
4069
+ ok(
4070
+ isPlainObject(data),
4071
+ "prepend result expected to be plain object"
4072
+ );
4073
+ const dataPart = instance.stringify(data).slice(1);
4074
+ if (dataPart === "}") {
4075
+ controller.enqueue(`}`);
4076
+ return;
4077
+ }
4078
+ controller.enqueue(`${sep}${dataPart}`);
4079
+ });
3709
4080
  }
3710
4081
  });
3711
4082
  return stream;
@@ -3901,42 +4272,6 @@ class AppError extends Error {
3901
4272
  }
3902
4273
  }
3903
4274
 
3904
- class BrowserAssertionError extends Error {
3905
- /**
3906
- * Set to the `actual` argument for methods such as {@link assert.strictEqual()}.
3907
- */
3908
- actual;
3909
- /**
3910
- * Set to the `expected` argument for methods such as {@link assert.strictEqual()}.
3911
- */
3912
- expected;
3913
- /**
3914
- * Set to the passed in operator value.
3915
- */
3916
- operator;
3917
- /**
3918
- * Indicates if the message was auto-generated (`true`) or not.
3919
- */
3920
- generatedMessage;
3921
- /**
3922
- * Value is always `ERR_ASSERTION` to show that the error is an assertion error.
3923
- */
3924
- code;
3925
- constructor(options) {
3926
- super(options?.message);
3927
- this.actual = options?.actual;
3928
- this.expected = options?.expected;
3929
- this.operator = options?.operator ?? "none";
3930
- this.generatedMessage = false;
3931
- this.code = "ERR_ASSERTION";
3932
- }
3933
- }
3934
-
3935
- const BrowserAssertionError$1 = {
3936
- __proto__: null,
3937
- BrowserAssertionError: BrowserAssertionError
3938
- };
3939
-
3940
4275
  function getFileExtension(name, withDot = true) {
3941
4276
  if (!isString(name)) {
3942
4277
  return null;
@@ -3945,12 +4280,6 @@ function getFileExtension(name, withDot = true) {
3945
4280
  return ext ? withDot ? `.${ext}` : ext : null;
3946
4281
  }
3947
4282
 
3948
- const DEF_PROTOCOLS = ["http://", "https://"];
3949
- function hasProtocol(url, protocols = DEF_PROTOCOLS) {
3950
- if (!isString(url)) return false;
3951
- return protocols.some((v) => url.startsWith(v));
3952
- }
3953
-
3954
4283
  function getFileName(value) {
3955
4284
  if (hasProtocol(value)) {
3956
4285
  return getFileName(decodeURI(value.split("/").at(-1)?.split("?")?.at(0)));
@@ -4325,48 +4654,40 @@ function delay(amount = "tick") {
4325
4654
  return d.promise;
4326
4655
  }
4327
4656
 
4328
- const noopShouldRetryBasedOnError = () => true;
4657
+ var NOOP_SHOULD_RETRY_BASED_ON_ERROR = () => true;
4329
4658
  function retryOnError({
4330
- beforeRetryCallback,
4331
- shouldRetryBasedOnError = noopShouldRetryBasedOnError,
4332
- maxRetriesNumber,
4659
+ beforeRetryCallback = noop,
4660
+ shouldRetryBasedOnError = NOOP_SHOULD_RETRY_BASED_ON_ERROR,
4661
+ maxAttempts,
4662
+ maxRetriesNumber = 1,
4333
4663
  delayFactor = 0,
4334
4664
  delayMaxMs = 1e3,
4335
4665
  delayMinMs = 100
4336
4666
  }, fn) {
4337
- let retryCount = maxRetriesNumber;
4338
- let delayMs = 0;
4339
4667
  delayMinMs = Math.max(delayMinMs, 1);
4340
4668
  delayMaxMs = Math.max(delayMaxMs, 1);
4341
- const run = async (...args) => {
4342
- if (delayFactor >= 1 && delayMs > 0) {
4343
- await delay(delayMs);
4344
- }
4345
- const currentAttempt = 1 + maxRetriesNumber - retryCount;
4346
- try {
4347
- const res = await fn(...args);
4348
- return res;
4349
- } catch (e) {
4350
- if (retryCount > 1 && shouldRetryBasedOnError(e, currentAttempt)) {
4351
- retryCount--;
4352
- delayMs = Math.floor(
4353
- Math.min(Math.max(delayMs, delayMinMs) * delayFactor, delayMaxMs)
4354
- );
4355
- if (beforeRetryCallback) {
4356
- const newParams = await beforeRetryCallback(
4357
- currentAttempt,
4358
- retryCount === 0
4359
- );
4360
- if (newParams) {
4361
- return run(newParams);
4362
- }
4669
+ return function(...args) {
4670
+ var delayMs = 0;
4671
+ var currentAttempt = 0;
4672
+ var leftAttempts = isNumber(maxAttempts) ? maxAttempts : maxRetriesNumber + 1;
4673
+ var run = () => {
4674
+ currentAttempt++;
4675
+ leftAttempts--;
4676
+ return Promise.resolve().then(() => fn.apply(this, args)).catch((e) => {
4677
+ if (leftAttempts < 1 || !shouldRetryBasedOnError(e, currentAttempt)) {
4678
+ return Promise.reject(e);
4363
4679
  }
4364
- return run(...args);
4365
- }
4366
- throw e;
4367
- }
4680
+ delayMs = clamp(delayMs * delayFactor, delayMinMs, delayMaxMs);
4681
+ return Promise.resolve().then(() => beforeRetryCallback(currentAttempt, leftAttempts <= 1)).then((newParams) => {
4682
+ if (Array.isArray(newParams)) {
4683
+ args = newParams;
4684
+ }
4685
+ return delay(delayMs).then(() => run());
4686
+ });
4687
+ });
4688
+ };
4689
+ return run();
4368
4690
  };
4369
- return run;
4370
4691
  }
4371
4692
 
4372
4693
  function throttle(func, throttleMs, { signal, edges = ["leading", "trailing"] } = {}) {
@@ -4389,90 +4710,6 @@ function throttle(func, throttleMs, { signal, edges = ["leading", "trailing"] }
4389
4710
  return throttled;
4390
4711
  }
4391
4712
 
4392
- function sprintf(line, args, unusedArgs = []) {
4393
- let result = "";
4394
- const argsLen = args.length;
4395
- const lineLen = line.length;
4396
- let opened = false;
4397
- let currentChar = -1;
4398
- let lastPos = 0;
4399
- let argsIndex = 0;
4400
- for (let idx = 0; idx < lineLen; idx++) {
4401
- currentChar = line.charCodeAt(idx);
4402
- if (currentChar === 37) {
4403
- opened = true;
4404
- continue;
4405
- }
4406
- if (!opened) continue;
4407
- opened = false;
4408
- switch (currentChar) {
4409
- // 'd'
4410
- case 100:
4411
- // 'f'
4412
- case 102: {
4413
- result += line.slice(lastPos, idx - 1);
4414
- result += Number(args[argsIndex]);
4415
- lastPos = idx + 1;
4416
- argsIndex++;
4417
- break;
4418
- }
4419
- // 'i'
4420
- case 105: {
4421
- result += line.slice(lastPos, idx - 1);
4422
- result += Math.floor(Number(args[argsIndex]));
4423
- lastPos = idx + 1;
4424
- argsIndex++;
4425
- break;
4426
- }
4427
- // 'O'
4428
- case 79:
4429
- // 'o'
4430
- case 111:
4431
- // 'j'
4432
- case 106: {
4433
- result += line.slice(lastPos, idx - 1);
4434
- result += tryStringify(args[argsIndex]);
4435
- lastPos = idx + 1;
4436
- argsIndex++;
4437
- break;
4438
- }
4439
- // 's'
4440
- case 115: {
4441
- result += line.slice(lastPos, idx - 1);
4442
- result += String(args[argsIndex]);
4443
- lastPos = idx + 1;
4444
- argsIndex++;
4445
- break;
4446
- }
4447
- }
4448
- if (argsIndex >= argsLen) break;
4449
- }
4450
- if (lastPos < lineLen) {
4451
- result += line.slice(lastPos, lineLen);
4452
- }
4453
- if (argsIndex < argsLen) {
4454
- unusedArgs.push(...args.slice(argsIndex, argsLen));
4455
- }
4456
- return result;
4457
- }
4458
- function tryStringify(o) {
4459
- switch (typeof o) {
4460
- case "function": {
4461
- return o.name || "<anonymous>";
4462
- }
4463
- case "string": {
4464
- return "'" + o + "'";
4465
- }
4466
- default: {
4467
- try {
4468
- return JSON.stringify(o);
4469
- } catch (e) {
4470
- return '"[Circular]"';
4471
- }
4472
- }
4473
- }
4474
- }
4475
-
4476
4713
  const LEVEL_NUM = {
4477
4714
  debug: 0,
4478
4715
  log: 1,
@@ -4524,18 +4761,26 @@ const logger = (...baseArgs) => {
4524
4761
  return instance;
4525
4762
  };
4526
4763
 
4527
- async function asyncFilter(array, predicate) {
4528
- const result = [];
4529
- const cooldown = nextTickIteration(10);
4530
- for (let idx = 0; idx < array.length; idx++) {
4531
- await cooldown();
4532
- const value = array[idx];
4533
- const valid = await predicate(value, idx, array);
4534
- if (valid) {
4535
- result.push(value);
4536
- }
4537
- }
4538
- return result;
4764
+ function asyncFilter(array, predicate) {
4765
+ var i = 0;
4766
+ var result = [];
4767
+ var cooldown = nextTickIteration(10);
4768
+ return new Promise((resolve, reject) => {
4769
+ var processNextBatch = () => {
4770
+ if (i < array.length) {
4771
+ cooldown().then(() => predicate(array[i], i, array)).then((valid) => {
4772
+ if (Boolean(valid)) {
4773
+ result.push(array[i]);
4774
+ }
4775
+ i++;
4776
+ setTimeout(processNextBatch, 0);
4777
+ }).catch(reject);
4778
+ } else {
4779
+ resolve(result);
4780
+ }
4781
+ };
4782
+ processNextBatch();
4783
+ });
4539
4784
  }
4540
4785
 
4541
4786
  function nextTickIteration(amount, delay = "tick") {
@@ -4557,33 +4802,60 @@ function nextTickIteration(amount, delay = "tick") {
4557
4802
  };
4558
4803
  }
4559
4804
 
4560
- async function asyncFind(array, callbackfn) {
4561
- const cooldown = nextTickIteration(10);
4562
- let i = 0;
4563
- while (i < array.length) {
4564
- await cooldown();
4565
- const result = await callbackfn(array[i], i, array);
4566
- if (Boolean(result)) {
4567
- return array[i];
4568
- }
4569
- i++;
4570
- }
4571
- return void 0;
4805
+ function asyncFind(array, callbackfn) {
4806
+ var i = 0;
4807
+ var cooldown = nextTickIteration(10);
4808
+ return new Promise((resolve, reject) => {
4809
+ var processNextBatch = () => {
4810
+ if (i < array.length) {
4811
+ cooldown().then(() => callbackfn(array[i], i, array)).then((result) => {
4812
+ if (Boolean(result)) {
4813
+ resolve(array[i]);
4814
+ } else {
4815
+ i++;
4816
+ setTimeout(processNextBatch, 0);
4817
+ }
4818
+ }).catch(reject);
4819
+ } else {
4820
+ resolve(void 0);
4821
+ }
4822
+ };
4823
+ processNextBatch();
4824
+ });
4572
4825
  }
4573
4826
 
4574
- async function asyncForEach(array, callbackfn, { concurrency = 1 } = {}) {
4575
- const cooldown = nextTickIteration(10);
4576
- let i = 0;
4577
- const handle = (value, index) => {
4578
- return callbackfn(value, i + index, array);
4579
- };
4580
- while (i < array.length) {
4581
- await cooldown();
4582
- const batch = await Promise.all(
4583
- array.slice(i, i + concurrency).map(handle)
4584
- );
4585
- i += batch.length;
4586
- }
4827
+ function asyncForEach(array, callbackfn, { concurrency = 1 } = {}) {
4828
+ concurrency = Math.max(concurrency, 1);
4829
+ var i = 0;
4830
+ var cooldown = nextTickIteration(10);
4831
+ var tasks = Array(concurrency);
4832
+ return new Promise((resolve, reject) => {
4833
+ var processNextBatch = () => {
4834
+ if (i >= array.length) {
4835
+ resolve();
4836
+ return;
4837
+ }
4838
+ cooldown().then(() => {
4839
+ for (var idx = 0; idx < concurrency; idx++) {
4840
+ tasks[idx] = Promise.resolve(i);
4841
+ if (i < array.length) {
4842
+ tasks[idx] = tasks[idx].then(
4843
+ (itemIndex) => callbackfn(array[itemIndex], itemIndex, array)
4844
+ );
4845
+ }
4846
+ i++;
4847
+ }
4848
+ return Promise.all(tasks);
4849
+ }).then(() => {
4850
+ if (i < array.length) {
4851
+ setTimeout(processNextBatch, 0);
4852
+ } else {
4853
+ resolve();
4854
+ }
4855
+ }).catch(reject);
4856
+ };
4857
+ processNextBatch();
4858
+ });
4587
4859
  }
4588
4860
 
4589
4861
  const onError = (error) => {
@@ -4659,20 +4931,27 @@ class Queue {
4659
4931
  constructor(limit) {
4660
4932
  this.#limit = limit;
4661
4933
  }
4662
- async get() {
4934
+ get() {
4935
+ var getItem = () => {
4936
+ const item = this.items.shift();
4937
+ this.#events.emit("get");
4938
+ return Promise.resolve(item);
4939
+ };
4663
4940
  if (this.items.length === 0) {
4664
- await SimpleEventEmitter.once(this.#events, "put");
4941
+ return SimpleEventEmitter.once(this.#events, "put").then(getItem);
4665
4942
  }
4666
- const item = this.items.shift();
4667
- this.#events.emit("get");
4668
- return item;
4943
+ return getItem();
4669
4944
  }
4670
- async put(item) {
4945
+ put(item) {
4946
+ var putItem = () => {
4947
+ this.items.push(item);
4948
+ this.#events.emit("put");
4949
+ return Promise.resolve();
4950
+ };
4671
4951
  if (this.#limit && this.items.length >= this.#limit) {
4672
- await SimpleEventEmitter.once(this.#events, "get");
4952
+ return SimpleEventEmitter.once(this.#events, "get").then(putItem);
4673
4953
  }
4674
- this.items.push(item);
4675
- this.#events.emit("put");
4954
+ return putItem();
4676
4955
  }
4677
4956
  }
4678
4957
 
@@ -4699,37 +4978,56 @@ class AsyncIterableQueue {
4699
4978
  }
4700
4979
  [Symbol.asyncIterator]() {
4701
4980
  return {
4702
- next: async () => {
4981
+ next: () => {
4703
4982
  if (this._closed && this._queue.items.length === 0) {
4704
- return { value: void 0, done: true };
4705
- }
4706
- const item = await this._queue.get();
4707
- if (item === AsyncIterableQueue.QUEUE_END_MARKER && this._closed) {
4708
- return { value: void 0, done: true };
4983
+ return Promise.resolve({ value: void 0, done: true });
4709
4984
  }
4710
- return { value: item, done: false };
4985
+ return this._queue.get().then((item) => {
4986
+ if (item === AsyncIterableQueue.QUEUE_END_MARKER && this._closed) {
4987
+ return { value: void 0, done: true };
4988
+ }
4989
+ return { value: item, done: false };
4990
+ });
4711
4991
  }
4712
4992
  };
4713
4993
  }
4714
4994
  }
4715
4995
 
4716
- async function asyncMap(array, callbackfn, { concurrency = 1 } = {}) {
4717
- let result = [];
4996
+ function asyncMap(array, callbackfn, { concurrency = 1 } = {}) {
4718
4997
  concurrency = Math.max(concurrency, 1);
4719
- const cooldown = nextTickIteration(10);
4720
- let i = 0;
4721
- const handle = (value, index) => {
4722
- return callbackfn(value, i + index, array);
4723
- };
4724
- while (i < array.length) {
4725
- await cooldown();
4726
- const batch = await Promise.all(
4727
- array.slice(i, i + concurrency).map(handle)
4728
- );
4729
- result = result.concat(batch);
4730
- i += batch.length;
4731
- }
4732
- return result;
4998
+ var result = [];
4999
+ var i = 0;
5000
+ var cooldown = nextTickIteration(10);
5001
+ var tasks = Array(concurrency);
5002
+ return new Promise((resolve, reject) => {
5003
+ var processNextBatch = () => {
5004
+ if (i >= array.length) {
5005
+ resolve(result);
5006
+ } else {
5007
+ cooldown().then(() => {
5008
+ for (var idx = 0; idx < concurrency; idx++) {
5009
+ tasks[idx] = Promise.resolve(i);
5010
+ if (i < array.length) {
5011
+ tasks[idx] = tasks[idx].then(
5012
+ (itemIndex) => callbackfn(array[itemIndex], itemIndex, array)
5013
+ ).then((transformed) => {
5014
+ result.push(transformed);
5015
+ });
5016
+ }
5017
+ i++;
5018
+ }
5019
+ return Promise.all(tasks);
5020
+ }).then(() => {
5021
+ if (i < array.length) {
5022
+ setTimeout(processNextBatch, 0);
5023
+ } else {
5024
+ resolve(result);
5025
+ }
5026
+ }).catch(reject);
5027
+ }
5028
+ };
5029
+ processNextBatch();
5030
+ });
4733
5031
  }
4734
5032
 
4735
5033
  class CancellablePromise {
@@ -4876,6 +5174,7 @@ class ResourcePool extends SimpleEventEmitter {
4876
5174
  queueAcquire: [],
4877
5175
  queueDrain: [],
4878
5176
  queueDestroy: [],
5177
+ createPending: 0,
4879
5178
  destroying: false
4880
5179
  };
4881
5180
  }
@@ -4920,23 +5219,24 @@ class ResourcePool extends SimpleEventEmitter {
4920
5219
  * }
4921
5220
  * ```
4922
5221
  */
4923
- async acquire() {
5222
+ acquire() {
4924
5223
  if (this.state.destroying) {
4925
5224
  return this.enqueueAcquireRequest();
4926
5225
  }
4927
5226
  let availableResource = this.tryGetAvailableResource();
4928
5227
  if (availableResource !== null) {
4929
- return availableResource;
4930
- }
4931
- const autoCreatedResource = await this.tryCreateAutoResource();
4932
- if (autoCreatedResource !== null) {
4933
- return autoCreatedResource;
4934
- }
4935
- availableResource = this.tryGetAvailableResource();
4936
- if (availableResource !== null) {
4937
- return availableResource;
5228
+ return Promise.resolve(availableResource);
4938
5229
  }
4939
- return this.enqueueAcquireRequest();
5230
+ return Promise.resolve().then(() => this.tryCreateAutoResource()).then((autoCreatedResource) => {
5231
+ if (autoCreatedResource !== null) {
5232
+ return autoCreatedResource;
5233
+ }
5234
+ availableResource = this.tryGetAvailableResource();
5235
+ if (availableResource !== null) {
5236
+ return availableResource;
5237
+ }
5238
+ return this.enqueueAcquireRequest();
5239
+ });
4940
5240
  }
4941
5241
  /**
4942
5242
  * Returns a resource to the pool, making it available for reuse.
@@ -5010,9 +5310,9 @@ class ResourcePool extends SimpleEventEmitter {
5010
5310
  * - Multiple drain calls can be made concurrently; they will all resolve together
5011
5311
  * - Does not prevent new acquisitions; use destroy() to prevent new usage
5012
5312
  */
5013
- async drain() {
5313
+ drain() {
5014
5314
  if (this.isIdle) {
5015
- return;
5315
+ return Promise.resolve();
5016
5316
  }
5017
5317
  const drainDefer = defer();
5018
5318
  this.state.queueDrain.push(drainDefer);
@@ -5046,24 +5346,22 @@ class ResourcePool extends SimpleEventEmitter {
5046
5346
  * - Resources currently in use will not be force-destroyed; drain() is called first
5047
5347
  * - If destroyResource was not provided, resources are simply discarded
5048
5348
  */
5049
- async destroy(rejectAcquires = false) {
5349
+ destroy(rejectAcquires = false) {
5050
5350
  if (this.state.destroying) {
5051
5351
  return this.enqueueDestroyRequest();
5052
5352
  }
5053
5353
  this.state.destroying = true;
5054
- try {
5055
- await this.drain();
5354
+ return Promise.resolve().then(() => this.drain()).then(() => {
5056
5355
  if (rejectAcquires) {
5057
5356
  this.rejectPendingAcquires();
5058
5357
  }
5059
- await this.destroyAllResources();
5060
- this.resetState();
5061
- } catch (err) {
5358
+ return this.destroyAllResources();
5359
+ }).then(() => this.resetState()).catch((err) => {
5062
5360
  this.emit("error", toError(err));
5063
- } finally {
5361
+ }).finally(() => {
5064
5362
  this.state.destroying = false;
5065
5363
  this.resolveDestroyQueue();
5066
- }
5364
+ });
5067
5365
  }
5068
5366
  tryGetAvailableResource() {
5069
5367
  if (this.state.availableResources.length === 0) {
@@ -5073,13 +5371,20 @@ class ResourcePool extends SimpleEventEmitter {
5073
5371
  this.state.inUseResources.add(resource);
5074
5372
  return resource;
5075
5373
  }
5076
- async tryCreateAutoResource() {
5077
- if (!this.auto || this.state.inUseResources.size >= this.poolSize) {
5078
- return null;
5374
+ isLimitReached() {
5375
+ return this.state.inUseResources.size + this.state.createPending + this.state.availableResources.length >= this.poolSize;
5376
+ }
5377
+ tryCreateAutoResource() {
5378
+ if (!this.auto || this.isLimitReached()) {
5379
+ return Promise.resolve(null);
5079
5380
  }
5080
- const resource = await this.createResource();
5081
- this.state.inUseResources.add(resource);
5082
- return resource;
5381
+ this.state.createPending++;
5382
+ return Promise.resolve().then(() => this.createResource()).then((resource) => {
5383
+ this.state.inUseResources.add(resource);
5384
+ return resource;
5385
+ }).finally(() => {
5386
+ this.state.createPending--;
5387
+ });
5083
5388
  }
5084
5389
  enqueueAcquireRequest() {
5085
5390
  const acquireDefer = defer();
@@ -5114,18 +5419,14 @@ class ResourcePool extends SimpleEventEmitter {
5114
5419
  this.state.queueAcquire.forEach((deferred) => deferred.reject(destroyError));
5115
5420
  this.state.queueAcquire = [];
5116
5421
  }
5117
- async destroyAllResources() {
5422
+ destroyAllResources() {
5118
5423
  if (!this.destroyResource || this.state.availableResources.length === 0) {
5119
- return;
5424
+ return Promise.resolve();
5120
5425
  }
5121
- await asyncForEach(
5426
+ return asyncForEach(
5122
5427
  this.state.availableResources,
5123
- async (resource) => {
5124
- try {
5125
- await this.destroyResource(resource);
5126
- } catch (err) {
5127
- this.emit("error", toError(err));
5128
- }
5428
+ (resource) => {
5429
+ return Promise.resolve().then(() => this.destroyResource(resource)).catch((err) => this.emit("error", toError(err))).then(noop);
5129
5430
  },
5130
5431
  { concurrency: 4 }
5131
5432
  );
@@ -5169,242 +5470,6 @@ function timeout(ms, promiseOrCallback, timeoutError = new AppError(408)) {
5169
5470
  });
5170
5471
  }
5171
5472
 
5172
- function capitalize(str) {
5173
- return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase();
5174
- }
5175
-
5176
- const CASE_SPLIT_PATTERN = /\p{Lu}?\p{Ll}+|[0-9]+|\p{Lu}+(?!\p{Ll})|\p{Emoji_Presentation}|\p{Extended_Pictographic}|\p{L}+/gu;
5177
- function getWords(str) {
5178
- if (!isString(str)) return [];
5179
- return Array.from(str.match(CASE_SPLIT_PATTERN) ?? []);
5180
- }
5181
-
5182
- function camelCase(str) {
5183
- const words = getWords(str);
5184
- if (words.length === 0) {
5185
- return "";
5186
- }
5187
- const [first, ...rest] = words;
5188
- return `${first.toLowerCase()}${rest.map((word) => capitalize(word)).join("")}`;
5189
- }
5190
-
5191
- function convertToUnit(str, unit = "px") {
5192
- if (str == null || str === "") {
5193
- return void 0;
5194
- } else if (isNaN(+str)) {
5195
- return String(str);
5196
- } else {
5197
- return `${Number(str)}${unit}`;
5198
- }
5199
- }
5200
-
5201
- const htmlEscapes = Object.freeze({
5202
- 38: "&amp;",
5203
- // &
5204
- 60: "&lt;",
5205
- // <
5206
- 62: "&gt;",
5207
- // >
5208
- 34: "&quot;",
5209
- // "
5210
- 39: "&#39;"
5211
- // '
5212
- });
5213
- function escapeHtml(unsafe) {
5214
- if (typeof unsafe !== "string") {
5215
- return "";
5216
- }
5217
- let result = "";
5218
- let strLen = unsafe.length;
5219
- let char;
5220
- for (let idx = 0; idx < strLen; idx++) {
5221
- char = unsafe.charCodeAt(idx);
5222
- result += htmlEscapes[char] || String.fromCharCode(char);
5223
- }
5224
- return result;
5225
- }
5226
-
5227
- function escapeNumeric(str) {
5228
- const result = String(str).replace(/\D/g, "");
5229
- if (!result.length) {
5230
- return void 0;
5231
- }
5232
- return result;
5233
- }
5234
-
5235
- function escapeRegExp(str) {
5236
- return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
5237
- }
5238
-
5239
- const vs16RegExp = /\uFE0F/g;
5240
- const zeroWidthJoiner = String.fromCharCode(8205);
5241
- function removeVS16s(rawEmoji) {
5242
- return rawEmoji.indexOf(zeroWidthJoiner) < 0 ? rawEmoji.replace(vs16RegExp, "") : rawEmoji;
5243
- }
5244
- const TWEMOJI_REGEX = /(?:\ud83d\udc68\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83e\uddd1\ud83c[\udffc-\udfff]|\ud83e\uddd1\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83e\uddd1\ud83c[\udffb\udffd-\udfff]|\ud83e\uddd1\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83e\uddd1\ud83c[\udffb\udffc\udffe\udfff]|\ud83e\uddd1\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83e\uddd1\ud83c[\udffb-\udffd\udfff]|\ud83e\uddd1\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83e\uddd1\ud83c[\udffb-\udffe]|\ud83d\udc68\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffc-\udfff]|\ud83d\udc68\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb\udffd-\udfff]|\ud83d\udc68\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb\udffc\udffe\udfff]|\ud83d\udc68\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb-\udffd\udfff]|\ud83d\udc68\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb-\udffe]|\ud83d\udc69\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffc-\udfff]|\ud83d\udc69\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffc-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb\udffd-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffb\udffd-\udfff]|\ud83d\udc69\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb\udffc\udffe\udfff]|\ud83d\udc69\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffb\udffc\udffe\udfff]|\ud83d\udc69\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb-\udffd\udfff]|\ud83d\udc69\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffb-\udffd\udfff]|\ud83d\udc69\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb-\udffe]|\ud83d\udc69\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffb-\udffe]|\ud83e\uddd1\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83e\uddd1\ud83c[\udffc-\udfff]|\ud83e\uddd1\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83e\uddd1\ud83c[\udffb\udffd-\udfff]|\ud83e\uddd1\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83e\uddd1\ud83c[\udffb\udffc\udffe\udfff]|\ud83e\uddd1\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83e\uddd1\ud83c[\udffb-\udffd\udfff]|\ud83e\uddd1\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83e\uddd1\ud83c[\udffb-\udffe]|\ud83e\uddd1\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68|\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d[\udc68\udc69]|\ud83e\udef1\ud83c\udffb\u200d\ud83e\udef2\ud83c[\udffc-\udfff]|\ud83e\udef1\ud83c\udffc\u200d\ud83e\udef2\ud83c[\udffb\udffd-\udfff]|\ud83e\udef1\ud83c\udffd\u200d\ud83e\udef2\ud83c[\udffb\udffc\udffe\udfff]|\ud83e\udef1\ud83c\udffe\u200d\ud83e\udef2\ud83c[\udffb-\udffd\udfff]|\ud83e\udef1\ud83c\udfff\u200d\ud83e\udef2\ud83c[\udffb-\udffe]|\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc68|\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d[\udc68\udc69]|\ud83e\uddd1\u200d\ud83e\udd1d\u200d\ud83e\uddd1|\ud83d\udc6b\ud83c[\udffb-\udfff]|\ud83d\udc6c\ud83c[\udffb-\udfff]|\ud83d\udc6d\ud83c[\udffb-\udfff]|\ud83d\udc8f\ud83c[\udffb-\udfff]|\ud83d\udc91\ud83c[\udffb-\udfff]|\ud83e\udd1d\ud83c[\udffb-\udfff]|\ud83d[\udc6b-\udc6d\udc8f\udc91]|\ud83e\udd1d)|(?:\ud83d[\udc68\udc69]|\ud83e\uddd1)(?:\ud83c[\udffb-\udfff])?\u200d(?:\u2695\ufe0f|\u2696\ufe0f|\u2708\ufe0f|\ud83c[\udf3e\udf73\udf7c\udf84\udf93\udfa4\udfa8\udfeb\udfed]|\ud83d[\udcbb\udcbc\udd27\udd2c\ude80\ude92]|\ud83e[\uddaf-\uddb3\uddbc\uddbd])|(?:\ud83c[\udfcb\udfcc]|\ud83d[\udd74\udd75]|\u26f9)((?:\ud83c[\udffb-\udfff]|\ufe0f)\u200d[\u2640\u2642]\ufe0f)|(?:\ud83c[\udfc3\udfc4\udfca]|\ud83d[\udc6e\udc70\udc71\udc73\udc77\udc81\udc82\udc86\udc87\ude45-\ude47\ude4b\ude4d\ude4e\udea3\udeb4-\udeb6]|\ud83e[\udd26\udd35\udd37-\udd39\udd3d\udd3e\uddb8\uddb9\uddcd-\uddcf\uddd4\uddd6-\udddd])(?:\ud83c[\udffb-\udfff])?\u200d[\u2640\u2642]\ufe0f|(?:\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d[\udc66\udc67]|\ud83c\udff3\ufe0f\u200d\u26a7\ufe0f|\ud83c\udff3\ufe0f\u200d\ud83c\udf08|\ud83d\ude36\u200d\ud83c\udf2b\ufe0f|\u2764\ufe0f\u200d\ud83d\udd25|\u2764\ufe0f\u200d\ud83e\ude79|\ud83c\udff4\u200d\u2620\ufe0f|\ud83d\udc15\u200d\ud83e\uddba|\ud83d\udc3b\u200d\u2744\ufe0f|\ud83d\udc41\u200d\ud83d\udde8|\ud83d\udc68\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\ud83d[\udc66\udc67]|\ud83d\udc6f\u200d\u2640\ufe0f|\ud83d\udc6f\u200d\u2642\ufe0f|\ud83d\ude2e\u200d\ud83d\udca8|\ud83d\ude35\u200d\ud83d\udcab|\ud83e\udd3c\u200d\u2640\ufe0f|\ud83e\udd3c\u200d\u2642\ufe0f|\ud83e\uddde\u200d\u2640\ufe0f|\ud83e\uddde\u200d\u2642\ufe0f|\ud83e\udddf\u200d\u2640\ufe0f|\ud83e\udddf\u200d\u2642\ufe0f|\ud83d\udc08\u200d\u2b1b)|[#*0-9]\ufe0f?\u20e3|(?:[©®\u2122\u265f]\ufe0f)|(?:\ud83c[\udc04\udd70\udd71\udd7e\udd7f\ude02\ude1a\ude2f\ude37\udf21\udf24-\udf2c\udf36\udf7d\udf96\udf97\udf99-\udf9b\udf9e\udf9f\udfcd\udfce\udfd4-\udfdf\udff3\udff5\udff7]|\ud83d[\udc3f\udc41\udcfd\udd49\udd4a\udd6f\udd70\udd73\udd76-\udd79\udd87\udd8a-\udd8d\udda5\udda8\uddb1\uddb2\uddbc\uddc2-\uddc4\uddd1-\uddd3\udddc-\uddde\udde1\udde3\udde8\uddef\uddf3\uddfa\udecb\udecd-\udecf\udee0-\udee5\udee9\udef0\udef3]|[\u203c\u2049\u2139\u2194-\u2199\u21a9\u21aa\u231a\u231b\u2328\u23cf\u23ed-\u23ef\u23f1\u23f2\u23f8-\u23fa\u24c2\u25aa\u25ab\u25b6\u25c0\u25fb-\u25fe\u2600-\u2604\u260e\u2611\u2614\u2615\u2618\u2620\u2622\u2623\u2626\u262a\u262e\u262f\u2638-\u263a\u2640\u2642\u2648-\u2653\u2660\u2663\u2665\u2666\u2668\u267b\u267f\u2692-\u2697\u2699\u269b\u269c\u26a0\u26a1\u26a7\u26aa\u26ab\u26b0\u26b1\u26bd\u26be\u26c4\u26c5\u26c8\u26cf\u26d1\u26d3\u26d4\u26e9\u26ea\u26f0-\u26f5\u26f8\u26fa\u26fd\u2702\u2708\u2709\u270f\u2712\u2714\u2716\u271d\u2721\u2733\u2734\u2744\u2747\u2757\u2763\u2764\u27a1\u2934\u2935\u2b05-\u2b07\u2b1b\u2b1c\u2b50\u2b55\u3030\u303d\u3297\u3299])(?:\ufe0f|(?!\ufe0e))|(?:(?:\ud83c[\udfcb\udfcc]|\ud83d[\udd74\udd75\udd90]|[\u261d\u26f7\u26f9\u270c\u270d])(?:\ufe0f|(?!\ufe0e))|(?:\ud83c[\udf85\udfc2-\udfc4\udfc7\udfca]|\ud83d[\udc42\udc43\udc46-\udc50\udc66-\udc69\udc6e\udc70-\udc78\udc7c\udc81-\udc83\udc85-\udc87\udcaa\udd7a\udd95\udd96\ude45-\ude47\ude4b-\ude4f\udea3\udeb4-\udeb6\udec0\udecc]|\ud83e[\udd0c\udd0f\udd18-\udd1c\udd1e\udd1f\udd26\udd30-\udd39\udd3d\udd3e\udd77\uddb5\uddb6\uddb8\uddb9\uddbb\uddcd-\uddcf\uddd1-\udddd\udec3-\udec5\udef0-\udef6]|[\u270a\u270b]))(?:\ud83c[\udffb-\udfff])?|(?:\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f|\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc73\udb40\udc63\udb40\udc74\udb40\udc7f|\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc77\udb40\udc6c\udb40\udc73\udb40\udc7f|\ud83c\udde6\ud83c[\udde8-\uddec\uddee\uddf1\uddf2\uddf4\uddf6-\uddfa\uddfc\uddfd\uddff]|\ud83c\udde7\ud83c[\udde6\udde7\udde9-\uddef\uddf1-\uddf4\uddf6-\uddf9\uddfb\uddfc\uddfe\uddff]|\ud83c\udde8\ud83c[\udde6\udde8\udde9\uddeb-\uddee\uddf0-\uddf5\uddf7\uddfa-\uddff]|\ud83c\udde9\ud83c[\uddea\uddec\uddef\uddf0\uddf2\uddf4\uddff]|\ud83c\uddea\ud83c[\udde6\udde8\uddea\uddec\udded\uddf7-\uddfa]|\ud83c\uddeb\ud83c[\uddee-\uddf0\uddf2\uddf4\uddf7]|\ud83c\uddec\ud83c[\udde6\udde7\udde9-\uddee\uddf1-\uddf3\uddf5-\uddfa\uddfc\uddfe]|\ud83c\udded\ud83c[\uddf0\uddf2\uddf3\uddf7\uddf9\uddfa]|\ud83c\uddee\ud83c[\udde8-\uddea\uddf1-\uddf4\uddf6-\uddf9]|\ud83c\uddef\ud83c[\uddea\uddf2\uddf4\uddf5]|\ud83c\uddf0\ud83c[\uddea\uddec-\uddee\uddf2\uddf3\uddf5\uddf7\uddfc\uddfe\uddff]|\ud83c\uddf1\ud83c[\udde6-\udde8\uddee\uddf0\uddf7-\uddfb\uddfe]|\ud83c\uddf2\ud83c[\udde6\udde8-\udded\uddf0-\uddff]|\ud83c\uddf3\ud83c[\udde6\udde8\uddea-\uddec\uddee\uddf1\uddf4\uddf5\uddf7\uddfa\uddff]|\ud83c\uddf4\ud83c\uddf2|\ud83c\uddf5\ud83c[\udde6\uddea-\udded\uddf0-\uddf3\uddf7-\uddf9\uddfc\uddfe]|\ud83c\uddf6\ud83c\udde6|\ud83c\uddf7\ud83c[\uddea\uddf4\uddf8\uddfa\uddfc]|\ud83c\uddf8\ud83c[\udde6-\uddea\uddec-\uddf4\uddf7-\uddf9\uddfb\uddfd-\uddff]|\ud83c\uddf9\ud83c[\udde6\udde8\udde9\uddeb-\udded\uddef-\uddf4\uddf7\uddf9\uddfb\uddfc\uddff]|\ud83c\uddfa\ud83c[\udde6\uddec\uddf2\uddf3\uddf8\uddfe\uddff]|\ud83c\uddfb\ud83c[\udde6\udde8\uddea\uddec\uddee\uddf3\uddfa]|\ud83c\uddfc\ud83c[\uddeb\uddf8]|\ud83c\uddfd\ud83c\uddf0|\ud83c\uddfe\ud83c[\uddea\uddf9]|\ud83c\uddff\ud83c[\udde6\uddf2\uddfc]|\ud83c[\udccf\udd8e\udd91-\udd9a\udde6-\uddff\ude01\ude32-\ude36\ude38-\ude3a\ude50\ude51\udf00-\udf20\udf2d-\udf35\udf37-\udf7c\udf7e-\udf84\udf86-\udf93\udfa0-\udfc1\udfc5\udfc6\udfc8\udfc9\udfcf-\udfd3\udfe0-\udff0\udff4\udff8-\udfff]|\ud83d[\udc00-\udc3e\udc40\udc44\udc45\udc51-\udc65\udc6a\udc6f\udc79-\udc7b\udc7d-\udc80\udc84\udc88-\udc8e\udc90\udc92-\udca9\udcab-\udcfc\udcff-\udd3d\udd4b-\udd4e\udd50-\udd67\udda4\uddfb-\ude44\ude48-\ude4a\ude80-\udea2\udea4-\udeb3\udeb7-\udebf\udec1-\udec5\uded0-\uded2\uded5-\uded7\udedd-\udedf\udeeb\udeec\udef4-\udefc\udfe0-\udfeb\udff0]|\ud83e[\udd0d\udd0e\udd10-\udd17\udd20-\udd25\udd27-\udd2f\udd3a\udd3c\udd3f-\udd45\udd47-\udd76\udd78-\uddb4\uddb7\uddba\uddbc-\uddcc\uddd0\uddde-\uddff\ude70-\ude74\ude78-\ude7c\ude80-\ude86\ude90-\udeac\udeb0-\udeba\udec0-\udec2\uded0-\uded9\udee0-\udee7]|[\u23e9-\u23ec\u23f0\u23f3\u267e\u26ce\u2705\u2728\u274c\u274e\u2753-\u2755\u2795-\u2797\u27b0\u27bf\ue50a])|\ufe0f/g;
5245
-
5246
- function isOneEmoji(text) {
5247
- return !!(typeof text === "string" && text && (text.match(TWEMOJI_REGEX) || [])[0]?.length === text.length);
5248
- }
5249
-
5250
- const IGNORED_TITLES = Object.freeze(
5251
- /* @__PURE__ */ new Set([
5252
- "dr.",
5253
- "mr.",
5254
- "mrs.",
5255
- "miss",
5256
- "ms.",
5257
- "prof.",
5258
- "sir",
5259
- "rev.",
5260
- "hon."
5261
- ])
5262
- );
5263
- function getInitials(fullName) {
5264
- if (!isString(fullName)) return "";
5265
- let [first, ...rest] = fullName.replace(/\s{2,}/g, " ").replace(/[,+/#!$@%^&*;:{}=\-_`~()]/g, "").trim().split(" ").filter((word) => !IGNORED_TITLES.has(word.toLowerCase())).map((v) => v.replaceAll(".", "").trim()).filter(Boolean);
5266
- let last = rest[rest.length - 1];
5267
- if (rest.length > 1) {
5268
- if (isOneEmoji(first)) {
5269
- first = rest[0];
5270
- } else if (isOneEmoji(last)) {
5271
- last = rest[0];
5272
- }
5273
- }
5274
- return [first, last].filter(Boolean).map((letter = "") => [...letter.toUpperCase()][0]).join("");
5275
- }
5276
-
5277
- const byteToHex = [];
5278
- for (let n = 0; n <= 255; ++n) {
5279
- const hexOctet = n.toString(16).padStart(2, "0");
5280
- byteToHex.push(hexOctet);
5281
- }
5282
- function hex(value) {
5283
- const buff = Array.isArray(value) ? new Uint8Array(value) : value;
5284
- const hexOctets = new Array(buff.length);
5285
- for (let i = 0; i < buff.length; ++i) {
5286
- hexOctets[i] = byteToHex[buff[i]];
5287
- }
5288
- return hexOctets.join("");
5289
- }
5290
-
5291
- function isoToFlagEmoji(iso) {
5292
- const code = iso.toUpperCase();
5293
- if (!/^[A-Z]{2}$/.test(code)) return iso;
5294
- const codePoints = [...code].map((c) => c.codePointAt(0) + 127397);
5295
- return String.fromCodePoint(...codePoints);
5296
- }
5297
-
5298
- function kebabCase(str) {
5299
- const words = getWords(str);
5300
- return words.map((word) => word.toLowerCase()).join("-");
5301
- }
5302
-
5303
- const lowerCase = (str) => {
5304
- return getWords(str).map((word) => word.toLowerCase()).join(" ");
5305
- };
5306
-
5307
- function maskingWords(value, withChar = "*") {
5308
- return getWords(value).map((word) => {
5309
- const len = word.length;
5310
- if (len < 2) {
5311
- return "".padEnd(len, withChar);
5312
- } else if (len < 3) {
5313
- return word[0].padEnd(len, withChar);
5314
- } else {
5315
- return word[0].padEnd(len - 2, withChar) + word.at(-1);
5316
- }
5317
- }).join(" ");
5318
- }
5319
-
5320
- function maskingEmail(value) {
5321
- if (!isString(value)) return "";
5322
- const [username, host] = value.split("@", 2);
5323
- if (!username || !host) return "";
5324
- return `${maskingWords(username)}@${host}`;
5325
- }
5326
-
5327
- function maskingPhone(value, fromPosition = 2, toPosition = 4, withChar = "X") {
5328
- if (!isString(value)) return "";
5329
- const numbersAmount = value.replace(/\D/g, "").length;
5330
- const fromIdx = fromPosition - 1;
5331
- let toIdx = numbersAmount - toPosition;
5332
- if (toIdx <= 0) {
5333
- toIdx = numbersAmount;
5334
- }
5335
- let i = -1;
5336
- return value.replace(/\d/g, (char) => {
5337
- i++;
5338
- return i > fromIdx && i < toIdx ? withChar : char;
5339
- });
5340
- }
5341
-
5342
- let index = Math.floor(Math.random() * 16777215);
5343
- const buffer = new Uint8Array(12);
5344
- function objectId(fromValue = Date.now()) {
5345
- const value = timestamp(fromValue);
5346
- const inc = getInc();
5347
- buffer[0] = value >> 24;
5348
- buffer[1] = value >> 16;
5349
- buffer[2] = value >> 8;
5350
- buffer[3] = value;
5351
- buffer[4] = Math.floor(Math.random() * 256);
5352
- buffer[5] = Math.floor(Math.random() * 256);
5353
- buffer[6] = Math.floor(Math.random() * 256);
5354
- buffer[7] = Math.floor(Math.random() * 256);
5355
- buffer[8] = Math.floor(Math.random() * 256);
5356
- buffer[11] = inc & 255;
5357
- buffer[10] = inc >> 8 & 255;
5358
- buffer[9] = inc >> 16 & 255;
5359
- return hex(buffer);
5360
- }
5361
- function getInc() {
5362
- return index = (index + 1) % 16777215;
5363
- }
5364
-
5365
- const snakeCase = (str) => {
5366
- return getWords(str).map((word) => word.toLowerCase()).join("_");
5367
- };
5368
-
5369
- const startCase = (value) => {
5370
- return getWords(value).map(capitalize).join(" ");
5371
- };
5372
-
5373
- const DEF_STR_ASSIGN_REGEXP = /\{{([A-z-_. ]*)\}}/g;
5374
- const DEF_STR_ASSIGN_METHOD = (obj, key) => obj[key];
5375
- function strAssign(str, obj, method = DEF_STR_ASSIGN_METHOD) {
5376
- return str.replace(DEF_STR_ASSIGN_REGEXP, (match, p1) => {
5377
- const key = p1.trim();
5378
- const value = method(obj, key);
5379
- if (value === void 0 || value === null) {
5380
- return match;
5381
- }
5382
- return value;
5383
- });
5384
- }
5385
-
5386
- function truncate(value, maxLength = 120, insignificantThreshold = 0.05) {
5387
- if (!shouldTruncate(value, maxLength, insignificantThreshold)) {
5388
- return value;
5389
- }
5390
- let truncated = value.slice(0, maxLength).trim();
5391
- const lastSpace = truncated.lastIndexOf(" ");
5392
- if (lastSpace > 0) {
5393
- truncated = truncated.slice(0, lastSpace);
5394
- }
5395
- return `${truncated}...`;
5396
- }
5397
- function shouldTruncate(text, maxLength, insignificantThreshold) {
5398
- return text.length - maxLength > maxLength * insignificantThreshold;
5399
- }
5400
-
5401
- function wrapText(value, maxLength = 30) {
5402
- if (value.length > maxLength) {
5403
- return value.slice(0, maxLength) + "...";
5404
- }
5405
- return value;
5406
- }
5407
-
5408
5473
  exports.AppError = AppError;
5409
5474
  exports.AsyncIterableQueue = AsyncIterableQueue;
5410
5475
  exports.BrowserAssertionError = BrowserAssertionError;
@@ -5597,6 +5662,8 @@ exports.sprintf = sprintf;
5597
5662
  exports.startCase = startCase;
5598
5663
  exports.strAssign = strAssign;
5599
5664
  exports.sum = sum;
5665
+ exports.textDecoder = textDecoder;
5666
+ exports.textEncoder = textEncoder;
5600
5667
  exports.throttle = throttle;
5601
5668
  exports.timeFromMinutes = timeFromMinutes;
5602
5669
  exports.timeStringify = timeStringify;