@ztimson/utils 0.27.2 → 0.27.4
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 +77 -37
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +77 -37
- package/dist/index.mjs.map +1 -1
- package/dist/objects.d.ts +1 -1
- package/package.json +1 -1
package/dist/index.mjs
CHANGED
|
@@ -118,7 +118,19 @@ ${opts.message || this.desc}`;
|
|
|
118
118
|
}
|
|
119
119
|
}
|
|
120
120
|
function applyDeltas(base, ...deltas) {
|
|
121
|
-
|
|
121
|
+
function applyDelta(base2, delta) {
|
|
122
|
+
if (delta === null) return null;
|
|
123
|
+
if (typeof base2 !== "object" || base2 === null) return delta === void 0 ? base2 : delta;
|
|
124
|
+
const result = Array.isArray(base2) ? [...base2] : { ...base2 };
|
|
125
|
+
for (const key in delta) {
|
|
126
|
+
const val = delta[key];
|
|
127
|
+
if (val === void 0) delete result[key];
|
|
128
|
+
else if (typeof val === "object" && val !== null && !Array.isArray(val)) result[key] = applyDelta(result[key], val);
|
|
129
|
+
else result[key] = val;
|
|
130
|
+
}
|
|
131
|
+
return result;
|
|
132
|
+
}
|
|
133
|
+
for (const d of deltas.flat()) base = applyDelta(base, (d == null ? void 0 : d.delta) ?? d);
|
|
122
134
|
return base;
|
|
123
135
|
}
|
|
124
136
|
function calcDelta(old, updated) {
|
|
@@ -877,33 +889,6 @@ function toCsv(target, flatten = true) {
|
|
|
877
889
|
}).join(","))
|
|
878
890
|
].join("\n");
|
|
879
891
|
}
|
|
880
|
-
function dec2Frac(num, maxDen = 1e3) {
|
|
881
|
-
let sign = Math.sign(num);
|
|
882
|
-
num = Math.abs(num);
|
|
883
|
-
if (Number.isInteger(num)) return sign * num + "";
|
|
884
|
-
let closest = { n: 0, d: 1, diff: Math.abs(num) };
|
|
885
|
-
for (let d = 1; d <= maxDen; d++) {
|
|
886
|
-
let n = Math.round(num * d);
|
|
887
|
-
let diff = Math.abs(num - n / d);
|
|
888
|
-
if (diff < closest.diff) {
|
|
889
|
-
closest = { n, d, diff };
|
|
890
|
-
if (diff < 1e-8) break;
|
|
891
|
-
}
|
|
892
|
-
}
|
|
893
|
-
let integer = Math.floor(closest.n / closest.d);
|
|
894
|
-
let numerator = closest.n - integer * closest.d;
|
|
895
|
-
return (sign < 0 ? "-" : "") + (integer ? integer + " " : "") + (numerator ? numerator + "/" + closest.d : "");
|
|
896
|
-
}
|
|
897
|
-
function fracToDec(frac) {
|
|
898
|
-
let split = frac.split(" ");
|
|
899
|
-
const whole = split.length == 2 ? Number(split[0]) : 0;
|
|
900
|
-
split = split.pop().split("/");
|
|
901
|
-
return whole + Number(split[0]) / Number(split[1]);
|
|
902
|
-
}
|
|
903
|
-
function numSuffix(n) {
|
|
904
|
-
const s = ["th", "st", "nd", "rd"], v = n % 100;
|
|
905
|
-
return `${n}${s[(v - 20) % 10] || s[v] || s[0]}`;
|
|
906
|
-
}
|
|
907
892
|
function adjustedInterval(cb, ms) {
|
|
908
893
|
let cancel = false, timeout = null;
|
|
909
894
|
const p = async () => {
|
|
@@ -941,28 +926,56 @@ function formatDate(format = "YYYY-MM-DD H:mm", date = /* @__PURE__ */ new Date(
|
|
|
941
926
|
}
|
|
942
927
|
}
|
|
943
928
|
let zonedDate = new Date(date);
|
|
929
|
+
let get;
|
|
930
|
+
const partsMap = {};
|
|
944
931
|
if (!numericTz && tzName !== "UTC") {
|
|
945
932
|
const parts = new Intl.DateTimeFormat("en-US", {
|
|
946
933
|
timeZone: tzName,
|
|
947
934
|
year: "numeric",
|
|
948
935
|
month: "2-digit",
|
|
949
936
|
day: "2-digit",
|
|
937
|
+
weekday: "long",
|
|
950
938
|
hour: "2-digit",
|
|
951
939
|
minute: "2-digit",
|
|
952
940
|
second: "2-digit",
|
|
953
941
|
hour12: false
|
|
954
942
|
}).formatToParts(date);
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
943
|
+
parts.forEach((p) => {
|
|
944
|
+
partsMap[p.type] = p.value;
|
|
945
|
+
});
|
|
946
|
+
const monthValue = parseInt(partsMap.month) - 1;
|
|
947
|
+
const dayOfWeekValue = (/* @__PURE__ */ new Date(`${partsMap.year}-${partsMap.month}-${partsMap.day}`)).getDay();
|
|
948
|
+
const hourValue = parseInt(partsMap.hour);
|
|
949
|
+
get = (fn2) => {
|
|
950
|
+
switch (fn2) {
|
|
951
|
+
case "FullYear":
|
|
952
|
+
return parseInt(partsMap.year);
|
|
953
|
+
case "Month":
|
|
954
|
+
return monthValue;
|
|
955
|
+
case "Date":
|
|
956
|
+
return parseInt(partsMap.day);
|
|
957
|
+
case "Day":
|
|
958
|
+
return dayOfWeekValue;
|
|
959
|
+
case "Hours":
|
|
960
|
+
return hourValue;
|
|
961
|
+
case "Minutes":
|
|
962
|
+
return parseInt(partsMap.minute);
|
|
963
|
+
case "Seconds":
|
|
964
|
+
return parseInt(partsMap.second);
|
|
965
|
+
default:
|
|
966
|
+
return 0;
|
|
967
|
+
}
|
|
958
968
|
};
|
|
959
|
-
|
|
960
|
-
zonedDate = new Date(build);
|
|
961
|
-
} else if (numericTz || tzName === "UTC") {
|
|
969
|
+
} else {
|
|
962
970
|
const offset = numericTz ? tz : 0;
|
|
963
971
|
zonedDate = new Date(date.getTime() + offset * 60 * 60 * 1e3);
|
|
972
|
+
get = (fn2) => zonedDate[`getUTC${fn2}`]();
|
|
973
|
+
}
|
|
974
|
+
function numSuffix2(n) {
|
|
975
|
+
const s = ["th", "st", "nd", "rd"];
|
|
976
|
+
const v = n % 100;
|
|
977
|
+
return n + (s[(v - 20) % 10] || s[v] || s[0]);
|
|
964
978
|
}
|
|
965
|
-
const get = (fn2) => numericTz || tzName === "UTC" ? zonedDate[`getUTC${fn2}`]() : zonedDate[`get${fn2}`]();
|
|
966
979
|
function getTZOffset() {
|
|
967
980
|
var _a2, _b;
|
|
968
981
|
if (numericTz) {
|
|
@@ -996,7 +1009,7 @@ function formatDate(format = "YYYY-MM-DD H:mm", date = /* @__PURE__ */ new Date(
|
|
|
996
1009
|
M: (get("Month") + 1).toString(),
|
|
997
1010
|
DDD: dayOfYear(zonedDate).toString(),
|
|
998
1011
|
DD: get("Date").toString().padStart(2, "0"),
|
|
999
|
-
Do:
|
|
1012
|
+
Do: numSuffix2(get("Date")),
|
|
1000
1013
|
D: get("Date").toString(),
|
|
1001
1014
|
dddd: dayOfWeek(get("Day")),
|
|
1002
1015
|
ddd: dayOfWeek(get("Day")).slice(0, 3),
|
|
@@ -1008,7 +1021,7 @@ function formatDate(format = "YYYY-MM-DD H:mm", date = /* @__PURE__ */ new Date(
|
|
|
1008
1021
|
m: get("Minutes").toString(),
|
|
1009
1022
|
ss: get("Seconds").toString().padStart(2, "0"),
|
|
1010
1023
|
s: get("Seconds").toString(),
|
|
1011
|
-
SSS:
|
|
1024
|
+
SSS: zonedDate[`getUTC${"Milliseconds"}`]().toString().padStart(3, "0"),
|
|
1012
1025
|
A: get("Hours") >= 12 ? "PM" : "AM",
|
|
1013
1026
|
a: get("Hours") >= 12 ? "pm" : "am",
|
|
1014
1027
|
ZZ: getTZOffset().replace(":", ""),
|
|
@@ -1772,6 +1785,33 @@ const _Logger = class _Logger extends TypedEmitter {
|
|
|
1772
1785
|
};
|
|
1773
1786
|
__publicField(_Logger, "LOG_LEVEL", 4);
|
|
1774
1787
|
let Logger = _Logger;
|
|
1788
|
+
function dec2Frac(num, maxDen = 1e3) {
|
|
1789
|
+
let sign = Math.sign(num);
|
|
1790
|
+
num = Math.abs(num);
|
|
1791
|
+
if (Number.isInteger(num)) return sign * num + "";
|
|
1792
|
+
let closest = { n: 0, d: 1, diff: Math.abs(num) };
|
|
1793
|
+
for (let d = 1; d <= maxDen; d++) {
|
|
1794
|
+
let n = Math.round(num * d);
|
|
1795
|
+
let diff = Math.abs(num - n / d);
|
|
1796
|
+
if (diff < closest.diff) {
|
|
1797
|
+
closest = { n, d, diff };
|
|
1798
|
+
if (diff < 1e-8) break;
|
|
1799
|
+
}
|
|
1800
|
+
}
|
|
1801
|
+
let integer = Math.floor(closest.n / closest.d);
|
|
1802
|
+
let numerator = closest.n - integer * closest.d;
|
|
1803
|
+
return (sign < 0 ? "-" : "") + (integer ? integer + " " : "") + (numerator ? numerator + "/" + closest.d : "");
|
|
1804
|
+
}
|
|
1805
|
+
function fracToDec(frac) {
|
|
1806
|
+
let split = frac.split(" ");
|
|
1807
|
+
const whole = split.length == 2 ? Number(split[0]) : 0;
|
|
1808
|
+
split = split.pop().split("/");
|
|
1809
|
+
return whole + Number(split[0]) / Number(split[1]);
|
|
1810
|
+
}
|
|
1811
|
+
function numSuffix(n) {
|
|
1812
|
+
const s = ["th", "st", "nd", "rd"], v = n % 100;
|
|
1813
|
+
return `${n}${s[(v - 20) % 10] || s[v] || s[0]}`;
|
|
1814
|
+
}
|
|
1775
1815
|
function compareVersions(target, vs) {
|
|
1776
1816
|
const [tMajor, tMinor, tPatch] = target.split(".").map((v) => +v.replace(/[^0-9]/g, ""));
|
|
1777
1817
|
const [vMajor, vMinor, vPatch] = vs.split(".").map((v) => +v.replace(/[^0-9]/g, ""));
|