@prisma-next/sql-runtime 0.4.0-dev.9 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  import { checkMiddlewareCompatibility, runtimeError } from "@prisma-next/framework-components/runtime";
2
2
  import { createCodecRegistry, isQueryAst } from "@prisma-next/sql-relational-core/ast";
3
- import { AsyncIterableResult, createRuntimeCore, evaluateRawGuardrails } from "@prisma-next/runtime-executor";
3
+ import { AsyncIterableResult, createRuntimeCore, evaluateRawGuardrails, runtimeError as runtimeError$1 } from "@prisma-next/runtime-executor";
4
4
  import { ifDefined } from "@prisma-next/utils/defined";
5
5
  import { checkContractComponentRequirements } from "@prisma-next/framework-components/components";
6
6
  import { createExecutionStack } from "@prisma-next/framework-components/execution";
@@ -859,6 +859,7 @@ var SqlRuntimeImpl = class {
859
859
  };
860
860
  },
861
861
  release: coreConn.release.bind(coreConn),
862
+ destroy: coreConn.destroy.bind(coreConn),
862
863
  execute(plan) {
863
864
  return self.executeAgainstQueryable(plan, coreConn);
864
865
  }
@@ -871,6 +872,69 @@ var SqlRuntimeImpl = class {
871
872
  return this.core.close();
872
873
  }
873
874
  };
875
+ function transactionClosedError() {
876
+ return runtimeError$1("RUNTIME.TRANSACTION_CLOSED", "Cannot read from a query result after the transaction has ended. Await the result or call .toArray() inside the transaction callback.", {});
877
+ }
878
+ async function withTransaction(runtime, fn) {
879
+ const connection = await runtime.connection();
880
+ const transaction = await connection.transaction();
881
+ let invalidated = false;
882
+ const txContext = {
883
+ get invalidated() {
884
+ return invalidated;
885
+ },
886
+ execute(plan) {
887
+ if (invalidated) throw transactionClosedError();
888
+ const inner = transaction.execute(plan);
889
+ const guarded = async function* () {
890
+ for await (const row of inner) {
891
+ if (invalidated) throw transactionClosedError();
892
+ yield row;
893
+ }
894
+ };
895
+ return new AsyncIterableResult(guarded());
896
+ }
897
+ };
898
+ let connectionDisposed = false;
899
+ const destroyConnection = async (reason) => {
900
+ if (connectionDisposed) return;
901
+ connectionDisposed = true;
902
+ await connection.destroy(reason).catch(() => void 0);
903
+ };
904
+ try {
905
+ let result;
906
+ try {
907
+ result = await fn(txContext);
908
+ } catch (error) {
909
+ try {
910
+ await transaction.rollback();
911
+ } catch (rollbackError) {
912
+ await destroyConnection(rollbackError);
913
+ const wrapped = runtimeError$1("RUNTIME.TRANSACTION_ROLLBACK_FAILED", "Transaction rollback failed after callback error", { rollbackError });
914
+ wrapped.cause = error;
915
+ throw wrapped;
916
+ }
917
+ throw error;
918
+ } finally {
919
+ invalidated = true;
920
+ }
921
+ try {
922
+ await transaction.commit();
923
+ } catch (commitError) {
924
+ try {
925
+ await transaction.rollback();
926
+ } catch {
927
+ await destroyConnection(commitError);
928
+ }
929
+ const wrapped = runtimeError$1("RUNTIME.TRANSACTION_COMMIT_FAILED", "Transaction commit failed", { commitError });
930
+ wrapped.cause = commitError;
931
+ throw wrapped;
932
+ }
933
+ return result;
934
+ } finally {
935
+ if (!connectionDisposed) await connection.release();
936
+ }
937
+ }
874
938
  function createRuntime(options) {
875
939
  const { stackInstance, context, driver, verify, middleware, mode, log } = options;
876
940
  return new SqlRuntimeImpl({
@@ -885,5 +949,5 @@ function createRuntime(options) {
885
949
  }
886
950
 
887
951
  //#endregion
888
- export { writeContractMarker as a, lints as c, extractCodecIds as d, validateCodecRegistryCompleteness as f, readContractMarker as i, budgets as l, ensureSchemaStatement as n, createExecutionContext as o, validateContractCodecMappings as p, ensureTableStatement as r, createSqlExecutionStack as s, createRuntime as t, lowerSqlPlan as u };
889
- //# sourceMappingURL=exports-BO6Fl7yn.mjs.map
952
+ export { readContractMarker as a, createSqlExecutionStack as c, lowerSqlPlan as d, extractCodecIds as f, ensureTableStatement as i, lints as l, validateContractCodecMappings as m, withTransaction as n, writeContractMarker as o, validateCodecRegistryCompleteness as p, ensureSchemaStatement as r, createExecutionContext as s, createRuntime as t, budgets as u };
953
+ //# sourceMappingURL=exports-Cv7I7ZD5.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exports-Cv7I7ZD5.mjs","names":["invalidCodecs: Array<{ table: string; column: string; codecId: string }>","details: Record<string, unknown>","findings: LintFinding[]","arktype","helpers: TypeHelperRegistry","applied: AppliedMutationDefault[]","contributors: Array<SqlStaticContributions & ComponentDescriptor<string>>","options","ensureSchemaStatement: SqlStatement","ensureTableStatement: SqlStatement","baseParams: readonly unknown[]","codec","index: ColumnRefIndex","decoded: Record<string, unknown>","aliases: readonly string[]","parsed: unknown","codec","encoded: unknown[]","planWithEncodedParams: ExecutionPlan<Row>","runtimeError","txContext: TransactionContext","result: R"],"sources":["../src/codecs/validation.ts","../src/lower-sql-plan.ts","../src/middleware/budgets.ts","../src/middleware/lints.ts","../src/sql-context.ts","../src/sql-marker.ts","../src/codecs/json-schema-validation.ts","../src/codecs/decoding.ts","../src/codecs/encoding.ts","../src/sql-family-adapter.ts","../src/sql-runtime.ts"],"sourcesContent":["import type { Contract } from '@prisma-next/contract/types';\nimport { runtimeError } from '@prisma-next/framework-components/runtime';\nimport type { SqlStorage } from '@prisma-next/sql-contract/types';\nimport type { CodecRegistry } from '@prisma-next/sql-relational-core/ast';\n\nexport function extractCodecIds(contract: Contract<SqlStorage>): Set<string> {\n const codecIds = new Set<string>();\n\n for (const table of Object.values(contract.storage.tables)) {\n for (const column of Object.values(table.columns)) {\n const codecId = column.codecId;\n codecIds.add(codecId);\n }\n }\n\n return codecIds;\n}\n\nfunction extractCodecIdsFromColumns(contract: Contract<SqlStorage>): Map<string, string> {\n const codecIds = new Map<string, string>();\n\n for (const [tableName, table] of Object.entries(contract.storage.tables)) {\n for (const [columnName, column] of Object.entries(table.columns)) {\n const codecId = column.codecId;\n const key = `${tableName}.${columnName}`;\n codecIds.set(key, codecId);\n }\n }\n\n return codecIds;\n}\n\nexport function validateContractCodecMappings(\n registry: CodecRegistry,\n contract: Contract<SqlStorage>,\n): void {\n const codecIds = extractCodecIdsFromColumns(contract);\n const invalidCodecs: Array<{ table: string; column: string; codecId: string }> = [];\n\n for (const [key, codecId] of codecIds.entries()) {\n if (!registry.has(codecId)) {\n const parts = key.split('.');\n const table = parts[0] ?? '';\n const column = parts[1] ?? '';\n invalidCodecs.push({ table, column, codecId });\n }\n }\n\n if (invalidCodecs.length > 0) {\n const details: Record<string, unknown> = {\n contractTarget: contract.target,\n invalidCodecs,\n };\n\n throw runtimeError(\n 'RUNTIME.CODEC_MISSING',\n `Missing codec implementations for column codecIds: ${invalidCodecs.map((c) => `${c.table}.${c.column} (${c.codecId})`).join(', ')}`,\n details,\n );\n }\n}\n\nexport function validateCodecRegistryCompleteness(\n registry: CodecRegistry,\n contract: Contract<SqlStorage>,\n): void {\n validateContractCodecMappings(registry, contract);\n}\n","import type { Contract, ExecutionPlan } from '@prisma-next/contract/types';\nimport type { SqlStorage } from '@prisma-next/sql-contract/types';\nimport type { Adapter, AnyQueryAst, LoweredStatement } from '@prisma-next/sql-relational-core/ast';\nimport type { SqlQueryPlan } from '@prisma-next/sql-relational-core/plan';\n\n/**\n * Lowers a SQL query plan to an executable Plan by calling the adapter's lower method.\n *\n * @param adapter - Adapter to lower AST to SQL\n * @param contract - Contract for lowering context\n * @param queryPlan - SQL query plan from a lane (contains AST, params, meta, but no SQL)\n * @returns Fully executable Plan with SQL string\n */\nexport function lowerSqlPlan<Row>(\n adapter: Adapter<AnyQueryAst, Contract<SqlStorage>, LoweredStatement>,\n contract: Contract<SqlStorage>,\n queryPlan: SqlQueryPlan<Row>,\n): ExecutionPlan<Row> {\n const lowered = adapter.lower(queryPlan.ast, {\n contract,\n params: queryPlan.params,\n });\n\n const body = lowered.body;\n\n return Object.freeze({\n sql: body.sql,\n params: body.params ?? queryPlan.params,\n ast: queryPlan.ast,\n meta: queryPlan.meta,\n });\n}\n","import type { ExecutionPlan } from '@prisma-next/contract/types';\nimport { type RuntimeErrorEnvelope, runtimeError } from '@prisma-next/framework-components/runtime';\nimport type {\n AfterExecuteResult,\n Middleware,\n MiddlewareContext,\n} from '@prisma-next/runtime-executor';\nimport { isQueryAst, type SelectAst } from '@prisma-next/sql-relational-core/ast';\n\nexport interface BudgetsOptions {\n readonly maxRows?: number;\n readonly defaultTableRows?: number;\n readonly tableRows?: Record<string, number>;\n readonly maxLatencyMs?: number;\n readonly severities?: {\n readonly rowCount?: 'warn' | 'error';\n readonly latency?: 'warn' | 'error';\n };\n}\n\nfunction hasAggregateWithoutGroupBy(ast: SelectAst): boolean {\n if (ast.groupBy !== undefined) {\n return false;\n }\n return ast.projection.some((item) => item.expr.kind === 'aggregate');\n}\n\nfunction estimateRowsFromAst(\n ast: SelectAst,\n tableRows: Record<string, number>,\n defaultTableRows: number,\n refs: { tables?: readonly string[] } | undefined,\n hasAggregateWithoutGroup: boolean,\n): number | null {\n if (hasAggregateWithoutGroup) {\n return 1;\n }\n\n const table = refs?.tables?.[0];\n if (!table) {\n return null;\n }\n\n const tableEstimate = tableRows[table] ?? defaultTableRows;\n\n if (ast.limit !== undefined) {\n return Math.min(ast.limit, tableEstimate);\n }\n\n return tableEstimate;\n}\n\nfunction estimateRowsFromHeuristics(\n plan: ExecutionPlan,\n tableRows: Record<string, number>,\n defaultTableRows: number,\n): number | null {\n const table = plan.meta.refs?.tables?.[0];\n if (!table) {\n return null;\n }\n\n const tableEstimate = tableRows[table] ?? defaultTableRows;\n\n const limit = plan.meta.annotations?.['limit'];\n if (typeof limit === 'number') {\n return Math.min(limit, tableEstimate);\n }\n\n return tableEstimate;\n}\n\nfunction hasDetectableLimitFromHeuristics(plan: ExecutionPlan): boolean {\n return typeof plan.meta.annotations?.['limit'] === 'number';\n}\n\nfunction emitBudgetViolation(\n error: RuntimeErrorEnvelope,\n shouldBlock: boolean,\n ctx: MiddlewareContext<unknown>,\n): void {\n if (shouldBlock) {\n throw error;\n }\n ctx.log.warn({\n code: error.code,\n message: error.message,\n details: error.details,\n });\n}\n\nexport function budgets<TContract = unknown>(options?: BudgetsOptions): Middleware<TContract> {\n const maxRows = options?.maxRows ?? 10_000;\n const defaultTableRows = options?.defaultTableRows ?? 10_000;\n const tableRows = options?.tableRows ?? {};\n const maxLatencyMs = options?.maxLatencyMs ?? 1_000;\n const rowSeverity = options?.severities?.rowCount ?? 'error';\n\n const observedRowsByPlan = new WeakMap<ExecutionPlan, { count: number }>();\n\n return Object.freeze({\n name: 'budgets',\n familyId: 'sql' as const,\n\n async beforeExecute(plan: ExecutionPlan, ctx: MiddlewareContext<TContract>) {\n observedRowsByPlan.set(plan, { count: 0 });\n\n if (isQueryAst(plan.ast)) {\n if (plan.ast.kind === 'select') {\n return evaluateSelectAst(plan, plan.ast, ctx);\n }\n return;\n }\n\n return evaluateWithHeuristics(plan, ctx);\n },\n\n async onRow(\n _row: Record<string, unknown>,\n plan: ExecutionPlan,\n _ctx: MiddlewareContext<TContract>,\n ) {\n const state = observedRowsByPlan.get(plan);\n if (!state) return;\n state.count += 1;\n if (state.count > maxRows) {\n throw runtimeError('BUDGET.ROWS_EXCEEDED', 'Observed row count exceeds budget', {\n source: 'observed',\n observedRows: state.count,\n maxRows,\n });\n }\n },\n\n async afterExecute(\n _plan: ExecutionPlan,\n result: AfterExecuteResult,\n ctx: MiddlewareContext<TContract>,\n ) {\n const latencyMs = result.latencyMs;\n if (latencyMs > maxLatencyMs) {\n const shouldBlock = ctx.mode === 'strict';\n emitBudgetViolation(\n runtimeError('BUDGET.TIME_EXCEEDED', 'Query latency exceeds budget', {\n latencyMs,\n maxLatencyMs,\n }),\n shouldBlock,\n ctx as MiddlewareContext<unknown>,\n );\n }\n },\n });\n\n function evaluateSelectAst(\n plan: ExecutionPlan,\n ast: SelectAst,\n ctx: MiddlewareContext<TContract>,\n ) {\n const hasAggNoGroup = hasAggregateWithoutGroupBy(ast);\n const estimated = estimateRowsFromAst(\n ast,\n tableRows,\n defaultTableRows,\n plan.meta.refs,\n hasAggNoGroup,\n );\n const isUnbounded = ast.limit === undefined && !hasAggNoGroup;\n const shouldBlock = rowSeverity === 'error' || ctx.mode === 'strict';\n\n if (isUnbounded) {\n if (estimated !== null && estimated >= maxRows) {\n emitBudgetViolation(\n runtimeError('BUDGET.ROWS_EXCEEDED', 'Unbounded SELECT query exceeds budget', {\n source: 'ast',\n estimatedRows: estimated,\n maxRows,\n }),\n shouldBlock,\n ctx as MiddlewareContext<unknown>,\n );\n return;\n }\n\n emitBudgetViolation(\n runtimeError('BUDGET.ROWS_EXCEEDED', 'Unbounded SELECT query exceeds budget', {\n source: 'ast',\n maxRows,\n }),\n shouldBlock,\n ctx as MiddlewareContext<unknown>,\n );\n return;\n }\n\n if (estimated !== null && estimated > maxRows) {\n emitBudgetViolation(\n runtimeError('BUDGET.ROWS_EXCEEDED', 'Estimated row count exceeds budget', {\n source: 'ast',\n estimatedRows: estimated,\n maxRows,\n }),\n shouldBlock,\n ctx as MiddlewareContext<unknown>,\n );\n }\n }\n\n async function evaluateWithHeuristics(plan: ExecutionPlan, ctx: MiddlewareContext<TContract>) {\n const estimated = estimateRowsFromHeuristics(plan, tableRows, defaultTableRows);\n const isUnbounded = !hasDetectableLimitFromHeuristics(plan);\n const sqlUpper = plan.sql.trimStart().toUpperCase();\n const isSelect = sqlUpper.startsWith('SELECT');\n const shouldBlock = rowSeverity === 'error' || ctx.mode === 'strict';\n\n if (isSelect && isUnbounded) {\n if (estimated !== null && estimated >= maxRows) {\n emitBudgetViolation(\n runtimeError('BUDGET.ROWS_EXCEEDED', 'Unbounded SELECT query exceeds budget', {\n source: 'heuristic',\n estimatedRows: estimated,\n maxRows,\n }),\n shouldBlock,\n ctx as MiddlewareContext<unknown>,\n );\n return;\n }\n\n emitBudgetViolation(\n runtimeError('BUDGET.ROWS_EXCEEDED', 'Unbounded SELECT query exceeds budget', {\n source: 'heuristic',\n maxRows,\n }),\n shouldBlock,\n ctx as MiddlewareContext<unknown>,\n );\n return;\n }\n\n if (estimated !== null) {\n if (estimated > maxRows) {\n emitBudgetViolation(\n runtimeError('BUDGET.ROWS_EXCEEDED', 'Estimated row count exceeds budget', {\n source: 'heuristic',\n estimatedRows: estimated,\n maxRows,\n }),\n shouldBlock,\n ctx as MiddlewareContext<unknown>,\n );\n }\n return;\n }\n }\n}\n","import type { ExecutionPlan } from '@prisma-next/contract/types';\nimport { runtimeError } from '@prisma-next/framework-components/runtime';\nimport type { Middleware, MiddlewareContext } from '@prisma-next/runtime-executor';\nimport { evaluateRawGuardrails } from '@prisma-next/runtime-executor';\nimport {\n type AnyFromSource,\n type AnyQueryAst,\n isQueryAst,\n} from '@prisma-next/sql-relational-core/ast';\nimport { ifDefined } from '@prisma-next/utils/defined';\n\nexport interface LintsOptions {\n readonly severities?: {\n readonly selectStar?: 'warn' | 'error';\n readonly noLimit?: 'warn' | 'error';\n readonly deleteWithoutWhere?: 'warn' | 'error';\n readonly updateWithoutWhere?: 'warn' | 'error';\n readonly readOnlyMutation?: 'warn' | 'error';\n readonly unindexedPredicate?: 'warn' | 'error';\n };\n readonly fallbackWhenAstMissing?: 'raw' | 'skip';\n}\n\nexport interface LintFinding {\n readonly code: `LINT.${string}`;\n readonly severity: 'error' | 'warn';\n readonly message: string;\n readonly details?: Record<string, unknown>;\n}\n\nfunction getFromSourceTableDetail(source: AnyFromSource): string | undefined {\n switch (source.kind) {\n case 'table-source':\n return source.name;\n case 'derived-table-source':\n return source.alias;\n // v8 ignore next 4\n default:\n throw new Error(\n `Unsupported source kind: ${(source satisfies never as { kind: string }).kind}`,\n );\n }\n}\n\nfunction evaluateAstLints(ast: AnyQueryAst): LintFinding[] {\n const findings: LintFinding[] = [];\n\n switch (ast.kind) {\n case 'delete':\n if (ast.where === undefined) {\n findings.push({\n code: 'LINT.DELETE_WITHOUT_WHERE',\n severity: 'error',\n message:\n 'DELETE without WHERE clause blocks execution to prevent accidental full-table deletion',\n details: { table: ast.table.name },\n });\n }\n break;\n\n case 'update':\n if (ast.where === undefined) {\n findings.push({\n code: 'LINT.UPDATE_WITHOUT_WHERE',\n severity: 'error',\n message:\n 'UPDATE without WHERE clause blocks execution to prevent accidental full-table update',\n details: { table: ast.table.name },\n });\n }\n break;\n\n case 'select':\n if (ast.limit === undefined) {\n const table = getFromSourceTableDetail(ast.from);\n findings.push({\n code: 'LINT.NO_LIMIT',\n severity: 'warn',\n message: 'Unbounded SELECT may return large result sets',\n ...ifDefined('details', table !== undefined ? { table } : undefined),\n });\n }\n if (ast.selectAllIntent !== undefined) {\n const table = ast.selectAllIntent.table;\n findings.push({\n code: 'LINT.SELECT_STAR',\n severity: 'warn',\n message: 'Query selects all columns via selectAll intent',\n ...ifDefined('details', table !== undefined ? { table } : undefined),\n });\n }\n break;\n\n case 'insert':\n break;\n\n // v8 ignore next 2\n default:\n throw new Error(`Unsupported AST kind: ${(ast satisfies never as { kind: string }).kind}`);\n }\n\n return findings;\n}\n\nfunction getConfiguredSeverity(code: string, options?: LintsOptions): 'warn' | 'error' | undefined {\n const severities = options?.severities;\n if (!severities) return undefined;\n\n switch (code) {\n case 'LINT.SELECT_STAR':\n return severities.selectStar;\n case 'LINT.NO_LIMIT':\n return severities.noLimit;\n case 'LINT.DELETE_WITHOUT_WHERE':\n return severities.deleteWithoutWhere;\n case 'LINT.UPDATE_WITHOUT_WHERE':\n return severities.updateWithoutWhere;\n case 'LINT.READ_ONLY_MUTATION':\n return severities.readOnlyMutation;\n case 'LINT.UNINDEXED_PREDICATE':\n return severities.unindexedPredicate;\n default:\n return undefined;\n }\n}\n\n/**\n * AST-first lint middleware for SQL plans. When `plan.ast` is a SQL QueryAst, inspects\n * the AST structurally. When `plan.ast` is missing, falls back to raw heuristic\n * guardrails or skips linting depending on `fallbackWhenAstMissing`.\n *\n * Rules (AST-based):\n * - DELETE without WHERE: blocks execution (configurable severity, default error)\n * - UPDATE without WHERE: blocks execution (configurable severity, default error)\n * - Unbounded SELECT: warn/error (severity from noLimit)\n * - SELECT * intent: warn/error (severity from selectStar)\n *\n * Fallback: When ast is missing, `fallbackWhenAstMissing: 'raw'` uses heuristic\n * SQL parsing; `'skip'` skips all lints. Default is `'raw'`.\n */\nexport function lints<TContract = unknown>(options?: LintsOptions): Middleware<TContract> {\n const fallback = options?.fallbackWhenAstMissing ?? 'raw';\n\n return Object.freeze({\n name: 'lints',\n familyId: 'sql' as const,\n\n async beforeExecute(plan: ExecutionPlan, ctx: MiddlewareContext<TContract>) {\n if (isQueryAst(plan.ast)) {\n const findings = evaluateAstLints(plan.ast);\n\n for (const lint of findings) {\n const configuredSeverity = getConfiguredSeverity(lint.code, options);\n const effectiveSeverity = configuredSeverity ?? lint.severity;\n\n if (effectiveSeverity === 'error') {\n throw runtimeError(lint.code, lint.message, lint.details);\n }\n if (effectiveSeverity === 'warn') {\n ctx.log.warn({\n code: lint.code,\n message: lint.message,\n details: lint.details,\n });\n }\n }\n return;\n }\n\n if (fallback === 'skip') {\n return;\n }\n\n const evaluation = evaluateRawGuardrails(plan);\n for (const lint of evaluation.lints) {\n const configuredSeverity = getConfiguredSeverity(lint.code, options);\n const effectiveSeverity = configuredSeverity ?? lint.severity;\n\n if (effectiveSeverity === 'error') {\n throw runtimeError(lint.code, lint.message, lint.details);\n }\n if (effectiveSeverity === 'warn') {\n ctx.log.warn({\n code: lint.code,\n message: lint.message,\n details: lint.details,\n });\n }\n }\n },\n });\n}\n","import type { Contract, ExecutionMutationDefaultValue } from '@prisma-next/contract/types';\nimport type { ComponentDescriptor } from '@prisma-next/framework-components/components';\nimport { checkContractComponentRequirements } from '@prisma-next/framework-components/components';\nimport {\n createExecutionStack,\n type ExecutionStack,\n type RuntimeAdapterDescriptor,\n type RuntimeAdapterInstance,\n type RuntimeDriverDescriptor,\n type RuntimeDriverInstance,\n type RuntimeExtensionDescriptor,\n type RuntimeExtensionInstance,\n type RuntimeTargetDescriptor,\n type RuntimeTargetInstance,\n} from '@prisma-next/framework-components/execution';\nimport { runtimeError } from '@prisma-next/framework-components/runtime';\nimport type { SqlStorage, StorageTypeInstance } from '@prisma-next/sql-contract/types';\nimport {\n createSqlOperationRegistry,\n type SqlOperationDescriptor,\n} from '@prisma-next/sql-operations';\nimport type {\n Adapter,\n AnyQueryAst,\n CodecParamsDescriptor,\n CodecRegistry,\n LoweredStatement,\n SqlDriver,\n} from '@prisma-next/sql-relational-core/ast';\nimport { createCodecRegistry } from '@prisma-next/sql-relational-core/ast';\nimport type {\n AppliedMutationDefault,\n ExecutionContext,\n JsonSchemaValidateFn,\n JsonSchemaValidatorRegistry,\n MutationDefaultsOptions,\n TypeHelperRegistry,\n} from '@prisma-next/sql-relational-core/query-lane-context';\nimport { type as arktype } from 'arktype';\n\n/**\n * Runtime parameterized codec descriptor.\n * Provides validation schema and optional init hook for codecs that support type parameters.\n * Used at runtime to validate typeParams and create type helpers.\n *\n * This is a type alias for `CodecParamsDescriptor` from the AST layer,\n * which is the shared definition used by both adapter and runtime.\n */\nexport type RuntimeParameterizedCodecDescriptor<\n TParams = Record<string, unknown>,\n THelper = unknown,\n> = CodecParamsDescriptor<TParams, THelper>;\n\nexport interface SqlStaticContributions {\n readonly codecs: () => CodecRegistry;\n // biome-ignore lint/suspicious/noExplicitAny: needed for covariance with concrete descriptor types\n readonly parameterizedCodecs: () => ReadonlyArray<RuntimeParameterizedCodecDescriptor<any, any>>;\n readonly queryOperations?: () => ReadonlyArray<SqlOperationDescriptor>;\n readonly mutationDefaultGenerators?: () => ReadonlyArray<RuntimeMutationDefaultGenerator>;\n}\n\nexport interface RuntimeMutationDefaultGenerator {\n readonly id: string;\n readonly generate: (params?: Record<string, unknown>) => unknown;\n}\n\nexport interface SqlRuntimeTargetDescriptor<\n TTargetId extends string = string,\n TTargetInstance extends RuntimeTargetInstance<'sql', TTargetId> = RuntimeTargetInstance<\n 'sql',\n TTargetId\n >,\n> extends RuntimeTargetDescriptor<'sql', TTargetId, TTargetInstance>,\n SqlStaticContributions {}\n\nexport interface SqlRuntimeAdapterDescriptor<\n TTargetId extends string = string,\n TAdapterInstance extends RuntimeAdapterInstance<\n 'sql',\n TTargetId\n > = SqlRuntimeAdapterInstance<TTargetId>,\n> extends RuntimeAdapterDescriptor<'sql', TTargetId, TAdapterInstance>,\n SqlStaticContributions {}\n\nexport interface SqlRuntimeExtensionDescriptor<TTargetId extends string = string>\n extends RuntimeExtensionDescriptor<'sql', TTargetId, SqlRuntimeExtensionInstance<TTargetId>>,\n SqlStaticContributions {\n create(): SqlRuntimeExtensionInstance<TTargetId>;\n}\n\nexport interface SqlExecutionStack<TTargetId extends string = string> {\n readonly target: SqlRuntimeTargetDescriptor<TTargetId>;\n readonly adapter: SqlRuntimeAdapterDescriptor<TTargetId>;\n readonly extensionPacks: readonly SqlRuntimeExtensionDescriptor<TTargetId>[];\n}\n\nexport type SqlExecutionStackWithDriver<TTargetId extends string = string> = Omit<\n ExecutionStack<\n 'sql',\n TTargetId,\n SqlRuntimeAdapterInstance<TTargetId>,\n SqlRuntimeDriverInstance<TTargetId>,\n SqlRuntimeExtensionInstance<TTargetId>\n >,\n 'target' | 'adapter' | 'driver' | 'extensionPacks'\n> & {\n readonly target: SqlRuntimeTargetDescriptor<TTargetId>;\n readonly adapter: SqlRuntimeAdapterDescriptor<TTargetId, SqlRuntimeAdapterInstance<TTargetId>>;\n readonly driver:\n | RuntimeDriverDescriptor<'sql', TTargetId, unknown, SqlRuntimeDriverInstance<TTargetId>>\n | undefined;\n readonly extensionPacks: readonly SqlRuntimeExtensionDescriptor<TTargetId>[];\n};\n\nexport interface SqlRuntimeExtensionInstance<TTargetId extends string>\n extends RuntimeExtensionInstance<'sql', TTargetId> {}\n\nexport type SqlRuntimeAdapterInstance<TTargetId extends string = string> = RuntimeAdapterInstance<\n 'sql',\n TTargetId\n> &\n Adapter<AnyQueryAst, Contract<SqlStorage>, LoweredStatement>;\n\n/**\n * NOTE: Binding type is intentionally erased to unknown at this shared runtime layer.\n * Target clients (for example `postgres()`) validate and construct the concrete binding\n * before calling `driver.connect(binding)`, which keeps runtime behavior safe today.\n * A future follow-up can preserve TBinding through stack/context generics end-to-end.\n */\nexport type SqlRuntimeDriverInstance<TTargetId extends string = string> = RuntimeDriverInstance<\n 'sql',\n TTargetId\n> &\n SqlDriver<unknown>;\n\nexport function createSqlExecutionStack<TTargetId extends string>(options: {\n readonly target: SqlRuntimeTargetDescriptor<TTargetId>;\n readonly adapter: SqlRuntimeAdapterDescriptor<TTargetId>;\n readonly driver?:\n | RuntimeDriverDescriptor<'sql', TTargetId, unknown, SqlRuntimeDriverInstance<TTargetId>>\n | undefined;\n readonly extensionPacks?: readonly SqlRuntimeExtensionDescriptor<TTargetId>[] | undefined;\n}): SqlExecutionStackWithDriver<TTargetId> {\n return createExecutionStack({\n target: options.target,\n adapter: options.adapter,\n driver: options.driver,\n extensionPacks: options.extensionPacks,\n });\n}\n\nexport type { ExecutionContext, JsonSchemaValidatorRegistry, TypeHelperRegistry };\n\nexport function assertExecutionStackContractRequirements(\n contract: Contract<SqlStorage>,\n stack: SqlExecutionStack,\n): void {\n const providedComponentIds = new Set<string>([\n stack.target.id,\n stack.adapter.id,\n ...stack.extensionPacks.map((pack) => pack.id),\n ]);\n\n const result = checkContractComponentRequirements({\n contract,\n expectedTargetFamily: 'sql',\n expectedTargetId: stack.target.targetId,\n providedComponentIds,\n });\n\n if (result.familyMismatch) {\n throw runtimeError(\n 'RUNTIME.CONTRACT_FAMILY_MISMATCH',\n `Contract target family '${result.familyMismatch.actual}' does not match runtime family '${result.familyMismatch.expected}'.`,\n {\n actual: result.familyMismatch.actual,\n expected: result.familyMismatch.expected,\n },\n );\n }\n\n if (result.targetMismatch) {\n throw runtimeError(\n 'RUNTIME.CONTRACT_TARGET_MISMATCH',\n `Contract target '${result.targetMismatch.actual}' does not match runtime target descriptor '${result.targetMismatch.expected}'.`,\n {\n actual: result.targetMismatch.actual,\n expected: result.targetMismatch.expected,\n },\n );\n }\n\n if (result.missingExtensionPackIds.length > 0) {\n const packIds = result.missingExtensionPackIds;\n const packList = packIds.map((id) => `'${id}'`).join(', ');\n throw runtimeError(\n 'RUNTIME.MISSING_EXTENSION_PACK',\n `Contract requires extension pack(s) ${packList}, but runtime descriptors do not provide matching component(s).`,\n { packIds },\n );\n }\n}\n\nfunction validateTypeParams(\n typeParams: Record<string, unknown>,\n codecDescriptor: RuntimeParameterizedCodecDescriptor,\n context: { typeName?: string; tableName?: string; columnName?: string },\n): Record<string, unknown> {\n const result = codecDescriptor.paramsSchema(typeParams);\n if (result instanceof arktype.errors) {\n const messages = result.map((p: { message: string }) => p.message).join('; ');\n const locationInfo = context.typeName\n ? `type '${context.typeName}'`\n : `column '${context.tableName}.${context.columnName}'`;\n throw runtimeError(\n 'RUNTIME.TYPE_PARAMS_INVALID',\n `Invalid typeParams for ${locationInfo} (codecId: ${codecDescriptor.codecId}): ${messages}`,\n { ...context, codecId: codecDescriptor.codecId, typeParams },\n );\n }\n return result as Record<string, unknown>;\n}\n\nfunction collectParameterizedCodecDescriptors(\n contributors: ReadonlyArray<SqlStaticContributions>,\n): Map<string, RuntimeParameterizedCodecDescriptor> {\n const descriptors = new Map<string, RuntimeParameterizedCodecDescriptor>();\n\n for (const contributor of contributors) {\n for (const descriptor of contributor.parameterizedCodecs()) {\n if (descriptors.has(descriptor.codecId)) {\n throw runtimeError(\n 'RUNTIME.DUPLICATE_PARAMETERIZED_CODEC',\n `Duplicate parameterized codec descriptor for codecId '${descriptor.codecId}'.`,\n { codecId: descriptor.codecId },\n );\n }\n descriptors.set(descriptor.codecId, descriptor);\n }\n }\n\n return descriptors;\n}\n\nfunction initializeTypeHelpers(\n storageTypes: Record<string, StorageTypeInstance> | undefined,\n codecDescriptors: Map<string, RuntimeParameterizedCodecDescriptor>,\n): TypeHelperRegistry {\n const helpers: TypeHelperRegistry = {};\n\n if (!storageTypes) {\n return helpers;\n }\n\n for (const [typeName, typeInstance] of Object.entries(storageTypes)) {\n const descriptor = codecDescriptors.get(typeInstance.codecId);\n\n if (descriptor) {\n const validatedParams = validateTypeParams(typeInstance.typeParams, descriptor, {\n typeName,\n });\n\n if (descriptor.init) {\n helpers[typeName] = descriptor.init(validatedParams);\n } else {\n helpers[typeName] = typeInstance;\n }\n } else {\n helpers[typeName] = typeInstance;\n }\n }\n\n return helpers;\n}\n\nfunction validateColumnTypeParams(\n storage: SqlStorage,\n codecDescriptors: Map<string, RuntimeParameterizedCodecDescriptor>,\n): void {\n for (const [tableName, table] of Object.entries(storage.tables)) {\n for (const [columnName, column] of Object.entries(table.columns)) {\n if (column.typeParams) {\n const descriptor = codecDescriptors.get(column.codecId);\n if (descriptor) {\n validateTypeParams(column.typeParams, descriptor, { tableName, columnName });\n }\n }\n }\n }\n}\n\n/**\n * Builds a registry of compiled JSON Schema validators by scanning the contract\n * for columns whose codec descriptor provides an `init` hook returning `{ validate }`.\n *\n * Handles both:\n * - Inline `typeParams.schema` on columns\n * - `typeRef` → `storage.types[ref]` with init hook results already in `types` registry\n */\nfunction buildJsonSchemaValidatorRegistry(\n contract: Contract<SqlStorage>,\n types: TypeHelperRegistry,\n codecDescriptors: Map<string, RuntimeParameterizedCodecDescriptor>,\n): JsonSchemaValidatorRegistry | undefined {\n const validators = new Map<string, JsonSchemaValidateFn>();\n\n // Collect codec IDs that have init hooks (these produce { validate } helpers)\n const codecIdsWithInit = new Set<string>();\n for (const [codecId, descriptor] of codecDescriptors) {\n if (descriptor.init) {\n codecIdsWithInit.add(codecId);\n }\n }\n\n if (codecIdsWithInit.size === 0) {\n return undefined;\n }\n\n for (const [tableName, table] of Object.entries(contract.storage.tables)) {\n for (const [columnName, column] of Object.entries(table.columns)) {\n if (!codecIdsWithInit.has(column.codecId)) continue;\n\n const key = `${tableName}.${columnName}`;\n\n // Case 1: column references a named type → validator already compiled via init hook\n if (column.typeRef) {\n const helper = types[column.typeRef] as { validate?: JsonSchemaValidateFn } | undefined;\n if (helper?.validate) {\n validators.set(key, helper.validate);\n }\n continue;\n }\n\n // Case 2: inline typeParams with schema → compile via init hook\n if (column.typeParams) {\n const descriptor = codecDescriptors.get(column.codecId);\n if (descriptor?.init) {\n const helper = descriptor.init(column.typeParams) as\n | { validate?: JsonSchemaValidateFn }\n | undefined;\n if (helper?.validate) {\n validators.set(key, helper.validate);\n }\n }\n }\n }\n }\n\n if (validators.size === 0) return undefined;\n return {\n get: (key: string) => validators.get(key),\n size: validators.size,\n };\n}\n\nfunction collectMutationDefaultGenerators(\n contributors: ReadonlyArray<SqlStaticContributions & { readonly id: string }>,\n): ReadonlyMap<string, RuntimeMutationDefaultGenerator> {\n const generators = new Map<string, RuntimeMutationDefaultGenerator>();\n const owners = new Map<string, string>();\n\n for (const contributor of contributors) {\n const nextGenerators = contributor.mutationDefaultGenerators?.() ?? [];\n for (const generator of nextGenerators) {\n const existingOwner = owners.get(generator.id);\n if (existingOwner !== undefined) {\n throw runtimeError(\n 'RUNTIME.DUPLICATE_MUTATION_DEFAULT_GENERATOR',\n `Duplicate mutation default generator '${generator.id}'.`,\n {\n id: generator.id,\n existingOwner,\n incomingOwner: contributor.id,\n },\n );\n }\n generators.set(generator.id, generator);\n owners.set(generator.id, contributor.id);\n }\n }\n\n return generators;\n}\n\nfunction computeExecutionDefaultValue(\n spec: ExecutionMutationDefaultValue,\n generatorRegistry: ReadonlyMap<string, RuntimeMutationDefaultGenerator>,\n): unknown {\n switch (spec.kind) {\n case 'generator': {\n const generator = generatorRegistry.get(spec.id);\n if (!generator) {\n throw runtimeError(\n 'RUNTIME.MUTATION_DEFAULT_GENERATOR_MISSING',\n `Contract references mutation default generator '${spec.id}' but no runtime component provides it.`,\n {\n id: spec.id,\n },\n );\n }\n // nosemgrep: javascript.express.security.express-wkhtml-injection.express-wkhtmltoimage-injection\n return generator.generate(spec.params);\n }\n }\n}\n\nfunction applyMutationDefaults(\n contract: Contract<SqlStorage>,\n generatorRegistry: ReadonlyMap<string, RuntimeMutationDefaultGenerator>,\n options: MutationDefaultsOptions,\n): ReadonlyArray<AppliedMutationDefault> {\n const defaults = contract.execution?.mutations.defaults ?? [];\n if (defaults.length === 0) {\n return [];\n }\n\n const applied: AppliedMutationDefault[] = [];\n const appliedColumns = new Set<string>();\n\n for (const mutationDefault of defaults) {\n if (mutationDefault.ref.table !== options.table) {\n continue;\n }\n\n const defaultSpec =\n options.op === 'create' ? mutationDefault.onCreate : mutationDefault.onUpdate;\n if (!defaultSpec) {\n continue;\n }\n\n const columnName = mutationDefault.ref.column;\n if (Object.hasOwn(options.values, columnName) || appliedColumns.has(columnName)) {\n continue;\n }\n\n applied.push({\n column: columnName,\n value: computeExecutionDefaultValue(defaultSpec, generatorRegistry),\n });\n appliedColumns.add(columnName);\n }\n\n return applied;\n}\n\nexport function createExecutionContext<\n TContract extends Contract<SqlStorage> = Contract<SqlStorage>,\n TTargetId extends string = string,\n>(options: {\n readonly contract: TContract;\n readonly stack: SqlExecutionStack<TTargetId>;\n}): ExecutionContext<TContract> {\n const { contract, stack } = options;\n\n assertExecutionStackContractRequirements(contract, stack);\n\n const codecRegistry = createCodecRegistry();\n\n const contributors: Array<SqlStaticContributions & ComponentDescriptor<string>> = [\n stack.target,\n stack.adapter,\n ...stack.extensionPacks,\n ];\n\n for (const contributor of contributors) {\n for (const c of contributor.codecs().values()) {\n codecRegistry.register(c);\n }\n }\n\n const queryOperationRegistry = createSqlOperationRegistry();\n for (const contributor of contributors) {\n for (const op of contributor.queryOperations?.() ?? []) {\n queryOperationRegistry.register(op);\n }\n }\n\n const parameterizedCodecDescriptors = collectParameterizedCodecDescriptors(contributors);\n const mutationDefaultGeneratorRegistry = collectMutationDefaultGenerators(contributors);\n\n if (parameterizedCodecDescriptors.size > 0) {\n validateColumnTypeParams(contract.storage, parameterizedCodecDescriptors);\n }\n\n const types = initializeTypeHelpers(contract.storage.types, parameterizedCodecDescriptors);\n\n const jsonSchemaValidators = buildJsonSchemaValidatorRegistry(\n contract,\n types,\n parameterizedCodecDescriptors,\n );\n\n return {\n contract,\n codecs: codecRegistry,\n queryOperations: queryOperationRegistry,\n types,\n ...(jsonSchemaValidators ? { jsonSchemaValidators } : {}),\n applyMutationDefaults: (options) =>\n applyMutationDefaults(contract, mutationDefaultGeneratorRegistry, options),\n };\n}\n","import type { MarkerStatement } from '@prisma-next/runtime-executor';\n\nexport interface SqlStatement {\n readonly sql: string;\n readonly params: readonly unknown[];\n}\n\nexport interface WriteMarkerInput {\n readonly storageHash: string;\n readonly profileHash: string;\n readonly contractJson?: unknown;\n readonly canonicalVersion?: number;\n readonly appTag?: string;\n readonly meta?: Record<string, unknown>;\n}\n\nexport const ensureSchemaStatement: SqlStatement = {\n sql: 'create schema if not exists prisma_contract',\n params: [],\n};\n\nexport const ensureTableStatement: SqlStatement = {\n sql: `create table if not exists prisma_contract.marker (\n id smallint primary key default 1,\n core_hash text not null,\n profile_hash text not null,\n contract_json jsonb,\n canonical_version int,\n updated_at timestamptz not null default now(),\n app_tag text,\n meta jsonb not null default '{}'\n )`,\n params: [],\n};\n\nexport function readContractMarker(): MarkerStatement {\n return {\n sql: `select\n core_hash,\n profile_hash,\n contract_json,\n canonical_version,\n updated_at,\n app_tag,\n meta\n from prisma_contract.marker\n where id = $1`,\n params: [1],\n };\n}\n\nexport interface WriteContractMarkerStatements {\n readonly insert: SqlStatement;\n readonly update: SqlStatement;\n}\n\nexport function writeContractMarker(input: WriteMarkerInput): WriteContractMarkerStatements {\n const baseParams: readonly unknown[] = [\n 1,\n input.storageHash,\n input.profileHash,\n input.contractJson ?? null,\n input.canonicalVersion ?? null,\n input.appTag ?? null,\n JSON.stringify(input.meta ?? {}),\n ];\n\n const insert: SqlStatement = {\n sql: `insert into prisma_contract.marker (\n id,\n core_hash,\n profile_hash,\n contract_json,\n canonical_version,\n updated_at,\n app_tag,\n meta\n ) values (\n $1,\n $2,\n $3,\n $4::jsonb,\n $5,\n now(),\n $6,\n $7::jsonb\n )`,\n params: baseParams,\n };\n\n const update: SqlStatement = {\n sql: `update prisma_contract.marker set\n core_hash = $2,\n profile_hash = $3,\n contract_json = $4::jsonb,\n canonical_version = $5,\n updated_at = now(),\n app_tag = $6,\n meta = $7::jsonb\n where id = $1`,\n params: baseParams,\n };\n\n return { insert, update };\n}\n","import { runtimeError } from '@prisma-next/framework-components/runtime';\nimport type {\n JsonSchemaValidationError,\n JsonSchemaValidatorRegistry,\n} from '@prisma-next/sql-relational-core/query-lane-context';\n\n/**\n * Validates a JSON value against its column's JSON Schema, if a validator exists.\n *\n * Throws `RUNTIME.JSON_SCHEMA_VALIDATION_FAILED` on validation failure.\n * No-ops if no validator is registered for the column.\n */\nexport function validateJsonValue(\n registry: JsonSchemaValidatorRegistry,\n table: string,\n column: string,\n value: unknown,\n direction: 'encode' | 'decode',\n codecId?: string,\n): void {\n const key = `${table}.${column}`;\n const validate = registry.get(key);\n if (!validate) return;\n\n const result = validate(value);\n if (result.valid) return;\n\n throw createJsonSchemaValidationError(table, column, direction, result.errors, codecId);\n}\n\nfunction createJsonSchemaValidationError(\n table: string,\n column: string,\n direction: 'encode' | 'decode',\n errors: ReadonlyArray<JsonSchemaValidationError>,\n codecId?: string,\n): Error {\n const summary = formatErrorSummary(errors);\n return runtimeError(\n 'RUNTIME.JSON_SCHEMA_VALIDATION_FAILED',\n `JSON schema validation failed for column '${table}.${column}' (${direction}): ${summary}`,\n {\n table,\n column,\n codecId,\n direction,\n errors: [...errors],\n },\n );\n}\n\nfunction formatErrorSummary(errors: ReadonlyArray<JsonSchemaValidationError>): string {\n if (errors.length === 0) return 'unknown validation error';\n if (errors.length === 1) {\n const err = errors[0] as JsonSchemaValidationError;\n return err.path === '/' ? err.message : `${err.path}: ${err.message}`;\n }\n return errors\n .map((err) => (err.path === '/' ? err.message : `${err.path}: ${err.message}`))\n .join('; ');\n}\n","import type { ExecutionPlan } from '@prisma-next/contract/types';\nimport type { Codec, CodecRegistry } from '@prisma-next/sql-relational-core/ast';\nimport type { JsonSchemaValidatorRegistry } from '@prisma-next/sql-relational-core/query-lane-context';\nimport { validateJsonValue } from './json-schema-validation';\n\nfunction resolveRowCodec(\n alias: string,\n plan: ExecutionPlan,\n registry: CodecRegistry,\n): Codec | null {\n const planCodecId = plan.meta.annotations?.codecs?.[alias] as string | undefined;\n if (planCodecId) {\n const codec = registry.get(planCodecId);\n if (codec) {\n return codec;\n }\n }\n\n if (plan.meta.projectionTypes) {\n const typeId = plan.meta.projectionTypes[alias];\n if (typeId) {\n const codec = registry.get(typeId);\n if (codec) {\n return codec;\n }\n }\n }\n\n return null;\n}\n\ntype ColumnRefIndex = Map<string, { table: string; column: string }>;\n\n/**\n * Builds a lookup index from column name → { table, column } ref.\n * Called once per decodeRow invocation to avoid O(aliases × refs) linear scans.\n */\nfunction buildColumnRefIndex(plan: ExecutionPlan): ColumnRefIndex | null {\n const columns = plan.meta.refs?.columns;\n if (!columns) return null;\n\n const index: ColumnRefIndex = new Map();\n for (const ref of columns) {\n index.set(ref.column, ref);\n }\n return index;\n}\n\nfunction parseProjectionRef(value: string): { table: string; column: string } | null {\n if (value.startsWith('include:') || value.startsWith('operation:')) {\n return null;\n }\n\n const separatorIndex = value.indexOf('.');\n if (separatorIndex <= 0 || separatorIndex === value.length - 1) {\n return null;\n }\n\n return {\n table: value.slice(0, separatorIndex),\n column: value.slice(separatorIndex + 1),\n };\n}\n\nfunction resolveColumnRefForAlias(\n alias: string,\n projection: ExecutionPlan['meta']['projection'],\n fallbackColumnRefIndex: ColumnRefIndex | null,\n): { table: string; column: string } | undefined {\n if (projection && !Array.isArray(projection)) {\n const mappedRef = (projection as Record<string, string>)[alias];\n if (typeof mappedRef !== 'string') {\n return undefined;\n }\n return parseProjectionRef(mappedRef) ?? undefined;\n }\n\n return fallbackColumnRefIndex?.get(alias);\n}\n\nexport function decodeRow(\n row: Record<string, unknown>,\n plan: ExecutionPlan,\n registry: CodecRegistry,\n jsonValidators?: JsonSchemaValidatorRegistry,\n): Record<string, unknown> {\n const decoded: Record<string, unknown> = {};\n const projection = plan.meta.projection;\n\n // Fallback for plans that do not provide projection alias -> table.column mapping.\n const fallbackColumnRefIndex =\n jsonValidators && (!projection || Array.isArray(projection)) ? buildColumnRefIndex(plan) : null;\n\n let aliases: readonly string[];\n if (projection && !Array.isArray(projection)) {\n aliases = Object.keys(projection);\n } else if (projection && Array.isArray(projection)) {\n aliases = projection;\n } else {\n aliases = Object.keys(row);\n }\n\n for (const alias of aliases) {\n const wireValue = row[alias];\n\n const projectionValue =\n projection && typeof projection === 'object' && !Array.isArray(projection)\n ? (projection as Record<string, string>)[alias]\n : undefined;\n\n if (typeof projectionValue === 'string' && projectionValue.startsWith('include:')) {\n if (wireValue === null || wireValue === undefined) {\n decoded[alias] = [];\n continue;\n }\n\n try {\n let parsed: unknown;\n if (typeof wireValue === 'string') {\n parsed = JSON.parse(wireValue);\n } else if (Array.isArray(wireValue)) {\n parsed = wireValue;\n } else {\n parsed = JSON.parse(String(wireValue));\n }\n\n if (!Array.isArray(parsed)) {\n throw new Error(`Expected array for include alias '${alias}', got ${typeof parsed}`);\n }\n\n decoded[alias] = parsed;\n } catch (error) {\n const decodeError = new Error(\n `Failed to parse JSON array for include alias '${alias}': ${error instanceof Error ? error.message : String(error)}`,\n ) as Error & {\n code: string;\n category: string;\n severity: string;\n details?: Record<string, unknown>;\n };\n decodeError.code = 'RUNTIME.DECODE_FAILED';\n decodeError.category = 'RUNTIME';\n decodeError.severity = 'error';\n decodeError.details = {\n alias,\n wirePreview:\n typeof wireValue === 'string' && wireValue.length > 100\n ? `${wireValue.substring(0, 100)}...`\n : String(wireValue).substring(0, 100),\n };\n throw decodeError;\n }\n continue;\n }\n\n if (wireValue === null || wireValue === undefined) {\n decoded[alias] = wireValue;\n continue;\n }\n\n const codec = resolveRowCodec(alias, plan, registry);\n\n if (!codec) {\n decoded[alias] = wireValue;\n continue;\n }\n\n try {\n const decodedValue = codec.decode(wireValue);\n\n // Validate decoded JSON value against schema\n if (jsonValidators) {\n const ref = resolveColumnRefForAlias(alias, projection, fallbackColumnRefIndex);\n if (ref) {\n validateJsonValue(\n jsonValidators,\n ref.table,\n ref.column,\n decodedValue,\n 'decode',\n codec.id,\n );\n }\n }\n\n decoded[alias] = decodedValue;\n } catch (error) {\n // Re-throw JSON schema validation errors as-is\n if (\n error instanceof Error &&\n 'code' in error &&\n (error as Error & { code: string }).code === 'RUNTIME.JSON_SCHEMA_VALIDATION_FAILED'\n ) {\n throw error;\n }\n\n const decodeError = new Error(\n `Failed to decode row alias '${alias}' with codec '${codec.id}': ${error instanceof Error ? error.message : String(error)}`,\n ) as Error & {\n code: string;\n category: string;\n severity: string;\n details?: Record<string, unknown>;\n };\n decodeError.code = 'RUNTIME.DECODE_FAILED';\n decodeError.category = 'RUNTIME';\n decodeError.severity = 'error';\n decodeError.details = {\n alias,\n codec: codec.id,\n wirePreview:\n typeof wireValue === 'string' && wireValue.length > 100\n ? `${wireValue.substring(0, 100)}...`\n : String(wireValue).substring(0, 100),\n };\n throw decodeError;\n }\n }\n\n return decoded;\n}\n","import type { ExecutionPlan, ParamDescriptor } from '@prisma-next/contract/types';\nimport type { Codec, CodecRegistry } from '@prisma-next/sql-relational-core/ast';\n\nfunction resolveParamCodec(\n paramDescriptor: ParamDescriptor,\n registry: CodecRegistry,\n): Codec | null {\n if (paramDescriptor.codecId) {\n const codec = registry.get(paramDescriptor.codecId);\n if (codec) {\n return codec;\n }\n }\n\n return null;\n}\n\nexport function encodeParam(\n value: unknown,\n paramDescriptor: ParamDescriptor,\n paramIndex: number,\n registry: CodecRegistry,\n): unknown {\n if (value === null || value === undefined) {\n return null;\n }\n\n const codec = resolveParamCodec(paramDescriptor, registry);\n if (!codec) {\n return value;\n }\n\n if (codec.encode) {\n try {\n return codec.encode(value);\n } catch (error) {\n const label = paramDescriptor.name ?? `param[${paramIndex}]`;\n throw new Error(\n `Failed to encode parameter ${label}: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n return value;\n}\n\nexport function encodeParams(plan: ExecutionPlan, registry: CodecRegistry): readonly unknown[] {\n if (plan.params.length === 0) {\n return plan.params;\n }\n\n const encoded: unknown[] = [];\n\n for (let i = 0; i < plan.params.length; i++) {\n const paramValue = plan.params[i];\n const paramDescriptor = plan.meta.paramDescriptors[i];\n\n if (paramDescriptor) {\n encoded.push(encodeParam(paramValue, paramDescriptor, i, registry));\n } else {\n encoded.push(paramValue);\n }\n }\n\n return Object.freeze(encoded);\n}\n","import type { Contract, ExecutionPlan } from '@prisma-next/contract/types';\nimport { runtimeError } from '@prisma-next/framework-components/runtime';\nimport type { MarkerReader, RuntimeFamilyAdapter } from '@prisma-next/runtime-executor';\nimport type { SqlStorage } from '@prisma-next/sql-contract/types';\nimport type { AdapterProfile } from '@prisma-next/sql-relational-core/ast';\n\nexport class SqlFamilyAdapter<TContract extends Contract<SqlStorage>>\n implements RuntimeFamilyAdapter<TContract>\n{\n readonly contract: TContract;\n readonly markerReader: MarkerReader;\n\n constructor(contract: TContract, adapterProfile: AdapterProfile) {\n this.contract = contract;\n this.markerReader = adapterProfile;\n }\n\n validatePlan(plan: ExecutionPlan, contract: TContract): void {\n if (plan.meta.target !== contract.target) {\n throw runtimeError('PLAN.TARGET_MISMATCH', 'Plan target does not match runtime target', {\n planTarget: plan.meta.target,\n runtimeTarget: contract.target,\n });\n }\n\n if (plan.meta.storageHash !== contract.storage.storageHash) {\n throw runtimeError(\n 'PLAN.HASH_MISMATCH',\n 'Plan storage hash does not match runtime contract',\n {\n planStorageHash: plan.meta.storageHash,\n runtimeStorageHash: contract.storage.storageHash,\n },\n );\n }\n }\n}\n","import type { Contract, ExecutionPlan } from '@prisma-next/contract/types';\nimport type {\n ExecutionStackInstance,\n RuntimeDriverInstance,\n} from '@prisma-next/framework-components/execution';\nimport { checkMiddlewareCompatibility } from '@prisma-next/framework-components/runtime';\nimport type {\n Log,\n Middleware,\n RuntimeCore,\n RuntimeCoreOptions,\n RuntimeTelemetryEvent,\n RuntimeVerifyOptions,\n TelemetryOutcome,\n} from '@prisma-next/runtime-executor';\nimport {\n AsyncIterableResult,\n createRuntimeCore,\n runtimeError,\n} from '@prisma-next/runtime-executor';\nimport type { SqlStorage } from '@prisma-next/sql-contract/types';\nimport type {\n Adapter,\n AnyQueryAst,\n CodecRegistry,\n LoweredStatement,\n SqlDriver,\n} from '@prisma-next/sql-relational-core/ast';\nimport type { SqlQueryPlan } from '@prisma-next/sql-relational-core/plan';\nimport type { JsonSchemaValidatorRegistry } from '@prisma-next/sql-relational-core/query-lane-context';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport { decodeRow } from './codecs/decoding';\nimport { encodeParams } from './codecs/encoding';\nimport { validateCodecRegistryCompleteness } from './codecs/validation';\nimport { lowerSqlPlan } from './lower-sql-plan';\nimport type {\n ExecutionContext,\n SqlRuntimeAdapterInstance,\n SqlRuntimeExtensionInstance,\n} from './sql-context';\nimport { SqlFamilyAdapter } from './sql-family-adapter';\n\nexport interface RuntimeOptions<TContract extends Contract<SqlStorage> = Contract<SqlStorage>> {\n readonly context: ExecutionContext<TContract>;\n readonly adapter: Adapter<AnyQueryAst, Contract<SqlStorage>, LoweredStatement>;\n readonly driver: SqlDriver<unknown>;\n readonly verify: RuntimeVerifyOptions;\n readonly middleware?: readonly Middleware<TContract>[];\n readonly mode?: 'strict' | 'permissive';\n readonly log?: Log;\n}\n\nexport interface CreateRuntimeOptions<\n TContract extends Contract<SqlStorage> = Contract<SqlStorage>,\n TTargetId extends string = string,\n> {\n readonly stackInstance: ExecutionStackInstance<\n 'sql',\n TTargetId,\n SqlRuntimeAdapterInstance<TTargetId>,\n RuntimeDriverInstance<'sql', TTargetId>,\n SqlRuntimeExtensionInstance<TTargetId>\n >;\n readonly context: ExecutionContext<TContract>;\n readonly driver: SqlDriver<unknown>;\n readonly verify: RuntimeVerifyOptions;\n readonly middleware?: readonly Middleware<TContract>[];\n readonly mode?: 'strict' | 'permissive';\n readonly log?: Log;\n}\n\nexport interface Runtime extends RuntimeQueryable {\n connection(): Promise<RuntimeConnection>;\n telemetry(): RuntimeTelemetryEvent | null;\n close(): Promise<void>;\n}\n\nexport interface RuntimeConnection extends RuntimeQueryable {\n transaction(): Promise<RuntimeTransaction>;\n /**\n * Returns the connection to the pool for reuse. Only call this when the\n * connection is known to be in a clean state. If a transaction\n * commit/rollback failed or the connection is otherwise suspect, call\n * `destroy(reason)` instead.\n */\n release(): Promise<void>;\n /**\n * Evicts the connection so it is never reused. Call this when the\n * connection may be in an indeterminate state (e.g. a failed rollback\n * leaving an open transaction, or a broken socket).\n *\n * If teardown fails the error is propagated and the connection remains\n * retryable, so the caller can decide whether to swallow the failure or\n * retry cleanup. Calling destroy() or release() more than once after a\n * successful teardown is caller error.\n *\n * `reason` is advisory context only. It may be surfaced to driver-level\n * observability hooks (e.g. pg-pool's `'release'` event) but does not\n * influence eviction behavior and is not rethrown.\n */\n destroy(reason?: unknown): Promise<void>;\n}\n\nexport interface RuntimeTransaction extends RuntimeQueryable {\n commit(): Promise<void>;\n rollback(): Promise<void>;\n}\n\nexport interface RuntimeQueryable {\n execute<Row = Record<string, unknown>>(\n plan: ExecutionPlan<Row> | SqlQueryPlan<Row>,\n ): AsyncIterableResult<Row>;\n}\n\nexport interface TransactionContext extends RuntimeQueryable {\n readonly invalidated: boolean;\n}\n\ninterface CoreQueryable {\n execute<Row = Record<string, unknown>>(plan: ExecutionPlan<Row>): AsyncIterableResult<Row>;\n}\n\nexport type { RuntimeTelemetryEvent, RuntimeVerifyOptions, TelemetryOutcome };\n\nclass SqlRuntimeImpl<TContract extends Contract<SqlStorage> = Contract<SqlStorage>>\n implements Runtime\n{\n private readonly core: RuntimeCore<TContract, SqlDriver<unknown>>;\n private readonly contract: TContract;\n private readonly adapter: Adapter<AnyQueryAst, Contract<SqlStorage>, LoweredStatement>;\n private readonly codecRegistry: CodecRegistry;\n private readonly jsonSchemaValidators: JsonSchemaValidatorRegistry | undefined;\n private codecRegistryValidated: boolean;\n\n constructor(options: RuntimeOptions<TContract>) {\n const { context, adapter, driver, verify, middleware, mode, log } = options;\n this.contract = context.contract;\n this.adapter = adapter;\n this.codecRegistry = context.codecs;\n this.jsonSchemaValidators = context.jsonSchemaValidators;\n this.codecRegistryValidated = false;\n\n if (middleware) {\n for (const mw of middleware) {\n checkMiddlewareCompatibility(mw, 'sql', context.contract.target);\n }\n }\n\n const familyAdapter = new SqlFamilyAdapter(context.contract, adapter.profile);\n\n const coreOptions: RuntimeCoreOptions<TContract, SqlDriver<unknown>> = {\n familyAdapter,\n driver,\n verify,\n ...ifDefined('middleware', middleware),\n ...ifDefined('mode', mode),\n ...ifDefined('log', log),\n };\n\n this.core = createRuntimeCore(coreOptions);\n\n if (verify.mode === 'startup') {\n validateCodecRegistryCompleteness(this.codecRegistry, context.contract);\n this.codecRegistryValidated = true;\n }\n }\n\n private ensureCodecRegistryValidated(contract: Contract<SqlStorage>): void {\n if (!this.codecRegistryValidated) {\n validateCodecRegistryCompleteness(this.codecRegistry, contract);\n this.codecRegistryValidated = true;\n }\n }\n\n private toExecutionPlan<Row>(plan: ExecutionPlan<Row> | SqlQueryPlan<Row>): ExecutionPlan<Row> {\n const isSqlQueryPlan = (p: ExecutionPlan<Row> | SqlQueryPlan<Row>): p is SqlQueryPlan<Row> => {\n return 'ast' in p && !('sql' in p);\n };\n\n return isSqlQueryPlan(plan) ? lowerSqlPlan(this.adapter, this.contract, plan) : plan;\n }\n\n private executeAgainstQueryable<Row = Record<string, unknown>>(\n plan: ExecutionPlan<Row> | SqlQueryPlan<Row>,\n queryable: CoreQueryable,\n ): AsyncIterableResult<Row> {\n this.ensureCodecRegistryValidated(this.contract);\n const executablePlan = this.toExecutionPlan(plan);\n\n const iterator = async function* (\n self: SqlRuntimeImpl<TContract>,\n ): AsyncGenerator<Row, void, unknown> {\n const encodedParams = encodeParams(executablePlan, self.codecRegistry);\n const planWithEncodedParams: ExecutionPlan<Row> = {\n ...executablePlan,\n params: encodedParams,\n };\n\n const coreIterator = queryable.execute(planWithEncodedParams);\n\n for await (const rawRow of coreIterator) {\n const decodedRow = decodeRow(\n rawRow as Record<string, unknown>,\n executablePlan,\n self.codecRegistry,\n self.jsonSchemaValidators,\n );\n yield decodedRow as Row;\n }\n };\n\n return new AsyncIterableResult(iterator(this));\n }\n\n execute<Row = Record<string, unknown>>(\n plan: ExecutionPlan<Row> | SqlQueryPlan<Row>,\n ): AsyncIterableResult<Row> {\n return this.executeAgainstQueryable(plan, this.core);\n }\n\n async connection(): Promise<RuntimeConnection> {\n const coreConn = await this.core.connection();\n const self = this;\n const wrappedConnection: RuntimeConnection = {\n async transaction(): Promise<RuntimeTransaction> {\n const coreTx = await coreConn.transaction();\n return {\n commit: coreTx.commit.bind(coreTx),\n rollback: coreTx.rollback.bind(coreTx),\n execute<Row = Record<string, unknown>>(\n plan: ExecutionPlan<Row> | SqlQueryPlan<Row>,\n ): AsyncIterableResult<Row> {\n return self.executeAgainstQueryable(plan, coreTx);\n },\n };\n },\n release: coreConn.release.bind(coreConn),\n destroy: coreConn.destroy.bind(coreConn),\n execute<Row = Record<string, unknown>>(\n plan: ExecutionPlan<Row> | SqlQueryPlan<Row>,\n ): AsyncIterableResult<Row> {\n return self.executeAgainstQueryable(plan, coreConn);\n },\n };\n return wrappedConnection;\n }\n\n telemetry(): RuntimeTelemetryEvent | null {\n return this.core.telemetry();\n }\n\n close(): Promise<void> {\n return this.core.close();\n }\n}\n\nfunction transactionClosedError(): Error {\n return runtimeError(\n 'RUNTIME.TRANSACTION_CLOSED',\n 'Cannot read from a query result after the transaction has ended. Await the result or call .toArray() inside the transaction callback.',\n {},\n );\n}\n\nexport async function withTransaction<R>(\n runtime: Runtime,\n fn: (tx: TransactionContext) => PromiseLike<R>,\n): Promise<R> {\n const connection = await runtime.connection();\n const transaction = await connection.transaction();\n\n let invalidated = false;\n const txContext: TransactionContext = {\n get invalidated() {\n return invalidated;\n },\n execute<Row = Record<string, unknown>>(\n plan: ExecutionPlan<Row> | SqlQueryPlan<Row>,\n ): AsyncIterableResult<Row> {\n if (invalidated) {\n throw transactionClosedError();\n }\n const inner = transaction.execute(plan);\n const guarded = async function* (): AsyncGenerator<Row, void, unknown> {\n for await (const row of inner) {\n if (invalidated) {\n throw transactionClosedError();\n }\n yield row;\n }\n };\n return new AsyncIterableResult(guarded());\n },\n };\n\n let connectionDisposed = false;\n const destroyConnection = async (reason: unknown): Promise<void> => {\n if (connectionDisposed) return;\n connectionDisposed = true;\n // SqlConnection.destroy() propagates teardown errors so callers can\n // decide what to do with them. Here, we're already about to throw a\n // more informative error describing why we're evicting the connection\n // (rollback/commit failure), so swallowing the teardown error is the\n // right call — surfacing it would mask the original cause.\n await connection.destroy(reason).catch(() => undefined);\n };\n\n try {\n let result: R;\n try {\n result = await fn(txContext);\n } catch (error) {\n try {\n await transaction.rollback();\n } catch (rollbackError) {\n await destroyConnection(rollbackError);\n const wrapped = runtimeError(\n 'RUNTIME.TRANSACTION_ROLLBACK_FAILED',\n 'Transaction rollback failed after callback error',\n { rollbackError },\n );\n wrapped.cause = error;\n throw wrapped;\n }\n throw error;\n } finally {\n invalidated = true;\n }\n\n try {\n await transaction.commit();\n } catch (commitError) {\n // After a failed COMMIT the server-side transaction may be: (a) already\n // committed (error on response path), (b) already rolled back (deferred\n // constraint / serialization failure), or (c) still open (COMMIT never\n // reached the server). Attempt a best-effort rollback to cover (c) and\n // confirm the protocol is healthy.\n //\n // If rollback succeeds, the server is definitely no longer in a\n // transaction (no-op in (a)/(b), real cleanup in (c)) and we've just\n // proved the connection round-trips correctly — it's safe to return\n // to the pool. If rollback fails, the connection state is ambiguous\n // (broken socket, protocol desync, etc.) and we must destroy it.\n try {\n await transaction.rollback();\n } catch {\n await destroyConnection(commitError);\n }\n const wrapped = runtimeError(\n 'RUNTIME.TRANSACTION_COMMIT_FAILED',\n 'Transaction commit failed',\n { commitError },\n );\n wrapped.cause = commitError;\n throw wrapped;\n }\n return result;\n } finally {\n if (!connectionDisposed) {\n await connection.release();\n }\n }\n}\n\nexport function createRuntime<TContract extends Contract<SqlStorage>, TTargetId extends string>(\n options: CreateRuntimeOptions<TContract, TTargetId>,\n): Runtime {\n const { stackInstance, context, driver, verify, middleware, mode, log } = options;\n\n return new SqlRuntimeImpl({\n context,\n adapter: stackInstance.adapter,\n driver,\n verify,\n ...ifDefined('middleware', middleware),\n ...ifDefined('mode', mode),\n ...ifDefined('log', log),\n });\n}\n"],"mappings":"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"}
@@ -171,7 +171,28 @@ interface Runtime extends RuntimeQueryable {
171
171
  }
172
172
  interface RuntimeConnection extends RuntimeQueryable {
173
173
  transaction(): Promise<RuntimeTransaction>;
174
+ /**
175
+ * Returns the connection to the pool for reuse. Only call this when the
176
+ * connection is known to be in a clean state. If a transaction
177
+ * commit/rollback failed or the connection is otherwise suspect, call
178
+ * `destroy(reason)` instead.
179
+ */
174
180
  release(): Promise<void>;
181
+ /**
182
+ * Evicts the connection so it is never reused. Call this when the
183
+ * connection may be in an indeterminate state (e.g. a failed rollback
184
+ * leaving an open transaction, or a broken socket).
185
+ *
186
+ * If teardown fails the error is propagated and the connection remains
187
+ * retryable, so the caller can decide whether to swallow the failure or
188
+ * retry cleanup. Calling destroy() or release() more than once after a
189
+ * successful teardown is caller error.
190
+ *
191
+ * `reason` is advisory context only. It may be surfaced to driver-level
192
+ * observability hooks (e.g. pg-pool's `'release'` event) but does not
193
+ * influence eviction behavior and is not rethrown.
194
+ */
195
+ destroy(reason?: unknown): Promise<void>;
175
196
  }
176
197
  interface RuntimeTransaction extends RuntimeQueryable {
177
198
  commit(): Promise<void>;
@@ -180,7 +201,11 @@ interface RuntimeTransaction extends RuntimeQueryable {
180
201
  interface RuntimeQueryable {
181
202
  execute<Row = Record<string, unknown>>(plan: ExecutionPlan<Row> | SqlQueryPlan<Row>): AsyncIterableResult<Row>;
182
203
  }
204
+ interface TransactionContext extends RuntimeQueryable {
205
+ readonly invalidated: boolean;
206
+ }
207
+ declare function withTransaction<R>(runtime: Runtime, fn: (tx: TransactionContext) => PromiseLike<R>): Promise<R>;
183
208
  declare function createRuntime<TContract extends Contract<SqlStorage>, TTargetId extends string>(options: CreateRuntimeOptions<TContract, TTargetId>): Runtime;
184
209
  //#endregion
185
- export { createSqlExecutionStack as A, validateContractCodecMappings as B, SqlRuntimeDriverInstance as C, SqlStaticContributions as D, SqlRuntimeTargetDescriptor as E, BudgetsOptions as F, budgets as I, lowerSqlPlan as L, SqlMiddlewareContext as M, LintsOptions as N, TypeHelperRegistry as O, lints as P, extractCodecIds as R, SqlRuntimeAdapterInstance as S, SqlRuntimeExtensionInstance as T, RuntimeMutationDefaultGenerator as _, CreateRuntimeOptions as a, SqlExecutionStackWithDriver as b, RuntimeVerifyOptions as c, SqlStatement as d, ensureSchemaStatement as f, ExecutionContext as g, writeContractMarker as h, MiddlewareContext as i, SqlMiddleware as j, createExecutionContext as k, TelemetryOutcome as l, readContractMarker as m, Log$1 as n, Runtime as o, ensureTableStatement as p, Middleware$1 as r, RuntimeTelemetryEvent as s, AfterExecuteResult$1 as t, createRuntime as u, RuntimeParameterizedCodecDescriptor as v, SqlRuntimeExtensionDescriptor as w, SqlRuntimeAdapterDescriptor as x, SqlExecutionStack as y, validateCodecRegistryCompleteness as z };
186
- //# sourceMappingURL=index-n6z6trta.d.mts.map
210
+ export { SqlRuntimeExtensionInstance as A, BudgetsOptions as B, RuntimeParameterizedCodecDescriptor as C, SqlRuntimeAdapterInstance as D, SqlRuntimeAdapterDescriptor as E, createSqlExecutionStack as F, validateContractCodecMappings as G, lowerSqlPlan as H, SqlMiddleware as I, SqlMiddlewareContext as L, SqlStaticContributions as M, TypeHelperRegistry as N, SqlRuntimeDriverInstance as O, createExecutionContext as P, LintsOptions as R, RuntimeMutationDefaultGenerator as S, SqlExecutionStackWithDriver as T, extractCodecIds as U, budgets as V, validateCodecRegistryCompleteness as W, ensureSchemaStatement as _, CreateRuntimeOptions as a, writeContractMarker as b, RuntimeQueryable as c, RuntimeVerifyOptions as d, TelemetryOutcome as f, SqlStatement as g, withTransaction as h, MiddlewareContext as i, SqlRuntimeTargetDescriptor as j, SqlRuntimeExtensionDescriptor as k, RuntimeTelemetryEvent as l, createRuntime as m, Log$1 as n, Runtime as o, TransactionContext as p, Middleware$1 as r, RuntimeConnection as s, AfterExecuteResult$1 as t, RuntimeTransaction as u, ensureTableStatement as v, SqlExecutionStack as w, ExecutionContext as x, readContractMarker as y, lints as z };
211
+ //# sourceMappingURL=index-DyDQ4fyK.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index-n6z6trta.d.mts","names":[],"sources":["../src/codecs/validation.ts","../src/lower-sql-plan.ts","../src/middleware/budgets.ts","../src/middleware/lints.ts","../src/middleware/sql-middleware.ts","../src/sql-context.ts","../src/sql-marker.ts","../src/sql-runtime.ts"],"sourcesContent":[],"mappings":"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"}
1
+ {"version":3,"file":"index-DyDQ4fyK.d.mts","names":[],"sources":["../src/codecs/validation.ts","../src/lower-sql-plan.ts","../src/middleware/budgets.ts","../src/middleware/lints.ts","../src/middleware/sql-middleware.ts","../src/sql-context.ts","../src/sql-marker.ts","../src/sql-runtime.ts"],"sourcesContent":[],"mappings":"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"}
package/dist/index.d.mts CHANGED
@@ -1,2 +1,2 @@
1
- import { A as createSqlExecutionStack, B as validateContractCodecMappings, C as SqlRuntimeDriverInstance, D as SqlStaticContributions, E as SqlRuntimeTargetDescriptor, F as BudgetsOptions, I as budgets, L as lowerSqlPlan, M as SqlMiddlewareContext, N as LintsOptions, O as TypeHelperRegistry, P as lints, R as extractCodecIds, S as SqlRuntimeAdapterInstance, T as SqlRuntimeExtensionInstance, _ as RuntimeMutationDefaultGenerator, a as CreateRuntimeOptions, b as SqlExecutionStackWithDriver, c as RuntimeVerifyOptions, d as SqlStatement, f as ensureSchemaStatement, g as ExecutionContext, h as writeContractMarker, i as MiddlewareContext, j as SqlMiddleware, k as createExecutionContext, l as TelemetryOutcome, m as readContractMarker, n as Log, o as Runtime, p as ensureTableStatement, r as Middleware, s as RuntimeTelemetryEvent, t as AfterExecuteResult, u as createRuntime, v as RuntimeParameterizedCodecDescriptor, w as SqlRuntimeExtensionDescriptor, x as SqlRuntimeAdapterDescriptor, y as SqlExecutionStack, z as validateCodecRegistryCompleteness } from "./index-n6z6trta.mjs";
2
- export { AfterExecuteResult, BudgetsOptions, CreateRuntimeOptions, ExecutionContext, LintsOptions, Log, Middleware, MiddlewareContext, Runtime, RuntimeMutationDefaultGenerator, RuntimeParameterizedCodecDescriptor, RuntimeTelemetryEvent, RuntimeVerifyOptions, SqlExecutionStack, SqlExecutionStackWithDriver, SqlMiddleware, SqlMiddlewareContext, SqlRuntimeAdapterDescriptor, SqlRuntimeAdapterInstance, SqlRuntimeDriverInstance, SqlRuntimeExtensionDescriptor, SqlRuntimeExtensionInstance, SqlRuntimeTargetDescriptor, SqlStatement, SqlStaticContributions, TelemetryOutcome, TypeHelperRegistry, budgets, createExecutionContext, createRuntime, createSqlExecutionStack, ensureSchemaStatement, ensureTableStatement, extractCodecIds, lints, lowerSqlPlan, readContractMarker, validateCodecRegistryCompleteness, validateContractCodecMappings, writeContractMarker };
1
+ import { A as SqlRuntimeExtensionInstance, B as BudgetsOptions, C as RuntimeParameterizedCodecDescriptor, D as SqlRuntimeAdapterInstance, E as SqlRuntimeAdapterDescriptor, F as createSqlExecutionStack, G as validateContractCodecMappings, H as lowerSqlPlan, I as SqlMiddleware, L as SqlMiddlewareContext, M as SqlStaticContributions, N as TypeHelperRegistry, O as SqlRuntimeDriverInstance, P as createExecutionContext, R as LintsOptions, S as RuntimeMutationDefaultGenerator, T as SqlExecutionStackWithDriver, U as extractCodecIds, V as budgets, W as validateCodecRegistryCompleteness, _ as ensureSchemaStatement, a as CreateRuntimeOptions, b as writeContractMarker, c as RuntimeQueryable, d as RuntimeVerifyOptions, f as TelemetryOutcome, g as SqlStatement, h as withTransaction, i as MiddlewareContext, j as SqlRuntimeTargetDescriptor, k as SqlRuntimeExtensionDescriptor, l as RuntimeTelemetryEvent, m as createRuntime, n as Log, o as Runtime, p as TransactionContext, r as Middleware, s as RuntimeConnection, t as AfterExecuteResult, u as RuntimeTransaction, v as ensureTableStatement, w as SqlExecutionStack, x as ExecutionContext, y as readContractMarker, z as lints } from "./index-DyDQ4fyK.mjs";
2
+ export { AfterExecuteResult, BudgetsOptions, CreateRuntimeOptions, ExecutionContext, LintsOptions, Log, Middleware, MiddlewareContext, Runtime, RuntimeConnection, RuntimeMutationDefaultGenerator, RuntimeParameterizedCodecDescriptor, RuntimeQueryable, RuntimeTelemetryEvent, RuntimeTransaction, RuntimeVerifyOptions, SqlExecutionStack, SqlExecutionStackWithDriver, SqlMiddleware, SqlMiddlewareContext, SqlRuntimeAdapterDescriptor, SqlRuntimeAdapterInstance, SqlRuntimeDriverInstance, SqlRuntimeExtensionDescriptor, SqlRuntimeExtensionInstance, SqlRuntimeTargetDescriptor, SqlStatement, SqlStaticContributions, TelemetryOutcome, TransactionContext, TypeHelperRegistry, budgets, createExecutionContext, createRuntime, createSqlExecutionStack, ensureSchemaStatement, ensureTableStatement, extractCodecIds, lints, lowerSqlPlan, readContractMarker, validateCodecRegistryCompleteness, validateContractCodecMappings, withTransaction, writeContractMarker };
package/dist/index.mjs CHANGED
@@ -1,3 +1,3 @@
1
- import { a as writeContractMarker, c as lints, d as extractCodecIds, f as validateCodecRegistryCompleteness, i as readContractMarker, l as budgets, n as ensureSchemaStatement, o as createExecutionContext, p as validateContractCodecMappings, r as ensureTableStatement, s as createSqlExecutionStack, t as createRuntime, u as lowerSqlPlan } from "./exports-BO6Fl7yn.mjs";
1
+ import { a as readContractMarker, c as createSqlExecutionStack, d as lowerSqlPlan, f as extractCodecIds, i as ensureTableStatement, l as lints, m as validateContractCodecMappings, n as withTransaction, o as writeContractMarker, p as validateCodecRegistryCompleteness, r as ensureSchemaStatement, s as createExecutionContext, t as createRuntime, u as budgets } from "./exports-Cv7I7ZD5.mjs";
2
2
 
3
- export { budgets, createExecutionContext, createRuntime, createSqlExecutionStack, ensureSchemaStatement, ensureTableStatement, extractCodecIds, lints, lowerSqlPlan, readContractMarker, validateCodecRegistryCompleteness, validateContractCodecMappings, writeContractMarker };
3
+ export { budgets, createExecutionContext, createRuntime, createSqlExecutionStack, ensureSchemaStatement, ensureTableStatement, extractCodecIds, lints, lowerSqlPlan, readContractMarker, validateCodecRegistryCompleteness, validateContractCodecMappings, withTransaction, writeContractMarker };
@@ -1,4 +1,4 @@
1
- import { C as SqlRuntimeDriverInstance, E as SqlRuntimeTargetDescriptor, S as SqlRuntimeAdapterInstance, T as SqlRuntimeExtensionInstance, d as SqlStatement, g as ExecutionContext, u as createRuntime, w as SqlRuntimeExtensionDescriptor, x as SqlRuntimeAdapterDescriptor } from "../index-n6z6trta.mjs";
1
+ import { A as SqlRuntimeExtensionInstance, D as SqlRuntimeAdapterInstance, E as SqlRuntimeAdapterDescriptor, O as SqlRuntimeDriverInstance, g as SqlStatement, j as SqlRuntimeTargetDescriptor, k as SqlRuntimeExtensionDescriptor, m as createRuntime, x as ExecutionContext } from "../index-DyDQ4fyK.mjs";
2
2
  import { Adapter, LoweredStatement, SelectAst } from "@prisma-next/sql-relational-core/ast";
3
3
  import * as _prisma_next_framework_components_execution0 from "@prisma-next/framework-components/execution";
4
4
  import { RuntimeDriverDescriptor } from "@prisma-next/framework-components/execution";
@@ -1,4 +1,4 @@
1
- import { a as writeContractMarker, n as ensureSchemaStatement, o as createExecutionContext, r as ensureTableStatement, s as createSqlExecutionStack } from "../exports-BO6Fl7yn.mjs";
1
+ import { c as createSqlExecutionStack, i as ensureTableStatement, o as writeContractMarker, r as ensureSchemaStatement, s as createExecutionContext } from "../exports-Cv7I7ZD5.mjs";
2
2
  import { codec, createCodecRegistry } from "@prisma-next/sql-relational-core/ast";
3
3
  import { instantiateExecutionStack } from "@prisma-next/framework-components/execution";
4
4
  import { coreHash, profileHash } from "@prisma-next/contract/types";
package/package.json CHANGED
@@ -1,20 +1,20 @@
1
1
  {
2
2
  "name": "@prisma-next/sql-runtime",
3
- "version": "0.4.0-dev.9",
3
+ "version": "0.4.1",
4
4
  "type": "module",
5
5
  "sideEffects": false,
6
6
  "description": "SQL runtime implementation for Prisma Next",
7
7
  "dependencies": {
8
8
  "arktype": "^2.1.26",
9
- "@prisma-next/contract": "0.4.0-dev.9",
10
- "@prisma-next/utils": "0.4.0-dev.9",
11
- "@prisma-next/framework-components": "0.4.0-dev.9",
12
- "@prisma-next/ids": "0.4.0-dev.9",
13
- "@prisma-next/operations": "0.4.0-dev.9",
14
- "@prisma-next/sql-operations": "0.4.0-dev.9",
15
- "@prisma-next/runtime-executor": "0.4.0-dev.9",
16
- "@prisma-next/sql-relational-core": "0.4.0-dev.9",
17
- "@prisma-next/sql-contract": "0.4.0-dev.9"
9
+ "@prisma-next/contract": "0.4.1",
10
+ "@prisma-next/utils": "0.4.1",
11
+ "@prisma-next/framework-components": "0.4.1",
12
+ "@prisma-next/ids": "0.4.1",
13
+ "@prisma-next/operations": "0.4.1",
14
+ "@prisma-next/sql-operations": "0.4.1",
15
+ "@prisma-next/runtime-executor": "0.4.1",
16
+ "@prisma-next/sql-relational-core": "0.4.1",
17
+ "@prisma-next/sql-contract": "0.4.1"
18
18
  },
19
19
  "devDependencies": {
20
20
  "@types/pg": "8.16.0",
@@ -22,8 +22,8 @@
22
22
  "tsdown": "0.18.4",
23
23
  "typescript": "5.9.3",
24
24
  "vitest": "4.0.17",
25
- "@prisma-next/tsconfig": "0.0.0",
26
25
  "@prisma-next/test-utils": "0.0.1",
26
+ "@prisma-next/tsconfig": "0.0.0",
27
27
  "@prisma-next/tsdown": "0.0.0"
28
28
  },
29
29
  "files": [
@@ -44,8 +44,12 @@ export {
44
44
  export type {
45
45
  CreateRuntimeOptions,
46
46
  Runtime,
47
+ RuntimeConnection,
48
+ RuntimeQueryable,
47
49
  RuntimeTelemetryEvent,
50
+ RuntimeTransaction,
48
51
  RuntimeVerifyOptions,
49
52
  TelemetryOutcome,
53
+ TransactionContext,
50
54
  } from '../sql-runtime';
51
- export { createRuntime } from '../sql-runtime';
55
+ export { createRuntime, withTransaction } from '../sql-runtime';
@@ -13,7 +13,11 @@ import type {
13
13
  RuntimeVerifyOptions,
14
14
  TelemetryOutcome,
15
15
  } from '@prisma-next/runtime-executor';
16
- import { AsyncIterableResult, createRuntimeCore } from '@prisma-next/runtime-executor';
16
+ import {
17
+ AsyncIterableResult,
18
+ createRuntimeCore,
19
+ runtimeError,
20
+ } from '@prisma-next/runtime-executor';
17
21
  import type { SqlStorage } from '@prisma-next/sql-contract/types';
18
22
  import type {
19
23
  Adapter,
@@ -73,7 +77,28 @@ export interface Runtime extends RuntimeQueryable {
73
77
 
74
78
  export interface RuntimeConnection extends RuntimeQueryable {
75
79
  transaction(): Promise<RuntimeTransaction>;
80
+ /**
81
+ * Returns the connection to the pool for reuse. Only call this when the
82
+ * connection is known to be in a clean state. If a transaction
83
+ * commit/rollback failed or the connection is otherwise suspect, call
84
+ * `destroy(reason)` instead.
85
+ */
76
86
  release(): Promise<void>;
87
+ /**
88
+ * Evicts the connection so it is never reused. Call this when the
89
+ * connection may be in an indeterminate state (e.g. a failed rollback
90
+ * leaving an open transaction, or a broken socket).
91
+ *
92
+ * If teardown fails the error is propagated and the connection remains
93
+ * retryable, so the caller can decide whether to swallow the failure or
94
+ * retry cleanup. Calling destroy() or release() more than once after a
95
+ * successful teardown is caller error.
96
+ *
97
+ * `reason` is advisory context only. It may be surfaced to driver-level
98
+ * observability hooks (e.g. pg-pool's `'release'` event) but does not
99
+ * influence eviction behavior and is not rethrown.
100
+ */
101
+ destroy(reason?: unknown): Promise<void>;
77
102
  }
78
103
 
79
104
  export interface RuntimeTransaction extends RuntimeQueryable {
@@ -87,6 +112,10 @@ export interface RuntimeQueryable {
87
112
  ): AsyncIterableResult<Row>;
88
113
  }
89
114
 
115
+ export interface TransactionContext extends RuntimeQueryable {
116
+ readonly invalidated: boolean;
117
+ }
118
+
90
119
  interface CoreQueryable {
91
120
  execute<Row = Record<string, unknown>>(plan: ExecutionPlan<Row>): AsyncIterableResult<Row>;
92
121
  }
@@ -206,6 +235,7 @@ class SqlRuntimeImpl<TContract extends Contract<SqlStorage> = Contract<SqlStorag
206
235
  };
207
236
  },
208
237
  release: coreConn.release.bind(coreConn),
238
+ destroy: coreConn.destroy.bind(coreConn),
209
239
  execute<Row = Record<string, unknown>>(
210
240
  plan: ExecutionPlan<Row> | SqlQueryPlan<Row>,
211
241
  ): AsyncIterableResult<Row> {
@@ -224,6 +254,114 @@ class SqlRuntimeImpl<TContract extends Contract<SqlStorage> = Contract<SqlStorag
224
254
  }
225
255
  }
226
256
 
257
+ function transactionClosedError(): Error {
258
+ return runtimeError(
259
+ 'RUNTIME.TRANSACTION_CLOSED',
260
+ 'Cannot read from a query result after the transaction has ended. Await the result or call .toArray() inside the transaction callback.',
261
+ {},
262
+ );
263
+ }
264
+
265
+ export async function withTransaction<R>(
266
+ runtime: Runtime,
267
+ fn: (tx: TransactionContext) => PromiseLike<R>,
268
+ ): Promise<R> {
269
+ const connection = await runtime.connection();
270
+ const transaction = await connection.transaction();
271
+
272
+ let invalidated = false;
273
+ const txContext: TransactionContext = {
274
+ get invalidated() {
275
+ return invalidated;
276
+ },
277
+ execute<Row = Record<string, unknown>>(
278
+ plan: ExecutionPlan<Row> | SqlQueryPlan<Row>,
279
+ ): AsyncIterableResult<Row> {
280
+ if (invalidated) {
281
+ throw transactionClosedError();
282
+ }
283
+ const inner = transaction.execute(plan);
284
+ const guarded = async function* (): AsyncGenerator<Row, void, unknown> {
285
+ for await (const row of inner) {
286
+ if (invalidated) {
287
+ throw transactionClosedError();
288
+ }
289
+ yield row;
290
+ }
291
+ };
292
+ return new AsyncIterableResult(guarded());
293
+ },
294
+ };
295
+
296
+ let connectionDisposed = false;
297
+ const destroyConnection = async (reason: unknown): Promise<void> => {
298
+ if (connectionDisposed) return;
299
+ connectionDisposed = true;
300
+ // SqlConnection.destroy() propagates teardown errors so callers can
301
+ // decide what to do with them. Here, we're already about to throw a
302
+ // more informative error describing why we're evicting the connection
303
+ // (rollback/commit failure), so swallowing the teardown error is the
304
+ // right call — surfacing it would mask the original cause.
305
+ await connection.destroy(reason).catch(() => undefined);
306
+ };
307
+
308
+ try {
309
+ let result: R;
310
+ try {
311
+ result = await fn(txContext);
312
+ } catch (error) {
313
+ try {
314
+ await transaction.rollback();
315
+ } catch (rollbackError) {
316
+ await destroyConnection(rollbackError);
317
+ const wrapped = runtimeError(
318
+ 'RUNTIME.TRANSACTION_ROLLBACK_FAILED',
319
+ 'Transaction rollback failed after callback error',
320
+ { rollbackError },
321
+ );
322
+ wrapped.cause = error;
323
+ throw wrapped;
324
+ }
325
+ throw error;
326
+ } finally {
327
+ invalidated = true;
328
+ }
329
+
330
+ try {
331
+ await transaction.commit();
332
+ } catch (commitError) {
333
+ // After a failed COMMIT the server-side transaction may be: (a) already
334
+ // committed (error on response path), (b) already rolled back (deferred
335
+ // constraint / serialization failure), or (c) still open (COMMIT never
336
+ // reached the server). Attempt a best-effort rollback to cover (c) and
337
+ // confirm the protocol is healthy.
338
+ //
339
+ // If rollback succeeds, the server is definitely no longer in a
340
+ // transaction (no-op in (a)/(b), real cleanup in (c)) and we've just
341
+ // proved the connection round-trips correctly — it's safe to return
342
+ // to the pool. If rollback fails, the connection state is ambiguous
343
+ // (broken socket, protocol desync, etc.) and we must destroy it.
344
+ try {
345
+ await transaction.rollback();
346
+ } catch {
347
+ await destroyConnection(commitError);
348
+ }
349
+ const wrapped = runtimeError(
350
+ 'RUNTIME.TRANSACTION_COMMIT_FAILED',
351
+ 'Transaction commit failed',
352
+ { commitError },
353
+ );
354
+ wrapped.cause = commitError;
355
+ throw wrapped;
356
+ }
357
+ return result;
358
+ } finally {
359
+ if (!connectionDisposed) {
360
+ await connection.release();
361
+ }
362
+ }
363
+ }
364
+
227
365
  export function createRuntime<TContract extends Contract<SqlStorage>, TTargetId extends string>(
228
366
  options: CreateRuntimeOptions<TContract, TTargetId>,
229
367
  ): Runtime {
@@ -21,7 +21,7 @@ import type {
21
21
  SqlRuntimeTargetDescriptor,
22
22
  } from '../src/sql-context';
23
23
  import { createExecutionContext, createSqlExecutionStack } from '../src/sql-context';
24
- import { createRuntime } from '../src/sql-runtime';
24
+ import { createRuntime, withTransaction } from '../src/sql-runtime';
25
25
 
26
26
  const testContract: Contract<SqlStorage> = {
27
27
  targetFamily: 'sql',
@@ -35,13 +35,18 @@ const testContract: Contract<SqlStorage> = {
35
35
  meta: {},
36
36
  };
37
37
 
38
- interface DriverExecuteSpies {
38
+ interface DriverMockSpies {
39
39
  rootExecute: ReturnType<typeof vi.fn>;
40
40
  connectionExecute: ReturnType<typeof vi.fn>;
41
41
  transactionExecute: ReturnType<typeof vi.fn>;
42
+ connectionRelease: ReturnType<typeof vi.fn>;
43
+ connectionDestroy: ReturnType<typeof vi.fn>;
44
+ transactionCommit: ReturnType<typeof vi.fn>;
45
+ transactionRollback: ReturnType<typeof vi.fn>;
46
+ driverClose: ReturnType<typeof vi.fn>;
42
47
  }
43
48
 
44
- type MockSqlDriver = SqlDriver & { __spies: DriverExecuteSpies };
49
+ type MockSqlDriver = SqlDriver & { __spies: DriverMockSpies };
45
50
 
46
51
  function createStubCodecs(): CodecRegistry {
47
52
  const registry = createCodecRegistry();
@@ -112,15 +117,18 @@ function createMockDriver(): MockSqlDriver {
112
117
  execute: connectionExecute,
113
118
  query,
114
119
  release: vi.fn().mockResolvedValue(undefined),
120
+ destroy: vi.fn().mockResolvedValue(undefined),
115
121
  beginTransaction: vi.fn().mockResolvedValue(transaction),
116
122
  };
117
123
 
124
+ const driverClose = vi.fn().mockResolvedValue(undefined);
125
+
118
126
  const driver: SqlDriver = {
119
127
  execute: rootExecute,
120
128
  query,
121
129
  connect: vi.fn().mockImplementation(async (_binding?: undefined) => undefined),
122
130
  acquireConnection: vi.fn().mockResolvedValue(connection),
123
- close: vi.fn().mockResolvedValue(undefined),
131
+ close: driverClose,
124
132
  };
125
133
 
126
134
  return Object.assign(driver, {
@@ -128,6 +136,11 @@ function createMockDriver(): MockSqlDriver {
128
136
  rootExecute,
129
137
  connectionExecute,
130
138
  transactionExecute,
139
+ connectionRelease: connection.release,
140
+ connectionDestroy: connection.destroy,
141
+ transactionCommit: transaction.commit,
142
+ transactionRollback: transaction.rollback,
143
+ driverClose,
131
144
  },
132
145
  });
133
146
  }
@@ -287,6 +300,24 @@ describe('createRuntime', () => {
287
300
  await connection.release();
288
301
  });
289
302
 
303
+ it('delegates connection.destroy() to the driver connection', async () => {
304
+ const { stackInstance, context, driver } = createTestSetup();
305
+ const runtime = createRuntime({
306
+ stackInstance,
307
+ context,
308
+ driver,
309
+ verify: { mode: 'onFirstUse', requireMarker: false },
310
+ });
311
+
312
+ const connection = await runtime.connection();
313
+ const reason = new Error('bad state');
314
+ await connection.destroy(reason);
315
+
316
+ expect(driver.__spies.connectionDestroy).toHaveBeenCalledOnce();
317
+ expect(driver.__spies.connectionDestroy).toHaveBeenCalledWith(reason);
318
+ expect(driver.__spies.connectionRelease).not.toHaveBeenCalled();
319
+ });
320
+
290
321
  it('uses transaction queryable for transaction.execute', async () => {
291
322
  const { stackInstance, context, driver } = createTestSetup();
292
323
  const runtime = createRuntime({
@@ -365,3 +396,242 @@ describe('createRuntime', () => {
365
396
  );
366
397
  });
367
398
  });
399
+
400
+ describe('withTransaction', () => {
401
+ function createRuntimeForTransaction() {
402
+ const { stackInstance, context, driver } = createTestSetup();
403
+ const runtime = createRuntime({
404
+ stackInstance,
405
+ context,
406
+ driver,
407
+ verify: { mode: 'onFirstUse', requireMarker: false },
408
+ });
409
+ return { runtime, driver };
410
+ }
411
+
412
+ it('commits on successful callback and returns the result', async () => {
413
+ const { runtime, driver } = createRuntimeForTransaction();
414
+
415
+ const result = await withTransaction(runtime, async (tx) => {
416
+ await tx.execute(createRawExecutionPlan()).toArray();
417
+ return 42;
418
+ });
419
+
420
+ expect(result).toBe(42);
421
+ expect(driver.__spies.transactionCommit).toHaveBeenCalledOnce();
422
+ expect(driver.__spies.transactionRollback).not.toHaveBeenCalled();
423
+ expect(driver.__spies.connectionRelease).toHaveBeenCalledOnce();
424
+ });
425
+
426
+ it('rolls back on callback error and re-throws', async () => {
427
+ const { runtime, driver } = createRuntimeForTransaction();
428
+ const error = new Error('test error');
429
+
430
+ await expect(
431
+ withTransaction(runtime, async () => {
432
+ throw error;
433
+ }),
434
+ ).rejects.toBe(error);
435
+
436
+ expect(driver.__spies.transactionRollback).toHaveBeenCalledOnce();
437
+ expect(driver.__spies.transactionCommit).not.toHaveBeenCalled();
438
+ expect(driver.__spies.connectionRelease).toHaveBeenCalledOnce();
439
+ });
440
+
441
+ it('releases connection after commit', async () => {
442
+ const { runtime, driver } = createRuntimeForTransaction();
443
+
444
+ await withTransaction(runtime, async () => 'ok');
445
+
446
+ expect(driver.__spies.connectionRelease).toHaveBeenCalledOnce();
447
+ });
448
+
449
+ it('releases connection after rollback', async () => {
450
+ const { runtime, driver } = createRuntimeForTransaction();
451
+
452
+ await withTransaction(runtime, async () => {
453
+ throw new Error('fail');
454
+ }).catch(() => {});
455
+
456
+ expect(driver.__spies.connectionRelease).toHaveBeenCalledOnce();
457
+ });
458
+
459
+ it('wraps commit failure and exposes the original error as cause', async () => {
460
+ const { runtime, driver } = createRuntimeForTransaction();
461
+ const commitError = new Error('commit failed');
462
+ driver.__spies.transactionCommit.mockRejectedValueOnce(commitError);
463
+
464
+ const result = withTransaction(runtime, async () => 'value');
465
+
466
+ await expect(result).rejects.toMatchObject({
467
+ code: 'RUNTIME.TRANSACTION_COMMIT_FAILED',
468
+ cause: commitError,
469
+ });
470
+ });
471
+
472
+ it('attempts best-effort rollback after commit fails and releases when it succeeds', async () => {
473
+ const { runtime, driver } = createRuntimeForTransaction();
474
+ const commitError = new Error('commit failed');
475
+ driver.__spies.transactionCommit.mockRejectedValueOnce(commitError);
476
+
477
+ await withTransaction(runtime, async () => 'value').catch(() => {});
478
+
479
+ expect(driver.__spies.transactionCommit).toHaveBeenCalledOnce();
480
+ expect(driver.__spies.transactionRollback).toHaveBeenCalledOnce();
481
+ // A successful rollback after a failed commit means the server is no
482
+ // longer in a transaction and the connection round-tripped cleanly, so
483
+ // it is safe to return to the pool rather than evict it.
484
+ expect(driver.__spies.connectionRelease).toHaveBeenCalledOnce();
485
+ expect(driver.__spies.connectionDestroy).not.toHaveBeenCalled();
486
+ });
487
+
488
+ it('forwards the callback return value', async () => {
489
+ const { runtime } = createRuntimeForTransaction();
490
+
491
+ const result = await withTransaction(runtime, async () => ({
492
+ name: 'test',
493
+ count: 3,
494
+ }));
495
+
496
+ expect(result).toEqual({ name: 'test', count: 3 });
497
+ });
498
+
499
+ it('executes queries against the transaction', async () => {
500
+ const { runtime, driver } = createRuntimeForTransaction();
501
+
502
+ await withTransaction(runtime, async (tx) => {
503
+ await tx.execute(createRawExecutionPlan()).toArray();
504
+ });
505
+
506
+ expect(driver.__spies.transactionExecute).toHaveBeenCalledOnce();
507
+ expect(driver.__spies.rootExecute).not.toHaveBeenCalled();
508
+ expect(driver.__spies.connectionExecute).not.toHaveBeenCalled();
509
+ });
510
+
511
+ it('throws on execute after commit (invalidation)', async () => {
512
+ const { runtime } = createRuntimeForTransaction();
513
+ let savedTx: { execute: (plan: ExecutionPlan) => unknown } | undefined;
514
+
515
+ await withTransaction(runtime, async (tx) => {
516
+ savedTx = tx;
517
+ });
518
+
519
+ expect(() => savedTx!.execute(createRawExecutionPlan())).toThrow(
520
+ 'Cannot read from a query result after the transaction has ended',
521
+ );
522
+ });
523
+
524
+ it('throws on iteration of escaped AsyncIterableResult after commit', async () => {
525
+ const { runtime } = createRuntimeForTransaction();
526
+
527
+ const escaped = await withTransaction(runtime, async (tx) => {
528
+ return { result: tx.execute(createRawExecutionPlan()) };
529
+ });
530
+
531
+ await expect(escaped.result.toArray()).rejects.toThrow(
532
+ 'Cannot read from a query result after the transaction has ended',
533
+ );
534
+ });
535
+
536
+ it('sets invalidated flag after commit', async () => {
537
+ const { runtime } = createRuntimeForTransaction();
538
+ let txRef: { invalidated: boolean } | undefined;
539
+
540
+ await withTransaction(runtime, async (tx) => {
541
+ expect(tx.invalidated).toBe(false);
542
+ txRef = tx;
543
+ });
544
+
545
+ expect(txRef!.invalidated).toBe(true);
546
+ });
547
+
548
+ it('wraps original error when rollback fails', async () => {
549
+ const { runtime, driver } = createRuntimeForTransaction();
550
+ const callbackError = new Error('callback failed');
551
+ const rollbackError = new Error('rollback failed');
552
+ driver.__spies.transactionRollback.mockRejectedValueOnce(rollbackError);
553
+
554
+ const rejection = withTransaction(runtime, async () => {
555
+ throw callbackError;
556
+ });
557
+
558
+ await expect(rejection).rejects.toThrow('Transaction rollback failed after callback error');
559
+ await expect(rejection).rejects.toMatchObject({
560
+ code: 'RUNTIME.TRANSACTION_ROLLBACK_FAILED',
561
+ cause: callbackError,
562
+ details: { rollbackError },
563
+ });
564
+ expect(driver.__spies.connectionDestroy).toHaveBeenCalledOnce();
565
+ expect(driver.__spies.connectionRelease).not.toHaveBeenCalled();
566
+ });
567
+
568
+ it('destroys connection when rollback fails even if destroy also fails', async () => {
569
+ const { runtime, driver } = createRuntimeForTransaction();
570
+ const callbackError = new Error('callback failed');
571
+ const rollbackError = new Error('rollback failed');
572
+ const destroyError = new Error('destroy failed');
573
+ driver.__spies.transactionRollback.mockRejectedValueOnce(rollbackError);
574
+ driver.__spies.connectionDestroy.mockRejectedValueOnce(destroyError);
575
+
576
+ const rejection = withTransaction(runtime, async () => {
577
+ throw callbackError;
578
+ });
579
+
580
+ await expect(rejection).rejects.toMatchObject({
581
+ code: 'RUNTIME.TRANSACTION_ROLLBACK_FAILED',
582
+ cause: callbackError,
583
+ details: { rollbackError },
584
+ });
585
+ expect(driver.__spies.connectionDestroy).toHaveBeenCalledOnce();
586
+ expect(driver.__spies.connectionRelease).not.toHaveBeenCalled();
587
+ });
588
+
589
+ it('destroys connection when commit fails and best-effort rollback also fails', async () => {
590
+ const { runtime, driver } = createRuntimeForTransaction();
591
+ const commitError = new Error('commit failed');
592
+ const rollbackError = new Error('rollback also failed');
593
+ driver.__spies.transactionCommit.mockRejectedValueOnce(commitError);
594
+ driver.__spies.transactionRollback.mockRejectedValueOnce(rollbackError);
595
+
596
+ const rejection = withTransaction(runtime, async () => 'value');
597
+
598
+ await expect(rejection).rejects.toMatchObject({
599
+ code: 'RUNTIME.TRANSACTION_COMMIT_FAILED',
600
+ cause: commitError,
601
+ });
602
+ expect(driver.__spies.connectionDestroy).toHaveBeenCalledOnce();
603
+ expect(driver.__spies.connectionRelease).not.toHaveBeenCalled();
604
+ });
605
+
606
+ it('sets invalidated flag after rollback', async () => {
607
+ const { runtime } = createRuntimeForTransaction();
608
+ let txRef: { invalidated: boolean } | undefined;
609
+
610
+ await withTransaction(runtime, async (tx) => {
611
+ txRef = tx;
612
+ throw new Error('fail');
613
+ }).catch(() => {});
614
+
615
+ expect(txRef!.invalidated).toBe(true);
616
+ });
617
+
618
+ it('releases connection independently across sequential transactions', async () => {
619
+ const { runtime, driver } = createRuntimeForTransaction();
620
+
621
+ await withTransaction(runtime, async (tx) => {
622
+ await tx.execute(createRawExecutionPlan()).toArray();
623
+ });
624
+
625
+ await withTransaction(runtime, async (tx) => {
626
+ await tx.execute(createRawExecutionPlan()).toArray();
627
+ });
628
+
629
+ await withTransaction(runtime, async () => {
630
+ throw new Error('fail');
631
+ }).catch(() => {});
632
+
633
+ expect(driver.__spies.connectionRelease).toHaveBeenCalledTimes(3);
634
+ expect(driver.__spies.transactionCommit).toHaveBeenCalledTimes(2);
635
+ expect(driver.__spies.transactionRollback).toHaveBeenCalledTimes(1);
636
+ });
637
+ });
@@ -1 +0,0 @@
1
- {"version":3,"file":"exports-BO6Fl7yn.mjs","names":["invalidCodecs: Array<{ table: string; column: string; codecId: string }>","details: Record<string, unknown>","findings: LintFinding[]","arktype","helpers: TypeHelperRegistry","applied: AppliedMutationDefault[]","contributors: Array<SqlStaticContributions & ComponentDescriptor<string>>","options","ensureSchemaStatement: SqlStatement","ensureTableStatement: SqlStatement","baseParams: readonly unknown[]","codec","index: ColumnRefIndex","decoded: Record<string, unknown>","aliases: readonly string[]","parsed: unknown","codec","encoded: unknown[]","planWithEncodedParams: ExecutionPlan<Row>"],"sources":["../src/codecs/validation.ts","../src/lower-sql-plan.ts","../src/middleware/budgets.ts","../src/middleware/lints.ts","../src/sql-context.ts","../src/sql-marker.ts","../src/codecs/json-schema-validation.ts","../src/codecs/decoding.ts","../src/codecs/encoding.ts","../src/sql-family-adapter.ts","../src/sql-runtime.ts"],"sourcesContent":["import type { Contract } from '@prisma-next/contract/types';\nimport { runtimeError } from '@prisma-next/framework-components/runtime';\nimport type { SqlStorage } from '@prisma-next/sql-contract/types';\nimport type { CodecRegistry } from '@prisma-next/sql-relational-core/ast';\n\nexport function extractCodecIds(contract: Contract<SqlStorage>): Set<string> {\n const codecIds = new Set<string>();\n\n for (const table of Object.values(contract.storage.tables)) {\n for (const column of Object.values(table.columns)) {\n const codecId = column.codecId;\n codecIds.add(codecId);\n }\n }\n\n return codecIds;\n}\n\nfunction extractCodecIdsFromColumns(contract: Contract<SqlStorage>): Map<string, string> {\n const codecIds = new Map<string, string>();\n\n for (const [tableName, table] of Object.entries(contract.storage.tables)) {\n for (const [columnName, column] of Object.entries(table.columns)) {\n const codecId = column.codecId;\n const key = `${tableName}.${columnName}`;\n codecIds.set(key, codecId);\n }\n }\n\n return codecIds;\n}\n\nexport function validateContractCodecMappings(\n registry: CodecRegistry,\n contract: Contract<SqlStorage>,\n): void {\n const codecIds = extractCodecIdsFromColumns(contract);\n const invalidCodecs: Array<{ table: string; column: string; codecId: string }> = [];\n\n for (const [key, codecId] of codecIds.entries()) {\n if (!registry.has(codecId)) {\n const parts = key.split('.');\n const table = parts[0] ?? '';\n const column = parts[1] ?? '';\n invalidCodecs.push({ table, column, codecId });\n }\n }\n\n if (invalidCodecs.length > 0) {\n const details: Record<string, unknown> = {\n contractTarget: contract.target,\n invalidCodecs,\n };\n\n throw runtimeError(\n 'RUNTIME.CODEC_MISSING',\n `Missing codec implementations for column codecIds: ${invalidCodecs.map((c) => `${c.table}.${c.column} (${c.codecId})`).join(', ')}`,\n details,\n );\n }\n}\n\nexport function validateCodecRegistryCompleteness(\n registry: CodecRegistry,\n contract: Contract<SqlStorage>,\n): void {\n validateContractCodecMappings(registry, contract);\n}\n","import type { Contract, ExecutionPlan } from '@prisma-next/contract/types';\nimport type { SqlStorage } from '@prisma-next/sql-contract/types';\nimport type { Adapter, AnyQueryAst, LoweredStatement } from '@prisma-next/sql-relational-core/ast';\nimport type { SqlQueryPlan } from '@prisma-next/sql-relational-core/plan';\n\n/**\n * Lowers a SQL query plan to an executable Plan by calling the adapter's lower method.\n *\n * @param adapter - Adapter to lower AST to SQL\n * @param contract - Contract for lowering context\n * @param queryPlan - SQL query plan from a lane (contains AST, params, meta, but no SQL)\n * @returns Fully executable Plan with SQL string\n */\nexport function lowerSqlPlan<Row>(\n adapter: Adapter<AnyQueryAst, Contract<SqlStorage>, LoweredStatement>,\n contract: Contract<SqlStorage>,\n queryPlan: SqlQueryPlan<Row>,\n): ExecutionPlan<Row> {\n const lowered = adapter.lower(queryPlan.ast, {\n contract,\n params: queryPlan.params,\n });\n\n const body = lowered.body;\n\n return Object.freeze({\n sql: body.sql,\n params: body.params ?? queryPlan.params,\n ast: queryPlan.ast,\n meta: queryPlan.meta,\n });\n}\n","import type { ExecutionPlan } from '@prisma-next/contract/types';\nimport { type RuntimeErrorEnvelope, runtimeError } from '@prisma-next/framework-components/runtime';\nimport type {\n AfterExecuteResult,\n Middleware,\n MiddlewareContext,\n} from '@prisma-next/runtime-executor';\nimport { isQueryAst, type SelectAst } from '@prisma-next/sql-relational-core/ast';\n\nexport interface BudgetsOptions {\n readonly maxRows?: number;\n readonly defaultTableRows?: number;\n readonly tableRows?: Record<string, number>;\n readonly maxLatencyMs?: number;\n readonly severities?: {\n readonly rowCount?: 'warn' | 'error';\n readonly latency?: 'warn' | 'error';\n };\n}\n\nfunction hasAggregateWithoutGroupBy(ast: SelectAst): boolean {\n if (ast.groupBy !== undefined) {\n return false;\n }\n return ast.projection.some((item) => item.expr.kind === 'aggregate');\n}\n\nfunction estimateRowsFromAst(\n ast: SelectAst,\n tableRows: Record<string, number>,\n defaultTableRows: number,\n refs: { tables?: readonly string[] } | undefined,\n hasAggregateWithoutGroup: boolean,\n): number | null {\n if (hasAggregateWithoutGroup) {\n return 1;\n }\n\n const table = refs?.tables?.[0];\n if (!table) {\n return null;\n }\n\n const tableEstimate = tableRows[table] ?? defaultTableRows;\n\n if (ast.limit !== undefined) {\n return Math.min(ast.limit, tableEstimate);\n }\n\n return tableEstimate;\n}\n\nfunction estimateRowsFromHeuristics(\n plan: ExecutionPlan,\n tableRows: Record<string, number>,\n defaultTableRows: number,\n): number | null {\n const table = plan.meta.refs?.tables?.[0];\n if (!table) {\n return null;\n }\n\n const tableEstimate = tableRows[table] ?? defaultTableRows;\n\n const limit = plan.meta.annotations?.['limit'];\n if (typeof limit === 'number') {\n return Math.min(limit, tableEstimate);\n }\n\n return tableEstimate;\n}\n\nfunction hasDetectableLimitFromHeuristics(plan: ExecutionPlan): boolean {\n return typeof plan.meta.annotations?.['limit'] === 'number';\n}\n\nfunction emitBudgetViolation(\n error: RuntimeErrorEnvelope,\n shouldBlock: boolean,\n ctx: MiddlewareContext<unknown>,\n): void {\n if (shouldBlock) {\n throw error;\n }\n ctx.log.warn({\n code: error.code,\n message: error.message,\n details: error.details,\n });\n}\n\nexport function budgets<TContract = unknown>(options?: BudgetsOptions): Middleware<TContract> {\n const maxRows = options?.maxRows ?? 10_000;\n const defaultTableRows = options?.defaultTableRows ?? 10_000;\n const tableRows = options?.tableRows ?? {};\n const maxLatencyMs = options?.maxLatencyMs ?? 1_000;\n const rowSeverity = options?.severities?.rowCount ?? 'error';\n\n const observedRowsByPlan = new WeakMap<ExecutionPlan, { count: number }>();\n\n return Object.freeze({\n name: 'budgets',\n familyId: 'sql' as const,\n\n async beforeExecute(plan: ExecutionPlan, ctx: MiddlewareContext<TContract>) {\n observedRowsByPlan.set(plan, { count: 0 });\n\n if (isQueryAst(plan.ast)) {\n if (plan.ast.kind === 'select') {\n return evaluateSelectAst(plan, plan.ast, ctx);\n }\n return;\n }\n\n return evaluateWithHeuristics(plan, ctx);\n },\n\n async onRow(\n _row: Record<string, unknown>,\n plan: ExecutionPlan,\n _ctx: MiddlewareContext<TContract>,\n ) {\n const state = observedRowsByPlan.get(plan);\n if (!state) return;\n state.count += 1;\n if (state.count > maxRows) {\n throw runtimeError('BUDGET.ROWS_EXCEEDED', 'Observed row count exceeds budget', {\n source: 'observed',\n observedRows: state.count,\n maxRows,\n });\n }\n },\n\n async afterExecute(\n _plan: ExecutionPlan,\n result: AfterExecuteResult,\n ctx: MiddlewareContext<TContract>,\n ) {\n const latencyMs = result.latencyMs;\n if (latencyMs > maxLatencyMs) {\n const shouldBlock = ctx.mode === 'strict';\n emitBudgetViolation(\n runtimeError('BUDGET.TIME_EXCEEDED', 'Query latency exceeds budget', {\n latencyMs,\n maxLatencyMs,\n }),\n shouldBlock,\n ctx as MiddlewareContext<unknown>,\n );\n }\n },\n });\n\n function evaluateSelectAst(\n plan: ExecutionPlan,\n ast: SelectAst,\n ctx: MiddlewareContext<TContract>,\n ) {\n const hasAggNoGroup = hasAggregateWithoutGroupBy(ast);\n const estimated = estimateRowsFromAst(\n ast,\n tableRows,\n defaultTableRows,\n plan.meta.refs,\n hasAggNoGroup,\n );\n const isUnbounded = ast.limit === undefined && !hasAggNoGroup;\n const shouldBlock = rowSeverity === 'error' || ctx.mode === 'strict';\n\n if (isUnbounded) {\n if (estimated !== null && estimated >= maxRows) {\n emitBudgetViolation(\n runtimeError('BUDGET.ROWS_EXCEEDED', 'Unbounded SELECT query exceeds budget', {\n source: 'ast',\n estimatedRows: estimated,\n maxRows,\n }),\n shouldBlock,\n ctx as MiddlewareContext<unknown>,\n );\n return;\n }\n\n emitBudgetViolation(\n runtimeError('BUDGET.ROWS_EXCEEDED', 'Unbounded SELECT query exceeds budget', {\n source: 'ast',\n maxRows,\n }),\n shouldBlock,\n ctx as MiddlewareContext<unknown>,\n );\n return;\n }\n\n if (estimated !== null && estimated > maxRows) {\n emitBudgetViolation(\n runtimeError('BUDGET.ROWS_EXCEEDED', 'Estimated row count exceeds budget', {\n source: 'ast',\n estimatedRows: estimated,\n maxRows,\n }),\n shouldBlock,\n ctx as MiddlewareContext<unknown>,\n );\n }\n }\n\n async function evaluateWithHeuristics(plan: ExecutionPlan, ctx: MiddlewareContext<TContract>) {\n const estimated = estimateRowsFromHeuristics(plan, tableRows, defaultTableRows);\n const isUnbounded = !hasDetectableLimitFromHeuristics(plan);\n const sqlUpper = plan.sql.trimStart().toUpperCase();\n const isSelect = sqlUpper.startsWith('SELECT');\n const shouldBlock = rowSeverity === 'error' || ctx.mode === 'strict';\n\n if (isSelect && isUnbounded) {\n if (estimated !== null && estimated >= maxRows) {\n emitBudgetViolation(\n runtimeError('BUDGET.ROWS_EXCEEDED', 'Unbounded SELECT query exceeds budget', {\n source: 'heuristic',\n estimatedRows: estimated,\n maxRows,\n }),\n shouldBlock,\n ctx as MiddlewareContext<unknown>,\n );\n return;\n }\n\n emitBudgetViolation(\n runtimeError('BUDGET.ROWS_EXCEEDED', 'Unbounded SELECT query exceeds budget', {\n source: 'heuristic',\n maxRows,\n }),\n shouldBlock,\n ctx as MiddlewareContext<unknown>,\n );\n return;\n }\n\n if (estimated !== null) {\n if (estimated > maxRows) {\n emitBudgetViolation(\n runtimeError('BUDGET.ROWS_EXCEEDED', 'Estimated row count exceeds budget', {\n source: 'heuristic',\n estimatedRows: estimated,\n maxRows,\n }),\n shouldBlock,\n ctx as MiddlewareContext<unknown>,\n );\n }\n return;\n }\n }\n}\n","import type { ExecutionPlan } from '@prisma-next/contract/types';\nimport { runtimeError } from '@prisma-next/framework-components/runtime';\nimport type { Middleware, MiddlewareContext } from '@prisma-next/runtime-executor';\nimport { evaluateRawGuardrails } from '@prisma-next/runtime-executor';\nimport {\n type AnyFromSource,\n type AnyQueryAst,\n isQueryAst,\n} from '@prisma-next/sql-relational-core/ast';\nimport { ifDefined } from '@prisma-next/utils/defined';\n\nexport interface LintsOptions {\n readonly severities?: {\n readonly selectStar?: 'warn' | 'error';\n readonly noLimit?: 'warn' | 'error';\n readonly deleteWithoutWhere?: 'warn' | 'error';\n readonly updateWithoutWhere?: 'warn' | 'error';\n readonly readOnlyMutation?: 'warn' | 'error';\n readonly unindexedPredicate?: 'warn' | 'error';\n };\n readonly fallbackWhenAstMissing?: 'raw' | 'skip';\n}\n\nexport interface LintFinding {\n readonly code: `LINT.${string}`;\n readonly severity: 'error' | 'warn';\n readonly message: string;\n readonly details?: Record<string, unknown>;\n}\n\nfunction getFromSourceTableDetail(source: AnyFromSource): string | undefined {\n switch (source.kind) {\n case 'table-source':\n return source.name;\n case 'derived-table-source':\n return source.alias;\n // v8 ignore next 4\n default:\n throw new Error(\n `Unsupported source kind: ${(source satisfies never as { kind: string }).kind}`,\n );\n }\n}\n\nfunction evaluateAstLints(ast: AnyQueryAst): LintFinding[] {\n const findings: LintFinding[] = [];\n\n switch (ast.kind) {\n case 'delete':\n if (ast.where === undefined) {\n findings.push({\n code: 'LINT.DELETE_WITHOUT_WHERE',\n severity: 'error',\n message:\n 'DELETE without WHERE clause blocks execution to prevent accidental full-table deletion',\n details: { table: ast.table.name },\n });\n }\n break;\n\n case 'update':\n if (ast.where === undefined) {\n findings.push({\n code: 'LINT.UPDATE_WITHOUT_WHERE',\n severity: 'error',\n message:\n 'UPDATE without WHERE clause blocks execution to prevent accidental full-table update',\n details: { table: ast.table.name },\n });\n }\n break;\n\n case 'select':\n if (ast.limit === undefined) {\n const table = getFromSourceTableDetail(ast.from);\n findings.push({\n code: 'LINT.NO_LIMIT',\n severity: 'warn',\n message: 'Unbounded SELECT may return large result sets',\n ...ifDefined('details', table !== undefined ? { table } : undefined),\n });\n }\n if (ast.selectAllIntent !== undefined) {\n const table = ast.selectAllIntent.table;\n findings.push({\n code: 'LINT.SELECT_STAR',\n severity: 'warn',\n message: 'Query selects all columns via selectAll intent',\n ...ifDefined('details', table !== undefined ? { table } : undefined),\n });\n }\n break;\n\n case 'insert':\n break;\n\n // v8 ignore next 2\n default:\n throw new Error(`Unsupported AST kind: ${(ast satisfies never as { kind: string }).kind}`);\n }\n\n return findings;\n}\n\nfunction getConfiguredSeverity(code: string, options?: LintsOptions): 'warn' | 'error' | undefined {\n const severities = options?.severities;\n if (!severities) return undefined;\n\n switch (code) {\n case 'LINT.SELECT_STAR':\n return severities.selectStar;\n case 'LINT.NO_LIMIT':\n return severities.noLimit;\n case 'LINT.DELETE_WITHOUT_WHERE':\n return severities.deleteWithoutWhere;\n case 'LINT.UPDATE_WITHOUT_WHERE':\n return severities.updateWithoutWhere;\n case 'LINT.READ_ONLY_MUTATION':\n return severities.readOnlyMutation;\n case 'LINT.UNINDEXED_PREDICATE':\n return severities.unindexedPredicate;\n default:\n return undefined;\n }\n}\n\n/**\n * AST-first lint middleware for SQL plans. When `plan.ast` is a SQL QueryAst, inspects\n * the AST structurally. When `plan.ast` is missing, falls back to raw heuristic\n * guardrails or skips linting depending on `fallbackWhenAstMissing`.\n *\n * Rules (AST-based):\n * - DELETE without WHERE: blocks execution (configurable severity, default error)\n * - UPDATE without WHERE: blocks execution (configurable severity, default error)\n * - Unbounded SELECT: warn/error (severity from noLimit)\n * - SELECT * intent: warn/error (severity from selectStar)\n *\n * Fallback: When ast is missing, `fallbackWhenAstMissing: 'raw'` uses heuristic\n * SQL parsing; `'skip'` skips all lints. Default is `'raw'`.\n */\nexport function lints<TContract = unknown>(options?: LintsOptions): Middleware<TContract> {\n const fallback = options?.fallbackWhenAstMissing ?? 'raw';\n\n return Object.freeze({\n name: 'lints',\n familyId: 'sql' as const,\n\n async beforeExecute(plan: ExecutionPlan, ctx: MiddlewareContext<TContract>) {\n if (isQueryAst(plan.ast)) {\n const findings = evaluateAstLints(plan.ast);\n\n for (const lint of findings) {\n const configuredSeverity = getConfiguredSeverity(lint.code, options);\n const effectiveSeverity = configuredSeverity ?? lint.severity;\n\n if (effectiveSeverity === 'error') {\n throw runtimeError(lint.code, lint.message, lint.details);\n }\n if (effectiveSeverity === 'warn') {\n ctx.log.warn({\n code: lint.code,\n message: lint.message,\n details: lint.details,\n });\n }\n }\n return;\n }\n\n if (fallback === 'skip') {\n return;\n }\n\n const evaluation = evaluateRawGuardrails(plan);\n for (const lint of evaluation.lints) {\n const configuredSeverity = getConfiguredSeverity(lint.code, options);\n const effectiveSeverity = configuredSeverity ?? lint.severity;\n\n if (effectiveSeverity === 'error') {\n throw runtimeError(lint.code, lint.message, lint.details);\n }\n if (effectiveSeverity === 'warn') {\n ctx.log.warn({\n code: lint.code,\n message: lint.message,\n details: lint.details,\n });\n }\n }\n },\n });\n}\n","import type { Contract, ExecutionMutationDefaultValue } from '@prisma-next/contract/types';\nimport type { ComponentDescriptor } from '@prisma-next/framework-components/components';\nimport { checkContractComponentRequirements } from '@prisma-next/framework-components/components';\nimport {\n createExecutionStack,\n type ExecutionStack,\n type RuntimeAdapterDescriptor,\n type RuntimeAdapterInstance,\n type RuntimeDriverDescriptor,\n type RuntimeDriverInstance,\n type RuntimeExtensionDescriptor,\n type RuntimeExtensionInstance,\n type RuntimeTargetDescriptor,\n type RuntimeTargetInstance,\n} from '@prisma-next/framework-components/execution';\nimport { runtimeError } from '@prisma-next/framework-components/runtime';\nimport type { SqlStorage, StorageTypeInstance } from '@prisma-next/sql-contract/types';\nimport {\n createSqlOperationRegistry,\n type SqlOperationDescriptor,\n} from '@prisma-next/sql-operations';\nimport type {\n Adapter,\n AnyQueryAst,\n CodecParamsDescriptor,\n CodecRegistry,\n LoweredStatement,\n SqlDriver,\n} from '@prisma-next/sql-relational-core/ast';\nimport { createCodecRegistry } from '@prisma-next/sql-relational-core/ast';\nimport type {\n AppliedMutationDefault,\n ExecutionContext,\n JsonSchemaValidateFn,\n JsonSchemaValidatorRegistry,\n MutationDefaultsOptions,\n TypeHelperRegistry,\n} from '@prisma-next/sql-relational-core/query-lane-context';\nimport { type as arktype } from 'arktype';\n\n/**\n * Runtime parameterized codec descriptor.\n * Provides validation schema and optional init hook for codecs that support type parameters.\n * Used at runtime to validate typeParams and create type helpers.\n *\n * This is a type alias for `CodecParamsDescriptor` from the AST layer,\n * which is the shared definition used by both adapter and runtime.\n */\nexport type RuntimeParameterizedCodecDescriptor<\n TParams = Record<string, unknown>,\n THelper = unknown,\n> = CodecParamsDescriptor<TParams, THelper>;\n\nexport interface SqlStaticContributions {\n readonly codecs: () => CodecRegistry;\n // biome-ignore lint/suspicious/noExplicitAny: needed for covariance with concrete descriptor types\n readonly parameterizedCodecs: () => ReadonlyArray<RuntimeParameterizedCodecDescriptor<any, any>>;\n readonly queryOperations?: () => ReadonlyArray<SqlOperationDescriptor>;\n readonly mutationDefaultGenerators?: () => ReadonlyArray<RuntimeMutationDefaultGenerator>;\n}\n\nexport interface RuntimeMutationDefaultGenerator {\n readonly id: string;\n readonly generate: (params?: Record<string, unknown>) => unknown;\n}\n\nexport interface SqlRuntimeTargetDescriptor<\n TTargetId extends string = string,\n TTargetInstance extends RuntimeTargetInstance<'sql', TTargetId> = RuntimeTargetInstance<\n 'sql',\n TTargetId\n >,\n> extends RuntimeTargetDescriptor<'sql', TTargetId, TTargetInstance>,\n SqlStaticContributions {}\n\nexport interface SqlRuntimeAdapterDescriptor<\n TTargetId extends string = string,\n TAdapterInstance extends RuntimeAdapterInstance<\n 'sql',\n TTargetId\n > = SqlRuntimeAdapterInstance<TTargetId>,\n> extends RuntimeAdapterDescriptor<'sql', TTargetId, TAdapterInstance>,\n SqlStaticContributions {}\n\nexport interface SqlRuntimeExtensionDescriptor<TTargetId extends string = string>\n extends RuntimeExtensionDescriptor<'sql', TTargetId, SqlRuntimeExtensionInstance<TTargetId>>,\n SqlStaticContributions {\n create(): SqlRuntimeExtensionInstance<TTargetId>;\n}\n\nexport interface SqlExecutionStack<TTargetId extends string = string> {\n readonly target: SqlRuntimeTargetDescriptor<TTargetId>;\n readonly adapter: SqlRuntimeAdapterDescriptor<TTargetId>;\n readonly extensionPacks: readonly SqlRuntimeExtensionDescriptor<TTargetId>[];\n}\n\nexport type SqlExecutionStackWithDriver<TTargetId extends string = string> = Omit<\n ExecutionStack<\n 'sql',\n TTargetId,\n SqlRuntimeAdapterInstance<TTargetId>,\n SqlRuntimeDriverInstance<TTargetId>,\n SqlRuntimeExtensionInstance<TTargetId>\n >,\n 'target' | 'adapter' | 'driver' | 'extensionPacks'\n> & {\n readonly target: SqlRuntimeTargetDescriptor<TTargetId>;\n readonly adapter: SqlRuntimeAdapterDescriptor<TTargetId, SqlRuntimeAdapterInstance<TTargetId>>;\n readonly driver:\n | RuntimeDriverDescriptor<'sql', TTargetId, unknown, SqlRuntimeDriverInstance<TTargetId>>\n | undefined;\n readonly extensionPacks: readonly SqlRuntimeExtensionDescriptor<TTargetId>[];\n};\n\nexport interface SqlRuntimeExtensionInstance<TTargetId extends string>\n extends RuntimeExtensionInstance<'sql', TTargetId> {}\n\nexport type SqlRuntimeAdapterInstance<TTargetId extends string = string> = RuntimeAdapterInstance<\n 'sql',\n TTargetId\n> &\n Adapter<AnyQueryAst, Contract<SqlStorage>, LoweredStatement>;\n\n/**\n * NOTE: Binding type is intentionally erased to unknown at this shared runtime layer.\n * Target clients (for example `postgres()`) validate and construct the concrete binding\n * before calling `driver.connect(binding)`, which keeps runtime behavior safe today.\n * A future follow-up can preserve TBinding through stack/context generics end-to-end.\n */\nexport type SqlRuntimeDriverInstance<TTargetId extends string = string> = RuntimeDriverInstance<\n 'sql',\n TTargetId\n> &\n SqlDriver<unknown>;\n\nexport function createSqlExecutionStack<TTargetId extends string>(options: {\n readonly target: SqlRuntimeTargetDescriptor<TTargetId>;\n readonly adapter: SqlRuntimeAdapterDescriptor<TTargetId>;\n readonly driver?:\n | RuntimeDriverDescriptor<'sql', TTargetId, unknown, SqlRuntimeDriverInstance<TTargetId>>\n | undefined;\n readonly extensionPacks?: readonly SqlRuntimeExtensionDescriptor<TTargetId>[] | undefined;\n}): SqlExecutionStackWithDriver<TTargetId> {\n return createExecutionStack({\n target: options.target,\n adapter: options.adapter,\n driver: options.driver,\n extensionPacks: options.extensionPacks,\n });\n}\n\nexport type { ExecutionContext, JsonSchemaValidatorRegistry, TypeHelperRegistry };\n\nexport function assertExecutionStackContractRequirements(\n contract: Contract<SqlStorage>,\n stack: SqlExecutionStack,\n): void {\n const providedComponentIds = new Set<string>([\n stack.target.id,\n stack.adapter.id,\n ...stack.extensionPacks.map((pack) => pack.id),\n ]);\n\n const result = checkContractComponentRequirements({\n contract,\n expectedTargetFamily: 'sql',\n expectedTargetId: stack.target.targetId,\n providedComponentIds,\n });\n\n if (result.familyMismatch) {\n throw runtimeError(\n 'RUNTIME.CONTRACT_FAMILY_MISMATCH',\n `Contract target family '${result.familyMismatch.actual}' does not match runtime family '${result.familyMismatch.expected}'.`,\n {\n actual: result.familyMismatch.actual,\n expected: result.familyMismatch.expected,\n },\n );\n }\n\n if (result.targetMismatch) {\n throw runtimeError(\n 'RUNTIME.CONTRACT_TARGET_MISMATCH',\n `Contract target '${result.targetMismatch.actual}' does not match runtime target descriptor '${result.targetMismatch.expected}'.`,\n {\n actual: result.targetMismatch.actual,\n expected: result.targetMismatch.expected,\n },\n );\n }\n\n if (result.missingExtensionPackIds.length > 0) {\n const packIds = result.missingExtensionPackIds;\n const packList = packIds.map((id) => `'${id}'`).join(', ');\n throw runtimeError(\n 'RUNTIME.MISSING_EXTENSION_PACK',\n `Contract requires extension pack(s) ${packList}, but runtime descriptors do not provide matching component(s).`,\n { packIds },\n );\n }\n}\n\nfunction validateTypeParams(\n typeParams: Record<string, unknown>,\n codecDescriptor: RuntimeParameterizedCodecDescriptor,\n context: { typeName?: string; tableName?: string; columnName?: string },\n): Record<string, unknown> {\n const result = codecDescriptor.paramsSchema(typeParams);\n if (result instanceof arktype.errors) {\n const messages = result.map((p: { message: string }) => p.message).join('; ');\n const locationInfo = context.typeName\n ? `type '${context.typeName}'`\n : `column '${context.tableName}.${context.columnName}'`;\n throw runtimeError(\n 'RUNTIME.TYPE_PARAMS_INVALID',\n `Invalid typeParams for ${locationInfo} (codecId: ${codecDescriptor.codecId}): ${messages}`,\n { ...context, codecId: codecDescriptor.codecId, typeParams },\n );\n }\n return result as Record<string, unknown>;\n}\n\nfunction collectParameterizedCodecDescriptors(\n contributors: ReadonlyArray<SqlStaticContributions>,\n): Map<string, RuntimeParameterizedCodecDescriptor> {\n const descriptors = new Map<string, RuntimeParameterizedCodecDescriptor>();\n\n for (const contributor of contributors) {\n for (const descriptor of contributor.parameterizedCodecs()) {\n if (descriptors.has(descriptor.codecId)) {\n throw runtimeError(\n 'RUNTIME.DUPLICATE_PARAMETERIZED_CODEC',\n `Duplicate parameterized codec descriptor for codecId '${descriptor.codecId}'.`,\n { codecId: descriptor.codecId },\n );\n }\n descriptors.set(descriptor.codecId, descriptor);\n }\n }\n\n return descriptors;\n}\n\nfunction initializeTypeHelpers(\n storageTypes: Record<string, StorageTypeInstance> | undefined,\n codecDescriptors: Map<string, RuntimeParameterizedCodecDescriptor>,\n): TypeHelperRegistry {\n const helpers: TypeHelperRegistry = {};\n\n if (!storageTypes) {\n return helpers;\n }\n\n for (const [typeName, typeInstance] of Object.entries(storageTypes)) {\n const descriptor = codecDescriptors.get(typeInstance.codecId);\n\n if (descriptor) {\n const validatedParams = validateTypeParams(typeInstance.typeParams, descriptor, {\n typeName,\n });\n\n if (descriptor.init) {\n helpers[typeName] = descriptor.init(validatedParams);\n } else {\n helpers[typeName] = typeInstance;\n }\n } else {\n helpers[typeName] = typeInstance;\n }\n }\n\n return helpers;\n}\n\nfunction validateColumnTypeParams(\n storage: SqlStorage,\n codecDescriptors: Map<string, RuntimeParameterizedCodecDescriptor>,\n): void {\n for (const [tableName, table] of Object.entries(storage.tables)) {\n for (const [columnName, column] of Object.entries(table.columns)) {\n if (column.typeParams) {\n const descriptor = codecDescriptors.get(column.codecId);\n if (descriptor) {\n validateTypeParams(column.typeParams, descriptor, { tableName, columnName });\n }\n }\n }\n }\n}\n\n/**\n * Builds a registry of compiled JSON Schema validators by scanning the contract\n * for columns whose codec descriptor provides an `init` hook returning `{ validate }`.\n *\n * Handles both:\n * - Inline `typeParams.schema` on columns\n * - `typeRef` → `storage.types[ref]` with init hook results already in `types` registry\n */\nfunction buildJsonSchemaValidatorRegistry(\n contract: Contract<SqlStorage>,\n types: TypeHelperRegistry,\n codecDescriptors: Map<string, RuntimeParameterizedCodecDescriptor>,\n): JsonSchemaValidatorRegistry | undefined {\n const validators = new Map<string, JsonSchemaValidateFn>();\n\n // Collect codec IDs that have init hooks (these produce { validate } helpers)\n const codecIdsWithInit = new Set<string>();\n for (const [codecId, descriptor] of codecDescriptors) {\n if (descriptor.init) {\n codecIdsWithInit.add(codecId);\n }\n }\n\n if (codecIdsWithInit.size === 0) {\n return undefined;\n }\n\n for (const [tableName, table] of Object.entries(contract.storage.tables)) {\n for (const [columnName, column] of Object.entries(table.columns)) {\n if (!codecIdsWithInit.has(column.codecId)) continue;\n\n const key = `${tableName}.${columnName}`;\n\n // Case 1: column references a named type → validator already compiled via init hook\n if (column.typeRef) {\n const helper = types[column.typeRef] as { validate?: JsonSchemaValidateFn } | undefined;\n if (helper?.validate) {\n validators.set(key, helper.validate);\n }\n continue;\n }\n\n // Case 2: inline typeParams with schema → compile via init hook\n if (column.typeParams) {\n const descriptor = codecDescriptors.get(column.codecId);\n if (descriptor?.init) {\n const helper = descriptor.init(column.typeParams) as\n | { validate?: JsonSchemaValidateFn }\n | undefined;\n if (helper?.validate) {\n validators.set(key, helper.validate);\n }\n }\n }\n }\n }\n\n if (validators.size === 0) return undefined;\n return {\n get: (key: string) => validators.get(key),\n size: validators.size,\n };\n}\n\nfunction collectMutationDefaultGenerators(\n contributors: ReadonlyArray<SqlStaticContributions & { readonly id: string }>,\n): ReadonlyMap<string, RuntimeMutationDefaultGenerator> {\n const generators = new Map<string, RuntimeMutationDefaultGenerator>();\n const owners = new Map<string, string>();\n\n for (const contributor of contributors) {\n const nextGenerators = contributor.mutationDefaultGenerators?.() ?? [];\n for (const generator of nextGenerators) {\n const existingOwner = owners.get(generator.id);\n if (existingOwner !== undefined) {\n throw runtimeError(\n 'RUNTIME.DUPLICATE_MUTATION_DEFAULT_GENERATOR',\n `Duplicate mutation default generator '${generator.id}'.`,\n {\n id: generator.id,\n existingOwner,\n incomingOwner: contributor.id,\n },\n );\n }\n generators.set(generator.id, generator);\n owners.set(generator.id, contributor.id);\n }\n }\n\n return generators;\n}\n\nfunction computeExecutionDefaultValue(\n spec: ExecutionMutationDefaultValue,\n generatorRegistry: ReadonlyMap<string, RuntimeMutationDefaultGenerator>,\n): unknown {\n switch (spec.kind) {\n case 'generator': {\n const generator = generatorRegistry.get(spec.id);\n if (!generator) {\n throw runtimeError(\n 'RUNTIME.MUTATION_DEFAULT_GENERATOR_MISSING',\n `Contract references mutation default generator '${spec.id}' but no runtime component provides it.`,\n {\n id: spec.id,\n },\n );\n }\n // nosemgrep: javascript.express.security.express-wkhtml-injection.express-wkhtmltoimage-injection\n return generator.generate(spec.params);\n }\n }\n}\n\nfunction applyMutationDefaults(\n contract: Contract<SqlStorage>,\n generatorRegistry: ReadonlyMap<string, RuntimeMutationDefaultGenerator>,\n options: MutationDefaultsOptions,\n): ReadonlyArray<AppliedMutationDefault> {\n const defaults = contract.execution?.mutations.defaults ?? [];\n if (defaults.length === 0) {\n return [];\n }\n\n const applied: AppliedMutationDefault[] = [];\n const appliedColumns = new Set<string>();\n\n for (const mutationDefault of defaults) {\n if (mutationDefault.ref.table !== options.table) {\n continue;\n }\n\n const defaultSpec =\n options.op === 'create' ? mutationDefault.onCreate : mutationDefault.onUpdate;\n if (!defaultSpec) {\n continue;\n }\n\n const columnName = mutationDefault.ref.column;\n if (Object.hasOwn(options.values, columnName) || appliedColumns.has(columnName)) {\n continue;\n }\n\n applied.push({\n column: columnName,\n value: computeExecutionDefaultValue(defaultSpec, generatorRegistry),\n });\n appliedColumns.add(columnName);\n }\n\n return applied;\n}\n\nexport function createExecutionContext<\n TContract extends Contract<SqlStorage> = Contract<SqlStorage>,\n TTargetId extends string = string,\n>(options: {\n readonly contract: TContract;\n readonly stack: SqlExecutionStack<TTargetId>;\n}): ExecutionContext<TContract> {\n const { contract, stack } = options;\n\n assertExecutionStackContractRequirements(contract, stack);\n\n const codecRegistry = createCodecRegistry();\n\n const contributors: Array<SqlStaticContributions & ComponentDescriptor<string>> = [\n stack.target,\n stack.adapter,\n ...stack.extensionPacks,\n ];\n\n for (const contributor of contributors) {\n for (const c of contributor.codecs().values()) {\n codecRegistry.register(c);\n }\n }\n\n const queryOperationRegistry = createSqlOperationRegistry();\n for (const contributor of contributors) {\n for (const op of contributor.queryOperations?.() ?? []) {\n queryOperationRegistry.register(op);\n }\n }\n\n const parameterizedCodecDescriptors = collectParameterizedCodecDescriptors(contributors);\n const mutationDefaultGeneratorRegistry = collectMutationDefaultGenerators(contributors);\n\n if (parameterizedCodecDescriptors.size > 0) {\n validateColumnTypeParams(contract.storage, parameterizedCodecDescriptors);\n }\n\n const types = initializeTypeHelpers(contract.storage.types, parameterizedCodecDescriptors);\n\n const jsonSchemaValidators = buildJsonSchemaValidatorRegistry(\n contract,\n types,\n parameterizedCodecDescriptors,\n );\n\n return {\n contract,\n codecs: codecRegistry,\n queryOperations: queryOperationRegistry,\n types,\n ...(jsonSchemaValidators ? { jsonSchemaValidators } : {}),\n applyMutationDefaults: (options) =>\n applyMutationDefaults(contract, mutationDefaultGeneratorRegistry, options),\n };\n}\n","import type { MarkerStatement } from '@prisma-next/runtime-executor';\n\nexport interface SqlStatement {\n readonly sql: string;\n readonly params: readonly unknown[];\n}\n\nexport interface WriteMarkerInput {\n readonly storageHash: string;\n readonly profileHash: string;\n readonly contractJson?: unknown;\n readonly canonicalVersion?: number;\n readonly appTag?: string;\n readonly meta?: Record<string, unknown>;\n}\n\nexport const ensureSchemaStatement: SqlStatement = {\n sql: 'create schema if not exists prisma_contract',\n params: [],\n};\n\nexport const ensureTableStatement: SqlStatement = {\n sql: `create table if not exists prisma_contract.marker (\n id smallint primary key default 1,\n core_hash text not null,\n profile_hash text not null,\n contract_json jsonb,\n canonical_version int,\n updated_at timestamptz not null default now(),\n app_tag text,\n meta jsonb not null default '{}'\n )`,\n params: [],\n};\n\nexport function readContractMarker(): MarkerStatement {\n return {\n sql: `select\n core_hash,\n profile_hash,\n contract_json,\n canonical_version,\n updated_at,\n app_tag,\n meta\n from prisma_contract.marker\n where id = $1`,\n params: [1],\n };\n}\n\nexport interface WriteContractMarkerStatements {\n readonly insert: SqlStatement;\n readonly update: SqlStatement;\n}\n\nexport function writeContractMarker(input: WriteMarkerInput): WriteContractMarkerStatements {\n const baseParams: readonly unknown[] = [\n 1,\n input.storageHash,\n input.profileHash,\n input.contractJson ?? null,\n input.canonicalVersion ?? null,\n input.appTag ?? null,\n JSON.stringify(input.meta ?? {}),\n ];\n\n const insert: SqlStatement = {\n sql: `insert into prisma_contract.marker (\n id,\n core_hash,\n profile_hash,\n contract_json,\n canonical_version,\n updated_at,\n app_tag,\n meta\n ) values (\n $1,\n $2,\n $3,\n $4::jsonb,\n $5,\n now(),\n $6,\n $7::jsonb\n )`,\n params: baseParams,\n };\n\n const update: SqlStatement = {\n sql: `update prisma_contract.marker set\n core_hash = $2,\n profile_hash = $3,\n contract_json = $4::jsonb,\n canonical_version = $5,\n updated_at = now(),\n app_tag = $6,\n meta = $7::jsonb\n where id = $1`,\n params: baseParams,\n };\n\n return { insert, update };\n}\n","import { runtimeError } from '@prisma-next/framework-components/runtime';\nimport type {\n JsonSchemaValidationError,\n JsonSchemaValidatorRegistry,\n} from '@prisma-next/sql-relational-core/query-lane-context';\n\n/**\n * Validates a JSON value against its column's JSON Schema, if a validator exists.\n *\n * Throws `RUNTIME.JSON_SCHEMA_VALIDATION_FAILED` on validation failure.\n * No-ops if no validator is registered for the column.\n */\nexport function validateJsonValue(\n registry: JsonSchemaValidatorRegistry,\n table: string,\n column: string,\n value: unknown,\n direction: 'encode' | 'decode',\n codecId?: string,\n): void {\n const key = `${table}.${column}`;\n const validate = registry.get(key);\n if (!validate) return;\n\n const result = validate(value);\n if (result.valid) return;\n\n throw createJsonSchemaValidationError(table, column, direction, result.errors, codecId);\n}\n\nfunction createJsonSchemaValidationError(\n table: string,\n column: string,\n direction: 'encode' | 'decode',\n errors: ReadonlyArray<JsonSchemaValidationError>,\n codecId?: string,\n): Error {\n const summary = formatErrorSummary(errors);\n return runtimeError(\n 'RUNTIME.JSON_SCHEMA_VALIDATION_FAILED',\n `JSON schema validation failed for column '${table}.${column}' (${direction}): ${summary}`,\n {\n table,\n column,\n codecId,\n direction,\n errors: [...errors],\n },\n );\n}\n\nfunction formatErrorSummary(errors: ReadonlyArray<JsonSchemaValidationError>): string {\n if (errors.length === 0) return 'unknown validation error';\n if (errors.length === 1) {\n const err = errors[0] as JsonSchemaValidationError;\n return err.path === '/' ? err.message : `${err.path}: ${err.message}`;\n }\n return errors\n .map((err) => (err.path === '/' ? err.message : `${err.path}: ${err.message}`))\n .join('; ');\n}\n","import type { ExecutionPlan } from '@prisma-next/contract/types';\nimport type { Codec, CodecRegistry } from '@prisma-next/sql-relational-core/ast';\nimport type { JsonSchemaValidatorRegistry } from '@prisma-next/sql-relational-core/query-lane-context';\nimport { validateJsonValue } from './json-schema-validation';\n\nfunction resolveRowCodec(\n alias: string,\n plan: ExecutionPlan,\n registry: CodecRegistry,\n): Codec | null {\n const planCodecId = plan.meta.annotations?.codecs?.[alias] as string | undefined;\n if (planCodecId) {\n const codec = registry.get(planCodecId);\n if (codec) {\n return codec;\n }\n }\n\n if (plan.meta.projectionTypes) {\n const typeId = plan.meta.projectionTypes[alias];\n if (typeId) {\n const codec = registry.get(typeId);\n if (codec) {\n return codec;\n }\n }\n }\n\n return null;\n}\n\ntype ColumnRefIndex = Map<string, { table: string; column: string }>;\n\n/**\n * Builds a lookup index from column name → { table, column } ref.\n * Called once per decodeRow invocation to avoid O(aliases × refs) linear scans.\n */\nfunction buildColumnRefIndex(plan: ExecutionPlan): ColumnRefIndex | null {\n const columns = plan.meta.refs?.columns;\n if (!columns) return null;\n\n const index: ColumnRefIndex = new Map();\n for (const ref of columns) {\n index.set(ref.column, ref);\n }\n return index;\n}\n\nfunction parseProjectionRef(value: string): { table: string; column: string } | null {\n if (value.startsWith('include:') || value.startsWith('operation:')) {\n return null;\n }\n\n const separatorIndex = value.indexOf('.');\n if (separatorIndex <= 0 || separatorIndex === value.length - 1) {\n return null;\n }\n\n return {\n table: value.slice(0, separatorIndex),\n column: value.slice(separatorIndex + 1),\n };\n}\n\nfunction resolveColumnRefForAlias(\n alias: string,\n projection: ExecutionPlan['meta']['projection'],\n fallbackColumnRefIndex: ColumnRefIndex | null,\n): { table: string; column: string } | undefined {\n if (projection && !Array.isArray(projection)) {\n const mappedRef = (projection as Record<string, string>)[alias];\n if (typeof mappedRef !== 'string') {\n return undefined;\n }\n return parseProjectionRef(mappedRef) ?? undefined;\n }\n\n return fallbackColumnRefIndex?.get(alias);\n}\n\nexport function decodeRow(\n row: Record<string, unknown>,\n plan: ExecutionPlan,\n registry: CodecRegistry,\n jsonValidators?: JsonSchemaValidatorRegistry,\n): Record<string, unknown> {\n const decoded: Record<string, unknown> = {};\n const projection = plan.meta.projection;\n\n // Fallback for plans that do not provide projection alias -> table.column mapping.\n const fallbackColumnRefIndex =\n jsonValidators && (!projection || Array.isArray(projection)) ? buildColumnRefIndex(plan) : null;\n\n let aliases: readonly string[];\n if (projection && !Array.isArray(projection)) {\n aliases = Object.keys(projection);\n } else if (projection && Array.isArray(projection)) {\n aliases = projection;\n } else {\n aliases = Object.keys(row);\n }\n\n for (const alias of aliases) {\n const wireValue = row[alias];\n\n const projectionValue =\n projection && typeof projection === 'object' && !Array.isArray(projection)\n ? (projection as Record<string, string>)[alias]\n : undefined;\n\n if (typeof projectionValue === 'string' && projectionValue.startsWith('include:')) {\n if (wireValue === null || wireValue === undefined) {\n decoded[alias] = [];\n continue;\n }\n\n try {\n let parsed: unknown;\n if (typeof wireValue === 'string') {\n parsed = JSON.parse(wireValue);\n } else if (Array.isArray(wireValue)) {\n parsed = wireValue;\n } else {\n parsed = JSON.parse(String(wireValue));\n }\n\n if (!Array.isArray(parsed)) {\n throw new Error(`Expected array for include alias '${alias}', got ${typeof parsed}`);\n }\n\n decoded[alias] = parsed;\n } catch (error) {\n const decodeError = new Error(\n `Failed to parse JSON array for include alias '${alias}': ${error instanceof Error ? error.message : String(error)}`,\n ) as Error & {\n code: string;\n category: string;\n severity: string;\n details?: Record<string, unknown>;\n };\n decodeError.code = 'RUNTIME.DECODE_FAILED';\n decodeError.category = 'RUNTIME';\n decodeError.severity = 'error';\n decodeError.details = {\n alias,\n wirePreview:\n typeof wireValue === 'string' && wireValue.length > 100\n ? `${wireValue.substring(0, 100)}...`\n : String(wireValue).substring(0, 100),\n };\n throw decodeError;\n }\n continue;\n }\n\n if (wireValue === null || wireValue === undefined) {\n decoded[alias] = wireValue;\n continue;\n }\n\n const codec = resolveRowCodec(alias, plan, registry);\n\n if (!codec) {\n decoded[alias] = wireValue;\n continue;\n }\n\n try {\n const decodedValue = codec.decode(wireValue);\n\n // Validate decoded JSON value against schema\n if (jsonValidators) {\n const ref = resolveColumnRefForAlias(alias, projection, fallbackColumnRefIndex);\n if (ref) {\n validateJsonValue(\n jsonValidators,\n ref.table,\n ref.column,\n decodedValue,\n 'decode',\n codec.id,\n );\n }\n }\n\n decoded[alias] = decodedValue;\n } catch (error) {\n // Re-throw JSON schema validation errors as-is\n if (\n error instanceof Error &&\n 'code' in error &&\n (error as Error & { code: string }).code === 'RUNTIME.JSON_SCHEMA_VALIDATION_FAILED'\n ) {\n throw error;\n }\n\n const decodeError = new Error(\n `Failed to decode row alias '${alias}' with codec '${codec.id}': ${error instanceof Error ? error.message : String(error)}`,\n ) as Error & {\n code: string;\n category: string;\n severity: string;\n details?: Record<string, unknown>;\n };\n decodeError.code = 'RUNTIME.DECODE_FAILED';\n decodeError.category = 'RUNTIME';\n decodeError.severity = 'error';\n decodeError.details = {\n alias,\n codec: codec.id,\n wirePreview:\n typeof wireValue === 'string' && wireValue.length > 100\n ? `${wireValue.substring(0, 100)}...`\n : String(wireValue).substring(0, 100),\n };\n throw decodeError;\n }\n }\n\n return decoded;\n}\n","import type { ExecutionPlan, ParamDescriptor } from '@prisma-next/contract/types';\nimport type { Codec, CodecRegistry } from '@prisma-next/sql-relational-core/ast';\n\nfunction resolveParamCodec(\n paramDescriptor: ParamDescriptor,\n registry: CodecRegistry,\n): Codec | null {\n if (paramDescriptor.codecId) {\n const codec = registry.get(paramDescriptor.codecId);\n if (codec) {\n return codec;\n }\n }\n\n return null;\n}\n\nexport function encodeParam(\n value: unknown,\n paramDescriptor: ParamDescriptor,\n paramIndex: number,\n registry: CodecRegistry,\n): unknown {\n if (value === null || value === undefined) {\n return null;\n }\n\n const codec = resolveParamCodec(paramDescriptor, registry);\n if (!codec) {\n return value;\n }\n\n if (codec.encode) {\n try {\n return codec.encode(value);\n } catch (error) {\n const label = paramDescriptor.name ?? `param[${paramIndex}]`;\n throw new Error(\n `Failed to encode parameter ${label}: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n return value;\n}\n\nexport function encodeParams(plan: ExecutionPlan, registry: CodecRegistry): readonly unknown[] {\n if (plan.params.length === 0) {\n return plan.params;\n }\n\n const encoded: unknown[] = [];\n\n for (let i = 0; i < plan.params.length; i++) {\n const paramValue = plan.params[i];\n const paramDescriptor = plan.meta.paramDescriptors[i];\n\n if (paramDescriptor) {\n encoded.push(encodeParam(paramValue, paramDescriptor, i, registry));\n } else {\n encoded.push(paramValue);\n }\n }\n\n return Object.freeze(encoded);\n}\n","import type { Contract, ExecutionPlan } from '@prisma-next/contract/types';\nimport { runtimeError } from '@prisma-next/framework-components/runtime';\nimport type { MarkerReader, RuntimeFamilyAdapter } from '@prisma-next/runtime-executor';\nimport type { SqlStorage } from '@prisma-next/sql-contract/types';\nimport type { AdapterProfile } from '@prisma-next/sql-relational-core/ast';\n\nexport class SqlFamilyAdapter<TContract extends Contract<SqlStorage>>\n implements RuntimeFamilyAdapter<TContract>\n{\n readonly contract: TContract;\n readonly markerReader: MarkerReader;\n\n constructor(contract: TContract, adapterProfile: AdapterProfile) {\n this.contract = contract;\n this.markerReader = adapterProfile;\n }\n\n validatePlan(plan: ExecutionPlan, contract: TContract): void {\n if (plan.meta.target !== contract.target) {\n throw runtimeError('PLAN.TARGET_MISMATCH', 'Plan target does not match runtime target', {\n planTarget: plan.meta.target,\n runtimeTarget: contract.target,\n });\n }\n\n if (plan.meta.storageHash !== contract.storage.storageHash) {\n throw runtimeError(\n 'PLAN.HASH_MISMATCH',\n 'Plan storage hash does not match runtime contract',\n {\n planStorageHash: plan.meta.storageHash,\n runtimeStorageHash: contract.storage.storageHash,\n },\n );\n }\n }\n}\n","import type { Contract, ExecutionPlan } from '@prisma-next/contract/types';\nimport type {\n ExecutionStackInstance,\n RuntimeDriverInstance,\n} from '@prisma-next/framework-components/execution';\nimport { checkMiddlewareCompatibility } from '@prisma-next/framework-components/runtime';\nimport type {\n Log,\n Middleware,\n RuntimeCore,\n RuntimeCoreOptions,\n RuntimeTelemetryEvent,\n RuntimeVerifyOptions,\n TelemetryOutcome,\n} from '@prisma-next/runtime-executor';\nimport { AsyncIterableResult, createRuntimeCore } from '@prisma-next/runtime-executor';\nimport type { SqlStorage } from '@prisma-next/sql-contract/types';\nimport type {\n Adapter,\n AnyQueryAst,\n CodecRegistry,\n LoweredStatement,\n SqlDriver,\n} from '@prisma-next/sql-relational-core/ast';\nimport type { SqlQueryPlan } from '@prisma-next/sql-relational-core/plan';\nimport type { JsonSchemaValidatorRegistry } from '@prisma-next/sql-relational-core/query-lane-context';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport { decodeRow } from './codecs/decoding';\nimport { encodeParams } from './codecs/encoding';\nimport { validateCodecRegistryCompleteness } from './codecs/validation';\nimport { lowerSqlPlan } from './lower-sql-plan';\nimport type {\n ExecutionContext,\n SqlRuntimeAdapterInstance,\n SqlRuntimeExtensionInstance,\n} from './sql-context';\nimport { SqlFamilyAdapter } from './sql-family-adapter';\n\nexport interface RuntimeOptions<TContract extends Contract<SqlStorage> = Contract<SqlStorage>> {\n readonly context: ExecutionContext<TContract>;\n readonly adapter: Adapter<AnyQueryAst, Contract<SqlStorage>, LoweredStatement>;\n readonly driver: SqlDriver<unknown>;\n readonly verify: RuntimeVerifyOptions;\n readonly middleware?: readonly Middleware<TContract>[];\n readonly mode?: 'strict' | 'permissive';\n readonly log?: Log;\n}\n\nexport interface CreateRuntimeOptions<\n TContract extends Contract<SqlStorage> = Contract<SqlStorage>,\n TTargetId extends string = string,\n> {\n readonly stackInstance: ExecutionStackInstance<\n 'sql',\n TTargetId,\n SqlRuntimeAdapterInstance<TTargetId>,\n RuntimeDriverInstance<'sql', TTargetId>,\n SqlRuntimeExtensionInstance<TTargetId>\n >;\n readonly context: ExecutionContext<TContract>;\n readonly driver: SqlDriver<unknown>;\n readonly verify: RuntimeVerifyOptions;\n readonly middleware?: readonly Middleware<TContract>[];\n readonly mode?: 'strict' | 'permissive';\n readonly log?: Log;\n}\n\nexport interface Runtime extends RuntimeQueryable {\n connection(): Promise<RuntimeConnection>;\n telemetry(): RuntimeTelemetryEvent | null;\n close(): Promise<void>;\n}\n\nexport interface RuntimeConnection extends RuntimeQueryable {\n transaction(): Promise<RuntimeTransaction>;\n release(): Promise<void>;\n}\n\nexport interface RuntimeTransaction extends RuntimeQueryable {\n commit(): Promise<void>;\n rollback(): Promise<void>;\n}\n\nexport interface RuntimeQueryable {\n execute<Row = Record<string, unknown>>(\n plan: ExecutionPlan<Row> | SqlQueryPlan<Row>,\n ): AsyncIterableResult<Row>;\n}\n\ninterface CoreQueryable {\n execute<Row = Record<string, unknown>>(plan: ExecutionPlan<Row>): AsyncIterableResult<Row>;\n}\n\nexport type { RuntimeTelemetryEvent, RuntimeVerifyOptions, TelemetryOutcome };\n\nclass SqlRuntimeImpl<TContract extends Contract<SqlStorage> = Contract<SqlStorage>>\n implements Runtime\n{\n private readonly core: RuntimeCore<TContract, SqlDriver<unknown>>;\n private readonly contract: TContract;\n private readonly adapter: Adapter<AnyQueryAst, Contract<SqlStorage>, LoweredStatement>;\n private readonly codecRegistry: CodecRegistry;\n private readonly jsonSchemaValidators: JsonSchemaValidatorRegistry | undefined;\n private codecRegistryValidated: boolean;\n\n constructor(options: RuntimeOptions<TContract>) {\n const { context, adapter, driver, verify, middleware, mode, log } = options;\n this.contract = context.contract;\n this.adapter = adapter;\n this.codecRegistry = context.codecs;\n this.jsonSchemaValidators = context.jsonSchemaValidators;\n this.codecRegistryValidated = false;\n\n if (middleware) {\n for (const mw of middleware) {\n checkMiddlewareCompatibility(mw, 'sql', context.contract.target);\n }\n }\n\n const familyAdapter = new SqlFamilyAdapter(context.contract, adapter.profile);\n\n const coreOptions: RuntimeCoreOptions<TContract, SqlDriver<unknown>> = {\n familyAdapter,\n driver,\n verify,\n ...ifDefined('middleware', middleware),\n ...ifDefined('mode', mode),\n ...ifDefined('log', log),\n };\n\n this.core = createRuntimeCore(coreOptions);\n\n if (verify.mode === 'startup') {\n validateCodecRegistryCompleteness(this.codecRegistry, context.contract);\n this.codecRegistryValidated = true;\n }\n }\n\n private ensureCodecRegistryValidated(contract: Contract<SqlStorage>): void {\n if (!this.codecRegistryValidated) {\n validateCodecRegistryCompleteness(this.codecRegistry, contract);\n this.codecRegistryValidated = true;\n }\n }\n\n private toExecutionPlan<Row>(plan: ExecutionPlan<Row> | SqlQueryPlan<Row>): ExecutionPlan<Row> {\n const isSqlQueryPlan = (p: ExecutionPlan<Row> | SqlQueryPlan<Row>): p is SqlQueryPlan<Row> => {\n return 'ast' in p && !('sql' in p);\n };\n\n return isSqlQueryPlan(plan) ? lowerSqlPlan(this.adapter, this.contract, plan) : plan;\n }\n\n private executeAgainstQueryable<Row = Record<string, unknown>>(\n plan: ExecutionPlan<Row> | SqlQueryPlan<Row>,\n queryable: CoreQueryable,\n ): AsyncIterableResult<Row> {\n this.ensureCodecRegistryValidated(this.contract);\n const executablePlan = this.toExecutionPlan(plan);\n\n const iterator = async function* (\n self: SqlRuntimeImpl<TContract>,\n ): AsyncGenerator<Row, void, unknown> {\n const encodedParams = encodeParams(executablePlan, self.codecRegistry);\n const planWithEncodedParams: ExecutionPlan<Row> = {\n ...executablePlan,\n params: encodedParams,\n };\n\n const coreIterator = queryable.execute(planWithEncodedParams);\n\n for await (const rawRow of coreIterator) {\n const decodedRow = decodeRow(\n rawRow as Record<string, unknown>,\n executablePlan,\n self.codecRegistry,\n self.jsonSchemaValidators,\n );\n yield decodedRow as Row;\n }\n };\n\n return new AsyncIterableResult(iterator(this));\n }\n\n execute<Row = Record<string, unknown>>(\n plan: ExecutionPlan<Row> | SqlQueryPlan<Row>,\n ): AsyncIterableResult<Row> {\n return this.executeAgainstQueryable(plan, this.core);\n }\n\n async connection(): Promise<RuntimeConnection> {\n const coreConn = await this.core.connection();\n const self = this;\n const wrappedConnection: RuntimeConnection = {\n async transaction(): Promise<RuntimeTransaction> {\n const coreTx = await coreConn.transaction();\n return {\n commit: coreTx.commit.bind(coreTx),\n rollback: coreTx.rollback.bind(coreTx),\n execute<Row = Record<string, unknown>>(\n plan: ExecutionPlan<Row> | SqlQueryPlan<Row>,\n ): AsyncIterableResult<Row> {\n return self.executeAgainstQueryable(plan, coreTx);\n },\n };\n },\n release: coreConn.release.bind(coreConn),\n execute<Row = Record<string, unknown>>(\n plan: ExecutionPlan<Row> | SqlQueryPlan<Row>,\n ): AsyncIterableResult<Row> {\n return self.executeAgainstQueryable(plan, coreConn);\n },\n };\n return wrappedConnection;\n }\n\n telemetry(): RuntimeTelemetryEvent | null {\n return this.core.telemetry();\n }\n\n close(): Promise<void> {\n return this.core.close();\n }\n}\n\nexport function createRuntime<TContract extends Contract<SqlStorage>, TTargetId extends string>(\n options: CreateRuntimeOptions<TContract, TTargetId>,\n): Runtime {\n const { stackInstance, context, driver, verify, middleware, mode, log } = options;\n\n return new SqlRuntimeImpl({\n context,\n adapter: stackInstance.adapter,\n driver,\n verify,\n ...ifDefined('middleware', middleware),\n ...ifDefined('mode', mode),\n ...ifDefined('log', log),\n });\n}\n"],"mappings":"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"}