1
1
// Credits to @bnjmnt 4n (https://www.npmjs.com/package/postgrest-query)
2
2
3
+ import { GenericSchema } from './types'
4
+
3
5
type Whitespace = ' ' | '\n' | '\t'
4
6
5
7
type LowerAlphabet =
@@ -67,12 +69,25 @@ type EatWhitespace<Input extends string> = string extends Input
67
69
* @param Name Name of the table being queried.
68
70
* @param Field Single field parsed by `ParseQuery`.
69
71
*/
70
- type ConstructFieldDefinition < Row extends Record < string , unknown > , Field > = Field extends {
72
+ type ConstructFieldDefinition <
73
+ Schema extends GenericSchema ,
74
+ Row extends Record < string , unknown > ,
75
+ Field
76
+ > = Field extends {
71
77
star : true
72
78
}
73
79
? Row
74
- : Field extends { name : string ; foreignTable : true }
75
- ? { [ K in Field [ 'name' ] ] : unknown }
80
+ : Field extends { name : string ; original : string ; children : unknown [ ] }
81
+ ? {
82
+ [ _ in Field [ 'name' ] ] : GetResultHelper <
83
+ Schema ,
84
+ ( Schema [ 'Tables' ] & Schema [ 'Views' ] ) [ Field [ 'original' ] ] [ 'Row' ] ,
85
+ Field [ 'children' ] ,
86
+ unknown
87
+ > extends infer Child
88
+ ? Child | Child [ ] | null
89
+ : never
90
+ }
76
91
: Field extends { name : string ; original : string }
77
92
? { [ K in Field [ 'name' ] ] : Row [ Field [ 'original' ] ] }
78
93
: Record < string , unknown >
@@ -135,30 +150,30 @@ type ParseNode<Input extends string> = Input extends ''
135
150
? [ { star : true } , EatWhitespace < Remainder > ]
136
151
: ParseIdentifier < Input > extends [ infer Name , `${infer Remainder } `]
137
152
? EatWhitespace < Remainder > extends `!inner${infer Remainder } `
138
- ? ParseEmbeddedResource < EatWhitespace < Remainder > > extends [ infer _Fields , `${infer Remainder } `]
153
+ ? ParseEmbeddedResource < EatWhitespace < Remainder > > extends [ infer Fields , `${infer Remainder } `]
139
154
? // `field!inner(nodes)`
140
- [ { name : Name ; foreignTable : true } , EatWhitespace < Remainder > ]
155
+ [ { name : Name ; original : Name ; children : Fields } , EatWhitespace < Remainder > ]
141
156
: ParseEmbeddedResource < EatWhitespace < Remainder > > extends ParserError < string >
142
157
? ParseEmbeddedResource < EatWhitespace < Remainder > >
143
158
: ParserError < 'Expected embedded resource after `!inner`' >
144
159
: EatWhitespace < Remainder > extends `!${infer Remainder } `
145
160
? ParseIdentifier < EatWhitespace < Remainder > > extends [ infer _Hint , `${infer Remainder } `]
146
161
? EatWhitespace < Remainder > extends `!inner${infer Remainder } `
147
162
? ParseEmbeddedResource < EatWhitespace < Remainder > > extends [
148
- infer _Fields ,
163
+ infer Fields ,
149
164
`${infer Remainder } `
150
165
]
151
166
? // `field!hint!inner(nodes)`
152
- [ { name : Name ; foreignTable : true } , EatWhitespace < Remainder > ]
167
+ [ { name : Name ; original : Name ; children : Fields } , EatWhitespace < Remainder > ]
153
168
: ParseEmbeddedResource < EatWhitespace < Remainder > > extends ParserError < string >
154
169
? ParseEmbeddedResource < EatWhitespace < Remainder > >
155
170
: ParserError < 'Expected embedded resource after `!inner`' >
156
171
: ParseEmbeddedResource < EatWhitespace < Remainder > > extends [
157
- infer _Fields ,
172
+ infer Fields ,
158
173
`${infer Remainder } `
159
174
]
160
175
? // `field!hint(nodes)`
161
- [ { name : Name ; foreignTable : true } , EatWhitespace < Remainder > ]
176
+ [ { name : Name ; original : Name ; children : Fields } , EatWhitespace < Remainder > ]
162
177
: ParseEmbeddedResource < EatWhitespace < Remainder > > extends ParserError < string >
163
178
? ParseEmbeddedResource < EatWhitespace < Remainder > >
164
179
: ParserError < 'Expected embedded resource after `!hint`' >
@@ -167,35 +182,36 @@ type ParseNode<Input extends string> = Input extends ''
167
182
? ParseIdentifier < EatWhitespace < Remainder > > extends [ infer OriginalName , `${infer Remainder } `]
168
183
? EatWhitespace < Remainder > extends `!inner${infer Remainder } `
169
184
? ParseEmbeddedResource < EatWhitespace < Remainder > > extends [
170
- infer _Fields ,
185
+ infer Fields ,
171
186
`${infer Remainder } `
172
187
]
173
188
? // `renamed_field:field!inner(nodes)`
174
- [ { name : Name ; foreignTable : true } , EatWhitespace < Remainder > ]
189
+ [ { name : Name ; original : OriginalName ; children : Fields } , EatWhitespace < Remainder > ]
175
190
: ParseEmbeddedResource < EatWhitespace < Remainder > > extends ParserError < string >
176
191
? ParseEmbeddedResource < EatWhitespace < Remainder > >
177
192
: ParserError < 'Expected embedded resource after `!inner`' >
178
193
: EatWhitespace < Remainder > extends `!${infer Remainder } `
179
194
? ParseIdentifier < EatWhitespace < Remainder > > extends [ infer _Hint , `${infer Remainder } `]
180
195
? EatWhitespace < Remainder > extends `!inner${infer Remainder } `
181
196
? ParseEmbeddedResource < EatWhitespace < Remainder > > extends [
182
- infer _Fields ,
197
+ infer Fields ,
183
198
`${infer Remainder } `
184
199
]
185
200
? // `renamed_field:field!hint!inner(nodes)`
186
- [ { name : Name ; foreignTable : true } , EatWhitespace < Remainder > ]
201
+ [ { name : Name ; original : OriginalName ; children : Fields } , EatWhitespace < Remainder > ]
187
202
: ParseEmbeddedResource < EatWhitespace < Remainder > > extends ParserError < string >
188
203
? ParseEmbeddedResource < EatWhitespace < Remainder > >
189
204
: ParserError < 'Expected embedded resource after `!inner`' >
190
205
: ParseEmbeddedResource < EatWhitespace < Remainder > > extends [
191
- infer _Fields ,
206
+ infer Fields ,
192
207
`${infer Remainder } `
193
208
]
194
209
? // `renamed_field:field!hint(nodes)`
195
210
[
196
211
{
197
212
name : Name
198
- foreignTable : true
213
+ original : OriginalName
214
+ children : Fields
199
215
} ,
200
216
EatWhitespace < Remainder >
201
217
]
@@ -204,19 +220,19 @@ type ParseNode<Input extends string> = Input extends ''
204
220
: ParserError < 'Expected embedded resource after `!hint`' >
205
221
: ParserError < 'Expected identifier after `!`' >
206
222
: ParseEmbeddedResource < EatWhitespace < Remainder > > extends [
207
- infer _Fields ,
223
+ infer Fields ,
208
224
`${infer Remainder } `
209
225
]
210
226
? // `renamed_field:field(nodes)`
211
- [ { name : Name ; foreignTable : true } , EatWhitespace < Remainder > ]
227
+ [ { name : Name ; original : OriginalName ; children : Fields } , EatWhitespace < Remainder > ]
212
228
: ParseEmbeddedResource < EatWhitespace < Remainder > > extends ParserError < string >
213
229
? ParseEmbeddedResource < EatWhitespace < Remainder > >
214
230
: // `renamed_field:field`
215
231
[ { name : Name ; original : OriginalName } , EatWhitespace < Remainder > ]
216
232
: ParseIdentifier < EatWhitespace < Remainder > >
217
- : ParseEmbeddedResource < EatWhitespace < Remainder > > extends [ infer _Fields , `${infer Remainder } `]
233
+ : ParseEmbeddedResource < EatWhitespace < Remainder > > extends [ infer Fields , `${infer Remainder } `]
218
234
? // `field(nodes)`
219
- [ { name : Name ; foreignTable : true } , EatWhitespace < Remainder > ]
235
+ [ { name : Name ; original : Name ; children : Fields } , EatWhitespace < Remainder > ]
220
236
: ParseEmbeddedResource < EatWhitespace < Remainder > > extends ParserError < string >
221
237
? ParseEmbeddedResource < EatWhitespace < Remainder > >
222
238
: // `field`
@@ -274,13 +290,14 @@ type ParseQuery<Query extends string> = string extends Query
274
290
: ParseNodes < EatWhitespace < Query > >
275
291
276
292
type GetResultHelper <
293
+ Schema extends GenericSchema ,
277
294
Row extends Record < string , unknown > ,
278
295
Fields extends unknown [ ] ,
279
296
Acc
280
297
> = Fields extends [ infer R ]
281
- ? GetResultHelper < Row , [ ] , ConstructFieldDefinition < Row , R > & Acc >
298
+ ? GetResultHelper < Schema , Row , [ ] , ConstructFieldDefinition < Schema , Row , R > & Acc >
282
299
: Fields extends [ infer R , ...infer Rest ]
283
- ? GetResultHelper < Row , Rest , ConstructFieldDefinition < Row , R > & Acc >
300
+ ? GetResultHelper < Schema , Row , Rest , ConstructFieldDefinition < Schema , Row , R > & Acc >
284
301
: Acc
285
302
286
303
/**
@@ -290,8 +307,9 @@ type GetResultHelper<
290
307
* @param Query Select query string literal to parse.
291
308
*/
292
309
export type GetResult <
310
+ Schema extends GenericSchema ,
293
311
Row extends Record < string , unknown > ,
294
312
Query extends string
295
313
> = ParseQuery < Query > extends unknown [ ]
296
- ? GetResultHelper < Row , ParseQuery < Query > , unknown >
314
+ ? GetResultHelper < Schema , Row , ParseQuery < Query > , unknown >
297
315
: ParseQuery < Query >
0 commit comments