@oneuptime/common 11.5.12 → 11.6.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/Models/DatabaseModels/AIInsight.ts +30 -0
- package/Models/DatabaseModels/EnterpriseLicense.ts +21 -0
- package/Models/DatabaseModels/EnterpriseLicenseInstance.ts +25 -0
- package/Models/DatabaseModels/GlobalConfig.ts +76 -0
- package/Models/DatabaseModels/Project.ts +30 -0
- package/Models/DatabaseModels/TelemetryException.ts +128 -0
- package/Server/API/AIAgentDataAPI.ts +129 -5
- package/Server/API/AIInvestigationAPI.ts +87 -0
- package/Server/API/EnterpriseLicenseAPI.ts +57 -0
- package/Server/API/GlobalConfigAPI.ts +62 -1
- package/Server/EnvironmentConfig.ts +22 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1784640000000-AddExceptionTriageAndPrivacyColumns.ts +56 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1784659816363-AddInstanceVersionAndLatestReleaseColumns.ts +38 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1784705487674-AddEnterpriseLicenseEvaluationColumns.ts +25 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
- package/Server/Services/AIRunService.ts +8 -0
- package/Server/Services/AnalyticsDatabaseService.ts +48 -45
- package/Server/Services/DatabaseService.ts +66 -1
- package/Server/Services/TelemetryExceptionService.ts +320 -24
- package/Server/Services/WorkflowService.ts +100 -39
- package/Server/Types/Workflow/Components/Schedule.ts +57 -32
- package/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.ts +15 -4
- package/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.ts +15 -4
- package/Server/Utils/AI/SRE/Insights/InsightScanner.ts +222 -24
- package/Server/Utils/AI/SRE/Insights/InsightTriageRunner.ts +225 -9
- package/Server/Utils/AI/SRE/SubjectCodeFixRun.ts +39 -0
- package/Server/Utils/AI/SRE/TelemetryImprovementTaskTrigger.ts +114 -0
- package/Server/Utils/AnalyticsDatabase/InsertDedupContext.ts +59 -0
- package/Server/Utils/Express.ts +13 -0
- package/Server/Utils/Telemetry/ExceptionSanitizer.ts +222 -0
- package/Server/Utils/Telemetry/TelemetryFanInWriter.ts +799 -0
- package/Server/Utils/Telemetry/TelemetryWriterClient.ts +263 -0
- package/Server/Utils/Telemetry/TelemetryWriterServer.ts +240 -0
- package/Server/Utils/Telemetry/TelemetryWriterShedMetrics.ts +93 -0
- package/Tests/Server/Services/DatabaseServiceSanitizeUpdateData.test.ts +232 -0
- package/Tests/Server/Services/TelemetryExceptionCodeFixRun.test.ts +205 -1
- package/Tests/Server/Services/UpdateOneByIdKeepsRowId.test.ts +107 -0
- package/Tests/Server/Services/WorkflowService.test.ts +308 -0
- package/Tests/Server/Utils/AI/Insights/InsightScanner.test.ts +150 -141
- package/Tests/Server/Utils/AI/Insights/InsightTriageRunner.test.ts +277 -1
- package/Tests/Server/Utils/Attribution.test.ts +203 -0
- package/Tests/Server/Utils/ExceptionSanitizer.test.ts +70 -0
- package/Tests/Server/Utils/InsightTriageClassification.test.ts +57 -0
- package/Tests/Server/Utils/Marketing/ConversionUploadProvider.test.ts +183 -0
- package/Tests/Server/Utils/Marketing/GoogleAds.test.ts +340 -0
- package/Tests/Server/Utils/Monitor/Criteria/ExceptionMonitorCriteria.test.ts +87 -0
- package/Tests/Server/Utils/Monitor/Criteria/LogMonitorCriteria.test.ts +165 -0
- package/Tests/Server/Utils/Monitor/Criteria/TraceMonitorCriteria.test.ts +86 -0
- package/Tests/Server/Utils/Telemetry/TelemetryFanInWriter.test.ts +1565 -0
- package/Tests/Server/Utils/Telemetry/TelemetryWriterClient.test.ts +313 -0
- package/Tests/Server/Utils/Telemetry/TelemetryWriterServer.test.ts +270 -0
- package/Tests/Server/Utils/Telemetry/TelemetryWriterShedMetrics.test.ts +127 -0
- package/Tests/Server/Utils/TelemetryImprovementTaskTrigger.test.ts +141 -0
- package/Tests/Types/AI/CodeFixTaskType.test.ts +3 -0
- package/Tests/Types/Monitor/MonitorCriteriaMetricVariables.test.ts +228 -0
- package/Tests/Types/Monitor/MonitorStepDefaultTelemetryConfig.test.ts +169 -0
- package/Tests/Types/Monitor/MonitorStepExceptionMonitor.test.ts +289 -0
- package/Tests/Types/Monitor/MonitorStepLogMonitor.test.ts +231 -0
- package/Tests/Types/Monitor/MonitorStepMetricViewConfigUtil.test.ts +245 -0
- package/Tests/Types/Monitor/MonitorStepNetworkDeviceMonitor.test.ts +155 -0
- package/Tests/Types/Monitor/MonitorStepTelemetrySerialization.test.ts +141 -0
- package/Tests/Types/Monitor/MonitorStepTraceMonitor.test.ts +137 -0
- package/Tests/Types/Workspace/NotificationRules/NotificationRuleCondition.test.ts +311 -0
- package/Tests/UI/Components/ModelTableSelectFromColumns.test.ts +259 -0
- package/Tests/UI/Utils/Breadcrumb/BreadcrumbTrailResolver.test.ts +461 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +2852 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +758 -0
- package/Tests/UI/Utils/NotificationMethodUtil.test.ts +564 -0
- package/Tests/Utils/Array.test.ts +156 -0
- package/Tests/Utils/CronTab.test.ts +199 -0
- package/Tests/Utils/ModelImportExport.test.ts +101 -0
- package/Tests/Utils/Number.test.ts +179 -0
- package/Tests/Utils/VersionUtil.test.ts +348 -0
- package/Tests/jest.setup.ts +1 -0
- package/Types/AI/CodeFixTaskContext.ts +6 -0
- package/Types/AI/CodeFixTaskType.ts +38 -1
- package/Types/AI/ExceptionAIClassification.ts +27 -0
- package/Types/EnterpriseLicense/EnterpriseLicenseInstanceSummary.ts +6 -0
- package/Types/Log/LogScrubPatternType.ts +7 -0
- package/Types/Monitor/MonitorStep.ts +24 -4
- package/Types/Monitor/MonitorStepMetricViewConfigUtil.ts +105 -0
- package/Types/Trace/TraceScrubPatternType.ts +7 -0
- package/UI/Components/EditionLabel/EditionLabel.tsx +445 -12
- package/UI/Components/ModelTable/BaseModelTable.tsx +15 -46
- package/UI/Components/ModelTable/SelectFromColumns.ts +129 -0
- package/UI/Components/Workflow/ArgumentsForm.tsx +68 -30
- package/UI/Components/Workflow/CronScheduleField.tsx +411 -0
- package/UI/Utils/Breadcrumb/BreadcrumbTrailResolver.ts +176 -0
- package/UI/Utils/NotificationMethodUtil.ts +310 -0
- package/Utils/CronTab.ts +823 -0
- package/Utils/ModelImportExport.ts +21 -6
- package/Utils/VersionUtil.ts +260 -0
- package/build/dist/Models/DatabaseModels/AIInsight.js +31 -0
- package/build/dist/Models/DatabaseModels/AIInsight.js.map +1 -1
- package/build/dist/Models/DatabaseModels/EnterpriseLicense.js +22 -0
- package/build/dist/Models/DatabaseModels/EnterpriseLicense.js.map +1 -1
- package/build/dist/Models/DatabaseModels/EnterpriseLicenseInstance.js +26 -0
- package/build/dist/Models/DatabaseModels/EnterpriseLicenseInstance.js.map +1 -1
- package/build/dist/Models/DatabaseModels/GlobalConfig.js +81 -0
- package/build/dist/Models/DatabaseModels/GlobalConfig.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Project.js +31 -0
- package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TelemetryException.js +134 -0
- package/build/dist/Models/DatabaseModels/TelemetryException.js.map +1 -1
- package/build/dist/Server/API/AIAgentDataAPI.js +97 -8
- package/build/dist/Server/API/AIAgentDataAPI.js.map +1 -1
- package/build/dist/Server/API/AIInvestigationAPI.js +55 -0
- package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
- package/build/dist/Server/API/EnterpriseLicenseAPI.js +47 -0
- package/build/dist/Server/API/EnterpriseLicenseAPI.js.map +1 -1
- package/build/dist/Server/API/GlobalConfigAPI.js +52 -1
- package/build/dist/Server/API/GlobalConfigAPI.js.map +1 -1
- package/build/dist/Server/EnvironmentConfig.js +17 -0
- package/build/dist/Server/EnvironmentConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784640000000-AddExceptionTriageAndPrivacyColumns.js +33 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784640000000-AddExceptionTriageAndPrivacyColumns.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784659816363-AddInstanceVersionAndLatestReleaseColumns.js +18 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784659816363-AddInstanceVersionAndLatestReleaseColumns.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784705487674-AddEnterpriseLicenseEvaluationColumns.js +14 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784705487674-AddEnterpriseLicenseEvaluationColumns.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +6 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Services/AIRunService.js +9 -2
- package/build/dist/Server/Services/AIRunService.js.map +1 -1
- package/build/dist/Server/Services/AnalyticsDatabaseService.js +44 -16
- package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +53 -1
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/TelemetryExceptionService.js +263 -22
- package/build/dist/Server/Services/TelemetryExceptionService.js.map +1 -1
- package/build/dist/Server/Services/WorkflowService.js +80 -30
- package/build/dist/Server/Services/WorkflowService.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/Schedule.js +44 -19
- package/build/dist/Server/Types/Workflow/Components/Schedule.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js +12 -4
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js +12 -4
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/InsightScanner.js +193 -22
- package/build/dist/Server/Utils/AI/SRE/Insights/InsightScanner.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/InsightTriageRunner.js +178 -9
- package/build/dist/Server/Utils/AI/SRE/Insights/InsightTriageRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/SubjectCodeFixRun.js +37 -0
- package/build/dist/Server/Utils/AI/SRE/SubjectCodeFixRun.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/TelemetryImprovementTaskTrigger.js +98 -0
- package/build/dist/Server/Utils/AI/SRE/TelemetryImprovementTaskTrigger.js.map +1 -0
- package/build/dist/Server/Utils/AnalyticsDatabase/InsertDedupContext.js +24 -0
- package/build/dist/Server/Utils/AnalyticsDatabase/InsertDedupContext.js.map +1 -0
- package/build/dist/Server/Utils/Express.js +12 -0
- package/build/dist/Server/Utils/Express.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/ExceptionSanitizer.js +149 -0
- package/build/dist/Server/Utils/Telemetry/ExceptionSanitizer.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/TelemetryFanInWriter.js +496 -0
- package/build/dist/Server/Utils/Telemetry/TelemetryFanInWriter.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/TelemetryWriterClient.js +165 -0
- package/build/dist/Server/Utils/Telemetry/TelemetryWriterClient.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/TelemetryWriterServer.js +136 -0
- package/build/dist/Server/Utils/Telemetry/TelemetryWriterServer.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/TelemetryWriterShedMetrics.js +76 -0
- package/build/dist/Server/Utils/Telemetry/TelemetryWriterShedMetrics.js.map +1 -0
- package/build/dist/Types/AI/CodeFixTaskType.js +38 -1
- package/build/dist/Types/AI/CodeFixTaskType.js.map +1 -1
- package/build/dist/Types/AI/ExceptionAIClassification.js +28 -0
- package/build/dist/Types/AI/ExceptionAIClassification.js.map +1 -0
- package/build/dist/Types/Log/LogScrubPatternType.js +7 -0
- package/build/dist/Types/Log/LogScrubPatternType.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStep.js +20 -4
- package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepMetricViewConfigUtil.js +73 -0
- package/build/dist/Types/Monitor/MonitorStepMetricViewConfigUtil.js.map +1 -0
- package/build/dist/Types/Trace/TraceScrubPatternType.js +7 -0
- package/build/dist/Types/Trace/TraceScrubPatternType.js.map +1 -1
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js +261 -13
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +12 -37
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/SelectFromColumns.js +82 -0
- package/build/dist/UI/Components/ModelTable/SelectFromColumns.js.map +1 -0
- package/build/dist/UI/Components/Workflow/ArgumentsForm.js +30 -6
- package/build/dist/UI/Components/Workflow/ArgumentsForm.js.map +1 -1
- package/build/dist/UI/Components/Workflow/CronScheduleField.js +209 -0
- package/build/dist/UI/Components/Workflow/CronScheduleField.js.map +1 -0
- package/build/dist/UI/Utils/Breadcrumb/BreadcrumbTrailResolver.js +129 -0
- package/build/dist/UI/Utils/Breadcrumb/BreadcrumbTrailResolver.js.map +1 -0
- package/build/dist/UI/Utils/NotificationMethodUtil.js +189 -0
- package/build/dist/UI/Utils/NotificationMethodUtil.js.map +1 -0
- package/build/dist/Utils/CronTab.js +609 -0
- package/build/dist/Utils/CronTab.js.map +1 -0
- package/build/dist/Utils/ModelImportExport.js +20 -6
- package/build/dist/Utils/ModelImportExport.js.map +1 -1
- package/build/dist/Utils/VersionUtil.js +193 -0
- package/build/dist/Utils/VersionUtil.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,609 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CronTab
|
|
3
|
+
*
|
|
4
|
+
* A dependency-free, isomorphic (browser + server) helper for working with
|
|
5
|
+
* standard cron expressions. It powers the workflow "Schedule" trigger picker
|
|
6
|
+
* in the UI (human-readable descriptions + next-run previews + client-side
|
|
7
|
+
* validation) and is safe to import from server code as well.
|
|
8
|
+
*
|
|
9
|
+
* Supported syntax (5 or 6 fields):
|
|
10
|
+
*
|
|
11
|
+
* ┌───────────── second (0 - 59) [optional, only when 6 fields]
|
|
12
|
+
* │ ┌─────────── minute (0 - 59)
|
|
13
|
+
* │ │ ┌───────── hour (0 - 23)
|
|
14
|
+
* │ │ │ ┌─────── day of month (1 - 31)
|
|
15
|
+
* │ │ │ │ ┌───── month (1 - 12 or JAN - DEC)
|
|
16
|
+
* │ │ │ │ │ ┌─── day of week (0 - 6 or SUN - SAT; 7 also means Sunday)
|
|
17
|
+
* │ │ │ │ │ │
|
|
18
|
+
* * * * * * *
|
|
19
|
+
*
|
|
20
|
+
* Each field supports: `*`, single values, `a-b` ranges, `a-b/step` and
|
|
21
|
+
* `* / step` steps, and comma-separated lists of any of those.
|
|
22
|
+
*
|
|
23
|
+
* Notes on semantics (kept consistent with `cron-parser`, the library BullMQ
|
|
24
|
+
* uses to actually fire the jobs):
|
|
25
|
+
* - Day-of-month and day-of-week are OR-ed together when BOTH are restricted
|
|
26
|
+
* (i.e. neither is `*`). When only one is restricted, only that one applies.
|
|
27
|
+
* - Next-run times are always computed and reported in UTC, because the
|
|
28
|
+
* workflow runner evaluates the pattern in the worker process timezone
|
|
29
|
+
* (UTC in production). Displaying UTC keeps the preview honest.
|
|
30
|
+
*/
|
|
31
|
+
/*
|
|
32
|
+
* Matches a string of one or more ASCII digits. Kept as a named const so the
|
|
33
|
+
* linter doesn't fight over wrapping an inline regex literal used with .test().
|
|
34
|
+
*/
|
|
35
|
+
const DIGITS_ONLY = /^\d+$/;
|
|
36
|
+
const MONTH_NAMES = [
|
|
37
|
+
"jan",
|
|
38
|
+
"feb",
|
|
39
|
+
"mar",
|
|
40
|
+
"apr",
|
|
41
|
+
"may",
|
|
42
|
+
"jun",
|
|
43
|
+
"jul",
|
|
44
|
+
"aug",
|
|
45
|
+
"sep",
|
|
46
|
+
"oct",
|
|
47
|
+
"nov",
|
|
48
|
+
"dec",
|
|
49
|
+
];
|
|
50
|
+
const DAY_NAMES = [
|
|
51
|
+
"sun",
|
|
52
|
+
"mon",
|
|
53
|
+
"tue",
|
|
54
|
+
"wed",
|
|
55
|
+
"thu",
|
|
56
|
+
"fri",
|
|
57
|
+
"sat",
|
|
58
|
+
];
|
|
59
|
+
const DAY_NAMES_LONG = [
|
|
60
|
+
"Sunday",
|
|
61
|
+
"Monday",
|
|
62
|
+
"Tuesday",
|
|
63
|
+
"Wednesday",
|
|
64
|
+
"Thursday",
|
|
65
|
+
"Friday",
|
|
66
|
+
"Saturday",
|
|
67
|
+
];
|
|
68
|
+
const MONTH_NAMES_LONG = [
|
|
69
|
+
"January",
|
|
70
|
+
"February",
|
|
71
|
+
"March",
|
|
72
|
+
"April",
|
|
73
|
+
"May",
|
|
74
|
+
"June",
|
|
75
|
+
"July",
|
|
76
|
+
"August",
|
|
77
|
+
"September",
|
|
78
|
+
"October",
|
|
79
|
+
"November",
|
|
80
|
+
"December",
|
|
81
|
+
];
|
|
82
|
+
class CronTab {
|
|
83
|
+
/**
|
|
84
|
+
* True if the expression references a workflow variable ({{...}}). Such an
|
|
85
|
+
* expression cannot be parsed as a cron until it is resolved on the server
|
|
86
|
+
* (at workflow-save time), so validation / preview is skipped for it.
|
|
87
|
+
*/
|
|
88
|
+
static isVariableExpression(expression) {
|
|
89
|
+
if (typeof expression !== "string") {
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
return expression.includes("{{") && expression.includes("}}");
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Returns a human-readable validation error for the expression, or null if it
|
|
96
|
+
* is a valid cron expression. Variable expressions return null (not our job
|
|
97
|
+
* to validate them here).
|
|
98
|
+
*/
|
|
99
|
+
static getValidationError(expression) {
|
|
100
|
+
if (typeof expression !== "string" || expression.trim() === "") {
|
|
101
|
+
return "Schedule is required.";
|
|
102
|
+
}
|
|
103
|
+
if (this.isVariableExpression(expression)) {
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
try {
|
|
107
|
+
this.parse(expression);
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
catch (err) {
|
|
111
|
+
return err.message;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
static isValid(expression) {
|
|
115
|
+
if (this.isVariableExpression(expression)) {
|
|
116
|
+
return false;
|
|
117
|
+
}
|
|
118
|
+
return this.getValidationError(expression) === null;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* A concise, human-readable description of when the schedule fires, e.g.
|
|
122
|
+
* "Every 30 minutes" or "Every day at 09:30 (UTC)". Falls back to a
|
|
123
|
+
* field-by-field description for uncommon patterns. Returns null when the
|
|
124
|
+
* expression cannot be parsed.
|
|
125
|
+
*/
|
|
126
|
+
static getHumanReadableDescription(expression) {
|
|
127
|
+
let parsed;
|
|
128
|
+
try {
|
|
129
|
+
parsed = this.parse(expression);
|
|
130
|
+
}
|
|
131
|
+
catch (_a) {
|
|
132
|
+
return null;
|
|
133
|
+
}
|
|
134
|
+
return this.describe(parsed);
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Computes the next `count` fire times (in UTC) at or after `from`
|
|
138
|
+
* (exclusive). Returns fewer than `count` entries only if the pattern has no
|
|
139
|
+
* further matches within the internal search horizon. Throws if the
|
|
140
|
+
* expression is invalid.
|
|
141
|
+
*/
|
|
142
|
+
static getNextExecutionTimes(expression, count, from = new Date()) {
|
|
143
|
+
const parsed = this.parse(expression);
|
|
144
|
+
const results = [];
|
|
145
|
+
let cursor = from;
|
|
146
|
+
for (let i = 0; i < count; i++) {
|
|
147
|
+
const next = this.computeNext(parsed, cursor);
|
|
148
|
+
if (!next) {
|
|
149
|
+
break;
|
|
150
|
+
}
|
|
151
|
+
results.push(next);
|
|
152
|
+
cursor = next;
|
|
153
|
+
}
|
|
154
|
+
return results;
|
|
155
|
+
}
|
|
156
|
+
// ----- Internal parsing -------------------------------------------------
|
|
157
|
+
static parse(expression) {
|
|
158
|
+
if (typeof expression !== "string") {
|
|
159
|
+
throw new Error("Cron expression must be a string.");
|
|
160
|
+
}
|
|
161
|
+
const fields = expression.trim().split(/\s+/);
|
|
162
|
+
if (fields.length !== 5 && fields.length !== 6) {
|
|
163
|
+
throw new Error(`A cron expression must have 5 or 6 fields (got ${fields.length}). Example: "0 */18 * * *".`);
|
|
164
|
+
}
|
|
165
|
+
const hasSeconds = fields.length === 6;
|
|
166
|
+
const secondField = hasSeconds ? fields[0] : "0";
|
|
167
|
+
const minuteField = hasSeconds ? fields[1] : fields[0];
|
|
168
|
+
const hourField = hasSeconds ? fields[2] : fields[1];
|
|
169
|
+
const domField = hasSeconds ? fields[3] : fields[2];
|
|
170
|
+
const monthField = hasSeconds ? fields[4] : fields[3];
|
|
171
|
+
const dowField = hasSeconds ? fields[5] : fields[4];
|
|
172
|
+
return {
|
|
173
|
+
second: this.parseField(secondField, 0, 59, "second"),
|
|
174
|
+
minute: this.parseField(minuteField, 0, 59, "minute"),
|
|
175
|
+
hour: this.parseField(hourField, 0, 23, "hour"),
|
|
176
|
+
dayOfMonth: this.parseField(domField, 1, 31, "day of month"),
|
|
177
|
+
month: this.parseField(monthField, 1, 12, "month", MONTH_NAMES),
|
|
178
|
+
dayOfWeek: this.parseDayOfWeek(dowField),
|
|
179
|
+
hasSeconds,
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
static parseDayOfWeek(field) {
|
|
183
|
+
// Day-of-week accepts 0-7 (both 0 and 7 mean Sunday) plus names.
|
|
184
|
+
const parsed = this.parseField(field, 0, 7, "day of week", DAY_NAMES);
|
|
185
|
+
// Normalize 7 -> 0 (Sunday) and de-duplicate.
|
|
186
|
+
const normalized = new Set();
|
|
187
|
+
for (const value of parsed.values) {
|
|
188
|
+
normalized.add(value === 7 ? 0 : value);
|
|
189
|
+
}
|
|
190
|
+
return {
|
|
191
|
+
values: Array.from(normalized).sort((a, b) => {
|
|
192
|
+
return a - b;
|
|
193
|
+
}),
|
|
194
|
+
isWildcard: parsed.isWildcard,
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
static parseField(field, min, max, fieldName, names) {
|
|
198
|
+
const isWildcard = field === "*";
|
|
199
|
+
const values = new Set();
|
|
200
|
+
const terms = field.split(",");
|
|
201
|
+
for (const rawTerm of terms) {
|
|
202
|
+
const term = rawTerm.trim();
|
|
203
|
+
if (term === "") {
|
|
204
|
+
throw new Error(`Invalid ${fieldName} field: empty value in "${field}".`);
|
|
205
|
+
}
|
|
206
|
+
// Split off an optional step ("a-b/step" or "*/step").
|
|
207
|
+
const [rangePart, stepPart, ...extra] = term.split("/");
|
|
208
|
+
if (extra.length > 0 || rangePart === undefined) {
|
|
209
|
+
throw new Error(`Invalid ${fieldName} field: "${term}" has too many "/" separators.`);
|
|
210
|
+
}
|
|
211
|
+
let step = 1;
|
|
212
|
+
if (stepPart !== undefined) {
|
|
213
|
+
if (!DIGITS_ONLY.test(stepPart)) {
|
|
214
|
+
throw new Error(`Invalid ${fieldName} field: step "${stepPart}" must be a positive number.`);
|
|
215
|
+
}
|
|
216
|
+
step = parseInt(stepPart, 10);
|
|
217
|
+
if (step <= 0) {
|
|
218
|
+
throw new Error(`Invalid ${fieldName} field: step must be greater than 0.`);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
let rangeStart;
|
|
222
|
+
let rangeEnd;
|
|
223
|
+
if (rangePart === "*") {
|
|
224
|
+
rangeStart = min;
|
|
225
|
+
rangeEnd = max;
|
|
226
|
+
}
|
|
227
|
+
else if (rangePart.includes("-")) {
|
|
228
|
+
const [startStr, endStr, ...rangeExtra] = rangePart.split("-");
|
|
229
|
+
if (rangeExtra.length > 0 ||
|
|
230
|
+
startStr === undefined ||
|
|
231
|
+
endStr === undefined) {
|
|
232
|
+
throw new Error(`Invalid ${fieldName} field: malformed range "${rangePart}".`);
|
|
233
|
+
}
|
|
234
|
+
rangeStart = this.parseValue(startStr, min, max, fieldName, names);
|
|
235
|
+
rangeEnd = this.parseValue(endStr, min, max, fieldName, names);
|
|
236
|
+
if (rangeStart > rangeEnd) {
|
|
237
|
+
throw new Error(`Invalid ${fieldName} field: range start (${rangeStart}) is greater than range end (${rangeEnd}).`);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
else {
|
|
241
|
+
// A single value. With a step ("a/step"), it means from a to max.
|
|
242
|
+
rangeStart = this.parseValue(rangePart, min, max, fieldName, names);
|
|
243
|
+
rangeEnd = stepPart !== undefined ? max : rangeStart;
|
|
244
|
+
}
|
|
245
|
+
for (let value = rangeStart; value <= rangeEnd; value += step) {
|
|
246
|
+
values.add(value);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
if (values.size === 0) {
|
|
250
|
+
throw new Error(`Invalid ${fieldName} field: "${field}".`);
|
|
251
|
+
}
|
|
252
|
+
return {
|
|
253
|
+
values: Array.from(values).sort((a, b) => {
|
|
254
|
+
return a - b;
|
|
255
|
+
}),
|
|
256
|
+
isWildcard,
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
static parseValue(raw, min, max, fieldName, names) {
|
|
260
|
+
const token = raw.trim().toLowerCase();
|
|
261
|
+
let value;
|
|
262
|
+
if (DIGITS_ONLY.test(token)) {
|
|
263
|
+
value = parseInt(token, 10);
|
|
264
|
+
}
|
|
265
|
+
else if (names) {
|
|
266
|
+
const index = names.indexOf(token.slice(0, 3));
|
|
267
|
+
if (index === -1) {
|
|
268
|
+
throw new Error(`Invalid ${fieldName} field: "${raw}" is not a recognized value.`);
|
|
269
|
+
}
|
|
270
|
+
// Names map to numbers starting at `min` (months start at 1, days at 0).
|
|
271
|
+
value = index + min;
|
|
272
|
+
}
|
|
273
|
+
else {
|
|
274
|
+
throw new Error(`Invalid ${fieldName} field: "${raw}" is not a number.`);
|
|
275
|
+
}
|
|
276
|
+
if (value < min || value > max) {
|
|
277
|
+
throw new Error(`Invalid ${fieldName} field: "${value}" is out of range (${min}-${max}).`);
|
|
278
|
+
}
|
|
279
|
+
return value;
|
|
280
|
+
}
|
|
281
|
+
static computeNext(parsed, from) {
|
|
282
|
+
// Start at the next whole second after `from` (drop milliseconds).
|
|
283
|
+
let cursor = new Date(Math.floor(from.getTime() / 1000) * 1000 + 1000);
|
|
284
|
+
for (let i = 0; i < this.MAX_SEARCH_ITERATIONS; i++) {
|
|
285
|
+
const month = cursor.getUTCMonth() + 1;
|
|
286
|
+
if (!parsed.month.values.includes(month)) {
|
|
287
|
+
cursor = this.advanceToNextMonth(cursor, parsed.month.values);
|
|
288
|
+
continue;
|
|
289
|
+
}
|
|
290
|
+
if (!this.dayMatches(cursor, parsed)) {
|
|
291
|
+
cursor = this.startOfNextDay(cursor);
|
|
292
|
+
continue;
|
|
293
|
+
}
|
|
294
|
+
const hour = cursor.getUTCHours();
|
|
295
|
+
if (!parsed.hour.values.includes(hour)) {
|
|
296
|
+
const nextHour = this.nextAllowed(parsed.hour.values, hour);
|
|
297
|
+
if (nextHour === null) {
|
|
298
|
+
cursor = this.startOfNextDay(cursor);
|
|
299
|
+
}
|
|
300
|
+
else {
|
|
301
|
+
cursor.setUTCHours(nextHour, 0, 0, 0);
|
|
302
|
+
}
|
|
303
|
+
continue;
|
|
304
|
+
}
|
|
305
|
+
const minute = cursor.getUTCMinutes();
|
|
306
|
+
if (!parsed.minute.values.includes(minute)) {
|
|
307
|
+
const nextMinute = this.nextAllowed(parsed.minute.values, minute);
|
|
308
|
+
if (nextMinute === null) {
|
|
309
|
+
// No allowed minute left this hour; roll to the next hour.
|
|
310
|
+
cursor.setUTCHours(cursor.getUTCHours() + 1, 0, 0, 0);
|
|
311
|
+
}
|
|
312
|
+
else {
|
|
313
|
+
cursor.setUTCMinutes(nextMinute, 0, 0);
|
|
314
|
+
}
|
|
315
|
+
continue;
|
|
316
|
+
}
|
|
317
|
+
const second = cursor.getUTCSeconds();
|
|
318
|
+
if (!parsed.second.values.includes(second)) {
|
|
319
|
+
const nextSecond = this.nextAllowed(parsed.second.values, second);
|
|
320
|
+
if (nextSecond === null) {
|
|
321
|
+
// No allowed second left this minute; roll to the next minute.
|
|
322
|
+
cursor.setUTCMinutes(cursor.getUTCMinutes() + 1, 0, 0);
|
|
323
|
+
}
|
|
324
|
+
else {
|
|
325
|
+
cursor.setUTCSeconds(nextSecond, 0);
|
|
326
|
+
}
|
|
327
|
+
continue;
|
|
328
|
+
}
|
|
329
|
+
return cursor;
|
|
330
|
+
}
|
|
331
|
+
return null;
|
|
332
|
+
}
|
|
333
|
+
static dayMatches(cursor, parsed) {
|
|
334
|
+
const dayOfMonth = cursor.getUTCDate();
|
|
335
|
+
const dayOfWeek = cursor.getUTCDay(); // 0 (Sun) - 6 (Sat)
|
|
336
|
+
const domRestricted = !parsed.dayOfMonth.isWildcard;
|
|
337
|
+
const dowRestricted = !parsed.dayOfWeek.isWildcard;
|
|
338
|
+
if (domRestricted && dowRestricted) {
|
|
339
|
+
// Standard cron OR semantics when both are restricted.
|
|
340
|
+
return (parsed.dayOfMonth.values.includes(dayOfMonth) ||
|
|
341
|
+
parsed.dayOfWeek.values.includes(dayOfWeek));
|
|
342
|
+
}
|
|
343
|
+
if (domRestricted) {
|
|
344
|
+
return parsed.dayOfMonth.values.includes(dayOfMonth);
|
|
345
|
+
}
|
|
346
|
+
if (dowRestricted) {
|
|
347
|
+
return parsed.dayOfWeek.values.includes(dayOfWeek);
|
|
348
|
+
}
|
|
349
|
+
return true;
|
|
350
|
+
}
|
|
351
|
+
static nextAllowed(sortedValues, current) {
|
|
352
|
+
for (const value of sortedValues) {
|
|
353
|
+
if (value >= current) {
|
|
354
|
+
return value;
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
return null;
|
|
358
|
+
}
|
|
359
|
+
static startOfNextDay(cursor) {
|
|
360
|
+
const next = new Date(cursor.getTime());
|
|
361
|
+
next.setUTCDate(next.getUTCDate() + 1);
|
|
362
|
+
next.setUTCHours(0, 0, 0, 0);
|
|
363
|
+
return next;
|
|
364
|
+
}
|
|
365
|
+
static advanceToNextMonth(cursor, allowedMonths) {
|
|
366
|
+
let year = cursor.getUTCFullYear();
|
|
367
|
+
let month = cursor.getUTCMonth() + 1; // 1-12
|
|
368
|
+
do {
|
|
369
|
+
month++;
|
|
370
|
+
if (month > 12) {
|
|
371
|
+
month = 1;
|
|
372
|
+
year++;
|
|
373
|
+
}
|
|
374
|
+
} while (!allowedMonths.includes(month));
|
|
375
|
+
return new Date(Date.UTC(year, month - 1, 1, 0, 0, 0, 0));
|
|
376
|
+
}
|
|
377
|
+
// ----- Human-readable description --------------------------------------
|
|
378
|
+
static describe(parsed) {
|
|
379
|
+
const minute = parsed.minute;
|
|
380
|
+
const hour = parsed.hour;
|
|
381
|
+
const dom = parsed.dayOfMonth;
|
|
382
|
+
const month = parsed.month;
|
|
383
|
+
const dow = parsed.dayOfWeek;
|
|
384
|
+
const second = parsed.second;
|
|
385
|
+
const minuteStep = this.detectStep(minute, 0, 59);
|
|
386
|
+
const hourStep = this.detectStep(hour, 0, 23);
|
|
387
|
+
const secondsAreDefault = !parsed.hasSeconds ||
|
|
388
|
+
(second.values.length === 1 && second.values[0] === 0);
|
|
389
|
+
// Only attempt the "nice" templates for the common seconds-at-zero case.
|
|
390
|
+
if (secondsAreDefault) {
|
|
391
|
+
// Every minute.
|
|
392
|
+
if (minute.isWildcard &&
|
|
393
|
+
hour.isWildcard &&
|
|
394
|
+
dom.isWildcard &&
|
|
395
|
+
month.isWildcard &&
|
|
396
|
+
dow.isWildcard) {
|
|
397
|
+
return "Every minute";
|
|
398
|
+
}
|
|
399
|
+
// Every N minutes.
|
|
400
|
+
if (minuteStep !== null &&
|
|
401
|
+
hour.isWildcard &&
|
|
402
|
+
dom.isWildcard &&
|
|
403
|
+
month.isWildcard &&
|
|
404
|
+
dow.isWildcard) {
|
|
405
|
+
return minuteStep === 1
|
|
406
|
+
? "Every minute"
|
|
407
|
+
: `Every ${minuteStep} minutes`;
|
|
408
|
+
}
|
|
409
|
+
// Every hour (on the hour).
|
|
410
|
+
if (minute.values.length === 1 &&
|
|
411
|
+
minute.values[0] === 0 &&
|
|
412
|
+
hour.isWildcard &&
|
|
413
|
+
dom.isWildcard &&
|
|
414
|
+
month.isWildcard &&
|
|
415
|
+
dow.isWildcard) {
|
|
416
|
+
return "Every hour, on the hour";
|
|
417
|
+
}
|
|
418
|
+
// Every N hours (at minute M).
|
|
419
|
+
if (minute.values.length === 1 &&
|
|
420
|
+
hourStep !== null &&
|
|
421
|
+
dom.isWildcard &&
|
|
422
|
+
month.isWildcard &&
|
|
423
|
+
dow.isWildcard) {
|
|
424
|
+
const atMinute = minute.values[0] === 0
|
|
425
|
+
? ""
|
|
426
|
+
: ` at minute ${this.pad(minute.values[0])}`;
|
|
427
|
+
return hourStep === 1
|
|
428
|
+
? `Every hour${atMinute}`
|
|
429
|
+
: `Every ${hourStep} hours${atMinute}`;
|
|
430
|
+
}
|
|
431
|
+
const isSingleTime = minute.values.length === 1 && hour.values.length === 1;
|
|
432
|
+
if (isSingleTime) {
|
|
433
|
+
const time = `${this.pad(hour.values[0])}:${this.pad(minute.values[0])}`;
|
|
434
|
+
// Every day at HH:MM.
|
|
435
|
+
if (dom.isWildcard && month.isWildcard && dow.isWildcard) {
|
|
436
|
+
return `Every day at ${time} (UTC)`;
|
|
437
|
+
}
|
|
438
|
+
// Every week on <days> at HH:MM.
|
|
439
|
+
if (dom.isWildcard && month.isWildcard && !dow.isWildcard) {
|
|
440
|
+
return `Every week on ${this.describeWeekdays(dow.values)} at ${time} (UTC)`;
|
|
441
|
+
}
|
|
442
|
+
// Every month on the <day> at HH:MM.
|
|
443
|
+
if (!dom.isWildcard && month.isWildcard && dow.isWildcard) {
|
|
444
|
+
return `Every month on the ${this.describeDaysOfMonth(dom.values)} at ${time} (UTC)`;
|
|
445
|
+
}
|
|
446
|
+
// Every N months on the <day> at HH:MM.
|
|
447
|
+
const monthStep = this.detectStep(month, 1, 12);
|
|
448
|
+
if (!dom.isWildcard && monthStep !== null && dow.isWildcard) {
|
|
449
|
+
const everyMonths = monthStep === 1 ? "month" : `${monthStep} months`;
|
|
450
|
+
return `Every ${everyMonths} on the ${this.describeDaysOfMonth(dom.values)} at ${time} (UTC)`;
|
|
451
|
+
}
|
|
452
|
+
// Specific month(s) on the <day> at HH:MM (e.g. yearly).
|
|
453
|
+
if (!dom.isWildcard && !month.isWildcard && dow.isWildcard) {
|
|
454
|
+
return `On the ${this.describeDaysOfMonth(dom.values)} of ${this.describeMonths(month.values)} at ${time} (UTC)`;
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
// Generic fallback: list only the constrained fields.
|
|
459
|
+
return this.describeGeneric(parsed);
|
|
460
|
+
}
|
|
461
|
+
static describeGeneric(parsed) {
|
|
462
|
+
const parts = [];
|
|
463
|
+
if (parsed.hasSeconds && !this.isDefaultSecond(parsed.second)) {
|
|
464
|
+
parts.push(`at ${this.describeFieldValues(parsed.second, "second")}`);
|
|
465
|
+
}
|
|
466
|
+
if (!parsed.minute.isWildcard) {
|
|
467
|
+
parts.push(`minute ${this.describeFieldValues(parsed.minute, "minute")}`);
|
|
468
|
+
}
|
|
469
|
+
else {
|
|
470
|
+
parts.push("every minute");
|
|
471
|
+
}
|
|
472
|
+
if (!parsed.hour.isWildcard) {
|
|
473
|
+
parts.push(`hour ${this.describeFieldValues(parsed.hour, "hour")}`);
|
|
474
|
+
}
|
|
475
|
+
if (!parsed.dayOfMonth.isWildcard) {
|
|
476
|
+
parts.push(`on day-of-month ${this.describeFieldValues(parsed.dayOfMonth, "dom")}`);
|
|
477
|
+
}
|
|
478
|
+
if (!parsed.month.isWildcard) {
|
|
479
|
+
parts.push(`in ${this.describeMonths(parsed.month.values)}`);
|
|
480
|
+
}
|
|
481
|
+
if (!parsed.dayOfWeek.isWildcard) {
|
|
482
|
+
parts.push(`on ${this.describeWeekdays(parsed.dayOfWeek.values)}`);
|
|
483
|
+
}
|
|
484
|
+
return parts.join(", ") + " (UTC)";
|
|
485
|
+
}
|
|
486
|
+
static isDefaultSecond(second) {
|
|
487
|
+
return second.values.length === 1 && second.values[0] === 0;
|
|
488
|
+
}
|
|
489
|
+
static describeFieldValues(field, kind) {
|
|
490
|
+
const step = kind === "minute"
|
|
491
|
+
? this.detectStep(field, 0, 59)
|
|
492
|
+
: kind === "hour"
|
|
493
|
+
? this.detectStep(field, 0, 23)
|
|
494
|
+
: null;
|
|
495
|
+
if (step !== null && step > 1) {
|
|
496
|
+
return `every ${step}`;
|
|
497
|
+
}
|
|
498
|
+
return field.values.join(", ");
|
|
499
|
+
}
|
|
500
|
+
/**
|
|
501
|
+
* Detects a "*\/step" pattern: an evenly-spaced set of values starting at the
|
|
502
|
+
* field minimum and spanning to at least the last reachable step below max.
|
|
503
|
+
* Returns the step, or null when the field isn't a clean step.
|
|
504
|
+
*/
|
|
505
|
+
static detectStep(field, min, max) {
|
|
506
|
+
const values = field.values;
|
|
507
|
+
if (values.length < 2) {
|
|
508
|
+
return null;
|
|
509
|
+
}
|
|
510
|
+
if (values[0] !== min) {
|
|
511
|
+
return null;
|
|
512
|
+
}
|
|
513
|
+
const step = values[1] - values[0];
|
|
514
|
+
if (step <= 0) {
|
|
515
|
+
return null;
|
|
516
|
+
}
|
|
517
|
+
// Every consecutive value must be exactly `step` apart.
|
|
518
|
+
for (let i = 1; i < values.length; i++) {
|
|
519
|
+
if (values[i] - values[i - 1] !== step) {
|
|
520
|
+
return null;
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
// The set must be complete: the next step would exceed max.
|
|
524
|
+
const lastValue = values[values.length - 1];
|
|
525
|
+
if (lastValue + step <= max) {
|
|
526
|
+
return null;
|
|
527
|
+
}
|
|
528
|
+
return step;
|
|
529
|
+
}
|
|
530
|
+
static describeWeekdays(values) {
|
|
531
|
+
return this.joinList(values.map((v) => {
|
|
532
|
+
return DAY_NAMES_LONG[v] || `day ${v}`;
|
|
533
|
+
}));
|
|
534
|
+
}
|
|
535
|
+
static describeMonths(values) {
|
|
536
|
+
return this.joinList(values.map((v) => {
|
|
537
|
+
return MONTH_NAMES_LONG[v - 1] || `month ${v}`;
|
|
538
|
+
}));
|
|
539
|
+
}
|
|
540
|
+
static describeDaysOfMonth(values) {
|
|
541
|
+
return this.joinList(values.map((v) => {
|
|
542
|
+
return this.ordinal(v);
|
|
543
|
+
}));
|
|
544
|
+
}
|
|
545
|
+
static joinList(items) {
|
|
546
|
+
if (items.length === 0) {
|
|
547
|
+
return "";
|
|
548
|
+
}
|
|
549
|
+
if (items.length === 1) {
|
|
550
|
+
return items[0];
|
|
551
|
+
}
|
|
552
|
+
if (items.length === 2) {
|
|
553
|
+
return `${items[0]} and ${items[1]}`;
|
|
554
|
+
}
|
|
555
|
+
return `${items.slice(0, -1).join(", ")} and ${items[items.length - 1]}`;
|
|
556
|
+
}
|
|
557
|
+
static ordinal(value) {
|
|
558
|
+
const mod100 = value % 100;
|
|
559
|
+
if (mod100 >= 11 && mod100 <= 13) {
|
|
560
|
+
return `${value}th`;
|
|
561
|
+
}
|
|
562
|
+
switch (value % 10) {
|
|
563
|
+
case 1:
|
|
564
|
+
return `${value}st`;
|
|
565
|
+
case 2:
|
|
566
|
+
return `${value}nd`;
|
|
567
|
+
case 3:
|
|
568
|
+
return `${value}rd`;
|
|
569
|
+
default:
|
|
570
|
+
return `${value}th`;
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
static pad(value) {
|
|
574
|
+
return value < 10 ? `0${value}` : `${value}`;
|
|
575
|
+
}
|
|
576
|
+
}
|
|
577
|
+
/**
|
|
578
|
+
* Curated list of common schedules offered in the picker. Every value here
|
|
579
|
+
* is a valid 5-field cron expression.
|
|
580
|
+
*/
|
|
581
|
+
CronTab.PRESETS = [
|
|
582
|
+
{ label: "Every minute", value: "* * * * *" },
|
|
583
|
+
{ label: "Every 5 minutes", value: "*/5 * * * *" },
|
|
584
|
+
{ label: "Every 10 minutes", value: "*/10 * * * *" },
|
|
585
|
+
{ label: "Every 15 minutes", value: "*/15 * * * *" },
|
|
586
|
+
{ label: "Every 30 minutes", value: "*/30 * * * *" },
|
|
587
|
+
{ label: "Every hour", value: "0 * * * *" },
|
|
588
|
+
{ label: "Every 2 hours", value: "0 */2 * * *" },
|
|
589
|
+
{ label: "Every 3 hours", value: "0 */3 * * *" },
|
|
590
|
+
{ label: "Every 6 hours", value: "0 */6 * * *" },
|
|
591
|
+
{ label: "Every 12 hours", value: "0 */12 * * *" },
|
|
592
|
+
{ label: "Every day at midnight", value: "0 0 * * *" },
|
|
593
|
+
{ label: "Every day at 9:00 AM", value: "0 9 * * *" },
|
|
594
|
+
{ label: "Every Monday at 9:00 AM", value: "0 9 * * 1" },
|
|
595
|
+
{ label: "Every week (Sunday at midnight)", value: "0 0 * * 0" },
|
|
596
|
+
{ label: "Every month (1st at midnight)", value: "0 0 1 * *" },
|
|
597
|
+
{ label: "Every 3 months (1st at midnight)", value: "0 0 1 */3 *" },
|
|
598
|
+
{ label: "Every 6 months (1st at midnight)", value: "0 0 1 */6 *" },
|
|
599
|
+
{ label: "Every year (Jan 1st at midnight)", value: "0 0 1 1 *" },
|
|
600
|
+
];
|
|
601
|
+
// ----- Next-run computation --------------------------------------------
|
|
602
|
+
/*
|
|
603
|
+
* Generous safety cap. Each iteration advances the cursor by at least a
|
|
604
|
+
* second (usually a day/month), so this comfortably covers >1000 years while
|
|
605
|
+
* guarding against impossible patterns (e.g. Feb 31).
|
|
606
|
+
*/
|
|
607
|
+
CronTab.MAX_SEARCH_ITERATIONS = 1000000;
|
|
608
|
+
export default CronTab;
|
|
609
|
+
//# sourceMappingURL=CronTab.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CronTab.js","sourceRoot":"","sources":["../../../Utils/CronTab.ts"],"names":[],"mappings":"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"}
|