@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 +126 -117
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +126 -117
- package/dist/index.mjs.map +1 -1
- package/dist/math.d.ts +10 -0
- package/dist/time.d.ts +3 -0
- package/package.json +1 -1
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
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
const
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
const
|
|
959
|
-
|
|
960
|
-
}
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
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
|
-
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
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;
|