@@ -62,7 +62,7 @@ export const fullFormats: DefinedFormats = {
6262 hostname :
6363 / ^ (? = .{ 1 , 253 } \. ? $ ) [ a - z 0 - 9 ] (?: [ a - z 0 - 9 - ] { 0 , 61 } [ a - z 0 - 9 ] ) ? (?: \. [ a - z 0 - 9 ] (?: [ - 0 - 9 a - z ] { 0 , 61 } [ 0 - 9 a - z ] ) ? ) * \. ? $ / i,
6464 // optimized https://www.safaribooksonline.com/library/view/regular-expressions-cookbook/9780596802837/ch07s16.html
65- ipv4 : / ^ (?: (?: 2 5 [ 0 - 5 ] | 2 [ 0 - 4 ] \d | [ 0 1 ] ? \d \d ? ) \. ) { 3 } (?: 2 5 [ 0 - 5 ] | 2 [ 0 - 4 ] \d | [ 0 1 ] ? \d \d ? ) $ / ,
65+ ipv4 : / ^ (?: (?: 2 5 [ 0 - 5 ] | 2 [ 0 - 4 ] \d | 1 \d \d | [ 1 - 9 ] ? \d ) \. ) { 3 } (?: 2 5 [ 0 - 5 ] | 2 [ 0 - 4 ] \d | 1 \d \d | [ 1 - 9 ] ? \d ) $ / ,
6666 ipv6 : / ^ ( ( ( [ 0 - 9 a - f ] { 1 , 4 } : ) { 7 } ( [ 0 - 9 a - f ] { 1 , 4 } | : ) ) | ( ( [ 0 - 9 a - f ] { 1 , 4 } : ) { 6 } ( : [ 0 - 9 a - f ] { 1 , 4 } | ( ( 2 5 [ 0 - 5 ] | 2 [ 0 - 4 ] \d | 1 \d \d | [ 1 - 9 ] ? \d ) ( \. ( 2 5 [ 0 - 5 ] | 2 [ 0 - 4 ] \d | 1 \d \d | [ 1 - 9 ] ? \d ) ) { 3 } ) | : ) ) | ( ( [ 0 - 9 a - f ] { 1 , 4 } : ) { 5 } ( ( ( : [ 0 - 9 a - f ] { 1 , 4 } ) { 1 , 2 } ) | : ( ( 2 5 [ 0 - 5 ] | 2 [ 0 - 4 ] \d | 1 \d \d | [ 1 - 9 ] ? \d ) ( \. ( 2 5 [ 0 - 5 ] | 2 [ 0 - 4 ] \d | 1 \d \d | [ 1 - 9 ] ? \d ) ) { 3 } ) | : ) ) | ( ( [ 0 - 9 a - f ] { 1 , 4 } : ) { 4 } ( ( ( : [ 0 - 9 a - f ] { 1 , 4 } ) { 1 , 3 } ) | ( ( : [ 0 - 9 a - f ] { 1 , 4 } ) ? : ( ( 2 5 [ 0 - 5 ] | 2 [ 0 - 4 ] \d | 1 \d \d | [ 1 - 9 ] ? \d ) ( \. ( 2 5 [ 0 - 5 ] | 2 [ 0 - 4 ] \d | 1 \d \d | [ 1 - 9 ] ? \d ) ) { 3 } ) ) | : ) ) | ( ( [ 0 - 9 a - f ] { 1 , 4 } : ) { 3 } ( ( ( : [ 0 - 9 a - f ] { 1 , 4 } ) { 1 , 4 } ) | ( ( : [ 0 - 9 a - f ] { 1 , 4 } ) { 0 , 2 } : ( ( 2 5 [ 0 - 5 ] | 2 [ 0 - 4 ] \d | 1 \d \d | [ 1 - 9 ] ? \d ) ( \. ( 2 5 [ 0 - 5 ] | 2 [ 0 - 4 ] \d | 1 \d \d | [ 1 - 9 ] ? \d ) ) { 3 } ) ) | : ) ) | ( ( [ 0 - 9 a - f ] { 1 , 4 } : ) { 2 } ( ( ( : [ 0 - 9 a - f ] { 1 , 4 } ) { 1 , 5 } ) | ( ( : [ 0 - 9 a - f ] { 1 , 4 } ) { 0 , 3 } : ( ( 2 5 [ 0 - 5 ] | 2 [ 0 - 4 ] \d | 1 \d \d | [ 1 - 9 ] ? \d ) ( \. ( 2 5 [ 0 - 5 ] | 2 [ 0 - 4 ] \d | 1 \d \d | [ 1 - 9 ] ? \d ) ) { 3 } ) ) | : ) ) | ( ( [ 0 - 9 a - f ] { 1 , 4 } : ) { 1 } ( ( ( : [ 0 - 9 a - f ] { 1 , 4 } ) { 1 , 6 } ) | ( ( : [ 0 - 9 a - f ] { 1 , 4 } ) { 0 , 4 } : ( ( 2 5 [ 0 - 5 ] | 2 [ 0 - 4 ] \d | 1 \d \d | [ 1 - 9 ] ? \d ) ( \. ( 2 5 [ 0 - 5 ] | 2 [ 0 - 4 ] \d | 1 \d \d | [ 1 - 9 ] ? \d ) ) { 3 } ) ) | : ) ) | ( : ( ( ( : [ 0 - 9 a - f ] { 1 , 4 } ) { 1 , 7 } ) | ( ( : [ 0 - 9 a - f ] { 1 , 4 } ) { 0 , 5 } : ( ( 2 5 [ 0 - 5 ] | 2 [ 0 - 4 ] \d | 1 \d \d | [ 1 - 9 ] ? \d ) ( \. ( 2 5 [ 0 - 5 ] | 2 [ 0 - 4 ] \d | 1 \d \d | [ 1 - 9 ] ? \d ) ) { 3 } ) ) | : ) ) ) $ / i,
6767 regex,
6868 // uuid: http://tools.ietf.org/html/rfc4122
@@ -149,7 +149,7 @@ function compareDate(d1: string, d2: string): number | undefined {
149149 return 0
150150}
151151
152- const TIME = / ^ ( \d \d ) : ( \d \d ) : ( \d \d (?: \. \d + ) ? ) ( z | ( [ + - ] \d \d ) (?: : ? ( \d \d ) ) ? ) ? $ / i
152+ const TIME = / ^ ( \d \d ) : ( \d \d ) : ( \d \d (?: \. \d + ) ? ) ( z | ( [ + - ] ) ( \d \d ) (?: : ? ( \d \d ) ) ? ) ? $ / i
153153
154154function time ( str : string , withTimeZone ?: boolean , strictTime ?: boolean ) : boolean {
155155 const matches : string [ ] | null = TIME . exec ( str )
@@ -158,14 +158,15 @@ function time(str: string, withTimeZone?: boolean, strictTime?: boolean): boolea
158158 const min : number = + matches [ 2 ]
159159 const sec : number = + matches [ 3 ]
160160 const tz : string | undefined = matches [ 4 ]
161- const tzH : number = + ( matches [ 5 ] || 0 )
162- const tzM : number = + ( matches [ 6 ] || 0 )
163- return (
164- ( ( hr <= 23 && min <= 59 && sec < 60 && tzH <= 24 && tzM < 60 ) ||
165- // leap second
166- ( hr - tzH === 23 && min - tzM === 59 && sec < 61 && tzH <= 24 && tzM < 60 ) ) &&
167- ( ! withTimeZone || ( tz !== "" && ( ! strictTime || ! ! tz ) ) )
168- )
161+ const tzSign : number = matches [ 5 ] === "-" ? - 1 : 1
162+ const tzH : number = + ( matches [ 6 ] || 0 )
163+ const tzM : number = + ( matches [ 7 ] || 0 )
164+ if ( tzH > 23 || tzM > 59 || ( withTimeZone && ( tz === "" || ( strictTime && ! tz ) ) ) ) return false
165+ if ( hr <= 23 && min <= 59 && sec < 60 ) return true
166+ // leap second
167+ const utcMin = min - tzM * tzSign
168+ const utcHr = hr - tzH * tzSign - ( utcMin < 0 ? 1 : 0 )
169+ return ( utcHr === 23 || utcHr === - 1 ) && ( utcMin === 59 || utcMin === - 1 ) && sec < 61
169170}
170171
171172function strict_time ( str : string ) : boolean {
0 commit comments