@yielded/auth-persistence-drizzle 0.1.0-beta.24 → 0.1.0-beta.26
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 +4 -2
- package/dist/D1.d.mts +495 -1151
- package/dist/D1.mjs +41 -19
- package/dist/D1.mjs.map +1 -1
- package/dist/Libsql.d.mts +385 -1996
- package/dist/Libsql.mjs +43 -47
- package/dist/Libsql.mjs.map +1 -1
- package/dist/Mysql2.d.mts +397 -1743
- package/dist/Mysql2.mjs +35 -41
- package/dist/Mysql2.mjs.map +1 -1
- package/dist/Pglite.d.mts +397 -1743
- package/dist/Pglite.mjs +42 -31
- package/dist/Pglite.mjs.map +1 -1
- package/dist/Postgres.d.mts +397 -1743
- package/dist/Postgres.mjs +42 -31
- package/dist/Postgres.mjs.map +1 -1
- package/dist/SqliteBun.d.mts +385 -1992
- package/dist/SqliteBun.mjs +43 -43
- package/dist/SqliteBun.mjs.map +1 -1
- package/dist/SqliteDo.d.mts +385 -1991
- package/dist/SqliteDo.mjs +42 -41
- package/dist/SqliteDo.mjs.map +1 -1
- package/dist/SqliteNode.d.mts +385 -1992
- package/dist/SqliteNode.mjs +43 -43
- package/dist/SqliteNode.mjs.map +1 -1
- package/dist/SqliteWasm.d.mts +385 -1992
- package/dist/SqliteWasm.mjs +43 -43
- package/dist/SqliteWasm.mjs.map +1 -1
- package/dist/drizzle/d1-identity.mjs +2 -2
- package/dist/drizzle/d1-identity.mjs.map +1 -1
- package/dist/drizzle/driver-types.d.mts +15 -0
- package/dist/drizzle/email-drivers.mjs +32 -0
- package/dist/drizzle/email-drivers.mjs.map +1 -0
- package/dist/drizzle/email-model.d.mts +9 -13
- package/dist/drizzle/email-target.d.mts +10 -11
- package/dist/drizzle/email-target.mjs +33 -70
- package/dist/drizzle/email-target.mjs.map +1 -1
- package/dist/drizzle/model.d.mts +1 -10
- package/dist/drizzle/model.mjs +1 -2
- package/dist/drizzle/model.mjs.map +1 -1
- package/dist/drizzle/mysql-identity.mjs +3 -6
- package/dist/drizzle/mysql-identity.mjs.map +1 -1
- package/dist/drizzle/native-clock.d.mts +9 -0
- package/dist/drizzle/native-clock.mjs +18 -0
- package/dist/drizzle/native-clock.mjs.map +1 -0
- package/dist/drizzle/native-database.d.mts +46 -0
- package/dist/drizzle/native-database.mjs +6 -5
- package/dist/drizzle/native-database.mjs.map +1 -1
- package/dist/drizzle/native-sql-table.mjs +13 -5
- package/dist/drizzle/native-sql-table.mjs.map +1 -1
- package/dist/drizzle/native-target.d.mts +6 -0
- package/dist/drizzle/native-target.mjs +44 -0
- package/dist/drizzle/native-target.mjs.map +1 -0
- package/dist/drizzle/oauth-connected-drivers.mjs +4 -56
- package/dist/drizzle/oauth-connected-drivers.mjs.map +1 -1
- package/dist/drizzle/oauth-connected-model.d.mts +5 -22
- package/dist/drizzle/oauth-connected-model.mjs +1 -7
- package/dist/drizzle/oauth-connected-reference.d.mts +5 -7
- package/dist/drizzle/oauth-connected-reference.mjs +11 -3
- package/dist/drizzle/oauth-connected-reference.mjs.map +1 -1
- package/dist/drizzle/oauth-drivers.mjs +1 -2
- package/dist/drizzle/oauth-drivers.mjs.map +1 -1
- package/dist/drizzle/oauth-model.d.mts +11 -37
- package/dist/drizzle/oauth-model.mjs +3 -4
- package/dist/drizzle/oauth-model.mjs.map +1 -1
- package/dist/drizzle/oauth-proxy.d.mts +1 -1
- package/dist/drizzle/oauth-proxy.mjs +1 -1
- package/dist/drizzle/oauth-target.d.mts +9 -6
- package/dist/drizzle/oauth-target.mjs +47 -15
- package/dist/drizzle/oauth-target.mjs.map +1 -1
- package/dist/drizzle/passkey/target.d.mts +14 -0
- package/dist/drizzle/passkey/target.mjs +52 -0
- package/dist/drizzle/passkey/target.mjs.map +1 -0
- package/dist/drizzle/passkey/write-target.d.mts +11 -0
- package/dist/drizzle/passkey/write-target.mjs +28 -0
- package/dist/drizzle/passkey/write-target.mjs.map +1 -0
- package/dist/drizzle/passkey-drivers.mjs +2 -4
- package/dist/drizzle/passkey-drivers.mjs.map +1 -1
- package/dist/drizzle/passkey-model.d.mts +5 -26
- package/dist/drizzle/passkey-model.mjs +2 -8
- package/dist/drizzle/passkey-registration-ceremony-model.d.mts +3 -6
- package/dist/drizzle/passkey-write-drivers.mjs +2 -3
- package/dist/drizzle/passkey-write-drivers.mjs.map +1 -1
- package/dist/drizzle/passkey-write-model.d.mts +7 -9
- package/dist/drizzle/passkey-write-model.mjs +1 -3
- package/dist/drizzle/passkey-write-model.mjs.map +1 -1
- package/dist/drizzle/password-drivers.mjs +31 -0
- package/dist/drizzle/password-drivers.mjs.map +1 -0
- package/dist/drizzle/password-model.d.mts +7 -10
- package/dist/drizzle/password-target.d.mts +7 -8
- package/dist/drizzle/password-target.mjs +23 -68
- package/dist/drizzle/password-target.mjs.map +1 -1
- package/dist/drizzle/pg-identity.mjs +3 -6
- package/dist/drizzle/pg-identity.mjs.map +1 -1
- package/dist/drizzle/phone-drivers.mjs +24 -0
- package/dist/drizzle/phone-drivers.mjs.map +1 -0
- package/dist/drizzle/phone-model.d.mts +13 -104
- package/dist/drizzle/phone-model.mjs +5 -33
- package/dist/drizzle/phone-model.mjs.map +1 -1
- package/dist/drizzle/phone-target.mjs +22 -171
- package/dist/drizzle/phone-target.mjs.map +1 -1
- package/dist/drizzle/proof-drivers.mjs +24 -0
- package/dist/drizzle/proof-drivers.mjs.map +1 -0
- package/dist/drizzle/proof-model.d.mts +7 -15
- package/dist/drizzle/proof-target.d.mts +5 -5
- package/dist/drizzle/proof-target.mjs +14 -28
- package/dist/drizzle/proof-target.mjs.map +1 -1
- package/dist/drizzle/session-drivers.mjs +97 -0
- package/dist/drizzle/session-drivers.mjs.map +1 -0
- package/dist/drizzle/session-model.d.mts +11 -22
- package/dist/drizzle/sqlite-do-database.d.mts +3 -3
- package/dist/drizzle/sqlite-do-database.mjs +6 -1
- package/dist/drizzle/sqlite-do-database.mjs.map +1 -1
- package/dist/drizzle/sqlite-identity.mjs +3 -5
- package/dist/drizzle/sqlite-identity.mjs.map +1 -1
- package/dist/drizzle/step-up-model.d.mts +2 -5
- package/dist/drizzle/storage-validation.mjs +2 -1
- package/dist/drizzle/storage-validation.mjs.map +1 -1
- package/dist/drizzle/totp-model.d.mts +7 -74
- package/dist/drizzle/totp-model.mjs +1 -5
- package/dist/drizzle/totp-model.mjs.map +1 -1
- package/dist/drizzle/totp-target.mjs +39 -75
- package/dist/drizzle/totp-target.mjs.map +1 -1
- package/dist/drizzle/transaction-handle.mjs +13 -0
- package/dist/drizzle/transaction-handle.mjs.map +1 -0
- package/dist/drizzle/transaction-mysql.mjs +43 -12
- package/dist/drizzle/transaction-mysql.mjs.map +1 -1
- package/dist/index.d.mts +17 -22
- package/dist/index.mjs +10 -16
- package/dist/internal/drizzle-postgres.mjs +4 -6
- package/dist/internal/drizzle-postgres.mjs.map +1 -1
- package/dist/internal/drizzle-sqlite.mjs +4 -6
- package/dist/internal/drizzle-sqlite.mjs.map +1 -1
- package/package.json +1 -1
- package/src/D1.ts +77 -74
- package/src/Libsql.ts +65 -105
- package/src/Mysql2.ts +52 -87
- package/src/Pglite.ts +74 -81
- package/src/Postgres.ts +74 -81
- package/src/SqliteBun.ts +65 -113
- package/src/SqliteDo.ts +58 -106
- package/src/SqliteNode.ts +65 -113
- package/src/SqliteWasm.ts +65 -113
- package/src/drizzle/d1-identity.ts +2 -2
- package/src/drizzle/driver-types.ts +26 -0
- package/src/drizzle/email-drivers.ts +320 -0
- package/src/drizzle/email-model.ts +24 -78
- package/src/drizzle/email-target.ts +118 -211
- package/src/drizzle/model.ts +0 -2
- package/src/drizzle/mysql-identity.ts +4 -24
- package/src/drizzle/native-clock.ts +21 -0
- package/src/drizzle/native-database.ts +59 -18
- package/src/drizzle/native-sql-table.ts +104 -87
- package/src/drizzle/native-target.ts +120 -0
- package/src/drizzle/oauth-connected-drivers.ts +24 -233
- package/src/drizzle/oauth-connected-model.ts +3 -93
- package/src/drizzle/oauth-connected-reference.ts +16 -25
- package/src/drizzle/oauth-drivers.ts +58 -99
- package/src/drizzle/oauth-model.ts +27 -132
- package/src/drizzle/oauth-target.ts +250 -33
- package/src/drizzle/passkey/target.ts +205 -0
- package/src/drizzle/passkey/write-target.ts +91 -0
- package/src/drizzle/passkey-drivers.ts +35 -133
- package/src/drizzle/passkey-model.ts +3 -81
- package/src/drizzle/passkey-registration-ceremony-model.ts +5 -25
- package/src/drizzle/passkey-write-drivers.ts +32 -102
- package/src/drizzle/passkey-write-model.ts +10 -44
- package/src/drizzle/password-drivers.ts +286 -0
- package/src/drizzle/password-model.ts +10 -44
- package/src/drizzle/password-target.ts +85 -239
- package/src/drizzle/pg-identity.ts +4 -19
- package/src/drizzle/phone-drivers.ts +142 -0
- package/src/drizzle/phone-model.ts +22 -162
- package/src/drizzle/phone-target.ts +51 -493
- package/src/drizzle/proof-drivers.ts +123 -0
- package/src/drizzle/proof-model.ts +12 -123
- package/src/drizzle/proof-target.ts +38 -102
- package/src/drizzle/session-drivers.ts +696 -0
- package/src/drizzle/session-model.ts +54 -118
- package/src/drizzle/sqlite-do-database.ts +8 -0
- package/src/drizzle/sqlite-identity.ts +4 -22
- package/src/drizzle/step-up-model.ts +13 -37
- package/src/drizzle/storage-validation.ts +2 -1
- package/src/drizzle/totp-model.ts +20 -77
- package/src/drizzle/totp-target.ts +121 -261
- package/src/drizzle/transaction-handle.ts +41 -0
- package/src/drizzle/transaction-mysql.ts +90 -25
- package/src/index.ts +7 -122
- package/src/internal/drizzle-postgres.ts +4 -7
- package/src/internal/drizzle-sqlite.ts +4 -7
- package/dist/drizzle/crypto.mjs +0 -11
- package/dist/drizzle/crypto.mjs.map +0 -1
- package/dist/drizzle/d1-emails.d.mts +0 -62
- package/dist/drizzle/d1-emails.mjs +0 -626
- package/dist/drizzle/d1-emails.mjs.map +0 -1
- package/dist/drizzle/d1-generated-statement.mjs +0 -79
- package/dist/drizzle/d1-generated-statement.mjs.map +0 -1
- package/dist/drizzle/d1-oauth.d.mts +0 -331
- package/dist/drizzle/d1-oauth.mjs +0 -79
- package/dist/drizzle/d1-oauth.mjs.map +0 -1
- package/dist/drizzle/d1-passkey.d.mts +0 -37
- package/dist/drizzle/d1-passkey.mjs +0 -98
- package/dist/drizzle/d1-passkey.mjs.map +0 -1
- package/dist/drizzle/d1-password-prepared.d.mts +0 -25
- package/dist/drizzle/d1-password-prepared.mjs +0 -473
- package/dist/drizzle/d1-password-prepared.mjs.map +0 -1
- package/dist/drizzle/d1-passwords.d.mts +0 -70
- package/dist/drizzle/d1-passwords.mjs +0 -808
- package/dist/drizzle/d1-passwords.mjs.map +0 -1
- package/dist/drizzle/d1-phone.d.mts +0 -23
- package/dist/drizzle/d1-phone.mjs +0 -33
- package/dist/drizzle/d1-phone.mjs.map +0 -1
- package/dist/drizzle/d1-planning.d.mts +0 -11
- package/dist/drizzle/d1-planning.mjs +0 -43
- package/dist/drizzle/d1-planning.mjs.map +0 -1
- package/dist/drizzle/d1-proofs.d.mts +0 -80
- package/dist/drizzle/d1-proofs.mjs +0 -842
- package/dist/drizzle/d1-proofs.mjs.map +0 -1
- package/dist/drizzle/d1-sessions.d.mts +0 -68
- package/dist/drizzle/d1-sessions.mjs +0 -987
- package/dist/drizzle/d1-sessions.mjs.map +0 -1
- package/dist/drizzle/d1-totp.d.mts +0 -23
- package/dist/drizzle/d1-totp.mjs +0 -30
- package/dist/drizzle/d1-totp.mjs.map +0 -1
- package/dist/drizzle/email-registration.d.mts +0 -33
- package/dist/drizzle/email-registration.mjs +0 -281
- package/dist/drizzle/email-registration.mjs.map +0 -1
- package/dist/drizzle/email-sql.d.mts +0 -1
- package/dist/drizzle/email-sql.mjs +0 -9
- package/dist/drizzle/email-sql.mjs.map +0 -1
- package/dist/drizzle/mysql-emails.d.mts +0 -71
- package/dist/drizzle/mysql-emails.mjs +0 -43
- package/dist/drizzle/mysql-emails.mjs.map +0 -1
- package/dist/drizzle/mysql-password-prepared.d.mts +0 -30
- package/dist/drizzle/mysql-password-prepared.mjs +0 -21
- package/dist/drizzle/mysql-password-prepared.mjs.map +0 -1
- package/dist/drizzle/mysql-passwords.d.mts +0 -71
- package/dist/drizzle/mysql-passwords.mjs +0 -43
- package/dist/drizzle/mysql-passwords.mjs.map +0 -1
- package/dist/drizzle/mysql-proofs.d.mts +0 -75
- package/dist/drizzle/mysql-proofs.mjs +0 -28
- package/dist/drizzle/mysql-proofs.mjs.map +0 -1
- package/dist/drizzle/mysql-sessions.d.mts +0 -92
- package/dist/drizzle/mysql-sessions.mjs +0 -58
- package/dist/drizzle/mysql-sessions.mjs.map +0 -1
- package/dist/drizzle/oauth-connected-model.mjs.map +0 -1
- package/dist/drizzle/oauth-connected-target.d.mts +0 -6
- package/dist/drizzle/oauth-connected-target.mjs +0 -12
- package/dist/drizzle/oauth-connected-target.mjs.map +0 -1
- package/dist/drizzle/oauth-kernel.mjs +0 -11
- package/dist/drizzle/oauth-kernel.mjs.map +0 -1
- package/dist/drizzle/oauth-mysql.mjs +0 -8
- package/dist/drizzle/oauth-mysql.mjs.map +0 -1
- package/dist/drizzle/passkey-kernel.mjs +0 -8
- package/dist/drizzle/passkey-kernel.mjs.map +0 -1
- package/dist/drizzle/passkey-model.mjs.map +0 -1
- package/dist/drizzle/passkey-registration-ceremony-model.mjs +0 -2
- package/dist/drizzle/passkey-state.mjs +0 -7
- package/dist/drizzle/passkey-state.mjs.map +0 -1
- package/dist/drizzle/passkey-target.d.mts +0 -2
- package/dist/drizzle/passkey-target.mjs +0 -7
- package/dist/drizzle/passkey-target.mjs.map +0 -1
- package/dist/drizzle/passkey-write-target.d.mts +0 -5
- package/dist/drizzle/passkey-write-target.mjs +0 -7
- package/dist/drizzle/passkey-write-target.mjs.map +0 -1
- package/dist/drizzle/password-prepared-model.d.mts +0 -92
- package/dist/drizzle/password-prepared-model.mjs +0 -11
- package/dist/drizzle/password-prepared-model.mjs.map +0 -1
- package/dist/drizzle/password-prepared-sql.mjs +0 -395
- package/dist/drizzle/password-prepared-sql.mjs.map +0 -1
- package/dist/drizzle/password-prepared-state.mjs +0 -104
- package/dist/drizzle/password-prepared-state.mjs.map +0 -1
- package/dist/drizzle/password-prepared-target.d.mts +0 -13
- package/dist/drizzle/password-prepared-target.mjs +0 -62
- package/dist/drizzle/password-prepared-target.mjs.map +0 -1
- package/dist/drizzle/password-registration.d.mts +0 -7
- package/dist/drizzle/password-registration.mjs +0 -137
- package/dist/drizzle/password-registration.mjs.map +0 -1
- package/dist/drizzle/password-sql.d.mts +0 -1
- package/dist/drizzle/password-sql.mjs +0 -10
- package/dist/drizzle/password-sql.mjs.map +0 -1
- package/dist/drizzle/pg-emails.d.mts +0 -72
- package/dist/drizzle/pg-emails.mjs +0 -43
- package/dist/drizzle/pg-emails.mjs.map +0 -1
- package/dist/drizzle/pg-password-prepared.d.mts +0 -31
- package/dist/drizzle/pg-password-prepared.mjs +0 -21
- package/dist/drizzle/pg-password-prepared.mjs.map +0 -1
- package/dist/drizzle/pg-passwords.d.mts +0 -72
- package/dist/drizzle/pg-passwords.mjs +0 -43
- package/dist/drizzle/pg-passwords.mjs.map +0 -1
- package/dist/drizzle/pg-proofs.d.mts +0 -76
- package/dist/drizzle/pg-proofs.mjs +0 -27
- package/dist/drizzle/pg-proofs.mjs.map +0 -1
- package/dist/drizzle/pg-sessions.d.mts +0 -93
- package/dist/drizzle/pg-sessions.mjs +0 -58
- package/dist/drizzle/pg-sessions.mjs.map +0 -1
- package/dist/drizzle/phone-state.mjs +0 -14
- package/dist/drizzle/phone-state.mjs.map +0 -1
- package/dist/drizzle/phone-target.d.mts +0 -15
- package/dist/drizzle/proof-sql.d.mts +0 -1
- package/dist/drizzle/proof-sql.mjs +0 -8
- package/dist/drizzle/proof-sql.mjs.map +0 -1
- package/dist/drizzle/query-operations.mjs +0 -31
- package/dist/drizzle/query-operations.mjs.map +0 -1
- package/dist/drizzle/session-sql.d.mts +0 -1
- package/dist/drizzle/session-sql.mjs +0 -9
- package/dist/drizzle/session-sql.mjs.map +0 -1
- package/dist/drizzle/session-target.d.mts +0 -30
- package/dist/drizzle/session-target.mjs +0 -49
- package/dist/drizzle/session-target.mjs.map +0 -1
- package/dist/drizzle/sqlite-emails.mjs +0 -50
- package/dist/drizzle/sqlite-emails.mjs.map +0 -1
- package/dist/drizzle/sqlite-password-prepared.mjs +0 -26
- package/dist/drizzle/sqlite-password-prepared.mjs.map +0 -1
- package/dist/drizzle/sqlite-passwords.mjs +0 -54
- package/dist/drizzle/sqlite-passwords.mjs.map +0 -1
- package/dist/drizzle/sqlite-proofs.mjs +0 -34
- package/dist/drizzle/sqlite-proofs.mjs.map +0 -1
- package/dist/drizzle/sqlite-sessions.mjs +0 -79
- package/dist/drizzle/sqlite-sessions.mjs.map +0 -1
- package/dist/drizzle/standalone-guard.d.mts +0 -2
- package/dist/drizzle/standalone-guard.mjs +0 -21
- package/dist/drizzle/standalone-guard.mjs.map +0 -1
- package/dist/drizzle/totp-state.d.mts +0 -37
- package/dist/drizzle/totp-state.mjs +0 -287
- package/dist/drizzle/totp-state.mjs.map +0 -1
- package/dist/drizzle/totp-target.d.mts +0 -15
- package/dist/drizzle/transaction-execution.d.mts +0 -2
- package/dist/drizzle/transaction-execution.mjs +0 -11
- package/dist/drizzle/transaction-execution.mjs.map +0 -1
- package/dist/drizzle/transaction-owner.d.mts +0 -1
- package/dist/drizzle/transaction-owner.mjs +0 -8
- package/dist/drizzle/transaction-owner.mjs.map +0 -1
- package/src/drizzle/crypto.ts +0 -14
- package/src/drizzle/d1-emails.ts +0 -1945
- package/src/drizzle/d1-generated-statement.ts +0 -129
- package/src/drizzle/d1-oauth.ts +0 -360
- package/src/drizzle/d1-passkey.ts +0 -383
- package/src/drizzle/d1-password-prepared.ts +0 -1265
- package/src/drizzle/d1-passwords.ts +0 -2060
- package/src/drizzle/d1-phone.ts +0 -103
- package/src/drizzle/d1-planning.ts +0 -104
- package/src/drizzle/d1-proofs.ts +0 -2354
- package/src/drizzle/d1-sessions.ts +0 -2940
- package/src/drizzle/d1-totp.ts +0 -88
- package/src/drizzle/email-registration.ts +0 -850
- package/src/drizzle/email-sql.ts +0 -25
- package/src/drizzle/mysql-emails.ts +0 -343
- package/src/drizzle/mysql-password-prepared.ts +0 -198
- package/src/drizzle/mysql-passwords.ts +0 -343
- package/src/drizzle/mysql-proofs.ts +0 -196
- package/src/drizzle/mysql-sessions.ts +0 -780
- package/src/drizzle/oauth-connected-target.ts +0 -21
- package/src/drizzle/oauth-kernel.ts +0 -10
- package/src/drizzle/oauth-mysql.ts +0 -10
- package/src/drizzle/passkey-kernel.ts +0 -4
- package/src/drizzle/passkey-state.ts +0 -3
- package/src/drizzle/passkey-target.ts +0 -23
- package/src/drizzle/passkey-write-target.ts +0 -9
- package/src/drizzle/password-prepared-model.ts +0 -241
- package/src/drizzle/password-prepared-sql.ts +0 -1201
- package/src/drizzle/password-prepared-state.ts +0 -231
- package/src/drizzle/password-prepared-target.ts +0 -169
- package/src/drizzle/password-registration.ts +0 -369
- package/src/drizzle/password-sql.ts +0 -16
- package/src/drizzle/pg-emails.ts +0 -343
- package/src/drizzle/pg-password-prepared.ts +0 -199
- package/src/drizzle/pg-passwords.ts +0 -342
- package/src/drizzle/pg-proofs.ts +0 -206
- package/src/drizzle/pg-sessions.ts +0 -789
- package/src/drizzle/phone-state.ts +0 -21
- package/src/drizzle/proof-sql.ts +0 -10
- package/src/drizzle/query-operations.ts +0 -49
- package/src/drizzle/session-sql.ts +0 -15
- package/src/drizzle/session-target.ts +0 -337
- package/src/drizzle/sqlite-emails.ts +0 -393
- package/src/drizzle/sqlite-password-prepared.ts +0 -230
- package/src/drizzle/sqlite-passwords.ts +0 -497
- package/src/drizzle/sqlite-proofs.ts +0 -229
- package/src/drizzle/sqlite-sessions.ts +0 -1013
- package/src/drizzle/totp-state.ts +0 -525
- package/src/drizzle/transaction-execution.ts +0 -13
- package/src/drizzle/transaction-owner.ts +0 -11
package/dist/SqliteWasm.mjs
CHANGED
|
@@ -1,73 +1,73 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { sqlClientEmailStandaloneGuard } from "./drizzle/email-target.mjs";
|
|
3
|
-
import { sqlClientOAuthStandaloneGuard } from "./drizzle/oauth-target.mjs";
|
|
4
|
-
import { sqlClientPasswordStandaloneGuard } from "./drizzle/password-target.mjs";
|
|
5
|
-
import { passwordPreparedPersistenceLayer } from "./drizzle/password-prepared-target.mjs";
|
|
6
|
-
import { sqlClientProofStandaloneGuard } from "./drizzle/proof-target.mjs";
|
|
1
|
+
import { NativeDatabase, nativeDatabase } from "./drizzle/native-database.mjs";
|
|
7
2
|
import { OAuthProxyPersistence } from "./internal/drizzle-sqlite-oauth-proxy.mjs";
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
3
|
+
import { makeProofTarget } from "./drizzle/proof-drivers.mjs";
|
|
4
|
+
import { makePasswordTarget } from "./drizzle/password-drivers.mjs";
|
|
5
|
+
import { makeEmailTarget } from "./drizzle/email-drivers.mjs";
|
|
6
|
+
import { makeOAuthTarget } from "./drizzle/oauth-drivers.mjs";
|
|
11
7
|
import { makePasskeyTarget } from "./drizzle/passkey-drivers.mjs";
|
|
12
|
-
import { makePhoneTarget
|
|
13
|
-
import {
|
|
8
|
+
import { makePhoneTarget } from "./drizzle/phone-drivers.mjs";
|
|
9
|
+
import { makeSessionTarget } from "./drizzle/session-drivers.mjs";
|
|
10
|
+
import { makeTotpTarget } from "./drizzle/totp-target.mjs";
|
|
14
11
|
import { makeSqliteExternalIdentityServices, makeSqliteIdentityServices, makeSqliteSubjectProvisioningServices } from "./drizzle/sqlite-identity.mjs";
|
|
15
|
-
import { makeSqlitePasswordTarget, sqlitePasswordConfiguration } from "./drizzle/sqlite-passwords.mjs";
|
|
16
|
-
import { makeSqliteProofTarget, sqliteProofConfiguration } from "./drizzle/sqlite-proofs.mjs";
|
|
17
|
-
import { makeSqliteSessionTarget, sqliteSessionConfiguration } from "./drizzle/sqlite-sessions.mjs";
|
|
18
|
-
import { makeSqlitePasswordPreparedTarget } from "./drizzle/sqlite-password-prepared.mjs";
|
|
19
|
-
import { makeOAuthTarget } from "./drizzle/oauth-drivers.mjs";
|
|
20
12
|
import { drizzleMigrationsLayer } from "./internal/drizzle-migrations.mjs";
|
|
21
13
|
import { sqlitePersistence } from "./internal/drizzle-sqlite.mjs";
|
|
22
|
-
import { NativeDatabase } from "@yielded/auth-persistence/Adapter";
|
|
23
14
|
import { Context, Effect, Layer } from "effect";
|
|
24
|
-
import { makeWithDefaults } from "drizzle-orm/effect-sqlite-wasm";
|
|
15
|
+
import { EffectSQLiteWasmTransaction, makeWithDefaults } from "drizzle-orm/effect-sqlite-wasm";
|
|
25
16
|
//#region src/SqliteWasm.ts
|
|
26
17
|
/** The application-owned Drizzle database used to construct persistence services. */
|
|
27
18
|
var Database = class extends Context.Service()("effect-auth/persistence-drizzle/SqliteWasm/Database") {};
|
|
28
19
|
/** Construct Drizzle from the driver's SQL-client Layer. */
|
|
29
20
|
const databaseLayer = Layer.effect(Database, makeWithDefaults({}));
|
|
30
|
-
const
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
21
|
+
const proofTarget = makeProofTarget(Database, {
|
|
22
|
+
mode: "native",
|
|
23
|
+
dialect: "sqlite",
|
|
24
|
+
transactionConstructor: EffectSQLiteWasmTransaction
|
|
25
|
+
});
|
|
26
|
+
const passwordTarget = makePasswordTarget(Database, {
|
|
27
|
+
mode: "native",
|
|
28
|
+
dialect: "sqlite",
|
|
29
|
+
transactionConstructor: EffectSQLiteWasmTransaction
|
|
30
|
+
});
|
|
31
|
+
const { makeEmailSignInServices, makeEmailAddressServices, makeEmailRegistrationServices, coordinateEmailAddress, coordinateEmailRegistration } = makeEmailTarget(Database, {
|
|
32
|
+
mode: "native",
|
|
33
|
+
dialect: "sqlite",
|
|
34
|
+
transactionConstructor: EffectSQLiteWasmTransaction
|
|
35
|
+
});
|
|
34
36
|
const { coordinatePasswordPersistence, coordinatePasswordRegistration, makePasswordPersistenceServices, makePasswordRegistrationServices } = passwordTarget;
|
|
35
37
|
const { coordinateProofPersistence, makeProofPersistenceServices } = proofTarget;
|
|
36
|
-
const { coordinateAuthenticationAuthority, coordinatePendingAuthentication, coordinateSignedSessionValidity, coordinateStatefulSessions, makeAuthenticationAuthorityServices, makePendingAuthenticationServices, makeSessionStepUpServices, coordinateSessionStepUp, makeSignedSessionValidityServices, makeStatefulSessionServices } = sessionTarget;
|
|
37
|
-
const commitMode = "interactive";
|
|
38
38
|
const makeIdentityServices = (mapping) => makeSqliteIdentityServices(mapping, "interactive").pipe(Effect.provideServiceEffect(NativeDatabase, nativeDatabase(Database)));
|
|
39
39
|
const makeSubjectProvisioningServices = (mapping) => makeSqliteSubjectProvisioningServices(mapping, "interactive").pipe(Effect.provideServiceEffect(NativeDatabase, nativeDatabase(Database)));
|
|
40
40
|
const makeExternalIdentityServices = (mapping) => makeSqliteExternalIdentityServices(mapping).pipe(Effect.provideServiceEffect(NativeDatabase, nativeDatabase(Database)));
|
|
41
|
-
const { makePasswordPreparedPersistenceServices, coordinatePasswordPreparedPersistence } = makeSqlitePasswordPreparedTarget(Database, (service) => sqlitePasswordConfiguration("interactive", sqlClientPasswordStandaloneGuard(service), sqlClientProofStandaloneGuard(service)));
|
|
42
41
|
const { makeOAuthAccountsServices, makeOAuthSignInServices, makeOAuthRegistrationIntentServices, makeOAuthRegistrationServices, coordinateOAuthRegistration, coordinateOAuthSignIn, coordinateOAuthRegistrationIntents, coordinateOAuthAccounts, makeOAuthConnectedServices, makeOAuthConnectedRevocationServices, coordinateOAuthConnected, coordinateOAuthConnectedRevocations } = makeOAuthTarget(Database, {
|
|
43
|
-
mode: "
|
|
42
|
+
mode: "native",
|
|
44
43
|
dialect: "sqlite",
|
|
45
|
-
|
|
46
|
-
standaloneGuard: sqlClientOAuthStandaloneGuard
|
|
44
|
+
transactionConstructor: EffectSQLiteWasmTransaction
|
|
47
45
|
});
|
|
48
|
-
const { makePasskeyCredentialServices, makePasskeyPersistenceServices,
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
standaloneGuard: sqlClientPasskeyStandaloneGuard
|
|
53
|
-
});
|
|
54
|
-
const { makeTotpPersistenceServices, coordinateTotpPersistence } = makeTotpTarget(Database, {
|
|
55
|
-
mode: "interactive",
|
|
56
|
-
dialect: "sqlite",
|
|
57
|
-
locking: false,
|
|
58
|
-
standaloneGuard: sqlClientTotpStandaloneGuard
|
|
46
|
+
const { makePasskeyCredentialServices, makePasskeyPersistenceServices, makePasskeyRegistrationCeremonyServices, coordinatePasskeyPersistence, coordinatePasskeyRegistrationCeremony, makePasskeyManagementServices, makePasskeyRegistrationServices, coordinatePasskeyManagement, coordinatePasskeyRegistration } = makePasskeyTarget(Database, {
|
|
47
|
+
transactionConstructor: EffectSQLiteWasmTransaction,
|
|
48
|
+
mode: "native",
|
|
49
|
+
dialect: "sqlite"
|
|
59
50
|
});
|
|
60
51
|
const { makePhonePersistenceServices, coordinatePhonePersistence } = makePhoneTarget(Database, {
|
|
61
|
-
mode: "
|
|
52
|
+
mode: "native",
|
|
62
53
|
dialect: "sqlite",
|
|
63
|
-
|
|
64
|
-
standaloneGuard: sqlClientPhoneStandaloneGuard
|
|
54
|
+
transactionConstructor: EffectSQLiteWasmTransaction
|
|
65
55
|
});
|
|
66
56
|
const AuthPersistence = {
|
|
67
57
|
...sqlitePersistence(makeWithDefaults({})),
|
|
68
58
|
migrationsLayer: (options) => drizzleMigrationsLayer(makeWithDefaults({}), Effect.promise(() => import("drizzle-orm/effect-sqlite-wasm/migrator")).pipe(Effect.map((module) => module.migrate)))(options)
|
|
69
59
|
};
|
|
60
|
+
const { coordinateAuthenticationAuthority, coordinatePendingAuthentication, coordinateSignedSessionValidity, coordinateStatefulSessions, makeAuthenticationAuthorityServices, makePendingAuthenticationServices, makeSignedSessionValidityServices, makeStatefulSessionServices, makeSessionStepUpServices, coordinateSessionStepUp, makeSessionCleanupServices } = makeSessionTarget(Database, {
|
|
61
|
+
mode: "native",
|
|
62
|
+
dialect: "sqlite",
|
|
63
|
+
transactionConstructor: EffectSQLiteWasmTransaction
|
|
64
|
+
});
|
|
65
|
+
const { makeTotpPersistenceServices, coordinateTotpPersistence } = makeTotpTarget(Database, {
|
|
66
|
+
mode: "native",
|
|
67
|
+
dialect: "sqlite",
|
|
68
|
+
transactionConstructor: EffectSQLiteWasmTransaction
|
|
69
|
+
});
|
|
70
70
|
//#endregion
|
|
71
|
-
export { AuthPersistence, Database, OAuthProxyPersistence,
|
|
71
|
+
export { AuthPersistence, Database, OAuthProxyPersistence, coordinateAuthenticationAuthority, coordinateEmailAddress, coordinateEmailRegistration, coordinateOAuthAccounts, coordinateOAuthConnected, coordinateOAuthConnectedRevocations, coordinateOAuthRegistration, coordinateOAuthRegistrationIntents, coordinateOAuthSignIn, coordinatePasskeyManagement, coordinatePasskeyPersistence, coordinatePasskeyRegistration, coordinatePasskeyRegistrationCeremony, coordinatePasswordPersistence, coordinatePasswordRegistration, coordinatePendingAuthentication, coordinatePhonePersistence, coordinateProofPersistence, coordinateSessionStepUp, coordinateSignedSessionValidity, coordinateStatefulSessions, coordinateTotpPersistence, databaseLayer, makeAuthenticationAuthorityServices, makeEmailAddressServices, makeEmailRegistrationServices, makeEmailSignInServices, makeExternalIdentityServices, makeIdentityServices, makeOAuthAccountsServices, makeOAuthConnectedRevocationServices, makeOAuthConnectedServices, makeOAuthRegistrationIntentServices, makeOAuthRegistrationServices, makeOAuthSignInServices, makePasskeyCredentialServices, makePasskeyManagementServices, makePasskeyPersistenceServices, makePasskeyRegistrationCeremonyServices, makePasskeyRegistrationServices, makePasswordPersistenceServices, makePasswordRegistrationServices, makePendingAuthenticationServices, makePhonePersistenceServices, makeProofPersistenceServices, makeSessionCleanupServices, makeSessionStepUpServices, makeSignedSessionValidityServices, makeStatefulSessionServices, makeSubjectProvisioningServices, makeTotpPersistenceServices };
|
|
72
72
|
|
|
73
73
|
//# sourceMappingURL=SqliteWasm.mjs.map
|
package/dist/SqliteWasm.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SqliteWasm.mjs","names":[],"sources":["../src/SqliteWasm.ts"],"sourcesContent":["import { NativeDatabase } from \"@yielded/auth-persistence/Adapter\";\nexport { OAuthProxyPersistence } from \"./internal/drizzle-sqlite-oauth-proxy\";\n\nimport type { AnyRelations } from \"drizzle-orm\";\nimport { type EffectSQLiteWasmDatabase, makeWithDefaults } from \"drizzle-orm/effect-sqlite-wasm\";\nimport type { AnySQLiteTable } from \"drizzle-orm/sqlite-core\";\nimport { Context, Effect, Layer } from \"effect\";\n\nimport { nativeDatabase } from \"./drizzle/native-database\";\n\n/** The application-owned Drizzle database used to construct persistence services. */\nexport class Database extends Context.Service<Database, EffectSQLiteWasmDatabase<AnyRelations>>()(\n \"effect-auth/persistence-drizzle/SqliteWasm/Database\",\n) {}\n\n/** Construct Drizzle from the driver's SQL-client Layer. */\nexport const databaseLayer = Layer.effect(Database, makeWithDefaults({}));\n\nimport { sqlClientEmailStandaloneGuard } from \"./drizzle/email-target\";\nimport type {\n ExternalIdentityTables,\n IdentityTables,\n SubjectProvisioningTables,\n} from \"./drizzle/model\";\nimport { sqlClientPasswordStandaloneGuard } from \"./drizzle/password-target\";\nimport { sqlClientProofStandaloneGuard } from \"./drizzle/proof-target\";\nimport { sqlClientSessionStandaloneGuard } from \"./drizzle/session-target\";\nimport { makeSqliteEmailTarget, sqliteEmailConfiguration } from \"./drizzle/sqlite-emails\";\nimport {\n makeSqliteExternalIdentityServices,\n makeSqliteIdentityServices,\n makeSqliteSubjectProvisioningServices,\n} from \"./drizzle/sqlite-identity\";\nimport { makeSqlitePasswordTarget, sqlitePasswordConfiguration } from \"./drizzle/sqlite-passwords\";\nimport { makeSqliteProofTarget, sqliteProofConfiguration } from \"./drizzle/sqlite-proofs\";\nimport { makeSqliteSessionTarget, sqliteSessionConfiguration } from \"./drizzle/sqlite-sessions\";\n\nconst sessionTarget = makeSqliteSessionTarget<Database, EffectSQLiteWasmDatabase<AnyRelations>>(\n Database,\n (service) => sqliteSessionConfiguration(\"interactive\", sqlClientSessionStandaloneGuard(service)),\n);\n\nconst proofTarget = makeSqliteProofTarget<Database, EffectSQLiteWasmDatabase<AnyRelations>>(\n Database,\n (service) => sqliteProofConfiguration(\"interactive\", sqlClientProofStandaloneGuard(service)),\n);\n\nconst passwordTarget = makeSqlitePasswordTarget<Database, EffectSQLiteWasmDatabase<AnyRelations>>(\n Database,\n (service) =>\n sqlitePasswordConfiguration(\n \"interactive\",\n sqlClientPasswordStandaloneGuard(service),\n sqlClientProofStandaloneGuard(service),\n ),\n);\n\nconst emailTarget = makeSqliteEmailTarget<Database, EffectSQLiteWasmDatabase<AnyRelations>>(\n Database,\n (service) =>\n sqliteEmailConfiguration(\n \"interactive\",\n sqlClientEmailStandaloneGuard(service),\n sqlClientProofStandaloneGuard(service),\n ),\n);\n\nexport const {\n coordinateEmailAddress,\n coordinateEmailRegistration,\n makeEmailAddressServices,\n makeEmailRegistrationServices,\n makeEmailSignInServices,\n} = emailTarget;\n\nexport const {\n coordinatePasswordPersistence,\n coordinatePasswordRegistration,\n makePasswordPersistenceServices,\n makePasswordRegistrationServices,\n} = passwordTarget;\n\nexport const { coordinateProofPersistence, makeProofPersistenceServices } = proofTarget;\n\nexport const {\n coordinateAuthenticationAuthority,\n coordinatePendingAuthentication,\n coordinateSignedSessionValidity,\n coordinateStatefulSessions,\n makeAuthenticationAuthorityServices,\n makePendingAuthenticationServices,\n makeSessionStepUpServices,\n coordinateSessionStepUp,\n makeSignedSessionValidityServices,\n makeStatefulSessionServices,\n} = sessionTarget;\n\nexport const commitMode = \"interactive\" as const;\n\nexport const makeIdentityServices = <\n Subject extends AnySQLiteTable,\n Identifier extends AnySQLiteTable,\n External extends AnySQLiteTable,\n Request extends AnySQLiteTable,\n NativeId,\n>(\n mapping: IdentityTables<Subject, Identifier, External, Request, NativeId>,\n) =>\n makeSqliteIdentityServices(mapping, \"interactive\").pipe(\n Effect.provideServiceEffect(NativeDatabase, nativeDatabase(Database)),\n );\n\nexport const makeSubjectProvisioningServices = <\n Subject extends AnySQLiteTable,\n Identifier extends AnySQLiteTable,\n Request extends AnySQLiteTable,\n NativeId,\n>(\n mapping: SubjectProvisioningTables<Subject, Identifier, Request, NativeId>,\n) =>\n makeSqliteSubjectProvisioningServices(mapping, \"interactive\").pipe(\n Effect.provideServiceEffect(NativeDatabase, nativeDatabase(Database)),\n );\n\nexport const makeExternalIdentityServices = <\n Subject extends AnySQLiteTable,\n External extends AnySQLiteTable,\n NativeId,\n>(\n mapping: ExternalIdentityTables<Subject, External, NativeId>,\n) =>\n makeSqliteExternalIdentityServices(mapping).pipe(\n Effect.provideServiceEffect(NativeDatabase, nativeDatabase(Database)),\n );\n\nimport { makeSqlitePasswordPreparedTarget } from \"./drizzle/sqlite-password-prepared\";\n\nconst passwordPreparedTarget = makeSqlitePasswordPreparedTarget<\n Database,\n EffectSQLiteWasmDatabase<AnyRelations>\n>(Database, (service) =>\n sqlitePasswordConfiguration(\n \"interactive\",\n sqlClientPasswordStandaloneGuard(service),\n sqlClientProofStandaloneGuard(service),\n ),\n);\n\nexport const { makePasswordPreparedPersistenceServices, coordinatePasswordPreparedPersistence } =\n passwordPreparedTarget;\n\nexport { passwordPreparedPersistenceLayer } from \"./drizzle/password-prepared-target\";\n\nimport { makeOAuthTarget } from \"./drizzle/oauth-drivers\";\nimport { sqlClientOAuthStandaloneGuard } from \"./drizzle/oauth-target\";\n\nconst oauthTarget = makeOAuthTarget<\n Database,\n EffectSQLiteWasmDatabase<AnyRelations>,\n AnySQLiteTable<{ dialect: \"sqlite\" }>\n>(Database, {\n mode: \"interactive\",\n dialect: \"sqlite\",\n locking: false,\n standaloneGuard: sqlClientOAuthStandaloneGuard,\n});\n\nexport const {\n makeOAuthAccountsServices,\n makeOAuthSignInServices,\n makeOAuthRegistrationIntentServices,\n makeOAuthRegistrationServices,\n coordinateOAuthRegistration,\n coordinateOAuthSignIn,\n coordinateOAuthRegistrationIntents,\n coordinateOAuthAccounts,\n makeOAuthConnectedServices,\n makeOAuthConnectedRevocationServices,\n coordinateOAuthConnected,\n coordinateOAuthConnectedRevocations,\n} = oauthTarget;\n\nimport { makePasskeyTarget } from \"./drizzle/passkey-drivers\";\nimport { sqlClientPasskeyStandaloneGuard } from \"./drizzle/passkey-target\";\n\nconst passkeyTarget = makePasskeyTarget<\n Database,\n EffectSQLiteWasmDatabase<AnyRelations>,\n AnySQLiteTable<{ dialect: \"sqlite\" }>\n>(Database, {\n mode: \"interactive\",\n dialect: \"sqlite\",\n locking: false,\n standaloneGuard: sqlClientPasskeyStandaloneGuard,\n});\n\nexport const {\n makePasskeyCredentialServices,\n makePasskeyPersistenceServices,\n makePasskeyEnrollmentContextServices,\n makePasskeyRegistrationCeremonyServices,\n coordinatePasskeyPersistence,\n coordinatePasskeyRegistrationCeremony,\n makePasskeyManagementServices,\n makePasskeyRegistrationServices,\n coordinatePasskeyManagement,\n coordinatePasskeyRegistration,\n} = passkeyTarget;\n\nimport { makeTotpTarget, sqlClientTotpStandaloneGuard } from \"./drizzle/totp-target\";\n\nconst totpTarget = makeTotpTarget<\n Database,\n EffectSQLiteWasmDatabase<AnyRelations>,\n AnySQLiteTable<{ dialect: \"sqlite\" }>\n>(Database, {\n mode: \"interactive\",\n dialect: \"sqlite\",\n locking: false,\n standaloneGuard: sqlClientTotpStandaloneGuard,\n});\n\nexport const { makeTotpPersistenceServices, coordinateTotpPersistence } = totpTarget;\n\nimport { makePhoneTarget, sqlClientPhoneStandaloneGuard } from \"./drizzle/phone-target\";\n\nconst phoneTarget = makePhoneTarget<\n Database,\n EffectSQLiteWasmDatabase<AnyRelations>,\n AnySQLiteTable<{ dialect: \"sqlite\" }>\n>(Database, {\n mode: \"interactive\",\n dialect: \"sqlite\",\n locking: false,\n standaloneGuard: sqlClientPhoneStandaloneGuard,\n});\n\nexport const { makePhonePersistenceServices, coordinatePhonePersistence } = phoneTarget;\n\nimport { drizzleMigrationsLayer } from \"./internal/drizzle-migrations\";\nimport { sqlitePersistence } from \"./internal/drizzle-sqlite\";\n\nexport const AuthPersistence = {\n ...sqlitePersistence(makeWithDefaults({})),\n migrationsLayer: (options: {\n readonly migrations: Record<string, string>;\n readonly migrationsTable?: string;\n }) =>\n drizzleMigrationsLayer(\n makeWithDefaults({}),\n Effect.promise(() => import(\"drizzle-orm/effect-sqlite-wasm/migrator\")).pipe(\n Effect.map((module) => module.migrate),\n ),\n )(options),\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAWA,IAAa,WAAb,cAA8B,QAAQ,QAA0D,CAAC,CAC/F,qDACF,CAAC,CAAC,CAAC;;AAGH,MAAa,gBAAgB,MAAM,OAAO,UAAU,iBAAiB,CAAC,CAAC,CAAC;AAqBxE,MAAM,gBAAgB,wBACpB,WACC,YAAY,2BAA2B,eAAe,gCAAgC,OAAO,CAAC,CACjG;AAEA,MAAM,cAAc,sBAClB,WACC,YAAY,yBAAyB,eAAe,8BAA8B,OAAO,CAAC,CAC7F;AAEA,MAAM,iBAAiB,yBACrB,WACC,YACC,4BACE,eACA,iCAAiC,OAAO,GACxC,8BAA8B,OAAO,CACvC,CACJ;AAYA,MAAa,EACX,wBACA,6BACA,0BACA,+BACA,4BAfkB,sBAClB,WACC,YACC,yBACE,eACA,8BAA8B,OAAO,GACrC,8BAA8B,OAAO,CACvC,CASA;AAEJ,MAAa,EACX,+BACA,gCACA,iCACA,qCACE;AAEJ,MAAa,EAAE,4BAA4B,iCAAiC;AAE5E,MAAa,EACX,mCACA,iCACA,iCACA,4BACA,qCACA,mCACA,2BACA,yBACA,mCACA,gCACE;AAEJ,MAAa,aAAa;AAE1B,MAAa,wBAOX,YAEA,2BAA2B,SAAS,aAAa,CAAC,CAAC,KACjD,OAAO,qBAAqB,gBAAgB,eAAe,QAAQ,CAAC,CACtE;AAEF,MAAa,mCAMX,YAEA,sCAAsC,SAAS,aAAa,CAAC,CAAC,KAC5D,OAAO,qBAAqB,gBAAgB,eAAe,QAAQ,CAAC,CACtE;AAEF,MAAa,gCAKX,YAEA,mCAAmC,OAAO,CAAC,CAAC,KAC1C,OAAO,qBAAqB,gBAAgB,eAAe,QAAQ,CAAC,CACtE;AAeF,MAAa,EAAE,yCAAyC,0CAXzB,iCAG7B,WAAW,YACX,4BACE,eACA,iCAAiC,OAAO,GACxC,8BAA8B,OAAO,CACvC,CAIA;AAkBF,MAAa,EACX,2BACA,yBACA,qCACA,+BACA,6BACA,uBACA,oCACA,yBACA,4BACA,sCACA,0BACA,wCAvBkB,gBAIlB,UAAU;CACV,MAAM;CACN,SAAS;CACT,SAAS;CACT,iBAAiB;AACnB,CAeI;AAgBJ,MAAa,EACX,+BACA,gCACA,sCACA,yCACA,8BACA,uCACA,+BACA,iCACA,6BACA,kCArBoB,kBAIpB,UAAU;CACV,MAAM;CACN,SAAS;CACT,SAAS;CACT,iBAAiB;AACnB,CAaI;AAeJ,MAAa,EAAE,6BAA6B,8BAXzB,eAIjB,UAAU;CACV,MAAM;CACN,SAAS;CACT,SAAS;CACT,iBAAiB;AACnB,CAE0E;AAe1E,MAAa,EAAE,8BAA8B,+BAXzB,gBAIlB,UAAU;CACV,MAAM;CACN,SAAS;CACT,SAAS;CACT,iBAAiB;AACnB,CAE4E;AAK5E,MAAa,kBAAkB;CAC7B,GAAG,kBAAkB,iBAAiB,CAAC,CAAC,CAAC;CACzC,kBAAkB,YAIhB,uBACE,iBAAiB,CAAC,CAAC,GACnB,OAAO,cAAc,OAAO,0CAA0C,CAAC,CAAC,KACtE,OAAO,KAAK,WAAW,OAAO,OAAO,CACvC,CACF,CAAC,CAAC,OAAO;AACb"}
|
|
1
|
+
{"version":3,"file":"SqliteWasm.mjs","names":["PasskeyTransaction"],"sources":["../src/SqliteWasm.ts"],"sourcesContent":["import type { AnyRelations } from \"drizzle-orm\";\nimport {\n EffectSQLiteWasmTransaction as PasskeyTransaction,\n type EffectSQLiteWasmDatabase,\n makeWithDefaults,\n} from \"drizzle-orm/effect-sqlite-wasm\";\nimport type { AnySQLiteTable } from \"drizzle-orm/sqlite-core\";\nimport { Context, Effect, Layer } from \"effect\";\n\nimport { NativeDatabase, nativeDatabase } from \"./drizzle/native-database\";\n\n/** The application-owned Drizzle database used to construct persistence services. */\nexport class Database extends Context.Service<Database, EffectSQLiteWasmDatabase<AnyRelations>>()(\n \"effect-auth/persistence-drizzle/SqliteWasm/Database\",\n) {}\n\n/** Construct Drizzle from the driver's SQL-client Layer. */\nexport const databaseLayer = Layer.effect(Database, makeWithDefaults({}));\n\nimport type {\n ExternalIdentityTables,\n IdentityTables,\n SubjectProvisioningTables,\n} from \"./drizzle/model\";\nimport { makePasswordTarget } from \"./drizzle/password-drivers\";\nimport { makeProofTarget } from \"./drizzle/proof-drivers\";\nimport {\n makeSqliteExternalIdentityServices,\n makeSqliteIdentityServices,\n makeSqliteSubjectProvisioningServices,\n} from \"./drizzle/sqlite-identity\";\n\nconst proofTarget = makeProofTarget(Database, {\n mode: \"native\",\n dialect: \"sqlite\",\n transactionConstructor: PasskeyTransaction,\n});\n\nconst passwordTarget = makePasswordTarget(Database, {\n mode: \"native\",\n dialect: \"sqlite\",\n transactionConstructor: PasskeyTransaction,\n});\n\nimport { makeEmailTarget } from \"./drizzle/email-drivers\";\n\nexport const {\n makeEmailSignInServices,\n makeEmailAddressServices,\n makeEmailRegistrationServices,\n coordinateEmailAddress,\n coordinateEmailRegistration,\n} = makeEmailTarget(Database, {\n mode: \"native\",\n dialect: \"sqlite\",\n transactionConstructor: PasskeyTransaction,\n});\n\nexport const {\n coordinatePasswordPersistence,\n coordinatePasswordRegistration,\n makePasswordPersistenceServices,\n makePasswordRegistrationServices,\n} = passwordTarget;\n\nexport const { coordinateProofPersistence, makeProofPersistenceServices } = proofTarget;\n\nexport const makeIdentityServices = <\n Subject extends AnySQLiteTable,\n Identifier extends AnySQLiteTable,\n External extends AnySQLiteTable,\n Request extends AnySQLiteTable,\n NativeId,\n>(\n mapping: IdentityTables<Subject, Identifier, External, Request, NativeId>,\n) =>\n makeSqliteIdentityServices(mapping, \"interactive\").pipe(\n Effect.provideServiceEffect(NativeDatabase, nativeDatabase(Database)),\n );\n\nexport const makeSubjectProvisioningServices = <\n Subject extends AnySQLiteTable,\n Identifier extends AnySQLiteTable,\n Request extends AnySQLiteTable,\n NativeId,\n>(\n mapping: SubjectProvisioningTables<Subject, Identifier, Request, NativeId>,\n) =>\n makeSqliteSubjectProvisioningServices(mapping, \"interactive\").pipe(\n Effect.provideServiceEffect(NativeDatabase, nativeDatabase(Database)),\n );\n\nexport const makeExternalIdentityServices = <\n Subject extends AnySQLiteTable,\n External extends AnySQLiteTable,\n NativeId,\n>(\n mapping: ExternalIdentityTables<Subject, External, NativeId>,\n) =>\n makeSqliteExternalIdentityServices(mapping).pipe(\n Effect.provideServiceEffect(NativeDatabase, nativeDatabase(Database)),\n );\n\nimport { makeOAuthTarget } from \"./drizzle/oauth-drivers\";\n\nconst oauthTarget = makeOAuthTarget<\n Database,\n EffectSQLiteWasmDatabase<AnyRelations>,\n AnySQLiteTable<{ dialect: \"sqlite\" }>\n>(Database, {\n mode: \"native\",\n dialect: \"sqlite\",\n transactionConstructor: PasskeyTransaction,\n});\n\nexport const {\n makeOAuthAccountsServices,\n makeOAuthSignInServices,\n makeOAuthRegistrationIntentServices,\n makeOAuthRegistrationServices,\n coordinateOAuthRegistration,\n coordinateOAuthSignIn,\n coordinateOAuthRegistrationIntents,\n coordinateOAuthAccounts,\n makeOAuthConnectedServices,\n makeOAuthConnectedRevocationServices,\n coordinateOAuthConnected,\n coordinateOAuthConnectedRevocations,\n} = oauthTarget;\n\nimport { makePasskeyTarget } from \"./drizzle/passkey-drivers\";\n\nconst passkeyTarget = makePasskeyTarget<\n Database,\n EffectSQLiteWasmDatabase<AnyRelations>,\n AnySQLiteTable<{ dialect: \"sqlite\" }>\n>(Database, {\n transactionConstructor: PasskeyTransaction,\n mode: \"native\",\n dialect: \"sqlite\",\n});\n\nexport const {\n makePasskeyCredentialServices,\n makePasskeyPersistenceServices,\n makePasskeyRegistrationCeremonyServices,\n coordinatePasskeyPersistence,\n coordinatePasskeyRegistrationCeremony,\n makePasskeyManagementServices,\n makePasskeyRegistrationServices,\n coordinatePasskeyManagement,\n coordinatePasskeyRegistration,\n} = passkeyTarget;\n\nimport { makePhoneTarget } from \"./drizzle/phone-drivers\";\n\nexport const { makePhonePersistenceServices, coordinatePhonePersistence } = makePhoneTarget(\n Database,\n { mode: \"native\", dialect: \"sqlite\", transactionConstructor: PasskeyTransaction },\n);\n\nimport { drizzleMigrationsLayer } from \"./internal/drizzle-migrations\";\nimport { sqlitePersistence } from \"./internal/drizzle-sqlite\";\n\nexport const AuthPersistence = {\n ...sqlitePersistence(makeWithDefaults({})),\n migrationsLayer: (options: {\n readonly migrations: Record<string, string>;\n readonly migrationsTable?: string;\n }) =>\n drizzleMigrationsLayer(\n makeWithDefaults({}),\n Effect.promise(() => import(\"drizzle-orm/effect-sqlite-wasm/migrator\")).pipe(\n Effect.map((module) => module.migrate),\n ),\n )(options),\n};\n\nexport { OAuthProxyPersistence } from \"./internal/drizzle-sqlite-oauth-proxy\";\n\nimport { makeSessionTarget } from \"./drizzle/session-drivers\";\n\nexport const {\n coordinateAuthenticationAuthority,\n coordinatePendingAuthentication,\n coordinateSignedSessionValidity,\n coordinateStatefulSessions,\n makeAuthenticationAuthorityServices,\n makePendingAuthenticationServices,\n makeSignedSessionValidityServices,\n makeStatefulSessionServices,\n makeSessionStepUpServices,\n coordinateSessionStepUp,\n makeSessionCleanupServices,\n} = makeSessionTarget(Database, {\n mode: \"native\",\n dialect: \"sqlite\",\n transactionConstructor: PasskeyTransaction,\n});\n\nimport { makeTotpTarget } from \"./drizzle/totp-target\";\n\nexport const { makeTotpPersistenceServices, coordinateTotpPersistence } = makeTotpTarget(Database, {\n mode: \"native\",\n dialect: \"sqlite\",\n transactionConstructor: PasskeyTransaction,\n});\n"],"mappings":";;;;;;;;;;;;;;;;;AAYA,IAAa,WAAb,cAA8B,QAAQ,QAA0D,CAAC,CAC/F,qDACF,CAAC,CAAC,CAAC;;AAGH,MAAa,gBAAgB,MAAM,OAAO,UAAU,iBAAiB,CAAC,CAAC,CAAC;AAexE,MAAM,cAAc,gBAAgB,UAAU;CAC5C,MAAM;CACN,SAAS;CACT,wBAAwBA;AAC1B,CAAC;AAED,MAAM,iBAAiB,mBAAmB,UAAU;CAClD,MAAM;CACN,SAAS;CACT,wBAAwBA;AAC1B,CAAC;AAID,MAAa,EACX,yBACA,0BACA,+BACA,wBACA,gCACE,gBAAgB,UAAU;CAC5B,MAAM;CACN,SAAS;CACT,wBAAwBA;AAC1B,CAAC;AAED,MAAa,EACX,+BACA,gCACA,iCACA,qCACE;AAEJ,MAAa,EAAE,4BAA4B,iCAAiC;AAE5E,MAAa,wBAOX,YAEA,2BAA2B,SAAS,aAAa,CAAC,CAAC,KACjD,OAAO,qBAAqB,gBAAgB,eAAe,QAAQ,CAAC,CACtE;AAEF,MAAa,mCAMX,YAEA,sCAAsC,SAAS,aAAa,CAAC,CAAC,KAC5D,OAAO,qBAAqB,gBAAgB,eAAe,QAAQ,CAAC,CACtE;AAEF,MAAa,gCAKX,YAEA,mCAAmC,OAAO,CAAC,CAAC,KAC1C,OAAO,qBAAqB,gBAAgB,eAAe,QAAQ,CAAC,CACtE;AAcF,MAAa,EACX,2BACA,yBACA,qCACA,+BACA,6BACA,uBACA,oCACA,yBACA,4BACA,sCACA,0BACA,wCAtBkB,gBAIlB,UAAU;CACV,MAAM;CACN,SAAS;CACT,wBAAwBA;AAC1B,CAeI;AAcJ,MAAa,EACX,+BACA,gCACA,yCACA,8BACA,uCACA,+BACA,iCACA,6BACA,kCAnBoB,kBAIpB,UAAU;CACV,wBAAwBA;CACxB,MAAM;CACN,SAAS;AACX,CAYI;AAIJ,MAAa,EAAE,8BAA8B,+BAA+B,gBAC1E,UACA;CAAE,MAAM;CAAU,SAAS;CAAU,wBAAwBA;AAAmB,CAClF;AAKA,MAAa,kBAAkB;CAC7B,GAAG,kBAAkB,iBAAiB,CAAC,CAAC,CAAC;CACzC,kBAAkB,YAIhB,uBACE,iBAAiB,CAAC,CAAC,GACnB,OAAO,cAAc,OAAO,0CAA0C,CAAC,CAAC,KACtE,OAAO,KAAK,WAAW,OAAO,OAAO,CACvC,CACF,CAAC,CAAC,OAAO;AACb;AAMA,MAAa,EACX,mCACA,iCACA,iCACA,4BACA,qCACA,mCACA,mCACA,6BACA,2BACA,yBACA,+BACE,kBAAkB,UAAU;CAC9B,MAAM;CACN,SAAS;CACT,wBAAwBA;AAC1B,CAAC;AAID,MAAa,EAAE,6BAA6B,8BAA8B,eAAe,UAAU;CACjG,MAAM;CACN,SAAS;CACT,wBAAwBA;AAC1B,CAAC"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { column, isMappedConstraintConflict, provisioningFingerprint } from "./model.mjs";
|
|
2
|
+
import { NativeDatabase, nativeDatabase } from "./native-database.mjs";
|
|
2
3
|
import { validateDrizzleStorage } from "./storage-validation.mjs";
|
|
3
4
|
import { Database } from "./d1-database.mjs";
|
|
4
|
-
import {
|
|
5
|
-
import { NativeDatabase, withStorageValidation } from "@yielded/auth-persistence/Adapter";
|
|
5
|
+
import { 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";
|
|
@@ -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 { 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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"}
|
|
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 } 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, 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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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { DatabaseValue } from "./sqlite-do-database.mjs";
|
|
2
|
+
import { AnyRelations } from "drizzle-orm";
|
|
3
|
+
import { EffectMysql2Database } from "drizzle-orm/effect-mysql2";
|
|
4
|
+
import { EffectSQLiteD1Database } from "drizzle-orm/effect-d1";
|
|
5
|
+
import { EffectLibsqlDatabase } from "drizzle-orm/effect-libsql";
|
|
6
|
+
import { EffectPgDatabase } from "drizzle-orm/effect-pglite";
|
|
7
|
+
import { EffectPgDatabase as EffectPgDatabase$1 } from "drizzle-orm/effect-postgres";
|
|
8
|
+
import { EffectSQLiteBunDatabase } from "drizzle-orm/effect-sqlite-bun";
|
|
9
|
+
import { EffectSQLiteNodeDatabase } from "drizzle-orm/effect-sqlite-node";
|
|
10
|
+
import { EffectSQLiteWasmDatabase } from "drizzle-orm/effect-sqlite-wasm";
|
|
11
|
+
//#region src/drizzle/driver-types.d.ts
|
|
12
|
+
export type NativeDriverDatabase = EffectSQLiteD1Database<AnyRelations> | EffectLibsqlDatabase<AnyRelations> | EffectMysql2Database<AnyRelations> | EffectPgDatabase<AnyRelations> | EffectPgDatabase$1<AnyRelations> | EffectSQLiteBunDatabase<AnyRelations> | EffectSQLiteNodeDatabase<AnyRelations> | EffectSQLiteWasmDatabase<AnyRelations> | DatabaseValue<AnyRelations>;
|
|
13
|
+
export type NativeDriverTransaction<D extends NativeDriverDatabase> = Parameters<Parameters<D["transaction"]>[0]>[0];
|
|
14
|
+
//#endregion
|
|
15
|
+
//# sourceMappingURL=driver-types.d.mts.map
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { NativeDatabase, nativeDatabase } from "./native-database.mjs";
|
|
2
|
+
import { coordinateTargetEmailAddress, coordinateTargetEmailRegistration, makeTargetEmailAddressServices, makeTargetEmailRegistrationServices, makeTargetEmailSignInServices } from "./email-target.mjs";
|
|
3
|
+
import { Effect } from "effect";
|
|
4
|
+
import { EmailAddressPersistence } from "@yielded/auth/Email";
|
|
5
|
+
//#region src/drizzle/email-drivers.ts
|
|
6
|
+
/** Foreign table callback variance is erased only after these public signatures;
|
|
7
|
+
* the target validates physical metadata and the workflow invokes row codecs. */
|
|
8
|
+
const makeEmailTarget = (databaseService, configuration) => {
|
|
9
|
+
function coordinateEmailAddress(acquire, options, body) {
|
|
10
|
+
return Effect.flatMap(nativeDatabase(acquire), (database) => coordinateTargetEmailAddress(database, options.mapping, configuration, (transaction, services) => {
|
|
11
|
+
const work = Effect.provideService(body, EmailAddressPersistence, services.emailAddressPersistence);
|
|
12
|
+
return options.transaction === void 0 ? work : Effect.provideService(work, options.transaction, options.transaction.of(transaction));
|
|
13
|
+
}, options.proofMapping));
|
|
14
|
+
}
|
|
15
|
+
function coordinateEmailRegistration(acquire, options, body) {
|
|
16
|
+
return Effect.flatMap(nativeDatabase(acquire), (database) => coordinateTargetEmailRegistration(database, options.mapping, configuration, options.proofMapping, (transaction, services) => {
|
|
17
|
+
const work = Effect.provideService(body, options.target, services.registrationAuthority);
|
|
18
|
+
return options.transaction === void 0 ? work : Effect.provideService(work, options.transaction, options.transaction.of(transaction));
|
|
19
|
+
}));
|
|
20
|
+
}
|
|
21
|
+
return {
|
|
22
|
+
makeEmailSignInServices: (mapping) => makeTargetEmailSignInServices(mapping, configuration).pipe(Effect.provideServiceEffect(NativeDatabase, nativeDatabase(databaseService))),
|
|
23
|
+
makeEmailAddressServices: (mapping, proofMapping) => makeTargetEmailAddressServices(mapping, configuration, proofMapping).pipe(Effect.provideServiceEffect(NativeDatabase, nativeDatabase(databaseService))),
|
|
24
|
+
makeEmailRegistrationServices: (mapping, proofs) => makeTargetEmailRegistrationServices(mapping, configuration, proofs).pipe(Effect.provideServiceEffect(NativeDatabase, nativeDatabase(databaseService))),
|
|
25
|
+
coordinateEmailAddress,
|
|
26
|
+
coordinateEmailRegistration
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
//#endregion
|
|
30
|
+
export { makeEmailTarget };
|
|
31
|
+
|
|
32
|
+
//# sourceMappingURL=email-drivers.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email-drivers.mjs","names":[],"sources":["../../src/drizzle/email-drivers.ts"],"sourcesContent":["import type { EmailRegistrationAuthority } from \"@yielded/auth-persistence/Adapter\";\nimport { EmailAddressPersistence, type EmailUnavailable } from \"@yielded/auth/Email\";\nimport type { LifecycleHooks } from \"@yielded/auth/Hooks\";\nimport type { Table } from \"drizzle-orm\";\nimport { type Context, Effect, type Crypto } from \"effect\";\n\nimport type { NativeDriverDatabase, NativeDriverTransaction } from \"./driver-types\";\nimport type {\n AnyEmailAddressMapping,\n EmailSignInMapping,\n AnyEmailSignInMapping,\n AnyEmailRegistrationMapping,\n EmailAddressMapping,\n EmailRegistrationMapping,\n} from \"./email-model\";\nimport {\n coordinateTargetEmailAddress,\n coordinateTargetEmailRegistration,\n makeTargetEmailAddressServices,\n makeTargetEmailSignInServices,\n makeTargetEmailRegistrationServices,\n} from \"./email-target\";\nimport { NativeDatabase, nativeDatabase } from \"./native-database\";\nimport type { NativeTargetConfiguration } from \"./native-target\";\nimport type { AnyProofPersistenceMapping, ProofPersistenceMapping } from \"./proof-model\";\nimport type { SuppliedService } from \"./SuppliedService\";\n\ntype ProofOption<Proof extends Table, Subject extends Table, NativeId> = {\n readonly proofMapping?: ProofPersistenceMapping<Proof, Subject, NativeId>;\n};\n\n/** Foreign table callback variance is erased only after these public signatures;\n * the target validates physical metadata and the workflow invokes row codecs. */\nexport const makeEmailTarget = <DatabaseId, D extends NativeDriverDatabase>(\n databaseService: Context.Service<DatabaseId, D>,\n configuration: NativeTargetConfiguration,\n) => {\n function coordinateEmailAddress<\n Database extends D,\n S extends Table,\n I extends Table,\n C extends Table,\n AC extends Table,\n N,\n Proof extends Table,\n PS extends Table,\n PN,\n A,\n E,\n R,\n DE,\n DR,\n >(\n acquire: Effect.Effect<Database, DE, DR>,\n options: {\n readonly mapping: EmailAddressMapping<S, I, C, AC, N>;\n readonly transaction?: never;\n } & ProofOption<Proof, PS, PN>,\n body: Effect.Effect<A, E, R>,\n ): Effect.Effect<\n A,\n E | DE | EmailUnavailable,\n Exclude<R, EmailAddressPersistence> | DR | LifecycleHooks | Crypto.Crypto\n >;\n function coordinateEmailAddress<\n Database extends D,\n S extends Table,\n I extends Table,\n C extends Table,\n AC extends Table,\n N,\n Proof extends Table,\n PS extends Table,\n PN,\n A,\n E,\n R,\n DE,\n DR,\n TxId,\n TxShape,\n >(\n acquire: Effect.Effect<Database, DE, DR>,\n options: {\n readonly mapping: EmailAddressMapping<S, I, C, AC, N>;\n readonly transaction: SuppliedService<\n TxId,\n NoInfer<NativeDriverTransaction<Database>>,\n TxShape\n >;\n } & ProofOption<Proof, PS, PN>,\n body: Effect.Effect<A, E, R>,\n ): Effect.Effect<\n A,\n E | DE | EmailUnavailable,\n Exclude<R, EmailAddressPersistence | TxId> | DR | LifecycleHooks | Crypto.Crypto\n >;\n function coordinateEmailAddress<\n Database extends D,\n S extends Table,\n I extends Table,\n C extends Table,\n AC extends Table,\n N,\n Proof extends Table,\n PS extends Table,\n PN,\n A,\n E,\n R,\n DE,\n DR,\n TxId,\n TxShape,\n >(\n acquire: Effect.Effect<Database, DE, DR>,\n options: {\n readonly mapping: EmailAddressMapping<S, I, C, AC, N>;\n readonly transaction?: SuppliedService<\n TxId,\n NoInfer<NativeDriverTransaction<Database>>,\n TxShape\n >;\n } & ProofOption<Proof, PS, PN>,\n body: Effect.Effect<A, E, R>,\n ) {\n return Effect.flatMap(nativeDatabase(acquire), (database) =>\n coordinateTargetEmailAddress(\n database,\n options.mapping as unknown as AnyEmailAddressMapping,\n configuration,\n (transaction: NativeDriverTransaction<Database>, services) => {\n const work = Effect.provideService(\n body,\n EmailAddressPersistence,\n services.emailAddressPersistence,\n );\n\n return options.transaction === undefined\n ? work\n : Effect.provideService(work, options.transaction, options.transaction.of(transaction));\n },\n options.proofMapping as unknown as AnyProofPersistenceMapping | undefined,\n ),\n );\n }\n\n function coordinateEmailRegistration<\n TargetId,\n Registration,\n Proof extends Table,\n PS extends Table,\n PN,\n Database extends D,\n S extends Table,\n I extends Table,\n C extends Table,\n AC extends Table,\n N,\n A,\n E,\n R,\n DE,\n DR,\n >(\n acquire: Effect.Effect<Database, DE, DR>,\n options: {\n readonly mapping: EmailRegistrationMapping<NoInfer<Registration>, S, I, C, AC, N>;\n readonly proofMapping: ProofPersistenceMapping<Proof, PS, PN>;\n readonly target: SuppliedService<TargetId, EmailRegistrationAuthority<Registration>>;\n readonly transaction?: never;\n },\n body: Effect.Effect<A, E, R>,\n ): Effect.Effect<\n A,\n E | DE | EmailUnavailable,\n Exclude<R, TargetId> | DR | LifecycleHooks | Crypto.Crypto\n >;\n function coordinateEmailRegistration<\n TargetId,\n Registration,\n Proof extends Table,\n PS extends Table,\n PN,\n Database extends D,\n S extends Table,\n I extends Table,\n C extends Table,\n AC extends Table,\n N,\n A,\n E,\n R,\n DE,\n DR,\n TxId,\n TxShape,\n >(\n acquire: Effect.Effect<Database, DE, DR>,\n options: {\n readonly mapping: EmailRegistrationMapping<NoInfer<Registration>, S, I, C, AC, N>;\n readonly proofMapping: ProofPersistenceMapping<Proof, PS, PN>;\n readonly target: SuppliedService<TargetId, EmailRegistrationAuthority<Registration>>;\n readonly transaction: SuppliedService<\n TxId,\n NoInfer<NativeDriverTransaction<Database>>,\n TxShape\n >;\n },\n body: Effect.Effect<A, E, R>,\n ): Effect.Effect<\n A,\n E | DE | EmailUnavailable,\n Exclude<R, TargetId | TxId> | DR | LifecycleHooks | Crypto.Crypto\n >;\n function coordinateEmailRegistration<\n TargetId,\n Registration,\n Proof extends Table,\n PS extends Table,\n PN,\n Database extends D,\n S extends Table,\n I extends Table,\n C extends Table,\n AC extends Table,\n N,\n A,\n E,\n R,\n DE,\n DR,\n TxId,\n TxShape,\n >(\n acquire: Effect.Effect<Database, DE, DR>,\n options: {\n readonly mapping: EmailRegistrationMapping<NoInfer<Registration>, S, I, C, AC, N>;\n readonly proofMapping: ProofPersistenceMapping<Proof, PS, PN>;\n readonly target: SuppliedService<TargetId, EmailRegistrationAuthority<Registration>>;\n readonly transaction?: SuppliedService<\n TxId,\n NoInfer<NativeDriverTransaction<Database>>,\n TxShape\n >;\n },\n body: Effect.Effect<A, E, R>,\n ) {\n return Effect.flatMap(nativeDatabase(acquire), (database) =>\n coordinateTargetEmailRegistration(\n database,\n options.mapping as unknown as AnyEmailRegistrationMapping<Registration>,\n configuration,\n options.proofMapping as unknown as AnyProofPersistenceMapping,\n (transaction: NativeDriverTransaction<Database>, services) => {\n const work = Effect.provideService(body, options.target, services.registrationAuthority);\n\n return options.transaction === undefined\n ? work\n : Effect.provideService(work, options.transaction, options.transaction.of(transaction));\n },\n ),\n );\n }\n\n return {\n makeEmailSignInServices: <\n S extends Table,\n I extends Table,\n C extends Table,\n AC extends Table,\n N,\n >(\n mapping: EmailSignInMapping<S, I, C, AC, N>,\n ) =>\n makeTargetEmailSignInServices(\n mapping as unknown as AnyEmailSignInMapping,\n configuration,\n ).pipe(Effect.provideServiceEffect(NativeDatabase, nativeDatabase(databaseService))),\n makeEmailAddressServices: <\n S extends Table,\n I extends Table,\n C extends Table,\n AC extends Table,\n N,\n Proof extends Table,\n PS extends Table,\n PN,\n >(\n mapping: EmailAddressMapping<S, I, C, AC, N>,\n proofMapping?: ProofPersistenceMapping<Proof, PS, PN>,\n ) =>\n makeTargetEmailAddressServices(\n mapping as unknown as AnyEmailAddressMapping,\n configuration,\n proofMapping as unknown as AnyProofPersistenceMapping | undefined,\n ).pipe(Effect.provideServiceEffect(NativeDatabase, nativeDatabase(databaseService))),\n makeEmailRegistrationServices: <\n Registration,\n Proof extends Table,\n PS extends Table,\n PN,\n S extends Table,\n I extends Table,\n C extends Table,\n AC extends Table,\n N,\n >(\n mapping: EmailRegistrationMapping<Registration, S, I, C, AC, N>,\n proofs: ProofPersistenceMapping<Proof, PS, PN>,\n ) =>\n makeTargetEmailRegistrationServices(\n mapping as unknown as AnyEmailRegistrationMapping<Registration>,\n configuration,\n proofs as unknown as AnyProofPersistenceMapping,\n ).pipe(Effect.provideServiceEffect(NativeDatabase, nativeDatabase(databaseService))),\n coordinateEmailAddress,\n coordinateEmailRegistration,\n };\n};\n"],"mappings":";;;;;;;AAiCA,MAAa,mBACX,iBACA,kBACG;CA6DH,SAAS,uBAkBP,SACA,SAQA,MACA;EACA,OAAO,OAAO,QAAQ,eAAe,OAAO,IAAI,aAC9C,6BACE,UACA,QAAQ,SACR,gBACC,aAAgD,aAAa;GAC5D,MAAM,OAAO,OAAO,eAClB,MACA,yBACA,SAAS,uBACX;GAEA,OAAO,QAAQ,gBAAgB,KAAA,IAC3B,OACA,OAAO,eAAe,MAAM,QAAQ,aAAa,QAAQ,YAAY,GAAG,WAAW,CAAC;EAC1F,GACA,QAAQ,YACV,CACF;CACF;CAsEA,SAAS,4BAoBP,SACA,SAUA,MACA;EACA,OAAO,OAAO,QAAQ,eAAe,OAAO,IAAI,aAC9C,kCACE,UACA,QAAQ,SACR,eACA,QAAQ,eACP,aAAgD,aAAa;GAC5D,MAAM,OAAO,OAAO,eAAe,MAAM,QAAQ,QAAQ,SAAS,qBAAqB;GAEvF,OAAO,QAAQ,gBAAgB,KAAA,IAC3B,OACA,OAAO,eAAe,MAAM,QAAQ,aAAa,QAAQ,YAAY,GAAG,WAAW,CAAC;EAC1F,CACF,CACF;CACF;CAEA,OAAO;EACL,0BAOE,YAEA,8BACE,SACA,aACF,CAAC,CAAC,KAAK,OAAO,qBAAqB,gBAAgB,eAAe,eAAe,CAAC,CAAC;EACrF,2BAUE,SACA,iBAEA,+BACE,SACA,eACA,YACF,CAAC,CAAC,KAAK,OAAO,qBAAqB,gBAAgB,eAAe,eAAe,CAAC,CAAC;EACrF,gCAWE,SACA,WAEA,oCACE,SACA,eACA,MACF,CAAC,CAAC,KAAK,OAAO,qBAAqB,gBAAgB,eAAe,eAAe,CAAC,CAAC;EACrF;EACA;CACF;AACF"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
import { ClockMapping } from "./native-clock.mjs";
|
|
1
2
|
import { DrizzleTableModel } from "./table-model.mjs";
|
|
2
3
|
import * as Shared from "@yielded/auth-persistence/Adapter";
|
|
3
|
-
import { EmailRegistrationIntent,
|
|
4
|
+
import { EmailRegistrationIntent, RequiredEmailAddressConstraints, RequiredEmailRegistrationConstraints, RequiredEmailSignInConstraints, requiredEmailAddressConstraints, requiredEmailRegistrationConstraints, requiredEmailSignInConstraints } from "@yielded/auth-persistence/Adapter";
|
|
4
5
|
import { SQL, Table } from "drizzle-orm";
|
|
5
6
|
//#region src/drizzle/email-model.d.ts
|
|
6
7
|
export type EmailSubjectReadTable<Subject extends Table> = Shared.EmailSubjectReadTable<DrizzleTableModel<Subject>>;
|
|
@@ -10,21 +11,16 @@ export type EmailIdentifierTable<Identifier extends Table, NativeSubjectId> = Sh
|
|
|
10
11
|
export type EmailCredentialReadTable<Subject extends Table, Identifier extends Table, Credential extends Table, _NativeSubjectId> = Shared.EmailCredentialReadTable<DrizzleTableModel<Subject>, DrizzleTableModel<Identifier>, DrizzleTableModel<Credential>, _NativeSubjectId>;
|
|
11
12
|
export type EmailCredentialTable<Subject extends Table, Identifier extends Table, Credential extends Table, NativeSubjectId> = Shared.EmailCredentialTable<DrizzleTableModel<Subject>, DrizzleTableModel<Identifier>, DrizzleTableModel<Credential>, NativeSubjectId>;
|
|
12
13
|
export type EmailAuthorityCredentialTable<Credential extends Table, NativeSubjectId> = Shared.EmailAuthorityCredentialTable<DrizzleTableModel<Credential>, NativeSubjectId>;
|
|
13
|
-
export type
|
|
14
|
-
export type
|
|
15
|
-
export type EmailD1Clock = Shared.EmailD1Clock<SQL>;
|
|
16
|
-
export type EmailAddressMapping<Subject extends Table, Identifier extends Table, Credential extends Table, AuthorityCredential extends Table, Command extends Table, NativeSubjectId> = Shared.EmailAddressMapping<DrizzleTableModel<Subject>, DrizzleTableModel<Identifier>, DrizzleTableModel<Credential>, DrizzleTableModel<AuthorityCredential>, DrizzleTableModel<Command>, NativeSubjectId, SQL>;
|
|
17
|
-
export type D1EmailAddressMapping<Subject extends Table, Identifier extends Table, Credential extends Table, AuthorityCredential extends Table, Command extends Table, NativeSubjectId> = Shared.D1EmailAddressMapping<DrizzleTableModel<Subject>, DrizzleTableModel<Identifier>, DrizzleTableModel<Credential>, DrizzleTableModel<AuthorityCredential>, DrizzleTableModel<Command>, NativeSubjectId, SQL>;
|
|
18
|
-
export type EmailRegistrationTable<Registration, Request extends Table, NativeSubjectId> = Shared.EmailRegistrationTable<Registration, DrizzleTableModel<Request>, NativeSubjectId>;
|
|
14
|
+
export type EmailSignInMapping<Subject extends Table, Identifier extends Table, Credential extends Table, AuthorityCredential extends Table, NativeSubjectId> = Shared.EmailSignInMapping<DrizzleTableModel<Subject>, DrizzleTableModel<Identifier>, DrizzleTableModel<Credential>, DrizzleTableModel<AuthorityCredential>, NativeSubjectId>;
|
|
15
|
+
export type EmailAddressMapping<Subject extends Table, Identifier extends Table, Credential extends Table, AuthorityCredential extends Table, NativeSubjectId> = ClockMapping<Shared.EmailAddressMapping<DrizzleTableModel<Subject>, DrizzleTableModel<Identifier>, DrizzleTableModel<Credential>, DrizzleTableModel<AuthorityCredential>, NativeSubjectId, SQL>>;
|
|
19
16
|
export type EmailRegistrationProvisioning<Registration, Subject extends Table, NativeSubjectId> = Shared.EmailRegistrationProvisioning<Registration, DrizzleTableModel<Subject>, NativeSubjectId>;
|
|
20
17
|
export type EmailRegistrationIdentifierTable<Identifier extends Table, NativeSubjectId> = Shared.EmailRegistrationIdentifierTable<DrizzleTableModel<Identifier>, NativeSubjectId, SQL>;
|
|
21
18
|
export type EmailRegistrationCredentialTable<Credential extends Table, NativeSubjectId> = Shared.EmailRegistrationCredentialTable<DrizzleTableModel<Credential>, NativeSubjectId>;
|
|
22
19
|
export type EmailRegistrationAuthorityCredentialTable<Credential extends Table, NativeSubjectId> = Shared.EmailRegistrationAuthorityCredentialTable<DrizzleTableModel<Credential>, NativeSubjectId>;
|
|
23
|
-
export type EmailRegistrationMapping<Registration, Subject extends Table, Identifier extends Table, Credential extends Table, AuthorityCredential extends Table,
|
|
24
|
-
export type AnyEmailSignInMapping = EmailSignInMapping<Table, Table, Table, unknown>;
|
|
25
|
-
export type AnyEmailAddressMapping = EmailAddressMapping<Table, Table, Table, Table,
|
|
26
|
-
export type AnyEmailRegistrationMapping<Registration = unknown> = EmailRegistrationMapping<Registration, Table, Table, Table, Table,
|
|
27
|
-
export type D1EmailRegistrationMapping<Registration, Subject extends Table, Identifier extends Table, Credential extends Table, AuthorityCredential extends Table, Request extends Table, NativeSubjectId> = Shared.D1EmailRegistrationMapping<Registration, DrizzleTableModel<Subject>, DrizzleTableModel<Identifier>, DrizzleTableModel<Credential>, DrizzleTableModel<AuthorityCredential>, DrizzleTableModel<Request>, NativeSubjectId, SQL>;
|
|
20
|
+
export type EmailRegistrationMapping<Registration, Subject extends Table, Identifier extends Table, Credential extends Table, AuthorityCredential extends Table, NativeSubjectId> = ClockMapping<Shared.EmailRegistrationMapping<Registration, DrizzleTableModel<Subject>, DrizzleTableModel<Identifier>, DrizzleTableModel<Credential>, DrizzleTableModel<AuthorityCredential>, NativeSubjectId, SQL>>;
|
|
21
|
+
export type AnyEmailSignInMapping = EmailSignInMapping<Table, Table, Table, Table, unknown>;
|
|
22
|
+
export type AnyEmailAddressMapping = EmailAddressMapping<Table, Table, Table, Table, unknown>;
|
|
23
|
+
export type AnyEmailRegistrationMapping<Registration = unknown> = EmailRegistrationMapping<Registration, Table, Table, Table, Table, unknown>;
|
|
28
24
|
//#endregion
|
|
29
|
-
export { type EmailRegistrationIntent, type
|
|
25
|
+
export { type EmailRegistrationIntent, type RequiredEmailAddressConstraints, type RequiredEmailRegistrationConstraints, type RequiredEmailSignInConstraints, requiredEmailAddressConstraints, requiredEmailRegistrationConstraints, requiredEmailSignInConstraints };
|
|
30
26
|
//# sourceMappingURL=email-model.d.mts.map
|
|
@@ -1,21 +1,20 @@
|
|
|
1
|
-
import "./
|
|
2
|
-
import "./
|
|
3
|
-
import
|
|
4
|
-
import "./
|
|
5
|
-
import
|
|
1
|
+
import "./email-model.mjs";
|
|
2
|
+
import "./proof-model.mjs";
|
|
3
|
+
import "./native-database.mjs";
|
|
4
|
+
import "./D1BatchStatements.mjs";
|
|
5
|
+
import "./native-target.mjs";
|
|
6
|
+
import { EmailRegistrationAuthority, requireStandalone } from "@yielded/auth-persistence/Adapter";
|
|
6
7
|
import { Context, Effect, Layer } from "effect";
|
|
7
|
-
import { HookConfigurationError, LifecycleHooks } from "@yielded/auth/Hooks";
|
|
8
8
|
import { EmailAddressPersistence, EmailSignInTargets, EmailUnavailable } from "@yielded/auth/Email";
|
|
9
|
-
import "effect/sql/SqlError";
|
|
10
9
|
//#region src/drizzle/email-target.d.ts
|
|
11
|
-
export declare const emailSignInTargetsLayer: <E, R>(services: Effect.Effect<{
|
|
12
|
-
readonly emailSignInTargets: EmailSignInTargets["Service"];
|
|
13
|
-
}, E, R>) => Layer.Layer<EmailSignInTargets, E, Exclude<R, import("effect/Scope").Scope>>;
|
|
14
10
|
export declare const emailAddressPersistenceLayer: <E, R>(services: Effect.Effect<{
|
|
15
11
|
readonly emailAddressPersistence: EmailAddressPersistence["Service"];
|
|
16
12
|
}, E, R>) => Layer.Layer<EmailAddressPersistence, E, Exclude<R, import("effect/Scope").Scope>>;
|
|
17
|
-
export declare const emailRegistrationLayer: <Id, Registration, E, R>(
|
|
13
|
+
export declare const emailRegistrationLayer: <Id, Registration, E, R>(target: Context.Key<Id, EmailRegistrationAuthority<Registration>>, services: Effect.Effect<{
|
|
18
14
|
readonly registrationAuthority: EmailRegistrationAuthority<Registration>;
|
|
19
15
|
}, E, R>) => Layer.Layer<Id, E, Exclude<R, import("effect/Scope").Scope>>;
|
|
16
|
+
export declare const emailSignInTargetsLayer: <E, R>(services: Effect.Effect<{
|
|
17
|
+
readonly emailSignInTargets: EmailSignInTargets["Service"];
|
|
18
|
+
}, E, R>) => Layer.Layer<EmailSignInTargets, E, Exclude<R, import("effect/Scope").Scope>>;
|
|
20
19
|
//#endregion
|
|
21
20
|
//# sourceMappingURL=email-target.d.mts.map
|
|
@@ -1,81 +1,44 @@
|
|
|
1
|
+
import { nativeClock } from "./native-clock.mjs";
|
|
2
|
+
import { coordinateNativeTarget, nativeTarget } from "./native-target.mjs";
|
|
1
3
|
import { validateDrizzleStorage } from "./storage-validation.mjs";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { makeSqlEmailRegistrationAuthority } from "./email-registration.mjs";
|
|
4
|
+
import { nativeProofMapping } from "./proof-target.mjs";
|
|
5
|
+
import { makeNativeEmailAddressServices, makeNativeEmailRegistrationServices, makeNativeEmailSignInServices } from "@yielded/auth-persistence/Adapter";
|
|
5
6
|
import { Effect, Layer } from "effect";
|
|
6
|
-
import { LifecycleHooks, coordinateCommit, hasCommitScope } from "@yielded/auth/Hooks";
|
|
7
7
|
import { EmailAddressPersistence, EmailSignInTargets, EmailUnavailable } from "@yielded/auth/Email";
|
|
8
8
|
//#region src/drizzle/email-target.ts
|
|
9
|
-
const
|
|
10
|
-
const
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
const registrationOptions = (configuration, proofMapping, coordinated = false) => ({
|
|
28
|
-
mode: configuration.mode,
|
|
29
|
-
locking: configuration.locking,
|
|
30
|
-
standaloneGuard: !coordinated ? configuration.standaloneGuard : Effect.void,
|
|
31
|
-
generatedSubjectRows: configuration.generatedSubjectRows,
|
|
32
|
-
coordinated,
|
|
33
|
-
proof: {
|
|
34
|
-
mapping: proofMapping,
|
|
35
|
-
configuration: proofConfiguration(configuration, true)
|
|
36
|
-
}
|
|
37
|
-
});
|
|
38
|
-
const makeTargetEmailSignInServices = (mapping, configuration) => Effect.gen(function* () {
|
|
39
|
-
return { emailSignInTargets: yield* makeSqlEmailSignInTargets(mapping, {
|
|
40
|
-
mode: configuration.mode,
|
|
41
|
-
locking: false,
|
|
42
|
-
standaloneGuard: configuration.standaloneGuard
|
|
43
|
-
}) };
|
|
44
|
-
});
|
|
45
|
-
const makeTargetEmailAddressServices = (mapping, proofMapping, configuration) => Effect.gen(function* () {
|
|
46
|
-
return { emailAddressPersistence: yield* makeSqlEmailAddressPersistence(mapping, addressOptions(configuration, proofMapping)) };
|
|
47
|
-
});
|
|
48
|
-
const makeTargetEmailRegistrationServices = (mapping, proofMapping, configuration) => Effect.gen(function* () {
|
|
49
|
-
return { registrationAuthority: yield* makeSqlEmailRegistrationAuthority(mapping, registrationOptions(configuration, proofMapping)) };
|
|
50
|
-
});
|
|
51
|
-
const coordinateTargetEmailAddress = (database, mapping, proofMapping, configuration, owner) => Effect.gen(function* () {
|
|
52
|
-
const hooks = yield* LifecycleHooks;
|
|
53
|
-
if (yield* hasCommitScope) return yield* EmailUnavailable.make({});
|
|
54
|
-
yield* configuration.coordinatorGuard ?? configuration.standaloneGuard;
|
|
55
|
-
yield* validateDrizzleStorage({
|
|
9
|
+
const unavailable = () => EmailUnavailable.make({});
|
|
10
|
+
const mapped = (value) => ({
|
|
11
|
+
...value,
|
|
12
|
+
clock: nativeClock(value.clock)
|
|
13
|
+
});
|
|
14
|
+
const makeTargetEmailAddressServices = Effect.fnUntraced(function* (mapping, configuration, proofs) {
|
|
15
|
+
yield* validateDrizzleStorage(mapping).pipe(Effect.mapError(unavailable));
|
|
16
|
+
if (proofs !== void 0) yield* validateDrizzleStorage(proofs).pipe(Effect.mapError(unavailable));
|
|
17
|
+
if (configuration.mode === "batch" && (mapping.d1?.primary !== true || proofs !== void 0 && proofs.d1?.primary !== true)) return yield* unavailable();
|
|
18
|
+
const target = yield* nativeTarget(configuration);
|
|
19
|
+
return yield* target.provide(makeNativeEmailAddressServices(target.tables, mapped(mapping), proofs === void 0 ? void 0 : nativeProofMapping(proofs)));
|
|
20
|
+
});
|
|
21
|
+
const makeTargetEmailRegistrationServices = Effect.fnUntraced(function* (mapping, configuration, proofs) {
|
|
22
|
+
yield* validateDrizzleStorage(mapping).pipe(Effect.mapError(unavailable));
|
|
23
|
+
yield* validateDrizzleStorage(proofs).pipe(Effect.mapError(unavailable));
|
|
24
|
+
if (configuration.mode === "batch" && (mapping.d1?.primary !== true || proofs.d1?.primary !== true)) return yield* unavailable();
|
|
25
|
+
const target = yield* nativeTarget(configuration);
|
|
26
|
+
return yield* target.provide(makeNativeEmailRegistrationServices(target.tables, {
|
|
56
27
|
...mapping,
|
|
57
|
-
|
|
58
|
-
}
|
|
59
|
-
return (yield* coordinateCommit(() => database.transaction((transaction) => Effect.gen(function* () {
|
|
60
|
-
return yield* owner(transaction, { emailAddressPersistence: yield* makeSqlEmailAddressPersistence(mapping, addressOptions(configuration, proofMapping, true)).pipe(Effect.provideService(CurrentEmailSql, transaction)) });
|
|
61
|
-
})), { mode: configuration.mode }).pipe(Effect.provideService(LifecycleHooks, hooks))).value;
|
|
28
|
+
clock: nativeClock(mapping.clock)
|
|
29
|
+
}, nativeProofMapping(proofs), target.batch));
|
|
62
30
|
});
|
|
63
|
-
const
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
return (yield* coordinateCommit(() => database.transaction((transaction) => Effect.gen(function* () {
|
|
72
|
-
return yield* owner(transaction, { registrationAuthority: yield* makeSqlEmailRegistrationAuthority(mapping, registrationOptions(configuration, proofMapping, true)).pipe(Effect.provideService(CurrentEmailSql, transaction)) });
|
|
73
|
-
})), { mode: configuration.mode }).pipe(Effect.provideService(LifecycleHooks, hooks))).value;
|
|
31
|
+
const coordinateTargetEmailAddress = (database, mapping, configuration, body, proofs) => coordinateNativeTarget(unavailable, database, configuration, makeTargetEmailAddressServices(mapping, configuration, proofs), body);
|
|
32
|
+
const coordinateTargetEmailRegistration = (database, mapping, configuration, proofs, body) => coordinateNativeTarget(unavailable, database, configuration, makeTargetEmailRegistrationServices(mapping, configuration, proofs), body);
|
|
33
|
+
const emailAddressPersistenceLayer = (services) => Layer.effect(EmailAddressPersistence, Effect.map(services, (value) => value.emailAddressPersistence));
|
|
34
|
+
const emailRegistrationLayer = (target, services) => Layer.effect(target, Effect.map(services, (value) => value.registrationAuthority));
|
|
35
|
+
const makeTargetEmailSignInServices = Effect.fnUntraced(function* (mapping, configuration) {
|
|
36
|
+
yield* validateDrizzleStorage(mapping).pipe(Effect.mapError(unavailable));
|
|
37
|
+
const target = yield* nativeTarget(configuration);
|
|
38
|
+
return yield* target.provide(makeNativeEmailSignInServices(target.tables, mapping));
|
|
74
39
|
});
|
|
75
40
|
const emailSignInTargetsLayer = (services) => Layer.effect(EmailSignInTargets, Effect.map(services, (value) => value.emailSignInTargets));
|
|
76
|
-
const emailAddressPersistenceLayer = (services) => Layer.effect(EmailAddressPersistence, Effect.map(services, (value) => value.emailAddressPersistence));
|
|
77
|
-
const emailRegistrationLayer = (tag, services) => Layer.effect(tag, Effect.map(services, (value) => value.registrationAuthority));
|
|
78
41
|
//#endregion
|
|
79
|
-
export { coordinateTargetEmailAddress, coordinateTargetEmailRegistration, emailAddressPersistenceLayer, emailRegistrationLayer, emailSignInTargetsLayer, makeTargetEmailAddressServices, makeTargetEmailRegistrationServices, makeTargetEmailSignInServices
|
|
42
|
+
export { coordinateTargetEmailAddress, coordinateTargetEmailRegistration, emailAddressPersistenceLayer, emailRegistrationLayer, emailSignInTargetsLayer, makeTargetEmailAddressServices, makeTargetEmailRegistrationServices, makeTargetEmailSignInServices };
|
|
80
43
|
|
|
81
44
|
//# sourceMappingURL=email-target.mjs.map
|