@@ -118,9 +118,13 @@ type ParseIdentifier<Input extends string> = ReadLetters<Input>
118
118
* - `field`
119
119
* - `field(nodes)`
120
120
* - `field!hint(nodes)`
121
+ * - `field!inner(nodes)`
122
+ * - `field!hint!inner(nodes)`
121
123
* - `renamed_field:field`
122
124
* - `renamed_field:field(nodes)`
123
125
* - `renamed_field:field!hint(nodes)`
126
+ * - `renamed_field:field!inner(nodes)`
127
+ * - `renamed_field:field!hint!inner(nodes)`
124
128
*
125
129
* TODO: casting operators `::text`, JSON operators `->`, `->>`.
126
130
*/
@@ -130,14 +134,63 @@ type ParseNode<Input extends string> = Input extends ''
130
134
Input extends `*${infer Remainder } `
131
135
? [ { star : true } , EatWhitespace < Remainder > ]
132
136
: ParseIdentifier < Input > extends [ infer Name , `${infer Remainder } `]
133
- ? EatWhitespace < Remainder > extends `:${infer Remainder } `
137
+ ? EatWhitespace < Remainder > extends `!inner${infer Remainder } `
138
+ ? ParseEmbeddedResource < EatWhitespace < Remainder > > extends [ infer _Fields , `${infer Remainder } `]
139
+ ? // `field!inner(nodes)`
140
+ [ { name : Name ; foreignTable : true } , EatWhitespace < Remainder > ]
141
+ : ParseEmbeddedResource < EatWhitespace < Remainder > > extends ParserError < string >
142
+ ? ParseEmbeddedResource < EatWhitespace < Remainder > >
143
+ : ParserError < 'Expected embedded resource after `!inner`' >
144
+ : EatWhitespace < Remainder > extends `!${infer Remainder } `
145
+ ? ParseIdentifier < EatWhitespace < Remainder > > extends [ infer _Hint , `${infer Remainder } `]
146
+ ? EatWhitespace < Remainder > extends `!inner${infer Remainder } `
147
+ ? ParseEmbeddedResource < EatWhitespace < Remainder > > extends [
148
+ infer _Fields ,
149
+ `${infer Remainder } `
150
+ ]
151
+ ? // `field!hint!inner(nodes)`
152
+ [ { name : Name ; foreignTable : true } , EatWhitespace < Remainder > ]
153
+ : ParseEmbeddedResource < EatWhitespace < Remainder > > extends ParserError < string >
154
+ ? ParseEmbeddedResource < EatWhitespace < Remainder > >
155
+ : ParserError < 'Expected embedded resource after `!inner`' >
156
+ : ParseEmbeddedResource < EatWhitespace < Remainder > > extends [
157
+ infer _Fields ,
158
+ `${infer Remainder } `
159
+ ]
160
+ ? // `field!hint(nodes)`
161
+ [ { name : Name ; foreignTable : true } , EatWhitespace < Remainder > ]
162
+ : ParseEmbeddedResource < EatWhitespace < Remainder > > extends ParserError < string >
163
+ ? ParseEmbeddedResource < EatWhitespace < Remainder > >
164
+ : ParserError < 'Expected embedded resource after `!hint`' >
165
+ : ParserError < 'Expected identifier after `!`' >
166
+ : EatWhitespace < Remainder > extends `:${infer Remainder } `
134
167
? ParseIdentifier < EatWhitespace < Remainder > > extends [ infer OriginalName , `${infer Remainder } `]
135
- ? EatWhitespace < Remainder > extends `!${infer Remainder } `
168
+ ? EatWhitespace < Remainder > extends `!inner${infer Remainder } `
169
+ ? ParseEmbeddedResource < EatWhitespace < Remainder > > extends [
170
+ infer _Fields ,
171
+ `${infer Remainder } `
172
+ ]
173
+ ? // `renamed_field:field!inner(nodes)`
174
+ [ { name : Name ; foreignTable : true } , EatWhitespace < Remainder > ]
175
+ : ParseEmbeddedResource < EatWhitespace < Remainder > > extends ParserError < string >
176
+ ? ParseEmbeddedResource < EatWhitespace < Remainder > >
177
+ : ParserError < 'Expected embedded resource after `!inner`' >
178
+ : EatWhitespace < Remainder > extends `!${infer Remainder } `
136
179
? ParseIdentifier < EatWhitespace < Remainder > > extends [ infer _Hint , `${infer Remainder } `]
137
- ? ParseEmbeddedResource < EatWhitespace < Remainder > > extends [
138
- infer _Fields ,
139
- `${infer Remainder } `
140
- ]
180
+ ? EatWhitespace < Remainder > extends `!inner${infer Remainder } `
181
+ ? ParseEmbeddedResource < EatWhitespace < Remainder > > extends [
182
+ infer _Fields ,
183
+ `${infer Remainder } `
184
+ ]
185
+ ? // `renamed_field:field!hint!inner(nodes)`
186
+ [ { name : Name ; foreignTable : true } , EatWhitespace < Remainder > ]
187
+ : ParseEmbeddedResource < EatWhitespace < Remainder > > extends ParserError < string >
188
+ ? ParseEmbeddedResource < EatWhitespace < Remainder > >
189
+ : ParserError < 'Expected embedded resource after `!inner`' >
190
+ : ParseEmbeddedResource < EatWhitespace < Remainder > > extends [
191
+ infer _Fields ,
192
+ `${infer Remainder } `
193
+ ]
141
194
? // `renamed_field:field!hint(nodes)`
142
195
[
143
196
{
@@ -161,18 +214,6 @@ type ParseNode<Input extends string> = Input extends ''
161
214
: // `renamed_field:field`
162
215
[ { name : Name ; original : OriginalName } , EatWhitespace < Remainder > ]
163
216
: ParseIdentifier < EatWhitespace < Remainder > >
164
- : EatWhitespace < Remainder > extends `!${infer Remainder } `
165
- ? ParseIdentifier < EatWhitespace < Remainder > > extends [ infer _Hint , `${infer Remainder } `]
166
- ? ParseEmbeddedResource < EatWhitespace < Remainder > > extends [
167
- infer _Fields ,
168
- `${infer Remainder } `
169
- ]
170
- ? // `field!hint(nodes)`
171
- [ { name : Name ; foreignTable : true } , EatWhitespace < Remainder > ]
172
- : ParseEmbeddedResource < EatWhitespace < Remainder > > extends ParserError < string >
173
- ? ParseEmbeddedResource < EatWhitespace < Remainder > >
174
- : ParserError < 'Expected embedded resource after `!hint`' >
175
- : ParserError < 'Expected identifier after `!`' >
176
217
: ParseEmbeddedResource < EatWhitespace < Remainder > > extends [ infer _Fields , `${infer Remainder } `]
177
218
? // `field(nodes)`
178
219
[ { name : Name ; foreignTable : true } , EatWhitespace < Remainder > ]
0 commit comments