import type { ExtractCodecTypes, ExtractQueryOperationTypes, ExtractStorageColumnInputTypes, ExtractStorageColumnTypes, StorageColumnMapAt, StorageTable, } from '@prisma-next/sql-contract/types'; import type { Expression, FieldProxy, Functions } from '../expression'; import type { DefaultScope, EmptyRow, JoinSource, QueryContext, RebindScope, Scope, StorageTableToScopeTable, } from '../scope'; import type { NamespaceTable, TableProxyContract } from './db'; import type { DeleteQuery, InsertQuery, InsertValues, UpdateQuery } from './mutation-query'; import type { WithJoin, WithSelect } from './shared'; // Homomorphic mapped form: result is always `Record` even when // `C` is generic, so it satisfies `QueryContext['resolvedColumnOutputTypes']`. type ResolvedColumnTypes< C extends TableProxyContract, NsId extends string, TableName extends string, ColMap = StorageColumnMapAt, NsId, TableName>, ColumnKeys extends string = [ColMap] extends [never] ? never : keyof ColMap & string, > = { readonly [K in ColumnKeys]: ColMap extends Record ? ColMap[K] : never; }; type ResolvedInsertValues< C extends TableProxyContract, NsId extends string, Table extends StorageTable, TableName extends string, CT extends Record, > = StorageColumnMapAt, NsId, TableName> extends infer ColMap ? [ColMap] extends [never] ? InsertValues : { [K in keyof ColMap]?: ColMap[K] } : InsertValues; type ResolvedUpdateValues< C extends TableProxyContract, NsId extends string, Table extends StorageTable, TableName extends string, CT extends Record, > = ResolvedInsertValues; type ResolvedUpdateExpressions = { [K in keyof Table['columns']]?: Expression<{ codecId: Table['columns'][K]['codecId']; nullable: boolean; }>; }; export type ContractToQC< C extends TableProxyContract, NsId extends string = string, Name extends string = string, > = { readonly codecTypes: ExtractCodecTypes; readonly capabilities: C['capabilities']; readonly queryOperationTypes: ExtractQueryOperationTypes; readonly resolvedColumnOutputTypes: ResolvedColumnTypes; }; export interface TableProxy< C extends TableProxyContract, NsId extends string, Name extends string, Alias extends string = Name, AvailableScope extends Scope = DefaultScope>, QC extends QueryContext = ContractToQC, > extends JoinSource>, Alias>, WithSelect, WithJoin { as( newAlias: NewAlias, ): TableProxy, QC>; insert( rows: ReadonlyArray< ResolvedInsertValues, Name, QC['codecTypes']> >, ): InsertQuery; update( set: ResolvedUpdateValues, Name, QC['codecTypes']>, ): UpdateQuery; update( callback: ( fields: FieldProxy, fns: Functions, ) => ResolvedUpdateExpressions>, ): UpdateQuery; delete(): DeleteQuery; }