Skip to content

Commit 90d9b18

Browse files
avalletesoedirgo
authored andcommitted
fix(parser): whitespace issue with inner embeding
1 parent 5a87c05 commit 90d9b18

File tree

2 files changed

+52
-2
lines changed

2 files changed

+52
-2
lines changed

src/select-query-parser/parser.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,14 +98,14 @@ type ParseField<Input extends string> = Input extends ''
9898
? Name extends 'count'
9999
? ParseCountField<Input>
100100
: Remainder extends `!inner${infer Remainder}`
101-
? ParseEmbeddedResource<Remainder> extends [
101+
? ParseEmbeddedResource<EatWhitespace<Remainder>> extends [
102102
infer Children extends Ast.Node[],
103103
`${infer Remainder}`
104104
]
105105
? // `field!inner(nodes)`
106106
[{ type: 'field'; name: Name; innerJoin: true; children: Children }, Remainder]
107107
: CreateParserErrorIfRequired<
108-
ParseEmbeddedResource<Remainder>,
108+
ParseEmbeddedResource<EatWhitespace<Remainder>>,
109109
`Expected embedded resource after "!inner" at \`${Remainder}\``
110110
>
111111
: EatWhitespace<Remainder> extends `!left${infer Remainder}`

test/select-query-parser/parser.test-d.ts

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -493,6 +493,56 @@ import { selectParams } from '../relationships'
493493
])
494494
}
495495

496+
// many-to-one join
497+
{
498+
expectType<ParseQuery<'message, channels (slug)'>>([
499+
{ type: 'field', name: 'message' },
500+
{
501+
type: 'field',
502+
name: 'channels',
503+
children: [{ type: 'field', name: 'slug' }],
504+
},
505+
])
506+
}
507+
508+
// many-to-one join with inner
509+
{
510+
expectType<ParseQuery<'message, channels!inner (slug)'>>([
511+
{ type: 'field', name: 'message' },
512+
{
513+
type: 'field',
514+
name: 'channels',
515+
innerJoin: true,
516+
children: [{ type: 'field', name: 'slug' }],
517+
},
518+
])
519+
}
520+
521+
// many-to-one join with not null
522+
{
523+
expectType<ParseQuery<'message, channels (slug)'>>([
524+
{ type: 'field', name: 'message' },
525+
{
526+
type: 'field',
527+
name: 'channels',
528+
children: [{ type: 'field', name: 'slug' }],
529+
},
530+
])
531+
}
532+
533+
// many-to-one join with inner and not null
534+
{
535+
expectType<ParseQuery<'message, channels!inner (slug)'>>([
536+
{ type: 'field', name: 'message' },
537+
{
538+
type: 'field',
539+
name: 'channels',
540+
innerJoin: true,
541+
children: [{ type: 'field', name: 'slug' }],
542+
},
543+
])
544+
}
545+
496546
// ParserError test cases
497547
// Empty string
498548
{

0 commit comments

Comments
 (0)