import { Auth, GenericDatabaseReader, GenericDatabaseReaderWithTable, GenericDatabaseWriter, GenericDatabaseWriterWithTable, StorageActionWriter, StorageReader, StorageWriter } from "./index.js";
import { FunctionReference, FunctionReturnType, OptionalRestArgs, ValidatorTypeToReturnType } from "../server/api.js";
import { GenericValidator, Infer, ObjectType, PropertyValidators } from "../values/validator.js";
import { Id } from "../values/value.js";
import { GenericDataModel, NamedTableInfo, TableNamesInDataModel, VectorIndexNames } from "./data_model.js";
import { Scheduler } from "./scheduler.js";
import { VectorSearchQuery } from "./vector_search.js";
import { Expand } from "../type_utils.js";
import { Validator } from "../values/validators.js";
/**
 * A set of services for use within Convex mutation functions.
 *
 * The mutation context is passed as the first argument to any Convex mutation
 * function run on the server. Mutations run **transactionally**, all reads
 * and writes within a single mutation are atomic and isolated.
 *
 * You should generally use the `MutationCtx` type from
 * `"./_generated/server"`.
 *
 * @example
 * ```typescript
 * import { mutation } from "./_generated/server";
 * import { internal } from "./_generated/api";
 * import { v } from "convex/values";
 *
 * export const createTask = mutation({
 *   args: { text: v.string() },
 *   returns: v.id("tasks"),
 *   handler: async (ctx, args) => {
 *     // ctx.db: read and write documents
 *     const taskId = await ctx.db.insert("tasks", { text: args.text, completed: false });
 *
 *     // ctx.auth: check the authenticated user
 *     const identity = await ctx.auth.getUserIdentity();
 *
 *     // ctx.scheduler: schedule functions for later
 *     await ctx.scheduler.runAfter(0, internal.notifications.send, { taskId });
 *
 *     return taskId;
 *   },
 * });
 * ```
 *
 * @public
 */
export interface GenericMutationCtx<DataModel extends GenericDataModel> {
    /**
     * A utility for reading and writing data in the database.
     *
     * Use `ctx.db.insert()`, `ctx.db.patch()`, `ctx.db.replace()`, and
     * `ctx.db.delete()` to write data. Use `ctx.db.get()` and `ctx.db.query()`
     * to read data. All operations within a mutation are atomic.
     */
    db: GenericDatabaseWriter<DataModel>;
    /**
     * Information about the currently authenticated user.
     *
     * Call `await ctx.auth.getUserIdentity()` to get the current user's identity,
     * or `null` if the user is not authenticated.
     */
    auth: Auth;
    /**
     * A utility for reading and writing files in storage.
     *
     * Use `ctx.storage.generateUploadUrl()` to create an upload URL for clients,
     * `ctx.storage.getUrl(storageId)` to get a URL for a stored file,
     * or `ctx.storage.delete(storageId)` to remove one.
     */
    storage: StorageWriter;
    /**
     * A utility for scheduling Convex functions to run in the future.
     *
     * @example
     * ```typescript
     * // Schedule an action to run immediately after this mutation commits:
     * await ctx.scheduler.runAfter(0, internal.emails.sendWelcome, { userId });
     *
     * // Schedule a cleanup to run in 24 hours:
     * await ctx.scheduler.runAfter(24 * 60 * 60 * 1000, internal.tasks.cleanup, {});
     * ```
     */
    scheduler: Scheduler;
    /**
     * Call a query function within the same transaction.
     *
     * The query runs within the same transaction as the calling mutation,
     * seeing a consistent snapshot of the database. Requires a
     * {@link FunctionReference} (e.g., `api.myModule.myQuery` or
     * `internal.myModule.myQuery`).
     *
     * NOTE: Often you can extract shared logic into a helper function instead.
     * `runQuery` incurs overhead of running argument and return value validation,
     * and creating a new isolated JS context.
     *
     * @example
     * ```typescript
     * const user = await ctx.runQuery(internal.users.getUser, { userId });
     * ```
     */
    runQuery: <Query extends FunctionReference<"query", "public" | "internal">>(query: Query, ...args: OptionalRestArgs<Query>) => Promise<FunctionReturnType<Query>>;
    /**
     * Call a mutation function within the same transaction.
     *
     * The mutation runs in a sub-transaction, so if it throws an error, all of
     * its writes will be rolled back. Requires a {@link FunctionReference}.
     *
     * NOTE: Often you can extract shared logic into a helper function instead.
     * `runMutation` incurs overhead of running argument and return value
     * validation, and creating a new isolated JS context.
     */
    runMutation: <Mutation extends FunctionReference<"mutation", "public" | "internal">>(mutation: Mutation, ...args: OptionalRestArgs<Mutation>) => Promise<FunctionReturnType<Mutation>>;
}
/**
 * A set of services for use within Convex mutation functions.
 *
 * The mutation context is passed as the first argument to any Convex mutation
 * function run on the server.
 *
 * You should generally use the `MutationCtx` type from
 * `"./_generated/server"`.
 *
 * @public
 */
export type GenericMutationCtxWithTable<DataModel extends GenericDataModel> = Omit<GenericMutationCtx<DataModel>, "db"> & {
    db: GenericDatabaseWriterWithTable<DataModel>;
};
/**
 * A set of services for use within Convex query functions.
 *
 * The query context is passed as the first argument to any Convex query
 * function run on the server. Queries are **read-only**, they can read from
 * the database but cannot write. They are also **reactive**, when used with
 * `useQuery` on the client, the result automatically updates when data changes.
 *
 * You should generally use the `QueryCtx` type from
 * `"./_generated/server"`.
 *
 * @example
 * ```typescript
 * import { query } from "./_generated/server";
 * import { v } from "convex/values";
 *
 * export const listTasks = query({
 *   args: {},
 *   returns: v.array(v.object({
 *     _id: v.id("tasks"),
 *     _creationTime: v.number(),
 *     text: v.string(),
 *     completed: v.boolean(),
 *   })),
 *   handler: async (ctx, args) => {
 *     // ctx.db: read-only database access
 *     return await ctx.db.query("tasks").order("desc").take(100);
 *   },
 * });
 * ```
 *
 * @public
 */
export interface GenericQueryCtx<DataModel extends GenericDataModel> {
    /**
     * A utility for reading data in the database.
     *
     * Use `ctx.db.get(table, id)` to fetch a single document by ID, or
     * `ctx.db.query("tableName")` to query multiple documents with filtering
     * and ordering. Queries are read-only, no write methods are available.
     */
    db: GenericDatabaseReader<DataModel>;
    /**
     * Information about the currently authenticated user.
     *
     * Call `await ctx.auth.getUserIdentity()` to get the current user's identity,
     * or `null` if the user is not authenticated.
     */
    auth: Auth;
    /**
     * A utility for reading files in storage.
     *
     * Use `ctx.storage.getUrl(storageId)` to get a URL for a stored file.
     */
    storage: StorageReader;
    /**
     * Call a query function within the same transaction.
     *
     * The query runs within the same read snapshot. Requires a
     * {@link FunctionReference} (e.g., `api.myModule.myQuery` or
     * `internal.myModule.myQuery`).
     *
     * NOTE: Often you can extract shared logic into a helper function instead.
     * `runQuery` incurs overhead of running argument and return value validation,
     * and creating a new isolated JS context.
     */
    runQuery: <Query extends FunctionReference<"query", "public" | "internal">>(query: Query, ...args: OptionalRestArgs<Query>) => Promise<FunctionReturnType<Query>>;
}
/**
 * A set of services for use within Convex query functions.
 *
 * The query context is passed as the first argument to any Convex query
 * function run on the server.
 *
 * This differs from the {@link MutationCtx} because all of the services are
 * read-only.
 *
 *
 * @public
 */
export type GenericQueryCtxWithTable<DataModel extends GenericDataModel> = Omit<GenericQueryCtx<DataModel>, "db"> & {
    db: GenericDatabaseReaderWithTable<DataModel>;
};
/**
 * A set of services for use within Convex action functions.
 *
 * The action context is passed as the first argument to any Convex action
 * run on the server. Actions can call external APIs and use Node.js libraries,
 * but do **not** have direct database access (`ctx.db` is not available).
 * Use `ctx.runQuery` and `ctx.runMutation` to interact with the database.
 *
 * You should generally use the `ActionCtx` type from
 * `"./_generated/server"`.
 *
 * @example
 * ```typescript
 * import { action } from "./_generated/server";
 * import { internal } from "./_generated/api";
 * import { v } from "convex/values";
 *
 * export const processPayment = action({
 *   args: { orderId: v.id("orders"), amount: v.number() },
 *   returns: v.null(),
 *   handler: async (ctx, args) => {
 *     // Read data via ctx.runQuery:
 *     const order = await ctx.runQuery(internal.orders.get, { id: args.orderId });
 *
 *     // Call external API:
 *     const result = await fetch("https://api.stripe.com/v1/charges", { ... });
 *
 *     // Write results back via ctx.runMutation:
 *     await ctx.runMutation(internal.orders.markPaid, { id: args.orderId });
 *
 *     return null;
 *   },
 * });
 * ```
 *
 * **Common mistake:** `ctx.db` is not available in actions. Do not try to
 * access it, use `ctx.runQuery` and `ctx.runMutation` instead.
 *
 * @public
 */
export interface GenericActionCtx<DataModel extends GenericDataModel> {
    /**
     * Run the Convex query with the given name and arguments.
     *
     * Each `runQuery` call is a separate read transaction. Consider using an
     * {@link internalQuery} to prevent users from calling the query directly.
     *
     * @example
     * ```typescript
     * const user = await ctx.runQuery(internal.users.get, { userId });
     * ```
     *
     * @param query - A {@link FunctionReference} for the query to run.
     * @param args - The arguments to the query function.
     * @returns A promise of the query's result.
     */
    runQuery<Query extends FunctionReference<"query", "public" | "internal">>(query: Query, ...args: OptionalRestArgs<Query>): Promise<FunctionReturnType<Query>>;
    /**
     * Run the Convex mutation with the given name and arguments.
     *
     * Each `runMutation` call is a separate write transaction. Consider using
     * an {@link internalMutation} to prevent users from calling it directly.
     *
     * @example
     * ```typescript
     * await ctx.runMutation(internal.orders.markPaid, { id: orderId });
     * ```
     *
     * @param mutation - A {@link FunctionReference} for the mutation to run.
     * @param args - The arguments to the mutation function.
     * @returns A promise of the mutation's result.
     */
    runMutation<Mutation extends FunctionReference<"mutation", "public" | "internal">>(mutation: Mutation, ...args: OptionalRestArgs<Mutation>): Promise<FunctionReturnType<Mutation>>;
    /**
     * Run the Convex action with the given name and arguments.
     *
     * **Important:** Only use `runAction` when you need to cross runtimes
     * (e.g., calling a `"use node"` action from the default Convex runtime).
     * For code in the same runtime, extract shared logic into a plain
     * TypeScript helper function instead, `runAction` has significant
     * overhead (separate function call, separate resource allocation).
     *
     * Consider using an {@link internalAction} to prevent users from calling the
     * action directly.
     *
     * @param action - A {@link FunctionReference} for the action to run.
     * @param args - The arguments to the action function.
     * @returns A promise of the action's result.
     */
    runAction<Action extends FunctionReference<"action", "public" | "internal">>(action: Action, ...args: OptionalRestArgs<Action>): Promise<FunctionReturnType<Action>>;
    /**
     * A utility for scheduling Convex functions to run in the future.
     */
    scheduler: Scheduler;
    /**
     * Information about the currently authenticated user.
     */
    auth: Auth;
    /**
     * A utility for reading and writing files in storage.
     */
    storage: StorageActionWriter;
    /**
     * Run a vector search on the given table and index.
     *
     * @param tableName - The name of the table to query.
     * @param indexName - The name of the vector index on the table to query.
     * @param query - A {@link VectorSearchQuery} containing the vector to query,
     * the number of results to return, and any filters.
     * @returns A promise of IDs and scores for the documents with the nearest
     * vectors
     */
    vectorSearch<TableName extends TableNamesInDataModel<DataModel>, IndexName extends VectorIndexNames<NamedTableInfo<DataModel, TableName>>>(tableName: TableName, indexName: IndexName, query: Expand<VectorSearchQuery<NamedTableInfo<DataModel, TableName>, IndexName>>): Promise<Array<{
        _id: Id<TableName>;
        _score: number;
    }>>;
}
/**
 * The default arguments type for a Convex query, mutation, or action function.
 *
 * Convex functions always take an arguments object that maps the argument
 * names to their values.
 *
 * @public
 */
export type DefaultFunctionArgs = Record<string, unknown>;
/**
 * The arguments array for a function that takes arguments.
 *
 * This is an array of a single {@link DefaultFunctionArgs} element.
 */
type OneArgArray<ArgsObject extends DefaultFunctionArgs = DefaultFunctionArgs> = [
    ArgsObject
];
/**
 * The arguments to a function that takes no arguments (just an empty array).
 */
type NoArgsArray = [];
/**
 * An array of arguments to a Convex function.
 *
 * Convex functions can take either a single {@link DefaultFunctionArgs} object or no
 * args at all.
 *
 * @public
 */
export type ArgsArray = OneArgArray | NoArgsArray;
/**
 * A type for the empty object `{}`.
 *
 * Note that we don't use `type EmptyObject = {}` because that matches every object.
 */
export type EmptyObject = Record<string, never>;
/**
 * Convert an {@link ArgsArray} into a single object type.
 *
 * Empty arguments arrays are converted to {@link EmptyObject}.
 * @public
 */
export type ArgsArrayToObject<Args extends ArgsArray> = Args extends OneArgArray<infer ArgsObject> ? ArgsObject : EmptyObject;
/**
 * A type representing the visibility of a Convex function.
 *
 * @public
 */
export type FunctionVisibility = "public" | "internal";
/**
 * Given a {@link FunctionVisibility}, should this function have `isPublic: true`
 * or `isInternal: true`?
 */
type VisibilityProperties<Visiblity extends FunctionVisibility> = Visiblity extends "public" ? {
    isPublic: true;
} : {
    isInternal: true;
};
/**
 * A mutation function that is part of this app.
 *
 * You can create a mutation by wrapping your function in
 * {@link mutationGeneric} or {@link internalMutationGeneric} and exporting it.
 *
 * @public
 */
export type RegisteredMutation<Visibility extends FunctionVisibility, Args extends DefaultFunctionArgs, Returns> = {
    isConvexFunction: true;
    isMutation: true;
} & VisibilityProperties<Visibility>;
/**
 * A query function that is part of this app.
 *
 * You can create a query by wrapping your function in
 * {@link queryGeneric} or {@link internalQueryGeneric} and exporting it.
 *
 * @public
 */
export type RegisteredQuery<Visibility extends FunctionVisibility, Args extends DefaultFunctionArgs, Returns> = {
    isConvexFunction: true;
    isQuery: true;
} & VisibilityProperties<Visibility>;
/**
 * An action that is part of this app.
 *
 * You can create an action by wrapping your function in
 * {@link actionGeneric} or {@link internalActionGeneric} and exporting it.
 *
 * @public
 */
export type RegisteredAction<Visibility extends FunctionVisibility, Args extends DefaultFunctionArgs, Returns> = {
    isConvexFunction: true;
    isAction: true;
} & VisibilityProperties<Visibility>;
/**
 * An HTTP action that is part of this app's public API.
 *
 * You can create public HTTP actions by wrapping your function in
 * {@link httpActionGeneric} and exporting it.
 *
 * @public
 */
export type PublicHttpAction = {
    isHttp: true;
};
/**
 * @deprecated -- See the type definition for `MutationBuilder` or similar for
 * the types used for defining Convex functions.
 *
 * The definition of a Convex query, mutation, or action function without
 * argument validation.
 *
 * Convex functions always take a context object as their first argument
 * and an (optional) args object as their second argument.
 *
 * This can be written as a function like:
 * ```js
 * import { query } from "./_generated/server";
 *
 * export const func = query(({ db }, { arg }) => {...});
 * ```
 * or as an object like:
 *
 * ```js
 * import { query } from "./_generated/server";
 *
 * export const func = query({
 *   handler: ({ db }, { arg }) => {...},
 * });
 * ```
 * See {@link ValidatedFunction} to add argument validation.
 *
 * @public
 */
export type UnvalidatedFunction<Ctx, Args extends ArgsArray, Returns> = ((ctx: Ctx, ...args: Args) => Returns) | {
    handler: (ctx: Ctx, ...args: Args) => Returns;
};
/**
 * @deprecated -- See the type definition for `MutationBuilder` or similar for
 * the types used for defining Convex functions.
 *
 * The definition of a Convex query, mutation, or action function with argument
 * validation.
 *
 * Argument validation allows you to assert that the arguments to this function
 * are the expected type.
 *
 * Example:
 *
 * ```js
 * import { query } from "./_generated/server";
 * import { v } from "convex/values";
 *
 * export const func = query({
 *   args: {
 *     arg: v.string()
 *   },
 *   handler: ({ db }, { arg }) => {...},
 * });
 * ```
 *
 * **For security, argument validation should be added to all public functions in
 * production apps.**
 *
 * See {@link UnvalidatedFunction} for functions without argument validation.
 * @public
 */
export interface ValidatedFunction<Ctx, ArgsValidator extends PropertyValidators, Returns> {
    /**
     * A validator for the arguments of this function.
     *
     * This is an object mapping argument names to validators constructed with
     * {@link values.v}.
     *
     * ```js
     * import { v } from "convex/values";
     *
     * const args = {
     *   stringArg: v.string(),
     *   optionalNumberArg: v.optional(v.number()),
     * }
     * ```
     */
    args: ArgsValidator;
    /**
     * The implementation of this function.
     *
     * This is a function that takes in the appropriate context and arguments
     * and produces some result.
     *
     * @param ctx - The context object. This is one of {@link QueryCtx},
     * {@link MutationCtx}, or {@link ActionCtx} depending on the function type.
     * @param args - The arguments object for this function. This will match
     * the type defined by the argument validator.
     * @returns
     */
    handler: (ctx: Ctx, args: ObjectType<ArgsValidator>) => Returns;
}
/**
 * There are multiple syntaxes for defining a Convex function:
 * ```
 *  - query(async (ctx, args) => {...})
 *  - query({ handler: async (ctx, args) => {...} })
 *  - query({ args: { a: v.string }, handler: async (ctx, args) => {...} } })
 *  - query({ args: { a: v.string }, returns: v.string(), handler: async (ctx, args) => {...} } })
 *```
 *
 * In each of these, we want to correctly infer the type for the arguments and
 * return value, preferring the type derived from a validator if it's provided.
 *
 * To avoid having a separate overload for each, which would show up in error messages,
 * we use the type params -- ArgsValidator, ReturnsValidator, ReturnValue, OneOrZeroArgs.
 *
 * The type for ReturnValue and OneOrZeroArgs are constrained by the type or ArgsValidator and
 * ReturnsValidator if they're present, and inferred from any explicit type annotations to the
 * arguments or return value of the function.
 *
 * Below are a few utility types to get the appropriate type constraints based on
 * an optional validator.
 *
 * Additional tricks:
 * - We use Validator | void instead of Validator | undefined because the latter does
 * not work with `strictNullChecks` since it's equivalent to just `Validator`.
 * - We use a tuple type of length 1 to avoid distribution over the union
 *  https://github.com/microsoft/TypeScript/issues/29368#issuecomment-453529532
 */
export type ReturnValueForOptionalValidator<ReturnsValidator extends Validator<any, any, any> | PropertyValidators | void> = [ReturnsValidator] extends [Validator<any, any, any>] ? ValidatorTypeToReturnType<Infer<ReturnsValidator>> : [ReturnsValidator] extends [PropertyValidators] ? ValidatorTypeToReturnType<ObjectType<ReturnsValidator>> : any;
export type ArgsArrayForOptionalValidator<ArgsValidator extends GenericValidator | PropertyValidators | void> = [ArgsValidator] extends [Validator<any, any, any>] ? OneArgArray<Infer<ArgsValidator>> : [ArgsValidator] extends [PropertyValidators] ? OneArgArray<ObjectType<ArgsValidator>> : ArgsArray;
export type DefaultArgsForOptionalValidator<ArgsValidator extends GenericValidator | PropertyValidators | void> = [ArgsValidator] extends [Validator<any, any, any>] ? [Infer<ArgsValidator>] : [ArgsValidator] extends [PropertyValidators] ? [ObjectType<ArgsValidator>] : OneArgArray;
/**
 * Internal type helper used by Convex code generation.
 *
 * Used to give {@link mutationGeneric} a type specific to your data model.
 * @public
 */
export type MutationBuilder<DataModel extends GenericDataModel, Visibility extends FunctionVisibility> = {
    <ArgsValidator extends PropertyValidators | Validator<any, "required", any> | void, ReturnsValidator extends PropertyValidators | Validator<any, "required", any> | void, ReturnValue extends ReturnValueForOptionalValidator<ReturnsValidator> = any, OneOrZeroArgs extends ArgsArrayForOptionalValidator<ArgsValidator> = DefaultArgsForOptionalValidator<ArgsValidator>>(mutation: {
        /**
         * Argument validation.
         *
         * Examples:
         *
         * ```
         * args: {}
         * args: { input: v.optional(v.number()) }
         * args: { message: v.string(), author: v.id("authors") }
         * args: { messages: v.array(v.string()) }
         * ```
         */
        args?: ArgsValidator;
        /**
         * The return value validator.
         *
         * Examples:
         *
         * ```
         * returns: v.null()
         * returns: v.string()
         * returns: { message: v.string(), author: v.id("authors") }
         * returns: v.array(v.string())
         * ```
         */
        returns?: ReturnsValidator;
        /**
         * The implementation of this function.
         *
         * This is a function that takes in the appropriate context and arguments
         * and produces some result.
         *
         * @param ctx - The context object. This is one of {@link QueryCtx},
         * {@link MutationCtx}, or {@link ActionCtx} depending on the function type.
         * @param args - The arguments object for this function. This will match
         * the type defined by the argument validator if provided.
         * @returns
         */
        handler: (ctx: GenericMutationCtx<DataModel>, ...args: OneOrZeroArgs) => ReturnValue;
    } | {
        /**
         * The implementation of this function.
         *
         * This is a function that takes in the appropriate context and arguments
         * and produces some result.
         *
         * @param ctx - The context object. This is one of {@link QueryCtx},
         * {@link MutationCtx}, or {@link ActionCtx} depending on the function type.
         * @param args - The arguments object for this function. This will match
         * the type defined by the argument validator if provided.
         * @returns
         */
        (ctx: GenericMutationCtx<DataModel>, ...args: OneOrZeroArgs): ReturnValue;
    }): RegisteredMutation<Visibility, ArgsArrayToObject<OneOrZeroArgs>, ReturnValue>;
};
/**
 * Internal type helper used by Convex code generation.
 *
 * Used to give {@link mutationGeneric} a type specific to your data model.
 * @public
 */
export type MutationBuilderWithTable<DataModel extends GenericDataModel, Visibility extends FunctionVisibility> = {
    <ArgsValidator extends PropertyValidators | Validator<any, "required", any> | void, ReturnsValidator extends PropertyValidators | Validator<any, "required", any> | void, ReturnValue extends ReturnValueForOptionalValidator<ReturnsValidator> = any, OneOrZeroArgs extends ArgsArrayForOptionalValidator<ArgsValidator> = DefaultArgsForOptionalValidator<ArgsValidator>>(mutation: {
        /**
         * Argument validation.
         *
         * Examples:
         *
         * ```
         * args: {}
         * args: { input: v.optional(v.number()) }
         * args: { message: v.string(), author: v.id("authors") }
         * args: { messages: v.array(v.string()) }
         * ```
         */
        args?: ArgsValidator;
        /**
         * The return value validator.
         *
         * Examples:
         *
         * ```
         * returns: v.null()
         * returns: v.string()
         * returns: { message: v.string(), author: v.id("authors") }
         * returns: v.array(v.string())
         * ```
         */
        returns?: ReturnsValidator;
        /**
         * The implementation of this function.
         *
         * This is a function that takes in the appropriate context and arguments
         * and produces some result.
         *
         * @param ctx - The context object. This is one of {@link QueryCtx},
         * {@link MutationCtx}, or {@link ActionCtx} depending on the function type.
         * @param args - The arguments object for this function. This will match
         * the type defined by the argument validator if provided.
         * @returns
         */
        handler: (ctx: GenericMutationCtxWithTable<DataModel>, ...args: OneOrZeroArgs) => ReturnValue;
    } | {
        /**
         * The implementation of this function.
         *
         * This is a function that takes in the appropriate context and arguments
         * and produces some result.
         *
         * @param ctx - The context object. This is one of {@link QueryCtx},
         * {@link MutationCtx}, or {@link ActionCtx} depending on the function type.
         * @param args - The arguments object for this function. This will match
         * the type defined by the argument validator if provided.
         * @returns
         */
        (ctx: GenericMutationCtxWithTable<DataModel>, ...args: OneOrZeroArgs): ReturnValue;
    }): RegisteredMutation<Visibility, ArgsArrayToObject<OneOrZeroArgs>, ReturnValue>;
};
/**
 * Internal type helper used by Convex code generation.
 *
 * Used to give {@link queryGeneric} a type specific to your data model.
 * @public
 */
export type QueryBuilder<DataModel extends GenericDataModel, Visibility extends FunctionVisibility> = {
    <ArgsValidator extends PropertyValidators | Validator<any, "required", any> | void, ReturnsValidator extends PropertyValidators | Validator<any, "required", any> | void, ReturnValue extends ReturnValueForOptionalValidator<ReturnsValidator> = any, OneOrZeroArgs extends ArgsArrayForOptionalValidator<ArgsValidator> = DefaultArgsForOptionalValidator<ArgsValidator>>(query: {
        /**
         * Argument validation.
         *
         * Examples:
         *
         * ```
         * args: {}
         * args: { input: v.optional(v.number()) }
         * args: { message: v.string(), author: v.id("authors") }
         * args: { messages: v.array(v.string()) }
         * ```
         */
        args?: ArgsValidator;
        /**
         * The return value validator.
         *
         * Examples:
         *
         * ```
         * returns: v.null()
         * returns: v.string()
         * returns: { message: v.string(), author: v.id("authors") }
         * returns: v.array(v.string())
         * ```
         */
        returns?: ReturnsValidator;
        /**
         * The implementation of this function.
         *
         * This is a function that takes in the appropriate context and arguments
         * and produces some result.
         *
         * @param ctx - The context object. This is one of {@link QueryCtx},
         * {@link MutationCtx}, or {@link ActionCtx} depending on the function type.
         * @param args - The arguments object for this function. This will match
         * the type defined by the argument validator if provided.
         * @returns
         */
        handler: (ctx: GenericQueryCtx<DataModel>, ...args: OneOrZeroArgs) => ReturnValue;
    } | {
        /**
         * The implementation of this function.
         *
         * This is a function that takes in the appropriate context and arguments
         * and produces some result.
         *
         * @param ctx - The context object. This is one of {@link QueryCtx},
         * {@link MutationCtx}, or {@link ActionCtx} depending on the function type.
         * @param args - The arguments object for this function. This will match
         * the type defined by the argument validator if provided.
         * @returns
         */
        (ctx: GenericQueryCtx<DataModel>, ...args: OneOrZeroArgs): ReturnValue;
    }): RegisteredQuery<Visibility, ArgsArrayToObject<OneOrZeroArgs>, ReturnValue>;
};
/**
 * Internal type helper used by Convex code generation.
 *
 * Used to give {@link queryGeneric} a type specific to your data model.
 * @public
 */
export type QueryBuilderWithTable<DataModel extends GenericDataModel, Visibility extends FunctionVisibility> = {
    <ArgsValidator extends PropertyValidators | Validator<any, "required", any> | void, ReturnsValidator extends PropertyValidators | Validator<any, "required", any> | void, ReturnValue extends ReturnValueForOptionalValidator<ReturnsValidator> = any, OneOrZeroArgs extends ArgsArrayForOptionalValidator<ArgsValidator> = DefaultArgsForOptionalValidator<ArgsValidator>>(query: {
        /**
         * Argument validation.
         *
         * Examples:
         *
         * ```
         * args: {}
         * args: { input: v.optional(v.number()) }
         * args: { message: v.string(), author: v.id("authors") }
         * args: { messages: v.array(v.string()) }
         * ```
         */
        args?: ArgsValidator;
        /**
         * The return value validator.
         *
         * Examples:
         *
         * ```
         * returns: v.null()
         * returns: v.string()
         * returns: { message: v.string(), author: v.id("authors") }
         * returns: v.array(v.string())
         * ```
         */
        returns?: ReturnsValidator;
        /**
         * The implementation of this function.
         *
         * This is a function that takes in the appropriate context and arguments
         * and produces some result.
         *
         * @param ctx - The context object. This is one of {@link QueryCtx},
         * {@link MutationCtx}, or {@link ActionCtx} depending on the function type.
         * @param args - The arguments object for this function. This will match
         * the type defined by the argument validator if provided.
         * @returns
         */
        handler: (ctx: GenericQueryCtxWithTable<DataModel>, ...args: OneOrZeroArgs) => ReturnValue;
    } | {
        /**
         * The implementation of this function.
         *
         * This is a function that takes in the appropriate context and arguments
         * and produces some result.
         *
         * @param ctx - The context object. This is one of {@link QueryCtx},
         * {@link MutationCtx}, or {@link ActionCtx} depending on the function type.
         * @param args - The arguments object for this function. This will match
         * the type defined by the argument validator if provided.
         * @returns
         */
        (ctx: GenericQueryCtxWithTable<DataModel>, ...args: OneOrZeroArgs): ReturnValue;
    }): RegisteredQuery<Visibility, ArgsArrayToObject<OneOrZeroArgs>, ReturnValue>;
};
/**
 * Internal type helper used by Convex code generation.
 *
 * Used to give {@link actionGeneric} a type specific to your data model.
 * @public
 */
export type ActionBuilder<DataModel extends GenericDataModel, Visibility extends FunctionVisibility> = {
    <ArgsValidator extends PropertyValidators | Validator<any, "required", any> | void, ReturnsValidator extends PropertyValidators | Validator<any, "required", any> | void, ReturnValue extends ReturnValueForOptionalValidator<ReturnsValidator> = any, OneOrZeroArgs extends ArgsArrayForOptionalValidator<ArgsValidator> = DefaultArgsForOptionalValidator<ArgsValidator>>(func: {
        /**
         * Argument validation.
         *
         * Examples:
         *
         * ```
         * args: {}
         * args: { input: v.optional(v.number()) }
         * args: { message: v.string(), author: v.id("authors") }
         * args: { messages: v.array(v.string()) }
         * ```
         *
         */
        args?: ArgsValidator;
        /**
         * The return value validator.
         *
         * Examples:
         *
         * ```
         * returns: v.null()
         * returns: v.string()
         * returns: { message: v.string(), author: v.id("authors") }
         * returns: v.array(v.string())
         * ```
         */
        returns?: ReturnsValidator;
        /**
         * The implementation of this function.
         *
         * This is a function that takes in the appropriate context and arguments
         * and produces some result.
         *
         * @param ctx - The context object. This is one of {@link QueryCtx},
         * {@link MutationCtx}, or {@link ActionCtx} depending on the function type.
         * @param args - The arguments object for this function. This will match
         * the type defined by the argument validator if provided.
         * @returns
         */
        handler: (ctx: GenericActionCtx<DataModel>, ...args: OneOrZeroArgs) => ReturnValue;
    } | {
        /**
         * The implementation of this function.
         *
         * This is a function that takes in the appropriate context and arguments
         * and produces some result.
         *
         * @param ctx - The context object. This is one of {@link QueryCtx},
         * {@link MutationCtx}, or {@link ActionCtx} depending on the function type.
         * @param args - The arguments object for this function. This will match
         * the type defined by the argument validator if provided.
         * @returns
         */
        (ctx: GenericActionCtx<DataModel>, ...args: OneOrZeroArgs): ReturnValue;
    }): RegisteredAction<Visibility, ArgsArrayToObject<OneOrZeroArgs>, ReturnValue>;
};
/**
 * Internal type helper used by Convex code generation.
 *
 * Used to give {@link httpActionGeneric} a type specific to your data model
 * and functions.
 * @public
 */
export type HttpActionBuilder = (func: (ctx: GenericActionCtx<any>, request: Request) => Promise<Response>) => PublicHttpAction;
export {};
//# sourceMappingURL=registration.d.ts.map