@yielded/auth-persistence 0.1.0-beta.7
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 +21 -0
- package/dist/Drizzle.d.mts +28 -0
- package/dist/Drizzle.mjs +28 -0
- package/dist/DrizzleD1.d.mts +963 -0
- package/dist/DrizzleD1.mjs +29 -0
- package/dist/DrizzleD1.mjs.map +1 -0
- package/dist/DrizzleLibsql.d.mts +2284 -0
- package/dist/DrizzleLibsql.mjs +92 -0
- package/dist/DrizzleLibsql.mjs.map +1 -0
- package/dist/DrizzleMysql2.d.mts +1820 -0
- package/dist/DrizzleMysql2.mjs +55 -0
- package/dist/DrizzleMysql2.mjs.map +1 -0
- package/dist/DrizzlePglite.d.mts +1826 -0
- package/dist/DrizzlePglite.mjs +53 -0
- package/dist/DrizzlePglite.mjs.map +1 -0
- package/dist/DrizzlePostgres.d.mts +1826 -0
- package/dist/DrizzlePostgres.mjs +53 -0
- package/dist/DrizzlePostgres.mjs.map +1 -0
- package/dist/DrizzleSqliteBun.d.mts +2279 -0
- package/dist/DrizzleSqliteBun.mjs +70 -0
- package/dist/DrizzleSqliteBun.mjs.map +1 -0
- package/dist/DrizzleSqliteDo.d.mts +2329 -0
- package/dist/DrizzleSqliteDo.mjs +105 -0
- package/dist/DrizzleSqliteDo.mjs.map +1 -0
- package/dist/DrizzleSqliteNode.d.mts +2279 -0
- package/dist/DrizzleSqliteNode.mjs +70 -0
- package/dist/DrizzleSqliteNode.mjs.map +1 -0
- package/dist/DrizzleSqliteWasm.d.mts +2282 -0
- package/dist/DrizzleSqliteWasm.mjs +70 -0
- package/dist/DrizzleSqliteWasm.mjs.map +1 -0
- package/dist/drizzle/D1BatchStatements.d.mts +11 -0
- package/dist/drizzle/D1BatchStatements.mjs +8 -0
- package/dist/drizzle/D1BatchStatements.mjs.map +1 -0
- package/dist/drizzle/PasswordPreparedPostconditions.mjs +12 -0
- package/dist/drizzle/PasswordPreparedPostconditions.mjs.map +1 -0
- package/dist/drizzle/SuppliedService.d.mts +10 -0
- package/dist/drizzle/d1-emails.d.mts +62 -0
- package/dist/drizzle/d1-emails.mjs +580 -0
- package/dist/drizzle/d1-emails.mjs.map +1 -0
- package/dist/drizzle/d1-generated-statement.d.mts +2 -0
- package/dist/drizzle/d1-generated-statement.mjs +79 -0
- package/dist/drizzle/d1-generated-statement.mjs.map +1 -0
- package/dist/drizzle/d1-identity.d.mts +31 -0
- package/dist/drizzle/d1-identity.mjs +119 -0
- package/dist/drizzle/d1-identity.mjs.map +1 -0
- package/dist/drizzle/d1-oauth.d.mts +301 -0
- package/dist/drizzle/d1-oauth.mjs +76 -0
- package/dist/drizzle/d1-oauth.mjs.map +1 -0
- package/dist/drizzle/d1-passkey.d.mts +51 -0
- package/dist/drizzle/d1-passkey.mjs +95 -0
- package/dist/drizzle/d1-passkey.mjs.map +1 -0
- package/dist/drizzle/d1-password-prepared.d.mts +25 -0
- package/dist/drizzle/d1-password-prepared.mjs +461 -0
- package/dist/drizzle/d1-password-prepared.mjs.map +1 -0
- package/dist/drizzle/d1-passwords.d.mts +87 -0
- package/dist/drizzle/d1-passwords.mjs +1004 -0
- package/dist/drizzle/d1-passwords.mjs.map +1 -0
- package/dist/drizzle/d1-phone.d.mts +26 -0
- package/dist/drizzle/d1-phone.mjs +30 -0
- package/dist/drizzle/d1-phone.mjs.map +1 -0
- package/dist/drizzle/d1-planning.d.mts +12 -0
- package/dist/drizzle/d1-planning.mjs +43 -0
- package/dist/drizzle/d1-planning.mjs.map +1 -0
- package/dist/drizzle/d1-proofs.d.mts +80 -0
- package/dist/drizzle/d1-proofs.mjs +830 -0
- package/dist/drizzle/d1-proofs.mjs.map +1 -0
- package/dist/drizzle/d1-sessions.d.mts +67 -0
- package/dist/drizzle/d1-sessions.mjs +966 -0
- package/dist/drizzle/d1-sessions.mjs.map +1 -0
- package/dist/drizzle/d1-totp.d.mts +26 -0
- package/dist/drizzle/d1-totp.mjs +27 -0
- package/dist/drizzle/d1-totp.mjs.map +1 -0
- package/dist/drizzle/email-model.d.mts +354 -0
- package/dist/drizzle/email-model.mjs +21 -0
- package/dist/drizzle/email-model.mjs.map +1 -0
- package/dist/drizzle/email-registration.d.mts +30 -0
- package/dist/drizzle/email-registration.mjs +238 -0
- package/dist/drizzle/email-registration.mjs.map +1 -0
- package/dist/drizzle/email-sql.d.mts +4 -0
- package/dist/drizzle/email-sql.mjs +9 -0
- package/dist/drizzle/email-sql.mjs.map +1 -0
- package/dist/drizzle/email-target.d.mts +20 -0
- package/dist/drizzle/email-target.mjs +72 -0
- package/dist/drizzle/email-target.mjs.map +1 -0
- package/dist/drizzle/model.d.mts +250 -0
- package/dist/drizzle/model.mjs +58 -0
- package/dist/drizzle/model.mjs.map +1 -0
- package/dist/drizzle/mysql-emails.d.mts +71 -0
- package/dist/drizzle/mysql-emails.mjs +38 -0
- package/dist/drizzle/mysql-emails.mjs.map +1 -0
- package/dist/drizzle/mysql-identity.d.mts +22 -0
- package/dist/drizzle/mysql-identity.mjs +94 -0
- package/dist/drizzle/mysql-identity.mjs.map +1 -0
- package/dist/drizzle/mysql-password-prepared.d.mts +30 -0
- package/dist/drizzle/mysql-password-prepared.mjs +16 -0
- package/dist/drizzle/mysql-password-prepared.mjs.map +1 -0
- package/dist/drizzle/mysql-passwords.d.mts +86 -0
- package/dist/drizzle/mysql-passwords.mjs +38 -0
- package/dist/drizzle/mysql-passwords.mjs.map +1 -0
- package/dist/drizzle/mysql-proofs.d.mts +75 -0
- package/dist/drizzle/mysql-proofs.mjs +23 -0
- package/dist/drizzle/mysql-proofs.mjs.map +1 -0
- package/dist/drizzle/mysql-sessions.d.mts +237 -0
- package/dist/drizzle/mysql-sessions.mjs +53 -0
- package/dist/drizzle/mysql-sessions.mjs.map +1 -0
- package/dist/drizzle/mysql.d.mts +70 -0
- package/dist/drizzle/mysql.mjs +218 -0
- package/dist/drizzle/mysql.mjs.map +1 -0
- package/dist/drizzle/oauth-accounts.mjs +358 -0
- package/dist/drizzle/oauth-accounts.mjs.map +1 -0
- package/dist/drizzle/oauth-connected-access.mjs +210 -0
- package/dist/drizzle/oauth-connected-access.mjs.map +1 -0
- package/dist/drizzle/oauth-connected-collection.mjs +202 -0
- package/dist/drizzle/oauth-connected-collection.mjs.map +1 -0
- package/dist/drizzle/oauth-connected-custody.mjs +146 -0
- package/dist/drizzle/oauth-connected-custody.mjs.map +1 -0
- package/dist/drizzle/oauth-connected-drivers.mjs +76 -0
- package/dist/drizzle/oauth-connected-drivers.mjs.map +1 -0
- package/dist/drizzle/oauth-connected-flow.mjs +247 -0
- package/dist/drizzle/oauth-connected-flow.mjs.map +1 -0
- package/dist/drizzle/oauth-connected-input.mjs +103 -0
- package/dist/drizzle/oauth-connected-input.mjs.map +1 -0
- package/dist/drizzle/oauth-connected-maintenance.mjs +214 -0
- package/dist/drizzle/oauth-connected-maintenance.mjs.map +1 -0
- package/dist/drizzle/oauth-connected-management.mjs +228 -0
- package/dist/drizzle/oauth-connected-management.mjs.map +1 -0
- package/dist/drizzle/oauth-connected-model.d.mts +278 -0
- package/dist/drizzle/oauth-connected-model.mjs +22 -0
- package/dist/drizzle/oauth-connected-model.mjs.map +1 -0
- package/dist/drizzle/oauth-connected-reference.d.mts +17 -0
- package/dist/drizzle/oauth-connected-reference.mjs +53 -0
- package/dist/drizzle/oauth-connected-reference.mjs.map +1 -0
- package/dist/drizzle/oauth-connected-settlement.mjs +117 -0
- package/dist/drizzle/oauth-connected-settlement.mjs.map +1 -0
- package/dist/drizzle/oauth-connected-state.d.mts +14 -0
- package/dist/drizzle/oauth-connected-state.mjs +422 -0
- package/dist/drizzle/oauth-connected-state.mjs.map +1 -0
- package/dist/drizzle/oauth-connected-target.d.mts +753 -0
- package/dist/drizzle/oauth-connected-target.mjs +91 -0
- package/dist/drizzle/oauth-connected-target.mjs.map +1 -0
- package/dist/drizzle/oauth-drivers.mjs +51 -0
- package/dist/drizzle/oauth-drivers.mjs.map +1 -0
- package/dist/drizzle/oauth-flow.d.mts +5 -0
- package/dist/drizzle/oauth-flow.mjs +253 -0
- package/dist/drizzle/oauth-flow.mjs.map +1 -0
- package/dist/drizzle/oauth-input.mjs +127 -0
- package/dist/drizzle/oauth-input.mjs.map +1 -0
- package/dist/drizzle/oauth-model.d.mts +463 -0
- package/dist/drizzle/oauth-model.mjs +49 -0
- package/dist/drizzle/oauth-model.mjs.map +1 -0
- package/dist/drizzle/oauth-mysql.mjs +8 -0
- package/dist/drizzle/oauth-mysql.mjs.map +1 -0
- package/dist/drizzle/oauth-owner.d.mts +4 -0
- package/dist/drizzle/oauth-owner.mjs +10 -0
- package/dist/drizzle/oauth-owner.mjs.map +1 -0
- package/dist/drizzle/oauth-registration.d.mts +6 -0
- package/dist/drizzle/oauth-registration.mjs +374 -0
- package/dist/drizzle/oauth-registration.mjs.map +1 -0
- package/dist/drizzle/oauth-state.mjs +107 -0
- package/dist/drizzle/oauth-state.mjs.map +1 -0
- package/dist/drizzle/oauth-target.d.mts +111 -0
- package/dist/drizzle/oauth-target.mjs +246 -0
- package/dist/drizzle/oauth-target.mjs.map +1 -0
- package/dist/drizzle/passkey-drivers.mjs +34 -0
- package/dist/drizzle/passkey-drivers.mjs.map +1 -0
- package/dist/drizzle/passkey-kernel.mjs +8 -0
- package/dist/drizzle/passkey-kernel.mjs.map +1 -0
- package/dist/drizzle/passkey-model.d.mts +272 -0
- package/dist/drizzle/passkey-model.mjs +34 -0
- package/dist/drizzle/passkey-model.mjs.map +1 -0
- package/dist/drizzle/passkey-registration-ceremony-model.d.mts +50 -0
- package/dist/drizzle/passkey-registration-ceremony-model.mjs +18 -0
- package/dist/drizzle/passkey-registration-ceremony-model.mjs.map +1 -0
- package/dist/drizzle/passkey-state.mjs +7 -0
- package/dist/drizzle/passkey-state.mjs.map +1 -0
- package/dist/drizzle/passkey-target.d.mts +9 -0
- package/dist/drizzle/passkey-target.mjs +7 -0
- package/dist/drizzle/passkey-target.mjs.map +1 -0
- package/dist/drizzle/passkey-write-drivers.mjs +32 -0
- package/dist/drizzle/passkey-write-drivers.mjs.map +1 -0
- package/dist/drizzle/passkey-write-model.d.mts +190 -0
- package/dist/drizzle/passkey-write-model.mjs +13 -0
- package/dist/drizzle/passkey-write-model.mjs.map +1 -0
- package/dist/drizzle/passkey-write-target.d.mts +11 -0
- package/dist/drizzle/passkey-write-target.mjs +7 -0
- package/dist/drizzle/passkey-write-target.mjs.map +1 -0
- package/dist/drizzle/password-model.d.mts +329 -0
- package/dist/drizzle/password-model.mjs +23 -0
- package/dist/drizzle/password-model.mjs.map +1 -0
- package/dist/drizzle/password-prepared-model.d.mts +94 -0
- package/dist/drizzle/password-prepared-model.mjs +11 -0
- package/dist/drizzle/password-prepared-model.mjs.map +1 -0
- package/dist/drizzle/password-prepared-sql.mjs +390 -0
- package/dist/drizzle/password-prepared-sql.mjs.map +1 -0
- package/dist/drizzle/password-prepared-state.mjs +104 -0
- package/dist/drizzle/password-prepared-state.mjs.map +1 -0
- package/dist/drizzle/password-prepared-target.d.mts +12 -0
- package/dist/drizzle/password-prepared-target.mjs +56 -0
- package/dist/drizzle/password-prepared-target.mjs.map +1 -0
- package/dist/drizzle/password-registration.d.mts +19 -0
- package/dist/drizzle/password-registration.mjs +135 -0
- package/dist/drizzle/password-registration.mjs.map +1 -0
- package/dist/drizzle/password-sql.d.mts +5 -0
- package/dist/drizzle/password-sql.mjs +9 -0
- package/dist/drizzle/password-sql.mjs.map +1 -0
- package/dist/drizzle/password-target.d.mts +17 -0
- package/dist/drizzle/password-target.mjs +61 -0
- package/dist/drizzle/password-target.mjs.map +1 -0
- package/dist/drizzle/pg-emails.d.mts +72 -0
- package/dist/drizzle/pg-emails.mjs +38 -0
- package/dist/drizzle/pg-emails.mjs.map +1 -0
- package/dist/drizzle/pg-password-prepared.d.mts +31 -0
- package/dist/drizzle/pg-password-prepared.mjs +16 -0
- package/dist/drizzle/pg-password-prepared.mjs.map +1 -0
- package/dist/drizzle/pg-passwords.d.mts +87 -0
- package/dist/drizzle/pg-passwords.mjs +38 -0
- package/dist/drizzle/pg-passwords.mjs.map +1 -0
- package/dist/drizzle/pg-proofs.d.mts +76 -0
- package/dist/drizzle/pg-proofs.mjs +22 -0
- package/dist/drizzle/pg-proofs.mjs.map +1 -0
- package/dist/drizzle/pg-sessions.d.mts +238 -0
- package/dist/drizzle/pg-sessions.mjs +53 -0
- package/dist/drizzle/pg-sessions.mjs.map +1 -0
- package/dist/drizzle/pg.d.mts +81 -0
- package/dist/drizzle/pg.mjs +290 -0
- package/dist/drizzle/pg.mjs.map +1 -0
- package/dist/drizzle/phone-model.d.mts +115 -0
- package/dist/drizzle/phone-model.mjs +39 -0
- package/dist/drizzle/phone-model.mjs.map +1 -0
- package/dist/drizzle/phone-state.mjs +16 -0
- package/dist/drizzle/phone-state.mjs.map +1 -0
- package/dist/drizzle/phone-target.d.mts +17 -0
- package/dist/drizzle/phone-target.mjs +170 -0
- package/dist/drizzle/phone-target.mjs.map +1 -0
- package/dist/drizzle/proof-model.d.mts +286 -0
- package/dist/drizzle/proof-model.mjs +17 -0
- package/dist/drizzle/proof-model.mjs.map +1 -0
- package/dist/drizzle/proof-sql.d.mts +4 -0
- package/dist/drizzle/proof-sql.mjs +8 -0
- package/dist/drizzle/proof-sql.mjs.map +1 -0
- package/dist/drizzle/proof-target.d.mts +12 -0
- package/dist/drizzle/proof-target.mjs +36 -0
- package/dist/drizzle/proof-target.mjs.map +1 -0
- package/dist/drizzle/query-operations.mjs +26 -0
- package/dist/drizzle/query-operations.mjs.map +1 -0
- package/dist/drizzle/session-model.d.mts +200 -0
- package/dist/drizzle/session-model.mjs +20 -0
- package/dist/drizzle/session-model.mjs.map +1 -0
- package/dist/drizzle/session-sql.mjs +8 -0
- package/dist/drizzle/session-sql.mjs.map +1 -0
- package/dist/drizzle/session-target.d.mts +28 -0
- package/dist/drizzle/session-target.mjs +47 -0
- package/dist/drizzle/session-target.mjs.map +1 -0
- package/dist/drizzle/sqlite-emails.mjs +45 -0
- package/dist/drizzle/sqlite-emails.mjs.map +1 -0
- package/dist/drizzle/sqlite-identity.mjs +91 -0
- package/dist/drizzle/sqlite-identity.mjs.map +1 -0
- package/dist/drizzle/sqlite-password-prepared.mjs +21 -0
- package/dist/drizzle/sqlite-password-prepared.mjs.map +1 -0
- package/dist/drizzle/sqlite-passwords.mjs +49 -0
- package/dist/drizzle/sqlite-passwords.mjs.map +1 -0
- package/dist/drizzle/sqlite-proofs.mjs +29 -0
- package/dist/drizzle/sqlite-proofs.mjs.map +1 -0
- package/dist/drizzle/sqlite-sessions.mjs +74 -0
- package/dist/drizzle/sqlite-sessions.mjs.map +1 -0
- package/dist/drizzle/sqlite.d.mts +78 -0
- package/dist/drizzle/sqlite.mjs +217 -0
- package/dist/drizzle/sqlite.mjs.map +1 -0
- package/dist/drizzle/standalone-guard.mjs +19 -0
- package/dist/drizzle/standalone-guard.mjs.map +1 -0
- package/dist/drizzle/step-up-model.d.mts +65 -0
- package/dist/drizzle/step-up-model.mjs +9 -0
- package/dist/drizzle/step-up-model.mjs.map +1 -0
- package/dist/drizzle/step-up-state.mjs +32 -0
- package/dist/drizzle/step-up-state.mjs.map +1 -0
- package/dist/drizzle/totp-model.d.mts +84 -0
- package/dist/drizzle/totp-model.mjs +13 -0
- package/dist/drizzle/totp-model.mjs.map +1 -0
- package/dist/drizzle/totp-state.d.mts +38 -0
- package/dist/drizzle/totp-state.mjs +287 -0
- package/dist/drizzle/totp-state.mjs.map +1 -0
- package/dist/drizzle/totp-target.d.mts +17 -0
- package/dist/drizzle/totp-target.mjs +81 -0
- package/dist/drizzle/totp-target.mjs.map +1 -0
- package/dist/drizzle/transaction-execution.d.mts +4 -0
- package/dist/drizzle/transaction-execution.mjs +11 -0
- package/dist/drizzle/transaction-execution.mjs.map +1 -0
- package/dist/drizzle/transaction-mysql.mjs +46 -0
- package/dist/drizzle/transaction-mysql.mjs.map +1 -0
- package/dist/drizzle/transaction-owner.d.mts +2 -0
- package/dist/drizzle/transaction-owner.mjs +8 -0
- package/dist/drizzle/transaction-owner.mjs.map +1 -0
- package/dist/index.d.mts +5 -0
- package/dist/index.mjs +5 -0
- package/dist/internal/configuration.d.mts +174 -0
- package/dist/internal/configuration.mjs +7 -0
- package/dist/internal/configuration.mjs.map +1 -0
- package/dist/internal/drizzle-migrations.mjs +19 -0
- package/dist/internal/drizzle-migrations.mjs.map +1 -0
- package/dist/internal/drizzle-postgres.mjs +39 -0
- package/dist/internal/drizzle-postgres.mjs.map +1 -0
- package/dist/internal/drizzle-sqlite.mjs +37 -0
- package/dist/internal/drizzle-sqlite.mjs.map +1 -0
- package/dist/internal/email-kernel.d.mts +13 -0
- package/dist/internal/email-kernel.mjs +487 -0
- package/dist/internal/email-kernel.mjs.map +1 -0
- package/dist/internal/mapping-error.d.mts +11 -0
- package/dist/internal/mapping-error.mjs +30 -0
- package/dist/internal/mapping-error.mjs.map +1 -0
- package/dist/internal/passkey/admission.d.mts +7 -0
- package/dist/internal/passkey/admission.mjs +216 -0
- package/dist/internal/passkey/admission.mjs.map +1 -0
- package/dist/internal/passkey/credentials.d.mts +6 -0
- package/dist/internal/passkey/credentials.mjs +249 -0
- package/dist/internal/passkey/credentials.mjs.map +1 -0
- package/dist/internal/passkey/enrollment.mjs +138 -0
- package/dist/internal/passkey/enrollment.mjs.map +1 -0
- package/dist/internal/passkey/flow.d.mts +10 -0
- package/dist/internal/passkey/flow.mjs +452 -0
- package/dist/internal/passkey/flow.mjs.map +1 -0
- package/dist/internal/passkey/management.mjs +231 -0
- package/dist/internal/passkey/management.mjs.map +1 -0
- package/dist/internal/passkey/registration-ceremony.d.mts +9 -0
- package/dist/internal/passkey/registration-ceremony.mjs +129 -0
- package/dist/internal/passkey/registration-ceremony.mjs.map +1 -0
- package/dist/internal/passkey/registration-custody.d.mts +2 -0
- package/dist/internal/passkey/registration-custody.mjs +52 -0
- package/dist/internal/passkey/registration-custody.mjs.map +1 -0
- package/dist/internal/passkey/registration-write.mjs +211 -0
- package/dist/internal/passkey/registration-write.mjs.map +1 -0
- package/dist/internal/passkey/state.d.mts +5 -0
- package/dist/internal/passkey/state.mjs +234 -0
- package/dist/internal/passkey/state.mjs.map +1 -0
- package/dist/internal/passkey/target.d.mts +19 -0
- package/dist/internal/passkey/target.mjs +190 -0
- package/dist/internal/passkey/target.mjs.map +1 -0
- package/dist/internal/passkey/write-state.mjs +345 -0
- package/dist/internal/passkey/write-state.mjs.map +1 -0
- package/dist/internal/passkey/write-target.mjs +192 -0
- package/dist/internal/passkey/write-target.mjs.map +1 -0
- package/dist/internal/passkey-kernel.mjs +49 -0
- package/dist/internal/passkey-kernel.mjs.map +1 -0
- package/dist/internal/passkeys.mjs +367 -0
- package/dist/internal/passkeys.mjs.map +1 -0
- package/dist/internal/password-kernel.d.mts +13 -0
- package/dist/internal/password-kernel.mjs +704 -0
- package/dist/internal/password-kernel.mjs.map +1 -0
- package/dist/internal/persistence.mjs +289 -0
- package/dist/internal/persistence.mjs.map +1 -0
- package/dist/internal/phone-kernel.mjs +434 -0
- package/dist/internal/phone-kernel.mjs.map +1 -0
- package/dist/internal/proof-kernel.d.mts +9 -0
- package/dist/internal/proof-kernel.mjs +619 -0
- package/dist/internal/proof-kernel.mjs.map +1 -0
- package/dist/internal/query-operations.d.mts +3 -0
- package/dist/internal/registration.mjs +65 -0
- package/dist/internal/registration.mjs.map +1 -0
- package/dist/internal/session-kernel.mjs +737 -0
- package/dist/internal/session-kernel.mjs.map +1 -0
- package/dist/internal/sql-persistence.d.mts +11 -0
- package/dist/internal/sql-persistence.mjs +37 -0
- package/dist/internal/sql-persistence.mjs.map +1 -0
- package/dist/internal/sql-query.mjs +207 -0
- package/dist/internal/sql-query.mjs.map +1 -0
- package/dist/internal/sql-table.d.mts +37 -0
- package/dist/internal/sql-table.mjs +71 -0
- package/dist/internal/sql-table.mjs.map +1 -0
- package/dist/internal/storage-mapping.mjs +687 -0
- package/dist/internal/storage-mapping.mjs.map +1 -0
- package/dist/internal/storage-tables.d.mts +914 -0
- package/dist/internal/storage-tables.mjs +387 -0
- package/dist/internal/storage-tables.mjs.map +1 -0
- package/dist/internal/storage-validation.mjs +58 -0
- package/dist/internal/storage-validation.mjs.map +1 -0
- package/dist/internal/transaction-execution-kernel.d.mts +18 -0
- package/dist/internal/transaction-execution-kernel.mjs +118 -0
- package/dist/internal/transaction-execution-kernel.mjs.map +1 -0
- package/dist/internal/transaction-kernel.d.mts +7 -0
- package/dist/internal/transaction-kernel.mjs +260 -0
- package/dist/internal/transaction-kernel.mjs.map +1 -0
- package/package.json +1 -0
- package/src/Drizzle.ts +378 -0
- package/src/DrizzleD1.ts +136 -0
- package/src/DrizzleLibsql.ts +301 -0
- package/src/DrizzleMysql2.ts +184 -0
- package/src/DrizzlePglite.ts +174 -0
- package/src/DrizzlePostgres.ts +174 -0
- package/src/DrizzleSqliteBun.ts +258 -0
- package/src/DrizzleSqliteDo.ts +473 -0
- package/src/DrizzleSqliteNode.ts +259 -0
- package/src/DrizzleSqliteWasm.ts +263 -0
- package/src/drizzle/D1BatchStatements.ts +10 -0
- package/src/drizzle/PasswordPreparedPostconditions.ts +30 -0
- package/src/drizzle/SuppliedService.ts +10 -0
- package/src/drizzle/d1-emails.ts +1829 -0
- package/src/drizzle/d1-generated-statement.ts +129 -0
- package/src/drizzle/d1-identity.ts +375 -0
- package/src/drizzle/d1-oauth.ts +340 -0
- package/src/drizzle/d1-passkey.ts +373 -0
- package/src/drizzle/d1-password-prepared.ts +1270 -0
- package/src/drizzle/d1-passwords.ts +2656 -0
- package/src/drizzle/d1-phone.ts +96 -0
- package/src/drizzle/d1-planning.ts +104 -0
- package/src/drizzle/d1-proofs.ts +2305 -0
- package/src/drizzle/d1-sessions.ts +2857 -0
- package/src/drizzle/d1-totp.ts +78 -0
- package/src/drizzle/email-model.ts +516 -0
- package/src/drizzle/email-registration.ts +698 -0
- package/src/drizzle/email-sql.ts +24 -0
- package/src/drizzle/email-target.ts +243 -0
- package/src/drizzle/model.ts +463 -0
- package/src/drizzle/mysql-emails.ts +321 -0
- package/src/drizzle/mysql-identity.ts +324 -0
- package/src/drizzle/mysql-password-prepared.ts +204 -0
- package/src/drizzle/mysql-passwords.ts +339 -0
- package/src/drizzle/mysql-proofs.ts +181 -0
- package/src/drizzle/mysql-sessions.ts +741 -0
- package/src/drizzle/mysql.ts +687 -0
- package/src/drizzle/oauth-accounts.ts +804 -0
- package/src/drizzle/oauth-connected-access.ts +354 -0
- package/src/drizzle/oauth-connected-collection.ts +324 -0
- package/src/drizzle/oauth-connected-custody.ts +277 -0
- package/src/drizzle/oauth-connected-drivers.ts +465 -0
- package/src/drizzle/oauth-connected-flow.ts +441 -0
- package/src/drizzle/oauth-connected-input.ts +127 -0
- package/src/drizzle/oauth-connected-maintenance.ts +345 -0
- package/src/drizzle/oauth-connected-management.ts +365 -0
- package/src/drizzle/oauth-connected-model.ts +347 -0
- package/src/drizzle/oauth-connected-reference.ts +112 -0
- package/src/drizzle/oauth-connected-settlement.ts +226 -0
- package/src/drizzle/oauth-connected-state.ts +845 -0
- package/src/drizzle/oauth-connected-target.ts +264 -0
- package/src/drizzle/oauth-drivers.ts +569 -0
- package/src/drizzle/oauth-flow.ts +462 -0
- package/src/drizzle/oauth-input.ts +201 -0
- package/src/drizzle/oauth-model.ts +617 -0
- package/src/drizzle/oauth-mysql.ts +10 -0
- package/src/drizzle/oauth-owner.ts +29 -0
- package/src/drizzle/oauth-registration.ts +640 -0
- package/src/drizzle/oauth-state.ts +215 -0
- package/src/drizzle/oauth-target.ts +750 -0
- package/src/drizzle/passkey-drivers.ts +385 -0
- package/src/drizzle/passkey-kernel.ts +3 -0
- package/src/drizzle/passkey-model.ts +353 -0
- package/src/drizzle/passkey-registration-ceremony-model.ts +69 -0
- package/src/drizzle/passkey-state.ts +3 -0
- package/src/drizzle/passkey-target.ts +23 -0
- package/src/drizzle/passkey-write-drivers.ts +395 -0
- package/src/drizzle/passkey-write-model.ts +271 -0
- package/src/drizzle/passkey-write-target.ts +9 -0
- package/src/drizzle/password-model.ts +491 -0
- package/src/drizzle/password-prepared-model.ts +259 -0
- package/src/drizzle/password-prepared-sql.ts +1191 -0
- package/src/drizzle/password-prepared-state.ts +231 -0
- package/src/drizzle/password-prepared-target.ts +160 -0
- package/src/drizzle/password-registration.ts +374 -0
- package/src/drizzle/password-sql.ts +12 -0
- package/src/drizzle/password-target.ts +224 -0
- package/src/drizzle/pg-emails.ts +321 -0
- package/src/drizzle/pg-password-prepared.ts +205 -0
- package/src/drizzle/pg-passwords.ts +338 -0
- package/src/drizzle/pg-proofs.ts +191 -0
- package/src/drizzle/pg-sessions.ts +750 -0
- package/src/drizzle/pg.ts +984 -0
- package/src/drizzle/phone-model.ts +190 -0
- package/src/drizzle/phone-state.ts +21 -0
- package/src/drizzle/phone-target.ts +472 -0
- package/src/drizzle/proof-model.ts +398 -0
- package/src/drizzle/proof-sql.ts +9 -0
- package/src/drizzle/proof-target.ts +122 -0
- package/src/drizzle/query-operations.ts +37 -0
- package/src/drizzle/session-model.ts +370 -0
- package/src/drizzle/session-sql.ts +13 -0
- package/src/drizzle/session-target.ts +338 -0
- package/src/drizzle/sqlite-emails.ts +366 -0
- package/src/drizzle/sqlite-identity.ts +344 -0
- package/src/drizzle/sqlite-password-prepared.ts +260 -0
- package/src/drizzle/sqlite-passwords.ts +497 -0
- package/src/drizzle/sqlite-proofs.ts +202 -0
- package/src/drizzle/sqlite-sessions.ts +971 -0
- package/src/drizzle/sqlite.ts +705 -0
- package/src/drizzle/standalone-guard.ts +38 -0
- package/src/drizzle/step-up-model.ts +128 -0
- package/src/drizzle/step-up-state.ts +139 -0
- package/src/drizzle/totp-model.ts +92 -0
- package/src/drizzle/totp-state.ts +525 -0
- package/src/drizzle/totp-target.ts +308 -0
- package/src/drizzle/transaction-execution.ts +12 -0
- package/src/drizzle/transaction-mysql.ts +104 -0
- package/src/drizzle/transaction-owner.ts +10 -0
- package/src/index.ts +4 -0
- package/src/internal/configuration.ts +282 -0
- package/src/internal/drizzle-migrations.ts +30 -0
- package/src/internal/drizzle-postgres.ts +81 -0
- package/src/internal/drizzle-sqlite.ts +79 -0
- package/src/internal/email-kernel.ts +1532 -0
- package/src/internal/mapping-error.ts +36 -0
- package/src/internal/passkey/admission.ts +362 -0
- package/src/internal/passkey/credentials.ts +511 -0
- package/src/internal/passkey/enrollment.ts +326 -0
- package/src/internal/passkey/flow.ts +1062 -0
- package/src/internal/passkey/management.ts +422 -0
- package/src/internal/passkey/registration-ceremony.ts +283 -0
- package/src/internal/passkey/registration-custody.ts +91 -0
- package/src/internal/passkey/registration-write.ts +426 -0
- package/src/internal/passkey/state.ts +354 -0
- package/src/internal/passkey/target.ts +586 -0
- package/src/internal/passkey/write-state.ts +681 -0
- package/src/internal/passkey/write-target.ts +452 -0
- package/src/internal/passkey-kernel.ts +102 -0
- package/src/internal/passkeys.ts +597 -0
- package/src/internal/password-kernel.ts +2122 -0
- package/src/internal/persistence.ts +590 -0
- package/src/internal/phone-kernel.ts +843 -0
- package/src/internal/proof-kernel.ts +1949 -0
- package/src/internal/query-operations.ts +26 -0
- package/src/internal/registration.ts +160 -0
- package/src/internal/session-kernel.ts +2210 -0
- package/src/internal/sql-persistence.ts +45 -0
- package/src/internal/sql-query.ts +298 -0
- package/src/internal/sql-table.ts +89 -0
- package/src/internal/storage-mapping.ts +706 -0
- package/src/internal/storage-tables.ts +408 -0
- package/src/internal/storage-validation.ts +117 -0
- package/src/internal/transaction-execution-kernel.ts +317 -0
- package/src/internal/transaction-kernel.ts +582 -0
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ExternalIdentityMutation,
|
|
3
|
+
type ExternalIdentity,
|
|
4
|
+
IdentityConflict,
|
|
5
|
+
IdentityUnavailable,
|
|
6
|
+
SubjectProvisioned,
|
|
7
|
+
SubjectProvisioner,
|
|
8
|
+
type SubjectProvisioningInput,
|
|
9
|
+
} from "@yielded/auth/Identity";
|
|
10
|
+
import { reportPersistenceFailure } from "@yielded/auth/Persistence";
|
|
11
|
+
import type { SubjectId } from "@yielded/auth/Schema";
|
|
12
|
+
/* oxlint-disable no-explicit-any -- Drizzle generic query types are narrowed at this technology boundary. */
|
|
13
|
+
import { and, eq, type AnyRelations } from "drizzle-orm";
|
|
14
|
+
import type { QueryEffectHKTBase } from "drizzle-orm/effect-core";
|
|
15
|
+
import type { AnySQLiteTable, SQLiteColumn } from "drizzle-orm/sqlite-core";
|
|
16
|
+
import type { SQLiteEffectDatabase } from "drizzle-orm/sqlite-core/effect/db";
|
|
17
|
+
import { Cause, Effect, Schema } from "effect";
|
|
18
|
+
|
|
19
|
+
import {
|
|
20
|
+
column,
|
|
21
|
+
isMappedConstraintConflict,
|
|
22
|
+
PersistenceMappingError,
|
|
23
|
+
provisioningFingerprint,
|
|
24
|
+
type ExternalIdentityTables,
|
|
25
|
+
type IdentityTables,
|
|
26
|
+
type SubjectProvisioningTables,
|
|
27
|
+
} from "./model";
|
|
28
|
+
|
|
29
|
+
type ClosedQueryEffectHKT = QueryEffectHKTBase & { readonly context: never };
|
|
30
|
+
type Database<HKT extends ClosedQueryEffectHKT, RunResult> = SQLiteEffectDatabase<
|
|
31
|
+
HKT,
|
|
32
|
+
RunResult,
|
|
33
|
+
AnyRelations
|
|
34
|
+
>;
|
|
35
|
+
type RuntimeDatabase<HKT extends ClosedQueryEffectHKT, RunResult> = SQLiteEffectDatabase<
|
|
36
|
+
HKT,
|
|
37
|
+
RunResult,
|
|
38
|
+
any
|
|
39
|
+
>;
|
|
40
|
+
const unavailable = () => IdentityUnavailable.make();
|
|
41
|
+
const isIdentityFailure = Schema.is(Schema.Union([IdentityConflict, IdentityUnavailable]));
|
|
42
|
+
|
|
43
|
+
const mapUnavailable = <A, E, R>(effect: Effect.Effect<A, E, R>) =>
|
|
44
|
+
reportPersistenceFailure(effect, isIdentityFailure).pipe(
|
|
45
|
+
Effect.catchCause((cause) =>
|
|
46
|
+
Effect.failCause(
|
|
47
|
+
Cause.map(cause, (error) => (isIdentityFailure(error) ? error : unavailable())),
|
|
48
|
+
),
|
|
49
|
+
),
|
|
50
|
+
);
|
|
51
|
+
|
|
52
|
+
export const makeSqliteSubjectProvisioningServices = <
|
|
53
|
+
Subject extends AnySQLiteTable,
|
|
54
|
+
Identifier extends AnySQLiteTable,
|
|
55
|
+
Request extends AnySQLiteTable,
|
|
56
|
+
NativeId,
|
|
57
|
+
HKT extends ClosedQueryEffectHKT = ClosedQueryEffectHKT,
|
|
58
|
+
RunResult = unknown,
|
|
59
|
+
>(
|
|
60
|
+
database: Database<HKT, RunResult>,
|
|
61
|
+
mapping: SubjectProvisioningTables<Subject, Identifier, Request, NativeId>,
|
|
62
|
+
mode: "interactive" | "synchronous",
|
|
63
|
+
) => {
|
|
64
|
+
const db = database as RuntimeDatabase<HKT, RunResult>;
|
|
65
|
+
const requestTable = mapping.provisioningRequest.table;
|
|
66
|
+
|
|
67
|
+
const requestIdColumn = column(
|
|
68
|
+
requestTable,
|
|
69
|
+
mapping.provisioningRequest.requestId,
|
|
70
|
+
) as SQLiteColumn;
|
|
71
|
+
|
|
72
|
+
const requestFingerprintColumn = column(
|
|
73
|
+
requestTable,
|
|
74
|
+
mapping.provisioningRequest.fingerprint,
|
|
75
|
+
) as SQLiteColumn;
|
|
76
|
+
|
|
77
|
+
const requestSubjectColumn = column(
|
|
78
|
+
requestTable,
|
|
79
|
+
mapping.provisioningRequest.subjectId,
|
|
80
|
+
) as SQLiteColumn;
|
|
81
|
+
|
|
82
|
+
const identifierTable = mapping.identifier.table;
|
|
83
|
+
|
|
84
|
+
const identifierNamespaceColumn = column(
|
|
85
|
+
identifierTable,
|
|
86
|
+
mapping.identifier.namespace,
|
|
87
|
+
) as SQLiteColumn;
|
|
88
|
+
|
|
89
|
+
const identifierValueColumn = column(identifierTable, mapping.identifier.value) as SQLiteColumn;
|
|
90
|
+
const subjectIdColumn = column(mapping.subject.table, mapping.subject.id) as SQLiteColumn;
|
|
91
|
+
|
|
92
|
+
const findReceipt = Effect.fn("DrizzleSqliteIdentity.findReceipt")(function* (requestId: string) {
|
|
93
|
+
const rows = yield* db
|
|
94
|
+
.select({ fingerprint: requestFingerprintColumn, subjectId: requestSubjectColumn })
|
|
95
|
+
.from(requestTable as any)
|
|
96
|
+
.where(eq(requestIdColumn, requestId))
|
|
97
|
+
.limit(1);
|
|
98
|
+
|
|
99
|
+
return rows[0];
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
const provision = Effect.fn("DrizzleSqliteIdentity.provision")(function* (
|
|
103
|
+
input: SubjectProvisioningInput,
|
|
104
|
+
) {
|
|
105
|
+
if (
|
|
106
|
+
mode === "synchronous" &&
|
|
107
|
+
mapping.subject.allocateId !== undefined &&
|
|
108
|
+
mapping.subject.allocateIdSync === undefined
|
|
109
|
+
) {
|
|
110
|
+
return yield* unavailable();
|
|
111
|
+
}
|
|
112
|
+
const fingerprint = provisioningFingerprint(input);
|
|
113
|
+
const existing = yield* findReceipt(input.requestId);
|
|
114
|
+
|
|
115
|
+
if (existing !== undefined) {
|
|
116
|
+
if (existing.fingerprint !== fingerprint) return yield* IdentityConflict.make();
|
|
117
|
+
const subjectId = yield* mapping.subjectId.toSubject(existing.subjectId as NativeId);
|
|
118
|
+
|
|
119
|
+
return SubjectProvisioned.make({ subjectId });
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
const attempt = db.transaction((tx) =>
|
|
123
|
+
Effect.gen(function* () {
|
|
124
|
+
const allocated =
|
|
125
|
+
mode === "synchronous"
|
|
126
|
+
? mapping.subject.allocateIdSync?.()
|
|
127
|
+
: mapping.subject.allocateId === undefined
|
|
128
|
+
? mapping.subject.allocateIdSync?.()
|
|
129
|
+
: yield* mapping.subject.allocateId;
|
|
130
|
+
|
|
131
|
+
const inserted = yield* tx
|
|
132
|
+
.insert(mapping.subject.table as any)
|
|
133
|
+
.values(mapping.subject.encodeInsert(input, allocated) as any)
|
|
134
|
+
.returning({ id: subjectIdColumn });
|
|
135
|
+
|
|
136
|
+
const nativeId = (inserted[0]?.id ?? allocated) as NativeId | undefined;
|
|
137
|
+
|
|
138
|
+
if (nativeId === undefined)
|
|
139
|
+
return yield* PersistenceMappingError.make({
|
|
140
|
+
operation: "provisionSubject.generatedId",
|
|
141
|
+
cause: new Error("subject insert did not return its native id"),
|
|
142
|
+
});
|
|
143
|
+
if (input.identifier !== undefined)
|
|
144
|
+
yield* tx
|
|
145
|
+
.insert(identifierTable as any)
|
|
146
|
+
.values(
|
|
147
|
+
mapping.identifier.encodeInsert(input.identifier, nativeId, input.verifiedAt) as any,
|
|
148
|
+
);
|
|
149
|
+
yield* tx
|
|
150
|
+
.insert(requestTable as any)
|
|
151
|
+
.values(
|
|
152
|
+
mapping.provisioningRequest.encodeInsert(input.requestId, fingerprint, nativeId) as any,
|
|
153
|
+
);
|
|
154
|
+
|
|
155
|
+
return nativeId;
|
|
156
|
+
}),
|
|
157
|
+
);
|
|
158
|
+
|
|
159
|
+
const nativeId = yield* attempt.pipe(
|
|
160
|
+
Effect.catchCause(
|
|
161
|
+
(
|
|
162
|
+
cause,
|
|
163
|
+
): Effect.Effect<
|
|
164
|
+
NativeId,
|
|
165
|
+
| Effect.Error<typeof attempt>
|
|
166
|
+
| Effect.Error<ReturnType<typeof findReceipt>>
|
|
167
|
+
| IdentityConflict
|
|
168
|
+
> => {
|
|
169
|
+
if (
|
|
170
|
+
cause.reasons.length === 0 ||
|
|
171
|
+
!cause.reasons.every(
|
|
172
|
+
(reason) =>
|
|
173
|
+
Cause.isFailReason(reason) &&
|
|
174
|
+
isMappedConstraintConflict(mapping.isConstraintConflict, reason.error),
|
|
175
|
+
)
|
|
176
|
+
)
|
|
177
|
+
return Effect.failCause(cause);
|
|
178
|
+
|
|
179
|
+
return findReceipt(input.requestId).pipe(
|
|
180
|
+
Effect.flatMap((receipt) => {
|
|
181
|
+
if (receipt !== undefined && receipt.fingerprint === fingerprint)
|
|
182
|
+
return Effect.succeed(receipt.subjectId as NativeId);
|
|
183
|
+
if (input.identifier === undefined) return IdentityConflict.make();
|
|
184
|
+
|
|
185
|
+
return db
|
|
186
|
+
.select({
|
|
187
|
+
subjectId: column(identifierTable, mapping.identifier.subjectId) as SQLiteColumn,
|
|
188
|
+
})
|
|
189
|
+
.from(identifierTable as any)
|
|
190
|
+
.where(
|
|
191
|
+
and(
|
|
192
|
+
eq(identifierNamespaceColumn, input.identifier.namespace),
|
|
193
|
+
eq(identifierValueColumn, input.identifier.value),
|
|
194
|
+
),
|
|
195
|
+
)
|
|
196
|
+
.limit(1)
|
|
197
|
+
.pipe(Effect.flatMap(() => IdentityConflict.make()));
|
|
198
|
+
}),
|
|
199
|
+
);
|
|
200
|
+
},
|
|
201
|
+
),
|
|
202
|
+
);
|
|
203
|
+
|
|
204
|
+
const subjectId = yield* mapping.subjectId.toSubject(nativeId);
|
|
205
|
+
|
|
206
|
+
return SubjectProvisioned.make({ subjectId });
|
|
207
|
+
}, mapUnavailable);
|
|
208
|
+
|
|
209
|
+
return { subjectProvisioner: SubjectProvisioner.of({ provision }) } as const;
|
|
210
|
+
};
|
|
211
|
+
|
|
212
|
+
export const makeSqliteExternalIdentityServices = <
|
|
213
|
+
Subject extends AnySQLiteTable,
|
|
214
|
+
External extends AnySQLiteTable,
|
|
215
|
+
NativeId,
|
|
216
|
+
HKT extends ClosedQueryEffectHKT = ClosedQueryEffectHKT,
|
|
217
|
+
RunResult = unknown,
|
|
218
|
+
>(
|
|
219
|
+
database: Database<HKT, RunResult>,
|
|
220
|
+
mapping: ExternalIdentityTables<Subject, External, NativeId>,
|
|
221
|
+
) => {
|
|
222
|
+
const db = database as RuntimeDatabase<HKT, RunResult>;
|
|
223
|
+
const externalTable = mapping.externalIdentity.table;
|
|
224
|
+
|
|
225
|
+
const externalProviderColumn = column(
|
|
226
|
+
externalTable,
|
|
227
|
+
mapping.externalIdentity.provider,
|
|
228
|
+
) as SQLiteColumn;
|
|
229
|
+
|
|
230
|
+
const externalIssuerColumn = column(
|
|
231
|
+
externalTable,
|
|
232
|
+
mapping.externalIdentity.issuer,
|
|
233
|
+
) as SQLiteColumn;
|
|
234
|
+
|
|
235
|
+
const externalSubjectColumn = column(
|
|
236
|
+
externalTable,
|
|
237
|
+
mapping.externalIdentity.subject,
|
|
238
|
+
) as SQLiteColumn;
|
|
239
|
+
|
|
240
|
+
const externalSubjectIdColumn = column(
|
|
241
|
+
externalTable,
|
|
242
|
+
mapping.externalIdentity.subjectId,
|
|
243
|
+
) as SQLiteColumn;
|
|
244
|
+
|
|
245
|
+
const subjectIdColumn = column(mapping.subject.table, mapping.subject.id) as SQLiteColumn;
|
|
246
|
+
const subjectStatusColumn = column(mapping.subject.table, mapping.subject.status) as SQLiteColumn;
|
|
247
|
+
|
|
248
|
+
const bind = Effect.fn("DrizzleSqliteIdentity.bindExternalIdentity")(function* (
|
|
249
|
+
subjectId: SubjectId,
|
|
250
|
+
identity: ExternalIdentity,
|
|
251
|
+
) {
|
|
252
|
+
const nativeId = yield* mapping.subjectId.toNative(subjectId);
|
|
253
|
+
|
|
254
|
+
const decision = yield* db
|
|
255
|
+
.transaction((tx) =>
|
|
256
|
+
Effect.gen(function* () {
|
|
257
|
+
const subjects = yield* tx
|
|
258
|
+
.select({ status: subjectStatusColumn })
|
|
259
|
+
.from(mapping.subject.table as any)
|
|
260
|
+
.where(eq(subjectIdColumn, nativeId))
|
|
261
|
+
.limit(1);
|
|
262
|
+
|
|
263
|
+
if (subjects[0] === undefined || !mapping.subject.isActiveStatus(subjects[0].status))
|
|
264
|
+
return { _tag: "conflict" } as const;
|
|
265
|
+
|
|
266
|
+
const links = yield* tx
|
|
267
|
+
.select({ subjectId: externalSubjectIdColumn })
|
|
268
|
+
.from(externalTable as any)
|
|
269
|
+
.where(
|
|
270
|
+
and(
|
|
271
|
+
eq(externalProviderColumn, identity.provider),
|
|
272
|
+
eq(externalIssuerColumn, identity.issuer),
|
|
273
|
+
eq(externalSubjectColumn, identity.subject),
|
|
274
|
+
),
|
|
275
|
+
)
|
|
276
|
+
.limit(1);
|
|
277
|
+
|
|
278
|
+
if (links[0] !== undefined)
|
|
279
|
+
return mapping.subjectId.equals(links[0].subjectId as NativeId, nativeId)
|
|
280
|
+
? ({ _tag: "bound" } as const)
|
|
281
|
+
: ({ _tag: "conflict" } as const);
|
|
282
|
+
yield* tx
|
|
283
|
+
.insert(externalTable as any)
|
|
284
|
+
.values(mapping.externalIdentity.encodeInsert(identity, nativeId) as any);
|
|
285
|
+
|
|
286
|
+
return { _tag: "bound" } as const;
|
|
287
|
+
}),
|
|
288
|
+
)
|
|
289
|
+
.pipe(
|
|
290
|
+
Effect.catchCause((cause) => {
|
|
291
|
+
if (
|
|
292
|
+
cause.reasons.length === 0 ||
|
|
293
|
+
!cause.reasons.every(
|
|
294
|
+
(reason) =>
|
|
295
|
+
Cause.isFailReason(reason) &&
|
|
296
|
+
isMappedConstraintConflict(mapping.isConstraintConflict, reason.error),
|
|
297
|
+
)
|
|
298
|
+
)
|
|
299
|
+
return Effect.failCause(cause);
|
|
300
|
+
|
|
301
|
+
return db
|
|
302
|
+
.select({ subjectId: externalSubjectIdColumn })
|
|
303
|
+
.from(externalTable as any)
|
|
304
|
+
.where(
|
|
305
|
+
and(
|
|
306
|
+
eq(externalProviderColumn, identity.provider),
|
|
307
|
+
eq(externalIssuerColumn, identity.issuer),
|
|
308
|
+
eq(externalSubjectColumn, identity.subject),
|
|
309
|
+
),
|
|
310
|
+
)
|
|
311
|
+
.limit(1)
|
|
312
|
+
.pipe(
|
|
313
|
+
Effect.map((rows) =>
|
|
314
|
+
rows[0] !== undefined &&
|
|
315
|
+
mapping.subjectId.equals(rows[0].subjectId as NativeId, nativeId)
|
|
316
|
+
? ({ _tag: "bound" } as const)
|
|
317
|
+
: ({ _tag: "conflict" } as const),
|
|
318
|
+
),
|
|
319
|
+
);
|
|
320
|
+
}),
|
|
321
|
+
);
|
|
322
|
+
|
|
323
|
+
if (decision._tag === "conflict") return yield* IdentityConflict.make();
|
|
324
|
+
}, mapUnavailable);
|
|
325
|
+
|
|
326
|
+
return { externalIdentityMutation: ExternalIdentityMutation.of({ bind }) } as const;
|
|
327
|
+
};
|
|
328
|
+
|
|
329
|
+
export const makeSqliteIdentityServices = <
|
|
330
|
+
Subject extends AnySQLiteTable,
|
|
331
|
+
Identifier extends AnySQLiteTable,
|
|
332
|
+
External extends AnySQLiteTable,
|
|
333
|
+
Request extends AnySQLiteTable,
|
|
334
|
+
NativeId,
|
|
335
|
+
HKT extends ClosedQueryEffectHKT = ClosedQueryEffectHKT,
|
|
336
|
+
RunResult = unknown,
|
|
337
|
+
>(
|
|
338
|
+
database: Database<HKT, RunResult>,
|
|
339
|
+
mapping: IdentityTables<Subject, Identifier, External, Request, NativeId>,
|
|
340
|
+
mode: "interactive" | "synchronous",
|
|
341
|
+
) => ({
|
|
342
|
+
...makeSqliteSubjectProvisioningServices(database, mapping, mode),
|
|
343
|
+
...makeSqliteExternalIdentityServices(database, mapping),
|
|
344
|
+
});
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
import type { LifecycleHooks, HookConfigurationError } from "@yielded/auth/Hooks";
|
|
2
|
+
import type { PasswordUnavailable, PasswordPreparedPersistence } from "@yielded/auth/Password";
|
|
3
|
+
import type { AnySQLiteTable } from "drizzle-orm/sqlite-core";
|
|
4
|
+
import { Effect, Context } from "effect";
|
|
5
|
+
import type { SqlError } from "effect/unstable/sql/SqlError";
|
|
6
|
+
|
|
7
|
+
import type {
|
|
8
|
+
PasswordPreparedPersistenceMapping,
|
|
9
|
+
PasswordPreparedProofMapping,
|
|
10
|
+
} from "./password-prepared-model";
|
|
11
|
+
import {
|
|
12
|
+
makeTargetPasswordPreparedPersistenceServices,
|
|
13
|
+
coordinateTargetPasswordPreparedPersistence,
|
|
14
|
+
} from "./password-prepared-target";
|
|
15
|
+
import type { PasswordTargetConfiguration } from "./password-target";
|
|
16
|
+
import type { SqlitePasswordDatabase } from "./sqlite-passwords";
|
|
17
|
+
import type { SuppliedService } from "./SuppliedService";
|
|
18
|
+
type TransactionOf<D extends SqlitePasswordDatabase> = Parameters<
|
|
19
|
+
Parameters<D["transaction"]>[0]
|
|
20
|
+
>[0];
|
|
21
|
+
|
|
22
|
+
export const makeSqlitePasswordPreparedTarget = <
|
|
23
|
+
D extends SqlitePasswordDatabase,
|
|
24
|
+
Synchronous extends boolean = false,
|
|
25
|
+
>(
|
|
26
|
+
configuration: PasswordTargetConfiguration | ((database: D) => PasswordTargetConfiguration),
|
|
27
|
+
) => {
|
|
28
|
+
const configurationFor = (database: D) =>
|
|
29
|
+
typeof configuration === "function" ? configuration(database) : configuration;
|
|
30
|
+
|
|
31
|
+
function coordinatePasswordPreparedPersistence<
|
|
32
|
+
Database extends D,
|
|
33
|
+
TargetId,
|
|
34
|
+
S extends AnySQLiteTable,
|
|
35
|
+
I extends AnySQLiteTable,
|
|
36
|
+
C extends AnySQLiteTable,
|
|
37
|
+
AC extends AnySQLiteTable,
|
|
38
|
+
A extends AnySQLiteTable,
|
|
39
|
+
RS extends AnySQLiteTable,
|
|
40
|
+
CE extends AnySQLiteTable,
|
|
41
|
+
M extends AnySQLiteTable,
|
|
42
|
+
T extends AnySQLiteTable,
|
|
43
|
+
B extends AnySQLiteTable,
|
|
44
|
+
NativeId,
|
|
45
|
+
PS extends AnySQLiteTable,
|
|
46
|
+
PC extends AnySQLiteTable,
|
|
47
|
+
PM extends AnySQLiteTable,
|
|
48
|
+
PSub extends AnySQLiteTable,
|
|
49
|
+
PI extends AnySQLiteTable,
|
|
50
|
+
PCr extends AnySQLiteTable,
|
|
51
|
+
PNativeId,
|
|
52
|
+
Out,
|
|
53
|
+
E,
|
|
54
|
+
R,
|
|
55
|
+
DatabaseError,
|
|
56
|
+
DatabaseRequirements,
|
|
57
|
+
>(
|
|
58
|
+
acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>,
|
|
59
|
+
options: {
|
|
60
|
+
readonly mapping: PasswordPreparedPersistenceMapping<
|
|
61
|
+
S,
|
|
62
|
+
I,
|
|
63
|
+
C,
|
|
64
|
+
AC,
|
|
65
|
+
A,
|
|
66
|
+
RS,
|
|
67
|
+
CE,
|
|
68
|
+
M,
|
|
69
|
+
T,
|
|
70
|
+
B,
|
|
71
|
+
NativeId
|
|
72
|
+
>;
|
|
73
|
+
readonly proofMapping?:
|
|
74
|
+
| PasswordPreparedProofMapping<PS, PC, PM, PSub, PI, PCr, PNativeId>
|
|
75
|
+
| undefined;
|
|
76
|
+
readonly target: SuppliedService<TargetId, PasswordPreparedPersistence>;
|
|
77
|
+
readonly transaction?: never;
|
|
78
|
+
},
|
|
79
|
+
body: Effect.Effect<Out, E, Synchronous extends true ? NoInfer<TargetId> : R>,
|
|
80
|
+
): Effect.Effect<
|
|
81
|
+
Out,
|
|
82
|
+
E | PasswordUnavailable | HookConfigurationError | SqlError | DatabaseError,
|
|
83
|
+
| (Synchronous extends true ? never : Exclude<R, TargetId>)
|
|
84
|
+
| LifecycleHooks
|
|
85
|
+
| DatabaseRequirements
|
|
86
|
+
>;
|
|
87
|
+
function coordinatePasswordPreparedPersistence<
|
|
88
|
+
Database extends D,
|
|
89
|
+
TargetId,
|
|
90
|
+
S extends AnySQLiteTable,
|
|
91
|
+
I extends AnySQLiteTable,
|
|
92
|
+
C extends AnySQLiteTable,
|
|
93
|
+
AC extends AnySQLiteTable,
|
|
94
|
+
A extends AnySQLiteTable,
|
|
95
|
+
RS extends AnySQLiteTable,
|
|
96
|
+
CE extends AnySQLiteTable,
|
|
97
|
+
M extends AnySQLiteTable,
|
|
98
|
+
T extends AnySQLiteTable,
|
|
99
|
+
B extends AnySQLiteTable,
|
|
100
|
+
NativeId,
|
|
101
|
+
PS extends AnySQLiteTable,
|
|
102
|
+
PC extends AnySQLiteTable,
|
|
103
|
+
PM extends AnySQLiteTable,
|
|
104
|
+
PSub extends AnySQLiteTable,
|
|
105
|
+
PI extends AnySQLiteTable,
|
|
106
|
+
PCr extends AnySQLiteTable,
|
|
107
|
+
PNativeId,
|
|
108
|
+
Out,
|
|
109
|
+
E,
|
|
110
|
+
R,
|
|
111
|
+
DatabaseError,
|
|
112
|
+
DatabaseRequirements,
|
|
113
|
+
TxId,
|
|
114
|
+
TxShape,
|
|
115
|
+
>(
|
|
116
|
+
acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>,
|
|
117
|
+
options: {
|
|
118
|
+
readonly mapping: PasswordPreparedPersistenceMapping<
|
|
119
|
+
S,
|
|
120
|
+
I,
|
|
121
|
+
C,
|
|
122
|
+
AC,
|
|
123
|
+
A,
|
|
124
|
+
RS,
|
|
125
|
+
CE,
|
|
126
|
+
M,
|
|
127
|
+
T,
|
|
128
|
+
B,
|
|
129
|
+
NativeId
|
|
130
|
+
>;
|
|
131
|
+
readonly proofMapping?:
|
|
132
|
+
| PasswordPreparedProofMapping<PS, PC, PM, PSub, PI, PCr, PNativeId>
|
|
133
|
+
| undefined;
|
|
134
|
+
readonly target: SuppliedService<TargetId, PasswordPreparedPersistence>;
|
|
135
|
+
readonly transaction: SuppliedService<TxId, NoInfer<TransactionOf<Database>>, TxShape>;
|
|
136
|
+
},
|
|
137
|
+
body: Effect.Effect<Out, E, Synchronous extends true ? NoInfer<TargetId | TxId> : R>,
|
|
138
|
+
): Effect.Effect<
|
|
139
|
+
Out,
|
|
140
|
+
E | PasswordUnavailable | HookConfigurationError | SqlError | DatabaseError,
|
|
141
|
+
| (Synchronous extends true ? never : Exclude<R, TargetId | TxId>)
|
|
142
|
+
| LifecycleHooks
|
|
143
|
+
| DatabaseRequirements
|
|
144
|
+
>;
|
|
145
|
+
function coordinatePasswordPreparedPersistence<
|
|
146
|
+
Database extends D,
|
|
147
|
+
TargetId,
|
|
148
|
+
S extends AnySQLiteTable,
|
|
149
|
+
I extends AnySQLiteTable,
|
|
150
|
+
C extends AnySQLiteTable,
|
|
151
|
+
AC extends AnySQLiteTable,
|
|
152
|
+
A extends AnySQLiteTable,
|
|
153
|
+
RS extends AnySQLiteTable,
|
|
154
|
+
CE extends AnySQLiteTable,
|
|
155
|
+
M extends AnySQLiteTable,
|
|
156
|
+
T extends AnySQLiteTable,
|
|
157
|
+
B extends AnySQLiteTable,
|
|
158
|
+
NativeId,
|
|
159
|
+
PS extends AnySQLiteTable,
|
|
160
|
+
PC extends AnySQLiteTable,
|
|
161
|
+
PM extends AnySQLiteTable,
|
|
162
|
+
PSub extends AnySQLiteTable,
|
|
163
|
+
PI extends AnySQLiteTable,
|
|
164
|
+
PCr extends AnySQLiteTable,
|
|
165
|
+
PNativeId,
|
|
166
|
+
Out,
|
|
167
|
+
E,
|
|
168
|
+
R,
|
|
169
|
+
DatabaseError,
|
|
170
|
+
DatabaseRequirements,
|
|
171
|
+
TxId,
|
|
172
|
+
TxShape,
|
|
173
|
+
>(
|
|
174
|
+
acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>,
|
|
175
|
+
options: {
|
|
176
|
+
readonly mapping: PasswordPreparedPersistenceMapping<
|
|
177
|
+
S,
|
|
178
|
+
I,
|
|
179
|
+
C,
|
|
180
|
+
AC,
|
|
181
|
+
A,
|
|
182
|
+
RS,
|
|
183
|
+
CE,
|
|
184
|
+
M,
|
|
185
|
+
T,
|
|
186
|
+
B,
|
|
187
|
+
NativeId
|
|
188
|
+
>;
|
|
189
|
+
readonly proofMapping?:
|
|
190
|
+
| PasswordPreparedProofMapping<PS, PC, PM, PSub, PI, PCr, PNativeId>
|
|
191
|
+
| undefined;
|
|
192
|
+
readonly target: SuppliedService<TargetId, PasswordPreparedPersistence>;
|
|
193
|
+
readonly transaction?: SuppliedService<TxId, NoInfer<TransactionOf<Database>>, TxShape>;
|
|
194
|
+
},
|
|
195
|
+
body: Effect.Effect<Out, E, R>,
|
|
196
|
+
): Effect.Effect<
|
|
197
|
+
Out,
|
|
198
|
+
E | PasswordUnavailable | HookConfigurationError | SqlError | DatabaseError,
|
|
199
|
+
Exclude<R, TargetId> | LifecycleHooks | DatabaseRequirements
|
|
200
|
+
> {
|
|
201
|
+
return Effect.flatMap(acquire, (database) =>
|
|
202
|
+
coordinateTargetPasswordPreparedPersistence<
|
|
203
|
+
TransactionOf<Database>,
|
|
204
|
+
Out,
|
|
205
|
+
E,
|
|
206
|
+
Exclude<R, TargetId>
|
|
207
|
+
>(
|
|
208
|
+
database,
|
|
209
|
+
options.mapping,
|
|
210
|
+
configurationFor(database),
|
|
211
|
+
options.proofMapping,
|
|
212
|
+
(
|
|
213
|
+
transaction: TransactionOf<Database>,
|
|
214
|
+
services: { readonly passwordPreparedPersistence: PasswordPreparedPersistence },
|
|
215
|
+
) => {
|
|
216
|
+
const provided = Context.make(options.target, services.passwordPreparedPersistence);
|
|
217
|
+
const work = Effect.provideContext(body, provided);
|
|
218
|
+
|
|
219
|
+
return options.transaction === undefined
|
|
220
|
+
? work
|
|
221
|
+
: Effect.provideService(work, options.transaction, options.transaction.of(transaction));
|
|
222
|
+
},
|
|
223
|
+
),
|
|
224
|
+
);
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
return {
|
|
228
|
+
makePasswordPreparedPersistenceServices: <
|
|
229
|
+
S extends AnySQLiteTable,
|
|
230
|
+
I extends AnySQLiteTable,
|
|
231
|
+
C extends AnySQLiteTable,
|
|
232
|
+
AC extends AnySQLiteTable,
|
|
233
|
+
A extends AnySQLiteTable,
|
|
234
|
+
RS extends AnySQLiteTable,
|
|
235
|
+
CE extends AnySQLiteTable,
|
|
236
|
+
M extends AnySQLiteTable,
|
|
237
|
+
T extends AnySQLiteTable,
|
|
238
|
+
B extends AnySQLiteTable,
|
|
239
|
+
NativeId,
|
|
240
|
+
PS extends AnySQLiteTable = AnySQLiteTable,
|
|
241
|
+
PC extends AnySQLiteTable = AnySQLiteTable,
|
|
242
|
+
PM extends AnySQLiteTable = AnySQLiteTable,
|
|
243
|
+
PSub extends AnySQLiteTable = AnySQLiteTable,
|
|
244
|
+
PI extends AnySQLiteTable = AnySQLiteTable,
|
|
245
|
+
PCr extends AnySQLiteTable = AnySQLiteTable,
|
|
246
|
+
PNativeId = unknown,
|
|
247
|
+
>(
|
|
248
|
+
database: D,
|
|
249
|
+
mapping: PasswordPreparedPersistenceMapping<S, I, C, AC, A, RS, CE, M, T, B, NativeId>,
|
|
250
|
+
proofMapping?: PasswordPreparedProofMapping<PS, PC, PM, PSub, PI, PCr, PNativeId>,
|
|
251
|
+
) =>
|
|
252
|
+
makeTargetPasswordPreparedPersistenceServices(
|
|
253
|
+
database,
|
|
254
|
+
mapping,
|
|
255
|
+
configurationFor(database),
|
|
256
|
+
proofMapping,
|
|
257
|
+
),
|
|
258
|
+
coordinatePasswordPreparedPersistence,
|
|
259
|
+
};
|
|
260
|
+
};
|