@prisma-next/runtime-executor 0.3.0-pr.99.6 → 0.4.0-dev.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +2 -3
- package/dist/index.d.mts +118 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +309 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +19 -11
- package/src/exports/index.ts +8 -11
- package/src/marker.ts +1 -4
- package/src/middleware/types.ts +29 -0
- package/src/runtime-core.ts +145 -77
- package/dist/async-iterable-result.d.ts +0 -17
- package/dist/async-iterable-result.d.ts.map +0 -1
- package/dist/errors.d.ts +0 -8
- package/dist/errors.d.ts.map +0 -1
- package/dist/exports/index.d.ts +0 -17
- package/dist/exports/index.d.ts.map +0 -1
- package/dist/fingerprint.d.ts +0 -2
- package/dist/fingerprint.d.ts.map +0 -1
- package/dist/guardrails/raw.d.ts +0 -28
- package/dist/guardrails/raw.d.ts.map +0 -1
- package/dist/index.d.ts +0 -2
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -746
- package/dist/index.js.map +0 -1
- package/dist/marker.d.ts +0 -13
- package/dist/marker.d.ts.map +0 -1
- package/dist/plugins/budgets.d.ts +0 -16
- package/dist/plugins/budgets.d.ts.map +0 -1
- package/dist/plugins/lints.d.ts +0 -11
- package/dist/plugins/lints.d.ts.map +0 -1
- package/dist/plugins/types.d.ts +0 -27
- package/dist/plugins/types.d.ts.map +0 -1
- package/dist/runtime-core.d.ts +0 -37
- package/dist/runtime-core.d.ts.map +0 -1
- package/dist/runtime-spi.d.ts +0 -14
- package/dist/runtime-spi.d.ts.map +0 -1
- package/src/async-iterable-result.ts +0 -61
- package/src/errors.ts +0 -39
- package/src/plugins/budgets.ts +0 -328
- package/src/plugins/lints.ts +0 -85
- package/src/plugins/types.ts +0 -42
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["lints: LintFinding[]","budgets: BudgetFinding[]","parsed: unknown","runtimeError","#executeWith","latencyMs","AsyncIterableResult"],"sources":["../src/fingerprint.ts","../src/guardrails/raw.ts","../src/marker.ts","../src/runtime-core.ts"],"sourcesContent":["import { createHash } from 'node:crypto';\n\nconst STRING_LITERAL_REGEX = /'(?:''|[^'])*'/g;\nconst NUMERIC_LITERAL_REGEX = /\\b\\d+(?:\\.\\d+)?\\b/g;\nconst WHITESPACE_REGEX = /\\s+/g;\n\nexport function computeSqlFingerprint(sql: string): string {\n const withoutStrings = sql.replace(STRING_LITERAL_REGEX, '?');\n const withoutNumbers = withoutStrings.replace(NUMERIC_LITERAL_REGEX, '?');\n const normalized = withoutNumbers.replace(WHITESPACE_REGEX, ' ').trim().toLowerCase();\n\n const hash = createHash('sha256').update(normalized).digest('hex');\n return `sha256:${hash}`;\n}\n","import type { ExecutionPlan, PlanMeta, PlanRefs } from '@prisma-next/contract/types';\n\nexport type LintSeverity = 'error' | 'warn';\nexport type BudgetSeverity = 'error' | 'warn';\n\nexport interface LintFinding {\n readonly code: `LINT.${string}`;\n readonly severity: LintSeverity;\n readonly message: string;\n readonly details?: Record<string, unknown>;\n}\n\nexport interface BudgetFinding {\n readonly code: `BUDGET.${string}`;\n readonly severity: BudgetSeverity;\n readonly message: string;\n readonly details?: Record<string, unknown>;\n}\n\nexport interface RawGuardrailConfig {\n readonly budgets?: {\n readonly unboundedSelectSeverity?: BudgetSeverity;\n readonly estimatedRows?: number;\n };\n}\n\nexport interface RawGuardrailResult {\n readonly lints: LintFinding[];\n readonly budgets: BudgetFinding[];\n readonly statement: 'select' | 'mutation' | 'other';\n}\n\nconst SELECT_STAR_REGEX = /select\\s+\\*/i;\nconst LIMIT_REGEX = /\\blimit\\b/i;\nconst MUTATION_PREFIX_REGEX = /^(insert|update|delete|create|alter|drop|truncate)\\b/i;\n\nconst READ_ONLY_INTENTS = new Set(['read', 'report', 'readonly']);\n\nexport function evaluateRawGuardrails(\n plan: ExecutionPlan,\n config?: RawGuardrailConfig,\n): RawGuardrailResult {\n const lints: LintFinding[] = [];\n const budgets: BudgetFinding[] = [];\n\n const normalized = normalizeWhitespace(plan.sql);\n const statementType = classifyStatement(normalized);\n\n if (statementType === 'select') {\n if (SELECT_STAR_REGEX.test(normalized)) {\n lints.push(\n createLint('LINT.SELECT_STAR', 'error', 'Raw SQL plan selects all columns via *', {\n sql: snippet(plan.sql),\n }),\n );\n }\n\n if (!LIMIT_REGEX.test(normalized)) {\n const severity = config?.budgets?.unboundedSelectSeverity ?? 'error';\n lints.push(\n createLint('LINT.NO_LIMIT', 'warn', 'Raw SQL plan omits LIMIT clause', {\n sql: snippet(plan.sql),\n }),\n );\n\n budgets.push(\n createBudget(\n 'BUDGET.ROWS_EXCEEDED',\n severity,\n 'Raw SQL plan is unbounded and may exceed row budget',\n {\n sql: snippet(plan.sql),\n ...(config?.budgets?.estimatedRows !== undefined\n ? { estimatedRows: config.budgets.estimatedRows }\n : {}),\n },\n ),\n );\n }\n }\n\n if (isMutationStatement(statementType) && isReadOnlyIntent(plan.meta)) {\n lints.push(\n createLint(\n 'LINT.READ_ONLY_MUTATION',\n 'error',\n 'Raw SQL plan mutates data despite read-only intent',\n {\n sql: snippet(plan.sql),\n intent: plan.meta.annotations?.['intent'],\n },\n ),\n );\n }\n\n const refs = plan.meta.refs;\n if (refs) {\n evaluateIndexCoverage(refs, lints);\n }\n\n return { lints, budgets, statement: statementType };\n}\n\nfunction evaluateIndexCoverage(refs: PlanRefs, lints: LintFinding[]) {\n const predicateColumns = refs.columns ?? [];\n if (predicateColumns.length === 0) {\n return;\n }\n\n const indexes = refs.indexes ?? [];\n\n if (indexes.length === 0) {\n lints.push(\n createLint(\n 'LINT.UNINDEXED_PREDICATE',\n 'warn',\n 'Raw SQL plan predicates lack supporting indexes',\n {\n predicates: predicateColumns,\n },\n ),\n );\n return;\n }\n\n const hasSupportingIndex = predicateColumns.every((column) =>\n indexes.some(\n (index) =>\n index.table === column.table &&\n index.columns.some((col) => col.toLowerCase() === column.column.toLowerCase()),\n ),\n );\n\n if (!hasSupportingIndex) {\n lints.push(\n createLint(\n 'LINT.UNINDEXED_PREDICATE',\n 'warn',\n 'Raw SQL plan predicates lack supporting indexes',\n {\n predicates: predicateColumns,\n },\n ),\n );\n }\n}\n\nfunction classifyStatement(sql: string): 'select' | 'mutation' | 'other' {\n const trimmed = sql.trim();\n const lower = trimmed.toLowerCase();\n\n if (lower.startsWith('with')) {\n if (lower.includes('select')) {\n return 'select';\n }\n }\n\n if (lower.startsWith('select')) {\n return 'select';\n }\n\n if (MUTATION_PREFIX_REGEX.test(trimmed)) {\n return 'mutation';\n }\n\n return 'other';\n}\n\nfunction isMutationStatement(statement: 'select' | 'mutation' | 'other'): boolean {\n return statement === 'mutation';\n}\n\nfunction isReadOnlyIntent(meta: PlanMeta): boolean {\n const annotations = meta.annotations as { intent?: string } | undefined;\n const intent =\n typeof annotations?.intent === 'string' ? annotations.intent.toLowerCase() : undefined;\n return intent !== undefined && READ_ONLY_INTENTS.has(intent);\n}\n\nfunction normalizeWhitespace(value: string): string {\n return value.replace(/\\s+/g, ' ').trim();\n}\n\nfunction snippet(sql: string): string {\n return normalizeWhitespace(sql).slice(0, 200);\n}\n\nfunction createLint(\n code: LintFinding['code'],\n severity: LintFinding['severity'],\n message: string,\n details?: Record<string, unknown>,\n): LintFinding {\n return { code, severity, message, ...(details ? { details } : {}) };\n}\n\nfunction createBudget(\n code: BudgetFinding['code'],\n severity: BudgetFinding['severity'],\n message: string,\n details?: Record<string, unknown>,\n): BudgetFinding {\n return { code, severity, message, ...(details ? { details } : {}) };\n}\n","import type { ContractMarkerRecord } from '@prisma-next/contract/types';\nimport { type } from 'arktype';\n\nexport interface ContractMarkerRow {\n core_hash: string;\n profile_hash: string;\n contract_json: unknown | null;\n canonical_version: number | null;\n updated_at: Date;\n app_tag: string | null;\n meta: unknown | null;\n}\n\nconst MetaSchema = type({ '[string]': 'unknown' });\n\nfunction parseMeta(meta: unknown): Record<string, unknown> {\n if (meta === null || meta === undefined) {\n return {};\n }\n\n let parsed: unknown;\n if (typeof meta === 'string') {\n try {\n parsed = JSON.parse(meta);\n } catch {\n return {};\n }\n } else {\n parsed = meta;\n }\n\n const result = MetaSchema(parsed);\n if (result instanceof type.errors) {\n return {};\n }\n\n return result as Record<string, unknown>;\n}\n\nconst ContractMarkerRowSchema = type({\n core_hash: 'string',\n profile_hash: 'string',\n 'contract_json?': 'unknown | null',\n 'canonical_version?': 'number | null',\n 'updated_at?': 'Date | string',\n 'app_tag?': 'string | null',\n 'meta?': 'unknown | null',\n});\n\nexport function parseContractMarkerRow(row: unknown): ContractMarkerRecord {\n const result = ContractMarkerRowSchema(row);\n if (result instanceof type.errors) {\n const messages = result.map((p: { message: string }) => p.message).join('; ');\n throw new Error(`Invalid contract marker row: ${messages}`);\n }\n\n const validatedRow = result as {\n core_hash: string;\n profile_hash: string;\n contract_json?: unknown | null;\n canonical_version?: number | null;\n updated_at?: Date | string;\n app_tag?: string | null;\n meta?: unknown | null;\n };\n\n const updatedAt = validatedRow.updated_at\n ? validatedRow.updated_at instanceof Date\n ? validatedRow.updated_at\n : new Date(validatedRow.updated_at)\n : new Date();\n\n return {\n storageHash: validatedRow.core_hash,\n profileHash: validatedRow.profile_hash,\n contractJson: validatedRow.contract_json ?? null,\n canonicalVersion: validatedRow.canonical_version ?? null,\n updatedAt,\n appTag: validatedRow.app_tag ?? null,\n meta: parseMeta(validatedRow.meta),\n };\n}\n","import type { ExecutionPlan } from '@prisma-next/contract/types';\nimport type { RuntimeExecutor } from '@prisma-next/framework-components/runtime';\nimport { AsyncIterableResult, runtimeError } from '@prisma-next/framework-components/runtime';\nimport { computeSqlFingerprint } from './fingerprint';\nimport { parseContractMarkerRow } from './marker';\nimport type { Log, Middleware, MiddlewareContext } from './middleware/types';\nimport type { RuntimeFamilyAdapter } from './runtime-spi';\n\nexport interface RuntimeVerifyOptions {\n readonly mode: 'onFirstUse' | 'startup' | 'always';\n readonly requireMarker: boolean;\n}\n\nexport type TelemetryOutcome = 'success' | 'runtime-error';\n\nexport interface RuntimeTelemetryEvent {\n readonly lane: string;\n readonly target: string;\n readonly fingerprint: string;\n readonly outcome: TelemetryOutcome;\n readonly durationMs?: number;\n}\n\nexport interface RuntimeCoreOptions<TContract = unknown, TDriver = unknown> {\n readonly familyAdapter: RuntimeFamilyAdapter<TContract>;\n readonly driver: TDriver;\n readonly verify: RuntimeVerifyOptions;\n readonly middleware?: readonly Middleware<TContract>[];\n readonly mode?: 'strict' | 'permissive';\n readonly log?: Log;\n}\n\nexport interface RuntimeCore<TContract = unknown, TDriver = unknown>\n extends RuntimeQueryable,\n RuntimeExecutor<ExecutionPlan> {\n readonly _typeContract?: TContract;\n readonly _typeDriver?: TDriver;\n connection(): Promise<RuntimeConnection>;\n telemetry(): RuntimeTelemetryEvent | null;\n close(): Promise<void>;\n}\n\nexport interface RuntimeConnection extends RuntimeQueryable {\n transaction(): Promise<RuntimeTransaction>;\n release(): Promise<void>;\n}\n\nexport interface RuntimeTransaction extends RuntimeQueryable {\n commit(): Promise<void>;\n rollback(): Promise<void>;\n}\n\n/**\n * Shared query execution trait for anything that can run an ExecutionPlan:\n * RuntimeCore, RuntimeConnection, and RuntimeTransaction. This is a\n * SQL-domain internal mixin — it is NOT the cross-family SPI.\n *\n * For the cross-family SPI, see RuntimeExecutor in framework-components.\n * RuntimeCore nominally extends both this interface and RuntimeExecutor.\n *\n * The execute signature uses the same `_row` phantom intersection as\n * RuntimeExecutor so that RuntimeCore can extend both without conflicts.\n */\nexport interface RuntimeQueryable {\n execute<Row>(plan: ExecutionPlan & { readonly _row?: Row }): AsyncIterableResult<Row>;\n}\n\ninterface DriverWithQuery<_TDriver> {\n query(sql: string, params: readonly unknown[]): Promise<{ rows: ReadonlyArray<unknown> }>;\n}\n\ninterface DriverWithConnection<_TDriver> {\n acquireConnection(): Promise<DriverConnection>;\n}\n\nexport interface DriverConnection extends Queryable {\n beginTransaction(): Promise<DriverTransaction>;\n release(): Promise<void>;\n}\n\nexport interface DriverTransaction extends Queryable {\n commit(): Promise<void>;\n rollback(): Promise<void>;\n}\n\nexport interface Queryable {\n execute<Row = Record<string, unknown>>(options: {\n sql: string;\n params: readonly unknown[];\n }): AsyncIterable<Row>;\n}\n\ninterface DriverWithClose<_TDriver> {\n close(): Promise<void>;\n}\n\nclass RuntimeCoreImpl<TContract = unknown, TDriver = unknown>\n implements RuntimeCore<TContract, TDriver>\n{\n readonly _typeContract?: TContract;\n readonly _typeDriver?: TDriver;\n private readonly contract: TContract;\n private readonly familyAdapter: RuntimeFamilyAdapter<TContract>;\n private readonly driver: TDriver;\n private readonly middleware: readonly Middleware<TContract>[];\n private readonly mode: 'strict' | 'permissive';\n private readonly verify: RuntimeVerifyOptions;\n private readonly middlewareContext: MiddlewareContext<TContract>;\n\n private verified: boolean;\n private startupVerified: boolean;\n private _telemetry: RuntimeTelemetryEvent | null;\n\n constructor(options: RuntimeCoreOptions<TContract, TDriver>) {\n const { familyAdapter, driver } = options;\n this.contract = familyAdapter.contract;\n this.familyAdapter = familyAdapter;\n this.driver = driver;\n this.middleware = options.middleware ?? [];\n this.mode = options.mode ?? 'strict';\n this.verify = options.verify;\n this.verified = options.verify.mode === 'startup' ? false : options.verify.mode === 'always';\n this.startupVerified = false;\n this._telemetry = null;\n\n this.middlewareContext = {\n contract: this.contract,\n mode: this.mode,\n now: () => Date.now(),\n log: options.log ?? {\n info: () => {},\n warn: () => {},\n error: () => {},\n },\n };\n }\n\n private async verifyPlanIfNeeded(_plan: ExecutionPlan): Promise<void> {\n void _plan;\n if (this.verify.mode === 'always') {\n this.verified = false;\n }\n\n if (this.verified) {\n return;\n }\n\n const readStatement = this.familyAdapter.markerReader.readMarkerStatement();\n const driver = this.driver as unknown as DriverWithQuery<TDriver>;\n const result = await driver.query(readStatement.sql, readStatement.params);\n\n if (result.rows.length === 0) {\n if (this.verify.requireMarker) {\n throw runtimeError('CONTRACT.MARKER_MISSING', 'Contract marker not found in database');\n }\n\n this.verified = true;\n return;\n }\n\n const marker = parseContractMarkerRow(result.rows[0]);\n\n const contract = this.contract as {\n storage: { storageHash: string };\n execution?: { executionHash?: string | null };\n profileHash?: string | null;\n };\n if (marker.storageHash !== contract.storage.storageHash) {\n throw runtimeError(\n 'CONTRACT.MARKER_MISMATCH',\n 'Database storage hash does not match contract',\n {\n expected: contract.storage.storageHash,\n actual: marker.storageHash,\n },\n );\n }\n\n const expectedProfile = contract.profileHash ?? null;\n if (expectedProfile !== null && marker.profileHash !== expectedProfile) {\n throw runtimeError(\n 'CONTRACT.MARKER_MISMATCH',\n 'Database profile hash does not match contract',\n {\n expectedProfile,\n actualProfile: marker.profileHash,\n },\n );\n }\n\n this.verified = true;\n this.startupVerified = true;\n }\n\n private validatePlan(plan: ExecutionPlan): void {\n this.familyAdapter.validatePlan(plan, this.contract);\n }\n\n private recordTelemetry(\n plan: ExecutionPlan,\n outcome: TelemetryOutcome,\n durationMs?: number,\n ): void {\n const contract = this.contract as { target: string };\n this._telemetry = Object.freeze({\n lane: plan.meta.lane,\n target: contract.target,\n fingerprint: computeSqlFingerprint(plan.sql),\n outcome,\n ...(durationMs !== undefined ? { durationMs } : {}),\n });\n }\n\n execute<Row = Record<string, unknown>>(plan: ExecutionPlan<Row>): AsyncIterableResult<Row> {\n return this.#executeWith(plan, this.driver as Queryable);\n }\n\n async connection(): Promise<RuntimeConnection> {\n const driver = this.driver as unknown as DriverWithConnection<TDriver>;\n const driverConn = await driver.acquireConnection();\n const self = this;\n\n const runtimeConnection: RuntimeConnection = {\n async transaction(): Promise<RuntimeTransaction> {\n const driverTx = await driverConn.beginTransaction();\n const runtimeTx: RuntimeTransaction = {\n async commit(): Promise<void> {\n await driverTx.commit();\n },\n async rollback(): Promise<void> {\n await driverTx.rollback();\n },\n execute<Row = Record<string, unknown>>(\n plan: ExecutionPlan<Row>,\n ): AsyncIterableResult<Row> {\n return self.#executeWith(plan, driverTx);\n },\n };\n return runtimeTx;\n },\n execute<Row = Record<string, unknown>>(plan: ExecutionPlan<Row>): AsyncIterableResult<Row> {\n return self.#executeWith(plan, driverConn);\n },\n async release(): Promise<void> {\n await driverConn.release();\n },\n };\n\n return runtimeConnection;\n }\n\n telemetry(): RuntimeTelemetryEvent | null {\n return this._telemetry;\n }\n\n close(): Promise<void> {\n const driver = this.driver as unknown as DriverWithClose<TDriver>;\n if (typeof driver.close === 'function') {\n return driver.close();\n }\n return Promise.resolve();\n }\n\n #executeWith<Row = Record<string, unknown>>(\n plan: ExecutionPlan<Row>,\n queryable: Queryable,\n ): AsyncIterableResult<Row> {\n this.validatePlan(plan);\n this._telemetry = null;\n\n const iterator = async function* (\n self: RuntimeCoreImpl<TContract, TDriver>,\n ): AsyncGenerator<Row, void, unknown> {\n const startedAt = Date.now();\n let rowCount = 0;\n let completed = false;\n\n if (!self.startupVerified && self.verify.mode === 'startup') {\n await self.verifyPlanIfNeeded(plan);\n }\n\n if (self.verify.mode === 'onFirstUse') {\n await self.verifyPlanIfNeeded(plan);\n }\n\n try {\n if (self.verify.mode === 'always') {\n await self.verifyPlanIfNeeded(plan);\n }\n\n for (const mw of self.middleware) {\n if (mw.beforeExecute) {\n await mw.beforeExecute(plan, self.middlewareContext);\n }\n }\n\n const encodedParams = plan.params;\n\n for await (const row of queryable.execute<Record<string, unknown>>({\n sql: plan.sql,\n params: encodedParams,\n })) {\n for (const mw of self.middleware) {\n if (mw.onRow) {\n await mw.onRow(row, plan, self.middlewareContext);\n }\n }\n rowCount++;\n yield row as Row;\n }\n\n completed = true;\n self.recordTelemetry(plan, 'success', Date.now() - startedAt);\n } catch (error) {\n if (self._telemetry === null) {\n self.recordTelemetry(plan, 'runtime-error', Date.now() - startedAt);\n }\n\n const latencyMs = Date.now() - startedAt;\n for (const mw of self.middleware) {\n if (mw.afterExecute) {\n try {\n await mw.afterExecute(\n plan,\n { rowCount, latencyMs, completed },\n self.middlewareContext,\n );\n } catch {\n // Ignore errors from afterExecute hooks\n }\n }\n }\n\n throw error;\n }\n\n const latencyMs = Date.now() - startedAt;\n for (const mw of self.middleware) {\n if (mw.afterExecute) {\n await mw.afterExecute(plan, { rowCount, latencyMs, completed }, self.middlewareContext);\n }\n }\n };\n\n return new AsyncIterableResult(iterator(this));\n }\n}\n\nexport function createRuntimeCore<TContract = unknown, TDriver = unknown>(\n options: RuntimeCoreOptions<TContract, TDriver>,\n): RuntimeCore<TContract, TDriver> {\n return new RuntimeCoreImpl(options);\n}\n"],"mappings":";;;;;AAEA,MAAM,uBAAuB;AAC7B,MAAM,wBAAwB;AAC9B,MAAM,mBAAmB;AAEzB,SAAgB,sBAAsB,KAAqB;CAGzD,MAAM,aAFiB,IAAI,QAAQ,sBAAsB,IAAI,CACvB,QAAQ,uBAAuB,IAAI,CACvC,QAAQ,kBAAkB,IAAI,CAAC,MAAM,CAAC,aAAa;AAGrF,QAAO,UADM,WAAW,SAAS,CAAC,OAAO,WAAW,CAAC,OAAO,MAAM;;;;;ACqBpE,MAAM,oBAAoB;AAC1B,MAAM,cAAc;AACpB,MAAM,wBAAwB;AAE9B,MAAM,oBAAoB,IAAI,IAAI;CAAC;CAAQ;CAAU;CAAW,CAAC;AAEjE,SAAgB,sBACd,MACA,QACoB;CACpB,MAAMA,QAAuB,EAAE;CAC/B,MAAMC,UAA2B,EAAE;CAEnC,MAAM,aAAa,oBAAoB,KAAK,IAAI;CAChD,MAAM,gBAAgB,kBAAkB,WAAW;AAEnD,KAAI,kBAAkB,UAAU;AAC9B,MAAI,kBAAkB,KAAK,WAAW,CACpC,OAAM,KACJ,WAAW,oBAAoB,SAAS,0CAA0C,EAChF,KAAK,QAAQ,KAAK,IAAI,EACvB,CAAC,CACH;AAGH,MAAI,CAAC,YAAY,KAAK,WAAW,EAAE;GACjC,MAAM,WAAW,QAAQ,SAAS,2BAA2B;AAC7D,SAAM,KACJ,WAAW,iBAAiB,QAAQ,mCAAmC,EACrE,KAAK,QAAQ,KAAK,IAAI,EACvB,CAAC,CACH;AAED,WAAQ,KACN,aACE,wBACA,UACA,uDACA;IACE,KAAK,QAAQ,KAAK,IAAI;IACtB,GAAI,QAAQ,SAAS,kBAAkB,SACnC,EAAE,eAAe,OAAO,QAAQ,eAAe,GAC/C,EAAE;IACP,CACF,CACF;;;AAIL,KAAI,oBAAoB,cAAc,IAAI,iBAAiB,KAAK,KAAK,CACnE,OAAM,KACJ,WACE,2BACA,SACA,sDACA;EACE,KAAK,QAAQ,KAAK,IAAI;EACtB,QAAQ,KAAK,KAAK,cAAc;EACjC,CACF,CACF;CAGH,MAAM,OAAO,KAAK,KAAK;AACvB,KAAI,KACF,uBAAsB,MAAM,MAAM;AAGpC,QAAO;EAAE;EAAO;EAAS,WAAW;EAAe;;AAGrD,SAAS,sBAAsB,MAAgB,OAAsB;CACnE,MAAM,mBAAmB,KAAK,WAAW,EAAE;AAC3C,KAAI,iBAAiB,WAAW,EAC9B;CAGF,MAAM,UAAU,KAAK,WAAW,EAAE;AAElC,KAAI,QAAQ,WAAW,GAAG;AACxB,QAAM,KACJ,WACE,4BACA,QACA,mDACA,EACE,YAAY,kBACb,CACF,CACF;AACD;;AAWF,KAAI,CARuB,iBAAiB,OAAO,WACjD,QAAQ,MACL,UACC,MAAM,UAAU,OAAO,SACvB,MAAM,QAAQ,MAAM,QAAQ,IAAI,aAAa,KAAK,OAAO,OAAO,aAAa,CAAC,CACjF,CACF,CAGC,OAAM,KACJ,WACE,4BACA,QACA,mDACA,EACE,YAAY,kBACb,CACF,CACF;;AAIL,SAAS,kBAAkB,KAA8C;CACvE,MAAM,UAAU,IAAI,MAAM;CAC1B,MAAM,QAAQ,QAAQ,aAAa;AAEnC,KAAI,MAAM,WAAW,OAAO,EAC1B;MAAI,MAAM,SAAS,SAAS,CAC1B,QAAO;;AAIX,KAAI,MAAM,WAAW,SAAS,CAC5B,QAAO;AAGT,KAAI,sBAAsB,KAAK,QAAQ,CACrC,QAAO;AAGT,QAAO;;AAGT,SAAS,oBAAoB,WAAqD;AAChF,QAAO,cAAc;;AAGvB,SAAS,iBAAiB,MAAyB;CACjD,MAAM,cAAc,KAAK;CACzB,MAAM,SACJ,OAAO,aAAa,WAAW,WAAW,YAAY,OAAO,aAAa,GAAG;AAC/E,QAAO,WAAW,UAAa,kBAAkB,IAAI,OAAO;;AAG9D,SAAS,oBAAoB,OAAuB;AAClD,QAAO,MAAM,QAAQ,QAAQ,IAAI,CAAC,MAAM;;AAG1C,SAAS,QAAQ,KAAqB;AACpC,QAAO,oBAAoB,IAAI,CAAC,MAAM,GAAG,IAAI;;AAG/C,SAAS,WACP,MACA,UACA,SACA,SACa;AACb,QAAO;EAAE;EAAM;EAAU;EAAS,GAAI,UAAU,EAAE,SAAS,GAAG,EAAE;EAAG;;AAGrE,SAAS,aACP,MACA,UACA,SACA,SACe;AACf,QAAO;EAAE;EAAM;EAAU;EAAS,GAAI,UAAU,EAAE,SAAS,GAAG,EAAE;EAAG;;;;;AC7LrE,MAAM,aAAa,KAAK,EAAE,YAAY,WAAW,CAAC;AAElD,SAAS,UAAU,MAAwC;AACzD,KAAI,SAAS,QAAQ,SAAS,OAC5B,QAAO,EAAE;CAGX,IAAIC;AACJ,KAAI,OAAO,SAAS,SAClB,KAAI;AACF,WAAS,KAAK,MAAM,KAAK;SACnB;AACN,SAAO,EAAE;;KAGX,UAAS;CAGX,MAAM,SAAS,WAAW,OAAO;AACjC,KAAI,kBAAkB,KAAK,OACzB,QAAO,EAAE;AAGX,QAAO;;AAGT,MAAM,0BAA0B,KAAK;CACnC,WAAW;CACX,cAAc;CACd,kBAAkB;CAClB,sBAAsB;CACtB,eAAe;CACf,YAAY;CACZ,SAAS;CACV,CAAC;AAEF,SAAgB,uBAAuB,KAAoC;CACzE,MAAM,SAAS,wBAAwB,IAAI;AAC3C,KAAI,kBAAkB,KAAK,QAAQ;EACjC,MAAM,WAAW,OAAO,KAAK,MAA2B,EAAE,QAAQ,CAAC,KAAK,KAAK;AAC7E,QAAM,IAAI,MAAM,gCAAgC,WAAW;;CAG7D,MAAM,eAAe;CAUrB,MAAM,YAAY,aAAa,aAC3B,aAAa,sBAAsB,OACjC,aAAa,aACb,IAAI,KAAK,aAAa,WAAW,mBACnC,IAAI,MAAM;AAEd,QAAO;EACL,aAAa,aAAa;EAC1B,aAAa,aAAa;EAC1B,cAAc,aAAa,iBAAiB;EAC5C,kBAAkB,aAAa,qBAAqB;EACpD;EACA,QAAQ,aAAa,WAAW;EAChC,MAAM,UAAU,aAAa,KAAK;EACnC;;;;;ACgBH,IAAM,kBAAN,MAEA;CACE,AAAS;CACT,AAAS;CACT,AAAiB;CACjB,AAAiB;CACjB,AAAiB;CACjB,AAAiB;CACjB,AAAiB;CACjB,AAAiB;CACjB,AAAiB;CAEjB,AAAQ;CACR,AAAQ;CACR,AAAQ;CAER,YAAY,SAAiD;EAC3D,MAAM,EAAE,eAAe,WAAW;AAClC,OAAK,WAAW,cAAc;AAC9B,OAAK,gBAAgB;AACrB,OAAK,SAAS;AACd,OAAK,aAAa,QAAQ,cAAc,EAAE;AAC1C,OAAK,OAAO,QAAQ,QAAQ;AAC5B,OAAK,SAAS,QAAQ;AACtB,OAAK,WAAW,QAAQ,OAAO,SAAS,YAAY,QAAQ,QAAQ,OAAO,SAAS;AACpF,OAAK,kBAAkB;AACvB,OAAK,aAAa;AAElB,OAAK,oBAAoB;GACvB,UAAU,KAAK;GACf,MAAM,KAAK;GACX,WAAW,KAAK,KAAK;GACrB,KAAK,QAAQ,OAAO;IAClB,YAAY;IACZ,YAAY;IACZ,aAAa;IACd;GACF;;CAGH,MAAc,mBAAmB,OAAqC;AAEpE,MAAI,KAAK,OAAO,SAAS,SACvB,MAAK,WAAW;AAGlB,MAAI,KAAK,SACP;EAGF,MAAM,gBAAgB,KAAK,cAAc,aAAa,qBAAqB;EAE3E,MAAM,SAAS,MADA,KAAK,OACQ,MAAM,cAAc,KAAK,cAAc,OAAO;AAE1E,MAAI,OAAO,KAAK,WAAW,GAAG;AAC5B,OAAI,KAAK,OAAO,cACd,OAAMC,eAAa,2BAA2B,wCAAwC;AAGxF,QAAK,WAAW;AAChB;;EAGF,MAAM,SAAS,uBAAuB,OAAO,KAAK,GAAG;EAErD,MAAM,WAAW,KAAK;AAKtB,MAAI,OAAO,gBAAgB,SAAS,QAAQ,YAC1C,OAAMA,eACJ,4BACA,iDACA;GACE,UAAU,SAAS,QAAQ;GAC3B,QAAQ,OAAO;GAChB,CACF;EAGH,MAAM,kBAAkB,SAAS,eAAe;AAChD,MAAI,oBAAoB,QAAQ,OAAO,gBAAgB,gBACrD,OAAMA,eACJ,4BACA,iDACA;GACE;GACA,eAAe,OAAO;GACvB,CACF;AAGH,OAAK,WAAW;AAChB,OAAK,kBAAkB;;CAGzB,AAAQ,aAAa,MAA2B;AAC9C,OAAK,cAAc,aAAa,MAAM,KAAK,SAAS;;CAGtD,AAAQ,gBACN,MACA,SACA,YACM;EACN,MAAM,WAAW,KAAK;AACtB,OAAK,aAAa,OAAO,OAAO;GAC9B,MAAM,KAAK,KAAK;GAChB,QAAQ,SAAS;GACjB,aAAa,sBAAsB,KAAK,IAAI;GAC5C;GACA,GAAI,eAAe,SAAY,EAAE,YAAY,GAAG,EAAE;GACnD,CAAC;;CAGJ,QAAuC,MAAoD;AACzF,SAAO,MAAKC,YAAa,MAAM,KAAK,OAAoB;;CAG1D,MAAM,aAAyC;EAE7C,MAAM,aAAa,MADJ,KAAK,OACY,mBAAmB;EACnD,MAAM,OAAO;AA4Bb,SA1B6C;GAC3C,MAAM,cAA2C;IAC/C,MAAM,WAAW,MAAM,WAAW,kBAAkB;AAcpD,WAbsC;KACpC,MAAM,SAAwB;AAC5B,YAAM,SAAS,QAAQ;;KAEzB,MAAM,WAA0B;AAC9B,YAAM,SAAS,UAAU;;KAE3B,QACE,MAC0B;AAC1B,aAAO,MAAKA,YAAa,MAAM,SAAS;;KAE3C;;GAGH,QAAuC,MAAoD;AACzF,WAAO,MAAKA,YAAa,MAAM,WAAW;;GAE5C,MAAM,UAAyB;AAC7B,UAAM,WAAW,SAAS;;GAE7B;;CAKH,YAA0C;AACxC,SAAO,KAAK;;CAGd,QAAuB;EACrB,MAAM,SAAS,KAAK;AACpB,MAAI,OAAO,OAAO,UAAU,WAC1B,QAAO,OAAO,OAAO;AAEvB,SAAO,QAAQ,SAAS;;CAG1B,aACE,MACA,WAC0B;AAC1B,OAAK,aAAa,KAAK;AACvB,OAAK,aAAa;EAElB,MAAM,WAAW,iBACf,MACoC;GACpC,MAAM,YAAY,KAAK,KAAK;GAC5B,IAAI,WAAW;GACf,IAAI,YAAY;AAEhB,OAAI,CAAC,KAAK,mBAAmB,KAAK,OAAO,SAAS,UAChD,OAAM,KAAK,mBAAmB,KAAK;AAGrC,OAAI,KAAK,OAAO,SAAS,aACvB,OAAM,KAAK,mBAAmB,KAAK;AAGrC,OAAI;AACF,QAAI,KAAK,OAAO,SAAS,SACvB,OAAM,KAAK,mBAAmB,KAAK;AAGrC,SAAK,MAAM,MAAM,KAAK,WACpB,KAAI,GAAG,cACL,OAAM,GAAG,cAAc,MAAM,KAAK,kBAAkB;IAIxD,MAAM,gBAAgB,KAAK;AAE3B,eAAW,MAAM,OAAO,UAAU,QAAiC;KACjE,KAAK,KAAK;KACV,QAAQ;KACT,CAAC,EAAE;AACF,UAAK,MAAM,MAAM,KAAK,WACpB,KAAI,GAAG,MACL,OAAM,GAAG,MAAM,KAAK,MAAM,KAAK,kBAAkB;AAGrD;AACA,WAAM;;AAGR,gBAAY;AACZ,SAAK,gBAAgB,MAAM,WAAW,KAAK,KAAK,GAAG,UAAU;YACtD,OAAO;AACd,QAAI,KAAK,eAAe,KACtB,MAAK,gBAAgB,MAAM,iBAAiB,KAAK,KAAK,GAAG,UAAU;IAGrE,MAAMC,cAAY,KAAK,KAAK,GAAG;AAC/B,SAAK,MAAM,MAAM,KAAK,WACpB,KAAI,GAAG,aACL,KAAI;AACF,WAAM,GAAG,aACP,MACA;MAAE;MAAU;MAAW;MAAW,EAClC,KAAK,kBACN;YACK;AAMZ,UAAM;;GAGR,MAAM,YAAY,KAAK,KAAK,GAAG;AAC/B,QAAK,MAAM,MAAM,KAAK,WACpB,KAAI,GAAG,aACL,OAAM,GAAG,aAAa,MAAM;IAAE;IAAU;IAAW;IAAW,EAAE,KAAK,kBAAkB;;AAK7F,SAAO,IAAIC,sBAAoB,SAAS,KAAK,CAAC;;;AAIlD,SAAgB,kBACd,SACiC;AACjC,QAAO,IAAI,gBAAgB,QAAQ"}
|
package/package.json
CHANGED
|
@@ -1,34 +1,42 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prisma-next/runtime-executor",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0-dev.1",
|
|
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.
|
|
10
|
-
"@prisma-next/
|
|
9
|
+
"@prisma-next/contract": "0.4.0-dev.1",
|
|
10
|
+
"@prisma-next/framework-components": "0.4.0-dev.1",
|
|
11
|
+
"@prisma-next/operations": "0.4.0-dev.1"
|
|
11
12
|
},
|
|
12
13
|
"devDependencies": {
|
|
13
14
|
"@prisma/dev": "0.19.1",
|
|
14
|
-
"
|
|
15
|
+
"tsdown": "0.18.4",
|
|
15
16
|
"typescript": "5.9.3",
|
|
16
|
-
"vitest": "4.0.
|
|
17
|
+
"vitest": "4.0.17",
|
|
18
|
+
"@prisma-next/tsconfig": "0.0.0",
|
|
17
19
|
"@prisma-next/test-utils": "0.0.1",
|
|
18
|
-
"@prisma-next/
|
|
20
|
+
"@prisma-next/tsdown": "0.0.0"
|
|
19
21
|
},
|
|
20
22
|
"files": [
|
|
21
23
|
"dist",
|
|
22
24
|
"src"
|
|
23
25
|
],
|
|
24
26
|
"exports": {
|
|
25
|
-
".":
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
27
|
+
".": "./dist/index.mjs",
|
|
28
|
+
"./package.json": "./package.json"
|
|
29
|
+
},
|
|
30
|
+
"main": "./dist/index.mjs",
|
|
31
|
+
"module": "./dist/index.mjs",
|
|
32
|
+
"types": "./dist/index.d.mts",
|
|
33
|
+
"repository": {
|
|
34
|
+
"type": "git",
|
|
35
|
+
"url": "https://github.com/prisma/prisma-next.git",
|
|
36
|
+
"directory": "packages/1-framework/4-runtime/runtime-executor"
|
|
29
37
|
},
|
|
30
38
|
"scripts": {
|
|
31
|
-
"build": "
|
|
39
|
+
"build": "tsdown",
|
|
32
40
|
"test": "vitest run",
|
|
33
41
|
"test:coverage": "vitest run --coverage",
|
|
34
42
|
"typecheck": "tsc --project tsconfig.json --noEmit",
|
package/src/exports/index.ts
CHANGED
|
@@ -1,26 +1,23 @@
|
|
|
1
|
-
export {
|
|
2
|
-
export
|
|
3
|
-
export { runtimeError } from '../errors';
|
|
1
|
+
export type { RuntimeErrorEnvelope } from '@prisma-next/framework-components/runtime';
|
|
2
|
+
export { AsyncIterableResult, runtimeError } from '@prisma-next/framework-components/runtime';
|
|
4
3
|
export { computeSqlFingerprint } from '../fingerprint';
|
|
5
4
|
export type { BudgetFinding, LintFinding, RawGuardrailResult } from '../guardrails/raw';
|
|
6
5
|
export { evaluateRawGuardrails } from '../guardrails/raw';
|
|
7
|
-
export type { ContractMarkerRecord } from '../marker';
|
|
8
6
|
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
7
|
export type {
|
|
14
8
|
AfterExecuteResult,
|
|
15
9
|
Log,
|
|
16
|
-
|
|
17
|
-
|
|
10
|
+
Middleware,
|
|
11
|
+
MiddlewareContext,
|
|
18
12
|
Severity,
|
|
19
|
-
} from '../
|
|
13
|
+
} from '../middleware/types';
|
|
20
14
|
export type {
|
|
15
|
+
RuntimeConnection,
|
|
21
16
|
RuntimeCore,
|
|
22
17
|
RuntimeCoreOptions,
|
|
18
|
+
RuntimeQueryable,
|
|
23
19
|
RuntimeTelemetryEvent,
|
|
20
|
+
RuntimeTransaction,
|
|
24
21
|
RuntimeVerifyOptions,
|
|
25
22
|
TelemetryOutcome,
|
|
26
23
|
} from '../runtime-core';
|
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
|
-
|
|
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,
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { ExecutionPlan } from '@prisma-next/contract/types';
|
|
2
|
+
import type {
|
|
3
|
+
AfterExecuteResult,
|
|
4
|
+
RuntimeLog,
|
|
5
|
+
RuntimeMiddleware,
|
|
6
|
+
RuntimeMiddlewareContext,
|
|
7
|
+
} from '@prisma-next/framework-components/runtime';
|
|
8
|
+
|
|
9
|
+
export type Severity = 'error' | 'warn' | 'info';
|
|
10
|
+
|
|
11
|
+
export type { AfterExecuteResult, RuntimeLog as Log };
|
|
12
|
+
|
|
13
|
+
export interface MiddlewareContext<TContract = unknown> extends RuntimeMiddlewareContext {
|
|
14
|
+
readonly contract: TContract;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export interface Middleware<TContract = unknown> extends RuntimeMiddleware {
|
|
18
|
+
beforeExecute?(plan: ExecutionPlan, ctx: MiddlewareContext<TContract>): Promise<void>;
|
|
19
|
+
onRow?(
|
|
20
|
+
row: Record<string, unknown>,
|
|
21
|
+
plan: ExecutionPlan,
|
|
22
|
+
ctx: MiddlewareContext<TContract>,
|
|
23
|
+
): Promise<void>;
|
|
24
|
+
afterExecute?(
|
|
25
|
+
plan: ExecutionPlan,
|
|
26
|
+
result: AfterExecuteResult,
|
|
27
|
+
ctx: MiddlewareContext<TContract>,
|
|
28
|
+
): Promise<void>;
|
|
29
|
+
}
|
package/src/runtime-core.ts
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import type { ExecutionPlan } from '@prisma-next/contract/types';
|
|
2
|
-
import type {
|
|
3
|
-
import { AsyncIterableResult } from '
|
|
4
|
-
import { runtimeError } from './errors';
|
|
2
|
+
import type { RuntimeExecutor } from '@prisma-next/framework-components/runtime';
|
|
3
|
+
import { AsyncIterableResult, runtimeError } from '@prisma-next/framework-components/runtime';
|
|
5
4
|
import { computeSqlFingerprint } from './fingerprint';
|
|
6
5
|
import { parseContractMarkerRow } from './marker';
|
|
7
|
-
import type { Log,
|
|
6
|
+
import type { Log, Middleware, MiddlewareContext } from './middleware/types';
|
|
8
7
|
import type { RuntimeFamilyAdapter } from './runtime-spi';
|
|
9
8
|
|
|
10
9
|
export interface RuntimeVerifyOptions {
|
|
@@ -22,32 +21,69 @@ export interface RuntimeTelemetryEvent {
|
|
|
22
21
|
readonly durationMs?: number;
|
|
23
22
|
}
|
|
24
23
|
|
|
25
|
-
export interface RuntimeCoreOptions<TContract = unknown,
|
|
24
|
+
export interface RuntimeCoreOptions<TContract = unknown, TDriver = unknown> {
|
|
26
25
|
readonly familyAdapter: RuntimeFamilyAdapter<TContract>;
|
|
27
26
|
readonly driver: TDriver;
|
|
28
27
|
readonly verify: RuntimeVerifyOptions;
|
|
29
|
-
readonly
|
|
28
|
+
readonly middleware?: readonly Middleware<TContract>[];
|
|
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,
|
|
36
|
-
|
|
33
|
+
export interface RuntimeCore<TContract = unknown, TDriver = unknown>
|
|
34
|
+
extends RuntimeQueryable,
|
|
35
|
+
RuntimeExecutor<ExecutionPlan> {
|
|
37
36
|
readonly _typeContract?: TContract;
|
|
38
|
-
readonly _typeAdapter?: TAdapter;
|
|
39
37
|
readonly _typeDriver?: TDriver;
|
|
40
|
-
|
|
38
|
+
connection(): Promise<RuntimeConnection>;
|
|
41
39
|
telemetry(): RuntimeTelemetryEvent | null;
|
|
42
40
|
close(): Promise<void>;
|
|
43
|
-
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export interface RuntimeConnection extends RuntimeQueryable {
|
|
44
|
+
transaction(): Promise<RuntimeTransaction>;
|
|
45
|
+
release(): Promise<void>;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export interface RuntimeTransaction extends RuntimeQueryable {
|
|
49
|
+
commit(): Promise<void>;
|
|
50
|
+
rollback(): Promise<void>;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Shared query execution trait for anything that can run an ExecutionPlan:
|
|
55
|
+
* RuntimeCore, RuntimeConnection, and RuntimeTransaction. This is a
|
|
56
|
+
* SQL-domain internal mixin — it is NOT the cross-family SPI.
|
|
57
|
+
*
|
|
58
|
+
* For the cross-family SPI, see RuntimeExecutor in framework-components.
|
|
59
|
+
* RuntimeCore nominally extends both this interface and RuntimeExecutor.
|
|
60
|
+
*
|
|
61
|
+
* The execute signature uses the same `_row` phantom intersection as
|
|
62
|
+
* RuntimeExecutor so that RuntimeCore can extend both without conflicts.
|
|
63
|
+
*/
|
|
64
|
+
export interface RuntimeQueryable {
|
|
65
|
+
execute<Row>(plan: ExecutionPlan & { readonly _row?: Row }): AsyncIterableResult<Row>;
|
|
44
66
|
}
|
|
45
67
|
|
|
46
68
|
interface DriverWithQuery<_TDriver> {
|
|
47
69
|
query(sql: string, params: readonly unknown[]): Promise<{ rows: ReadonlyArray<unknown> }>;
|
|
48
70
|
}
|
|
49
71
|
|
|
50
|
-
interface
|
|
72
|
+
interface DriverWithConnection<_TDriver> {
|
|
73
|
+
acquireConnection(): Promise<DriverConnection>;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export interface DriverConnection extends Queryable {
|
|
77
|
+
beginTransaction(): Promise<DriverTransaction>;
|
|
78
|
+
release(): Promise<void>;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export interface DriverTransaction extends Queryable {
|
|
82
|
+
commit(): Promise<void>;
|
|
83
|
+
rollback(): Promise<void>;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export interface Queryable {
|
|
51
87
|
execute<Row = Record<string, unknown>>(options: {
|
|
52
88
|
sql: string;
|
|
53
89
|
params: readonly unknown[];
|
|
@@ -58,55 +94,43 @@ interface DriverWithClose<_TDriver> {
|
|
|
58
94
|
close(): Promise<void>;
|
|
59
95
|
}
|
|
60
96
|
|
|
61
|
-
class RuntimeCoreImpl<TContract = unknown,
|
|
62
|
-
implements RuntimeCore<TContract,
|
|
97
|
+
class RuntimeCoreImpl<TContract = unknown, TDriver = unknown>
|
|
98
|
+
implements RuntimeCore<TContract, TDriver>
|
|
63
99
|
{
|
|
64
100
|
readonly _typeContract?: TContract;
|
|
65
|
-
readonly _typeAdapter?: TAdapter;
|
|
66
101
|
readonly _typeDriver?: TDriver;
|
|
67
102
|
private readonly contract: TContract;
|
|
68
103
|
private readonly familyAdapter: RuntimeFamilyAdapter<TContract>;
|
|
69
104
|
private readonly driver: TDriver;
|
|
70
|
-
private readonly
|
|
105
|
+
private readonly middleware: readonly Middleware<TContract>[];
|
|
71
106
|
private readonly mode: 'strict' | 'permissive';
|
|
72
107
|
private readonly verify: RuntimeVerifyOptions;
|
|
73
|
-
private readonly
|
|
74
|
-
private readonly pluginContext: PluginContext<TContract, TAdapter, TDriver>;
|
|
108
|
+
private readonly middlewareContext: MiddlewareContext<TContract>;
|
|
75
109
|
|
|
76
110
|
private verified: boolean;
|
|
77
111
|
private startupVerified: boolean;
|
|
78
112
|
private _telemetry: RuntimeTelemetryEvent | null;
|
|
79
113
|
|
|
80
|
-
constructor(options: RuntimeCoreOptions<TContract,
|
|
114
|
+
constructor(options: RuntimeCoreOptions<TContract, TDriver>) {
|
|
81
115
|
const { familyAdapter, driver } = options;
|
|
82
116
|
this.contract = familyAdapter.contract;
|
|
83
117
|
this.familyAdapter = familyAdapter;
|
|
84
118
|
this.driver = driver;
|
|
85
|
-
this.
|
|
119
|
+
this.middleware = options.middleware ?? [];
|
|
86
120
|
this.mode = options.mode ?? 'strict';
|
|
87
121
|
this.verify = options.verify;
|
|
88
|
-
this.operationRegistry = options.operationRegistry;
|
|
89
|
-
|
|
90
122
|
this.verified = options.verify.mode === 'startup' ? false : options.verify.mode === 'always';
|
|
91
123
|
this.startupVerified = false;
|
|
92
124
|
this._telemetry = null;
|
|
93
125
|
|
|
94
|
-
this.
|
|
126
|
+
this.middlewareContext = {
|
|
95
127
|
contract: this.contract,
|
|
96
|
-
adapter: options.familyAdapter as unknown as TAdapter,
|
|
97
|
-
driver: this.driver,
|
|
98
128
|
mode: this.mode,
|
|
99
129
|
now: () => Date.now(),
|
|
100
130
|
log: options.log ?? {
|
|
101
|
-
info: () => {
|
|
102
|
-
|
|
103
|
-
},
|
|
104
|
-
warn: () => {
|
|
105
|
-
// No-op in MVP - diagnostics stay out of runtime core
|
|
106
|
-
},
|
|
107
|
-
error: () => {
|
|
108
|
-
// No-op in MVP - diagnostics stay out of runtime core
|
|
109
|
-
},
|
|
131
|
+
info: () => {},
|
|
132
|
+
warn: () => {},
|
|
133
|
+
error: () => {},
|
|
110
134
|
},
|
|
111
135
|
};
|
|
112
136
|
}
|
|
@@ -136,12 +160,20 @@ class RuntimeCoreImpl<TContract = unknown, TAdapter = unknown, TDriver = unknown
|
|
|
136
160
|
|
|
137
161
|
const marker = parseContractMarkerRow(result.rows[0]);
|
|
138
162
|
|
|
139
|
-
const contract = this.contract as {
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
163
|
+
const contract = this.contract as {
|
|
164
|
+
storage: { storageHash: string };
|
|
165
|
+
execution?: { executionHash?: string | null };
|
|
166
|
+
profileHash?: string | null;
|
|
167
|
+
};
|
|
168
|
+
if (marker.storageHash !== contract.storage.storageHash) {
|
|
169
|
+
throw runtimeError(
|
|
170
|
+
'CONTRACT.MARKER_MISMATCH',
|
|
171
|
+
'Database storage hash does not match contract',
|
|
172
|
+
{
|
|
173
|
+
expected: contract.storage.storageHash,
|
|
174
|
+
actual: marker.storageHash,
|
|
175
|
+
},
|
|
176
|
+
);
|
|
145
177
|
}
|
|
146
178
|
|
|
147
179
|
const expectedProfile = contract.profileHash ?? null;
|
|
@@ -180,11 +212,64 @@ class RuntimeCoreImpl<TContract = unknown, TAdapter = unknown, TDriver = unknown
|
|
|
180
212
|
}
|
|
181
213
|
|
|
182
214
|
execute<Row = Record<string, unknown>>(plan: ExecutionPlan<Row>): AsyncIterableResult<Row> {
|
|
215
|
+
return this.#executeWith(plan, this.driver as Queryable);
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
async connection(): Promise<RuntimeConnection> {
|
|
219
|
+
const driver = this.driver as unknown as DriverWithConnection<TDriver>;
|
|
220
|
+
const driverConn = await driver.acquireConnection();
|
|
221
|
+
const self = this;
|
|
222
|
+
|
|
223
|
+
const runtimeConnection: RuntimeConnection = {
|
|
224
|
+
async transaction(): Promise<RuntimeTransaction> {
|
|
225
|
+
const driverTx = await driverConn.beginTransaction();
|
|
226
|
+
const runtimeTx: RuntimeTransaction = {
|
|
227
|
+
async commit(): Promise<void> {
|
|
228
|
+
await driverTx.commit();
|
|
229
|
+
},
|
|
230
|
+
async rollback(): Promise<void> {
|
|
231
|
+
await driverTx.rollback();
|
|
232
|
+
},
|
|
233
|
+
execute<Row = Record<string, unknown>>(
|
|
234
|
+
plan: ExecutionPlan<Row>,
|
|
235
|
+
): AsyncIterableResult<Row> {
|
|
236
|
+
return self.#executeWith(plan, driverTx);
|
|
237
|
+
},
|
|
238
|
+
};
|
|
239
|
+
return runtimeTx;
|
|
240
|
+
},
|
|
241
|
+
execute<Row = Record<string, unknown>>(plan: ExecutionPlan<Row>): AsyncIterableResult<Row> {
|
|
242
|
+
return self.#executeWith(plan, driverConn);
|
|
243
|
+
},
|
|
244
|
+
async release(): Promise<void> {
|
|
245
|
+
await driverConn.release();
|
|
246
|
+
},
|
|
247
|
+
};
|
|
248
|
+
|
|
249
|
+
return runtimeConnection;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
telemetry(): RuntimeTelemetryEvent | null {
|
|
253
|
+
return this._telemetry;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
close(): Promise<void> {
|
|
257
|
+
const driver = this.driver as unknown as DriverWithClose<TDriver>;
|
|
258
|
+
if (typeof driver.close === 'function') {
|
|
259
|
+
return driver.close();
|
|
260
|
+
}
|
|
261
|
+
return Promise.resolve();
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
#executeWith<Row = Record<string, unknown>>(
|
|
265
|
+
plan: ExecutionPlan<Row>,
|
|
266
|
+
queryable: Queryable,
|
|
267
|
+
): AsyncIterableResult<Row> {
|
|
183
268
|
this.validatePlan(plan);
|
|
184
269
|
this._telemetry = null;
|
|
185
270
|
|
|
186
271
|
const iterator = async function* (
|
|
187
|
-
self: RuntimeCoreImpl<TContract,
|
|
272
|
+
self: RuntimeCoreImpl<TContract, TDriver>,
|
|
188
273
|
): AsyncGenerator<Row, void, unknown> {
|
|
189
274
|
const startedAt = Date.now();
|
|
190
275
|
let rowCount = 0;
|
|
@@ -203,22 +288,21 @@ class RuntimeCoreImpl<TContract = unknown, TAdapter = unknown, TDriver = unknown
|
|
|
203
288
|
await self.verifyPlanIfNeeded(plan);
|
|
204
289
|
}
|
|
205
290
|
|
|
206
|
-
for (const
|
|
207
|
-
if (
|
|
208
|
-
await
|
|
291
|
+
for (const mw of self.middleware) {
|
|
292
|
+
if (mw.beforeExecute) {
|
|
293
|
+
await mw.beforeExecute(plan, self.middlewareContext);
|
|
209
294
|
}
|
|
210
295
|
}
|
|
211
296
|
|
|
212
|
-
const
|
|
213
|
-
const encodedParams = plan.params as readonly unknown[];
|
|
297
|
+
const encodedParams = plan.params;
|
|
214
298
|
|
|
215
|
-
for await (const row of
|
|
299
|
+
for await (const row of queryable.execute<Record<string, unknown>>({
|
|
216
300
|
sql: plan.sql,
|
|
217
301
|
params: encodedParams,
|
|
218
302
|
})) {
|
|
219
|
-
for (const
|
|
220
|
-
if (
|
|
221
|
-
await
|
|
303
|
+
for (const mw of self.middleware) {
|
|
304
|
+
if (mw.onRow) {
|
|
305
|
+
await mw.onRow(row, plan, self.middlewareContext);
|
|
222
306
|
}
|
|
223
307
|
}
|
|
224
308
|
rowCount++;
|
|
@@ -233,13 +317,13 @@ class RuntimeCoreImpl<TContract = unknown, TAdapter = unknown, TDriver = unknown
|
|
|
233
317
|
}
|
|
234
318
|
|
|
235
319
|
const latencyMs = Date.now() - startedAt;
|
|
236
|
-
for (const
|
|
237
|
-
if (
|
|
320
|
+
for (const mw of self.middleware) {
|
|
321
|
+
if (mw.afterExecute) {
|
|
238
322
|
try {
|
|
239
|
-
await
|
|
323
|
+
await mw.afterExecute(
|
|
240
324
|
plan,
|
|
241
325
|
{ rowCount, latencyMs, completed },
|
|
242
|
-
self.
|
|
326
|
+
self.middlewareContext,
|
|
243
327
|
);
|
|
244
328
|
} catch {
|
|
245
329
|
// Ignore errors from afterExecute hooks
|
|
@@ -251,35 +335,19 @@ class RuntimeCoreImpl<TContract = unknown, TAdapter = unknown, TDriver = unknown
|
|
|
251
335
|
}
|
|
252
336
|
|
|
253
337
|
const latencyMs = Date.now() - startedAt;
|
|
254
|
-
for (const
|
|
255
|
-
if (
|
|
256
|
-
await
|
|
338
|
+
for (const mw of self.middleware) {
|
|
339
|
+
if (mw.afterExecute) {
|
|
340
|
+
await mw.afterExecute(plan, { rowCount, latencyMs, completed }, self.middlewareContext);
|
|
257
341
|
}
|
|
258
342
|
}
|
|
259
343
|
};
|
|
260
344
|
|
|
261
345
|
return new AsyncIterableResult(iterator(this));
|
|
262
346
|
}
|
|
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
347
|
}
|
|
280
348
|
|
|
281
|
-
export function createRuntimeCore<TContract = unknown,
|
|
282
|
-
options: RuntimeCoreOptions<TContract,
|
|
283
|
-
): RuntimeCore<TContract,
|
|
349
|
+
export function createRuntimeCore<TContract = unknown, TDriver = unknown>(
|
|
350
|
+
options: RuntimeCoreOptions<TContract, TDriver>,
|
|
351
|
+
): RuntimeCore<TContract, TDriver> {
|
|
284
352
|
return new RuntimeCoreImpl(options);
|
|
285
353
|
}
|
|
@@ -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
|
package/dist/errors.d.ts.map
DELETED
|
@@ -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"}
|
package/dist/exports/index.d.ts
DELETED
|
@@ -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"}
|
package/dist/fingerprint.d.ts
DELETED
|
@@ -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"}
|
package/dist/guardrails/raw.d.ts
DELETED
|
@@ -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