@perdieminc/time-slots 0.0.1 → 0.0.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.
Files changed (78) hide show
  1. package/README.md +2 -2
  2. package/lib/constants.d.ts +36 -0
  3. package/lib/constants.d.ts.map +1 -0
  4. package/lib/constants.js +36 -0
  5. package/lib/constants.js.map +1 -0
  6. package/lib/index.d.ts +10 -0
  7. package/lib/index.d.ts.map +1 -0
  8. package/lib/index.js +41 -0
  9. package/lib/index.js.map +1 -0
  10. package/lib/schedule/available-dates.d.ts +3 -0
  11. package/lib/schedule/available-dates.d.ts.map +1 -0
  12. package/lib/schedule/available-dates.js +84 -0
  13. package/lib/schedule/available-dates.js.map +1 -0
  14. package/lib/schedule/generate.d.ts +3 -0
  15. package/lib/schedule/generate.d.ts.map +1 -0
  16. package/lib/schedule/generate.js +155 -0
  17. package/lib/schedule/generate.js.map +1 -0
  18. package/lib/schedule/get-schedules.d.ts +3 -0
  19. package/lib/schedule/get-schedules.d.ts.map +1 -0
  20. package/lib/schedule/get-schedules.js +161 -0
  21. package/lib/schedule/get-schedules.js.map +1 -0
  22. package/lib/schedule/location.d.ts +3 -0
  23. package/lib/schedule/location.d.ts.map +1 -0
  24. package/lib/schedule/location.js +38 -0
  25. package/lib/schedule/location.js.map +1 -0
  26. package/lib/types/index.d.ts +7 -0
  27. package/lib/types/index.d.ts.map +1 -0
  28. package/lib/types/index.js +3 -0
  29. package/lib/types/index.js.map +1 -0
  30. package/lib/types.d.ts +24 -0
  31. package/lib/types.js +2 -0
  32. package/lib/utils/business-hours.d.ts +6 -0
  33. package/lib/utils/business-hours.d.ts.map +1 -0
  34. package/lib/utils/business-hours.js +82 -0
  35. package/lib/utils/business-hours.js.map +1 -0
  36. package/lib/utils/catering.d.ts +9 -0
  37. package/lib/utils/catering.d.ts.map +1 -0
  38. package/lib/utils/catering.js +56 -0
  39. package/lib/utils/catering.js.map +1 -0
  40. package/lib/utils/date.d.ts +15 -0
  41. package/lib/utils/date.d.ts.map +1 -0
  42. package/lib/utils/date.js +109 -0
  43. package/lib/utils/date.js.map +1 -0
  44. package/lib/utils/schedule-filter.d.ts +8 -0
  45. package/lib/utils/schedule-filter.d.ts.map +1 -0
  46. package/lib/utils/schedule-filter.js +95 -0
  47. package/lib/utils/schedule-filter.js.map +1 -0
  48. package/lib/utils/store-hours.d.ts +14 -0
  49. package/lib/utils/store-hours.d.ts.map +1 -0
  50. package/lib/utils/store-hours.js +120 -0
  51. package/lib/utils/store-hours.js.map +1 -0
  52. package/lib/utils/time.d.ts +12 -0
  53. package/lib/utils/time.d.ts.map +1 -0
  54. package/lib/utils/time.js +30 -0
  55. package/lib/utils/time.js.map +1 -0
  56. package/lib/utils.d.ts +8 -0
  57. package/lib/utils.js +18 -0
  58. package/package.json +8 -7
  59. package/src/constants.ts +0 -45
  60. package/src/index.ts +0 -23
  61. package/src/schedule/available-dates.ts +0 -129
  62. package/src/schedule/generate.ts +0 -276
  63. package/src/schedule/get-schedules.ts +0 -264
  64. package/src/schedule/location.ts +0 -58
  65. package/src/types/business-hours.d.ts +0 -32
  66. package/src/types/common.d.ts +0 -5
  67. package/src/types/get-schedules.d.ts +0 -122
  68. package/src/types/index.ts +0 -34
  69. package/src/types/location.d.ts +0 -25
  70. package/src/types/schedule-filter.d.ts +0 -27
  71. package/src/types/schedule.d.ts +0 -83
  72. package/src/types/timezone-support.d.ts +0 -31
  73. package/src/utils/business-hours.ts +0 -120
  74. package/src/utils/catering.ts +0 -85
  75. package/src/utils/date.ts +0 -163
  76. package/src/utils/schedule-filter.ts +0 -140
  77. package/src/utils/store-hours.ts +0 -223
  78. package/src/utils/time.ts +0 -38
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateLocationFulfillmentSchedule = generateLocationFulfillmentSchedule;
4
+ const date_fns_1 = require("date-fns");
5
+ const constants_1 = require("../constants");
6
+ const business_hours_1 = require("../utils/business-hours");
7
+ const available_dates_1 = require("./available-dates");
8
+ const generate_1 = require("./generate");
9
+ function generateLocationFulfillmentSchedule({ startDate, prepTimeFrequency = 0, prepTimeCadence = constants_1.PREP_TIME_CADENCE.MINUTE, weekDayPrepTimes, location, fulfillmentPreference, businessHoursOverrides = [], preSaleHoursOverride, gapInMinutes, daysCount = 1, preSaleDates = [], presalePickupWeekDays = [], endDate = null, platform = constants_1.PLATFORM.WEB, }) {
10
+ const isDaysCadence = prepTimeCadence === constants_1.PREP_TIME_CADENCE.DAY;
11
+ const businessHours = (0, business_hours_1.getLocationBusinessHoursForFulfillment)(location, fulfillmentPreference);
12
+ const dates = (0, available_dates_1.getNextAvailableDates)({
13
+ startDate,
14
+ businessHours,
15
+ businessHoursOverrides,
16
+ timeZone: location.timezone,
17
+ datesCount: daysCount,
18
+ preSaleDates,
19
+ endDate,
20
+ presalePickupWeekDays,
21
+ isDaysCadence,
22
+ platform,
23
+ });
24
+ // If prepTimeCadence is days, we need to skip opening days by prepTimeFrequency
25
+ const availableDates = isDaysCadence ? dates.slice(prepTimeFrequency) : dates;
26
+ return (0, generate_1.generateSchedule)({
27
+ currentDate: (0, date_fns_1.roundToNearestMinutes)(startDate),
28
+ weekDayPrepTimes,
29
+ timeZone: location.timezone,
30
+ dates: availableDates,
31
+ businessHours,
32
+ businessHoursOverrides,
33
+ preSaleHoursOverride,
34
+ gapInMinutes,
35
+ prepTimeCadence,
36
+ });
37
+ }
38
+ //# sourceMappingURL=location.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"location.js","sourceRoot":"","sources":["../../src/schedule/location.ts"],"names":[],"mappings":";;AAUA,kFA+CC;AAzDD,uCAAiD;AACjD,4CAA2D;AAK3D,4DAAiF;AACjF,uDAA0D;AAC1D,yCAA8C;AAE9C,SAAgB,mCAAmC,CAAC,EACnD,SAAS,EACT,iBAAiB,GAAG,CAAC,EACrB,eAAe,GAAG,6BAAiB,CAAC,MAAM,EAC1C,gBAAgB,EAChB,QAAQ,EACR,qBAAqB,EACrB,sBAAsB,GAAG,EAAE,EAC3B,oBAAoB,EACpB,YAAY,EACZ,SAAS,GAAG,CAAC,EACb,YAAY,GAAG,EAAE,EACjB,qBAAqB,GAAG,EAAE,EAC1B,OAAO,GAAG,IAAI,EACd,QAAQ,GAAG,oBAAQ,CAAC,GAAG,GACoB;IAC3C,MAAM,aAAa,GAAG,eAAe,KAAK,6BAAiB,CAAC,GAAG,CAAC;IAChE,MAAM,aAAa,GAAG,IAAA,uDAAsC,EAC3D,QAAQ,EACR,qBAAqB,CACrB,CAAC;IAEF,MAAM,KAAK,GAAG,IAAA,uCAAqB,EAAC;QACnC,SAAS;QACT,aAAa;QACb,sBAAsB;QACtB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;QAC3B,UAAU,EAAE,SAAS;QACrB,YAAY;QACZ,OAAO;QACP,qBAAqB;QACrB,aAAa;QACb,QAAQ;KACR,CAAC,CAAC;IACH,gFAAgF;IAChF,MAAM,cAAc,GAAG,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAC9E,OAAO,IAAA,2BAAgB,EAAC;QACvB,WAAW,EAAE,IAAA,gCAAqB,EAAC,SAAS,CAAC;QAC7C,gBAAgB;QAChB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;QAC3B,KAAK,EAAE,cAAc;QACrB,aAAa;QACb,sBAAsB;QACtB,oBAAoB;QACpB,YAAY;QACZ,eAAe;KACf,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ export type { BusinessHour, BusinessHourInput, BusinessHoursOverrideInput, BusinessHoursOverrideOutput, } from "./business-hours";
2
+ export type { BusyTimeItem } from "./common";
3
+ export type { CartItem, CateringPrepTimeResult, GetCateringPrepTimeParams, GetSchedulesParams, GetSchedulesResult, InitScheduleParams, InitScheduleResult, PrepTimeSettings, PreSaleConfig, StoreConfig, WeeklyPreSaleConfig, } from "./get-schedules";
4
+ export type { FulfillmentPreference, LocationLike } from "./location";
5
+ export type { DaySchedule, FulfillmentSchedule, GenerateLocationFulfillmentScheduleParams, GenerateScheduleParams, GetNextAvailableDatesParams, GetOpeningClosingTimeOnDateParams, Platform, } from "./schedule";
6
+ export type { FilterBusyTimesFromScheduleParams, MenuType, } from "./schedule-filter";
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACX,YAAY,EACZ,iBAAiB,EACjB,0BAA0B,EAC1B,2BAA2B,GAC3B,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAC7C,YAAY,EACX,QAAQ,EACR,sBAAsB,EACtB,yBAAyB,EACzB,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,gBAAgB,EAChB,aAAa,EACb,WAAW,EACX,mBAAmB,GACnB,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACtE,YAAY,EACX,WAAW,EACX,mBAAmB,EACnB,yCAAyC,EACzC,sBAAsB,EACtB,2BAA2B,EAC3B,iCAAiC,EACjC,QAAQ,GACR,MAAM,YAAY,CAAC;AACpB,YAAY,EACX,iCAAiC,EACjC,QAAQ,GACR,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":""}
package/lib/types.d.ts ADDED
@@ -0,0 +1,24 @@
1
+ /**
2
+ * A single time slot with start and end.
3
+ */
4
+ export interface TimeSlot {
5
+ start: Date;
6
+ end: Date;
7
+ }
8
+ /**
9
+ * Options for generating a schedule of time slots.
10
+ */
11
+ export interface GenerateScheduleOptions {
12
+ /** Start of the range to generate slots within */
13
+ start: Date;
14
+ /** End of the range to generate slots within */
15
+ end: Date;
16
+ /** Duration of each slot in minutes */
17
+ slotDurationMinutes: number;
18
+ /** Optional gap between slots in minutes (default 0) */
19
+ gapMinutes?: number;
20
+ }
21
+ /**
22
+ * Result of generateSchedule.
23
+ */
24
+ export type Schedule = TimeSlot[];
package/lib/types.js ADDED
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,6 @@
1
+ import type { BusinessHour, BusinessHoursOverrideInput, BusinessHoursOverrideOutput, FulfillmentPreference, LocationLike } from "../types";
2
+ export declare function toBusinessHoursOverride(businessHoursOverride: BusinessHoursOverrideInput): BusinessHoursOverrideOutput;
3
+ export declare function getLocationsBusinessHoursOverrides(businessHoursOverrides: BusinessHoursOverrideInput[], locations: LocationLike[]): Record<string, BusinessHoursOverrideOutput[]>;
4
+ export declare const isLocationCateringEnabled: (location: LocationLike | undefined) => boolean;
5
+ export declare function getLocationBusinessHoursForFulfillment(location: LocationLike, fulfillmentPreference: FulfillmentPreference, isCatering?: boolean): BusinessHour[];
6
+ //# sourceMappingURL=business-hours.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"business-hours.d.ts","sourceRoot":"","sources":["../../src/utils/business-hours.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACX,YAAY,EACZ,0BAA0B,EAC1B,2BAA2B,EAC3B,qBAAqB,EACrB,YAAY,EACZ,MAAM,UAAU,CAAC;AAElB,wBAAgB,uBAAuB,CACtC,qBAAqB,EAAE,0BAA0B,GAC/C,2BAA2B,CAe7B;AAED,wBAAgB,kCAAkC,CACjD,sBAAsB,EAAE,0BAA0B,EAAE,EACpD,SAAS,EAAE,YAAY,EAAE,GACvB,MAAM,CAAC,MAAM,EAAE,2BAA2B,EAAE,CAAC,CAyB/C;AAED,eAAO,MAAM,yBAAyB,GACrC,UAAU,YAAY,GAAG,SAAS,KAChC,OAKF,CAAC;AAEF,wBAAgB,sCAAsC,CACrD,QAAQ,EAAE,YAAY,EACtB,qBAAqB,EAAE,qBAAqB,EAC5C,UAAU,UAAQ,GAChB,YAAY,EAAE,CAgDhB"}
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isLocationCateringEnabled = void 0;
4
+ exports.toBusinessHoursOverride = toBusinessHoursOverride;
5
+ exports.getLocationsBusinessHoursOverrides = getLocationsBusinessHoursOverrides;
6
+ exports.getLocationBusinessHoursForFulfillment = getLocationBusinessHoursForFulfillment;
7
+ const constants_1 = require("../constants");
8
+ function toBusinessHoursOverride(businessHoursOverride) {
9
+ const { month, day, start_time: startTime, end_time: endTime, is_open: isOpen, } = businessHoursOverride;
10
+ return {
11
+ month,
12
+ day,
13
+ startTime: isOpen ? startTime : null,
14
+ endTime: isOpen ? endTime : null,
15
+ };
16
+ }
17
+ function getLocationsBusinessHoursOverrides(businessHoursOverrides, locations) {
18
+ const result = {};
19
+ for (const override of businessHoursOverrides) {
20
+ const { all_locations: allLocations, location_ids: locationIds } = override || {};
21
+ if (allLocations === true) {
22
+ for (const location of locations || []) {
23
+ const id = location.location_id;
24
+ result[id] ?? (result[id] = []);
25
+ result[id].push(toBusinessHoursOverride(override));
26
+ }
27
+ }
28
+ else {
29
+ for (const id of locationIds || []) {
30
+ const location = locations.find((loc) => loc.location_id === id);
31
+ if (location) {
32
+ result[id] ?? (result[id] = []);
33
+ result[id].push(toBusinessHoursOverride(override));
34
+ }
35
+ }
36
+ }
37
+ }
38
+ return result;
39
+ }
40
+ const isLocationCateringEnabled = (location) => {
41
+ if (!location)
42
+ return false;
43
+ return (!!location?.catering?.enabled && location?.catering?.enabled !== "false");
44
+ };
45
+ exports.isLocationCateringEnabled = isLocationCateringEnabled;
46
+ function getLocationBusinessHoursForFulfillment(location, fulfillmentPreference, isCatering = false) {
47
+ const fulfillmentBusinessHours = {
48
+ [constants_1.FULFILLMENT_TYPES.PICKUP]: location?.pickup_hours,
49
+ [constants_1.FULFILLMENT_TYPES.DELIVERY]: location?.delivery_hours,
50
+ [constants_1.FULFILLMENT_TYPES.CURBSIDE]: location?.curbside_hours?.use_pickup_hours
51
+ ? location?.pickup_hours
52
+ : location?.curbside_hours?.times,
53
+ };
54
+ const cateringBusinessTimings = {
55
+ [constants_1.FULFILLMENT_TYPES.PICKUP]: location?.catering?.pickup,
56
+ [constants_1.FULFILLMENT_TYPES.DELIVERY]: location?.catering?.delivery,
57
+ };
58
+ const businessHours = fulfillmentBusinessHours[fulfillmentPreference];
59
+ const cateringBusinessTiming = isCatering && (0, exports.isLocationCateringEnabled)(location)
60
+ ? cateringBusinessTimings[fulfillmentPreference]
61
+ : null;
62
+ if (isCatering && !cateringBusinessTiming) {
63
+ //if catering is enabled but no business hours are set, return empty arrayif
64
+ return [];
65
+ }
66
+ return (businessHours?.map((businessHour) => {
67
+ if (isCatering && cateringBusinessTiming) {
68
+ //if catering is enabled and catering business hours are set, return catering business hours
69
+ return {
70
+ day: businessHour.day,
71
+ startTime: cateringBusinessTiming.start_time,
72
+ endTime: cateringBusinessTiming.end_time,
73
+ };
74
+ }
75
+ return {
76
+ day: businessHour.day,
77
+ startTime: businessHour.start_time,
78
+ endTime: businessHour.end_time,
79
+ };
80
+ }) ?? []);
81
+ }
82
+ //# sourceMappingURL=business-hours.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"business-hours.js","sourceRoot":"","sources":["../../src/utils/business-hours.ts"],"names":[],"mappings":";;;AASA,0DAiBC;AAED,gFA4BC;AAWD,wFAoDC;AAvHD,4CAAiD;AASjD,SAAgB,uBAAuB,CACtC,qBAAiD;IAEjD,MAAM,EACL,KAAK,EACL,GAAG,EACH,UAAU,EAAE,SAAS,EACrB,QAAQ,EAAE,OAAO,EACjB,OAAO,EAAE,MAAM,GACf,GAAG,qBAAqB,CAAC;IAE1B,OAAO;QACN,KAAK;QACL,GAAG;QACH,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI;QACpC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI;KAChC,CAAC;AACH,CAAC;AAED,SAAgB,kCAAkC,CACjD,sBAAoD,EACpD,SAAyB;IAEzB,MAAM,MAAM,GAAkD,EAAE,CAAC;IAEjE,KAAK,MAAM,QAAQ,IAAI,sBAAsB,EAAE,CAAC;QAC/C,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,GAC/D,QAAQ,IAAI,EAAE,CAAC;QAEhB,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;YAC3B,KAAK,MAAM,QAAQ,IAAI,SAAS,IAAI,EAAE,EAAE,CAAC;gBACxC,MAAM,EAAE,GAAG,QAAQ,CAAC,WAAW,CAAC;gBAChC,MAAM,CAAC,EAAE,MAAT,MAAM,CAAC,EAAE,IAAM,EAAE,EAAC;gBAClB,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAC,CAAC;YACpD,CAAC;QACF,CAAC;aAAM,CAAC;YACP,KAAK,MAAM,EAAE,IAAI,WAAW,IAAI,EAAE,EAAE,CAAC;gBACpC,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,WAAW,KAAK,EAAE,CAAC,CAAC;gBACjE,IAAI,QAAQ,EAAE,CAAC;oBACd,MAAM,CAAC,EAAE,MAAT,MAAM,CAAC,EAAE,IAAM,EAAE,EAAC;oBAClB,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAC,CAAC;gBACpD,CAAC;YACF,CAAC;QACF,CAAC;IACF,CAAC;IAED,OAAO,MAAM,CAAC;AACf,CAAC;AAEM,MAAM,yBAAyB,GAAG,CACxC,QAAkC,EACxB,EAAE;IACZ,IAAI,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5B,OAAO,CACN,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,IAAI,QAAQ,EAAE,QAAQ,EAAE,OAAO,KAAK,OAAO,CACxE,CAAC;AACH,CAAC,CAAC;AAPW,QAAA,yBAAyB,6BAOpC;AAEF,SAAgB,sCAAsC,CACrD,QAAsB,EACtB,qBAA4C,EAC5C,UAAU,GAAG,KAAK;IAElB,MAAM,wBAAwB,GAG1B;QACH,CAAC,6BAAiB,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,YAAY;QAClD,CAAC,6BAAiB,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,cAAc;QACtD,CAAC,6BAAiB,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,cAAc,EAAE,gBAAgB;YACvE,CAAC,CAAC,QAAQ,EAAE,YAAY;YACxB,CAAC,CAAC,QAAQ,EAAE,cAAc,EAAE,KAAK;KAClC,CAAC;IAEF,MAAM,uBAAuB,GAEzB;QACH,CAAC,6BAAiB,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM;QACtD,CAAC,6BAAiB,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ;KAC1D,CAAC;IAEF,MAAM,aAAa,GAAG,wBAAwB,CAAC,qBAAqB,CAAC,CAAC;IAEtE,MAAM,sBAAsB,GAC3B,UAAU,IAAI,IAAA,iCAAyB,EAAC,QAAQ,CAAC;QAChD,CAAC,CAAC,uBAAuB,CAAC,qBAAqB,CAAC;QAChD,CAAC,CAAC,IAAI,CAAC;IAET,IAAI,UAAU,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAC3C,4EAA4E;QAC5E,OAAO,EAAE,CAAC;IACX,CAAC;IAED,OAAO,CACN,aAAa,EAAE,GAAG,CAAC,CAAC,YAAY,EAAE,EAAE;QACnC,IAAI,UAAU,IAAI,sBAAsB,EAAE,CAAC;YAC1C,4FAA4F;YAC5F,OAAO;gBACN,GAAG,EAAE,YAAY,CAAC,GAAG;gBACrB,SAAS,EAAE,sBAAsB,CAAC,UAAU;gBAC5C,OAAO,EAAE,sBAAsB,CAAC,QAAQ;aACxC,CAAC;QACH,CAAC;QACD,OAAO;YACN,GAAG,EAAE,YAAY,CAAC,GAAG;YACrB,SAAS,EAAE,YAAY,CAAC,UAAU;YAClC,OAAO,EAAE,YAAY,CAAC,QAAQ;SAC9B,CAAC;IACH,CAAC,CAAC,IAAI,EAAE,CACR,CAAC;AACH,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { CateringPrepTimeResult, GetCateringPrepTimeParams } from "../types";
2
+ /**
3
+ * Derives prep time config (cadence, frequency, weekDayPrepTimes) from cart items for catering flow.
4
+ * DAY cadence has priority; if any item uses days, returns max day frequency.
5
+ * Otherwise returns HOUR cadence with max hour frequency across items.
6
+ * When items are empty or have no catering prep time, falls back to params (e.g. from prepTimeSettings).
7
+ */
8
+ export declare function getCateringPrepTimeConfig(params: GetCateringPrepTimeParams): CateringPrepTimeResult;
9
+ //# sourceMappingURL=catering.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catering.d.ts","sourceRoot":"","sources":["../../src/utils/catering.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACX,sBAAsB,EACtB,yBAAyB,EACzB,MAAM,UAAU,CAAC;AAwBlB;;;;;GAKG;AACH,wBAAgB,yBAAyB,CACxC,MAAM,EAAE,yBAAyB,GAC/B,sBAAsB,CA+CxB"}
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getCateringPrepTimeConfig = getCateringPrepTimeConfig;
4
+ const timezone_support_1 = require("timezone-support");
5
+ const constants_1 = require("../constants");
6
+ function buildCateringPrepTimeResult(prepTimeCadence, prepTimeFrequency, timezone = constants_1.DEFAULT_TIMEZONE) {
7
+ const result = {
8
+ prepTimeCadence,
9
+ prepTimeFrequency,
10
+ };
11
+ if (prepTimeCadence === constants_1.PREP_TIME_CADENCE.DAY) {
12
+ result.weekDayPrepTimes = {};
13
+ }
14
+ else {
15
+ result.weekDayPrepTimes = {
16
+ [(0, timezone_support_1.getZonedTime)(new Date(), (0, timezone_support_1.findTimeZone)(timezone)).dayOfWeek]: prepTimeCadence === constants_1.PREP_TIME_CADENCE.HOUR
17
+ ? prepTimeFrequency * 60
18
+ : prepTimeFrequency,
19
+ };
20
+ }
21
+ return result;
22
+ }
23
+ /**
24
+ * Derives prep time config (cadence, frequency, weekDayPrepTimes) from cart items for catering flow.
25
+ * DAY cadence has priority; if any item uses days, returns max day frequency.
26
+ * Otherwise returns HOUR cadence with max hour frequency across items.
27
+ * When items are empty or have no catering prep time, falls back to params (e.g. from prepTimeSettings).
28
+ */
29
+ function getCateringPrepTimeConfig(params) {
30
+ const { items, timezone = constants_1.DEFAULT_TIMEZONE } = params;
31
+ if (items.length === 0) {
32
+ return buildCateringPrepTimeResult(params.prepTimeCadence ?? constants_1.PREP_TIME_CADENCE.HOUR, params.prepTimeFrequency ?? 1, timezone);
33
+ }
34
+ const dayFrequencies = [];
35
+ const hourFrequencies = [];
36
+ for (const item of items) {
37
+ const cadence = item.cateringService?.prep_time?.cadence;
38
+ const frequency = item.cateringService?.prep_time?.frequency;
39
+ if (cadence == null || frequency == null)
40
+ continue;
41
+ if (cadence === constants_1.PREP_TIME_CADENCE.DAY) {
42
+ dayFrequencies.push(frequency);
43
+ }
44
+ else if (cadence === constants_1.PREP_TIME_CADENCE.HOUR) {
45
+ hourFrequencies.push(frequency);
46
+ }
47
+ }
48
+ if (dayFrequencies.length > 0) {
49
+ return buildCateringPrepTimeResult(constants_1.PREP_TIME_CADENCE.DAY, Math.max(...dayFrequencies), timezone);
50
+ }
51
+ if (hourFrequencies.length > 0) {
52
+ return buildCateringPrepTimeResult(constants_1.PREP_TIME_CADENCE.HOUR, Math.max(...hourFrequencies), timezone);
53
+ }
54
+ return buildCateringPrepTimeResult(params.prepTimeCadence ?? constants_1.PREP_TIME_CADENCE.HOUR, params.prepTimeFrequency ?? 1, timezone);
55
+ }
56
+ //# sourceMappingURL=catering.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catering.js","sourceRoot":"","sources":["../../src/utils/catering.ts"],"names":[],"mappings":";;AAmCA,8DAiDC;AApFD,uDAA8D;AAC9D,4CAAmE;AAMnE,SAAS,2BAA2B,CACnC,eAA0D,EAC1D,iBAAyB,EACzB,WAAmB,4BAAgB;IAEnC,MAAM,MAAM,GAA2B;QACtC,eAAe;QACf,iBAAiB;KACjB,CAAC;IACF,IAAI,eAAe,KAAK,6BAAiB,CAAC,GAAG,EAAE,CAAC;QAC/C,MAAM,CAAC,gBAAgB,GAAG,EAAE,CAAC;IAC9B,CAAC;SAAM,CAAC;QACP,MAAM,CAAC,gBAAgB,GAAG;YACzB,CAAC,IAAA,+BAAY,EAAC,IAAI,IAAI,EAAE,EAAE,IAAA,+BAAY,EAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,EAC3D,eAAe,KAAK,6BAAiB,CAAC,IAAI;gBACzC,CAAC,CAAC,iBAAiB,GAAG,EAAE;gBACxB,CAAC,CAAC,iBAAiB;SACrB,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AACf,CAAC;AAED;;;;;GAKG;AACH,SAAgB,yBAAyB,CACxC,MAAiC;IAEjC,MAAM,EAAE,KAAK,EAAE,QAAQ,GAAG,4BAAgB,EAAE,GAAG,MAAM,CAAC;IAEtD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,2BAA2B,CACjC,MAAM,CAAC,eAAe,IAAI,6BAAiB,CAAC,IAAI,EAChD,MAAM,CAAC,iBAAiB,IAAI,CAAC,EAC7B,QAAQ,CACR,CAAC;IACH,CAAC;IAED,MAAM,cAAc,GAAa,EAAE,CAAC;IACpC,MAAM,eAAe,GAAa,EAAE,CAAC;IAErC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,EAAE,SAAS,EAAE,OAAO,CAAC;QACzD,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,EAAE,SAAS,EAAE,SAAS,CAAC;QAC7D,IAAI,OAAO,IAAI,IAAI,IAAI,SAAS,IAAI,IAAI;YAAE,SAAS;QAEnD,IAAI,OAAO,KAAK,6BAAiB,CAAC,GAAG,EAAE,CAAC;YACvC,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAChC,CAAC;aAAM,IAAI,OAAO,KAAK,6BAAiB,CAAC,IAAI,EAAE,CAAC;YAC/C,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACjC,CAAC;IACF,CAAC;IAED,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,OAAO,2BAA2B,CACjC,6BAAiB,CAAC,GAAG,EACrB,IAAI,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC,EAC3B,QAAQ,CACR,CAAC;IACH,CAAC;IAED,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,OAAO,2BAA2B,CACjC,6BAAiB,CAAC,IAAI,EACtB,IAAI,CAAC,GAAG,CAAC,GAAG,eAAe,CAAC,EAC5B,QAAQ,CACR,CAAC;IACH,CAAC;IAED,OAAO,2BAA2B,CACjC,MAAM,CAAC,eAAe,IAAI,6BAAiB,CAAC,IAAI,EAChD,MAAM,CAAC,iBAAiB,IAAI,CAAC,EAC7B,QAAQ,CACR,CAAC;AACH,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { BusinessHour } from "../types";
2
+ export declare function setHmOnDate(date: Date, hm: string, timeZone: string): Date;
3
+ export declare function getNextDateForDayOfWeek(targetDayIndex: number, referenceDate?: Date): Date;
4
+ export declare function getPreSalePickupDates(preSalePickupDays?: number[], preSaleOrderingDays?: number[]): Date[];
5
+ export declare function overrideTimeZoneOnUTC(date: Date | string, timeZoneB: string): Date;
6
+ export declare function isTodayInTimeZone(date: Date, timeZone: string): boolean;
7
+ export declare function isTomorrowInTimeZone(date: Date, timeZone: string): boolean;
8
+ export declare function isSameDateInTimeZone(dateLeft: Date, dateRight: Date, timeZone: string): boolean;
9
+ export declare function isMidnightTransition(endDate: Date, startDateNextDay: Date, timeZone: string): boolean;
10
+ export declare function addDaysInTimeZone(date: Date, days: number, timeZone: string): Date;
11
+ export declare function isZeroPrepTimeForMidnightShift({ prevDayBusinessHours, businessHour, }: {
12
+ prevDayBusinessHours: BusinessHour[];
13
+ businessHour: BusinessHour;
14
+ }): boolean;
15
+ //# sourceMappingURL=date.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date.d.ts","sourceRoot":"","sources":["../../src/utils/date.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAE7C,wBAAgB,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAiB1E;AAED,wBAAgB,uBAAuB,CACtC,cAAc,EAAE,MAAM,EACtB,aAAa,GAAE,IAAiB,GAC9B,IAAI,CAIN;AAED,wBAAgB,qBAAqB,CACpC,iBAAiB,GAAE,MAAM,EAAO,EAChC,mBAAmB,GAAE,MAAM,EAAO,GAChC,IAAI,EAAE,CAeR;AAED,wBAAgB,qBAAqB,CACpC,IAAI,EAAE,IAAI,GAAG,MAAM,EACnB,SAAS,EAAE,MAAM,GACf,IAAI,CAUN;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAQvE;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAK1E;AAED,wBAAgB,oBAAoB,CACnC,QAAQ,EAAE,IAAI,EACd,SAAS,EAAE,IAAI,EACf,QAAQ,EAAE,MAAM,GACd,OAAO,CAST;AAED,wBAAgB,oBAAoB,CACnC,OAAO,EAAE,IAAI,EACb,gBAAgB,EAAE,IAAI,EACtB,QAAQ,EAAE,MAAM,GACd,OAAO,CAaT;AAED,wBAAgB,iBAAiB,CAChC,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GACd,IAAI,CAWN;AAED,wBAAgB,8BAA8B,CAAC,EAC9C,oBAAoB,EACpB,YAAY,GACZ,EAAE;IACF,oBAAoB,EAAE,YAAY,EAAE,CAAC;IACrC,YAAY,EAAE,YAAY,CAAC;CAC3B,GAAG,OAAO,CAoBV"}
@@ -0,0 +1,109 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.setHmOnDate = setHmOnDate;
4
+ exports.getNextDateForDayOfWeek = getNextDateForDayOfWeek;
5
+ exports.getPreSalePickupDates = getPreSalePickupDates;
6
+ exports.overrideTimeZoneOnUTC = overrideTimeZoneOnUTC;
7
+ exports.isTodayInTimeZone = isTodayInTimeZone;
8
+ exports.isTomorrowInTimeZone = isTomorrowInTimeZone;
9
+ exports.isSameDateInTimeZone = isSameDateInTimeZone;
10
+ exports.isMidnightTransition = isMidnightTransition;
11
+ exports.addDaysInTimeZone = addDaysInTimeZone;
12
+ exports.isZeroPrepTimeForMidnightShift = isZeroPrepTimeForMidnightShift;
13
+ const date_fns_1 = require("date-fns");
14
+ const timezone_support_1 = require("timezone-support");
15
+ function setHmOnDate(date, hm, timeZone) {
16
+ const [hours, minutes] = String(hm).split(":");
17
+ const zonedTime = (0, timezone_support_1.getZonedTime)(new Date(date), (0, timezone_support_1.findTimeZone)(timeZone));
18
+ return new Date((0, timezone_support_1.getUnixTime)({
19
+ zone: zonedTime.zone,
20
+ year: zonedTime.year,
21
+ month: zonedTime.month,
22
+ day: zonedTime.day,
23
+ hours: hours === "24" ? 23 : Number(hours),
24
+ minutes: hours === "24" ? 59 : Number(minutes),
25
+ seconds: 0,
26
+ milliseconds: 0,
27
+ }));
28
+ }
29
+ function getNextDateForDayOfWeek(targetDayIndex, referenceDate = new Date()) {
30
+ const currentDayIndex = referenceDate.getDay();
31
+ const daysUntilTarget = (targetDayIndex - currentDayIndex + 7) % 7;
32
+ return (0, date_fns_1.addDays)(referenceDate, daysUntilTarget);
33
+ }
34
+ function getPreSalePickupDates(preSalePickupDays = [], preSaleOrderingDays = []) {
35
+ const today = new Date();
36
+ const currentDayIndex = today.getDay();
37
+ if (preSalePickupDays.includes(currentDayIndex)) {
38
+ return [];
39
+ }
40
+ if (!preSaleOrderingDays.includes(currentDayIndex)) {
41
+ return [];
42
+ }
43
+ return preSalePickupDays
44
+ .map((day) => getNextDateForDayOfWeek(day))
45
+ .sort(date_fns_1.compareAsc);
46
+ }
47
+ function overrideTimeZoneOnUTC(date, timeZoneB) {
48
+ const timeZoneATime = (0, timezone_support_1.getZonedTime)(new Date(date), (0, timezone_support_1.findTimeZone)("UTC"));
49
+ const timeZoneBTime = (0, timezone_support_1.getZonedTime)(new Date(date), (0, timezone_support_1.findTimeZone)(timeZoneB));
50
+ return new Date((0, timezone_support_1.getUnixTime)({
51
+ ...timeZoneATime,
52
+ zone: timeZoneBTime.zone,
53
+ }));
54
+ }
55
+ function isTodayInTimeZone(date, timeZone) {
56
+ if (!date) {
57
+ return false;
58
+ }
59
+ const zonedNow = (0, timezone_support_1.getZonedTime)(Date.now(), (0, timezone_support_1.findTimeZone)(timeZone));
60
+ const zonedTime = (0, timezone_support_1.getZonedTime)(date, (0, timezone_support_1.findTimeZone)(timeZone));
61
+ return zonedNow.day === zonedTime.day && zonedNow.month === zonedTime.month;
62
+ }
63
+ function isTomorrowInTimeZone(date, timeZone) {
64
+ const zonedNow = (0, timezone_support_1.getZonedTime)((0, date_fns_1.addDays)(Date.now(), 1), (0, timezone_support_1.findTimeZone)(timeZone));
65
+ const zonedTime = (0, timezone_support_1.getZonedTime)(date, (0, timezone_support_1.findTimeZone)(timeZone));
66
+ return zonedNow.day === zonedTime.day && zonedNow.month === zonedTime.month;
67
+ }
68
+ function isSameDateInTimeZone(dateLeft, dateRight, timeZone) {
69
+ const zonedDateLeft = (0, timezone_support_1.getZonedTime)(dateLeft, (0, timezone_support_1.findTimeZone)(timeZone));
70
+ const zonedDateRight = (0, timezone_support_1.getZonedTime)(dateRight, (0, timezone_support_1.findTimeZone)(timeZone));
71
+ return (zonedDateLeft.year === zonedDateRight.year &&
72
+ zonedDateLeft.month === zonedDateRight.month &&
73
+ zonedDateLeft.day === zonedDateRight.day);
74
+ }
75
+ function isMidnightTransition(endDate, startDateNextDay, timeZone) {
76
+ if (!endDate || !startDateNextDay) {
77
+ return false;
78
+ }
79
+ const zonedEndDate = (0, timezone_support_1.getZonedTime)(endDate, (0, timezone_support_1.findTimeZone)(timeZone));
80
+ const zonedStartDate = (0, timezone_support_1.getZonedTime)(startDateNextDay, (0, timezone_support_1.findTimeZone)(timeZone));
81
+ return (zonedEndDate.hours === 23 &&
82
+ zonedEndDate.minutes === 59 &&
83
+ zonedStartDate.hours === 0 &&
84
+ zonedStartDate.minutes === 0);
85
+ }
86
+ function addDaysInTimeZone(date, days, timeZone) {
87
+ const zonedTime = (0, timezone_support_1.getZonedTime)((0, date_fns_1.addDays)(date, days), (0, timezone_support_1.findTimeZone)(timeZone));
88
+ return new Date((0, timezone_support_1.getUnixTime)({
89
+ ...zonedTime,
90
+ hours: 0,
91
+ minutes: 0,
92
+ seconds: 0,
93
+ milliseconds: 0,
94
+ }));
95
+ }
96
+ function isZeroPrepTimeForMidnightShift({ prevDayBusinessHours, businessHour, }) {
97
+ if (!Array.isArray(prevDayBusinessHours) ||
98
+ prevDayBusinessHours.length === 0) {
99
+ return false;
100
+ }
101
+ if (!businessHour || businessHour.startTime !== "00:00") {
102
+ return false;
103
+ }
104
+ const currentDay = businessHour.day;
105
+ const prevDay = (currentDay + 6) % 7;
106
+ const prevDayHas24End = prevDayBusinessHours.some((bh) => bh.day === prevDay && (bh.endTime === "24:00" || bh.endTime === "23:59"));
107
+ return prevDayHas24End;
108
+ }
109
+ //# sourceMappingURL=date.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date.js","sourceRoot":"","sources":["../../src/utils/date.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { FilterBusyTimesFromScheduleParams, FulfillmentSchedule, MenuType } from "../types";
2
+ export declare function filterBusyTimesFromSchedule({ schedule, busyTimes, cartCategoryIds, }: FilterBusyTimesFromScheduleParams): FulfillmentSchedule;
3
+ export declare function filterMenusFromSchedule({ schedule, menus, timeZone, }: {
4
+ schedule?: FulfillmentSchedule;
5
+ menus?: MenuType[];
6
+ timeZone: string;
7
+ }): FulfillmentSchedule;
8
+ //# sourceMappingURL=schedule-filter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schedule-filter.d.ts","sourceRoot":"","sources":["../../src/utils/schedule-filter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAEX,iCAAiC,EACjC,mBAAmB,EACnB,QAAQ,EACR,MAAM,UAAU,CAAC;AA6BlB,wBAAgB,2BAA2B,CAAC,EAC3C,QAAa,EACb,SAAc,EACd,eAAoB,GACpB,EAAE,iCAAiC,GAAG,mBAAmB,CAiDzD;AAED,wBAAgB,uBAAuB,CAAC,EACvC,QAAa,EACb,KAAU,EACV,QAAQ,GACR,EAAE;IACF,QAAQ,CAAC,EAAE,mBAAmB,CAAC;IAC/B,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CACjB,GAAG,mBAAmB,CAwCtB"}
@@ -0,0 +1,95 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.filterBusyTimesFromSchedule = filterBusyTimesFromSchedule;
4
+ exports.filterMenusFromSchedule = filterMenusFromSchedule;
5
+ const timezone_support_1 = require("timezone-support");
6
+ const time_1 = require("./time");
7
+ // ── Private helpers ─────────────────────────────────────────────────────────
8
+ function isSlotBusy(applicableBusyTimes, slotTimeValue) {
9
+ const slotTime = new Date(slotTimeValue);
10
+ if (Number.isNaN(slotTime.getTime())) {
11
+ return false;
12
+ }
13
+ return applicableBusyTimes.some((busyTime) => {
14
+ const busyStart = new Date(busyTime?.startTime);
15
+ const busyEnd = new Date(busyTime?.endTime);
16
+ if (Number.isNaN(busyStart.getTime()) || Number.isNaN(busyEnd.getTime())) {
17
+ return false;
18
+ }
19
+ return slotTime > busyStart && slotTime <= busyEnd;
20
+ });
21
+ }
22
+ // ── Public API ──────────────────────────────────────────────────────────────
23
+ function filterBusyTimesFromSchedule({ schedule = [], busyTimes = [], cartCategoryIds = [], }) {
24
+ if (!Array.isArray(schedule) || schedule.length === 0) {
25
+ return [];
26
+ }
27
+ if (!Array.isArray(busyTimes) || busyTimes.length === 0) {
28
+ return schedule;
29
+ }
30
+ const uniqueCartCategoryIds = Array.isArray(cartCategoryIds)
31
+ ? Array.from(new Set(cartCategoryIds.filter(Boolean)))
32
+ : [];
33
+ const applicableBusyTimes = busyTimes.filter((busyTime) => {
34
+ const thresholdCategoryIds = busyTime?.threshold?.categoryIds || [];
35
+ if (!thresholdCategoryIds.length) {
36
+ return true;
37
+ }
38
+ if (!uniqueCartCategoryIds.length) {
39
+ return false;
40
+ }
41
+ return uniqueCartCategoryIds.some((cartCategoryId) => thresholdCategoryIds.includes(cartCategoryId));
42
+ });
43
+ if (!applicableBusyTimes.length) {
44
+ return schedule;
45
+ }
46
+ return schedule
47
+ .map((daySchedule) => {
48
+ const slots = Array.isArray(daySchedule?.slots) ? daySchedule.slots : [];
49
+ const filteredSlots = slots.filter((slot) => !isSlotBusy(applicableBusyTimes, slot));
50
+ return {
51
+ ...daySchedule,
52
+ slots: filteredSlots,
53
+ openingTime: filteredSlots[0],
54
+ closingTime: filteredSlots[filteredSlots.length - 1],
55
+ firstAvailableSlot: filteredSlots[0],
56
+ };
57
+ })
58
+ .filter((daySchedule) => (daySchedule?.slots || []).length > 0);
59
+ }
60
+ function filterMenusFromSchedule({ schedule = [], menus = [], timeZone, }) {
61
+ return schedule
62
+ .map((daySchedule) => ({
63
+ ...daySchedule,
64
+ slots: daySchedule.slots.filter((slot) => {
65
+ const zonedSlot = (0, timezone_support_1.getZonedTime)(slot, (0, timezone_support_1.findTimeZone)(timeZone));
66
+ const dayOfWeek = zonedSlot.dayOfWeek;
67
+ if (!menus.length) {
68
+ return true;
69
+ }
70
+ return menus.some((menu) => {
71
+ const dayScheduleConfig = menu.times[String(dayOfWeek)];
72
+ if (!dayScheduleConfig) {
73
+ return false;
74
+ }
75
+ if (dayScheduleConfig.all_day) {
76
+ return true;
77
+ }
78
+ // Only show slot if it falls within the configured time range
79
+ // Check for null start_time or end_time
80
+ if (!dayScheduleConfig.start_time || !dayScheduleConfig.end_time) {
81
+ return false;
82
+ }
83
+ return (0, time_1.isTimeInRange)({
84
+ start_time: dayScheduleConfig.start_time,
85
+ end_time: dayScheduleConfig.end_time,
86
+ }, {
87
+ hours: Number(zonedSlot.hours),
88
+ minutes: Number(zonedSlot.minutes),
89
+ });
90
+ });
91
+ }),
92
+ }))
93
+ .filter((daySchedule) => daySchedule.slots.length > 0);
94
+ }
95
+ //# sourceMappingURL=schedule-filter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schedule-filter.js","sourceRoot":"","sources":["../../src/utils/schedule-filter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { BusinessHoursOverrideOutput, FulfillmentPreference, GetOpeningClosingTimeOnDateParams, LocationLike } from "../types";
2
+ export declare function getOpeningClosingTimeOnDate({ date, businessHours, businessHoursOverrides, timeZone, }: GetOpeningClosingTimeOnDateParams): {
3
+ openingTime: Date;
4
+ closingTime: Date;
5
+ } | null;
6
+ export declare function getOpeningClosingTime({ location, fulfillmentPreference, businessHoursOverrides, }: {
7
+ location: LocationLike;
8
+ fulfillmentPreference: FulfillmentPreference;
9
+ businessHoursOverrides?: Record<string, BusinessHoursOverrideOutput[]>;
10
+ }): {
11
+ openingTime: Date;
12
+ closingTime: Date;
13
+ } | null;
14
+ //# sourceMappingURL=store-hours.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store-hours.d.ts","sourceRoot":"","sources":["../../src/utils/store-hours.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAEX,2BAA2B,EAC3B,qBAAqB,EACrB,iCAAiC,EACjC,YAAY,EACZ,MAAM,UAAU,CAAC;AAuElB,wBAAgB,2BAA2B,CAAC,EAC3C,IAAiB,EACjB,aAAkB,EAClB,sBAA2B,EAC3B,QAAQ,GACR,EAAE,iCAAiC,GAAG;IACtC,WAAW,EAAE,IAAI,CAAC;IAClB,WAAW,EAAE,IAAI,CAAC;CAClB,GAAG,IAAI,CA+GP;AAED,wBAAgB,qBAAqB,CAAC,EACrC,QAAQ,EACR,qBAAqB,EACrB,sBAAsB,GACtB,EAAE;IACF,QAAQ,EAAE,YAAY,CAAC;IACvB,qBAAqB,EAAE,qBAAqB,CAAC;IAC7C,sBAAsB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,2BAA2B,EAAE,CAAC,CAAC;CACvE,GAAG;IAAE,WAAW,EAAE,IAAI,CAAC;IAAC,WAAW,EAAE,IAAI,CAAA;CAAE,GAAG,IAAI,CAYlD"}