@@ -23,8 +23,8 @@ export enum CronPeriod {
23
23
Month ,
24
24
}
25
25
26
- export type TimeValue = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 ;
27
-
26
+ export type SecondOrMinuteValue = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 ;
27
+ export type HourValue = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 ;
28
28
export type DayOfMonth = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 ;
29
29
30
30
export enum DayOfWeek {
@@ -53,20 +53,25 @@ export enum Month {
53
53
}
54
54
55
55
export class CronExpressionBuilder {
56
-
57
- public static on ( period : CronPeriod . Second , ...values : ( TimeValue [ ] | TimeValue ) [ ] ) : CronExpression ;
58
- public static on ( period : CronPeriod . Minute , ...values : ( TimeValue [ ] | TimeValue ) [ ] ) : CronExpression ;
59
- public static on ( period : CronPeriod . Hour , ...values : ( TimeValue [ ] | TimeValue ) [ ] ) : CronExpression ;
56
+ public static on (
57
+ period : CronPeriod . Second ,
58
+ ...values : ( SecondOrMinuteValue [ ] | SecondOrMinuteValue ) [ ]
59
+ ) : CronExpression ;
60
+ public static on (
61
+ period : CronPeriod . Minute ,
62
+ ...values : ( SecondOrMinuteValue [ ] | SecondOrMinuteValue ) [ ]
63
+ ) : CronExpression ;
64
+ public static on ( period : CronPeriod . Hour , ...values : ( HourValue [ ] | HourValue ) [ ] ) : CronExpression ;
60
65
public static on ( period : CronPeriod . DayOfWeek , ...values : ( DayOfWeek [ ] | DayOfWeek ) [ ] ) : CronExpression ;
61
66
public static on ( period : CronPeriod . DayOfMonth , ...values : ( DayOfMonth [ ] | DayOfMonth ) [ ] ) : CronExpression ;
62
67
public static on ( period : CronPeriod . Month , ...values : ( Month [ ] | Month ) [ ] ) : CronExpression ;
63
68
public static on ( period : any , ...values : ( any [ ] | any ) [ ] ) {
64
69
return new CronExpression ( ) . on ( period , values . flat ( ) ) ;
65
70
}
66
71
67
- public static through ( period : CronPeriod . Second , from : TimeValue , to : TimeValue ) : CronExpression ;
68
- public static through ( period : CronPeriod . Minute , from : TimeValue , to : TimeValue ) : CronExpression ;
69
- public static through ( period : CronPeriod . Hour , from : TimeValue , to : TimeValue ) : CronExpression ;
72
+ public static through ( period : CronPeriod . Second , from : SecondOrMinuteValue , to : SecondOrMinuteValue ) : CronExpression ;
73
+ public static through ( period : CronPeriod . Minute , from : SecondOrMinuteValue , to : SecondOrMinuteValue ) : CronExpression ;
74
+ public static through ( period : CronPeriod . Hour , from : HourValue , to : HourValue ) : CronExpression ;
70
75
public static through ( period : CronPeriod . DayOfWeek , from : DayOfWeek , to : DayOfWeek ) : CronExpression ;
71
76
public static through ( period : CronPeriod . DayOfMonth , from : DayOfMonth , to : DayOfMonth ) : CronExpression ;
72
77
public static through ( period : CronPeriod . Month , from : Month , to : Month ) : CronExpression ;
@@ -80,15 +85,13 @@ export class CronExpressionBuilder {
80
85
}
81
86
82
87
export class CronExpression {
83
- private static readonly SecondsAndMinutesRegexText = / ( [ 0 - 5 ] ? \d - [ 0 - 5 ] ? \d ) | ( [ 0 - 5 ] ? \d , ? ) | ( \* ( \/ [ 0 - 5 ] ? \d ) ? ) / ;
84
- private static readonly HoursRegexText =
85
- / ( ( [ 0 - 1 ] ? \d ) | ( 2 [ 0 - 3 ] ) - ( [ 0 - 1 ] ? \d ) | ( 2 [ 0 - 3 ] ) ) | ( ( [ 0 - 1 ] ? \d ) | ( 2 [ 0 - 3 ] ) , ? ) | ( \* ( \/ ( [ 0 - 1 ] ? \d ) | ( 2 [ 0 - 3 ] ) ) ? ) / ;
86
- private static readonly DayOfMonthRegexText =
87
- / \* | ( \* \/ ( ( [ 0 - 2 ] ? \d ) | ( 3 [ 0 - 1 ] ) ) ) | ( ( ( ( [ 0 - 2 ] ? \d ) | ( 3 [ 0 - 1 ] ) ) ( - ( ( [ 0 - 2 ] ? \d ) | ( 3 [ 0 - 1 ] ) ) ) ? ) ) / ;
88
- private static readonly MonthRegexText =
89
- / ( ^ ( \* \/ ) ? ( ( 0 ? \d ) | ( 1 [ 0 - 2 ] ) ) $ ) | ( ^ \* $ ) | ( ^ ( ( 0 ? \d ) | ( 1 [ 0 - 2 ] ) ) ( - ( ( 0 ? \d ) | ( 1 [ 0 - 2 ] ) ) ? ) $ ) | ( ^ (?: J A N | F E B | M A R | A P R | M A Y | J U N | J U L | A U G | S E P | O C T | N O V | D E C ) (?: - (?: J A N | F E B | M A R | A P R | M A Y | J U N | J U L | A U G | S E P | O C T | N O V | D E C ) ) ? (?: , (?: J A N | F E B | M A R | A P R | M A Y | J U N | J U L | A U G | S E P | O C T | N O V | D E C ) (?: - (?: J A N | F E B | M A R | A P R | M A Y | J U N | J U L | A U G | S E P | O C T | N O V | D E C ) ) ? ) * $ ) / ;
90
- private static readonly DayOfWeekRegexText =
91
- / \* | ( \* \/ ( 0 ? [ 0 - 6 ] ) | ( 0 ? [ 0 - 6 ] ( - 0 ? [ 0 - 6 ] ) ? ) | ( ( , ? ( S U N | M O N | T U E | W E D | T H U | F R I | S A T ) ) + ) | ( ( S U N | M O N | T U E | W E D | T H U | F R I | S A T ) ( - ( S U N | M O N | T U E | W E D | T H U | F R I | S A T ) ) ? ) ) / ;
88
+ private static readonly SecondsAndMinutesRegexText = / .* / ;
89
+ private static readonly HoursRegexText = / .* / ;
90
+ private static readonly DayOfMonthRegexText = / .* / ;
91
+ // (^(\*\/)?((0?\d)|(1[0-2]))$)|(^\*$)|(^((0?\d)|(1[0-2]))(-((0?\d)|(1[0-2]))?)$)|(^(?:JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)(?:-(?:JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC))?(?:,(?:JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)(?:-(?:JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC))?)*$)
92
+ private static readonly MonthRegexText = / .* / ;
93
+ // \*|(\*\/(0?[0-6])|(0?[0-6](-0?[0-6])?)|((,?(SUN|MON|TUE|WED|THU|FRI|SAT))+)|((SUN|MON|TUE|WED|THU|FRI|SAT)(-(SUN|MON|TUE|WED|THU|FRI|SAT))?))
94
+ private static readonly DayOfWeekRegexText = / .* / ;
92
95
93
96
private static readonly cronExpressionRegex = new RegExp (
94
97
`${ CronExpression . SecondsAndMinutesRegexText . source } ${ CronExpression . SecondsAndMinutesRegexText . source } ${ CronExpression . HoursRegexText . source } ${ CronExpression . DayOfMonthRegexText . source } ${ CronExpression . MonthRegexText . source } ${ CronExpression . DayOfWeekRegexText . source } ` ,
@@ -105,9 +108,9 @@ export class CronExpression {
105
108
private month = "*" ;
106
109
private dayOfWeek = "*" ;
107
110
108
- public on ( period : CronPeriod . Second , ...values : ( TimeValue [ ] | TimeValue ) [ ] ) : this;
109
- public on ( period : CronPeriod . Minute , ...values : ( TimeValue [ ] | TimeValue ) [ ] ) : this;
110
- public on ( period : CronPeriod . Hour , ...values : ( TimeValue [ ] | TimeValue ) [ ] ) : this;
111
+ public on ( period : CronPeriod . Second , ...values : ( SecondOrMinuteValue [ ] | SecondOrMinuteValue ) [ ] ) : this;
112
+ public on ( period : CronPeriod . Minute , ...values : ( SecondOrMinuteValue [ ] | SecondOrMinuteValue ) [ ] ) : this;
113
+ public on ( period : CronPeriod . Hour , ...values : ( HourValue [ ] | HourValue ) [ ] ) : this;
111
114
public on ( period : CronPeriod . DayOfWeek , ...values : ( DayOfWeek [ ] | DayOfWeek ) [ ] ) : this;
112
115
public on ( period : CronPeriod . DayOfMonth , ...values : ( DayOfMonth [ ] | DayOfMonth ) [ ] ) : this;
113
116
public on ( period : CronPeriod . Month , ...values : ( Month [ ] | Month ) [ ] ) : this;
@@ -116,13 +119,13 @@ export class CronExpression {
116
119
117
120
switch ( period ) {
118
121
case CronPeriod . Second :
119
- this . seconds = this . prepareTimeValueList ( fixedValues ) ;
122
+ this . seconds = this . prepareSecondOrMinuteValueList ( fixedValues ) ;
120
123
break ;
121
124
case CronPeriod . Minute :
122
- this . minutes = this . prepareTimeValueList ( fixedValues ) ;
125
+ this . minutes = this . prepareSecondOrMinuteValueList ( fixedValues ) ;
123
126
break ;
124
127
case CronPeriod . Hour :
125
- this . hours = this . prepareTimeValueList ( fixedValues ) ;
128
+ this . hours = this . prepareHourValueList ( fixedValues ) ;
126
129
break ;
127
130
case CronPeriod . DayOfWeek :
128
131
this . dayOfWeek = this . prepareDayOfWeekValueList ( fixedValues ) ;
@@ -138,23 +141,22 @@ export class CronExpression {
138
141
return this ;
139
142
}
140
143
141
- public through ( period : CronPeriod . Second , from : TimeValue , to : TimeValue ) : CronExpression ;
142
- public through ( period : CronPeriod . Minute , from : TimeValue , to : TimeValue ) : CronExpression ;
143
- public through ( period : CronPeriod . Hour , from : TimeValue , to : TimeValue ) : CronExpression ;
144
+ public through ( period : CronPeriod . Second , from : SecondOrMinuteValue , to : SecondOrMinuteValue ) : CronExpression ;
145
+ public through ( period : CronPeriod . Minute , from : SecondOrMinuteValue , to : SecondOrMinuteValue ) : CronExpression ;
146
+ public through ( period : CronPeriod . Hour , from : SecondOrMinuteValue , to : SecondOrMinuteValue ) : CronExpression ;
144
147
public through ( period : CronPeriod . DayOfWeek , from : DayOfWeek , to : DayOfWeek ) : CronExpression ;
145
148
public through ( period : CronPeriod . DayOfMonth , from : DayOfMonth , to : DayOfMonth ) : CronExpression ;
146
149
public through ( period : CronPeriod . Month , from : Month , to : Month ) : CronExpression ;
147
150
public through ( period : any , from : any , to : any ) {
148
-
149
151
switch ( period ) {
150
152
case CronPeriod . Second :
151
- this . seconds = this . prepareTimeValueRange ( from , to ) ;
153
+ this . seconds = this . prepareSecondOrMinuteValueRange ( from , to ) ;
152
154
break ;
153
155
case CronPeriod . Minute :
154
- this . minutes = this . prepareTimeValueRange ( from , to ) ;
156
+ this . minutes = this . prepareSecondOrMinuteValueRange ( from , to ) ;
155
157
break ;
156
158
case CronPeriod . Hour :
157
- this . hours = this . prepareTimeValueRange ( from , to ) ;
159
+ this . hours = this . prepareHourValueRange ( from , to ) ;
158
160
break ;
159
161
case CronPeriod . DayOfWeek :
160
162
this . dayOfWeek = this . prepareDayOfWeekValueRange ( from , to ) ;
@@ -198,22 +200,29 @@ export class CronExpression {
198
200
return `${ this . seconds } ${ this . minutes } ${ this . hours } ${ this . dayOfMonth } ${ this . month } ${ this . dayOfWeek } ` ;
199
201
}
200
202
201
- private prepareTimeValueRange ( from : TimeValue , to : TimeValue ) {
202
- if ( from >= to )
203
- throw new Error ( "Invalid range: 'from' must be less than 'to'" ) ;
203
+ private prepareSecondOrMinuteValueRange ( from : SecondOrMinuteValue , to : SecondOrMinuteValue ) {
204
+ if ( from >= to ) throw new Error ( "Invalid range: 'from' must be less than 'to'" ) ;
204
205
205
206
if ( [ from , to ] . some ( ( v ) => v < 0 || v > 59 ) )
206
- throw new RangeError ( "Time values must be within 0 and 59, inclusively." ) ;
207
+ throw new RangeError ( "Time values must be within 0 and 59, inclusive." ) ;
208
+
209
+ return `${ from } -${ to } ` ;
210
+ }
211
+
212
+ private prepareHourValueRange ( from : HourValue , to : HourValue ) {
213
+ if ( from >= to ) throw new Error ( "Invalid range: 'from' must be less than 'to'" ) ;
214
+
215
+ if ( [ from , to ] . some ( ( v ) => v < 0 || v > 23 ) )
216
+ throw new RangeError ( "Hour values must be within 0 and 23, inclusive." ) ;
207
217
208
218
return `${ from } -${ to } ` ;
209
219
}
210
220
211
221
private prepareDayOfMonthValueRange ( from : DayOfMonth , to : DayOfMonth ) {
212
- if ( from >= to )
213
- throw new Error ( "Invalid range: 'from' must be less than 'to'" ) ;
222
+ if ( from >= to ) throw new Error ( "Invalid range: 'from' must be less than 'to'" ) ;
214
223
215
224
if ( [ from , to ] . some ( ( v ) => v < 1 || v > 31 ) )
216
- throw new RangeError ( "Day of month values must be within 1 and 31, inclusively ." ) ;
225
+ throw new RangeError ( "Day of month values must be within 1 and 31, inclusive ." ) ;
217
226
218
227
return `${ from } -${ to } ` ;
219
228
}
@@ -232,29 +241,36 @@ export class CronExpression {
232
241
return `${ from } -${ to } ` ;
233
242
}
234
243
235
- private prepareTimeValueList ( timeValues : TimeValue [ ] ) {
244
+ private prepareSecondOrMinuteValueList ( timeValues : SecondOrMinuteValue [ ] ) {
236
245
if ( timeValues . some ( ( v ) => v < 0 || v > 59 ) )
237
- throw new RangeError ( "Time values must be within 0 and 59, inclusively." ) ;
246
+ throw new RangeError ( "Time values must be within 0 and 59, inclusive." ) ;
247
+
248
+ return [ ...timeValues ] . sort ( ( a , b ) => a - b ) . join ( "," ) ;
249
+ }
250
+
251
+ private prepareHourValueList ( timeValues : HourValue [ ] ) {
252
+ if ( timeValues . some ( ( v ) => v < 0 || v > 23 ) )
253
+ throw new RangeError ( "Hour values must be within 0 and 23, inclusive." ) ;
238
254
239
255
return [ ...timeValues ] . sort ( ( a , b ) => a - b ) . join ( "," ) ;
240
256
}
241
257
242
258
private prepareDayOfMonthValueList ( dayOfMonthValues : DayOfMonth [ ] ) {
243
259
if ( dayOfMonthValues . some ( ( v ) => v < 1 || v > 31 ) )
244
- throw new RangeError ( "Day of month values must be within 1 and 31, inclusively ." ) ;
260
+ throw new RangeError ( "Day of month values must be within 1 and 31, inclusive ." ) ;
245
261
246
262
return [ ...dayOfMonthValues ] . sort ( ( a , b ) => a - b ) . join ( "," ) ;
247
263
}
248
264
249
265
private prepareMonthValueList ( monthValues : Month [ ] ) {
250
266
return [ ...monthValues ]
251
- . sort ( ( left , right ) => Object . values ( Month ) . indexOf ( left ) - Object . values ( Month ) . indexOf ( right ) )
252
- . join ( "," ) ;
267
+ . sort ( ( left , right ) => Object . values ( Month ) . indexOf ( left ) - Object . values ( Month ) . indexOf ( right ) )
268
+ . join ( "," ) ;
253
269
}
254
270
255
271
private prepareDayOfWeekValueList ( dayValues : DayOfWeek [ ] ) {
256
272
return [ ...dayValues ]
257
- . sort ( ( left , right ) => Object . values ( DayOfWeek ) . indexOf ( left ) - Object . values ( DayOfWeek ) . indexOf ( right ) )
258
- . join ( "," ) ;
273
+ . sort ( ( left , right ) => Object . values ( DayOfWeek ) . indexOf ( left ) - Object . values ( DayOfWeek ) . indexOf ( right ) )
274
+ . join ( "," ) ;
259
275
}
260
276
}
0 commit comments