@pristine-ts/local-scheduling 4.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (150) hide show
  1. package/LICENSE +201 -0
  2. package/dist/lib/cjs/builders/builders.js +18 -0
  3. package/dist/lib/cjs/builders/builders.js.map +1 -0
  4. package/dist/lib/cjs/builders/cron-expression.builder.js +159 -0
  5. package/dist/lib/cjs/builders/cron-expression.builder.js.map +1 -0
  6. package/dist/lib/cjs/enums/day-of-week.enum.js +19 -0
  7. package/dist/lib/cjs/enums/day-of-week.enum.js.map +1 -0
  8. package/dist/lib/cjs/enums/enums.js +19 -0
  9. package/dist/lib/cjs/enums/enums.js.map +1 -0
  10. package/dist/lib/cjs/enums/month.enum.js +23 -0
  11. package/dist/lib/cjs/enums/month.enum.js.map +1 -0
  12. package/dist/lib/cjs/errors/errors.js +20 -0
  13. package/dist/lib/cjs/errors/errors.js.map +1 -0
  14. package/dist/lib/cjs/errors/invalid-cron-expression.error.js +30 -0
  15. package/dist/lib/cjs/errors/invalid-cron-expression.error.js.map +1 -0
  16. package/dist/lib/cjs/errors/schedule-already-exists.error.js +25 -0
  17. package/dist/lib/cjs/errors/schedule-already-exists.error.js.map +1 -0
  18. package/dist/lib/cjs/errors/schedule-not-found.error.js +22 -0
  19. package/dist/lib/cjs/errors/schedule-not-found.error.js.map +1 -0
  20. package/dist/lib/cjs/interfaces/interfaces.js +22 -0
  21. package/dist/lib/cjs/interfaces/interfaces.js.map +1 -0
  22. package/dist/lib/cjs/interfaces/local-scheduler.interface.js +3 -0
  23. package/dist/lib/cjs/interfaces/local-scheduler.interface.js.map +1 -0
  24. package/dist/lib/cjs/interfaces/schedulable.interface.js +3 -0
  25. package/dist/lib/cjs/interfaces/schedulable.interface.js.map +1 -0
  26. package/dist/lib/cjs/interfaces/schedule-descriptor.interface.js +3 -0
  27. package/dist/lib/cjs/interfaces/schedule-descriptor.interface.js.map +1 -0
  28. package/dist/lib/cjs/interfaces/schedule-options.interface.js +3 -0
  29. package/dist/lib/cjs/interfaces/schedule-options.interface.js.map +1 -0
  30. package/dist/lib/cjs/interfaces/schedule-state.interface.js +3 -0
  31. package/dist/lib/cjs/interfaces/schedule-state.interface.js.map +1 -0
  32. package/dist/lib/cjs/interfaces/schedule.interface.js +3 -0
  33. package/dist/lib/cjs/interfaces/schedule.interface.js.map +1 -0
  34. package/dist/lib/cjs/local-scheduling.module.js +85 -0
  35. package/dist/lib/cjs/local-scheduling.module.js.map +1 -0
  36. package/dist/lib/cjs/local-scheduling.module.keyname.js +5 -0
  37. package/dist/lib/cjs/local-scheduling.module.keyname.js.map +1 -0
  38. package/dist/lib/cjs/managers/local-scheduler.manager.js +361 -0
  39. package/dist/lib/cjs/managers/local-scheduler.manager.js.map +1 -0
  40. package/dist/lib/cjs/managers/managers.js +18 -0
  41. package/dist/lib/cjs/managers/managers.js.map +1 -0
  42. package/dist/lib/cjs/models/cron-expression.model.js +304 -0
  43. package/dist/lib/cjs/models/cron-expression.model.js.map +1 -0
  44. package/dist/lib/cjs/models/models.js +18 -0
  45. package/dist/lib/cjs/models/models.js.map +1 -0
  46. package/dist/lib/cjs/schedules/cron.schedule.js +34 -0
  47. package/dist/lib/cjs/schedules/cron.schedule.js.map +1 -0
  48. package/dist/lib/cjs/schedules/date.schedule.js +27 -0
  49. package/dist/lib/cjs/schedules/date.schedule.js.map +1 -0
  50. package/dist/lib/cjs/schedules/schedules.js +19 -0
  51. package/dist/lib/cjs/schedules/schedules.js.map +1 -0
  52. package/dist/lib/cjs/servers/local-scheduler.runtime-server.js +69 -0
  53. package/dist/lib/cjs/servers/local-scheduler.runtime-server.js.map +1 -0
  54. package/dist/lib/cjs/servers/servers.js +18 -0
  55. package/dist/lib/cjs/servers/servers.js.map +1 -0
  56. package/dist/lib/cjs/types/scheduled-task-function.type.js +3 -0
  57. package/dist/lib/cjs/types/scheduled-task-function.type.js.map +1 -0
  58. package/dist/lib/cjs/types/types.js +18 -0
  59. package/dist/lib/cjs/types/types.js.map +1 -0
  60. package/dist/lib/esm/builders/builders.js +2 -0
  61. package/dist/lib/esm/builders/builders.js.map +1 -0
  62. package/dist/lib/esm/builders/cron-expression.builder.js +155 -0
  63. package/dist/lib/esm/builders/cron-expression.builder.js.map +1 -0
  64. package/dist/lib/esm/enums/day-of-week.enum.js +16 -0
  65. package/dist/lib/esm/enums/day-of-week.enum.js.map +1 -0
  66. package/dist/lib/esm/enums/enums.js +3 -0
  67. package/dist/lib/esm/enums/enums.js.map +1 -0
  68. package/dist/lib/esm/enums/month.enum.js +20 -0
  69. package/dist/lib/esm/enums/month.enum.js.map +1 -0
  70. package/dist/lib/esm/errors/errors.js +4 -0
  71. package/dist/lib/esm/errors/errors.js.map +1 -0
  72. package/dist/lib/esm/errors/invalid-cron-expression.error.js +26 -0
  73. package/dist/lib/esm/errors/invalid-cron-expression.error.js.map +1 -0
  74. package/dist/lib/esm/errors/schedule-already-exists.error.js +21 -0
  75. package/dist/lib/esm/errors/schedule-already-exists.error.js.map +1 -0
  76. package/dist/lib/esm/errors/schedule-not-found.error.js +18 -0
  77. package/dist/lib/esm/errors/schedule-not-found.error.js.map +1 -0
  78. package/dist/lib/esm/interfaces/interfaces.js +6 -0
  79. package/dist/lib/esm/interfaces/interfaces.js.map +1 -0
  80. package/dist/lib/esm/interfaces/local-scheduler.interface.js +2 -0
  81. package/dist/lib/esm/interfaces/local-scheduler.interface.js.map +1 -0
  82. package/dist/lib/esm/interfaces/schedulable.interface.js +2 -0
  83. package/dist/lib/esm/interfaces/schedulable.interface.js.map +1 -0
  84. package/dist/lib/esm/interfaces/schedule-descriptor.interface.js +2 -0
  85. package/dist/lib/esm/interfaces/schedule-descriptor.interface.js.map +1 -0
  86. package/dist/lib/esm/interfaces/schedule-options.interface.js +2 -0
  87. package/dist/lib/esm/interfaces/schedule-options.interface.js.map +1 -0
  88. package/dist/lib/esm/interfaces/schedule-state.interface.js +2 -0
  89. package/dist/lib/esm/interfaces/schedule-state.interface.js.map +1 -0
  90. package/dist/lib/esm/interfaces/schedule.interface.js +2 -0
  91. package/dist/lib/esm/interfaces/schedule.interface.js.map +1 -0
  92. package/dist/lib/esm/local-scheduling.module.js +68 -0
  93. package/dist/lib/esm/local-scheduling.module.js.map +1 -0
  94. package/dist/lib/esm/local-scheduling.module.keyname.js +2 -0
  95. package/dist/lib/esm/local-scheduling.module.keyname.js.map +1 -0
  96. package/dist/lib/esm/managers/local-scheduler.manager.js +358 -0
  97. package/dist/lib/esm/managers/local-scheduler.manager.js.map +1 -0
  98. package/dist/lib/esm/managers/managers.js +2 -0
  99. package/dist/lib/esm/managers/managers.js.map +1 -0
  100. package/dist/lib/esm/models/cron-expression.model.js +300 -0
  101. package/dist/lib/esm/models/cron-expression.model.js.map +1 -0
  102. package/dist/lib/esm/models/models.js +2 -0
  103. package/dist/lib/esm/models/models.js.map +1 -0
  104. package/dist/lib/esm/schedules/cron.schedule.js +30 -0
  105. package/dist/lib/esm/schedules/cron.schedule.js.map +1 -0
  106. package/dist/lib/esm/schedules/date.schedule.js +23 -0
  107. package/dist/lib/esm/schedules/date.schedule.js.map +1 -0
  108. package/dist/lib/esm/schedules/schedules.js +3 -0
  109. package/dist/lib/esm/schedules/schedules.js.map +1 -0
  110. package/dist/lib/esm/servers/local-scheduler.runtime-server.js +66 -0
  111. package/dist/lib/esm/servers/local-scheduler.runtime-server.js.map +1 -0
  112. package/dist/lib/esm/servers/servers.js +2 -0
  113. package/dist/lib/esm/servers/servers.js.map +1 -0
  114. package/dist/lib/esm/types/scheduled-task-function.type.js +2 -0
  115. package/dist/lib/esm/types/scheduled-task-function.type.js.map +1 -0
  116. package/dist/lib/esm/types/types.js +2 -0
  117. package/dist/lib/esm/types/types.js.map +1 -0
  118. package/dist/lib/tsconfig.cjs.tsbuildinfo +1 -0
  119. package/dist/lib/tsconfig.tsbuildinfo +1 -0
  120. package/dist/types/builders/builders.d.ts +1 -0
  121. package/dist/types/builders/cron-expression.builder.d.ts +69 -0
  122. package/dist/types/enums/day-of-week.enum.d.ts +14 -0
  123. package/dist/types/enums/enums.d.ts +2 -0
  124. package/dist/types/enums/month.enum.d.ts +18 -0
  125. package/dist/types/errors/errors.d.ts +3 -0
  126. package/dist/types/errors/invalid-cron-expression.error.d.ts +20 -0
  127. package/dist/types/errors/schedule-already-exists.error.d.ts +15 -0
  128. package/dist/types/errors/schedule-not-found.error.d.ts +12 -0
  129. package/dist/types/interfaces/interfaces.d.ts +5 -0
  130. package/dist/types/interfaces/local-scheduler.interface.d.ts +57 -0
  131. package/dist/types/interfaces/schedulable.interface.d.ts +43 -0
  132. package/dist/types/interfaces/schedule-descriptor.interface.d.ts +22 -0
  133. package/dist/types/interfaces/schedule-options.interface.d.ts +37 -0
  134. package/dist/types/interfaces/schedule-state.interface.d.ts +24 -0
  135. package/dist/types/interfaces/schedule.interface.d.ts +20 -0
  136. package/dist/types/local-scheduling.module.d.ts +30 -0
  137. package/dist/types/local-scheduling.module.keyname.d.ts +1 -0
  138. package/dist/types/managers/local-scheduler.manager.d.ts +110 -0
  139. package/dist/types/managers/managers.d.ts +1 -0
  140. package/dist/types/models/cron-expression.model.d.ts +120 -0
  141. package/dist/types/models/models.d.ts +1 -0
  142. package/dist/types/schedules/cron.schedule.d.ts +22 -0
  143. package/dist/types/schedules/date.schedule.d.ts +17 -0
  144. package/dist/types/schedules/schedules.d.ts +2 -0
  145. package/dist/types/servers/local-scheduler.runtime-server.d.ts +24 -0
  146. package/dist/types/servers/servers.d.ts +1 -0
  147. package/dist/types/types/scheduled-task-function.type.d.ts +10 -0
  148. package/dist/types/types/types.d.ts +1 -0
  149. package/package.json +68 -0
  150. package/readme.md +307 -0
@@ -0,0 +1,304 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CronExpression = void 0;
4
+ const invalid_cron_expression_error_1 = require("../errors/invalid-cron-expression.error");
5
+ /**
6
+ * A parsed, validated standard cron expression, and the engine that computes its upcoming
7
+ * execution dates.
8
+ *
9
+ * **Supported syntax** (standard 5-field cron, plus an optional leading seconds field):
10
+ *
11
+ * ```
12
+ * ┌───────────── second (0-59) (optional 6th field; omit for classic 5-field cron)
13
+ * │ ┌─────────── minute (0-59)
14
+ * │ │ ┌───────── hour (0-23)
15
+ * │ │ │ ┌─────── day-of-month (1-31)
16
+ * │ │ │ │ ┌───── month (1-12 or JAN-DEC)
17
+ * │ │ │ │ │ ┌─── day-of-week (0-7 or SUN-SAT; 0 and 7 are both Sunday)
18
+ * │ │ │ │ │ │
19
+ * * * * * * *
20
+ * ```
21
+ *
22
+ * Each field accepts `*`, single values, ranges (`a-b`), lists (`a,b,c`), and steps
23
+ * (`* / n`, `a-b/n`, `a/n` meaning "from a to the maximum, every n"). Month and day-of-week
24
+ * values may be given as case-insensitive names. Ranges must be ascending; wrap-around
25
+ * ranges such as `FRI-SUN` are not supported — express them as a list (`FRI,SAT,SUN`).
26
+ *
27
+ * **Day-of-month / day-of-week OR rule:** when *both* the day-of-month and day-of-week
28
+ * fields are restricted (neither is `*`), the expression matches when *either* field
29
+ * matches — the classic Vixie-cron behaviour. For example `30 4 1,15 * 5` runs at 04:30 on
30
+ * the 1st and 15th of the month **and** every Friday. When at least one of the two is `*`,
31
+ * the fields combine with AND (the `*` one matching everything). A field is considered
32
+ * "restricted" whenever its text is not exactly `*` — so a starred field carrying a step
33
+ * (every-N) still counts as restricted.
34
+ *
35
+ * **Time semantics:** all computations use the host's **system local time** (via the
36
+ * standard `Date`). Across a spring-forward DST transition, a local time that does not
37
+ * exist is skipped; across a fall-back transition, a repeated local time fires once. A
38
+ * future revision may accept an IANA timezone without changing this class's method
39
+ * signatures (a timezone would be supplied as an additional, optional constructor option).
40
+ */
41
+ class CronExpression {
42
+ /**
43
+ * Parses and validates the expression.
44
+ * @param expression A 5-field (or 6-field, seconds-leading) standard cron expression.
45
+ * @throws {InvalidCronExpressionError} if the expression is malformed or out of range.
46
+ * The error carries an HTTP 400 status and a precise message.
47
+ */
48
+ constructor(expression) {
49
+ if (typeof expression !== "string") {
50
+ throw new invalid_cron_expression_error_1.InvalidCronExpressionError("A cron expression must be a string.", String(expression));
51
+ }
52
+ const normalized = expression.trim().replace(/\s+/g, " ");
53
+ if (normalized.length === 0) {
54
+ throw new invalid_cron_expression_error_1.InvalidCronExpressionError("A cron expression cannot be empty.", expression);
55
+ }
56
+ const fields = normalized.split(" ");
57
+ if (fields.length !== 5 && fields.length !== 6) {
58
+ throw new invalid_cron_expression_error_1.InvalidCronExpressionError(`A cron expression must have 5 fields (minute hour day-of-month month day-of-week), ` +
59
+ `or 6 fields with a leading seconds field, but ${fields.length} were provided.`, expression);
60
+ }
61
+ this.hasSecondsField = fields.length === 6;
62
+ let index = 0;
63
+ this.seconds = this.hasSecondsField
64
+ ? this.parseField(fields[index++], 0, 59, "second", undefined, expression)
65
+ : new Set([0]);
66
+ this.minutes = this.parseField(fields[index++], 0, 59, "minute", undefined, expression);
67
+ this.hours = this.parseField(fields[index++], 0, 23, "hour", undefined, expression);
68
+ const dayOfMonthField = fields[index++];
69
+ this.daysOfMonth = this.parseField(dayOfMonthField, 1, 31, "day-of-month", undefined, expression);
70
+ this.months = this.parseField(fields[index++], 1, 12, "month", CronExpression.MONTH_NAMES, expression);
71
+ const dayOfWeekField = fields[index++];
72
+ this.daysOfWeek = this.parseDayOfWeek(dayOfWeekField, expression);
73
+ this.dayOfMonthRestricted = dayOfMonthField !== "*";
74
+ this.dayOfWeekRestricted = dayOfWeekField !== "*";
75
+ this.expression = normalized;
76
+ }
77
+ /**
78
+ * Returns whether an expression is valid without throwing — convenient for create-time
79
+ * validation of user input where a boolean is more ergonomic than a try/catch.
80
+ */
81
+ static isValid(expression) {
82
+ try {
83
+ new CronExpression(expression);
84
+ return true;
85
+ }
86
+ catch (error) {
87
+ if (error instanceof invalid_cron_expression_error_1.InvalidCronExpressionError) {
88
+ return false;
89
+ }
90
+ throw error;
91
+ }
92
+ }
93
+ /**
94
+ * Computes the next execution strictly after `from`.
95
+ * @param from The reference instant. Defaults to now.
96
+ * @returns The next matching `Date`, or `undefined` if the expression has no occurrence
97
+ * within the {@link CronExpression.MAX_SCAN_YEARS} scan window (i.e. it never matches,
98
+ * such as `0 0 30 2 *`).
99
+ */
100
+ getNextExecutionDate(from = new Date()) {
101
+ if (!(from instanceof Date) || Number.isNaN(from.getTime())) {
102
+ throw new TypeError("CronExpression.getNextExecutionDate expects a valid Date.");
103
+ }
104
+ // Round strictly up to the next unit boundary. Epoch arithmetic is used here (rather
105
+ // than local-field arithmetic) so the rounding itself is immune to DST offsets; the
106
+ // subsequent field-walk is done with local-time constructors so it is DST-aware.
107
+ const unitMs = this.hasSecondsField ? 1000 : 60000;
108
+ let candidate = new Date(Math.floor(from.getTime() / unitMs) * unitMs + unitMs);
109
+ const maxYear = from.getFullYear() + CronExpression.MAX_SCAN_YEARS;
110
+ for (let iterations = 0; iterations < CronExpression.MAX_SCAN_ITERATIONS; iterations++) {
111
+ const year = candidate.getFullYear();
112
+ if (year > maxYear) {
113
+ return undefined;
114
+ }
115
+ // Each check that fails advances the smallest possible amount and resets every
116
+ // lower-order field to its minimum, then restarts the loop. This converges in a
117
+ // handful of iterations rather than scanning minute-by-minute.
118
+ if (!this.months.has(candidate.getMonth() + 1)) {
119
+ candidate = new Date(year, candidate.getMonth() + 1, 1, 0, 0, 0, 0);
120
+ continue;
121
+ }
122
+ if (!this.matchesDay(candidate)) {
123
+ candidate = new Date(year, candidate.getMonth(), candidate.getDate() + 1, 0, 0, 0, 0);
124
+ continue;
125
+ }
126
+ if (!this.hours.has(candidate.getHours())) {
127
+ candidate = new Date(year, candidate.getMonth(), candidate.getDate(), candidate.getHours() + 1, 0, 0, 0);
128
+ continue;
129
+ }
130
+ if (!this.minutes.has(candidate.getMinutes())) {
131
+ candidate = new Date(year, candidate.getMonth(), candidate.getDate(), candidate.getHours(), candidate.getMinutes() + 1, 0, 0);
132
+ continue;
133
+ }
134
+ if (this.hasSecondsField && !this.seconds.has(candidate.getSeconds())) {
135
+ candidate = new Date(year, candidate.getMonth(), candidate.getDate(), candidate.getHours(), candidate.getMinutes(), candidate.getSeconds() + 1, 0);
136
+ continue;
137
+ }
138
+ return candidate;
139
+ }
140
+ return undefined;
141
+ }
142
+ /**
143
+ * Computes up to `count` successive execution dates starting strictly after `from`.
144
+ * Returns fewer than `count` (possibly zero) entries only if the expression stops
145
+ * matching within the scan window.
146
+ */
147
+ getNextExecutionDates(from, count) {
148
+ if (!Number.isInteger(count) || count < 0) {
149
+ throw new TypeError("CronExpression.getNextExecutionDates expects a non-negative integer count.");
150
+ }
151
+ const dates = [];
152
+ let cursor = from;
153
+ for (let i = 0; i < count; i++) {
154
+ const next = this.getNextExecutionDate(cursor);
155
+ if (next === undefined) {
156
+ break;
157
+ }
158
+ dates.push(next);
159
+ cursor = next;
160
+ }
161
+ return dates;
162
+ }
163
+ /** Returns the normalized expression. */
164
+ toString() {
165
+ return this.expression;
166
+ }
167
+ /**
168
+ * Applies the day-of-month / day-of-week OR rule for a candidate date.
169
+ */
170
+ matchesDay(date) {
171
+ const dayOfMonthMatches = this.daysOfMonth.has(date.getDate());
172
+ const dayOfWeekMatches = this.daysOfWeek.has(date.getDay());
173
+ if (this.dayOfMonthRestricted && this.dayOfWeekRestricted) {
174
+ return dayOfMonthMatches || dayOfWeekMatches;
175
+ }
176
+ return dayOfMonthMatches && dayOfWeekMatches;
177
+ }
178
+ /**
179
+ * Parses the day-of-week field, which is special-cased for the `0-7` range where both
180
+ * `0` and `7` mean Sunday. Values are parsed against `0-7` and then `7` is normalized to
181
+ * `0` so the resulting set aligns with `Date.getDay()`.
182
+ */
183
+ parseDayOfWeek(field, original) {
184
+ const raw = this.parseField(field, 0, 7, "day-of-week", CronExpression.DAY_OF_WEEK_NAMES, original);
185
+ const normalized = new Set();
186
+ for (const value of raw) {
187
+ normalized.add(value === 7 ? 0 : value);
188
+ }
189
+ return normalized;
190
+ }
191
+ /**
192
+ * Parses a single cron field into the set of numeric values it allows.
193
+ */
194
+ parseField(field, min, max, label, names, original) {
195
+ const values = new Set();
196
+ for (const segment of field.split(",")) {
197
+ if (segment.length === 0) {
198
+ throw new invalid_cron_expression_error_1.InvalidCronExpressionError(`The ${label} field '${field}' contains an empty list element.`, original, label);
199
+ }
200
+ // Split off an optional step (`.../n`).
201
+ let rangePart = segment;
202
+ let step = 1;
203
+ const slashIndex = segment.indexOf("/");
204
+ if (slashIndex !== -1) {
205
+ rangePart = segment.slice(0, slashIndex);
206
+ const stepPart = segment.slice(slashIndex + 1);
207
+ if (stepPart.indexOf("/") !== -1) {
208
+ throw new invalid_cron_expression_error_1.InvalidCronExpressionError(`The ${label} field element '${segment}' has more than one step.`, original, label);
209
+ }
210
+ if (!/^\d+$/.test(stepPart)) {
211
+ throw new invalid_cron_expression_error_1.InvalidCronExpressionError(`The ${label} field element '${segment}' has an invalid step '${stepPart}'.`, original, label);
212
+ }
213
+ step = parseInt(stepPart, 10);
214
+ if (step === 0) {
215
+ throw new invalid_cron_expression_error_1.InvalidCronExpressionError(`The ${label} field element '${segment}' has a step of 0; the step must be greater than 0.`, original, label);
216
+ }
217
+ }
218
+ // Resolve the low/high bounds of this segment.
219
+ let low;
220
+ let high;
221
+ if (rangePart === "*") {
222
+ low = min;
223
+ high = max;
224
+ }
225
+ else {
226
+ const dashIndex = rangePart.indexOf("-");
227
+ if (dashIndex > 0) {
228
+ low = this.parseValue(rangePart.slice(0, dashIndex), min, max, label, names, original);
229
+ high = this.parseValue(rangePart.slice(dashIndex + 1), min, max, label, names, original);
230
+ }
231
+ else {
232
+ low = this.parseValue(rangePart, min, max, label, names, original);
233
+ // `a/n` (a single value with a step) means "from a up to the maximum, every n".
234
+ // A bare single value (`a`) is just that value.
235
+ high = slashIndex !== -1 ? max : low;
236
+ }
237
+ }
238
+ if (low > high) {
239
+ throw new invalid_cron_expression_error_1.InvalidCronExpressionError(`The ${label} field element '${segment}' is a descending range (${low} > ${high}); ranges must be ascending.`, original, label);
240
+ }
241
+ for (let value = low; value <= high; value += step) {
242
+ values.add(value);
243
+ }
244
+ }
245
+ return values;
246
+ }
247
+ /**
248
+ * Parses one atomic token (a number or a name) and validates it is within range.
249
+ */
250
+ parseValue(token, min, max, label, names, original) {
251
+ if (token.length === 0) {
252
+ throw new invalid_cron_expression_error_1.InvalidCronExpressionError(`The ${label} field has a malformed, empty value.`, original, label);
253
+ }
254
+ let value;
255
+ if (names !== undefined && /[a-zA-Z]/.test(token)) {
256
+ const resolved = names[token.toUpperCase()];
257
+ if (resolved === undefined) {
258
+ throw new invalid_cron_expression_error_1.InvalidCronExpressionError(`The ${label} field has an unknown name '${token}'.`, original, label);
259
+ }
260
+ value = resolved;
261
+ }
262
+ else if (/^\d+$/.test(token)) {
263
+ value = parseInt(token, 10);
264
+ }
265
+ else {
266
+ throw new invalid_cron_expression_error_1.InvalidCronExpressionError(`The ${label} field has an invalid value '${token}'.`, original, label);
267
+ }
268
+ if (value < min || value > max) {
269
+ throw new invalid_cron_expression_error_1.InvalidCronExpressionError(`The ${label} field value '${token}' is out of range (${min}-${max}).`, original, label);
270
+ }
271
+ return value;
272
+ }
273
+ }
274
+ exports.CronExpression = CronExpression;
275
+ /**
276
+ * Case-insensitive month names accepted in the month field, mapped to their `1-12` value.
277
+ */
278
+ CronExpression.MONTH_NAMES = {
279
+ JAN: 1, FEB: 2, MAR: 3, APR: 4, MAY: 5, JUN: 6,
280
+ JUL: 7, AUG: 8, SEP: 9, OCT: 10, NOV: 11, DEC: 12,
281
+ };
282
+ /**
283
+ * Case-insensitive day-of-week names accepted in the day-of-week field, mapped to their
284
+ * `0-6` value where `0` is Sunday (the classic cron convention).
285
+ */
286
+ CronExpression.DAY_OF_WEEK_NAMES = {
287
+ SUN: 0, MON: 1, TUE: 2, WED: 3, THU: 4, FRI: 5, SAT: 6,
288
+ };
289
+ /**
290
+ * The upper bound (in years past the `from` date) of the forward scan performed when
291
+ * computing the next execution. Eight years is the largest gap between two consecutive
292
+ * occurrences of Feb 29 (e.g. 2096 → 2104, because 2100 is not a leap year), so any
293
+ * expression that ever matches is guaranteed to match within this window. An expression
294
+ * that does not match within it is treated as never-matching (e.g. `0 0 30 2 *`).
295
+ */
296
+ CronExpression.MAX_SCAN_YEARS = 8;
297
+ /**
298
+ * A hard iteration ceiling on the forward scan, as a defensive backstop against an
299
+ * unforeseen non-advancing state. The scan advances by at least one calendar field per
300
+ * iteration and is really bounded by {@link CronExpression.MAX_SCAN_YEARS}; this ceiling
301
+ * only ever trips on a bug, never on legitimate input.
302
+ */
303
+ CronExpression.MAX_SCAN_ITERATIONS = 1000000;
304
+ //# sourceMappingURL=cron-expression.model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cron-expression.model.js","sourceRoot":"","sources":["../../../../src/models/cron-expression.model.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./cron-expression.model"), exports);
18
+ //# sourceMappingURL=models.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models.js","sourceRoot":"","sources":["../../../../src/models/models.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,0DAAwC"}
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CronSchedule = void 0;
4
+ const cron_expression_model_1 = require("../models/cron-expression.model");
5
+ /**
6
+ * A recurring {@link ScheduleInterface} backed by a standard cron expression. Construct it
7
+ * from a cron string (parsed and validated immediately, throwing an
8
+ * {@link InvalidCronExpressionError} on bad input) or from an already-built
9
+ * {@link CronExpression}.
10
+ *
11
+ * ```ts
12
+ * new CronSchedule("0 3 * * *"); // 03:00 every day
13
+ * new CronSchedule("0/15 9-17 * * 1-5"); // every 15 minutes, 09:00-17:00, Mon-Fri
14
+ * ```
15
+ */
16
+ class CronSchedule {
17
+ constructor(cronExpression) {
18
+ // A string is parsed (and thereby validated) here, propagating an
19
+ // InvalidCronExpressionError (HTTP 400) for malformed input.
20
+ this.cronExpression = typeof cronExpression === "string" ? new cron_expression_model_1.CronExpression(cronExpression) : cronExpression;
21
+ }
22
+ getNextExecutionDate(from) {
23
+ return this.cronExpression.getNextExecutionDate(from);
24
+ }
25
+ /** Up to `count` successive occurrences after `from`. */
26
+ getNextExecutionDates(from, count) {
27
+ return this.cronExpression.getNextExecutionDates(from, count);
28
+ }
29
+ toString() {
30
+ return this.cronExpression.expression;
31
+ }
32
+ }
33
+ exports.CronSchedule = CronSchedule;
34
+ //# sourceMappingURL=cron.schedule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cron.schedule.js","sourceRoot":"","sources":["../../../../src/schedules/cron.schedule.ts"],"names":[],"mappings":";;;AACA,2EAA+D;AAE/D;;;;;;;;;;GAUG;AACH,MAAa,YAAY;IAIvB,YAAY,cAAuC;QACjD,kEAAkE;QAClE,6DAA6D;QAC7D,IAAI,CAAC,cAAc,GAAG,OAAO,cAAc,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,sCAAc,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC;IACjH,CAAC;IAEM,oBAAoB,CAAC,IAAU;QACpC,OAAO,IAAI,CAAC,cAAc,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;IACxD,CAAC;IAED,yDAAyD;IAClD,qBAAqB,CAAC,IAAU,EAAE,KAAa;QACpD,OAAO,IAAI,CAAC,cAAc,CAAC,qBAAqB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAChE,CAAC;IAEM,QAAQ;QACb,OAAO,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC;IACxC,CAAC;CACF;AAtBD,oCAsBC"}
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DateSchedule = void 0;
4
+ /**
5
+ * A one-shot {@link ScheduleInterface} that fires a single time at a fixed instant. Once that
6
+ * instant has passed, {@link getNextExecutionDate} returns `undefined`, so the scheduler
7
+ * fires it once and then leaves it unarmed — it remains listed, with no next execution date.
8
+ *
9
+ * ```ts
10
+ * new DateSchedule(new Date("2026-12-31T23:59:00"));
11
+ * ```
12
+ */
13
+ class DateSchedule {
14
+ constructor(date) {
15
+ this.date = date;
16
+ }
17
+ getNextExecutionDate(from) {
18
+ // Strictly after `from`, mirroring cron semantics; a copy is returned so callers cannot
19
+ // mutate the schedule's own instant.
20
+ return this.date.getTime() > from.getTime() ? new Date(this.date.getTime()) : undefined;
21
+ }
22
+ toString() {
23
+ return this.date.toISOString();
24
+ }
25
+ }
26
+ exports.DateSchedule = DateSchedule;
27
+ //# sourceMappingURL=date.schedule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date.schedule.js","sourceRoot":"","sources":["../../../../src/schedules/date.schedule.ts"],"names":[],"mappings":";;;AAEA;;;;;;;;GAQG;AACH,MAAa,YAAY;IAIvB,YAAY,IAAU;QACpB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAEM,oBAAoB,CAAC,IAAU;QACpC,wFAAwF;QACxF,qCAAqC;QACrC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC1F,CAAC;IAEM,QAAQ;QACb,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;IACjC,CAAC;CACF;AAjBD,oCAiBC"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./cron.schedule"), exports);
18
+ __exportStar(require("./date.schedule"), exports);
19
+ //# sourceMappingURL=schedules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schedules.js","sourceRoot":"","sources":["../../../../src/schedules/schedules.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,kDAAgC;AAChC,kDAAgC"}
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
15
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
16
+ return new (P || (P = Promise))(function (resolve, reject) {
17
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
18
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
19
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
20
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
21
+ });
22
+ };
23
+ Object.defineProperty(exports, "__esModule", { value: true });
24
+ exports.LocalSchedulerRuntimeServer = void 0;
25
+ const tsyringe_1 = require("tsyringe");
26
+ const common_1 = require("@pristine-ts/common");
27
+ const local_scheduling_module_keyname_1 = require("../local-scheduling.module.keyname");
28
+ /**
29
+ * Adapts {@link LocalSchedulerManager} to the `pristine start` lifecycle so tagged tasks run
30
+ * with no manual bootstrap.
31
+ *
32
+ * It is tagged {@link ServiceDefinitionTagEnum.RuntimeServer}, so `pristine start` resolves it
33
+ * alongside the HTTP/gRPC servers and calls `start()` — which registers every tagged
34
+ * {@link SchedulableInterface} and arms its timers. Graceful shutdown is wired via the
35
+ * module's `onShutdown`, which calls `stop()` to cancel timers and drain in-flight tasks.
36
+ *
37
+ * A scheduler has no socket, so the `--port` / `--address` overrides `pristine start`
38
+ * propagates are ignored.
39
+ */
40
+ let LocalSchedulerRuntimeServer = class LocalSchedulerRuntimeServer {
41
+ constructor(scheduler, logHandler) {
42
+ this.scheduler = scheduler;
43
+ this.logHandler = logHandler;
44
+ /** Stable label for `pristine start` log lines and diagnostics. */
45
+ this.name = "local-scheduler";
46
+ }
47
+ start() {
48
+ return __awaiter(this, void 0, void 0, function* () {
49
+ this.logHandler.info("LocalSchedulerRuntimeServer: starting the local scheduler.");
50
+ this.scheduler.start();
51
+ });
52
+ }
53
+ stop() {
54
+ return __awaiter(this, void 0, void 0, function* () {
55
+ this.logHandler.info("LocalSchedulerRuntimeServer: stopping the local scheduler.");
56
+ yield this.scheduler.stop();
57
+ });
58
+ }
59
+ };
60
+ exports.LocalSchedulerRuntimeServer = LocalSchedulerRuntimeServer;
61
+ exports.LocalSchedulerRuntimeServer = LocalSchedulerRuntimeServer = __decorate([
62
+ (0, common_1.tag)(common_1.ServiceDefinitionTagEnum.RuntimeServer),
63
+ (0, common_1.moduleScoped)(local_scheduling_module_keyname_1.LocalSchedulingModuleKeyname),
64
+ (0, tsyringe_1.injectable)(),
65
+ __param(0, (0, tsyringe_1.inject)("LocalSchedulerInterface")),
66
+ __param(1, (0, tsyringe_1.inject)("LogHandlerInterface")),
67
+ __metadata("design:paramtypes", [Object, Object])
68
+ ], LocalSchedulerRuntimeServer);
69
+ //# sourceMappingURL=local-scheduler.runtime-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-scheduler.runtime-server.js","sourceRoot":"","sources":["../../../../src/servers/local-scheduler.runtime-server.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAAA,uCAA4C;AAC5C,gDAAgF;AAGhF,wFAAgF;AAGhF;;;;;;;;;;;GAWG;AAII,IAAM,2BAA2B,GAAjC,MAAM,2BAA2B;IAItC,YAA+C,SAAmD,EACvD,UAAgD;QAD3B,cAAS,GAAT,SAAS,CAAyB;QACtC,eAAU,GAAV,UAAU,CAAqB;QAJ3F,mEAAmE;QACnD,SAAI,GAAW,iBAAiB,CAAC;IAIjD,CAAC;IAEY,KAAK;;YAChB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC;YACnF,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QACzB,CAAC;KAAA;IAEY,IAAI;;YACf,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC;YACnF,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QAC9B,CAAC;KAAA;CACF,CAAA;AAjBY,kEAA2B;sCAA3B,2BAA2B;IAHvC,IAAA,YAAG,EAAC,iCAAwB,CAAC,aAAa,CAAC;IAC3C,IAAA,qBAAY,EAAC,8DAA4B,CAAC;IAC1C,IAAA,qBAAU,GAAE;IAKE,WAAA,IAAA,iBAAM,EAAC,yBAAyB,CAAC,CAAA;IACjC,WAAA,IAAA,iBAAM,EAAC,qBAAqB,CAAC,CAAA;;GAL/B,2BAA2B,CAiBvC"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./local-scheduler.runtime-server"), exports);
18
+ //# sourceMappingURL=servers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"servers.js","sourceRoot":"","sources":["../../../../src/servers/servers.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,mEAAiD"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=scheduled-task-function.type.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduled-task-function.type.js","sourceRoot":"","sources":["../../../../src/types/scheduled-task-function.type.ts"],"names":[],"mappings":""}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./scheduled-task-function.type"), exports);
18
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/types/types.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,iEAA+C"}
@@ -0,0 +1,2 @@
1
+ export * from "./cron-expression.builder";
2
+ //# sourceMappingURL=builders.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builders.js","sourceRoot":"","sources":["../../../../src/builders/builders.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAC"}