1+ type Rfc3339Extensions = Array < "timezone" | "calendar" > | undefined ;
2+
13export type JSONDateTimeFormat = {
24 name : "datetime" ;
35 parts : "datetime" | "date" | "time" ;
46 variant : "rfc2822" | "rfc3339" ;
7+ extensions ?: Rfc3339Extensions ;
58} ;
69
710export function inferDatetime ( value : string ) : JSONDateTimeFormat | undefined {
@@ -21,33 +24,37 @@ export function inferDatetime(value: string): JSONDateTimeFormat | undefined {
2124}
2225
2326const rfc3339WithYmd =
24- / ^ ( [ + - ] \d { 6 } | \d { 4 } ) (?: - ? ( \d \d ) (?: - ? ( \d \d ) ) ? ) ? (?: [ T \s ] ( \d \d ) (?: : ? ( \d \d ) (?: : ? ( \d \d ) (?: [ . , ] ( \d { 1 , 30 } ) ) ? ) ? ) ? (?: ( Z ? ) | ( [ + - ] \d \d ) (?: : ? ( \d \d ) ) ? ) ) ? $ / ;
27+ / ^ ( [ + - ] \d { 6 } | \d { 4 } ) (?: - ? ( \d \d ) (?: - ? ( \d \d ) ) ? ) ? (?: [ T \s ] ( \d \d ) (?: : ? ( \d \d ) (?: : ? ( \d \d ) (?: [ . , ] ( \d { 1 , 30 } ) ) ? ) ? ) ? (?: ( Z ? ) | ( [ + - ] \d \d ) (?: : ? ( \d \d ) ) ? ) ) ? (?: \[ ( [ A - Z a - z / _ - ] + ) \] ) ? (?: \[ ( u - c a = (?: b u d d h i s t | c h i n e s e | c o p t i c | d a n g i | e t h i o a a | e t h i o p i c | g r e g o r y | h e b r e w | i n d i a n | i s l a m i c | i s l a m i c - u m a l q u r a | i s l a m i c - t b l a | i s l a m i c - c i v i l | i s l a m i c - r g s a | i s l a m i c c | i s o 8 6 0 1 | j a p a n e s e | p e r s i a n | r o c ) ) \] ) ? $ / ;
2528
2629const rfc3339WithWeekIndex =
27- / ^ ( \d { 4 } ) - ? W ( \d \d ) (?: - ? ( \d ) ) ? (?: [ T \s ] ( \d \d ) (?: : ? ( \d \d ) (?: : ? ( \d \d ) (?: [ . , ] ( \d { 1 , 30 } ) ) ? ) ? ) ? (?: ( Z ? ) | ( [ + - ] \d \d ) (?: : ? ( \d \d ) ) ? ) ) ? $ / ;
30+ / ^ ( \d { 4 } ) - ? W ( \d \d ) (?: - ? ( \d ) ) ? (?: [ T \s ] ( \d \d ) (?: : ? ( \d \d ) (?: : ? ( \d \d ) (?: [ . , ] ( \d { 1 , 30 } ) ) ? ) ? ) ? (?: ( Z ? ) | ( [ + - ] \d \d ) (?: : ? ( \d \d ) ) ? ) ) ? (?: \[ ( [ A - Z a - z / _ - ] + ) \] ) ? (?: \[ ( u - c a = (?: b u d d h i s t | c h i n e s e | c o p t i c | d a n g i | e t h i o a a | e t h i o p i c | g r e g o r y | h e b r e w | i n d i a n | i s l a m i c | i s l a m i c - u m a l q u r a | i s l a m i c - t b l a | i s l a m i c - c i v i l | i s l a m i c - r g s a | i s l a m i c c | i s o 8 6 0 1 | j a p a n e s e | p e r s i a n | r o c ) ) \] ) ? $ / ;
2831
2932const rfc3339WithOrdinal =
30- / ^ ( \d { 4 } ) - ? ( \d { 3 } ) ? (?: [ T \s ] ( \d \d ) (?: : ? ( \d \d ) (?: : ? ( \d \d ) (?: [ . , ] ( \d { 1 , 30 } ) ) ? ) ? ) ? (?: ( Z ? ) | ( [ + - ] \d \d ) (?: : ? ( \d \d ) ) ? ) ) ? $ / ;
33+ / ^ ( \d { 4 } ) - ? ( \d { 3 } ) ? (?: [ T \s ] ( \d \d ) (?: : ? ( \d \d ) (?: : ? ( \d \d ) (?: [ . , ] ( \d { 1 , 30 } ) ) ? ) ? ) ? (?: ( Z ? ) | ( [ + - ] \d \d ) (?: : ? ( \d \d ) ) ? ) ) ? (?: \[ ( [ A - Z a - z / _ - ] + ) \] ) ? (?: \[ ( u - c a = (?: b u d d h i s t | c h i n e s e | c o p t i c | d a n g i | e t h i o a a | e t h i o p i c | g r e g o r y | h e b r e w | i n d i a n | i s l a m i c | i s l a m i c - u m a l q u r a | i s l a m i c - t b l a | i s l a m i c - c i v i l | i s l a m i c - r g s a | i s l a m i c c | i s o 8 6 0 1 | j a p a n e s e | p e r s i a n | r o c ) ) \] ) ? $ / ;
3134
3235const rfc3339TimeOnly =
33- / ^ (?: ( \d \d ) (?: : ? ( \d \d ) (?: : ? ( \d \d ) (?: [ . , ] ( \d { 1 , 30 } ) ) ? ) ? ) ? (?: ( Z ? ) | ( [ + - ] \d \d ) (?: : ? ( \d \d ) ) ? ) ) ? $ / ;
36+ / ^ (?: ( \d \d ) (?: : ? ( \d \d ) (?: : ? ( \d \d ) (?: [ . , ] ( \d { 1 , 30 } ) ) ? ) ? ) ? (?: ( Z ? ) | ( [ + - ] \d \d ) (?: : ? ( \d \d ) ) ? ) ) ? (?: \[ ( [ A - Z a - z / _ - ] + ) \] ) ? (?: \[ ( u - c a = (?: b u d d h i s t | c h i n e s e | c o p t i c | d a n g i | e t h i o a a | e t h i o p i c | g r e g o r y | h e b r e w | i n d i a n | i s l a m i c | i s l a m i c - u m a l q u r a | i s l a m i c - t b l a | i s l a m i c - c i v i l | i s l a m i c - r g s a | i s l a m i c c | i s o 8 6 0 1 | j a p a n e s e | p e r s i a n | r o c ) ) \] ) ? $ / ;
3437
3538const rfc3339 = [
3639 {
3740 matches : rfc3339WithYmd ,
3841 parts : rfc3339Parts ,
42+ extensions : rfc3339Extensions ( 11 , 12 ) ,
3943 } ,
4044 {
4145 matches : rfc3339WithWeekIndex ,
4246 parts : rfc3339Parts ,
47+ extensions : rfc3339Extensions ( 11 , 12 ) ,
4348 } ,
4449 {
4550 matches : rfc3339WithOrdinal ,
4651 parts : rfc3339WithOrdinalParts ,
52+ extensions : rfc3339Extensions ( 10 , 11 ) ,
4753 } ,
4854 {
4955 matches : rfc3339TimeOnly ,
5056 parts : ( ) => < const > "time" ,
57+ extensions : rfc3339Extensions ( 8 , 9 ) ,
5158 } ,
5259] ;
5360
@@ -57,6 +64,7 @@ function inferRFC3339(value: string): JSONDateTimeFormat | undefined {
5764 return {
5865 matches : rfc . matches . exec ( value ) ,
5966 parts : rfc . parts ,
67+ extensions : rfc . extensions ,
6068 } ;
6169 } )
6270 . filter ( ( rfc ) => rfc . matches !== null && rfc . matches . some ( ( i ) => i ) ) ;
@@ -72,6 +80,8 @@ function inferRFC3339(value: string): JSONDateTimeFormat | undefined {
7280 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
7381 parts : rfc3339BestMatch . parts ( rfc3339BestMatch . matches ! ) ,
7482 variant : "rfc3339" ,
83+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
84+ extensions : rfc3339BestMatch . extensions ( rfc3339BestMatch . matches ! ) ,
7585 } ;
7686 }
7787
@@ -92,6 +102,25 @@ function rfc3339Parts(match: RegExpMatchArray): "datetime" | "date" {
92102 return "date" ;
93103}
94104
105+ function rfc3339Extensions (
106+ timezoneIndex = 11 ,
107+ calendarIndex = 12 ,
108+ ) : ( match : RegExpMatchArray ) => Rfc3339Extensions {
109+ return ( match : RegExpMatchArray ) : Rfc3339Extensions => {
110+ const extensions : Array < "timezone" | "calendar" > = [ ] ;
111+
112+ if ( match [ timezoneIndex ] !== undefined ) {
113+ extensions . push ( "timezone" ) ;
114+ }
115+
116+ if ( match [ calendarIndex ] !== undefined ) {
117+ extensions . push ( "calendar" ) ;
118+ }
119+
120+ return extensions . length > 0 ? extensions : undefined ;
121+ } ;
122+ }
123+
95124function rfc3339WithOrdinalParts ( match : RegExpMatchArray ) : "datetime" | "date" {
96125 const dateParts = [ 1 , 2 ] ;
97126 const timeParts = [ 3 , 4 , 5 , 6 ] ;
0 commit comments