@ztimson/utils 0.26.26 → 0.27.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.mjs CHANGED
@@ -896,6 +896,33 @@ function toCsv(target, flatten = true) {
896
896
  }).join(","))
897
897
  ].join("\n");
898
898
  }
899
+ function dec2Frac(num, maxDen = 1e3) {
900
+ let sign = Math.sign(num);
901
+ num = Math.abs(num);
902
+ if (Number.isInteger(num)) return sign * num + "";
903
+ let closest = { n: 0, d: 1, diff: Math.abs(num) };
904
+ for (let d = 1; d <= maxDen; d++) {
905
+ let n = Math.round(num * d);
906
+ let diff = Math.abs(num - n / d);
907
+ if (diff < closest.diff) {
908
+ closest = { n, d, diff };
909
+ if (diff < 1e-8) break;
910
+ }
911
+ }
912
+ let integer = Math.floor(closest.n / closest.d);
913
+ let numerator = closest.n - integer * closest.d;
914
+ return (sign < 0 ? "-" : "") + (integer ? integer + " " : "") + (numerator ? numerator + "/" + closest.d : "");
915
+ }
916
+ function fracToDec(frac) {
917
+ let split = frac.split(" ");
918
+ const whole = split.length == 2 ? Number(split[0]) : 0;
919
+ split = split.pop().split("/");
920
+ return whole + Number(split[0]) / Number(split[1]);
921
+ }
922
+ function numSuffix(n) {
923
+ const s = ["th", "st", "nd", "rd"], v = n % 100;
924
+ return `${n}${s[(v - 20) % 10] || s[v] || s[0]}`;
925
+ }
899
926
  function adjustedInterval(cb, ms) {
900
927
  let cancel = false, timeout = null;
901
928
  const p = async () => {
@@ -911,103 +938,101 @@ function adjustedInterval(cb, ms) {
911
938
  if (timeout) clearTimeout(timeout);
912
939
  };
913
940
  }
914
- function formatDate(format = "YYYY-MM-DD H:mm", date = /* @__PURE__ */ new Date(), tz) {
915
- const timezones = [
916
- ["IDLW", -12],
917
- ["SST", -11],
918
- ["HST", -10],
919
- ["AKST", -9],
920
- ["PST", -8],
921
- ["MST", -7],
922
- ["CST", -6],
923
- ["EST", -5],
924
- ["AST", -4],
925
- ["BRT", -3],
926
- ["MAT", -2],
927
- ["AZOT", -1],
928
- ["UTC", 0],
929
- ["CET", 1],
930
- ["EET", 2],
931
- ["MSK", 3],
932
- ["AST", 4],
933
- ["PKT", 5],
934
- ["IST", 5.5],
935
- ["BST", 6],
936
- ["ICT", 7],
937
- ["CST", 8],
938
- ["JST", 9],
939
- ["AEST", 10],
940
- ["SBT", 11],
941
- ["FJT", 12],
942
- ["TOT", 13],
943
- ["LINT", 14]
944
- ];
945
- function adjustTz(date2, gmt) {
946
- const currentOffset = date2.getTimezoneOffset();
947
- const adjustedOffset = gmt * 60;
948
- return new Date(date2.getTime() + (adjustedOffset + currentOffset) * 6e4);
949
- }
950
- function day(num) {
951
- return ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"][num] || "Unknown";
952
- }
953
- function doy(date2) {
954
- const start = /* @__PURE__ */ new Date(`${date2.getFullYear()}-01-01 0:00:00`);
955
- return Math.ceil((date2.getTime() - start.getTime()) / (1e3 * 60 * 60 * 24));
956
- }
957
- function month(num) {
958
- return ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"][num] || "Unknown";
959
- }
960
- function suffix(num) {
961
- if (num % 100 >= 11 && num % 100 <= 13) return `${num}th`;
962
- switch (num % 10) {
963
- case 1:
964
- return `${num}st`;
965
- case 2:
966
- return `${num}nd`;
967
- case 3:
968
- return `${num}rd`;
969
- default:
970
- return `${num}th`;
941
+ function dayOfWeek(d) {
942
+ return ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"][d];
943
+ }
944
+ function dayOfYear(date) {
945
+ const start = new Date(Date.UTC(date.getUTCFullYear(), 0, 1));
946
+ return Math.ceil((date.getTime() - start.getTime()) / (1e3 * 60 * 60 * 24));
947
+ }
948
+ function formatDate(format = "YYYY-MM-DD H:mm", date = /* @__PURE__ */ new Date(), tz = "local") {
949
+ var _a;
950
+ if (typeof date === "number" || typeof date === "string") date = new Date(date);
951
+ if (isNaN(date.getTime())) throw new Error("Invalid date input");
952
+ const numericTz = typeof tz === "number";
953
+ const localTz = tz === "local" || !numericTz && ((_a = tz.toLowerCase) == null ? void 0 : _a.call(tz)) === "local";
954
+ const tzName = localTz ? Intl.DateTimeFormat().resolvedOptions().timeZone : numericTz ? "UTC" : tz;
955
+ if (!numericTz && tzName !== "UTC") {
956
+ try {
957
+ new Intl.DateTimeFormat("en-US", { timeZone: tzName }).format();
958
+ } catch {
959
+ throw new Error(`Invalid timezone: ${tzName}`);
960
+ }
961
+ }
962
+ let zonedDate = new Date(date);
963
+ if (!numericTz && tzName !== "UTC") {
964
+ const parts = new Intl.DateTimeFormat("en-US", {
965
+ timeZone: tzName,
966
+ year: "numeric",
967
+ month: "2-digit",
968
+ day: "2-digit",
969
+ hour: "2-digit",
970
+ minute: "2-digit",
971
+ second: "2-digit",
972
+ hour12: false
973
+ }).formatToParts(date);
974
+ const get2 = (type) => {
975
+ var _a2;
976
+ return (_a2 = parts.find((p) => p.type === type)) == null ? void 0 : _a2.value;
977
+ };
978
+ const build = `${get2("year")}-${get2("month")}-${get2("day")}T${get2("hour")}:${get2("minute")}:${get2("second")}Z`;
979
+ zonedDate = new Date(build);
980
+ } else if (numericTz || tzName === "UTC") {
981
+ const offset = numericTz ? tz : 0;
982
+ zonedDate = new Date(date.getTime() + offset * 60 * 60 * 1e3);
983
+ }
984
+ const get = (fn2) => numericTz || tzName === "UTC" ? zonedDate[`getUTC${fn2}`]() : zonedDate[`get${fn2}`]();
985
+ function getTZOffset() {
986
+ var _a2, _b;
987
+ if (numericTz) {
988
+ const total = tz * 60;
989
+ const hours = Math.floor(Math.abs(total) / 60);
990
+ const mins = Math.abs(total) % 60;
991
+ return `${tz >= 0 ? "+" : "-"}${String(hours).padStart(2, "0")}:${String(mins).padStart(2, "0")}`;
992
+ }
993
+ try {
994
+ const offset = (_b = (_a2 = new Intl.DateTimeFormat("en-US", { timeZone: tzName, timeZoneName: "longOffset", hour: "2-digit", minute: "2-digit" }).formatToParts(date).find((p) => p.type === "timeZoneName")) == null ? void 0 : _a2.value.match(/([+-]\d{2}:\d{2})/)) == null ? void 0 : _b[1];
995
+ if (offset) return offset;
996
+ } catch {
997
+ }
998
+ return "+00:00";
999
+ }
1000
+ function getTZAbbr() {
1001
+ var _a2;
1002
+ if (numericTz && tz === 0) return "UTC";
1003
+ try {
1004
+ return ((_a2 = new Intl.DateTimeFormat("en-US", { timeZone: tzName, timeZoneName: "short" }).formatToParts(date).find((p) => p.type === "timeZoneName")) == null ? void 0 : _a2.value) || "";
1005
+ } catch {
1006
+ return tzName;
971
1007
  }
972
1008
  }
973
- function tzOffset(offset) {
974
- const hours = ~~(offset / 60);
975
- const minutes = offset % 60;
976
- return (offset > 0 ? "-" : "") + `${hours}:${minutes.toString().padStart(2, "0")}`;
977
- }
978
- if (typeof date == "number" || typeof date == "string" || date == null) date = new Date(date);
979
- let t;
980
- if (tz == null) tz = -(date.getTimezoneOffset() / 60);
981
- t = timezones.find((t2) => isNaN(tz) ? t2[0] == tz : t2[1] == tz);
982
- if (!t) throw new Error(`Unknown timezone: ${tz}`);
983
- date = adjustTz(date, t[1]);
984
1009
  const tokens = {
985
- "YYYY": date.getFullYear().toString(),
986
- "YY": date.getFullYear().toString().slice(2),
987
- "MMMM": month(date.getMonth()),
988
- "MMM": month(date.getMonth()).slice(0, 3),
989
- "MM": (date.getMonth() + 1).toString().padStart(2, "0"),
990
- "M": (date.getMonth() + 1).toString(),
991
- "DDD": doy(date).toString(),
992
- "DD": date.getDate().toString().padStart(2, "0"),
993
- "Do": suffix(date.getDate()),
994
- "D": date.getDate().toString(),
995
- "dddd": day(date.getDay()),
996
- "ddd": day(date.getDay()).slice(0, 3),
997
- "HH": date.getHours().toString().padStart(2, "0"),
998
- "H": date.getHours().toString(),
999
- "hh": (date.getHours() % 12 || 12).toString().padStart(2, "0"),
1000
- "h": (date.getHours() % 12 || 12).toString(),
1001
- "mm": date.getMinutes().toString().padStart(2, "0"),
1002
- "m": date.getMinutes().toString(),
1003
- "ss": date.getSeconds().toString().padStart(2, "0"),
1004
- "s": date.getSeconds().toString(),
1005
- "SSS": date.getMilliseconds().toString().padStart(3, "0"),
1006
- "A": date.getHours() >= 12 ? "PM" : "AM",
1007
- "a": date.getHours() >= 12 ? "pm" : "am",
1008
- "ZZ": tzOffset(t[1] * 60).replace(":", ""),
1009
- "Z": tzOffset(t[1] * 60),
1010
- "z": typeof tz == "string" ? tz : t[0]
1010
+ YYYY: get("FullYear").toString(),
1011
+ YY: get("FullYear").toString().slice(2),
1012
+ MMMM: month(get("Month")),
1013
+ MMM: month(get("Month")).slice(0, 3),
1014
+ MM: (get("Month") + 1).toString().padStart(2, "0"),
1015
+ M: (get("Month") + 1).toString(),
1016
+ DDD: dayOfYear(zonedDate).toString(),
1017
+ DD: get("Date").toString().padStart(2, "0"),
1018
+ Do: numSuffix(get("Date")),
1019
+ D: get("Date").toString(),
1020
+ dddd: dayOfWeek(get("Day")),
1021
+ ddd: dayOfWeek(get("Day")).slice(0, 3),
1022
+ HH: get("Hours").toString().padStart(2, "0"),
1023
+ H: get("Hours").toString(),
1024
+ hh: (get("Hours") % 12 || 12).toString().padStart(2, "0"),
1025
+ h: (get("Hours") % 12 || 12).toString(),
1026
+ mm: get("Minutes").toString().padStart(2, "0"),
1027
+ m: get("Minutes").toString(),
1028
+ ss: get("Seconds").toString().padStart(2, "0"),
1029
+ s: get("Seconds").toString(),
1030
+ SSS: get("Milliseconds").toString().padStart(3, "0"),
1031
+ A: get("Hours") >= 12 ? "PM" : "AM",
1032
+ a: get("Hours") >= 12 ? "pm" : "am",
1033
+ ZZ: getTZOffset().replace(":", ""),
1034
+ Z: getTZOffset(),
1035
+ z: getTZAbbr()
1011
1036
  };
1012
1037
  return format.replace(/YYYY|YY|MMMM|MMM|MM|M|DDD|DD|Do|D|dddd|ddd|HH|H|hh|h|mm|m|ss|s|SSS|A|a|ZZ|Z|z/g, (token) => tokens[token]);
1013
1038
  }
@@ -1015,6 +1040,9 @@ function instantInterval(fn2, interval) {
1015
1040
  fn2();
1016
1041
  return setInterval(fn2, interval);
1017
1042
  }
1043
+ function month(m) {
1044
+ return ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"][m];
1045
+ }
1018
1046
  function sleep(ms) {
1019
1047
  return new Promise((res) => setTimeout(res, ms));
1020
1048
  }
@@ -1763,29 +1791,6 @@ const _Logger = class _Logger extends TypedEmitter {
1763
1791
  };
1764
1792
  __publicField(_Logger, "LOG_LEVEL", 4);
1765
1793
  let Logger = _Logger;
1766
- function dec2Frac(num, maxDen = 1e3) {
1767
- let sign = Math.sign(num);
1768
- num = Math.abs(num);
1769
- if (Number.isInteger(num)) return sign * num + "";
1770
- let closest = { n: 0, d: 1, diff: Math.abs(num) };
1771
- for (let d = 1; d <= maxDen; d++) {
1772
- let n = Math.round(num * d);
1773
- let diff = Math.abs(num - n / d);
1774
- if (diff < closest.diff) {
1775
- closest = { n, d, diff };
1776
- if (diff < 1e-8) break;
1777
- }
1778
- }
1779
- let integer = Math.floor(closest.n / closest.d);
1780
- let numerator = closest.n - integer * closest.d;
1781
- return (sign < 0 ? "-" : "") + (integer ? integer + " " : "") + (numerator ? numerator + "/" + closest.d : "");
1782
- }
1783
- function fracToDec(frac) {
1784
- let split = frac.split(" ");
1785
- const whole = split.length == 2 ? Number(split[0]) : 0;
1786
- split = split.pop().split("/");
1787
- return whole + Number(split[0]) / Number(split[1]);
1788
- }
1789
1794
  function compareVersions(target, vs) {
1790
1795
  const [tMajor, tMinor, tPatch] = target.split(".").map((v) => +v.replace(/[^0-9]/g, ""));
1791
1796
  const [vMajor, vMinor, vPatch] = vs.split(".").map((v) => +v.replace(/[^0-9]/g, ""));
@@ -2379,6 +2384,8 @@ export {
2379
2384
  compareVersions,
2380
2385
  contrast,
2381
2386
  createJwt,
2387
+ dayOfWeek,
2388
+ dayOfYear,
2382
2389
  dec2Frac,
2383
2390
  decodeJwt,
2384
2391
  deepCopy,
@@ -2415,6 +2422,8 @@ export {
2415
2422
  matchAll,
2416
2423
  md5,
2417
2424
  mixin,
2425
+ month,
2426
+ numSuffix,
2418
2427
  pad,
2419
2428
  parseUrl,
2420
2429
  pascalCase,