@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.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
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
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
|
-
const
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
const
|
|
955
|
-
|
|
956
|
-
}
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
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
|
-
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
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,
|