@supabase/postgrest-js 1.17.2 → 1.17.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/select-query-parser/parser.d.ts +17 -35
- package/dist/cjs/select-query-parser/parser.d.ts.map +1 -1
- package/dist/cjs/select-query-parser/result.d.ts +4 -4
- package/dist/cjs/select-query-parser/result.d.ts.map +1 -1
- package/dist/cjs/select-query-parser/utils.d.ts +43 -42
- package/dist/cjs/select-query-parser/utils.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/select-query-parser/parser.ts +58 -54
- package/src/select-query-parser/result.ts +43 -27
- package/src/select-query-parser/utils.ts +197 -178
- package/src/version.ts +1 -1
|
@@ -12,10 +12,12 @@ import { SimplifyDeep } from '../types'
|
|
|
12
12
|
*/
|
|
13
13
|
export type ParseQuery<Query extends string> = string extends Query
|
|
14
14
|
? GenericStringError
|
|
15
|
-
: ParseNodes<EatWhitespace<Query>> extends [infer Nodes
|
|
16
|
-
?
|
|
17
|
-
?
|
|
18
|
-
|
|
15
|
+
: ParseNodes<EatWhitespace<Query>> extends [infer Nodes, `${infer Remainder}`]
|
|
16
|
+
? Nodes extends Ast.Node[]
|
|
17
|
+
? EatWhitespace<Remainder> extends ''
|
|
18
|
+
? SimplifyDeep<Nodes>
|
|
19
|
+
: ParserError<`Unexpected input: ${Remainder}`>
|
|
20
|
+
: ParserError<'Invalid nodes array structure'>
|
|
19
21
|
: ParseNodes<EatWhitespace<Query>>
|
|
20
22
|
|
|
21
23
|
/**
|
|
@@ -34,14 +36,15 @@ type ParseNodes<Input extends string> = string extends Input
|
|
|
34
36
|
: ParseNodesHelper<Input, []>
|
|
35
37
|
|
|
36
38
|
type ParseNodesHelper<Input extends string, Nodes extends Ast.Node[]> = ParseNode<Input> extends [
|
|
37
|
-
infer Node
|
|
39
|
+
infer Node,
|
|
38
40
|
`${infer Remainder}`
|
|
39
41
|
]
|
|
40
|
-
?
|
|
41
|
-
?
|
|
42
|
-
|
|
42
|
+
? Node extends Ast.Node
|
|
43
|
+
? EatWhitespace<Remainder> extends `,${infer Remainder}`
|
|
44
|
+
? ParseNodesHelper<EatWhitespace<Remainder>, [...Nodes, Node]>
|
|
45
|
+
: [[...Nodes, Node], EatWhitespace<Remainder>]
|
|
46
|
+
: ParserError<'Invalid node type in nodes helper'>
|
|
43
47
|
: ParseNode<Input>
|
|
44
|
-
|
|
45
48
|
/**
|
|
46
49
|
* Parses a node.
|
|
47
50
|
* A node is one of the following:
|
|
@@ -57,11 +60,10 @@ type ParseNode<Input extends string> = Input extends ''
|
|
|
57
60
|
? [Ast.StarNode, EatWhitespace<Remainder>]
|
|
58
61
|
: // `...field`
|
|
59
62
|
Input extends `...${infer Remainder}`
|
|
60
|
-
? ParseField<EatWhitespace<Remainder>> extends [
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
? [{ type: 'spread'; target: TargetField }, EatWhitespace<Remainder>]
|
|
63
|
+
? ParseField<EatWhitespace<Remainder>> extends [infer TargetField, `${infer Remainder}`]
|
|
64
|
+
? TargetField extends Ast.FieldNode
|
|
65
|
+
? [{ type: 'spread'; target: TargetField }, EatWhitespace<Remainder>]
|
|
66
|
+
: ParserError<'Invalid target field type in spread'>
|
|
65
67
|
: ParserError<`Unable to parse spread resource at \`${Input}\``>
|
|
66
68
|
: ParseIdentifier<Input> extends [infer NameOrAlias, `${infer Remainder}`]
|
|
67
69
|
? EatWhitespace<Remainder> extends `::${infer _}`
|
|
@@ -69,11 +71,10 @@ type ParseNode<Input extends string> = Input extends ''
|
|
|
69
71
|
ParseField<Input>
|
|
70
72
|
: EatWhitespace<Remainder> extends `:${infer Remainder}`
|
|
71
73
|
? // `alias:`
|
|
72
|
-
ParseField<EatWhitespace<Remainder>> extends [
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
? [Omit<Field, 'alias'> & { alias: NameOrAlias }, EatWhitespace<Remainder>]
|
|
74
|
+
ParseField<EatWhitespace<Remainder>> extends [infer Field, `${infer Remainder}`]
|
|
75
|
+
? Field extends Ast.FieldNode
|
|
76
|
+
? [Omit<Field, 'alias'> & { alias: NameOrAlias }, EatWhitespace<Remainder>]
|
|
77
|
+
: ParserError<'Invalid field type in alias parsing'>
|
|
77
78
|
: ParserError<`Unable to parse renamed field at \`${Input}\``>
|
|
78
79
|
: // Otherwise, just parse it as a field without alias.
|
|
79
80
|
ParseField<Input>
|
|
@@ -98,24 +99,22 @@ type ParseField<Input extends string> = Input extends ''
|
|
|
98
99
|
? Name extends 'count'
|
|
99
100
|
? ParseCountField<Input>
|
|
100
101
|
: Remainder extends `!inner${infer Remainder}`
|
|
101
|
-
? ParseEmbeddedResource<EatWhitespace<Remainder>> extends [
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
[{ type: 'field'; name: Name; innerJoin: true; children: Children }, Remainder]
|
|
102
|
+
? ParseEmbeddedResource<EatWhitespace<Remainder>> extends [infer Children, `${infer Remainder}`]
|
|
103
|
+
? Children extends Ast.Node[]
|
|
104
|
+
? // `field!inner(nodes)`
|
|
105
|
+
[{ type: 'field'; name: Name; innerJoin: true; children: Children }, Remainder]
|
|
106
|
+
: ParserError<'Invalid children array in inner join'>
|
|
107
107
|
: CreateParserErrorIfRequired<
|
|
108
108
|
ParseEmbeddedResource<EatWhitespace<Remainder>>,
|
|
109
109
|
`Expected embedded resource after "!inner" at \`${Remainder}\``
|
|
110
110
|
>
|
|
111
111
|
: EatWhitespace<Remainder> extends `!left${infer Remainder}`
|
|
112
|
-
? ParseEmbeddedResource<EatWhitespace<Remainder>> extends [
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
[{ type: 'field'; name: Name; children: Children }, EatWhitespace<Remainder>]
|
|
112
|
+
? ParseEmbeddedResource<EatWhitespace<Remainder>> extends [infer Children, `${infer Remainder}`]
|
|
113
|
+
? Children extends Ast.Node[]
|
|
114
|
+
? // `field!left(nodes)`
|
|
115
|
+
// !left is a noise word - treat it the same way as a non-`!inner`.
|
|
116
|
+
[{ type: 'field'; name: Name; children: Children }, EatWhitespace<Remainder>]
|
|
117
|
+
: ParserError<'Invalid children array in left join'>
|
|
119
118
|
: CreateParserErrorIfRequired<
|
|
120
119
|
ParseEmbeddedResource<EatWhitespace<Remainder>>,
|
|
121
120
|
`Expected embedded resource after "!left" at \`${EatWhitespace<Remainder>}\``
|
|
@@ -124,30 +123,36 @@ type ParseField<Input extends string> = Input extends ''
|
|
|
124
123
|
? ParseIdentifier<EatWhitespace<Remainder>> extends [infer Hint, `${infer Remainder}`]
|
|
125
124
|
? EatWhitespace<Remainder> extends `!inner${infer Remainder}`
|
|
126
125
|
? ParseEmbeddedResource<EatWhitespace<Remainder>> extends [
|
|
127
|
-
infer Children
|
|
126
|
+
infer Children,
|
|
128
127
|
`${infer Remainder}`
|
|
129
128
|
]
|
|
130
|
-
?
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
129
|
+
? Children extends Ast.Node[]
|
|
130
|
+
? // `field!hint!inner(nodes)`
|
|
131
|
+
[
|
|
132
|
+
{ type: 'field'; name: Name; hint: Hint; innerJoin: true; children: Children },
|
|
133
|
+
EatWhitespace<Remainder>
|
|
134
|
+
]
|
|
135
|
+
: ParserError<'Invalid children array in hint inner join'>
|
|
135
136
|
: ParseEmbeddedResource<EatWhitespace<Remainder>>
|
|
136
137
|
: ParseEmbeddedResource<EatWhitespace<Remainder>> extends [
|
|
137
|
-
infer Children
|
|
138
|
+
infer Children,
|
|
138
139
|
`${infer Remainder}`
|
|
139
140
|
]
|
|
140
|
-
?
|
|
141
|
-
|
|
141
|
+
? Children extends Ast.Node[]
|
|
142
|
+
? // `field!hint(nodes)`
|
|
143
|
+
[
|
|
144
|
+
{ type: 'field'; name: Name; hint: Hint; children: Children },
|
|
145
|
+
EatWhitespace<Remainder>
|
|
146
|
+
]
|
|
147
|
+
: ParserError<'Invalid children array in hint'>
|
|
142
148
|
: ParseEmbeddedResource<EatWhitespace<Remainder>>
|
|
143
149
|
: ParserError<`Expected identifier after "!" at \`${EatWhitespace<Remainder>}\``>
|
|
144
150
|
: EatWhitespace<Remainder> extends `(${infer _}`
|
|
145
|
-
? ParseEmbeddedResource<EatWhitespace<Remainder>> extends [
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
[{ type: 'field'; name: Name; children: Children }, EatWhitespace<Remainder>]
|
|
151
|
+
? ParseEmbeddedResource<EatWhitespace<Remainder>> extends [infer Children, `${infer Remainder}`]
|
|
152
|
+
? Children extends Ast.Node[]
|
|
153
|
+
? // `field(nodes)`
|
|
154
|
+
[{ type: 'field'; name: Name; children: Children }, EatWhitespace<Remainder>]
|
|
155
|
+
: ParserError<'Invalid children array in field'>
|
|
151
156
|
: // Return error if start of embedded resource was detected but not found.
|
|
152
157
|
ParseEmbeddedResource<EatWhitespace<Remainder>>
|
|
153
158
|
: // Otherwise it's a non-embedded resource field.
|
|
@@ -184,13 +189,12 @@ type ParseCountField<Input extends string> = ParseIdentifier<Input> extends [
|
|
|
184
189
|
type ParseEmbeddedResource<Input extends string> = Input extends `(${infer Remainder}`
|
|
185
190
|
? EatWhitespace<Remainder> extends `)${infer Remainder}`
|
|
186
191
|
? [[], EatWhitespace<Remainder>]
|
|
187
|
-
: ParseNodes<EatWhitespace<Remainder>> extends [
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
: ParserError<`Expected ")" at \`${EatWhitespace<Remainder>}\``>
|
|
192
|
+
: ParseNodes<EatWhitespace<Remainder>> extends [infer Nodes, `${infer Remainder}`]
|
|
193
|
+
? Nodes extends Ast.Node[]
|
|
194
|
+
? EatWhitespace<Remainder> extends `)${infer Remainder}`
|
|
195
|
+
? [Nodes, EatWhitespace<Remainder>]
|
|
196
|
+
: ParserError<`Expected ")" at \`${EatWhitespace<Remainder>}\``>
|
|
197
|
+
: ParserError<'Invalid nodes array in embedded resource'>
|
|
194
198
|
: ParseNodes<EatWhitespace<Remainder>>
|
|
195
199
|
: ParserError<`Expected "(" at \`${Input}\``>
|
|
196
200
|
|
|
@@ -35,14 +35,18 @@ export type GetResult<
|
|
|
35
35
|
Relationships,
|
|
36
36
|
Query extends string
|
|
37
37
|
> = IsAny<Schema> extends true
|
|
38
|
-
? ParseQuery<Query> extends infer ParsedQuery
|
|
39
|
-
?
|
|
40
|
-
?
|
|
41
|
-
|
|
38
|
+
? ParseQuery<Query> extends infer ParsedQuery
|
|
39
|
+
? ParsedQuery extends Ast.Node[]
|
|
40
|
+
? RelationName extends string
|
|
41
|
+
? ProcessNodesWithoutSchema<ParsedQuery>
|
|
42
|
+
: any
|
|
43
|
+
: ParsedQuery
|
|
42
44
|
: any
|
|
43
45
|
: Relationships extends null // For .rpc calls the passed relationships will be null in that case, the result will always be the function return type
|
|
44
|
-
? ParseQuery<Query> extends infer ParsedQuery
|
|
45
|
-
?
|
|
46
|
+
? ParseQuery<Query> extends infer ParsedQuery
|
|
47
|
+
? ParsedQuery extends Ast.Node[]
|
|
48
|
+
? RPCCallNodes<ParsedQuery, RelationName extends string ? RelationName : 'rpc_call', Row>
|
|
49
|
+
: ParsedQuery
|
|
46
50
|
: Row
|
|
47
51
|
: ParseQuery<Query> extends infer ParsedQuery
|
|
48
52
|
? ParsedQuery extends Ast.Node[]
|
|
@@ -111,11 +115,15 @@ type ProcessNodeWithoutSchema<Node extends Ast.Node> = Node extends Ast.StarNode
|
|
|
111
115
|
type ProcessNodesWithoutSchema<
|
|
112
116
|
Nodes extends Ast.Node[],
|
|
113
117
|
Acc extends Record<string, unknown> = {}
|
|
114
|
-
> = Nodes extends [infer FirstNode
|
|
115
|
-
?
|
|
116
|
-
?
|
|
117
|
-
?
|
|
118
|
-
|
|
118
|
+
> = Nodes extends [infer FirstNode, ...infer RestNodes]
|
|
119
|
+
? FirstNode extends Ast.Node
|
|
120
|
+
? RestNodes extends Ast.Node[]
|
|
121
|
+
? ProcessNodeWithoutSchema<FirstNode> extends infer FieldResult
|
|
122
|
+
? FieldResult extends Record<string, unknown>
|
|
123
|
+
? ProcessNodesWithoutSchema<RestNodes, Acc & FieldResult>
|
|
124
|
+
: FieldResult
|
|
125
|
+
: any
|
|
126
|
+
: any
|
|
119
127
|
: any
|
|
120
128
|
: Prettify<Acc>
|
|
121
129
|
|
|
@@ -144,14 +152,18 @@ export type RPCCallNodes<
|
|
|
144
152
|
RelationName extends string,
|
|
145
153
|
Row extends Record<string, unknown>,
|
|
146
154
|
Acc extends Record<string, unknown> = {} // Acc is now an object
|
|
147
|
-
> = Nodes extends [infer FirstNode
|
|
148
|
-
?
|
|
149
|
-
?
|
|
150
|
-
?
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
+
> = Nodes extends [infer FirstNode, ...infer RestNodes]
|
|
156
|
+
? FirstNode extends Ast.Node
|
|
157
|
+
? RestNodes extends Ast.Node[]
|
|
158
|
+
? ProcessRPCNode<Row, RelationName, FirstNode> extends infer FieldResult
|
|
159
|
+
? FieldResult extends Record<string, unknown>
|
|
160
|
+
? RPCCallNodes<RestNodes, RelationName, Row, Acc & FieldResult>
|
|
161
|
+
: FieldResult extends SelectQueryError<infer E>
|
|
162
|
+
? SelectQueryError<E>
|
|
163
|
+
: SelectQueryError<'Could not retrieve a valid record or error value'>
|
|
164
|
+
: SelectQueryError<'Processing node failed.'>
|
|
165
|
+
: SelectQueryError<'Invalid rest nodes array in RPC call'>
|
|
166
|
+
: SelectQueryError<'Invalid first node in RPC call'>
|
|
155
167
|
: Prettify<Acc>
|
|
156
168
|
|
|
157
169
|
/**
|
|
@@ -172,14 +184,18 @@ export type ProcessNodes<
|
|
|
172
184
|
Nodes extends Ast.Node[],
|
|
173
185
|
Acc extends Record<string, unknown> = {} // Acc is now an object
|
|
174
186
|
> = CheckDuplicateEmbededReference<Schema, RelationName, Relationships, Nodes> extends false
|
|
175
|
-
? Nodes extends [infer FirstNode
|
|
176
|
-
?
|
|
177
|
-
?
|
|
178
|
-
?
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
187
|
+
? Nodes extends [infer FirstNode, ...infer RestNodes]
|
|
188
|
+
? FirstNode extends Ast.Node
|
|
189
|
+
? RestNodes extends Ast.Node[]
|
|
190
|
+
? ProcessNode<Schema, Row, RelationName, Relationships, FirstNode> extends infer FieldResult
|
|
191
|
+
? FieldResult extends Record<string, unknown>
|
|
192
|
+
? ProcessNodes<Schema, Row, RelationName, Relationships, RestNodes, Acc & FieldResult>
|
|
193
|
+
: FieldResult extends SelectQueryError<infer E>
|
|
194
|
+
? SelectQueryError<E>
|
|
195
|
+
: SelectQueryError<'Could not retrieve a valid record or error value'>
|
|
196
|
+
: SelectQueryError<'Processing node failed.'>
|
|
197
|
+
: SelectQueryError<'Invalid rest nodes array type in ProcessNodes'>
|
|
198
|
+
: SelectQueryError<'Invalid first node type in ProcessNodes'>
|
|
183
199
|
: Prettify<Acc>
|
|
184
200
|
: Prettify<CheckDuplicateEmbededReference<Schema, RelationName, Relationships, Nodes>>
|
|
185
201
|
|