import { ClientConfig } from '@sanity/client'; import { GeometryCollection, LineString, MultiLineString, MultiPoint, MultiPolygon, Point, Polygon, Position } from 'geojson'; import { ExprNode, AccessAttributeNode, AccessElementNode, ArrayNode, ArrayElementNode, ArrayCoerceNode, AndNode, OrNode, SelectAlternativeNode, OpCallNode, ContextNode, DerefNode, EverythingNode, FilterNode, FuncCallNode, DateTime, Path, InRangeNode, MapNode, NegNode, NotNode, ObjectNode, ObjectAttributeNode, ObjectAttributeValueNode, ObjectSplatNode, ParameterNode, ParentNode, GroupNode, PipeFuncCallNode, PosNode, ProjectionNode, SelectNode, SelectorNode, SliceNode, ThisNode, ValueNode, GroqPipeFunction, AscNode, DescNode, GroqFunction } from 'groq-js'; import { IsNumericLiteral, SetOptional, IsNever, Join, IsUnknown, Split, Simplify as Simplify$1, UnionToIntersection } from 'type-fest'; import { PortableTextBlock } from '@portabletext-typed/types'; import { ReferenceValue, referenced } from '@sanity-typed/types'; type IsPlainObject = T extends any[] ? false : T extends object ? true : false; type TupleOfLength = Result["length"] extends Min ? IsNumericLiteral extends false ? [...Result, ...T[]] : Result["length"] extends Max ? Result : Result | TupleOfLength : TupleOfLength; type Simplify = Simplify$1 extends AnyType ? Simplify$1 : AnyType; /** * @link https://spec.groq.dev/GROQ-1.revision1/#sec-Query-context */ interface Context { client: ClientConfig; dataset: Dataset; delta: { after: DeltaElement | null; before: DeltaElement | null; }; identity: string; parameters: { [param: string]: any; }; } /** * @link https://spec.groq.dev/GROQ-1.revision1/#sec-Scope */ interface Scope> { context: TContext; parent: Scope | null; this: any; } /** * @link https://spec.groq.dev/GROQ-1.revision1/#NewNestedScope() */ interface NestedScope>> { context: TScope["context"]; parent: TScope; this: Value; } type EscapedDoubleQuote = "__ESCAPED__DOUBLE__QUOTE___"; type EscapedSingleQuote = "__ESCAPED__SINGLE__QUOTE___"; type PrefixWithSpace = `__PREFIX__WITH_SPACE__${TString}___`; type SurroundWithSpace = `__SURROUNDED_WITH_SPACES__${TString}___`; type AddPlaceholders = TString extends `${infer TLeft} in ${infer TRight}` ? `${AddPlaceholders}${SurroundWithSpace<"in">}${AddPlaceholders}` : TString extends `${infer TLeft} match ${infer TRight}` ? `${AddPlaceholders}${SurroundWithSpace<"match">}${AddPlaceholders}` : TString extends `${infer TLeft} asc${infer TRight}` ? `${AddPlaceholders}${PrefixWithSpace<"asc">}${AddPlaceholders}` : TString extends `${infer TLeft} desc${infer TRight}` ? `${AddPlaceholders}${PrefixWithSpace<"desc">}${AddPlaceholders}` : TString extends `${infer TLeft}\\${infer TRight}` ? `${AddPlaceholders}${TRight extends `${infer TRightHead}${infer TRightRest}` ? `${TRightHead extends '"' ? EscapedDoubleQuote : TRightHead extends "'" ? EscapedSingleQuote : `\\${TRightHead}`}${AddPlaceholders}` : `\\${TRight}`}` : TString; type RemovePlaceholders = TString extends `${infer TLeft}${SurroundWithSpace}${infer TRight}` ? `${RemovePlaceholders} ${TOp} ${RemovePlaceholders}` : TString extends `${infer TLeft}${PrefixWithSpace}${infer TRight}` ? `${RemovePlaceholders} ${TOp}${RemovePlaceholders}` : TString extends `${infer TLeft}${EscapedDoubleQuote}${infer TRight}` ? `${RemovePlaceholders}\\"${RemovePlaceholders}` : TString extends `${infer TLeft}${EscapedSingleQuote}${infer TRight}` ? `${RemovePlaceholders}\\'${RemovePlaceholders}` : TString; type RemoveWhitespace = TExpression extends `${infer TLeft}${'"'}${infer TQuoted}${'"'}${infer TRight}` ? `${RemoveWhitespace}${'"'}${TQuoted}${'"'}${RemoveWhitespace}` : TExpression extends `${infer TLeft}${"'"}${infer TQuoted}${"'"}${infer TRight}` ? `${RemoveWhitespace}${"'"}${TQuoted}${"'"}${RemoveWhitespace}` : TExpression extends `${infer TLeft}${"\n"}${infer TRight}` ? `${RemoveWhitespace}${RemoveWhitespace}` : TExpression extends `${infer TLeft}${"\t"}${infer TRight}` ? `${RemoveWhitespace}${RemoveWhitespace}` : TExpression extends `${infer TLeft}${" "}${infer TRight}` ? `${RemoveWhitespace}${RemoveWhitespace}` : TExpression extends `${infer TLeft}${" "}${infer TRight}` ? `${RemoveWhitespace}${RemoveWhitespace}` : TExpression; type CleanGROQ = RemovePlaceholders>>; type ParseInner = Expression; type Parse = ParseInner>; /** * @link https://spec.groq.dev/GROQ-1.revision1/#Evaluate() */ type Evaluate>> = EvaluateExpression; /** * @link https://spec.groq.dev/GROQ-1.revision1/#Boolean * @link https://spec.groq.dev/GROQ-1.revision1/#Null * @link https://spec.groq.dev/GROQ-1.revision1/#Number */ type Primitives = TExpression extends `+${number}` ? never : TExpression extends `-${number}` ? never : TExpression extends `.${string}` ? never : TExpression extends `${infer TValue extends boolean | number | null}` ? { type: "Value"; value: TValue; } : never; /** * @link https://spec.groq.dev/GROQ-1.revision1/#SingleEscapeSequence */ type SingleEscapeSequence = '"' | "'" | "/" | "\\" | "b" | "f" | "n" | "r" | "t"; /** * @link https://spec.groq.dev/GROQ-1.revision1/#EscapeSequence */ type EscapeSequence = SingleEscapeSequence; type ReplaceInString = TString extends `${infer TLeft}${TReplace}${infer TRight}` ? `${TLeft}${TReplaceWith}${ReplaceInString}` : TString; type IfStringHas = TString extends `${string}${THas}${string}` ? true : false; /** * @link https://spec.groq.dev/GROQ-1.revision1/#String */ type StringType = (TExpression extends `'${infer TString}'` ? IfStringHas, "'"> extends true ? never : { type: "Value"; value: ReplaceInString; } : never) | (TExpression extends `"${infer TString}"` ? IfStringHas, '"'> extends true ? never : { type: "Value"; value: ReplaceInString; } : never); /** * @link https://spec.groq.dev/GROQ-1.revision1/#ArrayElement */ type ArrayElement = TArrayElement extends `...${infer TExpression}` ? ParseInner extends never ? never : { isSplat: true; type: "ArrayElement"; value: ParseInner; } : ParseInner extends never ? never : { isSplat: false; type: "ArrayElement"; value: ParseInner; }; /** * @link https://spec.groq.dev/GROQ-1.revision1/#ArrayElements */ type ArrayElements = `${_Prefix}${TArrayElements}` extends "" ? [] : (ArrayElement<`${_Prefix}${TArrayElements}`> extends never ? never : [ArrayElement<`${_Prefix}${TArrayElements}`>]) | (TArrayElements extends `${infer TArrayElement},${infer TRemainingElements}` ? ArrayElements | (ArrayElement<`${_Prefix}${TArrayElement}`> extends never ? never : ArrayElements extends never ? never : [ ArrayElement<`${_Prefix}${TArrayElement}`>, ...ArrayElements ]) : never); /** * @link https://spec.groq.dev/GROQ-1.revision1/#Array */ type ArrayType = TExpression extends `[${infer TArrayElements}]` ? ArrayElements extends never ? never : { elements: ArrayElements; type: "Array"; } : never; /** * @link https://spec.groq.dev/GROQ-1.revision1/#DetermineName() */ type DetermineName = Extract["name"] | (TNode extends AccessElementNode | ArrayCoerceNode | DerefNode | FilterNode | MapNode | ProjectionNode | SliceNode ? DetermineName : never); /** * @link https://spec.groq.dev/GROQ-1.revision1/#ObjectAttribute */ type ObjectAttribute = TObjectAttribute extends `...${infer TExpression}` ? TExpression extends "" ? { type: "ObjectSplat"; value: { type: "This"; }; } : ParseInner extends never ? never : { type: "ObjectSplat"; value: ParseInner; } : TObjectAttribute extends `${infer TName}:${infer TExpression}` ? StringType extends never ? never : ParseInner extends never ? never : { name: StringType["value"]; type: "ObjectAttributeValue"; value: ParseInner; } : ParseInner extends never ? never : DetermineName> extends never ? never : { name: DetermineName>; type: "ObjectAttributeValue"; value: ParseInner; }; /** * @link https://spec.groq.dev/GROQ-1.revision1/#ObjectAttributes */ type ObjectAttributes = `${_Prefix}${TObjectAttributes}` extends "" ? [] : (ObjectAttribute<`${_Prefix}${TObjectAttributes}`> extends never ? never : [ObjectAttribute<`${_Prefix}${TObjectAttributes}`>]) | (TObjectAttributes extends `${infer TObjectAttribute},${infer TRemainingAttributes}` ? ObjectAttributes | (ObjectAttribute<`${_Prefix}${TObjectAttribute}`> extends never ? never : ObjectAttributes extends never ? never : [ ObjectAttribute<`${_Prefix}${TObjectAttribute}`>, ...ObjectAttributes ]) : never); /** * @link https://spec.groq.dev/GROQ-1.revision1/#Object */ type ObjectType = TExpression extends `{${infer TObjectAttributes}}` ? ObjectAttributes extends never ? never : { attributes: ObjectAttributes; type: "Object"; } : never; /** * @link https://spec.groq.dev/GROQ-1.revision1/#Literal */ type Literal = ArrayType | ObjectType | Primitives | StringType; /** * @link https://spec.groq.dev/GROQ-1.revision1/#This */ type This = TExpression extends "@" ? { type: "This"; } : never; type AlphaLower = "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"; type AlphaUpper = Uppercase; type Alpha = AlphaLower | AlphaUpper; type Numeric = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"; type IdentifierRest = TIdentifierRest extends "" ? true : TIdentifierRest extends `${Alpha | Numeric | "_"}${infer TIdentifierRestInner}` ? IdentifierRest : false; /** * @link https://spec.groq.dev/GROQ-1.revision1/#Identifier */ type Identifier = TIdentifier extends `${Alpha | "_"}${infer TIdentifierRest}` ? IdentifierRest extends true ? TIdentifier : never : never; /** * @link https://spec.groq.dev/GROQ-1.revision1/#ThisAttribute */ type ThisAttribute = TExpression extends `${boolean | number | null}` ? never : Identifier extends never ? never : { name: TExpression; type: "AccessAttribute"; }; /** * @link https://spec.groq.dev/GROQ-1.revision1/#Everything */ type Everything = TExpression extends "*" ? { type: "Everything"; } : never; /** * @link https://spec.groq.dev/GROQ-1.revision1/#Parent */ type Parent = TExpression extends "^" ? { n: Levels["length"]; type: "Parent"; } : TExpression extends `^.${infer TParents}` ? Parent : never; /** * @link https://spec.groq.dev/GROQ-1.revision1/#sec-geo-type */ type Geo = GeometryCollection | LineString | MultiLineString | MultiPoint | MultiPolygon | Point | Polygon | Position; declare const ArbitrarySelectorValue: unique symbol; interface Functions>> { /** * @link https://spec.groq.dev/GROQ-1.revision1/#sec-Array-namespace */ array: { /** * @link https://spec.groq.dev/GROQ-1.revision1/#array_compact() */ compact: TArgs extends [infer TArr] ? TArr extends any[] ? TArr extends null[] | [] ? [] : TArr extends [infer THead, ...infer TTail] ? THead extends null ? Functions<[TTail], TScope>["array"]["compact"] : [THead, ...Functions<[TTail], TScope>["array"]["compact"]] : TArr extends (infer TElement)[] ? NonNullable[] : never : null : never; /** * @link https://spec.groq.dev/GROQ-1.revision1/#array_join() */ join: TArgs extends [infer TArr, infer TSep] ? TArr extends any[] ? TSep extends string ? Functions<[TArr[number]], TScope>["global"]["string"] extends string ? Join : null : null : null : never; /** * @link https://spec.groq.dev/GROQ-1.revision1/#array_unique() */ unique: TArgs extends [infer TArr] ? TArr extends any[] ? TArr extends null[] | [] ? [] : TArr extends [...infer TInitial, infer TLast] ? TLast extends boolean | number | string ? TLast extends Functions<[ TInitial ], TScope>["array"]["unique"][number] ? Functions<[TInitial], TScope>["array"]["unique"] : [...Functions<[TInitial], TScope>["array"]["unique"], TLast] : [...Functions<[TInitial], TScope>["array"]["unique"], TLast] : TArr : null : never; }; /** * @link https://spec.groq.dev/GROQ-1.revision1/#sec-Date-time-namespace */ dateTime: { /** * @link https://spec.groq.dev/GROQ-1.revision1/#dateTime_now() */ now: TArgs extends [] ? DateTime : never; }; /** * @link https://spec.groq.dev/GROQ-1.revision1/#sec-Delta-namespace */ delta: { /** * @link https://spec.groq.dev/GROQ-1.revision1/#delta_changedAny() */ changedAny: TArgs extends [infer TSelector] ? TSelector extends typeof ArbitrarySelectorValue ? TScope extends { context: { delta: { after: infer TAfter; before: infer TBefore; }; }; } ? TBefore extends null ? never : TAfter extends null ? never : Functions<[ TBefore, TAfter, TSelector ], TScope>["diff"]["changedAny"] : never : never : never; /** * @link https://spec.groq.dev/GROQ-1.revision1/#delta_changedOnly() */ changedOnly: TArgs extends [infer TSelector] ? TSelector extends typeof ArbitrarySelectorValue ? TScope extends { context: { delta: { after: infer TAfter; before: infer TBefore; }; }; } ? TBefore extends null ? never : TAfter extends null ? never : Functions<[ TBefore, TAfter, TSelector ], TScope>["diff"]["changedOnly"] : never : never : never; /** * @link https://spec.groq.dev/GROQ-1.revision1/#delta_operation() */ operation: TArgs extends [] ? TScope extends { context: { delta: { after: infer TAfter; before: infer TBefore; }; }; } ? TBefore extends null ? TAfter extends null ? null : "create" : TAfter extends null ? "delete" : "update" : never : never; }; /** * @link https://spec.groq.dev/GROQ-1.revision1/#sec-Diff-namespace */ diff: { /** * @link https://spec.groq.dev/GROQ-1.revision1/#diff_changedAny() */ changedAny: TArgs extends [any, any, infer TSelector] ? TSelector extends typeof ArbitrarySelectorValue ? boolean : never : never; /** * @link https://spec.groq.dev/GROQ-1.revision1/#diff_changedOnly() */ changedOnly: TArgs extends [any, any, infer TSelector] ? TSelector extends typeof ArbitrarySelectorValue ? boolean : never : never; }; /** * @link https://spec.groq.dev/GROQ-1.revision1/#sec-Geography-Extension */ geo: { /** * @link https://spec.groq.dev/GROQ-1.revision1/#geo_contains() */ contains: TArgs extends [infer TFirst, infer TSecond] ? TFirst extends Geo ? TSecond extends Geo ? boolean : null : null : never; /** * @link https://spec.groq.dev/GROQ-1.revision1/#geo_distance() */ distance: TArgs extends [infer TFirst, infer TSecond] ? TFirst extends Point ? TSecond extends Point ? number : null : null : never; /** * @link https://spec.groq.dev/GROQ-1.revision1/#geo_intersects() */ intersects: TArgs extends [infer TFirst, infer TSecond] ? TFirst extends Geo ? TSecond extends Geo ? boolean : null : null : never; }; /** * @link https://spec.groq.dev/GROQ-1.revision1/#sec-Global-namespace */ global: { /** * @link https://spec.groq.dev/GROQ-1.revision1/#boost() */ boost: never; /** * @link https://spec.groq.dev/GROQ-1.revision1/#global_coalesce() */ coalesce: TArgs extends [] ? null : TArgs extends [infer THead, ...infer TTail] ? null extends THead ? Functions["global"]["coalesce"] | NonNullable : THead : never; /** * @link https://spec.groq.dev/GROQ-1.revision1/#global_count() */ count: TArgs extends [infer TBase] ? TBase extends any[] ? TBase["length"] : null : never; /** * @link https://spec.groq.dev/GROQ-1.revision1/#global_dateTime() */ dateTime: TArgs extends [infer TBase] ? TBase extends DateTime | string ? DateTime : null : never; /** * @link https://spec.groq.dev/GROQ-1.revision1/#global_defined() */ defined: TArgs extends [infer TBase] ? TBase extends null ? false : true : never; /** * @link https://spec.groq.dev/GROQ-1.revision1/#global_geo() */ geo: TArgs extends [infer TBase] ? TBase extends Geo ? TBase : null : never; /** * @link https://spec.groq.dev/GROQ-1.revision1/#sec-global-identity- */ identity: TArgs extends [] ? TScope extends { context: { identity: infer TIdentity; }; } ? TIdentity : never : never; /** * @link https://spec.groq.dev/GROQ-1.revision1/#global_length() */ length: TArgs extends [infer TBase] ? TBase extends any[] | string ? TBase["length"] : null : never; /** * @link https://spec.groq.dev/GROQ-1.revision1/#global_lower() */ lower: TArgs extends [infer TValue] ? TValue extends string ? Lowercase : null : never; /** * @link https://spec.groq.dev/GROQ-1.revision1/#global_now() */ now: TArgs extends [] ? string : never; /** * @link https://spec.groq.dev/GROQ-1.revision1/#sec-global-path- * @link https://www.sanity.io/docs/groq-functions#0ecd1b7eac78 */ path: TArgs extends (infer TBase)[] ? TBase extends string ? Path : null : never; /** * @link https://spec.groq.dev/GROQ-1.revision1/#global_pt() */ pt: TArgs extends [infer TBase] ? TBase extends PortableTextBlock | PortableTextBlock[] ? TBase : null : never; /** * @link https://spec.groq.dev/GROQ-1.revision1/#global_references() */ references: TArgs extends (infer TElement)[] ? Extract, string[] | string> extends never ? false : boolean : never; /** * @link https://spec.groq.dev/GROQ-1.revision1/#global_round() */ round: TArgs extends [infer TNum, infer TPrecision] | [infer TNum] ? TNum extends number ? IsUnknown extends true ? number : TPrecision extends number ? number : null : null : never; /** * @link https://spec.groq.dev/GROQ-1.revision1/#global_string() */ string: TArgs extends [infer TVal] ? TVal extends boolean | number | string ? `${TVal}` : null : never; /** * @link https://spec.groq.dev/GROQ-1.revision1/#global_upper() */ upper: TArgs extends [infer TValue] ? TValue extends string ? Uppercase : null : never; }; /** * @link https://spec.groq.dev/GROQ-1.revision1/#sec-Math-namespace */ math: { [mathFn in "avg" | "max" | "min" | "sum"]: TArgs extends [infer TArr] ? TArr extends null[] | [] ? mathFn extends "sum" ? 0 : null : TArr extends (number | null)[] ? mathFn extends "max" | "min" ? Exclude : number : null : never; }; /** * @link https://spec.groq.dev/GROQ-1.revision1/#sec-Portable-Text-Extension */ pt: { /** * @link https://spec.groq.dev/GROQ-1.revision1/#pt_text() */ text: TArgs extends (infer TBase)[] ? TBase extends PortableTextBlock | PortableTextBlock[] ? string : null : never; }; /** * @link https://www.sanity.io/docs/groq-functions#61e2649fc0d8 */ sanity: { /** * @link https://www.sanity.io/docs/groq-functions#48b1e793d6b9 */ dataset: TArgs extends [] ? TScope["context"]["client"]["dataset"] : never; /** * @link https://www.sanity.io/docs/groq-functions#b89053823742 */ projectId: TArgs extends [] ? TScope["context"]["client"]["projectId"] : never; }; /** * @link https://spec.groq.dev/GROQ-1.revision1/#sec-String-namespace */ string: { /** * @link https://spec.groq.dev/GROQ-1.revision1/#string_split() */ split: TArgs extends [infer TStr, infer TSep] ? TStr extends string ? TSep extends string ? Split : null : null : never; /** * @link https://spec.groq.dev/GROQ-1.revision1/#string_startsWith() */ startsWith: TArgs extends [infer TStr, infer TPrefix] ? TStr extends string ? TPrefix extends string ? TStr extends `${TPrefix}${string}` ? true : false : null : null : never; }; } /** * @link https://spec.groq.dev/GROQ-1.revision1/#Asc */ type Asc = TExpression extends `${infer TBase} asc` ? ParseInner extends never ? never : { base: ParseInner; type: "Asc"; } : never; /** * @link https://spec.groq.dev/GROQ-1.revision1/#Desc */ type Desc = TExpression extends `${infer TBase} desc` ? ParseInner extends never ? never : { base: ParseInner; type: "Desc"; } : never; /** * @link https://spec.groq.dev/GROQ-1.revision1/#Pair */ type Pair = TExpression extends `${infer TCondition}=>${infer TValue}` ? ParseInner extends never ? never : ParseInner extends never ? never : { condition: ParseInner; type: "SelectAlternative"; value: ParseInner; } : never; /** * @link https://spec.groq.dev/GROQ-1.revision1/#ConstantEvaluate() */ type ConstantEvaluate = Evaluate; /** * @link https://spec.groq.dev/GROQ-1.revision1/#SelectorTuple */ type SelectorTupleInner = TExpression extends `${infer TFirst},${infer TRest}` ? Selector extends never ? never : // eslint-disable-next-line @typescript-eslint/no-use-before-define -- Recursion Selector | SelectorTupleInner : never; /** * @link https://spec.groq.dev/GROQ-1.revision1/#Selector */ type Selector = (TExpression extends `(${infer TInnerExpression})` ? Selector | SelectorTupleInner : never) | (TExpression extends `${infer TSelector}.${infer TIdentifier}` ? Selector extends never ? never : Identifier extends never ? TIdentifier extends `(${infer TInnerExpression})` ? Selector | SelectorTupleInner : never : { type: "Selector"; } : never) | (TExpression extends `${infer TSelector}[${infer TBracketExpression}]` ? Selector extends never ? never : TBracketExpression extends "" ? { type: "Selector"; } : ConstantEvaluate> extends never ? never : ConstantEvaluate> extends number ? never : { type: "Selector"; } : never) | (ThisAttribute extends never ? never : { type: "Selector"; }); interface FuncArgCustomParse { delta: { changedAny: TFuncLastArg extends true ? Selector : ParseInner; changedOnly: TFuncLastArg extends true ? Selector : ParseInner; }; diff: { changedAny: TFuncLastArg extends true ? Selector : ParseInner; changedOnly: TFuncLastArg extends true ? Selector : ParseInner; }; global: { order: Asc | Desc | ParseInner; select: Pair | (TFuncLastArg extends true ? ParseInner : never); }; } type FuncArgParse = TFuncNamespace extends keyof FuncArgCustomParse ? TFuncName extends keyof FuncArgCustomParse[TFuncNamespace] ? FuncArgCustomParse[TFuncNamespace][TFuncName] : ParseInner : ParseInner; type FuncArgs = `${_Prefix}${TArgs}` extends "" ? [] : (FuncArgParse<`${_Prefix}${TArgs}`, TFuncNamespace, TFuncName, true> extends never ? never : [ FuncArgParse<`${_Prefix}${TArgs}`, TFuncNamespace, TFuncName, true> ]) | (TArgs extends `${infer TFuncArg},${infer TFuncArgs}` ? FuncArgs | (FuncArgParse<`${_Prefix}${TFuncArg}`, TFuncNamespace, TFuncName> extends never ? never : FuncArgs extends never ? never : [ FuncArgParse<`${_Prefix}${TFuncArg}`, TFuncNamespace, TFuncName>, ...FuncArgs ]) : never); type FunctionsToOtherNodes = TFuncName extends "after" | "before" ? { key: TFuncName; type: "Context"; } : TFuncName extends "select" ? TFuncArgs extends [ ...infer TAlternatives extends SelectAlternativeNode[], infer TFallback extends ExprNode ] ? { alternatives: TAlternatives; fallback: TFallback; type: "Select"; } : TFuncArgs extends infer TAlternatives extends SelectAlternativeNode[] ? { alternatives: TAlternatives; type: "Select"; } : never : never; /** * @link https://spec.groq.dev/GROQ-1.revision1/#FuncCall */ type FuncCall = TExpression extends `${infer TFuncFullName}(${infer TFuncCallArgs})` ? TFuncFullName extends `${infer TFuncNamespace}::${infer TFuncName}` ? TFuncNamespace extends keyof Functions ? FuncArgs extends never ? never : TFuncName extends keyof Functions[TFuncNamespace] ? { args: Simplify>; func: GroqFunction; name: TFuncName; namespace: TFuncNamespace; type: "FuncCall"; } : FunctionsToOtherNodes>> : never : FuncArgs extends never ? never : TFuncFullName extends keyof Functions["global"] ? { args: Simplify>; func: GroqFunction; name: TFuncFullName; namespace: "global"; type: "FuncCall"; } : FunctionsToOtherNodes>> : never; /** * @link https://www.sanity.io/docs/groq-parameters */ type Parameter = TExpression extends `$${infer TIdentifier}` ? Identifier extends never ? never : { name: TIdentifier; type: "Parameter"; } : never; /** * @link https://spec.groq.dev/GROQ-1.revision1/#SimpleExpression */ type SimpleExpression = Everything | FuncCall | Parameter | Parent | This | ThisAttribute; type Level1 = SelectAlternativeNode; type Level2 = Level1 | OrNode; type Level3 = AndNode | Level2; type Level4 = AscNode | DescNode | Level3 | (OpCallNode & { op: "!=" | "<" | "<=" | "==" | ">" | ">=" | "in" | "match"; }); type Level5 = Level4; type Level6 = Level5 | (OpCallNode & { op: "-" | "+"; }); type Level7 = Level6 | (OpCallNode & { op: "*" | "/" | "%"; }); type Level8 = Level7 | NegNode; type Level9 = Level8 | (OpCallNode & { op: "**"; }); type Level10 = Level9 | NotNode | PosNode; /** * @link https://spec.groq.dev/GROQ-1.revision1/#Parenthesis */ type Parenthesis = TExpression extends `(${infer TInnerExpression})` ? ParseInner extends never ? never : { base: ParseInner; type: "Group"; } : never; /** * @link https://spec.groq.dev/GROQ-1.revision1/#ArrayPostfix */ type ArrayPostfix = TExpression extends `${infer TBase}[]` ? Exclude, Level10> extends never ? never : { base: Exclude, Level10>; type: "ArrayCoerce"; } : never; type KnownArrayNode = ArrayCoerceNode | ArrayNode | EverythingNode | FilterNode | MapNode | PipeFuncCallNode | SliceNode; type MaybeMapBase = TBase extends never ? never : TBase extends KnownArrayNode ? { type: "This"; } : TBase; type MaybeMap = TBase extends never ? never : TNode extends never ? never : TBase extends KnownArrayNode ? { base: TBase; expr: TNode; type: "Map"; } : TNode; /** * @link https://spec.groq.dev/GROQ-1.revision1/#Range */ type Range = { [TOp in "..." | ".."]: TExpression extends `${infer TStart}${TOp}${infer TEnd}` ? ParseInner extends never ? never : ParseInner extends never ? never : { isInclusive: TOp extends ".." ? true : false; left: ParseInner; right: ParseInner; type: "Range"; } : never; }["..." | ".."]; /** * @link https://spec.groq.dev/GROQ-1.revision1/#SquareBracketTraversal * @link https://spec.groq.dev/GROQ-1.revision1/#AttributeAccess * @link https://spec.groq.dev/GROQ-1.revision1/#ElementAccess * @link https://spec.groq.dev/GROQ-1.revision1/#Filter */ type SquareBracketTraversal = TExpression extends `${infer TBase}[${infer TBracketExpression}]` ? SquareBracketTraversal<`${TBracketExpression}]`, `${_Prefix}${TBase}[`> | (Exclude, Level10> extends never ? never : (ConstantEvaluate> extends never ? never : ConstantEvaluate> extends string ? MaybeMap, Level10>, { base: MaybeMapBase, Level10>>; name: ConstantEvaluate>; type: "AccessAttribute"; }> : ConstantEvaluate> extends number ? { base: Exclude, Level10>; index: ConstantEvaluate>; type: "AccessElement"; } : { base: Exclude, Level10>; expr: ParseInner; type: "Filter"; }) | (Range extends never ? never : ConstantEvaluate["left"]> extends number ? ConstantEvaluate["right"]> extends number ? { base: Exclude, Level10>; isInclusive: Range["isInclusive"]; left: ConstantEvaluate["left"]>; right: ConstantEvaluate["right"]>; type: "Slice"; } : never : never)) : never; /** * @link https://spec.groq.dev/GROQ-1.revision1/#AttributeAccess */ type AttributeAccess = TExpression extends `${infer TBase}.${infer TIdentifier}` ? AttributeAccess | (Exclude, Level10> extends never ? never : Identifier extends never ? never : MaybeMap, Level10>, { base: MaybeMapBase, Level10>>; name: TIdentifier; type: "AccessAttribute"; }>) : never; type ProjectionInner = Exclude, Level10> extends never ? never : ObjectType<`{${TProjection}}`> extends never ? never : MaybeMap, Level10>, { base: MaybeMapBase, Level10>>; expr: ObjectType<`{${TProjection}}`>; type: "Projection"; }>; /** * @link https://spec.groq.dev/GROQ-1.revision1/#Projection */ type Projection = TExpression extends `${infer TBase}|{${infer TProjection}}` ? Projection<`${TProjection}}`, `${_Prefix}${TBase}|{`> | ProjectionInner<`${_Prefix}${TBase}`, TProjection> : TExpression extends `${infer TBase}{${infer TProjection}}` ? Projection<`${TProjection}}`, `${_Prefix}${TBase}{`> | ProjectionInner<`${_Prefix}${TBase}`, TProjection> : never; /** * @link https://spec.groq.dev/GROQ-1.revision1/#Dereference */ type Dereference = TExpression extends `${infer TBase}->${infer TIdentifier}` ? Dereference`> | (Exclude, Level10> extends never ? never : TIdentifier extends "" ? MaybeMap, Level10>, { base: MaybeMapBase, Level10>>; type: "Deref"; }> : Identifier extends never ? never : MaybeMap, Level10>, { base: { base: MaybeMapBase, Level10>>; type: "Deref"; }; name: TIdentifier; type: "AccessAttribute"; }>) : never; /** * @link https://spec.groq.dev/GROQ-1.revision1/#TraversalExpression */ type TraversalExpression = ArrayPostfix | AttributeAccess | Dereference | Projection | SquareBracketTraversal; /** * Whenever a tuple is reordered, we can't be certain what the types are. * So each member is a union of all members. * We also map instead of TArray[number][] to ensure the length of the tuple is preserved. */ type TupleToUnionArray = { [Index in keyof TArray]: TArray[number]; }; interface PipeFunctions { global: { /** * @link https://spec.groq.dev/GROQ-1.revision1/#order() */ order: TArgs extends [] ? never : TupleToUnionArray; /** * @link https://spec.groq.dev/GROQ-1.revision1/#score() */ score: TArgs extends [] ? never : TBase extends (infer Element)[] ? (IsPlainObject extends false ? never : Element & { _score: number; })[] : never; }; } /** * @link https://spec.groq.dev/GROQ-1.revision1/#PipeFuncCall */ type PipeFuncCall = TExpression extends `${infer TBase}|${infer TFuncFullName}(${infer TFuncCallArgs})` ? Parse extends never ? never : TFuncFullName extends `${infer TFuncNamespace}::${infer TFuncName}` ? TFuncNamespace extends keyof PipeFunctions ? FuncArgs extends never ? never : TFuncName extends keyof PipeFunctions[TFuncNamespace] ? { args: Simplify>; base: Parse; func: GroqPipeFunction; name: TFuncNamespace extends "global" ? TFuncName : TFuncFullName; type: "PipeFuncCall"; } : never : never : FuncArgs extends never ? never : TFuncFullName extends keyof PipeFunctions["global"] ? { args: Simplify>; base: Parse; func: GroqPipeFunction; name: TFuncFullName; type: "PipeFuncCall"; } : never : never; /** * @link https://spec.groq.dev/GROQ-1.revision1/#CompoundExpression */ type CompoundExpression = Parenthesis | PipeFuncCall | TraversalExpression; interface BooleanOperators { "&&": { leftLevel: Level2; rightLevel: Level3; stronger: false; type: "And"; weaker: true; }; "||": { leftLevel: Level1; rightLevel: Level2; stronger: true; type: "Or"; weaker: false; }; } /** * @link https://spec.groq.dev/GROQ-1.revision1/#And * @link https://spec.groq.dev/GROQ-1.revision1/#Or */ type BooleanOperator = TOp extends null ? { [TOp in keyof BooleanOperators]: BooleanOperator; }[keyof BooleanOperators] : TExpression extends `${infer TLeft}${TOp}${infer TRight}` ? BooleanOperator | (Exclude, BooleanOperators[NonNullable]["leftLevel"]> extends never ? never : Exclude, BooleanOperators[NonNullable]["rightLevel"]> extends never ? never : { left: Exclude, BooleanOperators[NonNullable]["leftLevel"]>; right: Exclude, BooleanOperators[NonNullable]["rightLevel"]>; type: BooleanOperators[NonNullable]["type"]; }) : never; interface PrefixOperators { "!": { level: Exclude; type: "Not"; }; "+": { level: Exclude; type: "Pos"; }; "-": { level: Level7; type: "Neg"; }; } /** * @link https://spec.groq.dev/GROQ-1.revision1/#Not * @link https://spec.groq.dev/GROQ-1.revision1/#UnaryPlus * @link https://spec.groq.dev/GROQ-1.revision1/#UnaryMinus */ type PrefixOperator = TOp extends null ? { [TOp in keyof PrefixOperators]: PrefixOperator; }[keyof PrefixOperators] : TExpression extends `${TOp}${infer TBase}` ? Exclude, PrefixOperators[NonNullable]["level"]> extends never ? never : { base: Exclude, PrefixOperators[NonNullable]["level"]>; type: PrefixOperators[NonNullable]["type"]; } : never; interface Operators { "!=": { leftLevel: Level4; rightLevel: Level4; }; "%": { leftLevel: Level6; rightLevel: Level7; }; "*": { leftLevel: Level6; rightLevel: // HACK https://github.com/sanity-io/GROQ/issues/112 EverythingNode | Level7; }; "**": { leftLevel: Level9; rightLevel: Level7; }; "+": { leftLevel: Level5; rightLevel: Level6; }; "-": { leftLevel: Level5; rightLevel: Level6; }; "/": { leftLevel: Level6; rightLevel: Level7; }; "<": { leftLevel: Level4; rightLevel: Level4; }; "<=": { leftLevel: Level4; rightLevel: Level4; }; "==": { leftLevel: Level4; rightLevel: Level4; }; ">": { leftLevel: Level4; rightLevel: Level4; }; ">=": { leftLevel: Level4; rightLevel: Level4; }; "match": { leftLevel: Level4; rightLevel: Level4; withSpaces: true; }; } /** * @link https://spec.groq.dev/GROQ-1.revision1/#Equality * @link https://spec.groq.dev/GROQ-1.revision1/#Comparison * @link https://spec.groq.dev/GROQ-1.revision1/#Match * @link https://spec.groq.dev/GROQ-1.revision1/#Plus * @link https://spec.groq.dev/GROQ-1.revision1/#Minus * @link https://spec.groq.dev/GROQ-1.revision1/#Star * @link https://spec.groq.dev/GROQ-1.revision1/#Slash * @link https://spec.groq.dev/GROQ-1.revision1/#Percent * @link https://spec.groq.dev/GROQ-1.revision1/#StarStar */ type OpCall = TOp extends null ? { [TOp in keyof Operators]: OpCall; }[keyof Operators] : TExpression extends `${infer TLeft}${Operators[NonNullable] extends { withSpaces: true; } ? ` ${TOp} ` : TOp}${infer TRight}` ? OpCall] extends { withSpaces: true; } ? ` ${TOp} ` : TOp}`> | (Exclude, Operators[NonNullable]["leftLevel"]> extends never ? never : Exclude, Operators[NonNullable]["rightLevel"]> extends never ? never : { left: Exclude, Operators[NonNullable]["leftLevel"]>; op: TOp; right: Exclude, Operators[NonNullable]["rightLevel"]>; type: "OpCall"; }) : never; /** * @link https://spec.groq.dev/GROQ-1.revision1/#In */ type InOperator = TExpression extends `${infer TLeft} in ${infer TRight}` ? Exclude, Level4> extends never ? never : Exclude, Level4> extends never ? Range extends never ? never : { base: Exclude, Level4>; isInclusive: Range["isInclusive"]; left: Range["left"]; right: Range["right"]; type: "InRange"; } : { left: Exclude, Level4>; op: "in"; right: Exclude, Level4>; type: "OpCall"; } : never; /** * @link https://spec.groq.dev/GROQ-1.revision1/#OperatorCall */ type OperatorCall = BooleanOperator | InOperator | OpCall | PrefixOperator; /** * @link https://spec.groq.dev/GROQ-1.revision1/#Expression */ type Expression = CompoundExpression | Literal | OperatorCall | SimpleExpression; type EvaluateBaseOrThis>> = TNode extends { base: infer TBase extends ExprNode; } ? Evaluate : TScope["this"]; /** * @link https://spec.groq.dev/GROQ-1.revision1/#EvaluateAttributeAccess() * @link https://spec.groq.dev/GROQ-1.revision1/#EvaluateThisAttribute() */ type EvaluateAccessAttribute>> = TNode extends AccessAttributeNode ? EvaluateBaseOrThis extends object ? EvaluateBaseOrThis extends { [name in TNode["name"]]: infer TValue; } ? TValue : EvaluateBaseOrThis extends { [name in TNode["name"]]?: infer TValue; } ? TValue | undefined : null : null : never; /** * @link https://spec.groq.dev/GROQ-1.revision1/#EvaluateElementAccess() */ type EvaluateAccessElement>> = TNode extends AccessElementNode ? Evaluate extends any[] ? TNode["index"] extends keyof Evaluate ? Evaluate[TNode["index"]] | (Evaluate extends [any, ...any] ? never : null) : null : null : never; type FlattenDoubleArray = TArray extends [] ? [] : TArray extends [infer THead extends any[], ...infer TTail extends any[][]] ? [...THead, ...FlattenDoubleArray] : TArray extends (infer TElement extends any[])[] ? TElement[number][] : never; type EvaluateArrayElement>> = TElement["isSplat"] extends true ? Evaluate extends any[] ? Evaluate : [Evaluate] : [Evaluate]; type EvaluateArrayElements>> = FlattenDoubleArray<{ [Index in keyof TElements]: EvaluateArrayElement; }>; /** * @link https://spec.groq.dev/GROQ-1.revision1/#EvaluateArray() */ type EvaluateArray>> = TNode extends ArrayNode ? EvaluateArrayElements : never; /** * @link https://spec.groq.dev/GROQ-1.revision1/#EvaluateArrayPostfix() */ type EvaluateArrayPostfix>> = TNode extends ArrayCoerceNode ? Evaluate extends any[] ? Evaluate : null : never; /** * @link https://spec.groq.dev/GROQ-1.revision1/#EvaluateAnd() * @link https://spec.groq.dev/GROQ-1.revision1/#EvaluateOr() */ type EvaluateBooleanOperator>> = TNode extends AndNode | OrNode ? TNode extends { left: infer TLeft extends ExprNode; right: infer TRight extends ExprNode; type: infer TType; } ? Extract extends { stronger: infer TStronger; weaker: infer TWeaker; } ? boolean extends Evaluate ? Evaluate : boolean extends Evaluate ? Evaluate : Evaluate extends TStronger ? TStronger : Evaluate extends TStronger ? TStronger : Evaluate extends TWeaker ? Evaluate extends TWeaker ? TWeaker : null : null : never : never : never; /** * @link https://spec.groq.dev/GROQ-1.revision1/#EvaluateComparison() */ type EvaluateComparison = TNode extends OpCallNode & { op: "<" | "<=" | ">" | ">="; } ? boolean : never; /** * @link https://spec.groq.dev/GROQ-1.revision1/#global_after() * @link https://spec.groq.dev/GROQ-1.revision1/#global_before() */ type EvaluateContext>> = TNode extends ContextNode ? TNode extends { key: infer TKey extends "after" | "before"; } ? TScope extends { context: { delta: { [key in TKey]: infer TValue; }; }; } ? TValue : null : never : never; /** * @link https://spec.groq.dev/GROQ-1.revision1/#EvaluateDereference() */ type EvaluateDereference>> = TNode extends DerefNode ? Evaluate extends SetOptional, typeof referenced> & { _ref: infer TRef; } ? TScope["context"]["dataset"] extends (infer TDataset)[] ? IsNever> extends true ? null : Extract : null : null : never; type Not = TBoolean extends boolean ? Enabled extends false ? TBoolean : TBoolean extends true ? false : true : null; /** * @link https://spec.groq.dev/GROQ-1.revision1/#EvaluateEquality() */ type EvaluateEquality>> = TNode extends OpCallNode & { op: "!=" | "=="; } ? Not extends Evaluate ? true : Evaluate extends Evaluate ? true : false, TNode["op"] extends "!=" ? true : false> : never; /** * @link https://spec.groq.dev/GROQ-1.revision1/#EvaluateEverything() */ type EvaluateEverything>> = TNode extends EverythingNode ? TScope["context"]["dataset"] : never; type EvaluateFilterElement>> = TElement extends never ? never : Evaluate> extends never ? never : Evaluate> extends true ? [TElement] : []; type EvaluateFilterElements>> = FlattenDoubleArray<{ [Index in keyof TBase]: EvaluateFilterElement; }>; /** * @link https://spec.groq.dev/GROQ-1.revision1/#EvaluateFilter() */ type EvaluateFilter>> = TNode extends FilterNode ? Evaluate extends any[] ? EvaluateFilterElements, TNode["expr"], TScope> : Evaluate : never; type EvaluateFuncArgs>> = { [key in keyof TArgs]: Evaluate; }; /** * @link https://spec.groq.dev/GROQ-1.revision1/#EvaluateFuncCall() */ type EvaluateFuncCall>> = TNode extends FuncCallNode ? TNode extends { name: infer TFuncName; namespace: infer TFuncNamespace; } ? TFuncNamespace extends keyof Functions ? TFuncName extends keyof Functions[TFuncNamespace] ? EvaluateFuncArgs extends any[] ? Functions, TScope>[TFuncNamespace][TFuncName] : never : never : never : never : never; /** * @link https://spec.groq.dev/GROQ-1.revision1/#EvaluateIn() */ type EvaluateIn>> = TNode extends OpCallNode & { op: "in"; } ? Evaluate extends any[] ? Evaluate extends Evaluate[number] ? true : false : Evaluate extends Path ? Evaluate extends string ? boolean : null : never : never; /** * @link https://spec.groq.dev/GROQ-1.revision1/#EvaluateIn() */ type EvaluateInRange = TNode extends InRangeNode ? boolean : never; interface EmptyObject { [key: string]: never; } type EvaluateMapElements>> = { [index in keyof TBases]: Evaluate>; }; type EvaluateMap>> = TNode extends MapNode ? Evaluate extends any[] ? EvaluateMapElements, TNode["expr"], TScope> : null : never; /** * @link https://spec.groq.dev/GROQ-1.revision1/#EvaluateMatch() */ type EvaluateMatch>> = TNode extends OpCallNode & { op: "match"; } ? Evaluate extends string[] | string ? Evaluate extends string[] | string ? boolean : never : never : never; /** * @link https://spec.groq.dev/GROQ-1.revision1/#EvaluatePlus() * @link https://spec.groq.dev/GROQ-1.revision1/#EvaluateMinus() * @link https://spec.groq.dev/GROQ-1.revision1/#EvaluateStar() * @link https://spec.groq.dev/GROQ-1.revision1/#EvaluateSlash() * @link https://spec.groq.dev/GROQ-1.revision1/#EvaluatePercent() * @link https://spec.groq.dev/GROQ-1.revision1/#EvaluateStarStar() */ type EvaluateMath>> = TNode extends OpCallNode ? (TNode extends { op: "-"; } ? Evaluate extends DateTime ? Evaluate extends DateTime ? number : Evaluate extends number ? DateTime : null : Evaluate extends number ? Evaluate extends number ? number : null : null : never) | (TNode extends { op: "*" | "**" | "/" | "%"; } ? Evaluate extends number ? Evaluate extends number ? number : null : null : never) | (TNode extends { op: "+"; } ? Evaluate extends DateTime ? Evaluate extends number ? DateTime : null : Evaluate extends string ? Evaluate extends string ? `${Evaluate}${Evaluate}` : null : Evaluate extends number ? Evaluate extends number ? number : null : Evaluate extends any[] ? Evaluate extends any[] ? [ ...Evaluate, ...Evaluate ] : null : Evaluate extends object ? Evaluate extends object ? Simplify ? Evaluate : Evaluate & Omit, keyof Evaluate>> : null : null : never) : never; /** * @link https://spec.groq.dev/GROQ-1.revision1/#EvaluateNeg() */ type EvaluateNeg>> = TNode extends NegNode ? Evaluate extends number ? `-${Evaluate}` extends `${infer TNum extends number}` ? TNum : `${Evaluate}` extends `-${infer TNum extends number}` ? TNum : Evaluate : null : never; /** * @link https://spec.groq.dev/GROQ-1.revision1/#EvaluateNot() */ type EvaluateNot>> = TNode extends NotNode ? Not> : never; type EvaluateObjectAttribute>> = (TAttribute extends ObjectAttributeValueNode ? { [key in TAttribute["name"]]: undefined extends Evaluate ? NonNullable> | null : Evaluate; } : never) | (TAttribute extends ObjectSplatNode ? Evaluate : never); type EvaluateObjectAttributes>> = { [Index in keyof TAttributes]-?: EvaluateObjectAttribute; }[number] extends never ? NonNullable : UnionToIntersection<{ [Index in keyof TAttributes]-?: EvaluateObjectAttribute; }[number]>; /** * @link https://spec.groq.dev/GROQ-1.revision1/#EvaluateObject() */ type EvaluateObject>> = TNode extends ObjectNode ? Simplify> : never; /** * @link https://www.sanity.io/docs/groq-parameters */ type EvaluateParameter>> = TNode extends ParameterNode ? TScope["context"]["parameters"][TNode["name"]] : never; /** * @link https://spec.groq.dev/GROQ-1.revision1/#EvaluateParent() */ type EvaluateParent>, Level extends number = Extract["n"]> = TNode extends ParentNode ? Level extends 0 ? TScope["this"] : TScope["parent"] extends null ? null : EvaluateParent, TupleOfLength extends [any, ...infer Rest] ? Rest["length"] : never> : never; /** * @link https://spec.groq.dev/GROQ-1.revision1/#EvaluateParenthesis() */ type EvaluateParenthesis>> = TNode extends GroupNode ? Evaluate : never; /** * @link https://spec.groq.dev/GROQ-1.revision1/#EvaluatePipeFuncCall() */ type EvaluatePipeFuncCall>> = TNode extends PipeFuncCallNode ? TNode["name"] extends `${infer TFuncNamespace}::${infer TFuncIdentifier}` ? TFuncNamespace extends keyof PipeFunctions ? TFuncIdentifier extends keyof PipeFunctions[TFuncNamespace] ? EvaluateFuncArgs extends any[] ? Evaluate extends any[] ? PipeFunctions, EvaluateFuncArgs>[TFuncNamespace][TFuncIdentifier] : null : never : never : never : TNode["name"] extends keyof PipeFunctions["global"] ? EvaluateFuncArgs extends any[] ? Evaluate extends any[] ? PipeFunctions, EvaluateFuncArgs>["global"][TNode["name"]] : null : never : never : never; /** * @link https://spec.groq.dev/GROQ-1.revision1/#EvaluatePos() */ type EvaluatePos>> = TNode extends PosNode ? Evaluate extends number ? Evaluate : null : never; /** * @link https://spec.groq.dev/GROQ-1.revision1/#EvaluateProjection() */ type EvaluateProjection>> = TNode extends ProjectionNode ? Evaluate extends null ? null : Evaluate, TScope>> : never; type EvaluateSelectAlternatives>> = TAlternatives extends [] ? Evaluate : TAlternatives extends [ infer TFirstAlternative extends SelectAlternativeNode, ...infer TRemainingAlternatives extends SelectAlternativeNode[] ] ? (Evaluate extends true ? never : EvaluateSelectAlternatives) | (true extends Evaluate ? Evaluate : never) : never; /** * @link https://spec.groq.dev/GROQ-1.revision1/#global_select() */ type EvaluateSelect>> = TNode extends SelectNode ? TNode extends { alternatives: infer TAlternatives extends SelectAlternativeNode[]; fallback: infer TFallback extends ExprNode; } ? EvaluateSelectAlternatives : TNode extends { alternatives: infer TAlternatives extends SelectAlternativeNode[]; } ? EvaluateSelectAlternatives : null : never; /** * @link https://spec.groq.dev/GROQ-1.revision1/#EvaluateSelector() */ type EvaluateSelector = TNode extends SelectorNode ? typeof ArbitrarySelectorValue : never; /** * @link https://spec.groq.dev/GROQ-1.revision1/#EvaluateSlice() */ type EvaluateSlice>> = TNode extends SliceNode ? Evaluate extends any[] ? Evaluate[number][] : null : never; /** * @link https://spec.groq.dev/GROQ-1.revision1/#EvaluateThis() */ type EvaluateThis>> = TNode extends ThisNode ? TScope["this"] : never; type EvaluateValue = Extract["value"]; type EvaluateExpression>> = EvaluateAccessAttribute | EvaluateAccessElement | EvaluateArray | EvaluateArrayPostfix | EvaluateBooleanOperator | EvaluateComparison | EvaluateContext | EvaluateDereference | EvaluateEquality | EvaluateEverything | EvaluateFilter | EvaluateFuncCall | EvaluateIn | EvaluateInRange | EvaluateMap | EvaluateMatch | EvaluateMath | EvaluateNeg | EvaluateNot | EvaluateObject | EvaluateParameter | EvaluateParent | EvaluateParenthesis | EvaluatePipeFuncCall | EvaluatePos | EvaluateProjection | EvaluateSelect | EvaluateSelector | EvaluateSlice | EvaluateThis | EvaluateValue; /** * @link https://spec.groq.dev/GROQ-1.revision1/#NewRootScope() */ interface RootScope> { context: TContext; parent: null; this: null; } /** * @link https://spec.groq.dev/GROQ-1.revision1/#ExecuteQuery() */ type ExecuteQuery> = RootScope>> = Simplify, TScope>>; type Defaults> = { [Key in keyof Value]: Key extends keyof PartialValue ? NonNullable : Value[Key]; }; type ScopeFromPartialContext>> = RootScope, TContext>>; type ScopeFromPartialScope>>> = Defaults>, TScope>; export type { CleanGROQ, Evaluate, ExecuteQuery, Geo, Parse, RootScope, ScopeFromPartialContext, ScopeFromPartialScope };