@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.mjs CHANGED
@@ -118,7 +118,19 @@ ${opts.message || this.desc}`;
118
118
  }
119
119
  }
120
120
  function applyDeltas(base, ...deltas) {
121
- for (let d of deltas) base = applyDeltas(base, d);
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
- const get2 = (type) => {
956
- var _a2;
957
- return (_a2 = parts.find((p) => p.type === type)) == null ? void 0 : _a2.value;
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
- const build = `${get2("year")}-${get2("month")}-${get2("day")}T${get2("hour")}:${get2("minute")}:${get2("second")}Z`;
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: numSuffix(get("Date")),
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: get("Milliseconds").toString().padStart(3, "0"),
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, ""));