dabke 0.83.0 → 0.84.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.
- package/CHANGELOG.md +21 -0
- package/README.md +22 -27
- package/dist/client.d.ts +39 -3
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js.map +1 -1
- package/dist/client.schemas.d.ts +118 -18
- package/dist/client.schemas.d.ts.map +1 -1
- package/dist/client.schemas.js +110 -6
- package/dist/client.schemas.js.map +1 -1
- package/dist/client.types.d.ts +63 -7
- package/dist/client.types.d.ts.map +1 -1
- package/dist/client.types.js.map +1 -1
- package/dist/cpsat/cost.d.ts +5 -2
- package/dist/cpsat/cost.d.ts.map +1 -1
- package/dist/cpsat/cost.js +13 -6
- package/dist/cpsat/cost.js.map +1 -1
- package/dist/cpsat/model-builder.d.ts +42 -61
- package/dist/cpsat/model-builder.d.ts.map +1 -1
- package/dist/cpsat/model-builder.js +451 -56
- package/dist/cpsat/model-builder.js.map +1 -1
- package/dist/cpsat/response.d.ts +19 -7
- package/dist/cpsat/response.d.ts.map +1 -1
- package/dist/cpsat/response.js +48 -9
- package/dist/cpsat/response.js.map +1 -1
- package/dist/cpsat/rule-descriptor.d.ts +250 -0
- package/dist/cpsat/rule-descriptor.d.ts.map +1 -0
- package/dist/cpsat/rule-descriptor.js +51 -0
- package/dist/cpsat/rule-descriptor.js.map +1 -0
- package/dist/cpsat/rules/artifacts.d.ts +9 -0
- package/dist/cpsat/rules/artifacts.d.ts.map +1 -0
- package/dist/cpsat/rules/artifacts.js +31 -0
- package/dist/cpsat/rules/artifacts.js.map +1 -0
- package/dist/cpsat/rules/assign-together.d.ts +18 -20
- package/dist/cpsat/rules/assign-together.d.ts.map +1 -1
- package/dist/cpsat/rules/assign-together.js +90 -54
- package/dist/cpsat/rules/assign-together.js.map +1 -1
- package/dist/cpsat/rules/assigned-day.d.ts +12 -0
- package/dist/cpsat/rules/assigned-day.d.ts.map +1 -0
- package/dist/cpsat/rules/assigned-day.js +43 -0
- package/dist/cpsat/rules/assigned-day.js.map +1 -0
- package/dist/cpsat/rules/assignment-priority.d.ts +15 -29
- package/dist/cpsat/rules/assignment-priority.d.ts.map +1 -1
- package/dist/cpsat/rules/assignment-priority.js +47 -50
- package/dist/cpsat/rules/assignment-priority.js.map +1 -1
- package/dist/cpsat/rules/assignment-terms.d.ts +6 -0
- package/dist/cpsat/rules/assignment-terms.d.ts.map +1 -0
- package/dist/cpsat/rules/assignment-terms.js +19 -0
- package/dist/cpsat/rules/assignment-terms.js.map +1 -0
- package/dist/cpsat/rules/concurrent-intervals.d.ts +19 -0
- package/dist/cpsat/rules/concurrent-intervals.d.ts.map +1 -0
- package/dist/cpsat/rules/concurrent-intervals.js +57 -0
- package/dist/cpsat/rules/concurrent-intervals.js.map +1 -0
- package/dist/cpsat/rules/cost-utils.d.ts +1 -3
- package/dist/cpsat/rules/cost-utils.d.ts.map +1 -1
- package/dist/cpsat/rules/cost-utils.js +0 -7
- package/dist/cpsat/rules/cost-utils.js.map +1 -1
- package/dist/cpsat/rules/day-cost-multiplier.d.ts +10 -10
- package/dist/cpsat/rules/day-cost-multiplier.d.ts.map +1 -1
- package/dist/cpsat/rules/day-cost-multiplier.js +88 -77
- package/dist/cpsat/rules/day-cost-multiplier.js.map +1 -1
- package/dist/cpsat/rules/day-cost-surcharge.d.ts +10 -10
- package/dist/cpsat/rules/day-cost-surcharge.d.ts.map +1 -1
- package/dist/cpsat/rules/day-cost-surcharge.js +76 -65
- package/dist/cpsat/rules/day-cost-surcharge.js.map +1 -1
- package/dist/cpsat/rules/index.d.ts +30 -24
- package/dist/cpsat/rules/index.d.ts.map +1 -1
- package/dist/cpsat/rules/index.js +30 -24
- package/dist/cpsat/rules/index.js.map +1 -1
- package/dist/cpsat/rules/location-preference.d.ts +14 -21
- package/dist/cpsat/rules/location-preference.d.ts.map +1 -1
- package/dist/cpsat/rules/location-preference.js +45 -45
- package/dist/cpsat/rules/location-preference.js.map +1 -1
- package/dist/cpsat/rules/max-concurrent-assignments.d.ts +46 -0
- package/dist/cpsat/rules/max-concurrent-assignments.d.ts.map +1 -0
- package/dist/cpsat/rules/max-concurrent-assignments.js +121 -0
- package/dist/cpsat/rules/max-concurrent-assignments.js.map +1 -0
- package/dist/cpsat/rules/max-consecutive-days.d.ts +18 -17
- package/dist/cpsat/rules/max-consecutive-days.d.ts.map +1 -1
- package/dist/cpsat/rules/max-consecutive-days.js +67 -66
- package/dist/cpsat/rules/max-consecutive-days.js.map +1 -1
- package/dist/cpsat/rules/max-days-of-week-per-period.d.ts +45 -0
- package/dist/cpsat/rules/max-days-of-week-per-period.d.ts.map +1 -0
- package/dist/cpsat/rules/max-days-of-week-per-period.js +95 -0
- package/dist/cpsat/rules/max-days-of-week-per-period.js.map +1 -0
- package/dist/cpsat/rules/max-days-week.d.ts +17 -31
- package/dist/cpsat/rules/max-days-week.d.ts.map +1 -1
- package/dist/cpsat/rules/max-days-week.js +69 -81
- package/dist/cpsat/rules/max-days-week.js.map +1 -1
- package/dist/cpsat/rules/max-hours-day.d.ts +14 -31
- package/dist/cpsat/rules/max-hours-day.d.ts.map +1 -1
- package/dist/cpsat/rules/max-hours-day.js +56 -72
- package/dist/cpsat/rules/max-hours-day.js.map +1 -1
- package/dist/cpsat/rules/max-hours-week.d.ts +15 -31
- package/dist/cpsat/rules/max-hours-week.d.ts.map +1 -1
- package/dist/cpsat/rules/max-hours-week.js +60 -75
- package/dist/cpsat/rules/max-hours-week.js.map +1 -1
- package/dist/cpsat/rules/max-shifts-day.d.ts +17 -33
- package/dist/cpsat/rules/max-shifts-day.d.ts.map +1 -1
- package/dist/cpsat/rules/max-shifts-day.js +57 -73
- package/dist/cpsat/rules/max-shifts-day.js.map +1 -1
- package/dist/cpsat/rules/min-consecutive-days.d.ts +18 -18
- package/dist/cpsat/rules/min-consecutive-days.d.ts.map +1 -1
- package/dist/cpsat/rules/min-consecutive-days.js +123 -94
- package/dist/cpsat/rules/min-consecutive-days.js.map +1 -1
- package/dist/cpsat/rules/min-days-of-week-per-period.d.ts +35 -0
- package/dist/cpsat/rules/min-days-of-week-per-period.d.ts.map +1 -0
- package/dist/cpsat/rules/min-days-of-week-per-period.js +108 -0
- package/dist/cpsat/rules/min-days-of-week-per-period.js.map +1 -0
- package/dist/cpsat/rules/min-days-week.d.ts +13 -26
- package/dist/cpsat/rules/min-days-week.d.ts.map +1 -1
- package/dist/cpsat/rules/min-days-week.js +85 -74
- package/dist/cpsat/rules/min-days-week.js.map +1 -1
- package/dist/cpsat/rules/min-hours-day.d.ts +14 -17
- package/dist/cpsat/rules/min-hours-day.d.ts.map +1 -1
- package/dist/cpsat/rules/min-hours-day.js +72 -54
- package/dist/cpsat/rules/min-hours-day.js.map +1 -1
- package/dist/cpsat/rules/min-hours-week.d.ts +15 -18
- package/dist/cpsat/rules/min-hours-week.d.ts.map +1 -1
- package/dist/cpsat/rules/min-hours-week.js +75 -57
- package/dist/cpsat/rules/min-hours-week.js.map +1 -1
- package/dist/cpsat/rules/min-rest-between-shifts.d.ts +14 -17
- package/dist/cpsat/rules/min-rest-between-shifts.d.ts.map +1 -1
- package/dist/cpsat/rules/min-rest-between-shifts.js +148 -138
- package/dist/cpsat/rules/min-rest-between-shifts.js.map +1 -1
- package/dist/cpsat/rules/minimize-cost.d.ts +2 -18
- package/dist/cpsat/rules/minimize-cost.d.ts.map +1 -1
- package/dist/cpsat/rules/minimize-cost.js +151 -163
- package/dist/cpsat/rules/minimize-cost.js.map +1 -1
- package/dist/cpsat/rules/must-assign.d.ts +5 -42
- package/dist/cpsat/rules/must-assign.d.ts.map +1 -1
- package/dist/cpsat/rules/must-assign.js +43 -75
- package/dist/cpsat/rules/must-assign.js.map +1 -1
- package/dist/cpsat/rules/overtime-daily-multiplier.d.ts +6 -10
- package/dist/cpsat/rules/overtime-daily-multiplier.d.ts.map +1 -1
- package/dist/cpsat/rules/overtime-daily-multiplier.js +118 -112
- package/dist/cpsat/rules/overtime-daily-multiplier.js.map +1 -1
- package/dist/cpsat/rules/overtime-daily-surcharge.d.ts +6 -11
- package/dist/cpsat/rules/overtime-daily-surcharge.d.ts.map +1 -1
- package/dist/cpsat/rules/overtime-daily-surcharge.js +104 -99
- package/dist/cpsat/rules/overtime-daily-surcharge.js.map +1 -1
- package/dist/cpsat/rules/overtime-tiered-multiplier.d.ts +9 -21
- package/dist/cpsat/rules/overtime-tiered-multiplier.d.ts.map +1 -1
- package/dist/cpsat/rules/overtime-tiered-multiplier.js +181 -199
- package/dist/cpsat/rules/overtime-tiered-multiplier.js.map +1 -1
- package/dist/cpsat/rules/overtime-weekly-multiplier.d.ts +13 -12
- package/dist/cpsat/rules/overtime-weekly-multiplier.d.ts.map +1 -1
- package/dist/cpsat/rules/overtime-weekly-multiplier.js +143 -143
- package/dist/cpsat/rules/overtime-weekly-multiplier.js.map +1 -1
- package/dist/cpsat/rules/overtime-weekly-surcharge.d.ts +7 -11
- package/dist/cpsat/rules/overtime-weekly-surcharge.d.ts.map +1 -1
- package/dist/cpsat/rules/overtime-weekly-surcharge.js +124 -119
- package/dist/cpsat/rules/overtime-weekly-surcharge.js.map +1 -1
- package/dist/cpsat/rules/pattern-eligibility.d.ts +6 -0
- package/dist/cpsat/rules/pattern-eligibility.d.ts.map +1 -0
- package/dist/cpsat/rules/pattern-eligibility.js +16 -0
- package/dist/cpsat/rules/pattern-eligibility.js.map +1 -0
- package/dist/cpsat/rules/pattern-time.d.ts +5 -0
- package/dist/cpsat/rules/pattern-time.d.ts.map +1 -0
- package/dist/cpsat/rules/pattern-time.js +20 -0
- package/dist/cpsat/rules/pattern-time.js.map +1 -0
- package/dist/cpsat/rules/registry.d.ts +217 -30
- package/dist/cpsat/rules/registry.d.ts.map +1 -1
- package/dist/cpsat/rules/registry.js +98 -34
- package/dist/cpsat/rules/registry.js.map +1 -1
- package/dist/cpsat/rules/resolver.d.ts +9 -7
- package/dist/cpsat/rules/resolver.d.ts.map +1 -1
- package/dist/cpsat/rules/resolver.js +19 -18
- package/dist/cpsat/rules/resolver.js.map +1 -1
- package/dist/cpsat/rules/role-preference.d.ts +24 -0
- package/dist/cpsat/rules/role-preference.d.ts.map +1 -0
- package/dist/cpsat/rules/role-preference.js +72 -0
- package/dist/cpsat/rules/role-preference.js.map +1 -0
- package/dist/cpsat/rules/rules.types.d.ts +90 -17
- package/dist/cpsat/rules/rules.types.d.ts.map +1 -1
- package/dist/cpsat/rules/scope.types.d.ts +24 -11
- package/dist/cpsat/rules/scope.types.d.ts.map +1 -1
- package/dist/cpsat/rules/scope.types.js +14 -19
- package/dist/cpsat/rules/scope.types.js.map +1 -1
- package/dist/cpsat/rules/target-days-week.d.ts +31 -0
- package/dist/cpsat/rules/target-days-week.d.ts.map +1 -0
- package/dist/cpsat/rules/target-days-week.js +80 -0
- package/dist/cpsat/rules/target-days-week.js.map +1 -0
- package/dist/cpsat/rules/target-peak-concurrent-assignments.d.ts +33 -0
- package/dist/cpsat/rules/target-peak-concurrent-assignments.d.ts.map +1 -0
- package/dist/cpsat/rules/target-peak-concurrent-assignments.js +146 -0
- package/dist/cpsat/rules/target-peak-concurrent-assignments.js.map +1 -0
- package/dist/cpsat/rules/time-cost-surcharge.d.ts +15 -14
- package/dist/cpsat/rules/time-cost-surcharge.d.ts.map +1 -1
- package/dist/cpsat/rules/time-cost-surcharge.js +82 -96
- package/dist/cpsat/rules/time-cost-surcharge.js.map +1 -1
- package/dist/cpsat/rules/time-off.d.ts +21 -57
- package/dist/cpsat/rules/time-off.d.ts.map +1 -1
- package/dist/cpsat/rules/time-off.js +114 -127
- package/dist/cpsat/rules/time-off.js.map +1 -1
- package/dist/cpsat/rules/variables.d.ts +4 -0
- package/dist/cpsat/rules/variables.d.ts.map +1 -0
- package/dist/cpsat/rules/variables.js +10 -0
- package/dist/cpsat/rules/variables.js.map +1 -0
- package/dist/cpsat/rules.d.ts +20 -3
- package/dist/cpsat/rules.d.ts.map +1 -1
- package/dist/cpsat/rules.js +19 -2
- package/dist/cpsat/rules.js.map +1 -1
- package/dist/cpsat/semantic-time.d.ts +7 -6
- package/dist/cpsat/semantic-time.d.ts.map +1 -1
- package/dist/cpsat/semantic-time.js +15 -28
- package/dist/cpsat/semantic-time.js.map +1 -1
- package/dist/cpsat/types.d.ts +47 -4
- package/dist/cpsat/types.d.ts.map +1 -1
- package/dist/cpsat/types.js +24 -1
- package/dist/cpsat/types.js.map +1 -1
- package/dist/cpsat/utils.d.ts +23 -6
- package/dist/cpsat/utils.d.ts.map +1 -1
- package/dist/cpsat/utils.js +76 -15
- package/dist/cpsat/utils.js.map +1 -1
- package/dist/cpsat/validation-reporter.d.ts +6 -2
- package/dist/cpsat/validation-reporter.d.ts.map +1 -1
- package/dist/cpsat/validation-reporter.js +122 -10
- package/dist/cpsat/validation-reporter.js.map +1 -1
- package/dist/cpsat/validation.types.d.ts +21 -10
- package/dist/cpsat/validation.types.d.ts.map +1 -1
- package/dist/datetime.utils.d.ts +7 -13
- package/dist/datetime.utils.d.ts.map +1 -1
- package/dist/datetime.utils.js +29 -36
- package/dist/datetime.utils.js.map +1 -1
- package/dist/index.d.ts +12 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -3
- package/dist/index.js.map +1 -1
- package/dist/schedule/cost.d.ts +48 -60
- package/dist/schedule/cost.d.ts.map +1 -1
- package/dist/schedule/cost.js +15 -51
- package/dist/schedule/cost.js.map +1 -1
- package/dist/schedule/coverage.d.ts +57 -28
- package/dist/schedule/coverage.d.ts.map +1 -1
- package/dist/schedule/coverage.js +24 -1
- package/dist/schedule/coverage.js.map +1 -1
- package/dist/schedule/definition.d.ts +138 -19
- package/dist/schedule/definition.d.ts.map +1 -1
- package/dist/schedule/definition.js +99 -90
- package/dist/schedule/definition.js.map +1 -1
- package/dist/schedule/index.d.ts +4 -4
- package/dist/schedule/index.d.ts.map +1 -1
- package/dist/schedule/index.js +2 -2
- package/dist/schedule/index.js.map +1 -1
- package/dist/schedule/rules.d.ts +438 -113
- package/dist/schedule/rules.d.ts.map +1 -1
- package/dist/schedule/rules.js +310 -108
- package/dist/schedule/rules.js.map +1 -1
- package/dist/schedule/shift-patterns.d.ts +0 -17
- package/dist/schedule/shift-patterns.d.ts.map +1 -1
- package/dist/schedule/shift-patterns.js +0 -17
- package/dist/schedule/shift-patterns.js.map +1 -1
- package/dist/schedule/time-periods.d.ts +37 -27
- package/dist/schedule/time-periods.d.ts.map +1 -1
- package/dist/schedule/time-periods.js +37 -27
- package/dist/schedule/time-periods.js.map +1 -1
- package/dist/types.d.ts +67 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +64 -0
- package/dist/types.js.map +1 -1
- package/package.json +8 -9
- package/solver/src/solver/models.py +41 -4
- package/solver/src/solver/solver.py +546 -157
- package/solver/tests/test_solver.py +363 -7
- package/src/client.schemas.ts +127 -10
- package/src/client.ts +3 -0
- package/src/client.types.ts +73 -7
- package/src/cpsat/cost.ts +17 -7
- package/src/cpsat/model-builder.ts +614 -129
- package/src/cpsat/response.ts +57 -13
- package/src/cpsat/rule-descriptor.ts +311 -0
- package/src/cpsat/rules/artifacts.ts +56 -0
- package/src/cpsat/rules/assign-together.ts +104 -69
- package/src/cpsat/rules/assigned-day.ts +70 -0
- package/src/cpsat/rules/assignment-priority.ts +54 -58
- package/src/cpsat/rules/assignment-terms.ts +43 -0
- package/src/cpsat/rules/concurrent-intervals.ts +93 -0
- package/src/cpsat/rules/cost-utils.ts +1 -9
- package/src/cpsat/rules/day-cost-multiplier.ts +101 -81
- package/src/cpsat/rules/day-cost-surcharge.ts +91 -70
- package/src/cpsat/rules/index.ts +30 -24
- package/src/cpsat/rules/location-preference.ts +47 -52
- package/src/cpsat/rules/max-concurrent-assignments.ts +170 -0
- package/src/cpsat/rules/max-consecutive-days.ts +74 -91
- package/src/cpsat/rules/max-days-of-week-per-period.ts +127 -0
- package/src/cpsat/rules/max-days-week.ts +89 -115
- package/src/cpsat/rules/max-hours-day.ts +64 -84
- package/src/cpsat/rules/max-hours-week.ts +74 -90
- package/src/cpsat/rules/max-shifts-day.ts +65 -85
- package/src/cpsat/rules/min-consecutive-days.ts +161 -127
- package/src/cpsat/rules/min-days-of-week-per-period.ts +144 -0
- package/src/cpsat/rules/min-days-week.ts +93 -91
- package/src/cpsat/rules/min-hours-day.ts +79 -58
- package/src/cpsat/rules/min-hours-week.ts +87 -62
- package/src/cpsat/rules/min-rest-between-shifts.ts +191 -178
- package/src/cpsat/rules/minimize-cost.ts +175 -188
- package/src/cpsat/rules/must-assign.ts +44 -81
- package/src/cpsat/rules/overtime-daily-multiplier.ts +158 -140
- package/src/cpsat/rules/overtime-daily-surcharge.ts +141 -126
- package/src/cpsat/rules/overtime-tiered-multiplier.ts +234 -253
- package/src/cpsat/rules/overtime-weekly-multiplier.ts +183 -175
- package/src/cpsat/rules/overtime-weekly-surcharge.ts +161 -150
- package/src/cpsat/rules/pattern-eligibility.ts +26 -0
- package/src/cpsat/rules/pattern-time.ts +30 -0
- package/src/cpsat/rules/registry.ts +140 -62
- package/src/cpsat/rules/resolver.ts +58 -30
- package/src/cpsat/rules/role-preference.ts +92 -0
- package/src/cpsat/rules/rules.types.ts +89 -17
- package/src/cpsat/rules/scope.types.ts +31 -26
- package/src/cpsat/rules/target-days-week.ts +105 -0
- package/src/cpsat/rules/target-peak-concurrent-assignments.ts +212 -0
- package/src/cpsat/rules/time-cost-surcharge.ts +116 -122
- package/src/cpsat/rules/time-off.ts +154 -163
- package/src/cpsat/rules/variables.ts +11 -0
- package/src/cpsat/rules.ts +43 -17
- package/src/cpsat/semantic-time.ts +29 -43
- package/src/cpsat/types.ts +53 -4
- package/src/cpsat/utils.ts +92 -20
- package/src/cpsat/validation-reporter.ts +170 -19
- package/src/cpsat/validation.types.ts +22 -11
- package/src/datetime.utils.ts +45 -44
- package/src/index.ts +64 -12
- package/src/schedule/cost.ts +40 -61
- package/src/schedule/coverage.ts +57 -28
- package/src/schedule/definition.ts +565 -76
- package/src/schedule/index.ts +23 -3
- package/src/schedule/rules.ts +631 -132
- package/src/schedule/shift-patterns.ts +0 -17
- package/src/schedule/time-periods.ts +37 -27
- package/src/types.ts +114 -2
|
@@ -13,23 +13,6 @@ import type { ShiftPattern } from "../cpsat/types.js";
|
|
|
13
13
|
* @remarks
|
|
14
14
|
* Each pattern repeats daily unless filtered by `dayOfWeek`.
|
|
15
15
|
*
|
|
16
|
-
* @example
|
|
17
|
-
* ```typescript
|
|
18
|
-
* shiftPatterns: [
|
|
19
|
-
* shift("morning", t(11, 30), t(15)),
|
|
20
|
-
* shift("evening", t(17), t(22)),
|
|
21
|
-
*
|
|
22
|
-
* // Role-restricted shift
|
|
23
|
-
* shift("kitchen", t(6), t(14), { roleIds: ["chef", "prep_cook"] }),
|
|
24
|
-
*
|
|
25
|
-
* // Day-restricted shift
|
|
26
|
-
* shift("saturday_short", t(9), t(14), { dayOfWeek: ["saturday"] }),
|
|
27
|
-
*
|
|
28
|
-
* // Location-specific shift
|
|
29
|
-
* shift("terrace_lunch", t(12), t(16), { locationId: "terrace" }),
|
|
30
|
-
* ]
|
|
31
|
-
* ```
|
|
32
|
-
*
|
|
33
16
|
* @category Shift Patterns
|
|
34
17
|
*/
|
|
35
18
|
export function shift(
|
|
@@ -1,5 +1,26 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Time period primitives: day constants and time constructors.
|
|
2
|
+
* Time period primitives: day constants and semantic time constructors.
|
|
3
|
+
*
|
|
4
|
+
* Semantic times are business-relevant scheduling periods used to group
|
|
5
|
+
* coverage and rules. Some come directly from the requirements, for example opening,
|
|
6
|
+
* lunch, or closing. Others are inferred from the requirements so different
|
|
7
|
+
* parts of a day can carry different coverage floors or constraints.
|
|
8
|
+
*
|
|
9
|
+
* An unscoped `time(...)` entry applies every day in the scheduling period.
|
|
10
|
+
* Names are descriptive only, they do not scope a time to a day. If a time is
|
|
11
|
+
* day-specific, add `dayOfWeek` or `dates` explicitly.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```typescript
|
|
15
|
+
* times: {
|
|
16
|
+
* lunch: time({ startTime: t(12), endTime: t(15) }),
|
|
17
|
+
* dinner: time(
|
|
18
|
+
* { startTime: t(17), endTime: t(21) },
|
|
19
|
+
* { startTime: t(18), endTime: t(22), dayOfWeek: weekend },
|
|
20
|
+
* ),
|
|
21
|
+
* thursday_open: time({ startTime: t(10), endTime: t(11), dayOfWeek: ["thursday"] }),
|
|
22
|
+
* }
|
|
23
|
+
* ```
|
|
3
24
|
*
|
|
4
25
|
* @module
|
|
5
26
|
*/
|
|
@@ -17,16 +38,6 @@ import type {
|
|
|
17
38
|
* @param hours - Hour component (0-23)
|
|
18
39
|
* @param minutes - Minute component (0-59)
|
|
19
40
|
*
|
|
20
|
-
* @example Hours only
|
|
21
|
-
* ```ts
|
|
22
|
-
* t(9) // { hours: 9, minutes: 0 }
|
|
23
|
-
* ```
|
|
24
|
-
*
|
|
25
|
-
* @example Hours and minutes
|
|
26
|
-
* ```ts
|
|
27
|
-
* t(17, 30) // { hours: 17, minutes: 30 }
|
|
28
|
-
* ```
|
|
29
|
-
*
|
|
30
41
|
* @category Time Periods
|
|
31
42
|
*/
|
|
32
43
|
export function t(hours: number, minutes = 0): TimeOfDay {
|
|
@@ -61,24 +72,23 @@ export const weekend = ["saturday", "sunday"] as const satisfies readonly [
|
|
|
61
72
|
*
|
|
62
73
|
* @remarks
|
|
63
74
|
* Each entry has `startTime`/`endTime` and optional `dayOfWeek` or `dates`
|
|
64
|
-
* scoping. Entries without scoping are the default
|
|
65
|
-
*
|
|
66
|
-
*
|
|
67
|
-
*
|
|
68
|
-
*
|
|
69
|
-
* // Simple: same times every day
|
|
70
|
-
* lunch: time({ startTime: t(12), endTime: t(15) }),
|
|
75
|
+
* scoping. Entries without scoping are the default and apply every day in the
|
|
76
|
+
* scheduling period. The surrounding object key is only a name, it does not
|
|
77
|
+
* add scope. For example, `thursday_open: time({ startTime: ..., endTime: ... })`
|
|
78
|
+
* still applies on Monday, Tuesday, and every other scheduling day unless you
|
|
79
|
+
* add `dayOfWeek: ["thursday"]`.
|
|
71
80
|
*
|
|
72
|
-
*
|
|
73
|
-
*
|
|
74
|
-
*
|
|
75
|
-
*
|
|
76
|
-
*
|
|
81
|
+
* Use semantic times to represent business periods, not shift patterns. Some
|
|
82
|
+
* periods have explicit boundaries in the requirements. Others are inferred so
|
|
83
|
+
* related coverage and rules can attach to the correct part of the day. Choose
|
|
84
|
+
* the simplest set of semantic times that preserves the business distinctions
|
|
85
|
+
* you need.
|
|
77
86
|
*
|
|
78
|
-
*
|
|
79
|
-
*
|
|
80
|
-
*
|
|
81
|
-
*
|
|
87
|
+
* Avoid adding a broad all-day semantic time when narrower windows already
|
|
88
|
+
* describe the day's distinct requirements. If opening, core trading, and
|
|
89
|
+
* closing each need different coverage, model those windows directly instead
|
|
90
|
+
* of layering an extra whole-day period on top unless the lower bound truly
|
|
91
|
+
* applies for the full span.
|
|
82
92
|
*
|
|
83
93
|
* @privateRemarks
|
|
84
94
|
* Resolution precedence: `dates` > `dayOfWeek` > default.
|
package/src/types.ts
CHANGED
|
@@ -48,6 +48,118 @@ export interface TimeOfDay {
|
|
|
48
48
|
minutes: number;
|
|
49
49
|
}
|
|
50
50
|
|
|
51
|
+
// ============================================================================
|
|
52
|
+
// Date String
|
|
53
|
+
// ============================================================================
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* A date string in ISO 8601 calendar date format (YYYY-MM-DD).
|
|
57
|
+
*
|
|
58
|
+
* Template literal type that rejects arbitrary strings at compile time.
|
|
59
|
+
* Use this wherever a raw date string is expected in scheduling APIs.
|
|
60
|
+
*
|
|
61
|
+
* @category Supporting Types
|
|
62
|
+
*/
|
|
63
|
+
export type DateString = `${number}-${number}-${number}`;
|
|
64
|
+
|
|
65
|
+
const DATE_STRING_RE = /^\d{4}-\d{2}-\d{2}$/;
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Checks whether a string matches the {@link DateString} YYYY-MM-DD format.
|
|
69
|
+
*
|
|
70
|
+
* @remarks
|
|
71
|
+
* This validates string shape only. It does not guarantee that the value is a
|
|
72
|
+
* semantically valid calendar date.
|
|
73
|
+
*
|
|
74
|
+
* @param value - String to test
|
|
75
|
+
*
|
|
76
|
+
* @category Supporting Types
|
|
77
|
+
*/
|
|
78
|
+
export function isDateString(value: string): value is DateString {
|
|
79
|
+
return DATE_STRING_RE.test(value);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// ============================================================================
|
|
83
|
+
// Scheduling Day
|
|
84
|
+
// ============================================================================
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* A calendar day with pre-computed date components.
|
|
88
|
+
*
|
|
89
|
+
* Constructed once from a YYYY-MM-DD string via {@link schedulingDay}, then
|
|
90
|
+
* passed by reference. Replaces raw `string` day representations throughout
|
|
91
|
+
* the solver so downstream code never needs to parse dates.
|
|
92
|
+
*
|
|
93
|
+
* @category Supporting Types
|
|
94
|
+
*/
|
|
95
|
+
export interface SchedulingDay {
|
|
96
|
+
/** The canonical YYYY-MM-DD string. */
|
|
97
|
+
readonly iso: DateString;
|
|
98
|
+
/** Day of week (monday, tuesday, ...). */
|
|
99
|
+
readonly dayOfWeek: DayOfWeek;
|
|
100
|
+
/** 1-indexed month (1 = January, 12 = December). */
|
|
101
|
+
readonly month: number;
|
|
102
|
+
/** 1-indexed day of the month. */
|
|
103
|
+
readonly dayOfMonth: number;
|
|
104
|
+
/** Year-month key for grouping ("YYYY-MM"). */
|
|
105
|
+
readonly yearMonth: string;
|
|
106
|
+
/** Integer days since Unix epoch (1970-01-01 = 0). Useful for date arithmetic. */
|
|
107
|
+
readonly epochDay: number;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
export const DAY_NAMES: readonly DayOfWeek[] = [
|
|
111
|
+
"sunday",
|
|
112
|
+
"monday",
|
|
113
|
+
"tuesday",
|
|
114
|
+
"wednesday",
|
|
115
|
+
"thursday",
|
|
116
|
+
"friday",
|
|
117
|
+
"saturday",
|
|
118
|
+
];
|
|
119
|
+
|
|
120
|
+
const DAY_OF_WEEK_INDEX: Record<DayOfWeek, number> = {
|
|
121
|
+
sunday: 0,
|
|
122
|
+
monday: 1,
|
|
123
|
+
tuesday: 2,
|
|
124
|
+
wednesday: 3,
|
|
125
|
+
thursday: 4,
|
|
126
|
+
friday: 5,
|
|
127
|
+
saturday: 6,
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Creates a {@link SchedulingDay} from a YYYY-MM-DD string.
|
|
132
|
+
*
|
|
133
|
+
* Parses the date once in UTC and pre-computes all fields so that no
|
|
134
|
+
* downstream code ever needs to construct a `Date` object.
|
|
135
|
+
*
|
|
136
|
+
* @param iso - Date string in YYYY-MM-DD format
|
|
137
|
+
*
|
|
138
|
+
* @category Supporting Types
|
|
139
|
+
*/
|
|
140
|
+
export function schedulingDay(iso: DateString): SchedulingDay {
|
|
141
|
+
const date = new Date(`${iso}T00:00:00Z`);
|
|
142
|
+
const dayOfWeek = DAY_NAMES[date.getUTCDay()]!;
|
|
143
|
+
const month = date.getUTCMonth() + 1;
|
|
144
|
+
const dayOfMonth = date.getUTCDate();
|
|
145
|
+
return {
|
|
146
|
+
iso,
|
|
147
|
+
dayOfWeek,
|
|
148
|
+
month,
|
|
149
|
+
dayOfMonth,
|
|
150
|
+
yearMonth: iso.slice(0, 7),
|
|
151
|
+
epochDay: Math.floor(date.getTime() / 86_400_000),
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Maps {@link DayOfWeek} names to JavaScript `Date.getUTCDay()` indices
|
|
157
|
+
* (0 = Sunday, 6 = Saturday).
|
|
158
|
+
*
|
|
159
|
+
* @category Supporting Types
|
|
160
|
+
*/
|
|
161
|
+
export { DAY_OF_WEEK_INDEX };
|
|
162
|
+
|
|
51
163
|
// ============================================================================
|
|
52
164
|
// Scheduling Period
|
|
53
165
|
// ============================================================================
|
|
@@ -89,7 +201,7 @@ export interface SchedulingPeriod {
|
|
|
89
201
|
* The overall scheduling window (start and end are inclusive).
|
|
90
202
|
* Dates should be in YYYY-MM-DD format.
|
|
91
203
|
*/
|
|
92
|
-
dateRange: { start:
|
|
204
|
+
dateRange: { start: DateString; end: DateString };
|
|
93
205
|
/**
|
|
94
206
|
* Include only these days of the week.
|
|
95
207
|
* If omitted, all days of the week are included.
|
|
@@ -99,5 +211,5 @@ export interface SchedulingPeriod {
|
|
|
99
211
|
* Include only these specific dates (YYYY-MM-DD) within the range.
|
|
100
212
|
* If omitted, all dates in the range are included (subject to dayOfWeek filter).
|
|
101
213
|
*/
|
|
102
|
-
dates?:
|
|
214
|
+
dates?: DateString[];
|
|
103
215
|
}
|