@prisma-next/extension-supabase 0.14.0-dev.28 → 0.14.0-dev.29
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/dist/contract-ikg3juR7.mjs +419 -0
- package/dist/contract-ikg3juR7.mjs.map +1 -0
- package/dist/pack.mjs +1 -414
- package/dist/pack.mjs.map +1 -1
- package/dist/runtime.d.mts +639 -4
- package/dist/runtime.d.mts.map +1 -1
- package/dist/runtime.mjs +58 -12
- package/dist/runtime.mjs.map +1 -1
- package/package.json +26 -26
- package/src/exports/runtime.ts +2 -0
- package/src/runtime/ext-contract-type.ts +9 -0
- package/src/runtime/supabase.ts +103 -13
- package/dist/package-BLmWYNvr.mjs +0 -6
- package/dist/package-BLmWYNvr.mjs.map +0 -1
package/dist/runtime.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.d.mts","names":[],"sources":["../src/runtime/descriptor.ts","../src/runtime/supabase.ts","../src/runtime/supabase-runtime.ts"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"runtime.d.mts","names":["StorageHashBase","ExecutionHashBase","ProfileHashBase","PgTypes","CodecTypes","PgAdapterQueryOps","CodecId","_Encoded","auth","AuthIdentity","id","user_id","provider","created_at","updated_at","AuthUser","email","storage","StorageBucket","name","StorageObject","bucket_id","identities","users","public","buckets","objects","TypeMapsType","QueryOperationTypes","FieldOutputTypes","FieldInputTypes","StorageColumnTypes","StorageColumnInputTypes","Omit","ContractType","namespaces","kind","entries","table","columns","nativeType","codecId","nullable","typeRef","primaryKey","uniques","indexes","foreignKeys","types","Uuid","typeParams","Record","Timestamptz","storageHash","StorageHash","target","targetFamily","roots","namespace","NamespaceId","model","domain","models","fields","type","relations","namespaceId","column","capabilities","postgres","distinctOn","jsonAgg","lateral","limit","orderBy","returning","sql","defaultInInsert","enums","scalarList","extensionPacks","meta","profileHash","ProfileHash","ContractWithTypeMaps","ContractBase","TypeMaps","Contract"],"sources":["../src/runtime/descriptor.ts","../src/contract/contract.d.ts","../src/runtime/ext-contract-type.ts","../src/runtime/supabase.ts","../src/runtime/supabase-runtime.ts"],"mappings":"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"}
|
package/dist/runtime.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { n as version, t as contract_default } from "./contract-ikg3juR7.mjs";
|
|
2
2
|
import { blindCast } from "@prisma-next/utils/casts";
|
|
3
3
|
import postgresAdapter from "@prisma-next/adapter-postgres/runtime";
|
|
4
4
|
import postgresDriver from "@prisma-next/driver-postgres/runtime";
|
|
@@ -187,6 +187,16 @@ function withSupabaseDescriptor(extensions) {
|
|
|
187
187
|
const packs = extensions ?? [];
|
|
188
188
|
return packs.some((pack) => pack.id === supabaseRuntimeDescriptor.id) ? packs : [...packs, supabaseRuntimeDescriptor];
|
|
189
189
|
}
|
|
190
|
+
/**
|
|
191
|
+
* Deserializes the Supabase extension's own emitted contract into a runtime
|
|
192
|
+
* contract: namespaces hydrate into `PostgresSchema` instances (with
|
|
193
|
+
* `qualifyTable`), and `typeRef` columns (`Timestamptz`, `Uuid`) resolve
|
|
194
|
+
* through the codec registry. Exposed only via `service_role`'s `.supabase`
|
|
195
|
+
* secondary root — never merged into the app contract.
|
|
196
|
+
*/
|
|
197
|
+
function buildExtensionContract() {
|
|
198
|
+
return blindCast(contractSerializer.deserializeContract(contract_default));
|
|
199
|
+
}
|
|
190
200
|
async function supabase(options) {
|
|
191
201
|
const keyMaterial = resolveKeyMaterial(options);
|
|
192
202
|
const contract = resolveContract(options);
|
|
@@ -227,30 +237,66 @@ async function supabase(options) {
|
|
|
227
237
|
throw new InvalidJwtError(err instanceof Error ? err.message : String(err));
|
|
228
238
|
}
|
|
229
239
|
}
|
|
230
|
-
function
|
|
240
|
+
function buildRoleBoundDbWithContext(binding, roleContext, roleRuntime) {
|
|
231
241
|
return {
|
|
232
242
|
sql: sql({
|
|
233
|
-
context,
|
|
243
|
+
context: roleContext,
|
|
234
244
|
rawCodecInferer
|
|
235
245
|
}),
|
|
236
246
|
orm: orm({
|
|
237
247
|
runtime: {
|
|
238
248
|
execute(plan) {
|
|
239
|
-
return
|
|
249
|
+
return roleRuntime.executeWithRole(plan, binding);
|
|
240
250
|
},
|
|
241
|
-
connection: () =>
|
|
251
|
+
connection: () => roleRuntime.openRoleSession(binding)
|
|
242
252
|
},
|
|
243
|
-
context
|
|
253
|
+
context: roleContext
|
|
244
254
|
}),
|
|
245
255
|
raw: rawSqlTag,
|
|
246
256
|
execute(plan, execOptions) {
|
|
247
|
-
return
|
|
257
|
+
return roleRuntime.executeWithRole(plan, binding, execOptions);
|
|
248
258
|
},
|
|
249
259
|
transaction(fn) {
|
|
250
|
-
return withTransaction({ connection: () =>
|
|
260
|
+
return withTransaction({ connection: () => roleRuntime.openRoleSession(binding) }, fn);
|
|
251
261
|
}
|
|
252
262
|
};
|
|
253
263
|
}
|
|
264
|
+
function buildRoleBoundDb(binding) {
|
|
265
|
+
return buildRoleBoundDbWithContext(binding, context, runtime);
|
|
266
|
+
}
|
|
267
|
+
const serviceRoleBinding = {
|
|
268
|
+
role: "service_role",
|
|
269
|
+
claims: {}
|
|
270
|
+
};
|
|
271
|
+
const extContext = createExecutionContext({
|
|
272
|
+
contract: buildExtensionContract(),
|
|
273
|
+
stack
|
|
274
|
+
});
|
|
275
|
+
const extRuntime = new SupabaseRuntimeImpl({
|
|
276
|
+
context: extContext,
|
|
277
|
+
adapter: stackInstance.adapter,
|
|
278
|
+
driver,
|
|
279
|
+
verifyMarker: false,
|
|
280
|
+
...ifDefined("middleware", options.middleware)
|
|
281
|
+
});
|
|
282
|
+
const supabaseInternal = {
|
|
283
|
+
sql: sql({
|
|
284
|
+
context: extContext,
|
|
285
|
+
rawCodecInferer
|
|
286
|
+
}),
|
|
287
|
+
orm: orm({
|
|
288
|
+
runtime: {
|
|
289
|
+
execute(plan) {
|
|
290
|
+
return extRuntime.executeWithRole(plan, serviceRoleBinding);
|
|
291
|
+
},
|
|
292
|
+
connection: () => extRuntime.openRoleSession(serviceRoleBinding)
|
|
293
|
+
},
|
|
294
|
+
context: extContext
|
|
295
|
+
}),
|
|
296
|
+
execute(plan, execOptions) {
|
|
297
|
+
return extRuntime.executeWithRole(plan, serviceRoleBinding, execOptions);
|
|
298
|
+
}
|
|
299
|
+
};
|
|
254
300
|
async function closeDb() {
|
|
255
301
|
if (closed) return;
|
|
256
302
|
closed = true;
|
|
@@ -276,10 +322,10 @@ async function supabase(options) {
|
|
|
276
322
|
});
|
|
277
323
|
},
|
|
278
324
|
asServiceRole() {
|
|
279
|
-
return
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
}
|
|
325
|
+
return {
|
|
326
|
+
...buildRoleBoundDbWithContext(serviceRoleBinding, context, runtime),
|
|
327
|
+
supabase: supabaseInternal
|
|
328
|
+
};
|
|
283
329
|
},
|
|
284
330
|
close: closeDb,
|
|
285
331
|
[Symbol.asyncDispose]: closeDb
|
package/dist/runtime.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.mjs","names":["packageJson.version"],"sources":["../src/runtime/descriptor.ts","../src/runtime/supabase-runtime.ts","../src/runtime/supabase.ts","../src/exports/runtime.ts"],"sourcesContent":["import type { SqlRuntimeExtensionDescriptor } from '@prisma-next/sql-runtime';\nimport packageJson from '../../package.json' with { type: 'json' };\n\n/**\n * Tells the runtime that the Supabase pack's runtime component is available.\n *\n * When a contract declares the Supabase pack, the runtime checks that a\n * matching descriptor has been registered. Without this, loading a Supabase\n * contract errors with \"pack runtime component missing\". The `supabase()`\n * factory registers this descriptor automatically — app code never needs to\n * reference it directly.\n */\nexport const supabaseRuntimeDescriptor: SqlRuntimeExtensionDescriptor<'postgres'> = {\n kind: 'extension' as const,\n id: 'supabase',\n version: packageJson.version,\n familyId: 'sql' as const,\n targetId: 'postgres' as const,\n codecs: () => [],\n create() {\n return {\n familyId: 'sql' as const,\n targetId: 'postgres' as const,\n };\n },\n};\n","import type { Contract } from '@prisma-next/contract/types';\nimport type { RuntimeExecuteOptions } from '@prisma-next/framework-components/runtime';\nimport { AsyncIterableResult } from '@prisma-next/framework-components/runtime';\nimport { type PostgresRuntime, PostgresRuntimeImpl } from '@prisma-next/postgres/runtime';\nimport type { SqlStorage } from '@prisma-next/sql-contract/types';\nimport type { SqlExecutionPlan, SqlQueryPlan } from '@prisma-next/sql-relational-core/plan';\nimport type {\n PreparedStatement,\n PreparedStatementImpl,\n RuntimeConnection,\n RuntimeTransaction,\n} from '@prisma-next/sql-runtime';\nimport { blindCast } from '@prisma-next/utils/casts';\n\nexport interface SupabaseRuntime extends PostgresRuntime {}\n\nexport interface SupabaseRoleBinding {\n // TODO(TML-2501): role names move to the Supabase extension contract (roles as first-class IR) when postgres-rls lands.\n readonly role: 'anon' | 'authenticated' | 'service_role';\n readonly claims?: Record<string, unknown>;\n}\n\n/**\n * A connection with a Supabase role already bound via session-scoped set_config.\n * Implements `RuntimeConnection` so it plugs into ORM scope machinery and `withTransaction`.\n */\nexport interface RoleSession extends RuntimeConnection {}\n\nexport class SupabaseRuntimeImpl<\n TContract extends Contract<SqlStorage> = Contract<SqlStorage>,\n> extends PostgresRuntimeImpl<TContract> {\n /**\n * Opens a raw connection and applies role + JWT claims via session-scoped set_config.\n * On bind failure, destroys the connection before rethrowing — no leaked connections.\n * Not on the `SupabaseRuntime` interface; consumed by the facade, not by app code.\n */\n async openRoleSession(binding: SupabaseRoleBinding): Promise<RoleSession> {\n const conn = await this.acquireRawConnection();\n\n try {\n await conn.query('SELECT set_config($1, $2, false)', ['role', binding.role]);\n await conn.query('SELECT set_config($1, $2, false)', [\n 'request.jwt.claims',\n JSON.stringify(binding.claims ?? {}),\n ]);\n } catch (err) {\n await conn.destroy(err).catch(() => undefined);\n throw err;\n }\n\n const self = this;\n\n const session: RoleSession = {\n execute<Row>(\n plan: (SqlExecutionPlan<unknown> | SqlQueryPlan<unknown>) & { readonly _row?: Row },\n options?: RuntimeExecuteOptions,\n ): AsyncIterableResult<Row> {\n return self.executeAgainstQueryable<Row>(plan, conn, { ...options, scope: 'connection' });\n },\n\n executePrepared<Params, Row>(\n ps: PreparedStatement<Params, Row>,\n params: Params,\n options?: RuntimeExecuteOptions,\n ): AsyncIterableResult<Row> {\n return self.executePreparedAgainstQueryable(\n blindCast<\n PreparedStatementImpl<Params, Row>,\n 'PreparedStatement is PreparedStatementImpl; the impl class is the only concrete form'\n >(ps),\n blindCast<\n Record<string, unknown>,\n 'params are structurally Record<string, unknown> at runtime'\n >(params),\n conn,\n { ...options, scope: 'connection' },\n );\n },\n\n async transaction(): Promise<RuntimeTransaction> {\n const tx = await conn.beginTransaction();\n return {\n async commit(): Promise<void> {\n await tx.commit();\n },\n async rollback(): Promise<void> {\n await tx.rollback();\n },\n execute<Row>(\n plan: (SqlExecutionPlan<unknown> | SqlQueryPlan<unknown>) & { readonly _row?: Row },\n options?: RuntimeExecuteOptions,\n ): AsyncIterableResult<Row> {\n return self.executeAgainstQueryable<Row>(plan, tx, {\n ...options,\n scope: 'transaction',\n });\n },\n executePrepared<Params, Row>(\n ps: PreparedStatement<Params, Row>,\n params: Params,\n options?: RuntimeExecuteOptions,\n ): AsyncIterableResult<Row> {\n return self.executePreparedAgainstQueryable(\n blindCast<\n PreparedStatementImpl<Params, Row>,\n 'PreparedStatement is PreparedStatementImpl; the impl class is the only concrete form'\n >(ps),\n blindCast<\n Record<string, unknown>,\n 'params are structurally Record<string, unknown> at runtime'\n >(params),\n tx,\n { ...options, scope: 'transaction' },\n );\n },\n };\n },\n\n /**\n * Resets all session-local config then releases the connection back to the pool.\n * If RESET ALL fails, destroys the connection instead — pool-poisoning guarantee.\n */\n async release(): Promise<void> {\n try {\n await conn.query('RESET ALL');\n await conn.release();\n } catch (resetError) {\n await conn.destroy(resetError).catch(() => undefined);\n }\n },\n\n async destroy(reason?: unknown): Promise<void> {\n await conn.destroy(reason);\n },\n };\n\n return session;\n }\n\n /**\n * Opens a role session, executes the plan, then releases after the stream drains.\n * On mid-stream error, destroys the session instead of releasing.\n */\n executeWithRole<Row>(\n plan: SqlExecutionPlan<Row> | SqlQueryPlan<Row>,\n binding: SupabaseRoleBinding,\n options?: RuntimeExecuteOptions,\n ): AsyncIterableResult<Row> {\n const self = this;\n\n const generator = async function* (): AsyncGenerator<Row, void, unknown> {\n const session = await self.openRoleSession(binding);\n let errored = false;\n try {\n for await (const row of session.execute(plan, options)) {\n yield row;\n }\n } catch (err) {\n errored = true;\n await session.destroy(err).catch(() => undefined);\n throw err;\n } finally {\n if (!errored) {\n await session.release();\n }\n }\n };\n\n return new AsyncIterableResult(generator());\n }\n}\n","import postgresAdapter from '@prisma-next/adapter-postgres/runtime';\nimport type { Contract } from '@prisma-next/contract/types';\nimport postgresDriver from '@prisma-next/driver-postgres/runtime';\nimport { instantiateExecutionStack } from '@prisma-next/framework-components/execution';\nimport type {\n AsyncIterableResult,\n RuntimeExecuteOptions,\n} from '@prisma-next/framework-components/runtime';\nimport { sql } from '@prisma-next/sql-builder/runtime';\nimport type { Db } from '@prisma-next/sql-builder/types';\nimport type { SqlStorage } from '@prisma-next/sql-contract/types';\nimport { orm } from '@prisma-next/sql-orm-client';\nimport type { RawSqlTag } from '@prisma-next/sql-relational-core/expression';\nimport { createRawSql } from '@prisma-next/sql-relational-core/expression';\nimport type { SqlExecutionPlan, SqlQueryPlan } from '@prisma-next/sql-relational-core/plan';\nimport type {\n ExecutionContext,\n SqlExecutionStackWithDriver,\n SqlMiddleware,\n SqlRuntimeExtensionDescriptor,\n TransactionContext,\n VerifyMarkerOption,\n} from '@prisma-next/sql-runtime';\nimport {\n createExecutionContext,\n createSqlExecutionStack,\n withTransaction,\n} from '@prisma-next/sql-runtime';\nimport postgresTarget, { PostgresContractSerializer } from '@prisma-next/target-postgres/runtime';\nimport { blindCast } from '@prisma-next/utils/casts';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport { createRemoteJWKSet, type JWTVerifyResult, jwtVerify } from 'jose';\nimport type { Client } from 'pg';\nimport { Pool } from 'pg';\nimport { supabaseRuntimeDescriptor } from './descriptor';\nimport type { SupabaseRoleBinding, SupabaseRuntime } from './supabase-runtime';\nimport { SupabaseRuntimeImpl } from './supabase-runtime';\n\nexport type SupabaseTargetId = 'postgres';\n\ntype OrmClient<TContract extends Contract<SqlStorage>> = ReturnType<typeof orm<TContract>>;\n\nexport class SupabaseConfigError extends Error {\n override readonly name = 'SupabaseConfigError';\n constructor(message: string) {\n super(message);\n }\n}\n\nexport class InvalidJwtError extends Error {\n override readonly name = 'InvalidJwtError';\n readonly reason: string;\n constructor(reason: string) {\n super(`Invalid JWT: ${reason}`);\n this.reason = reason;\n }\n}\n\ntype KeyMaterial =\n | { readonly kind: 'secret'; readonly key: Uint8Array }\n | { readonly kind: 'jwks'; readonly keyset: ReturnType<typeof createRemoteJWKSet> };\n\nexport interface RoleBoundDb<TContract extends Contract<SqlStorage>> {\n readonly sql: Db<TContract>;\n readonly orm: OrmClient<TContract>;\n readonly raw: RawSqlTag;\n execute<Row>(\n plan: (SqlExecutionPlan<Row> | SqlQueryPlan<Row>) & { readonly _row?: Row },\n options?: RuntimeExecuteOptions,\n ): AsyncIterableResult<Row>;\n transaction<R>(fn: (tx: TransactionContext) => PromiseLike<R>): Promise<R>;\n}\n\nexport interface SupabaseDb<TContract extends Contract<SqlStorage>> {\n readonly context: ExecutionContext<TContract>;\n readonly stack: SqlExecutionStackWithDriver<SupabaseTargetId>;\n asUser(jwt: string): Promise<RoleBoundDb<TContract>>;\n asAnon(): RoleBoundDb<TContract>;\n asServiceRole(): RoleBoundDb<TContract>;\n close(): Promise<void>;\n [Symbol.asyncDispose](): Promise<void>;\n}\n\nexport interface SupabaseOptionsBase {\n readonly extensions?: readonly SqlRuntimeExtensionDescriptor<SupabaseTargetId>[];\n readonly middleware?: readonly SqlMiddleware[];\n readonly verifyMarker?: VerifyMarkerOption;\n readonly poolOptions?: {\n readonly connectionTimeoutMillis?: number;\n readonly idleTimeoutMillis?: number;\n };\n}\n\nexport interface SupabaseBindingOptions {\n readonly url?: string;\n readonly pg?: Pool | Client;\n}\n\ntype JwtSecretOption = {\n readonly jwtSecret: string;\n readonly jwksUrl?: never;\n};\n\ntype JwksUrlOption = {\n readonly jwksUrl: string;\n readonly jwtSecret?: never;\n};\n\nexport type SupabaseOptionsWithContract<TContract extends Contract<SqlStorage>> =\n SupabaseBindingOptions &\n SupabaseOptionsBase &\n (JwtSecretOption | JwksUrlOption) & {\n readonly contract: TContract;\n readonly contractJson?: never;\n };\n\nexport type SupabaseOptionsWithContractJson<TContract extends Contract<SqlStorage>> =\n SupabaseBindingOptions &\n SupabaseOptionsBase &\n (JwtSecretOption | JwksUrlOption) & {\n readonly contractJson: unknown;\n readonly contract?: never;\n readonly _contract?: TContract;\n };\n\nexport type SupabaseOptions<TContract extends Contract<SqlStorage>> =\n | SupabaseOptionsWithContract<TContract>\n | SupabaseOptionsWithContractJson<TContract>;\n\nfunction hasContractJson<TContract extends Contract<SqlStorage>>(\n options: SupabaseOptions<TContract>,\n): options is SupabaseOptionsWithContractJson<TContract> {\n return 'contractJson' in options;\n}\n\nconst contractSerializer = new PostgresContractSerializer();\n\nfunction resolveContract<TContract extends Contract<SqlStorage>>(\n options: SupabaseOptions<TContract>,\n): TContract {\n const contractJson = hasContractJson(options)\n ? options.contractJson\n : contractSerializer.serializeContract(options.contract);\n return blindCast<\n TContract,\n 'contractSerializer.deserializeContract returns a validated TContract'\n >(contractSerializer.deserializeContract(contractJson));\n}\n\nfunction resolveKeyMaterial<TContract extends Contract<SqlStorage>>(\n options: SupabaseOptions<TContract>,\n): KeyMaterial {\n const jwtSecret = 'jwtSecret' in options ? options.jwtSecret : undefined;\n const jwksUrl = 'jwksUrl' in options ? options.jwksUrl : undefined;\n\n if (jwtSecret !== undefined && jwksUrl !== undefined) {\n throw new SupabaseConfigError('Provide either jwtSecret or jwksUrl, not both');\n }\n if (jwtSecret === undefined && jwksUrl === undefined) {\n throw new SupabaseConfigError('Either jwtSecret or jwksUrl is required');\n }\n\n if (jwtSecret !== undefined) {\n return { kind: 'secret', key: new TextEncoder().encode(jwtSecret) };\n }\n\n if (jwksUrl !== undefined) {\n return { kind: 'jwks', keyset: createRemoteJWKSet(new URL(jwksUrl)) };\n }\n\n throw new SupabaseConfigError('Either jwtSecret or jwksUrl is required');\n}\n\nfunction toPool<TContract extends Contract<SqlStorage>>(\n options: SupabaseOptions<TContract>,\n): { pool: Pool; owned: boolean } | undefined {\n if (options.pg instanceof Pool) {\n return { pool: options.pg, owned: false };\n }\n if (typeof options.url === 'string') {\n return {\n pool: new Pool({\n connectionString: options.url,\n connectionTimeoutMillis: options.poolOptions?.connectionTimeoutMillis ?? 20_000,\n idleTimeoutMillis: options.poolOptions?.idleTimeoutMillis ?? 30_000,\n }),\n owned: true,\n };\n }\n return undefined;\n}\n\nfunction withSupabaseDescriptor(\n extensions: readonly SqlRuntimeExtensionDescriptor<SupabaseTargetId>[] | undefined,\n): readonly SqlRuntimeExtensionDescriptor<SupabaseTargetId>[] {\n const packs = extensions ?? [];\n return packs.some((pack) => pack.id === supabaseRuntimeDescriptor.id)\n ? packs\n : [...packs, supabaseRuntimeDescriptor];\n}\n\nexport default async function supabase<TContract extends Contract<SqlStorage>>(\n options: SupabaseOptionsWithContract<TContract>,\n): Promise<SupabaseDb<TContract>>;\nexport default async function supabase<TContract extends Contract<SqlStorage>>(\n options: SupabaseOptionsWithContractJson<TContract>,\n): Promise<SupabaseDb<TContract>>;\nexport default async function supabase<TContract extends Contract<SqlStorage>>(\n options: SupabaseOptions<TContract>,\n): Promise<SupabaseDb<TContract>> {\n const keyMaterial = resolveKeyMaterial(options);\n const contract = resolveContract(options);\n\n const stack = createSqlExecutionStack({\n target: postgresTarget,\n adapter: postgresAdapter,\n driver: postgresDriver,\n extensionPacks: withSupabaseDescriptor(options.extensions),\n });\n\n const context = createExecutionContext({ contract, stack });\n const rawCodecInferer = stack.adapter.rawCodecInferer;\n const rawSqlTag: RawSqlTag = createRawSql(rawCodecInferer);\n\n const poolEntry = toPool(options);\n let closed = false;\n\n const stackInstance = instantiateExecutionStack(stack);\n const driverDescriptor = stack.driver;\n if (!driverDescriptor) {\n throw new Error('Driver descriptor missing from execution stack');\n }\n const driver = driverDescriptor.create({ cursor: { disabled: true } });\n\n if (poolEntry) {\n await driver.connect({ kind: 'pgPool', pool: poolEntry.pool });\n }\n\n const runtime: SupabaseRuntime & SupabaseRuntimeImpl<TContract> = new SupabaseRuntimeImpl({\n context,\n adapter: stackInstance.adapter,\n driver,\n ...ifDefined('verifyMarker', options.verifyMarker),\n ...ifDefined('middleware', options.middleware),\n });\n\n async function verifyJwt(jwt: string): Promise<JWTVerifyResult> {\n try {\n if (keyMaterial.kind === 'secret') {\n return await jwtVerify(jwt, keyMaterial.key);\n }\n return await jwtVerify(jwt, keyMaterial.keyset);\n } catch (err) {\n const reason = err instanceof Error ? err.message : String(err);\n throw new InvalidJwtError(reason);\n }\n }\n\n function buildRoleBoundDb(binding: SupabaseRoleBinding): RoleBoundDb<TContract> {\n const roleSql: Db<TContract> = sql<TContract>({ context, rawCodecInferer });\n const roleOrm: OrmClient<TContract> = orm({\n runtime: {\n execute(plan) {\n return runtime.executeWithRole(plan, binding);\n },\n // connection() returns a role session; this is the enforcement path for ORM scope\n // operations (mutations, includes) — every statement runs role-bound.\n connection: () => runtime.openRoleSession(binding),\n },\n context,\n });\n\n return {\n sql: roleSql,\n orm: roleOrm,\n raw: rawSqlTag,\n execute<Row>(\n plan: (SqlExecutionPlan<Row> | SqlQueryPlan<Row>) & { readonly _row?: Row },\n execOptions?: RuntimeExecuteOptions,\n ): AsyncIterableResult<Row> {\n return runtime.executeWithRole<Row>(plan, binding, execOptions);\n },\n transaction<R>(fn: (tx: TransactionContext) => PromiseLike<R>): Promise<R> {\n return withTransaction({ connection: () => runtime.openRoleSession(binding) }, fn);\n },\n };\n }\n\n async function closeDb(): Promise<void> {\n if (closed) return;\n closed = true;\n await runtime.close();\n if (poolEntry?.owned) {\n await poolEntry.pool.end().catch(() => undefined);\n }\n }\n\n return {\n context,\n stack,\n\n async asUser(jwt: string): Promise<RoleBoundDb<TContract>> {\n const { payload } = await verifyJwt(jwt);\n const rawRole = payload['role'];\n const roleStr = typeof rawRole === 'string' ? rawRole : 'authenticated';\n const role: SupabaseRoleBinding['role'] =\n roleStr === 'anon' || roleStr === 'authenticated' || roleStr === 'service_role'\n ? roleStr\n : 'authenticated';\n const binding: SupabaseRoleBinding = { role, claims: payload };\n return buildRoleBoundDb(binding);\n },\n\n asAnon(): RoleBoundDb<TContract> {\n return buildRoleBoundDb({ role: 'anon', claims: {} });\n },\n\n asServiceRole(): RoleBoundDb<TContract> {\n return buildRoleBoundDb({ role: 'service_role', claims: {} });\n },\n\n close: closeDb,\n [Symbol.asyncDispose]: closeDb,\n };\n}\n","import { supabaseRuntimeDescriptor } from '../runtime/descriptor';\n\nexport default supabaseRuntimeDescriptor;\n\nexport type {\n RoleBoundDb,\n SupabaseDb,\n SupabaseOptions,\n SupabaseOptionsWithContract,\n SupabaseOptionsWithContractJson,\n SupabaseTargetId,\n} from '../runtime/supabase';\nexport { default as supabase, InvalidJwtError, SupabaseConfigError } from '../runtime/supabase';\nexport type {\n RoleSession,\n SupabaseRoleBinding,\n SupabaseRuntime,\n} from '../runtime/supabase-runtime';\nexport { SupabaseRuntimeImpl } from '../runtime/supabase-runtime';\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"runtime.mjs","names":["packageJson.version","extensionContractJson"],"sources":["../src/runtime/descriptor.ts","../src/runtime/supabase-runtime.ts","../src/runtime/supabase.ts","../src/exports/runtime.ts"],"sourcesContent":["import type { SqlRuntimeExtensionDescriptor } from '@prisma-next/sql-runtime';\nimport packageJson from '../../package.json' with { type: 'json' };\n\n/**\n * Tells the runtime that the Supabase pack's runtime component is available.\n *\n * When a contract declares the Supabase pack, the runtime checks that a\n * matching descriptor has been registered. Without this, loading a Supabase\n * contract errors with \"pack runtime component missing\". The `supabase()`\n * factory registers this descriptor automatically — app code never needs to\n * reference it directly.\n */\nexport const supabaseRuntimeDescriptor: SqlRuntimeExtensionDescriptor<'postgres'> = {\n kind: 'extension' as const,\n id: 'supabase',\n version: packageJson.version,\n familyId: 'sql' as const,\n targetId: 'postgres' as const,\n codecs: () => [],\n create() {\n return {\n familyId: 'sql' as const,\n targetId: 'postgres' as const,\n };\n },\n};\n","import type { Contract } from '@prisma-next/contract/types';\nimport type { RuntimeExecuteOptions } from '@prisma-next/framework-components/runtime';\nimport { AsyncIterableResult } from '@prisma-next/framework-components/runtime';\nimport { type PostgresRuntime, PostgresRuntimeImpl } from '@prisma-next/postgres/runtime';\nimport type { SqlStorage } from '@prisma-next/sql-contract/types';\nimport type { SqlExecutionPlan, SqlQueryPlan } from '@prisma-next/sql-relational-core/plan';\nimport type {\n PreparedStatement,\n PreparedStatementImpl,\n RuntimeConnection,\n RuntimeTransaction,\n} from '@prisma-next/sql-runtime';\nimport { blindCast } from '@prisma-next/utils/casts';\n\nexport interface SupabaseRuntime extends PostgresRuntime {}\n\nexport interface SupabaseRoleBinding {\n // TODO(TML-2501): role names move to the Supabase extension contract (roles as first-class IR) when postgres-rls lands.\n readonly role: 'anon' | 'authenticated' | 'service_role';\n readonly claims?: Record<string, unknown>;\n}\n\n/**\n * A connection with a Supabase role already bound via session-scoped set_config.\n * Implements `RuntimeConnection` so it plugs into ORM scope machinery and `withTransaction`.\n */\nexport interface RoleSession extends RuntimeConnection {}\n\nexport class SupabaseRuntimeImpl<\n TContract extends Contract<SqlStorage> = Contract<SqlStorage>,\n> extends PostgresRuntimeImpl<TContract> {\n /**\n * Opens a raw connection and applies role + JWT claims via session-scoped set_config.\n * On bind failure, destroys the connection before rethrowing — no leaked connections.\n * Not on the `SupabaseRuntime` interface; consumed by the facade, not by app code.\n */\n async openRoleSession(binding: SupabaseRoleBinding): Promise<RoleSession> {\n const conn = await this.acquireRawConnection();\n\n try {\n await conn.query('SELECT set_config($1, $2, false)', ['role', binding.role]);\n await conn.query('SELECT set_config($1, $2, false)', [\n 'request.jwt.claims',\n JSON.stringify(binding.claims ?? {}),\n ]);\n } catch (err) {\n await conn.destroy(err).catch(() => undefined);\n throw err;\n }\n\n const self = this;\n\n const session: RoleSession = {\n execute<Row>(\n plan: (SqlExecutionPlan<unknown> | SqlQueryPlan<unknown>) & { readonly _row?: Row },\n options?: RuntimeExecuteOptions,\n ): AsyncIterableResult<Row> {\n return self.executeAgainstQueryable<Row>(plan, conn, { ...options, scope: 'connection' });\n },\n\n executePrepared<Params, Row>(\n ps: PreparedStatement<Params, Row>,\n params: Params,\n options?: RuntimeExecuteOptions,\n ): AsyncIterableResult<Row> {\n return self.executePreparedAgainstQueryable(\n blindCast<\n PreparedStatementImpl<Params, Row>,\n 'PreparedStatement is PreparedStatementImpl; the impl class is the only concrete form'\n >(ps),\n blindCast<\n Record<string, unknown>,\n 'params are structurally Record<string, unknown> at runtime'\n >(params),\n conn,\n { ...options, scope: 'connection' },\n );\n },\n\n async transaction(): Promise<RuntimeTransaction> {\n const tx = await conn.beginTransaction();\n return {\n async commit(): Promise<void> {\n await tx.commit();\n },\n async rollback(): Promise<void> {\n await tx.rollback();\n },\n execute<Row>(\n plan: (SqlExecutionPlan<unknown> | SqlQueryPlan<unknown>) & { readonly _row?: Row },\n options?: RuntimeExecuteOptions,\n ): AsyncIterableResult<Row> {\n return self.executeAgainstQueryable<Row>(plan, tx, {\n ...options,\n scope: 'transaction',\n });\n },\n executePrepared<Params, Row>(\n ps: PreparedStatement<Params, Row>,\n params: Params,\n options?: RuntimeExecuteOptions,\n ): AsyncIterableResult<Row> {\n return self.executePreparedAgainstQueryable(\n blindCast<\n PreparedStatementImpl<Params, Row>,\n 'PreparedStatement is PreparedStatementImpl; the impl class is the only concrete form'\n >(ps),\n blindCast<\n Record<string, unknown>,\n 'params are structurally Record<string, unknown> at runtime'\n >(params),\n tx,\n { ...options, scope: 'transaction' },\n );\n },\n };\n },\n\n /**\n * Resets all session-local config then releases the connection back to the pool.\n * If RESET ALL fails, destroys the connection instead — pool-poisoning guarantee.\n */\n async release(): Promise<void> {\n try {\n await conn.query('RESET ALL');\n await conn.release();\n } catch (resetError) {\n await conn.destroy(resetError).catch(() => undefined);\n }\n },\n\n async destroy(reason?: unknown): Promise<void> {\n await conn.destroy(reason);\n },\n };\n\n return session;\n }\n\n /**\n * Opens a role session, executes the plan, then releases after the stream drains.\n * On mid-stream error, destroys the session instead of releasing.\n */\n executeWithRole<Row>(\n plan: SqlExecutionPlan<Row> | SqlQueryPlan<Row>,\n binding: SupabaseRoleBinding,\n options?: RuntimeExecuteOptions,\n ): AsyncIterableResult<Row> {\n const self = this;\n\n const generator = async function* (): AsyncGenerator<Row, void, unknown> {\n const session = await self.openRoleSession(binding);\n let errored = false;\n try {\n for await (const row of session.execute(plan, options)) {\n yield row;\n }\n } catch (err) {\n errored = true;\n await session.destroy(err).catch(() => undefined);\n throw err;\n } finally {\n if (!errored) {\n await session.release();\n }\n }\n };\n\n return new AsyncIterableResult(generator());\n }\n}\n","import postgresAdapter from '@prisma-next/adapter-postgres/runtime';\nimport type { Contract } from '@prisma-next/contract/types';\nimport postgresDriver from '@prisma-next/driver-postgres/runtime';\nimport { instantiateExecutionStack } from '@prisma-next/framework-components/execution';\nimport type {\n AsyncIterableResult,\n RuntimeExecuteOptions,\n} from '@prisma-next/framework-components/runtime';\nimport { sql } from '@prisma-next/sql-builder/runtime';\nimport type { Db } from '@prisma-next/sql-builder/types';\nimport type { SqlStorage } from '@prisma-next/sql-contract/types';\nimport { orm } from '@prisma-next/sql-orm-client';\nimport type { RawSqlTag } from '@prisma-next/sql-relational-core/expression';\nimport { createRawSql } from '@prisma-next/sql-relational-core/expression';\nimport type { SqlExecutionPlan, SqlQueryPlan } from '@prisma-next/sql-relational-core/plan';\nimport type {\n ExecutionContext,\n SqlExecutionStackWithDriver,\n SqlMiddleware,\n SqlRuntimeExtensionDescriptor,\n TransactionContext,\n VerifyMarkerOption,\n} from '@prisma-next/sql-runtime';\nimport {\n createExecutionContext,\n createSqlExecutionStack,\n withTransaction,\n} from '@prisma-next/sql-runtime';\nimport postgresTarget, { PostgresContractSerializer } from '@prisma-next/target-postgres/runtime';\nimport { blindCast } from '@prisma-next/utils/casts';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport { createRemoteJWKSet, type JWTVerifyResult, jwtVerify } from 'jose';\nimport type { Client } from 'pg';\nimport { Pool } from 'pg';\nimport extensionContractJson from '../contract/contract.json' with { type: 'json' };\nimport { supabaseRuntimeDescriptor } from './descriptor';\nimport type { SupabaseExtensionContract } from './ext-contract-type';\nimport type { SupabaseRoleBinding, SupabaseRuntime } from './supabase-runtime';\nimport { SupabaseRuntimeImpl } from './supabase-runtime';\n\nexport type SupabaseTargetId = 'postgres';\n\ntype OrmClient<TContract extends Contract<SqlStorage>> = ReturnType<typeof orm<TContract>>;\n\nexport class SupabaseConfigError extends Error {\n override readonly name = 'SupabaseConfigError';\n constructor(message: string) {\n super(message);\n }\n}\n\nexport class InvalidJwtError extends Error {\n override readonly name = 'InvalidJwtError';\n readonly reason: string;\n constructor(reason: string) {\n super(`Invalid JWT: ${reason}`);\n this.reason = reason;\n }\n}\n\ntype KeyMaterial =\n | { readonly kind: 'secret'; readonly key: Uint8Array }\n | { readonly kind: 'jwks'; readonly keyset: ReturnType<typeof createRemoteJWKSet> };\n\nexport interface RoleBoundDb<TContract extends Contract<SqlStorage>> {\n readonly sql: Db<TContract>;\n readonly orm: OrmClient<TContract>;\n readonly raw: RawSqlTag;\n execute<Row>(\n plan: (SqlExecutionPlan<Row> | SqlQueryPlan<Row>) & { readonly _row?: Row },\n options?: RuntimeExecuteOptions,\n ): AsyncIterableResult<Row>;\n transaction<R>(fn: (tx: TransactionContext) => PromiseLike<R>): Promise<R>;\n}\n\n/**\n * Query surface for the Supabase-internal contract (`auth`, `storage`). Exposed\n * as a separate secondary root — never merged into the app contract — and only\n * reachable through `service_role`, the one role with grants on those schemas\n * over a direct Postgres connection.\n *\n * Deliberately omits `transaction` (which {@link RoleBoundDb} has): the primary\n * app root and this secondary root are served by separate runtimes that do not\n * share one pinned connection, so a transaction spanning both is out of scope for v1.\n */\nexport interface SupabaseInternalDb {\n readonly sql: Db<SupabaseExtensionContract>;\n readonly orm: OrmClient<SupabaseExtensionContract>;\n execute<Row>(\n plan: (SqlExecutionPlan<Row> | SqlQueryPlan<Row>) & { readonly _row?: Row },\n options?: RuntimeExecuteOptions,\n ): AsyncIterableResult<Row>;\n}\n\n/**\n * The `service_role` db: the app-contract role-bound surface (its `.sql` / `.orm`\n * are app-only, exactly like `asUser` / `asAnon`), plus a `.supabase` secondary\n * root for the Supabase-internal namespaces.\n */\nexport type ServiceRoleDb<TContract extends Contract<SqlStorage>> = RoleBoundDb<TContract> & {\n readonly supabase: SupabaseInternalDb;\n};\n\nexport interface SupabaseDb<TContract extends Contract<SqlStorage>> {\n readonly context: ExecutionContext<TContract>;\n readonly stack: SqlExecutionStackWithDriver<SupabaseTargetId>;\n asUser(jwt: string): Promise<RoleBoundDb<TContract>>;\n asAnon(): RoleBoundDb<TContract>;\n asServiceRole(): ServiceRoleDb<TContract>;\n close(): Promise<void>;\n [Symbol.asyncDispose](): Promise<void>;\n}\n\nexport interface SupabaseOptionsBase {\n readonly extensions?: readonly SqlRuntimeExtensionDescriptor<SupabaseTargetId>[];\n readonly middleware?: readonly SqlMiddleware[];\n readonly verifyMarker?: VerifyMarkerOption;\n readonly poolOptions?: {\n readonly connectionTimeoutMillis?: number;\n readonly idleTimeoutMillis?: number;\n };\n}\n\nexport interface SupabaseBindingOptions {\n readonly url?: string;\n readonly pg?: Pool | Client;\n}\n\ntype JwtSecretOption = {\n readonly jwtSecret: string;\n readonly jwksUrl?: never;\n};\n\ntype JwksUrlOption = {\n readonly jwksUrl: string;\n readonly jwtSecret?: never;\n};\n\nexport type SupabaseOptionsWithContract<TContract extends Contract<SqlStorage>> =\n SupabaseBindingOptions &\n SupabaseOptionsBase &\n (JwtSecretOption | JwksUrlOption) & {\n readonly contract: TContract;\n readonly contractJson?: never;\n };\n\nexport type SupabaseOptionsWithContractJson<TContract extends Contract<SqlStorage>> =\n SupabaseBindingOptions &\n SupabaseOptionsBase &\n (JwtSecretOption | JwksUrlOption) & {\n readonly contractJson: unknown;\n readonly contract?: never;\n readonly _contract?: TContract;\n };\n\nexport type SupabaseOptions<TContract extends Contract<SqlStorage>> =\n | SupabaseOptionsWithContract<TContract>\n | SupabaseOptionsWithContractJson<TContract>;\n\nfunction hasContractJson<TContract extends Contract<SqlStorage>>(\n options: SupabaseOptions<TContract>,\n): options is SupabaseOptionsWithContractJson<TContract> {\n return 'contractJson' in options;\n}\n\nconst contractSerializer = new PostgresContractSerializer();\n\nfunction resolveContract<TContract extends Contract<SqlStorage>>(\n options: SupabaseOptions<TContract>,\n): TContract {\n const contractJson = hasContractJson(options)\n ? options.contractJson\n : contractSerializer.serializeContract(options.contract);\n return blindCast<\n TContract,\n 'contractSerializer.deserializeContract returns a validated TContract'\n >(contractSerializer.deserializeContract(contractJson));\n}\n\nfunction resolveKeyMaterial<TContract extends Contract<SqlStorage>>(\n options: SupabaseOptions<TContract>,\n): KeyMaterial {\n const jwtSecret = 'jwtSecret' in options ? options.jwtSecret : undefined;\n const jwksUrl = 'jwksUrl' in options ? options.jwksUrl : undefined;\n\n if (jwtSecret !== undefined && jwksUrl !== undefined) {\n throw new SupabaseConfigError('Provide either jwtSecret or jwksUrl, not both');\n }\n if (jwtSecret === undefined && jwksUrl === undefined) {\n throw new SupabaseConfigError('Either jwtSecret or jwksUrl is required');\n }\n\n if (jwtSecret !== undefined) {\n return { kind: 'secret', key: new TextEncoder().encode(jwtSecret) };\n }\n\n if (jwksUrl !== undefined) {\n return { kind: 'jwks', keyset: createRemoteJWKSet(new URL(jwksUrl)) };\n }\n\n throw new SupabaseConfigError('Either jwtSecret or jwksUrl is required');\n}\n\nfunction toPool<TContract extends Contract<SqlStorage>>(\n options: SupabaseOptions<TContract>,\n): { pool: Pool; owned: boolean } | undefined {\n if (options.pg instanceof Pool) {\n return { pool: options.pg, owned: false };\n }\n if (typeof options.url === 'string') {\n return {\n pool: new Pool({\n connectionString: options.url,\n connectionTimeoutMillis: options.poolOptions?.connectionTimeoutMillis ?? 20_000,\n idleTimeoutMillis: options.poolOptions?.idleTimeoutMillis ?? 30_000,\n }),\n owned: true,\n };\n }\n return undefined;\n}\n\nfunction withSupabaseDescriptor(\n extensions: readonly SqlRuntimeExtensionDescriptor<SupabaseTargetId>[] | undefined,\n): readonly SqlRuntimeExtensionDescriptor<SupabaseTargetId>[] {\n const packs = extensions ?? [];\n return packs.some((pack) => pack.id === supabaseRuntimeDescriptor.id)\n ? packs\n : [...packs, supabaseRuntimeDescriptor];\n}\n\n/**\n * Deserializes the Supabase extension's own emitted contract into a runtime\n * contract: namespaces hydrate into `PostgresSchema` instances (with\n * `qualifyTable`), and `typeRef` columns (`Timestamptz`, `Uuid`) resolve\n * through the codec registry. Exposed only via `service_role`'s `.supabase`\n * secondary root — never merged into the app contract.\n */\nfunction buildExtensionContract(): SupabaseExtensionContract {\n return blindCast<\n SupabaseExtensionContract,\n 'deserializeContract hydrates JSON namespaces into PostgresSchema instances with qualifyTable'\n >(contractSerializer.deserializeContract(extensionContractJson));\n}\n\nexport default async function supabase<TContract extends Contract<SqlStorage>>(\n options: SupabaseOptionsWithContract<TContract>,\n): Promise<SupabaseDb<TContract>>;\nexport default async function supabase<TContract extends Contract<SqlStorage>>(\n options: SupabaseOptionsWithContractJson<TContract>,\n): Promise<SupabaseDb<TContract>>;\nexport default async function supabase<TContract extends Contract<SqlStorage>>(\n options: SupabaseOptions<TContract>,\n): Promise<SupabaseDb<TContract>> {\n const keyMaterial = resolveKeyMaterial(options);\n const contract = resolveContract(options);\n\n const stack = createSqlExecutionStack({\n target: postgresTarget,\n adapter: postgresAdapter,\n driver: postgresDriver,\n extensionPacks: withSupabaseDescriptor(options.extensions),\n });\n\n const context = createExecutionContext({ contract, stack });\n const rawCodecInferer = stack.adapter.rawCodecInferer;\n const rawSqlTag: RawSqlTag = createRawSql(rawCodecInferer);\n\n const poolEntry = toPool(options);\n let closed = false;\n\n const stackInstance = instantiateExecutionStack(stack);\n const driverDescriptor = stack.driver;\n if (!driverDescriptor) {\n throw new Error('Driver descriptor missing from execution stack');\n }\n const driver = driverDescriptor.create({ cursor: { disabled: true } });\n\n if (poolEntry) {\n await driver.connect({ kind: 'pgPool', pool: poolEntry.pool });\n }\n\n const runtime: SupabaseRuntime & SupabaseRuntimeImpl<TContract> = new SupabaseRuntimeImpl({\n context,\n adapter: stackInstance.adapter,\n driver,\n ...ifDefined('verifyMarker', options.verifyMarker),\n ...ifDefined('middleware', options.middleware),\n });\n\n async function verifyJwt(jwt: string): Promise<JWTVerifyResult> {\n try {\n if (keyMaterial.kind === 'secret') {\n return await jwtVerify(jwt, keyMaterial.key);\n }\n return await jwtVerify(jwt, keyMaterial.keyset);\n } catch (err) {\n const reason = err instanceof Error ? err.message : String(err);\n throw new InvalidJwtError(reason);\n }\n }\n\n function buildRoleBoundDbWithContext<C extends Contract<SqlStorage>>(\n binding: SupabaseRoleBinding,\n roleContext: ExecutionContext<C>,\n roleRuntime: SupabaseRuntime & SupabaseRuntimeImpl<C>,\n ): RoleBoundDb<C> {\n const roleSql: Db<C> = sql<C>({ context: roleContext, rawCodecInferer });\n const roleOrm: OrmClient<C> = orm({\n runtime: {\n execute(plan) {\n return roleRuntime.executeWithRole(plan, binding);\n },\n connection: () => roleRuntime.openRoleSession(binding),\n },\n context: roleContext,\n });\n\n return {\n sql: roleSql,\n orm: roleOrm,\n raw: rawSqlTag,\n execute<Row>(\n plan: (SqlExecutionPlan<Row> | SqlQueryPlan<Row>) & { readonly _row?: Row },\n execOptions?: RuntimeExecuteOptions,\n ): AsyncIterableResult<Row> {\n return roleRuntime.executeWithRole<Row>(plan, binding, execOptions);\n },\n transaction<R>(fn: (tx: TransactionContext) => PromiseLike<R>): Promise<R> {\n return withTransaction({ connection: () => roleRuntime.openRoleSession(binding) }, fn);\n },\n };\n }\n\n function buildRoleBoundDb(binding: SupabaseRoleBinding): RoleBoundDb<TContract> {\n return buildRoleBoundDbWithContext(binding, context, runtime);\n }\n\n const serviceRoleBinding: SupabaseRoleBinding = { role: 'service_role', claims: {} };\n\n // The Supabase-internal contract (auth/storage) as a separate secondary root.\n // It is contract-bound: a plan built against it carries the extension's\n // storageHash, so it must run on a runtime bound to the extension contract —\n // the app runtime would reject it (PLAN.HASH_MISMATCH). This runtime shares\n // the same driver (one pool, no second connection) and disables marker\n // verification: the extension contract is external and owns no app-space\n // marker, so its hashes must not be checked against the DB marker.\n const extContract = buildExtensionContract();\n const extContext = createExecutionContext({ contract: extContract, stack });\n const extRuntime: SupabaseRuntime & SupabaseRuntimeImpl<SupabaseExtensionContract> =\n new SupabaseRuntimeImpl({\n context: extContext,\n adapter: stackInstance.adapter,\n driver,\n verifyMarker: false,\n ...ifDefined('middleware', options.middleware),\n });\n\n const supabaseInternal: SupabaseInternalDb = {\n sql: sql<SupabaseExtensionContract>({ context: extContext, rawCodecInferer }),\n orm: orm({\n runtime: {\n execute(plan) {\n return extRuntime.executeWithRole(plan, serviceRoleBinding);\n },\n connection: () => extRuntime.openRoleSession(serviceRoleBinding),\n },\n context: extContext,\n }),\n execute<Row>(\n plan: (SqlExecutionPlan<Row> | SqlQueryPlan<Row>) & { readonly _row?: Row },\n execOptions?: RuntimeExecuteOptions,\n ): AsyncIterableResult<Row> {\n return extRuntime.executeWithRole<Row>(plan, serviceRoleBinding, execOptions);\n },\n };\n\n async function closeDb(): Promise<void> {\n if (closed) return;\n closed = true;\n await runtime.close();\n if (poolEntry?.owned) {\n await poolEntry.pool.end().catch(() => undefined);\n }\n }\n\n return {\n context,\n stack,\n\n async asUser(jwt: string): Promise<RoleBoundDb<TContract>> {\n const { payload } = await verifyJwt(jwt);\n const rawRole = payload['role'];\n const roleStr = typeof rawRole === 'string' ? rawRole : 'authenticated';\n const role: SupabaseRoleBinding['role'] =\n roleStr === 'anon' || roleStr === 'authenticated' || roleStr === 'service_role'\n ? roleStr\n : 'authenticated';\n const binding: SupabaseRoleBinding = { role, claims: payload };\n return buildRoleBoundDb(binding);\n },\n\n asAnon(): RoleBoundDb<TContract> {\n return buildRoleBoundDb({ role: 'anon', claims: {} });\n },\n\n asServiceRole(): ServiceRoleDb<TContract> {\n const roleBound = buildRoleBoundDbWithContext(serviceRoleBinding, context, runtime);\n return { ...roleBound, supabase: supabaseInternal };\n },\n\n close: closeDb,\n [Symbol.asyncDispose]: closeDb,\n };\n}\n","import { supabaseRuntimeDescriptor } from '../runtime/descriptor';\n\nexport default supabaseRuntimeDescriptor;\n\nexport type {\n RoleBoundDb,\n ServiceRoleDb,\n SupabaseDb,\n SupabaseInternalDb,\n SupabaseOptions,\n SupabaseOptionsWithContract,\n SupabaseOptionsWithContractJson,\n SupabaseTargetId,\n} from '../runtime/supabase';\nexport { default as supabase, InvalidJwtError, SupabaseConfigError } from '../runtime/supabase';\nexport type {\n RoleSession,\n SupabaseRoleBinding,\n SupabaseRuntime,\n} from '../runtime/supabase-runtime';\nexport { SupabaseRuntimeImpl } from '../runtime/supabase-runtime';\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,47 +1,47 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prisma-next/extension-supabase",
|
|
3
|
-
"version": "0.14.0-dev.
|
|
3
|
+
"version": "0.14.0-dev.29",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": false,
|
|
7
7
|
"dependencies": {
|
|
8
|
-
"@prisma-next/adapter-postgres": "0.14.0-dev.
|
|
9
|
-
"@prisma-next/contract": "0.14.0-dev.
|
|
10
|
-
"@prisma-next/driver-postgres": "0.14.0-dev.
|
|
11
|
-
"@prisma-next/postgres": "0.14.0-dev.
|
|
12
|
-
"@prisma-next/sql-builder": "0.14.0-dev.
|
|
13
|
-
"@prisma-next/sql-orm-client": "0.14.0-dev.
|
|
14
|
-
"@prisma-next/target-postgres": "0.14.0-dev.
|
|
8
|
+
"@prisma-next/adapter-postgres": "0.14.0-dev.29",
|
|
9
|
+
"@prisma-next/contract": "0.14.0-dev.29",
|
|
10
|
+
"@prisma-next/driver-postgres": "0.14.0-dev.29",
|
|
11
|
+
"@prisma-next/postgres": "0.14.0-dev.29",
|
|
12
|
+
"@prisma-next/sql-builder": "0.14.0-dev.29",
|
|
13
|
+
"@prisma-next/sql-orm-client": "0.14.0-dev.29",
|
|
14
|
+
"@prisma-next/target-postgres": "0.14.0-dev.29",
|
|
15
15
|
"jose": "^6",
|
|
16
16
|
"pg": "8.21.0",
|
|
17
|
-
"@prisma-next/contract-authoring": "0.14.0-dev.
|
|
18
|
-
"@prisma-next/family-sql": "0.14.0-dev.
|
|
19
|
-
"@prisma-next/framework-components": "0.14.0-dev.
|
|
20
|
-
"@prisma-next/migration-tools": "0.14.0-dev.
|
|
21
|
-
"@prisma-next/sql-contract": "0.14.0-dev.
|
|
22
|
-
"@prisma-next/sql-contract-ts": "0.14.0-dev.
|
|
23
|
-
"@prisma-next/sql-operations": "0.14.0-dev.
|
|
24
|
-
"@prisma-next/sql-relational-core": "0.14.0-dev.
|
|
25
|
-
"@prisma-next/sql-runtime": "0.14.0-dev.
|
|
26
|
-
"@prisma-next/sql-schema-ir": "0.14.0-dev.
|
|
27
|
-
"@prisma-next/utils": "0.14.0-dev.
|
|
17
|
+
"@prisma-next/contract-authoring": "0.14.0-dev.29",
|
|
18
|
+
"@prisma-next/family-sql": "0.14.0-dev.29",
|
|
19
|
+
"@prisma-next/framework-components": "0.14.0-dev.29",
|
|
20
|
+
"@prisma-next/migration-tools": "0.14.0-dev.29",
|
|
21
|
+
"@prisma-next/sql-contract": "0.14.0-dev.29",
|
|
22
|
+
"@prisma-next/sql-contract-ts": "0.14.0-dev.29",
|
|
23
|
+
"@prisma-next/sql-operations": "0.14.0-dev.29",
|
|
24
|
+
"@prisma-next/sql-relational-core": "0.14.0-dev.29",
|
|
25
|
+
"@prisma-next/sql-runtime": "0.14.0-dev.29",
|
|
26
|
+
"@prisma-next/sql-schema-ir": "0.14.0-dev.29",
|
|
27
|
+
"@prisma-next/utils": "0.14.0-dev.29",
|
|
28
28
|
"@standard-schema/spec": "^1.1.0",
|
|
29
29
|
"arktype": "^2.2.0"
|
|
30
30
|
},
|
|
31
31
|
"devDependencies": {
|
|
32
|
-
"@prisma-next/cli": "0.14.0-dev.
|
|
33
|
-
"@prisma-next/operations": "0.14.0-dev.
|
|
34
|
-
"@prisma-next/sql-contract-psl": "0.14.0-dev.
|
|
35
|
-
"@prisma-next/test-utils": "0.14.0-dev.
|
|
36
|
-
"@prisma-next/tsconfig": "0.14.0-dev.
|
|
37
|
-
"@prisma-next/tsdown": "0.14.0-dev.
|
|
32
|
+
"@prisma-next/cli": "0.14.0-dev.29",
|
|
33
|
+
"@prisma-next/operations": "0.14.0-dev.29",
|
|
34
|
+
"@prisma-next/sql-contract-psl": "0.14.0-dev.29",
|
|
35
|
+
"@prisma-next/test-utils": "0.14.0-dev.29",
|
|
36
|
+
"@prisma-next/tsconfig": "0.14.0-dev.29",
|
|
37
|
+
"@prisma-next/tsdown": "0.14.0-dev.29",
|
|
38
38
|
"@types/pg": "8.20.0",
|
|
39
39
|
"tsdown": "0.22.1",
|
|
40
40
|
"typescript": "5.9.3",
|
|
41
41
|
"vitest": "4.1.8"
|
|
42
42
|
},
|
|
43
43
|
"peerDependencies": {
|
|
44
|
-
"@prisma-next/adapter-postgres": "0.14.0-dev.
|
|
44
|
+
"@prisma-next/adapter-postgres": "0.14.0-dev.29",
|
|
45
45
|
"typescript": ">=5.9"
|
|
46
46
|
},
|
|
47
47
|
"peerDependenciesMeta": {
|
package/src/exports/runtime.ts
CHANGED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Contract } from '../contract/contract.d';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* The Supabase extension's own emitted contract type (`auth`, `storage`
|
|
5
|
+
* namespaces), re-exported under a distinct name so the runtime facade can
|
|
6
|
+
* reference it alongside the framework `Contract` (`@prisma-next/contract/types`)
|
|
7
|
+
* without an aliased import. Backs the `service_role` `.supabase` secondary root.
|
|
8
|
+
*/
|
|
9
|
+
export type SupabaseExtensionContract = Contract;
|
package/src/runtime/supabase.ts
CHANGED
|
@@ -32,7 +32,9 @@ import { ifDefined } from '@prisma-next/utils/defined';
|
|
|
32
32
|
import { createRemoteJWKSet, type JWTVerifyResult, jwtVerify } from 'jose';
|
|
33
33
|
import type { Client } from 'pg';
|
|
34
34
|
import { Pool } from 'pg';
|
|
35
|
+
import extensionContractJson from '../contract/contract.json' with { type: 'json' };
|
|
35
36
|
import { supabaseRuntimeDescriptor } from './descriptor';
|
|
37
|
+
import type { SupabaseExtensionContract } from './ext-contract-type';
|
|
36
38
|
import type { SupabaseRoleBinding, SupabaseRuntime } from './supabase-runtime';
|
|
37
39
|
import { SupabaseRuntimeImpl } from './supabase-runtime';
|
|
38
40
|
|
|
@@ -71,12 +73,40 @@ export interface RoleBoundDb<TContract extends Contract<SqlStorage>> {
|
|
|
71
73
|
transaction<R>(fn: (tx: TransactionContext) => PromiseLike<R>): Promise<R>;
|
|
72
74
|
}
|
|
73
75
|
|
|
76
|
+
/**
|
|
77
|
+
* Query surface for the Supabase-internal contract (`auth`, `storage`). Exposed
|
|
78
|
+
* as a separate secondary root — never merged into the app contract — and only
|
|
79
|
+
* reachable through `service_role`, the one role with grants on those schemas
|
|
80
|
+
* over a direct Postgres connection.
|
|
81
|
+
*
|
|
82
|
+
* Deliberately omits `transaction` (which {@link RoleBoundDb} has): the primary
|
|
83
|
+
* app root and this secondary root are served by separate runtimes that do not
|
|
84
|
+
* share one pinned connection, so a transaction spanning both is out of scope for v1.
|
|
85
|
+
*/
|
|
86
|
+
export interface SupabaseInternalDb {
|
|
87
|
+
readonly sql: Db<SupabaseExtensionContract>;
|
|
88
|
+
readonly orm: OrmClient<SupabaseExtensionContract>;
|
|
89
|
+
execute<Row>(
|
|
90
|
+
plan: (SqlExecutionPlan<Row> | SqlQueryPlan<Row>) & { readonly _row?: Row },
|
|
91
|
+
options?: RuntimeExecuteOptions,
|
|
92
|
+
): AsyncIterableResult<Row>;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* The `service_role` db: the app-contract role-bound surface (its `.sql` / `.orm`
|
|
97
|
+
* are app-only, exactly like `asUser` / `asAnon`), plus a `.supabase` secondary
|
|
98
|
+
* root for the Supabase-internal namespaces.
|
|
99
|
+
*/
|
|
100
|
+
export type ServiceRoleDb<TContract extends Contract<SqlStorage>> = RoleBoundDb<TContract> & {
|
|
101
|
+
readonly supabase: SupabaseInternalDb;
|
|
102
|
+
};
|
|
103
|
+
|
|
74
104
|
export interface SupabaseDb<TContract extends Contract<SqlStorage>> {
|
|
75
105
|
readonly context: ExecutionContext<TContract>;
|
|
76
106
|
readonly stack: SqlExecutionStackWithDriver<SupabaseTargetId>;
|
|
77
107
|
asUser(jwt: string): Promise<RoleBoundDb<TContract>>;
|
|
78
108
|
asAnon(): RoleBoundDb<TContract>;
|
|
79
|
-
asServiceRole():
|
|
109
|
+
asServiceRole(): ServiceRoleDb<TContract>;
|
|
80
110
|
close(): Promise<void>;
|
|
81
111
|
[Symbol.asyncDispose](): Promise<void>;
|
|
82
112
|
}
|
|
@@ -199,6 +229,20 @@ function withSupabaseDescriptor(
|
|
|
199
229
|
: [...packs, supabaseRuntimeDescriptor];
|
|
200
230
|
}
|
|
201
231
|
|
|
232
|
+
/**
|
|
233
|
+
* Deserializes the Supabase extension's own emitted contract into a runtime
|
|
234
|
+
* contract: namespaces hydrate into `PostgresSchema` instances (with
|
|
235
|
+
* `qualifyTable`), and `typeRef` columns (`Timestamptz`, `Uuid`) resolve
|
|
236
|
+
* through the codec registry. Exposed only via `service_role`'s `.supabase`
|
|
237
|
+
* secondary root — never merged into the app contract.
|
|
238
|
+
*/
|
|
239
|
+
function buildExtensionContract(): SupabaseExtensionContract {
|
|
240
|
+
return blindCast<
|
|
241
|
+
SupabaseExtensionContract,
|
|
242
|
+
'deserializeContract hydrates JSON namespaces into PostgresSchema instances with qualifyTable'
|
|
243
|
+
>(contractSerializer.deserializeContract(extensionContractJson));
|
|
244
|
+
}
|
|
245
|
+
|
|
202
246
|
export default async function supabase<TContract extends Contract<SqlStorage>>(
|
|
203
247
|
options: SupabaseOptionsWithContract<TContract>,
|
|
204
248
|
): Promise<SupabaseDb<TContract>>;
|
|
@@ -256,18 +300,20 @@ export default async function supabase<TContract extends Contract<SqlStorage>>(
|
|
|
256
300
|
}
|
|
257
301
|
}
|
|
258
302
|
|
|
259
|
-
function
|
|
260
|
-
|
|
261
|
-
|
|
303
|
+
function buildRoleBoundDbWithContext<C extends Contract<SqlStorage>>(
|
|
304
|
+
binding: SupabaseRoleBinding,
|
|
305
|
+
roleContext: ExecutionContext<C>,
|
|
306
|
+
roleRuntime: SupabaseRuntime & SupabaseRuntimeImpl<C>,
|
|
307
|
+
): RoleBoundDb<C> {
|
|
308
|
+
const roleSql: Db<C> = sql<C>({ context: roleContext, rawCodecInferer });
|
|
309
|
+
const roleOrm: OrmClient<C> = orm({
|
|
262
310
|
runtime: {
|
|
263
311
|
execute(plan) {
|
|
264
|
-
return
|
|
312
|
+
return roleRuntime.executeWithRole(plan, binding);
|
|
265
313
|
},
|
|
266
|
-
|
|
267
|
-
// operations (mutations, includes) — every statement runs role-bound.
|
|
268
|
-
connection: () => runtime.openRoleSession(binding),
|
|
314
|
+
connection: () => roleRuntime.openRoleSession(binding),
|
|
269
315
|
},
|
|
270
|
-
context,
|
|
316
|
+
context: roleContext,
|
|
271
317
|
});
|
|
272
318
|
|
|
273
319
|
return {
|
|
@@ -278,14 +324,57 @@ export default async function supabase<TContract extends Contract<SqlStorage>>(
|
|
|
278
324
|
plan: (SqlExecutionPlan<Row> | SqlQueryPlan<Row>) & { readonly _row?: Row },
|
|
279
325
|
execOptions?: RuntimeExecuteOptions,
|
|
280
326
|
): AsyncIterableResult<Row> {
|
|
281
|
-
return
|
|
327
|
+
return roleRuntime.executeWithRole<Row>(plan, binding, execOptions);
|
|
282
328
|
},
|
|
283
329
|
transaction<R>(fn: (tx: TransactionContext) => PromiseLike<R>): Promise<R> {
|
|
284
|
-
return withTransaction({ connection: () =>
|
|
330
|
+
return withTransaction({ connection: () => roleRuntime.openRoleSession(binding) }, fn);
|
|
285
331
|
},
|
|
286
332
|
};
|
|
287
333
|
}
|
|
288
334
|
|
|
335
|
+
function buildRoleBoundDb(binding: SupabaseRoleBinding): RoleBoundDb<TContract> {
|
|
336
|
+
return buildRoleBoundDbWithContext(binding, context, runtime);
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
const serviceRoleBinding: SupabaseRoleBinding = { role: 'service_role', claims: {} };
|
|
340
|
+
|
|
341
|
+
// The Supabase-internal contract (auth/storage) as a separate secondary root.
|
|
342
|
+
// It is contract-bound: a plan built against it carries the extension's
|
|
343
|
+
// storageHash, so it must run on a runtime bound to the extension contract —
|
|
344
|
+
// the app runtime would reject it (PLAN.HASH_MISMATCH). This runtime shares
|
|
345
|
+
// the same driver (one pool, no second connection) and disables marker
|
|
346
|
+
// verification: the extension contract is external and owns no app-space
|
|
347
|
+
// marker, so its hashes must not be checked against the DB marker.
|
|
348
|
+
const extContract = buildExtensionContract();
|
|
349
|
+
const extContext = createExecutionContext({ contract: extContract, stack });
|
|
350
|
+
const extRuntime: SupabaseRuntime & SupabaseRuntimeImpl<SupabaseExtensionContract> =
|
|
351
|
+
new SupabaseRuntimeImpl({
|
|
352
|
+
context: extContext,
|
|
353
|
+
adapter: stackInstance.adapter,
|
|
354
|
+
driver,
|
|
355
|
+
verifyMarker: false,
|
|
356
|
+
...ifDefined('middleware', options.middleware),
|
|
357
|
+
});
|
|
358
|
+
|
|
359
|
+
const supabaseInternal: SupabaseInternalDb = {
|
|
360
|
+
sql: sql<SupabaseExtensionContract>({ context: extContext, rawCodecInferer }),
|
|
361
|
+
orm: orm({
|
|
362
|
+
runtime: {
|
|
363
|
+
execute(plan) {
|
|
364
|
+
return extRuntime.executeWithRole(plan, serviceRoleBinding);
|
|
365
|
+
},
|
|
366
|
+
connection: () => extRuntime.openRoleSession(serviceRoleBinding),
|
|
367
|
+
},
|
|
368
|
+
context: extContext,
|
|
369
|
+
}),
|
|
370
|
+
execute<Row>(
|
|
371
|
+
plan: (SqlExecutionPlan<Row> | SqlQueryPlan<Row>) & { readonly _row?: Row },
|
|
372
|
+
execOptions?: RuntimeExecuteOptions,
|
|
373
|
+
): AsyncIterableResult<Row> {
|
|
374
|
+
return extRuntime.executeWithRole<Row>(plan, serviceRoleBinding, execOptions);
|
|
375
|
+
},
|
|
376
|
+
};
|
|
377
|
+
|
|
289
378
|
async function closeDb(): Promise<void> {
|
|
290
379
|
if (closed) return;
|
|
291
380
|
closed = true;
|
|
@@ -315,8 +404,9 @@ export default async function supabase<TContract extends Contract<SqlStorage>>(
|
|
|
315
404
|
return buildRoleBoundDb({ role: 'anon', claims: {} });
|
|
316
405
|
},
|
|
317
406
|
|
|
318
|
-
asServiceRole():
|
|
319
|
-
|
|
407
|
+
asServiceRole(): ServiceRoleDb<TContract> {
|
|
408
|
+
const roleBound = buildRoleBoundDbWithContext(serviceRoleBinding, context, runtime);
|
|
409
|
+
return { ...roleBound, supabase: supabaseInternal };
|
|
320
410
|
},
|
|
321
411
|
|
|
322
412
|
close: closeDb,
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"package-BLmWYNvr.mjs","names":[],"sources":["../package.json"],"sourcesContent":[""],"mappings":""}
|