@prisma-next/runtime-executor 0.2.0 → 0.3.0-dev.10

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.
@@ -0,0 +1,17 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,8 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,17 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,2 @@
1
+ export declare function computeSqlFingerprint(sql: string): string;
2
+ //# sourceMappingURL=fingerprint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fingerprint.d.ts","sourceRoot":"","sources":["../src/fingerprint.ts"],"names":[],"mappings":"AAMA,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAOzD"}
@@ -0,0 +1,28 @@
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
@@ -0,0 +1 @@
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 CHANGED
@@ -1,157 +1,2 @@
1
- import { ExecutionPlan, ContractMarkerRecord } from '@prisma-next/contract/types';
2
- export { ContractMarkerRecord } from '@prisma-next/contract/types';
3
- import { OperationRegistry } from '@prisma-next/operations';
4
-
5
- /**
6
- * Custom async iterable result that extends AsyncIterable with a toArray() method.
7
- * This provides a convenient way to collect all results from an async iterator.
8
- */
9
- declare class AsyncIterableResult<Row> implements AsyncIterable<Row> {
10
- private readonly generator;
11
- private consumed;
12
- private consumedBy;
13
- constructor(generator: AsyncGenerator<Row, void, unknown>);
14
- [Symbol.asyncIterator](): AsyncIterator<Row>;
15
- /**
16
- * Collects all values from the async iterator into an array.
17
- * Once called, the iterator is consumed and cannot be reused.
18
- */
19
- toArray(): Promise<Row[]>;
20
- }
21
-
22
- interface RuntimeErrorEnvelope extends Error {
23
- readonly code: string;
24
- readonly category: 'PLAN' | 'CONTRACT' | 'LINT' | 'BUDGET' | 'RUNTIME';
25
- readonly severity: 'error';
26
- readonly details?: Record<string, unknown>;
27
- }
28
- declare function runtimeError(code: string, message: string, details?: Record<string, unknown>): RuntimeErrorEnvelope;
29
-
30
- declare function computeSqlFingerprint(sql: string): string;
31
-
32
- type LintSeverity = 'error' | 'warn';
33
- type BudgetSeverity = 'error' | 'warn';
34
- interface LintFinding {
35
- readonly code: `LINT.${string}`;
36
- readonly severity: LintSeverity;
37
- readonly message: string;
38
- readonly details?: Record<string, unknown>;
39
- }
40
- interface BudgetFinding {
41
- readonly code: `BUDGET.${string}`;
42
- readonly severity: BudgetSeverity;
43
- readonly message: string;
44
- readonly details?: Record<string, unknown>;
45
- }
46
- interface RawGuardrailConfig {
47
- readonly budgets?: {
48
- readonly unboundedSelectSeverity?: BudgetSeverity;
49
- readonly estimatedRows?: number;
50
- };
51
- }
52
- interface RawGuardrailResult {
53
- readonly lints: LintFinding[];
54
- readonly budgets: BudgetFinding[];
55
- readonly statement: 'select' | 'mutation' | 'other';
56
- }
57
- declare function evaluateRawGuardrails(plan: ExecutionPlan, config?: RawGuardrailConfig): RawGuardrailResult;
58
-
59
- declare function parseContractMarkerRow(row: unknown): ContractMarkerRecord;
60
-
61
- type Severity = 'error' | 'warn' | 'info';
62
- interface Log {
63
- info(event: unknown): void;
64
- warn(event: unknown): void;
65
- error(event: unknown): void;
66
- }
67
- interface PluginContext<TContract = unknown, TAdapter = unknown, TDriver = unknown> {
68
- readonly contract: TContract;
69
- readonly adapter: TAdapter;
70
- readonly driver: TDriver;
71
- readonly mode: 'strict' | 'permissive';
72
- readonly now: () => number;
73
- readonly log: Log;
74
- }
75
- interface AfterExecuteResult {
76
- readonly rowCount: number;
77
- readonly latencyMs: number;
78
- readonly completed: boolean;
79
- }
80
- interface Plugin<TContract = unknown, TAdapter = unknown, TDriver = unknown> {
81
- readonly name: string;
82
- beforeExecute?(plan: ExecutionPlan, ctx: PluginContext<TContract, TAdapter, TDriver>): Promise<void>;
83
- onRow?(row: Record<string, unknown>, plan: ExecutionPlan, ctx: PluginContext<TContract, TAdapter, TDriver>): Promise<void>;
84
- afterExecute?(plan: ExecutionPlan, result: AfterExecuteResult, ctx: PluginContext<TContract, TAdapter, TDriver>): Promise<void>;
85
- }
86
-
87
- interface BudgetsOptions {
88
- readonly maxRows?: number;
89
- readonly defaultTableRows?: number;
90
- readonly tableRows?: Record<string, number>;
91
- readonly maxLatencyMs?: number;
92
- readonly severities?: {
93
- readonly rowCount?: 'warn' | 'error';
94
- readonly latency?: 'warn' | 'error';
95
- };
96
- readonly explain?: {
97
- readonly enabled?: boolean;
98
- };
99
- }
100
- declare function budgets<TContract = unknown, TAdapter = unknown, TDriver = unknown>(options?: BudgetsOptions): Plugin<TContract, TAdapter, TDriver>;
101
-
102
- interface LintsOptions {
103
- readonly severities?: {
104
- readonly selectStar?: 'warn' | 'error';
105
- readonly noLimit?: 'warn' | 'error';
106
- readonly readOnlyMutation?: 'warn' | 'error';
107
- readonly unindexedPredicate?: 'warn' | 'error';
108
- };
109
- }
110
- declare function lints<TContract = unknown, TAdapter = unknown, TDriver = unknown>(options?: LintsOptions): Plugin<TContract, TAdapter, TDriver>;
111
-
112
- interface MarkerStatement {
113
- readonly sql: string;
114
- readonly params: readonly unknown[];
115
- }
116
- interface MarkerReader {
117
- readMarkerStatement(): MarkerStatement;
118
- }
119
- interface RuntimeFamilyAdapter<TContract = unknown> {
120
- readonly contract: TContract;
121
- readonly markerReader: MarkerReader;
122
- validatePlan(plan: ExecutionPlan, contract: TContract): void;
123
- }
124
-
125
- interface RuntimeVerifyOptions {
126
- readonly mode: 'onFirstUse' | 'startup' | 'always';
127
- readonly requireMarker: boolean;
128
- }
129
- type TelemetryOutcome = 'success' | 'runtime-error';
130
- interface RuntimeTelemetryEvent {
131
- readonly lane: string;
132
- readonly target: string;
133
- readonly fingerprint: string;
134
- readonly outcome: TelemetryOutcome;
135
- readonly durationMs?: number;
136
- }
137
- interface RuntimeCoreOptions<TContract = unknown, TAdapter = unknown, TDriver = unknown> {
138
- readonly familyAdapter: RuntimeFamilyAdapter<TContract>;
139
- readonly driver: TDriver;
140
- readonly verify: RuntimeVerifyOptions;
141
- readonly plugins?: readonly Plugin<TContract, TAdapter, TDriver>[];
142
- readonly mode?: 'strict' | 'permissive';
143
- readonly log?: Log;
144
- readonly operationRegistry: OperationRegistry;
145
- }
146
- interface RuntimeCore<TContract = unknown, TAdapter = unknown, TDriver = unknown> {
147
- readonly _typeContract?: TContract;
148
- readonly _typeAdapter?: TAdapter;
149
- readonly _typeDriver?: TDriver;
150
- execute<Row = Record<string, unknown>>(plan: ExecutionPlan<Row>): AsyncIterableResult<Row>;
151
- telemetry(): RuntimeTelemetryEvent | null;
152
- close(): Promise<void>;
153
- operations(): OperationRegistry;
154
- }
155
- declare function createRuntimeCore<TContract = unknown, TAdapter = unknown, TDriver = unknown>(options: RuntimeCoreOptions<TContract, TAdapter, TDriver>): RuntimeCore<TContract, TAdapter, TDriver>;
156
-
157
- export { type AfterExecuteResult, AsyncIterableResult, type BudgetFinding, type BudgetsOptions, type LintFinding, type LintsOptions, type Log, type MarkerReader, type MarkerStatement, type Plugin, type PluginContext, type RawGuardrailResult, type RuntimeCore, type RuntimeCoreOptions, type RuntimeErrorEnvelope, type RuntimeFamilyAdapter, type RuntimeTelemetryEvent, type RuntimeVerifyOptions, type Severity, type TelemetryOutcome, budgets, computeSqlFingerprint, createRuntimeCore, evaluateRawGuardrails, lints, parseContractMarkerRow, runtimeError };
1
+ export * from './exports';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { ContractMarkerRecord } from '@prisma-next/contract/types';
2
+ export type { ContractMarkerRecord } from '@prisma-next/contract/types';
3
+ export interface ContractMarkerRow {
4
+ core_hash: string;
5
+ profile_hash: string;
6
+ contract_json: unknown | null;
7
+ canonical_version: number | null;
8
+ updated_at: Date;
9
+ app_tag: string | null;
10
+ meta: unknown | null;
11
+ }
12
+ export declare function parseContractMarkerRow(row: unknown): ContractMarkerRecord;
13
+ //# sourceMappingURL=marker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marker.d.ts","sourceRoot":"","sources":["../src/marker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAIxE,YAAY,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAExE,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,OAAO,GAAG,IAAI,CAAC;IAC9B,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,UAAU,EAAE,IAAI,CAAC;IACjB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;CACtB;AAsCD,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,OAAO,GAAG,oBAAoB,CAgCzE"}
@@ -0,0 +1,16 @@
1
+ import type { Plugin } from './types';
2
+ export interface BudgetsOptions {
3
+ readonly maxRows?: number;
4
+ readonly defaultTableRows?: number;
5
+ readonly tableRows?: Record<string, number>;
6
+ readonly maxLatencyMs?: number;
7
+ readonly severities?: {
8
+ readonly rowCount?: 'warn' | 'error';
9
+ readonly latency?: 'warn' | 'error';
10
+ };
11
+ readonly explain?: {
12
+ readonly enabled?: boolean;
13
+ };
14
+ }
15
+ export declare function budgets<TContract = unknown, TAdapter = unknown, TDriver = unknown>(options?: BudgetsOptions): Plugin<TContract, TAdapter, TDriver>;
16
+ //# sourceMappingURL=budgets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"budgets.d.ts","sourceRoot":"","sources":["../../src/plugins/budgets.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAsB,MAAM,EAAiB,MAAM,SAAS,CAAC;AAEzE,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,UAAU,CAAC,EAAE;QACpB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QACrC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;KACrC,CAAC;IACF,QAAQ,CAAC,OAAO,CAAC,EAAE;QACjB,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;KAC5B,CAAC;CACH;AAmJD,wBAAgB,OAAO,CAAC,SAAS,GAAG,OAAO,EAAE,QAAQ,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO,EAChF,OAAO,CAAC,EAAE,cAAc,GACvB,MAAM,CAAC,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC,CAmKtC"}
@@ -0,0 +1,11 @@
1
+ import type { Plugin } from './types';
2
+ export interface LintsOptions {
3
+ readonly severities?: {
4
+ readonly selectStar?: 'warn' | 'error';
5
+ readonly noLimit?: 'warn' | 'error';
6
+ readonly readOnlyMutation?: 'warn' | 'error';
7
+ readonly unindexedPredicate?: 'warn' | 'error';
8
+ };
9
+ }
10
+ export declare function lints<TContract = unknown, TAdapter = unknown, TDriver = unknown>(options?: LintsOptions): Plugin<TContract, TAdapter, TDriver>;
11
+ //# sourceMappingURL=lints.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lints.d.ts","sourceRoot":"","sources":["../../src/plugins/lints.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAiB,MAAM,SAAS,CAAC;AAErD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,UAAU,CAAC,EAAE;QACpB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QACvC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QACpC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAC7C,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;KAChD,CAAC;CACH;AAqBD,wBAAgB,KAAK,CAAC,SAAS,GAAG,OAAO,EAAE,QAAQ,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO,EAC9E,OAAO,CAAC,EAAE,YAAY,GACrB,MAAM,CAAC,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC,CA4BtC"}
@@ -0,0 +1,27 @@
1
+ import type { ExecutionPlan } from '@prisma-next/contract/types';
2
+ export type Severity = 'error' | 'warn' | 'info';
3
+ export interface Log {
4
+ info(event: unknown): void;
5
+ warn(event: unknown): void;
6
+ error(event: unknown): void;
7
+ }
8
+ export interface PluginContext<TContract = unknown, TAdapter = unknown, TDriver = unknown> {
9
+ readonly contract: TContract;
10
+ readonly adapter: TAdapter;
11
+ readonly driver: TDriver;
12
+ readonly mode: 'strict' | 'permissive';
13
+ readonly now: () => number;
14
+ readonly log: Log;
15
+ }
16
+ export interface AfterExecuteResult {
17
+ readonly rowCount: number;
18
+ readonly latencyMs: number;
19
+ readonly completed: boolean;
20
+ }
21
+ export interface Plugin<TContract = unknown, TAdapter = unknown, TDriver = unknown> {
22
+ readonly name: string;
23
+ beforeExecute?(plan: ExecutionPlan, ctx: PluginContext<TContract, TAdapter, TDriver>): Promise<void>;
24
+ onRow?(row: Record<string, unknown>, plan: ExecutionPlan, ctx: PluginContext<TContract, TAdapter, TDriver>): Promise<void>;
25
+ afterExecute?(plan: ExecutionPlan, result: AfterExecuteResult, ctx: PluginContext<TContract, TAdapter, TDriver>): Promise<void>;
26
+ }
27
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/plugins/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAEjE,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;AAEjD,MAAM,WAAW,GAAG;IAClB,IAAI,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IAC3B,IAAI,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IAC3B,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,aAAa,CAAC,SAAS,GAAG,OAAO,EAAE,QAAQ,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO;IACvF,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,YAAY,CAAC;IACvC,QAAQ,CAAC,GAAG,EAAE,MAAM,MAAM,CAAC;IAC3B,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,MAAM,CAAC,SAAS,GAAG,OAAO,EAAE,QAAQ,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO;IAChF,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,CACZ,IAAI,EAAE,aAAa,EACnB,GAAG,EAAE,aAAa,CAAC,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC,GAC/C,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,KAAK,CAAC,CACJ,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,IAAI,EAAE,aAAa,EACnB,GAAG,EAAE,aAAa,CAAC,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC,GAC/C,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,YAAY,CAAC,CACX,IAAI,EAAE,aAAa,EACnB,MAAM,EAAE,kBAAkB,EAC1B,GAAG,EAAE,aAAa,CAAC,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC,GAC/C,OAAO,CAAC,IAAI,CAAC,CAAC;CAClB"}
@@ -0,0 +1,37 @@
1
+ import type { ExecutionPlan } from '@prisma-next/contract/types';
2
+ import type { OperationRegistry } from '@prisma-next/operations';
3
+ import { AsyncIterableResult } from './async-iterable-result';
4
+ import type { Log, Plugin } from './plugins/types';
5
+ import type { RuntimeFamilyAdapter } from './runtime-spi';
6
+ export interface RuntimeVerifyOptions {
7
+ readonly mode: 'onFirstUse' | 'startup' | 'always';
8
+ readonly requireMarker: boolean;
9
+ }
10
+ export type TelemetryOutcome = 'success' | 'runtime-error';
11
+ export interface RuntimeTelemetryEvent {
12
+ readonly lane: string;
13
+ readonly target: string;
14
+ readonly fingerprint: string;
15
+ readonly outcome: TelemetryOutcome;
16
+ readonly durationMs?: number;
17
+ }
18
+ export interface RuntimeCoreOptions<TContract = unknown, TAdapter = unknown, TDriver = unknown> {
19
+ readonly familyAdapter: RuntimeFamilyAdapter<TContract>;
20
+ readonly driver: TDriver;
21
+ readonly verify: RuntimeVerifyOptions;
22
+ readonly plugins?: readonly Plugin<TContract, TAdapter, TDriver>[];
23
+ readonly mode?: 'strict' | 'permissive';
24
+ readonly log?: Log;
25
+ readonly operationRegistry: OperationRegistry;
26
+ }
27
+ export interface RuntimeCore<TContract = unknown, TAdapter = unknown, TDriver = unknown> {
28
+ readonly _typeContract?: TContract;
29
+ readonly _typeAdapter?: TAdapter;
30
+ readonly _typeDriver?: TDriver;
31
+ execute<Row = Record<string, unknown>>(plan: ExecutionPlan<Row>): AsyncIterableResult<Row>;
32
+ telemetry(): RuntimeTelemetryEvent | null;
33
+ close(): Promise<void>;
34
+ operations(): OperationRegistry;
35
+ }
36
+ export declare function createRuntimeCore<TContract = unknown, TAdapter = unknown, TDriver = unknown>(options: RuntimeCoreOptions<TContract, TAdapter, TDriver>): RuntimeCore<TContract, TAdapter, TDriver>;
37
+ //# sourceMappingURL=runtime-core.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-core.d.ts","sourceRoot":"","sources":["../src/runtime-core.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAI9D,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,EAAiB,MAAM,iBAAiB,CAAC;AAClE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAE1D,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,SAAS,GAAG,QAAQ,CAAC;IACnD,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;CACjC;AAED,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,eAAe,CAAC;AAE3D,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,gBAAgB,CAAC;IACnC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,kBAAkB,CAAC,SAAS,GAAG,OAAO,EAAE,QAAQ,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO;IAC5F,QAAQ,CAAC,aAAa,EAAE,oBAAoB,CAAC,SAAS,CAAC,CAAC;IACxD,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,oBAAoB,CAAC;IACtC,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,CAAC,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,CAAC;IACnE,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,GAAG,YAAY,CAAC;IACxC,QAAQ,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC;IACnB,QAAQ,CAAC,iBAAiB,EAAE,iBAAiB,CAAC;CAC/C;AAED,MAAM,WAAW,WAAW,CAAC,SAAS,GAAG,OAAO,EAAE,QAAQ,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO;IAErF,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,CAAC;IACnC,QAAQ,CAAC,YAAY,CAAC,EAAE,QAAQ,CAAC;IACjC,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B,OAAO,CAAC,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,aAAa,CAAC,GAAG,CAAC,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;IAC3F,SAAS,IAAI,qBAAqB,GAAG,IAAI,CAAC;IAC1C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,UAAU,IAAI,iBAAiB,CAAC;CACjC;AA6OD,wBAAgB,iBAAiB,CAAC,SAAS,GAAG,OAAO,EAAE,QAAQ,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO,EAC1F,OAAO,EAAE,kBAAkB,CAAC,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC,GACxD,WAAW,CAAC,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC,CAE3C"}
@@ -0,0 +1,14 @@
1
+ import type { ExecutionPlan } from '@prisma-next/contract/types';
2
+ export interface MarkerStatement {
3
+ readonly sql: string;
4
+ readonly params: readonly unknown[];
5
+ }
6
+ export interface MarkerReader {
7
+ readMarkerStatement(): MarkerStatement;
8
+ }
9
+ export interface RuntimeFamilyAdapter<TContract = unknown> {
10
+ readonly contract: TContract;
11
+ readonly markerReader: MarkerReader;
12
+ validatePlan(plan: ExecutionPlan, contract: TContract): void;
13
+ }
14
+ //# sourceMappingURL=runtime-spi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-spi.d.ts","sourceRoot":"","sources":["../src/runtime-spi.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAEjE,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,SAAS,OAAO,EAAE,CAAC;CACrC;AAED,MAAM,WAAW,YAAY;IAC3B,mBAAmB,IAAI,eAAe,CAAC;CACxC;AAED,MAAM,WAAW,oBAAoB,CAAC,SAAS,GAAG,OAAO;IACvD,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;IACpC,YAAY,CAAC,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,SAAS,GAAG,IAAI,CAAC;CAC9D"}
package/package.json CHANGED
@@ -1,24 +1,25 @@
1
1
  {
2
2
  "name": "@prisma-next/runtime-executor",
3
- "version": "0.2.0",
3
+ "version": "0.3.0-dev.10",
4
4
  "type": "module",
5
5
  "sideEffects": false,
6
6
  "description": "Target-agnostic execution engine for Prisma Next",
7
7
  "dependencies": {
8
8
  "arktype": "^2.1.25",
9
- "@prisma-next/contract": "0.2.0",
10
- "@prisma-next/operations": "0.2.0"
9
+ "@prisma-next/operations": "0.3.0-dev.10",
10
+ "@prisma-next/contract": "0.3.0-dev.10"
11
11
  },
12
12
  "devDependencies": {
13
13
  "@prisma/dev": "0.19.1",
14
- "@vitest/coverage-v8": "^4.0.0",
15
- "tsup": "^8.3.0",
16
- "typescript": "^5.9.3",
17
- "vitest": "^4.0.16",
14
+ "@vitest/coverage-v8": "4.0.16",
15
+ "tsup": "8.5.1",
16
+ "typescript": "5.9.3",
17
+ "vitest": "4.0.16",
18
18
  "@prisma-next/test-utils": "0.0.1"
19
19
  },
20
20
  "files": [
21
- "dist"
21
+ "dist",
22
+ "src"
22
23
  ],
23
24
  "exports": {
24
25
  ".": {
@@ -27,7 +28,7 @@
27
28
  }
28
29
  },
29
30
  "scripts": {
30
- "build": "tsup --config tsup.config.ts",
31
+ "build": "tsup --config tsup.config.ts && tsc --project tsconfig.build.json",
31
32
  "test": "vitest run",
32
33
  "test:coverage": "vitest run --coverage",
33
34
  "typecheck": "tsc --project tsconfig.json --noEmit",
@@ -0,0 +1,61 @@
1
+ import { runtimeError } from './errors';
2
+
3
+ /**
4
+ * Custom async iterable result that extends AsyncIterable with a toArray() method.
5
+ * This provides a convenient way to collect all results from an async iterator.
6
+ */
7
+ export class AsyncIterableResult<Row> implements AsyncIterable<Row> {
8
+ private readonly generator: AsyncGenerator<Row, void, unknown>;
9
+ private consumed = false;
10
+ private consumedBy: 'toArray' | 'iterator' | undefined;
11
+
12
+ constructor(generator: AsyncGenerator<Row, void, unknown>) {
13
+ this.generator = generator;
14
+ }
15
+
16
+ [Symbol.asyncIterator](): AsyncIterator<Row> {
17
+ if (this.consumed) {
18
+ throw runtimeError(
19
+ 'RUNTIME.ITERATOR_CONSUMED',
20
+ `AsyncIterableResult iterator has already been consumed via ${this.consumedBy === 'toArray' ? 'toArray()' : 'for-await loop'}. Each AsyncIterableResult can only be iterated once.`,
21
+ {
22
+ consumedBy: this.consumedBy,
23
+ suggestion:
24
+ this.consumedBy === 'toArray'
25
+ ? 'If you need to iterate multiple times, store the results from toArray() in a variable and reuse that.'
26
+ : 'If you need to iterate multiple times, use toArray() to collect all results first.',
27
+ },
28
+ );
29
+ }
30
+ this.consumed = true;
31
+ this.consumedBy = 'iterator';
32
+ return this.generator;
33
+ }
34
+
35
+ /**
36
+ * Collects all values from the async iterator into an array.
37
+ * Once called, the iterator is consumed and cannot be reused.
38
+ */
39
+ async toArray(): Promise<Row[]> {
40
+ if (this.consumed) {
41
+ throw runtimeError(
42
+ 'RUNTIME.ITERATOR_CONSUMED',
43
+ `AsyncIterableResult iterator has already been consumed via ${this.consumedBy === 'toArray' ? 'toArray()' : 'for-await loop'}. Each AsyncIterableResult can only be iterated once.`,
44
+ {
45
+ consumedBy: this.consumedBy,
46
+ suggestion:
47
+ this.consumedBy === 'toArray'
48
+ ? 'You cannot call toArray() twice on the same AsyncIterableResult. Store the result from the first call in a variable and reuse that.'
49
+ : 'The iterator was already consumed by a for-await loop. Use toArray() to collect all results before iterating.',
50
+ },
51
+ );
52
+ }
53
+ this.consumed = true;
54
+ this.consumedBy = 'toArray';
55
+ const out: Row[] = [];
56
+ for await (const item of this.generator) {
57
+ out.push(item);
58
+ }
59
+ return out;
60
+ }
61
+ }
package/src/errors.ts ADDED
@@ -0,0 +1,39 @@
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
+
8
+ export function runtimeError(
9
+ code: string,
10
+ message: string,
11
+ details?: Record<string, unknown>,
12
+ ): RuntimeErrorEnvelope {
13
+ const error = new Error(message) as RuntimeErrorEnvelope;
14
+ Object.defineProperty(error, 'name', {
15
+ value: 'RuntimeError',
16
+ configurable: true,
17
+ });
18
+
19
+ return Object.assign(error, {
20
+ code,
21
+ category: resolveCategory(code),
22
+ severity: 'error' as const,
23
+ message,
24
+ details,
25
+ });
26
+ }
27
+
28
+ function resolveCategory(code: string): RuntimeErrorEnvelope['category'] {
29
+ const prefix = code.split('.')[0] ?? 'RUNTIME';
30
+ switch (prefix) {
31
+ case 'PLAN':
32
+ case 'CONTRACT':
33
+ case 'LINT':
34
+ case 'BUDGET':
35
+ return prefix;
36
+ default:
37
+ return 'RUNTIME';
38
+ }
39
+ }
@@ -0,0 +1,28 @@
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 {
14
+ AfterExecuteResult,
15
+ Log,
16
+ Plugin,
17
+ PluginContext,
18
+ Severity,
19
+ } from '../plugins/types';
20
+ export type {
21
+ RuntimeCore,
22
+ RuntimeCoreOptions,
23
+ RuntimeTelemetryEvent,
24
+ RuntimeVerifyOptions,
25
+ TelemetryOutcome,
26
+ } from '../runtime-core';
27
+ export { createRuntimeCore } from '../runtime-core';
28
+ export type { MarkerReader, MarkerStatement, RuntimeFamilyAdapter } from '../runtime-spi';
@@ -0,0 +1,14 @@
1
+ import { createHash } from 'node:crypto';
2
+
3
+ const STRING_LITERAL_REGEX = /'(?:''|[^'])*'/g;
4
+ const NUMERIC_LITERAL_REGEX = /\b\d+(?:\.\d+)?\b/g;
5
+ const WHITESPACE_REGEX = /\s+/g;
6
+
7
+ export function computeSqlFingerprint(sql: string): string {
8
+ const withoutStrings = sql.replace(STRING_LITERAL_REGEX, '?');
9
+ const withoutNumbers = withoutStrings.replace(NUMERIC_LITERAL_REGEX, '?');
10
+ const normalized = withoutNumbers.replace(WHITESPACE_REGEX, ' ').trim().toLowerCase();
11
+
12
+ const hash = createHash('sha256').update(normalized).digest('hex');
13
+ return `sha256:${hash}`;
14
+ }