dabke 0.78.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 (194) hide show
  1. package/CHANGELOG.md +120 -0
  2. package/LICENSE +21 -0
  3. package/README.md +187 -0
  4. package/dist/client.d.ts +14 -0
  5. package/dist/client.d.ts.map +1 -0
  6. package/dist/client.js +42 -0
  7. package/dist/client.js.map +1 -0
  8. package/dist/client.schemas.d.ts +250 -0
  9. package/dist/client.schemas.d.ts.map +1 -0
  10. package/dist/client.schemas.js +137 -0
  11. package/dist/client.schemas.js.map +1 -0
  12. package/dist/client.types.d.ts +34 -0
  13. package/dist/client.types.d.ts.map +1 -0
  14. package/dist/client.types.js +18 -0
  15. package/dist/client.types.js.map +1 -0
  16. package/dist/cpsat/model-builder.d.ts +128 -0
  17. package/dist/cpsat/model-builder.d.ts.map +1 -0
  18. package/dist/cpsat/model-builder.js +640 -0
  19. package/dist/cpsat/model-builder.js.map +1 -0
  20. package/dist/cpsat/response.d.ts +74 -0
  21. package/dist/cpsat/response.d.ts.map +1 -0
  22. package/dist/cpsat/response.js +92 -0
  23. package/dist/cpsat/response.js.map +1 -0
  24. package/dist/cpsat/rules/assign-together.d.ts +23 -0
  25. package/dist/cpsat/rules/assign-together.d.ts.map +1 -0
  26. package/dist/cpsat/rules/assign-together.js +78 -0
  27. package/dist/cpsat/rules/assign-together.js.map +1 -0
  28. package/dist/cpsat/rules/employee-assignment-priority.d.ts +64 -0
  29. package/dist/cpsat/rules/employee-assignment-priority.d.ts.map +1 -0
  30. package/dist/cpsat/rules/employee-assignment-priority.js +151 -0
  31. package/dist/cpsat/rules/employee-assignment-priority.js.map +1 -0
  32. package/dist/cpsat/rules/index.d.ts +13 -0
  33. package/dist/cpsat/rules/index.d.ts.map +1 -0
  34. package/dist/cpsat/rules/index.js +13 -0
  35. package/dist/cpsat/rules/index.js.map +1 -0
  36. package/dist/cpsat/rules/location-preference.d.ts +29 -0
  37. package/dist/cpsat/rules/location-preference.d.ts.map +1 -0
  38. package/dist/cpsat/rules/location-preference.js +59 -0
  39. package/dist/cpsat/rules/location-preference.js.map +1 -0
  40. package/dist/cpsat/rules/max-consecutive-days.d.ts +28 -0
  41. package/dist/cpsat/rules/max-consecutive-days.d.ts.map +1 -0
  42. package/dist/cpsat/rules/max-consecutive-days.js +70 -0
  43. package/dist/cpsat/rules/max-consecutive-days.js.map +1 -0
  44. package/dist/cpsat/rules/max-hours-day.d.ts +57 -0
  45. package/dist/cpsat/rules/max-hours-day.d.ts.map +1 -0
  46. package/dist/cpsat/rules/max-hours-day.js +159 -0
  47. package/dist/cpsat/rules/max-hours-day.js.map +1 -0
  48. package/dist/cpsat/rules/max-hours-week.d.ts +62 -0
  49. package/dist/cpsat/rules/max-hours-week.d.ts.map +1 -0
  50. package/dist/cpsat/rules/max-hours-week.js +169 -0
  51. package/dist/cpsat/rules/max-hours-week.js.map +1 -0
  52. package/dist/cpsat/rules/max-shifts-day.d.ts +69 -0
  53. package/dist/cpsat/rules/max-shifts-day.d.ts.map +1 -0
  54. package/dist/cpsat/rules/max-shifts-day.js +170 -0
  55. package/dist/cpsat/rules/max-shifts-day.js.map +1 -0
  56. package/dist/cpsat/rules/min-consecutive-days.d.ts +29 -0
  57. package/dist/cpsat/rules/min-consecutive-days.d.ts.map +1 -0
  58. package/dist/cpsat/rules/min-consecutive-days.js +104 -0
  59. package/dist/cpsat/rules/min-consecutive-days.js.map +1 -0
  60. package/dist/cpsat/rules/min-hours-day.d.ts +28 -0
  61. package/dist/cpsat/rules/min-hours-day.d.ts.map +1 -0
  62. package/dist/cpsat/rules/min-hours-day.js +61 -0
  63. package/dist/cpsat/rules/min-hours-day.js.map +1 -0
  64. package/dist/cpsat/rules/min-hours-week.d.ts +29 -0
  65. package/dist/cpsat/rules/min-hours-week.d.ts.map +1 -0
  66. package/dist/cpsat/rules/min-hours-week.js +68 -0
  67. package/dist/cpsat/rules/min-hours-week.js.map +1 -0
  68. package/dist/cpsat/rules/min-rest-between-shifts.d.ts +28 -0
  69. package/dist/cpsat/rules/min-rest-between-shifts.d.ts.map +1 -0
  70. package/dist/cpsat/rules/min-rest-between-shifts.js +95 -0
  71. package/dist/cpsat/rules/min-rest-between-shifts.js.map +1 -0
  72. package/dist/cpsat/rules/registry.d.ts +7 -0
  73. package/dist/cpsat/rules/registry.d.ts.map +1 -0
  74. package/dist/cpsat/rules/registry.js +28 -0
  75. package/dist/cpsat/rules/registry.js.map +1 -0
  76. package/dist/cpsat/rules/resolver.d.ts +31 -0
  77. package/dist/cpsat/rules/resolver.d.ts.map +1 -0
  78. package/dist/cpsat/rules/resolver.js +124 -0
  79. package/dist/cpsat/rules/resolver.js.map +1 -0
  80. package/dist/cpsat/rules/rules.types.d.ts +32 -0
  81. package/dist/cpsat/rules/rules.types.d.ts.map +1 -0
  82. package/dist/cpsat/rules/rules.types.js +2 -0
  83. package/dist/cpsat/rules/rules.types.js.map +1 -0
  84. package/dist/cpsat/rules/scoping.d.ts +129 -0
  85. package/dist/cpsat/rules/scoping.d.ts.map +1 -0
  86. package/dist/cpsat/rules/scoping.js +190 -0
  87. package/dist/cpsat/rules/scoping.js.map +1 -0
  88. package/dist/cpsat/rules/time-off.d.ts +78 -0
  89. package/dist/cpsat/rules/time-off.d.ts.map +1 -0
  90. package/dist/cpsat/rules/time-off.js +261 -0
  91. package/dist/cpsat/rules/time-off.js.map +1 -0
  92. package/dist/cpsat/rules.d.ts +5 -0
  93. package/dist/cpsat/rules.d.ts.map +1 -0
  94. package/dist/cpsat/rules.js +4 -0
  95. package/dist/cpsat/rules.js.map +1 -0
  96. package/dist/cpsat/semantic-time.d.ts +198 -0
  97. package/dist/cpsat/semantic-time.d.ts.map +1 -0
  98. package/dist/cpsat/semantic-time.js +222 -0
  99. package/dist/cpsat/semantic-time.js.map +1 -0
  100. package/dist/cpsat/types.d.ts +180 -0
  101. package/dist/cpsat/types.d.ts.map +1 -0
  102. package/dist/cpsat/types.js +2 -0
  103. package/dist/cpsat/types.js.map +1 -0
  104. package/dist/cpsat/utils.d.ts +47 -0
  105. package/dist/cpsat/utils.d.ts.map +1 -0
  106. package/dist/cpsat/utils.js +92 -0
  107. package/dist/cpsat/utils.js.map +1 -0
  108. package/dist/cpsat/validation-reporter.d.ts +54 -0
  109. package/dist/cpsat/validation-reporter.d.ts.map +1 -0
  110. package/dist/cpsat/validation-reporter.js +261 -0
  111. package/dist/cpsat/validation-reporter.js.map +1 -0
  112. package/dist/cpsat/validation.types.d.ts +141 -0
  113. package/dist/cpsat/validation.types.d.ts.map +1 -0
  114. package/dist/cpsat/validation.types.js +14 -0
  115. package/dist/cpsat/validation.types.js.map +1 -0
  116. package/dist/datetime.utils.d.ts +245 -0
  117. package/dist/datetime.utils.d.ts.map +1 -0
  118. package/dist/datetime.utils.js +372 -0
  119. package/dist/datetime.utils.js.map +1 -0
  120. package/dist/errors.d.ts +12 -0
  121. package/dist/errors.d.ts.map +1 -0
  122. package/dist/errors.js +17 -0
  123. package/dist/errors.js.map +1 -0
  124. package/dist/index.d.ts +112 -0
  125. package/dist/index.d.ts.map +1 -0
  126. package/dist/index.js +116 -0
  127. package/dist/index.js.map +1 -0
  128. package/dist/llms.d.ts +5 -0
  129. package/dist/llms.d.ts.map +1 -0
  130. package/dist/llms.js +8 -0
  131. package/dist/llms.js.map +1 -0
  132. package/dist/testing/index.d.ts +12 -0
  133. package/dist/testing/index.d.ts.map +1 -0
  134. package/dist/testing/index.js +11 -0
  135. package/dist/testing/index.js.map +1 -0
  136. package/dist/testing/solver-container.d.ts +49 -0
  137. package/dist/testing/solver-container.d.ts.map +1 -0
  138. package/dist/testing/solver-container.js +127 -0
  139. package/dist/testing/solver-container.js.map +1 -0
  140. package/dist/types.d.ts +155 -0
  141. package/dist/types.d.ts.map +1 -0
  142. package/dist/types.js +20 -0
  143. package/dist/types.js.map +1 -0
  144. package/dist/validation.d.ts +105 -0
  145. package/dist/validation.d.ts.map +1 -0
  146. package/dist/validation.js +130 -0
  147. package/dist/validation.js.map +1 -0
  148. package/llms.txt +2188 -0
  149. package/package.json +76 -0
  150. package/solver/Dockerfile +31 -0
  151. package/solver/README.md +23 -0
  152. package/solver/pyproject.toml +28 -0
  153. package/solver/src/solver/__init__.py +1 -0
  154. package/solver/src/solver/app.py +24 -0
  155. package/solver/src/solver/models.py +120 -0
  156. package/solver/src/solver/solver.py +359 -0
  157. package/solver/tests/test_solver.py +156 -0
  158. package/solver/uv.lock +661 -0
  159. package/src/client.schemas.ts +163 -0
  160. package/src/client.ts +67 -0
  161. package/src/client.types.ts +66 -0
  162. package/src/cpsat/model-builder.ts +858 -0
  163. package/src/cpsat/response.ts +130 -0
  164. package/src/cpsat/rules/assign-together.ts +96 -0
  165. package/src/cpsat/rules/employee-assignment-priority.ts +182 -0
  166. package/src/cpsat/rules/index.ts +12 -0
  167. package/src/cpsat/rules/location-preference.ts +68 -0
  168. package/src/cpsat/rules/max-consecutive-days.ts +98 -0
  169. package/src/cpsat/rules/max-hours-day.ts +187 -0
  170. package/src/cpsat/rules/max-hours-week.ts +197 -0
  171. package/src/cpsat/rules/max-shifts-day.ts +198 -0
  172. package/src/cpsat/rules/min-consecutive-days.ts +140 -0
  173. package/src/cpsat/rules/min-hours-day.ts +69 -0
  174. package/src/cpsat/rules/min-hours-week.ts +77 -0
  175. package/src/cpsat/rules/min-rest-between-shifts.ts +121 -0
  176. package/src/cpsat/rules/registry.ts +49 -0
  177. package/src/cpsat/rules/resolver.ts +181 -0
  178. package/src/cpsat/rules/rules.types.ts +41 -0
  179. package/src/cpsat/rules/scoping.ts +340 -0
  180. package/src/cpsat/rules/time-off.ts +336 -0
  181. package/src/cpsat/rules.ts +27 -0
  182. package/src/cpsat/semantic-time.ts +463 -0
  183. package/src/cpsat/types.ts +194 -0
  184. package/src/cpsat/utils.ts +105 -0
  185. package/src/cpsat/validation-reporter.ts +366 -0
  186. package/src/cpsat/validation.types.ts +185 -0
  187. package/src/datetime.utils.ts +426 -0
  188. package/src/errors.ts +17 -0
  189. package/src/index.ts +289 -0
  190. package/src/llms.ts +9 -0
  191. package/src/testing/index.ts +12 -0
  192. package/src/testing/solver-container.ts +172 -0
  193. package/src/types.ts +191 -0
  194. package/src/validation.ts +188 -0
@@ -0,0 +1,245 @@
1
+ import { CalendarDate, DateTime, DateTimeRange, DayOfWeek, SchedulingPeriod } from "./types.js";
2
+ /**
3
+ * Converts a JavaScript Date to a CalendarDate
4
+ */
5
+ export declare function dateToCalendarDate(date: Date): CalendarDate;
6
+ /**
7
+ * Converts a DateTime to a JavaScript Date
8
+ * Internal helper function
9
+ */
10
+ export declare function dateTimeToDate(dateTime: DateTime): Date;
11
+ /**
12
+ * Compares two DateTimes
13
+ * Returns:
14
+ * -1 if dateTime1 < dateTime2
15
+ * 0 if dateTime1 = dateTime2
16
+ * 1 if dateTime1 > dateTime2
17
+ */
18
+ export declare function compareDateTimes(dateTime1: DateTime, dateTime2: DateTime): number;
19
+ export declare const DAY_OF_WEEK_MAP: {
20
+ sunday: number;
21
+ monday: number;
22
+ tuesday: number;
23
+ wednesday: number;
24
+ thursday: number;
25
+ friday: number;
26
+ saturday: number;
27
+ };
28
+ /**
29
+ * Helper to get the day of week name from a Date (local time)
30
+ */
31
+ export declare function toDayOfWeek(date: Date): DayOfWeek;
32
+ /**
33
+ * Helper to get the day of week name from a Date (UTC)
34
+ * Use this when working with date strings like "2026-01-10" that are timezone-agnostic.
35
+ */
36
+ export declare function toDayOfWeekUTC(date: Date): DayOfWeek;
37
+ /**
38
+ * Formats a date as YYYY-MM-DD string
39
+ */
40
+ export declare function formatDateString(date: Date): string;
41
+ /**
42
+ * Generates an array of day strings (YYYY-MM-DD) from a time horizon.
43
+ *
44
+ * @param horizon - The time horizon with start (inclusive) and end (inclusive) dates
45
+ * @returns Array of day strings in YYYY-MM-DD format
46
+ *
47
+ * @example
48
+ * ```typescript
49
+ * const days = generateDays({
50
+ * start: new Date('2025-01-01'),
51
+ * end: new Date('2025-01-04')
52
+ * });
53
+ * // Returns: ["2025-01-01", "2025-01-02", "2025-01-03", "2025-01-04"]
54
+ * ```
55
+ */
56
+ export declare function generateDays(horizon: {
57
+ start: Date;
58
+ end: Date;
59
+ }): string[];
60
+ /**
61
+ * Splits a time period into consecutive day ranges.
62
+ *
63
+ * Each range represents a single calendar day within the period from start to end.
64
+ * This is useful for rules that need to apply constraints on a per-day basis,
65
+ * such as maximum or minimum hours per day.
66
+ *
67
+ * @param start - The start date of the period (inclusive)
68
+ * @param end - The end date of the period (exclusive)
69
+ * @returns An array of [startDate, endDate] tuples, where each tuple represents
70
+ * a single day. The last range's end date will be the provided end date.
71
+ *
72
+ * @example
73
+ * ```typescript
74
+ * const ranges = splitPeriodIntoDays({
75
+ * start: new Date('2025-01-01'),
76
+ * end: new Date('2025-01-03')
77
+ * });
78
+ * // Returns:
79
+ * // [
80
+ * // [Date('2025-01-01'), Date('2025-01-02')],
81
+ * // [Date('2025-01-02'), Date('2025-01-03')]
82
+ * // ]
83
+ * ```
84
+ */
85
+ export declare function splitPeriodIntoDays({ start, end }: {
86
+ start: Date;
87
+ end: Date;
88
+ }): [Date, Date][];
89
+ /**
90
+ * Splits a time period into consecutive week ranges.
91
+ *
92
+ * Each range represents a week period starting on the specified day of the week.
93
+ * This is useful for rules that need to apply constraints on a per-week basis,
94
+ * such as maximum or minimum hours per week.
95
+ *
96
+ * The first range starts at the provided start date (not necessarily on weekStartsOn).
97
+ * Subsequent ranges align to the weekStartsOn day. The last range's end date will be
98
+ * the provided end date.
99
+ *
100
+ * @param start - The start date of the period (inclusive)
101
+ * @param end - The end date of the period (exclusive)
102
+ * @param weekStartsOn - The day of the week that weeks start on (e.g., "monday", "sunday")
103
+ * @returns An array of [startDate, endDate] tuples, where each tuple represents
104
+ * a week period aligned to the specified week start day.
105
+ *
106
+ * @example
107
+ * ```typescript
108
+ * const ranges = splitPeriodIntoWeeks({
109
+ * start: new Date('2025-01-01'), // Wednesday
110
+ * end: new Date('2025-01-15'),
111
+ * weekStartsOn: 'monday'
112
+ * });
113
+ * // Returns ranges starting from Jan 1 (Wed), then aligning to Mondays:
114
+ * // [
115
+ * // [Date('2025-01-01 Wed'), Date('2025-01-06 Mon')],
116
+ * // [Date('2025-01-06 Mon'), Date('2025-01-13 Mon')],
117
+ * // [Date('2025-01-13 Mon'), Date('2025-01-15 Wed')]
118
+ * // ]
119
+ * ```
120
+ */
121
+ export declare function splitPeriodIntoWeeks({ start, end, weekStartsOn, }: {
122
+ start: Date;
123
+ end: Date;
124
+ weekStartsOn: DayOfWeek;
125
+ }): [Date, Date][];
126
+ /**
127
+ * Checks if two DateTime ranges overlap in both date and time.
128
+ * Ranges overlap if they share any moment in time.
129
+ *
130
+ * Two ranges overlap if: range1.start < range2.end AND range2.start < range1.end
131
+ *
132
+ * @param range1 First time range with start (inclusive) and end (exclusive)
133
+ * @param range2 Second time range with start (inclusive) and end (exclusive)
134
+ * @returns true if ranges overlap, false otherwise
135
+ *
136
+ * @example
137
+ * ```typescript
138
+ * // Same day, overlapping times (9-17 overlaps with 12-20)
139
+ * dateTimeRangesOverlap(
140
+ * {
141
+ * start: { year: 2025, month: 6, day: 1, hours: 9, minutes: 0 },
142
+ * end: { year: 2025, month: 6, day: 1, hours: 17, minutes: 0 }
143
+ * },
144
+ * {
145
+ * start: { year: 2025, month: 6, day: 1, hours: 12, minutes: 0 },
146
+ * end: { year: 2025, month: 6, day: 1, hours: 20, minutes: 0 }
147
+ * }
148
+ * ); // true
149
+ *
150
+ * // Different days - no overlap
151
+ * dateTimeRangesOverlap(
152
+ * {
153
+ * start: { year: 2025, month: 6, day: 1, hours: 9, minutes: 0 },
154
+ * end: { year: 2025, month: 6, day: 1, hours: 17, minutes: 0 }
155
+ * },
156
+ * {
157
+ * start: { year: 2025, month: 6, day: 2, hours: 9, minutes: 0 },
158
+ * end: { year: 2025, month: 6, day: 2, hours: 17, minutes: 0 }
159
+ * }
160
+ * ); // false
161
+ *
162
+ * // Works naturally with Shift objects
163
+ * dateTimeRangesOverlap(
164
+ * { start: shift1.startDateTime, end: shift1.endDateTime },
165
+ * { start: shift2.startDateTime, end: shift2.endDateTime }
166
+ * );
167
+ * ```
168
+ */
169
+ export declare function dateTimeRangesOverlap(range1: DateTimeRange, range2: DateTimeRange): boolean;
170
+ /**
171
+ * Calculates the number of complete days between two dates
172
+ * @param start The start date
173
+ * @param end The end date
174
+ * @returns Number of complete days from start to end (can be negative if end < start)
175
+ *
176
+ * @example
177
+ * ```typescript
178
+ * daysBetween(new Date('2025-01-01'), new Date('2025-01-05')); // 4
179
+ * ```
180
+ */
181
+ export declare function daysBetween(start: Date, end: Date): number;
182
+ /**
183
+ * Adds a number of minutes to a base date and returns a DateTime.
184
+ * Treats the base date as a reference point (typically midnight of horizon start),
185
+ * and the minutes parameter as absolute minutes from that point.
186
+ *
187
+ * @param baseDate The starting date (used as reference point)
188
+ * @param minutes Absolute minutes from the base date
189
+ * @returns DateTime representing the result
190
+ *
191
+ * @example
192
+ * ```typescript
193
+ * // Add 90 minutes from midnight
194
+ * addMinutesToDate(new Date('2025-01-01'), 90);
195
+ * // Returns: { year: 2025, month: 1, day: 1, hours: 1, minutes: 30 }
196
+ *
197
+ * // Add 1500 minutes (spans to next day)
198
+ * addMinutesToDate(new Date('2025-01-01'), 1500);
199
+ * // Returns: { year: 2025, month: 1, day: 2, hours: 1, minutes: 0 }
200
+ * ```
201
+ */
202
+ export declare function addMinutesToDate(baseDate: Date, minutes: number): DateTime;
203
+ /**
204
+ * Returns the points where a range should be split, filtered to within [start, end).
205
+ * Always includes range start. Sorted ascending.
206
+ */
207
+ export declare function splitPoints([start, end]: [number, number], splitAt: number[]): number[];
208
+ /**
209
+ * Computes the list of day strings (YYYY-MM-DD) from a SchedulingPeriod.
210
+ *
211
+ * For date ranges, generates all days between start and end (inclusive),
212
+ * optionally filtering to specific days of the week.
213
+ *
214
+ * For specific dates, returns the dates as-is (sorted).
215
+ *
216
+ * @param period - The scheduling period specification
217
+ * @returns Array of day strings in YYYY-MM-DD format, sorted chronologically
218
+ *
219
+ * @example Date range with day-of-week filter
220
+ * ```typescript
221
+ * const days = resolveDaysFromPeriod({
222
+ * dateRange: { start: '2025-02-03', end: '2025-02-09' },
223
+ * daysOfWeek: ['wednesday', 'friday'],
224
+ * });
225
+ * // Returns: ['2025-02-05', '2025-02-07'] (Wed and Fri only)
226
+ * ```
227
+ *
228
+ * @example Date range without filter
229
+ * ```typescript
230
+ * const days = resolveDaysFromPeriod({
231
+ * dateRange: { start: '2025-02-03', end: '2025-02-05' },
232
+ * });
233
+ * // Returns: ['2025-02-03', '2025-02-04', '2025-02-05']
234
+ * ```
235
+ *
236
+ * @example Specific dates
237
+ * ```typescript
238
+ * const days = resolveDaysFromPeriod({
239
+ * specificDates: ['2025-02-07', '2025-02-03', '2025-02-10'],
240
+ * });
241
+ * // Returns: ['2025-02-03', '2025-02-07', '2025-02-10'] (sorted)
242
+ * ```
243
+ */
244
+ export declare function resolveDaysFromPeriod(period: SchedulingPeriod): string[];
245
+ //# sourceMappingURL=datetime.utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"datetime.utils.d.ts","sourceRoot":"","sources":["../src/datetime.utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEhG;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,IAAI,GAAG,YAAY,CAM3D;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CASvD;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,GAAG,MAAM,CAOjF;AAED,eAAO,MAAM,eAAe;;;;;;;;CAQ3B,CAAC;AAYF;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,IAAI,GAAG,SAAS,CAGjD;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,GAAG,SAAS,CAGpD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAKnD;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE;IAAE,KAAK,EAAE,IAAI,CAAC;IAAC,GAAG,EAAE,IAAI,CAAA;CAAE,GAAG,MAAM,EAAE,CAU1E;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,mBAAmB,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;IAAE,KAAK,EAAE,IAAI,CAAC;IAAC,GAAG,EAAE,IAAI,CAAA;CAAE,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAsB9F;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAgB,oBAAoB,CAAC,EACnC,KAAK,EACL,GAAG,EACH,YAAY,GACb,EAAE;IACD,KAAK,EAAE,IAAI,CAAC;IACZ,GAAG,EAAE,IAAI,CAAC;IACV,YAAY,EAAE,SAAS,CAAC;CACzB,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAoCjB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAM3F;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,GAAG,MAAM,CAG1D;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,GAAG,QAAQ,CAc1E;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAQvF;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,EAAE,CA2BxE"}
@@ -0,0 +1,372 @@
1
+ /**
2
+ * Converts a JavaScript Date to a CalendarDate
3
+ */
4
+ export function dateToCalendarDate(date) {
5
+ return {
6
+ year: date.getFullYear(),
7
+ month: date.getMonth() + 1, // JS months are 0-indexed
8
+ day: date.getDate(),
9
+ };
10
+ }
11
+ /**
12
+ * Converts a DateTime to a JavaScript Date
13
+ * Internal helper function
14
+ */
15
+ export function dateTimeToDate(dateTime) {
16
+ return new Date(dateTime.year || 0, (dateTime.month || 1) - 1, dateTime.day || 1, dateTime.hours || 0, dateTime.minutes || 0, dateTime.seconds || 0);
17
+ }
18
+ /**
19
+ * Compares two DateTimes
20
+ * Returns:
21
+ * -1 if dateTime1 < dateTime2
22
+ * 0 if dateTime1 = dateTime2
23
+ * 1 if dateTime1 > dateTime2
24
+ */
25
+ export function compareDateTimes(dateTime1, dateTime2) {
26
+ const date1 = dateTimeToDate(dateTime1);
27
+ const date2 = dateTimeToDate(dateTime2);
28
+ if (date1 < date2)
29
+ return -1;
30
+ if (date1 > date2)
31
+ return 1;
32
+ return 0;
33
+ }
34
+ export const DAY_OF_WEEK_MAP = {
35
+ sunday: 0, // JavaScript Date week starts on Sunday
36
+ monday: 1,
37
+ tuesday: 2,
38
+ wednesday: 3,
39
+ thursday: 4,
40
+ friday: 5,
41
+ saturday: 6,
42
+ };
43
+ const DAY_NAMES = [
44
+ "sunday",
45
+ "monday",
46
+ "tuesday",
47
+ "wednesday",
48
+ "thursday",
49
+ "friday",
50
+ "saturday",
51
+ ];
52
+ /**
53
+ * Helper to get the day of week name from a Date (local time)
54
+ */
55
+ export function toDayOfWeek(date) {
56
+ // getDay() always returns 0-6
57
+ return DAY_NAMES[date.getDay()];
58
+ }
59
+ /**
60
+ * Helper to get the day of week name from a Date (UTC)
61
+ * Use this when working with date strings like "2026-01-10" that are timezone-agnostic.
62
+ */
63
+ export function toDayOfWeekUTC(date) {
64
+ // getUTCDay() always returns 0-6
65
+ return DAY_NAMES[date.getUTCDay()];
66
+ }
67
+ /**
68
+ * Formats a date as YYYY-MM-DD string
69
+ */
70
+ export function formatDateString(date) {
71
+ const year = date.getFullYear();
72
+ const month = (date.getMonth() + 1).toString().padStart(2, "0");
73
+ const day = date.getDate().toString().padStart(2, "0");
74
+ return `${year}-${month}-${day}`;
75
+ }
76
+ /**
77
+ * Generates an array of day strings (YYYY-MM-DD) from a time horizon.
78
+ *
79
+ * @param horizon - The time horizon with start (inclusive) and end (inclusive) dates
80
+ * @returns Array of day strings in YYYY-MM-DD format
81
+ *
82
+ * @example
83
+ * ```typescript
84
+ * const days = generateDays({
85
+ * start: new Date('2025-01-01'),
86
+ * end: new Date('2025-01-04')
87
+ * });
88
+ * // Returns: ["2025-01-01", "2025-01-02", "2025-01-03", "2025-01-04"]
89
+ * ```
90
+ */
91
+ export function generateDays(horizon) {
92
+ const days = [];
93
+ const current = new Date(horizon.start);
94
+ while (current <= horizon.end) {
95
+ days.push(formatDateString(current));
96
+ current.setDate(current.getDate() + 1);
97
+ }
98
+ return days;
99
+ }
100
+ /**
101
+ * Splits a time period into consecutive day ranges.
102
+ *
103
+ * Each range represents a single calendar day within the period from start to end.
104
+ * This is useful for rules that need to apply constraints on a per-day basis,
105
+ * such as maximum or minimum hours per day.
106
+ *
107
+ * @param start - The start date of the period (inclusive)
108
+ * @param end - The end date of the period (exclusive)
109
+ * @returns An array of [startDate, endDate] tuples, where each tuple represents
110
+ * a single day. The last range's end date will be the provided end date.
111
+ *
112
+ * @example
113
+ * ```typescript
114
+ * const ranges = splitPeriodIntoDays({
115
+ * start: new Date('2025-01-01'),
116
+ * end: new Date('2025-01-03')
117
+ * });
118
+ * // Returns:
119
+ * // [
120
+ * // [Date('2025-01-01'), Date('2025-01-02')],
121
+ * // [Date('2025-01-02'), Date('2025-01-03')]
122
+ * // ]
123
+ * ```
124
+ */
125
+ export function splitPeriodIntoDays({ start, end }) {
126
+ const ranges = [];
127
+ let leftBound = new Date(start);
128
+ let done = false;
129
+ // Loop through each day
130
+ leftBound = new Date(start);
131
+ while (!done) {
132
+ // Create next day date
133
+ let rightBound = new Date(leftBound);
134
+ rightBound.setDate(rightBound.getDate() + 1);
135
+ if (rightBound >= end) {
136
+ rightBound = end;
137
+ done = true;
138
+ }
139
+ ranges.push([leftBound, rightBound]);
140
+ leftBound = rightBound;
141
+ }
142
+ return ranges;
143
+ }
144
+ /**
145
+ * Splits a time period into consecutive week ranges.
146
+ *
147
+ * Each range represents a week period starting on the specified day of the week.
148
+ * This is useful for rules that need to apply constraints on a per-week basis,
149
+ * such as maximum or minimum hours per week.
150
+ *
151
+ * The first range starts at the provided start date (not necessarily on weekStartsOn).
152
+ * Subsequent ranges align to the weekStartsOn day. The last range's end date will be
153
+ * the provided end date.
154
+ *
155
+ * @param start - The start date of the period (inclusive)
156
+ * @param end - The end date of the period (exclusive)
157
+ * @param weekStartsOn - The day of the week that weeks start on (e.g., "monday", "sunday")
158
+ * @returns An array of [startDate, endDate] tuples, where each tuple represents
159
+ * a week period aligned to the specified week start day.
160
+ *
161
+ * @example
162
+ * ```typescript
163
+ * const ranges = splitPeriodIntoWeeks({
164
+ * start: new Date('2025-01-01'), // Wednesday
165
+ * end: new Date('2025-01-15'),
166
+ * weekStartsOn: 'monday'
167
+ * });
168
+ * // Returns ranges starting from Jan 1 (Wed), then aligning to Mondays:
169
+ * // [
170
+ * // [Date('2025-01-01 Wed'), Date('2025-01-06 Mon')],
171
+ * // [Date('2025-01-06 Mon'), Date('2025-01-13 Mon')],
172
+ * // [Date('2025-01-13 Mon'), Date('2025-01-15 Wed')]
173
+ * // ]
174
+ * ```
175
+ */
176
+ export function splitPeriodIntoWeeks({ start, end, weekStartsOn, }) {
177
+ const DAYS_OF_WEEK = [
178
+ "sunday",
179
+ "monday",
180
+ "tuesday",
181
+ "wednesday",
182
+ "thursday",
183
+ "friday",
184
+ "saturday",
185
+ ];
186
+ const ranges = [];
187
+ let leftBound = new Date(start);
188
+ let done = false;
189
+ const startDayIndex = DAYS_OF_WEEK.indexOf(weekStartsOn);
190
+ // Create weekly ranges
191
+ while (!done) {
192
+ const dayOfWeek = leftBound.getDay(); // 0 = Sunday, 1 = Monday, etc.
193
+ const daysToNextWeek = (7 - ((dayOfWeek - startDayIndex) % 7)) % 7;
194
+ const daysToAdd = daysToNextWeek === 0 ? 7 : daysToNextWeek;
195
+ let rightBound = new Date(leftBound);
196
+ rightBound.setDate(rightBound.getDate() + daysToAdd);
197
+ if (rightBound >= end) {
198
+ rightBound = end;
199
+ done = true;
200
+ }
201
+ ranges.push([leftBound, rightBound]);
202
+ leftBound = rightBound;
203
+ }
204
+ return ranges;
205
+ }
206
+ /**
207
+ * Checks if two DateTime ranges overlap in both date and time.
208
+ * Ranges overlap if they share any moment in time.
209
+ *
210
+ * Two ranges overlap if: range1.start < range2.end AND range2.start < range1.end
211
+ *
212
+ * @param range1 First time range with start (inclusive) and end (exclusive)
213
+ * @param range2 Second time range with start (inclusive) and end (exclusive)
214
+ * @returns true if ranges overlap, false otherwise
215
+ *
216
+ * @example
217
+ * ```typescript
218
+ * // Same day, overlapping times (9-17 overlaps with 12-20)
219
+ * dateTimeRangesOverlap(
220
+ * {
221
+ * start: { year: 2025, month: 6, day: 1, hours: 9, minutes: 0 },
222
+ * end: { year: 2025, month: 6, day: 1, hours: 17, minutes: 0 }
223
+ * },
224
+ * {
225
+ * start: { year: 2025, month: 6, day: 1, hours: 12, minutes: 0 },
226
+ * end: { year: 2025, month: 6, day: 1, hours: 20, minutes: 0 }
227
+ * }
228
+ * ); // true
229
+ *
230
+ * // Different days - no overlap
231
+ * dateTimeRangesOverlap(
232
+ * {
233
+ * start: { year: 2025, month: 6, day: 1, hours: 9, minutes: 0 },
234
+ * end: { year: 2025, month: 6, day: 1, hours: 17, minutes: 0 }
235
+ * },
236
+ * {
237
+ * start: { year: 2025, month: 6, day: 2, hours: 9, minutes: 0 },
238
+ * end: { year: 2025, month: 6, day: 2, hours: 17, minutes: 0 }
239
+ * }
240
+ * ); // false
241
+ *
242
+ * // Works naturally with Shift objects
243
+ * dateTimeRangesOverlap(
244
+ * { start: shift1.startDateTime, end: shift1.endDateTime },
245
+ * { start: shift2.startDateTime, end: shift2.endDateTime }
246
+ * );
247
+ * ```
248
+ */
249
+ export function dateTimeRangesOverlap(range1, range2) {
250
+ // Use existing compareDateTimes for temporal comparison
251
+ // Ranges overlap if: start1 < end2 AND start2 < end1
252
+ return (compareDateTimes(range1.start, range2.end) < 0 && compareDateTimes(range2.start, range1.end) < 0);
253
+ }
254
+ /**
255
+ * Calculates the number of complete days between two dates
256
+ * @param start The start date
257
+ * @param end The end date
258
+ * @returns Number of complete days from start to end (can be negative if end < start)
259
+ *
260
+ * @example
261
+ * ```typescript
262
+ * daysBetween(new Date('2025-01-01'), new Date('2025-01-05')); // 4
263
+ * ```
264
+ */
265
+ export function daysBetween(start, end) {
266
+ const ms = end.getTime() - start.getTime();
267
+ return Math.floor(ms / (1000 * 60 * 60 * 24));
268
+ }
269
+ /**
270
+ * Adds a number of minutes to a base date and returns a DateTime.
271
+ * Treats the base date as a reference point (typically midnight of horizon start),
272
+ * and the minutes parameter as absolute minutes from that point.
273
+ *
274
+ * @param baseDate The starting date (used as reference point)
275
+ * @param minutes Absolute minutes from the base date
276
+ * @returns DateTime representing the result
277
+ *
278
+ * @example
279
+ * ```typescript
280
+ * // Add 90 minutes from midnight
281
+ * addMinutesToDate(new Date('2025-01-01'), 90);
282
+ * // Returns: { year: 2025, month: 1, day: 1, hours: 1, minutes: 30 }
283
+ *
284
+ * // Add 1500 minutes (spans to next day)
285
+ * addMinutesToDate(new Date('2025-01-01'), 1500);
286
+ * // Returns: { year: 2025, month: 1, day: 2, hours: 1, minutes: 0 }
287
+ * ```
288
+ */
289
+ export function addMinutesToDate(baseDate, minutes) {
290
+ const days = Math.floor(minutes / 1440);
291
+ const minutesInDay = minutes % 1440;
292
+ const targetDate = new Date(baseDate);
293
+ targetDate.setDate(targetDate.getDate() + days);
294
+ return {
295
+ year: targetDate.getFullYear(),
296
+ month: targetDate.getMonth() + 1,
297
+ day: targetDate.getDate(),
298
+ hours: Math.floor(minutesInDay / 60),
299
+ minutes: minutesInDay % 60,
300
+ };
301
+ }
302
+ /**
303
+ * Returns the points where a range should be split, filtered to within [start, end).
304
+ * Always includes range start. Sorted ascending.
305
+ */
306
+ export function splitPoints([start, end], splitAt) {
307
+ const points = new Set([start]);
308
+ for (const p of splitAt) {
309
+ if (p > start && p < end)
310
+ points.add(p);
311
+ }
312
+ return [...points].toSorted((a, b) => a - b);
313
+ }
314
+ /**
315
+ * Computes the list of day strings (YYYY-MM-DD) from a SchedulingPeriod.
316
+ *
317
+ * For date ranges, generates all days between start and end (inclusive),
318
+ * optionally filtering to specific days of the week.
319
+ *
320
+ * For specific dates, returns the dates as-is (sorted).
321
+ *
322
+ * @param period - The scheduling period specification
323
+ * @returns Array of day strings in YYYY-MM-DD format, sorted chronologically
324
+ *
325
+ * @example Date range with day-of-week filter
326
+ * ```typescript
327
+ * const days = resolveDaysFromPeriod({
328
+ * dateRange: { start: '2025-02-03', end: '2025-02-09' },
329
+ * daysOfWeek: ['wednesday', 'friday'],
330
+ * });
331
+ * // Returns: ['2025-02-05', '2025-02-07'] (Wed and Fri only)
332
+ * ```
333
+ *
334
+ * @example Date range without filter
335
+ * ```typescript
336
+ * const days = resolveDaysFromPeriod({
337
+ * dateRange: { start: '2025-02-03', end: '2025-02-05' },
338
+ * });
339
+ * // Returns: ['2025-02-03', '2025-02-04', '2025-02-05']
340
+ * ```
341
+ *
342
+ * @example Specific dates
343
+ * ```typescript
344
+ * const days = resolveDaysFromPeriod({
345
+ * specificDates: ['2025-02-07', '2025-02-03', '2025-02-10'],
346
+ * });
347
+ * // Returns: ['2025-02-03', '2025-02-07', '2025-02-10'] (sorted)
348
+ * ```
349
+ */
350
+ export function resolveDaysFromPeriod(period) {
351
+ if ("specificDates" in period && period.specificDates) {
352
+ return [...period.specificDates].toSorted();
353
+ }
354
+ const { dateRange, daysOfWeek } = period;
355
+ const startDate = new Date(`${dateRange.start}T00:00:00Z`);
356
+ const endDate = new Date(`${dateRange.end}T00:00:00Z`);
357
+ const allowedDays = daysOfWeek ? new Set(daysOfWeek) : null;
358
+ const days = [];
359
+ const current = new Date(startDate);
360
+ while (current <= endDate) {
361
+ const dayOfWeek = toDayOfWeekUTC(current);
362
+ if (!allowedDays || allowedDays.has(dayOfWeek)) {
363
+ const year = current.getUTCFullYear();
364
+ const month = (current.getUTCMonth() + 1).toString().padStart(2, "0");
365
+ const day = current.getUTCDate().toString().padStart(2, "0");
366
+ days.push(`${year}-${month}-${day}`);
367
+ }
368
+ current.setUTCDate(current.getUTCDate() + 1);
369
+ }
370
+ return days;
371
+ }
372
+ //# sourceMappingURL=datetime.utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"datetime.utils.js","sourceRoot":"","sources":["../src/datetime.utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Error thrown when Google OR Tools scheduling API requests fail.
3
+ *
4
+ * Contains the HTTP status code and raw response data from the API for debugging.
5
+ * Common causes include infeasible constraints, invalid requests, or API unavailability.
6
+ */
7
+ export declare class ORSchedulingError extends Error {
8
+ readonly status: number;
9
+ readonly data: unknown;
10
+ constructor(message: string, status: number, data: unknown);
11
+ }
12
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,SAAgB,MAAM,EAAE,MAAM,CAAC;IAC/B,SAAgB,IAAI,EAAE,OAAO,CAAC;gBAElB,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO;CAM3D"}
package/dist/errors.js ADDED
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Error thrown when Google OR Tools scheduling API requests fail.
3
+ *
4
+ * Contains the HTTP status code and raw response data from the API for debugging.
5
+ * Common causes include infeasible constraints, invalid requests, or API unavailability.
6
+ */
7
+ export class ORSchedulingError extends Error {
8
+ status;
9
+ data;
10
+ constructor(message, status, data) {
11
+ super(message);
12
+ this.name = "ORSchedulingError";
13
+ this.status = status;
14
+ this.data = data;
15
+ }
16
+ }
17
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAC1B,MAAM,CAAS;IACf,IAAI,CAAU;IAE9B,YAAY,OAAe,EAAE,MAAc,EAAE,IAAa;QACxD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;QAChC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF"}