@yielded/auth-persistence-drizzle 0.1.0-beta.1 → 0.1.0-beta.12

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.
Files changed (222) hide show
  1. package/dist/D1.d.mts +27 -22
  2. package/dist/D1.mjs +10 -4
  3. package/dist/D1.mjs.map +1 -1
  4. package/dist/Libsql.d.mts +66 -61
  5. package/dist/Libsql.mjs +20 -15
  6. package/dist/Libsql.mjs.map +1 -1
  7. package/dist/Mysql2.d.mts +58 -46
  8. package/dist/Mysql2.mjs +13 -6
  9. package/dist/Mysql2.mjs.map +1 -1
  10. package/dist/Pglite.d.mts +43 -32
  11. package/dist/Pglite.mjs +12 -7
  12. package/dist/Pglite.mjs.map +1 -1
  13. package/dist/Postgres.d.mts +59 -48
  14. package/dist/Postgres.mjs +12 -7
  15. package/dist/Postgres.mjs.map +1 -1
  16. package/dist/SqliteBun.d.mts +58 -53
  17. package/dist/SqliteBun.mjs +20 -14
  18. package/dist/SqliteBun.mjs.map +1 -1
  19. package/dist/SqliteDo.d.mts +66 -60
  20. package/dist/SqliteDo.mjs +26 -14
  21. package/dist/SqliteDo.mjs.map +1 -1
  22. package/dist/SqliteNode.d.mts +58 -53
  23. package/dist/SqliteNode.mjs +20 -14
  24. package/dist/SqliteNode.mjs.map +1 -1
  25. package/dist/SqliteWasm.d.mts +66 -61
  26. package/dist/SqliteWasm.mjs +20 -14
  27. package/dist/SqliteWasm.mjs.map +1 -1
  28. package/dist/drizzle/d1-database.d.mts +11 -0
  29. package/dist/drizzle/d1-database.mjs +8 -0
  30. package/dist/drizzle/d1-database.mjs.map +1 -0
  31. package/dist/drizzle/d1-emails.d.mts +8 -7
  32. package/dist/drizzle/d1-emails.mjs +7 -4
  33. package/dist/drizzle/d1-emails.mjs.map +1 -1
  34. package/dist/drizzle/d1-identity.mjs +12 -9
  35. package/dist/drizzle/d1-identity.mjs.map +1 -1
  36. package/dist/drizzle/d1-oauth.d.mts +14 -13
  37. package/dist/drizzle/d1-oauth.mjs +7 -4
  38. package/dist/drizzle/d1-oauth.mjs.map +1 -1
  39. package/dist/drizzle/d1-passkey.d.mts +3 -14
  40. package/dist/drizzle/d1-passkey.mjs +2 -1
  41. package/dist/drizzle/d1-passkey.mjs.map +1 -1
  42. package/dist/drizzle/d1-password-prepared.d.mts +4 -3
  43. package/dist/drizzle/d1-password-prepared.mjs +3 -1
  44. package/dist/drizzle/d1-password-prepared.mjs.map +1 -1
  45. package/dist/drizzle/d1-passwords.d.mts +6 -5
  46. package/dist/drizzle/d1-passwords.mjs +5 -2
  47. package/dist/drizzle/d1-passwords.mjs.map +1 -1
  48. package/dist/drizzle/d1-phone.d.mts +3 -4
  49. package/dist/drizzle/d1-phone.mjs +2 -1
  50. package/dist/drizzle/d1-phone.mjs.map +1 -1
  51. package/dist/drizzle/d1-planning.d.mts +1 -1
  52. package/dist/drizzle/d1-proofs.d.mts +4 -3
  53. package/dist/drizzle/d1-proofs.mjs +3 -1
  54. package/dist/drizzle/d1-proofs.mjs.map +1 -1
  55. package/dist/drizzle/d1-sessions.d.mts +11 -10
  56. package/dist/drizzle/d1-sessions.mjs +15 -9
  57. package/dist/drizzle/d1-sessions.mjs.map +1 -1
  58. package/dist/drizzle/d1-totp.d.mts +3 -4
  59. package/dist/drizzle/d1-totp.mjs +2 -1
  60. package/dist/drizzle/d1-totp.mjs.map +1 -1
  61. package/dist/drizzle/email-registration.mjs +2 -1
  62. package/dist/drizzle/email-registration.mjs.map +1 -1
  63. package/dist/drizzle/email-target.d.mts +7 -6
  64. package/dist/drizzle/email-target.mjs +10 -10
  65. package/dist/drizzle/email-target.mjs.map +1 -1
  66. package/dist/drizzle/mysql-database.d.mts +8 -0
  67. package/dist/drizzle/mysql-database.mjs +8 -0
  68. package/dist/drizzle/mysql-database.mjs.map +1 -0
  69. package/dist/drizzle/mysql-emails.d.mts +7 -6
  70. package/dist/drizzle/mysql-emails.mjs +12 -8
  71. package/dist/drizzle/mysql-emails.mjs.map +1 -1
  72. package/dist/drizzle/mysql-identity.mjs +12 -9
  73. package/dist/drizzle/mysql-identity.mjs.map +1 -1
  74. package/dist/drizzle/mysql-password-prepared.d.mts +3 -2
  75. package/dist/drizzle/mysql-password-prepared.mjs +6 -2
  76. package/dist/drizzle/mysql-password-prepared.mjs.map +1 -1
  77. package/dist/drizzle/mysql-passwords.d.mts +6 -4
  78. package/dist/drizzle/mysql-passwords.mjs +11 -7
  79. package/dist/drizzle/mysql-passwords.mjs.map +1 -1
  80. package/dist/drizzle/mysql-proofs.d.mts +3 -2
  81. package/dist/drizzle/mysql-proofs.mjs +8 -4
  82. package/dist/drizzle/mysql-proofs.mjs.map +1 -1
  83. package/dist/drizzle/mysql-sessions.d.mts +11 -10
  84. package/dist/drizzle/mysql-sessions.mjs +16 -12
  85. package/dist/drizzle/mysql-sessions.mjs.map +1 -1
  86. package/dist/drizzle/native-database.mjs +10 -0
  87. package/dist/drizzle/native-database.mjs.map +1 -0
  88. package/dist/drizzle/oauth-connected-drivers.mjs +7 -5
  89. package/dist/drizzle/oauth-connected-drivers.mjs.map +1 -1
  90. package/dist/drizzle/oauth-connected-target.d.mts +6 -7
  91. package/dist/drizzle/oauth-connected-target.mjs +4 -5
  92. package/dist/drizzle/oauth-connected-target.mjs.map +1 -1
  93. package/dist/drizzle/oauth-drivers.mjs +8 -6
  94. package/dist/drizzle/oauth-drivers.mjs.map +1 -1
  95. package/dist/drizzle/oauth-target.d.mts +12 -11
  96. package/dist/drizzle/oauth-target.mjs +13 -12
  97. package/dist/drizzle/oauth-target.mjs.map +1 -1
  98. package/dist/drizzle/passkey-drivers.mjs +8 -6
  99. package/dist/drizzle/passkey-drivers.mjs.map +1 -1
  100. package/dist/drizzle/passkey-write-drivers.mjs +5 -3
  101. package/dist/drizzle/passkey-write-drivers.mjs.map +1 -1
  102. package/dist/drizzle/passkey-write-target.d.mts +1 -1
  103. package/dist/drizzle/password-prepared-sql.mjs +2 -1
  104. package/dist/drizzle/password-prepared-sql.mjs.map +1 -1
  105. package/dist/drizzle/password-prepared-target.d.mts +3 -2
  106. package/dist/drizzle/password-prepared-target.mjs +4 -3
  107. package/dist/drizzle/password-prepared-target.mjs.map +1 -1
  108. package/dist/drizzle/password-registration.mjs +2 -1
  109. package/dist/drizzle/password-registration.mjs.map +1 -1
  110. package/dist/drizzle/password-target.d.mts +5 -4
  111. package/dist/drizzle/password-target.mjs +8 -8
  112. package/dist/drizzle/password-target.mjs.map +1 -1
  113. package/dist/drizzle/pg-database.d.mts +9 -0
  114. package/dist/drizzle/pg-database.mjs +8 -0
  115. package/dist/drizzle/pg-database.mjs.map +1 -0
  116. package/dist/drizzle/pg-emails.d.mts +7 -6
  117. package/dist/drizzle/pg-emails.mjs +12 -8
  118. package/dist/drizzle/pg-emails.mjs.map +1 -1
  119. package/dist/drizzle/pg-identity.mjs +12 -9
  120. package/dist/drizzle/pg-identity.mjs.map +1 -1
  121. package/dist/drizzle/pg-password-prepared.d.mts +3 -2
  122. package/dist/drizzle/pg-password-prepared.mjs +6 -2
  123. package/dist/drizzle/pg-password-prepared.mjs.map +1 -1
  124. package/dist/drizzle/pg-passwords.d.mts +6 -4
  125. package/dist/drizzle/pg-passwords.mjs +11 -7
  126. package/dist/drizzle/pg-passwords.mjs.map +1 -1
  127. package/dist/drizzle/pg-proofs.d.mts +3 -2
  128. package/dist/drizzle/pg-proofs.mjs +8 -4
  129. package/dist/drizzle/pg-proofs.mjs.map +1 -1
  130. package/dist/drizzle/pg-sessions.d.mts +11 -10
  131. package/dist/drizzle/pg-sessions.mjs +16 -12
  132. package/dist/drizzle/pg-sessions.mjs.map +1 -1
  133. package/dist/drizzle/phone-target.d.mts +4 -3
  134. package/dist/drizzle/phone-target.mjs +12 -11
  135. package/dist/drizzle/phone-target.mjs.map +1 -1
  136. package/dist/drizzle/proof-target.d.mts +3 -2
  137. package/dist/drizzle/proof-target.mjs +5 -5
  138. package/dist/drizzle/proof-target.mjs.map +1 -1
  139. package/dist/drizzle/session-sql.d.mts +1 -0
  140. package/dist/drizzle/session-target.d.mts +10 -8
  141. package/dist/drizzle/session-target.mjs +11 -11
  142. package/dist/drizzle/session-target.mjs.map +1 -1
  143. package/dist/drizzle/sqlite-emails.mjs +9 -5
  144. package/dist/drizzle/sqlite-emails.mjs.map +1 -1
  145. package/dist/drizzle/sqlite-identity.mjs +14 -11
  146. package/dist/drizzle/sqlite-identity.mjs.map +1 -1
  147. package/dist/drizzle/sqlite-password-prepared.mjs +7 -3
  148. package/dist/drizzle/sqlite-password-prepared.mjs.map +1 -1
  149. package/dist/drizzle/sqlite-passwords.mjs +10 -6
  150. package/dist/drizzle/sqlite-passwords.mjs.map +1 -1
  151. package/dist/drizzle/sqlite-proofs.mjs +7 -3
  152. package/dist/drizzle/sqlite-proofs.mjs.map +1 -1
  153. package/dist/drizzle/sqlite-sessions.mjs +16 -12
  154. package/dist/drizzle/sqlite-sessions.mjs.map +1 -1
  155. package/dist/drizzle/standalone-guard.d.mts +2 -0
  156. package/dist/drizzle/standalone-guard.mjs +8 -4
  157. package/dist/drizzle/standalone-guard.mjs.map +1 -1
  158. package/dist/drizzle/totp-target.d.mts +4 -3
  159. package/dist/drizzle/totp-target.mjs +31 -28
  160. package/dist/drizzle/totp-target.mjs.map +1 -1
  161. package/package.json +1 -1
  162. package/src/D1.ts +37 -10
  163. package/src/Libsql.ts +45 -17
  164. package/src/Mysql2.ts +39 -13
  165. package/src/Pglite.ts +47 -13
  166. package/src/Postgres.ts +47 -13
  167. package/src/SqliteBun.ts +58 -30
  168. package/src/SqliteDo.ts +61 -19
  169. package/src/SqliteNode.ts +55 -28
  170. package/src/SqliteWasm.ts +55 -28
  171. package/src/drizzle/d1-database.ts +10 -0
  172. package/src/drizzle/d1-emails.ts +84 -84
  173. package/src/drizzle/d1-identity.ts +17 -20
  174. package/src/drizzle/d1-oauth.ts +19 -8
  175. package/src/drizzle/d1-passkey.ts +5 -1
  176. package/src/drizzle/d1-password-prepared.ts +38 -37
  177. package/src/drizzle/d1-passwords.ts +74 -76
  178. package/src/drizzle/d1-phone.ts +5 -1
  179. package/src/drizzle/d1-proofs.ts +29 -30
  180. package/src/drizzle/d1-sessions.ts +51 -38
  181. package/src/drizzle/d1-totp.ts +5 -1
  182. package/src/drizzle/email-registration.ts +6 -2
  183. package/src/drizzle/email-target.ts +17 -19
  184. package/src/drizzle/mysql-database.ts +8 -0
  185. package/src/drizzle/mysql-emails.ts +28 -16
  186. package/src/drizzle/mysql-identity.ts +18 -21
  187. package/src/drizzle/mysql-password-prepared.ts +10 -8
  188. package/src/drizzle/mysql-passwords.ts +21 -9
  189. package/src/drizzle/mysql-proofs.ts +16 -5
  190. package/src/drizzle/mysql-sessions.ts +40 -17
  191. package/src/drizzle/native-database.ts +22 -0
  192. package/src/drizzle/oauth-connected-drivers.ts +18 -6
  193. package/src/drizzle/oauth-connected-target.ts +16 -17
  194. package/src/drizzle/oauth-drivers.ts +26 -10
  195. package/src/drizzle/oauth-target.ts +30 -42
  196. package/src/drizzle/passkey-drivers.ts +21 -13
  197. package/src/drizzle/passkey-write-drivers.ts +11 -6
  198. package/src/drizzle/password-prepared-sql.ts +2 -4
  199. package/src/drizzle/password-prepared-target.ts +9 -6
  200. package/src/drizzle/password-registration.ts +7 -8
  201. package/src/drizzle/password-target.ts +19 -18
  202. package/src/drizzle/pg-database.ts +10 -0
  203. package/src/drizzle/pg-emails.ts +28 -16
  204. package/src/drizzle/pg-identity.ts +18 -22
  205. package/src/drizzle/pg-password-prepared.ts +10 -8
  206. package/src/drizzle/pg-passwords.ts +21 -9
  207. package/src/drizzle/pg-proofs.ts +16 -5
  208. package/src/drizzle/pg-sessions.ts +40 -17
  209. package/src/drizzle/phone-target.ts +22 -17
  210. package/src/drizzle/proof-target.ts +9 -12
  211. package/src/drizzle/session-target.ts +32 -50
  212. package/src/drizzle/sqlite-emails.ts +30 -13
  213. package/src/drizzle/sqlite-identity.ts +22 -42
  214. package/src/drizzle/sqlite-password-prepared.ts +23 -9
  215. package/src/drizzle/sqlite-passwords.ts +29 -15
  216. package/src/drizzle/sqlite-proofs.ts +28 -5
  217. package/src/drizzle/sqlite-sessions.ts +49 -23
  218. package/src/drizzle/standalone-guard.ts +18 -6
  219. package/src/drizzle/totp-target.ts +61 -60
  220. package/dist/drizzle/d1-identity.d.mts +0 -30
  221. package/dist/drizzle/mysql-identity.d.mts +0 -21
  222. package/dist/drizzle/pg-identity.d.mts +0 -22
@@ -1,21 +1,20 @@
1
1
  import { D1TotpMapping, TotpMapping, TotpMappingSource, TotpPersistenceServices } from "./totp-model.mjs";
2
+ import { Database as Database$1 } from "./d1-database.mjs";
2
3
  import { D1BatchStatements } from "./D1BatchStatements.mjs";
3
4
  import { TotpCoordinatorError } from "./totp-target.mjs";
4
5
  import { AnyRelations } from "drizzle-orm";
5
6
  import { Effect } from "effect";
6
7
  import { LifecycleHooks } from "@yielded/auth/Hooks";
7
8
  import { TotpPersistence } from "@yielded/auth/Totp";
9
+ import { EffectSQLiteD1Database } from "drizzle-orm/effect-d1";
8
10
  import { AnySQLiteTable } from "drizzle-orm/sqlite-core";
9
11
  import { D1Client } from "@effect/sql-d1/D1Client";
10
- import { EffectSQLiteD1Database } from "drizzle-orm/effect-d1";
11
12
  //#region src/drizzle/d1-totp.d.ts
12
13
  type Database = EffectSQLiteD1Database<AnyRelations> & {
13
14
  readonly $client: D1Client;
14
15
  };
15
16
  type Table$1 = AnySQLiteTable;
16
- export declare const makeTotpPersistenceServices: <Database extends EffectSQLiteD1Database<import("drizzle-orm").TablesRelationalConfig> & {
17
- readonly $client: D1Client;
18
- }, S extends Table$1, F extends Table$1, C extends Table$1, N, RSetup = never>(database: Database, mapping: TotpMappingSource<TotpMapping<S, F, C, N> & D1TotpMapping, RSetup>) => Effect.Effect<TotpPersistenceServices, import("@yielded/auth-persistence/Adapter").PersistenceMappingError | import("@yielded/auth/Totp").TotpConfigurationError, RSetup | LifecycleHooks>;
17
+ export declare const makeTotpPersistenceServices: <S extends Table$1, F extends Table$1, C extends Table$1, N, RSetup = never>(mapping: TotpMappingSource<TotpMapping<S, F, C, N> & D1TotpMapping, RSetup>) => Effect.Effect<TotpPersistenceServices, import("@yielded/auth-persistence/Adapter").PersistenceMappingError | import("@yielded/auth/Totp").TotpConfigurationError, Database$1 | LifecycleHooks | Exclude<RSetup, import("@yielded/auth-persistence/Adapter").NativeDatabase>>;
19
18
  export declare const coordinateTotpPersistence: <D extends Database, S extends Table$1, F extends Table$1, C extends Table$1, N, A, E, R, RSetup = never, DatabaseError = never, DatabaseRequirements = never>(acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>, options: {
20
19
  readonly mapping: TotpMappingSource<TotpMapping<S, F, C, N> & D1TotpMapping, RSetup>;
21
20
  }, body: Effect.Effect<A, E, R>) => Effect.Effect<A, TotpCoordinatorError<E> | DatabaseError, Exclude<R, TotpPersistence | D1BatchStatements> | LifecycleHooks | RSetup | DatabaseRequirements>;
@@ -1,3 +1,4 @@
1
+ import { Database } from "./d1-database.mjs";
1
2
  import { D1BatchStatements } from "./D1BatchStatements.mjs";
2
3
  import { makeD1Owner } from "./d1-planning.mjs";
3
4
  import { coordinateTargetTotp, makeTotpTarget } from "./totp-target.mjs";
@@ -10,7 +11,7 @@ const configuration = {
10
11
  locking: false,
11
12
  standaloneGuard: () => Effect.void
12
13
  };
13
- const { makeTotpPersistenceServices } = makeTotpTarget(configuration);
14
+ const { makeTotpPersistenceServices } = makeTotpTarget(Database, configuration);
14
15
  const coordinateTotpPersistence = (acquire, options, body) => Effect.flatMap(acquire, (database) => coordinateTargetTotp(database, options.mapping, configuration, (_transaction, services, append) => Effect.gen(function* () {
15
16
  const original = services.totpPersistence;
16
17
  const nativeCollector = D1BatchStatements.of({ append: (statement) => Effect.sync(() => append(statement)) });
@@ -1 +1 @@
1
- {"version":3,"file":"d1-totp.mjs","names":[],"sources":["../../src/drizzle/d1-totp.ts"],"sourcesContent":["import type { D1Client } from \"@effect/sql-d1/D1Client\";\nimport type { LifecycleHooks } from \"@yielded/auth/Hooks\";\nimport { TotpUnavailable, TotpPersistence } from \"@yielded/auth/Totp\";\nimport type { AnyRelations } from \"drizzle-orm\";\nimport type { EffectSQLiteD1Database } from \"drizzle-orm/effect-d1\";\nimport type { AnySQLiteTable } from \"drizzle-orm/sqlite-core\";\nimport { Context, Effect } from \"effect\";\n\nimport { makeD1Owner } from \"./d1-planning\";\nimport { D1BatchStatements } from \"./D1BatchStatements\";\nimport type { D1TotpMapping, TotpMapping, TotpMappingSource } from \"./totp-model\";\nimport { coordinateTargetTotp, makeTotpTarget, type TotpCoordinatorError } from \"./totp-target\";\ntype Database = EffectSQLiteD1Database<AnyRelations> & { readonly $client: D1Client };\ntype Table = AnySQLiteTable;\n\nconst configuration = {\n mode: \"batch\" as const,\n dialect: \"sqlite\" as const,\n locking: false,\n standaloneGuard: () => Effect.void,\n};\n\n/** Reads use a primary D1 session; observations and expiry are asserted in the same batch. */\nconst target = makeTotpTarget<Database, Table, D1TotpMapping>(configuration);\n\nexport const { makeTotpPersistenceServices } = target;\n\nexport const coordinateTotpPersistence = <\n D extends Database,\n S extends Table,\n F extends Table,\n C extends Table,\n N,\n A,\n E,\n R,\n RSetup = never,\n DatabaseError = never,\n DatabaseRequirements = never,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: { readonly mapping: TotpMappingSource<TotpMapping<S, F, C, N> & D1TotpMapping, RSetup> },\n body: Effect.Effect<A, E, R>,\n): Effect.Effect<\n A,\n TotpCoordinatorError<E> | DatabaseError,\n Exclude<R, TotpPersistence | D1BatchStatements> | LifecycleHooks | RSetup | DatabaseRequirements\n> =>\n Effect.flatMap(acquire, (database) =>\n coordinateTargetTotp(\n database,\n options.mapping,\n configuration,\n (_transaction, services, append) =>\n Effect.gen(function* () {\n const original = services.totpPersistence;\n\n const nativeCollector = D1BatchStatements.of({\n append: (statement) => Effect.sync(() => append(statement)),\n });\n\n const owner = yield* makeD1Owner(TotpUnavailable.make({})).pipe(\n Effect.provideService(D1BatchStatements, nativeCollector),\n );\n\n const service: TotpPersistence[\"Service\"] = {\n snapshot: (input) => owner.run(original.snapshot(input)),\n mutate: (input, prepare) => owner.run(original.mutate(input, prepare)),\n };\n\n const provided = Context.make(TotpPersistence, service).pipe(\n Context.add(D1BatchStatements, owner.collector),\n );\n\n return yield* owner.close(Effect.provideContext(body, provided));\n }),\n ),\n );\n"],"mappings":";;;;;;AAeA,MAAM,gBAAgB;CACpB,MAAM;CACN,SAAS;CACT,SAAS;CACT,uBAAuB,OAAO;AAChC;AAKA,MAAa,EAAE,gCAFA,eAA+C,aAEf;AAE/C,MAAa,6BAaX,SACA,SACA,SAMA,OAAO,QAAQ,UAAU,aACvB,qBACE,UACA,QAAQ,SACR,gBACC,cAAc,UAAU,WACvB,OAAO,IAAI,aAAa;CACtB,MAAM,WAAW,SAAS;CAE1B,MAAM,kBAAkB,kBAAkB,GAAG,EAC3C,SAAS,cAAc,OAAO,WAAW,OAAO,SAAS,CAAC,EAC5D,CAAC;CAED,MAAM,QAAQ,OAAO,YAAY,gBAAgB,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KACzD,OAAO,eAAe,mBAAmB,eAAe,CAC1D;CAOA,MAAM,WAAW,QAAQ,KAAK,iBAAiB;EAJ7C,WAAW,UAAU,MAAM,IAAI,SAAS,SAAS,KAAK,CAAC;EACvD,SAAS,OAAO,YAAY,MAAM,IAAI,SAAS,OAAO,OAAO,OAAO,CAAC;CAGlB,CAAC,CAAC,CAAC,KACtD,QAAQ,IAAI,mBAAmB,MAAM,SAAS,CAChD;CAEA,OAAO,OAAO,MAAM,MAAM,OAAO,eAAe,MAAM,QAAQ,CAAC;AACjE,CAAC,CACL,CACF"}
1
+ {"version":3,"file":"d1-totp.mjs","names":["DatabaseService"],"sources":["../../src/drizzle/d1-totp.ts"],"sourcesContent":["import type { D1Client } from \"@effect/sql-d1/D1Client\";\nimport type { LifecycleHooks } from \"@yielded/auth/Hooks\";\nimport { TotpUnavailable, TotpPersistence } from \"@yielded/auth/Totp\";\nimport type { AnyRelations } from \"drizzle-orm\";\nimport type { EffectSQLiteD1Database } from \"drizzle-orm/effect-d1\";\nimport type { AnySQLiteTable } from \"drizzle-orm/sqlite-core\";\nimport { Context, Effect } from \"effect\";\n\nimport { Database as DatabaseService } from \"./d1-database\";\nimport { makeD1Owner } from \"./d1-planning\";\nimport { D1BatchStatements } from \"./D1BatchStatements\";\nimport type { D1TotpMapping, TotpMapping, TotpMappingSource } from \"./totp-model\";\nimport { coordinateTargetTotp, makeTotpTarget, type TotpCoordinatorError } from \"./totp-target\";\ntype Database = EffectSQLiteD1Database<AnyRelations> & { readonly $client: D1Client };\ntype Table = AnySQLiteTable;\n\nconst configuration = {\n mode: \"batch\" as const,\n dialect: \"sqlite\" as const,\n locking: false,\n standaloneGuard: () => Effect.void,\n};\n\n/** Reads use a primary D1 session; observations and expiry are asserted in the same batch. */\nconst target = makeTotpTarget<DatabaseService, Database, Table, D1TotpMapping>(\n DatabaseService,\n configuration,\n);\n\nexport const { makeTotpPersistenceServices } = target;\n\nexport const coordinateTotpPersistence = <\n D extends Database,\n S extends Table,\n F extends Table,\n C extends Table,\n N,\n A,\n E,\n R,\n RSetup = never,\n DatabaseError = never,\n DatabaseRequirements = never,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: { readonly mapping: TotpMappingSource<TotpMapping<S, F, C, N> & D1TotpMapping, RSetup> },\n body: Effect.Effect<A, E, R>,\n): Effect.Effect<\n A,\n TotpCoordinatorError<E> | DatabaseError,\n Exclude<R, TotpPersistence | D1BatchStatements> | LifecycleHooks | RSetup | DatabaseRequirements\n> =>\n Effect.flatMap(acquire, (database) =>\n coordinateTargetTotp(\n database,\n options.mapping,\n configuration,\n (_transaction, services, append) =>\n Effect.gen(function* () {\n const original = services.totpPersistence;\n\n const nativeCollector = D1BatchStatements.of({\n append: (statement) => Effect.sync(() => append(statement)),\n });\n\n const owner = yield* makeD1Owner(TotpUnavailable.make({})).pipe(\n Effect.provideService(D1BatchStatements, nativeCollector),\n );\n\n const service: TotpPersistence[\"Service\"] = {\n snapshot: (input) => owner.run(original.snapshot(input)),\n mutate: (input, prepare) => owner.run(original.mutate(input, prepare)),\n };\n\n const provided = Context.make(TotpPersistence, service).pipe(\n Context.add(D1BatchStatements, owner.collector),\n );\n\n return yield* owner.close(Effect.provideContext(body, provided));\n }),\n ),\n );\n"],"mappings":";;;;;;;AAgBA,MAAM,gBAAgB;CACpB,MAAM;CACN,SAAS;CACT,SAAS;CACT,uBAAuB,OAAO;AAChC;AAQA,MAAa,EAAE,gCALA,eACbA,UACA,aAG6C;AAE/C,MAAa,6BAaX,SACA,SACA,SAMA,OAAO,QAAQ,UAAU,aACvB,qBACE,UACA,QAAQ,SACR,gBACC,cAAc,UAAU,WACvB,OAAO,IAAI,aAAa;CACtB,MAAM,WAAW,SAAS;CAE1B,MAAM,kBAAkB,kBAAkB,GAAG,EAC3C,SAAS,cAAc,OAAO,WAAW,OAAO,SAAS,CAAC,EAC5D,CAAC;CAED,MAAM,QAAQ,OAAO,YAAY,gBAAgB,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KACzD,OAAO,eAAe,mBAAmB,eAAe,CAC1D;CAOA,MAAM,WAAW,QAAQ,KAAK,iBAAiB;EAJ7C,WAAW,UAAU,MAAM,IAAI,SAAS,SAAS,KAAK,CAAC;EACvD,SAAS,OAAO,YAAY,MAAM,IAAI,SAAS,OAAO,OAAO,OAAO,CAAC;CAGlB,CAAC,CAAC,CAAC,KACtD,QAAQ,IAAI,mBAAmB,MAAM,SAAS,CAChD;CAEA,OAAO,OAAO,MAAM,MAAM,OAAO,eAAe,MAAM,QAAQ,CAAC;AACjE,CAAC,CACL,CACF"}
@@ -175,7 +175,8 @@ const prepareConflict = Effect.fn("Drizzle.prepareConflict")(function* (mapping,
175
175
  return row === void 0 ? prepare({ _tag: "Rejected" }, journal) : yield* prepareReplay(mapping, row, input.fingerprint, prepare);
176
176
  }));
177
177
  });
178
- const makeSqlEmailRegistrationAuthority = Effect.fn("makeSqlEmailRegistrationAuthority")(function* (database, mapping, configuration) {
178
+ const makeSqlEmailRegistrationAuthority = Effect.fn("makeSqlEmailRegistrationAuthority")(function* (mapping, configuration) {
179
+ const database = yield* CurrentEmailSql;
179
180
  const hooks = yield* LifecycleHooks;
180
181
  return {
181
182
  inspect: (input) => mapping.inspect(input).pipe(Effect.provideService(CurrentEmailSql, database), Effect.provideService(LifecycleHooks, hooks), translateFailure),
@@ -1 +1 @@
1
- {"version":3,"file":"email-registration.mjs","names":[],"sources":["../../src/drizzle/email-registration.ts"],"sourcesContent":["import {\n type PrepareEmailCommit,\n type EmailCommandId,\n type EmailRegistrationDecision,\n EmailUnavailable,\n} from \"@yielded/auth/Email\";\nimport {\n coordinateCommit,\n CurrentCommitJournal,\n hasCommitScope,\n type PreparedCommit,\n LifecycleHooks,\n HookConfigurationError,\n} from \"@yielded/auth/Hooks\";\nimport type { LoginIdentifier } from \"@yielded/auth/Identity\";\nimport { reportPersistenceFailure } from \"@yielded/auth/Persistence\";\nimport { type ProofCompletionPlan, ProofUnavailable } from \"@yielded/auth/Proofs\";\nimport type { TokenDigest } from \"@yielded/auth/Schema\";\nimport type { SecurityRevision } from \"@yielded/auth/Sessions\";\n/* oxlint-disable no-explicit-any -- registration plans bridge consumer-owned Drizzle rows. */\nimport { and, eq, isNull } from \"drizzle-orm\";\nimport { Cause, DateTime, Effect, Schema } from \"effect\";\n\nimport {\n type AnyEmailRegistrationMapping,\n requiredEmailRegistrationConstraints,\n} from \"./email-model\";\nimport { CurrentEmailSql, type EmailSqlDatabase, type EmailSqlQuery } from \"./email-sql\";\nimport { column, isMappedConstraintConflict, PersistenceMappingError } from \"./model\";\nimport {\n CurrentProofSql,\n completeProofPlanIn,\n type ProofSqlConfiguration,\n type ProofSqlDatabase,\n} from \"./proof-sql\";\n\ntype Mapping<Registration> = AnyEmailRegistrationMapping<Registration>;\nconst unavailable = () => EmailUnavailable.make({});\n\nconst translateFailure = <A, E, R>(\n effect: Effect.Effect<A, E, R>,\n): Effect.Effect<A, EmailUnavailable, R> =>\n reportPersistenceFailure(\n effect,\n (error) =>\n Schema.is(EmailUnavailable)(error) ||\n Schema.is(ProofUnavailable)(error) ||\n Schema.is(HookConfigurationError)(error),\n ).pipe(Effect.catchCause((cause) => Effect.failCause(Cause.map(cause, () => unavailable()))));\n\nconst nowMillis = Effect.map(DateTime.now, DateTime.toEpochMillis);\n\nexport interface EmailRegistrationAuthority<Registration> {\n readonly inspect: (input: {\n readonly identifier: LoginIdentifier;\n readonly registration: Registration;\n }) => Effect.Effect<\n { readonly fingerprint: TokenDigest; readonly eligible: boolean },\n EmailUnavailable\n >;\n readonly registerWithProof: <A>(\n input: {\n readonly moduleId: string;\n readonly commandId: EmailCommandId;\n readonly identifier: LoginIdentifier;\n readonly registration: Registration;\n readonly fingerprint: TokenDigest;\n readonly completion: ProofCompletionPlan;\n },\n prepare: PrepareEmailCommit<EmailRegistrationDecision, A>,\n ) => Effect.Effect<PreparedCommit<A>, EmailUnavailable>;\n}\n\nexport interface EmailRegistrationConfiguration {\n readonly mode: \"interactive\" | \"synchronous\";\n readonly locking: boolean;\n readonly standaloneGuard: Effect.Effect<void, EmailUnavailable>;\n readonly coordinated?: boolean;\n readonly generatedSubjectRows: (query: EmailSqlQuery) => EmailSqlQuery;\n readonly proof: {\n readonly mapping: any;\n readonly configuration: ProofSqlConfiguration;\n };\n}\n\nconst selectRows = (query: EmailSqlQuery, locking: boolean) =>\n locking && typeof query.for === \"function\" ? query.for(\"update\") : query;\n\nconst sameIdentifier = (left: LoginIdentifier, right: LoginIdentifier) =>\n left.namespace === right.namespace && left.value === right.value;\n\nconst validConstraints = <Registration>(mapping: Mapping<Registration>) => {\n if (\n mapping.constraints.request !== requiredEmailRegistrationConstraints.request ||\n mapping.constraints.pendingReference !== requiredEmailRegistrationConstraints.pendingReference\n )\n return false;\n if (mapping.mode === \"pending\") return true;\n\n return Object.entries(requiredEmailRegistrationConstraints).every(\n ([key, value]) =>\n mapping.constraints[key as keyof typeof requiredEmailRegistrationConstraints] === value,\n );\n};\n\nconst allocate = <A>(\n mode: EmailRegistrationConfiguration[\"mode\"],\n asynchronous: Effect.Effect<A, PersistenceMappingError> | undefined,\n synchronous: (() => A) | undefined,\n) => {\n if (mode === \"synchronous\")\n return synchronous === undefined\n ? Effect.fail(unavailable())\n : Effect.try({\n try: synchronous,\n catch: (cause) => new PersistenceMappingError({ operation: \"mapping\", cause }),\n });\n if (asynchronous !== undefined) return asynchronous;\n\n return synchronous === undefined\n ? Effect.fail(unavailable())\n : Effect.try({\n try: synchronous,\n catch: (cause) => new PersistenceMappingError({ operation: \"mapping\", cause }),\n });\n};\n\nconst registrationRows = Effect.fn(\"Drizzle.registrationRows\")(function* <Registration>(\n mapping: Mapping<Registration>,\n moduleId: string,\n commandId: string,\n locking: boolean,\n) {\n const database = yield* CurrentEmailSql;\n\n const module = column(mapping.registration.table, mapping.registration.moduleId);\n const command = column(mapping.registration.table, mapping.registration.commandId);\n\n return yield* selectRows(\n database\n .select()\n .from(mapping.registration.table)\n .where(and(eq(module, moduleId), eq(command, commandId)))\n .limit(1),\n locking,\n );\n});\n\nconst owned = <A, E, R>(\n database: EmailSqlDatabase,\n configuration: EmailRegistrationConfiguration,\n body: Effect.Effect<A, E, R>,\n) => {\n const run = coordinateCommit(\n () =>\n database.transaction((transaction) =>\n body.pipe(\n Effect.provideService(CurrentEmailSql, transaction),\n Effect.provideService(CurrentProofSql, transaction as unknown as ProofSqlDatabase),\n ),\n ),\n { mode: configuration.mode },\n ).pipe(Effect.map((result) => result.value));\n\n return configuration.coordinated !== true\n ? Effect.gen(function* () {\n if (yield* hasCommitScope) return yield* unavailable();\n yield* configuration.standaloneGuard;\n\n return yield* run;\n })\n : run;\n};\n\nconst completionMatches = <Registration>(\n mapping: Mapping<Registration>,\n input: {\n readonly moduleId: string;\n readonly identifier: LoginIdentifier;\n readonly completion: ProofCompletionPlan;\n },\n) => {\n const completion = input.completion.input;\n\n return (\n completion.moduleId === `${input.moduleId}/registration` &&\n completion.purpose === \"email-code-registration\" &&\n completion.binding._tag === \"Identifier\" &&\n sameIdentifier(completion.binding.identifier, input.identifier) &&\n validConstraints(mapping)\n );\n};\n\nconst prepareReplay = Effect.fn(\"DrizzleEmailRegistration.prepareReplay\")(function* <\n Registration,\n A,\n>(\n mapping: Mapping<Registration>,\n row: any,\n fingerprint: TokenDigest,\n prepare: PrepareEmailCommit<EmailRegistrationDecision, A>,\n) {\n const journal = yield* CurrentCommitJournal;\n\n if (row[mapping.registration.fingerprint] !== fingerprint)\n return prepare({ _tag: \"Rejected\" }, journal);\n\n return prepare(yield* mapping.registration.decodeReplay(row), journal);\n});\n\nconst registerIn = Effect.fn(\"DrizzleEmailRegistration.registerIn\")(function* <Registration, A>(\n mapping: Mapping<Registration>,\n configuration: EmailRegistrationConfiguration,\n input: {\n readonly moduleId: string;\n readonly commandId: string;\n readonly identifier: LoginIdentifier;\n readonly registration: Registration;\n readonly fingerprint: TokenDigest;\n readonly completion: ProofCompletionPlan;\n },\n inspected: { readonly fingerprint: TokenDigest; readonly eligible: boolean },\n allocated: {\n readonly credentialId?: string;\n readonly securityRevision?: SecurityRevision;\n readonly identifierRevision?: SecurityRevision;\n readonly credentialRevision?: SecurityRevision;\n readonly nativeSubjectId?: unknown;\n readonly pendingReference?: string;\n },\n prepare: PrepareEmailCommit<EmailRegistrationDecision, A>,\n) {\n const journal = yield* CurrentCommitJournal;\n\n const existing = (yield* registrationRows(\n mapping,\n input.moduleId,\n input.commandId,\n configuration.locking,\n ))[0];\n\n if (existing !== undefined)\n return yield* prepareReplay(mapping, existing, input.fingerprint, prepare);\n if (!completionMatches(mapping, input)) return prepare({ _tag: \"Rejected\" }, journal);\n if (!inspected.eligible || inspected.fingerprint !== input.fingerprint)\n return prepare({ _tag: \"Rejected\" }, journal);\n const now = yield* nowMillis;\n\n const intent = {\n moduleId: input.moduleId,\n commandId: input.commandId,\n identifier: Object.freeze({ ...input.identifier }),\n registration: input.registration,\n fingerprint: input.fingerprint,\n completion: Object.freeze({\n moduleId: input.completion.input.moduleId,\n purpose: input.completion.input.purpose,\n continuationId: input.completion.input.continuationId,\n binding: input.completion.input.binding,\n }),\n };\n\n let decision: EmailRegistrationDecision | undefined;\n let nativeSubjectId = allocated.nativeSubjectId;\n\n const protectedMutation = Effect.gen(function* () {\n const transaction = yield* CurrentEmailSql;\n\n if (mapping.mode === \"pending\") {\n if (allocated.pendingReference === undefined) return false;\n decision = { _tag: \"ProvisioningPending\", reference: allocated.pendingReference };\n yield* transaction.insert(mapping.registration.table).values(\n mapping.registration.encodeInsert(intent, {\n state: \"pending\",\n pendingReference: allocated.pendingReference,\n retentionUntilMillis: now + mapping.retentionMillis,\n }),\n );\n } else {\n if (\n allocated.credentialId === undefined ||\n allocated.securityRevision === undefined ||\n allocated.identifierRevision === undefined ||\n allocated.credentialRevision === undefined\n )\n return false;\n\n const subjectInsert = transaction.insert(mapping.subject.table).values(\n mapping.provisioning.encodeSubjectInsert(intent, {\n nativeSubjectId,\n securityRevision: allocated.securityRevision,\n }),\n );\n\n if (mapping.provisioning.idMode === \"generated\") {\n const rows = yield* configuration.generatedSubjectRows(subjectInsert);\n\n nativeSubjectId = yield* mapping.provisioning.decodeGeneratedId(rows);\n } else yield* subjectInsert;\n if (nativeSubjectId === undefined) return false;\n yield* transaction.insert(mapping.identifier.table).values(\n mapping.identifier.encodeVerifiedInsert({\n identifier: input.identifier,\n subjectId: nativeSubjectId,\n verifiedAtMillis: now,\n bindingRevision: allocated.identifierRevision,\n }),\n );\n yield* transaction.insert(mapping.credential.table).values(\n mapping.credential.encodeVerifiedInsert({\n moduleId: input.moduleId,\n subjectId: nativeSubjectId,\n credentialId: allocated.credentialId,\n identifier: input.identifier,\n credentialRevision: allocated.credentialRevision,\n }),\n );\n yield* transaction.insert(mapping.authorityCredential.table).values(\n mapping.authorityCredential.encodeInsert({\n subjectId: nativeSubjectId,\n credentialId: allocated.credentialId,\n revision: allocated.credentialRevision,\n }),\n );\n yield* transaction.insert(mapping.registration.table).values(\n mapping.registration.encodeInsert(intent, {\n state: \"registered\",\n nativeSubjectId,\n retentionUntilMillis: now + mapping.retentionMillis,\n }),\n );\n decision = { _tag: \"Registered\" };\n }\n const stored = (yield* registrationRows(mapping, input.moduleId, input.commandId, false))[0];\n const registrationModule = column(mapping.registration.table, mapping.registration.moduleId);\n const registrationCommand = column(mapping.registration.table, mapping.registration.commandId);\n\n const registrationFingerprint = column(\n mapping.registration.table,\n mapping.registration.fingerprint,\n );\n\n const registrationState = column(mapping.registration.table, mapping.registration.state);\n const registrationSubject = column(mapping.registration.table, mapping.registration.subjectId);\n\n const registrationReference = column(\n mapping.registration.table,\n mapping.registration.pendingReference,\n );\n\n const registrationRetention = column(\n mapping.registration.table,\n mapping.registration.retentionUntil,\n );\n\n const exactRegistration = yield* selectRows(\n transaction\n .select()\n .from(mapping.registration.table)\n .where(\n and(\n eq(registrationModule, input.moduleId),\n eq(registrationCommand, input.commandId),\n eq(registrationFingerprint, input.fingerprint),\n eq(registrationState, mapping.mode === \"pending\" ? \"pending\" : \"registered\"),\n eq(registrationRetention, mapping.encodeInstant(now + mapping.retentionMillis)),\n mapping.mode === \"pending\"\n ? and(\n eq(registrationReference, allocated.pendingReference!),\n isNull(registrationSubject),\n )\n : and(eq(registrationSubject, nativeSubjectId), isNull(registrationReference)),\n ),\n )\n .limit(1),\n false,\n );\n\n if (mapping.mode === \"atomic\" && nativeSubjectId !== undefined) {\n const subjectId = column(mapping.subject.table, mapping.subject.id);\n const identifierNamespace = column(mapping.identifier.table, mapping.identifier.namespace);\n const identifierValue = column(mapping.identifier.table, mapping.identifier.value);\n const identifierSubject = column(mapping.identifier.table, mapping.identifier.subjectId);\n const identifierVerifiedAt = column(mapping.identifier.table, mapping.identifier.verifiedAt);\n const credentialModule = column(mapping.credential.table, mapping.credential.moduleId);\n const credentialId = column(mapping.credential.table, mapping.credential.credentialId);\n const credentialSubject = column(mapping.credential.table, mapping.credential.subjectId);\n\n const credentialNamespace = column(\n mapping.credential.table,\n mapping.credential.identifierNamespace,\n );\n\n const credentialValue = column(mapping.credential.table, mapping.credential.identifierValue);\n\n const authoritySubject = column(\n mapping.authorityCredential.table,\n mapping.authorityCredential.subjectId,\n );\n\n const authorityId = column(\n mapping.authorityCredential.table,\n mapping.authorityCredential.credentialId,\n );\n\n const subject = (yield* selectRows(\n transaction\n .select()\n .from(mapping.subject.table)\n .where(eq(subjectId, nativeSubjectId))\n .limit(1),\n false,\n ))[0];\n\n const identifier = (yield* selectRows(\n transaction\n .select()\n .from(mapping.identifier.table)\n .where(\n and(\n eq(identifierNamespace, input.identifier.namespace),\n eq(identifierValue, input.identifier.value),\n eq(identifierSubject, nativeSubjectId),\n eq(identifierVerifiedAt, mapping.encodeInstant(now)),\n ),\n )\n .limit(1),\n false,\n ))[0];\n\n const credential = (yield* selectRows(\n transaction\n .select()\n .from(mapping.credential.table)\n .where(\n and(\n eq(credentialModule, input.moduleId),\n eq(credentialId, allocated.credentialId!),\n eq(credentialSubject, nativeSubjectId),\n eq(credentialNamespace, input.identifier.namespace),\n eq(credentialValue, input.identifier.value),\n ),\n )\n .limit(1),\n false,\n ))[0];\n\n const authority = (yield* selectRows(\n transaction\n .select()\n .from(mapping.authorityCredential.table)\n .where(\n and(eq(authoritySubject, nativeSubjectId), eq(authorityId, allocated.credentialId!)),\n )\n .limit(1),\n false,\n ))[0];\n\n if (\n subject === undefined ||\n !mapping.subject.isActiveStatus(subject[mapping.subject.status]) ||\n subject[mapping.subject.securityRevision] !== allocated.securityRevision ||\n identifier === undefined ||\n identifier[mapping.identifier.bindingRevision] !== allocated.identifierRevision ||\n !mapping.identifier.isCurrent(identifier) ||\n credential === undefined ||\n credential[mapping.credential.credentialRevision] !== allocated.credentialRevision ||\n !mapping.credential.isActiveStatus(credential[mapping.credential.status]) ||\n authority === undefined ||\n authority[mapping.authorityCredential.revision] !== allocated.credentialRevision ||\n !mapping.authorityCredential.isActiveStatus(authority[mapping.authorityCredential.status])\n )\n return false;\n }\n\n return (\n stored !== undefined &&\n exactRegistration.length === 1 &&\n stored[mapping.registration.fingerprint] === input.fingerprint &&\n (mapping.mode === \"pending\" ||\n (nativeSubjectId !== undefined &&\n stored[mapping.registration.subjectId] !== null &&\n mapping.subjectId.equals(stored[mapping.registration.subjectId], nativeSubjectId)))\n );\n });\n\n let receipt: PreparedCommit<A> | undefined;\n\n yield* completeProofPlanIn(\n configuration.proof.mapping,\n configuration.proof.configuration,\n input.completion,\n protectedMutation,\n (completionDecision) => {\n receipt = prepare(\n completionDecision === \"completed\" && decision !== undefined\n ? decision\n : { _tag: \"Rejected\" },\n journal,\n );\n\n return completionDecision;\n },\n );\n\n return receipt ?? prepare({ _tag: \"Rejected\" }, journal);\n});\n\nconst prepareConflict = Effect.fn(\"Drizzle.prepareConflict\")(function* <Registration, A>(\n mapping: Mapping<Registration>,\n configuration: EmailRegistrationConfiguration,\n input: {\n readonly moduleId: string;\n readonly commandId: string;\n readonly fingerprint: TokenDigest;\n },\n prepare: PrepareEmailCommit<EmailRegistrationDecision, A>,\n) {\n const database = yield* CurrentEmailSql;\n\n return yield* owned(\n database,\n configuration,\n Effect.gen(function* () {\n const journal = yield* CurrentCommitJournal;\n\n const row = (yield* registrationRows(\n mapping,\n input.moduleId,\n input.commandId,\n configuration.locking,\n ))[0];\n\n return row === undefined\n ? prepare({ _tag: \"Rejected\" }, journal)\n : yield* prepareReplay(mapping, row, input.fingerprint, prepare);\n }),\n );\n});\n\nexport const makeSqlEmailRegistrationAuthority = Effect.fn(\"makeSqlEmailRegistrationAuthority\")(\n function* <Registration>(\n database: EmailSqlDatabase,\n mapping: Mapping<Registration>,\n configuration: EmailRegistrationConfiguration,\n ): Effect.fn.Return<EmailRegistrationAuthority<Registration>, never, LifecycleHooks> {\n const hooks = yield* LifecycleHooks;\n\n return {\n inspect: (input) =>\n mapping\n .inspect(input)\n .pipe(\n Effect.provideService(CurrentEmailSql, database),\n Effect.provideService(LifecycleHooks, hooks),\n translateFailure,\n ),\n registerWithProof: (input, prepare) =>\n Effect.gen(function* () {\n if (!validConstraints(mapping)) return yield* unavailable();\n\n const snapshot = (registration: Registration) =>\n configuration.mode === \"synchronous\" && configuration.coordinated === true\n ? mapping.snapshotRegistrationSync === undefined\n ? Effect.fail(unavailable())\n : Effect.try({\n try: () => mapping.snapshotRegistrationSync!(registration),\n catch: (cause) => new PersistenceMappingError({ operation: \"mapping\", cause }),\n })\n : mapping.snapshotRegistration(registration);\n\n const storedRegistration = yield* snapshot(input.registration);\n const inspectionRegistration = yield* snapshot(input.registration);\n\n const capturedInput = Object.freeze({\n ...input,\n identifier: Object.freeze({ ...input.identifier }),\n registration: storedRegistration,\n });\n\n // Registration decoding and fingerprinting may suspend (for example while\n // hashing a detached Registration value). Finish that work before a\n // synchronous Durable Object transaction owner is entered.\n const inspectInput = {\n identifier: capturedInput.identifier,\n registration: inspectionRegistration,\n };\n\n const inspected =\n configuration.mode === \"synchronous\" && configuration.coordinated === true\n ? mapping.inspectSync === undefined\n ? yield* unavailable()\n : yield* Effect.try({\n try: () => mapping.inspectSync!(inspectInput),\n catch: (cause) => new PersistenceMappingError({ operation: \"mapping\", cause }),\n })\n : yield* mapping.inspect(inspectInput);\n\n const atomic = mapping.mode === \"atomic\";\n\n const credentialId = atomic\n ? yield* allocate(\n configuration.mode,\n mapping.allocateCredentialId,\n mapping.allocateCredentialIdSync,\n )\n : undefined;\n\n const securityRevision = atomic\n ? yield* allocate(\n configuration.mode,\n mapping.allocateRevision,\n mapping.allocateRevisionSync,\n )\n : undefined;\n\n const identifierRevision = atomic\n ? yield* allocate(\n configuration.mode,\n mapping.allocateRevision,\n mapping.allocateRevisionSync,\n )\n : undefined;\n\n const credentialRevision = atomic\n ? yield* allocate(\n configuration.mode,\n mapping.allocateRevision,\n mapping.allocateRevisionSync,\n )\n : undefined;\n\n const nativeSubjectId =\n atomic && mapping.provisioning.idMode !== \"generated\"\n ? yield* allocate(\n configuration.mode,\n mapping.provisioning.allocateSubjectId,\n mapping.provisioning.allocateSubjectIdSync,\n )\n : undefined;\n\n const pendingReference =\n mapping.mode === \"pending\"\n ? yield* allocate(\n configuration.mode,\n mapping.allocatePendingReference,\n mapping.allocatePendingReferenceSync,\n )\n : undefined;\n\n const run = owned(\n database,\n configuration,\n Effect.gen(function* () {\n return yield* registerIn(\n mapping,\n configuration,\n capturedInput,\n inspected,\n {\n ...(credentialId === undefined ? {} : { credentialId }),\n ...(securityRevision === undefined ? {} : { securityRevision }),\n ...(identifierRevision === undefined ? {} : { identifierRevision }),\n ...(credentialRevision === undefined ? {} : { credentialRevision }),\n ...(nativeSubjectId === undefined ? {} : { nativeSubjectId }),\n ...(pendingReference === undefined ? {} : { pendingReference }),\n },\n prepare,\n );\n }),\n );\n\n return yield* run.pipe(\n Effect.catchCause((cause) => {\n const request =\n cause.reasons.every(Cause.isFailReason) &&\n isMappedConstraintConflict(mapping.isRequestConflict, cause);\n\n const conflict =\n mapping.mode === \"atomic\" &&\n ((cause.reasons.every(Cause.isFailReason) &&\n isMappedConstraintConflict(mapping.isIdentifierConflict, cause)) ||\n (cause.reasons.every(Cause.isFailReason) &&\n isMappedConstraintConflict(mapping.isCredentialConflict, cause)));\n\n return request || conflict\n ? prepareConflict(mapping, configuration, capturedInput, prepare)\n : Effect.failCause(cause);\n }),\n );\n }).pipe(\n Effect.provideService(CurrentEmailSql, database),\n Effect.provideService(LifecycleHooks, hooks),\n translateFailure,\n ),\n };\n },\n);\n"],"mappings":"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"}
1
+ {"version":3,"file":"email-registration.mjs","names":[],"sources":["../../src/drizzle/email-registration.ts"],"sourcesContent":["import {\n type PrepareEmailCommit,\n type EmailCommandId,\n type EmailRegistrationDecision,\n EmailUnavailable,\n} from \"@yielded/auth/Email\";\nimport {\n coordinateCommit,\n CurrentCommitJournal,\n hasCommitScope,\n type PreparedCommit,\n LifecycleHooks,\n HookConfigurationError,\n} from \"@yielded/auth/Hooks\";\nimport type { LoginIdentifier } from \"@yielded/auth/Identity\";\nimport { reportPersistenceFailure } from \"@yielded/auth/Persistence\";\nimport { type ProofCompletionPlan, ProofUnavailable } from \"@yielded/auth/Proofs\";\nimport type { TokenDigest } from \"@yielded/auth/Schema\";\nimport type { SecurityRevision } from \"@yielded/auth/Sessions\";\n/* oxlint-disable no-explicit-any -- registration plans bridge consumer-owned Drizzle rows. */\nimport { and, eq, isNull } from \"drizzle-orm\";\nimport { Cause, DateTime, Effect, Schema } from \"effect\";\n\nimport {\n type AnyEmailRegistrationMapping,\n requiredEmailRegistrationConstraints,\n} from \"./email-model\";\nimport { CurrentEmailSql, type EmailSqlDatabase, type EmailSqlQuery } from \"./email-sql\";\nimport { column, isMappedConstraintConflict, PersistenceMappingError } from \"./model\";\nimport {\n CurrentProofSql,\n completeProofPlanIn,\n type ProofSqlConfiguration,\n type ProofSqlDatabase,\n} from \"./proof-sql\";\n\ntype Mapping<Registration> = AnyEmailRegistrationMapping<Registration>;\nconst unavailable = () => EmailUnavailable.make({});\n\nconst translateFailure = <A, E, R>(\n effect: Effect.Effect<A, E, R>,\n): Effect.Effect<A, EmailUnavailable, R> =>\n reportPersistenceFailure(\n effect,\n (error) =>\n Schema.is(EmailUnavailable)(error) ||\n Schema.is(ProofUnavailable)(error) ||\n Schema.is(HookConfigurationError)(error),\n ).pipe(Effect.catchCause((cause) => Effect.failCause(Cause.map(cause, () => unavailable()))));\n\nconst nowMillis = Effect.map(DateTime.now, DateTime.toEpochMillis);\n\nexport interface EmailRegistrationAuthority<Registration> {\n readonly inspect: (input: {\n readonly identifier: LoginIdentifier;\n readonly registration: Registration;\n }) => Effect.Effect<\n { readonly fingerprint: TokenDigest; readonly eligible: boolean },\n EmailUnavailable\n >;\n readonly registerWithProof: <A>(\n input: {\n readonly moduleId: string;\n readonly commandId: EmailCommandId;\n readonly identifier: LoginIdentifier;\n readonly registration: Registration;\n readonly fingerprint: TokenDigest;\n readonly completion: ProofCompletionPlan;\n },\n prepare: PrepareEmailCommit<EmailRegistrationDecision, A>,\n ) => Effect.Effect<PreparedCommit<A>, EmailUnavailable>;\n}\n\nexport interface EmailRegistrationConfiguration {\n readonly mode: \"interactive\" | \"synchronous\";\n readonly locking: boolean;\n readonly standaloneGuard: Effect.Effect<void, EmailUnavailable>;\n readonly coordinated?: boolean;\n readonly generatedSubjectRows: (query: EmailSqlQuery) => EmailSqlQuery;\n readonly proof: {\n readonly mapping: any;\n readonly configuration: ProofSqlConfiguration;\n };\n}\n\nconst selectRows = (query: EmailSqlQuery, locking: boolean) =>\n locking && typeof query.for === \"function\" ? query.for(\"update\") : query;\n\nconst sameIdentifier = (left: LoginIdentifier, right: LoginIdentifier) =>\n left.namespace === right.namespace && left.value === right.value;\n\nconst validConstraints = <Registration>(mapping: Mapping<Registration>) => {\n if (\n mapping.constraints.request !== requiredEmailRegistrationConstraints.request ||\n mapping.constraints.pendingReference !== requiredEmailRegistrationConstraints.pendingReference\n )\n return false;\n if (mapping.mode === \"pending\") return true;\n\n return Object.entries(requiredEmailRegistrationConstraints).every(\n ([key, value]) =>\n mapping.constraints[key as keyof typeof requiredEmailRegistrationConstraints] === value,\n );\n};\n\nconst allocate = <A>(\n mode: EmailRegistrationConfiguration[\"mode\"],\n asynchronous: Effect.Effect<A, PersistenceMappingError> | undefined,\n synchronous: (() => A) | undefined,\n) => {\n if (mode === \"synchronous\")\n return synchronous === undefined\n ? Effect.fail(unavailable())\n : Effect.try({\n try: synchronous,\n catch: (cause) => new PersistenceMappingError({ operation: \"mapping\", cause }),\n });\n if (asynchronous !== undefined) return asynchronous;\n\n return synchronous === undefined\n ? Effect.fail(unavailable())\n : Effect.try({\n try: synchronous,\n catch: (cause) => new PersistenceMappingError({ operation: \"mapping\", cause }),\n });\n};\n\nconst registrationRows = Effect.fn(\"Drizzle.registrationRows\")(function* <Registration>(\n mapping: Mapping<Registration>,\n moduleId: string,\n commandId: string,\n locking: boolean,\n) {\n const database = yield* CurrentEmailSql;\n\n const module = column(mapping.registration.table, mapping.registration.moduleId);\n const command = column(mapping.registration.table, mapping.registration.commandId);\n\n return yield* selectRows(\n database\n .select()\n .from(mapping.registration.table)\n .where(and(eq(module, moduleId), eq(command, commandId)))\n .limit(1),\n locking,\n );\n});\n\nconst owned = <A, E, R>(\n database: EmailSqlDatabase,\n configuration: EmailRegistrationConfiguration,\n body: Effect.Effect<A, E, R>,\n) => {\n const run = coordinateCommit(\n () =>\n database.transaction((transaction) =>\n body.pipe(\n Effect.provideService(CurrentEmailSql, transaction),\n Effect.provideService(CurrentProofSql, transaction as unknown as ProofSqlDatabase),\n ),\n ),\n { mode: configuration.mode },\n ).pipe(Effect.map((result) => result.value));\n\n return configuration.coordinated !== true\n ? Effect.gen(function* () {\n if (yield* hasCommitScope) return yield* unavailable();\n yield* configuration.standaloneGuard;\n\n return yield* run;\n })\n : run;\n};\n\nconst completionMatches = <Registration>(\n mapping: Mapping<Registration>,\n input: {\n readonly moduleId: string;\n readonly identifier: LoginIdentifier;\n readonly completion: ProofCompletionPlan;\n },\n) => {\n const completion = input.completion.input;\n\n return (\n completion.moduleId === `${input.moduleId}/registration` &&\n completion.purpose === \"email-code-registration\" &&\n completion.binding._tag === \"Identifier\" &&\n sameIdentifier(completion.binding.identifier, input.identifier) &&\n validConstraints(mapping)\n );\n};\n\nconst prepareReplay = Effect.fn(\"DrizzleEmailRegistration.prepareReplay\")(function* <\n Registration,\n A,\n>(\n mapping: Mapping<Registration>,\n row: any,\n fingerprint: TokenDigest,\n prepare: PrepareEmailCommit<EmailRegistrationDecision, A>,\n) {\n const journal = yield* CurrentCommitJournal;\n\n if (row[mapping.registration.fingerprint] !== fingerprint)\n return prepare({ _tag: \"Rejected\" }, journal);\n\n return prepare(yield* mapping.registration.decodeReplay(row), journal);\n});\n\nconst registerIn = Effect.fn(\"DrizzleEmailRegistration.registerIn\")(function* <Registration, A>(\n mapping: Mapping<Registration>,\n configuration: EmailRegistrationConfiguration,\n input: {\n readonly moduleId: string;\n readonly commandId: string;\n readonly identifier: LoginIdentifier;\n readonly registration: Registration;\n readonly fingerprint: TokenDigest;\n readonly completion: ProofCompletionPlan;\n },\n inspected: { readonly fingerprint: TokenDigest; readonly eligible: boolean },\n allocated: {\n readonly credentialId?: string;\n readonly securityRevision?: SecurityRevision;\n readonly identifierRevision?: SecurityRevision;\n readonly credentialRevision?: SecurityRevision;\n readonly nativeSubjectId?: unknown;\n readonly pendingReference?: string;\n },\n prepare: PrepareEmailCommit<EmailRegistrationDecision, A>,\n) {\n const journal = yield* CurrentCommitJournal;\n\n const existing = (yield* registrationRows(\n mapping,\n input.moduleId,\n input.commandId,\n configuration.locking,\n ))[0];\n\n if (existing !== undefined)\n return yield* prepareReplay(mapping, existing, input.fingerprint, prepare);\n if (!completionMatches(mapping, input)) return prepare({ _tag: \"Rejected\" }, journal);\n if (!inspected.eligible || inspected.fingerprint !== input.fingerprint)\n return prepare({ _tag: \"Rejected\" }, journal);\n const now = yield* nowMillis;\n\n const intent = {\n moduleId: input.moduleId,\n commandId: input.commandId,\n identifier: Object.freeze({ ...input.identifier }),\n registration: input.registration,\n fingerprint: input.fingerprint,\n completion: Object.freeze({\n moduleId: input.completion.input.moduleId,\n purpose: input.completion.input.purpose,\n continuationId: input.completion.input.continuationId,\n binding: input.completion.input.binding,\n }),\n };\n\n let decision: EmailRegistrationDecision | undefined;\n let nativeSubjectId = allocated.nativeSubjectId;\n\n const protectedMutation = Effect.gen(function* () {\n const transaction = yield* CurrentEmailSql;\n\n if (mapping.mode === \"pending\") {\n if (allocated.pendingReference === undefined) return false;\n decision = { _tag: \"ProvisioningPending\", reference: allocated.pendingReference };\n yield* transaction.insert(mapping.registration.table).values(\n mapping.registration.encodeInsert(intent, {\n state: \"pending\",\n pendingReference: allocated.pendingReference,\n retentionUntilMillis: now + mapping.retentionMillis,\n }),\n );\n } else {\n if (\n allocated.credentialId === undefined ||\n allocated.securityRevision === undefined ||\n allocated.identifierRevision === undefined ||\n allocated.credentialRevision === undefined\n )\n return false;\n\n const subjectInsert = transaction.insert(mapping.subject.table).values(\n mapping.provisioning.encodeSubjectInsert(intent, {\n nativeSubjectId,\n securityRevision: allocated.securityRevision,\n }),\n );\n\n if (mapping.provisioning.idMode === \"generated\") {\n const rows = yield* configuration.generatedSubjectRows(subjectInsert);\n\n nativeSubjectId = yield* mapping.provisioning.decodeGeneratedId(rows);\n } else yield* subjectInsert;\n if (nativeSubjectId === undefined) return false;\n yield* transaction.insert(mapping.identifier.table).values(\n mapping.identifier.encodeVerifiedInsert({\n identifier: input.identifier,\n subjectId: nativeSubjectId,\n verifiedAtMillis: now,\n bindingRevision: allocated.identifierRevision,\n }),\n );\n yield* transaction.insert(mapping.credential.table).values(\n mapping.credential.encodeVerifiedInsert({\n moduleId: input.moduleId,\n subjectId: nativeSubjectId,\n credentialId: allocated.credentialId,\n identifier: input.identifier,\n credentialRevision: allocated.credentialRevision,\n }),\n );\n yield* transaction.insert(mapping.authorityCredential.table).values(\n mapping.authorityCredential.encodeInsert({\n subjectId: nativeSubjectId,\n credentialId: allocated.credentialId,\n revision: allocated.credentialRevision,\n }),\n );\n yield* transaction.insert(mapping.registration.table).values(\n mapping.registration.encodeInsert(intent, {\n state: \"registered\",\n nativeSubjectId,\n retentionUntilMillis: now + mapping.retentionMillis,\n }),\n );\n decision = { _tag: \"Registered\" };\n }\n const stored = (yield* registrationRows(mapping, input.moduleId, input.commandId, false))[0];\n const registrationModule = column(mapping.registration.table, mapping.registration.moduleId);\n const registrationCommand = column(mapping.registration.table, mapping.registration.commandId);\n\n const registrationFingerprint = column(\n mapping.registration.table,\n mapping.registration.fingerprint,\n );\n\n const registrationState = column(mapping.registration.table, mapping.registration.state);\n const registrationSubject = column(mapping.registration.table, mapping.registration.subjectId);\n\n const registrationReference = column(\n mapping.registration.table,\n mapping.registration.pendingReference,\n );\n\n const registrationRetention = column(\n mapping.registration.table,\n mapping.registration.retentionUntil,\n );\n\n const exactRegistration = yield* selectRows(\n transaction\n .select()\n .from(mapping.registration.table)\n .where(\n and(\n eq(registrationModule, input.moduleId),\n eq(registrationCommand, input.commandId),\n eq(registrationFingerprint, input.fingerprint),\n eq(registrationState, mapping.mode === \"pending\" ? \"pending\" : \"registered\"),\n eq(registrationRetention, mapping.encodeInstant(now + mapping.retentionMillis)),\n mapping.mode === \"pending\"\n ? and(\n eq(registrationReference, allocated.pendingReference!),\n isNull(registrationSubject),\n )\n : and(eq(registrationSubject, nativeSubjectId), isNull(registrationReference)),\n ),\n )\n .limit(1),\n false,\n );\n\n if (mapping.mode === \"atomic\" && nativeSubjectId !== undefined) {\n const subjectId = column(mapping.subject.table, mapping.subject.id);\n const identifierNamespace = column(mapping.identifier.table, mapping.identifier.namespace);\n const identifierValue = column(mapping.identifier.table, mapping.identifier.value);\n const identifierSubject = column(mapping.identifier.table, mapping.identifier.subjectId);\n const identifierVerifiedAt = column(mapping.identifier.table, mapping.identifier.verifiedAt);\n const credentialModule = column(mapping.credential.table, mapping.credential.moduleId);\n const credentialId = column(mapping.credential.table, mapping.credential.credentialId);\n const credentialSubject = column(mapping.credential.table, mapping.credential.subjectId);\n\n const credentialNamespace = column(\n mapping.credential.table,\n mapping.credential.identifierNamespace,\n );\n\n const credentialValue = column(mapping.credential.table, mapping.credential.identifierValue);\n\n const authoritySubject = column(\n mapping.authorityCredential.table,\n mapping.authorityCredential.subjectId,\n );\n\n const authorityId = column(\n mapping.authorityCredential.table,\n mapping.authorityCredential.credentialId,\n );\n\n const subject = (yield* selectRows(\n transaction\n .select()\n .from(mapping.subject.table)\n .where(eq(subjectId, nativeSubjectId))\n .limit(1),\n false,\n ))[0];\n\n const identifier = (yield* selectRows(\n transaction\n .select()\n .from(mapping.identifier.table)\n .where(\n and(\n eq(identifierNamespace, input.identifier.namespace),\n eq(identifierValue, input.identifier.value),\n eq(identifierSubject, nativeSubjectId),\n eq(identifierVerifiedAt, mapping.encodeInstant(now)),\n ),\n )\n .limit(1),\n false,\n ))[0];\n\n const credential = (yield* selectRows(\n transaction\n .select()\n .from(mapping.credential.table)\n .where(\n and(\n eq(credentialModule, input.moduleId),\n eq(credentialId, allocated.credentialId!),\n eq(credentialSubject, nativeSubjectId),\n eq(credentialNamespace, input.identifier.namespace),\n eq(credentialValue, input.identifier.value),\n ),\n )\n .limit(1),\n false,\n ))[0];\n\n const authority = (yield* selectRows(\n transaction\n .select()\n .from(mapping.authorityCredential.table)\n .where(\n and(eq(authoritySubject, nativeSubjectId), eq(authorityId, allocated.credentialId!)),\n )\n .limit(1),\n false,\n ))[0];\n\n if (\n subject === undefined ||\n !mapping.subject.isActiveStatus(subject[mapping.subject.status]) ||\n subject[mapping.subject.securityRevision] !== allocated.securityRevision ||\n identifier === undefined ||\n identifier[mapping.identifier.bindingRevision] !== allocated.identifierRevision ||\n !mapping.identifier.isCurrent(identifier) ||\n credential === undefined ||\n credential[mapping.credential.credentialRevision] !== allocated.credentialRevision ||\n !mapping.credential.isActiveStatus(credential[mapping.credential.status]) ||\n authority === undefined ||\n authority[mapping.authorityCredential.revision] !== allocated.credentialRevision ||\n !mapping.authorityCredential.isActiveStatus(authority[mapping.authorityCredential.status])\n )\n return false;\n }\n\n return (\n stored !== undefined &&\n exactRegistration.length === 1 &&\n stored[mapping.registration.fingerprint] === input.fingerprint &&\n (mapping.mode === \"pending\" ||\n (nativeSubjectId !== undefined &&\n stored[mapping.registration.subjectId] !== null &&\n mapping.subjectId.equals(stored[mapping.registration.subjectId], nativeSubjectId)))\n );\n });\n\n let receipt: PreparedCommit<A> | undefined;\n\n yield* completeProofPlanIn(\n configuration.proof.mapping,\n configuration.proof.configuration,\n input.completion,\n protectedMutation,\n (completionDecision) => {\n receipt = prepare(\n completionDecision === \"completed\" && decision !== undefined\n ? decision\n : { _tag: \"Rejected\" },\n journal,\n );\n\n return completionDecision;\n },\n );\n\n return receipt ?? prepare({ _tag: \"Rejected\" }, journal);\n});\n\nconst prepareConflict = Effect.fn(\"Drizzle.prepareConflict\")(function* <Registration, A>(\n mapping: Mapping<Registration>,\n configuration: EmailRegistrationConfiguration,\n input: {\n readonly moduleId: string;\n readonly commandId: string;\n readonly fingerprint: TokenDigest;\n },\n prepare: PrepareEmailCommit<EmailRegistrationDecision, A>,\n) {\n const database = yield* CurrentEmailSql;\n\n return yield* owned(\n database,\n configuration,\n Effect.gen(function* () {\n const journal = yield* CurrentCommitJournal;\n\n const row = (yield* registrationRows(\n mapping,\n input.moduleId,\n input.commandId,\n configuration.locking,\n ))[0];\n\n return row === undefined\n ? prepare({ _tag: \"Rejected\" }, journal)\n : yield* prepareReplay(mapping, row, input.fingerprint, prepare);\n }),\n );\n});\n\nexport const makeSqlEmailRegistrationAuthority = Effect.fn(\"makeSqlEmailRegistrationAuthority\")(\n function* <Registration>(\n mapping: Mapping<Registration>,\n configuration: EmailRegistrationConfiguration,\n ): Effect.fn.Return<\n EmailRegistrationAuthority<Registration>,\n never,\n LifecycleHooks | CurrentEmailSql\n > {\n const database = yield* CurrentEmailSql;\n const hooks = yield* LifecycleHooks;\n\n return {\n inspect: (input) =>\n mapping\n .inspect(input)\n .pipe(\n Effect.provideService(CurrentEmailSql, database),\n Effect.provideService(LifecycleHooks, hooks),\n translateFailure,\n ),\n registerWithProof: (input, prepare) =>\n Effect.gen(function* () {\n if (!validConstraints(mapping)) return yield* unavailable();\n\n const snapshot = (registration: Registration) =>\n configuration.mode === \"synchronous\" && configuration.coordinated === true\n ? mapping.snapshotRegistrationSync === undefined\n ? Effect.fail(unavailable())\n : Effect.try({\n try: () => mapping.snapshotRegistrationSync!(registration),\n catch: (cause) => new PersistenceMappingError({ operation: \"mapping\", cause }),\n })\n : mapping.snapshotRegistration(registration);\n\n const storedRegistration = yield* snapshot(input.registration);\n const inspectionRegistration = yield* snapshot(input.registration);\n\n const capturedInput = Object.freeze({\n ...input,\n identifier: Object.freeze({ ...input.identifier }),\n registration: storedRegistration,\n });\n\n // Registration decoding and fingerprinting may suspend (for example while\n // hashing a detached Registration value). Finish that work before a\n // synchronous Durable Object transaction owner is entered.\n const inspectInput = {\n identifier: capturedInput.identifier,\n registration: inspectionRegistration,\n };\n\n const inspected =\n configuration.mode === \"synchronous\" && configuration.coordinated === true\n ? mapping.inspectSync === undefined\n ? yield* unavailable()\n : yield* Effect.try({\n try: () => mapping.inspectSync!(inspectInput),\n catch: (cause) => new PersistenceMappingError({ operation: \"mapping\", cause }),\n })\n : yield* mapping.inspect(inspectInput);\n\n const atomic = mapping.mode === \"atomic\";\n\n const credentialId = atomic\n ? yield* allocate(\n configuration.mode,\n mapping.allocateCredentialId,\n mapping.allocateCredentialIdSync,\n )\n : undefined;\n\n const securityRevision = atomic\n ? yield* allocate(\n configuration.mode,\n mapping.allocateRevision,\n mapping.allocateRevisionSync,\n )\n : undefined;\n\n const identifierRevision = atomic\n ? yield* allocate(\n configuration.mode,\n mapping.allocateRevision,\n mapping.allocateRevisionSync,\n )\n : undefined;\n\n const credentialRevision = atomic\n ? yield* allocate(\n configuration.mode,\n mapping.allocateRevision,\n mapping.allocateRevisionSync,\n )\n : undefined;\n\n const nativeSubjectId =\n atomic && mapping.provisioning.idMode !== \"generated\"\n ? yield* allocate(\n configuration.mode,\n mapping.provisioning.allocateSubjectId,\n mapping.provisioning.allocateSubjectIdSync,\n )\n : undefined;\n\n const pendingReference =\n mapping.mode === \"pending\"\n ? yield* allocate(\n configuration.mode,\n mapping.allocatePendingReference,\n mapping.allocatePendingReferenceSync,\n )\n : undefined;\n\n const run = owned(\n database,\n configuration,\n Effect.gen(function* () {\n return yield* registerIn(\n mapping,\n configuration,\n capturedInput,\n inspected,\n {\n ...(credentialId === undefined ? {} : { credentialId }),\n ...(securityRevision === undefined ? {} : { securityRevision }),\n ...(identifierRevision === undefined ? {} : { identifierRevision }),\n ...(credentialRevision === undefined ? {} : { credentialRevision }),\n ...(nativeSubjectId === undefined ? {} : { nativeSubjectId }),\n ...(pendingReference === undefined ? {} : { pendingReference }),\n },\n prepare,\n );\n }),\n );\n\n return yield* run.pipe(\n Effect.catchCause((cause) => {\n const request =\n cause.reasons.every(Cause.isFailReason) &&\n isMappedConstraintConflict(mapping.isRequestConflict, cause);\n\n const conflict =\n mapping.mode === \"atomic\" &&\n ((cause.reasons.every(Cause.isFailReason) &&\n isMappedConstraintConflict(mapping.isIdentifierConflict, cause)) ||\n (cause.reasons.every(Cause.isFailReason) &&\n isMappedConstraintConflict(mapping.isCredentialConflict, cause)));\n\n return request || conflict\n ? prepareConflict(mapping, configuration, capturedInput, prepare)\n : Effect.failCause(cause);\n }),\n );\n }).pipe(\n Effect.provideService(CurrentEmailSql, database),\n Effect.provideService(LifecycleHooks, hooks),\n translateFailure,\n ),\n };\n },\n);\n"],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import "./standalone-guard.mjs";
1
2
  import "./email-sql.mjs";
2
3
  import { EmailRegistrationAuthority } from "./email-registration.mjs";
3
4
  import "./proof-target.mjs";
@@ -6,14 +7,14 @@ import { HookConfigurationError, LifecycleHooks } from "@yielded/auth/Hooks";
6
7
  import { EmailAddressPersistence, EmailSignInTargets, EmailUnavailable } from "@yielded/auth/Email";
7
8
  import "effect/sql/SqlError";
8
9
  //#region src/drizzle/email-target.d.ts
9
- export declare const emailSignInTargetsLayer: (services: Effect.Effect<{
10
+ export declare const emailSignInTargetsLayer: <E, R>(services: Effect.Effect<{
10
11
  readonly emailSignInTargets: EmailSignInTargets["Service"];
11
- }>) => Layer.Layer<EmailSignInTargets, never, never>;
12
- export declare const emailAddressPersistenceLayer: (services: Effect.Effect<{
12
+ }, E, R>) => Layer.Layer<EmailSignInTargets, E, Exclude<R, import("effect/Scope").Scope>>;
13
+ export declare const emailAddressPersistenceLayer: <E, R>(services: Effect.Effect<{
13
14
  readonly emailAddressPersistence: EmailAddressPersistence["Service"];
14
- }, never, LifecycleHooks>) => Layer.Layer<EmailAddressPersistence, never, LifecycleHooks>;
15
- export declare const emailRegistrationLayer: <Id, Registration>(tag: Context.Key<Id, EmailRegistrationAuthority<Registration>>, services: Effect.Effect<{
15
+ }, E, R>) => Layer.Layer<EmailAddressPersistence, E, Exclude<R, import("effect/Scope").Scope>>;
16
+ export declare const emailRegistrationLayer: <Id, Registration, E, R>(tag: Context.Key<Id, EmailRegistrationAuthority<Registration>>, services: Effect.Effect<{
16
17
  readonly registrationAuthority: EmailRegistrationAuthority<Registration>;
17
- }, never, LifecycleHooks>) => Layer.Layer<Id, never, LifecycleHooks>;
18
+ }, E, R>) => Layer.Layer<Id, E, Exclude<R, import("effect/Scope").Scope>>;
18
19
  //#endregion
19
20
  //# sourceMappingURL=email-target.d.mts.map
@@ -1,11 +1,11 @@
1
1
  import { sqlClientStandaloneGuard } from "./standalone-guard.mjs";
2
- import { makeSqlEmailAddressPersistence, makeSqlEmailSignInTargets } from "./email-sql.mjs";
2
+ import { CurrentEmailSql, makeSqlEmailAddressPersistence, makeSqlEmailSignInTargets } from "./email-sql.mjs";
3
3
  import { makeSqlEmailRegistrationAuthority } from "./email-registration.mjs";
4
4
  import { Effect, Layer } from "effect";
5
5
  import { LifecycleHooks, coordinateCommit, hasCommitScope } from "@yielded/auth/Hooks";
6
6
  import { EmailAddressPersistence, EmailSignInTargets, EmailUnavailable } from "@yielded/auth/Email";
7
7
  //#region src/drizzle/email-target.ts
8
- const sqlClientEmailStandaloneGuard = (database) => sqlClientStandaloneGuard(database, () => EmailUnavailable.make({}));
8
+ const sqlClientEmailStandaloneGuard = (service) => sqlClientStandaloneGuard(service, () => EmailUnavailable.make({}));
9
9
  const proofConfiguration = (configuration, coordinated = false) => ({
10
10
  mode: configuration.proof.mode,
11
11
  locking: configuration.proof.locking,
@@ -34,25 +34,25 @@ const registrationOptions = (configuration, proofMapping, coordinated = false) =
34
34
  configuration: proofConfiguration(configuration, true)
35
35
  }
36
36
  });
37
- const makeTargetEmailSignInServices = (database, mapping, configuration) => Effect.gen(function* () {
38
- return { emailSignInTargets: yield* makeSqlEmailSignInTargets(database, mapping, {
37
+ const makeTargetEmailSignInServices = (mapping, configuration) => Effect.gen(function* () {
38
+ return { emailSignInTargets: yield* makeSqlEmailSignInTargets(mapping, {
39
39
  mode: configuration.mode,
40
40
  locking: false,
41
41
  standaloneGuard: configuration.standaloneGuard
42
42
  }) };
43
43
  });
44
- const makeTargetEmailAddressServices = (database, mapping, proofMapping, configuration) => Effect.gen(function* () {
45
- return { emailAddressPersistence: yield* makeSqlEmailAddressPersistence(database, mapping, addressOptions(configuration, proofMapping)) };
44
+ const makeTargetEmailAddressServices = (mapping, proofMapping, configuration) => Effect.gen(function* () {
45
+ return { emailAddressPersistence: yield* makeSqlEmailAddressPersistence(mapping, addressOptions(configuration, proofMapping)) };
46
46
  });
47
- const makeTargetEmailRegistrationServices = (database, mapping, proofMapping, configuration) => Effect.gen(function* () {
48
- return { registrationAuthority: yield* makeSqlEmailRegistrationAuthority(database, mapping, registrationOptions(configuration, proofMapping)) };
47
+ const makeTargetEmailRegistrationServices = (mapping, proofMapping, configuration) => Effect.gen(function* () {
48
+ return { registrationAuthority: yield* makeSqlEmailRegistrationAuthority(mapping, registrationOptions(configuration, proofMapping)) };
49
49
  });
50
50
  const coordinateTargetEmailAddress = (database, mapping, proofMapping, configuration, owner) => Effect.gen(function* () {
51
51
  const hooks = yield* LifecycleHooks;
52
52
  if (yield* hasCommitScope) return yield* EmailUnavailable.make({});
53
53
  yield* configuration.coordinatorGuard ?? configuration.standaloneGuard;
54
54
  return (yield* coordinateCommit(() => database.transaction((transaction) => Effect.gen(function* () {
55
- return yield* owner(transaction, { emailAddressPersistence: yield* makeSqlEmailAddressPersistence(transaction, mapping, addressOptions(configuration, proofMapping, true)) });
55
+ return yield* owner(transaction, { emailAddressPersistence: yield* makeSqlEmailAddressPersistence(mapping, addressOptions(configuration, proofMapping, true)).pipe(Effect.provideService(CurrentEmailSql, transaction)) });
56
56
  })), { mode: configuration.mode }).pipe(Effect.provideService(LifecycleHooks, hooks))).value;
57
57
  });
58
58
  const coordinateTargetEmailRegistration = (database, mapping, proofMapping, configuration, owner) => Effect.gen(function* () {
@@ -60,7 +60,7 @@ const coordinateTargetEmailRegistration = (database, mapping, proofMapping, conf
60
60
  if (yield* hasCommitScope) return yield* EmailUnavailable.make({});
61
61
  yield* configuration.coordinatorGuard ?? configuration.standaloneGuard;
62
62
  return (yield* coordinateCommit(() => database.transaction((transaction) => Effect.gen(function* () {
63
- return yield* owner(transaction, { registrationAuthority: yield* makeSqlEmailRegistrationAuthority(transaction, mapping, registrationOptions(configuration, proofMapping, true)) });
63
+ return yield* owner(transaction, { registrationAuthority: yield* makeSqlEmailRegistrationAuthority(mapping, registrationOptions(configuration, proofMapping, true)).pipe(Effect.provideService(CurrentEmailSql, transaction)) });
64
64
  })), { mode: configuration.mode }).pipe(Effect.provideService(LifecycleHooks, hooks))).value;
65
65
  });
66
66
  const emailSignInTargetsLayer = (services) => Layer.effect(EmailSignInTargets, Effect.map(services, (value) => value.emailSignInTargets));
@@ -1 +1 @@
1
- {"version":3,"file":"email-target.mjs","names":[],"sources":["../../src/drizzle/email-target.ts"],"sourcesContent":["import { EmailAddressPersistence, EmailSignInTargets, EmailUnavailable } from \"@yielded/auth/Email\";\nimport {\n coordinateCommit,\n hasCommitScope,\n LifecycleHooks,\n type HookConfigurationError,\n} from \"@yielded/auth/Hooks\";\n/* oxlint-disable no-explicit-any -- public driver wrappers restore concrete Drizzle generics. */\nimport { type Context, Effect, Layer } from \"effect\";\nimport type * as SqlError from \"effect/sql/SqlError\";\n\nimport {\n makeSqlEmailRegistrationAuthority,\n type EmailRegistrationAuthority,\n type EmailRegistrationConfiguration,\n} from \"./email-registration\";\nimport {\n makeSqlEmailAddressPersistence,\n makeSqlEmailSignInTargets,\n type EmailSqlConfiguration,\n type EmailSqlDatabase,\n type EmailSqlQuery,\n} from \"./email-sql\";\nimport type { ProofTargetConfiguration } from \"./proof-target\";\nimport { sqlClientStandaloneGuard } from \"./standalone-guard\";\n\nexport interface EmailTargetConfiguration {\n readonly mode: \"interactive\" | \"synchronous\";\n readonly locking: boolean;\n readonly standaloneGuard: Effect.Effect<void, EmailUnavailable>;\n readonly coordinatorGuard?: Effect.Effect<void, EmailUnavailable>;\n readonly generatedSubjectRows: (query: EmailSqlQuery) => EmailSqlQuery;\n readonly proof: ProofTargetConfiguration;\n}\n\ninterface TransactionOwner<Transaction> {\n readonly transaction: <A, E, R>(\n body: (transaction: Transaction) => Effect.Effect<A, E, R>,\n ) => Effect.Effect<A, E | SqlError.SqlError, R>;\n}\n\nexport type EmailCoordinatorError<E> =\n | E\n | EmailUnavailable\n | HookConfigurationError\n | SqlError.SqlError;\n\nexport const sqlClientEmailStandaloneGuard = (\n database: unknown,\n): Effect.Effect<void, EmailUnavailable> =>\n sqlClientStandaloneGuard(database, () => EmailUnavailable.make({}));\n\nconst proofConfiguration = (configuration: EmailTargetConfiguration, coordinated = false) => ({\n mode: configuration.proof.mode,\n locking: configuration.proof.locking,\n\n standaloneGuard: Effect.void,\n coordinated,\n insertIfAbsent: configuration.proof.insertIfAbsent,\n});\n\nconst addressOptions = (\n configuration: EmailTargetConfiguration,\n proofMapping: any,\n coordinated = false,\n): EmailSqlConfiguration => ({\n mode: configuration.mode,\n locking: configuration.locking,\n\n standaloneGuard: !coordinated ? configuration.standaloneGuard : Effect.void,\n coordinated,\n proof: {\n mapping: proofMapping,\n configuration: proofConfiguration(configuration, true),\n },\n});\n\nconst registrationOptions = (\n configuration: EmailTargetConfiguration,\n proofMapping: any,\n coordinated = false,\n): EmailRegistrationConfiguration => ({\n mode: configuration.mode,\n locking: configuration.locking,\n\n standaloneGuard: !coordinated ? configuration.standaloneGuard : Effect.void,\n generatedSubjectRows: configuration.generatedSubjectRows,\n coordinated,\n proof: {\n mapping: proofMapping,\n configuration: proofConfiguration(configuration, true),\n },\n});\n\nexport const makeTargetEmailSignInServices = (\n database: any,\n mapping: any,\n configuration: EmailTargetConfiguration,\n) =>\n Effect.gen(function* () {\n return {\n emailSignInTargets: yield* makeSqlEmailSignInTargets(database, mapping, {\n mode: configuration.mode,\n locking: false,\n standaloneGuard: configuration.standaloneGuard,\n }),\n };\n });\n\nexport const makeTargetEmailAddressServices = (\n database: any,\n mapping: any,\n proofMapping: any,\n configuration: EmailTargetConfiguration,\n) =>\n Effect.gen(function* () {\n return {\n emailAddressPersistence: yield* makeSqlEmailAddressPersistence(\n database,\n mapping,\n addressOptions(configuration, proofMapping),\n ),\n };\n });\n\nexport const makeTargetEmailRegistrationServices = <Registration>(\n database: any,\n mapping: any,\n proofMapping: any,\n configuration: EmailTargetConfiguration,\n) =>\n Effect.gen(function* () {\n return {\n registrationAuthority: yield* makeSqlEmailRegistrationAuthority<Registration>(\n database,\n mapping,\n registrationOptions(configuration, proofMapping),\n ),\n };\n });\n\nexport const coordinateTargetEmailAddress = <Transaction, A, E, R>(\n database: TransactionOwner<Transaction>,\n mapping: any,\n proofMapping: any,\n configuration: EmailTargetConfiguration,\n owner: (\n transaction: Transaction,\n services: { readonly emailAddressPersistence: EmailAddressPersistence[\"Service\"] },\n ) => Effect.Effect<A, E, R>,\n): Effect.Effect<A, EmailCoordinatorError<E>, R | LifecycleHooks> =>\n Effect.gen(function* (): Effect.fn.Return<A, EmailCoordinatorError<E>, R | LifecycleHooks> {\n const hooks = yield* LifecycleHooks;\n\n if (yield* hasCommitScope) return yield* EmailUnavailable.make({});\n yield* configuration.coordinatorGuard ?? configuration.standaloneGuard;\n\n const result = yield* coordinateCommit(\n () =>\n database.transaction((transaction) =>\n Effect.gen(function* () {\n return yield* owner(transaction, {\n emailAddressPersistence: yield* makeSqlEmailAddressPersistence(\n transaction as unknown as EmailSqlDatabase,\n mapping,\n addressOptions(configuration, proofMapping, true),\n ),\n });\n }),\n ),\n { mode: configuration.mode },\n ).pipe(Effect.provideService(LifecycleHooks, hooks));\n\n return result.value;\n });\n\nexport const coordinateTargetEmailRegistration = <Registration, Transaction, A, E, R>(\n database: TransactionOwner<Transaction>,\n mapping: any,\n proofMapping: any,\n configuration: EmailTargetConfiguration,\n owner: (\n transaction: Transaction,\n services: { readonly registrationAuthority: EmailRegistrationAuthority<Registration> },\n ) => Effect.Effect<A, E, R>,\n): Effect.Effect<A, EmailCoordinatorError<E>, R | LifecycleHooks> =>\n Effect.gen(function* (): Effect.fn.Return<A, EmailCoordinatorError<E>, R | LifecycleHooks> {\n const hooks = yield* LifecycleHooks;\n\n if (yield* hasCommitScope) return yield* EmailUnavailable.make({});\n yield* configuration.coordinatorGuard ?? configuration.standaloneGuard;\n\n const result = yield* coordinateCommit(\n () =>\n database.transaction((transaction) =>\n Effect.gen(function* () {\n return yield* owner(transaction, {\n registrationAuthority: yield* makeSqlEmailRegistrationAuthority<Registration>(\n transaction as unknown as EmailSqlDatabase,\n mapping,\n registrationOptions(configuration, proofMapping, true),\n ),\n });\n }),\n ),\n { mode: configuration.mode },\n ).pipe(Effect.provideService(LifecycleHooks, hooks));\n\n return result.value;\n });\n\nexport const emailSignInTargetsLayer = (\n services: Effect.Effect<{ readonly emailSignInTargets: EmailSignInTargets[\"Service\"] }>,\n) =>\n Layer.effect(\n EmailSignInTargets,\n Effect.map(services, (value) => value.emailSignInTargets),\n );\n\nexport const emailAddressPersistenceLayer = (\n services: Effect.Effect<\n { readonly emailAddressPersistence: EmailAddressPersistence[\"Service\"] },\n never,\n LifecycleHooks\n >,\n) =>\n Layer.effect(\n EmailAddressPersistence,\n Effect.map(services, (value) => value.emailAddressPersistence),\n );\n\nexport const emailRegistrationLayer = <Id, Registration>(\n tag: Context.Key<Id, EmailRegistrationAuthority<Registration>>,\n services: Effect.Effect<\n { readonly registrationAuthority: EmailRegistrationAuthority<Registration> },\n never,\n LifecycleHooks\n >,\n) =>\n Layer.effect(\n tag,\n Effect.map(services, (value) => value.registrationAuthority),\n );\n"],"mappings":"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"}
1
+ {"version":3,"file":"email-target.mjs","names":[],"sources":["../../src/drizzle/email-target.ts"],"sourcesContent":["import { EmailAddressPersistence, EmailSignInTargets, EmailUnavailable } from \"@yielded/auth/Email\";\nimport {\n coordinateCommit,\n hasCommitScope,\n LifecycleHooks,\n type HookConfigurationError,\n} from \"@yielded/auth/Hooks\";\n/* oxlint-disable no-explicit-any -- public driver wrappers restore concrete Drizzle generics. */\nimport { type Context, Effect, Layer } from \"effect\";\nimport type * as SqlError from \"effect/sql/SqlError\";\n\nimport {\n makeSqlEmailRegistrationAuthority,\n type EmailRegistrationAuthority,\n type EmailRegistrationConfiguration,\n} from \"./email-registration\";\nimport {\n CurrentEmailSql,\n makeSqlEmailAddressPersistence,\n makeSqlEmailSignInTargets,\n type EmailSqlConfiguration,\n type EmailSqlDatabase,\n type EmailSqlQuery,\n} from \"./email-sql\";\nimport type { ProofTargetConfiguration } from \"./proof-target\";\nimport { sqlClientStandaloneGuard, type TransactionService } from \"./standalone-guard\";\n\nexport interface EmailTargetConfiguration {\n readonly mode: \"interactive\" | \"synchronous\";\n readonly locking: boolean;\n readonly standaloneGuard: Effect.Effect<void, EmailUnavailable>;\n readonly coordinatorGuard?: Effect.Effect<void, EmailUnavailable>;\n readonly generatedSubjectRows: (query: EmailSqlQuery) => EmailSqlQuery;\n readonly proof: ProofTargetConfiguration;\n}\n\ninterface TransactionOwner<Transaction> {\n readonly transaction: <A, E, R>(\n body: (transaction: Transaction) => Effect.Effect<A, E, R>,\n ) => Effect.Effect<A, E | SqlError.SqlError, R>;\n}\n\nexport type EmailCoordinatorError<E> =\n | E\n | EmailUnavailable\n | HookConfigurationError\n | SqlError.SqlError;\n\nexport const sqlClientEmailStandaloneGuard = (\n service: TransactionService | undefined,\n): Effect.Effect<void, EmailUnavailable> =>\n sqlClientStandaloneGuard(service, () => EmailUnavailable.make({}));\n\nconst proofConfiguration = (configuration: EmailTargetConfiguration, coordinated = false) => ({\n mode: configuration.proof.mode,\n locking: configuration.proof.locking,\n\n standaloneGuard: Effect.void,\n coordinated,\n insertIfAbsent: configuration.proof.insertIfAbsent,\n});\n\nconst addressOptions = (\n configuration: EmailTargetConfiguration,\n proofMapping: any,\n coordinated = false,\n): EmailSqlConfiguration => ({\n mode: configuration.mode,\n locking: configuration.locking,\n\n standaloneGuard: !coordinated ? configuration.standaloneGuard : Effect.void,\n coordinated,\n proof: {\n mapping: proofMapping,\n configuration: proofConfiguration(configuration, true),\n },\n});\n\nconst registrationOptions = (\n configuration: EmailTargetConfiguration,\n proofMapping: any,\n coordinated = false,\n): EmailRegistrationConfiguration => ({\n mode: configuration.mode,\n locking: configuration.locking,\n\n standaloneGuard: !coordinated ? configuration.standaloneGuard : Effect.void,\n generatedSubjectRows: configuration.generatedSubjectRows,\n coordinated,\n proof: {\n mapping: proofMapping,\n configuration: proofConfiguration(configuration, true),\n },\n});\n\nexport const makeTargetEmailSignInServices = (\n mapping: any,\n configuration: EmailTargetConfiguration,\n) =>\n Effect.gen(function* () {\n return {\n emailSignInTargets: yield* makeSqlEmailSignInTargets(mapping, {\n mode: configuration.mode,\n locking: false,\n standaloneGuard: configuration.standaloneGuard,\n }),\n };\n });\n\nexport const makeTargetEmailAddressServices = (\n mapping: any,\n proofMapping: any,\n configuration: EmailTargetConfiguration,\n) =>\n Effect.gen(function* () {\n return {\n emailAddressPersistence: yield* makeSqlEmailAddressPersistence(\n mapping,\n addressOptions(configuration, proofMapping),\n ),\n };\n });\n\nexport const makeTargetEmailRegistrationServices = <Registration>(\n mapping: any,\n proofMapping: any,\n configuration: EmailTargetConfiguration,\n) =>\n Effect.gen(function* () {\n return {\n registrationAuthority: yield* makeSqlEmailRegistrationAuthority<Registration>(\n mapping,\n registrationOptions(configuration, proofMapping),\n ),\n };\n });\n\nexport const coordinateTargetEmailAddress = <Transaction, A, E, R>(\n database: TransactionOwner<Transaction>,\n mapping: any,\n proofMapping: any,\n configuration: EmailTargetConfiguration,\n owner: (\n transaction: Transaction,\n services: { readonly emailAddressPersistence: EmailAddressPersistence[\"Service\"] },\n ) => Effect.Effect<A, E, R>,\n): Effect.Effect<A, EmailCoordinatorError<E>, R | LifecycleHooks> =>\n Effect.gen(function* (): Effect.fn.Return<A, EmailCoordinatorError<E>, R | LifecycleHooks> {\n const hooks = yield* LifecycleHooks;\n\n if (yield* hasCommitScope) return yield* EmailUnavailable.make({});\n yield* configuration.coordinatorGuard ?? configuration.standaloneGuard;\n\n const result = yield* coordinateCommit(\n () =>\n database.transaction((transaction) =>\n Effect.gen(function* () {\n return yield* owner(transaction, {\n emailAddressPersistence: yield* makeSqlEmailAddressPersistence(\n mapping,\n addressOptions(configuration, proofMapping, true),\n ).pipe(\n Effect.provideService(CurrentEmailSql, transaction as unknown as EmailSqlDatabase),\n ),\n });\n }),\n ),\n { mode: configuration.mode },\n ).pipe(Effect.provideService(LifecycleHooks, hooks));\n\n return result.value;\n });\n\nexport const coordinateTargetEmailRegistration = <Registration, Transaction, A, E, R>(\n database: TransactionOwner<Transaction>,\n mapping: any,\n proofMapping: any,\n configuration: EmailTargetConfiguration,\n owner: (\n transaction: Transaction,\n services: { readonly registrationAuthority: EmailRegistrationAuthority<Registration> },\n ) => Effect.Effect<A, E, R>,\n): Effect.Effect<A, EmailCoordinatorError<E>, R | LifecycleHooks> =>\n Effect.gen(function* (): Effect.fn.Return<A, EmailCoordinatorError<E>, R | LifecycleHooks> {\n const hooks = yield* LifecycleHooks;\n\n if (yield* hasCommitScope) return yield* EmailUnavailable.make({});\n yield* configuration.coordinatorGuard ?? configuration.standaloneGuard;\n\n const result = yield* coordinateCommit(\n () =>\n database.transaction((transaction) =>\n Effect.gen(function* () {\n return yield* owner(transaction, {\n registrationAuthority: yield* makeSqlEmailRegistrationAuthority<Registration>(\n mapping,\n registrationOptions(configuration, proofMapping, true),\n ).pipe(\n Effect.provideService(CurrentEmailSql, transaction as unknown as EmailSqlDatabase),\n ),\n });\n }),\n ),\n { mode: configuration.mode },\n ).pipe(Effect.provideService(LifecycleHooks, hooks));\n\n return result.value;\n });\n\nexport const emailSignInTargetsLayer = <E, R>(\n services: Effect.Effect<{ readonly emailSignInTargets: EmailSignInTargets[\"Service\"] }, E, R>,\n) =>\n Layer.effect(\n EmailSignInTargets,\n Effect.map(services, (value) => value.emailSignInTargets),\n );\n\nexport const emailAddressPersistenceLayer = <E, R>(\n services: Effect.Effect<\n { readonly emailAddressPersistence: EmailAddressPersistence[\"Service\"] },\n E,\n R\n >,\n) =>\n Layer.effect(\n EmailAddressPersistence,\n Effect.map(services, (value) => value.emailAddressPersistence),\n );\n\nexport const emailRegistrationLayer = <Id, Registration, E, R>(\n tag: Context.Key<Id, EmailRegistrationAuthority<Registration>>,\n services: Effect.Effect<\n { readonly registrationAuthority: EmailRegistrationAuthority<Registration> },\n E,\n R\n >,\n) =>\n Layer.effect(\n tag,\n Effect.map(services, (value) => value.registrationAuthority),\n );\n"],"mappings":";;;;;;;AAgDA,MAAa,iCACX,YAEA,yBAAyB,eAAe,iBAAiB,KAAK,CAAC,CAAC,CAAC;AAEnE,MAAM,sBAAsB,eAAyC,cAAc,WAAW;CAC5F,MAAM,cAAc,MAAM;CAC1B,SAAS,cAAc,MAAM;CAE7B,iBAAiB,OAAO;CACxB;CACA,gBAAgB,cAAc,MAAM;AACtC;AAEA,MAAM,kBACJ,eACA,cACA,cAAc,WACa;CAC3B,MAAM,cAAc;CACpB,SAAS,cAAc;CAEvB,iBAAiB,CAAC,cAAc,cAAc,kBAAkB,OAAO;CACvE;CACA,OAAO;EACL,SAAS;EACT,eAAe,mBAAmB,eAAe,IAAI;CACvD;AACF;AAEA,MAAM,uBACJ,eACA,cACA,cAAc,WACsB;CACpC,MAAM,cAAc;CACpB,SAAS,cAAc;CAEvB,iBAAiB,CAAC,cAAc,cAAc,kBAAkB,OAAO;CACvE,sBAAsB,cAAc;CACpC;CACA,OAAO;EACL,SAAS;EACT,eAAe,mBAAmB,eAAe,IAAI;CACvD;AACF;AAEA,MAAa,iCACX,SACA,kBAEA,OAAO,IAAI,aAAa;CACtB,OAAO,EACL,oBAAoB,OAAO,0BAA0B,SAAS;EAC5D,MAAM,cAAc;EACpB,SAAS;EACT,iBAAiB,cAAc;CACjC,CAAC,EACH;AACF,CAAC;AAEH,MAAa,kCACX,SACA,cACA,kBAEA,OAAO,IAAI,aAAa;CACtB,OAAO,EACL,yBAAyB,OAAO,+BAC9B,SACA,eAAe,eAAe,YAAY,CAC5C,EACF;AACF,CAAC;AAEH,MAAa,uCACX,SACA,cACA,kBAEA,OAAO,IAAI,aAAa;CACtB,OAAO,EACL,uBAAuB,OAAO,kCAC5B,SACA,oBAAoB,eAAe,YAAY,CACjD,EACF;AACF,CAAC;AAEH,MAAa,gCACX,UACA,SACA,cACA,eACA,UAKA,OAAO,IAAI,aAAgF;CACzF,MAAM,QAAQ,OAAO;CAErB,IAAI,OAAO,gBAAgB,OAAO,OAAO,iBAAiB,KAAK,CAAC,CAAC;CACjE,OAAO,cAAc,oBAAoB,cAAc;CAmBvD,QAAO,OAjBe,uBAElB,SAAS,aAAa,gBACpB,OAAO,IAAI,aAAa;EACtB,OAAO,OAAO,MAAM,aAAa,EAC/B,yBAAyB,OAAO,+BAC9B,SACA,eAAe,eAAe,cAAc,IAAI,CAClD,CAAC,CAAC,KACA,OAAO,eAAe,iBAAiB,WAA0C,CACnF,EACF,CAAC;CACH,CAAC,CACH,GACF,EAAE,MAAM,cAAc,KAAK,CAC7B,CAAC,CAAC,KAAK,OAAO,eAAe,gBAAgB,KAAK,CAAC,EAAA,CAErC;AAChB,CAAC;AAEH,MAAa,qCACX,UACA,SACA,cACA,eACA,UAKA,OAAO,IAAI,aAAgF;CACzF,MAAM,QAAQ,OAAO;CAErB,IAAI,OAAO,gBAAgB,OAAO,OAAO,iBAAiB,KAAK,CAAC,CAAC;CACjE,OAAO,cAAc,oBAAoB,cAAc;CAmBvD,QAAO,OAjBe,uBAElB,SAAS,aAAa,gBACpB,OAAO,IAAI,aAAa;EACtB,OAAO,OAAO,MAAM,aAAa,EAC/B,uBAAuB,OAAO,kCAC5B,SACA,oBAAoB,eAAe,cAAc,IAAI,CACvD,CAAC,CAAC,KACA,OAAO,eAAe,iBAAiB,WAA0C,CACnF,EACF,CAAC;CACH,CAAC,CACH,GACF,EAAE,MAAM,cAAc,KAAK,CAC7B,CAAC,CAAC,KAAK,OAAO,eAAe,gBAAgB,KAAK,CAAC,EAAA,CAErC;AAChB,CAAC;AAEH,MAAa,2BACX,aAEA,MAAM,OACJ,oBACA,OAAO,IAAI,WAAW,UAAU,MAAM,kBAAkB,CAC1D;AAEF,MAAa,gCACX,aAMA,MAAM,OACJ,yBACA,OAAO,IAAI,WAAW,UAAU,MAAM,uBAAuB,CAC/D;AAEF,MAAa,0BACX,KACA,aAMA,MAAM,OACJ,KACA,OAAO,IAAI,WAAW,UAAU,MAAM,qBAAqB,CAC7D"}
@@ -0,0 +1,8 @@
1
+ import { Context } from "effect";
2
+ import { EffectMysql2Database } from "drizzle-orm/effect-mysql2";
3
+ //#region src/drizzle/mysql-database.d.ts
4
+ declare const Database_base: Context.ServiceClass<Database, "effect-auth/persistence-drizzle/Mysql2/Database", EffectMysql2Database<import("drizzle-orm").TablesRelationalConfig>>;
5
+ /** Application-owned MySQL database used to construct persistence services. */
6
+ export declare class Database extends Database_base {}
7
+ //#endregion
8
+ //# sourceMappingURL=mysql-database.d.mts.map
@@ -0,0 +1,8 @@
1
+ import { Context } from "effect";
2
+ //#region src/drizzle/mysql-database.ts
3
+ /** Application-owned MySQL database used to construct persistence services. */
4
+ var Database = class extends Context.Service()("effect-auth/persistence-drizzle/Mysql2/Database") {};
5
+ //#endregion
6
+ export { Database };
7
+
8
+ //# sourceMappingURL=mysql-database.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mysql-database.mjs","names":[],"sources":["../../src/drizzle/mysql-database.ts"],"sourcesContent":["import type { AnyRelations } from \"drizzle-orm\";\nimport type { EffectMysql2Database } from \"drizzle-orm/effect-mysql2\";\nimport { Context } from \"effect\";\n\n/** Application-owned MySQL database used to construct persistence services. */\nexport class Database extends Context.Service<Database, EffectMysql2Database<AnyRelations>>()(\n \"effect-auth/persistence-drizzle/Mysql2/Database\",\n) {}\n"],"mappings":";;;AAKA,IAAa,WAAb,cAA8B,QAAQ,QAAsD,CAAC,CAC3F,iDACF,CAAC,CAAC,CAAC"}
@@ -2,6 +2,7 @@ import { EmailAddressMapping, EmailRegistrationMapping, EmailSignInMapping } fro
2
2
  import { ProofPersistenceMapping } from "./proof-model.mjs";
3
3
  import { EmailRegistrationAuthority } from "./email-registration.mjs";
4
4
  import { SuppliedService } from "./SuppliedService.mjs";
5
+ import { Database as Database$1 } from "./mysql-database.mjs";
5
6
  import { AnyRelations } from "drizzle-orm";
6
7
  import { Effect } from "effect";
7
8
  import { HookConfigurationError, LifecycleHooks } from "@yielded/auth/Hooks";
@@ -13,15 +14,15 @@ import { AnyMySqlTable } from "drizzle-orm/mysql-core";
13
14
  type Database = EffectMysql2Database<AnyRelations>;
14
15
  type TransactionOf<D extends Database> = Parameters<Parameters<D["transaction"]>[0]>[0];
15
16
  type ProofMapping = ProofPersistenceMapping<any, any, any, any, any, any, any, any, any, any, any, any>;
16
- export declare const makeMysqlEmailSignInServices: <S extends AnyMySqlTable, I extends AnyMySqlTable, C extends AnyMySqlTable, NativeId>(database: Database, mapping: EmailSignInMapping<S, I, C, NativeId>) => Effect.Effect<{
17
+ export declare const makeMysqlEmailSignInServices: <S extends AnyMySqlTable, I extends AnyMySqlTable, C extends AnyMySqlTable, NativeId>(mapping: EmailSignInMapping<S, I, C, NativeId>) => Effect.Effect<{
17
18
  emailSignInTargets: {
18
19
  readonly lookup: (input: {
19
20
  readonly moduleId: string;
20
21
  readonly identifier: import("@yielded/auth/Identity").LoginIdentifier;
21
22
  }) => Effect.Effect<import("effect/Option").Option<import("@yielded/auth/Email").EmailCredentialSnapshot>, EmailUnavailable>;
22
23
  };
23
- }, never, never>;
24
- export declare const makeMysqlEmailAddressServices: <S extends AnyMySqlTable, I extends AnyMySqlTable, C extends AnyMySqlTable, AC extends AnyMySqlTable, M extends AnyMySqlTable, NativeId>(database: Database, mapping: EmailAddressMapping<S, I, C, AC, M, NativeId>, proofMapping: ProofMapping) => Effect.Effect<{
24
+ }, never, Database$1>;
25
+ export declare const makeMysqlEmailAddressServices: <S extends AnyMySqlTable, I extends AnyMySqlTable, C extends AnyMySqlTable, AC extends AnyMySqlTable, M extends AnyMySqlTable, NativeId>(mapping: EmailAddressMapping<S, I, C, AC, M, NativeId>, proofMapping: ProofMapping) => Effect.Effect<{
25
26
  emailAddressPersistence: {
26
27
  readonly target: (input: {
27
28
  readonly moduleId: string;
@@ -40,7 +41,7 @@ export declare const makeMysqlEmailAddressServices: <S extends AnyMySqlTable, I
40
41
  readonly hasMore: boolean;
41
42
  }, A>) => Effect.Effect<import("@yielded/auth/Hooks").PreparedCommit<A>, EmailUnavailable>;
42
43
  };
43
- }, never, LifecycleHooks>;
44
+ }, never, Database$1 | LifecycleHooks>;
44
45
  export declare function coordinateMysqlEmailAddress<D extends Database, S extends AnyMySqlTable, I extends AnyMySqlTable, C extends AnyMySqlTable, AC extends AnyMySqlTable, M extends AnyMySqlTable, NativeId, Out, E, R, DatabaseError, DatabaseRequirements>(acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>, options: {
45
46
  readonly mapping: EmailAddressMapping<S, I, C, AC, M, NativeId>;
46
47
  readonly proofMapping: ProofMapping;
@@ -51,9 +52,9 @@ export declare function coordinateMysqlEmailAddress<D extends Database, S extend
51
52
  readonly proofMapping: ProofMapping;
52
53
  readonly transaction: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;
53
54
  }, body: Effect.Effect<Out, E, R>): Effect.Effect<Out, E | EmailUnavailable | HookConfigurationError | SqlError | DatabaseError, Exclude<R, EmailAddressPersistence | TxId> | LifecycleHooks | DatabaseRequirements>;
54
- export declare const makeMysqlEmailRegistrationServices: <Registration, S extends AnyMySqlTable, I extends AnyMySqlTable, C extends AnyMySqlTable, AC extends AnyMySqlTable, Rq extends AnyMySqlTable, NativeId>(database: Database, mapping: EmailRegistrationMapping<Registration, S, I, C, AC, Rq, NativeId>, proofMapping: ProofMapping) => Effect.Effect<{
55
+ export declare const makeMysqlEmailRegistrationServices: <Registration, S extends AnyMySqlTable, I extends AnyMySqlTable, C extends AnyMySqlTable, AC extends AnyMySqlTable, Rq extends AnyMySqlTable, NativeId>(mapping: EmailRegistrationMapping<Registration, S, I, C, AC, Rq, NativeId>, proofMapping: ProofMapping) => Effect.Effect<{
55
56
  registrationAuthority: EmailRegistrationAuthority<Registration>;
56
- }, never, LifecycleHooks>;
57
+ }, never, Database$1 | LifecycleHooks>;
57
58
  export declare function coordinateMysqlEmailRegistration<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: {
58
59
  readonly mapping: EmailRegistrationMapping<NoInfer<Registration>, S, I, C, AC, Rq, NativeId>;
59
60
  readonly proofMapping: ProofMapping;
@@ -1,32 +1,36 @@
1
+ import { acquireTransactionService, transactionService } from "./standalone-guard.mjs";
2
+ import { CurrentEmailSql } from "./email-sql.mjs";
1
3
  import { coordinateTargetEmailAddress, coordinateTargetEmailRegistration, makeTargetEmailAddressServices, makeTargetEmailRegistrationServices, makeTargetEmailSignInServices, sqlClientEmailStandaloneGuard } from "./email-target.mjs";
2
4
  import { sqlClientProofStandaloneGuard } from "./proof-target.mjs";
5
+ import { nativeDatabase } from "./native-database.mjs";
6
+ import { Database } from "./mysql-database.mjs";
3
7
  import { Context, Effect } from "effect";
4
8
  import { EmailAddressPersistence } from "@yielded/auth/Email";
5
9
  //#region src/drizzle/mysql-emails.ts
6
- const configuration = (database) => ({
10
+ const configuration = (service) => ({
7
11
  mode: "interactive",
8
12
  locking: true,
9
- standaloneGuard: sqlClientEmailStandaloneGuard(database),
13
+ standaloneGuard: sqlClientEmailStandaloneGuard(service),
10
14
  generatedSubjectRows: (query) => query.$returningId(),
11
15
  proof: {
12
16
  mode: "interactive",
13
17
  locking: true,
14
- standaloneGuard: sqlClientProofStandaloneGuard(database),
18
+ standaloneGuard: sqlClientProofStandaloneGuard(service),
15
19
  insertIfAbsent: (query, selfKey, selfValue) => query.onDuplicateKeyUpdate({ set: { [selfKey]: selfValue } })
16
20
  }
17
21
  });
18
- const makeMysqlEmailSignInServices = (database, mapping) => makeTargetEmailSignInServices(database, mapping, configuration(database));
19
- const makeMysqlEmailAddressServices = (database, mapping, proofMapping) => makeTargetEmailAddressServices(database, mapping, proofMapping, configuration(database));
22
+ const makeMysqlEmailSignInServices = (mapping) => Effect.flatMap(Effect.map(acquireTransactionService(Database), configuration), (configuration) => makeTargetEmailSignInServices(mapping, configuration)).pipe(Effect.provideServiceEffect(CurrentEmailSql, nativeDatabase(Database)));
23
+ const makeMysqlEmailAddressServices = (mapping, proofMapping) => Effect.flatMap(Effect.map(acquireTransactionService(Database), configuration), (configuration) => makeTargetEmailAddressServices(mapping, proofMapping, configuration)).pipe(Effect.provideServiceEffect(CurrentEmailSql, nativeDatabase(Database)));
20
24
  function coordinateMysqlEmailAddress(acquire, options, body) {
21
- return Effect.flatMap(acquire, (database) => coordinateTargetEmailAddress(database, options.mapping, options.proofMapping, configuration(database), (transaction, services) => {
25
+ return Effect.flatMap(acquire, (database) => coordinateTargetEmailAddress(database, options.mapping, options.proofMapping, configuration(transactionService(database)), (transaction, services) => {
22
26
  const provided = Context.make(EmailAddressPersistence, services.emailAddressPersistence);
23
27
  const work = Effect.provideContext(body, provided);
24
28
  return options.transaction === void 0 ? work : Effect.provideService(work, options.transaction, options.transaction.of(transaction));
25
29
  }));
26
30
  }
27
- const makeMysqlEmailRegistrationServices = (database, mapping, proofMapping) => makeTargetEmailRegistrationServices(database, mapping, proofMapping, configuration(database));
31
+ const makeMysqlEmailRegistrationServices = (mapping, proofMapping) => Effect.flatMap(Effect.map(acquireTransactionService(Database), configuration), (configuration) => makeTargetEmailRegistrationServices(mapping, proofMapping, configuration)).pipe(Effect.provideServiceEffect(CurrentEmailSql, nativeDatabase(Database)));
28
32
  function coordinateMysqlEmailRegistration(acquire, options, body) {
29
- return Effect.flatMap(acquire, (database) => coordinateTargetEmailRegistration(database, options.mapping, options.proofMapping, configuration(database), (transaction, services) => {
33
+ return Effect.flatMap(acquire, (database) => coordinateTargetEmailRegistration(database, options.mapping, options.proofMapping, configuration(transactionService(database)), (transaction, services) => {
30
34
  const provided = Context.make(options.target, services.registrationAuthority);
31
35
  const work = Effect.provideContext(body, provided);
32
36
  return options.transaction === void 0 ? work : Effect.provideService(work, options.transaction, options.transaction.of(transaction));
@@ -1 +1 @@
1
- {"version":3,"file":"mysql-emails.mjs","names":[],"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 type { EmailSqlQuery } from \"./email-sql\";\nimport {\n coordinateTargetEmailAddress,\n coordinateTargetEmailRegistration,\n makeTargetEmailAddressServices,\n makeTargetEmailRegistrationServices,\n makeTargetEmailSignInServices,\n sqlClientEmailStandaloneGuard,\n} from \"./email-target\";\nimport type { ProofPersistenceMapping } from \"./proof-model\";\nimport type { ProofSqlQuery } from \"./proof-sql\";\nimport { sqlClientProofStandaloneGuard } from \"./proof-target\";\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 = (database: Database) => ({\n mode: \"interactive\" as const,\n locking: true,\n standaloneGuard: sqlClientEmailStandaloneGuard(database),\n generatedSubjectRows: (query: EmailSqlQuery) => query.$returningId(),\n proof: {\n mode: \"interactive\" as const,\n locking: true,\n standaloneGuard: sqlClientProofStandaloneGuard(database),\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 database: Database,\n mapping: EmailSignInMapping<S, I, C, NativeId>,\n) => makeTargetEmailSignInServices(database, mapping, configuration(database));\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 database: Database,\n mapping: EmailAddressMapping<S, I, C, AC, M, NativeId>,\n proofMapping: ProofMapping,\n) => makeTargetEmailAddressServices(database, mapping, proofMapping, configuration(database));\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(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 database: Database,\n mapping: EmailRegistrationMapping<Registration, S, I, C, AC, Rq, NativeId>,\n proofMapping: ProofMapping,\n) =>\n makeTargetEmailRegistrationServices<Registration>(\n database,\n mapping,\n proofMapping,\n configuration(database),\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(acquire, (database) =>\n coordinateTargetEmailRegistration<Registration, TransactionOf<D>, Out, E, Exclude<R, TargetId>>(\n database,\n options.mapping,\n options.proofMapping,\n configuration(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":";;;;;AA8CA,MAAM,iBAAiB,cAAwB;CAC7C,MAAM;CACN,SAAS;CACT,iBAAiB,8BAA8B,QAAQ;CACvD,uBAAuB,UAAyB,MAAM,aAAa;CACnE,OAAO;EACL,MAAM;EACN,SAAS;EACT,iBAAiB,8BAA8B,QAAQ;EACvD,iBAAiB,OAAsB,SAAiB,cACtD,MAAM,qBAAqB,EAAE,KAAK,GAAG,UAAU,UAAU,EAAE,CAAC;CAChE;AACF;AAEA,MAAa,gCAMX,UACA,YACG,8BAA8B,UAAU,SAAS,cAAc,QAAQ,CAAC;AAE7E,MAAa,iCAQX,UACA,SACA,iBACG,+BAA+B,UAAU,SAAS,cAAc,cAAc,QAAQ,CAAC;AA0D5F,SAAgB,4BAgBd,SACA,SAKA,MAKA;CACA,OAAO,OAAO,QAAQ,UAAU,aAC9B,6BACE,UACA,QAAQ,SACR,QAAQ,cACR,cAAc,QAAQ,IAEpB,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,UACA,SACA,iBAEA,oCACE,UACA,SACA,cACA,cAAc,QAAQ,CACxB;AAgEF,SAAgB,iCAkBd,SACA,SAMA,MAKA;CACA,OAAO,OAAO,QAAQ,UAAU,aAC9B,kCACE,UACA,QAAQ,SACR,QAAQ,cACR,cAAc,QAAQ,IAEpB,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 { 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"}