import { GenericSchema } from './types'; declare type Whitespace = ' ' | '\n' | '\t'; declare type LowerAlphabet = 'a' | 'b' | 'c' | 'd' | 'e' | 'f' | 'g' | 'h' | 'i' | 'j' | 'k' | 'l' | 'm' | 'n' | 'o' | 'p' | 'q' | 'r' | 's' | 't' | 'u' | 'v' | 'w' | 'x' | 'y' | 'z'; declare type Alphabet = LowerAlphabet | Uppercase; declare type Digit = '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' | '0'; declare type Letter = Alphabet | Digit | '_'; /** * Parser errors. */ declare type ParserError = { error: true; } & Message; declare type GenericStringError = ParserError<'Received a generic string'>; /** * Trims whitespace from the left of the input. */ declare type EatWhitespace = string extends Input ? GenericStringError : Input extends `${Whitespace}${infer Remainder}` ? EatWhitespace : Input; /** * Constructs a type definition for a single field of an object. * * @param Definitions Record of definitions, possibly generated from PostgREST's OpenAPI spec. * @param Name Name of the table being queried. * @param Field Single field parsed by `ParseQuery`. */ declare type ConstructFieldDefinition, Field> = Field extends { star: true; } ? Row : Field extends { name: string; original: string; children: unknown[]; } ? { [_ in Field['name']]: GetResultHelper extends infer Child ? Child | Child[] | null : never; } : Field extends { name: string; original: string; } ? { [K in Field['name']]: Row[Field['original']]; } : Record; /** * Notes: all `Parse*` types assume that their input strings have their whitespace * removed. They return tuples of ["Return Value", "Remainder of text"] or * a `ParserError`. */ /** * Reads a consecutive sequence of more than 1 letter, * where letters are `[0-9a-zA-Z_]`. */ declare type ReadLetters = string extends Input ? GenericStringError : ReadLettersHelper extends [`${infer Letters}`, `${infer Remainder}`] ? Letters extends '' ? ParserError<`Expected letter at \`${Input}\``> : [Letters, Remainder] : ReadLettersHelper; declare type ReadLettersHelper = string extends Input ? GenericStringError : Input extends `${infer L}${infer Remainder}` ? L extends Letter ? ReadLettersHelper : [Acc, Input] : [Acc, '']; /** * Parses an identifier. * For now, identifiers are just sequences of more than 1 letter. * * TODO: allow for double quoted strings. */ declare type ParseIdentifier = ReadLetters; /** * Parses a node. * A node is one of the following: * - `*` * - `field` * - `field(nodes)` * - `field!hint(nodes)` * - `field!inner(nodes)` * - `field!hint!inner(nodes)` * - `renamed_field:field` * - `renamed_field:field(nodes)` * - `renamed_field:field!hint(nodes)` * - `renamed_field:field!inner(nodes)` * - `renamed_field:field!hint!inner(nodes)` * * TODO: casting operators `::text`, JSON operators `->`, `->>`. */ declare type ParseNode = Input extends '' ? ParserError<'Empty string'> : Input extends `*${infer Remainder}` ? [{ star: true; }, EatWhitespace] : ParseIdentifier extends [infer Name, `${infer Remainder}`] ? EatWhitespace extends `!inner${infer Remainder}` ? ParseEmbeddedResource> extends [infer Fields, `${infer Remainder}`] ? [ { name: Name; original: Name; children: Fields; }, EatWhitespace ] : ParseEmbeddedResource> extends ParserError ? ParseEmbeddedResource> : ParserError<'Expected embedded resource after `!inner`'> : EatWhitespace extends `!${infer Remainder}` ? ParseIdentifier> extends [infer _Hint, `${infer Remainder}`] ? EatWhitespace extends `!inner${infer Remainder}` ? ParseEmbeddedResource> extends [ infer Fields, `${infer Remainder}` ] ? [ { name: Name; original: Name; children: Fields; }, EatWhitespace ] : ParseEmbeddedResource> extends ParserError ? ParseEmbeddedResource> : ParserError<'Expected embedded resource after `!inner`'> : ParseEmbeddedResource> extends [ infer Fields, `${infer Remainder}` ] ? [ { name: Name; original: Name; children: Fields; }, EatWhitespace ] : ParseEmbeddedResource> extends ParserError ? ParseEmbeddedResource> : ParserError<'Expected embedded resource after `!hint`'> : ParserError<'Expected identifier after `!`'> : EatWhitespace extends `:${infer Remainder}` ? ParseIdentifier> extends [infer OriginalName, `${infer Remainder}`] ? EatWhitespace extends `!inner${infer Remainder}` ? ParseEmbeddedResource> extends [ infer Fields, `${infer Remainder}` ] ? [ { name: Name; original: OriginalName; children: Fields; }, EatWhitespace ] : ParseEmbeddedResource> extends ParserError ? ParseEmbeddedResource> : ParserError<'Expected embedded resource after `!inner`'> : EatWhitespace extends `!${infer Remainder}` ? ParseIdentifier> extends [infer _Hint, `${infer Remainder}`] ? EatWhitespace extends `!inner${infer Remainder}` ? ParseEmbeddedResource> extends [ infer Fields, `${infer Remainder}` ] ? [ { name: Name; original: OriginalName; children: Fields; }, EatWhitespace ] : ParseEmbeddedResource> extends ParserError ? ParseEmbeddedResource> : ParserError<'Expected embedded resource after `!inner`'> : ParseEmbeddedResource> extends [ infer Fields, `${infer Remainder}` ] ? [ { name: Name; original: OriginalName; children: Fields; }, EatWhitespace ] : ParseEmbeddedResource> extends ParserError ? ParseEmbeddedResource> : ParserError<'Expected embedded resource after `!hint`'> : ParserError<'Expected identifier after `!`'> : ParseEmbeddedResource> extends [ infer Fields, `${infer Remainder}` ] ? [ { name: Name; original: OriginalName; children: Fields; }, EatWhitespace ] : ParseEmbeddedResource> extends ParserError ? ParseEmbeddedResource> : [ { name: Name; original: OriginalName; }, EatWhitespace ] : ParseIdentifier> : ParseEmbeddedResource> extends [infer Fields, `${infer Remainder}`] ? [ { name: Name; original: Name; children: Fields; }, EatWhitespace ] : ParseEmbeddedResource> extends ParserError ? ParseEmbeddedResource> : [ { name: Name; original: Name; }, EatWhitespace ] : ParserError<`Expected identifier at \`${Input}\``>; /** * Parses an embedded resource, which is an opening `(`, followed by a sequence of * nodes, separated by `,`, then a closing `)`. * * Returns a tuple of ["Parsed fields", "Remainder of text"], an error, * or the original string input indicating that no opening `(` was found. */ declare type ParseEmbeddedResource = Input extends `(${infer Remainder}` ? ParseNodes> extends [infer Fields, `${infer Remainder}`] ? EatWhitespace extends `)${infer Remainder}` ? Fields extends [] ? ParserError<'Expected fields after `(`'> : [Fields, EatWhitespace] : ParserError<`Expected ")"`> : ParseNodes> : Input; /** * Parses a sequence of nodes, separated by `,`. * * Returns a tuple of ["Parsed fields", "Remainder of text"] or an error. */ declare type ParseNodes = string extends Input ? GenericStringError : ParseNodesHelper; declare type ParseNodesHelper = ParseNode extends [ infer Field, `${infer Remainder}` ] ? EatWhitespace extends `,${infer Remainder}` ? ParseNodesHelper, [Field, ...Fields]> : [[Field, ...Fields], EatWhitespace] : ParseNode; /** * Parses a query. * A query is a sequence of nodes, separated by `,`, ensuring that there is * no remaining input after all nodes have been parsed. * * Returns an array of parsed nodes, or an error. */ declare type ParseQuery = string extends Query ? GenericStringError : ParseNodes> extends [infer Fields, `${infer Remainder}`] ? EatWhitespace extends '' ? Fields : ParserError<`Unexpected input: ${Remainder}`> : ParseNodes>; declare type GetResultHelper, Fields extends unknown[], Acc> = Fields extends [infer R] ? GetResultHelper & Acc> : Fields extends [infer R, ...infer Rest] ? GetResultHelper & Acc> : Acc; /** * Constructs a type definition for an object based on a given PostgREST query. * * @param Row Record. * @param Query Select query string literal to parse. */ export declare type GetResult, Query extends string> = ParseQuery extends unknown[] ? GetResultHelper, unknown> : ParseQuery; export {}; //# sourceMappingURL=select-query-parser.d.ts.map