@prisma-next/runtime-executor 0.3.0-dev.15 → 0.3.0-dev.151

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/src/marker.ts CHANGED
@@ -1,9 +1,6 @@
1
1
  import type { ContractMarkerRecord } from '@prisma-next/contract/types';
2
2
  import { type } from 'arktype';
3
3
 
4
- // Re-export for backward compatibility
5
- export type { ContractMarkerRecord } from '@prisma-next/contract/types';
6
-
7
4
  export interface ContractMarkerRow {
8
5
  core_hash: string;
9
6
  profile_hash: string;
@@ -74,7 +71,7 @@ export function parseContractMarkerRow(row: unknown): ContractMarkerRecord {
74
71
  : new Date();
75
72
 
76
73
  return {
77
- coreHash: validatedRow.core_hash,
74
+ storageHash: validatedRow.core_hash,
78
75
  profileHash: validatedRow.profile_hash,
79
76
  contractJson: validatedRow.contract_json ?? null,
80
77
  canonicalVersion: validatedRow.canonical_version ?? null,
@@ -1,5 +1,4 @@
1
1
  import type { ExecutionPlan } from '@prisma-next/contract/types';
2
- import type { OperationRegistry } from '@prisma-next/operations';
3
2
  import { AsyncIterableResult } from './async-iterable-result';
4
3
  import { runtimeError } from './errors';
5
4
  import { computeSqlFingerprint } from './fingerprint';
@@ -29,25 +28,52 @@ export interface RuntimeCoreOptions<TContract = unknown, TAdapter = unknown, TDr
29
28
  readonly plugins?: readonly Plugin<TContract, TAdapter, TDriver>[];
30
29
  readonly mode?: 'strict' | 'permissive';
31
30
  readonly log?: Log;
32
- readonly operationRegistry: OperationRegistry;
33
31
  }
34
32
 
35
- export interface RuntimeCore<TContract = unknown, TAdapter = unknown, TDriver = unknown> {
33
+ export interface RuntimeCore<TContract = unknown, TAdapter = unknown, TDriver = unknown>
34
+ extends RuntimeQueryable {
36
35
  // Type parameters are used in the implementation for type safety
37
36
  readonly _typeContract?: TContract;
38
37
  readonly _typeAdapter?: TAdapter;
39
38
  readonly _typeDriver?: TDriver;
40
- execute<Row = Record<string, unknown>>(plan: ExecutionPlan<Row>): AsyncIterableResult<Row>;
39
+ connection(): Promise<RuntimeConnection>;
41
40
  telemetry(): RuntimeTelemetryEvent | null;
42
41
  close(): Promise<void>;
43
- operations(): OperationRegistry;
42
+ }
43
+
44
+ export interface RuntimeConnection extends RuntimeQueryable {
45
+ transaction(): Promise<RuntimeTransaction>;
46
+ release(): Promise<void>;
47
+ }
48
+
49
+ export interface RuntimeTransaction extends RuntimeQueryable {
50
+ commit(): Promise<void>;
51
+ rollback(): Promise<void>;
52
+ }
53
+
54
+ export interface RuntimeQueryable {
55
+ execute<Row = Record<string, unknown>>(plan: ExecutionPlan<Row>): AsyncIterableResult<Row>;
44
56
  }
45
57
 
46
58
  interface DriverWithQuery<_TDriver> {
47
59
  query(sql: string, params: readonly unknown[]): Promise<{ rows: ReadonlyArray<unknown> }>;
48
60
  }
49
61
 
50
- interface DriverWithExecute<_TDriver> {
62
+ interface DriverWithConnection<_TDriver> {
63
+ acquireConnection(): Promise<DriverConnection>;
64
+ }
65
+
66
+ export interface DriverConnection extends Queryable {
67
+ beginTransaction(): Promise<DriverTransaction>;
68
+ release(): Promise<void>;
69
+ }
70
+
71
+ export interface DriverTransaction extends Queryable {
72
+ commit(): Promise<void>;
73
+ rollback(): Promise<void>;
74
+ }
75
+
76
+ export interface Queryable {
51
77
  execute<Row = Record<string, unknown>>(options: {
52
78
  sql: string;
53
79
  params: readonly unknown[];
@@ -70,7 +96,6 @@ class RuntimeCoreImpl<TContract = unknown, TAdapter = unknown, TDriver = unknown
70
96
  private readonly plugins: readonly Plugin<TContract, TAdapter, TDriver>[];
71
97
  private readonly mode: 'strict' | 'permissive';
72
98
  private readonly verify: RuntimeVerifyOptions;
73
- private readonly operationRegistry: OperationRegistry;
74
99
  private readonly pluginContext: PluginContext<TContract, TAdapter, TDriver>;
75
100
 
76
101
  private verified: boolean;
@@ -85,8 +110,6 @@ class RuntimeCoreImpl<TContract = unknown, TAdapter = unknown, TDriver = unknown
85
110
  this.plugins = options.plugins ?? [];
86
111
  this.mode = options.mode ?? 'strict';
87
112
  this.verify = options.verify;
88
- this.operationRegistry = options.operationRegistry;
89
-
90
113
  this.verified = options.verify.mode === 'startup' ? false : options.verify.mode === 'always';
91
114
  this.startupVerified = false;
92
115
  this._telemetry = null;
@@ -136,12 +159,20 @@ class RuntimeCoreImpl<TContract = unknown, TAdapter = unknown, TDriver = unknown
136
159
 
137
160
  const marker = parseContractMarkerRow(result.rows[0]);
138
161
 
139
- const contract = this.contract as { coreHash: string; profileHash?: string | null };
140
- if (marker.coreHash !== contract.coreHash) {
141
- throw runtimeError('CONTRACT.MARKER_MISMATCH', 'Database core hash does not match contract', {
142
- expected: contract.coreHash,
143
- actual: marker.coreHash,
144
- });
162
+ const contract = this.contract as {
163
+ storage: { storageHash: string };
164
+ execution?: { executionHash?: string | null };
165
+ profileHash?: string | null;
166
+ };
167
+ if (marker.storageHash !== contract.storage.storageHash) {
168
+ throw runtimeError(
169
+ 'CONTRACT.MARKER_MISMATCH',
170
+ 'Database storage hash does not match contract',
171
+ {
172
+ expected: contract.storage.storageHash,
173
+ actual: marker.storageHash,
174
+ },
175
+ );
145
176
  }
146
177
 
147
178
  const expectedProfile = contract.profileHash ?? null;
@@ -180,6 +211,59 @@ class RuntimeCoreImpl<TContract = unknown, TAdapter = unknown, TDriver = unknown
180
211
  }
181
212
 
182
213
  execute<Row = Record<string, unknown>>(plan: ExecutionPlan<Row>): AsyncIterableResult<Row> {
214
+ return this.#executeWith(plan, this.driver as Queryable);
215
+ }
216
+
217
+ async connection(): Promise<RuntimeConnection> {
218
+ const driver = this.driver as unknown as DriverWithConnection<TDriver>;
219
+ const driverConn = await driver.acquireConnection();
220
+ const self = this;
221
+
222
+ const runtimeConnection: RuntimeConnection = {
223
+ async transaction(): Promise<RuntimeTransaction> {
224
+ const driverTx = await driverConn.beginTransaction();
225
+ const runtimeTx: RuntimeTransaction = {
226
+ async commit(): Promise<void> {
227
+ await driverTx.commit();
228
+ },
229
+ async rollback(): Promise<void> {
230
+ await driverTx.rollback();
231
+ },
232
+ execute<Row = Record<string, unknown>>(
233
+ plan: ExecutionPlan<Row>,
234
+ ): AsyncIterableResult<Row> {
235
+ return self.#executeWith(plan, driverTx);
236
+ },
237
+ };
238
+ return runtimeTx;
239
+ },
240
+ execute<Row = Record<string, unknown>>(plan: ExecutionPlan<Row>): AsyncIterableResult<Row> {
241
+ return self.#executeWith(plan, driverConn);
242
+ },
243
+ async release(): Promise<void> {
244
+ await driverConn.release();
245
+ },
246
+ };
247
+
248
+ return runtimeConnection;
249
+ }
250
+
251
+ telemetry(): RuntimeTelemetryEvent | null {
252
+ return this._telemetry;
253
+ }
254
+
255
+ close(): Promise<void> {
256
+ const driver = this.driver as unknown as DriverWithClose<TDriver>;
257
+ if (typeof driver.close === 'function') {
258
+ return driver.close();
259
+ }
260
+ return Promise.resolve();
261
+ }
262
+
263
+ #executeWith<Row = Record<string, unknown>>(
264
+ plan: ExecutionPlan<Row>,
265
+ queryable: Queryable,
266
+ ): AsyncIterableResult<Row> {
183
267
  this.validatePlan(plan);
184
268
  this._telemetry = null;
185
269
 
@@ -209,10 +293,9 @@ class RuntimeCoreImpl<TContract = unknown, TAdapter = unknown, TDriver = unknown
209
293
  }
210
294
  }
211
295
 
212
- const driver = self.driver as unknown as DriverWithExecute<TDriver>;
213
- const encodedParams = plan.params as readonly unknown[];
296
+ const encodedParams = plan.params;
214
297
 
215
- for await (const row of driver.execute<Record<string, unknown>>({
298
+ for await (const row of queryable.execute<Record<string, unknown>>({
216
299
  sql: plan.sql,
217
300
  params: encodedParams,
218
301
  })) {
@@ -260,22 +343,6 @@ class RuntimeCoreImpl<TContract = unknown, TAdapter = unknown, TDriver = unknown
260
343
 
261
344
  return new AsyncIterableResult(iterator(this));
262
345
  }
263
-
264
- telemetry(): RuntimeTelemetryEvent | null {
265
- return this._telemetry;
266
- }
267
-
268
- operations(): OperationRegistry {
269
- return this.operationRegistry;
270
- }
271
-
272
- close(): Promise<void> {
273
- const driver = this.driver as unknown as DriverWithClose<TDriver>;
274
- if (typeof driver.close === 'function') {
275
- return driver.close();
276
- }
277
- return Promise.resolve();
278
- }
279
346
  }
280
347
 
281
348
  export function createRuntimeCore<TContract = unknown, TAdapter = unknown, TDriver = unknown>(
@@ -1,17 +0,0 @@
1
- /**
2
- * Custom async iterable result that extends AsyncIterable with a toArray() method.
3
- * This provides a convenient way to collect all results from an async iterator.
4
- */
5
- export declare class AsyncIterableResult<Row> implements AsyncIterable<Row> {
6
- private readonly generator;
7
- private consumed;
8
- private consumedBy;
9
- constructor(generator: AsyncGenerator<Row, void, unknown>);
10
- [Symbol.asyncIterator](): AsyncIterator<Row>;
11
- /**
12
- * Collects all values from the async iterator into an array.
13
- * Once called, the iterator is consumed and cannot be reused.
14
- */
15
- toArray(): Promise<Row[]>;
16
- }
17
- //# sourceMappingURL=async-iterable-result.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"async-iterable-result.d.ts","sourceRoot":"","sources":["../src/async-iterable-result.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,qBAAa,mBAAmB,CAAC,GAAG,CAAE,YAAW,aAAa,CAAC,GAAG,CAAC;IACjE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAqC;IAC/D,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,UAAU,CAAqC;gBAE3C,SAAS,EAAE,cAAc,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC;IAIzD,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,aAAa,CAAC,GAAG,CAAC;IAmB5C;;;OAGG;IACG,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;CAsBhC"}
package/dist/errors.d.ts DELETED
@@ -1,8 +0,0 @@
1
- export interface RuntimeErrorEnvelope extends Error {
2
- readonly code: string;
3
- readonly category: 'PLAN' | 'CONTRACT' | 'LINT' | 'BUDGET' | 'RUNTIME';
4
- readonly severity: 'error';
5
- readonly details?: Record<string, unknown>;
6
- }
7
- export declare function runtimeError(code: string, message: string, details?: Record<string, unknown>): RuntimeErrorEnvelope;
8
- //# sourceMappingURL=errors.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,oBAAqB,SAAQ,KAAK;IACjD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;IACvE,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC5C;AAED,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,oBAAoB,CActB"}
@@ -1,17 +0,0 @@
1
- export { AsyncIterableResult } from '../async-iterable-result';
2
- export type { RuntimeErrorEnvelope } from '../errors';
3
- export { runtimeError } from '../errors';
4
- export { computeSqlFingerprint } from '../fingerprint';
5
- export type { BudgetFinding, LintFinding, RawGuardrailResult } from '../guardrails/raw';
6
- export { evaluateRawGuardrails } from '../guardrails/raw';
7
- export type { ContractMarkerRecord } from '../marker';
8
- export { parseContractMarkerRow } from '../marker';
9
- export type { BudgetsOptions } from '../plugins/budgets';
10
- export { budgets } from '../plugins/budgets';
11
- export type { LintsOptions } from '../plugins/lints';
12
- export { lints } from '../plugins/lints';
13
- export type { AfterExecuteResult, Log, Plugin, PluginContext, Severity, } from '../plugins/types';
14
- export type { RuntimeCore, RuntimeCoreOptions, RuntimeTelemetryEvent, RuntimeVerifyOptions, TelemetryOutcome, } from '../runtime-core';
15
- export { createRuntimeCore } from '../runtime-core';
16
- export type { MarkerReader, MarkerStatement, RuntimeFamilyAdapter } from '../runtime-spi';
17
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/exports/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,YAAY,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACxF,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,YAAY,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AACnD,YAAY,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,YAAY,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,YAAY,EACV,kBAAkB,EAClB,GAAG,EACH,MAAM,EACN,aAAa,EACb,QAAQ,GACT,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,WAAW,EACX,kBAAkB,EAClB,qBAAqB,EACrB,oBAAoB,EACpB,gBAAgB,GACjB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -1,2 +0,0 @@
1
- export declare function computeSqlFingerprint(sql: string): string;
2
- //# sourceMappingURL=fingerprint.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"fingerprint.d.ts","sourceRoot":"","sources":["../src/fingerprint.ts"],"names":[],"mappings":"AAMA,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAOzD"}
@@ -1,28 +0,0 @@
1
- import type { ExecutionPlan } from '@prisma-next/contract/types';
2
- export type LintSeverity = 'error' | 'warn';
3
- export type BudgetSeverity = 'error' | 'warn';
4
- export interface LintFinding {
5
- readonly code: `LINT.${string}`;
6
- readonly severity: LintSeverity;
7
- readonly message: string;
8
- readonly details?: Record<string, unknown>;
9
- }
10
- export interface BudgetFinding {
11
- readonly code: `BUDGET.${string}`;
12
- readonly severity: BudgetSeverity;
13
- readonly message: string;
14
- readonly details?: Record<string, unknown>;
15
- }
16
- export interface RawGuardrailConfig {
17
- readonly budgets?: {
18
- readonly unboundedSelectSeverity?: BudgetSeverity;
19
- readonly estimatedRows?: number;
20
- };
21
- }
22
- export interface RawGuardrailResult {
23
- readonly lints: LintFinding[];
24
- readonly budgets: BudgetFinding[];
25
- readonly statement: 'select' | 'mutation' | 'other';
26
- }
27
- export declare function evaluateRawGuardrails(plan: ExecutionPlan, config?: RawGuardrailConfig): RawGuardrailResult;
28
- //# sourceMappingURL=raw.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"raw.d.ts","sourceRoot":"","sources":["../../src/guardrails/raw.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAsB,MAAM,6BAA6B,CAAC;AAErF,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,MAAM,CAAC;AAC5C,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,MAAM,CAAC;AAE9C,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,QAAQ,MAAM,EAAE,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC5C;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,UAAU,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC5C;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,OAAO,CAAC,EAAE;QACjB,QAAQ,CAAC,uBAAuB,CAAC,EAAE,cAAc,CAAC;QAClD,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;KACjC,CAAC;CACH;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,KAAK,EAAE,WAAW,EAAE,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,aAAa,EAAE,CAAC;IAClC,QAAQ,CAAC,SAAS,EAAE,QAAQ,GAAG,UAAU,GAAG,OAAO,CAAC;CACrD;AAQD,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,aAAa,EACnB,MAAM,CAAC,EAAE,kBAAkB,GAC1B,kBAAkB,CA4DpB"}
package/dist/index.d.ts DELETED
@@ -1,2 +0,0 @@
1
- export * from './exports';
2
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC"}