1
+ type Rfc3339Extensions = Array < "timezone" | "calendar" > | undefined ;
2
+
1
3
export type JSONDateTimeFormat = {
2
4
name : "datetime" ;
3
5
parts : "datetime" | "date" | "time" ;
4
6
variant : "rfc2822" | "rfc3339" ;
7
+ extensions ?: Rfc3339Extensions ;
5
8
} ;
6
9
7
10
export function inferDatetime ( value : string ) : JSONDateTimeFormat | undefined {
@@ -21,33 +24,37 @@ export function inferDatetime(value: string): JSONDateTimeFormat | undefined {
21
24
}
22
25
23
26
const 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 ) ) \] ) ? $ / ;
25
28
26
29
const 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 ) ) \] ) ? $ / ;
28
31
29
32
const 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 ) ) \] ) ? $ / ;
31
34
32
35
const 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 ) ) \] ) ? $ / ;
34
37
35
38
const rfc3339 = [
36
39
{
37
40
matches : rfc3339WithYmd ,
38
41
parts : rfc3339Parts ,
42
+ extensions : rfc3339Extensions ( 11 , 12 ) ,
39
43
} ,
40
44
{
41
45
matches : rfc3339WithWeekIndex ,
42
46
parts : rfc3339Parts ,
47
+ extensions : rfc3339Extensions ( 11 , 12 ) ,
43
48
} ,
44
49
{
45
50
matches : rfc3339WithOrdinal ,
46
51
parts : rfc3339WithOrdinalParts ,
52
+ extensions : rfc3339Extensions ( 10 , 11 ) ,
47
53
} ,
48
54
{
49
55
matches : rfc3339TimeOnly ,
50
56
parts : ( ) => < const > "time" ,
57
+ extensions : rfc3339Extensions ( 8 , 9 ) ,
51
58
} ,
52
59
] ;
53
60
@@ -57,6 +64,7 @@ function inferRFC3339(value: string): JSONDateTimeFormat | undefined {
57
64
return {
58
65
matches : rfc . matches . exec ( value ) ,
59
66
parts : rfc . parts ,
67
+ extensions : rfc . extensions ,
60
68
} ;
61
69
} )
62
70
. filter ( ( rfc ) => rfc . matches !== null && rfc . matches . some ( ( i ) => i ) ) ;
@@ -72,6 +80,8 @@ function inferRFC3339(value: string): JSONDateTimeFormat | undefined {
72
80
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
73
81
parts : rfc3339BestMatch . parts ( rfc3339BestMatch . matches ! ) ,
74
82
variant : "rfc3339" ,
83
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
84
+ extensions : rfc3339BestMatch . extensions ( rfc3339BestMatch . matches ! ) ,
75
85
} ;
76
86
}
77
87
@@ -92,6 +102,25 @@ function rfc3339Parts(match: RegExpMatchArray): "datetime" | "date" {
92
102
return "date" ;
93
103
}
94
104
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
+
95
124
function rfc3339WithOrdinalParts ( match : RegExpMatchArray ) : "datetime" | "date" {
96
125
const dateParts = [ 1 , 2 ] ;
97
126
const timeParts = [ 3 , 4 , 5 , 6 ] ;
0 commit comments