1- import { CronType , FieldWrapper , type CronSegment , type SegmentFromString } from './types'
1+ import { FieldPattern , FieldWrapper , type CronSegment , type SegmentFromString } from './types'
22import { isSquence , range , unimplemented } from './util'
33
44class NoSpecificSegment implements CronSegment {
55 field : FieldWrapper
6- type : CronType = CronType . NoSpecific
6+ type : FieldPattern = FieldPattern . NoSpecific
77
88 constructor ( field : FieldWrapper ) {
99 this . field = field
@@ -31,7 +31,7 @@ class NoSpecificSegment implements CronSegment {
3131
3232class AnySegment implements CronSegment {
3333 field : FieldWrapper
34- type : CronType = CronType . Empty
34+ type : FieldPattern = FieldPattern . Any
3535
3636 constructor ( field : FieldWrapper ) {
3737 this . field = field
@@ -82,7 +82,7 @@ class RangeSegment implements CronSegment {
8282 static re = / ^ \d + - \d + $ /
8383
8484 field : FieldWrapper
85- type : CronType = CronType . Range
85+ type : FieldPattern = FieldPattern . Range
8686 start : number
8787 end : number
8888
@@ -128,75 +128,79 @@ class RangeSegment implements CronSegment {
128128 }
129129}
130130
131- const _every = ( n : number , min : number , max : number ) => {
131+ function _rangeWithStep ( n : number , min : number , max : number ) {
132132 const res = [ ]
133133 for ( let i = min ; i <= max ; i += n ) {
134134 res . push ( i )
135135 }
136136 return res
137137}
138-
139- class EverySegment implements CronSegment {
138+ class StepSegment implements CronSegment {
140139 static re = / ^ ( \* | \d + - \d + ) \/ \d + $ /
141140
142141 field : FieldWrapper
143- type : CronType = CronType . EveryX
144- every : number
142+ step : number
145143 start : number
146144 end : number
147145
148- constructor ( field : FieldWrapper , every : number , start ?: number , end ?: number ) {
146+ constructor ( field : FieldWrapper , step : number , start ?: number , end ?: number ) {
149147 this . field = field
150- this . every = every
148+ this . step = step
151149 this . start = start ?? field . min
152150 this . end = end ?? field . max
153151 }
154152
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+
155161 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 } `
158164 }
159- return `${ this . start } - ${ this . end } /${ this . every } `
165+ return `* /${ this . step } `
160166 }
161167
162168 toArray ( ) {
163- return _every ( this . every , this . start , this . end )
169+ return _rangeWithStep ( this . step , this . start , this . end )
164170 }
165171
166172 get items ( ) {
167173 return {
168- every : this . field . itemMap [ this . every ] ,
174+ step : this . field . itemMap [ this . step ] ,
169175 start : this . field . itemMap [ this . start ] ,
170176 end : this . field . itemMap [ this . end ] ,
171177 }
172178 }
173179
174180 static fromString ( str : string , field : FieldWrapper ) {
175- if ( ! EverySegment . re . test ( str ) ) {
181+ if ( ! StepSegment . re . test ( str ) ) {
176182 return null
177183 }
178184
179- const [ rangeStr , everyStr ] = str . split ( '/' )
180- const every = parseInt ( everyStr )
185+ const [ rangeStr , stepStr ] = str . split ( '/' )
186+ const step = parseInt ( stepStr )
181187
182- if ( every > field . items . length ) {
188+ if ( step > field . items . length ) {
183189 return null
184190 }
185191
186192 const range = str . split ( '-' ) . map ( ( s ) => parseInt ( s ) )
187193 const min = rangeStr == '*' ? field . min : range [ 0 ]
188194 const max = rangeStr == '*' ? field . max : range [ 1 ]
189195
190- if ( _every ( every , min , max ) . length == 0 ) {
196+ if ( _rangeWithStep ( step , min , max ) . length == 0 ) {
191197 return null
192198 }
193199
194- return new EverySegment ( field , every , min , max )
200+ return new StepSegment ( field , step , min , max )
195201 }
196202
197203 static fromArray ( arr : number [ ] , field : FieldWrapper ) {
198- const { min, max } = field
199-
200204 if ( arr . length < 3 ) {
201205 return null
202206 }
@@ -206,28 +210,19 @@ class EverySegment implements CronSegment {
206210 return null
207211 }
208212
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-
218213 for ( let i = 2 ; i < arr . length ; i ++ ) {
219214 if ( arr [ i ] - arr [ i - 1 ] != step ) {
220215 return null
221216 }
222217 }
223218
224- return new EverySegment ( field , step , min , max )
219+ return new StepSegment ( field , step , arr [ 0 ] , arr [ arr . length - 1 ] )
225220 }
226221}
227222
228223class ValueSegment implements CronSegment {
229224 field : FieldWrapper
230- type : CronType = CronType . Value
225+ type : FieldPattern = FieldPattern . Value
231226 value : number
232227
233228 constructor ( field : FieldWrapper , value : number ) {
@@ -276,7 +271,7 @@ class ValueSegment implements CronSegment {
276271class CombinedSegment implements CronSegment {
277272 static segmentFactories : SegmentFromString [ ] = [
278273 AnySegment . fromString ,
279- EverySegment . fromString ,
274+ StepSegment . fromString ,
280275 RangeSegment . fromString ,
281276 ValueSegment . fromString ,
282277 ]
@@ -293,7 +288,7 @@ class CombinedSegment implements CronSegment {
293288 if ( this . segments . length == 1 ) {
294289 return this . segments [ 0 ] . type
295290 }
296- return CronType . Range
291+ return FieldPattern . Range
297292 }
298293
299294 addSegment ( segment : CronSegment ) {
@@ -377,7 +372,7 @@ function cronToSegment(cron: string, field: FieldWrapper) {
377372function arrayToSegment ( arr : number [ ] , field : FieldWrapper ) {
378373 for ( const fromArray of [
379374 AnySegment . fromArray ,
380- EverySegment . fromArray ,
375+ StepSegment . fromArray ,
381376 CombinedSegment . fromArray ,
382377 ] ) {
383378 const seg = fromArray ( arr , field )
@@ -390,11 +385,11 @@ function arrayToSegment(arr: number[], field: FieldWrapper) {
390385
391386export {
392387 AnySegment ,
388+ arrayToSegment ,
393389 CombinedSegment ,
394- EverySegment ,
390+ cronToSegment ,
395391 NoSpecificSegment ,
396392 RangeSegment ,
393+ StepSegment ,
397394 ValueSegment ,
398- arrayToSegment ,
399- cronToSegment ,
400395}
0 commit comments