import type { AnyRouter } from '@orpc/server'; import type { Table } from 'drizzle-orm'; import type { AccessUser } from '../access.js'; import type { TableCrudProcedures } from './crud-router.js'; export interface ProtectedContextAdditions { user: AccessUser; session: { activeOrganizationId: string | null; }; } type AuthTableName = 'user' | 'session' | 'account' | 'verification'; type InferSelect = T extends { $inferSelect: infer R; } ? R : never; type DisabledKeys = { [K in keyof TAccess & string]: TAccess[K] extends { crud: false; } ? K : never; }[keyof TAccess & string]; type ExplicitKeys = { [K in keyof TAccess & keyof TSchema & string]: TAccess[K] extends { crud: false; } ? never : K extends AuthTableName ? TAccess[K] extends { exposeAuthTable: true; } ? K extends 'user' ? K : never : never : K; }[keyof TAccess & keyof TSchema & string]; type ConventionKeys = { [K in keyof TSchema & string]: K extends AuthTableName ? never : InferSelect extends { userId: unknown; } ? K : never; }[keyof TSchema & string]; export type ExposedApiTables = [TAccess] extends [undefined] ? ConventionKeys : ExplicitKeys | Exclude, DisabledKeys | (keyof TAccess & string)>; /** * Column allowlists declared in `access` reach the client as literal unions, so * `list` can type `filters` and `sort` per table. Tables that declare nothing * get `never` filters and `'id'` sorting, matching the runtime defaults. */ type FilterableOf = K extends keyof TAccess ? TAccess[K] extends { filterableColumns: readonly (infer F extends string)[]; } ? F : never : never; type SortableOf = K extends keyof TAccess ? TAccess[K] extends { sortableColumns: readonly (infer S extends string)[]; } ? S : 'id' : 'id'; export type CrudApiRouterFor, TAccess = undefined, TLive extends boolean = false> = { [K in ExposedApiTables as TSchema[K] extends Table ? K : never]: TableCrudProcedures, FilterableOf, SortableOf, TLive>; }; type IsProcedure = T extends { '~orpc': unknown; } ? true : false; export type MergeApiRouterTypes = { [K in keyof A | keyof B]: K extends keyof A ? K extends keyof B ? IsProcedure extends true ? never : IsProcedure extends true ? never : A[K] extends Record ? B[K] extends Record ? MergeApiRouterTypes : never : never : A[K] : K extends keyof B ? B[K] : never; }; export type UnifiedApiRouter = TCustom extends AnyRouter ? MergeApiRouterTypes : TCrud; export {}; //# sourceMappingURL=types.d.ts.map