1
- import { CronType , FieldWrapper , type CronSegment , type SegmentFromString } from './types'
1
+ import { FieldPattern , FieldWrapper , type CronSegment , type SegmentFromString } from './types'
2
2
import { isSquence , range , unimplemented } from './util'
3
3
4
4
class NoSpecificSegment implements CronSegment {
5
5
field : FieldWrapper
6
- type : CronType = CronType . NoSpecific
6
+ type : FieldPattern = FieldPattern . NoSpecific
7
7
8
8
constructor ( field : FieldWrapper ) {
9
9
this . field = field
@@ -31,7 +31,7 @@ class NoSpecificSegment implements CronSegment {
31
31
32
32
class AnySegment implements CronSegment {
33
33
field : FieldWrapper
34
- type : CronType = CronType . Empty
34
+ type : FieldPattern = FieldPattern . Any
35
35
36
36
constructor ( field : FieldWrapper ) {
37
37
this . field = field
@@ -82,7 +82,7 @@ class RangeSegment implements CronSegment {
82
82
static re = / ^ \d + - \d + $ /
83
83
84
84
field : FieldWrapper
85
- type : CronType = CronType . Range
85
+ type : FieldPattern = FieldPattern . Range
86
86
start : number
87
87
end : number
88
88
@@ -128,75 +128,79 @@ class RangeSegment implements CronSegment {
128
128
}
129
129
}
130
130
131
- const _every = ( n : number , min : number , max : number ) => {
131
+ function _rangeWithStep ( n : number , min : number , max : number ) {
132
132
const res = [ ]
133
133
for ( let i = min ; i <= max ; i += n ) {
134
134
res . push ( i )
135
135
}
136
136
return res
137
137
}
138
-
139
- class EverySegment implements CronSegment {
138
+ class StepSegment implements CronSegment {
140
139
static re = / ^ ( \* | \d + - \d + ) \/ \d + $ /
141
140
142
141
field : FieldWrapper
143
- type : CronType = CronType . EveryX
144
- every : number
142
+ step : number
145
143
start : number
146
144
end : number
147
145
148
- constructor ( field : FieldWrapper , every : number , start ?: number , end ?: number ) {
146
+ constructor ( field : FieldWrapper , step : number , start ?: number , end ?: number ) {
149
147
this . field = field
150
- this . every = every
148
+ this . step = step
151
149
this . start = start ?? field . min
152
150
this . end = end ?? field . max
153
151
}
154
152
153
+ get type ( ) {
154
+ const { min, max } = this . field
155
+ if ( this . start !== min || max - this . end >= this . step ) {
156
+ return FieldPattern . RangeStep
157
+ }
158
+ return FieldPattern . Step
159
+ }
160
+
155
161
toCron ( ) {
156
- if ( this . start == this . field . min && this . end == this . field . max ) {
157
- return `* /${ this . every } `
162
+ if ( this . type == FieldPattern . RangeStep ) {
163
+ return `${ this . start } - ${ this . end } /${ this . step } `
158
164
}
159
- return `${ this . start } - ${ this . end } /${ this . every } `
165
+ return `* /${ this . step } `
160
166
}
161
167
162
168
toArray ( ) {
163
- return _every ( this . every , this . start , this . end )
169
+ return _rangeWithStep ( this . step , this . start , this . end )
164
170
}
165
171
166
172
get items ( ) {
167
173
return {
168
- every : this . field . itemMap [ this . every ] ,
174
+ step : this . field . itemMap [ this . step ] ,
169
175
start : this . field . itemMap [ this . start ] ,
170
176
end : this . field . itemMap [ this . end ] ,
171
177
}
172
178
}
173
179
174
180
static fromString ( str : string , field : FieldWrapper ) {
175
- if ( ! EverySegment . re . test ( str ) ) {
181
+ if ( ! StepSegment . re . test ( str ) ) {
176
182
return null
177
183
}
178
184
179
- const [ rangeStr , everyStr ] = str . split ( '/' )
180
- const every = parseInt ( everyStr )
185
+ const [ rangeStr , stepStr ] = str . split ( '/' )
186
+ const step = parseInt ( stepStr )
181
187
182
- if ( every > field . items . length ) {
188
+ if ( step > field . items . length ) {
183
189
return null
184
190
}
185
191
186
192
const range = str . split ( '-' ) . map ( ( s ) => parseInt ( s ) )
187
193
const min = rangeStr == '*' ? field . min : range [ 0 ]
188
194
const max = rangeStr == '*' ? field . max : range [ 1 ]
189
195
190
- if ( _every ( every , min , max ) . length == 0 ) {
196
+ if ( _rangeWithStep ( step , min , max ) . length == 0 ) {
191
197
return null
192
198
}
193
199
194
- return new EverySegment ( field , every , min , max )
200
+ return new StepSegment ( field , step , min , max )
195
201
}
196
202
197
203
static fromArray ( arr : number [ ] , field : FieldWrapper ) {
198
- const { min, max } = field
199
-
200
204
if ( arr . length < 3 ) {
201
205
return null
202
206
}
@@ -206,28 +210,19 @@ class EverySegment implements CronSegment {
206
210
return null
207
211
}
208
212
209
- // prevent a-b/x segments until localization is ready
210
- if ( arr [ 0 ] != min ) {
211
- return null
212
- }
213
- const end = arr [ arr . length - 1 ]
214
- if ( max - end >= step ) {
215
- return null
216
- }
217
-
218
213
for ( let i = 2 ; i < arr . length ; i ++ ) {
219
214
if ( arr [ i ] - arr [ i - 1 ] != step ) {
220
215
return null
221
216
}
222
217
}
223
218
224
- return new EverySegment ( field , step , min , max )
219
+ return new StepSegment ( field , step , arr [ 0 ] , arr [ arr . length - 1 ] )
225
220
}
226
221
}
227
222
228
223
class ValueSegment implements CronSegment {
229
224
field : FieldWrapper
230
- type : CronType = CronType . Value
225
+ type : FieldPattern = FieldPattern . Value
231
226
value : number
232
227
233
228
constructor ( field : FieldWrapper , value : number ) {
@@ -276,7 +271,7 @@ class ValueSegment implements CronSegment {
276
271
class CombinedSegment implements CronSegment {
277
272
static segmentFactories : SegmentFromString [ ] = [
278
273
AnySegment . fromString ,
279
- EverySegment . fromString ,
274
+ StepSegment . fromString ,
280
275
RangeSegment . fromString ,
281
276
ValueSegment . fromString ,
282
277
]
@@ -293,7 +288,7 @@ class CombinedSegment implements CronSegment {
293
288
if ( this . segments . length == 1 ) {
294
289
return this . segments [ 0 ] . type
295
290
}
296
- return CronType . Range
291
+ return FieldPattern . Range
297
292
}
298
293
299
294
addSegment ( segment : CronSegment ) {
@@ -377,7 +372,7 @@ function cronToSegment(cron: string, field: FieldWrapper) {
377
372
function arrayToSegment ( arr : number [ ] , field : FieldWrapper ) {
378
373
for ( const fromArray of [
379
374
AnySegment . fromArray ,
380
- EverySegment . fromArray ,
375
+ StepSegment . fromArray ,
381
376
CombinedSegment . fromArray ,
382
377
] ) {
383
378
const seg = fromArray ( arr , field )
@@ -390,11 +385,11 @@ function arrayToSegment(arr: number[], field: FieldWrapper) {
390
385
391
386
export {
392
387
AnySegment ,
388
+ arrayToSegment ,
393
389
CombinedSegment ,
394
- EverySegment ,
390
+ cronToSegment ,
395
391
NoSpecificSegment ,
396
392
RangeSegment ,
393
+ StepSegment ,
397
394
ValueSegment ,
398
- arrayToSegment ,
399
- cronToSegment ,
400
395
}
0 commit comments