1
1
/*!
2
2
* to-regex-range <https://github.com/micromatch/to-regex-range>
3
3
*
4
- * Copyright (c) 2015-2017 , Jon Schlinkert.
4
+ * Copyright (c) 2015-2018, present , Jon Schlinkert.
5
5
* Released under the MIT License.
6
6
*/
7
7
8
8
'use strict' ;
9
9
10
- var repeat = require ( 'repeat-string' ) ;
11
- var isNumber = require ( 'is-number' ) ;
12
- var cache = { } ;
10
+ const isNumber = require ( 'is-number' ) ;
13
11
14
12
function toRegexRange ( min , max , options ) {
15
13
if ( isNumber ( min ) === false ) {
16
- throw new RangeError ( 'toRegexRange: first argument is invalid. ' ) ;
14
+ throw new TypeError ( 'toRegexRange: expected the first argument to be a number ' ) ;
17
15
}
18
16
19
17
if ( typeof max === 'undefined' || min === max ) {
20
18
return String ( min ) ;
21
19
}
22
20
23
21
if ( isNumber ( max ) === false ) {
24
- throw new RangeError ( 'toRegexRange: second argument is invalid .' ) ;
22
+ throw new TypeError ( 'toRegexRange: expected the second argument to be a number .' ) ;
25
23
}
26
24
27
25
options = options || { } ;
28
- var relax = String ( options . relaxZeros ) ;
29
- var shorthand = String ( options . shorthand ) ;
30
- var capture = String ( options . capture ) ;
31
- var key = min + ':' + max + '=' + relax + shorthand + capture ;
32
- if ( cache . hasOwnProperty ( key ) ) {
33
- return cache [ key ] . result ;
26
+ let relax = String ( options . relaxZeros ) ;
27
+ let shorthand = String ( options . shorthand ) ;
28
+ let capture = String ( options . capture ) ;
29
+ let key = min + ':' + max + '=' + relax + shorthand + capture ;
30
+ if ( toRegexRange . cache . hasOwnProperty ( key ) ) {
31
+ return toRegexRange . cache [ key ] . result ;
34
32
}
35
33
36
- var a = Math . min ( min , max ) ;
37
- var b = Math . max ( min , max ) ;
34
+ let a = Math . min ( min , max ) ;
35
+ let b = Math . max ( min , max ) ;
38
36
39
37
if ( Math . abs ( a - b ) === 1 ) {
40
- var result = min + '|' + max ;
38
+ let result = min + '|' + max ;
41
39
if ( options . capture ) {
42
40
return '(' + result + ')' ;
43
41
}
44
42
return result ;
45
43
}
46
44
47
- var isPadded = padding ( min ) || padding ( max ) ;
48
- var positives = [ ] ;
49
- var negatives = [ ] ;
45
+ let isPadded = padding ( min ) || padding ( max ) ;
46
+ let positives = [ ] ;
47
+ let negatives = [ ] ;
50
48
51
- var tok = { min : min , max : max , a : a , b : b } ;
49
+ let tok = { min : min , max : max , a : a , b : b } ;
52
50
if ( isPadded ) {
53
51
tok . isPadded = isPadded ;
54
52
tok . maxLen = String ( tok . max ) . length ;
55
53
}
56
54
57
55
if ( a < 0 ) {
58
- var newMin = b < 0 ? Math . abs ( b ) : 1 ;
59
- var newMax = Math . abs ( a ) ;
56
+ let newMin = b < 0 ? Math . abs ( b ) : 1 ;
57
+ let newMax = Math . abs ( a ) ;
60
58
negatives = splitToPatterns ( newMin , newMax , tok , options ) ;
61
59
a = tok . a = 0 ;
62
60
}
@@ -73,33 +71,35 @@ function toRegexRange(min, max, options) {
73
71
tok . result = '(' + tok . result + ')' ;
74
72
}
75
73
76
- cache [ key ] = tok ;
74
+ toRegexRange . cache [ key ] = tok ;
77
75
return tok . result ;
78
76
}
79
77
78
+ toRegexRange . cache = { } ;
79
+
80
80
function siftPatterns ( neg , pos , options ) {
81
- var onlyNegative = filterPatterns ( neg , pos , '-' , false , options ) || [ ] ;
82
- var onlyPositive = filterPatterns ( pos , neg , '' , false , options ) || [ ] ;
83
- var intersected = filterPatterns ( neg , pos , '-?' , true , options ) || [ ] ;
84
- var subpatterns = onlyNegative . concat ( intersected ) . concat ( onlyPositive ) ;
81
+ let onlyNegative = filterPatterns ( neg , pos , '-' , false , options ) || [ ] ;
82
+ let onlyPositive = filterPatterns ( pos , neg , '' , false , options ) || [ ] ;
83
+ let intersected = filterPatterns ( neg , pos , '-?' , true , options ) || [ ] ;
84
+ let subpatterns = onlyNegative . concat ( intersected ) . concat ( onlyPositive ) ;
85
85
return subpatterns . join ( '|' ) ;
86
86
}
87
87
88
88
function splitToRanges ( min , max ) {
89
89
min = Number ( min ) ;
90
90
max = Number ( max ) ;
91
91
92
- var nines = 1 ;
93
- var stops = [ max ] ;
94
- var stop = + countNines ( min , nines ) ;
92
+ let nines = 1 ;
93
+ let stops = [ max ] ;
94
+ let stop = + countNines ( min , nines ) ;
95
95
96
96
while ( min <= stop && stop <= max ) {
97
97
stops = push ( stops , stop ) ;
98
98
nines += 1 ;
99
99
stop = + countNines ( min , nines ) ;
100
100
}
101
101
102
- var zeros = 1 ;
102
+ let zeros = 1 ;
103
103
stop = countZeros ( max + 1 , zeros ) - 1 ;
104
104
105
105
while ( min < stop && stop <= max ) {
@@ -124,16 +124,16 @@ function rangeToPattern(start, stop, options) {
124
124
return { pattern : String ( start ) , digits : [ ] } ;
125
125
}
126
126
127
- var zipped = zip ( String ( start ) , String ( stop ) ) ;
128
- var len = zipped . length , i = - 1 ;
127
+ let zipped = zip ( String ( start ) , String ( stop ) ) ;
128
+ let len = zipped . length , i = - 1 ;
129
129
130
- var pattern = '' ;
131
- var digits = 0 ;
130
+ let pattern = '' ;
131
+ let digits = 0 ;
132
132
133
133
while ( ++ i < len ) {
134
- var numbers = zipped [ i ] ;
135
- var startDigit = numbers [ 0 ] ;
136
- var stopDigit = numbers [ 1 ] ;
134
+ let numbers = zipped [ i ] ;
135
+ let startDigit = numbers [ 0 ] ;
136
+ let stopDigit = numbers [ 1 ] ;
137
137
138
138
if ( startDigit === stopDigit ) {
139
139
pattern += startDigit ;
@@ -154,18 +154,18 @@ function rangeToPattern(start, stop, options) {
154
154
}
155
155
156
156
function splitToPatterns ( min , max , tok , options ) {
157
- var ranges = splitToRanges ( min , max ) ;
158
- var len = ranges . length ;
159
- var idx = - 1 ;
157
+ let ranges = splitToRanges ( min , max ) ;
158
+ let len = ranges . length ;
159
+ let idx = - 1 ;
160
160
161
- var tokens = [ ] ;
162
- var start = min ;
163
- var prev ;
161
+ let tokens = [ ] ;
162
+ let start = min ;
163
+ let prev ;
164
164
165
165
while ( ++ idx < len ) {
166
- var range = ranges [ idx ] ;
167
- var obj = rangeToPattern ( start , range , options ) ;
168
- var zeros = '' ;
166
+ let range = ranges [ idx ] ;
167
+ let obj = rangeToPattern ( start , range , options ) ;
168
+ let zeros = '' ;
169
169
170
170
if ( ! tok . isPadded && prev && prev . pattern === obj . pattern ) {
171
171
if ( prev . digits . length > 1 ) {
@@ -191,11 +191,11 @@ function splitToPatterns(min, max, tok, options) {
191
191
}
192
192
193
193
function filterPatterns ( arr , comparison , prefix , intersection , options ) {
194
- var res = [ ] ;
194
+ let res = [ ] ;
195
195
196
- for ( var i = 0 ; i < arr . length ; i ++ ) {
197
- var tok = arr [ i ] ;
198
- var ele = tok . string ;
196
+ for ( let i = 0 ; i < arr . length ; i ++ ) {
197
+ let tok = arr [ i ] ;
198
+ let ele = tok . string ;
199
199
200
200
if ( options . relaxZeros !== false ) {
201
201
if ( prefix === '-' && ele . charAt ( 0 ) === '0' ) {
@@ -223,8 +223,8 @@ function filterPatterns(arr, comparison, prefix, intersection, options) {
223
223
*/
224
224
225
225
function zip ( a , b ) {
226
- var arr = [ ] ;
227
- for ( var ch in a ) arr . push ( [ a [ ch ] , b [ ch ] ] ) ;
226
+ let arr = [ ] ;
227
+ for ( let ch in a ) arr . push ( [ a [ ch ] , b [ ch ] ] ) ;
228
228
return arr ;
229
229
}
230
230
@@ -238,7 +238,7 @@ function push(arr, ele) {
238
238
}
239
239
240
240
function contains ( arr , key , val ) {
241
- for ( var i = 0 ; i < arr . length ; i ++ ) {
241
+ for ( let i = 0 ; i < arr . length ; i ++ ) {
242
242
if ( arr [ i ] [ key ] === val ) {
243
243
return true ;
244
244
}
@@ -247,16 +247,16 @@ function contains(arr, key, val) {
247
247
}
248
248
249
249
function countNines ( min , len ) {
250
- return String ( min ) . slice ( 0 , - len ) + repeat ( '9' , len ) ;
250
+ return String ( min ) . slice ( 0 , - len ) + '9' . repeat ( len ) ;
251
251
}
252
252
253
253
function countZeros ( integer , zeros ) {
254
254
return integer - ( integer % Math . pow ( 10 , zeros ) ) ;
255
255
}
256
256
257
257
function toQuantifier ( digits ) {
258
- var start = digits [ 0 ] ;
259
- var stop = digits [ 1 ] ? ( ',' + digits [ 1 ] ) : '' ;
258
+ let start = digits [ 0 ] ;
259
+ let stop = digits [ 1 ] ? ( ',' + digits [ 1 ] ) : '' ;
260
260
if ( ! stop && ( ! start || start === 1 ) ) {
261
261
return '' ;
262
262
}
@@ -273,7 +273,7 @@ function padding(str) {
273
273
274
274
function padZeros ( val , tok ) {
275
275
if ( tok . isPadded ) {
276
- var diff = Math . abs ( tok . maxLen - String ( val ) . length ) ;
276
+ let diff = Math . abs ( tok . maxLen - String ( val ) . length ) ;
277
277
switch ( diff ) {
278
278
case 0 :
279
279
return '' ;
@@ -291,4 +291,5 @@ function padZeros(val, tok) {
291
291
* Expose `toRegexRange`
292
292
*/
293
293
294
+ toRegexRange . clearCache = ( ) => ( toRegexRange . cache = { } ) ;
294
295
module . exports = toRegexRange ;
0 commit comments