@prisma-next/sql-runtime 0.3.0-dev.43 → 0.3.0-dev.45

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.
package/README.md CHANGED
@@ -113,14 +113,35 @@ for await (const row of runtime.execute(plan)) {
113
113
 
114
114
  - `lowerSqlPlan` - SQL plan lowering via adapter
115
115
 
116
- ### Plugins (re-exported from `@prisma-next/runtime-executor`)
116
+ ### Plugins
117
117
 
118
- - `budgets`, `lints` - SQL-compatible plugins
118
+ - `budgets` - Re-exported from `@prisma-next/runtime-executor` (target-neutral)
119
+ - `lints` - **AST-first lint plugin** (canonical in SQL domain), inspects `plan.ast` when present
119
120
  - `BudgetsOptions`, `LintsOptions` - Plugin option types
120
- - `Plugin`, `PluginContext` - Plugin interface types
121
+ - `Plugin`, `PluginContext` - Plugin interface types (from runtime-executor)
121
122
  - `AfterExecuteResult` - Plugin hook result type
122
123
  - `Log` - Log entry type
123
124
 
125
+ #### Lints plugin (SQL domain)
126
+
127
+ The `lints` plugin operates on `plan.ast` when it is a SQL `QueryAst`:
128
+
129
+ - **DELETE without WHERE** — blocks execution (configurable severity)
130
+ - **UPDATE without WHERE** — blocks execution (configurable severity)
131
+ - **Unbounded SELECT** — warns/errors when `limit` is missing
132
+ - **SELECT \* intent** — warns/errors when `selectAllIntent` is present
133
+
134
+ When `plan.ast` is missing, the plugin falls back to raw heuristic guardrails (`fallbackWhenAstMissing: 'raw'`) or skips linting (`fallbackWhenAstMissing: 'skip'`). Default is `'raw'`.
135
+
136
+ ```typescript
137
+ import { createRuntime, lints } from '@prisma-next/sql-runtime';
138
+
139
+ const runtime = createRuntime({
140
+ // ...
141
+ plugins: [lints({ severities: { noLimit: 'error' } })],
142
+ });
143
+ ```
144
+
124
145
  ## Architecture
125
146
 
126
147
  The SQL runtime composes runtime-executor with SQL-specific implementations. Descriptors implement `SqlStaticContributions` so `ExecutionContext` can be derived from the descriptors-only stack without instantiation.
@@ -1,11 +1,11 @@
1
- import { AsyncIterableResult, budgets, createRuntimeCore, lints, runtimeError } from "@prisma-next/runtime-executor";
1
+ import { AsyncIterableResult, budgets, createRuntimeCore, evaluateRawGuardrails, runtimeError } from "@prisma-next/runtime-executor";
2
+ import { ifDefined } from "@prisma-next/utils/defined";
2
3
  import { checkContractComponentRequirements } from "@prisma-next/contract/framework-components";
3
4
  import { createExecutionStack } from "@prisma-next/core-execution-plane/stack";
4
5
  import { generateId } from "@prisma-next/ids/runtime";
5
6
  import { createOperationRegistry } from "@prisma-next/operations";
6
7
  import { createCodecRegistry } from "@prisma-next/sql-relational-core/ast";
7
8
  import { type } from "arktype";
8
- import { ifDefined } from "@prisma-next/utils/defined";
9
9
 
10
10
  //#region src/codecs/validation.ts
11
11
  function extractCodecIds(contract) {
@@ -73,6 +73,132 @@ function lowerSqlPlan(adapter, contract, queryPlan) {
73
73
  });
74
74
  }
75
75
 
76
+ //#endregion
77
+ //#region src/plugins/lints.ts
78
+ const QUERY_AST_KINDS = new Set([
79
+ "select",
80
+ "insert",
81
+ "update",
82
+ "delete"
83
+ ]);
84
+ function isSqlQueryAst(ast) {
85
+ if (ast === null || typeof ast !== "object" || !("kind" in ast)) return false;
86
+ const kind = ast.kind;
87
+ return typeof kind === "string" && QUERY_AST_KINDS.has(kind);
88
+ }
89
+ function lintError(code, message, details) {
90
+ const error = new Error(message);
91
+ Object.defineProperty(error, "name", {
92
+ value: "RuntimeError",
93
+ configurable: true
94
+ });
95
+ return Object.assign(error, {
96
+ code,
97
+ category: "LINT",
98
+ severity: "error",
99
+ details
100
+ });
101
+ }
102
+ function evaluateAstLints(ast, meta) {
103
+ const findings = [];
104
+ if (ast.kind === "delete") {
105
+ const deleteAst = ast;
106
+ if (deleteAst.where === void 0) findings.push({
107
+ code: "LINT.DELETE_WITHOUT_WHERE",
108
+ severity: "error",
109
+ message: "DELETE without WHERE clause blocks execution to prevent accidental full-table deletion",
110
+ details: { table: deleteAst.table.name }
111
+ });
112
+ }
113
+ if (ast.kind === "update") {
114
+ const updateAst = ast;
115
+ if (updateAst.where === void 0) findings.push({
116
+ code: "LINT.UPDATE_WITHOUT_WHERE",
117
+ severity: "error",
118
+ message: "UPDATE without WHERE clause blocks execution to prevent accidental full-table update",
119
+ details: { table: updateAst.table.name }
120
+ });
121
+ }
122
+ if (ast.kind === "select") {
123
+ const selectAst = ast;
124
+ if (selectAst.limit === void 0) findings.push({
125
+ code: "LINT.NO_LIMIT",
126
+ severity: "warn",
127
+ message: "Unbounded SELECT may return large result sets",
128
+ details: { table: selectAst.from.name }
129
+ });
130
+ if (selectAst.selectAllIntent !== void 0 || meta.annotations?.selectAllIntent !== void 0) {
131
+ const table = selectAst.selectAllIntent?.table ?? meta.annotations?.selectAllIntent?.table;
132
+ findings.push({
133
+ code: "LINT.SELECT_STAR",
134
+ severity: "warn",
135
+ message: "Query selects all columns via selectAll intent",
136
+ ...ifDefined("details", table !== void 0 ? { table } : void 0)
137
+ });
138
+ }
139
+ }
140
+ return findings;
141
+ }
142
+ function getConfiguredSeverity(code, options) {
143
+ const severities = options?.severities;
144
+ if (!severities) return void 0;
145
+ switch (code) {
146
+ case "LINT.SELECT_STAR": return severities.selectStar;
147
+ case "LINT.NO_LIMIT": return severities.noLimit;
148
+ case "LINT.DELETE_WITHOUT_WHERE": return severities.deleteWithoutWhere;
149
+ case "LINT.UPDATE_WITHOUT_WHERE": return severities.updateWithoutWhere;
150
+ case "LINT.READ_ONLY_MUTATION": return severities.readOnlyMutation;
151
+ case "LINT.UNINDEXED_PREDICATE": return severities.unindexedPredicate;
152
+ default: return;
153
+ }
154
+ }
155
+ /**
156
+ * AST-first lint plugin for SQL plans. When `plan.ast` is a SQL QueryAst, inspects
157
+ * the AST structurally. When `plan.ast` is missing, falls back to raw heuristic
158
+ * guardrails or skips linting depending on `fallbackWhenAstMissing`.
159
+ *
160
+ * Rules (AST-based):
161
+ * - DELETE without WHERE: blocks execution (configurable severity, default error)
162
+ * - UPDATE without WHERE: blocks execution (configurable severity, default error)
163
+ * - Unbounded SELECT: warn/error (severity from noLimit)
164
+ * - SELECT * intent: warn/error (severity from selectStar)
165
+ *
166
+ * Fallback: When ast is missing, `fallbackWhenAstMissing: 'raw'` uses heuristic
167
+ * SQL parsing; `'skip'` skips all lints. Default is `'raw'`.
168
+ */
169
+ function lints(options) {
170
+ const fallback = options?.fallbackWhenAstMissing ?? "raw";
171
+ return Object.freeze({
172
+ name: "lints",
173
+ async beforeExecute(plan, ctx) {
174
+ if (isSqlQueryAst(plan.ast)) {
175
+ const findings = evaluateAstLints(plan.ast, plan.meta);
176
+ for (const lint of findings) {
177
+ const effectiveSeverity = getConfiguredSeverity(lint.code, options) ?? lint.severity;
178
+ if (effectiveSeverity === "error") throw lintError(lint.code, lint.message, lint.details);
179
+ if (effectiveSeverity === "warn") ctx.log.warn({
180
+ code: lint.code,
181
+ message: lint.message,
182
+ details: lint.details
183
+ });
184
+ }
185
+ return;
186
+ }
187
+ if (fallback === "skip") return;
188
+ const evaluation = evaluateRawGuardrails(plan);
189
+ for (const lint of evaluation.lints) {
190
+ const effectiveSeverity = getConfiguredSeverity(lint.code, options) ?? lint.severity;
191
+ if (effectiveSeverity === "error") throw lintError(lint.code, lint.message, lint.details);
192
+ if (effectiveSeverity === "warn") ctx.log.warn({
193
+ code: lint.code,
194
+ message: lint.message,
195
+ details: lint.details
196
+ });
197
+ }
198
+ }
199
+ });
200
+ }
201
+
76
202
  //#endregion
77
203
  //#region src/sql-context.ts
78
204
  function createSqlExecutionStack(options) {
@@ -574,25 +700,48 @@ var SqlRuntimeImpl = class {
574
700
  this.codecRegistryValidated = true;
575
701
  }
576
702
  }
577
- execute(plan) {
578
- this.ensureCodecRegistryValidated(this.contract);
703
+ toExecutionPlan(plan) {
579
704
  const isSqlQueryPlan = (p) => {
580
705
  return "ast" in p && !("sql" in p);
581
706
  };
582
- const executablePlan = isSqlQueryPlan(plan) ? lowerSqlPlan(this.adapter, this.contract, plan) : plan;
707
+ return isSqlQueryPlan(plan) ? lowerSqlPlan(this.adapter, this.contract, plan) : plan;
708
+ }
709
+ executeAgainstQueryable(plan, queryable) {
710
+ this.ensureCodecRegistryValidated(this.contract);
711
+ const executablePlan = this.toExecutionPlan(plan);
583
712
  const iterator = async function* (self) {
584
713
  const encodedParams = encodeParams(executablePlan, self.codecRegistry, self.jsonSchemaValidators);
585
714
  const planWithEncodedParams = {
586
715
  ...executablePlan,
587
716
  params: encodedParams
588
717
  };
589
- const coreIterator = self.core.execute(planWithEncodedParams);
718
+ const coreIterator = queryable.execute(planWithEncodedParams);
590
719
  for await (const rawRow of coreIterator) yield decodeRow(rawRow, executablePlan, self.codecRegistry, self.jsonSchemaValidators);
591
720
  };
592
721
  return new AsyncIterableResult(iterator(this));
593
722
  }
594
- connection() {
595
- return this.core.connection();
723
+ execute(plan) {
724
+ return this.executeAgainstQueryable(plan, this.core);
725
+ }
726
+ async connection() {
727
+ const coreConn = await this.core.connection();
728
+ const self = this;
729
+ return {
730
+ async transaction() {
731
+ const coreTx = await coreConn.transaction();
732
+ return {
733
+ commit: coreTx.commit.bind(coreTx),
734
+ rollback: coreTx.rollback.bind(coreTx),
735
+ execute(plan) {
736
+ return self.executeAgainstQueryable(plan, coreTx);
737
+ }
738
+ };
739
+ },
740
+ release: coreConn.release.bind(coreConn),
741
+ execute(plan) {
742
+ return self.executeAgainstQueryable(plan, coreConn);
743
+ }
744
+ };
596
745
  }
597
746
  telemetry() {
598
747
  return this.core.telemetry();
@@ -618,5 +767,5 @@ function createRuntime(options) {
618
767
  }
619
768
 
620
769
  //#endregion
621
- export { ensureTableStatement as a, createExecutionContext as c, extractCodecIds as d, validateCodecRegistryCompleteness as f, ensureSchemaStatement as i, createSqlExecutionStack as l, lints as n, readContractMarker as o, validateContractCodecMappings as p, createRuntime as r, writeContractMarker as s, budgets as t, lowerSqlPlan as u };
622
- //# sourceMappingURL=exports-C8hi0N-a.mjs.map
770
+ export { readContractMarker as a, createSqlExecutionStack as c, extractCodecIds as d, validateCodecRegistryCompleteness as f, ensureTableStatement as i, lints as l, createRuntime as n, writeContractMarker as o, validateContractCodecMappings as p, ensureSchemaStatement as r, createExecutionContext as s, budgets as t, lowerSqlPlan as u };
771
+ //# sourceMappingURL=exports-BhZqJPVb.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exports-BhZqJPVb.mjs","names":["invalidCodecs: Array<{ table: string; column: string; codecId: string }>","details: Record<string, unknown>","findings: LintFinding[]","arktype","helpers: TypeHelperRegistry","applied: AppliedMutationDefault[]","contributors: SqlStaticContributions[]","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/plugins/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 { runtimeError } from '@prisma-next/runtime-executor';\nimport type { SqlContract, SqlStorage } from '@prisma-next/sql-contract/types';\nimport type { CodecRegistry } from '@prisma-next/sql-relational-core/ast';\n\nexport function extractCodecIds(contract: SqlContract<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: SqlContract<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: SqlContract<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: SqlContract<SqlStorage>,\n): void {\n validateContractCodecMappings(registry, contract);\n}\n","import type { ExecutionPlan } from '@prisma-next/contract/types';\nimport type { SqlContract, SqlStorage } from '@prisma-next/sql-contract/types';\nimport type { Adapter, LoweredStatement, QueryAst } 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<QueryAst, SqlContract<SqlStorage>, LoweredStatement>,\n contract: SqlContract<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, PlanMeta } from '@prisma-next/contract/types';\nimport type { Plugin, PluginContext } from '@prisma-next/runtime-executor';\nimport { evaluateRawGuardrails } from '@prisma-next/runtime-executor';\nimport type {\n DeleteAst,\n QueryAst,\n SelectAst,\n UpdateAst,\n} from '@prisma-next/sql-relational-core/ast';\nimport { ifDefined } from '@prisma-next/utils/defined';\n\nconst QUERY_AST_KINDS = new Set(['select', 'insert', 'update', 'delete']);\n\nfunction isSqlQueryAst(ast: unknown): ast is QueryAst {\n if (ast === null || typeof ast !== 'object' || !('kind' in ast)) return false;\n const kind = (ast as { kind: string }).kind;\n return typeof kind === 'string' && QUERY_AST_KINDS.has(kind);\n}\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 lintError(code: string, message: string, details?: Record<string, unknown>) {\n const error = new Error(message) as Error & {\n code: string;\n category: 'LINT';\n severity: 'error';\n details?: Record<string, unknown>;\n };\n Object.defineProperty(error, 'name', {\n value: 'RuntimeError',\n configurable: true,\n });\n return Object.assign(error, {\n code,\n category: 'LINT' as const,\n severity: 'error' as const,\n details,\n });\n}\n\nfunction evaluateAstLints(ast: QueryAst, meta: PlanMeta): LintFinding[] {\n const findings: LintFinding[] = [];\n\n if (ast.kind === 'delete') {\n const deleteAst = ast as DeleteAst;\n if (deleteAst.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: deleteAst.table.name },\n });\n }\n }\n\n if (ast.kind === 'update') {\n const updateAst = ast as UpdateAst;\n if (updateAst.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: updateAst.table.name },\n });\n }\n }\n\n if (ast.kind === 'select') {\n const selectAst = ast as SelectAst;\n if (selectAst.limit === undefined) {\n findings.push({\n code: 'LINT.NO_LIMIT',\n severity: 'warn',\n message: 'Unbounded SELECT may return large result sets',\n details: { table: selectAst.from.name },\n });\n }\n const hasSelectAllIntent =\n selectAst.selectAllIntent !== undefined ||\n (meta.annotations as { selectAllIntent?: unknown })?.selectAllIntent !== undefined;\n if (hasSelectAllIntent) {\n const table =\n selectAst.selectAllIntent?.table ??\n (meta.annotations as { selectAllIntent?: { table?: string } })?.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 }\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 plugin 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, TAdapter = unknown, TDriver = unknown>(\n options?: LintsOptions,\n): Plugin<TContract, TAdapter, TDriver> {\n const fallback = options?.fallbackWhenAstMissing ?? 'raw';\n\n return Object.freeze({\n name: 'lints',\n\n async beforeExecute(plan: ExecutionPlan, ctx: PluginContext<TContract, TAdapter, TDriver>) {\n if (isSqlQueryAst(plan.ast)) {\n const findings = evaluateAstLints(plan.ast, plan.meta);\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 lintError(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 lintError(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 { checkContractComponentRequirements } from '@prisma-next/contract/framework-components';\nimport type { ExecutionMutationDefaultValue } from '@prisma-next/contract/types';\nimport { createExecutionStack, type ExecutionStack } from '@prisma-next/core-execution-plane/stack';\nimport type {\n RuntimeAdapterDescriptor,\n RuntimeAdapterInstance,\n RuntimeDriverDescriptor,\n RuntimeDriverInstance,\n RuntimeExtensionDescriptor,\n RuntimeExtensionInstance,\n RuntimeTargetDescriptor,\n RuntimeTargetInstance,\n} from '@prisma-next/core-execution-plane/types';\nimport { generateId } from '@prisma-next/ids/runtime';\nimport { createOperationRegistry } from '@prisma-next/operations';\nimport { runtimeError } from '@prisma-next/runtime-executor';\nimport type { SqlContract, SqlStorage, StorageTypeInstance } from '@prisma-next/sql-contract/types';\nimport type { SqlOperationSignature } from '@prisma-next/sql-operations';\nimport type {\n Adapter,\n CodecParamsDescriptor,\n CodecRegistry,\n LoweredStatement,\n QueryAst,\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 readonly operationSignatures: () => ReadonlyArray<SqlOperationSignature>;\n // biome-ignore lint/suspicious/noExplicitAny: needed for covariance with concrete descriptor types\n readonly parameterizedCodecs: () => ReadonlyArray<RuntimeParameterizedCodecDescriptor<any, any>>;\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<QueryAst, SqlContract<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: SqlContract<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: SqlContract<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 computeExecutionDefaultValue(spec: ExecutionMutationDefaultValue): unknown {\n switch (spec.kind) {\n case 'generator':\n return generateId(spec.params ? { id: spec.id, params: spec.params } : { id: spec.id });\n }\n}\n\nfunction applyMutationDefaults(\n contract: SqlContract<SqlStorage>,\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),\n });\n appliedColumns.add(columnName);\n }\n\n return applied;\n}\n\nexport function createExecutionContext<\n TContract extends SqlContract<SqlStorage> = SqlContract<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 const operationRegistry = createOperationRegistry();\n\n const contributors: SqlStaticContributions[] = [\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 for (const operation of contributor.operationSignatures()) {\n operationRegistry.register(operation);\n }\n }\n\n const parameterizedCodecDescriptors = collectParameterizedCodecDescriptors(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 operations: operationRegistry,\n codecs: codecRegistry,\n types,\n ...(jsonSchemaValidators ? { jsonSchemaValidators } : {}),\n applyMutationDefaults: (options) => applyMutationDefaults(contract, 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/runtime-executor';\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';\nimport type { JsonSchemaValidatorRegistry } from '@prisma-next/sql-relational-core/query-lane-context';\nimport { validateJsonValue } from './json-schema-validation';\n\nfunction resolveParamCodec(\n paramDescriptor: ParamDescriptor,\n plan: ExecutionPlan,\n registry: CodecRegistry,\n): Codec | null {\n const paramName = paramDescriptor.name ?? `param_${paramDescriptor.index ?? 0}`;\n\n const planCodecId = plan.meta.annotations?.codecs?.[paramName] as string | undefined;\n if (planCodecId) {\n const codec = registry.get(planCodecId);\n if (codec) {\n return codec;\n }\n }\n\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 plan: ExecutionPlan,\n registry: CodecRegistry,\n jsonValidators?: JsonSchemaValidatorRegistry,\n): unknown {\n if (value === null || value === undefined) {\n return null;\n }\n\n // Validate JSON value against schema before encoding\n if (jsonValidators && paramDescriptor.refs) {\n const { table, column } = paramDescriptor.refs;\n validateJsonValue(jsonValidators, table, column, value, 'encode', paramDescriptor.codecId);\n }\n\n const codec = resolveParamCodec(paramDescriptor, plan, registry);\n if (!codec) {\n return value;\n }\n\n if (codec.encode) {\n try {\n return codec.encode(value);\n } catch (error) {\n throw new Error(\n `Failed to encode parameter ${paramDescriptor.name ?? paramDescriptor.index}: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n return value;\n}\n\nexport function encodeParams(\n plan: ExecutionPlan,\n registry: CodecRegistry,\n jsonValidators?: JsonSchemaValidatorRegistry,\n): 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, plan, registry, jsonValidators));\n } else {\n encoded.push(paramValue);\n }\n }\n\n return Object.freeze(encoded);\n}\n","import type { ExecutionPlan } from '@prisma-next/contract/types';\nimport type {\n MarkerReader,\n MarkerStatement,\n RuntimeFamilyAdapter,\n} from '@prisma-next/runtime-executor';\nimport { runtimeError } from '@prisma-next/runtime-executor';\nimport type { SqlContract, SqlStorage } from '@prisma-next/sql-contract/types';\nimport { readContractMarker } from './sql-marker';\n\nclass SqlMarkerReader implements MarkerReader {\n readMarkerStatement(): MarkerStatement {\n return readContractMarker();\n }\n}\n\nexport class SqlFamilyAdapter<TContract extends SqlContract<SqlStorage>>\n implements RuntimeFamilyAdapter<TContract>\n{\n readonly contract: TContract;\n readonly markerReader: MarkerReader;\n\n constructor(contract: TContract) {\n this.contract = contract;\n this.markerReader = new SqlMarkerReader();\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.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.storageHash,\n },\n );\n }\n }\n}\n","import type { ExecutionPlan } from '@prisma-next/contract/types';\nimport type { ExecutionStackInstance } from '@prisma-next/core-execution-plane/stack';\nimport type { RuntimeDriverInstance } from '@prisma-next/core-execution-plane/types';\nimport type { OperationRegistry } from '@prisma-next/operations';\nimport type {\n Log,\n Plugin,\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 { SqlContract, SqlStorage } from '@prisma-next/sql-contract/types';\nimport type {\n Adapter,\n CodecRegistry,\n LoweredStatement,\n QueryAst,\n SelectAst,\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<\n TContract extends SqlContract<SqlStorage> = SqlContract<SqlStorage>,\n> {\n readonly context: ExecutionContext<TContract>;\n readonly adapter: Adapter<QueryAst, SqlContract<SqlStorage>, LoweredStatement>;\n readonly driver: SqlDriver<unknown>;\n readonly verify: RuntimeVerifyOptions;\n readonly plugins?: readonly Plugin<\n TContract,\n Adapter<SelectAst, SqlContract<SqlStorage>, LoweredStatement>,\n SqlDriver<unknown>\n >[];\n readonly mode?: 'strict' | 'permissive';\n readonly log?: Log;\n}\n\nexport interface CreateRuntimeOptions<\n TContract extends SqlContract<SqlStorage> = SqlContract<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 plugins?: readonly Plugin<\n TContract,\n Adapter<SelectAst, SqlContract<SqlStorage>, LoweredStatement>,\n SqlDriver<unknown>\n >[];\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 operations(): OperationRegistry;\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 SqlContract<SqlStorage> = SqlContract<SqlStorage>>\n implements Runtime\n{\n private readonly core: RuntimeCore<\n TContract,\n Adapter<SelectAst, SqlContract<SqlStorage>, LoweredStatement>,\n SqlDriver<unknown>\n >;\n private readonly contract: TContract;\n private readonly adapter: Adapter<QueryAst, SqlContract<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, plugins, 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 const familyAdapter = new SqlFamilyAdapter(context.contract);\n\n const coreOptions: RuntimeCoreOptions<\n TContract,\n Adapter<SelectAst, SqlContract<SqlStorage>, LoweredStatement>,\n SqlDriver<unknown>\n > = {\n familyAdapter,\n driver,\n verify,\n plugins: plugins as readonly Plugin<\n TContract,\n Adapter<SelectAst, SqlContract<SqlStorage>, LoweredStatement>,\n SqlDriver<unknown>\n >[],\n ...ifDefined('mode', mode),\n ...ifDefined('log', log),\n operationRegistry: context.operations,\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: SqlContract<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(\n executablePlan,\n self.codecRegistry,\n self.jsonSchemaValidators,\n );\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 operations(): OperationRegistry {\n return this.core.operations();\n }\n\n close(): Promise<void> {\n return this.core.close();\n }\n}\n\nexport function createRuntime<TContract extends SqlContract<SqlStorage>, TTargetId extends string>(\n options: CreateRuntimeOptions<TContract, TTargetId>,\n): Runtime {\n const { stackInstance, context, driver, verify, plugins, mode, log } = options;\n\n return new SqlRuntimeImpl({\n context,\n adapter: stackInstance.adapter,\n driver,\n verify,\n ...ifDefined('plugins', plugins),\n ...ifDefined('mode', mode),\n ...ifDefined('log', log),\n });\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { AfterExecuteResult, AsyncIterableResult, BudgetsOptions, LintsOptions, Log, Log as Log$1, MarkerStatement, Plugin, Plugin as Plugin$1, PluginContext, RuntimeTelemetryEvent, RuntimeVerifyOptions, TelemetryOutcome, budgets, lints } from "@prisma-next/runtime-executor";
1
+ import { AfterExecuteResult, AsyncIterableResult, BudgetsOptions, Log, Log as Log$1, MarkerStatement, Plugin, Plugin as Plugin$1, PluginContext, RuntimeTelemetryEvent, RuntimeVerifyOptions, TelemetryOutcome, budgets } from "@prisma-next/runtime-executor";
2
2
  import { ExecutionStack, ExecutionStackInstance } from "@prisma-next/core-execution-plane/stack";
3
3
  import { OperationRegistry } from "@prisma-next/operations";
4
4
  import { Adapter, CodecParamsDescriptor, CodecRegistry, LoweredStatement, QueryAst, SelectAst, SqlDriver } from "@prisma-next/sql-relational-core/ast";
@@ -25,6 +25,34 @@ declare function validateCodecRegistryCompleteness(registry: CodecRegistry, cont
25
25
  */
26
26
  declare function lowerSqlPlan<Row>(adapter: Adapter<QueryAst, SqlContract<SqlStorage>, LoweredStatement>, contract: SqlContract<SqlStorage>, queryPlan: SqlQueryPlan<Row>): ExecutionPlan<Row>;
27
27
  //#endregion
28
+ //#region src/plugins/lints.d.ts
29
+ interface LintsOptions {
30
+ readonly severities?: {
31
+ readonly selectStar?: 'warn' | 'error';
32
+ readonly noLimit?: 'warn' | 'error';
33
+ readonly deleteWithoutWhere?: 'warn' | 'error';
34
+ readonly updateWithoutWhere?: 'warn' | 'error';
35
+ readonly readOnlyMutation?: 'warn' | 'error';
36
+ readonly unindexedPredicate?: 'warn' | 'error';
37
+ };
38
+ readonly fallbackWhenAstMissing?: 'raw' | 'skip';
39
+ }
40
+ /**
41
+ * AST-first lint plugin for SQL plans. When `plan.ast` is a SQL QueryAst, inspects
42
+ * the AST structurally. When `plan.ast` is missing, falls back to raw heuristic
43
+ * guardrails or skips linting depending on `fallbackWhenAstMissing`.
44
+ *
45
+ * Rules (AST-based):
46
+ * - DELETE without WHERE: blocks execution (configurable severity, default error)
47
+ * - UPDATE without WHERE: blocks execution (configurable severity, default error)
48
+ * - Unbounded SELECT: warn/error (severity from noLimit)
49
+ * - SELECT * intent: warn/error (severity from selectStar)
50
+ *
51
+ * Fallback: When ast is missing, `fallbackWhenAstMissing: 'raw'` uses heuristic
52
+ * SQL parsing; `'skip'` skips all lints. Default is `'raw'`.
53
+ */
54
+ declare function lints<TContract = unknown, TAdapter = unknown, TDriver = unknown>(options?: LintsOptions): Plugin<TContract, TAdapter, TDriver>;
55
+ //#endregion
28
56
  //#region src/sql-context.d.ts
29
57
  /**
30
58
  * Runtime parameterized codec descriptor.
@@ -127,5 +155,5 @@ interface RuntimeQueryable {
127
155
  }
128
156
  declare function createRuntime<TContract extends SqlContract<SqlStorage>, TTargetId extends string>(options: CreateRuntimeOptions<TContract, TTargetId>): Runtime;
129
157
  //#endregion
130
- export { SqlStaticContributions as A, SqlExecutionStackWithDriver as C, SqlRuntimeExtensionDescriptor as D, SqlRuntimeDriverInstance as E, extractCodecIds as F, validateCodecRegistryCompleteness as I, validateContractCodecMappings as L, createExecutionContext as M, createSqlExecutionStack as N, SqlRuntimeExtensionInstance as O, lowerSqlPlan as P, SqlExecutionStack as S, SqlRuntimeAdapterInstance as T, ensureTableStatement as _, Plugin$1 as a, ExecutionContext as b, lints as c, RuntimeTelemetryEvent as d, RuntimeVerifyOptions as f, ensureSchemaStatement as g, SqlStatement as h, Log$1 as i, TypeHelperRegistry as j, SqlRuntimeTargetDescriptor as k, CreateRuntimeOptions as l, createRuntime as m, BudgetsOptions as n, PluginContext as o, TelemetryOutcome as p, LintsOptions as r, budgets as s, AfterExecuteResult as t, Runtime as u, readContractMarker as v, SqlRuntimeAdapterDescriptor as w, RuntimeParameterizedCodecDescriptor as x, writeContractMarker as y };
131
- //# sourceMappingURL=index-SlQIrV_t.d.mts.map
158
+ export { createExecutionContext as A, SqlRuntimeAdapterInstance as C, SqlRuntimeTargetDescriptor as D, SqlRuntimeExtensionInstance as E, extractCodecIds as F, validateCodecRegistryCompleteness as I, validateContractCodecMappings as L, LintsOptions as M, lints as N, SqlStaticContributions as O, lowerSqlPlan as P, SqlRuntimeAdapterDescriptor as S, SqlRuntimeExtensionDescriptor as T, writeContractMarker as _, PluginContext as a, SqlExecutionStack as b, Runtime as c, TelemetryOutcome as d, createRuntime as f, readContractMarker as g, ensureTableStatement as h, Plugin$1 as i, createSqlExecutionStack as j, TypeHelperRegistry as k, RuntimeTelemetryEvent as l, ensureSchemaStatement as m, BudgetsOptions as n, budgets as o, SqlStatement as p, Log$1 as r, CreateRuntimeOptions as s, AfterExecuteResult as t, RuntimeVerifyOptions as u, ExecutionContext as v, SqlRuntimeDriverInstance as w, SqlExecutionStackWithDriver as x, RuntimeParameterizedCodecDescriptor as y };
159
+ //# sourceMappingURL=index-D59jqEKF.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-D59jqEKF.d.mts","names":[],"sources":["../src/codecs/validation.ts","../src/lower-sql-plan.ts","../src/plugins/lints.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 SqlStaticContributions, C as SqlExecutionStackWithDriver, D as SqlRuntimeExtensionDescriptor, E as SqlRuntimeDriverInstance, F as extractCodecIds, I as validateCodecRegistryCompleteness, L as validateContractCodecMappings, M as createExecutionContext, N as createSqlExecutionStack, O as SqlRuntimeExtensionInstance, P as lowerSqlPlan, S as SqlExecutionStack, T as SqlRuntimeAdapterInstance, _ as ensureTableStatement, a as Plugin, b as ExecutionContext, c as lints, d as RuntimeTelemetryEvent, f as RuntimeVerifyOptions, g as ensureSchemaStatement, h as SqlStatement, i as Log, j as TypeHelperRegistry, k as SqlRuntimeTargetDescriptor, l as CreateRuntimeOptions, m as createRuntime, n as BudgetsOptions, o as PluginContext, p as TelemetryOutcome, r as LintsOptions, s as budgets, t as AfterExecuteResult, u as Runtime, v as readContractMarker, w as SqlRuntimeAdapterDescriptor, x as RuntimeParameterizedCodecDescriptor, y as writeContractMarker } from "./index-SlQIrV_t.mjs";
1
+ import { A as createExecutionContext, C as SqlRuntimeAdapterInstance, D as SqlRuntimeTargetDescriptor, E as SqlRuntimeExtensionInstance, F as extractCodecIds, I as validateCodecRegistryCompleteness, L as validateContractCodecMappings, M as LintsOptions, N as lints, O as SqlStaticContributions, P as lowerSqlPlan, S as SqlRuntimeAdapterDescriptor, T as SqlRuntimeExtensionDescriptor, _ as writeContractMarker, a as PluginContext, b as SqlExecutionStack, c as Runtime, d as TelemetryOutcome, f as createRuntime, g as readContractMarker, h as ensureTableStatement, i as Plugin, j as createSqlExecutionStack, k as TypeHelperRegistry, l as RuntimeTelemetryEvent, m as ensureSchemaStatement, n as BudgetsOptions, o as budgets, p as SqlStatement, r as Log, s as CreateRuntimeOptions, t as AfterExecuteResult, u as RuntimeVerifyOptions, v as ExecutionContext, w as SqlRuntimeDriverInstance, x as SqlExecutionStackWithDriver, y as RuntimeParameterizedCodecDescriptor } from "./index-D59jqEKF.mjs";
2
2
  export { AfterExecuteResult, BudgetsOptions, CreateRuntimeOptions, ExecutionContext, LintsOptions, Log, Plugin, PluginContext, Runtime, RuntimeParameterizedCodecDescriptor, RuntimeTelemetryEvent, RuntimeVerifyOptions, SqlExecutionStack, SqlExecutionStackWithDriver, SqlRuntimeAdapterDescriptor, SqlRuntimeAdapterInstance, SqlRuntimeDriverInstance, SqlRuntimeExtensionDescriptor, SqlRuntimeExtensionInstance, SqlRuntimeTargetDescriptor, SqlStatement, SqlStaticContributions, TelemetryOutcome, TypeHelperRegistry, budgets, createExecutionContext, createRuntime, createSqlExecutionStack, ensureSchemaStatement, ensureTableStatement, extractCodecIds, lints, lowerSqlPlan, readContractMarker, validateCodecRegistryCompleteness, validateContractCodecMappings, writeContractMarker };
package/dist/index.mjs CHANGED
@@ -1,3 +1,3 @@
1
- import { a as ensureTableStatement, c as createExecutionContext, d as extractCodecIds, f as validateCodecRegistryCompleteness, i as ensureSchemaStatement, l as createSqlExecutionStack, n as lints, o as readContractMarker, p as validateContractCodecMappings, r as createRuntime, s as writeContractMarker, t as budgets, u as lowerSqlPlan } from "./exports-C8hi0N-a.mjs";
1
+ import { a as readContractMarker, c as createSqlExecutionStack, d as extractCodecIds, f as validateCodecRegistryCompleteness, i as ensureTableStatement, l as lints, n as createRuntime, o as writeContractMarker, p as validateContractCodecMappings, r as ensureSchemaStatement, s as createExecutionContext, t as budgets, u as lowerSqlPlan } from "./exports-BhZqJPVb.mjs";
2
2
 
3
3
  export { budgets, createExecutionContext, createRuntime, createSqlExecutionStack, ensureSchemaStatement, ensureTableStatement, extractCodecIds, lints, lowerSqlPlan, readContractMarker, validateCodecRegistryCompleteness, validateContractCodecMappings, writeContractMarker };
@@ -1,4 +1,4 @@
1
- import { D as SqlRuntimeExtensionDescriptor, E as SqlRuntimeDriverInstance, O as SqlRuntimeExtensionInstance, T as SqlRuntimeAdapterInstance, b as ExecutionContext, h as SqlStatement, k as SqlRuntimeTargetDescriptor, m as createRuntime, w as SqlRuntimeAdapterDescriptor } from "../index-SlQIrV_t.mjs";
1
+ import { C as SqlRuntimeAdapterInstance, D as SqlRuntimeTargetDescriptor, E as SqlRuntimeExtensionInstance, S as SqlRuntimeAdapterDescriptor, T as SqlRuntimeExtensionDescriptor, f as createRuntime, p as SqlStatement, v as ExecutionContext, w as SqlRuntimeDriverInstance } from "../index-D59jqEKF.mjs";
2
2
  import * as _prisma_next_core_execution_plane_stack0 from "@prisma-next/core-execution-plane/stack";
3
3
  import { Adapter, LoweredStatement, SelectAst } from "@prisma-next/sql-relational-core/ast";
4
4
  import { ExecutionPlan, ResultType } from "@prisma-next/contract/types";
@@ -1,4 +1,4 @@
1
- import { a as ensureTableStatement, c as createExecutionContext, i as ensureSchemaStatement, l as createSqlExecutionStack, s as writeContractMarker } from "../exports-C8hi0N-a.mjs";
1
+ import { c as createSqlExecutionStack, i as ensureTableStatement, o as writeContractMarker, r as ensureSchemaStatement, s as createExecutionContext } from "../exports-BhZqJPVb.mjs";
2
2
  import { instantiateExecutionStack } from "@prisma-next/core-execution-plane/stack";
3
3
  import { codec, createCodecRegistry } from "@prisma-next/sql-relational-core/ast";
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.3.0-dev.43",
3
+ "version": "0.3.0-dev.45",
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.3.0-dev.43",
10
- "@prisma-next/utils": "0.3.0-dev.43",
11
- "@prisma-next/core-execution-plane": "0.3.0-dev.43",
12
- "@prisma-next/ids": "0.3.0-dev.43",
13
- "@prisma-next/operations": "0.3.0-dev.43",
14
- "@prisma-next/runtime-executor": "0.3.0-dev.43",
15
- "@prisma-next/sql-contract": "0.3.0-dev.43",
16
- "@prisma-next/sql-operations": "0.3.0-dev.43",
17
- "@prisma-next/sql-relational-core": "0.3.0-dev.43"
9
+ "@prisma-next/contract": "0.3.0-dev.45",
10
+ "@prisma-next/utils": "0.3.0-dev.45",
11
+ "@prisma-next/core-execution-plane": "0.3.0-dev.45",
12
+ "@prisma-next/ids": "0.3.0-dev.45",
13
+ "@prisma-next/operations": "0.3.0-dev.45",
14
+ "@prisma-next/runtime-executor": "0.3.0-dev.45",
15
+ "@prisma-next/sql-contract": "0.3.0-dev.45",
16
+ "@prisma-next/sql-operations": "0.3.0-dev.45",
17
+ "@prisma-next/sql-relational-core": "0.3.0-dev.45"
18
18
  },
19
19
  "devDependencies": {
20
20
  "@types/pg": "8.16.0",
@@ -23,8 +23,8 @@
23
23
  "typescript": "5.9.3",
24
24
  "vitest": "4.0.17",
25
25
  "@prisma-next/test-utils": "0.0.1",
26
- "@prisma-next/tsconfig": "0.0.0",
27
- "@prisma-next/tsdown": "0.0.0"
26
+ "@prisma-next/tsdown": "0.0.0",
27
+ "@prisma-next/tsconfig": "0.0.0"
28
28
  },
29
29
  "files": [
30
30
  "dist",
@@ -1,18 +1,19 @@
1
1
  export type {
2
2
  AfterExecuteResult,
3
3
  BudgetsOptions,
4
- LintsOptions,
5
4
  Log,
6
5
  Plugin,
7
6
  PluginContext,
8
7
  } from '@prisma-next/runtime-executor';
9
- export { budgets, lints } from '@prisma-next/runtime-executor';
8
+ export { budgets } from '@prisma-next/runtime-executor';
10
9
  export {
11
10
  extractCodecIds,
12
11
  validateCodecRegistryCompleteness,
13
12
  validateContractCodecMappings,
14
13
  } from '../codecs/validation';
15
14
  export { lowerSqlPlan } from '../lower-sql-plan';
15
+ export type { LintsOptions } from '../plugins/lints';
16
+ export { lints } from '../plugins/lints';
16
17
  export type {
17
18
  ExecutionContext,
18
19
  RuntimeParameterizedCodecDescriptor,