UNPKG

slonik-trpc

Version:
438 lines (437 loc) 29.1 kB
import { CommonQueryMethods, QuerySqlToken, SqlFragment, FragmentSqlToken } from "slonik"; import { z } from 'zod'; import { FilterOptions, Interpretors, RecursiveFilterConditions } from "./queryFilter"; import type { Plugin } from "./plugins/types"; import { PromiseOrValue } from "../helpers/types"; import { BuildView } from "./buildView"; declare const orderDirection: z.ZodEnum<["ASC", "DESC"]>; declare type OrderDirection = z.infer<typeof orderDirection>; declare type SortField = string | [string, string] | [string, string, string] | FragmentSqlToken | { field: FragmentSqlToken; nullsLast?: boolean; nullable?: boolean; }; declare type OptionalArray<T> = readonly T[] | T; declare type GetNonEmptyKeys<TFilter extends Record<string, z.ZodTypeAny> = never, TSortable extends string = never> = ([TFilter] extends [never] ? "take" : [keyof TFilter] extends [never] ? "take" : "where") | ([TSortable] extends [never] ? "take" : ("orderBy" | "searchAfter" | "takeCursors" | "cursor" | "distinctOn")) | "take" | "skip" | "select" | "ctx" | "selectGroups"; export declare type LoadParameters<TFilter, TContext, TObject extends Record<string, any>, TSelect extends keyof TObject, TSortable extends string = never, TGroupSelectable extends string = never, TTakeCursors extends boolean = false, TDisabledFilters extends "AND" | "OR" | "NOT" = never> = { /** The fields that should be included. If `select` and `selectGroups` are unspecified, all fields are returned. */ select?: readonly TSelect[]; /** The amount of rows to query. * If take is a negative value, it will try to reverse the sort order and paginate backwards. * So * ```ts * take: -25, * orderBy: ["createdAt", "ASC"] * ``` * Will be converted to * ``` * take: 25, * orderBy: ["createdAt", "DESC"] * ``` * automatically, and you'll get the last page's items. * Doesn't do anything if you don't specify orderBy though. * */ take?: number; /** The amount of items to skip, usually (currentPage - 1) * take. * Used for offset-based pagination * */ skip?: number; /** * Cursor-based pagination requires you to sort by a sequential, unique column such as an ID or a timestamp. * You can use this or `cursor` to pass the current item sortable values, after which you'd like to load. * E.g. * ```ts * searchAfter: { * id: lastPageItemId * } * orderBy: [["id", "ASC"]] * ``` * Or with multiple column sorting * ```ts * searchAfter: { * createdAt: lastItemTimestamp, * id: lastItemId, * }, * orderBy: [["createdAt", "DESC"], ["id", "ASC"]] * ``` * searchAfter parameters will take precedence over `cursor`, if both are specified. * However this should be avoided, only use searchAfter if you'd like finer control over cursor-based pagination, * as it's generally harder to use than cursor. * */ searchAfter?: { [x in TSortable]?: string | number | boolean | null; }; /** * If you specify the cursor string, it will act like an opaque searchAfter for searching after items. * Use in conjunction with takeCursors: true if you want an opaque implementation of cursor-based pagination. * Very useful especially if you have complex sorting requirements that don't match the returned fields. * Get the cursor from startCursor or endCursor from the loadPagination result, then use a positive or negative take. * */ cursor?: string; /** * If specified true, a startCursor and endCursor is returned with loadPagination. * */ takeCursors?: TTakeCursors; /** The `columnGroups` you want to select. * If `selectGroups` and `select` are unspecified, all columns will be selected. * If specified, will select the columns in that group. * E.g. if columnGroups are declared like this * ```ts * columnGroups: { * basic: ["id", "name", "email"], * } * ``` * You can specify * ```ts * selectGroups: ["basic"] * ``` * To select all 3 columns * */ selectGroups?: readonly TGroupSelectable[]; /** * Specify the sorting order using sortable column aliases * The columns need to be allowed through the `sortableColumns` option * E.g. * ```ts * [["createdAt", "DESC"], ["id", "ASC"]] * ``` * Or * ```ts * ["id", "ASC"] * ``` * */ orderBy?: OptionalArray<readonly [TSortable, 'ASC' | 'DESC' | 'ASC NULLS LAST' | 'DESC NULLS LAST']> | null; /** The DISTINCT ON part of the query. * If not null, it will automatically reorder the orderBy fragments, to put distinct fields in front of orderBy. * If the fields aren't specified in orderBy, they will be added in front, with ascending order. * * Use this with postgres only to select distinct rows based on a column. * E.g. * ```ts * distinctOn: ["id"] * ``` * Will generate * ```sql * SELECT DISTINCT ON ("id") * FROM ... * ``` * * If specified `true`, only distinct rows are returned `SELECT DISTINCT` * */ distinctOn?: OptionalArray<TSortable> | null; ctx?: TContext; where?: RecursiveFilterConditions<TFilter, TDisabledFilters>; }; export declare type ResultType<TObject extends z.AnyZodObject, TVirtuals extends Record<string, any>, TGroupSelected extends keyof (TVirtuals & z.infer<TObject>), TSelect extends keyof (TVirtuals & z.infer<TObject>)> = Pick<TVirtuals & Omit<z.infer<TObject>, keyof TVirtuals>, // Virtual fields can overwrite real fields [ TSelect ] extends [never] ? [ TGroupSelected ] extends [never] ? keyof (TVirtuals & z.infer<TObject>) : (TGroupSelected) : (TSelect | TGroupSelected)>; export declare function makeQueryLoader<TContextZod extends z.ZodTypeAny, TFragment extends SqlFragment | QuerySqlToken, TView extends BuildView, TManualFilterTypes extends Record<string, any> = never, TFilterTypes extends Record<string, any> = TView extends BuildView<infer T> ? [ TManualFilterTypes ] extends [never] ? T : T & TManualFilterTypes : TManualFilterTypes, TObject extends z.AnyZodObject = TFragment extends QuerySqlToken<infer T> ? T : any, TVirtuals extends Record<string, any> = z.infer<TObject>, TSortable extends string = never, TGroups extends { [x: string]: readonly [Exclude<keyof (z.infer<TObject> & TVirtuals), number | symbol>, ...(Exclude<keyof (z.infer<TObject> & TVirtuals), number | symbol>)[]]; } = Record<string, never>, TSelectable extends Exclude<keyof (z.infer<TObject> & TVirtuals), number | symbol> = Exclude<keyof (z.infer<TObject> & TVirtuals), number | symbol>, TContext = z.infer<TContextZod>, TFilterOrEnabled extends boolean = false, TSortableDefault extends TSortable = TSortable>(options: { query: { /** The select query (without including FROM) */ select: TFragment; /** The FROM part of the query. Should start with `FROM` */ from?: SqlFragment; /** The view from buildView utility. Used to provide filters and the FROM clause. */ view?: TView; /** The GROUP BY part of the query. Don't include `GROUP BY` */ groupBy?: SqlFragment | ((args: LoadParameters<Partial<TFilterTypes>, TContext, TVirtuals & z.infer<TObject>, (keyof (TVirtuals & z.infer<TObject>)) & TSelectable, TSortable, Exclude<keyof TGroups, number | symbol>, boolean, TFilterOrEnabled extends true ? never : "OR">) => SqlFragment); }; plugins?: readonly Plugin<any>[]; /** Optional parameter that can be used to override the slonik query parser. * Doesn't need to be used if you use sql.type when declaring the query parameter. * */ type?: TObject; /** * Optional parameter that can be used to verify the passed context. * Use this if you want to make sure the context always has a specific shape, e.g. when using it for authorization. * */ contextParser?: TContextZod; /** * Optional function that can be used to create the context. * Use this if you want to add default values to every context. * */ contextFactory?: (userContext?: z.infer<TContextZod>) => TContext; db?: Pick<CommonQueryMethods, "any">; /** * DEPRECATED: Use `view` instead. * You can use the {@link buildView} to build relations with their own filters. * */ filters?: { filters: TManualFilterTypes; interpreters: Interpretors<TManualFilterTypes, TContext>; options?: FilterOptions<TManualFilterTypes, TContext>; }; /** * You can add any hardcoded conditions here, to be used for authorization. * Any conditions you return will be appended to the overall AND conditions, and cannot be bypassed. * * E.g. * * ```ts * constraints(ctx) { * if (!ctx.userId) return sql.fragment`FALSE`; // Disable querying for unknown users. * * return sql.fragment`posts.author=${ctx.userId}`; * } * ``` * * This will let users query only their own posts, if the posts table is in the query. * */ constraints?: (ctx: TContext) => PromiseOrValue<SqlFragment | SqlFragment[] | null | undefined>; /** * Specify aliases for sortable columns. Can either be a single column, or a tuple of table name + column. * E.g. * ```ts * { * createdDate: ["users", "created_at"], * name: "fullName", * } * ``` * */ sortableColumns?: { [key in TSortable]: SortField; }; /** * This option is convenient for fetching related columns together. * Column groups that are specified here can be fetched together with the `selectGroups` option when loading. * E.g. * ```ts * columnGroups: { * basic: ["id", "name", "email"], * } * ``` * Then when loading you can simply do * ```ts * selectGroups: ["basic"] * ``` * To select all 3 columns. * */ columnGroups?: TGroups; /** * You can narrow the types that are allowed to be selected with this option. * */ selectableColumns?: readonly [TSelectable, ...TSelectable[]]; /** * Specify a mapping of virtual fields, with their dependencies * */ virtualFields?: { [x in keyof TVirtuals]?: { /** * Use this to load data more efficiently in batches. * The resolver function has access to the result of this function * */ load?: (rows: readonly z.infer<TObject>[], args: LoadParameters<TFilterTypes, TContext, z.infer<TObject>, keyof z.infer<TObject> & TSelectable, TSortable, Exclude<keyof TGroups, number | symbol>, boolean, TFilterOrEnabled extends true ? never : 'OR'>) => any; /** Return the virtual field */ resolve: (row: z.infer<TObject>, args: LoadParameters<TFilterTypes, z.infer<TContextZod>, z.infer<TObject>, (keyof (z.infer<TObject>)) & TSelectable, TSortable, Exclude<keyof TGroups, number | symbol>, boolean, TFilterOrEnabled extends true ? never : "OR"> & { index: number; }, remoteLoadResult?: any) => PromiseLike<TVirtuals[x]> | TVirtuals[x]; dependencies: readonly (keyof z.infer<TObject>)[]; }; }; options?: { /** * OR filters are disabled by default. * Specify true to enable them. * */ orFilterEnabled?: TFilterOrEnabled; /** * This allows you to transform the column names of the selected object, before they're used to create the SQL query. * Useful if you've got a [slonik interceptor for camelCase columns.](https://github.com/gajus/slonik-interceptor-field-name-transformation) * * So in case you have a interceptor that converts snake case to camelCase, you have to do the reverse here, like this: * * ``` * import { snakeCase } from 'changeCase'; * transformColumns: (field) => snakeCase(field) * ``` * * By converting a camelCase back to snake_case you ensure the SQL query will be correct. * You can also use an object map if you need, or some other method. * This is mostly to be used as an escape hatch for slonik interceptors that transform rows. * */ transformColumns?: (column: TSelectable) => string; /** * EXPERIMENTAL SUPPORT * * If specified true, the engine will try to use SQLite syntax instead of PostgreSQL syntax. * */ useSqlite?: boolean; /** The max limit when querying loadPagination. Can be increased from the default 1000 */ maxLimit?: number; /** Whether you want to run the specified zod parser for the returned rows. * Used in `loadPagination` and `load`. * * NOTE: This can affect performance negatively, depending on the parser you use, and is unnecessary if you're using zod parsing in slonik's interceptor * @default false * */ runtimeCheck?: boolean; /** Used when calculating virtual fields that return promises. * 50 by default, lower this if you don't want your rows virtual fields to be processed all at once * */ runConcurrency?: number; }; defaults?: { orderBy?: OptionalArray<readonly [TSortableDefault, 'ASC' | 'DESC' | 'ASC NULLS LAST' | 'DESC NULLS LAST']> | null; take?: number; }; }): { _columnGroups: TGroups | undefined; getSelectableFields: () => [TSelectable, ...TSelectable[]]; getLoadArgs: <TFields extends string = TSelectable, TSort extends TSortable = TSortable, TFiltersDisabled extends { AND?: boolean | undefined; OR?: boolean | undefined; NOT?: boolean | undefined; } = never>({ sortableColumns, selectableColumns, disabledFilters, transformSortColumns, }?: { /** You can remove specific sortable columns to disallow sorting by them */ sortableColumns?: [TSort, ...TSort[]] | undefined; selectableColumns?: readonly [TFields, ...TFields[]] | undefined; disabledFilters?: TFiltersDisabled | undefined; /** * You can enforce sorting constraints with this function. * E.g. ensure only certain columns are sortable, or with particular directions. * */ transformSortColumns?: ((columns?: [TSort, "ASC" | "DESC"][] | null | undefined) => [TSort, "ASC" | "DESC"][] | null | undefined) | undefined; }) => z.ZodObject<{ select: z.ZodOptional<z.ZodOptional<z.ZodArray<z.ZodEnum<[TFields, ...TFields[]]>, "many">>>; take: z.ZodOptional<z.ZodOptional<z.ZodNumber>>; skip: z.ZodOptional<z.ZodDefault<z.ZodOptional<z.ZodNumber>>>; takeCount: z.ZodOptional<z.ZodOptional<z.ZodBoolean>>; takeCursors: z.ZodOptional<z.ZodOptional<z.ZodBoolean>>; cursor: z.ZodOptional<z.ZodOptional<z.ZodString>>; takeNextPages: z.ZodOptional<z.ZodOptional<z.ZodNumber>>; selectGroups: z.ZodOptional<z.ZodOptional<z.ZodArray<z.ZodEnum<[Exclude<keyof TGroups, number | symbol>, ...Exclude<keyof TGroups, number | symbol>[]]>, "many">>>; searchAfter: z.ZodOptional<z.ZodOptional<z.ZodObject<{ [k in keyof { [x in TSort]: z.ZodTypeAny; }]: z.ZodOptional<{ [x in TSort]: z.ZodTypeAny; }[k]>; }, "strip", z.ZodTypeAny, { [k_2 in keyof z.objectUtil.addQuestionMarks<{ [k_1 in keyof { [k in keyof { [x in TSort]: z.ZodTypeAny; }]: z.ZodOptional<{ [x in TSort]: z.ZodTypeAny; }[k]>; }]: { [k in keyof { [x in TSort]: z.ZodTypeAny; }]: z.ZodOptional<{ [x in TSort]: z.ZodTypeAny; }[k]>; }[k_1]["_output"]; }>]: z.objectUtil.addQuestionMarks<{ [k_1 in keyof { [k in keyof { [x in TSort]: z.ZodTypeAny; }]: z.ZodOptional<{ [x in TSort]: z.ZodTypeAny; }[k]>; }]: { [k in keyof { [x in TSort]: z.ZodTypeAny; }]: z.ZodOptional<{ [x in TSort]: z.ZodTypeAny; }[k]>; }[k_1]["_output"]; }>[k_2]; }, { [k_4 in keyof z.objectUtil.addQuestionMarks<{ [k_3 in keyof { [k in keyof { [x in TSort]: z.ZodTypeAny; }]: z.ZodOptional<{ [x in TSort]: z.ZodTypeAny; }[k]>; }]: { [k in keyof { [x in TSort]: z.ZodTypeAny; }]: z.ZodOptional<{ [x in TSort]: z.ZodTypeAny; }[k]>; }[k_3]["_input"]; }>]: z.objectUtil.addQuestionMarks<{ [k_3 in keyof { [k in keyof { [x in TSort]: z.ZodTypeAny; }]: z.ZodOptional<{ [x in TSort]: z.ZodTypeAny; }[k]>; }]: { [k in keyof { [x in TSort]: z.ZodTypeAny; }]: z.ZodOptional<{ [x in TSort]: z.ZodTypeAny; }[k]>; }[k_3]["_input"]; }>[k_4]; }>>>; orderBy: z.ZodOptional<z.ZodNullable<z.ZodOptional<z.ZodUnion<[z.ZodArray<z.ZodTuple<[z.ZodEnum<[TSort, ...TSort[]]>, z.ZodEnum<["ASC", "DESC"]>], null>, "many">, z.ZodTuple<[z.ZodEnum<[TSort, ...TSort[]]>, z.ZodEnum<["ASC", "DESC"]>], null>]>>>>; where: z.ZodOptional<z.ZodType<[TFilterTypes] extends [never] ? never : [keyof TFilterTypes] extends [never] ? never : RecursiveFilterConditions<{ [x_1 in keyof TFilterTypes]?: (TFilterTypes[x_1] extends z.ZodTypeAny ? z.TypeOf<TFilterTypes[x_1]> : TFilterTypes[x_1]) | undefined; }, (TFilterOrEnabled extends true ? never : "OR") | Extract<keyof TFiltersDisabled, "AND" | "OR" | "NOT">>, z.ZodTypeDef, [TFilterTypes] extends [never] ? never : [keyof TFilterTypes] extends [never] ? never : RecursiveFilterConditions<{ [x_1 in keyof TFilterTypes]?: (TFilterTypes[x_1] extends z.ZodTypeAny ? z.TypeOf<TFilterTypes[x_1]> : TFilterTypes[x_1]) | undefined; }, (TFilterOrEnabled extends true ? never : "OR") | Extract<keyof TFiltersDisabled, "AND" | "OR" | "NOT">>>>; }, "strip", z.ZodTypeAny, { [k_5 in keyof z.objectUtil.addQuestionMarks<{ select: TFields[] | undefined; take: number | undefined; skip: number | undefined; takeCount: boolean | undefined; takeCursors: boolean | undefined; cursor: string | undefined; takeNextPages: number | undefined; selectGroups: Exclude<keyof TGroups, number | symbol>[] | undefined; searchAfter: { [k_2 in keyof z.objectUtil.addQuestionMarks<{ [k_1 in keyof { [k in keyof { [x in TSort]: z.ZodTypeAny; }]: z.ZodOptional<{ [x in TSort]: z.ZodTypeAny; }[k]>; }]: { [k in keyof { [x in TSort]: z.ZodTypeAny; }]: z.ZodOptional<{ [x in TSort]: z.ZodTypeAny; }[k]>; }[k_1]["_output"]; }>]: z.objectUtil.addQuestionMarks<{ [k_1 in keyof { [k in keyof { [x in TSort]: z.ZodTypeAny; }]: z.ZodOptional<{ [x in TSort]: z.ZodTypeAny; }[k]>; }]: { [k in keyof { [x in TSort]: z.ZodTypeAny; }]: z.ZodOptional<{ [x in TSort]: z.ZodTypeAny; }[k]>; }[k_1]["_output"]; }>[k_2]; } | undefined; orderBy: [TSort, "ASC" | "DESC"] | [TSort, "ASC" | "DESC"][] | null | undefined; where: ([TFilterTypes] extends [never] ? never : [keyof TFilterTypes] extends [never] ? never : RecursiveFilterConditions<{ [x_1 in keyof TFilterTypes]?: (TFilterTypes[x_1] extends z.ZodTypeAny ? z.TypeOf<TFilterTypes[x_1]> : TFilterTypes[x_1]) | undefined; }, (TFilterOrEnabled extends true ? never : "OR") | Extract<keyof TFiltersDisabled, "AND" | "OR" | "NOT">>) | undefined; }>]: z.objectUtil.addQuestionMarks<{ select: TFields[] | undefined; take: number | undefined; skip: number | undefined; takeCount: boolean | undefined; takeCursors: boolean | undefined; cursor: string | undefined; takeNextPages: number | undefined; selectGroups: Exclude<keyof TGroups, number | symbol>[] | undefined; searchAfter: { [k_2 in keyof z.objectUtil.addQuestionMarks<{ [k_1 in keyof { [k in keyof { [x in TSort]: z.ZodTypeAny; }]: z.ZodOptional<{ [x in TSort]: z.ZodTypeAny; }[k]>; }]: { [k in keyof { [x in TSort]: z.ZodTypeAny; }]: z.ZodOptional<{ [x in TSort]: z.ZodTypeAny; }[k]>; }[k_1]["_output"]; }>]: z.objectUtil.addQuestionMarks<{ [k_1 in keyof { [k in keyof { [x in TSort]: z.ZodTypeAny; }]: z.ZodOptional<{ [x in TSort]: z.ZodTypeAny; }[k]>; }]: { [k in keyof { [x in TSort]: z.ZodTypeAny; }]: z.ZodOptional<{ [x in TSort]: z.ZodTypeAny; }[k]>; }[k_1]["_output"]; }>[k_2]; } | undefined; orderBy: [TSort, "ASC" | "DESC"] | [TSort, "ASC" | "DESC"][] | null | undefined; where: ([TFilterTypes] extends [never] ? never : [keyof TFilterTypes] extends [never] ? never : RecursiveFilterConditions<{ [x_1 in keyof TFilterTypes]?: (TFilterTypes[x_1] extends z.ZodTypeAny ? z.TypeOf<TFilterTypes[x_1]> : TFilterTypes[x_1]) | undefined; }, (TFilterOrEnabled extends true ? never : "OR") | Extract<keyof TFiltersDisabled, "AND" | "OR" | "NOT">>) | undefined; }>[k_5]; }, { [k_6 in keyof z.objectUtil.addQuestionMarks<{ select: TFields[] | undefined; take: number | undefined; skip: number | undefined; takeCount: boolean | undefined; takeCursors: boolean | undefined; cursor: string | undefined; takeNextPages: number | undefined; selectGroups: Exclude<keyof TGroups, number | symbol>[] | undefined; searchAfter: { [k_4 in keyof z.objectUtil.addQuestionMarks<{ [k_3 in keyof { [k in keyof { [x in TSort]: z.ZodTypeAny; }]: z.ZodOptional<{ [x in TSort]: z.ZodTypeAny; }[k]>; }]: { [k in keyof { [x in TSort]: z.ZodTypeAny; }]: z.ZodOptional<{ [x in TSort]: z.ZodTypeAny; }[k]>; }[k_3]["_input"]; }>]: z.objectUtil.addQuestionMarks<{ [k_3 in keyof { [k in keyof { [x in TSort]: z.ZodTypeAny; }]: z.ZodOptional<{ [x in TSort]: z.ZodTypeAny; }[k]>; }]: { [k in keyof { [x in TSort]: z.ZodTypeAny; }]: z.ZodOptional<{ [x in TSort]: z.ZodTypeAny; }[k]>; }[k_3]["_input"]; }>[k_4]; } | undefined; orderBy: [TSort, "ASC" | "DESC"] | [TSort, "ASC" | "DESC"][] | null | undefined; where: ([TFilterTypes] extends [never] ? never : [keyof TFilterTypes] extends [never] ? never : RecursiveFilterConditions<{ [x_1 in keyof TFilterTypes]?: (TFilterTypes[x_1] extends z.ZodTypeAny ? z.TypeOf<TFilterTypes[x_1]> : TFilterTypes[x_1]) | undefined; }, (TFilterOrEnabled extends true ? never : "OR") | Extract<keyof TFiltersDisabled, "AND" | "OR" | "NOT">>) | undefined; }>]: z.objectUtil.addQuestionMarks<{ select: TFields[] | undefined; take: number | undefined; skip: number | undefined; takeCount: boolean | undefined; takeCursors: boolean | undefined; cursor: string | undefined; takeNextPages: number | undefined; selectGroups: Exclude<keyof TGroups, number | symbol>[] | undefined; searchAfter: { [k_4 in keyof z.objectUtil.addQuestionMarks<{ [k_3 in keyof { [k in keyof { [x in TSort]: z.ZodTypeAny; }]: z.ZodOptional<{ [x in TSort]: z.ZodTypeAny; }[k]>; }]: { [k in keyof { [x in TSort]: z.ZodTypeAny; }]: z.ZodOptional<{ [x in TSort]: z.ZodTypeAny; }[k]>; }[k_3]["_input"]; }>]: z.objectUtil.addQuestionMarks<{ [k_3 in keyof { [k in keyof { [x in TSort]: z.ZodTypeAny; }]: z.ZodOptional<{ [x in TSort]: z.ZodTypeAny; }[k]>; }]: { [k in keyof { [x in TSort]: z.ZodTypeAny; }]: z.ZodOptional<{ [x in TSort]: z.ZodTypeAny; }[k]>; }[k_3]["_input"]; }>[k_4]; } | undefined; orderBy: [TSort, "ASC" | "DESC"] | [TSort, "ASC" | "DESC"][] | null | undefined; where: ([TFilterTypes] extends [never] ? never : [keyof TFilterTypes] extends [never] ? never : RecursiveFilterConditions<{ [x_1 in keyof TFilterTypes]?: (TFilterTypes[x_1] extends z.ZodTypeAny ? z.TypeOf<TFilterTypes[x_1]> : TFilterTypes[x_1]) | undefined; }, (TFilterOrEnabled extends true ? never : "OR") | Extract<keyof TFiltersDisabled, "AND" | "OR" | "NOT">>) | undefined; }>[k_6]; }>; getQuery: <TSelect extends keyof z.TypeOf<TObject> | keyof TVirtuals = string, TGroupSelected extends Exclude<keyof TGroups, number | symbol> = never, TTakeCursors extends boolean = false>(allArgs: LoadParameters<{ [x_1 in keyof TFilterTypes]?: (TFilterTypes[x_1] extends z.ZodTypeAny ? z.TypeOf<TFilterTypes[x_1]> : TFilterTypes[x_1]) | undefined; }, z.TypeOf<TContextZod>, TVirtuals & z.TypeOf<TObject>, TSelect & TSelectable, TSortable, TGroupSelected, TTakeCursors, TFilterOrEnabled extends true ? never : "OR">) => Promise<Readonly<{ parser: z.ZodType<ResultType<TObject, TVirtuals, TGroups[TGroupSelected][number], TSelect>, z.ZodTypeDef, ResultType<TObject, TVirtuals, TGroups[TGroupSelected][number], TSelect>>; type: "SLONIK_TOKEN_QUERY"; sql: string; values: import("slonik").PrimitiveValueExpression[]; }>>; load<TSelect_1 extends keyof z.TypeOf<TObject> | keyof TVirtuals = never, TGroupSelected_1 extends Exclude<keyof TGroups, number | symbol> = never>(args: Pick<LoadParameters<{ [x_1 in keyof TFilterTypes]?: (TFilterTypes[x_1] extends z.ZodTypeAny ? z.TypeOf<TFilterTypes[x_1]> : TFilterTypes[x_1]) | undefined; }, z.TypeOf<TContextZod>, TVirtuals & z.TypeOf<TObject>, TSelect_1 & TSelectable, TSortable, TGroupSelected_1, false, TFilterOrEnabled extends true ? never : "OR">, "take" | "skip" | "select" | "ctx" | "selectGroups" | Exclude<[TFilterTypes] extends [never] ? "take" : [keyof TFilterTypes] extends [never] ? "take" : "where", "takeCursors"> | Exclude<[TSortable] extends [never] ? "take" : "takeCursors" | "searchAfter" | "cursor" | "orderBy" | "distinctOn", "takeCursors">>, database?: Pick<CommonQueryMethods, "any"> | undefined): Promise<readonly ResultType<TObject, TVirtuals, TGroups[TGroupSelected_1][number], TSelect_1>[]>; /** * Returns the data in a pagination-convenient form. * Specify takeCount: true to query the overall count as if no limit had been specified. * Otherwise, count will be null. * `take` is limited to 1000 items when using loadPagination, as it's meant to be used for loading only a few pages at a time. * */ loadPagination<TSelect_2 extends keyof z.TypeOf<TObject> | keyof TVirtuals = never, TGroupSelected_2 extends Exclude<keyof TGroups, number | symbol> = never, TTakeCursors_1 extends boolean = false>(args: Pick<LoadParameters<{ [x_1 in keyof TFilterTypes]?: (TFilterTypes[x_1] extends z.ZodTypeAny ? z.TypeOf<TFilterTypes[x_1]> : TFilterTypes[x_1]) | undefined; }, z.TypeOf<TContextZod>, TVirtuals & z.TypeOf<TObject>, TSelect_2 & TSelectable, TSortable, TGroupSelected_2, TTakeCursors_1, TFilterOrEnabled extends true ? never : "OR">, GetNonEmptyKeys<TFilterTypes, TSortable>> & { /** * If true, a count query is called to fetch all the rows as if no `take` limit had been specified. * And the `count` field will return a number. * Otherwise `count` will be null. * @default false * */ takeCount?: boolean | undefined; /** * If you specify this parameter, N extra items will be fetched and minimumCount will be returned * Useful if you want to know whether there are two next pages, simply specify * ```ts * take: 25, * takeNextPages: 2 * ``` * Then minimumCount will be 51, if there are at least 1*25+1 items after the current one. * @default 1 * @max 4 * */ takeNextPages?: number | undefined; }, database?: Pick<CommonQueryMethods, "any"> | undefined): Promise<LoadPaginationResult<ResultType<TObject, TVirtuals, TGroups[TGroupSelected_2][number], TSelect_2>>>; }; export declare type LoadPaginationResult<T> = { nodes: readonly T[]; cursors?: (string | null)[]; pageInfo: { hasPreviousPage: boolean; hasNextPage: boolean; minimumCount: number; startCursor?: string; endCursor?: string; count: number | null; }; }; export declare type InferPayload<TLoader extends { load: (...args: any) => any; }, TArgs extends TLoader extends { loadPagination: (...args: readonly [infer A]) => any; } ? Omit<A, "ctx" | "orderBy" | "searchAfter" | "skip" | "take" | "takeCount" | "takeNextPages" | "where" | "cursor" | "distinctOn" | "takeCursors"> : never = never, TResult extends Record<string, any> = TLoader extends { load: (...args: any) => PromiseLike<ArrayLike<infer A>>; } ? A extends Record<string, any> ? Exclude<A, "cursor"> : never : any, TSelect extends Exclude<keyof TResult, number | symbol> = TArgs extends { select: ArrayLike<infer A>; } ? A extends Exclude<keyof TResult, number | symbol> ? A : never : never, TGroups extends { [x: string]: ArrayLike<Exclude<keyof TResult, number | symbol>>; } = TLoader extends { _columnGroups: infer A; } ? A extends { [x: string]: ArrayLike<Exclude<keyof TResult, number | symbol>>; } ? A : never : never, TGroupSelected extends keyof TGroups = TArgs extends { selectGroups: ArrayLike<infer A>; } ? A extends keyof TGroups ? A : never : never> = Pick<TResult, [ TSelect ] extends [never] ? [ TGroupSelected ] extends [never] ? keyof TResult : (TGroups[TGroupSelected][number]) : (TSelect | TGroups[TGroupSelected][number])>; declare type Mutable<T> = T & { -readonly [P in keyof T]: Mutable<T[P]>; }; export declare type InferArgs<TLoader extends { load: (...args: any) => any; }, TArgs = TLoader extends { loadPagination: (...args: readonly [infer A]) => any; } ? A : any> = Mutable<Omit<TArgs, "ctx">>; export {};