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
|
@@ -9,23 +9,6 @@
|
|
|
9
9
|
* @remarks
|
|
10
10
|
* Each pattern repeats daily unless filtered by `dayOfWeek`.
|
|
11
11
|
*
|
|
12
|
-
* @example
|
|
13
|
-
* ```typescript
|
|
14
|
-
* shiftPatterns: [
|
|
15
|
-
* shift("morning", t(11, 30), t(15)),
|
|
16
|
-
* shift("evening", t(17), t(22)),
|
|
17
|
-
*
|
|
18
|
-
* // Role-restricted shift
|
|
19
|
-
* shift("kitchen", t(6), t(14), { roleIds: ["chef", "prep_cook"] }),
|
|
20
|
-
*
|
|
21
|
-
* // Day-restricted shift
|
|
22
|
-
* shift("saturday_short", t(9), t(14), { dayOfWeek: ["saturday"] }),
|
|
23
|
-
*
|
|
24
|
-
* // Location-specific shift
|
|
25
|
-
* shift("terrace_lunch", t(12), t(16), { locationId: "terrace" }),
|
|
26
|
-
* ]
|
|
27
|
-
* ```
|
|
28
|
-
*
|
|
29
12
|
* @category Shift Patterns
|
|
30
13
|
*/
|
|
31
14
|
export function shift(id, startTime, endTime, opts) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shift-patterns.js","sourceRoot":"","sources":["../../src/schedule/shift-patterns.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH
|
|
1
|
+
{"version":3,"file":"shift-patterns.js","sourceRoot":"","sources":["../../src/schedule/shift-patterns.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH;;;;;;;GAOG;AACH,MAAM,UAAU,KAAK,CACnB,EAAU,EACV,SAAoB,EACpB,OAAkB,EAClB,IAAiE;IAEjE,MAAM,OAAO,GAAiB,EAAE,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;IACzD,IAAI,IAAI,EAAE,OAAO;QAAE,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;IAClD,IAAI,IAAI,EAAE,SAAS;QAAE,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;IACxD,IAAI,IAAI,EAAE,UAAU;QAAE,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;IAC3D,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -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
|
*/
|
|
@@ -11,16 +32,6 @@ import type { SemanticTimeVariant, SemanticTimeEntry } from "../cpsat/semantic-t
|
|
|
11
32
|
* @param hours - Hour component (0-23)
|
|
12
33
|
* @param minutes - Minute component (0-59)
|
|
13
34
|
*
|
|
14
|
-
* @example Hours only
|
|
15
|
-
* ```ts
|
|
16
|
-
* t(9) // { hours: 9, minutes: 0 }
|
|
17
|
-
* ```
|
|
18
|
-
*
|
|
19
|
-
* @example Hours and minutes
|
|
20
|
-
* ```ts
|
|
21
|
-
* t(17, 30) // { hours: 17, minutes: 30 }
|
|
22
|
-
* ```
|
|
23
|
-
*
|
|
24
35
|
* @category Time Periods
|
|
25
36
|
*/
|
|
26
37
|
export declare function t(hours: number, minutes?: number): TimeOfDay;
|
|
@@ -41,24 +52,23 @@ export declare const weekend: readonly ["saturday", "sunday"];
|
|
|
41
52
|
*
|
|
42
53
|
* @remarks
|
|
43
54
|
* Each entry has `startTime`/`endTime` and optional `dayOfWeek` or `dates`
|
|
44
|
-
* scoping. Entries without scoping are the default
|
|
45
|
-
*
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
*
|
|
49
|
-
* // Simple: same times every day
|
|
50
|
-
* lunch: time({ startTime: t(12), endTime: t(15) }),
|
|
55
|
+
* scoping. Entries without scoping are the default and apply every day in the
|
|
56
|
+
* scheduling period. The surrounding object key is only a name, it does not
|
|
57
|
+
* add scope. For example, `thursday_open: time({ startTime: ..., endTime: ... })`
|
|
58
|
+
* still applies on Monday, Tuesday, and every other scheduling day unless you
|
|
59
|
+
* add `dayOfWeek: ["thursday"]`.
|
|
51
60
|
*
|
|
52
|
-
*
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
*
|
|
61
|
+
* Use semantic times to represent business periods, not shift patterns. Some
|
|
62
|
+
* periods have explicit boundaries in the requirements. Others are inferred so
|
|
63
|
+
* related coverage and rules can attach to the correct part of the day. Choose
|
|
64
|
+
* the simplest set of semantic times that preserves the business distinctions
|
|
65
|
+
* you need.
|
|
57
66
|
*
|
|
58
|
-
*
|
|
59
|
-
*
|
|
60
|
-
*
|
|
61
|
-
*
|
|
67
|
+
* Avoid adding a broad all-day semantic time when narrower windows already
|
|
68
|
+
* describe the day's distinct requirements. If opening, core trading, and
|
|
69
|
+
* closing each need different coverage, model those windows directly instead
|
|
70
|
+
* of layering an extra whole-day period on top unless the lower bound truly
|
|
71
|
+
* applies for the full span.
|
|
62
72
|
*
|
|
63
73
|
* @privateRemarks
|
|
64
74
|
* Resolution precedence: `dates` > `dayOfWeek` > default.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"time-periods.d.ts","sourceRoot":"","sources":["../../src/schedule/time-periods.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"time-periods.d.ts","sourceRoot":"","sources":["../../src/schedule/time-periods.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EAAa,SAAS,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,KAAK,EAEV,mBAAmB,EACnB,iBAAiB,EAClB,MAAM,2BAA2B,CAAC;AAEnC;;;;;;;GAOG;AACH,wBAAgB,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,SAAI,GAAG,SAAS,CAEvD;AAED;;;;GAIG;AACH,eAAO,MAAM,QAAQ,mEAMoC,CAAC;AAE1D;;;;GAIG;AACH,eAAO,MAAM,OAAO,iCAGnB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,IAAI,CAClB,GAAG,OAAO,EAAE,CAAC,mBAAmB,EAAE,GAAG,mBAAmB,EAAE,CAAC,GAC1D,iBAAiB,CAoBnB"}
|
|
@@ -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
|
*/
|
|
@@ -9,16 +30,6 @@
|
|
|
9
30
|
* @param hours - Hour component (0-23)
|
|
10
31
|
* @param minutes - Minute component (0-59)
|
|
11
32
|
*
|
|
12
|
-
* @example Hours only
|
|
13
|
-
* ```ts
|
|
14
|
-
* t(9) // { hours: 9, minutes: 0 }
|
|
15
|
-
* ```
|
|
16
|
-
*
|
|
17
|
-
* @example Hours and minutes
|
|
18
|
-
* ```ts
|
|
19
|
-
* t(17, 30) // { hours: 17, minutes: 30 }
|
|
20
|
-
* ```
|
|
21
|
-
*
|
|
22
33
|
* @category Time Periods
|
|
23
34
|
*/
|
|
24
35
|
export function t(hours, minutes = 0) {
|
|
@@ -47,24 +58,23 @@ export const weekend = ["saturday", "sunday"];
|
|
|
47
58
|
*
|
|
48
59
|
* @remarks
|
|
49
60
|
* Each entry has `startTime`/`endTime` and optional `dayOfWeek` or `dates`
|
|
50
|
-
* scoping. Entries without scoping are the default
|
|
51
|
-
*
|
|
52
|
-
*
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
* // Simple: same times every day
|
|
56
|
-
* lunch: time({ startTime: t(12), endTime: t(15) }),
|
|
61
|
+
* scoping. Entries without scoping are the default and apply every day in the
|
|
62
|
+
* scheduling period. The surrounding object key is only a name, it does not
|
|
63
|
+
* add scope. For example, `thursday_open: time({ startTime: ..., endTime: ... })`
|
|
64
|
+
* still applies on Monday, Tuesday, and every other scheduling day unless you
|
|
65
|
+
* add `dayOfWeek: ["thursday"]`.
|
|
57
66
|
*
|
|
58
|
-
*
|
|
59
|
-
*
|
|
60
|
-
*
|
|
61
|
-
*
|
|
62
|
-
*
|
|
67
|
+
* Use semantic times to represent business periods, not shift patterns. Some
|
|
68
|
+
* periods have explicit boundaries in the requirements. Others are inferred so
|
|
69
|
+
* related coverage and rules can attach to the correct part of the day. Choose
|
|
70
|
+
* the simplest set of semantic times that preserves the business distinctions
|
|
71
|
+
* you need.
|
|
63
72
|
*
|
|
64
|
-
*
|
|
65
|
-
*
|
|
66
|
-
*
|
|
67
|
-
*
|
|
73
|
+
* Avoid adding a broad all-day semantic time when narrower windows already
|
|
74
|
+
* describe the day's distinct requirements. If opening, core trading, and
|
|
75
|
+
* closing each need different coverage, model those windows directly instead
|
|
76
|
+
* of layering an extra whole-day period on top unless the lower bound truly
|
|
77
|
+
* applies for the full span.
|
|
68
78
|
*
|
|
69
79
|
* @privateRemarks
|
|
70
80
|
* Resolution precedence: `dates` > `dayOfWeek` > default.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"time-periods.js","sourceRoot":"","sources":["../../src/schedule/time-periods.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"time-periods.js","sourceRoot":"","sources":["../../src/schedule/time-periods.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AASH;;;;;;;GAOG;AACH,MAAM,UAAU,CAAC,CAAC,KAAa,EAAE,OAAO,GAAG,CAAC;IAC1C,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AAC5B,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,QAAQ;IACR,SAAS;IACT,WAAW;IACX,UAAU;IACV,QAAQ;CAC+C,CAAC;AAE1D;;;;GAIG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,UAAU,EAAE,QAAQ,CAG3C,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,MAAM,UAAU,IAAI,CAClB,GAAG,OAAwD;IAE3D,4DAA4D;IAC5D,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACjE,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CACb,yEAAyE;YACvE,SAAS,QAAQ,CAAC,MAAM,mBAAmB,CAC9C,CAAC;IACJ,CAAC;IAED,uDAAuD;IACvD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;QACvE,OAAO;YACL,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS;YAC/B,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO;SACF,CAAC;IAC9B,CAAC;IAED,2EAA2E;IAC3E,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;AAC1D,CAAC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -24,6 +24,70 @@ export interface TimeOfDay {
|
|
|
24
24
|
hours: number;
|
|
25
25
|
minutes: number;
|
|
26
26
|
}
|
|
27
|
+
/**
|
|
28
|
+
* A date string in ISO 8601 calendar date format (YYYY-MM-DD).
|
|
29
|
+
*
|
|
30
|
+
* Template literal type that rejects arbitrary strings at compile time.
|
|
31
|
+
* Use this wherever a raw date string is expected in scheduling APIs.
|
|
32
|
+
*
|
|
33
|
+
* @category Supporting Types
|
|
34
|
+
*/
|
|
35
|
+
export type DateString = `${number}-${number}-${number}`;
|
|
36
|
+
/**
|
|
37
|
+
* Checks whether a string matches the {@link DateString} YYYY-MM-DD format.
|
|
38
|
+
*
|
|
39
|
+
* @remarks
|
|
40
|
+
* This validates string shape only. It does not guarantee that the value is a
|
|
41
|
+
* semantically valid calendar date.
|
|
42
|
+
*
|
|
43
|
+
* @param value - String to test
|
|
44
|
+
*
|
|
45
|
+
* @category Supporting Types
|
|
46
|
+
*/
|
|
47
|
+
export declare function isDateString(value: string): value is DateString;
|
|
48
|
+
/**
|
|
49
|
+
* A calendar day with pre-computed date components.
|
|
50
|
+
*
|
|
51
|
+
* Constructed once from a YYYY-MM-DD string via {@link schedulingDay}, then
|
|
52
|
+
* passed by reference. Replaces raw `string` day representations throughout
|
|
53
|
+
* the solver so downstream code never needs to parse dates.
|
|
54
|
+
*
|
|
55
|
+
* @category Supporting Types
|
|
56
|
+
*/
|
|
57
|
+
export interface SchedulingDay {
|
|
58
|
+
/** The canonical YYYY-MM-DD string. */
|
|
59
|
+
readonly iso: DateString;
|
|
60
|
+
/** Day of week (monday, tuesday, ...). */
|
|
61
|
+
readonly dayOfWeek: DayOfWeek;
|
|
62
|
+
/** 1-indexed month (1 = January, 12 = December). */
|
|
63
|
+
readonly month: number;
|
|
64
|
+
/** 1-indexed day of the month. */
|
|
65
|
+
readonly dayOfMonth: number;
|
|
66
|
+
/** Year-month key for grouping ("YYYY-MM"). */
|
|
67
|
+
readonly yearMonth: string;
|
|
68
|
+
/** Integer days since Unix epoch (1970-01-01 = 0). Useful for date arithmetic. */
|
|
69
|
+
readonly epochDay: number;
|
|
70
|
+
}
|
|
71
|
+
export declare const DAY_NAMES: readonly DayOfWeek[];
|
|
72
|
+
declare const DAY_OF_WEEK_INDEX: Record<DayOfWeek, number>;
|
|
73
|
+
/**
|
|
74
|
+
* Creates a {@link SchedulingDay} from a YYYY-MM-DD string.
|
|
75
|
+
*
|
|
76
|
+
* Parses the date once in UTC and pre-computes all fields so that no
|
|
77
|
+
* downstream code ever needs to construct a `Date` object.
|
|
78
|
+
*
|
|
79
|
+
* @param iso - Date string in YYYY-MM-DD format
|
|
80
|
+
*
|
|
81
|
+
* @category Supporting Types
|
|
82
|
+
*/
|
|
83
|
+
export declare function schedulingDay(iso: DateString): SchedulingDay;
|
|
84
|
+
/**
|
|
85
|
+
* Maps {@link DayOfWeek} names to JavaScript `Date.getUTCDay()` indices
|
|
86
|
+
* (0 = Sunday, 6 = Saturday).
|
|
87
|
+
*
|
|
88
|
+
* @category Supporting Types
|
|
89
|
+
*/
|
|
90
|
+
export { DAY_OF_WEEK_INDEX };
|
|
27
91
|
/**
|
|
28
92
|
* Defines a scheduling period as a date range with optional filters.
|
|
29
93
|
*
|
|
@@ -62,8 +126,8 @@ export interface SchedulingPeriod {
|
|
|
62
126
|
* Dates should be in YYYY-MM-DD format.
|
|
63
127
|
*/
|
|
64
128
|
dateRange: {
|
|
65
|
-
start:
|
|
66
|
-
end:
|
|
129
|
+
start: DateString;
|
|
130
|
+
end: DateString;
|
|
67
131
|
};
|
|
68
132
|
/**
|
|
69
133
|
* Include only these days of the week.
|
|
@@ -74,6 +138,6 @@ export interface SchedulingPeriod {
|
|
|
74
138
|
* Include only these specific dates (YYYY-MM-DD) within the range.
|
|
75
139
|
* If omitted, all dates in the range are included (subject to dayOfWeek filter).
|
|
76
140
|
*/
|
|
77
|
-
dates?:
|
|
141
|
+
dates?: DateString[];
|
|
78
142
|
}
|
|
79
143
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAMzB;;;;GAIG;AACH,MAAM,MAAM,SAAS,GACjB,QAAQ,GACR,SAAS,GACT,WAAW,GACX,UAAU,GACV,QAAQ,GACR,UAAU,GACV,QAAQ,CAAC;AAEb;;;GAGG;AACH,eAAO,MAAM,eAAe,uMAQ1B,CAAC;AAEH;;;;GAIG;AACH,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;OAGG;IACH,SAAS,EAAE;QAAE,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAMzB;;;;GAIG;AACH,MAAM,MAAM,SAAS,GACjB,QAAQ,GACR,SAAS,GACT,WAAW,GACX,UAAU,GACV,QAAQ,GACR,UAAU,GACV,QAAQ,CAAC;AAEb;;;GAGG;AACH,eAAO,MAAM,eAAe,uMAQ1B,CAAC;AAEH;;;;GAIG;AACH,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAMD;;;;;;;GAOG;AACH,MAAM,MAAM,UAAU,GAAG,GAAG,MAAM,IAAI,MAAM,IAAI,MAAM,EAAE,CAAC;AAIzD;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,UAAU,CAE/D;AAMD;;;;;;;;GAQG;AACH,MAAM,WAAW,aAAa;IAC5B,uCAAuC;IACvC,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC;IACzB,0CAA0C;IAC1C,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,oDAAoD;IACpD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,kCAAkC;IAClC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,+CAA+C;IAC/C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,kFAAkF;IAClF,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,eAAO,MAAM,SAAS,EAAE,SAAS,SAAS,EAQzC,CAAC;AAEF,QAAA,MAAM,iBAAiB,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAQhD,CAAC;AAEF;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,UAAU,GAAG,aAAa,CAa5D;AAED;;;;;GAKG;AACH,OAAO,EAAE,iBAAiB,EAAE,CAAC;AAM7B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;OAGG;IACH,SAAS,EAAE;QAAE,KAAK,EAAE,UAAU,CAAC;QAAC,GAAG,EAAE,UAAU,CAAA;KAAE,CAAC;IAClD;;;OAGG;IACH,SAAS,CAAC,EAAE,SAAS,SAAS,EAAE,CAAC;IACjC;;;OAGG;IACH,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;CACtB"}
|
package/dist/types.js
CHANGED
|
@@ -17,4 +17,68 @@ export const DayOfWeekSchema = z.union([
|
|
|
17
17
|
z.literal("saturday"),
|
|
18
18
|
z.literal("sunday"),
|
|
19
19
|
]);
|
|
20
|
+
const DATE_STRING_RE = /^\d{4}-\d{2}-\d{2}$/;
|
|
21
|
+
/**
|
|
22
|
+
* Checks whether a string matches the {@link DateString} YYYY-MM-DD format.
|
|
23
|
+
*
|
|
24
|
+
* @remarks
|
|
25
|
+
* This validates string shape only. It does not guarantee that the value is a
|
|
26
|
+
* semantically valid calendar date.
|
|
27
|
+
*
|
|
28
|
+
* @param value - String to test
|
|
29
|
+
*
|
|
30
|
+
* @category Supporting Types
|
|
31
|
+
*/
|
|
32
|
+
export function isDateString(value) {
|
|
33
|
+
return DATE_STRING_RE.test(value);
|
|
34
|
+
}
|
|
35
|
+
export const DAY_NAMES = [
|
|
36
|
+
"sunday",
|
|
37
|
+
"monday",
|
|
38
|
+
"tuesday",
|
|
39
|
+
"wednesday",
|
|
40
|
+
"thursday",
|
|
41
|
+
"friday",
|
|
42
|
+
"saturday",
|
|
43
|
+
];
|
|
44
|
+
const DAY_OF_WEEK_INDEX = {
|
|
45
|
+
sunday: 0,
|
|
46
|
+
monday: 1,
|
|
47
|
+
tuesday: 2,
|
|
48
|
+
wednesday: 3,
|
|
49
|
+
thursday: 4,
|
|
50
|
+
friday: 5,
|
|
51
|
+
saturday: 6,
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
* Creates a {@link SchedulingDay} from a YYYY-MM-DD string.
|
|
55
|
+
*
|
|
56
|
+
* Parses the date once in UTC and pre-computes all fields so that no
|
|
57
|
+
* downstream code ever needs to construct a `Date` object.
|
|
58
|
+
*
|
|
59
|
+
* @param iso - Date string in YYYY-MM-DD format
|
|
60
|
+
*
|
|
61
|
+
* @category Supporting Types
|
|
62
|
+
*/
|
|
63
|
+
export function schedulingDay(iso) {
|
|
64
|
+
const date = new Date(`${iso}T00:00:00Z`);
|
|
65
|
+
const dayOfWeek = DAY_NAMES[date.getUTCDay()];
|
|
66
|
+
const month = date.getUTCMonth() + 1;
|
|
67
|
+
const dayOfMonth = date.getUTCDate();
|
|
68
|
+
return {
|
|
69
|
+
iso,
|
|
70
|
+
dayOfWeek,
|
|
71
|
+
month,
|
|
72
|
+
dayOfMonth,
|
|
73
|
+
yearMonth: iso.slice(0, 7),
|
|
74
|
+
epochDay: Math.floor(date.getTime() / 86_400_000),
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Maps {@link DayOfWeek} names to JavaScript `Date.getUTCDay()` indices
|
|
79
|
+
* (0 = Sunday, 6 = Saturday).
|
|
80
|
+
*
|
|
81
|
+
* @category Supporting Types
|
|
82
|
+
*/
|
|
83
|
+
export { DAY_OF_WEEK_INDEX };
|
|
20
84
|
//# sourceMappingURL=types.js.map
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAoBzB;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC;IACrC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;IACnB,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC;IACpB,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC;IACtB,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC;IACrB,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;IACnB,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC;IACrB,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;CACpB,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAoBzB;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC;IACrC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;IACnB,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC;IACpB,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC;IACtB,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC;IACrB,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;IACnB,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC;IACrB,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;CACpB,CAAC,CAAC;AA0BH,MAAM,cAAc,GAAG,qBAAqB,CAAC;AAE7C;;;;;;;;;;GAUG;AACH,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,OAAO,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACpC,CAAC;AA8BD,MAAM,CAAC,MAAM,SAAS,GAAyB;IAC7C,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,WAAW;IACX,UAAU;IACV,QAAQ;IACR,UAAU;CACX,CAAC;AAEF,MAAM,iBAAiB,GAA8B;IACnD,MAAM,EAAE,CAAC;IACT,MAAM,EAAE,CAAC;IACT,OAAO,EAAE,CAAC;IACV,SAAS,EAAE,CAAC;IACZ,QAAQ,EAAE,CAAC;IACX,MAAM,EAAE,CAAC;IACT,QAAQ,EAAE,CAAC;CACZ,CAAC;AAEF;;;;;;;;;GASG;AACH,MAAM,UAAU,aAAa,CAAC,GAAe;IAC3C,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,GAAG,GAAG,YAAY,CAAC,CAAC;IAC1C,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,CAAE,CAAC;IAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;IACrC,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;IACrC,OAAO;QACL,GAAG;QACH,SAAS;QACT,KAAK;QACL,UAAU;QACV,SAAS,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QAC1B,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,UAAU,CAAC;KAClD,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,OAAO,EAAE,iBAAiB,EAAE,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dabke",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.84.0",
|
|
4
4
|
"description": "Scheduling library powered by constraint programming (CP-SAT)",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"constraint-programming",
|
|
@@ -52,18 +52,17 @@
|
|
|
52
52
|
"test": "npm run typecheck && npm run test:unit",
|
|
53
53
|
"test:unit": "vitest run --project=unit",
|
|
54
54
|
"test:unit:watch": "vitest --watch --project=unit",
|
|
55
|
-
"test:integration": "
|
|
56
|
-
"test:integration:watch": "
|
|
57
|
-
"generate:reference": "tsx scripts/generate-reference.ts"
|
|
55
|
+
"test:integration": "vitest run --project=integration",
|
|
56
|
+
"test:integration:watch": "vitest --watch --project=integration"
|
|
58
57
|
},
|
|
59
58
|
"dependencies": {
|
|
60
|
-
"zod": "^4.3
|
|
59
|
+
"zod": "^4.4.3"
|
|
61
60
|
},
|
|
62
61
|
"devDependencies": {
|
|
63
|
-
"@types/node": "^25.
|
|
64
|
-
"commander": "^
|
|
65
|
-
"typescript": "^
|
|
66
|
-
"vitest": "^4.
|
|
62
|
+
"@types/node": "^25.9.1",
|
|
63
|
+
"commander": "^15.0.0",
|
|
64
|
+
"typescript": "^6.0.3",
|
|
65
|
+
"vitest": "^4.1.7"
|
|
67
66
|
},
|
|
68
67
|
"engines": {
|
|
69
68
|
"node": ">=20"
|
|
@@ -5,6 +5,11 @@ from typing import Literal
|
|
|
5
5
|
from pydantic import BaseModel, Field, ConfigDict
|
|
6
6
|
|
|
7
7
|
|
|
8
|
+
SolverMode = Literal["optimize", "satisfy"]
|
|
9
|
+
SolverStatus = Literal["OPTIMAL", "FEASIBLE", "INFEASIBLE", "TIMEOUT", "ERROR"]
|
|
10
|
+
DiagnosticMode = Literal["none", "hard"]
|
|
11
|
+
|
|
12
|
+
|
|
8
13
|
class Variable(BaseModel):
|
|
9
14
|
"""Decision variable.
|
|
10
15
|
|
|
@@ -65,6 +70,7 @@ class Constraint(BaseModel):
|
|
|
65
70
|
if_: str | None = Field(default=None, alias="if")
|
|
66
71
|
then: str | None = None
|
|
67
72
|
id: str | None = None
|
|
73
|
+
stage: str | None = None
|
|
68
74
|
|
|
69
75
|
|
|
70
76
|
class Objective(BaseModel):
|
|
@@ -76,6 +82,12 @@ class Objective(BaseModel):
|
|
|
76
82
|
terms: list[Term]
|
|
77
83
|
|
|
78
84
|
|
|
85
|
+
class SolverObjectiveStage(Objective):
|
|
86
|
+
"""A named objective stage for lexicographic solving."""
|
|
87
|
+
|
|
88
|
+
id: str
|
|
89
|
+
|
|
90
|
+
|
|
79
91
|
class Options(BaseModel):
|
|
80
92
|
"""Solver tuning options."""
|
|
81
93
|
|
|
@@ -83,6 +95,7 @@ class Options(BaseModel):
|
|
|
83
95
|
|
|
84
96
|
timeLimitSeconds: float = 60.0
|
|
85
97
|
solutionLimit: int | None = None # Only solutionLimit=1 is supported (stops after first feasible solution)
|
|
98
|
+
diagnostics: DiagnosticMode = "none"
|
|
86
99
|
|
|
87
100
|
|
|
88
101
|
class SolverRequest(BaseModel):
|
|
@@ -93,11 +106,25 @@ class SolverRequest(BaseModel):
|
|
|
93
106
|
variables: list[Variable]
|
|
94
107
|
constraints: list[Constraint]
|
|
95
108
|
objective: Objective | None = None
|
|
109
|
+
objectiveStages: list[SolverObjectiveStage] | None = None
|
|
110
|
+
mode: SolverMode | None = None
|
|
96
111
|
options: Options | None = None
|
|
97
112
|
|
|
98
113
|
|
|
99
|
-
class
|
|
100
|
-
"""
|
|
114
|
+
class SolverStageResult(BaseModel):
|
|
115
|
+
"""Metadata for one objective stage solve."""
|
|
116
|
+
|
|
117
|
+
model_config = ConfigDict(extra="forbid")
|
|
118
|
+
|
|
119
|
+
id: str
|
|
120
|
+
status: SolverStatus
|
|
121
|
+
objectiveValue: float | None = None
|
|
122
|
+
bestObjectiveBound: float | None = None
|
|
123
|
+
solveTimeMs: int
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
class SolverSoftConstraintViolation(BaseModel):
|
|
127
|
+
"""A raw solver-stage soft constraint violation."""
|
|
101
128
|
|
|
102
129
|
model_config = ConfigDict(extra="forbid")
|
|
103
130
|
|
|
@@ -107,14 +134,24 @@ class SoftConstraintViolation(BaseModel):
|
|
|
107
134
|
actualValue: int
|
|
108
135
|
|
|
109
136
|
|
|
137
|
+
class SolverHardConstraintConflict(BaseModel):
|
|
138
|
+
"""A hard constraint included in a sufficient infeasible constraint set."""
|
|
139
|
+
|
|
140
|
+
model_config = ConfigDict(extra="forbid")
|
|
141
|
+
|
|
142
|
+
constraintId: str
|
|
143
|
+
|
|
144
|
+
|
|
110
145
|
class SolverResponse(BaseModel):
|
|
111
146
|
"""Response payload produced by the solver service."""
|
|
112
147
|
|
|
113
148
|
model_config = ConfigDict(extra="forbid")
|
|
114
149
|
|
|
115
|
-
status:
|
|
150
|
+
status: SolverStatus
|
|
116
151
|
values: dict[str, int] | None = None
|
|
117
152
|
statistics: dict[str, int | float] | None = None
|
|
118
153
|
error: str | None = None
|
|
119
154
|
solutionInfo: str | None = None
|
|
120
|
-
|
|
155
|
+
hardConstraintConflicts: list[SolverHardConstraintConflict] | None = None
|
|
156
|
+
softConstraintViolations: list[SolverSoftConstraintViolation] | None = None
|
|
157
|
+
stageResults: list[SolverStageResult] | None = None
|