@yielded/auth-persistence-drizzle 0.1.0-beta.17 → 0.1.0-beta.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -1
- package/dist/D1.d.mts +120 -120
- package/dist/Libsql.d.mts +154 -154
- package/dist/Mysql2.d.mts +166 -166
- package/dist/Pglite.d.mts +166 -166
- package/dist/Postgres.d.mts +152 -152
- package/dist/SqliteBun.d.mts +168 -168
- package/dist/SqliteDo.d.mts +237 -259
- package/dist/SqliteDo.mjs +30 -45
- package/dist/SqliteDo.mjs.map +1 -1
- package/dist/SqliteNode.d.mts +154 -154
- package/dist/SqliteWasm.d.mts +163 -163
- package/dist/drizzle/crypto.mjs +11 -0
- package/dist/drizzle/crypto.mjs.map +1 -0
- package/dist/drizzle/d1-identity.mjs +2 -2
- package/dist/drizzle/d1-identity.mjs.map +1 -1
- package/dist/drizzle/d1-oauth.d.mts +16 -16
- package/dist/drizzle/d1-oauth.mjs.map +1 -1
- package/dist/drizzle/d1-passkey.d.mts +6 -6
- package/dist/drizzle/d1-passkey.mjs.map +1 -1
- package/dist/drizzle/d1-password-prepared.mjs +3 -3
- package/dist/drizzle/d1-password-prepared.mjs.map +1 -1
- package/dist/drizzle/d1-passwords.d.mts +1 -1
- package/dist/drizzle/d1-passwords.mjs +1 -1
- package/dist/drizzle/d1-passwords.mjs.map +1 -1
- package/dist/drizzle/d1-phone.d.mts +3 -3
- package/dist/drizzle/d1-phone.mjs.map +1 -1
- package/dist/drizzle/d1-proofs.d.mts +1 -1
- package/dist/drizzle/d1-sessions.d.mts +1 -1
- package/dist/drizzle/d1-sessions.mjs +4 -3
- package/dist/drizzle/d1-sessions.mjs.map +1 -1
- package/dist/drizzle/d1-totp.d.mts +3 -3
- package/dist/drizzle/d1-totp.mjs.map +1 -1
- package/dist/drizzle/mysql-identity.mjs +2 -2
- package/dist/drizzle/mysql-identity.mjs.map +1 -1
- package/dist/drizzle/oauth-accounts.mjs +9 -8
- package/dist/drizzle/oauth-accounts.mjs.map +1 -1
- package/dist/drizzle/oauth-connected-collection.mjs +1 -1
- package/dist/drizzle/oauth-connected-collection.mjs.map +1 -1
- package/dist/drizzle/oauth-connected-custody.mjs +5 -4
- package/dist/drizzle/oauth-connected-custody.mjs.map +1 -1
- package/dist/drizzle/oauth-connected-drivers.mjs.map +1 -1
- package/dist/drizzle/oauth-connected-flow.mjs +8 -7
- package/dist/drizzle/oauth-connected-flow.mjs.map +1 -1
- package/dist/drizzle/oauth-connected-management.mjs +3 -2
- package/dist/drizzle/oauth-connected-management.mjs.map +1 -1
- package/dist/drizzle/oauth-connected-reference.mjs +8 -4
- package/dist/drizzle/oauth-connected-reference.mjs.map +1 -1
- package/dist/drizzle/oauth-connected-settlement.mjs +4 -4
- package/dist/drizzle/oauth-connected-settlement.mjs.map +1 -1
- package/dist/drizzle/oauth-connected-sign-in.mjs +11 -10
- package/dist/drizzle/oauth-connected-sign-in.mjs.map +1 -1
- package/dist/drizzle/oauth-connected-state.d.mts +265 -265
- package/dist/drizzle/oauth-connected-state.mjs +23 -20
- package/dist/drizzle/oauth-connected-state.mjs.map +1 -1
- package/dist/drizzle/oauth-connected-target.d.mts +105 -105
- package/dist/drizzle/oauth-connected-target.mjs.map +1 -1
- package/dist/drizzle/oauth-drivers.mjs.map +1 -1
- package/dist/drizzle/oauth-flow.mjs +1 -1
- package/dist/drizzle/oauth-flow.mjs.map +1 -1
- package/dist/drizzle/oauth-model.d.mts +4 -4
- package/dist/drizzle/oauth-model.mjs.map +1 -1
- package/dist/drizzle/oauth-registration.mjs +2 -2
- package/dist/drizzle/oauth-registration.mjs.map +1 -1
- package/dist/drizzle/oauth-state.mjs +11 -12
- package/dist/drizzle/oauth-state.mjs.map +1 -1
- package/dist/drizzle/oauth-target.d.mts +4 -4
- package/dist/drizzle/oauth-target.mjs.map +1 -1
- package/dist/drizzle/passkey-drivers.mjs.map +1 -1
- package/dist/drizzle/passkey-write-drivers.mjs.map +1 -1
- package/dist/drizzle/passkey-write-target.d.mts +1 -1
- package/dist/drizzle/password-prepared-sql.mjs +1 -1
- package/dist/drizzle/password-prepared-sql.mjs.map +1 -1
- package/dist/drizzle/password-prepared-state.mjs +1 -1
- package/dist/drizzle/pg-identity.mjs +2 -2
- package/dist/drizzle/pg-identity.mjs.map +1 -1
- package/dist/drizzle/phone-model.d.mts +2 -2
- package/dist/drizzle/phone-model.mjs +3 -3
- package/dist/drizzle/phone-model.mjs.map +1 -1
- package/dist/drizzle/phone-target.d.mts +1 -1
- package/dist/drizzle/phone-target.mjs +2 -2
- package/dist/drizzle/phone-target.mjs.map +1 -1
- package/dist/drizzle/sqlite-do-database.d.mts +29 -0
- package/dist/drizzle/sqlite-do-database.mjs +45 -0
- package/dist/drizzle/sqlite-do-database.mjs.map +1 -0
- package/dist/drizzle/sqlite-emails.mjs.map +1 -1
- package/dist/drizzle/sqlite-identity.mjs +2 -2
- package/dist/drizzle/sqlite-identity.mjs.map +1 -1
- package/dist/drizzle/sqlite-passwords.mjs.map +1 -1
- package/dist/drizzle/sqlite-proofs.mjs.map +1 -1
- package/dist/drizzle/sqlite-sessions.mjs.map +1 -1
- package/dist/drizzle/storage-validation.mjs +17 -9
- package/dist/drizzle/storage-validation.mjs.map +1 -1
- package/dist/drizzle/totp-state.mjs +8 -8
- package/dist/drizzle/totp-state.mjs.map +1 -1
- package/dist/drizzle/totp-target.d.mts +1 -1
- package/dist/drizzle/totp-target.mjs +2 -2
- package/dist/drizzle/totp-target.mjs.map +1 -1
- package/package.json +1 -1
- package/src/SqliteDo.ts +63 -70
- package/src/drizzle/crypto.ts +14 -0
- package/src/drizzle/d1-identity.ts +2 -2
- package/src/drizzle/d1-oauth.ts +14 -5
- package/src/drizzle/d1-passkey.ts +5 -1
- package/src/drizzle/d1-password-prepared.ts +11 -5
- package/src/drizzle/d1-passwords.ts +1 -1
- package/src/drizzle/d1-phone.ts +2 -1
- package/src/drizzle/d1-sessions.ts +8 -2
- package/src/drizzle/d1-totp.ts +6 -2
- package/src/drizzle/mysql-identity.ts +2 -2
- package/src/drizzle/oauth-accounts.ts +14 -13
- package/src/drizzle/oauth-connected-collection.ts +1 -1
- package/src/drizzle/oauth-connected-custody.ts +8 -6
- package/src/drizzle/oauth-connected-drivers.ts +9 -3
- package/src/drizzle/oauth-connected-flow.ts +6 -6
- package/src/drizzle/oauth-connected-management.ts +1 -1
- package/src/drizzle/oauth-connected-reference.ts +14 -9
- package/src/drizzle/oauth-connected-settlement.ts +4 -4
- package/src/drizzle/oauth-connected-sign-in.ts +11 -10
- package/src/drizzle/oauth-connected-state.ts +40 -25
- package/src/drizzle/oauth-connected-target.ts +9 -5
- package/src/drizzle/oauth-drivers.ts +13 -5
- package/src/drizzle/oauth-flow.ts +1 -1
- package/src/drizzle/oauth-model.ts +4 -4
- package/src/drizzle/oauth-registration.ts +2 -2
- package/src/drizzle/oauth-state.ts +17 -15
- package/src/drizzle/oauth-target.ts +11 -3
- package/src/drizzle/passkey-drivers.ts +7 -3
- package/src/drizzle/passkey-write-drivers.ts +11 -2
- package/src/drizzle/password-prepared-sql.ts +1 -1
- package/src/drizzle/pg-identity.ts +2 -2
- package/src/drizzle/phone-model.ts +3 -3
- package/src/drizzle/phone-target.ts +11 -4
- package/src/drizzle/sqlite-do-database.ts +87 -0
- package/src/drizzle/sqlite-emails.ts +1 -1
- package/src/drizzle/sqlite-identity.ts +2 -2
- package/src/drizzle/sqlite-passwords.ts +1 -1
- package/src/drizzle/sqlite-proofs.ts +2 -2
- package/src/drizzle/sqlite-sessions.ts +2 -2
- package/src/drizzle/storage-validation.ts +15 -6
- package/src/drizzle/totp-state.ts +8 -8
- package/src/drizzle/totp-target.ts +11 -5
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Crypto, Effect } from "effect";
|
|
2
|
+
import { Base64Url } from "effect/encoding";
|
|
3
|
+
import { TokenDigest } from "@yielded/auth/Schema";
|
|
4
|
+
//#region src/drizzle/crypto.ts
|
|
5
|
+
const encoder = new TextEncoder();
|
|
6
|
+
const randomId = Effect.flatMap(Crypto.Crypto, (crypto) => crypto.randomBytes(32).pipe(Effect.map(Base64Url.encode)));
|
|
7
|
+
const digest = (value) => Effect.flatMap(Crypto.Crypto, (crypto) => crypto.digest("SHA-256", encoder.encode(value))).pipe(Effect.map((bytes) => TokenDigest.make(Base64Url.encode(bytes))));
|
|
8
|
+
//#endregion
|
|
9
|
+
export { digest, randomId };
|
|
10
|
+
|
|
11
|
+
//# sourceMappingURL=crypto.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crypto.mjs","names":[],"sources":["../../src/drizzle/crypto.ts"],"sourcesContent":["import { TokenDigest } from \"@yielded/auth/Schema\";\nimport { Crypto, Effect } from \"effect\";\nimport { Base64Url } from \"effect/encoding\";\n\nconst encoder = new TextEncoder();\n\nexport const randomId = Effect.flatMap(Crypto.Crypto, (crypto) =>\n crypto.randomBytes(32).pipe(Effect.map(Base64Url.encode)),\n);\n\nexport const digest = (value: string) =>\n Effect.flatMap(Crypto.Crypto, (crypto) => crypto.digest(\"SHA-256\", encoder.encode(value))).pipe(\n Effect.map((bytes) => TokenDigest.make(Base64Url.encode(bytes))),\n );\n"],"mappings":";;;;AAIA,MAAM,UAAU,IAAI,YAAY;AAEhC,MAAa,WAAW,OAAO,QAAQ,OAAO,SAAS,WACrD,OAAO,YAAY,EAAE,CAAC,CAAC,KAAK,OAAO,IAAI,UAAU,MAAM,CAAC,CAC1D;AAEA,MAAa,UAAU,UACrB,OAAO,QAAQ,OAAO,SAAS,WAAW,OAAO,OAAO,WAAW,QAAQ,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,KACzF,OAAO,KAAK,UAAU,YAAY,KAAK,UAAU,OAAO,KAAK,CAAC,CAAC,CACjE"}
|
|
@@ -2,7 +2,7 @@ import { column, isMappedConstraintConflict, provisioningFingerprint } from "./m
|
|
|
2
2
|
import { validateDrizzleStorage } from "./storage-validation.mjs";
|
|
3
3
|
import { Database } from "./d1-database.mjs";
|
|
4
4
|
import { nativeDatabase } from "./native-database.mjs";
|
|
5
|
-
import { NativeDatabase } from "@yielded/auth-persistence/Adapter";
|
|
5
|
+
import { NativeDatabase, withStorageValidation } from "@yielded/auth-persistence/Adapter";
|
|
6
6
|
import { ExternalIdentityMutation, IdentityConflict, IdentityUnavailable, SubjectProvisioned, SubjectProvisioner } from "@yielded/auth/Identity";
|
|
7
7
|
import { SQL, and, eq, getTableColumns, is, sql } from "drizzle-orm";
|
|
8
8
|
import { Cause, Effect, Schema } from "effect";
|
|
@@ -121,7 +121,7 @@ const makeD1IdentityServices = Effect.fnUntraced(function* (mapping) {
|
|
|
121
121
|
...yield* makeD1SubjectProvisioningServices(mapping),
|
|
122
122
|
...yield* makeD1ExternalIdentityServices(mapping)
|
|
123
123
|
};
|
|
124
|
-
});
|
|
124
|
+
}, withStorageValidation);
|
|
125
125
|
//#endregion
|
|
126
126
|
export { makeD1ExternalIdentityServices, makeD1IdentityServices, makeD1SubjectProvisioningServices };
|
|
127
127
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"d1-identity.mjs","names":["DatabaseService"],"sources":["../../src/drizzle/d1-identity.ts"],"sourcesContent":["import type { D1Client } from \"@effect/sql-d1/D1Client\";\nimport { NativeDatabase } from \"@yielded/auth-persistence/Adapter\";\nimport {\n ExternalIdentityMutation,\n type ExternalIdentity,\n IdentityConflict,\n IdentityUnavailable,\n SubjectProvisioned,\n SubjectProvisioner,\n type SubjectProvisioningInput,\n} from \"@yielded/auth/Identity\";\nimport { reportPersistenceFailure } from \"@yielded/auth/Persistence\";\nimport type { SubjectId } from \"@yielded/auth/Schema\";\n/* oxlint-disable no-explicit-any -- D1 batch bridges Drizzle SQL objects to Effect SQL Statements at this adapter boundary. */\nimport {\n and,\n eq,\n getTableColumns,\n is,\n sql,\n SQL,\n type InferInsertModel,\n type Table,\n} from \"drizzle-orm\";\nimport type { EffectSQLiteD1Database } from \"drizzle-orm/effect-d1\";\nimport type { AnySQLiteTable, SQLiteColumn } from \"drizzle-orm/sqlite-core\";\nimport { Cause, Effect, Schema } from \"effect\";\n\nimport { Database as DatabaseService } from \"./d1-database\";\nimport {\n column,\n isMappedConstraintConflict,\n provisioningFingerprint,\n type D1ExternalIdentityMapping,\n type D1GeneratedIdentityMapping,\n type D1SubjectProvisioningMapping,\n} from \"./model\";\nimport { nativeDatabase } from \"./native-database\";\nimport { validateDrizzleStorage } from \"./storage-validation\";\n\ntype RuntimeDatabase = EffectSQLiteD1Database<any> & { readonly $client: D1Client };\nconst unavailable = () => IdentityUnavailable.make();\nconst isIdentityFailure = Schema.is(Schema.Union([IdentityConflict, IdentityUnavailable]));\n\nconst mapUnavailable = <A, E, R>(effect: Effect.Effect<A, E, R>) =>\n reportPersistenceFailure(effect, isIdentityFailure).pipe(\n Effect.catchCause((cause) =>\n Effect.failCause(\n Cause.map(cause, (error) => (isIdentityFailure(error) ? error : unavailable())),\n ),\n ),\n );\n\nconst selectFields = <T extends Table>(\n table: T,\n values: InferInsertModel<T>,\n): Record<string, unknown> => {\n const columns = getTableColumns(table) as Record<string, SQLiteColumn>;\n\n const fields = Object.fromEntries(\n Object.entries(values)\n .filter(([, value]) => value !== undefined)\n .map(([key, value]) => [\n key,\n is(value, SQL) ? value : sql`${sql.param(value, columns[key] as SQLiteColumn)}`,\n ]),\n );\n\n for (const [key, mapped] of Object.entries(columns)) {\n if (\n fields[key] !== undefined ||\n (\n mapped as SQLiteColumn & { readonly shouldDisableInsert: () => boolean }\n ).shouldDisableInsert()\n )\n continue;\n if (mapped.default !== null && mapped.default !== undefined) continue;\n\n const value =\n mapped.defaultFn !== undefined\n ? mapped.defaultFn()\n : !mapped.default && mapped.onUpdateFn !== undefined\n ? mapped.onUpdateFn()\n : undefined;\n\n if (value !== undefined || mapped.defaultFn !== undefined || mapped.onUpdateFn !== undefined)\n fields[key] = is(value, SQL) ? value : sql`${sql.param(value, mapped)}`;\n }\n\n return fields;\n};\n\n/**\n * D1 provisioning is an ordered atomic batch. The receipt captures the\n * database-generated subject id from the first insert via last_insert_rowid;\n * the optional identifier then reads that stable id from the receipt.\n */\nexport const makeD1SubjectProvisioningServices = Effect.fnUntraced(function* <\n Subject extends AnySQLiteTable,\n Identifier extends AnySQLiteTable,\n Request extends AnySQLiteTable,\n NativeId,\n>(mapping: D1SubjectProvisioningMapping<Subject, Identifier, Request, NativeId>) {\n const database = yield* DatabaseService;\n\n yield* validateDrizzleStorage(mapping).pipe(\n Effect.provideServiceEffect(NativeDatabase, nativeDatabase(DatabaseService)),\n Effect.mapError(() => IdentityUnavailable.make()),\n );\n\n const db = database as RuntimeDatabase;\n const requestTable = mapping.provisioningRequest.table;\n\n const requestIdColumn = column(\n requestTable,\n mapping.provisioningRequest.requestId,\n ) as SQLiteColumn;\n\n const requestFingerprintColumn = column(\n requestTable,\n mapping.provisioningRequest.fingerprint,\n ) as SQLiteColumn;\n\n const requestSubjectColumn = column(\n requestTable,\n mapping.provisioningRequest.subjectId,\n ) as SQLiteColumn;\n\n const findReceipt = Effect.fn(\"DrizzleD1Identity.findReceipt\")(function* (requestId: string) {\n const rows = yield* db\n .select({ fingerprint: requestFingerprintColumn, subjectId: requestSubjectColumn })\n .from(requestTable as any)\n .where(eq(requestIdColumn, requestId))\n .limit(1);\n\n return rows[0];\n });\n\n const provision = Effect.fn(\"DrizzleD1Identity.provision\")(function* (\n input: SubjectProvisioningInput,\n ) {\n const fingerprint = provisioningFingerprint(input);\n const existing = yield* findReceipt(input.requestId);\n\n if (existing !== undefined) {\n if (existing.fingerprint !== fingerprint) return yield* IdentityConflict.make();\n const subjectId = yield* mapping.subjectId.toSubject(existing.subjectId as NativeId);\n\n return SubjectProvisioned.make({ subjectId });\n }\n\n const allocated =\n mapping.subject.allocateId === undefined\n ? mapping.subject.allocateIdSync?.()\n : yield* mapping.subject.allocateId;\n\n const subjectQuery = db\n .insert(mapping.subject.table as any)\n .values(mapping.subject.encodeInsert(input, allocated) as any)\n .toSQL();\n\n const statements = [db.$client.unsafe(subjectQuery.sql, subjectQuery.params)];\n\n if (allocated !== undefined) {\n const requestQuery = db\n .insert(requestTable as any)\n .values(\n mapping.provisioningRequest.encodeInsert(input.requestId, fingerprint, allocated) as any,\n )\n .toSQL();\n\n statements.push(db.$client.unsafe(requestQuery.sql, requestQuery.params));\n\n if (input.identifier !== undefined) {\n const identifierQuery = db\n .insert(mapping.identifier.table as any)\n .values(\n mapping.identifier.encodeInsert(input.identifier, allocated, input.verifiedAt) as any,\n )\n .toSQL();\n\n statements.push(db.$client.unsafe(identifierQuery.sql, identifierQuery.params));\n }\n } else {\n if (mapping.d1.generatedRowIdAlias === undefined) return yield* unavailable();\n\n const mappedColumnNames = Object.values(getTableColumns(mapping.subject.table)).map((value) =>\n value.name.toLowerCase(),\n );\n\n if (mappedColumnNames.includes(mapping.d1.generatedRowIdAlias.toLowerCase()))\n return yield* unavailable();\n const subjectIdColumn = column(mapping.subject.table, mapping.subject.id);\n const rowId = sql.identifier(mapping.d1.generatedRowIdAlias);\n\n const requestQuery = db\n .insert(requestTable as any)\n .values({\n ...mapping.d1.requestInsertWithoutSubject(input.requestId, fingerprint),\n [mapping.provisioningRequest.subjectId]:\n sql`(select ${subjectIdColumn} from ${mapping.subject.table} where ${rowId} = last_insert_rowid())`,\n } as any)\n .toSQL();\n\n statements.push(db.$client.unsafe(requestQuery.sql, requestQuery.params));\n }\n\n if (allocated === undefined && input.identifier !== undefined) {\n const requestIdParam = sql.param(input.requestId, requestIdColumn);\n\n const identifierQuery = db\n .insert(mapping.identifier.table as any)\n .values({\n ...mapping.d1.identifierInsertWithoutSubject(input.identifier, input.verifiedAt),\n [mapping.identifier.subjectId]:\n sql`(select ${requestSubjectColumn} from ${requestTable} where ${requestIdColumn} = ${requestIdParam})`,\n } as any)\n .toSQL();\n\n statements.push(db.$client.unsafe(identifierQuery.sql, identifierQuery.params));\n }\n const attempt = db.$client.batch(statements);\n\n yield* attempt.pipe(\n Effect.catchCause(\n (\n cause,\n ): Effect.Effect<\n void,\n | Effect.Error<typeof attempt>\n | Effect.Error<ReturnType<typeof findReceipt>>\n | IdentityConflict\n > => {\n if (\n cause.reasons.length === 0 ||\n !cause.reasons.every(\n (reason) =>\n Cause.isFailReason(reason) &&\n isMappedConstraintConflict(mapping.isConstraintConflict, reason.error),\n )\n )\n return Effect.failCause(cause);\n\n return findReceipt(input.requestId).pipe(\n Effect.flatMap((receipt) =>\n receipt !== undefined && receipt.fingerprint === fingerprint\n ? Effect.void\n : IdentityConflict.make(),\n ),\n );\n },\n ),\n );\n const receipt = yield* findReceipt(input.requestId);\n\n if (receipt === undefined || receipt.fingerprint !== fingerprint)\n return yield* IdentityConflict.make();\n const subjectId = yield* mapping.subjectId.toSubject(receipt.subjectId as NativeId);\n\n return SubjectProvisioned.make({ subjectId });\n }, mapUnavailable);\n\n return { subjectProvisioner: SubjectProvisioner.of({ provision }) } as const;\n});\n\nexport const makeD1ExternalIdentityServices = Effect.fnUntraced(function* <\n Subject extends AnySQLiteTable,\n External extends AnySQLiteTable,\n NativeId,\n>(mapping: D1ExternalIdentityMapping<Subject, External, NativeId>) {\n const database = yield* DatabaseService;\n\n yield* validateDrizzleStorage(mapping).pipe(\n Effect.provideServiceEffect(NativeDatabase, nativeDatabase(DatabaseService)),\n Effect.mapError(() => IdentityUnavailable.make()),\n );\n\n const db = database as RuntimeDatabase;\n const externalTable = mapping.externalIdentity.table;\n\n const externalSubjectIdColumn = column(\n externalTable,\n mapping.externalIdentity.subjectId,\n ) as SQLiteColumn;\n\n const externalProviderColumn = column(\n externalTable,\n mapping.externalIdentity.provider,\n ) as SQLiteColumn;\n\n const externalIssuerColumn = column(\n externalTable,\n mapping.externalIdentity.issuer,\n ) as SQLiteColumn;\n\n const externalSubjectColumn = column(\n externalTable,\n mapping.externalIdentity.subject,\n ) as SQLiteColumn;\n\n const bind = Effect.fn(\"DrizzleD1Identity.bindExternalIdentity\")(function* (\n subjectId: SubjectId,\n identity: ExternalIdentity,\n ) {\n const nativeId = yield* mapping.subjectId.toNative(subjectId);\n const subjectIdColumn = column(mapping.subject.table, mapping.subject.id);\n const subjectStatusColumn = column(mapping.subject.table, mapping.subject.status);\n const nativeIdParam = sql.param(nativeId, subjectIdColumn);\n const activeStatusParam = sql.param(mapping.d1.activeStatusValue, subjectStatusColumn);\n\n const selection = selectFields(\n externalTable,\n mapping.externalIdentity.encodeInsert(identity, nativeId),\n );\n\n selection[mapping.externalIdentity.subjectId] = subjectIdColumn;\n\n const inserted = yield* db\n .insert(externalTable as any)\n .select(\n db\n .select(selection as any)\n .from(mapping.subject.table as any)\n .where(\n and(eq(subjectIdColumn, nativeIdParam), eq(subjectStatusColumn, activeStatusParam)),\n ) as any,\n )\n .returning({ subjectId: externalSubjectIdColumn })\n .pipe(\n Effect.catchCause((cause) => {\n if (\n cause.reasons.length === 0 ||\n !cause.reasons.every(\n (reason) =>\n Cause.isFailReason(reason) &&\n isMappedConstraintConflict(mapping.isConstraintConflict, reason.error),\n )\n )\n return Effect.failCause(cause);\n\n return db\n .select({ subjectId: externalSubjectIdColumn })\n .from(externalTable as any)\n .innerJoin(\n mapping.subject.table as any,\n and(\n eq(externalSubjectIdColumn, subjectIdColumn),\n eq(subjectStatusColumn, mapping.d1.activeStatusValue),\n ),\n )\n .where(\n and(\n eq(externalProviderColumn, identity.provider),\n eq(externalIssuerColumn, identity.issuer),\n eq(externalSubjectColumn, identity.subject),\n eq(externalSubjectIdColumn, nativeId),\n ),\n )\n .limit(1);\n }),\n );\n\n const row = inserted[0];\n\n if (row === undefined) return yield* IdentityConflict.make();\n const linked = row.subjectId as NativeId;\n\n if (!mapping.subjectId.equals(linked, nativeId)) return yield* IdentityConflict.make();\n }, mapUnavailable);\n\n return { externalIdentityMutation: ExternalIdentityMutation.of({ bind }) } as const;\n});\n\nexport const makeD1IdentityServices = Effect.fnUntraced(function* <\n Subject extends AnySQLiteTable,\n Identifier extends AnySQLiteTable,\n External extends AnySQLiteTable,\n Request extends AnySQLiteTable,\n NativeId,\n>(mapping: D1GeneratedIdentityMapping<Subject, Identifier, External, Request, NativeId>) {\n return {\n ...(yield* makeD1SubjectProvisioningServices(mapping)),\n ...(yield* makeD1ExternalIdentityServices(mapping)),\n };\n});\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"d1-identity.mjs","names":["DatabaseService"],"sources":["../../src/drizzle/d1-identity.ts"],"sourcesContent":["import type { D1Client } from \"@effect/sql-d1/D1Client\";\nimport { withStorageValidation, NativeDatabase } from \"@yielded/auth-persistence/Adapter\";\nimport {\n ExternalIdentityMutation,\n type ExternalIdentity,\n IdentityConflict,\n IdentityUnavailable,\n SubjectProvisioned,\n SubjectProvisioner,\n type SubjectProvisioningInput,\n} from \"@yielded/auth/Identity\";\nimport { reportPersistenceFailure } from \"@yielded/auth/Persistence\";\nimport type { SubjectId } from \"@yielded/auth/Schema\";\n/* oxlint-disable no-explicit-any -- D1 batch bridges Drizzle SQL objects to Effect SQL Statements at this adapter boundary. */\nimport {\n and,\n eq,\n getTableColumns,\n is,\n sql,\n SQL,\n type InferInsertModel,\n type Table,\n} from \"drizzle-orm\";\nimport type { EffectSQLiteD1Database } from \"drizzle-orm/effect-d1\";\nimport type { AnySQLiteTable, SQLiteColumn } from \"drizzle-orm/sqlite-core\";\nimport { Cause, Effect, Schema } from \"effect\";\n\nimport { Database as DatabaseService } from \"./d1-database\";\nimport {\n column,\n isMappedConstraintConflict,\n provisioningFingerprint,\n type D1ExternalIdentityMapping,\n type D1GeneratedIdentityMapping,\n type D1SubjectProvisioningMapping,\n} from \"./model\";\nimport { nativeDatabase } from \"./native-database\";\nimport { validateDrizzleStorage } from \"./storage-validation\";\n\ntype RuntimeDatabase = EffectSQLiteD1Database<any> & { readonly $client: D1Client };\nconst unavailable = () => IdentityUnavailable.make();\nconst isIdentityFailure = Schema.is(Schema.Union([IdentityConflict, IdentityUnavailable]));\n\nconst mapUnavailable = <A, E, R>(effect: Effect.Effect<A, E, R>) =>\n reportPersistenceFailure(effect, isIdentityFailure).pipe(\n Effect.catchCause((cause) =>\n Effect.failCause(\n Cause.map(cause, (error) => (isIdentityFailure(error) ? error : unavailable())),\n ),\n ),\n );\n\nconst selectFields = <T extends Table>(\n table: T,\n values: InferInsertModel<T>,\n): Record<string, unknown> => {\n const columns = getTableColumns(table) as Record<string, SQLiteColumn>;\n\n const fields = Object.fromEntries(\n Object.entries(values)\n .filter(([, value]) => value !== undefined)\n .map(([key, value]) => [\n key,\n is(value, SQL) ? value : sql`${sql.param(value, columns[key] as SQLiteColumn)}`,\n ]),\n );\n\n for (const [key, mapped] of Object.entries(columns)) {\n if (\n fields[key] !== undefined ||\n (\n mapped as SQLiteColumn & { readonly shouldDisableInsert: () => boolean }\n ).shouldDisableInsert()\n )\n continue;\n if (mapped.default !== null && mapped.default !== undefined) continue;\n\n const value =\n mapped.defaultFn !== undefined\n ? mapped.defaultFn()\n : !mapped.default && mapped.onUpdateFn !== undefined\n ? mapped.onUpdateFn()\n : undefined;\n\n if (value !== undefined || mapped.defaultFn !== undefined || mapped.onUpdateFn !== undefined)\n fields[key] = is(value, SQL) ? value : sql`${sql.param(value, mapped)}`;\n }\n\n return fields;\n};\n\n/**\n * D1 provisioning is an ordered atomic batch. The receipt captures the\n * database-generated subject id from the first insert via last_insert_rowid;\n * the optional identifier then reads that stable id from the receipt.\n */\nexport const makeD1SubjectProvisioningServices = Effect.fnUntraced(function* <\n Subject extends AnySQLiteTable,\n Identifier extends AnySQLiteTable,\n Request extends AnySQLiteTable,\n NativeId,\n>(mapping: D1SubjectProvisioningMapping<Subject, Identifier, Request, NativeId>) {\n const database = yield* DatabaseService;\n\n yield* validateDrizzleStorage(mapping).pipe(\n Effect.provideServiceEffect(NativeDatabase, nativeDatabase(DatabaseService)),\n Effect.mapError(() => IdentityUnavailable.make()),\n );\n\n const db = database as RuntimeDatabase;\n const requestTable = mapping.provisioningRequest.table;\n\n const requestIdColumn = column(\n requestTable,\n mapping.provisioningRequest.requestId,\n ) as SQLiteColumn;\n\n const requestFingerprintColumn = column(\n requestTable,\n mapping.provisioningRequest.fingerprint,\n ) as SQLiteColumn;\n\n const requestSubjectColumn = column(\n requestTable,\n mapping.provisioningRequest.subjectId,\n ) as SQLiteColumn;\n\n const findReceipt = Effect.fn(\"DrizzleD1Identity.findReceipt\")(function* (requestId: string) {\n const rows = yield* db\n .select({ fingerprint: requestFingerprintColumn, subjectId: requestSubjectColumn })\n .from(requestTable as any)\n .where(eq(requestIdColumn, requestId))\n .limit(1);\n\n return rows[0];\n });\n\n const provision = Effect.fn(\"DrizzleD1Identity.provision\")(function* (\n input: SubjectProvisioningInput,\n ) {\n const fingerprint = provisioningFingerprint(input);\n const existing = yield* findReceipt(input.requestId);\n\n if (existing !== undefined) {\n if (existing.fingerprint !== fingerprint) return yield* IdentityConflict.make();\n const subjectId = yield* mapping.subjectId.toSubject(existing.subjectId as NativeId);\n\n return SubjectProvisioned.make({ subjectId });\n }\n\n const allocated =\n mapping.subject.allocateId === undefined\n ? mapping.subject.allocateIdSync?.()\n : yield* mapping.subject.allocateId;\n\n const subjectQuery = db\n .insert(mapping.subject.table as any)\n .values(mapping.subject.encodeInsert(input, allocated) as any)\n .toSQL();\n\n const statements = [db.$client.unsafe(subjectQuery.sql, subjectQuery.params)];\n\n if (allocated !== undefined) {\n const requestQuery = db\n .insert(requestTable as any)\n .values(\n mapping.provisioningRequest.encodeInsert(input.requestId, fingerprint, allocated) as any,\n )\n .toSQL();\n\n statements.push(db.$client.unsafe(requestQuery.sql, requestQuery.params));\n\n if (input.identifier !== undefined) {\n const identifierQuery = db\n .insert(mapping.identifier.table as any)\n .values(\n mapping.identifier.encodeInsert(input.identifier, allocated, input.verifiedAt) as any,\n )\n .toSQL();\n\n statements.push(db.$client.unsafe(identifierQuery.sql, identifierQuery.params));\n }\n } else {\n if (mapping.d1.generatedRowIdAlias === undefined) return yield* unavailable();\n\n const mappedColumnNames = Object.values(getTableColumns(mapping.subject.table)).map((value) =>\n value.name.toLowerCase(),\n );\n\n if (mappedColumnNames.includes(mapping.d1.generatedRowIdAlias.toLowerCase()))\n return yield* unavailable();\n const subjectIdColumn = column(mapping.subject.table, mapping.subject.id);\n const rowId = sql.identifier(mapping.d1.generatedRowIdAlias);\n\n const requestQuery = db\n .insert(requestTable as any)\n .values({\n ...mapping.d1.requestInsertWithoutSubject(input.requestId, fingerprint),\n [mapping.provisioningRequest.subjectId]:\n sql`(select ${subjectIdColumn} from ${mapping.subject.table} where ${rowId} = last_insert_rowid())`,\n } as any)\n .toSQL();\n\n statements.push(db.$client.unsafe(requestQuery.sql, requestQuery.params));\n }\n\n if (allocated === undefined && input.identifier !== undefined) {\n const requestIdParam = sql.param(input.requestId, requestIdColumn);\n\n const identifierQuery = db\n .insert(mapping.identifier.table as any)\n .values({\n ...mapping.d1.identifierInsertWithoutSubject(input.identifier, input.verifiedAt),\n [mapping.identifier.subjectId]:\n sql`(select ${requestSubjectColumn} from ${requestTable} where ${requestIdColumn} = ${requestIdParam})`,\n } as any)\n .toSQL();\n\n statements.push(db.$client.unsafe(identifierQuery.sql, identifierQuery.params));\n }\n const attempt = db.$client.batch(statements);\n\n yield* attempt.pipe(\n Effect.catchCause(\n (\n cause,\n ): Effect.Effect<\n void,\n | Effect.Error<typeof attempt>\n | Effect.Error<ReturnType<typeof findReceipt>>\n | IdentityConflict\n > => {\n if (\n cause.reasons.length === 0 ||\n !cause.reasons.every(\n (reason) =>\n Cause.isFailReason(reason) &&\n isMappedConstraintConflict(mapping.isConstraintConflict, reason.error),\n )\n )\n return Effect.failCause(cause);\n\n return findReceipt(input.requestId).pipe(\n Effect.flatMap((receipt) =>\n receipt !== undefined && receipt.fingerprint === fingerprint\n ? Effect.void\n : IdentityConflict.make(),\n ),\n );\n },\n ),\n );\n const receipt = yield* findReceipt(input.requestId);\n\n if (receipt === undefined || receipt.fingerprint !== fingerprint)\n return yield* IdentityConflict.make();\n const subjectId = yield* mapping.subjectId.toSubject(receipt.subjectId as NativeId);\n\n return SubjectProvisioned.make({ subjectId });\n }, mapUnavailable);\n\n return { subjectProvisioner: SubjectProvisioner.of({ provision }) } as const;\n});\n\nexport const makeD1ExternalIdentityServices = Effect.fnUntraced(function* <\n Subject extends AnySQLiteTable,\n External extends AnySQLiteTable,\n NativeId,\n>(mapping: D1ExternalIdentityMapping<Subject, External, NativeId>) {\n const database = yield* DatabaseService;\n\n yield* validateDrizzleStorage(mapping).pipe(\n Effect.provideServiceEffect(NativeDatabase, nativeDatabase(DatabaseService)),\n Effect.mapError(() => IdentityUnavailable.make()),\n );\n\n const db = database as RuntimeDatabase;\n const externalTable = mapping.externalIdentity.table;\n\n const externalSubjectIdColumn = column(\n externalTable,\n mapping.externalIdentity.subjectId,\n ) as SQLiteColumn;\n\n const externalProviderColumn = column(\n externalTable,\n mapping.externalIdentity.provider,\n ) as SQLiteColumn;\n\n const externalIssuerColumn = column(\n externalTable,\n mapping.externalIdentity.issuer,\n ) as SQLiteColumn;\n\n const externalSubjectColumn = column(\n externalTable,\n mapping.externalIdentity.subject,\n ) as SQLiteColumn;\n\n const bind = Effect.fn(\"DrizzleD1Identity.bindExternalIdentity\")(function* (\n subjectId: SubjectId,\n identity: ExternalIdentity,\n ) {\n const nativeId = yield* mapping.subjectId.toNative(subjectId);\n const subjectIdColumn = column(mapping.subject.table, mapping.subject.id);\n const subjectStatusColumn = column(mapping.subject.table, mapping.subject.status);\n const nativeIdParam = sql.param(nativeId, subjectIdColumn);\n const activeStatusParam = sql.param(mapping.d1.activeStatusValue, subjectStatusColumn);\n\n const selection = selectFields(\n externalTable,\n mapping.externalIdentity.encodeInsert(identity, nativeId),\n );\n\n selection[mapping.externalIdentity.subjectId] = subjectIdColumn;\n\n const inserted = yield* db\n .insert(externalTable as any)\n .select(\n db\n .select(selection as any)\n .from(mapping.subject.table as any)\n .where(\n and(eq(subjectIdColumn, nativeIdParam), eq(subjectStatusColumn, activeStatusParam)),\n ) as any,\n )\n .returning({ subjectId: externalSubjectIdColumn })\n .pipe(\n Effect.catchCause((cause) => {\n if (\n cause.reasons.length === 0 ||\n !cause.reasons.every(\n (reason) =>\n Cause.isFailReason(reason) &&\n isMappedConstraintConflict(mapping.isConstraintConflict, reason.error),\n )\n )\n return Effect.failCause(cause);\n\n return db\n .select({ subjectId: externalSubjectIdColumn })\n .from(externalTable as any)\n .innerJoin(\n mapping.subject.table as any,\n and(\n eq(externalSubjectIdColumn, subjectIdColumn),\n eq(subjectStatusColumn, mapping.d1.activeStatusValue),\n ),\n )\n .where(\n and(\n eq(externalProviderColumn, identity.provider),\n eq(externalIssuerColumn, identity.issuer),\n eq(externalSubjectColumn, identity.subject),\n eq(externalSubjectIdColumn, nativeId),\n ),\n )\n .limit(1);\n }),\n );\n\n const row = inserted[0];\n\n if (row === undefined) return yield* IdentityConflict.make();\n const linked = row.subjectId as NativeId;\n\n if (!mapping.subjectId.equals(linked, nativeId)) return yield* IdentityConflict.make();\n }, mapUnavailable);\n\n return { externalIdentityMutation: ExternalIdentityMutation.of({ bind }) } as const;\n});\n\nexport const makeD1IdentityServices = Effect.fnUntraced(function* <\n Subject extends AnySQLiteTable,\n Identifier extends AnySQLiteTable,\n External extends AnySQLiteTable,\n Request extends AnySQLiteTable,\n NativeId,\n>(mapping: D1GeneratedIdentityMapping<Subject, Identifier, External, Request, NativeId>) {\n return {\n ...(yield* makeD1SubjectProvisioningServices(mapping)),\n ...(yield* makeD1ExternalIdentityServices(mapping)),\n };\n}, withStorageValidation);\n"],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@ import { Database as Database$1 } from "./d1-database.mjs";
|
|
|
4
4
|
import { D1BatchStatements } from "./D1BatchStatements.mjs";
|
|
5
5
|
import { SuppliedService } from "./SuppliedService.mjs";
|
|
6
6
|
import { AnyRelations } from "drizzle-orm";
|
|
7
|
-
import { Effect } from "effect";
|
|
7
|
+
import { Crypto, Effect } from "effect";
|
|
8
8
|
import { LifecycleHooks } from "@yielded/auth/Hooks";
|
|
9
9
|
import { OAuthAccountsPersistence, OAuthRegistrationIntents, OAuthSignInPersistence, OAuthUnavailable } from "@yielded/auth/OAuth";
|
|
10
10
|
import { EffectSQLiteD1Database } from "drizzle-orm/effect-d1";
|
|
@@ -53,11 +53,11 @@ export declare const makeD1OAuthAccountsServices: <S extends SQLiteTable, O exte
|
|
|
53
53
|
readonly resources: readonly string[];
|
|
54
54
|
readonly retention: "access-and-refresh" | "access-only";
|
|
55
55
|
readonly maximumAccessLifetimeMillis: number;
|
|
56
|
-
readonly maximumRefreshLifetimeMillis?: number
|
|
56
|
+
readonly maximumRefreshLifetimeMillis?: number;
|
|
57
57
|
readonly refreshAheadMillis: number;
|
|
58
58
|
readonly refresh: "confidential" | "rotating" | "unsupported";
|
|
59
59
|
readonly revocation: "cohort" | "unsupported";
|
|
60
|
-
}
|
|
60
|
+
};
|
|
61
61
|
readonly returnTarget: string & import("effect/Brand").Brand<"effect-auth/OAuthReturnTarget">;
|
|
62
62
|
readonly stateDigest: string & import("effect/Brand").Brand<"effect-auth/TokenDigest">;
|
|
63
63
|
readonly requestBindingVerifier: string & import("effect/Brand").Brand<"effect-auth/TokenDigest">;
|
|
@@ -119,11 +119,11 @@ export declare const makeD1OAuthAccountsServices: <S extends SQLiteTable, O exte
|
|
|
119
119
|
readonly resources: readonly string[];
|
|
120
120
|
readonly retention: "access-and-refresh" | "access-only";
|
|
121
121
|
readonly maximumAccessLifetimeMillis: number;
|
|
122
|
-
readonly maximumRefreshLifetimeMillis?: number
|
|
122
|
+
readonly maximumRefreshLifetimeMillis?: number;
|
|
123
123
|
readonly refreshAheadMillis: number;
|
|
124
124
|
readonly refresh: "confidential" | "rotating" | "unsupported";
|
|
125
125
|
readonly revocation: "cohort" | "unsupported";
|
|
126
|
-
}
|
|
126
|
+
};
|
|
127
127
|
readonly returnTarget: string & import("effect/Brand").Brand<"effect-auth/OAuthReturnTarget">;
|
|
128
128
|
readonly stateDigest: string & import("effect/Brand").Brand<"effect-auth/TokenDigest">;
|
|
129
129
|
readonly requestBindingVerifier: string & import("effect/Brand").Brand<"effect-auth/TokenDigest">;
|
|
@@ -163,12 +163,10 @@ export declare const makeD1OAuthAccountsServices: <S extends SQLiteTable, O exte
|
|
|
163
163
|
readonly nowMillis: number;
|
|
164
164
|
}, prepare: import("@yielded/auth/OAuth").PrepareOAuthCommit<{
|
|
165
165
|
readonly _tag: "Rejected";
|
|
166
|
-
} | {
|
|
167
|
-
readonly _tag: "Cancelled";
|
|
168
166
|
} | {
|
|
169
167
|
readonly _tag: "Ambiguous";
|
|
170
168
|
} | {
|
|
171
|
-
readonly _tag: "
|
|
169
|
+
readonly _tag: "Cancelled";
|
|
172
170
|
} | {
|
|
173
171
|
readonly _tag: "Linked";
|
|
174
172
|
readonly credential: {
|
|
@@ -190,6 +188,8 @@ export declare const makeD1OAuthAccountsServices: <S extends SQLiteTable, O exte
|
|
|
190
188
|
};
|
|
191
189
|
};
|
|
192
190
|
readonly changed: boolean;
|
|
191
|
+
} | {
|
|
192
|
+
readonly _tag: "Conflict";
|
|
193
193
|
}, A>) => Effect.Effect<import("@yielded/auth/Hooks").PreparedCommit<A>, OAuthUnavailable>;
|
|
194
194
|
readonly inspectUnlink: (input: {
|
|
195
195
|
readonly moduleId: string & import("effect/Brand").Brand<"effect-auth/OAuthModuleId">;
|
|
@@ -267,7 +267,7 @@ export declare const makeD1OAuthAccountsServices: <S extends SQLiteTable, O exte
|
|
|
267
267
|
readonly hasMore: boolean;
|
|
268
268
|
}, A>) => Effect.Effect<import("@yielded/auth/Hooks").PreparedCommit<A>, OAuthUnavailable>;
|
|
269
269
|
};
|
|
270
|
-
}, OAuthUnavailable, Database$1 | LifecycleHooks>;
|
|
270
|
+
}, OAuthUnavailable, Crypto.Crypto | Database$1 | LifecycleHooks>;
|
|
271
271
|
export declare const makeD1OAuthSignInServices: <S extends SQLiteTable, O extends SQLiteTable, C extends SQLiteTable, AC extends SQLiteTable, F extends SQLiteTable, N>(mapping: OAuthSignInMapping<S, O, C, AC, F, N> & OAuthD1Mapping) => Effect.Effect<{
|
|
272
272
|
oauthSignInPersistence: {
|
|
273
273
|
readonly issue: <A>(input: import("@yielded/auth/OAuth").OAuthPendingFlow, prepare: import("@yielded/auth/OAuth").PrepareOAuthCommit<import("@yielded/auth/OAuth").OAuthIssueDecision, A>) => Effect.Effect<import("@yielded/auth/Hooks").PreparedCommit<A>, OAuthUnavailable>;
|
|
@@ -300,7 +300,7 @@ export declare const makeD1OAuthSignInServices: <S extends SQLiteTable, O extend
|
|
|
300
300
|
readonly hasMore: boolean;
|
|
301
301
|
}, A>) => Effect.Effect<import("@yielded/auth/Hooks").PreparedCommit<A>, OAuthUnavailable>;
|
|
302
302
|
};
|
|
303
|
-
}, OAuthUnavailable, Database$1 | LifecycleHooks>;
|
|
303
|
+
}, OAuthUnavailable, Crypto.Crypto | Database$1 | LifecycleHooks>;
|
|
304
304
|
export declare const makeD1OAuthRegistrationIntentServices: <S extends SQLiteTable, O extends SQLiteTable, C extends SQLiteTable, AC extends SQLiteTable, F extends SQLiteTable, T extends SQLiteTable, I extends SQLiteTable, N>(mapping: OAuthRegistrationIntentMapping<S, O, C, AC, F, T, I, N> & OAuthD1Mapping) => Effect.Effect<{
|
|
305
305
|
oauthRegistrationIntents: {
|
|
306
306
|
readonly settle: <A>(input: {
|
|
@@ -310,22 +310,22 @@ export declare const makeD1OAuthRegistrationIntentServices: <S extends SQLiteTab
|
|
|
310
310
|
readonly nowMillis: number;
|
|
311
311
|
}, prepare: import("@yielded/auth/OAuth").PrepareOAuthCommit<import("@yielded/auth/OAuth").OAuthRegistrationSettlement, A>) => Effect.Effect<import("@yielded/auth/Hooks").PreparedCommit<A>, OAuthUnavailable>;
|
|
312
312
|
};
|
|
313
|
-
}, OAuthUnavailable, Database$1 | LifecycleHooks>;
|
|
313
|
+
}, OAuthUnavailable, Crypto.Crypto | Database$1 | LifecycleHooks>;
|
|
314
314
|
export declare const makeD1OAuthRegistrationServices: <Registration, S extends SQLiteTable, O extends SQLiteTable, C extends SQLiteTable, AC extends SQLiteTable, T extends SQLiteTable, I extends SQLiteTable, R extends SQLiteTable, N>(mapping: OAuthRegistrationMapping<Registration, S, O, C, AC, T, I, R, N> & OAuthD1Mapping) => Effect.Effect<{
|
|
315
315
|
registrationAuthority: OAuthRegistrationAuthority<Registration>;
|
|
316
|
-
}, OAuthUnavailable, Database$1 | LifecycleHooks>;
|
|
316
|
+
}, OAuthUnavailable, Crypto.Crypto | Database$1 | LifecycleHooks>;
|
|
317
317
|
export declare function coordinateD1OAuthSignIn<S extends SQLiteTable, O extends SQLiteTable, C extends SQLiteTable, AC extends SQLiteTable, F extends SQLiteTable, N, A, E, R, DatabaseError, DatabaseRequirements>(acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>, options: {
|
|
318
318
|
readonly mapping: OAuthSignInMapping<S, O, C, AC, F, N> & OAuthD1Mapping;
|
|
319
|
-
}, body: Effect.Effect<A, E, R>): Effect.Effect<A, OAuthCoordinatorError<E> | DatabaseError, Exclude<R, OAuthSignInPersistence | D1BatchStatements> | LifecycleHooks | DatabaseRequirements>;
|
|
319
|
+
}, body: Effect.Effect<A, E, R>): Effect.Effect<A, OAuthCoordinatorError<E> | DatabaseError, Exclude<R, OAuthSignInPersistence | D1BatchStatements> | Crypto.Crypto | LifecycleHooks | DatabaseRequirements>;
|
|
320
320
|
export declare function coordinateD1OAuthRegistrationIntents<S extends SQLiteTable, O extends SQLiteTable, C extends SQLiteTable, AC extends SQLiteTable, F extends SQLiteTable, T extends SQLiteTable, I extends SQLiteTable, N, A, E, R, DatabaseError, DatabaseRequirements>(acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>, options: {
|
|
321
321
|
readonly mapping: OAuthRegistrationIntentMapping<S, O, C, AC, F, T, I, N> & OAuthD1Mapping;
|
|
322
|
-
}, body: Effect.Effect<A, E, R>): Effect.Effect<A, OAuthCoordinatorError<E> | DatabaseError, Exclude<R, OAuthRegistrationIntents | D1BatchStatements> | LifecycleHooks | DatabaseRequirements>;
|
|
322
|
+
}, body: Effect.Effect<A, E, R>): Effect.Effect<A, OAuthCoordinatorError<E> | DatabaseError, Exclude<R, OAuthRegistrationIntents | D1BatchStatements> | Crypto.Crypto | LifecycleHooks | DatabaseRequirements>;
|
|
323
323
|
export declare function coordinateD1OAuthAccounts<S extends SQLiteTable, O extends SQLiteTable, C extends SQLiteTable, AC extends SQLiteTable, F extends SQLiteTable, T extends SQLiteTable, U extends SQLiteTable, N, A, E, R, DatabaseError, DatabaseRequirements>(acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>, options: {
|
|
324
324
|
readonly mapping: OAuthAccountsMapping<S, O, C, AC, F, T, U, N> & OAuthD1Mapping;
|
|
325
|
-
}, body: Effect.Effect<A, E, R>): Effect.Effect<A, OAuthCoordinatorError<E> | DatabaseError, Exclude<R, OAuthAccountsPersistence | D1BatchStatements> | LifecycleHooks | DatabaseRequirements>;
|
|
325
|
+
}, body: Effect.Effect<A, E, R>): Effect.Effect<A, OAuthCoordinatorError<E> | DatabaseError, Exclude<R, OAuthAccountsPersistence | D1BatchStatements> | Crypto.Crypto | LifecycleHooks | DatabaseRequirements>;
|
|
326
326
|
export declare function coordinateD1OAuthRegistration<TargetId, Registration, S extends SQLiteTable, O extends SQLiteTable, C extends SQLiteTable, AC extends SQLiteTable, T extends SQLiteTable, I extends SQLiteTable, Rq extends SQLiteTable, N, A, E, R, DatabaseError, DatabaseRequirements>(acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>, options: {
|
|
327
327
|
readonly mapping: OAuthRegistrationMapping<NoInfer<Registration>, S, O, C, AC, T, I, Rq, N> & OAuthD1Mapping;
|
|
328
328
|
readonly target: SuppliedService<TargetId, OAuthRegistrationAuthority<Registration>>;
|
|
329
|
-
}, body: Effect.Effect<A, E, R>): Effect.Effect<A, OAuthCoordinatorError<E> | DatabaseError, Exclude<R, TargetId | D1BatchStatements> | LifecycleHooks | DatabaseRequirements>;
|
|
329
|
+
}, body: Effect.Effect<A, E, R>): Effect.Effect<A, OAuthCoordinatorError<E> | DatabaseError, Exclude<R, TargetId | D1BatchStatements> | Crypto.Crypto | LifecycleHooks | DatabaseRequirements>;
|
|
330
330
|
//#endregion
|
|
331
331
|
//# sourceMappingURL=d1-oauth.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"d1-oauth.mjs","names":["DatabaseService"],"sources":["../../src/drizzle/d1-oauth.ts"],"sourcesContent":["import type { D1Client } from \"@effect/sql-d1/D1Client\";\nimport { NativeDatabase } from \"@yielded/auth-persistence/Adapter\";\nimport type { LifecycleHooks } from \"@yielded/auth/Hooks\";\nimport {\n OAuthAccountsPersistence,\n OAuthRegistrationIntents,\n OAuthSignInPersistence,\n OAuthUnavailable,\n} from \"@yielded/auth/OAuth\";\nimport type { AnyRelations } from \"drizzle-orm\";\nimport type { EffectSQLiteD1Database } from \"drizzle-orm/effect-d1\";\nimport type { AnySQLiteTable } from \"drizzle-orm/sqlite-core\";\nimport { Effect, Context } from \"effect\";\n\nimport { Database as DatabaseService } from \"./d1-database\";\nimport { makeD1Owner } from \"./d1-planning\";\nimport { D1BatchStatements } from \"./D1BatchStatements\";\nimport { nativeDatabase } from \"./native-database\";\nimport type {\n OAuthAccountsMapping,\n OAuthD1Mapping,\n OAuthRegistrationAuthority,\n OAuthRegistrationIntentMapping,\n OAuthRegistrationMapping,\n OAuthSignInMapping,\n} from \"./oauth-model\";\nimport {\n type OAuthCoordinatorError,\n coordinateTargetOAuthAccounts,\n coordinateTargetOAuthSignIn,\n coordinateTargetOAuthRegistrationIntents,\n coordinateTargetOAuthRegistration,\n makeTargetOAuthRegistrationIntentServices,\n makeTargetOAuthRegistrationServices,\n makeTargetOAuthSignInServices,\n makeTargetOAuthAccountsServices,\n} from \"./oauth-target\";\nimport type { SuppliedService } from \"./SuppliedService\";\ntype SQLiteTable = AnySQLiteTable<{ dialect: \"sqlite\" }>;\ntype Database = EffectSQLiteD1Database<AnyRelations> & { readonly $client: D1Client };\nconst unavailable = () => OAuthUnavailable.make({});\n\nconst configuration = {\n mode: \"batch\" as const,\n dialect: \"sqlite\" as const,\n locking: false,\n standaloneGuard: () => Effect.void,\n};\n\nexport const makeD1OAuthAccountsServices = <\n S extends SQLiteTable,\n O extends SQLiteTable,\n C extends SQLiteTable,\n AC extends SQLiteTable,\n F extends SQLiteTable,\n T extends SQLiteTable,\n U extends SQLiteTable,\n N,\n>(\n mapping: OAuthAccountsMapping<S, O, C, AC, F, T, U, N> & OAuthD1Mapping,\n) =>\n makeTargetOAuthAccountsServices(mapping, configuration).pipe(\n Effect.provideServiceEffect(NativeDatabase, nativeDatabase(DatabaseService)),\n );\n\nexport const makeD1OAuthSignInServices = <\n S extends SQLiteTable,\n O extends SQLiteTable,\n C extends SQLiteTable,\n AC extends SQLiteTable,\n F extends SQLiteTable,\n N,\n>(\n mapping: OAuthSignInMapping<S, O, C, AC, F, N> & OAuthD1Mapping,\n) =>\n makeTargetOAuthSignInServices(mapping, configuration).pipe(\n Effect.provideServiceEffect(NativeDatabase, nativeDatabase(DatabaseService)),\n );\n\nexport const makeD1OAuthRegistrationIntentServices = <\n S extends SQLiteTable,\n O extends SQLiteTable,\n C extends SQLiteTable,\n AC extends SQLiteTable,\n F extends SQLiteTable,\n T extends SQLiteTable,\n I extends SQLiteTable,\n N,\n>(\n mapping: OAuthRegistrationIntentMapping<S, O, C, AC, F, T, I, N> & OAuthD1Mapping,\n) =>\n makeTargetOAuthRegistrationIntentServices(mapping, configuration).pipe(\n Effect.provideServiceEffect(NativeDatabase, nativeDatabase(DatabaseService)),\n );\n\nexport const makeD1OAuthRegistrationServices = <\n Registration,\n S extends SQLiteTable,\n O extends SQLiteTable,\n C extends SQLiteTable,\n AC extends SQLiteTable,\n T extends SQLiteTable,\n I extends SQLiteTable,\n R extends SQLiteTable,\n N,\n>(\n mapping: OAuthRegistrationMapping<Registration, S, O, C, AC, T, I, R, N> & OAuthD1Mapping,\n) =>\n makeTargetOAuthRegistrationServices<Registration>(mapping, configuration).pipe(\n Effect.provideServiceEffect(NativeDatabase, nativeDatabase(DatabaseService)),\n );\n\nexport function coordinateD1OAuthSignIn<\n S extends SQLiteTable,\n O extends SQLiteTable,\n C extends SQLiteTable,\n AC extends SQLiteTable,\n F extends SQLiteTable,\n N,\n A,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n>(\n acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>,\n options: { readonly mapping: OAuthSignInMapping<S, O, C, AC, F, N> & OAuthD1Mapping },\n body: Effect.Effect<A, E, R>,\n): Effect.Effect<\n A,\n OAuthCoordinatorError<E> | DatabaseError,\n Exclude<R, OAuthSignInPersistence | D1BatchStatements> | LifecycleHooks | DatabaseRequirements\n> {\n return Effect.flatMap(nativeDatabase(acquire), (database) =>\n coordinateTargetOAuthSignIn<\n never,\n A,\n E | OAuthUnavailable,\n Exclude<R, OAuthSignInPersistence | D1BatchStatements>\n >(database, options.mapping, configuration, (_transaction, services, append) =>\n Effect.gen(function* () {\n const nativeCollector = D1BatchStatements.of({\n append: (statement) => Effect.sync(() => append(statement)),\n });\n\n const owner = yield* makeD1Owner(unavailable()).pipe(\n Effect.provideService(D1BatchStatements, nativeCollector),\n );\n\n const original = services.oauthSignInPersistence;\n\n const service: OAuthSignInPersistence[\"Service\"] = {\n issue: (input, prepare) => owner.run(original.issue(input, prepare)),\n claim: (input, prepare) => owner.run(original.claim(input, prepare)),\n settle: (input, prepare) => owner.run(original.settle(input, prepare)),\n cleanup: (input, prepare) => owner.run(original.cleanup(input, prepare)),\n };\n\n const provided = Context.make(OAuthSignInPersistence, service).pipe(\n Context.add(D1BatchStatements, owner.collector),\n );\n\n return yield* owner.close(Effect.provideContext(body, provided));\n }),\n ).pipe(Effect.provideService(NativeDatabase, database)),\n );\n}\n\nexport function coordinateD1OAuthRegistrationIntents<\n S extends SQLiteTable,\n O extends SQLiteTable,\n C extends SQLiteTable,\n AC extends SQLiteTable,\n F extends SQLiteTable,\n T extends SQLiteTable,\n I extends SQLiteTable,\n N,\n A,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n>(\n acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: OAuthRegistrationIntentMapping<S, O, C, AC, F, T, I, N> & OAuthD1Mapping;\n },\n body: Effect.Effect<A, E, R>,\n): Effect.Effect<\n A,\n OAuthCoordinatorError<E> | DatabaseError,\n Exclude<R, OAuthRegistrationIntents | D1BatchStatements> | LifecycleHooks | DatabaseRequirements\n> {\n return Effect.flatMap(nativeDatabase(acquire), (database) =>\n coordinateTargetOAuthRegistrationIntents<\n never,\n A,\n E | OAuthUnavailable,\n Exclude<R, OAuthRegistrationIntents | D1BatchStatements>\n >(database, options.mapping, configuration, (_transaction, services, append) =>\n Effect.gen(function* () {\n const nativeCollector = D1BatchStatements.of({\n append: (statement) => Effect.sync(() => append(statement)),\n });\n\n const owner = yield* makeD1Owner(unavailable()).pipe(\n Effect.provideService(D1BatchStatements, nativeCollector),\n );\n\n const original = services.oauthRegistrationIntents;\n\n const service: OAuthRegistrationIntents[\"Service\"] = {\n settle: (input, prepare) => owner.run(original.settle(input, prepare)),\n };\n\n const provided = Context.make(OAuthRegistrationIntents, service).pipe(\n Context.add(D1BatchStatements, owner.collector),\n );\n\n return yield* owner.close(Effect.provideContext(body, provided));\n }),\n ).pipe(Effect.provideService(NativeDatabase, database)),\n );\n}\n\nexport function coordinateD1OAuthAccounts<\n S extends SQLiteTable,\n O extends SQLiteTable,\n C extends SQLiteTable,\n AC extends SQLiteTable,\n F extends SQLiteTable,\n T extends SQLiteTable,\n U extends SQLiteTable,\n N,\n A,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n>(\n acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>,\n options: { readonly mapping: OAuthAccountsMapping<S, O, C, AC, F, T, U, N> & OAuthD1Mapping },\n body: Effect.Effect<A, E, R>,\n): Effect.Effect<\n A,\n OAuthCoordinatorError<E> | DatabaseError,\n Exclude<R, OAuthAccountsPersistence | D1BatchStatements> | LifecycleHooks | DatabaseRequirements\n> {\n return Effect.flatMap(nativeDatabase(acquire), (database) =>\n coordinateTargetOAuthAccounts<\n never,\n A,\n E | OAuthUnavailable,\n Exclude<R, OAuthAccountsPersistence | D1BatchStatements>\n >(database, options.mapping, configuration, (_transaction, services, append) =>\n Effect.gen(function* () {\n const nativeCollector = D1BatchStatements.of({\n append: (statement) => Effect.sync(() => append(statement)),\n });\n\n const owner = yield* makeD1Owner(unavailable()).pipe(\n Effect.provideService(D1BatchStatements, nativeCollector),\n );\n\n const original = services.oauthAccountsPersistence;\n\n const service: OAuthAccountsPersistence[\"Service\"] = {\n capture: (input) => owner.run(original.capture(input)),\n issue: (input, prepare) => owner.run(original.issue(input, prepare)),\n preflight: (input) => owner.run(original.preflight(input)),\n claim: (input, prepare) => owner.run(original.claim(input, prepare)),\n settle: (input, prepare) => owner.run(original.settle(input, prepare)),\n inspectUnlink: (input) => owner.run(original.inspectUnlink(input)),\n unlink: (input, prepare) => owner.run(original.unlink(input, prepare)),\n cleanup: (input, prepare) => owner.run(original.cleanup(input, prepare)),\n };\n\n const provided = Context.make(OAuthAccountsPersistence, service).pipe(\n Context.add(D1BatchStatements, owner.collector),\n );\n\n return yield* owner.close(Effect.provideContext(body, provided));\n }),\n ).pipe(Effect.provideService(NativeDatabase, database)),\n );\n}\n\nexport function coordinateD1OAuthRegistration<\n TargetId,\n Registration,\n S extends SQLiteTable,\n O extends SQLiteTable,\n C extends SQLiteTable,\n AC extends SQLiteTable,\n T extends SQLiteTable,\n I extends SQLiteTable,\n Rq extends SQLiteTable,\n N,\n A,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n>(\n acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: OAuthRegistrationMapping<NoInfer<Registration>, S, O, C, AC, T, I, Rq, N> &\n OAuthD1Mapping;\n readonly target: SuppliedService<TargetId, OAuthRegistrationAuthority<Registration>>;\n },\n body: Effect.Effect<A, E, R>,\n): Effect.Effect<\n A,\n OAuthCoordinatorError<E> | DatabaseError,\n Exclude<R, TargetId | D1BatchStatements> | LifecycleHooks | DatabaseRequirements\n> {\n return Effect.flatMap(nativeDatabase(acquire), (database) =>\n coordinateTargetOAuthRegistration<\n Registration,\n never,\n A,\n E | OAuthUnavailable,\n Exclude<R, TargetId | D1BatchStatements>\n >(database, options.mapping, configuration, (_transaction, services, append) =>\n Effect.gen(function* () {\n const nativeCollector = D1BatchStatements.of({\n append: (statement) => Effect.sync(() => append(statement)),\n });\n\n const owner = yield* makeD1Owner(unavailable()).pipe(\n Effect.provideService(D1BatchStatements, nativeCollector),\n );\n\n const original = services.registrationAuthority;\n\n const service: OAuthRegistrationAuthority<Registration> = {\n read: (input) => owner.run(original.read(input)),\n inspect: (input) => owner.run(original.inspect(input)),\n register: (input, prepare) => owner.run(original.register(input, prepare)),\n cleanup: (input, prepare) => owner.run(original.cleanup(input, prepare)),\n };\n\n const provided = Context.make(options.target, service).pipe(\n Context.add(D1BatchStatements, owner.collector),\n );\n\n return yield* owner.close(Effect.provideContext(body, provided));\n }),\n ).pipe(Effect.provideService(NativeDatabase, database)),\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"d1-oauth.mjs","names":["DatabaseService"],"sources":["../../src/drizzle/d1-oauth.ts"],"sourcesContent":["import type { D1Client } from \"@effect/sql-d1/D1Client\";\nimport { NativeDatabase } from \"@yielded/auth-persistence/Adapter\";\nimport type { LifecycleHooks } from \"@yielded/auth/Hooks\";\nimport {\n OAuthAccountsPersistence,\n OAuthRegistrationIntents,\n OAuthSignInPersistence,\n OAuthUnavailable,\n} from \"@yielded/auth/OAuth\";\nimport type { AnyRelations } from \"drizzle-orm\";\nimport type { EffectSQLiteD1Database } from \"drizzle-orm/effect-d1\";\nimport type { AnySQLiteTable } from \"drizzle-orm/sqlite-core\";\nimport { type Crypto, Effect, Context } from \"effect\";\n\nimport { Database as DatabaseService } from \"./d1-database\";\nimport { makeD1Owner } from \"./d1-planning\";\nimport { D1BatchStatements } from \"./D1BatchStatements\";\nimport { nativeDatabase } from \"./native-database\";\nimport type {\n OAuthAccountsMapping,\n OAuthD1Mapping,\n OAuthRegistrationAuthority,\n OAuthRegistrationIntentMapping,\n OAuthRegistrationMapping,\n OAuthSignInMapping,\n} from \"./oauth-model\";\nimport {\n type OAuthCoordinatorError,\n coordinateTargetOAuthAccounts,\n coordinateTargetOAuthSignIn,\n coordinateTargetOAuthRegistrationIntents,\n coordinateTargetOAuthRegistration,\n makeTargetOAuthRegistrationIntentServices,\n makeTargetOAuthRegistrationServices,\n makeTargetOAuthSignInServices,\n makeTargetOAuthAccountsServices,\n} from \"./oauth-target\";\nimport type { SuppliedService } from \"./SuppliedService\";\ntype SQLiteTable = AnySQLiteTable<{ dialect: \"sqlite\" }>;\ntype Database = EffectSQLiteD1Database<AnyRelations> & { readonly $client: D1Client };\nconst unavailable = () => OAuthUnavailable.make({});\n\nconst configuration = {\n mode: \"batch\" as const,\n dialect: \"sqlite\" as const,\n locking: false,\n standaloneGuard: () => Effect.void,\n};\n\nexport const makeD1OAuthAccountsServices = <\n S extends SQLiteTable,\n O extends SQLiteTable,\n C extends SQLiteTable,\n AC extends SQLiteTable,\n F extends SQLiteTable,\n T extends SQLiteTable,\n U extends SQLiteTable,\n N,\n>(\n mapping: OAuthAccountsMapping<S, O, C, AC, F, T, U, N> & OAuthD1Mapping,\n) =>\n makeTargetOAuthAccountsServices(mapping, configuration).pipe(\n Effect.provideServiceEffect(NativeDatabase, nativeDatabase(DatabaseService)),\n );\n\nexport const makeD1OAuthSignInServices = <\n S extends SQLiteTable,\n O extends SQLiteTable,\n C extends SQLiteTable,\n AC extends SQLiteTable,\n F extends SQLiteTable,\n N,\n>(\n mapping: OAuthSignInMapping<S, O, C, AC, F, N> & OAuthD1Mapping,\n) =>\n makeTargetOAuthSignInServices(mapping, configuration).pipe(\n Effect.provideServiceEffect(NativeDatabase, nativeDatabase(DatabaseService)),\n );\n\nexport const makeD1OAuthRegistrationIntentServices = <\n S extends SQLiteTable,\n O extends SQLiteTable,\n C extends SQLiteTable,\n AC extends SQLiteTable,\n F extends SQLiteTable,\n T extends SQLiteTable,\n I extends SQLiteTable,\n N,\n>(\n mapping: OAuthRegistrationIntentMapping<S, O, C, AC, F, T, I, N> & OAuthD1Mapping,\n) =>\n makeTargetOAuthRegistrationIntentServices(mapping, configuration).pipe(\n Effect.provideServiceEffect(NativeDatabase, nativeDatabase(DatabaseService)),\n );\n\nexport const makeD1OAuthRegistrationServices = <\n Registration,\n S extends SQLiteTable,\n O extends SQLiteTable,\n C extends SQLiteTable,\n AC extends SQLiteTable,\n T extends SQLiteTable,\n I extends SQLiteTable,\n R extends SQLiteTable,\n N,\n>(\n mapping: OAuthRegistrationMapping<Registration, S, O, C, AC, T, I, R, N> & OAuthD1Mapping,\n) =>\n makeTargetOAuthRegistrationServices<Registration>(mapping, configuration).pipe(\n Effect.provideServiceEffect(NativeDatabase, nativeDatabase(DatabaseService)),\n );\n\nexport function coordinateD1OAuthSignIn<\n S extends SQLiteTable,\n O extends SQLiteTable,\n C extends SQLiteTable,\n AC extends SQLiteTable,\n F extends SQLiteTable,\n N,\n A,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n>(\n acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>,\n options: { readonly mapping: OAuthSignInMapping<S, O, C, AC, F, N> & OAuthD1Mapping },\n body: Effect.Effect<A, E, R>,\n): Effect.Effect<\n A,\n OAuthCoordinatorError<E> | DatabaseError,\n | Exclude<R, OAuthSignInPersistence | D1BatchStatements>\n | Crypto.Crypto\n | LifecycleHooks\n | DatabaseRequirements\n> {\n return Effect.flatMap(nativeDatabase(acquire), (database) =>\n coordinateTargetOAuthSignIn<\n never,\n A,\n E | OAuthUnavailable,\n Exclude<R, OAuthSignInPersistence | D1BatchStatements>\n >(database, options.mapping, configuration, (_transaction, services, append) =>\n Effect.gen(function* () {\n const nativeCollector = D1BatchStatements.of({\n append: (statement) => Effect.sync(() => append(statement)),\n });\n\n const owner = yield* makeD1Owner(unavailable()).pipe(\n Effect.provideService(D1BatchStatements, nativeCollector),\n );\n\n const original = services.oauthSignInPersistence;\n\n const service: OAuthSignInPersistence[\"Service\"] = {\n issue: (input, prepare) => owner.run(original.issue(input, prepare)),\n claim: (input, prepare) => owner.run(original.claim(input, prepare)),\n settle: (input, prepare) => owner.run(original.settle(input, prepare)),\n cleanup: (input, prepare) => owner.run(original.cleanup(input, prepare)),\n };\n\n const provided = Context.make(OAuthSignInPersistence, service).pipe(\n Context.add(D1BatchStatements, owner.collector),\n );\n\n return yield* owner.close(Effect.provideContext(body, provided));\n }),\n ).pipe(Effect.provideService(NativeDatabase, database)),\n );\n}\n\nexport function coordinateD1OAuthRegistrationIntents<\n S extends SQLiteTable,\n O extends SQLiteTable,\n C extends SQLiteTable,\n AC extends SQLiteTable,\n F extends SQLiteTable,\n T extends SQLiteTable,\n I extends SQLiteTable,\n N,\n A,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n>(\n acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: OAuthRegistrationIntentMapping<S, O, C, AC, F, T, I, N> & OAuthD1Mapping;\n },\n body: Effect.Effect<A, E, R>,\n): Effect.Effect<\n A,\n OAuthCoordinatorError<E> | DatabaseError,\n | Exclude<R, OAuthRegistrationIntents | D1BatchStatements>\n | Crypto.Crypto\n | LifecycleHooks\n | DatabaseRequirements\n> {\n return Effect.flatMap(nativeDatabase(acquire), (database) =>\n coordinateTargetOAuthRegistrationIntents<\n never,\n A,\n E | OAuthUnavailable,\n Exclude<R, OAuthRegistrationIntents | D1BatchStatements>\n >(database, options.mapping, configuration, (_transaction, services, append) =>\n Effect.gen(function* () {\n const nativeCollector = D1BatchStatements.of({\n append: (statement) => Effect.sync(() => append(statement)),\n });\n\n const owner = yield* makeD1Owner(unavailable()).pipe(\n Effect.provideService(D1BatchStatements, nativeCollector),\n );\n\n const original = services.oauthRegistrationIntents;\n\n const service: OAuthRegistrationIntents[\"Service\"] = {\n settle: (input, prepare) => owner.run(original.settle(input, prepare)),\n };\n\n const provided = Context.make(OAuthRegistrationIntents, service).pipe(\n Context.add(D1BatchStatements, owner.collector),\n );\n\n return yield* owner.close(Effect.provideContext(body, provided));\n }),\n ).pipe(Effect.provideService(NativeDatabase, database)),\n );\n}\n\nexport function coordinateD1OAuthAccounts<\n S extends SQLiteTable,\n O extends SQLiteTable,\n C extends SQLiteTable,\n AC extends SQLiteTable,\n F extends SQLiteTable,\n T extends SQLiteTable,\n U extends SQLiteTable,\n N,\n A,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n>(\n acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>,\n options: { readonly mapping: OAuthAccountsMapping<S, O, C, AC, F, T, U, N> & OAuthD1Mapping },\n body: Effect.Effect<A, E, R>,\n): Effect.Effect<\n A,\n OAuthCoordinatorError<E> | DatabaseError,\n | Exclude<R, OAuthAccountsPersistence | D1BatchStatements>\n | Crypto.Crypto\n | LifecycleHooks\n | DatabaseRequirements\n> {\n return Effect.flatMap(nativeDatabase(acquire), (database) =>\n coordinateTargetOAuthAccounts<\n never,\n A,\n E | OAuthUnavailable,\n Exclude<R, OAuthAccountsPersistence | D1BatchStatements>\n >(database, options.mapping, configuration, (_transaction, services, append) =>\n Effect.gen(function* () {\n const nativeCollector = D1BatchStatements.of({\n append: (statement) => Effect.sync(() => append(statement)),\n });\n\n const owner = yield* makeD1Owner(unavailable()).pipe(\n Effect.provideService(D1BatchStatements, nativeCollector),\n );\n\n const original = services.oauthAccountsPersistence;\n\n const service: OAuthAccountsPersistence[\"Service\"] = {\n capture: (input) => owner.run(original.capture(input)),\n issue: (input, prepare) => owner.run(original.issue(input, prepare)),\n preflight: (input) => owner.run(original.preflight(input)),\n claim: (input, prepare) => owner.run(original.claim(input, prepare)),\n settle: (input, prepare) => owner.run(original.settle(input, prepare)),\n inspectUnlink: (input) => owner.run(original.inspectUnlink(input)),\n unlink: (input, prepare) => owner.run(original.unlink(input, prepare)),\n cleanup: (input, prepare) => owner.run(original.cleanup(input, prepare)),\n };\n\n const provided = Context.make(OAuthAccountsPersistence, service).pipe(\n Context.add(D1BatchStatements, owner.collector),\n );\n\n return yield* owner.close(Effect.provideContext(body, provided));\n }),\n ).pipe(Effect.provideService(NativeDatabase, database)),\n );\n}\n\nexport function coordinateD1OAuthRegistration<\n TargetId,\n Registration,\n S extends SQLiteTable,\n O extends SQLiteTable,\n C extends SQLiteTable,\n AC extends SQLiteTable,\n T extends SQLiteTable,\n I extends SQLiteTable,\n Rq extends SQLiteTable,\n N,\n A,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n>(\n acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: OAuthRegistrationMapping<NoInfer<Registration>, S, O, C, AC, T, I, Rq, N> &\n OAuthD1Mapping;\n readonly target: SuppliedService<TargetId, OAuthRegistrationAuthority<Registration>>;\n },\n body: Effect.Effect<A, E, R>,\n): Effect.Effect<\n A,\n OAuthCoordinatorError<E> | DatabaseError,\n Exclude<R, TargetId | D1BatchStatements> | Crypto.Crypto | LifecycleHooks | DatabaseRequirements\n> {\n return Effect.flatMap(nativeDatabase(acquire), (database) =>\n coordinateTargetOAuthRegistration<\n Registration,\n never,\n A,\n E | OAuthUnavailable,\n Exclude<R, TargetId | D1BatchStatements>\n >(database, options.mapping, configuration, (_transaction, services, append) =>\n Effect.gen(function* () {\n const nativeCollector = D1BatchStatements.of({\n append: (statement) => Effect.sync(() => append(statement)),\n });\n\n const owner = yield* makeD1Owner(unavailable()).pipe(\n Effect.provideService(D1BatchStatements, nativeCollector),\n );\n\n const original = services.registrationAuthority;\n\n const service: OAuthRegistrationAuthority<Registration> = {\n read: (input) => owner.run(original.read(input)),\n inspect: (input) => owner.run(original.inspect(input)),\n register: (input, prepare) => owner.run(original.register(input, prepare)),\n cleanup: (input, prepare) => owner.run(original.cleanup(input, prepare)),\n };\n\n const provided = Context.make(options.target, service).pipe(\n Context.add(D1BatchStatements, owner.collector),\n );\n\n return yield* owner.close(Effect.provideContext(body, provided));\n }),\n ).pipe(Effect.provideService(NativeDatabase, database)),\n );\n}\n"],"mappings":"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"}
|
|
@@ -6,7 +6,7 @@ import { D1BatchStatements } from "./D1BatchStatements.mjs";
|
|
|
6
6
|
import { PasskeyCoordinatorError } from "./passkey-target.mjs";
|
|
7
7
|
import { NativeDatabase } from "@yielded/auth-persistence/Adapter";
|
|
8
8
|
import { AnyRelations } from "drizzle-orm";
|
|
9
|
-
import { Context, Effect } from "effect";
|
|
9
|
+
import { Context, Crypto, Effect } from "effect";
|
|
10
10
|
import { LifecycleHooks } from "@yielded/auth/Hooks";
|
|
11
11
|
import { EffectSQLiteD1Database } from "drizzle-orm/effect-d1";
|
|
12
12
|
import { PasskeyManagementPersistence, PasskeyPersistence } from "@yielded/auth/Passkey";
|
|
@@ -19,19 +19,19 @@ type Table$1 = AnySQLiteTable<{
|
|
|
19
19
|
type Database = EffectSQLiteD1Database<AnyRelations> & {
|
|
20
20
|
readonly $client: D1Client;
|
|
21
21
|
};
|
|
22
|
-
export declare const makePasskeyCredentialServices: <S extends Table$1, C extends Table$1, F extends Table$1, O extends Table$1, H extends Table$1, N, RSetup = never>(mapping: PasskeyMappingSource<PasskeyCredentialMapping<S, C, F, O, H, N> & D1PasskeyMapping, RSetup>) => Effect.Effect<import("@yielded/auth-persistence/Adapter").PasskeyCredentialServices, import("@yielded/auth/Passkey").PasskeyConfigurationError | import("@yielded/auth-persistence/Adapter").PersistenceMappingError, Database$1 | Exclude<RSetup, NativeDatabase>>, makePasskeyEnrollmentContextServices: <S extends Table$1, C extends Table$1, F extends Table$1, O extends Table$1, H extends Table$1, M extends Table$1, N, RSetup = never>(mapping: PasskeyMappingSource<PasskeyEnrollmentContextMapping<PasskeyCredentialMapping<S, C, F, O, H, N>, M, N> & D1PasskeyMapping, RSetup>) => Effect.Effect<import("@yielded/auth-persistence/Adapter").PasskeyEnrollmentContextServices, import("@yielded/auth/Passkey").PasskeyConfigurationError | import("@yielded/auth-persistence/Adapter").PersistenceMappingError, Database$1 | Exclude<RSetup, NativeDatabase>>, makePasskeyPersistenceServices: <S extends Table$1, C extends Table$1, F extends Table$1, O extends Table$1, H extends Table$1, M extends Table$1, Flow extends Table$1, Admission extends Table$1, Charge extends Table$1, N, RSetup = never>(mapping: PasskeyMappingSource<PasskeyPersistenceMapping<PasskeyCredentialMapping<S, C, F, O, H, N>, M, Flow, Admission, Charge, N> & D1PasskeyMapping, RSetup>) => Effect.Effect<import("@yielded/auth-persistence/Adapter").PasskeyPersistenceServices, import("@yielded/auth/Passkey").PasskeyConfigurationError | import("@yielded/auth-persistence/Adapter").PersistenceMappingError, Database$1 | LifecycleHooks | Exclude<RSetup, NativeDatabase>>, makePasskeyRegistrationCeremonyServices: <M extends Table$1, Flow extends Table$1, Admission extends Table$1, Charge extends Table$1, Intent extends Table$1, H extends Table$1, RSetup = never>(mapping: PasskeyMappingSource<PasskeyRegistrationCeremonyMapping<M, Flow, Admission, Charge, Intent, H> & D1PasskeyMapping, RSetup>) => Effect.Effect<import("@yielded/auth-persistence/Adapter").PasskeyRegistrationCeremonyServices, import("@yielded/auth/Passkey").PasskeyConfigurationError | import("@yielded/auth-persistence/Adapter").PersistenceMappingError, Database$1 | LifecycleHooks | Exclude<RSetup, NativeDatabase>>, makePasskeyManagementServices: <S extends Table$1, C extends Table$1, F extends Table$1, O extends Table$1, H extends Table$1, M extends Table$1, Flow extends Table$1, Admission extends Table$1, Charge extends Table$1, Command extends Table$1, N, RSetup = never>(mapping: PasskeyMappingSource<PasskeyManagementMapping<S, C, F, O, H, M, Flow, Admission, Charge, Command, N> & D1PasskeyMapping, RSetup>) => Effect.Effect<import("@yielded/auth-persistence/Adapter").PasskeyManagementServices, import("@yielded/auth/Passkey").PasskeyConfigurationError | import("@yielded/auth-persistence/Adapter").PersistenceMappingError, Database$1 | LifecycleHooks | Exclude<RSetup, NativeDatabase>>, makePasskeyRegistrationServices: <S extends Table$1, C extends Table$1, F extends Table$1, O extends Table$1, H extends Table$1, M extends Table$1, Flow extends Table$1, Admission extends Table$1, Charge extends Table$1, Intent extends Table$1, N, Value, RSetup = never>(mapping: PasskeyMappingSource<PasskeyRegistrationMapping<S, C, F, O, H, M, Flow, Admission, Charge, Intent, N, Value> & D1PasskeyMapping, RSetup>) => Effect.Effect<PasskeyRegistrationServices<Value>, import("@yielded/auth/Passkey").PasskeyConfigurationError | import("@yielded/auth-persistence/Adapter").PersistenceMappingError, Database$1 | LifecycleHooks | Exclude<RSetup, NativeDatabase>>;
|
|
22
|
+
export declare const makePasskeyCredentialServices: <S extends Table$1, C extends Table$1, F extends Table$1, O extends Table$1, H extends Table$1, N, RSetup = never>(mapping: PasskeyMappingSource<PasskeyCredentialMapping<S, C, F, O, H, N> & D1PasskeyMapping, RSetup>) => Effect.Effect<import("@yielded/auth-persistence/Adapter").PasskeyCredentialServices, import("@yielded/auth/Passkey").PasskeyConfigurationError | import("@yielded/auth-persistence/Adapter").PersistenceMappingError, Crypto.Crypto | Database$1 | Exclude<RSetup, NativeDatabase>>, makePasskeyEnrollmentContextServices: <S extends Table$1, C extends Table$1, F extends Table$1, O extends Table$1, H extends Table$1, M extends Table$1, N, RSetup = never>(mapping: PasskeyMappingSource<PasskeyEnrollmentContextMapping<PasskeyCredentialMapping<S, C, F, O, H, N>, M, N> & D1PasskeyMapping, RSetup>) => Effect.Effect<import("@yielded/auth-persistence/Adapter").PasskeyEnrollmentContextServices, import("@yielded/auth/Passkey").PasskeyConfigurationError | import("@yielded/auth-persistence/Adapter").PersistenceMappingError, Crypto.Crypto | Database$1 | Exclude<RSetup, NativeDatabase>>, makePasskeyPersistenceServices: <S extends Table$1, C extends Table$1, F extends Table$1, O extends Table$1, H extends Table$1, M extends Table$1, Flow extends Table$1, Admission extends Table$1, Charge extends Table$1, N, RSetup = never>(mapping: PasskeyMappingSource<PasskeyPersistenceMapping<PasskeyCredentialMapping<S, C, F, O, H, N>, M, Flow, Admission, Charge, N> & D1PasskeyMapping, RSetup>) => Effect.Effect<import("@yielded/auth-persistence/Adapter").PasskeyPersistenceServices, import("@yielded/auth/Passkey").PasskeyConfigurationError | import("@yielded/auth-persistence/Adapter").PersistenceMappingError, Crypto.Crypto | Database$1 | LifecycleHooks | Exclude<RSetup, NativeDatabase>>, makePasskeyRegistrationCeremonyServices: <M extends Table$1, Flow extends Table$1, Admission extends Table$1, Charge extends Table$1, Intent extends Table$1, H extends Table$1, RSetup = never>(mapping: PasskeyMappingSource<PasskeyRegistrationCeremonyMapping<M, Flow, Admission, Charge, Intent, H> & D1PasskeyMapping, RSetup>) => Effect.Effect<import("@yielded/auth-persistence/Adapter").PasskeyRegistrationCeremonyServices, import("@yielded/auth/Passkey").PasskeyConfigurationError | import("@yielded/auth-persistence/Adapter").PersistenceMappingError, Crypto.Crypto | Database$1 | LifecycleHooks | Exclude<RSetup, NativeDatabase>>, makePasskeyManagementServices: <S extends Table$1, C extends Table$1, F extends Table$1, O extends Table$1, H extends Table$1, M extends Table$1, Flow extends Table$1, Admission extends Table$1, Charge extends Table$1, Command extends Table$1, N, RSetup = never>(mapping: PasskeyMappingSource<PasskeyManagementMapping<S, C, F, O, H, M, Flow, Admission, Charge, Command, N> & D1PasskeyMapping, RSetup>) => Effect.Effect<import("@yielded/auth-persistence/Adapter").PasskeyManagementServices, import("@yielded/auth/Passkey").PasskeyConfigurationError | import("@yielded/auth-persistence/Adapter").PersistenceMappingError, Crypto.Crypto | Database$1 | LifecycleHooks | Exclude<RSetup, NativeDatabase>>, makePasskeyRegistrationServices: <S extends Table$1, C extends Table$1, F extends Table$1, O extends Table$1, H extends Table$1, M extends Table$1, Flow extends Table$1, Admission extends Table$1, Charge extends Table$1, Intent extends Table$1, N, Value, RSetup = never>(mapping: PasskeyMappingSource<PasskeyRegistrationMapping<S, C, F, O, H, M, Flow, Admission, Charge, Intent, N, Value> & D1PasskeyMapping, RSetup>) => Effect.Effect<PasskeyRegistrationServices<Value>, import("@yielded/auth/Passkey").PasskeyConfigurationError | import("@yielded/auth-persistence/Adapter").PersistenceMappingError, Crypto.Crypto | Database$1 | LifecycleHooks | Exclude<RSetup, NativeDatabase>>;
|
|
23
23
|
export declare function coordinatePasskeyPersistence<D extends Database, S extends Table$1, C extends Table$1, F extends Table$1, O extends Table$1, H extends Table$1, M extends Table$1, Flow extends Table$1, Admission extends Table$1, Charge extends Table$1, N, A, E, R, RSetup = never, DatabaseError = never, DatabaseRequirements = never>(acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>, options: {
|
|
24
24
|
readonly mapping: PasskeyMappingSource<PasskeyPersistenceMapping<PasskeyCredentialMapping<S, C, F, O, H, N>, M, Flow, Admission, Charge, N> & D1PasskeyMapping, RSetup>;
|
|
25
|
-
}, body: Effect.Effect<A, E, R>): Effect.Effect<A, PasskeyCoordinatorError<E> | DatabaseError, Exclude<R, PasskeyPersistence | D1BatchStatements> | LifecycleHooks | DatabaseRequirements | RSetup>;
|
|
25
|
+
}, body: Effect.Effect<A, E, R>): Effect.Effect<A, PasskeyCoordinatorError<E> | DatabaseError, Exclude<R, PasskeyPersistence | D1BatchStatements> | Crypto.Crypto | LifecycleHooks | DatabaseRequirements | RSetup>;
|
|
26
26
|
export declare function coordinatePasskeyRegistrationCeremony<D extends Database, M extends Table$1, Flow extends Table$1, Admission extends Table$1, Charge extends Table$1, Intent extends Table$1, H extends Table$1, A, E, R, RSetup = never, DatabaseError = never, DatabaseRequirements = never>(acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>, options: {
|
|
27
27
|
readonly mapping: PasskeyMappingSource<PasskeyRegistrationCeremonyMapping<M, Flow, Admission, Charge, Intent, H> & D1PasskeyMapping, RSetup>;
|
|
28
|
-
}, body: Effect.Effect<A, E, R>): Effect.Effect<A, PasskeyCoordinatorError<E> | DatabaseError, Exclude<R, PasskeyPersistence | D1BatchStatements> | LifecycleHooks | DatabaseRequirements | RSetup>;
|
|
28
|
+
}, body: Effect.Effect<A, E, R>): Effect.Effect<A, PasskeyCoordinatorError<E> | DatabaseError, Exclude<R, PasskeyPersistence | D1BatchStatements> | Crypto.Crypto | LifecycleHooks | DatabaseRequirements | RSetup>;
|
|
29
29
|
export declare function coordinatePasskeyManagement<D extends Database, S extends Table$1, C extends Table$1, F extends Table$1, O extends Table$1, H extends Table$1, M extends Table$1, Flow extends Table$1, Admission extends Table$1, Charge extends Table$1, Command extends Table$1, N, A, E, R, RSetup = never, DatabaseError = never, DatabaseRequirements = never>(acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>, options: {
|
|
30
30
|
readonly mapping: PasskeyMappingSource<PasskeyManagementMapping<S, C, F, O, H, M, Flow, Admission, Charge, Command, N> & D1PasskeyMapping, RSetup>;
|
|
31
|
-
}, body: Effect.Effect<A, E, R>): Effect.Effect<A, PasskeyCoordinatorError<E> | DatabaseError, Exclude<R, PasskeyPersistence | PasskeyManagementPersistence | D1BatchStatements> | LifecycleHooks | DatabaseRequirements | RSetup>;
|
|
31
|
+
}, body: Effect.Effect<A, E, R>): Effect.Effect<A, PasskeyCoordinatorError<E> | DatabaseError, Exclude<R, PasskeyPersistence | PasskeyManagementPersistence | D1BatchStatements> | Crypto.Crypto | LifecycleHooks | DatabaseRequirements | RSetup>;
|
|
32
32
|
export declare function coordinatePasskeyRegistration<D extends Database, S extends Table$1, C extends Table$1, F extends Table$1, O extends Table$1, H extends Table$1, M extends Table$1, Flow extends Table$1, Admission extends Table$1, Charge extends Table$1, Intent extends Table$1, N, Value, AuthorityId, A, E, R, RSetup = never, DatabaseError = never, DatabaseRequirements = never>(acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>, options: {
|
|
33
33
|
readonly mapping: PasskeyMappingSource<PasskeyRegistrationMapping<S, C, F, O, H, M, Flow, Admission, Charge, Intent, N, Value> & D1PasskeyMapping, RSetup>;
|
|
34
34
|
readonly authority: Context.Key<AuthorityId, PasskeyRegistrationWriter<Value>>;
|
|
35
|
-
}, body: Effect.Effect<A, E, R>): Effect.Effect<A, PasskeyCoordinatorError<E> | DatabaseError, Exclude<R, PasskeyPersistence | AuthorityId | D1BatchStatements> | LifecycleHooks | DatabaseRequirements | RSetup>;
|
|
35
|
+
}, body: Effect.Effect<A, E, R>): Effect.Effect<A, PasskeyCoordinatorError<E> | DatabaseError, Exclude<R, PasskeyPersistence | AuthorityId | D1BatchStatements> | Crypto.Crypto | LifecycleHooks | DatabaseRequirements | RSetup>;
|
|
36
36
|
//#endregion
|
|
37
37
|
//# sourceMappingURL=d1-passkey.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"d1-passkey.mjs","names":["DatabaseService"],"sources":["../../src/drizzle/d1-passkey.ts"],"sourcesContent":["import type { D1Client } from \"@effect/sql-d1/D1Client\";\nimport { NativeDatabase } from \"@yielded/auth-persistence/Adapter\";\nimport type { LifecycleHooks } from \"@yielded/auth/Hooks\";\nimport {\n PasskeyUnavailable,\n PasskeyPersistence,\n PasskeyManagementPersistence,\n} from \"@yielded/auth/Passkey\";\nimport type { AnyRelations } from \"drizzle-orm\";\nimport type { EffectSQLiteD1Database } from \"drizzle-orm/effect-d1\";\nimport type { AnySQLiteTable } from \"drizzle-orm/sqlite-core\";\nimport { Effect, Context } from \"effect\";\n\nimport { Database as DatabaseService } from \"./d1-database\";\nimport { makeD1Owner } from \"./d1-planning\";\nimport { D1BatchStatements } from \"./D1BatchStatements\";\nimport { nativeDatabase } from \"./native-database\";\nimport { makePasskeyTarget } from \"./passkey-drivers\";\nimport type {\n D1PasskeyMapping,\n PasskeyCredentialMapping,\n PasskeyMappingSource,\n PasskeyPersistenceMapping,\n} from \"./passkey-model\";\nimport type { PasskeyRegistrationCeremonyMapping } from \"./passkey-registration-ceremony-model\";\nimport {\n type PasskeyCoordinatorError,\n coordinateTargetPasskey,\n coordinateTargetPasskeyRegistration,\n} from \"./passkey-target\";\n\ntype Table = AnySQLiteTable<{ dialect: \"sqlite\" }>;\ntype Database = EffectSQLiteD1Database<AnyRelations> & { readonly $client: D1Client };\n\nconst unavailable = () => PasskeyUnavailable.make({});\n\nconst configuration = {\n mode: \"batch\" as const,\n dialect: \"sqlite\" as const,\n locking: false,\n standaloneGuard: () => Effect.void,\n};\n\nconst target = makePasskeyTarget<DatabaseService, Database, Table, D1PasskeyMapping>(\n DatabaseService,\n configuration,\n);\n\nexport const {\n makePasskeyCredentialServices,\n makePasskeyEnrollmentContextServices,\n makePasskeyPersistenceServices,\n makePasskeyRegistrationCeremonyServices,\n makePasskeyManagementServices,\n makePasskeyRegistrationServices,\n} = target;\n\nexport function coordinatePasskeyPersistence<\n D extends Database,\n S extends Table,\n C extends Table,\n F extends Table,\n O extends Table,\n H extends Table,\n M extends Table,\n Flow extends Table,\n Admission extends Table,\n Charge extends Table,\n N,\n A,\n E,\n R,\n RSetup = never,\n DatabaseError = never,\n DatabaseRequirements = never,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: PasskeyMappingSource<\n PasskeyPersistenceMapping<\n PasskeyCredentialMapping<S, C, F, O, H, N>,\n M,\n Flow,\n Admission,\n Charge,\n N\n > &\n D1PasskeyMapping,\n RSetup\n >;\n },\n body: Effect.Effect<A, E, R>,\n): Effect.Effect<\n A,\n PasskeyCoordinatorError<E> | DatabaseError,\n | Exclude<R, PasskeyPersistence | D1BatchStatements>\n | LifecycleHooks\n | DatabaseRequirements\n | RSetup\n> {\n return Effect.flatMap(nativeDatabase(acquire), (database) =>\n coordinateTargetPasskey(database, options.mapping, configuration, (_, services, append) =>\n Effect.gen(function* () {\n const original = services.passkeyPersistence;\n\n const nativeCollector = D1BatchStatements.of({\n append: (statement) => Effect.sync(() => append(statement)),\n });\n\n const owner = yield* makeD1Owner(unavailable()).pipe(\n Effect.provideService(D1BatchStatements, nativeCollector),\n );\n\n const service: PasskeyPersistence[\"Service\"] = {\n issue: (input, prepare) => owner.run(original.issue(input, prepare)),\n context: (input) => owner.run(original.context(input)),\n claim: (input, prepare) => owner.run(original.claim(input, prepare)),\n settle: (input, prepare) => owner.run(original.settle(input, prepare)),\n cleanup: (input, prepare) => owner.run(original.cleanup(input, prepare)),\n };\n\n const provided = Context.make(PasskeyPersistence, service).pipe(\n Context.add(D1BatchStatements, owner.collector),\n );\n\n return yield* owner.close(Effect.provideContext(body, provided));\n }),\n ).pipe(Effect.provideService(NativeDatabase, database)),\n );\n}\n\nexport function coordinatePasskeyRegistrationCeremony<\n D extends Database,\n M extends Table,\n Flow extends Table,\n Admission extends Table,\n Charge extends Table,\n Intent extends Table,\n H extends Table,\n A,\n E,\n R,\n RSetup = never,\n DatabaseError = never,\n DatabaseRequirements = never,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: PasskeyMappingSource<\n PasskeyRegistrationCeremonyMapping<M, Flow, Admission, Charge, Intent, H> & D1PasskeyMapping,\n RSetup\n >;\n },\n body: Effect.Effect<A, E, R>,\n): Effect.Effect<\n A,\n PasskeyCoordinatorError<E> | DatabaseError,\n | Exclude<R, PasskeyPersistence | D1BatchStatements>\n | LifecycleHooks\n | DatabaseRequirements\n | RSetup\n> {\n return Effect.flatMap(nativeDatabase(acquire), (database) =>\n coordinateTargetPasskeyRegistration(\n database,\n options.mapping,\n configuration,\n (_, services, append) =>\n Effect.gen(function* () {\n const original = services.passkeyPersistence;\n\n const nativeCollector = D1BatchStatements.of({\n append: (statement) => Effect.sync(() => append(statement)),\n });\n\n const owner = yield* makeD1Owner(unavailable()).pipe(\n Effect.provideService(D1BatchStatements, nativeCollector),\n );\n\n const service: PasskeyPersistence[\"Service\"] = {\n issue: (input, prepare) => owner.run(original.issue(input, prepare)),\n context: (input) => owner.run(original.context(input)),\n claim: (input, prepare) => owner.run(original.claim(input, prepare)),\n settle: (input, prepare) => owner.run(original.settle(input, prepare)),\n cleanup: (input, prepare) => owner.run(original.cleanup(input, prepare)),\n };\n\n const provided = Context.make(PasskeyPersistence, service).pipe(\n Context.add(D1BatchStatements, owner.collector),\n );\n\n return yield* owner.close(Effect.provideContext(body, provided));\n }),\n ).pipe(Effect.provideService(NativeDatabase, database)),\n );\n}\n\nimport type {\n PasskeyManagementMapping,\n PasskeyRegistrationMapping,\n PasskeyRegistrationServices,\n PasskeyRegistrationWriter,\n} from \"./passkey-write-model\";\nimport {\n coordinateTargetPasskeyManagement,\n coordinateTargetPasskeyRegistrationWriter,\n} from \"./passkey-write-target\";\n\nexport function coordinatePasskeyManagement<\n D extends Database,\n S extends Table,\n C extends Table,\n F extends Table,\n O extends Table,\n H extends Table,\n M extends Table,\n Flow extends Table,\n Admission extends Table,\n Charge extends Table,\n Command extends Table,\n N,\n A,\n E,\n R,\n RSetup = never,\n DatabaseError = never,\n DatabaseRequirements = never,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: PasskeyMappingSource<\n PasskeyManagementMapping<S, C, F, O, H, M, Flow, Admission, Charge, Command, N> &\n D1PasskeyMapping,\n RSetup\n >;\n },\n body: Effect.Effect<A, E, R>,\n): Effect.Effect<\n A,\n PasskeyCoordinatorError<E> | DatabaseError,\n | Exclude<R, PasskeyPersistence | PasskeyManagementPersistence | D1BatchStatements>\n | LifecycleHooks\n | DatabaseRequirements\n | RSetup\n> {\n return Effect.flatMap(nativeDatabase(acquire), (database) =>\n coordinateTargetPasskeyManagement(\n database,\n options.mapping,\n configuration,\n (_, services, append) =>\n Effect.gen(function* () {\n const collector = D1BatchStatements.of({\n append: (statement) => Effect.sync(() => append(statement)),\n });\n\n const owner = yield* makeD1Owner(unavailable()).pipe(\n Effect.provideService(D1BatchStatements, collector),\n );\n\n const original = services.passkeyPersistence;\n\n const persistence: PasskeyPersistence[\"Service\"] = {\n issue: (input, prepare) => owner.run(original.issue(input, prepare)),\n context: (input) => owner.run(original.context(input)),\n claim: (input, prepare) => owner.run(original.claim(input, prepare)),\n settle: (input, prepare) => owner.run(original.settle(input, prepare)),\n cleanup: (input, prepare) => owner.run(original.cleanup(input, prepare)),\n };\n\n const authority = services.passkeyManagementPersistence;\n\n const service: PasskeyManagementPersistence[\"Service\"] = {\n list: (input) => owner.run(authority.list(input)),\n inspectRemove: (input) => owner.run(authority.inspectRemove(input)),\n issueEnrollment: (input, prepare) =>\n owner.run(authority.issueEnrollment(input, prepare)),\n completeEnrollment: (input, prepare) =>\n owner.run(authority.completeEnrollment(input, prepare)),\n rename: (input, prepare) => owner.run(authority.rename(input, prepare)),\n remove: (input, prepare) => owner.run(authority.remove(input, prepare)),\n };\n\n const context = Context.make(PasskeyPersistence, persistence).pipe(\n Context.add(PasskeyManagementPersistence, service),\n Context.add(D1BatchStatements, owner.collector),\n );\n\n return yield* owner.close(Effect.provideContext(body, context));\n }),\n ).pipe(Effect.provideService(NativeDatabase, database)),\n );\n}\n\nexport function coordinatePasskeyRegistration<\n D extends Database,\n S extends Table,\n C extends Table,\n F extends Table,\n O extends Table,\n H extends Table,\n M extends Table,\n Flow extends Table,\n Admission extends Table,\n Charge extends Table,\n Intent extends Table,\n N,\n Value,\n AuthorityId,\n A,\n E,\n R,\n RSetup = never,\n DatabaseError = never,\n DatabaseRequirements = never,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: PasskeyMappingSource<\n PasskeyRegistrationMapping<S, C, F, O, H, M, Flow, Admission, Charge, Intent, N, Value> &\n D1PasskeyMapping,\n RSetup\n >;\n readonly authority: Context.Key<AuthorityId, PasskeyRegistrationWriter<Value>>;\n },\n body: Effect.Effect<A, E, R>,\n): Effect.Effect<\n A,\n PasskeyCoordinatorError<E> | DatabaseError,\n | Exclude<R, PasskeyPersistence | AuthorityId | D1BatchStatements>\n | LifecycleHooks\n | DatabaseRequirements\n | RSetup\n> {\n return Effect.flatMap(nativeDatabase(acquire), (database) =>\n coordinateTargetPasskeyRegistrationWriter(\n database,\n options.mapping,\n configuration,\n (_, services: PasskeyRegistrationServices<Value>, append) =>\n Effect.gen(function* () {\n const collector = D1BatchStatements.of({\n append: (statement) => Effect.sync(() => append(statement)),\n });\n\n const owner = yield* makeD1Owner(unavailable()).pipe(\n Effect.provideService(D1BatchStatements, collector),\n );\n\n const original = services.passkeyPersistence;\n\n const persistence: PasskeyPersistence[\"Service\"] = {\n issue: (input, prepare) => owner.run(original.issue(input, prepare)),\n context: (input) => owner.run(original.context(input)),\n claim: (input, prepare) => owner.run(original.claim(input, prepare)),\n settle: (input, prepare) => owner.run(original.settle(input, prepare)),\n cleanup: (input, prepare) => owner.run(original.cleanup(input, prepare)),\n };\n\n const authority = services.passkeyRegistrationAuthority;\n\n const service: PasskeyRegistrationWriter<Value> = {\n inspect: (input) => owner.run(authority.inspect(input)),\n issueRegistration: (input, prepare) =>\n owner.run(authority.issueRegistration(input, prepare)),\n completeRegistration: (input, prepare) =>\n owner.run(authority.completeRegistration(input, prepare)),\n };\n\n const context = Context.make(PasskeyPersistence, persistence).pipe(\n Context.add(options.authority, service),\n Context.add(D1BatchStatements, owner.collector),\n );\n\n return yield* owner.close(Effect.provideContext(body, context));\n }),\n ).pipe(Effect.provideService(NativeDatabase, database)),\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"d1-passkey.mjs","names":["DatabaseService"],"sources":["../../src/drizzle/d1-passkey.ts"],"sourcesContent":["import type { D1Client } from \"@effect/sql-d1/D1Client\";\nimport { NativeDatabase } from \"@yielded/auth-persistence/Adapter\";\nimport type { LifecycleHooks } from \"@yielded/auth/Hooks\";\nimport {\n PasskeyUnavailable,\n PasskeyPersistence,\n PasskeyManagementPersistence,\n} from \"@yielded/auth/Passkey\";\nimport type { AnyRelations } from \"drizzle-orm\";\nimport type { EffectSQLiteD1Database } from \"drizzle-orm/effect-d1\";\nimport type { AnySQLiteTable } from \"drizzle-orm/sqlite-core\";\nimport { type Crypto, Effect, Context } from \"effect\";\n\nimport { Database as DatabaseService } from \"./d1-database\";\nimport { makeD1Owner } from \"./d1-planning\";\nimport { D1BatchStatements } from \"./D1BatchStatements\";\nimport { nativeDatabase } from \"./native-database\";\nimport { makePasskeyTarget } from \"./passkey-drivers\";\nimport type {\n D1PasskeyMapping,\n PasskeyCredentialMapping,\n PasskeyMappingSource,\n PasskeyPersistenceMapping,\n} from \"./passkey-model\";\nimport type { PasskeyRegistrationCeremonyMapping } from \"./passkey-registration-ceremony-model\";\nimport {\n type PasskeyCoordinatorError,\n coordinateTargetPasskey,\n coordinateTargetPasskeyRegistration,\n} from \"./passkey-target\";\n\ntype Table = AnySQLiteTable<{ dialect: \"sqlite\" }>;\ntype Database = EffectSQLiteD1Database<AnyRelations> & { readonly $client: D1Client };\n\nconst unavailable = () => PasskeyUnavailable.make({});\n\nconst configuration = {\n mode: \"batch\" as const,\n dialect: \"sqlite\" as const,\n locking: false,\n standaloneGuard: () => Effect.void,\n};\n\nconst target = makePasskeyTarget<DatabaseService, Database, Table, D1PasskeyMapping>(\n DatabaseService,\n configuration,\n);\n\nexport const {\n makePasskeyCredentialServices,\n makePasskeyEnrollmentContextServices,\n makePasskeyPersistenceServices,\n makePasskeyRegistrationCeremonyServices,\n makePasskeyManagementServices,\n makePasskeyRegistrationServices,\n} = target;\n\nexport function coordinatePasskeyPersistence<\n D extends Database,\n S extends Table,\n C extends Table,\n F extends Table,\n O extends Table,\n H extends Table,\n M extends Table,\n Flow extends Table,\n Admission extends Table,\n Charge extends Table,\n N,\n A,\n E,\n R,\n RSetup = never,\n DatabaseError = never,\n DatabaseRequirements = never,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: PasskeyMappingSource<\n PasskeyPersistenceMapping<\n PasskeyCredentialMapping<S, C, F, O, H, N>,\n M,\n Flow,\n Admission,\n Charge,\n N\n > &\n D1PasskeyMapping,\n RSetup\n >;\n },\n body: Effect.Effect<A, E, R>,\n): Effect.Effect<\n A,\n PasskeyCoordinatorError<E> | DatabaseError,\n | Exclude<R, PasskeyPersistence | D1BatchStatements>\n | Crypto.Crypto\n | LifecycleHooks\n | DatabaseRequirements\n | RSetup\n> {\n return Effect.flatMap(nativeDatabase(acquire), (database) =>\n coordinateTargetPasskey(database, options.mapping, configuration, (_, services, append) =>\n Effect.gen(function* () {\n const original = services.passkeyPersistence;\n\n const nativeCollector = D1BatchStatements.of({\n append: (statement) => Effect.sync(() => append(statement)),\n });\n\n const owner = yield* makeD1Owner(unavailable()).pipe(\n Effect.provideService(D1BatchStatements, nativeCollector),\n );\n\n const service: PasskeyPersistence[\"Service\"] = {\n issue: (input, prepare) => owner.run(original.issue(input, prepare)),\n context: (input) => owner.run(original.context(input)),\n claim: (input, prepare) => owner.run(original.claim(input, prepare)),\n settle: (input, prepare) => owner.run(original.settle(input, prepare)),\n cleanup: (input, prepare) => owner.run(original.cleanup(input, prepare)),\n };\n\n const provided = Context.make(PasskeyPersistence, service).pipe(\n Context.add(D1BatchStatements, owner.collector),\n );\n\n return yield* owner.close(Effect.provideContext(body, provided));\n }),\n ).pipe(Effect.provideService(NativeDatabase, database)),\n );\n}\n\nexport function coordinatePasskeyRegistrationCeremony<\n D extends Database,\n M extends Table,\n Flow extends Table,\n Admission extends Table,\n Charge extends Table,\n Intent extends Table,\n H extends Table,\n A,\n E,\n R,\n RSetup = never,\n DatabaseError = never,\n DatabaseRequirements = never,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: PasskeyMappingSource<\n PasskeyRegistrationCeremonyMapping<M, Flow, Admission, Charge, Intent, H> & D1PasskeyMapping,\n RSetup\n >;\n },\n body: Effect.Effect<A, E, R>,\n): Effect.Effect<\n A,\n PasskeyCoordinatorError<E> | DatabaseError,\n | Exclude<R, PasskeyPersistence | D1BatchStatements>\n | Crypto.Crypto\n | LifecycleHooks\n | DatabaseRequirements\n | RSetup\n> {\n return Effect.flatMap(nativeDatabase(acquire), (database) =>\n coordinateTargetPasskeyRegistration(\n database,\n options.mapping,\n configuration,\n (_, services, append) =>\n Effect.gen(function* () {\n const original = services.passkeyPersistence;\n\n const nativeCollector = D1BatchStatements.of({\n append: (statement) => Effect.sync(() => append(statement)),\n });\n\n const owner = yield* makeD1Owner(unavailable()).pipe(\n Effect.provideService(D1BatchStatements, nativeCollector),\n );\n\n const service: PasskeyPersistence[\"Service\"] = {\n issue: (input, prepare) => owner.run(original.issue(input, prepare)),\n context: (input) => owner.run(original.context(input)),\n claim: (input, prepare) => owner.run(original.claim(input, prepare)),\n settle: (input, prepare) => owner.run(original.settle(input, prepare)),\n cleanup: (input, prepare) => owner.run(original.cleanup(input, prepare)),\n };\n\n const provided = Context.make(PasskeyPersistence, service).pipe(\n Context.add(D1BatchStatements, owner.collector),\n );\n\n return yield* owner.close(Effect.provideContext(body, provided));\n }),\n ).pipe(Effect.provideService(NativeDatabase, database)),\n );\n}\n\nimport type {\n PasskeyManagementMapping,\n PasskeyRegistrationMapping,\n PasskeyRegistrationServices,\n PasskeyRegistrationWriter,\n} from \"./passkey-write-model\";\nimport {\n coordinateTargetPasskeyManagement,\n coordinateTargetPasskeyRegistrationWriter,\n} from \"./passkey-write-target\";\n\nexport function coordinatePasskeyManagement<\n D extends Database,\n S extends Table,\n C extends Table,\n F extends Table,\n O extends Table,\n H extends Table,\n M extends Table,\n Flow extends Table,\n Admission extends Table,\n Charge extends Table,\n Command extends Table,\n N,\n A,\n E,\n R,\n RSetup = never,\n DatabaseError = never,\n DatabaseRequirements = never,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: PasskeyMappingSource<\n PasskeyManagementMapping<S, C, F, O, H, M, Flow, Admission, Charge, Command, N> &\n D1PasskeyMapping,\n RSetup\n >;\n },\n body: Effect.Effect<A, E, R>,\n): Effect.Effect<\n A,\n PasskeyCoordinatorError<E> | DatabaseError,\n | Exclude<R, PasskeyPersistence | PasskeyManagementPersistence | D1BatchStatements>\n | Crypto.Crypto\n | LifecycleHooks\n | DatabaseRequirements\n | RSetup\n> {\n return Effect.flatMap(nativeDatabase(acquire), (database) =>\n coordinateTargetPasskeyManagement(\n database,\n options.mapping,\n configuration,\n (_, services, append) =>\n Effect.gen(function* () {\n const collector = D1BatchStatements.of({\n append: (statement) => Effect.sync(() => append(statement)),\n });\n\n const owner = yield* makeD1Owner(unavailable()).pipe(\n Effect.provideService(D1BatchStatements, collector),\n );\n\n const original = services.passkeyPersistence;\n\n const persistence: PasskeyPersistence[\"Service\"] = {\n issue: (input, prepare) => owner.run(original.issue(input, prepare)),\n context: (input) => owner.run(original.context(input)),\n claim: (input, prepare) => owner.run(original.claim(input, prepare)),\n settle: (input, prepare) => owner.run(original.settle(input, prepare)),\n cleanup: (input, prepare) => owner.run(original.cleanup(input, prepare)),\n };\n\n const authority = services.passkeyManagementPersistence;\n\n const service: PasskeyManagementPersistence[\"Service\"] = {\n list: (input) => owner.run(authority.list(input)),\n inspectRemove: (input) => owner.run(authority.inspectRemove(input)),\n issueEnrollment: (input, prepare) =>\n owner.run(authority.issueEnrollment(input, prepare)),\n completeEnrollment: (input, prepare) =>\n owner.run(authority.completeEnrollment(input, prepare)),\n rename: (input, prepare) => owner.run(authority.rename(input, prepare)),\n remove: (input, prepare) => owner.run(authority.remove(input, prepare)),\n };\n\n const context = Context.make(PasskeyPersistence, persistence).pipe(\n Context.add(PasskeyManagementPersistence, service),\n Context.add(D1BatchStatements, owner.collector),\n );\n\n return yield* owner.close(Effect.provideContext(body, context));\n }),\n ).pipe(Effect.provideService(NativeDatabase, database)),\n );\n}\n\nexport function coordinatePasskeyRegistration<\n D extends Database,\n S extends Table,\n C extends Table,\n F extends Table,\n O extends Table,\n H extends Table,\n M extends Table,\n Flow extends Table,\n Admission extends Table,\n Charge extends Table,\n Intent extends Table,\n N,\n Value,\n AuthorityId,\n A,\n E,\n R,\n RSetup = never,\n DatabaseError = never,\n DatabaseRequirements = never,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: PasskeyMappingSource<\n PasskeyRegistrationMapping<S, C, F, O, H, M, Flow, Admission, Charge, Intent, N, Value> &\n D1PasskeyMapping,\n RSetup\n >;\n readonly authority: Context.Key<AuthorityId, PasskeyRegistrationWriter<Value>>;\n },\n body: Effect.Effect<A, E, R>,\n): Effect.Effect<\n A,\n PasskeyCoordinatorError<E> | DatabaseError,\n | Exclude<R, PasskeyPersistence | AuthorityId | D1BatchStatements>\n | Crypto.Crypto\n | LifecycleHooks\n | DatabaseRequirements\n | RSetup\n> {\n return Effect.flatMap(nativeDatabase(acquire), (database) =>\n coordinateTargetPasskeyRegistrationWriter(\n database,\n options.mapping,\n configuration,\n (_, services: PasskeyRegistrationServices<Value>, append) =>\n Effect.gen(function* () {\n const collector = D1BatchStatements.of({\n append: (statement) => Effect.sync(() => append(statement)),\n });\n\n const owner = yield* makeD1Owner(unavailable()).pipe(\n Effect.provideService(D1BatchStatements, collector),\n );\n\n const original = services.passkeyPersistence;\n\n const persistence: PasskeyPersistence[\"Service\"] = {\n issue: (input, prepare) => owner.run(original.issue(input, prepare)),\n context: (input) => owner.run(original.context(input)),\n claim: (input, prepare) => owner.run(original.claim(input, prepare)),\n settle: (input, prepare) => owner.run(original.settle(input, prepare)),\n cleanup: (input, prepare) => owner.run(original.cleanup(input, prepare)),\n };\n\n const authority = services.passkeyRegistrationAuthority;\n\n const service: PasskeyRegistrationWriter<Value> = {\n inspect: (input) => owner.run(authority.inspect(input)),\n issueRegistration: (input, prepare) =>\n owner.run(authority.issueRegistration(input, prepare)),\n completeRegistration: (input, prepare) =>\n owner.run(authority.completeRegistration(input, prepare)),\n };\n\n const context = Context.make(PasskeyPersistence, persistence).pipe(\n Context.add(options.authority, service),\n Context.add(D1BatchStatements, owner.collector),\n );\n\n return yield* owner.close(Effect.provideContext(body, context));\n }),\n ).pipe(Effect.provideService(NativeDatabase, database)),\n );\n}\n"],"mappings":"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"}
|
|
@@ -56,7 +56,7 @@ const makePreparedPlans = (mapping, proofMapping) => {
|
|
|
56
56
|
try: () => ({
|
|
57
57
|
...planned,
|
|
58
58
|
statements: planned.statements.map((statement) => compactD1GeneratedStatement(database.$client, statement, unavailable)),
|
|
59
|
-
postconditions: planned.postconditions
|
|
59
|
+
...planned.postconditions === void 0 ? {} : { postconditions: planned.postconditions.map((statement) => compactD1GeneratedStatement(database.$client, statement, unavailable)) }
|
|
60
60
|
}),
|
|
61
61
|
catch: (cause) => Schema.is(PasswordUnavailable)(cause) ? cause : PersistenceMappingError$1.make({
|
|
62
62
|
operation: "mapping",
|
|
@@ -154,7 +154,7 @@ const makePreparedPlans = (mapping, proofMapping) => {
|
|
|
154
154
|
retryable: (cause) => passwordD1Kernel.isGuardFailure(cause, marker) || mutationGuard?.(cause) === true || completion !== void 0 && (passwordD1Kernel.isGuardFailure(cause, `effect-auth-proof-guard:complete:${completion.input.continuationId}`) || passwordD1Kernel.isGuardFailure(cause, `effect-auth-proof-guard:protected:${completion.input.continuationId}`)),
|
|
155
155
|
receipt: receipt ?? prepare("rejected", journal),
|
|
156
156
|
statements: compiled.statements,
|
|
157
|
-
postconditions: compiled.postconditions
|
|
157
|
+
...compiled.postconditions === void 0 ? {} : { postconditions: compiled.postconditions }
|
|
158
158
|
};
|
|
159
159
|
}
|
|
160
160
|
const postconditions = [yield* passwordD1Kernel.assertion(protectedMutation.appliedCondition, marker)];
|
|
@@ -192,7 +192,7 @@ const makePreparedPlans = (mapping, proofMapping) => {
|
|
|
192
192
|
statements: [yield* passwordD1Kernel.assertion(balancedD1And(ownerCurrent, existsRow(mapping, existing[0])), marker)]
|
|
193
193
|
};
|
|
194
194
|
const now = yield* passwordD1Kernel.readEngineNowMillis(p), scope = identifierScope({
|
|
195
|
-
credential: authority.snapshot,
|
|
195
|
+
...authority.snapshot === void 0 ? {} : { credential: authority.snapshot },
|
|
196
196
|
revision: authority.revision
|
|
197
197
|
});
|
|
198
198
|
const reservation = yield* snapshotPasswordPreparedReservation({
|