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