import type { Record } from './record'; export type CacheTypeDef = { types: { [typeName: string]: { idFields: { [fieldName: string]: any; }; fields: { [fieldName: string]: { args: any; type: any; }; }; fragments: [any, any, any][]; }; }; lists: { [listName: string]: { types: any; filters: any; }; }; queries: [any, any, any][]; }; export type ValidTypes = keyof Def['types']; export type TypeFields = Def['types'][Type]['fields']; export type TypeFieldNames = Extract, string>; export type TypeNames = Extract, '__ROOT__'>, string>; export type FragmentList> = Def['types'][Type]['fragments']; export type QueryList = Def['queries']; export type IDFields = Def['types'][Type]['idFields']; export type ProxyUnion = U extends null ? null : U extends TypeNames ? Record : never; export type FieldType> = TypeFields[Field]['type']; export type ArgType> = TypeFields[Field]['args']; export type ValidLists = Extract; export type ListFilters> = Def['lists'][ListName]['filters'] extends any ? { must?: Def['lists'][ListName]['filters']; must_not?: Def['lists'][ListName]['filters']; } : never; export type ListType> = ProxyUnion; /** * Note on the `_Key extends _Target && _Target extends _Key` check: * Sometimes two queries might have a similar shape/inputs, e.g.: * * query Query1($userId: ID!) { | query Query2($userId: ID!) { * user(id: $userId) { | user($id: $userId) { * id | id * name | name * } | birthDate * } | } * | } * * To TypeScript, it would look like Query2's result would extend Query1's result. * But if Query2 was listed in front of Query1 in the queries array above, `_Key extends _Target` will evaluate to true, * causing it to return Query2's input/result types, while you were looking for Query1's input/result types. * The additional `_Target extends _Key` ensures that the two objects have exactly the same shape, at least prompting the * user for the correct fields. */ export type FragmentVariables<_List, _Target> = _List extends [infer Head, ...infer Rest] ? Head extends [infer _Key, infer _Value, infer _Input] ? _Key extends _Target ? _Target extends _Key ? _Input : FragmentValue : FragmentValue : 'Encountered unknown fragment. Please make sure your runtime is up to date (ie, `vite dev` or `vite build`).' : 'Encountered unknown fragment. Please make sure your runtime is up to date (ie, `vite dev` or `vite build`).'; export type FragmentValue = List extends [infer Head, ...infer Rest] ? Head extends [infer _Key, infer _Value, infer _Input] ? _Key extends _Target ? _Target extends _Key ? _Value : FragmentValue : FragmentValue : 'Encountered unknown fragment. Please make sure your runtime is up to date (ie, `vite dev` or `vite build`).' : 'Encountered unknown fragment. Please make sure your runtime is up to date (ie, `vite dev` or `vite build`).'; export type QueryValue = List extends [infer Head, ...infer Rest] ? Head extends [infer _Key, infer _Value, infer _Input] ? _Key extends _Target ? _Target extends _Key ? _Value : QueryValue : QueryValue : 'Encountered unknown query.Please make sure your runtime is up to date (ie, `vite dev` or `vite build`).' : 'Encountered unknown query.Please make sure your runtime is up to date (ie, `vite dev` or `vite build`).'; export type QueryInput = List extends [infer Head, ...infer Rest] ? Head extends [infer _Key, infer _Value, infer _Input] ? _Key extends _Target ? _Target extends _Key ? _Input : QueryInput : QueryInput : 'Encountered unknown query.Please make sure your runtime is up to date (ie, `vite dev` or `vite build`).' : 'Encountered unknown query.Please make sure your runtime is up to date (ie, `vite dev` or `vite build`).';