import sqliteAdapter from '@prisma-next/adapter-sqlite/runtime'; import { buildNamespacedEnums, type NamespacedEnums } from '@prisma-next/contract/enum-accessor'; import type { Contract } from '@prisma-next/contract/types'; import { UNBOUND_NAMESPACE_ID } from '@prisma-next/framework-components/ir'; import { sql } from '@prisma-next/sql-builder/runtime'; import type { Db } from '@prisma-next/sql-builder/types'; import type { SqlStorage } from '@prisma-next/sql-contract/types'; import type { RawCodecInferer, RawSqlTag } from '@prisma-next/sql-relational-core/expression'; import { createRawSql } from '@prisma-next/sql-relational-core/expression'; import type { ExecutionContext, SqlRuntimeExtensionDescriptor } from '@prisma-next/sql-runtime'; import { createExecutionContext, createSqlExecutionStack } from '@prisma-next/sql-runtime'; import sqliteTarget, { SqliteContractSerializer } from '@prisma-next/target-sqlite/runtime'; import { assertDefined } from '@prisma-next/utils/assertions'; import { blindCast } from '@prisma-next/utils/casts'; import type { SqliteTargetId } from '../runtime/sqlite'; type UnboundSql> = Db[typeof UNBOUND_NAMESPACE_ID]; type UnboundEnums> = NamespacedEnums[typeof UNBOUND_NAMESPACE_ID]; export interface SqliteStaticContext> { readonly context: ExecutionContext; readonly contract: TContract; readonly enums: UnboundEnums; readonly sql: UnboundSql; readonly raw: RawSqlTag; } export function buildSqliteStaticContext>( context: ExecutionContext, rawCodecInferer: RawCodecInferer, ): SqliteStaticContext { const sqlNamespace = sql({ context, rawCodecInferer })[UNBOUND_NAMESPACE_ID]; assertDefined(sqlNamespace, 'the unbound namespace always exists on a sqlite builder output'); const sqlDb = blindCast< UnboundSql, 'Db indexed by a literal key widens NsId to string; TableProxy is invariant in NsId via insert()/update() parameter positions, so the indexed-access type cannot be proven to match the literal-keyed Namespace without this cast' >(sqlNamespace); const raw: RawSqlTag = createRawSql(rawCodecInferer); const enums = Object.freeze(buildNamespacedEnums(context.contract.domain))[ UNBOUND_NAMESPACE_ID ]; assertDefined(enums, 'the unbound namespace always exists on a sqlite builder output'); return { context, contract: context.contract, enums, sql: sqlDb, raw }; } export default function sqliteStatic>(options: { readonly contractJson: unknown; readonly extensions?: readonly SqlRuntimeExtensionDescriptor[]; }): SqliteStaticContext { const contract = blindCast< TContract, 'SqliteContractSerializer validates and returns a typed contract' >(new SqliteContractSerializer().deserializeContract(options.contractJson)); const stack = createSqlExecutionStack({ target: sqliteTarget, adapter: sqliteAdapter, extensionPacks: options.extensions ?? [], }); const context = createExecutionContext({ contract, stack }); return buildSqliteStaticContext(context, stack.adapter.rawCodecInferer); }