@yielded/auth-persistence-drizzle 0.1.0-beta.13 → 0.1.0-beta.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/D1.d.mts +123 -9
- package/dist/Libsql.d.mts +143 -29
- package/dist/Mysql2.d.mts +130 -16
- package/dist/Pglite.d.mts +130 -16
- package/dist/Postgres.d.mts +131 -17
- package/dist/SqliteBun.d.mts +141 -27
- package/dist/SqliteDo.d.mts +145 -31
- package/dist/SqliteNode.d.mts +135 -21
- package/dist/SqliteWasm.d.mts +145 -31
- package/dist/drizzle/d1-emails.d.mts +3 -3
- package/dist/drizzle/d1-emails.mjs +56 -11
- package/dist/drizzle/d1-emails.mjs.map +1 -1
- package/dist/drizzle/d1-identity.mjs +9 -2
- package/dist/drizzle/d1-identity.mjs.map +1 -1
- package/dist/drizzle/d1-oauth.d.mts +8 -8
- package/dist/drizzle/d1-oauth.mjs +8 -8
- package/dist/drizzle/d1-oauth.mjs.map +1 -1
- package/dist/drizzle/d1-passkey.d.mts +2 -1
- package/dist/drizzle/d1-passkey.mjs +10 -8
- package/dist/drizzle/d1-passkey.mjs.map +1 -1
- package/dist/drizzle/d1-password-prepared.d.mts +1 -1
- package/dist/drizzle/d1-password-prepared.mjs +16 -5
- package/dist/drizzle/d1-password-prepared.mjs.map +1 -1
- package/dist/drizzle/d1-passwords.d.mts +2 -2
- package/dist/drizzle/d1-passwords.mjs +19 -6
- package/dist/drizzle/d1-passwords.mjs.map +1 -1
- package/dist/drizzle/d1-phone.d.mts +2 -1
- package/dist/drizzle/d1-phone.mjs +4 -2
- package/dist/drizzle/d1-phone.mjs.map +1 -1
- package/dist/drizzle/d1-proofs.d.mts +1 -1
- package/dist/drizzle/d1-proofs.mjs +18 -7
- package/dist/drizzle/d1-proofs.mjs.map +1 -1
- package/dist/drizzle/d1-sessions.d.mts +6 -5
- package/dist/drizzle/d1-sessions.mjs +29 -19
- package/dist/drizzle/d1-sessions.mjs.map +1 -1
- package/dist/drizzle/d1-totp.d.mts +2 -1
- package/dist/drizzle/d1-totp.mjs +4 -2
- package/dist/drizzle/d1-totp.mjs.map +1 -1
- package/dist/drizzle/email-registration.d.mts +5 -1
- package/dist/drizzle/email-registration.mjs +48 -4
- package/dist/drizzle/email-registration.mjs.map +1 -1
- package/dist/drizzle/email-target.d.mts +1 -0
- package/dist/drizzle/email-target.mjs +9 -0
- package/dist/drizzle/email-target.mjs.map +1 -1
- package/dist/drizzle/mysql-emails.d.mts +4 -4
- package/dist/drizzle/mysql-emails.mjs +8 -7
- package/dist/drizzle/mysql-emails.mjs.map +1 -1
- package/dist/drizzle/mysql-identity.mjs +11 -4
- package/dist/drizzle/mysql-identity.mjs.map +1 -1
- package/dist/drizzle/mysql-password-prepared.d.mts +2 -2
- package/dist/drizzle/mysql-password-prepared.mjs +4 -3
- package/dist/drizzle/mysql-password-prepared.mjs.map +1 -1
- package/dist/drizzle/mysql-passwords.d.mts +3 -3
- package/dist/drizzle/mysql-passwords.mjs +7 -6
- package/dist/drizzle/mysql-passwords.mjs.map +1 -1
- package/dist/drizzle/mysql-proofs.d.mts +2 -2
- package/dist/drizzle/mysql-proofs.mjs +4 -3
- package/dist/drizzle/mysql-proofs.mjs.map +1 -1
- package/dist/drizzle/mysql-sessions.d.mts +6 -6
- package/dist/drizzle/mysql-sessions.mjs +16 -15
- package/dist/drizzle/mysql-sessions.mjs.map +1 -1
- package/dist/drizzle/native-database.mjs +1 -1
- package/dist/drizzle/native-database.mjs.map +1 -1
- package/dist/drizzle/oauth-connected-drivers.mjs +10 -8
- package/dist/drizzle/oauth-connected-drivers.mjs.map +1 -1
- package/dist/drizzle/oauth-connected-flow.mjs +62 -13
- package/dist/drizzle/oauth-connected-flow.mjs.map +1 -1
- package/dist/drizzle/oauth-connected-input.mjs +6 -0
- package/dist/drizzle/oauth-connected-input.mjs.map +1 -1
- package/dist/drizzle/oauth-connected-maintenance.mjs +3 -3
- package/dist/drizzle/oauth-connected-maintenance.mjs.map +1 -1
- package/dist/drizzle/oauth-connected-target.d.mts +116 -2
- package/dist/drizzle/oauth-connected-target.mjs +5 -3
- package/dist/drizzle/oauth-connected-target.mjs.map +1 -1
- package/dist/drizzle/oauth-drivers.mjs +8 -8
- package/dist/drizzle/oauth-drivers.mjs.map +1 -1
- package/dist/drizzle/oauth-target.d.mts +3 -3
- package/dist/drizzle/oauth-target.mjs +8 -6
- package/dist/drizzle/oauth-target.mjs.map +1 -1
- package/dist/drizzle/passkey-drivers.mjs +4 -4
- package/dist/drizzle/passkey-drivers.mjs.map +1 -1
- package/dist/drizzle/passkey-write-drivers.mjs +4 -4
- package/dist/drizzle/passkey-write-drivers.mjs.map +1 -1
- package/dist/drizzle/passkey-write-target.d.mts +1 -1
- package/dist/drizzle/password-prepared-sql.mjs +5 -0
- package/dist/drizzle/password-prepared-sql.mjs.map +1 -1
- package/dist/drizzle/password-prepared-target.d.mts +2 -1
- package/dist/drizzle/password-prepared-target.mjs +5 -0
- package/dist/drizzle/password-prepared-target.mjs.map +1 -1
- package/dist/drizzle/password-registration.d.mts +1 -1
- package/dist/drizzle/password-registration.mjs +2 -0
- package/dist/drizzle/password-registration.mjs.map +1 -1
- package/dist/drizzle/password-target.d.mts +1 -0
- package/dist/drizzle/password-target.mjs +6 -0
- package/dist/drizzle/password-target.mjs.map +1 -1
- package/dist/drizzle/pg-emails.d.mts +4 -4
- package/dist/drizzle/pg-emails.mjs +8 -7
- package/dist/drizzle/pg-emails.mjs.map +1 -1
- package/dist/drizzle/pg-identity.mjs +12 -5
- package/dist/drizzle/pg-identity.mjs.map +1 -1
- package/dist/drizzle/pg-password-prepared.d.mts +2 -2
- package/dist/drizzle/pg-password-prepared.mjs +4 -3
- package/dist/drizzle/pg-password-prepared.mjs.map +1 -1
- package/dist/drizzle/pg-passwords.d.mts +3 -3
- package/dist/drizzle/pg-passwords.mjs +7 -6
- package/dist/drizzle/pg-passwords.mjs.map +1 -1
- package/dist/drizzle/pg-proofs.d.mts +2 -2
- package/dist/drizzle/pg-proofs.mjs +4 -3
- package/dist/drizzle/pg-proofs.mjs.map +1 -1
- package/dist/drizzle/pg-sessions.d.mts +6 -6
- package/dist/drizzle/pg-sessions.mjs +16 -15
- package/dist/drizzle/pg-sessions.mjs.map +1 -1
- package/dist/drizzle/phone-target.mjs +11 -2
- package/dist/drizzle/phone-target.mjs.map +1 -1
- package/dist/drizzle/proof-target.d.mts +1 -0
- package/dist/drizzle/proof-target.mjs +2 -0
- package/dist/drizzle/proof-target.mjs.map +1 -1
- package/dist/drizzle/query-operations.mjs +2 -0
- package/dist/drizzle/query-operations.mjs.map +1 -1
- package/dist/drizzle/session-target.d.mts +1 -0
- package/dist/drizzle/session-target.mjs +9 -6
- package/dist/drizzle/session-target.mjs.map +1 -1
- package/dist/drizzle/sqlite-emails.mjs +8 -7
- package/dist/drizzle/sqlite-emails.mjs.map +1 -1
- package/dist/drizzle/sqlite-identity.mjs +7 -2
- package/dist/drizzle/sqlite-identity.mjs.map +1 -1
- package/dist/drizzle/sqlite-password-prepared.mjs +4 -3
- package/dist/drizzle/sqlite-password-prepared.mjs.map +1 -1
- package/dist/drizzle/sqlite-passwords.mjs +7 -6
- package/dist/drizzle/sqlite-passwords.mjs.map +1 -1
- package/dist/drizzle/sqlite-proofs.mjs +4 -3
- package/dist/drizzle/sqlite-proofs.mjs.map +1 -1
- package/dist/drizzle/sqlite-sessions.mjs +16 -15
- package/dist/drizzle/sqlite-sessions.mjs.map +1 -1
- package/dist/drizzle/storage-validation.mjs +234 -0
- package/dist/drizzle/storage-validation.mjs.map +1 -0
- package/dist/drizzle/totp-target.mjs +5 -2
- package/dist/drizzle/totp-target.mjs.map +1 -1
- package/dist/drizzle/transaction-mysql.mjs +1 -1
- package/package.json +1 -1
- package/src/drizzle/d1-emails.ts +158 -40
- package/src/drizzle/d1-identity.ts +13 -0
- package/src/drizzle/d1-oauth.ts +8 -8
- package/src/drizzle/d1-passkey.ts +10 -8
- package/src/drizzle/d1-password-prepared.ts +14 -2
- package/src/drizzle/d1-passwords.ts +22 -4
- package/src/drizzle/d1-phone.ts +4 -2
- package/src/drizzle/d1-proofs.ts +55 -3
- package/src/drizzle/d1-sessions.ts +67 -18
- package/src/drizzle/d1-totp.ts +4 -2
- package/src/drizzle/email-registration.ts +160 -12
- package/src/drizzle/email-target.ts +22 -4
- package/src/drizzle/mysql-emails.ts +17 -7
- package/src/drizzle/mysql-identity.ts +13 -0
- package/src/drizzle/mysql-password-prepared.ts +7 -3
- package/src/drizzle/mysql-passwords.ts +13 -6
- package/src/drizzle/mysql-proofs.ts +7 -3
- package/src/drizzle/mysql-sessions.ts +31 -15
- package/src/drizzle/native-database.ts +5 -4
- package/src/drizzle/oauth-connected-drivers.ts +10 -8
- package/src/drizzle/oauth-connected-flow.ts +98 -10
- package/src/drizzle/oauth-connected-input.ts +7 -0
- package/src/drizzle/oauth-connected-maintenance.ts +3 -2
- package/src/drizzle/oauth-connected-target.ts +4 -2
- package/src/drizzle/oauth-drivers.ts +8 -8
- package/src/drizzle/oauth-target.ts +13 -7
- package/src/drizzle/passkey-drivers.ts +4 -4
- package/src/drizzle/passkey-write-drivers.ts +8 -5
- package/src/drizzle/password-prepared-sql.ts +13 -1
- package/src/drizzle/password-prepared-target.ts +7 -1
- package/src/drizzle/password-registration.ts +10 -3
- package/src/drizzle/password-target.ts +22 -4
- package/src/drizzle/pg-emails.ts +17 -7
- package/src/drizzle/pg-identity.ts +13 -0
- package/src/drizzle/pg-password-prepared.ts +7 -3
- package/src/drizzle/pg-passwords.ts +13 -6
- package/src/drizzle/pg-proofs.ts +7 -3
- package/src/drizzle/pg-sessions.ts +31 -15
- package/src/drizzle/phone-target.ts +30 -5
- package/src/drizzle/proof-target.ts +10 -2
- package/src/drizzle/query-operations.ts +2 -0
- package/src/drizzle/session-target.ts +20 -3
- package/src/drizzle/sqlite-emails.ts +17 -7
- package/src/drizzle/sqlite-identity.ts +5 -0
- package/src/drizzle/sqlite-password-prepared.ts +7 -3
- package/src/drizzle/sqlite-passwords.ts +13 -6
- package/src/drizzle/sqlite-proofs.ts +7 -3
- package/src/drizzle/sqlite-sessions.ts +31 -15
- package/src/drizzle/storage-validation.ts +285 -0
- package/src/drizzle/totp-target.ts +16 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mysql-emails.mjs","names":["DatabaseService"],"sources":["../../src/drizzle/mysql-emails.ts"],"sourcesContent":["import { EmailAddressPersistence, type EmailUnavailable } from \"@yielded/auth/Email\";\nimport type { LifecycleHooks, HookConfigurationError } from \"@yielded/auth/Hooks\";\n/* oxlint-disable no-explicit-any -- proof mapping tables are independently typed by the proof owner; this driver forwards them unchanged to the shared target. */\nimport type { AnyRelations } from \"drizzle-orm\";\nimport type { EffectMysql2Database } from \"drizzle-orm/effect-mysql2\";\nimport type { AnyMySqlTable } from \"drizzle-orm/mysql-core\";\nimport { Effect, Context } from \"effect\";\nimport type { SqlError } from \"effect/sql/SqlError\";\n\nimport type {\n EmailAddressMapping,\n EmailRegistrationMapping,\n EmailSignInMapping,\n} from \"./email-model\";\nimport type { EmailRegistrationAuthority } from \"./email-registration\";\nimport { CurrentEmailSql } from \"./email-sql\";\nimport type { EmailSqlQuery } from \"./email-sql\";\nimport {\n coordinateTargetEmailAddress,\n coordinateTargetEmailRegistration,\n makeTargetEmailAddressServices,\n makeTargetEmailRegistrationServices,\n makeTargetEmailSignInServices,\n sqlClientEmailStandaloneGuard,\n} from \"./email-target\";\nimport { Database as DatabaseService } from \"./mysql-database\";\nimport { nativeDatabase } from \"./native-database\";\nimport type { ProofPersistenceMapping } from \"./proof-model\";\nimport type { ProofSqlQuery } from \"./proof-sql\";\nimport { sqlClientProofStandaloneGuard } from \"./proof-target\";\nimport {\n type TransactionService,\n acquireTransactionService,\n transactionService,\n} from \"./standalone-guard\";\nimport type { SuppliedService } from \"./SuppliedService\";\n\ntype Database = EffectMysql2Database<AnyRelations>;\ntype TransactionOf<D extends Database> = Parameters<Parameters<D[\"transaction\"]>[0]>[0];\ntype ProofMapping = ProofPersistenceMapping<\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n>;\n\nconst configuration = (service: TransactionService | undefined) => ({\n mode: \"interactive\" as const,\n locking: true,\n standaloneGuard: sqlClientEmailStandaloneGuard(service),\n generatedSubjectRows: (query: EmailSqlQuery) => query.$returningId(),\n proof: {\n mode: \"interactive\" as const,\n locking: true,\n standaloneGuard: sqlClientProofStandaloneGuard(service),\n insertIfAbsent: (query: ProofSqlQuery, selfKey: string, selfValue: unknown) =>\n query.onDuplicateKeyUpdate({ set: { [selfKey]: selfValue } }),\n },\n});\n\nexport const makeMysqlEmailSignInServices = <\n S extends AnyMySqlTable,\n I extends AnyMySqlTable,\n C extends AnyMySqlTable,\n NativeId,\n>(\n mapping: EmailSignInMapping<S, I, C, NativeId>,\n) =>\n Effect.flatMap(\n Effect.map(acquireTransactionService(DatabaseService), configuration),\n (configuration) => makeTargetEmailSignInServices(mapping, configuration),\n ).pipe(Effect.provideServiceEffect(CurrentEmailSql, nativeDatabase(DatabaseService)));\n\nexport const makeMysqlEmailAddressServices = <\n S extends AnyMySqlTable,\n I extends AnyMySqlTable,\n C extends AnyMySqlTable,\n AC extends AnyMySqlTable,\n M extends AnyMySqlTable,\n NativeId,\n>(\n mapping: EmailAddressMapping<S, I, C, AC, M, NativeId>,\n proofMapping: ProofMapping,\n) =>\n Effect.flatMap(\n Effect.map(acquireTransactionService(DatabaseService), configuration),\n (configuration) => makeTargetEmailAddressServices(mapping, proofMapping, configuration),\n ).pipe(Effect.provideServiceEffect(CurrentEmailSql, nativeDatabase(DatabaseService)));\n\nexport function coordinateMysqlEmailAddress<\n D extends Database,\n S extends AnyMySqlTable,\n I extends AnyMySqlTable,\n C extends AnyMySqlTable,\n AC extends AnyMySqlTable,\n M extends AnyMySqlTable,\n NativeId,\n Out,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: EmailAddressMapping<S, I, C, AC, M, NativeId>;\n readonly proofMapping: ProofMapping;\n readonly transaction?: never;\n },\n body: Effect.Effect<Out, E, R>,\n): Effect.Effect<\n Out,\n E | EmailUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, EmailAddressPersistence> | LifecycleHooks | DatabaseRequirements\n>;\n\nexport function coordinateMysqlEmailAddress<\n D extends Database,\n S extends AnyMySqlTable,\n I extends AnyMySqlTable,\n C extends AnyMySqlTable,\n AC extends AnyMySqlTable,\n M extends AnyMySqlTable,\n NativeId,\n Out,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: EmailAddressMapping<S, I, C, AC, M, NativeId>;\n readonly proofMapping: ProofMapping;\n readonly transaction: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;\n },\n body: Effect.Effect<Out, E, R>,\n): Effect.Effect<\n Out,\n E | EmailUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, EmailAddressPersistence | TxId> | LifecycleHooks | DatabaseRequirements\n>;\n\nexport function coordinateMysqlEmailAddress<\n D extends Database,\n S extends AnyMySqlTable,\n I extends AnyMySqlTable,\n C extends AnyMySqlTable,\n AC extends AnyMySqlTable,\n M extends AnyMySqlTable,\n NativeId,\n Out,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: EmailAddressMapping<S, I, C, AC, M, NativeId>;\n readonly proofMapping: ProofMapping;\n readonly transaction?: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;\n },\n body: Effect.Effect<Out, E, R>,\n): Effect.Effect<\n Out,\n E | EmailUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, EmailAddressPersistence> | LifecycleHooks | DatabaseRequirements\n> {\n return Effect.flatMap(acquire, (database) =>\n coordinateTargetEmailAddress<TransactionOf<D>, Out, E, Exclude<R, EmailAddressPersistence>>(\n database,\n options.mapping,\n options.proofMapping,\n configuration(transactionService(database)),\n (\n transaction: TransactionOf<D>,\n services: { readonly emailAddressPersistence: EmailAddressPersistence[\"Service\"] },\n ) => {\n const provided = Context.make(EmailAddressPersistence, services.emailAddressPersistence);\n const work = Effect.provideContext(body, provided);\n\n return options.transaction === undefined\n ? work\n : Effect.provideService(work, options.transaction, options.transaction.of(transaction));\n },\n ),\n );\n}\n\nexport const makeMysqlEmailRegistrationServices = <\n Registration,\n S extends AnyMySqlTable,\n I extends AnyMySqlTable,\n C extends AnyMySqlTable,\n AC extends AnyMySqlTable,\n Rq extends AnyMySqlTable,\n NativeId,\n>(\n mapping: EmailRegistrationMapping<Registration, S, I, C, AC, Rq, NativeId>,\n proofMapping: ProofMapping,\n) =>\n Effect.flatMap(\n Effect.map(acquireTransactionService(DatabaseService), configuration),\n (configuration) =>\n makeTargetEmailRegistrationServices<Registration>(mapping, proofMapping, configuration),\n ).pipe(Effect.provideServiceEffect(CurrentEmailSql, nativeDatabase(DatabaseService)));\n\nexport function coordinateMysqlEmailRegistration<\n TargetId,\n Registration,\n D extends Database,\n S extends AnyMySqlTable,\n I extends AnyMySqlTable,\n C extends AnyMySqlTable,\n AC extends AnyMySqlTable,\n Rq extends AnyMySqlTable,\n NativeId,\n Out,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: EmailRegistrationMapping<NoInfer<Registration>, S, I, C, AC, Rq, NativeId>;\n readonly proofMapping: ProofMapping;\n readonly target: SuppliedService<TargetId, EmailRegistrationAuthority<Registration>>;\n readonly transaction?: never;\n },\n body: Effect.Effect<Out, E, R>,\n): Effect.Effect<\n Out,\n E | EmailUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, TargetId> | LifecycleHooks | DatabaseRequirements\n>;\n\nexport function coordinateMysqlEmailRegistration<\n TargetId,\n Registration,\n D extends Database,\n S extends AnyMySqlTable,\n I extends AnyMySqlTable,\n C extends AnyMySqlTable,\n AC extends AnyMySqlTable,\n Rq extends AnyMySqlTable,\n NativeId,\n Out,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: EmailRegistrationMapping<NoInfer<Registration>, S, I, C, AC, Rq, NativeId>;\n readonly proofMapping: ProofMapping;\n readonly target: SuppliedService<TargetId, EmailRegistrationAuthority<Registration>>;\n readonly transaction: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;\n },\n body: Effect.Effect<Out, E, R>,\n): Effect.Effect<\n Out,\n E | EmailUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, TargetId | TxId> | LifecycleHooks | DatabaseRequirements\n>;\n\nexport function coordinateMysqlEmailRegistration<\n TargetId,\n Registration,\n D extends Database,\n S extends AnyMySqlTable,\n I extends AnyMySqlTable,\n C extends AnyMySqlTable,\n AC extends AnyMySqlTable,\n Rq extends AnyMySqlTable,\n NativeId,\n Out,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: EmailRegistrationMapping<NoInfer<Registration>, S, I, C, AC, Rq, NativeId>;\n readonly proofMapping: ProofMapping;\n readonly target: SuppliedService<TargetId, EmailRegistrationAuthority<Registration>>;\n readonly transaction?: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;\n },\n body: Effect.Effect<Out, E, R>,\n): Effect.Effect<\n Out,\n E | EmailUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, TargetId> | LifecycleHooks | DatabaseRequirements\n> {\n return Effect.flatMap(acquire, (database) =>\n coordinateTargetEmailRegistration<Registration, TransactionOf<D>, Out, E, Exclude<R, TargetId>>(\n database,\n options.mapping,\n options.proofMapping,\n configuration(transactionService(database)),\n (\n transaction: TransactionOf<D>,\n services: { readonly registrationAuthority: EmailRegistrationAuthority<Registration> },\n ) => {\n const provided = Context.make(options.target, services.registrationAuthority);\n const work = Effect.provideContext(body, provided);\n\n return options.transaction === undefined\n ? work\n : Effect.provideService(work, options.transaction, options.transaction.of(transaction));\n },\n ),\n );\n}\n"],"mappings":";;;;;;;;;AAsDA,MAAM,iBAAiB,aAA6C;CAClE,MAAM;CACN,SAAS;CACT,iBAAiB,8BAA8B,OAAO;CACtD,uBAAuB,UAAyB,MAAM,aAAa;CACnE,OAAO;EACL,MAAM;EACN,SAAS;EACT,iBAAiB,8BAA8B,OAAO;EACtD,iBAAiB,OAAsB,SAAiB,cACtD,MAAM,qBAAqB,EAAE,KAAK,GAAG,UAAU,UAAU,EAAE,CAAC;CAChE;AACF;AAEA,MAAa,gCAMX,YAEA,OAAO,QACL,OAAO,IAAI,0BAA0BA,QAAe,GAAG,aAAa,IACnE,kBAAkB,8BAA8B,SAAS,aAAa,CACzE,CAAC,CAAC,KAAK,OAAO,qBAAqB,iBAAiB,eAAeA,QAAe,CAAC,CAAC;AAEtF,MAAa,iCAQX,SACA,iBAEA,OAAO,QACL,OAAO,IAAI,0BAA0BA,QAAe,GAAG,aAAa,IACnE,kBAAkB,+BAA+B,SAAS,cAAc,aAAa,CACxF,CAAC,CAAC,KAAK,OAAO,qBAAqB,iBAAiB,eAAeA,QAAe,CAAC,CAAC;AA0DtF,SAAgB,4BAgBd,SACA,SAKA,MAKA;CACA,OAAO,OAAO,QAAQ,UAAU,aAC9B,6BACE,UACA,QAAQ,SACR,QAAQ,cACR,cAAc,mBAAmB,QAAQ,CAAC,IAExC,aACA,aACG;EACH,MAAM,WAAW,QAAQ,KAAK,yBAAyB,SAAS,uBAAuB;EACvF,MAAM,OAAO,OAAO,eAAe,MAAM,QAAQ;EAEjD,OAAO,QAAQ,gBAAgB,KAAA,IAC3B,OACA,OAAO,eAAe,MAAM,QAAQ,aAAa,QAAQ,YAAY,GAAG,WAAW,CAAC;CAC1F,CACF,CACF;AACF;AAEA,MAAa,sCASX,SACA,iBAEA,OAAO,QACL,OAAO,IAAI,0BAA0BA,QAAe,GAAG,aAAa,IACnE,kBACC,oCAAkD,SAAS,cAAc,aAAa,CAC1F,CAAC,CAAC,KAAK,OAAO,qBAAqB,iBAAiB,eAAeA,QAAe,CAAC,CAAC;AAgEtF,SAAgB,iCAkBd,SACA,SAMA,MAKA;CACA,OAAO,OAAO,QAAQ,UAAU,aAC9B,kCACE,UACA,QAAQ,SACR,QAAQ,cACR,cAAc,mBAAmB,QAAQ,CAAC,IAExC,aACA,aACG;EACH,MAAM,WAAW,QAAQ,KAAK,QAAQ,QAAQ,SAAS,qBAAqB;EAC5E,MAAM,OAAO,OAAO,eAAe,MAAM,QAAQ;EAEjD,OAAO,QAAQ,gBAAgB,KAAA,IAC3B,OACA,OAAO,eAAe,MAAM,QAAQ,aAAa,QAAQ,YAAY,GAAG,WAAW,CAAC;CAC1F,CACF,CACF;AACF"}
|
|
1
|
+
{"version":3,"file":"mysql-emails.mjs","names":["DatabaseService"],"sources":["../../src/drizzle/mysql-emails.ts"],"sourcesContent":["import { NativeDatabase } from \"@yielded/auth-persistence/Adapter\";\nimport { EmailAddressPersistence, type EmailUnavailable } from \"@yielded/auth/Email\";\nimport type { LifecycleHooks, HookConfigurationError } from \"@yielded/auth/Hooks\";\n/* oxlint-disable no-explicit-any -- proof mapping tables are independently typed by the proof owner; this driver forwards them unchanged to the shared target. */\nimport type { AnyRelations } from \"drizzle-orm\";\nimport type { EffectMysql2Database } from \"drizzle-orm/effect-mysql2\";\nimport type { AnyMySqlTable } from \"drizzle-orm/mysql-core\";\nimport { Effect, Context } from \"effect\";\nimport type { SqlError } from \"effect/sql/SqlError\";\n\nimport type {\n EmailAddressMapping,\n EmailRegistrationMapping,\n EmailSignInMapping,\n} from \"./email-model\";\nimport type { EmailRegistrationAuthority } from \"./email-registration\";\nimport { CurrentEmailSql } from \"./email-sql\";\nimport type { EmailSqlQuery } from \"./email-sql\";\nimport {\n coordinateTargetEmailAddress,\n coordinateTargetEmailRegistration,\n makeTargetEmailAddressServices,\n makeTargetEmailRegistrationServices,\n makeTargetEmailSignInServices,\n sqlClientEmailStandaloneGuard,\n} from \"./email-target\";\nimport { Database as DatabaseService } from \"./mysql-database\";\nimport { nativeDatabase } from \"./native-database\";\nimport type { ProofPersistenceMapping } from \"./proof-model\";\nimport type { ProofSqlQuery } from \"./proof-sql\";\nimport { sqlClientProofStandaloneGuard } from \"./proof-target\";\nimport {\n type TransactionService,\n acquireTransactionService,\n transactionService,\n} from \"./standalone-guard\";\nimport type { SuppliedService } from \"./SuppliedService\";\n\ntype Database = EffectMysql2Database<AnyRelations>;\ntype TransactionOf<D extends Database> = Parameters<Parameters<D[\"transaction\"]>[0]>[0];\ntype ProofMapping = ProofPersistenceMapping<\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n>;\n\nconst configuration = (service: TransactionService | undefined) => ({\n mode: \"interactive\" as const,\n locking: true,\n standaloneGuard: sqlClientEmailStandaloneGuard(service),\n generatedSubjectRows: (query: EmailSqlQuery) => query.$returningId(),\n proof: {\n mode: \"interactive\" as const,\n locking: true,\n standaloneGuard: sqlClientProofStandaloneGuard(service),\n insertIfAbsent: (query: ProofSqlQuery, selfKey: string, selfValue: unknown) =>\n query.onDuplicateKeyUpdate({ set: { [selfKey]: selfValue } }),\n },\n});\n\nexport const makeMysqlEmailSignInServices = <\n S extends AnyMySqlTable,\n I extends AnyMySqlTable,\n C extends AnyMySqlTable,\n NativeId,\n>(\n mapping: EmailSignInMapping<S, I, C, NativeId>,\n) =>\n Effect.flatMap(\n Effect.map(acquireTransactionService(DatabaseService), configuration),\n (configuration) => makeTargetEmailSignInServices(mapping, configuration),\n ).pipe(\n Effect.provideServiceEffect(CurrentEmailSql, nativeDatabase(DatabaseService)),\n Effect.provideServiceEffect(NativeDatabase, nativeDatabase(DatabaseService)),\n );\n\nexport const makeMysqlEmailAddressServices = <\n S extends AnyMySqlTable,\n I extends AnyMySqlTable,\n C extends AnyMySqlTable,\n AC extends AnyMySqlTable,\n M extends AnyMySqlTable,\n NativeId,\n>(\n mapping: EmailAddressMapping<S, I, C, AC, M, NativeId>,\n proofMapping: ProofMapping,\n) =>\n Effect.flatMap(\n Effect.map(acquireTransactionService(DatabaseService), configuration),\n (configuration) => makeTargetEmailAddressServices(mapping, proofMapping, configuration),\n ).pipe(\n Effect.provideServiceEffect(CurrentEmailSql, nativeDatabase(DatabaseService)),\n Effect.provideServiceEffect(NativeDatabase, nativeDatabase(DatabaseService)),\n );\n\nexport function coordinateMysqlEmailAddress<\n D extends Database,\n S extends AnyMySqlTable,\n I extends AnyMySqlTable,\n C extends AnyMySqlTable,\n AC extends AnyMySqlTable,\n M extends AnyMySqlTable,\n NativeId,\n Out,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: EmailAddressMapping<S, I, C, AC, M, NativeId>;\n readonly proofMapping: ProofMapping;\n readonly transaction?: never;\n },\n body: Effect.Effect<Out, E, R>,\n): Effect.Effect<\n Out,\n E | EmailUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, EmailAddressPersistence> | LifecycleHooks | DatabaseRequirements\n>;\n\nexport function coordinateMysqlEmailAddress<\n D extends Database,\n S extends AnyMySqlTable,\n I extends AnyMySqlTable,\n C extends AnyMySqlTable,\n AC extends AnyMySqlTable,\n M extends AnyMySqlTable,\n NativeId,\n Out,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: EmailAddressMapping<S, I, C, AC, M, NativeId>;\n readonly proofMapping: ProofMapping;\n readonly transaction: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;\n },\n body: Effect.Effect<Out, E, R>,\n): Effect.Effect<\n Out,\n E | EmailUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, EmailAddressPersistence | TxId> | LifecycleHooks | DatabaseRequirements\n>;\n\nexport function coordinateMysqlEmailAddress<\n D extends Database,\n S extends AnyMySqlTable,\n I extends AnyMySqlTable,\n C extends AnyMySqlTable,\n AC extends AnyMySqlTable,\n M extends AnyMySqlTable,\n NativeId,\n Out,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: EmailAddressMapping<S, I, C, AC, M, NativeId>;\n readonly proofMapping: ProofMapping;\n readonly transaction?: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;\n },\n body: Effect.Effect<Out, E, R>,\n): Effect.Effect<\n Out,\n E | EmailUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, EmailAddressPersistence> | LifecycleHooks | DatabaseRequirements\n> {\n return Effect.flatMap(nativeDatabase(acquire), (database) =>\n coordinateTargetEmailAddress<TransactionOf<D>, Out, E, Exclude<R, EmailAddressPersistence>>(\n database,\n options.mapping,\n options.proofMapping,\n configuration(transactionService(database)),\n (\n transaction: TransactionOf<D>,\n services: { readonly emailAddressPersistence: EmailAddressPersistence[\"Service\"] },\n ) => {\n const provided = Context.make(EmailAddressPersistence, services.emailAddressPersistence);\n const work = Effect.provideContext(body, provided);\n\n return options.transaction === undefined\n ? work\n : Effect.provideService(work, options.transaction, options.transaction.of(transaction));\n },\n ).pipe(Effect.provideService(NativeDatabase, database)),\n );\n}\n\nexport const makeMysqlEmailRegistrationServices = <\n Registration,\n S extends AnyMySqlTable,\n I extends AnyMySqlTable,\n C extends AnyMySqlTable,\n AC extends AnyMySqlTable,\n Rq extends AnyMySqlTable,\n NativeId,\n>(\n mapping: EmailRegistrationMapping<Registration, S, I, C, AC, Rq, NativeId>,\n proofMapping: ProofMapping,\n) =>\n Effect.flatMap(\n Effect.map(acquireTransactionService(DatabaseService), configuration),\n (configuration) =>\n makeTargetEmailRegistrationServices<Registration>(mapping, proofMapping, configuration),\n ).pipe(\n Effect.provideServiceEffect(CurrentEmailSql, nativeDatabase(DatabaseService)),\n Effect.provideServiceEffect(NativeDatabase, nativeDatabase(DatabaseService)),\n );\n\nexport function coordinateMysqlEmailRegistration<\n TargetId,\n Registration,\n D extends Database,\n S extends AnyMySqlTable,\n I extends AnyMySqlTable,\n C extends AnyMySqlTable,\n AC extends AnyMySqlTable,\n Rq extends AnyMySqlTable,\n NativeId,\n Out,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: EmailRegistrationMapping<NoInfer<Registration>, S, I, C, AC, Rq, NativeId>;\n readonly proofMapping: ProofMapping;\n readonly target: SuppliedService<TargetId, EmailRegistrationAuthority<Registration>>;\n readonly transaction?: never;\n },\n body: Effect.Effect<Out, E, R>,\n): Effect.Effect<\n Out,\n E | EmailUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, TargetId> | LifecycleHooks | DatabaseRequirements\n>;\n\nexport function coordinateMysqlEmailRegistration<\n TargetId,\n Registration,\n D extends Database,\n S extends AnyMySqlTable,\n I extends AnyMySqlTable,\n C extends AnyMySqlTable,\n AC extends AnyMySqlTable,\n Rq extends AnyMySqlTable,\n NativeId,\n Out,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: EmailRegistrationMapping<NoInfer<Registration>, S, I, C, AC, Rq, NativeId>;\n readonly proofMapping: ProofMapping;\n readonly target: SuppliedService<TargetId, EmailRegistrationAuthority<Registration>>;\n readonly transaction: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;\n },\n body: Effect.Effect<Out, E, R>,\n): Effect.Effect<\n Out,\n E | EmailUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, TargetId | TxId> | LifecycleHooks | DatabaseRequirements\n>;\n\nexport function coordinateMysqlEmailRegistration<\n TargetId,\n Registration,\n D extends Database,\n S extends AnyMySqlTable,\n I extends AnyMySqlTable,\n C extends AnyMySqlTable,\n AC extends AnyMySqlTable,\n Rq extends AnyMySqlTable,\n NativeId,\n Out,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: EmailRegistrationMapping<NoInfer<Registration>, S, I, C, AC, Rq, NativeId>;\n readonly proofMapping: ProofMapping;\n readonly target: SuppliedService<TargetId, EmailRegistrationAuthority<Registration>>;\n readonly transaction?: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;\n },\n body: Effect.Effect<Out, E, R>,\n): Effect.Effect<\n Out,\n E | EmailUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, TargetId> | LifecycleHooks | DatabaseRequirements\n> {\n return Effect.flatMap(nativeDatabase(acquire), (database) =>\n coordinateTargetEmailRegistration<Registration, TransactionOf<D>, Out, E, Exclude<R, TargetId>>(\n database,\n options.mapping,\n options.proofMapping,\n configuration(transactionService(database)),\n (\n transaction: TransactionOf<D>,\n services: { readonly registrationAuthority: EmailRegistrationAuthority<Registration> },\n ) => {\n const provided = Context.make(options.target, services.registrationAuthority);\n const work = Effect.provideContext(body, provided);\n\n return options.transaction === undefined\n ? work\n : Effect.provideService(work, options.transaction, options.transaction.of(transaction));\n },\n ).pipe(Effect.provideService(NativeDatabase, database)),\n );\n}\n"],"mappings":";;;;;;;;;;AAuDA,MAAM,iBAAiB,aAA6C;CAClE,MAAM;CACN,SAAS;CACT,iBAAiB,8BAA8B,OAAO;CACtD,uBAAuB,UAAyB,MAAM,aAAa;CACnE,OAAO;EACL,MAAM;EACN,SAAS;EACT,iBAAiB,8BAA8B,OAAO;EACtD,iBAAiB,OAAsB,SAAiB,cACtD,MAAM,qBAAqB,EAAE,KAAK,GAAG,UAAU,UAAU,EAAE,CAAC;CAChE;AACF;AAEA,MAAa,gCAMX,YAEA,OAAO,QACL,OAAO,IAAI,0BAA0BA,QAAe,GAAG,aAAa,IACnE,kBAAkB,8BAA8B,SAAS,aAAa,CACzE,CAAC,CAAC,KACA,OAAO,qBAAqB,iBAAiB,eAAeA,QAAe,CAAC,GAC5E,OAAO,qBAAqB,gBAAgB,eAAeA,QAAe,CAAC,CAC7E;AAEF,MAAa,iCAQX,SACA,iBAEA,OAAO,QACL,OAAO,IAAI,0BAA0BA,QAAe,GAAG,aAAa,IACnE,kBAAkB,+BAA+B,SAAS,cAAc,aAAa,CACxF,CAAC,CAAC,KACA,OAAO,qBAAqB,iBAAiB,eAAeA,QAAe,CAAC,GAC5E,OAAO,qBAAqB,gBAAgB,eAAeA,QAAe,CAAC,CAC7E;AA0DF,SAAgB,4BAgBd,SACA,SAKA,MAKA;CACA,OAAO,OAAO,QAAQ,eAAe,OAAO,IAAI,aAC9C,6BACE,UACA,QAAQ,SACR,QAAQ,cACR,cAAc,mBAAmB,QAAQ,CAAC,IAExC,aACA,aACG;EACH,MAAM,WAAW,QAAQ,KAAK,yBAAyB,SAAS,uBAAuB;EACvF,MAAM,OAAO,OAAO,eAAe,MAAM,QAAQ;EAEjD,OAAO,QAAQ,gBAAgB,KAAA,IAC3B,OACA,OAAO,eAAe,MAAM,QAAQ,aAAa,QAAQ,YAAY,GAAG,WAAW,CAAC;CAC1F,CACF,CAAC,CAAC,KAAK,OAAO,eAAe,gBAAgB,QAAQ,CAAC,CACxD;AACF;AAEA,MAAa,sCASX,SACA,iBAEA,OAAO,QACL,OAAO,IAAI,0BAA0BA,QAAe,GAAG,aAAa,IACnE,kBACC,oCAAkD,SAAS,cAAc,aAAa,CAC1F,CAAC,CAAC,KACA,OAAO,qBAAqB,iBAAiB,eAAeA,QAAe,CAAC,GAC5E,OAAO,qBAAqB,gBAAgB,eAAeA,QAAe,CAAC,CAC7E;AAgEF,SAAgB,iCAkBd,SACA,SAMA,MAKA;CACA,OAAO,OAAO,QAAQ,eAAe,OAAO,IAAI,aAC9C,kCACE,UACA,QAAQ,SACR,QAAQ,cACR,cAAc,mBAAmB,QAAQ,CAAC,IAExC,aACA,aACG;EACH,MAAM,WAAW,QAAQ,KAAK,QAAQ,QAAQ,SAAS,qBAAqB;EAC5E,MAAM,OAAO,OAAO,eAAe,MAAM,QAAQ;EAEjD,OAAO,QAAQ,gBAAgB,KAAA,IAC3B,OACA,OAAO,eAAe,MAAM,QAAQ,aAAa,QAAQ,YAAY,GAAG,WAAW,CAAC;CAC1F,CACF,CAAC,CAAC,KAAK,OAAO,eAAe,gBAAgB,QAAQ,CAAC,CACxD;AACF"}
|
|
@@ -1,5 +1,8 @@
|
|
|
1
|
-
import { PersistenceMappingError, column, isMappedConstraintConflict, provisioningFingerprint } from "./model.mjs";
|
|
1
|
+
import { PersistenceMappingError as PersistenceMappingError$1, column, isMappedConstraintConflict, provisioningFingerprint } from "./model.mjs";
|
|
2
|
+
import { validateDrizzleStorage } from "./storage-validation.mjs";
|
|
3
|
+
import { nativeDatabase } from "./native-database.mjs";
|
|
2
4
|
import { Database } from "./mysql-database.mjs";
|
|
5
|
+
import { NativeDatabase } from "@yielded/auth-persistence/Adapter";
|
|
3
6
|
import { ExternalIdentityMutation, IdentityConflict, IdentityUnavailable, SubjectProvisioned, SubjectProvisioner } from "@yielded/auth/Identity";
|
|
4
7
|
import { and, eq } from "drizzle-orm";
|
|
5
8
|
import { Cause, Effect, Schema } from "effect";
|
|
@@ -9,7 +12,9 @@ const unavailable = () => IdentityUnavailable.make();
|
|
|
9
12
|
const isIdentityFailure = Schema.is(Schema.Union([IdentityConflict, IdentityUnavailable]));
|
|
10
13
|
const mapUnavailable = (effect) => reportPersistenceFailure(effect, isIdentityFailure).pipe(Effect.catchCause((cause) => Effect.failCause(Cause.map(cause, (error) => isIdentityFailure(error) ? error : unavailable()))));
|
|
11
14
|
const makeMysqlSubjectProvisioningServices = Effect.fnUntraced(function* (mapping) {
|
|
12
|
-
const
|
|
15
|
+
const database = yield* Database;
|
|
16
|
+
yield* validateDrizzleStorage(mapping).pipe(Effect.provideServiceEffect(NativeDatabase, nativeDatabase(Database)), Effect.mapError(() => IdentityUnavailable.make()));
|
|
17
|
+
const db = database;
|
|
13
18
|
const requestTable = mapping.provisioningRequest.table;
|
|
14
19
|
const requestIdColumn = column(requestTable, mapping.provisioningRequest.requestId);
|
|
15
20
|
const requestFingerprintColumn = column(requestTable, mapping.provisioningRequest.fingerprint);
|
|
@@ -36,7 +41,7 @@ const makeMysqlSubjectProvisioningServices = Effect.fnUntraced(function* (mappin
|
|
|
36
41
|
const insert = tx.insert(mapping.subject.table).values(mapping.subject.encodeInsert(input, allocated));
|
|
37
42
|
let nativeId = allocated;
|
|
38
43
|
if (nativeId === void 0) {
|
|
39
|
-
if (mapping.subject.decodeGeneratedId === void 0) return yield* PersistenceMappingError.make({
|
|
44
|
+
if (mapping.subject.decodeGeneratedId === void 0) return yield* PersistenceMappingError$1.make({
|
|
40
45
|
operation: "provisionSubject.generatedId",
|
|
41
46
|
cause: /* @__PURE__ */ new Error("MySQL generated IDs require decodeGeneratedId")
|
|
42
47
|
});
|
|
@@ -60,7 +65,9 @@ const makeMysqlSubjectProvisioningServices = Effect.fnUntraced(function* (mappin
|
|
|
60
65
|
return { subjectProvisioner: SubjectProvisioner.of({ provision }) };
|
|
61
66
|
});
|
|
62
67
|
const makeMysqlExternalIdentityServices = Effect.fnUntraced(function* (mapping) {
|
|
63
|
-
const
|
|
68
|
+
const database = yield* Database;
|
|
69
|
+
yield* validateDrizzleStorage(mapping).pipe(Effect.provideServiceEffect(NativeDatabase, nativeDatabase(Database)), Effect.mapError(() => IdentityUnavailable.make()));
|
|
70
|
+
const db = database;
|
|
64
71
|
const externalTable = mapping.externalIdentity.table;
|
|
65
72
|
const externalProviderColumn = column(externalTable, mapping.externalIdentity.provider);
|
|
66
73
|
const externalIssuerColumn = column(externalTable, mapping.externalIdentity.issuer);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mysql-identity.mjs","names":["DatabaseService"],"sources":["../../src/drizzle/mysql-identity.ts"],"sourcesContent":["import {\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 -- Drizzle generic query types are narrowed at this technology boundary. */\nimport { and, eq } from \"drizzle-orm\";\nimport type { EffectMysql2Database } from \"drizzle-orm/effect-mysql2\";\nimport type { AnyMySqlTable, MySqlColumn } from \"drizzle-orm/mysql-core\";\nimport { Cause, Effect, Schema } from \"effect\";\n\nimport {\n column,\n isMappedConstraintConflict,\n PersistenceMappingError,\n provisioningFingerprint,\n type ExternalIdentityTables,\n type IdentityTables,\n type SubjectProvisioningTables,\n} from \"./model\";\nimport { Database as DatabaseService } from \"./mysql-database\";\n\ntype RuntimeDatabase = EffectMysql2Database<any>;\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\nexport const makeMysqlSubjectProvisioningServices = Effect.fnUntraced(function* <\n Subject extends AnyMySqlTable,\n Identifier extends AnyMySqlTable,\n Request extends AnyMySqlTable,\n NativeId,\n>(mapping: SubjectProvisioningTables<Subject, Identifier, Request, NativeId>) {\n const database = yield* DatabaseService;\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 MySqlColumn;\n\n const requestFingerprintColumn = column(\n requestTable,\n mapping.provisioningRequest.fingerprint,\n ) as MySqlColumn;\n\n const requestSubjectColumn = column(\n requestTable,\n mapping.provisioningRequest.subjectId,\n ) as MySqlColumn;\n\n const identifierTable = mapping.identifier.table;\n\n const identifierNamespaceColumn = column(\n identifierTable,\n mapping.identifier.namespace,\n ) as MySqlColumn;\n\n const identifierValueColumn = column(identifierTable, mapping.identifier.value) as MySqlColumn;\n\n const findReceipt = Effect.fn(\"DrizzleMysqlIdentity.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(\"DrizzleMysqlIdentity.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 attempt = db.transaction((tx) =>\n Effect.gen(function* () {\n const allocated =\n mapping.subject.allocateId === undefined\n ? mapping.subject.allocateIdSync?.()\n : yield* mapping.subject.allocateId;\n\n const insert = tx\n .insert(mapping.subject.table as any)\n .values(mapping.subject.encodeInsert(input, allocated) as any);\n\n let nativeId = allocated;\n\n if (nativeId === undefined) {\n if (mapping.subject.decodeGeneratedId === undefined)\n return yield* PersistenceMappingError.make({\n operation: \"provisionSubject.generatedId\",\n cause: new Error(\"MySQL generated IDs require decodeGeneratedId\"),\n });\n const ids = yield* insert.$returningId();\n\n nativeId = yield* mapping.subject.decodeGeneratedId(ids as ReadonlyArray<unknown>);\n } else {\n yield* insert;\n }\n if (input.identifier !== undefined)\n yield* tx\n .insert(identifierTable as any)\n .values(\n mapping.identifier.encodeInsert(input.identifier, nativeId, input.verifiedAt) as any,\n );\n yield* tx\n .insert(requestTable as any)\n .values(\n mapping.provisioningRequest.encodeInsert(input.requestId, fingerprint, nativeId) as any,\n );\n\n return nativeId;\n }),\n );\n\n const nativeId = yield* attempt.pipe(\n Effect.catchCause(\n (\n cause,\n ): Effect.Effect<\n NativeId,\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 if (receipt !== undefined && receipt.fingerprint === fingerprint)\n return Effect.succeed(receipt.subjectId as NativeId);\n if (input.identifier === undefined) return IdentityConflict.make();\n\n return db\n .select({\n subjectId: column(identifierTable, mapping.identifier.subjectId) as MySqlColumn,\n })\n .from(identifierTable as any)\n .where(\n and(\n eq(identifierNamespaceColumn, input.identifier.namespace),\n eq(identifierValueColumn, input.identifier.value),\n ),\n )\n .limit(1)\n .pipe(Effect.flatMap(() => IdentityConflict.make()));\n }),\n );\n },\n ),\n );\n\n const subjectId = yield* mapping.subjectId.toSubject(nativeId);\n\n return SubjectProvisioned.make({ subjectId });\n }, mapUnavailable);\n\n return { subjectProvisioner: SubjectProvisioner.of({ provision }) } as const;\n});\n\nexport const makeMysqlExternalIdentityServices = Effect.fnUntraced(function* <\n Subject extends AnyMySqlTable,\n External extends AnyMySqlTable,\n NativeId,\n>(mapping: ExternalIdentityTables<Subject, External, NativeId>) {\n const database = yield* DatabaseService;\n\n const db = database as RuntimeDatabase;\n const externalTable = mapping.externalIdentity.table;\n\n const externalProviderColumn = column(\n externalTable,\n mapping.externalIdentity.provider,\n ) as MySqlColumn;\n\n const externalIssuerColumn = column(\n externalTable,\n mapping.externalIdentity.issuer,\n ) as MySqlColumn;\n\n const externalSubjectColumn = column(\n externalTable,\n mapping.externalIdentity.subject,\n ) as MySqlColumn;\n\n const externalSubjectIdColumn = column(\n externalTable,\n mapping.externalIdentity.subjectId,\n ) as MySqlColumn;\n\n const subjectIdColumn = column(mapping.subject.table, mapping.subject.id) as MySqlColumn;\n const subjectStatusColumn = column(mapping.subject.table, mapping.subject.status) as MySqlColumn;\n\n const bind = Effect.fn(\"DrizzleMysqlIdentity.bindExternalIdentity\")(function* (\n subjectId: SubjectId,\n identity: ExternalIdentity,\n ) {\n const nativeId = yield* mapping.subjectId.toNative(subjectId);\n\n const decision = yield* db\n .transaction((tx) =>\n Effect.gen(function* () {\n const subjects = yield* tx\n .select({ status: subjectStatusColumn })\n .from(mapping.subject.table as any)\n .where(eq(subjectIdColumn, nativeId))\n .for(\"update\")\n .limit(1);\n\n if (subjects[0] === undefined || !mapping.subject.isActiveStatus(subjects[0].status))\n return { _tag: \"conflict\" } as const;\n\n const links = yield* tx\n .select({ subjectId: externalSubjectIdColumn })\n .from(externalTable as any)\n .where(\n and(\n eq(externalProviderColumn, identity.provider),\n eq(externalIssuerColumn, identity.issuer),\n eq(externalSubjectColumn, identity.subject),\n ),\n )\n .for(\"update\")\n .limit(1);\n\n if (links[0] !== undefined)\n return mapping.subjectId.equals(links[0].subjectId as NativeId, nativeId)\n ? ({ _tag: \"bound\" } as const)\n : ({ _tag: \"conflict\" } as const);\n yield* tx\n .insert(externalTable as any)\n .values(mapping.externalIdentity.encodeInsert(identity, nativeId) as any);\n\n return { _tag: \"bound\" } as const;\n }),\n )\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 .where(\n and(\n eq(externalProviderColumn, identity.provider),\n eq(externalIssuerColumn, identity.issuer),\n eq(externalSubjectColumn, identity.subject),\n ),\n )\n .limit(1)\n .pipe(\n Effect.map((rows) =>\n rows[0] !== undefined &&\n mapping.subjectId.equals(rows[0].subjectId as NativeId, nativeId)\n ? ({ _tag: \"bound\" } as const)\n : ({ _tag: \"conflict\" } as const),\n ),\n );\n }),\n );\n\n if (decision._tag === \"conflict\") return yield* IdentityConflict.make();\n }, mapUnavailable);\n\n return { externalIdentityMutation: ExternalIdentityMutation.of({ bind }) } as const;\n});\n\nexport const makeMysqlIdentityServices = Effect.fnUntraced(function* <\n Subject extends AnyMySqlTable,\n Identifier extends AnyMySqlTable,\n External extends AnyMySqlTable,\n Request extends AnyMySqlTable,\n NativeId,\n>(mapping: IdentityTables<Subject, Identifier, External, Request, NativeId>) {\n return {\n ...(yield* makeMysqlSubjectProvisioningServices(mapping)),\n ...(yield* makeMysqlExternalIdentityServices(mapping)),\n };\n});\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"mysql-identity.mjs","names":["DatabaseService","PersistenceMappingError"],"sources":["../../src/drizzle/mysql-identity.ts"],"sourcesContent":["import { 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 -- Drizzle generic query types are narrowed at this technology boundary. */\nimport { and, eq } from \"drizzle-orm\";\nimport type { EffectMysql2Database } from \"drizzle-orm/effect-mysql2\";\nimport type { AnyMySqlTable, MySqlColumn } from \"drizzle-orm/mysql-core\";\nimport { Cause, Effect, Schema } from \"effect\";\n\nimport {\n column,\n isMappedConstraintConflict,\n PersistenceMappingError,\n provisioningFingerprint,\n type ExternalIdentityTables,\n type IdentityTables,\n type SubjectProvisioningTables,\n} from \"./model\";\nimport { Database as DatabaseService } from \"./mysql-database\";\nimport { nativeDatabase } from \"./native-database\";\nimport { validateDrizzleStorage } from \"./storage-validation\";\n\ntype RuntimeDatabase = EffectMysql2Database<any>;\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\nexport const makeMysqlSubjectProvisioningServices = Effect.fnUntraced(function* <\n Subject extends AnyMySqlTable,\n Identifier extends AnyMySqlTable,\n Request extends AnyMySqlTable,\n NativeId,\n>(mapping: SubjectProvisioningTables<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 MySqlColumn;\n\n const requestFingerprintColumn = column(\n requestTable,\n mapping.provisioningRequest.fingerprint,\n ) as MySqlColumn;\n\n const requestSubjectColumn = column(\n requestTable,\n mapping.provisioningRequest.subjectId,\n ) as MySqlColumn;\n\n const identifierTable = mapping.identifier.table;\n\n const identifierNamespaceColumn = column(\n identifierTable,\n mapping.identifier.namespace,\n ) as MySqlColumn;\n\n const identifierValueColumn = column(identifierTable, mapping.identifier.value) as MySqlColumn;\n\n const findReceipt = Effect.fn(\"DrizzleMysqlIdentity.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(\"DrizzleMysqlIdentity.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 attempt = db.transaction((tx) =>\n Effect.gen(function* () {\n const allocated =\n mapping.subject.allocateId === undefined\n ? mapping.subject.allocateIdSync?.()\n : yield* mapping.subject.allocateId;\n\n const insert = tx\n .insert(mapping.subject.table as any)\n .values(mapping.subject.encodeInsert(input, allocated) as any);\n\n let nativeId = allocated;\n\n if (nativeId === undefined) {\n if (mapping.subject.decodeGeneratedId === undefined)\n return yield* PersistenceMappingError.make({\n operation: \"provisionSubject.generatedId\",\n cause: new Error(\"MySQL generated IDs require decodeGeneratedId\"),\n });\n const ids = yield* insert.$returningId();\n\n nativeId = yield* mapping.subject.decodeGeneratedId(ids as ReadonlyArray<unknown>);\n } else {\n yield* insert;\n }\n if (input.identifier !== undefined)\n yield* tx\n .insert(identifierTable as any)\n .values(\n mapping.identifier.encodeInsert(input.identifier, nativeId, input.verifiedAt) as any,\n );\n yield* tx\n .insert(requestTable as any)\n .values(\n mapping.provisioningRequest.encodeInsert(input.requestId, fingerprint, nativeId) as any,\n );\n\n return nativeId;\n }),\n );\n\n const nativeId = yield* attempt.pipe(\n Effect.catchCause(\n (\n cause,\n ): Effect.Effect<\n NativeId,\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 if (receipt !== undefined && receipt.fingerprint === fingerprint)\n return Effect.succeed(receipt.subjectId as NativeId);\n if (input.identifier === undefined) return IdentityConflict.make();\n\n return db\n .select({\n subjectId: column(identifierTable, mapping.identifier.subjectId) as MySqlColumn,\n })\n .from(identifierTable as any)\n .where(\n and(\n eq(identifierNamespaceColumn, input.identifier.namespace),\n eq(identifierValueColumn, input.identifier.value),\n ),\n )\n .limit(1)\n .pipe(Effect.flatMap(() => IdentityConflict.make()));\n }),\n );\n },\n ),\n );\n\n const subjectId = yield* mapping.subjectId.toSubject(nativeId);\n\n return SubjectProvisioned.make({ subjectId });\n }, mapUnavailable);\n\n return { subjectProvisioner: SubjectProvisioner.of({ provision }) } as const;\n});\n\nexport const makeMysqlExternalIdentityServices = Effect.fnUntraced(function* <\n Subject extends AnyMySqlTable,\n External extends AnyMySqlTable,\n NativeId,\n>(mapping: ExternalIdentityTables<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 externalProviderColumn = column(\n externalTable,\n mapping.externalIdentity.provider,\n ) as MySqlColumn;\n\n const externalIssuerColumn = column(\n externalTable,\n mapping.externalIdentity.issuer,\n ) as MySqlColumn;\n\n const externalSubjectColumn = column(\n externalTable,\n mapping.externalIdentity.subject,\n ) as MySqlColumn;\n\n const externalSubjectIdColumn = column(\n externalTable,\n mapping.externalIdentity.subjectId,\n ) as MySqlColumn;\n\n const subjectIdColumn = column(mapping.subject.table, mapping.subject.id) as MySqlColumn;\n const subjectStatusColumn = column(mapping.subject.table, mapping.subject.status) as MySqlColumn;\n\n const bind = Effect.fn(\"DrizzleMysqlIdentity.bindExternalIdentity\")(function* (\n subjectId: SubjectId,\n identity: ExternalIdentity,\n ) {\n const nativeId = yield* mapping.subjectId.toNative(subjectId);\n\n const decision = yield* db\n .transaction((tx) =>\n Effect.gen(function* () {\n const subjects = yield* tx\n .select({ status: subjectStatusColumn })\n .from(mapping.subject.table as any)\n .where(eq(subjectIdColumn, nativeId))\n .for(\"update\")\n .limit(1);\n\n if (subjects[0] === undefined || !mapping.subject.isActiveStatus(subjects[0].status))\n return { _tag: \"conflict\" } as const;\n\n const links = yield* tx\n .select({ subjectId: externalSubjectIdColumn })\n .from(externalTable as any)\n .where(\n and(\n eq(externalProviderColumn, identity.provider),\n eq(externalIssuerColumn, identity.issuer),\n eq(externalSubjectColumn, identity.subject),\n ),\n )\n .for(\"update\")\n .limit(1);\n\n if (links[0] !== undefined)\n return mapping.subjectId.equals(links[0].subjectId as NativeId, nativeId)\n ? ({ _tag: \"bound\" } as const)\n : ({ _tag: \"conflict\" } as const);\n yield* tx\n .insert(externalTable as any)\n .values(mapping.externalIdentity.encodeInsert(identity, nativeId) as any);\n\n return { _tag: \"bound\" } as const;\n }),\n )\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 .where(\n and(\n eq(externalProviderColumn, identity.provider),\n eq(externalIssuerColumn, identity.issuer),\n eq(externalSubjectColumn, identity.subject),\n ),\n )\n .limit(1)\n .pipe(\n Effect.map((rows) =>\n rows[0] !== undefined &&\n mapping.subjectId.equals(rows[0].subjectId as NativeId, nativeId)\n ? ({ _tag: \"bound\" } as const)\n : ({ _tag: \"conflict\" } as const),\n ),\n );\n }),\n );\n\n if (decision._tag === \"conflict\") return yield* IdentityConflict.make();\n }, mapUnavailable);\n\n return { externalIdentityMutation: ExternalIdentityMutation.of({ bind }) } as const;\n});\n\nexport const makeMysqlIdentityServices = Effect.fnUntraced(function* <\n Subject extends AnyMySqlTable,\n Identifier extends AnyMySqlTable,\n External extends AnyMySqlTable,\n Request extends AnyMySqlTable,\n NativeId,\n>(mapping: IdentityTables<Subject, Identifier, External, Request, NativeId>) {\n return {\n ...(yield* makeMysqlSubjectProvisioningServices(mapping)),\n ...(yield* makeMysqlExternalIdentityServices(mapping)),\n };\n});\n"],"mappings":"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"}
|
|
@@ -4,16 +4,16 @@ import { Database as Database$1 } from "./mysql-database.mjs";
|
|
|
4
4
|
import { AnyRelations } from "drizzle-orm";
|
|
5
5
|
import { Effect } from "effect";
|
|
6
6
|
import { HookConfigurationError, LifecycleHooks } from "@yielded/auth/Hooks";
|
|
7
|
+
import { AnyMySqlTable } from "drizzle-orm/mysql-core";
|
|
7
8
|
import { PasswordPreparedPersistence, PasswordUnavailable } from "@yielded/auth/Password";
|
|
8
9
|
import { EffectMysql2Database } from "drizzle-orm/effect-mysql2";
|
|
9
10
|
import { SqlError } from "effect/sql/SqlError";
|
|
10
|
-
import { AnyMySqlTable } from "drizzle-orm/mysql-core";
|
|
11
11
|
//#region src/drizzle/mysql-password-prepared.d.ts
|
|
12
12
|
type Database = EffectMysql2Database<AnyRelations>;
|
|
13
13
|
type TransactionOf<D extends Database> = Parameters<Parameters<D["transaction"]>[0]>[0];
|
|
14
14
|
export declare const makeMySqlPasswordPreparedPersistenceServices: <S extends AnyMySqlTable, I extends AnyMySqlTable, C extends AnyMySqlTable, AC extends AnyMySqlTable, A extends AnyMySqlTable, RS extends AnyMySqlTable, CE extends AnyMySqlTable, M extends AnyMySqlTable, T extends AnyMySqlTable, B extends AnyMySqlTable, NativeId, PS extends AnyMySqlTable = AnyMySqlTable, PC extends AnyMySqlTable = AnyMySqlTable, PM extends AnyMySqlTable = AnyMySqlTable, PSub extends AnyMySqlTable = AnyMySqlTable, PI extends AnyMySqlTable = AnyMySqlTable, PCr extends AnyMySqlTable = AnyMySqlTable, PNativeId = unknown>(mapping: PasswordPreparedPersistenceMapping<S, I, C, AC, A, RS, CE, M, T, B, NativeId>, proofMapping?: PasswordPreparedProofMapping<PS, PC, PM, PSub, PI, PCr, PNativeId>) => Effect.Effect<{
|
|
15
15
|
passwordPreparedPersistence: PasswordPreparedPersistence;
|
|
16
|
-
},
|
|
16
|
+
}, PasswordUnavailable, Database$1 | LifecycleHooks>;
|
|
17
17
|
export declare function coordinateMySqlPasswordPreparedPersistence<TargetId, D extends Database, S extends AnyMySqlTable, I extends AnyMySqlTable, C extends AnyMySqlTable, AC extends AnyMySqlTable, A extends AnyMySqlTable, RS extends AnyMySqlTable, CE extends AnyMySqlTable, M extends AnyMySqlTable, T extends AnyMySqlTable, B extends AnyMySqlTable, NativeId, PS extends AnyMySqlTable, PC extends AnyMySqlTable, PM extends AnyMySqlTable, PSub extends AnyMySqlTable, PI extends AnyMySqlTable, PCr extends AnyMySqlTable, PNativeId, Out, E, R, DatabaseError, DatabaseRequirements>(acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>, options: {
|
|
18
18
|
readonly mapping: PasswordPreparedPersistenceMapping<S, I, C, AC, A, RS, CE, M, T, B, NativeId>;
|
|
19
19
|
readonly proofMapping?: PasswordPreparedProofMapping<PS, PC, PM, PSub, PI, PCr, PNativeId> | undefined;
|
|
@@ -4,15 +4,16 @@ import { coordinateTargetPasswordPreparedPersistence, makeTargetPasswordPrepared
|
|
|
4
4
|
import { nativeDatabase } from "./native-database.mjs";
|
|
5
5
|
import { Database } from "./mysql-database.mjs";
|
|
6
6
|
import { mysqlPasswordConfiguration as configuration } from "./mysql-passwords.mjs";
|
|
7
|
+
import { NativeDatabase } from "@yielded/auth-persistence/Adapter";
|
|
7
8
|
import { Context, Effect } from "effect";
|
|
8
9
|
//#region src/drizzle/mysql-password-prepared.ts
|
|
9
|
-
const makeMySqlPasswordPreparedPersistenceServices = (mapping, proofMapping) => Effect.flatMap(Effect.map(acquireTransactionService(Database), configuration), (configuration) => makeTargetPasswordPreparedPersistenceServices(mapping, configuration, proofMapping)).pipe(Effect.provideServiceEffect(CurrentPasswordSql, nativeDatabase(Database)));
|
|
10
|
+
const makeMySqlPasswordPreparedPersistenceServices = (mapping, proofMapping) => Effect.flatMap(Effect.map(acquireTransactionService(Database), configuration), (configuration) => makeTargetPasswordPreparedPersistenceServices(mapping, configuration, proofMapping)).pipe(Effect.provideServiceEffect(CurrentPasswordSql, nativeDatabase(Database)), Effect.provideServiceEffect(NativeDatabase, nativeDatabase(Database)));
|
|
10
11
|
function coordinateMySqlPasswordPreparedPersistence(acquire, options, body) {
|
|
11
|
-
return Effect.flatMap(acquire, (database) => coordinateTargetPasswordPreparedPersistence(database, options.mapping, configuration(transactionService(database)), options.proofMapping, (transaction, services) => {
|
|
12
|
+
return Effect.flatMap(nativeDatabase(acquire), (database) => coordinateTargetPasswordPreparedPersistence(database, options.mapping, configuration(transactionService(database)), options.proofMapping, (transaction, services) => {
|
|
12
13
|
const provided = Context.make(options.target, services.passwordPreparedPersistence);
|
|
13
14
|
const work = Effect.provideContext(body, provided);
|
|
14
15
|
return options.transaction === void 0 ? work : Effect.provideService(work, options.transaction, options.transaction.of(transaction));
|
|
15
|
-
}));
|
|
16
|
+
}).pipe(Effect.provideService(NativeDatabase, database)));
|
|
16
17
|
}
|
|
17
18
|
//#endregion
|
|
18
19
|
export { coordinateMySqlPasswordPreparedPersistence, makeMySqlPasswordPreparedPersistenceServices };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mysql-password-prepared.mjs","names":["DatabaseService"],"sources":["../../src/drizzle/mysql-password-prepared.ts"],"sourcesContent":["import type { LifecycleHooks, HookConfigurationError } from \"@yielded/auth/Hooks\";\nimport type { PasswordUnavailable, PasswordPreparedPersistence } from \"@yielded/auth/Password\";\nimport type { AnyRelations } from \"drizzle-orm\";\nimport type { EffectMysql2Database } from \"drizzle-orm/effect-mysql2\";\nimport type { AnyMySqlTable } from \"drizzle-orm/mysql-core\";\nimport { Effect, Context } from \"effect\";\nimport type { SqlError } from \"effect/sql/SqlError\";\n\nimport { Database as DatabaseService } from \"./mysql-database\";\nimport { mysqlPasswordConfiguration as configuration } from \"./mysql-passwords\";\nimport { nativeDatabase } from \"./native-database\";\nimport type {\n PasswordPreparedPersistenceMapping,\n PasswordPreparedProofMapping,\n} from \"./password-prepared-model\";\nimport {\n makeTargetPasswordPreparedPersistenceServices,\n coordinateTargetPasswordPreparedPersistence,\n} from \"./password-prepared-target\";\nimport { CurrentPasswordSql } from \"./password-sql\";\nimport { acquireTransactionService, transactionService } from \"./standalone-guard\";\nimport type { SuppliedService } from \"./SuppliedService\";\ntype Database = EffectMysql2Database<AnyRelations>;\ntype TransactionOf<D extends Database> = Parameters<Parameters<D[\"transaction\"]>[0]>[0];\n\nexport const makeMySqlPasswordPreparedPersistenceServices = <\n S extends AnyMySqlTable,\n I extends AnyMySqlTable,\n C extends AnyMySqlTable,\n AC extends AnyMySqlTable,\n A extends AnyMySqlTable,\n RS extends AnyMySqlTable,\n CE extends AnyMySqlTable,\n M extends AnyMySqlTable,\n T extends AnyMySqlTable,\n B extends AnyMySqlTable,\n NativeId,\n PS extends AnyMySqlTable = AnyMySqlTable,\n PC extends AnyMySqlTable = AnyMySqlTable,\n PM extends AnyMySqlTable = AnyMySqlTable,\n PSub extends AnyMySqlTable = AnyMySqlTable,\n PI extends AnyMySqlTable = AnyMySqlTable,\n PCr extends AnyMySqlTable = AnyMySqlTable,\n PNativeId = unknown,\n>(\n mapping: PasswordPreparedPersistenceMapping<S, I, C, AC, A, RS, CE, M, T, B, NativeId>,\n proofMapping?: PasswordPreparedProofMapping<PS, PC, PM, PSub, PI, PCr, PNativeId>,\n) =>\n Effect.flatMap(\n Effect.map(acquireTransactionService(DatabaseService), configuration),\n (configuration) =>\n makeTargetPasswordPreparedPersistenceServices(mapping, configuration, proofMapping),\n ).pipe(Effect.provideServiceEffect(CurrentPasswordSql, nativeDatabase(DatabaseService)));\n\nexport function coordinateMySqlPasswordPreparedPersistence<\n TargetId,\n D extends Database,\n S extends AnyMySqlTable,\n I extends AnyMySqlTable,\n C extends AnyMySqlTable,\n AC extends AnyMySqlTable,\n A extends AnyMySqlTable,\n RS extends AnyMySqlTable,\n CE extends AnyMySqlTable,\n M extends AnyMySqlTable,\n T extends AnyMySqlTable,\n B extends AnyMySqlTable,\n NativeId,\n PS extends AnyMySqlTable,\n PC extends AnyMySqlTable,\n PM extends AnyMySqlTable,\n PSub extends AnyMySqlTable,\n PI extends AnyMySqlTable,\n PCr extends AnyMySqlTable,\n PNativeId,\n Out,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: PasswordPreparedPersistenceMapping<S, I, C, AC, A, RS, CE, M, T, B, NativeId>;\n readonly proofMapping?:\n | PasswordPreparedProofMapping<PS, PC, PM, PSub, PI, PCr, PNativeId>\n | undefined;\n readonly target: SuppliedService<TargetId, PasswordPreparedPersistence>;\n readonly transaction?: never;\n },\n body: Effect.Effect<Out, E, R>,\n): Effect.Effect<\n Out,\n E | PasswordUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, TargetId> | LifecycleHooks | DatabaseRequirements\n>;\n\nexport function coordinateMySqlPasswordPreparedPersistence<\n TargetId,\n D extends Database,\n S extends AnyMySqlTable,\n I extends AnyMySqlTable,\n C extends AnyMySqlTable,\n AC extends AnyMySqlTable,\n A extends AnyMySqlTable,\n RS extends AnyMySqlTable,\n CE extends AnyMySqlTable,\n M extends AnyMySqlTable,\n T extends AnyMySqlTable,\n B extends AnyMySqlTable,\n NativeId,\n PS extends AnyMySqlTable,\n PC extends AnyMySqlTable,\n PM extends AnyMySqlTable,\n PSub extends AnyMySqlTable,\n PI extends AnyMySqlTable,\n PCr extends AnyMySqlTable,\n PNativeId,\n Out,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: PasswordPreparedPersistenceMapping<S, I, C, AC, A, RS, CE, M, T, B, NativeId>;\n readonly proofMapping?:\n | PasswordPreparedProofMapping<PS, PC, PM, PSub, PI, PCr, PNativeId>\n | undefined;\n readonly target: SuppliedService<TargetId, PasswordPreparedPersistence>;\n readonly transaction: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;\n },\n body: Effect.Effect<Out, E, R>,\n): Effect.Effect<\n Out,\n E | PasswordUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, TargetId | TxId> | LifecycleHooks | DatabaseRequirements\n>;\n\nexport function coordinateMySqlPasswordPreparedPersistence<\n TargetId,\n D extends Database,\n S extends AnyMySqlTable,\n I extends AnyMySqlTable,\n C extends AnyMySqlTable,\n AC extends AnyMySqlTable,\n A extends AnyMySqlTable,\n RS extends AnyMySqlTable,\n CE extends AnyMySqlTable,\n M extends AnyMySqlTable,\n T extends AnyMySqlTable,\n B extends AnyMySqlTable,\n NativeId,\n PS extends AnyMySqlTable,\n PC extends AnyMySqlTable,\n PM extends AnyMySqlTable,\n PSub extends AnyMySqlTable,\n PI extends AnyMySqlTable,\n PCr extends AnyMySqlTable,\n PNativeId,\n Out,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: PasswordPreparedPersistenceMapping<S, I, C, AC, A, RS, CE, M, T, B, NativeId>;\n readonly proofMapping?:\n | PasswordPreparedProofMapping<PS, PC, PM, PSub, PI, PCr, PNativeId>\n | undefined;\n readonly target: SuppliedService<TargetId, PasswordPreparedPersistence>;\n readonly transaction?: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;\n },\n body: Effect.Effect<Out, E, R>,\n): Effect.Effect<\n Out,\n E | PasswordUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, TargetId> | LifecycleHooks | DatabaseRequirements\n> {\n return Effect.flatMap(acquire, (database) =>\n coordinateTargetPasswordPreparedPersistence<TransactionOf<D>, Out, E, Exclude<R, TargetId>>(\n database,\n options.mapping,\n configuration(transactionService(database)),\n options.proofMapping,\n (\n transaction: TransactionOf<D>,\n services: { readonly passwordPreparedPersistence: PasswordPreparedPersistence },\n ) => {\n const provided = Context.make(options.target, services.passwordPreparedPersistence);\n const work = Effect.provideContext(body, provided);\n\n return options.transaction === undefined\n ? work\n : Effect.provideService(work, options.transaction, options.transaction.of(transaction));\n },\n ),\n );\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"mysql-password-prepared.mjs","names":["DatabaseService"],"sources":["../../src/drizzle/mysql-password-prepared.ts"],"sourcesContent":["import { NativeDatabase } from \"@yielded/auth-persistence/Adapter\";\nimport type { LifecycleHooks, HookConfigurationError } from \"@yielded/auth/Hooks\";\nimport type { PasswordUnavailable, PasswordPreparedPersistence } from \"@yielded/auth/Password\";\nimport type { AnyRelations } from \"drizzle-orm\";\nimport type { EffectMysql2Database } from \"drizzle-orm/effect-mysql2\";\nimport type { AnyMySqlTable } from \"drizzle-orm/mysql-core\";\nimport { Effect, Context } from \"effect\";\nimport type { SqlError } from \"effect/sql/SqlError\";\n\nimport { Database as DatabaseService } from \"./mysql-database\";\nimport { mysqlPasswordConfiguration as configuration } from \"./mysql-passwords\";\nimport { nativeDatabase } from \"./native-database\";\nimport type {\n PasswordPreparedPersistenceMapping,\n PasswordPreparedProofMapping,\n} from \"./password-prepared-model\";\nimport {\n makeTargetPasswordPreparedPersistenceServices,\n coordinateTargetPasswordPreparedPersistence,\n} from \"./password-prepared-target\";\nimport { CurrentPasswordSql } from \"./password-sql\";\nimport { acquireTransactionService, transactionService } from \"./standalone-guard\";\nimport type { SuppliedService } from \"./SuppliedService\";\ntype Database = EffectMysql2Database<AnyRelations>;\ntype TransactionOf<D extends Database> = Parameters<Parameters<D[\"transaction\"]>[0]>[0];\n\nexport const makeMySqlPasswordPreparedPersistenceServices = <\n S extends AnyMySqlTable,\n I extends AnyMySqlTable,\n C extends AnyMySqlTable,\n AC extends AnyMySqlTable,\n A extends AnyMySqlTable,\n RS extends AnyMySqlTable,\n CE extends AnyMySqlTable,\n M extends AnyMySqlTable,\n T extends AnyMySqlTable,\n B extends AnyMySqlTable,\n NativeId,\n PS extends AnyMySqlTable = AnyMySqlTable,\n PC extends AnyMySqlTable = AnyMySqlTable,\n PM extends AnyMySqlTable = AnyMySqlTable,\n PSub extends AnyMySqlTable = AnyMySqlTable,\n PI extends AnyMySqlTable = AnyMySqlTable,\n PCr extends AnyMySqlTable = AnyMySqlTable,\n PNativeId = unknown,\n>(\n mapping: PasswordPreparedPersistenceMapping<S, I, C, AC, A, RS, CE, M, T, B, NativeId>,\n proofMapping?: PasswordPreparedProofMapping<PS, PC, PM, PSub, PI, PCr, PNativeId>,\n) =>\n Effect.flatMap(\n Effect.map(acquireTransactionService(DatabaseService), configuration),\n (configuration) =>\n makeTargetPasswordPreparedPersistenceServices(mapping, configuration, proofMapping),\n ).pipe(\n Effect.provideServiceEffect(CurrentPasswordSql, nativeDatabase(DatabaseService)),\n Effect.provideServiceEffect(NativeDatabase, nativeDatabase(DatabaseService)),\n );\n\nexport function coordinateMySqlPasswordPreparedPersistence<\n TargetId,\n D extends Database,\n S extends AnyMySqlTable,\n I extends AnyMySqlTable,\n C extends AnyMySqlTable,\n AC extends AnyMySqlTable,\n A extends AnyMySqlTable,\n RS extends AnyMySqlTable,\n CE extends AnyMySqlTable,\n M extends AnyMySqlTable,\n T extends AnyMySqlTable,\n B extends AnyMySqlTable,\n NativeId,\n PS extends AnyMySqlTable,\n PC extends AnyMySqlTable,\n PM extends AnyMySqlTable,\n PSub extends AnyMySqlTable,\n PI extends AnyMySqlTable,\n PCr extends AnyMySqlTable,\n PNativeId,\n Out,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: PasswordPreparedPersistenceMapping<S, I, C, AC, A, RS, CE, M, T, B, NativeId>;\n readonly proofMapping?:\n | PasswordPreparedProofMapping<PS, PC, PM, PSub, PI, PCr, PNativeId>\n | undefined;\n readonly target: SuppliedService<TargetId, PasswordPreparedPersistence>;\n readonly transaction?: never;\n },\n body: Effect.Effect<Out, E, R>,\n): Effect.Effect<\n Out,\n E | PasswordUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, TargetId> | LifecycleHooks | DatabaseRequirements\n>;\n\nexport function coordinateMySqlPasswordPreparedPersistence<\n TargetId,\n D extends Database,\n S extends AnyMySqlTable,\n I extends AnyMySqlTable,\n C extends AnyMySqlTable,\n AC extends AnyMySqlTable,\n A extends AnyMySqlTable,\n RS extends AnyMySqlTable,\n CE extends AnyMySqlTable,\n M extends AnyMySqlTable,\n T extends AnyMySqlTable,\n B extends AnyMySqlTable,\n NativeId,\n PS extends AnyMySqlTable,\n PC extends AnyMySqlTable,\n PM extends AnyMySqlTable,\n PSub extends AnyMySqlTable,\n PI extends AnyMySqlTable,\n PCr extends AnyMySqlTable,\n PNativeId,\n Out,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: PasswordPreparedPersistenceMapping<S, I, C, AC, A, RS, CE, M, T, B, NativeId>;\n readonly proofMapping?:\n | PasswordPreparedProofMapping<PS, PC, PM, PSub, PI, PCr, PNativeId>\n | undefined;\n readonly target: SuppliedService<TargetId, PasswordPreparedPersistence>;\n readonly transaction: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;\n },\n body: Effect.Effect<Out, E, R>,\n): Effect.Effect<\n Out,\n E | PasswordUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, TargetId | TxId> | LifecycleHooks | DatabaseRequirements\n>;\n\nexport function coordinateMySqlPasswordPreparedPersistence<\n TargetId,\n D extends Database,\n S extends AnyMySqlTable,\n I extends AnyMySqlTable,\n C extends AnyMySqlTable,\n AC extends AnyMySqlTable,\n A extends AnyMySqlTable,\n RS extends AnyMySqlTable,\n CE extends AnyMySqlTable,\n M extends AnyMySqlTable,\n T extends AnyMySqlTable,\n B extends AnyMySqlTable,\n NativeId,\n PS extends AnyMySqlTable,\n PC extends AnyMySqlTable,\n PM extends AnyMySqlTable,\n PSub extends AnyMySqlTable,\n PI extends AnyMySqlTable,\n PCr extends AnyMySqlTable,\n PNativeId,\n Out,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: PasswordPreparedPersistenceMapping<S, I, C, AC, A, RS, CE, M, T, B, NativeId>;\n readonly proofMapping?:\n | PasswordPreparedProofMapping<PS, PC, PM, PSub, PI, PCr, PNativeId>\n | undefined;\n readonly target: SuppliedService<TargetId, PasswordPreparedPersistence>;\n readonly transaction?: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;\n },\n body: Effect.Effect<Out, E, R>,\n): Effect.Effect<\n Out,\n E | PasswordUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, TargetId> | LifecycleHooks | DatabaseRequirements\n> {\n return Effect.flatMap(nativeDatabase(acquire), (database) =>\n coordinateTargetPasswordPreparedPersistence<TransactionOf<D>, Out, E, Exclude<R, TargetId>>(\n database,\n options.mapping,\n configuration(transactionService(database)),\n options.proofMapping,\n (\n transaction: TransactionOf<D>,\n services: { readonly passwordPreparedPersistence: PasswordPreparedPersistence },\n ) => {\n const provided = Context.make(options.target, services.passwordPreparedPersistence);\n const work = Effect.provideContext(body, provided);\n\n return options.transaction === undefined\n ? work\n : Effect.provideService(work, options.transaction, options.transaction.of(transaction));\n },\n ).pipe(Effect.provideService(NativeDatabase, database)),\n );\n}\n"],"mappings":";;;;;;;;;AA0BA,MAAa,gDAoBX,SACA,iBAEA,OAAO,QACL,OAAO,IAAI,0BAA0BA,QAAe,GAAG,aAAa,IACnE,kBACC,8CAA8C,SAAS,eAAe,YAAY,CACtF,CAAC,CAAC,KACA,OAAO,qBAAqB,oBAAoB,eAAeA,QAAe,CAAC,GAC/E,OAAO,qBAAqB,gBAAgB,eAAeA,QAAe,CAAC,CAC7E;AA0FF,SAAgB,2CA6Bd,SACA,SAQA,MAKA;CACA,OAAO,OAAO,QAAQ,eAAe,OAAO,IAAI,aAC9C,4CACE,UACA,QAAQ,SACR,cAAc,mBAAmB,QAAQ,CAAC,GAC1C,QAAQ,eAEN,aACA,aACG;EACH,MAAM,WAAW,QAAQ,KAAK,QAAQ,QAAQ,SAAS,2BAA2B;EAClF,MAAM,OAAO,OAAO,eAAe,MAAM,QAAQ;EAEjD,OAAO,QAAQ,gBAAgB,KAAA,IAC3B,OACA,OAAO,eAAe,MAAM,QAAQ,aAAa,QAAQ,YAAY,GAAG,WAAW,CAAC;CAC1F,CACF,CAAC,CAAC,KAAK,OAAO,eAAe,gBAAgB,QAAQ,CAAC,CACxD;AACF"}
|
|
@@ -9,10 +9,10 @@ import { Database as Database$1 } from "./mysql-database.mjs";
|
|
|
9
9
|
import { AnyRelations } from "drizzle-orm";
|
|
10
10
|
import { Effect } from "effect";
|
|
11
11
|
import { HookConfigurationError, LifecycleHooks } from "@yielded/auth/Hooks";
|
|
12
|
+
import { AnyMySqlTable } from "drizzle-orm/mysql-core";
|
|
12
13
|
import { PasswordPersistence, PasswordUnavailable } from "@yielded/auth/Password";
|
|
13
14
|
import { EffectMysql2Database } from "drizzle-orm/effect-mysql2";
|
|
14
15
|
import { SqlError } from "effect/sql/SqlError";
|
|
15
|
-
import { AnyMySqlTable } from "drizzle-orm/mysql-core";
|
|
16
16
|
//#region src/drizzle/mysql-passwords.d.ts
|
|
17
17
|
type Database = EffectMysql2Database<AnyRelations>;
|
|
18
18
|
type TransactionOf<D extends Database> = Parameters<Parameters<D["transaction"]>[0]>[0];
|
|
@@ -59,7 +59,7 @@ export declare const makeMysqlPasswordPersistenceServices: <S extends AnyMySqlTa
|
|
|
59
59
|
readonly hasMore: boolean;
|
|
60
60
|
}, A_1>) => Effect.Effect<import("@yielded/auth/Hooks").PreparedCommit<A_1>, PasswordUnavailable>;
|
|
61
61
|
};
|
|
62
|
-
},
|
|
62
|
+
}, PasswordUnavailable, Database$1 | LifecycleHooks>;
|
|
63
63
|
export declare function coordinateMysqlPasswordPersistence<D extends Database, S extends AnyMySqlTable, I extends AnyMySqlTable, C extends AnyMySqlTable, AC extends AnyMySqlTable, A extends AnyMySqlTable, RS extends AnyMySqlTable, CE extends AnyMySqlTable, M extends AnyMySqlTable, NativeId, PM extends ProofPersistenceMapping<any, any, any, any, any, any, any, any, any, any, any, any> | undefined, Out, E, R, DatabaseError, DatabaseRequirements>(acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>, options: {
|
|
64
64
|
readonly mapping: Mapping<S, I, C, AC, A, RS, CE, M, NativeId>;
|
|
65
65
|
readonly proofMapping?: PM;
|
|
@@ -72,7 +72,7 @@ export declare function coordinateMysqlPasswordPersistence<D extends Database, S
|
|
|
72
72
|
}, body: Effect.Effect<Out, E, R>): Effect.Effect<Out, E | PasswordUnavailable | HookConfigurationError | SqlError | DatabaseError, Exclude<R, PasswordPersistence | TxId> | LifecycleHooks | DatabaseRequirements>;
|
|
73
73
|
export declare const makeMysqlPasswordRegistrationServices: <Registration, S extends AnyMySqlTable, I extends AnyMySqlTable, C extends AnyMySqlTable, AC extends AnyMySqlTable, Rq extends AnyMySqlTable, NativeId>(mapping: PasswordRegistrationMapping<Registration, S, I, C, AC, Rq, NativeId>) => Effect.Effect<{
|
|
74
74
|
registrationAuthority: PasswordRegistrationAuthority<Registration>;
|
|
75
|
-
},
|
|
75
|
+
}, PasswordUnavailable, Database$1 | LifecycleHooks>;
|
|
76
76
|
export declare function coordinateMysqlPasswordRegistration<TargetId, Registration, D extends Database, S extends AnyMySqlTable, I extends AnyMySqlTable, C extends AnyMySqlTable, AC extends AnyMySqlTable, Rq extends AnyMySqlTable, NativeId, Out, E, R, DatabaseError, DatabaseRequirements>(acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>, options: {
|
|
77
77
|
readonly mapping: PasswordRegistrationMapping<NoInfer<Registration>, S, I, C, AC, Rq, NativeId>;
|
|
78
78
|
readonly target: SuppliedService<TargetId, PasswordRegistrationAuthority<Registration>>;
|
|
@@ -4,6 +4,7 @@ import { coordinateTargetPasswordPersistence, coordinateTargetPasswordRegistrati
|
|
|
4
4
|
import { sqlClientProofStandaloneGuard } from "./proof-target.mjs";
|
|
5
5
|
import { nativeDatabase } from "./native-database.mjs";
|
|
6
6
|
import { Database } from "./mysql-database.mjs";
|
|
7
|
+
import { NativeDatabase } from "@yielded/auth-persistence/Adapter";
|
|
7
8
|
import { Context, Effect } from "effect";
|
|
8
9
|
import { PasswordPersistence } from "@yielded/auth/Password";
|
|
9
10
|
//#region src/drizzle/mysql-passwords.ts
|
|
@@ -20,21 +21,21 @@ const configuration = (service) => ({
|
|
|
20
21
|
insertIfAbsent: (query, selfKey, selfValue) => query.onDuplicateKeyUpdate({ set: { [selfKey]: selfValue } })
|
|
21
22
|
}
|
|
22
23
|
});
|
|
23
|
-
const makeMysqlPasswordPersistenceServices = (mapping, proofMapping) => Effect.flatMap(Effect.map(acquireTransactionService(Database), configuration), (configuration) => makeTargetPasswordPersistenceServices(mapping, configuration, proofMapping)).pipe(Effect.provideServiceEffect(CurrentPasswordSql, nativeDatabase(Database)));
|
|
24
|
+
const makeMysqlPasswordPersistenceServices = (mapping, proofMapping) => Effect.flatMap(Effect.map(acquireTransactionService(Database), configuration), (configuration) => makeTargetPasswordPersistenceServices(mapping, configuration, proofMapping)).pipe(Effect.provideServiceEffect(CurrentPasswordSql, nativeDatabase(Database)), Effect.provideServiceEffect(NativeDatabase, nativeDatabase(Database)));
|
|
24
25
|
function coordinateMysqlPasswordPersistence(acquire, options, body) {
|
|
25
|
-
return Effect.flatMap(acquire, (database) => coordinateTargetPasswordPersistence(database, options.mapping, configuration(transactionService(database)), options.proofMapping, (transaction, services) => {
|
|
26
|
+
return Effect.flatMap(nativeDatabase(acquire), (database) => coordinateTargetPasswordPersistence(database, options.mapping, configuration(transactionService(database)), options.proofMapping, (transaction, services) => {
|
|
26
27
|
const provided = Context.make(PasswordPersistence, services.passwordPersistence);
|
|
27
28
|
const work = Effect.provideContext(body, provided);
|
|
28
29
|
return options.transaction === void 0 ? work : Effect.provideService(work, options.transaction, options.transaction.of(transaction));
|
|
29
|
-
}));
|
|
30
|
+
}).pipe(Effect.provideService(NativeDatabase, database)));
|
|
30
31
|
}
|
|
31
|
-
const makeMysqlPasswordRegistrationServices = (mapping) => Effect.flatMap(Effect.map(acquireTransactionService(Database), configuration), (configuration) => makeTargetPasswordRegistrationServices(mapping, configuration)).pipe(Effect.provideServiceEffect(CurrentPasswordSql, nativeDatabase(Database)));
|
|
32
|
+
const makeMysqlPasswordRegistrationServices = (mapping) => Effect.flatMap(Effect.map(acquireTransactionService(Database), configuration), (configuration) => makeTargetPasswordRegistrationServices(mapping, configuration)).pipe(Effect.provideServiceEffect(CurrentPasswordSql, nativeDatabase(Database)), Effect.provideServiceEffect(NativeDatabase, nativeDatabase(Database)));
|
|
32
33
|
function coordinateMysqlPasswordRegistration(acquire, options, body) {
|
|
33
|
-
return Effect.flatMap(acquire, (database) => coordinateTargetPasswordRegistration(database, options.mapping, configuration(transactionService(database)), (transaction, services) => {
|
|
34
|
+
return Effect.flatMap(nativeDatabase(acquire), (database) => coordinateTargetPasswordRegistration(database, options.mapping, configuration(transactionService(database)), (transaction, services) => {
|
|
34
35
|
const provided = Context.make(options.target, services.registrationAuthority);
|
|
35
36
|
const work = Effect.provideContext(body, provided);
|
|
36
37
|
return options.transaction === void 0 ? work : Effect.provideService(work, options.transaction, options.transaction.of(transaction));
|
|
37
|
-
}));
|
|
38
|
+
}).pipe(Effect.provideService(NativeDatabase, database)));
|
|
38
39
|
}
|
|
39
40
|
//#endregion
|
|
40
41
|
export { coordinateMysqlPasswordPersistence, coordinateMysqlPasswordRegistration, makeMysqlPasswordPersistenceServices, makeMysqlPasswordRegistrationServices, configuration as mysqlPasswordConfiguration };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mysql-passwords.mjs","names":["DatabaseService"],"sources":["../../src/drizzle/mysql-passwords.ts"],"sourcesContent":["import type { LifecycleHooks, HookConfigurationError } from \"@yielded/auth/Hooks\";\nimport { type PasswordUnavailable, PasswordPersistence } from \"@yielded/auth/Password\";\n/* oxlint-disable no-explicit-any -- proof mapping tables are independently typed by the proof owner; this driver forwards them unchanged to the shared target. */\nimport type { AnyRelations } from \"drizzle-orm\";\nimport type { EffectMysql2Database } from \"drizzle-orm/effect-mysql2\";\nimport type { AnyMySqlTable } from \"drizzle-orm/mysql-core\";\nimport { Effect, Context } from \"effect\";\nimport type { SqlError } from \"effect/sql/SqlError\";\n\nimport { Database as DatabaseService } from \"./mysql-database\";\nimport { nativeDatabase } from \"./native-database\";\nimport type { PasswordPersistenceMapping, PasswordRegistrationMapping } from \"./password-model\";\nimport type { PasswordRegistrationAuthority } from \"./password-registration\";\nimport { CurrentPasswordSql } from \"./password-sql\";\nimport type { PasswordSqlQuery } from \"./password-sql\";\nimport {\n coordinateTargetPasswordPersistence,\n coordinateTargetPasswordRegistration,\n makeTargetPasswordPersistenceServices,\n makeTargetPasswordRegistrationServices,\n sqlClientPasswordStandaloneGuard,\n} from \"./password-target\";\nimport type { ProofPersistenceMapping } from \"./proof-model\";\nimport type { ProofSqlQuery } from \"./proof-sql\";\nimport { sqlClientProofStandaloneGuard } from \"./proof-target\";\nimport {\n type TransactionService,\n acquireTransactionService,\n transactionService,\n} from \"./standalone-guard\";\nimport type { SuppliedService } from \"./SuppliedService\";\n\ntype Database = EffectMysql2Database<AnyRelations>;\ntype TransactionOf<D extends Database> = Parameters<Parameters<D[\"transaction\"]>[0]>[0];\n\nconst configuration = (service: TransactionService | undefined) => ({\n mode: \"interactive\" as const,\n locking: true,\n standaloneGuard: sqlClientPasswordStandaloneGuard(service),\n insertIfAbsent: (query: PasswordSqlQuery, selfKey: string, selfValue: unknown) =>\n query.onDuplicateKeyUpdate({ set: { [selfKey]: selfValue } }),\n generatedSubjectRows: (query: PasswordSqlQuery) => query.$returningId(),\n proof: {\n mode: \"interactive\" as const,\n locking: true,\n standaloneGuard: sqlClientProofStandaloneGuard(service),\n insertIfAbsent: (query: ProofSqlQuery, selfKey: string, selfValue: unknown) =>\n query.onDuplicateKeyUpdate({ set: { [selfKey]: selfValue } }),\n },\n});\n\ntype Mapping<\n S extends AnyMySqlTable,\n I extends AnyMySqlTable,\n C extends AnyMySqlTable,\n AC extends AnyMySqlTable,\n A extends AnyMySqlTable,\n RS extends AnyMySqlTable,\n CE extends AnyMySqlTable,\n M extends AnyMySqlTable,\n NativeId,\n> = PasswordPersistenceMapping<S, I, C, AC, A, RS, CE, M, NativeId>;\n\nexport const makeMysqlPasswordPersistenceServices = <\n S extends AnyMySqlTable,\n I extends AnyMySqlTable,\n C extends AnyMySqlTable,\n AC extends AnyMySqlTable,\n A extends AnyMySqlTable,\n RS extends AnyMySqlTable,\n CE extends AnyMySqlTable,\n M extends AnyMySqlTable,\n NativeId,\n>(\n mapping: Mapping<S, I, C, AC, A, RS, CE, M, NativeId>,\n proofMapping?: ProofPersistenceMapping<\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n >,\n) =>\n Effect.flatMap(\n Effect.map(acquireTransactionService(DatabaseService), configuration),\n (configuration) => makeTargetPasswordPersistenceServices(mapping, configuration, proofMapping),\n ).pipe(Effect.provideServiceEffect(CurrentPasswordSql, nativeDatabase(DatabaseService)));\n\nexport function coordinateMysqlPasswordPersistence<\n D extends Database,\n S extends AnyMySqlTable,\n I extends AnyMySqlTable,\n C extends AnyMySqlTable,\n AC extends AnyMySqlTable,\n A extends AnyMySqlTable,\n RS extends AnyMySqlTable,\n CE extends AnyMySqlTable,\n M extends AnyMySqlTable,\n NativeId,\n PM extends\n | ProofPersistenceMapping<any, any, any, any, any, any, any, any, any, any, any, any>\n | undefined,\n Out,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: Mapping<S, I, C, AC, A, RS, CE, M, NativeId>;\n readonly proofMapping?: PM;\n readonly transaction?: never;\n },\n body: Effect.Effect<Out, E, R>,\n): Effect.Effect<\n Out,\n E | PasswordUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, PasswordPersistence> | LifecycleHooks | DatabaseRequirements\n>;\n\nexport function coordinateMysqlPasswordPersistence<\n D extends Database,\n S extends AnyMySqlTable,\n I extends AnyMySqlTable,\n C extends AnyMySqlTable,\n AC extends AnyMySqlTable,\n A extends AnyMySqlTable,\n RS extends AnyMySqlTable,\n CE extends AnyMySqlTable,\n M extends AnyMySqlTable,\n NativeId,\n PM extends\n | ProofPersistenceMapping<any, any, any, any, any, any, any, any, any, any, any, any>\n | undefined,\n Out,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: Mapping<S, I, C, AC, A, RS, CE, M, NativeId>;\n readonly proofMapping?: PM;\n readonly transaction: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;\n },\n body: Effect.Effect<Out, E, R>,\n): Effect.Effect<\n Out,\n E | PasswordUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, PasswordPersistence | TxId> | LifecycleHooks | DatabaseRequirements\n>;\n\nexport function coordinateMysqlPasswordPersistence<\n D extends Database,\n S extends AnyMySqlTable,\n I extends AnyMySqlTable,\n C extends AnyMySqlTable,\n AC extends AnyMySqlTable,\n A extends AnyMySqlTable,\n RS extends AnyMySqlTable,\n CE extends AnyMySqlTable,\n M extends AnyMySqlTable,\n NativeId,\n PM extends\n | ProofPersistenceMapping<any, any, any, any, any, any, any, any, any, any, any, any>\n | undefined,\n Out,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: Mapping<S, I, C, AC, A, RS, CE, M, NativeId>;\n readonly proofMapping?: PM;\n readonly transaction?: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;\n },\n body: Effect.Effect<Out, E, R>,\n): Effect.Effect<\n Out,\n E | PasswordUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, PasswordPersistence> | LifecycleHooks | DatabaseRequirements\n> {\n return Effect.flatMap(acquire, (database) =>\n coordinateTargetPasswordPersistence<TransactionOf<D>, Out, E, Exclude<R, PasswordPersistence>>(\n database,\n options.mapping,\n configuration(transactionService(database)),\n options.proofMapping,\n (\n transaction: TransactionOf<D>,\n services: { readonly passwordPersistence: PasswordPersistence[\"Service\"] },\n ) => {\n const provided = Context.make(PasswordPersistence, services.passwordPersistence);\n const work = Effect.provideContext(body, provided);\n\n return options.transaction === undefined\n ? work\n : Effect.provideService(work, options.transaction, options.transaction.of(transaction));\n },\n ),\n );\n}\n\nexport const makeMysqlPasswordRegistrationServices = <\n Registration,\n S extends AnyMySqlTable,\n I extends AnyMySqlTable,\n C extends AnyMySqlTable,\n AC extends AnyMySqlTable,\n Rq extends AnyMySqlTable,\n NativeId,\n>(\n mapping: PasswordRegistrationMapping<Registration, S, I, C, AC, Rq, NativeId>,\n) =>\n Effect.flatMap(\n Effect.map(acquireTransactionService(DatabaseService), configuration),\n (configuration) => makeTargetPasswordRegistrationServices<Registration>(mapping, configuration),\n ).pipe(Effect.provideServiceEffect(CurrentPasswordSql, nativeDatabase(DatabaseService)));\n\nexport function coordinateMysqlPasswordRegistration<\n TargetId,\n Registration,\n D extends Database,\n S extends AnyMySqlTable,\n I extends AnyMySqlTable,\n C extends AnyMySqlTable,\n AC extends AnyMySqlTable,\n Rq extends AnyMySqlTable,\n NativeId,\n Out,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: PasswordRegistrationMapping<NoInfer<Registration>, S, I, C, AC, Rq, NativeId>;\n readonly target: SuppliedService<TargetId, PasswordRegistrationAuthority<Registration>>;\n readonly transaction?: never;\n },\n body: Effect.Effect<Out, E, R>,\n): Effect.Effect<\n Out,\n E | PasswordUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, TargetId> | LifecycleHooks | DatabaseRequirements\n>;\n\nexport function coordinateMysqlPasswordRegistration<\n TargetId,\n Registration,\n D extends Database,\n S extends AnyMySqlTable,\n I extends AnyMySqlTable,\n C extends AnyMySqlTable,\n AC extends AnyMySqlTable,\n Rq extends AnyMySqlTable,\n NativeId,\n Out,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: PasswordRegistrationMapping<NoInfer<Registration>, S, I, C, AC, Rq, NativeId>;\n readonly target: SuppliedService<TargetId, PasswordRegistrationAuthority<Registration>>;\n readonly transaction: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;\n },\n body: Effect.Effect<Out, E, R>,\n): Effect.Effect<\n Out,\n E | PasswordUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, TargetId | TxId> | LifecycleHooks | DatabaseRequirements\n>;\n\nexport function coordinateMysqlPasswordRegistration<\n TargetId,\n Registration,\n D extends Database,\n S extends AnyMySqlTable,\n I extends AnyMySqlTable,\n C extends AnyMySqlTable,\n AC extends AnyMySqlTable,\n Rq extends AnyMySqlTable,\n NativeId,\n Out,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: PasswordRegistrationMapping<NoInfer<Registration>, S, I, C, AC, Rq, NativeId>;\n readonly target: SuppliedService<TargetId, PasswordRegistrationAuthority<Registration>>;\n readonly transaction?: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;\n },\n body: Effect.Effect<Out, E, R>,\n): Effect.Effect<\n Out,\n E | PasswordUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, TargetId> | LifecycleHooks | DatabaseRequirements\n> {\n return Effect.flatMap(acquire, (database) =>\n coordinateTargetPasswordRegistration<\n Registration,\n TransactionOf<D>,\n Out,\n E,\n Exclude<R, TargetId>\n >(\n database,\n options.mapping,\n configuration(transactionService(database)),\n (\n transaction: TransactionOf<D>,\n services: { readonly registrationAuthority: PasswordRegistrationAuthority<Registration> },\n ) => {\n const provided = Context.make(options.target, services.registrationAuthority);\n const work = Effect.provideContext(body, provided);\n\n return options.transaction === undefined\n ? work\n : Effect.provideService(work, options.transaction, options.transaction.of(transaction));\n },\n ),\n );\n}\n\nexport { configuration as mysqlPasswordConfiguration };\n"],"mappings":";;;;;;;;;AAmCA,MAAM,iBAAiB,aAA6C;CAClE,MAAM;CACN,SAAS;CACT,iBAAiB,iCAAiC,OAAO;CACzD,iBAAiB,OAAyB,SAAiB,cACzD,MAAM,qBAAqB,EAAE,KAAK,GAAG,UAAU,UAAU,EAAE,CAAC;CAC9D,uBAAuB,UAA4B,MAAM,aAAa;CACtE,OAAO;EACL,MAAM;EACN,SAAS;EACT,iBAAiB,8BAA8B,OAAO;EACtD,iBAAiB,OAAsB,SAAiB,cACtD,MAAM,qBAAqB,EAAE,KAAK,GAAG,UAAU,UAAU,EAAE,CAAC;CAChE;AACF;AAcA,MAAa,wCAWX,SACA,iBAeA,OAAO,QACL,OAAO,IAAI,0BAA0BA,QAAe,GAAG,aAAa,IACnE,kBAAkB,sCAAsC,SAAS,eAAe,YAAY,CAC/F,CAAC,CAAC,KAAK,OAAO,qBAAqB,oBAAoB,eAAeA,QAAe,CAAC,CAAC;AAsEzF,SAAgB,mCAsBd,SACA,SAKA,MAKA;CACA,OAAO,OAAO,QAAQ,UAAU,aAC9B,oCACE,UACA,QAAQ,SACR,cAAc,mBAAmB,QAAQ,CAAC,GAC1C,QAAQ,eAEN,aACA,aACG;EACH,MAAM,WAAW,QAAQ,KAAK,qBAAqB,SAAS,mBAAmB;EAC/E,MAAM,OAAO,OAAO,eAAe,MAAM,QAAQ;EAEjD,OAAO,QAAQ,gBAAgB,KAAA,IAC3B,OACA,OAAO,eAAe,MAAM,QAAQ,aAAa,QAAQ,YAAY,GAAG,WAAW,CAAC;CAC1F,CACF,CACF;AACF;AAEA,MAAa,yCASX,YAEA,OAAO,QACL,OAAO,IAAI,0BAA0BA,QAAe,GAAG,aAAa,IACnE,kBAAkB,uCAAqD,SAAS,aAAa,CAChG,CAAC,CAAC,KAAK,OAAO,qBAAqB,oBAAoB,eAAeA,QAAe,CAAC,CAAC;AA8DzF,SAAgB,oCAkBd,SACA,SAKA,MAKA;CACA,OAAO,OAAO,QAAQ,UAAU,aAC9B,qCAOE,UACA,QAAQ,SACR,cAAc,mBAAmB,QAAQ,CAAC,IAExC,aACA,aACG;EACH,MAAM,WAAW,QAAQ,KAAK,QAAQ,QAAQ,SAAS,qBAAqB;EAC5E,MAAM,OAAO,OAAO,eAAe,MAAM,QAAQ;EAEjD,OAAO,QAAQ,gBAAgB,KAAA,IAC3B,OACA,OAAO,eAAe,MAAM,QAAQ,aAAa,QAAQ,YAAY,GAAG,WAAW,CAAC;CAC1F,CACF,CACF;AACF"}
|
|
1
|
+
{"version":3,"file":"mysql-passwords.mjs","names":["DatabaseService"],"sources":["../../src/drizzle/mysql-passwords.ts"],"sourcesContent":["import { NativeDatabase } from \"@yielded/auth-persistence/Adapter\";\nimport type { LifecycleHooks, HookConfigurationError } from \"@yielded/auth/Hooks\";\nimport { type PasswordUnavailable, PasswordPersistence } from \"@yielded/auth/Password\";\n/* oxlint-disable no-explicit-any -- proof mapping tables are independently typed by the proof owner; this driver forwards them unchanged to the shared target. */\nimport type { AnyRelations } from \"drizzle-orm\";\nimport type { EffectMysql2Database } from \"drizzle-orm/effect-mysql2\";\nimport type { AnyMySqlTable } from \"drizzle-orm/mysql-core\";\nimport { Effect, Context } from \"effect\";\nimport type { SqlError } from \"effect/sql/SqlError\";\n\nimport { Database as DatabaseService } from \"./mysql-database\";\nimport { nativeDatabase } from \"./native-database\";\nimport type { PasswordPersistenceMapping, PasswordRegistrationMapping } from \"./password-model\";\nimport type { PasswordRegistrationAuthority } from \"./password-registration\";\nimport { CurrentPasswordSql } from \"./password-sql\";\nimport type { PasswordSqlQuery } from \"./password-sql\";\nimport {\n coordinateTargetPasswordPersistence,\n coordinateTargetPasswordRegistration,\n makeTargetPasswordPersistenceServices,\n makeTargetPasswordRegistrationServices,\n sqlClientPasswordStandaloneGuard,\n} from \"./password-target\";\nimport type { ProofPersistenceMapping } from \"./proof-model\";\nimport type { ProofSqlQuery } from \"./proof-sql\";\nimport { sqlClientProofStandaloneGuard } from \"./proof-target\";\nimport {\n type TransactionService,\n acquireTransactionService,\n transactionService,\n} from \"./standalone-guard\";\nimport type { SuppliedService } from \"./SuppliedService\";\n\ntype Database = EffectMysql2Database<AnyRelations>;\ntype TransactionOf<D extends Database> = Parameters<Parameters<D[\"transaction\"]>[0]>[0];\n\nconst configuration = (service: TransactionService | undefined) => ({\n mode: \"interactive\" as const,\n locking: true,\n standaloneGuard: sqlClientPasswordStandaloneGuard(service),\n insertIfAbsent: (query: PasswordSqlQuery, selfKey: string, selfValue: unknown) =>\n query.onDuplicateKeyUpdate({ set: { [selfKey]: selfValue } }),\n generatedSubjectRows: (query: PasswordSqlQuery) => query.$returningId(),\n proof: {\n mode: \"interactive\" as const,\n locking: true,\n standaloneGuard: sqlClientProofStandaloneGuard(service),\n insertIfAbsent: (query: ProofSqlQuery, selfKey: string, selfValue: unknown) =>\n query.onDuplicateKeyUpdate({ set: { [selfKey]: selfValue } }),\n },\n});\n\ntype Mapping<\n S extends AnyMySqlTable,\n I extends AnyMySqlTable,\n C extends AnyMySqlTable,\n AC extends AnyMySqlTable,\n A extends AnyMySqlTable,\n RS extends AnyMySqlTable,\n CE extends AnyMySqlTable,\n M extends AnyMySqlTable,\n NativeId,\n> = PasswordPersistenceMapping<S, I, C, AC, A, RS, CE, M, NativeId>;\n\nexport const makeMysqlPasswordPersistenceServices = <\n S extends AnyMySqlTable,\n I extends AnyMySqlTable,\n C extends AnyMySqlTable,\n AC extends AnyMySqlTable,\n A extends AnyMySqlTable,\n RS extends AnyMySqlTable,\n CE extends AnyMySqlTable,\n M extends AnyMySqlTable,\n NativeId,\n>(\n mapping: Mapping<S, I, C, AC, A, RS, CE, M, NativeId>,\n proofMapping?: ProofPersistenceMapping<\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n >,\n) =>\n Effect.flatMap(\n Effect.map(acquireTransactionService(DatabaseService), configuration),\n (configuration) => makeTargetPasswordPersistenceServices(mapping, configuration, proofMapping),\n ).pipe(\n Effect.provideServiceEffect(CurrentPasswordSql, nativeDatabase(DatabaseService)),\n Effect.provideServiceEffect(NativeDatabase, nativeDatabase(DatabaseService)),\n );\n\nexport function coordinateMysqlPasswordPersistence<\n D extends Database,\n S extends AnyMySqlTable,\n I extends AnyMySqlTable,\n C extends AnyMySqlTable,\n AC extends AnyMySqlTable,\n A extends AnyMySqlTable,\n RS extends AnyMySqlTable,\n CE extends AnyMySqlTable,\n M extends AnyMySqlTable,\n NativeId,\n PM extends\n | ProofPersistenceMapping<any, any, any, any, any, any, any, any, any, any, any, any>\n | undefined,\n Out,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: Mapping<S, I, C, AC, A, RS, CE, M, NativeId>;\n readonly proofMapping?: PM;\n readonly transaction?: never;\n },\n body: Effect.Effect<Out, E, R>,\n): Effect.Effect<\n Out,\n E | PasswordUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, PasswordPersistence> | LifecycleHooks | DatabaseRequirements\n>;\n\nexport function coordinateMysqlPasswordPersistence<\n D extends Database,\n S extends AnyMySqlTable,\n I extends AnyMySqlTable,\n C extends AnyMySqlTable,\n AC extends AnyMySqlTable,\n A extends AnyMySqlTable,\n RS extends AnyMySqlTable,\n CE extends AnyMySqlTable,\n M extends AnyMySqlTable,\n NativeId,\n PM extends\n | ProofPersistenceMapping<any, any, any, any, any, any, any, any, any, any, any, any>\n | undefined,\n Out,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: Mapping<S, I, C, AC, A, RS, CE, M, NativeId>;\n readonly proofMapping?: PM;\n readonly transaction: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;\n },\n body: Effect.Effect<Out, E, R>,\n): Effect.Effect<\n Out,\n E | PasswordUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, PasswordPersistence | TxId> | LifecycleHooks | DatabaseRequirements\n>;\n\nexport function coordinateMysqlPasswordPersistence<\n D extends Database,\n S extends AnyMySqlTable,\n I extends AnyMySqlTable,\n C extends AnyMySqlTable,\n AC extends AnyMySqlTable,\n A extends AnyMySqlTable,\n RS extends AnyMySqlTable,\n CE extends AnyMySqlTable,\n M extends AnyMySqlTable,\n NativeId,\n PM extends\n | ProofPersistenceMapping<any, any, any, any, any, any, any, any, any, any, any, any>\n | undefined,\n Out,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: Mapping<S, I, C, AC, A, RS, CE, M, NativeId>;\n readonly proofMapping?: PM;\n readonly transaction?: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;\n },\n body: Effect.Effect<Out, E, R>,\n): Effect.Effect<\n Out,\n E | PasswordUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, PasswordPersistence> | LifecycleHooks | DatabaseRequirements\n> {\n return Effect.flatMap(nativeDatabase(acquire), (database) =>\n coordinateTargetPasswordPersistence<TransactionOf<D>, Out, E, Exclude<R, PasswordPersistence>>(\n database,\n options.mapping,\n configuration(transactionService(database)),\n options.proofMapping,\n (\n transaction: TransactionOf<D>,\n services: { readonly passwordPersistence: PasswordPersistence[\"Service\"] },\n ) => {\n const provided = Context.make(PasswordPersistence, services.passwordPersistence);\n const work = Effect.provideContext(body, provided);\n\n return options.transaction === undefined\n ? work\n : Effect.provideService(work, options.transaction, options.transaction.of(transaction));\n },\n ).pipe(Effect.provideService(NativeDatabase, database)),\n );\n}\n\nexport const makeMysqlPasswordRegistrationServices = <\n Registration,\n S extends AnyMySqlTable,\n I extends AnyMySqlTable,\n C extends AnyMySqlTable,\n AC extends AnyMySqlTable,\n Rq extends AnyMySqlTable,\n NativeId,\n>(\n mapping: PasswordRegistrationMapping<Registration, S, I, C, AC, Rq, NativeId>,\n) =>\n Effect.flatMap(\n Effect.map(acquireTransactionService(DatabaseService), configuration),\n (configuration) => makeTargetPasswordRegistrationServices<Registration>(mapping, configuration),\n ).pipe(\n Effect.provideServiceEffect(CurrentPasswordSql, nativeDatabase(DatabaseService)),\n Effect.provideServiceEffect(NativeDatabase, nativeDatabase(DatabaseService)),\n );\n\nexport function coordinateMysqlPasswordRegistration<\n TargetId,\n Registration,\n D extends Database,\n S extends AnyMySqlTable,\n I extends AnyMySqlTable,\n C extends AnyMySqlTable,\n AC extends AnyMySqlTable,\n Rq extends AnyMySqlTable,\n NativeId,\n Out,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: PasswordRegistrationMapping<NoInfer<Registration>, S, I, C, AC, Rq, NativeId>;\n readonly target: SuppliedService<TargetId, PasswordRegistrationAuthority<Registration>>;\n readonly transaction?: never;\n },\n body: Effect.Effect<Out, E, R>,\n): Effect.Effect<\n Out,\n E | PasswordUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, TargetId> | LifecycleHooks | DatabaseRequirements\n>;\n\nexport function coordinateMysqlPasswordRegistration<\n TargetId,\n Registration,\n D extends Database,\n S extends AnyMySqlTable,\n I extends AnyMySqlTable,\n C extends AnyMySqlTable,\n AC extends AnyMySqlTable,\n Rq extends AnyMySqlTable,\n NativeId,\n Out,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: PasswordRegistrationMapping<NoInfer<Registration>, S, I, C, AC, Rq, NativeId>;\n readonly target: SuppliedService<TargetId, PasswordRegistrationAuthority<Registration>>;\n readonly transaction: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;\n },\n body: Effect.Effect<Out, E, R>,\n): Effect.Effect<\n Out,\n E | PasswordUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, TargetId | TxId> | LifecycleHooks | DatabaseRequirements\n>;\n\nexport function coordinateMysqlPasswordRegistration<\n TargetId,\n Registration,\n D extends Database,\n S extends AnyMySqlTable,\n I extends AnyMySqlTable,\n C extends AnyMySqlTable,\n AC extends AnyMySqlTable,\n Rq extends AnyMySqlTable,\n NativeId,\n Out,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: PasswordRegistrationMapping<NoInfer<Registration>, S, I, C, AC, Rq, NativeId>;\n readonly target: SuppliedService<TargetId, PasswordRegistrationAuthority<Registration>>;\n readonly transaction?: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;\n },\n body: Effect.Effect<Out, E, R>,\n): Effect.Effect<\n Out,\n E | PasswordUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, TargetId> | LifecycleHooks | DatabaseRequirements\n> {\n return Effect.flatMap(nativeDatabase(acquire), (database) =>\n coordinateTargetPasswordRegistration<\n Registration,\n TransactionOf<D>,\n Out,\n E,\n Exclude<R, TargetId>\n >(\n database,\n options.mapping,\n configuration(transactionService(database)),\n (\n transaction: TransactionOf<D>,\n services: { readonly registrationAuthority: PasswordRegistrationAuthority<Registration> },\n ) => {\n const provided = Context.make(options.target, services.registrationAuthority);\n const work = Effect.provideContext(body, provided);\n\n return options.transaction === undefined\n ? work\n : Effect.provideService(work, options.transaction, options.transaction.of(transaction));\n },\n ).pipe(Effect.provideService(NativeDatabase, database)),\n );\n}\n\nexport { configuration as mysqlPasswordConfiguration };\n"],"mappings":";;;;;;;;;;AAoCA,MAAM,iBAAiB,aAA6C;CAClE,MAAM;CACN,SAAS;CACT,iBAAiB,iCAAiC,OAAO;CACzD,iBAAiB,OAAyB,SAAiB,cACzD,MAAM,qBAAqB,EAAE,KAAK,GAAG,UAAU,UAAU,EAAE,CAAC;CAC9D,uBAAuB,UAA4B,MAAM,aAAa;CACtE,OAAO;EACL,MAAM;EACN,SAAS;EACT,iBAAiB,8BAA8B,OAAO;EACtD,iBAAiB,OAAsB,SAAiB,cACtD,MAAM,qBAAqB,EAAE,KAAK,GAAG,UAAU,UAAU,EAAE,CAAC;CAChE;AACF;AAcA,MAAa,wCAWX,SACA,iBAeA,OAAO,QACL,OAAO,IAAI,0BAA0BA,QAAe,GAAG,aAAa,IACnE,kBAAkB,sCAAsC,SAAS,eAAe,YAAY,CAC/F,CAAC,CAAC,KACA,OAAO,qBAAqB,oBAAoB,eAAeA,QAAe,CAAC,GAC/E,OAAO,qBAAqB,gBAAgB,eAAeA,QAAe,CAAC,CAC7E;AAsEF,SAAgB,mCAsBd,SACA,SAKA,MAKA;CACA,OAAO,OAAO,QAAQ,eAAe,OAAO,IAAI,aAC9C,oCACE,UACA,QAAQ,SACR,cAAc,mBAAmB,QAAQ,CAAC,GAC1C,QAAQ,eAEN,aACA,aACG;EACH,MAAM,WAAW,QAAQ,KAAK,qBAAqB,SAAS,mBAAmB;EAC/E,MAAM,OAAO,OAAO,eAAe,MAAM,QAAQ;EAEjD,OAAO,QAAQ,gBAAgB,KAAA,IAC3B,OACA,OAAO,eAAe,MAAM,QAAQ,aAAa,QAAQ,YAAY,GAAG,WAAW,CAAC;CAC1F,CACF,CAAC,CAAC,KAAK,OAAO,eAAe,gBAAgB,QAAQ,CAAC,CACxD;AACF;AAEA,MAAa,yCASX,YAEA,OAAO,QACL,OAAO,IAAI,0BAA0BA,QAAe,GAAG,aAAa,IACnE,kBAAkB,uCAAqD,SAAS,aAAa,CAChG,CAAC,CAAC,KACA,OAAO,qBAAqB,oBAAoB,eAAeA,QAAe,CAAC,GAC/E,OAAO,qBAAqB,gBAAgB,eAAeA,QAAe,CAAC,CAC7E;AA8DF,SAAgB,oCAkBd,SACA,SAKA,MAKA;CACA,OAAO,OAAO,QAAQ,eAAe,OAAO,IAAI,aAC9C,qCAOE,UACA,QAAQ,SACR,cAAc,mBAAmB,QAAQ,CAAC,IAExC,aACA,aACG;EACH,MAAM,WAAW,QAAQ,KAAK,QAAQ,QAAQ,SAAS,qBAAqB;EAC5E,MAAM,OAAO,OAAO,eAAe,MAAM,QAAQ;EAEjD,OAAO,QAAQ,gBAAgB,KAAA,IAC3B,OACA,OAAO,eAAe,MAAM,QAAQ,aAAa,QAAQ,YAAY,GAAG,WAAW,CAAC;CAC1F,CACF,CAAC,CAAC,KAAK,OAAO,eAAe,gBAAgB,QAAQ,CAAC,CACxD;AACF"}
|
|
@@ -4,10 +4,10 @@ import { Database as Database$1 } from "./mysql-database.mjs";
|
|
|
4
4
|
import { AnyRelations } from "drizzle-orm";
|
|
5
5
|
import { Effect } from "effect";
|
|
6
6
|
import { HookConfigurationError, LifecycleHooks } from "@yielded/auth/Hooks";
|
|
7
|
+
import { AnyMySqlTable } from "drizzle-orm/mysql-core";
|
|
7
8
|
import { ProofPersistence, ProofUnavailable } from "@yielded/auth/Proofs";
|
|
8
9
|
import { EffectMysql2Database } from "drizzle-orm/effect-mysql2";
|
|
9
10
|
import { SqlError } from "effect/sql/SqlError";
|
|
10
|
-
import { AnyMySqlTable } from "drizzle-orm/mysql-core";
|
|
11
11
|
//#region src/drizzle/mysql-proofs.d.ts
|
|
12
12
|
type Database = EffectMysql2Database<AnyRelations>;
|
|
13
13
|
type Transaction = Parameters<Parameters<Database["transaction"]>[0]>[0];
|
|
@@ -62,7 +62,7 @@ export declare const makeMysqlProofPersistenceServices: <Rq extends AnyMySqlTabl
|
|
|
62
62
|
readonly limit: number;
|
|
63
63
|
}, prepare: import("@yielded/auth/Proofs").PrepareProofCommit<import("@yielded/auth/Proofs").ProofCleanupResult, A_1>) => Effect.Effect<import("@yielded/auth/Hooks").PreparedCommit<A_1>, ProofUnavailable>;
|
|
64
64
|
};
|
|
65
|
-
},
|
|
65
|
+
}, ProofUnavailable, Database$1 | LifecycleHooks>;
|
|
66
66
|
export declare function coordinateMysqlProofPersistence<D extends Database, Rq extends AnyMySqlTable, S extends AnyMySqlTable, G extends AnyMySqlTable, Cn extends AnyMySqlTable, Rs extends AnyMySqlTable, Aev extends AnyMySqlTable, F extends AnyMySqlTable, C extends AnyMySqlTable, Sub extends AnyMySqlTable, I extends AnyMySqlTable, Cr extends AnyMySqlTable, NativeId, A, E, R, DatabaseError, DatabaseRequirements>(acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>, options: {
|
|
67
67
|
readonly mapping: Mapping<Rq, S, G, Cn, Rs, Aev, F, C, Sub, I, Cr, NativeId>;
|
|
68
68
|
readonly transaction?: never;
|
|
@@ -4,6 +4,7 @@ import { CurrentProofSql } from "./proof-sql.mjs";
|
|
|
4
4
|
import { coordinateTargetProofPersistence, makeTargetProofPersistenceServices, sqlClientProofStandaloneGuard } from "./proof-target.mjs";
|
|
5
5
|
import { nativeDatabase } from "./native-database.mjs";
|
|
6
6
|
import { Database } from "./mysql-database.mjs";
|
|
7
|
+
import { NativeDatabase } from "@yielded/auth-persistence/Adapter";
|
|
7
8
|
import { Context, Effect } from "effect";
|
|
8
9
|
import { ProofPersistence } from "@yielded/auth/Proofs";
|
|
9
10
|
//#region src/drizzle/mysql-proofs.ts
|
|
@@ -13,13 +14,13 @@ const configuration = (service) => ({
|
|
|
13
14
|
standaloneGuard: sqlClientProofStandaloneGuard(service),
|
|
14
15
|
insertIfAbsent: (query, selfKey, selfValue) => query.onDuplicateKeyUpdate({ set: updateValues([[selfKey, selfValue]]) })
|
|
15
16
|
});
|
|
16
|
-
const makeMysqlProofPersistenceServices = (mapping) => Effect.flatMap(Effect.map(acquireTransactionService(Database), configuration), (configuration) => makeTargetProofPersistenceServices(mapping, configuration)).pipe(Effect.provideServiceEffect(CurrentProofSql, nativeDatabase(Database)));
|
|
17
|
+
const makeMysqlProofPersistenceServices = (mapping) => Effect.flatMap(Effect.map(acquireTransactionService(Database), configuration), (configuration) => makeTargetProofPersistenceServices(mapping, configuration)).pipe(Effect.provideServiceEffect(CurrentProofSql, nativeDatabase(Database)), Effect.provideServiceEffect(NativeDatabase, nativeDatabase(Database)));
|
|
17
18
|
function coordinateMysqlProofPersistence(acquire, options, body) {
|
|
18
|
-
return Effect.flatMap(acquire, (database) => coordinateTargetProofPersistence(database, options.mapping, configuration(transactionService(database)), (transaction, services) => {
|
|
19
|
+
return Effect.flatMap(nativeDatabase(acquire), (database) => coordinateTargetProofPersistence(database, options.mapping, configuration(transactionService(database)), (transaction, services) => {
|
|
19
20
|
const provided = Context.make(ProofPersistence, services.proofPersistence);
|
|
20
21
|
const work = Effect.provideContext(body, provided);
|
|
21
22
|
return options.transaction === void 0 ? work : Effect.provideService(work, options.transaction, options.transaction.of(transaction));
|
|
22
|
-
}));
|
|
23
|
+
}).pipe(Effect.provideService(NativeDatabase, database)));
|
|
23
24
|
}
|
|
24
25
|
//#endregion
|
|
25
26
|
export { coordinateMysqlProofPersistence, makeMysqlProofPersistenceServices };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mysql-proofs.mjs","names":["DatabaseService"],"sources":["../../src/drizzle/mysql-proofs.ts"],"sourcesContent":["import type { LifecycleHooks, HookConfigurationError } from \"@yielded/auth/Hooks\";\nimport { type ProofUnavailable, ProofPersistence } from \"@yielded/auth/Proofs\";\nimport type { AnyRelations } from \"drizzle-orm\";\nimport type { EffectMysql2Database } from \"drizzle-orm/effect-mysql2\";\nimport type { AnyMySqlTable } from \"drizzle-orm/mysql-core\";\nimport { Effect, Context } from \"effect\";\nimport type { SqlError } from \"effect/sql/SqlError\";\n\nimport { updateValues } from \"./model\";\nimport { Database as DatabaseService } from \"./mysql-database\";\nimport { nativeDatabase } from \"./native-database\";\nimport type { ProofPersistenceMapping } from \"./proof-model\";\nimport { CurrentProofSql } from \"./proof-sql\";\nimport type { ProofSqlQuery } from \"./proof-sql\";\nimport {\n coordinateTargetProofPersistence,\n makeTargetProofPersistenceServices,\n sqlClientProofStandaloneGuard,\n} from \"./proof-target\";\nimport {\n type TransactionService,\n acquireTransactionService,\n transactionService,\n} from \"./standalone-guard\";\nimport type { SuppliedService } from \"./SuppliedService\";\n\ntype Database = EffectMysql2Database<AnyRelations>;\ntype Transaction = Parameters<Parameters<Database[\"transaction\"]>[0]>[0];\ntype Mapping<\n Rq extends AnyMySqlTable,\n S extends AnyMySqlTable,\n G extends AnyMySqlTable,\n Cn extends AnyMySqlTable,\n Rs extends AnyMySqlTable,\n A extends AnyMySqlTable,\n F extends AnyMySqlTable,\n C extends AnyMySqlTable,\n Sub extends AnyMySqlTable,\n I extends AnyMySqlTable,\n Cr extends AnyMySqlTable,\n NativeId,\n> = ProofPersistenceMapping<Rq, S, G, Cn, Rs, A, F, C, Sub, I, Cr, NativeId>;\n\nconst configuration = (service: TransactionService | undefined) => ({\n mode: \"interactive\" as const,\n locking: true,\n standaloneGuard: sqlClientProofStandaloneGuard(service),\n insertIfAbsent: (query: ProofSqlQuery, selfKey: string, selfValue: unknown) =>\n query.onDuplicateKeyUpdate({\n set: updateValues([[selfKey, selfValue]]),\n }),\n});\n\nexport const makeMysqlProofPersistenceServices = <\n Rq extends AnyMySqlTable,\n S extends AnyMySqlTable,\n G extends AnyMySqlTable,\n Cn extends AnyMySqlTable,\n Rs extends AnyMySqlTable,\n A extends AnyMySqlTable,\n F extends AnyMySqlTable,\n C extends AnyMySqlTable,\n Sub extends AnyMySqlTable,\n I extends AnyMySqlTable,\n Cr extends AnyMySqlTable,\n NativeId,\n>(\n mapping: Mapping<Rq, S, G, Cn, Rs, A, F, C, Sub, I, Cr, NativeId>,\n) =>\n Effect.flatMap(\n Effect.map(acquireTransactionService(DatabaseService), configuration),\n (configuration) => makeTargetProofPersistenceServices(mapping, configuration),\n ).pipe(Effect.provideServiceEffect(CurrentProofSql, nativeDatabase(DatabaseService)));\n\nexport function coordinateMysqlProofPersistence<\n D extends Database,\n Rq extends AnyMySqlTable,\n S extends AnyMySqlTable,\n G extends AnyMySqlTable,\n Cn extends AnyMySqlTable,\n Rs extends AnyMySqlTable,\n Aev extends AnyMySqlTable,\n F extends AnyMySqlTable,\n C extends AnyMySqlTable,\n Sub extends AnyMySqlTable,\n I extends AnyMySqlTable,\n Cr extends AnyMySqlTable,\n NativeId,\n A,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: Mapping<Rq, S, G, Cn, Rs, Aev, F, C, Sub, I, Cr, NativeId>;\n readonly transaction?: never;\n },\n body: Effect.Effect<A, E, R>,\n): Effect.Effect<\n A,\n E | ProofUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, ProofPersistence> | LifecycleHooks | DatabaseRequirements\n>;\n\nexport function coordinateMysqlProofPersistence<\n D extends Database,\n Rq extends AnyMySqlTable,\n S extends AnyMySqlTable,\n G extends AnyMySqlTable,\n Cn extends AnyMySqlTable,\n Rs extends AnyMySqlTable,\n Aev extends AnyMySqlTable,\n F extends AnyMySqlTable,\n C extends AnyMySqlTable,\n Sub extends AnyMySqlTable,\n I extends AnyMySqlTable,\n Cr extends AnyMySqlTable,\n NativeId,\n A,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: Mapping<Rq, S, G, Cn, Rs, Aev, F, C, Sub, I, Cr, NativeId>;\n readonly transaction: SuppliedService<TxId, NoInfer<Transaction>, TxShape>;\n },\n body: Effect.Effect<A, E, R>,\n): Effect.Effect<\n A,\n E | ProofUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, ProofPersistence | TxId> | LifecycleHooks | DatabaseRequirements\n>;\n\nexport function coordinateMysqlProofPersistence<\n D extends Database,\n Rq extends AnyMySqlTable,\n S extends AnyMySqlTable,\n G extends AnyMySqlTable,\n Cn extends AnyMySqlTable,\n Rs extends AnyMySqlTable,\n Aev extends AnyMySqlTable,\n F extends AnyMySqlTable,\n C extends AnyMySqlTable,\n Sub extends AnyMySqlTable,\n I extends AnyMySqlTable,\n Cr extends AnyMySqlTable,\n NativeId,\n A,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: Mapping<Rq, S, G, Cn, Rs, Aev, F, C, Sub, I, Cr, NativeId>;\n readonly transaction?: SuppliedService<TxId, NoInfer<Transaction>, TxShape>;\n },\n body: Effect.Effect<A, E, R>,\n): Effect.Effect<\n A,\n E | ProofUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, ProofPersistence> | LifecycleHooks | DatabaseRequirements\n> {\n return Effect.flatMap(acquire, (database) =>\n coordinateTargetProofPersistence<Transaction, A, E, Exclude<R, ProofPersistence>>(\n database,\n options.mapping,\n configuration(transactionService(database)),\n (\n transaction: Transaction,\n services: { readonly proofPersistence: ProofPersistence[\"Service\"] },\n ) => {\n const provided = Context.make(ProofPersistence, services.proofPersistence);\n const work = Effect.provideContext(body, provided);\n\n return options.transaction === undefined\n ? work\n : Effect.provideService(work, options.transaction, options.transaction.of(transaction));\n },\n ),\n );\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"mysql-proofs.mjs","names":["DatabaseService"],"sources":["../../src/drizzle/mysql-proofs.ts"],"sourcesContent":["import { NativeDatabase } from \"@yielded/auth-persistence/Adapter\";\nimport type { LifecycleHooks, HookConfigurationError } from \"@yielded/auth/Hooks\";\nimport { type ProofUnavailable, ProofPersistence } from \"@yielded/auth/Proofs\";\nimport type { AnyRelations } from \"drizzle-orm\";\nimport type { EffectMysql2Database } from \"drizzle-orm/effect-mysql2\";\nimport type { AnyMySqlTable } from \"drizzle-orm/mysql-core\";\nimport { Effect, Context } from \"effect\";\nimport type { SqlError } from \"effect/sql/SqlError\";\n\nimport { updateValues } from \"./model\";\nimport { Database as DatabaseService } from \"./mysql-database\";\nimport { nativeDatabase } from \"./native-database\";\nimport type { ProofPersistenceMapping } from \"./proof-model\";\nimport { CurrentProofSql } from \"./proof-sql\";\nimport type { ProofSqlQuery } from \"./proof-sql\";\nimport {\n coordinateTargetProofPersistence,\n makeTargetProofPersistenceServices,\n sqlClientProofStandaloneGuard,\n} from \"./proof-target\";\nimport {\n type TransactionService,\n acquireTransactionService,\n transactionService,\n} from \"./standalone-guard\";\nimport type { SuppliedService } from \"./SuppliedService\";\n\ntype Database = EffectMysql2Database<AnyRelations>;\ntype Transaction = Parameters<Parameters<Database[\"transaction\"]>[0]>[0];\ntype Mapping<\n Rq extends AnyMySqlTable,\n S extends AnyMySqlTable,\n G extends AnyMySqlTable,\n Cn extends AnyMySqlTable,\n Rs extends AnyMySqlTable,\n A extends AnyMySqlTable,\n F extends AnyMySqlTable,\n C extends AnyMySqlTable,\n Sub extends AnyMySqlTable,\n I extends AnyMySqlTable,\n Cr extends AnyMySqlTable,\n NativeId,\n> = ProofPersistenceMapping<Rq, S, G, Cn, Rs, A, F, C, Sub, I, Cr, NativeId>;\n\nconst configuration = (service: TransactionService | undefined) => ({\n mode: \"interactive\" as const,\n locking: true,\n standaloneGuard: sqlClientProofStandaloneGuard(service),\n insertIfAbsent: (query: ProofSqlQuery, selfKey: string, selfValue: unknown) =>\n query.onDuplicateKeyUpdate({\n set: updateValues([[selfKey, selfValue]]),\n }),\n});\n\nexport const makeMysqlProofPersistenceServices = <\n Rq extends AnyMySqlTable,\n S extends AnyMySqlTable,\n G extends AnyMySqlTable,\n Cn extends AnyMySqlTable,\n Rs extends AnyMySqlTable,\n A extends AnyMySqlTable,\n F extends AnyMySqlTable,\n C extends AnyMySqlTable,\n Sub extends AnyMySqlTable,\n I extends AnyMySqlTable,\n Cr extends AnyMySqlTable,\n NativeId,\n>(\n mapping: Mapping<Rq, S, G, Cn, Rs, A, F, C, Sub, I, Cr, NativeId>,\n) =>\n Effect.flatMap(\n Effect.map(acquireTransactionService(DatabaseService), configuration),\n (configuration) => makeTargetProofPersistenceServices(mapping, configuration),\n ).pipe(\n Effect.provideServiceEffect(CurrentProofSql, nativeDatabase(DatabaseService)),\n Effect.provideServiceEffect(NativeDatabase, nativeDatabase(DatabaseService)),\n );\n\nexport function coordinateMysqlProofPersistence<\n D extends Database,\n Rq extends AnyMySqlTable,\n S extends AnyMySqlTable,\n G extends AnyMySqlTable,\n Cn extends AnyMySqlTable,\n Rs extends AnyMySqlTable,\n Aev extends AnyMySqlTable,\n F extends AnyMySqlTable,\n C extends AnyMySqlTable,\n Sub extends AnyMySqlTable,\n I extends AnyMySqlTable,\n Cr extends AnyMySqlTable,\n NativeId,\n A,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: Mapping<Rq, S, G, Cn, Rs, Aev, F, C, Sub, I, Cr, NativeId>;\n readonly transaction?: never;\n },\n body: Effect.Effect<A, E, R>,\n): Effect.Effect<\n A,\n E | ProofUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, ProofPersistence> | LifecycleHooks | DatabaseRequirements\n>;\n\nexport function coordinateMysqlProofPersistence<\n D extends Database,\n Rq extends AnyMySqlTable,\n S extends AnyMySqlTable,\n G extends AnyMySqlTable,\n Cn extends AnyMySqlTable,\n Rs extends AnyMySqlTable,\n Aev extends AnyMySqlTable,\n F extends AnyMySqlTable,\n C extends AnyMySqlTable,\n Sub extends AnyMySqlTable,\n I extends AnyMySqlTable,\n Cr extends AnyMySqlTable,\n NativeId,\n A,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: Mapping<Rq, S, G, Cn, Rs, Aev, F, C, Sub, I, Cr, NativeId>;\n readonly transaction: SuppliedService<TxId, NoInfer<Transaction>, TxShape>;\n },\n body: Effect.Effect<A, E, R>,\n): Effect.Effect<\n A,\n E | ProofUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, ProofPersistence | TxId> | LifecycleHooks | DatabaseRequirements\n>;\n\nexport function coordinateMysqlProofPersistence<\n D extends Database,\n Rq extends AnyMySqlTable,\n S extends AnyMySqlTable,\n G extends AnyMySqlTable,\n Cn extends AnyMySqlTable,\n Rs extends AnyMySqlTable,\n Aev extends AnyMySqlTable,\n F extends AnyMySqlTable,\n C extends AnyMySqlTable,\n Sub extends AnyMySqlTable,\n I extends AnyMySqlTable,\n Cr extends AnyMySqlTable,\n NativeId,\n A,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: Mapping<Rq, S, G, Cn, Rs, Aev, F, C, Sub, I, Cr, NativeId>;\n readonly transaction?: SuppliedService<TxId, NoInfer<Transaction>, TxShape>;\n },\n body: Effect.Effect<A, E, R>,\n): Effect.Effect<\n A,\n E | ProofUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, ProofPersistence> | LifecycleHooks | DatabaseRequirements\n> {\n return Effect.flatMap(nativeDatabase(acquire), (database) =>\n coordinateTargetProofPersistence<Transaction, A, E, Exclude<R, ProofPersistence>>(\n database,\n options.mapping,\n configuration(transactionService(database)),\n (\n transaction: Transaction,\n services: { readonly proofPersistence: ProofPersistence[\"Service\"] },\n ) => {\n const provided = Context.make(ProofPersistence, services.proofPersistence);\n const work = Effect.provideContext(body, provided);\n\n return options.transaction === undefined\n ? work\n : Effect.provideService(work, options.transaction, options.transaction.of(transaction));\n },\n ).pipe(Effect.provideService(NativeDatabase, database)),\n );\n}\n"],"mappings":";;;;;;;;;;AA4CA,MAAM,iBAAiB,aAA6C;CAClE,MAAM;CACN,SAAS;CACT,iBAAiB,8BAA8B,OAAO;CACtD,iBAAiB,OAAsB,SAAiB,cACtD,MAAM,qBAAqB,EACzB,KAAK,aAAa,CAAC,CAAC,SAAS,SAAS,CAAC,CAAC,EAC1C,CAAC;AACL;AAEA,MAAa,qCAcX,YAEA,OAAO,QACL,OAAO,IAAI,0BAA0BA,QAAe,GAAG,aAAa,IACnE,kBAAkB,mCAAmC,SAAS,aAAa,CAC9E,CAAC,CAAC,KACA,OAAO,qBAAqB,iBAAiB,eAAeA,QAAe,CAAC,GAC5E,OAAO,qBAAqB,gBAAgB,eAAeA,QAAe,CAAC,CAC7E;AAoEF,SAAgB,gCAsBd,SACA,SAIA,MAKA;CACA,OAAO,OAAO,QAAQ,eAAe,OAAO,IAAI,aAC9C,iCACE,UACA,QAAQ,SACR,cAAc,mBAAmB,QAAQ,CAAC,IAExC,aACA,aACG;EACH,MAAM,WAAW,QAAQ,KAAK,kBAAkB,SAAS,gBAAgB;EACzE,MAAM,OAAO,OAAO,eAAe,MAAM,QAAQ;EAEjD,OAAO,QAAQ,gBAAgB,KAAA,IAC3B,OACA,OAAO,eAAe,MAAM,QAAQ,aAAa,QAAQ,YAAY,GAAG,WAAW,CAAC;CAC1F,CACF,CAAC,CAAC,KAAK,OAAO,eAAe,gBAAgB,QAAQ,CAAC,CACxD;AACF"}
|
|
@@ -6,9 +6,9 @@ import { AnyRelations } from "drizzle-orm";
|
|
|
6
6
|
import { Context, Effect } from "effect";
|
|
7
7
|
import { HookConfigurationError, LifecycleHooks } from "@yielded/auth/Hooks";
|
|
8
8
|
import { AuthenticationAuthority, PendingAuthentication, SessionRepository, SessionStepUpPersistence, SessionUnavailable, SignedSessionValidity, StatefulSessionPersistence } from "@yielded/auth/Sessions";
|
|
9
|
+
import { AnyMySqlTable } from "drizzle-orm/mysql-core";
|
|
9
10
|
import { EffectMysql2Database } from "drizzle-orm/effect-mysql2";
|
|
10
11
|
import { SqlError } from "effect/sql/SqlError";
|
|
11
|
-
import { AnyMySqlTable } from "drizzle-orm/mysql-core";
|
|
12
12
|
//#region src/drizzle/mysql-sessions.d.ts
|
|
13
13
|
type Database = EffectMysql2Database<AnyRelations>;
|
|
14
14
|
type Transaction = Parameters<Parameters<Database["transaction"]>[0]>[0];
|
|
@@ -24,17 +24,17 @@ export declare const makeMysqlAuthenticationAuthorityServices: <Claims, S extend
|
|
|
24
24
|
readonly pending?: import("@yielded/auth/Sessions").PendingConsumption;
|
|
25
25
|
}, prepare: import("@yielded/auth/Sessions").PrepareSessionCommit<void, A>) => Effect.Effect<import("@yielded/auth/Hooks").PreparedCommit<A>, import("@yielded/auth/Sessions").StaleAuthentication | import("@yielded/auth/Sessions").PendingAuthenticationInvalid | SessionUnavailable>;
|
|
26
26
|
};
|
|
27
|
-
},
|
|
27
|
+
}, SessionUnavailable, Database$1 | LifecycleHooks>;
|
|
28
28
|
export declare const makeMysqlPendingAuthenticationServices: <Claims, S extends AnyMySqlTable, C extends AnyMySqlTable, P extends AnyMySqlTable, F extends AnyMySqlTable, NativeId>(mapping: PendingAuthenticationMapping<Claims, S, C, P, F, NativeId>) => Effect.Effect<{
|
|
29
29
|
pendingAuthentication: PendingAuthentication<Claims>;
|
|
30
|
-
},
|
|
30
|
+
}, SessionUnavailable, Database$1 | LifecycleHooks>;
|
|
31
31
|
export declare const makeMysqlStatefulSessionServices: <Claims, S extends AnyMySqlTable, C extends AnyMySqlTable, Session extends AnyMySqlTable, F extends AnyMySqlTable, P extends AnyMySqlTable, NativeId, NativeSessionId>(mapping: StatefulSessionMapping<Claims, S, C, Session, F, P, NativeId, NativeSessionId>) => Effect.Effect<{
|
|
32
32
|
readonly statefulSessionPersistence: StatefulSessionPersistence<Claims>;
|
|
33
33
|
readonly sessionRepository: SessionRepository;
|
|
34
|
-
},
|
|
34
|
+
}, SessionUnavailable, Database$1 | LifecycleHooks>;
|
|
35
35
|
export declare const makeMysqlSignedSessionValidityServices: <S extends AnyMySqlTable, T extends AnyMySqlTable, NativeId, NativeSessionId>(mapping: SignedSessionValidityMapping<S, T, NativeId, NativeSessionId>) => Effect.Effect<{
|
|
36
36
|
signedSessionValidity: SignedSessionValidity;
|
|
37
|
-
},
|
|
37
|
+
}, SessionUnavailable, Database$1 | LifecycleHooks>;
|
|
38
38
|
export declare function coordinateMysqlAuthenticationAuthority<D extends Database, Claims, S extends AnyMySqlTable, C extends AnyMySqlTable, F extends AnyMySqlTable, P extends AnyMySqlTable, NativeId, A, E, R, DatabaseError, DatabaseRequirements>(acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>, options: {
|
|
39
39
|
readonly mapping: AuthenticationAuthorityMapping<Claims, S, C, F, P, NativeId>;
|
|
40
40
|
readonly transaction?: never;
|
|
@@ -77,7 +77,7 @@ export declare function coordinateMysqlSignedSessionValidity<D extends Database,
|
|
|
77
77
|
}, body: Effect.Effect<A, E, R>): Effect.Effect<A, E | SessionUnavailable | HookConfigurationError | SqlError | DatabaseError, Exclude<R, TargetId | TxId> | LifecycleHooks | DatabaseRequirements>;
|
|
78
78
|
export declare const makeMysqlSessionStepUpServices: <Claims, Id, S extends AnyMySqlTable, C extends AnyMySqlTable, I extends AnyMySqlTable, Session extends AnyMySqlTable, T extends AnyMySqlTable, NativeId, NativeSessionId>(mapping: SessionStepUpMapping<NoInfer<Claims>, S, C, I, Session, T, NativeId, NativeSessionId>, target: Context.Service<Id, SessionStepUpPersistence<Claims>>) => Effect.Effect<{
|
|
79
79
|
sessionStepUpPersistence: SessionStepUpPersistence<Claims>;
|
|
80
|
-
},
|
|
80
|
+
}, SessionUnavailable, Database$1 | LifecycleHooks>;
|
|
81
81
|
export declare function coordinateMysqlSessionStepUp<Claims, Id, S extends AnyMySqlTable, C extends AnyMySqlTable, I extends AnyMySqlTable, Session extends AnyMySqlTable, T extends AnyMySqlTable, NativeId, NativeSessionId, D extends Database, A, E, R, DatabaseError, DatabaseRequirements>(acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>, options: {
|
|
82
82
|
readonly mapping: SessionStepUpMapping<NoInfer<Claims>, S, C, I, Session, T, NativeId, NativeSessionId>;
|
|
83
83
|
readonly target: SuppliedService<Id, SessionStepUpPersistence<Claims>>;
|