@bash-app/bash-common 30.51.0 → 30.53.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.
Files changed (184) hide show
  1. package/dist/definitions.d.ts +668 -0
  2. package/dist/definitions.d.ts.map +1 -0
  3. package/dist/definitions.js +467 -0
  4. package/dist/definitions.js.map +1 -0
  5. package/dist/extendedSchemas.d.ts +2206 -0
  6. package/dist/extendedSchemas.d.ts.map +1 -0
  7. package/dist/extendedSchemas.js +429 -0
  8. package/dist/extendedSchemas.js.map +1 -0
  9. package/dist/index.d.ts +39 -0
  10. package/dist/index.d.ts.map +1 -0
  11. package/dist/index.js +40 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/utils/addressUtils.d.ts +14 -0
  14. package/dist/utils/addressUtils.d.ts.map +1 -0
  15. package/dist/utils/addressUtils.js +177 -0
  16. package/dist/utils/addressUtils.js.map +1 -0
  17. package/dist/utils/apiUtils.d.ts +14 -0
  18. package/dist/utils/apiUtils.d.ts.map +1 -0
  19. package/dist/utils/apiUtils.js +61 -0
  20. package/dist/utils/apiUtils.js.map +1 -0
  21. package/dist/utils/arrayUtils.d.ts +2 -0
  22. package/dist/utils/arrayUtils.d.ts.map +1 -0
  23. package/dist/utils/arrayUtils.js +5 -0
  24. package/dist/utils/arrayUtils.js.map +1 -0
  25. package/dist/utils/awsS3Utils.d.ts +10 -0
  26. package/dist/utils/awsS3Utils.d.ts.map +1 -0
  27. package/dist/utils/awsS3Utils.js +89 -0
  28. package/dist/utils/awsS3Utils.js.map +1 -0
  29. package/dist/utils/badgeUtils.d.ts +33 -0
  30. package/dist/utils/badgeUtils.d.ts.map +1 -0
  31. package/dist/utils/badgeUtils.js +57 -0
  32. package/dist/utils/badgeUtils.js.map +1 -0
  33. package/dist/utils/blog/blogDbUtils.d.ts +48 -0
  34. package/dist/utils/blog/blogDbUtils.d.ts.map +1 -0
  35. package/dist/utils/blog/blogDbUtils.js +218 -0
  36. package/dist/utils/blog/blogDbUtils.js.map +1 -0
  37. package/dist/utils/blogUtils.d.ts +19 -0
  38. package/dist/utils/blogUtils.d.ts.map +1 -0
  39. package/dist/utils/blogUtils.js +118 -0
  40. package/dist/utils/blogUtils.js.map +1 -0
  41. package/dist/utils/dateTimeUtils.d.ts +38 -0
  42. package/dist/utils/dateTimeUtils.d.ts.map +1 -0
  43. package/dist/utils/dateTimeUtils.js +207 -0
  44. package/dist/utils/dateTimeUtils.js.map +1 -0
  45. package/dist/utils/entityUtils.d.ts +5 -0
  46. package/dist/utils/entityUtils.d.ts.map +1 -0
  47. package/dist/utils/entityUtils.js +5 -0
  48. package/dist/utils/entityUtils.js.map +1 -0
  49. package/dist/utils/generalDateTimeUtils.d.ts +15 -0
  50. package/dist/utils/generalDateTimeUtils.d.ts.map +1 -0
  51. package/dist/utils/generalDateTimeUtils.js +38 -0
  52. package/dist/utils/generalDateTimeUtils.js.map +1 -0
  53. package/dist/utils/luxonUtils.d.ts +95 -0
  54. package/dist/utils/luxonUtils.d.ts.map +1 -0
  55. package/dist/utils/luxonUtils.js +623 -0
  56. package/dist/utils/luxonUtils.js.map +1 -0
  57. package/dist/utils/mathUtils.d.ts +2 -0
  58. package/dist/utils/mathUtils.d.ts.map +1 -0
  59. package/dist/utils/mathUtils.js +4 -0
  60. package/dist/utils/mathUtils.js.map +1 -0
  61. package/dist/utils/objUtils.d.ts +3 -0
  62. package/dist/utils/objUtils.d.ts.map +1 -0
  63. package/dist/utils/objUtils.js +29 -0
  64. package/dist/utils/objUtils.js.map +1 -0
  65. package/dist/utils/paymentUtils.d.ts +18 -0
  66. package/dist/utils/paymentUtils.d.ts.map +1 -0
  67. package/dist/utils/paymentUtils.js +50 -0
  68. package/dist/utils/paymentUtils.js.map +1 -0
  69. package/dist/utils/promoCodesUtils.d.ts +6 -0
  70. package/dist/utils/promoCodesUtils.d.ts.map +1 -0
  71. package/dist/utils/promoCodesUtils.js +23 -0
  72. package/dist/utils/promoCodesUtils.js.map +1 -0
  73. package/dist/utils/qrCodeUtils.d.ts +4 -0
  74. package/dist/utils/qrCodeUtils.d.ts.map +1 -0
  75. package/dist/utils/qrCodeUtils.js +22 -0
  76. package/dist/utils/qrCodeUtils.js.map +1 -0
  77. package/dist/utils/recurrenceUtils.d.ts +8 -0
  78. package/dist/utils/recurrenceUtils.d.ts.map +1 -0
  79. package/dist/utils/recurrenceUtils.js +153 -0
  80. package/dist/utils/recurrenceUtils.js.map +1 -0
  81. package/dist/utils/reviewUtils.d.ts +29 -0
  82. package/dist/utils/reviewUtils.d.ts.map +1 -0
  83. package/dist/utils/reviewUtils.js +65 -0
  84. package/dist/utils/reviewUtils.js.map +1 -0
  85. package/dist/utils/service/apiServiceBookingApiUtils.d.ts +21 -0
  86. package/dist/utils/service/apiServiceBookingApiUtils.d.ts.map +1 -0
  87. package/dist/utils/service/apiServiceBookingApiUtils.js +131 -0
  88. package/dist/utils/service/apiServiceBookingApiUtils.js.map +1 -0
  89. package/dist/utils/service/attendeeOptionUtils.d.ts +11 -0
  90. package/dist/utils/service/attendeeOptionUtils.d.ts.map +1 -0
  91. package/dist/utils/service/attendeeOptionUtils.js +9 -0
  92. package/dist/utils/service/attendeeOptionUtils.js.map +1 -0
  93. package/dist/utils/service/frontendServiceBookingUtils.d.ts +53 -0
  94. package/dist/utils/service/frontendServiceBookingUtils.d.ts.map +1 -0
  95. package/dist/utils/service/frontendServiceBookingUtils.js +134 -0
  96. package/dist/utils/service/frontendServiceBookingUtils.js.map +1 -0
  97. package/dist/utils/service/regexUtils.d.ts +6 -0
  98. package/dist/utils/service/regexUtils.d.ts.map +1 -0
  99. package/dist/utils/service/regexUtils.js +16 -0
  100. package/dist/utils/service/regexUtils.js.map +1 -0
  101. package/dist/utils/service/serviceBookingStatusUtils.d.ts +21 -0
  102. package/dist/utils/service/serviceBookingStatusUtils.d.ts.map +1 -0
  103. package/dist/utils/service/serviceBookingStatusUtils.js +130 -0
  104. package/dist/utils/service/serviceBookingStatusUtils.js.map +1 -0
  105. package/dist/utils/service/serviceBookingTypes.d.ts +19 -0
  106. package/dist/utils/service/serviceBookingTypes.d.ts.map +1 -0
  107. package/dist/utils/service/serviceBookingTypes.js +2 -0
  108. package/dist/utils/service/serviceBookingTypes.js.map +1 -0
  109. package/dist/utils/service/serviceDBUtils.d.ts +5 -0
  110. package/dist/utils/service/serviceDBUtils.d.ts.map +1 -0
  111. package/dist/utils/service/serviceDBUtils.js +48 -0
  112. package/dist/utils/service/serviceDBUtils.js.map +1 -0
  113. package/dist/utils/service/serviceRateDBUtils.d.ts +1 -0
  114. package/dist/utils/service/serviceRateDBUtils.d.ts.map +1 -0
  115. package/dist/utils/service/serviceRateDBUtils.js +159 -0
  116. package/dist/utils/service/serviceRateDBUtils.js.map +1 -0
  117. package/dist/utils/service/serviceRateTypes.d.ts +9 -0
  118. package/dist/utils/service/serviceRateTypes.d.ts.map +1 -0
  119. package/dist/utils/service/serviceRateTypes.js +2 -0
  120. package/dist/utils/service/serviceRateTypes.js.map +1 -0
  121. package/dist/utils/service/serviceRateUtils.d.ts +24 -0
  122. package/dist/utils/service/serviceRateUtils.d.ts.map +1 -0
  123. package/dist/utils/service/serviceRateUtils.js +183 -0
  124. package/dist/utils/service/serviceRateUtils.js.map +1 -0
  125. package/dist/utils/service/serviceUtils.d.ts +83 -0
  126. package/dist/utils/service/serviceUtils.d.ts.map +1 -0
  127. package/dist/utils/service/serviceUtils.js +311 -0
  128. package/dist/utils/service/serviceUtils.js.map +1 -0
  129. package/dist/utils/service/venueUtils.d.ts +13 -0
  130. package/dist/utils/service/venueUtils.d.ts.map +1 -0
  131. package/dist/utils/service/venueUtils.js +18 -0
  132. package/dist/utils/service/venueUtils.js.map +1 -0
  133. package/dist/utils/slugUtils.d.ts +9 -0
  134. package/dist/utils/slugUtils.d.ts.map +1 -0
  135. package/dist/utils/slugUtils.js +47 -0
  136. package/dist/utils/slugUtils.js.map +1 -0
  137. package/dist/utils/sortUtils.d.ts +7 -0
  138. package/dist/utils/sortUtils.d.ts.map +1 -0
  139. package/dist/utils/sortUtils.js +26 -0
  140. package/dist/utils/sortUtils.js.map +1 -0
  141. package/dist/utils/stringUtils.d.ts +2 -0
  142. package/dist/utils/stringUtils.d.ts.map +1 -0
  143. package/dist/utils/stringUtils.js +6 -0
  144. package/dist/utils/stringUtils.js.map +1 -0
  145. package/dist/utils/stripeAccountUtils.d.ts +3 -0
  146. package/dist/utils/stripeAccountUtils.d.ts.map +1 -0
  147. package/dist/utils/stripeAccountUtils.js +10 -0
  148. package/dist/utils/stripeAccountUtils.js.map +1 -0
  149. package/dist/utils/ticketListUtils.d.ts +12 -0
  150. package/dist/utils/ticketListUtils.d.ts.map +1 -0
  151. package/dist/utils/ticketListUtils.js +78 -0
  152. package/dist/utils/ticketListUtils.js.map +1 -0
  153. package/dist/utils/typeUtils.d.ts +11 -0
  154. package/dist/utils/typeUtils.d.ts.map +1 -0
  155. package/dist/utils/typeUtils.js +8 -0
  156. package/dist/utils/typeUtils.js.map +1 -0
  157. package/dist/utils/urlUtils.d.ts +10 -0
  158. package/dist/utils/urlUtils.d.ts.map +1 -0
  159. package/dist/utils/urlUtils.js +66 -0
  160. package/dist/utils/urlUtils.js.map +1 -0
  161. package/dist/utils/userPromoCodeUtils.d.ts +21 -0
  162. package/dist/utils/userPromoCodeUtils.d.ts.map +1 -0
  163. package/dist/utils/userPromoCodeUtils.js +13 -0
  164. package/dist/utils/userPromoCodeUtils.js.map +1 -0
  165. package/dist/utils/userSubscriptionUtils.d.ts +36 -0
  166. package/dist/utils/userSubscriptionUtils.d.ts.map +1 -0
  167. package/dist/utils/userSubscriptionUtils.js +56 -0
  168. package/dist/utils/userSubscriptionUtils.js.map +1 -0
  169. package/dist/utils/userUtils.d.ts +2 -0
  170. package/dist/utils/userUtils.d.ts.map +1 -0
  171. package/dist/utils/userUtils.js +2 -0
  172. package/dist/utils/userUtils.js.map +1 -0
  173. package/package.json +5 -3
  174. package/prisma/schema.prisma +117 -0
  175. package/src/definitions.ts +52 -1
  176. package/src/extendedSchemas.ts +177 -6
  177. package/src/index.ts +32 -21
  178. package/src/utils/blog/blogDbUtils.ts +343 -0
  179. package/src/utils/blogUtils.ts +134 -0
  180. package/src/utils/qrCodeUtils.ts +4 -2
  181. package/src/utils/service/apiServiceBookingApiUtils.ts +0 -0
  182. package/src/utils/slugUtils.ts +60 -0
  183. package/src/utils/ticketListUtils.ts +24 -6
  184. package/src/utils/typeUtils.ts +0 -0
@@ -0,0 +1,623 @@
1
+ import { DateTime, Interval } from "luxon";
2
+ import { dayOfWeekIdxToDay, dayOfWeekIdxToDayOfWeek, dayOfWeekToIdx, } from "./generalDateTimeUtils";
3
+ import { roundToNearestDivisor } from "./mathUtils";
4
+ const PARSE_TIME_REG = /^(\d{1,2}):(\d{2}) ?([APM]{0,2})$/i;
5
+ // export const LUXON_DATETIME_FORMAT_STANDARD = "MM/dd/yyyy - hh:mm a";
6
+ export const LUXON_DATETIME_FORMAT_STANDARD = "D t";
7
+ export const LUXON_DATETIME_FORMAT_ISO_LIKE = "D t"; //"D t";
8
+ // export const LUXON_DATE_FORMAT_STANDARD = "yyyy/MM/dd";
9
+ // export const LUXON_DATE_FORMAT_ISO = "yyyy/MM/dd";
10
+ export const LUXON_DATETIME_FORMAT_DATE = "D"; //"D t";
11
+ export const LUXON_TIME_FORMAT_AM_PM = "h:mm a";
12
+ export const MINUTES_PER_DAY = 1440;
13
+ export function dayOfWeekGetIdx(dayOfWeek) {
14
+ if (typeof dayOfWeek === "number") {
15
+ return dayOfWeek;
16
+ }
17
+ else if (typeof dayOfWeek === "string") {
18
+ return dayOfWeekToIdx[dayOfWeek];
19
+ }
20
+ else {
21
+ throw new Error(`dayOfWeekToIdx: unhandled case`);
22
+ }
23
+ }
24
+ export function dateTimeFromDayTime(dayOfWeek, hour = 0, minute = 0, interpretAsTimezone, timezoneToConvertTo) {
25
+ //use date where first day of month is a known sunday
26
+ let res = DateTime.fromObject({
27
+ year: 2023,
28
+ month: 1,
29
+ // weekday: dayOfWeekGetIdx(dayOfWeek),
30
+ day: dayOfWeekIdxToDay[dayOfWeekGetIdx(dayOfWeek)],
31
+ hour: hour,
32
+ minute: minute,
33
+ }, {
34
+ zone: interpretAsTimezone,
35
+ });
36
+ if (timezoneToConvertTo) {
37
+ res = res.setZone(timezoneToConvertTo);
38
+ }
39
+ return res;
40
+ }
41
+ export function dateTimeFromDate(date, interpretAsTimezone, timezoneToConvertTo) {
42
+ let res = typeof date === "string"
43
+ ? DateTime.fromISO(date, { zone: interpretAsTimezone })
44
+ : DateTime.fromJSDate(date, { zone: interpretAsTimezone });
45
+ if (timezoneToConvertTo) {
46
+ res = res.setZone(timezoneToConvertTo);
47
+ }
48
+ return res;
49
+ }
50
+ export function dateTimeToTimeComponents(dateTime) {
51
+ return {
52
+ hour: dateTime.hour,
53
+ minute: dateTime.minute,
54
+ };
55
+ }
56
+ export function dateTimeToDateComponents(dateTime) {
57
+ return {
58
+ year: dateTime.year,
59
+ month: dateTime.month,
60
+ day: dateTime.day,
61
+ };
62
+ }
63
+ export function dateTimeFromTime(time, interpretAsTimezone, timezoneToConvertTo) {
64
+ let res = typeof time === "string"
65
+ ? DateTime.fromFormat(time, LUXON_TIME_FORMAT_AM_PM, {
66
+ zone: interpretAsTimezone,
67
+ })
68
+ : DateTime.fromJSDate(time, { zone: interpretAsTimezone });
69
+ if (!res.isValid) {
70
+ return null;
71
+ }
72
+ if (timezoneToConvertTo) {
73
+ res = res.setZone(timezoneToConvertTo);
74
+ }
75
+ return res;
76
+ }
77
+ export function dateTimeFromComponents(date, time, interpretAsTimezone, timezoneToConvertTo) {
78
+ let res = date
79
+ ? DateTime.isDateTime(date)
80
+ ? date.setZone(interpretAsTimezone)
81
+ : dateTimeFromDate(date, interpretAsTimezone, timezoneToConvertTo)
82
+ : DateTime.now().setZone(timezoneToConvertTo ?? interpretAsTimezone ?? undefined);
83
+ const timeComp = DateTime.isDateTime(time)
84
+ ? time.setZone(interpretAsTimezone)
85
+ : dateTimeFromTime(time ?? "12:00 AM", interpretAsTimezone, timezoneToConvertTo);
86
+ if (!timeComp) {
87
+ return null;
88
+ }
89
+ res = dateTimeSetTime(res, timeComp);
90
+ if (timezoneToConvertTo) {
91
+ res = res.setZone(timezoneToConvertTo);
92
+ }
93
+ return res;
94
+ }
95
+ export function dateTimeGetDateTimeTime(dateTime) {
96
+ return DateTime.fromObject({
97
+ // day: dayOfWeekIdxToDay[dateTime.weekday as DayOfWeekIdx],
98
+ hour: dateTime.hour,
99
+ minute: dateTime.minute,
100
+ }, {
101
+ zone: dateTime.zone,
102
+ });
103
+ }
104
+ export function dateTimeSetTime(dateTime, time = { hour: 0, minute: 0 }) {
105
+ const timeComp = DateTime.isDateTime(time)
106
+ ? dateTimeToTimeComponents(time)
107
+ : time;
108
+ return dateTime.set(timeComp);
109
+ }
110
+ export function dateTimeSetDate(dateTime, date = { year: 2020, month: 1, day: 1 }) {
111
+ const dateComp = DateTime.isDateTime(date)
112
+ ? dateTimeToDateComponents(date)
113
+ : date;
114
+ return dateTime.set(dateComp);
115
+ }
116
+ export function dateRangeGetDateTimeTIme(dateRange) {
117
+ return {
118
+ start: dateTimeGetDateTimeTime(dateRange.start),
119
+ end: dateTimeGetDateTimeTime(dateRange.end),
120
+ };
121
+ }
122
+ export function dateTimeFormat(dateTime) {
123
+ return dateTime?.toFormat(LUXON_DATETIME_FORMAT_STANDARD) ?? "";
124
+ }
125
+ export function dateTimeFormatLong(dateTime) {
126
+ return `${dateTime?.weekdayLong} ${dateTimeFormatWeek(dateTime)}`;
127
+ }
128
+ export function dateTimeFormatWeek(dateTime) {
129
+ return dateTime?.toFormat(LUXON_DATETIME_FORMAT_STANDARD) ?? "";
130
+ }
131
+ export function dateTimeFormatDate(dateTime) {
132
+ return dateTime?.toFormat(LUXON_DATETIME_FORMAT_DATE) ?? "";
133
+ }
134
+ export function dateTimeFormatTime(dateTime) {
135
+ return dateTime?.toFormat(LUXON_TIME_FORMAT_AM_PM) ?? "";
136
+ }
137
+ export function dateTimeWithinRange(dateTime, dateRange) {
138
+ return Interval.fromDateTimes(dateRange.start, dateRange.end).contains(dateTime);
139
+ }
140
+ export function dateTimeRangeIntersection(lhs, rhs) {
141
+ const intervalFirst = Interval.fromDateTimes(lhs.start, lhs.end);
142
+ const intervalSecond = Interval.fromDateTimes(rhs.start, rhs.end);
143
+ return intervalFirst.intersection(intervalSecond);
144
+ }
145
+ export function dateRangeWithinDateRange(dateRange, withinRange) {
146
+ const withinInterval = Interval.fromDateTimes(withinRange.start, withinRange.end);
147
+ return (withinInterval.contains(dateRange.start) &&
148
+ withinInterval.contains(dateRange.end));
149
+ }
150
+ export function dateTimeRangeToInterval(dateTimeRange) {
151
+ return Interval.fromDateTimes(dateTimeRange.start, dateTimeRange.end);
152
+ }
153
+ export function dateRangeDurationMatch(lhs, rhs, withinSeconds = 60) {
154
+ return (Math.abs(lhs.end.diff(lhs.start).toMillis() - rhs.end.diff(rhs.end).toMillis()) <=
155
+ withinSeconds * 1000);
156
+ }
157
+ export function utcOffsetMinutesToTimezone(utcOffsetMinutes) {
158
+ const hours = Math.floor(Math.abs(utcOffsetMinutes) / 60);
159
+ const minutes = Math.abs(utcOffsetMinutes) % 60;
160
+ const sign = utcOffsetMinutes >= 0 ? "+" : "-";
161
+ const offsetString = `UTC${sign}${String(hours).padStart(2, "0")}:${String(minutes).padStart(2, "0")}`;
162
+ return offsetString;
163
+ }
164
+ // export function getLocalTimezone() {
165
+ // const localDateTime = DateTime.local();
166
+ // return utcOffsetMinutesToTimezone(localDateTime.offset);
167
+ // }
168
+ export function dateTimeFormatDateRange(startDateTimeArg, endDateTimeArg) {
169
+ if (startDateTimeArg?.day === endDateTimeArg?.day) {
170
+ return `${dateTimeFormat(startDateTimeArg)} to ${dateTimeFormatTime(endDateTimeArg)}`;
171
+ }
172
+ return `${dateTimeFormat(startDateTimeArg)} to ${dateTimeFormat(endDateTimeArg)}`;
173
+ }
174
+ export function dateTimeFormatDateRangeDate(startDateTimeArg, endDateTimeArg) {
175
+ if (startDateTimeArg?.day === endDateTimeArg?.day) {
176
+ return `${dateTimeFormatDate(startDateTimeArg)} to ${dateTimeFormatDate(endDateTimeArg)}`;
177
+ }
178
+ return `${dateTimeFormatDate(startDateTimeArg)} to ${dateTimeFormatDate(endDateTimeArg)}`;
179
+ }
180
+ export function dateTimeFormatDateRangeList(startDateTimeArg, endDateTimeArg) {
181
+ if (startDateTimeArg?.day === endDateTimeArg?.day) {
182
+ return {
183
+ start: dateTimeFormat(startDateTimeArg),
184
+ end: dateTimeFormatTime(endDateTimeArg),
185
+ };
186
+ }
187
+ return {
188
+ start: dateTimeFormat(startDateTimeArg),
189
+ end: dateTimeFormat(endDateTimeArg),
190
+ };
191
+ }
192
+ export function formatDayOfWeekHours(hours) {
193
+ return Object.entries(hours).map(([dayIdx, ranges]) => {
194
+ const dayName = dayOfWeekIdxToDayOfWeek[parseInt(dayIdx, 10)]; // Convert index to day name
195
+ const formattedRanges = ranges
196
+ .map(({ start, end }) => `${start.toFormat("h:mm a")} – ${end.toFormat("h:mm a")}`)
197
+ .join(", ");
198
+ return `${dayName}: ${formattedRanges}`;
199
+ });
200
+ }
201
+ export function mergeCrossDayHours(hours) {
202
+ if (hours.length === 0)
203
+ return [];
204
+ // Sort by start time
205
+ const sortedHours = hours.sort((a, b) => a.start.toMillis() - b.start.toMillis());
206
+ const mergedHours = [];
207
+ for (const range of sortedHours) {
208
+ if (mergedHours.length === 0) {
209
+ mergedHours.push(range);
210
+ continue;
211
+ }
212
+ const lastMerged = mergedHours[mergedHours.length - 1];
213
+ // Calculate the time difference between last merged range end and current range start
214
+ const gapInMinutes = range.start.diff(lastMerged.end, "minutes").minutes;
215
+ // If the gap is 1 minute or less, merge the ranges
216
+ if (gapInMinutes <= 1) {
217
+ lastMerged.end = range.end; // Extend the end time
218
+ }
219
+ else {
220
+ mergedHours.push(range); // Otherwise, treat it as a new separate range
221
+ }
222
+ }
223
+ return mergedHours;
224
+ }
225
+ export function dateTimeHoursByDay(hours) {
226
+ return hours.reduce((sofar, curr) => {
227
+ sofar[curr.start.weekday].push(curr);
228
+ sofar[curr.start.weekday] = mergeCrossDayHours(sofar[curr.start.weekday]);
229
+ return sofar;
230
+ }, Object.keys(dayOfWeekIdxToDayOfWeek).reduce((sofar, curr) => {
231
+ return {
232
+ ...sofar,
233
+ [Number(curr)]: [],
234
+ };
235
+ }, {}));
236
+ }
237
+ export function normalizeLuxonInterval(interval) {
238
+ const setArgs = { year: 0, month: 1, day: 1 };
239
+ const timezone = interval?.start?.zone || interval?.end?.zone || "local";
240
+ const originalStart = interval?.start;
241
+ const originalEnd = interval?.end;
242
+ const start = originalStart?.set(setArgs) ??
243
+ DateTime.fromObject(setArgs, { zone: timezone });
244
+ let end = originalEnd?.set(setArgs) ??
245
+ DateTime.fromObject(setArgs, { zone: timezone });
246
+ if (originalEnd &&
247
+ originalStart &&
248
+ originalEnd.hasSame(originalStart, "day") === false) {
249
+ end = end.set({ hour: 23, minute: 59 });
250
+ }
251
+ return Interval.fromDateTimes(start, end);
252
+ }
253
+ export function dateRangeIntervalFromWeekdayTime(dateRange) {
254
+ return Interval.fromDateTimes(dateRange.start, dateRange.end);
255
+ }
256
+ // Helper function to calculate overlaps for a single day's array of hours
257
+ function getOverlappingIntervalsList(ranges, inputInterval) {
258
+ // Convert LuxonDateRange objects to Interval objects
259
+ const rangeIntervals = ranges.map(({ start, end }) => Interval.fromDateTimes(start, end));
260
+ // Find overlapping intervals between the range intervals and the single input interval
261
+ return rangeIntervals
262
+ .map((rangeInterval) => rangeInterval.intersection(inputInterval))
263
+ .filter((interval) => interval !== null);
264
+ }
265
+ //returns common horus that are overlapping with input Interval on everyday (with valid hours) within weekHours
266
+ export function dateTimeGetOverlappingHoursCommonHelper(weekHours, inputInterval) {
267
+ console.log(`dateTimeGetOverlappingHoursCommonHelper weekHours: ${JSON.stringify(weekHours)}, inputInterval: ${JSON.stringify(inputInterval)}`);
268
+ let commonInterval = null;
269
+ // const inputIntervalNormalized = normalizeLuxonInterval(inputInterval);
270
+ for (const dayIdx in weekHours) {
271
+ const dayKey = parseInt(dayIdx);
272
+ // console.log(`dateTimeGetCommonOverlappingHours dayIdx: ${dayIdx}`);
273
+ if (weekHours[dayKey] == null) {
274
+ continue;
275
+ }
276
+ // Calculate overlapping intervals for the current day
277
+ const dailyIntervals = getOverlappingIntervalsList(weekHours[dayKey], inputInterval);
278
+ console.log(`dateTimeGetOverlappingHoursCommonHelper dayIdx: ${dayIdx}, dailyIntervals: ${JSON.stringify(dailyIntervals)}`);
279
+ if (dailyIntervals.length === 0) {
280
+ // No overlap for this day, so no common interval is possible
281
+ continue;
282
+ }
283
+ // Treat each daily interval separately
284
+ const dailyTimeIntervals = dailyIntervals
285
+ .filter((dailyInterval) => dailyInterval.start !== null && dailyInterval.end !== null)
286
+ .map((dailyInterval) => {
287
+ return normalizeLuxonInterval(dailyInterval);
288
+ });
289
+ // Find the intersection of all daily intervals with the current common interval
290
+ for (const dailyTimeInterval of dailyTimeIntervals) {
291
+ if (commonInterval === null) {
292
+ commonInterval = dailyTimeInterval;
293
+ }
294
+ else {
295
+ commonInterval = commonInterval.intersection(dailyTimeInterval);
296
+ if (commonInterval === null) {
297
+ // If no common interval remains, return null early
298
+ return null;
299
+ }
300
+ }
301
+ }
302
+ }
303
+ // console.log(
304
+ // `dateTimeGetCommonOverlappingHours commonInterval: ${JSON.stringify(
305
+ // commonInterval
306
+ // )}`
307
+ // );
308
+ // Convert the common interval to a LuxonDateRange if it exists
309
+ if (commonInterval == null ||
310
+ commonInterval.start == null ||
311
+ commonInterval.end == null) {
312
+ return null;
313
+ }
314
+ return {
315
+ start: commonInterval.start,
316
+ end: commonInterval.end,
317
+ };
318
+ }
319
+ export function dateTimeGetOverlappingHoursCommon(weekHours, inputHours) {
320
+ const inputInterval = Interval.fromDateTimes(inputHours.start, inputHours.end);
321
+ return dateTimeGetOverlappingHoursCommonHelper(weekHours, inputInterval);
322
+ }
323
+ // Returns a list of overlapping hours for any dateRange in weekHours[startDay of inputRange]
324
+ export function dateTimeGetOverlappingHoursContinuousHelper(weekHours, inputInterval) {
325
+ console.log(`dateTimeGetOverlappingHoursContinuousHelper weekHours: ${JSON.stringify(weekHours)}, inputRange: ${JSON.stringify(inputInterval)}`);
326
+ if (!inputInterval.start) {
327
+ return null;
328
+ }
329
+ const startDayIdx = inputInterval.start.weekday;
330
+ if (!weekHours[startDayIdx]) {
331
+ return null;
332
+ }
333
+ // Calculate overlapping intervals for the start day of inputRange
334
+ const overlappingIntervals = getOverlappingIntervalsList(weekHours[startDayIdx], inputInterval);
335
+ console.log(`dateTimeGetOverlappingHoursContinuousHelper startDayIdx: ${startDayIdx}, overlappingIntervals: ${JSON.stringify(overlappingIntervals)}`);
336
+ // Convert overlapping intervals back to LuxonDateRange[]
337
+ return overlappingIntervals
338
+ .filter((interval) => interval.start !== null && interval.end !== null)
339
+ .map((interval) => ({
340
+ start: interval.start,
341
+ end: interval.end,
342
+ }));
343
+ }
344
+ export function dateTimeGetOverlappingHoursContinuous(weekHours, inputHours) {
345
+ const inputInterval = Interval.fromDateTimes(inputHours.start, inputHours.end);
346
+ return dateTimeGetOverlappingHoursContinuousHelper(weekHours, inputInterval);
347
+ }
348
+ export function filterConflictingIntervals(availableHours, blockedHours) {
349
+ // Convert available hours into an array of Intervals
350
+ let remainingIntervals = availableHours.map(({ start, end }) => Interval.fromDateTimes(start, end));
351
+ // Convert blocked hours into Intervals and subtract them from each available interval
352
+ blockedHours
353
+ .map(({ start, end }) => Interval.fromDateTimes(start, end))
354
+ .forEach((blockedInterval) => {
355
+ remainingIntervals = remainingIntervals.flatMap((availableInterval) => availableInterval.difference(blockedInterval));
356
+ });
357
+ // Convert the resulting Intervals back to LuxonDateRange[]
358
+ return remainingIntervals.map((interval) => ({
359
+ start: interval.start,
360
+ end: interval.end,
361
+ }));
362
+ }
363
+ export function getConflictingIntervals(availableHours, blockedHours) {
364
+ // Convert available hours and blocked hours into arrays of Luxon Intervals
365
+ const availableIntervals = availableHours.map(({ start, end }) => Interval.fromDateTimes(start, end));
366
+ const blockedIntervals = blockedHours.map(({ start, end }) => Interval.fromDateTimes(start, end));
367
+ // For each available interval, find intersections with each blocked interval
368
+ const conflictingIntervals = [];
369
+ availableIntervals.forEach((availableInterval) => {
370
+ blockedIntervals.forEach((blockedInterval) => {
371
+ const intersection = availableInterval.intersection(blockedInterval);
372
+ if (intersection) {
373
+ conflictingIntervals.push(intersection);
374
+ }
375
+ });
376
+ });
377
+ // Convert the resulting conflicting Intervals back to LuxonDateRange[]
378
+ return conflictingIntervals.map((interval) => ({
379
+ start: interval.start,
380
+ end: interval.end,
381
+ }));
382
+ }
383
+ // export function generateTimeSlots(
384
+ // filteredHours: LuxonDateRange[],
385
+ // bookedRange: LuxonDateRange,
386
+ // businessHours: LuxonDayOfWeekHours
387
+ // ): TimeSlots {
388
+ // const timeSlotsStart: string[] = [];
389
+ // let timeSlotsEnd: string[] = [];
390
+ // let currentTime = bookedRange.start;
391
+ // const endTime = bookedRange.end;
392
+ // while (currentTime < endTime) {
393
+ // const currentDayOfWeek = currentTime.weekday as DayOfWeekIdx;
394
+ // const businessDayHours = businessHours[currentDayOfWeek]?.[0];
395
+ // if (!businessDayHours) {
396
+ // throw new Error("No business hours found for the current day.");
397
+ // }
398
+ // const { start: dayStart, end: dayEnd } = businessDayHours;
399
+ // // Ensure the current time is within today's business hours
400
+ // if (currentTime < dayStart) {
401
+ // currentTime = dayStart;
402
+ // }
403
+ // // If adding 30 minutes exceeds today's boundary, jump to the next day's start
404
+ // if (currentTime.plus({ minutes: 30 }) > dayEnd) {
405
+ // const nextDayOfWeek = currentTime.plus({ days: 1 })
406
+ // .weekday as DayOfWeekIdx;
407
+ // const nextDayHours = businessHours[nextDayOfWeek]?.[0];
408
+ // if (!nextDayHours) {
409
+ // throw new Error("No business hours for the next day.");
410
+ // }
411
+ // currentTime = nextDayHours.start;
412
+ // } else {
413
+ // timeSlotsStart.push(dateTimeFormatTime(currentTime));
414
+ // currentTime = currentTime.plus({ minutes: 30 });
415
+ // }
416
+ // }
417
+ // // The last slot should match the end time, respecting endDayOfWeek business hours
418
+ // const endDayOfWeek = bookedRange.end.weekday as DayOfWeekIdx;
419
+ // const endDayHours = businessHours[endDayOfWeek]?.[0];
420
+ // if (!endDayHours) {
421
+ // throw new Error("No business hours for the final day.");
422
+ // }
423
+ // const finalEndTime =
424
+ // bookedRange.end > endDayHours.end ? endDayHours.end : bookedRange.end;
425
+ // timeSlotsEnd = [...timeSlotsStart.slice(1), dateTimeFormatTime(finalEndTime)];
426
+ // return {
427
+ // start: timeSlotsStart,
428
+ // end: timeSlotsEnd,
429
+ // } as TimeSlots;
430
+ // }
431
+ // export function generateTimeSlots(filteredHours: LuxonDateRange[]): TimeSlots {
432
+ // const timeSlotsStart: string[] = [];
433
+ // let timeSlotsEnd: string[] = [];
434
+ // filteredHours.forEach(({ start, end }) => {
435
+ // let currentTime = start;
436
+ // while (currentTime < end) {
437
+ // timeSlotsStart.push(dateTimeFormatTime(currentTime)); // Add the time in "HH:mm" format
438
+ // currentTime = currentTime.plus({ minutes: 30 }); // Increment by 30 minutes
439
+ // }
440
+ // const finalTime =
441
+ // currentTime.hour == 0 && currentTime.minute == 0
442
+ // ? currentTime.set({ hour: 23, minute: 59 })
443
+ // : currentTime;
444
+ // timeSlotsEnd = [...timeSlotsStart, dateTimeFormatTime(finalTime)];
445
+ // });
446
+ // return {
447
+ // start: timeSlotsStart,
448
+ // end: timeSlotsEnd,
449
+ // } as TimeSlots;
450
+ // }
451
+ export function generateTimeSlots(filteredHours, incMin = 15) {
452
+ const timeSlotsStart = [];
453
+ let timeSlotsEnd = [];
454
+ filteredHours.forEach(({ start, end }) => {
455
+ let currentTime = start;
456
+ const startEnd = start.set({ hour: 23, minute: 59 });
457
+ const endEnd = end.set({ hour: 23, minute: 59 });
458
+ while (currentTime < startEnd) {
459
+ timeSlotsStart.push(dateTimeFormatTime(currentTime)); // Add the time in "HH:mm" format
460
+ currentTime = currentTime.plus({ minutes: incMin }); // Increment by 30 minutes
461
+ }
462
+ currentTime = end;
463
+ while (currentTime < endEnd) {
464
+ timeSlotsEnd.push(dateTimeFormatTime(currentTime)); // Add the time in "HH:mm" format
465
+ currentTime = currentTime.plus({ minutes: incMin }); // Increment by 30 minutes
466
+ }
467
+ const finalTime = currentTime.hour == 0 && currentTime.minute == 0
468
+ ? currentTime.set({ hour: 23, minute: 59 })
469
+ : currentTime;
470
+ timeSlotsEnd = [...timeSlotsEnd, dateTimeFormatTime(finalTime)];
471
+ });
472
+ return {
473
+ start: timeSlotsStart,
474
+ end: timeSlotsEnd,
475
+ };
476
+ }
477
+ export function dateTimeNormalizeToMWY(srcDate, referenceDate) {
478
+ const srcWeekday = srcDate.weekday;
479
+ const firstDayOfReferenceMonth = DateTime.fromObject({
480
+ year: referenceDate.year,
481
+ month: referenceDate.month,
482
+ day: 1,
483
+ }, { zone: srcDate.zone });
484
+ const weekdayOffset = (srcWeekday - firstDayOfReferenceMonth.weekday + 7) % 7;
485
+ const referenceWeekday = firstDayOfReferenceMonth.plus({
486
+ days: weekdayOffset,
487
+ });
488
+ const referenceWeek = Math.ceil((referenceDate.day - 1 - weekdayOffset) / 7); //ceil instead of floor to ensure week wraps around forward and not backwards
489
+ const normalizedDate = referenceWeekday.plus({ weeks: referenceWeek }).set({
490
+ hour: srcDate.hour,
491
+ minute: srcDate.minute,
492
+ });
493
+ // console.log(
494
+ // `dateTimeNormalizeToMWY: srcDate: ${JSON.stringify(
495
+ // srcDate
496
+ // )}, referenceDate: ${JSON.stringify(
497
+ // referenceDate
498
+ // )}, referenceDate: ${JSON.stringify(normalizedDate)}`
499
+ // );
500
+ return normalizedDate;
501
+ }
502
+ export function dateRangeNormalizeToMWY(srcRange, referenceRange) {
503
+ // Calculate the original duration between start and end
504
+ const originalDuration = srcRange.end.diff(srcRange.start, [
505
+ "weeks",
506
+ "days",
507
+ "hours",
508
+ ]);
509
+ // Normalize the start date
510
+ const newStart = dateTimeNormalizeToMWY(srcRange.start, referenceRange.start);
511
+ // Apply the duration to the normalized start to compute the new end
512
+ let newEnd = newStart.plus(originalDuration);
513
+ // Check if the end date wraps around to the next week
514
+ if (newEnd.weekNumber < newStart.weekNumber) {
515
+ // Adjust to the next week by adding one week
516
+ newEnd = newEnd.plus({ weeks: 1 });
517
+ }
518
+ const newRange = {
519
+ start: newStart,
520
+ end: newEnd,
521
+ };
522
+ // console.log(
523
+ // `dateRangeNormalizeToMWY srcRange: ${JSON.stringify(
524
+ // srcRange
525
+ // )}, referenceRange: ${JSON.stringify(
526
+ // referenceRange
527
+ // )}, newRange: ${JSON.stringify(newRange)}`
528
+ // );
529
+ return newRange;
530
+ }
531
+ //need function to extend out businesshours until the date of the reference range
532
+ //need function to merge overlap[startDate] if they continue onto the next day
533
+ export function luxonDateRangeSort(dateRanges) {
534
+ return dateRanges.sort((a, b) => a.start.toMillis() - b.start.toMillis());
535
+ }
536
+ export function dateTimeDiffHours(startTime, endTime) {
537
+ // console.log(
538
+ // `calculateHoursBetweenTimes startTime: ${JSON.stringify(
539
+ // startTime
540
+ // )}, endTime: ${JSON.stringify(endTime)}`
541
+ // );
542
+ if (startTime == null || endTime == null) {
543
+ return 0;
544
+ }
545
+ const diff = endTime.diff(startTime, ["minutes", "days"]).toObject();
546
+ const hours = ((diff.minutes ?? 0) + 1) / 60;
547
+ const days = (diff.days ?? 0) + 1;
548
+ // console.log(`calculateHoursBetweenTimes diff: ${JSON.stringify(diff)}`);
549
+ return roundToNearestDivisor(hours * days, 4); //round to nearest quarter hour
550
+ }
551
+ export function dateTimeRangeHours(dateTimeRange) {
552
+ return roundToNearestDivisor(dateTimeRangeToInterval(dateTimeRange).toDuration("hours").toObject()
553
+ ?.hours ?? 0, 4); //round to nearest quarter hour
554
+ }
555
+ export function dateTimeRangeCrossesMidnight(range) {
556
+ return (range.start.hour > range.end.hour ||
557
+ (range.start.hour === range.end.hour &&
558
+ range.start.minute >= range.end.minute));
559
+ }
560
+ /**
561
+ * Given an overall range, split it into segments that use the input's
562
+ * start time as the daily "start" and the input's end time as the daily "end."
563
+ *
564
+ * Each segment will run from a day's daily start to the next day's daily end.
565
+ *
566
+ * For example, if the overall range is:
567
+ * start: March 5, 2025 11:00 am
568
+ * end: March 9, 2025 9:00 pm
569
+ *
570
+ * then the segments produced are:
571
+ * March 5, 11:00 am – March 6, 9:00 pm
572
+ * March 6, 11:00 am – March 7, 9:00 pm
573
+ * March 7, 11:00 am – March 8, 9:00 pm
574
+ * March 8, 11:00 am – March 9, 9:00 pm
575
+ *
576
+ * (You can then filter out partial segments if you want only full "days.")
577
+ */
578
+ export function splitRangeByInputTimes(range) {
579
+ const startTime = dateTimeToTimeComponents(range.start);
580
+ const endTime = dateTimeToTimeComponents(range.end);
581
+ const segments = [];
582
+ // Determine if the range crosses midnight.
583
+ const crossesMidnight = dateTimeRangeCrossesMidnight(range);
584
+ // Set the first segment's start.
585
+ let currentStart = range.start.set(startTime);
586
+ if (currentStart < range.start) {
587
+ currentStart = currentStart.plus({ days: 1 });
588
+ }
589
+ while (true) {
590
+ // Determine current segment's end depending on whether we cross midnight.
591
+ const currentEnd = crossesMidnight
592
+ ? currentStart.plus({ days: 1 }).set(endTime)
593
+ : currentStart.set(endTime);
594
+ if (currentEnd > range.end) {
595
+ // segments.push({ start: currentStart, end: range.end });
596
+ break;
597
+ }
598
+ segments.push({ start: currentStart, end: currentEnd });
599
+ // Move to the next segment's start:
600
+ // (Always add one day and then snap to the start time.)
601
+ currentStart = currentStart.plus({ days: 1 }).set(startTime);
602
+ }
603
+ return segments;
604
+ }
605
+ export function dateTimeRangeFromDates(startDate, endDate, interpretAsTimezone, timezoneToConvertTo) {
606
+ return {
607
+ start: dateTimeFromDate(startDate, interpretAsTimezone, timezoneToConvertTo),
608
+ end: dateTimeFromDate(endDate, interpretAsTimezone, timezoneToConvertTo),
609
+ };
610
+ }
611
+ export function dateTimeFromString(str) {
612
+ return DateTime.fromISO(str);
613
+ }
614
+ export function dateTimeToString(dateTime) {
615
+ return dateTime.toISO();
616
+ }
617
+ export function dateRangesFormat(dateRanges) {
618
+ const result = dateRanges
619
+ .map((dateRange) => dateTimeFormatDateRange(dateRange.start, dateRange.end))
620
+ .join(", ");
621
+ return result;
622
+ }
623
+ //# sourceMappingURL=luxonUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"luxonUtils.js","sourceRoot":"","sources":["../../src/utils/luxonUtils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function roundToNearestDivisor(num: number, div: number): number;
2
+ //# sourceMappingURL=mathUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mathUtils.d.ts","sourceRoot":"","sources":["../../src/utils/mathUtils.ts"],"names":[],"mappings":"AAAA,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAEtE"}