@gusto/embedded-react-sdk 0.44.1 → 0.44.2

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.
@@ -4,40 +4,40 @@ const s = (t) => {
4
4
  if (/^\d{4}-\d{2}-\d{2}$/.test(t)) {
5
5
  const n = t.split("-");
6
6
  if (n.length !== 3) return null;
7
- const r = n.map(Number), o = r[0], i = r[1], a = r[2];
8
- return o === void 0 || i === void 0 || a === void 0 || isNaN(o) || isNaN(i) || isNaN(a) || i < 1 || i > 12 || a < 1 || a > 31 ? null : new Date(o, i - 1, a);
7
+ const r = n.map(Number), o = r[0], a = r[1], i = r[2];
8
+ return o === void 0 || a === void 0 || i === void 0 || isNaN(o) || isNaN(a) || isNaN(i) || a < 1 || a > 12 || i < 1 || i > 31 ? null : new Date(o, a - 1, i);
9
9
  }
10
10
  const e = new Date(t);
11
11
  return isNaN(e.getTime()) ? null : e;
12
12
  }
13
13
  return t instanceof Date ? isNaN(t.getTime()) ? null : t : null;
14
- }, u = (t) => (e, n) => {
14
+ }, c = (t) => (e, n) => {
15
15
  const r = s(e);
16
16
  return r ? r.toLocaleDateString(n, t) : "";
17
- }, g = u({
17
+ }, h = c({
18
18
  weekday: "short",
19
19
  month: "short",
20
20
  day: "numeric"
21
- }), h = u({
21
+ }), f = c({
22
22
  weekday: "short",
23
23
  month: "short",
24
24
  day: "numeric",
25
25
  year: "numeric"
26
- }), y = u({
26
+ }), y = c({
27
27
  month: "short",
28
28
  day: "numeric"
29
- }), S = u({
29
+ }), S = c({
30
30
  month: "short",
31
31
  day: "numeric",
32
32
  year: "numeric"
33
- }), N = u({
33
+ }), N = c({
34
34
  month: "long",
35
35
  day: "numeric"
36
- }), T = u({
36
+ }), w = c({
37
37
  month: "long",
38
38
  day: "numeric",
39
39
  year: "numeric"
40
- }), w = (t, e) => {
40
+ }), T = (t, e) => {
41
41
  const n = s(t);
42
42
  if (!n) return { time: "", date: "" };
43
43
  const r = n.toLocaleTimeString(e, {
@@ -51,98 +51,94 @@ const s = (t) => {
51
51
  day: "numeric"
52
52
  });
53
53
  return { time: r, date: o };
54
- }, L = (t, e, n) => {
54
+ }, M = (t, e, n) => {
55
55
  const r = s(t), o = s(e);
56
56
  if (!r || !o)
57
57
  return { startDate: "", endDate: "" };
58
- const i = r.toLocaleDateString(n, {
58
+ const a = r.toLocaleDateString(n, {
59
59
  month: "long",
60
60
  day: "numeric"
61
- }), a = o.toLocaleDateString(n, {
61
+ }), i = o.toLocaleDateString(n, {
62
62
  month: "short",
63
63
  day: "numeric",
64
64
  year: "numeric"
65
65
  });
66
- return { startDate: i, endDate: a };
67
- }, M = (t, e, n, r) => {
68
- const o = s(t), i = s(e);
69
- if (!o || !i) return "";
70
- const a = r?.useShortMonth ? "short" : "long", c = o.toLocaleDateString(n, {
71
- month: a,
66
+ return { startDate: a, endDate: i };
67
+ }, $ = (t, e, n, r) => {
68
+ const o = s(t), a = s(e);
69
+ if (!o || !a) return "";
70
+ const i = r?.useShortMonth ? "short" : "long", u = o.toLocaleDateString(n, {
71
+ month: i,
72
72
  day: "numeric"
73
- }), l = i.toLocaleDateString(n, {
74
- month: a,
73
+ }), D = a.toLocaleDateString(n, {
74
+ month: i,
75
75
  day: "numeric",
76
76
  year: "numeric"
77
77
  });
78
- return `${c}–${l}`;
79
- }, p = (t) => isNaN(t.getTime()) ? null : t.toISOString().split("T")[0] || null, W = (t) => {
78
+ return `${u}–${D}`;
79
+ }, L = (t) => {
80
+ if (isNaN(t.getTime()))
81
+ return null;
82
+ const e = String(t.getFullYear()).padStart(4, "0"), n = String(t.getMonth() + 1).padStart(2, "0"), r = String(t.getDate()).padStart(2, "0");
83
+ return `${e}-${n}-${r}`;
84
+ }, F = (t) => {
80
85
  if (!t) return "";
81
86
  const e = s(t);
82
87
  if (!e) return "";
83
88
  const n = e.getFullYear(), r = String(e.getMonth() + 1).padStart(2, "0"), o = String(e.getDate()).padStart(2, "0");
84
89
  return `${n}-${r}-${o}`;
85
- }, $ = (t) => {
86
- if (!t || isNaN(t.getTime()))
87
- return null;
88
- const e = t.toISOString(), [n] = e.split("T");
89
- if (!n) return null;
90
- const r = n.split("-");
91
- if (r.length !== 3) return null;
92
- const o = r.map(Number), i = o[0], a = o[1], c = o[2];
93
- return isNaN(i) || isNaN(a) || isNaN(c) || a < 1 || a > 12 || c < 1 || c > 31 ? null : new Date(i, a - 1, c);
94
- }, m = 1e3 * 60 * 60, d = m * 24, F = (t) => {
90
+ }, W = (t) => !t || isNaN(t.getTime()) ? null : new Date(t.getFullYear(), t.getMonth(), t.getDate()), m = 1e3 * 60 * 60, d = m * 24, Y = (t) => {
95
91
  const e = s(t);
96
92
  if (!e) return null;
97
93
  const n = /* @__PURE__ */ new Date();
98
94
  return (e.getTime() - n.getTime()) / m;
99
- }, P = (t) => {
95
+ }, k = (t) => {
100
96
  const e = s(t);
101
97
  if (!e) return null;
102
98
  const n = /* @__PURE__ */ new Date();
103
99
  return (e.getTime() - n.getTime()) / d;
104
- }, D = (t) => {
100
+ }, g = (t) => {
105
101
  const e = t.getDay();
106
102
  return e === 0 || e === 6;
107
- }, f = (t, e) => {
103
+ }, l = (t, e) => {
108
104
  const n = new Date(t);
109
105
  return n.setDate(n.getDate() + e), n;
110
- }, k = (t, e) => {
106
+ }, p = (t, e) => {
111
107
  let n = new Date(t);
112
108
  n.setHours(0, 0, 0, 0);
113
109
  let r = 0;
114
110
  for (; r < e; )
115
- n = f(n, 1), D(n) || r++;
111
+ n = l(n, 1), g(n) || r++;
116
112
  return n;
117
113
  };
118
- function Y(t, e) {
114
+ function P(t, e) {
119
115
  if (!(t == null || e == null))
120
116
  return `${String(t).padStart(2, "0")}-${String(e).padStart(2, "0")}`;
121
117
  }
122
- function b(t) {
118
+ function R(t) {
123
119
  return new Date(2023, t, 0).getDate();
124
120
  }
125
121
  export {
126
122
  m as MS_PER_HOUR,
127
- k as addBusinessDays,
128
- f as addDays,
123
+ p as addBusinessDays,
124
+ l as addDays,
129
125
  N as formatDateLong,
130
- T as formatDateLongWithYear,
126
+ w as formatDateLongWithYear,
131
127
  y as formatDateShort,
132
- g as formatDateShortWithWeekday,
133
- h as formatDateShortWithWeekdayAndYear,
128
+ h as formatDateShortWithWeekday,
129
+ f as formatDateShortWithWeekdayAndYear,
134
130
  S as formatDateShortWithYear,
135
- p as formatDateToStringDate,
136
- w as formatDateWithTime,
137
- Y as formatMonthDay,
138
- L as formatPayPeriod,
139
- M as formatPayPeriodRange,
140
- b as getDaysInMonth,
141
- P as getDaysUntil,
142
- F as getHoursUntil,
143
- D as isWeekend,
144
- $ as normalizeDateToLocal,
131
+ L as formatDateToStringDate,
132
+ T as formatDateWithTime,
133
+ P as formatMonthDay,
134
+ M as formatPayPeriod,
135
+ $ as formatPayPeriodRange,
136
+ R as getDaysInMonth,
137
+ k as getDaysUntil,
138
+ Y as getHoursUntil,
139
+ g as isWeekend,
140
+ W as normalizeDateToLocal,
145
141
  s as normalizeToDate,
146
- W as normalizeToISOString
142
+ F as normalizeToISOString
147
143
  };
148
144
  //# sourceMappingURL=dateFormatting.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"dateFormatting.js","sources":["../../src/helpers/dateFormatting.ts"],"sourcesContent":["/**\n * Normalizes any date input (string, Date, or undefined) to a Date object.\n * Handles YYYY-MM-DD strings by parsing them in local timezone to avoid timezone issues.\n * Also handles ISO timestamp strings for compatibility.\n * Returns null for invalid inputs.\n */\nexport const normalizeToDate = (dateInput?: string | Date | null): Date | null => {\n if (!dateInput) return null\n\n if (typeof dateInput === 'string') {\n if (/^\\d{4}-\\d{2}-\\d{2}$/.test(dateInput)) {\n const parts = dateInput.split('-')\n if (parts.length !== 3) return null\n\n const numbers = parts.map(Number)\n const year = numbers[0]\n const month = numbers[1]\n const day = numbers[2]\n if (year === undefined || month === undefined || day === undefined) {\n return null\n }\n\n if (\n isNaN(year) ||\n isNaN(month) ||\n isNaN(day) ||\n month < 1 ||\n month > 12 ||\n day < 1 ||\n day > 31\n ) {\n return null\n }\n\n return new Date(year, month - 1, day)\n }\n\n const parsedDate = new Date(dateInput)\n return isNaN(parsedDate.getTime()) ? null : parsedDate\n }\n\n if (dateInput instanceof Date) {\n return isNaN(dateInput.getTime()) ? null : dateInput\n }\n\n return null\n}\n\n/**\n * Creates a date formatter function that handles both string and Date inputs.\n */\nconst createDateFormatter =\n (options: Intl.DateTimeFormatOptions) =>\n (dateInput?: string | Date | null, locale?: string): string => {\n const date = normalizeToDate(dateInput)\n if (!date) return ''\n return date.toLocaleDateString(locale, options)\n }\n\nexport const formatDateShortWithWeekday = createDateFormatter({\n weekday: 'short',\n month: 'short',\n day: 'numeric',\n})\n\nexport const formatDateShortWithWeekdayAndYear = createDateFormatter({\n weekday: 'short',\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n})\n\nexport const formatDateShort = createDateFormatter({\n month: 'short',\n day: 'numeric',\n})\n\nexport const formatDateShortWithYear = createDateFormatter({\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n})\n\nexport const formatDateLong = createDateFormatter({\n month: 'long',\n day: 'numeric',\n})\n\nexport const formatDateLongWithYear = createDateFormatter({\n month: 'long',\n day: 'numeric',\n year: 'numeric',\n})\n\nexport const formatDateWithTime = (\n dateInput?: string | Date | null,\n locale?: string,\n): { time: string; date: string } => {\n const date = normalizeToDate(dateInput)\n if (!date) return { time: '', date: '' }\n\n const time = date.toLocaleTimeString(locale, {\n hour: 'numeric',\n minute: '2-digit',\n hour12: true,\n timeZoneName: 'short',\n })\n\n const dateString = date.toLocaleDateString(locale, {\n weekday: 'short',\n month: 'short',\n day: 'numeric',\n })\n\n return { time, date: dateString }\n}\n\nexport const formatPayPeriod = (\n startDateInput?: string | Date | null,\n endDateInput?: string | Date | null,\n locale?: string,\n): { startDate: string; endDate: string } => {\n const startDate = normalizeToDate(startDateInput)\n const endDate = normalizeToDate(endDateInput)\n\n if (!startDate || !endDate) {\n return { startDate: '', endDate: '' }\n }\n\n const startFormatted = startDate.toLocaleDateString(locale, {\n month: 'long',\n day: 'numeric',\n })\n\n const endFormatted = endDate.toLocaleDateString(locale, {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n })\n\n return { startDate: startFormatted, endDate: endFormatted }\n}\n\nexport const formatPayPeriodRange = (\n startDateInput?: string | Date | null,\n endDateInput?: string | Date | null,\n locale?: string,\n options?: { useShortMonth?: boolean },\n): string => {\n const startDate = normalizeToDate(startDateInput)\n const endDate = normalizeToDate(endDateInput)\n\n if (!startDate || !endDate) return ''\n\n const monthFormat = options?.useShortMonth ? 'short' : 'long'\n\n const startFormatted = startDate.toLocaleDateString(locale, {\n month: monthFormat,\n day: 'numeric',\n })\n\n const endFormatted = endDate.toLocaleDateString(locale, {\n month: monthFormat,\n day: 'numeric',\n year: 'numeric',\n })\n\n return `${startFormatted}–${endFormatted}`\n}\n\nexport const formatDateToStringDate = (date: Date): string | null => {\n if (isNaN(date.getTime())) {\n return null\n }\n return date.toISOString().split('T')[0] || null\n}\n\n/**\n * Converts any parseable date string to a `YYYY-MM-DD` ISO string using local\n * time, so the calendar date is preserved regardless of the runtime timezone.\n *\n * Unlike `formatDateToStringDate` (which reads UTC), this function reads the\n * local year/month/day — safe for dates parsed from locale-format strings\n * (e.g. \"4/16/1998\") or ISO strings, both of which `normalizeToDate` lands at\n * local midnight.\n *\n * Returns `''` for null, undefined, empty, or unparseable input.\n */\nexport const normalizeToISOString = (value?: string | null): string => {\n if (!value) return ''\n const date = normalizeToDate(value)\n if (!date) return ''\n const year = date.getFullYear()\n const month = String(date.getMonth() + 1).padStart(2, '0')\n const day = String(date.getDate()).padStart(2, '0')\n return `${year}-${month}-${day}`\n}\n\n/**\n * Normalizes Date to local midnight, handling timezone issues from any adapter.\n */\nexport const normalizeDateToLocal = (date: Date | null): Date | null => {\n if (!date || isNaN(date.getTime())) {\n return null\n }\n\n const isoString = date.toISOString()\n const [datePart] = isoString.split('T')\n if (!datePart) return null\n\n const parts = datePart.split('-')\n if (parts.length !== 3) return null\n const numbers = parts.map(Number)\n const year = numbers[0]!\n const month = numbers[1]!\n const day = numbers[2]!\n if (isNaN(year) || isNaN(month) || isNaN(day) || month < 1 || month > 12 || day < 1 || day > 31) {\n return null\n }\n\n return new Date(year, month - 1, day)\n}\n\nexport const MS_PER_HOUR = 1000 * 60 * 60\nconst MS_PER_DAY = MS_PER_HOUR * 24\n\nexport const getHoursUntil = (deadline?: Date | string | null): number | null => {\n const deadlineDate = normalizeToDate(deadline)\n if (!deadlineDate) return null\n\n const now = new Date()\n const timeDiffMs = deadlineDate.getTime() - now.getTime()\n return timeDiffMs / MS_PER_HOUR\n}\n\nexport const getDaysUntil = (deadline?: Date | string | null): number | null => {\n const deadlineDate = normalizeToDate(deadline)\n if (!deadlineDate) return null\n\n const now = new Date()\n const timeDiffMs = deadlineDate.getTime() - now.getTime()\n return timeDiffMs / MS_PER_DAY\n}\n\nexport const isWeekend = (date: Date): boolean => {\n const day = date.getDay()\n return day === 0 || day === 6\n}\n\nexport const addDays = (date: Date, days: number): Date => {\n const result = new Date(date)\n result.setDate(result.getDate() + days)\n return result\n}\n\nexport const addBusinessDays = (startDate: Date, businessDays: number): Date => {\n let currentDate = new Date(startDate)\n currentDate.setHours(0, 0, 0, 0)\n let daysAdded = 0\n\n while (daysAdded < businessDays) {\n currentDate = addDays(currentDate, 1)\n if (!isWeekend(currentDate)) {\n daysAdded++\n }\n }\n\n return currentDate\n}\n\n/** Formats numeric month and day as a zero-padded `MM-DD` string. */\nexport function formatMonthDay(month?: number, day?: number): string | undefined {\n if (month == null || day == null) return undefined\n return `${String(month).padStart(2, '0')}-${String(day).padStart(2, '0')}`\n}\n\n/** Returns the number of days in a given month (1-indexed). Uses a non-leap year so February always returns 28. */\nexport function getDaysInMonth(month: number): number {\n return new Date(2023, month, 0).getDate()\n}\n"],"names":["normalizeToDate","dateInput","parts","numbers","year","month","day","parsedDate","createDateFormatter","options","locale","date","formatDateShortWithWeekday","formatDateShortWithWeekdayAndYear","formatDateShort","formatDateShortWithYear","formatDateLong","formatDateLongWithYear","formatDateWithTime","time","dateString","formatPayPeriod","startDateInput","endDateInput","startDate","endDate","startFormatted","endFormatted","formatPayPeriodRange","monthFormat","formatDateToStringDate","normalizeToISOString","value","normalizeDateToLocal","isoString","datePart","MS_PER_HOUR","MS_PER_DAY","getHoursUntil","deadline","deadlineDate","now","getDaysUntil","isWeekend","addDays","days","result","addBusinessDays","businessDays","currentDate","daysAdded","formatMonthDay","getDaysInMonth"],"mappings":"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"}
1
+ {"version":3,"file":"dateFormatting.js","sources":["../../src/helpers/dateFormatting.ts"],"sourcesContent":["/**\n * Normalizes any date input (string, Date, or undefined) to a Date object.\n * Handles YYYY-MM-DD strings by parsing them in local timezone to avoid timezone issues.\n * Also handles ISO timestamp strings for compatibility.\n * Returns null for invalid inputs.\n */\nexport const normalizeToDate = (dateInput?: string | Date | null): Date | null => {\n if (!dateInput) return null\n\n if (typeof dateInput === 'string') {\n if (/^\\d{4}-\\d{2}-\\d{2}$/.test(dateInput)) {\n const parts = dateInput.split('-')\n if (parts.length !== 3) return null\n\n const numbers = parts.map(Number)\n const year = numbers[0]\n const month = numbers[1]\n const day = numbers[2]\n if (year === undefined || month === undefined || day === undefined) {\n return null\n }\n\n if (\n isNaN(year) ||\n isNaN(month) ||\n isNaN(day) ||\n month < 1 ||\n month > 12 ||\n day < 1 ||\n day > 31\n ) {\n return null\n }\n\n return new Date(year, month - 1, day)\n }\n\n const parsedDate = new Date(dateInput)\n return isNaN(parsedDate.getTime()) ? null : parsedDate\n }\n\n if (dateInput instanceof Date) {\n return isNaN(dateInput.getTime()) ? null : dateInput\n }\n\n return null\n}\n\n/**\n * Creates a date formatter function that handles both string and Date inputs.\n */\nconst createDateFormatter =\n (options: Intl.DateTimeFormatOptions) =>\n (dateInput?: string | Date | null, locale?: string): string => {\n const date = normalizeToDate(dateInput)\n if (!date) return ''\n return date.toLocaleDateString(locale, options)\n }\n\nexport const formatDateShortWithWeekday = createDateFormatter({\n weekday: 'short',\n month: 'short',\n day: 'numeric',\n})\n\nexport const formatDateShortWithWeekdayAndYear = createDateFormatter({\n weekday: 'short',\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n})\n\nexport const formatDateShort = createDateFormatter({\n month: 'short',\n day: 'numeric',\n})\n\nexport const formatDateShortWithYear = createDateFormatter({\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n})\n\nexport const formatDateLong = createDateFormatter({\n month: 'long',\n day: 'numeric',\n})\n\nexport const formatDateLongWithYear = createDateFormatter({\n month: 'long',\n day: 'numeric',\n year: 'numeric',\n})\n\nexport const formatDateWithTime = (\n dateInput?: string | Date | null,\n locale?: string,\n): { time: string; date: string } => {\n const date = normalizeToDate(dateInput)\n if (!date) return { time: '', date: '' }\n\n const time = date.toLocaleTimeString(locale, {\n hour: 'numeric',\n minute: '2-digit',\n hour12: true,\n timeZoneName: 'short',\n })\n\n const dateString = date.toLocaleDateString(locale, {\n weekday: 'short',\n month: 'short',\n day: 'numeric',\n })\n\n return { time, date: dateString }\n}\n\nexport const formatPayPeriod = (\n startDateInput?: string | Date | null,\n endDateInput?: string | Date | null,\n locale?: string,\n): { startDate: string; endDate: string } => {\n const startDate = normalizeToDate(startDateInput)\n const endDate = normalizeToDate(endDateInput)\n\n if (!startDate || !endDate) {\n return { startDate: '', endDate: '' }\n }\n\n const startFormatted = startDate.toLocaleDateString(locale, {\n month: 'long',\n day: 'numeric',\n })\n\n const endFormatted = endDate.toLocaleDateString(locale, {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n })\n\n return { startDate: startFormatted, endDate: endFormatted }\n}\n\nexport const formatPayPeriodRange = (\n startDateInput?: string | Date | null,\n endDateInput?: string | Date | null,\n locale?: string,\n options?: { useShortMonth?: boolean },\n): string => {\n const startDate = normalizeToDate(startDateInput)\n const endDate = normalizeToDate(endDateInput)\n\n if (!startDate || !endDate) return ''\n\n const monthFormat = options?.useShortMonth ? 'short' : 'long'\n\n const startFormatted = startDate.toLocaleDateString(locale, {\n month: monthFormat,\n day: 'numeric',\n })\n\n const endFormatted = endDate.toLocaleDateString(locale, {\n month: monthFormat,\n day: 'numeric',\n year: 'numeric',\n })\n\n return `${startFormatted}–${endFormatted}`\n}\n\nexport const formatDateToStringDate = (date: Date): string | null => {\n if (isNaN(date.getTime())) {\n return null\n }\n const year = String(date.getFullYear()).padStart(4, '0')\n const month = String(date.getMonth() + 1).padStart(2, '0')\n const day = String(date.getDate()).padStart(2, '0')\n return `${year}-${month}-${day}`\n}\n\n/**\n * Converts any parseable date string to a `YYYY-MM-DD` ISO string using local\n * time, so the calendar date is preserved regardless of the runtime timezone.\n *\n * Unlike `formatDateToStringDate` (which reads UTC), this function reads the\n * local year/month/day — safe for dates parsed from locale-format strings\n * (e.g. \"4/16/1998\") or ISO strings, both of which `normalizeToDate` lands at\n * local midnight.\n *\n * Returns `''` for null, undefined, empty, or unparseable input.\n */\nexport const normalizeToISOString = (value?: string | null): string => {\n if (!value) return ''\n const date = normalizeToDate(value)\n if (!date) return ''\n const year = date.getFullYear()\n const month = String(date.getMonth() + 1).padStart(2, '0')\n const day = String(date.getDate()).padStart(2, '0')\n return `${year}-${month}-${day}`\n}\n\n/**\n * Normalizes Date to local midnight, handling timezone issues from any adapter.\n */\nexport const normalizeDateToLocal = (date: Date | null): Date | null => {\n if (!date || isNaN(date.getTime())) {\n return null\n }\n return new Date(date.getFullYear(), date.getMonth(), date.getDate())\n}\n\nexport const MS_PER_HOUR = 1000 * 60 * 60\nconst MS_PER_DAY = MS_PER_HOUR * 24\n\nexport const getHoursUntil = (deadline?: Date | string | null): number | null => {\n const deadlineDate = normalizeToDate(deadline)\n if (!deadlineDate) return null\n\n const now = new Date()\n const timeDiffMs = deadlineDate.getTime() - now.getTime()\n return timeDiffMs / MS_PER_HOUR\n}\n\nexport const getDaysUntil = (deadline?: Date | string | null): number | null => {\n const deadlineDate = normalizeToDate(deadline)\n if (!deadlineDate) return null\n\n const now = new Date()\n const timeDiffMs = deadlineDate.getTime() - now.getTime()\n return timeDiffMs / MS_PER_DAY\n}\n\nexport const isWeekend = (date: Date): boolean => {\n const day = date.getDay()\n return day === 0 || day === 6\n}\n\nexport const addDays = (date: Date, days: number): Date => {\n const result = new Date(date)\n result.setDate(result.getDate() + days)\n return result\n}\n\nexport const addBusinessDays = (startDate: Date, businessDays: number): Date => {\n let currentDate = new Date(startDate)\n currentDate.setHours(0, 0, 0, 0)\n let daysAdded = 0\n\n while (daysAdded < businessDays) {\n currentDate = addDays(currentDate, 1)\n if (!isWeekend(currentDate)) {\n daysAdded++\n }\n }\n\n return currentDate\n}\n\n/** Formats numeric month and day as a zero-padded `MM-DD` string. */\nexport function formatMonthDay(month?: number, day?: number): string | undefined {\n if (month == null || day == null) return undefined\n return `${String(month).padStart(2, '0')}-${String(day).padStart(2, '0')}`\n}\n\n/** Returns the number of days in a given month (1-indexed). Uses a non-leap year so February always returns 28. */\nexport function getDaysInMonth(month: number): number {\n return new Date(2023, month, 0).getDate()\n}\n"],"names":["normalizeToDate","dateInput","parts","numbers","year","month","day","parsedDate","createDateFormatter","options","locale","date","formatDateShortWithWeekday","formatDateShortWithWeekdayAndYear","formatDateShort","formatDateShortWithYear","formatDateLong","formatDateLongWithYear","formatDateWithTime","time","dateString","formatPayPeriod","startDateInput","endDateInput","startDate","endDate","startFormatted","endFormatted","formatPayPeriodRange","monthFormat","formatDateToStringDate","normalizeToISOString","value","normalizeDateToLocal","MS_PER_HOUR","MS_PER_DAY","getHoursUntil","deadline","deadlineDate","now","getDaysUntil","isWeekend","addDays","days","result","addBusinessDays","businessDays","currentDate","daysAdded","formatMonthDay","getDaysInMonth"],"mappings":"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"}