@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 CHANGED
@@ -122,7 +122,19 @@ ${opts.message || this.desc}`;
122
122
  }
123
123
  }
124
124
  function applyDeltas(base, ...deltas) {
125
- for (let d of deltas) base = applyDeltas(base, d);
125
+ function applyDelta(base2, delta) {
126
+ if (delta === null) return null;
127
+ if (typeof base2 !== "object" || base2 === null) return delta === void 0 ? base2 : delta;
128
+ const result = Array.isArray(base2) ? [...base2] : { ...base2 };
129
+ for (const key in delta) {
130
+ const val = delta[key];
131
+ if (val === void 0) delete result[key];
132
+ else if (typeof val === "object" && val !== null && !Array.isArray(val)) result[key] = applyDelta(result[key], val);
133
+ else result[key] = val;
134
+ }
135
+ return result;
136
+ }
137
+ for (const d of deltas.flat()) base = applyDelta(base, (d == null ? void 0 : d.delta) ?? d);
126
138
  return base;
127
139
  }
128
140
  function calcDelta(old, updated) {
@@ -881,33 +893,6 @@ ${opts.message || this.desc}`;
881
893
  }).join(","))
882
894
  ].join("\n");
883
895
  }
884
- function dec2Frac(num, maxDen = 1e3) {
885
- let sign = Math.sign(num);
886
- num = Math.abs(num);
887
- if (Number.isInteger(num)) return sign * num + "";
888
- let closest = { n: 0, d: 1, diff: Math.abs(num) };
889
- for (let d = 1; d <= maxDen; d++) {
890
- let n = Math.round(num * d);
891
- let diff = Math.abs(num - n / d);
892
- if (diff < closest.diff) {
893
- closest = { n, d, diff };
894
- if (diff < 1e-8) break;
895
- }
896
- }
897
- let integer = Math.floor(closest.n / closest.d);
898
- let numerator = closest.n - integer * closest.d;
899
- return (sign < 0 ? "-" : "") + (integer ? integer + " " : "") + (numerator ? numerator + "/" + closest.d : "");
900
- }
901
- function fracToDec(frac) {
902
- let split = frac.split(" ");
903
- const whole = split.length == 2 ? Number(split[0]) : 0;
904
- split = split.pop().split("/");
905
- return whole + Number(split[0]) / Number(split[1]);
906
- }
907
- function numSuffix(n) {
908
- const s = ["th", "st", "nd", "rd"], v = n % 100;
909
- return `${n}${s[(v - 20) % 10] || s[v] || s[0]}`;
910
- }
911
896
  function adjustedInterval(cb, ms) {
912
897
  let cancel = false, timeout = null;
913
898
  const p = async () => {
@@ -945,28 +930,56 @@ ${opts.message || this.desc}`;
945
930
  }
946
931
  }
947
932
  let zonedDate = new Date(date);
933
+ let get;
934
+ const partsMap = {};
948
935
  if (!numericTz && tzName !== "UTC") {
949
936
  const parts = new Intl.DateTimeFormat("en-US", {
950
937
  timeZone: tzName,
951
938
  year: "numeric",
952
939
  month: "2-digit",
953
940
  day: "2-digit",
941
+ weekday: "long",
954
942
  hour: "2-digit",
955
943
  minute: "2-digit",
956
944
  second: "2-digit",
957
945
  hour12: false
958
946
  }).formatToParts(date);
959
- const get2 = (type) => {
960
- var _a2;
961
- return (_a2 = parts.find((p) => p.type === type)) == null ? void 0 : _a2.value;
947
+ parts.forEach((p) => {
948
+ partsMap[p.type] = p.value;
949
+ });
950
+ const monthValue = parseInt(partsMap.month) - 1;
951
+ const dayOfWeekValue = (/* @__PURE__ */ new Date(`${partsMap.year}-${partsMap.month}-${partsMap.day}`)).getDay();
952
+ const hourValue = parseInt(partsMap.hour);
953
+ get = (fn2) => {
954
+ switch (fn2) {
955
+ case "FullYear":
956
+ return parseInt(partsMap.year);
957
+ case "Month":
958
+ return monthValue;
959
+ case "Date":
960
+ return parseInt(partsMap.day);
961
+ case "Day":
962
+ return dayOfWeekValue;
963
+ case "Hours":
964
+ return hourValue;
965
+ case "Minutes":
966
+ return parseInt(partsMap.minute);
967
+ case "Seconds":
968
+ return parseInt(partsMap.second);
969
+ default:
970
+ return 0;
971
+ }
962
972
  };
963
- const build = `${get2("year")}-${get2("month")}-${get2("day")}T${get2("hour")}:${get2("minute")}:${get2("second")}Z`;
964
- zonedDate = new Date(build);
965
- } else if (numericTz || tzName === "UTC") {
973
+ } else {
966
974
  const offset = numericTz ? tz : 0;
967
975
  zonedDate = new Date(date.getTime() + offset * 60 * 60 * 1e3);
976
+ get = (fn2) => zonedDate[`getUTC${fn2}`]();
977
+ }
978
+ function numSuffix2(n) {
979
+ const s = ["th", "st", "nd", "rd"];
980
+ const v = n % 100;
981
+ return n + (s[(v - 20) % 10] || s[v] || s[0]);
968
982
  }
969
- const get = (fn2) => numericTz || tzName === "UTC" ? zonedDate[`getUTC${fn2}`]() : zonedDate[`get${fn2}`]();
970
983
  function getTZOffset() {
971
984
  var _a2, _b;
972
985
  if (numericTz) {
@@ -1000,7 +1013,7 @@ ${opts.message || this.desc}`;
1000
1013
  M: (get("Month") + 1).toString(),
1001
1014
  DDD: dayOfYear(zonedDate).toString(),
1002
1015
  DD: get("Date").toString().padStart(2, "0"),
1003
- Do: numSuffix(get("Date")),
1016
+ Do: numSuffix2(get("Date")),
1004
1017
  D: get("Date").toString(),
1005
1018
  dddd: dayOfWeek(get("Day")),
1006
1019
  ddd: dayOfWeek(get("Day")).slice(0, 3),
@@ -1012,7 +1025,7 @@ ${opts.message || this.desc}`;
1012
1025
  m: get("Minutes").toString(),
1013
1026
  ss: get("Seconds").toString().padStart(2, "0"),
1014
1027
  s: get("Seconds").toString(),
1015
- SSS: get("Milliseconds").toString().padStart(3, "0"),
1028
+ SSS: zonedDate[`getUTC${"Milliseconds"}`]().toString().padStart(3, "0"),
1016
1029
  A: get("Hours") >= 12 ? "PM" : "AM",
1017
1030
  a: get("Hours") >= 12 ? "pm" : "am",
1018
1031
  ZZ: getTZOffset().replace(":", ""),
@@ -1776,6 +1789,33 @@ ${opts.message || this.desc}`;
1776
1789
  };
1777
1790
  __publicField(_Logger, "LOG_LEVEL", 4);
1778
1791
  let Logger = _Logger;
1792
+ function dec2Frac(num, maxDen = 1e3) {
1793
+ let sign = Math.sign(num);
1794
+ num = Math.abs(num);
1795
+ if (Number.isInteger(num)) return sign * num + "";
1796
+ let closest = { n: 0, d: 1, diff: Math.abs(num) };
1797
+ for (let d = 1; d <= maxDen; d++) {
1798
+ let n = Math.round(num * d);
1799
+ let diff = Math.abs(num - n / d);
1800
+ if (diff < closest.diff) {
1801
+ closest = { n, d, diff };
1802
+ if (diff < 1e-8) break;
1803
+ }
1804
+ }
1805
+ let integer = Math.floor(closest.n / closest.d);
1806
+ let numerator = closest.n - integer * closest.d;
1807
+ return (sign < 0 ? "-" : "") + (integer ? integer + " " : "") + (numerator ? numerator + "/" + closest.d : "");
1808
+ }
1809
+ function fracToDec(frac) {
1810
+ let split = frac.split(" ");
1811
+ const whole = split.length == 2 ? Number(split[0]) : 0;
1812
+ split = split.pop().split("/");
1813
+ return whole + Number(split[0]) / Number(split[1]);
1814
+ }
1815
+ function numSuffix(n) {
1816
+ const s = ["th", "st", "nd", "rd"], v = n % 100;
1817
+ return `${n}${s[(v - 20) % 10] || s[v] || s[0]}`;
1818
+ }
1779
1819
  function compareVersions(target, vs) {
1780
1820
  const [tMajor, tMinor, tPatch] = target.split(".").map((v) => +v.replace(/[^0-9]/g, ""));
1781
1821
  const [vMajor, vMinor, vPatch] = vs.split(".").map((v) => +v.replace(/[^0-9]/g, ""));