{"version":3,"file":"oauth-drivers.mjs","names":[],"sources":["../../src/drizzle/oauth-drivers.ts"],"sourcesContent":["import type { LifecycleHooks } from \"@yielded/auth/Hooks\";\nimport {\n  OAuthAccountsPersistence,\n  OAuthRegistrationIntents,\n  OAuthSignInPersistence,\n} from \"@yielded/auth/OAuth\";\nimport type { Table } from \"drizzle-orm\";\nimport * as Context from \"effect/Context\";\nimport type * as Digest from \"effect/crypto/Digest\";\nimport type * as SecureRandom from \"effect/crypto/SecureRandom\";\nimport * as Effect from \"effect/Effect\";\n\nimport type { D1BatchStatements } from \"./D1BatchStatements\";\nimport { NativeDatabase, nativeDatabase } from \"./native-database\";\nimport { makeOAuthConnectedTarget } from \"./oauth-connected-drivers\";\nimport type {\n  OAuthAccountsMapping,\n  OAuthRegistrationAuthority,\n  OAuthRegistrationIntentMapping,\n  OAuthRegistrationMapping,\n  OAuthSignInMapping,\n} from \"./oauth-model\";\nimport {\n  type OAuthCoordinatorError,\n  coordinateTargetOAuthAccounts,\n  coordinateTargetOAuthSignIn,\n  coordinateTargetOAuthRegistrationIntents,\n  coordinateTargetOAuthRegistration,\n  makeTargetOAuthRegistrationIntentServices,\n  makeTargetOAuthRegistrationServices,\n  makeTargetOAuthSignInServices,\n  makeTargetOAuthAccountsServices,\n  type OAuthTargetConfiguration,\n} from \"./oauth-target\";\nimport type { SuppliedService } from \"./SuppliedService\";\n\n// oxlint-disable-next-line no-explicit-any -- inspect the installed generic transaction signature without erasing its callback parameter.\ntype TransactionOf<D> = D extends { readonly transaction: (...args: any[]) => any }\n  ? Parameters<Parameters<D[\"transaction\"]>[0]>[0]\n  : never;\n\n/** Driver-specific entry points instantiate both the database and table family. */\nexport const makeOAuthTarget = <\n  DatabaseId,\n  D,\n  T extends Table,\n  Extra = unknown,\n  Provided extends D1BatchStatements = never,\n>(\n  databaseService: Context.Service<DatabaseId, D>,\n  configuration: OAuthTargetConfiguration,\n) => {\n  function coordinateOAuthSignIn<\n    Database extends D,\n    S extends T,\n    O extends T,\n    C extends T,\n    AC extends T,\n    F extends T,\n    N,\n    A,\n    E,\n    R,\n    DatabaseError,\n    DatabaseRequirements,\n  >(\n    acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>,\n    options: {\n      readonly mapping: OAuthSignInMapping<S, O, C, AC, F, N> & Extra;\n      readonly transaction?: never;\n    },\n    body: Effect.Effect<A, E, R>,\n  ): Effect.Effect<\n    A,\n    OAuthCoordinatorError<E> | DatabaseError,\n    | Exclude<R, OAuthSignInPersistence | Provided>\n    | (SecureRandom.SecureRandom | Digest.Digest)\n    | LifecycleHooks\n    | DatabaseRequirements\n  >;\n  function coordinateOAuthSignIn<\n    Database extends D,\n    S extends T,\n    O extends T,\n    C extends T,\n    AC extends T,\n    F extends T,\n    N,\n    A,\n    E,\n    R,\n    DatabaseError,\n    DatabaseRequirements,\n    TxId,\n    TxShape,\n  >(\n    acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>,\n    options: {\n      readonly mapping: OAuthSignInMapping<S, O, C, AC, F, N> & Extra;\n      readonly transaction: SuppliedService<\n        TxId,\n        NoInfer<[Provided] extends [never] ? TransactionOf<Database> : never>,\n        TxShape\n      >;\n    },\n    body: Effect.Effect<A, E, R>,\n  ): Effect.Effect<\n    A,\n    OAuthCoordinatorError<E> | DatabaseError,\n    | Exclude<R, OAuthSignInPersistence | TxId | Provided>\n    | (SecureRandom.SecureRandom | Digest.Digest)\n    | LifecycleHooks\n    | DatabaseRequirements\n  >;\n  function coordinateOAuthSignIn<\n    Database extends D,\n    S extends T,\n    O extends T,\n    C extends T,\n    AC extends T,\n    F extends T,\n    N,\n    A,\n    E,\n    R,\n    DatabaseError,\n    DatabaseRequirements,\n    TxId,\n    TxShape,\n  >(\n    acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>,\n    options: {\n      readonly mapping: OAuthSignInMapping<S, O, C, AC, F, N> & Extra;\n      readonly transaction?: SuppliedService<TxId, NoInfer<TransactionOf<Database>>, TxShape>;\n    },\n    body: Effect.Effect<A, E, R>,\n  ): Effect.Effect<\n    A,\n    OAuthCoordinatorError<E> | DatabaseError,\n    | Exclude<R, OAuthSignInPersistence>\n    | (SecureRandom.SecureRandom | Digest.Digest)\n    | LifecycleHooks\n    | DatabaseRequirements\n  > {\n    return Effect.flatMap(nativeDatabase(acquire), (database) =>\n      coordinateTargetOAuthSignIn<\n        TransactionOf<Database>,\n        A,\n        E,\n        Exclude<R, OAuthSignInPersistence>\n      >(\n        database,\n        options.mapping,\n        configuration,\n        (\n          transaction: TransactionOf<Database>,\n          services: { readonly oauthSignInPersistence: OAuthSignInPersistence[\"Service\"] },\n        ) => {\n          const provided = Context.make(OAuthSignInPersistence, services.oauthSignInPersistence);\n          const work = Effect.provideContext(body, provided);\n\n          return options.transaction === undefined\n            ? work\n            : Effect.provideService(work, options.transaction, options.transaction.of(transaction));\n        },\n      ).pipe(Effect.provideService(NativeDatabase, database)),\n    );\n  }\n  function coordinateOAuthRegistrationIntents<\n    Database extends D,\n    O extends T,\n    I extends T,\n    N,\n    A,\n    E,\n    R,\n    DatabaseError,\n    DatabaseRequirements,\n  >(\n    acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>,\n    options: {\n      readonly mapping: OAuthRegistrationIntentMapping<O, I, N> & Extra;\n      readonly transaction?: never;\n    },\n    body: Effect.Effect<A, E, R>,\n  ): Effect.Effect<\n    A,\n    OAuthCoordinatorError<E> | DatabaseError,\n    | Exclude<R, OAuthRegistrationIntents | Provided>\n    | (SecureRandom.SecureRandom | Digest.Digest)\n    | LifecycleHooks\n    | DatabaseRequirements\n  >;\n  function coordinateOAuthRegistrationIntents<\n    Database extends D,\n    O extends T,\n    I extends T,\n    N,\n    A,\n    E,\n    R,\n    DatabaseError,\n    DatabaseRequirements,\n    TxId,\n    TxShape,\n  >(\n    acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>,\n    options: {\n      readonly mapping: OAuthRegistrationIntentMapping<O, I, N> & Extra;\n      readonly transaction: SuppliedService<\n        TxId,\n        NoInfer<[Provided] extends [never] ? TransactionOf<Database> : never>,\n        TxShape\n      >;\n    },\n    body: Effect.Effect<A, E, R>,\n  ): Effect.Effect<\n    A,\n    OAuthCoordinatorError<E> | DatabaseError,\n    | Exclude<R, OAuthRegistrationIntents | TxId | Provided>\n    | (SecureRandom.SecureRandom | Digest.Digest)\n    | LifecycleHooks\n    | DatabaseRequirements\n  >;\n  function coordinateOAuthRegistrationIntents<\n    Database extends D,\n    O extends T,\n    I extends T,\n    N,\n    A,\n    E,\n    R,\n    DatabaseError,\n    DatabaseRequirements,\n    TxId,\n    TxShape,\n  >(\n    acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>,\n    options: {\n      readonly mapping: OAuthRegistrationIntentMapping<O, I, N> & Extra;\n      readonly transaction?: SuppliedService<TxId, NoInfer<TransactionOf<Database>>, TxShape>;\n    },\n    body: Effect.Effect<A, E, R>,\n  ): Effect.Effect<\n    A,\n    OAuthCoordinatorError<E> | DatabaseError,\n    | Exclude<R, OAuthRegistrationIntents>\n    | (SecureRandom.SecureRandom | Digest.Digest)\n    | LifecycleHooks\n    | DatabaseRequirements\n  > {\n    return Effect.flatMap(nativeDatabase(acquire), (database) =>\n      coordinateTargetOAuthRegistrationIntents<\n        TransactionOf<Database>,\n        A,\n        E,\n        Exclude<R, OAuthRegistrationIntents>\n      >(\n        database,\n        options.mapping,\n        configuration,\n        (\n          transaction: TransactionOf<Database>,\n          services: { readonly oauthRegistrationIntents: OAuthRegistrationIntents[\"Service\"] },\n        ) => {\n          const provided = Context.make(\n            OAuthRegistrationIntents,\n            services.oauthRegistrationIntents,\n          );\n\n          const work = Effect.provideContext(body, provided);\n\n          return options.transaction === undefined\n            ? work\n            : Effect.provideService(work, options.transaction, options.transaction.of(transaction));\n        },\n      ).pipe(Effect.provideService(NativeDatabase, database)),\n    );\n  }\n  function coordinateOAuthAccounts<\n    Database extends D,\n    S extends T,\n    O extends T,\n    C extends T,\n    AC extends T,\n    F extends T,\n    N,\n    A,\n    E,\n    R,\n    DatabaseError,\n    DatabaseRequirements,\n  >(\n    acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>,\n    options: {\n      readonly mapping: OAuthAccountsMapping<S, O, C, AC, F, N> & Extra;\n      readonly transaction?: never;\n    },\n    body: Effect.Effect<A, E, R>,\n  ): Effect.Effect<\n    A,\n    OAuthCoordinatorError<E> | DatabaseError,\n    | Exclude<R, OAuthAccountsPersistence | Provided>\n    | (SecureRandom.SecureRandom | Digest.Digest)\n    | LifecycleHooks\n    | DatabaseRequirements\n  >;\n  function coordinateOAuthAccounts<\n    Database extends D,\n    S extends T,\n    O extends T,\n    C extends T,\n    AC extends T,\n    F extends T,\n    N,\n    A,\n    E,\n    R,\n    DatabaseError,\n    DatabaseRequirements,\n    TxId,\n    TxShape,\n  >(\n    acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>,\n    options: {\n      readonly mapping: OAuthAccountsMapping<S, O, C, AC, F, N> & Extra;\n      readonly transaction: SuppliedService<\n        TxId,\n        NoInfer<[Provided] extends [never] ? TransactionOf<Database> : never>,\n        TxShape\n      >;\n    },\n    body: Effect.Effect<A, E, R>,\n  ): Effect.Effect<\n    A,\n    OAuthCoordinatorError<E> | DatabaseError,\n    | Exclude<R, OAuthAccountsPersistence | TxId | Provided>\n    | (SecureRandom.SecureRandom | Digest.Digest)\n    | LifecycleHooks\n    | DatabaseRequirements\n  >;\n  function coordinateOAuthAccounts<\n    Database extends D,\n    S extends T,\n    O extends T,\n    C extends T,\n    AC extends T,\n    F extends T,\n    N,\n    A,\n    E,\n    R,\n    DatabaseError,\n    DatabaseRequirements,\n    TxId,\n    TxShape,\n  >(\n    acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>,\n    options: {\n      readonly mapping: OAuthAccountsMapping<S, O, C, AC, F, N> & Extra;\n      readonly transaction?: SuppliedService<TxId, NoInfer<TransactionOf<Database>>, TxShape>;\n    },\n    body: Effect.Effect<A, E, R>,\n  ): Effect.Effect<\n    A,\n    OAuthCoordinatorError<E> | DatabaseError,\n    | Exclude<R, OAuthAccountsPersistence>\n    | (SecureRandom.SecureRandom | Digest.Digest)\n    | LifecycleHooks\n    | DatabaseRequirements\n  > {\n    return Effect.flatMap(nativeDatabase(acquire), (database) =>\n      coordinateTargetOAuthAccounts<\n        TransactionOf<Database>,\n        A,\n        E,\n        Exclude<R, OAuthAccountsPersistence>\n      >(\n        database,\n        options.mapping,\n        configuration,\n        (\n          transaction: TransactionOf<Database>,\n          services: { readonly oauthAccountsPersistence: OAuthAccountsPersistence[\"Service\"] },\n        ) => {\n          const provided = Context.make(\n            OAuthAccountsPersistence,\n            services.oauthAccountsPersistence,\n          );\n\n          const work = Effect.provideContext(body, provided);\n\n          return options.transaction === undefined\n            ? work\n            : Effect.provideService(work, options.transaction, options.transaction.of(transaction));\n        },\n      ).pipe(Effect.provideService(NativeDatabase, database)),\n    );\n  }\n  function coordinateOAuthRegistration<\n    Database extends D,\n    TargetId,\n    Registration,\n    S extends T,\n    O extends T,\n    C extends T,\n    AC extends T,\n    I extends T,\n    N,\n    A,\n    E,\n    R,\n    DatabaseError,\n    DatabaseRequirements,\n  >(\n    acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>,\n    options: {\n      readonly mapping: OAuthRegistrationMapping<NoInfer<Registration>, S, O, C, AC, I, N> & Extra;\n      readonly target: SuppliedService<TargetId, OAuthRegistrationAuthority<Registration>>;\n      readonly transaction?: never;\n    },\n    body: Effect.Effect<A, E, R>,\n  ): Effect.Effect<\n    A,\n    OAuthCoordinatorError<E> | DatabaseError,\n    | Exclude<R, TargetId | Provided>\n    | (SecureRandom.SecureRandom | Digest.Digest)\n    | LifecycleHooks\n    | DatabaseRequirements\n  >;\n  function coordinateOAuthRegistration<\n    Database extends D,\n    TargetId,\n    Registration,\n    S extends T,\n    O extends T,\n    C extends T,\n    AC extends T,\n    I extends T,\n    N,\n    A,\n    E,\n    R,\n    DatabaseError,\n    DatabaseRequirements,\n    TxId,\n    TxShape,\n  >(\n    acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>,\n    options: {\n      readonly mapping: OAuthRegistrationMapping<NoInfer<Registration>, S, O, C, AC, I, N> & Extra;\n      readonly target: SuppliedService<TargetId, OAuthRegistrationAuthority<Registration>>;\n      readonly transaction: SuppliedService<\n        TxId,\n        NoInfer<[Provided] extends [never] ? TransactionOf<Database> : never>,\n        TxShape\n      >;\n    },\n    body: Effect.Effect<A, E, R>,\n  ): Effect.Effect<\n    A,\n    OAuthCoordinatorError<E> | DatabaseError,\n    | Exclude<R, TargetId | TxId | Provided>\n    | (SecureRandom.SecureRandom | Digest.Digest)\n    | LifecycleHooks\n    | DatabaseRequirements\n  >;\n  function coordinateOAuthRegistration<\n    Database extends D,\n    TargetId,\n    Registration,\n    S extends T,\n    O extends T,\n    C extends T,\n    AC extends T,\n    I extends T,\n    N,\n    A,\n    E,\n    R,\n    DatabaseError,\n    DatabaseRequirements,\n    TxId,\n    TxShape,\n  >(\n    acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>,\n    options: {\n      readonly mapping: OAuthRegistrationMapping<NoInfer<Registration>, S, O, C, AC, I, N> & Extra;\n      readonly target: SuppliedService<TargetId, OAuthRegistrationAuthority<Registration>>;\n      readonly transaction?: SuppliedService<TxId, NoInfer<TransactionOf<Database>>, TxShape>;\n    },\n    body: Effect.Effect<A, E, R>,\n  ): Effect.Effect<\n    A,\n    OAuthCoordinatorError<E> | DatabaseError,\n    | Exclude<R, TargetId>\n    | (SecureRandom.SecureRandom | Digest.Digest)\n    | LifecycleHooks\n    | DatabaseRequirements\n  > {\n    return Effect.flatMap(nativeDatabase(acquire), (database) =>\n      coordinateTargetOAuthRegistration<\n        Registration,\n        TransactionOf<Database>,\n        A,\n        E,\n        Exclude<R, TargetId>\n      >(\n        database,\n        options.mapping,\n        configuration,\n        (\n          transaction: TransactionOf<Database>,\n          services: { readonly registrationAuthority: OAuthRegistrationAuthority<Registration> },\n        ) => {\n          const provided = Context.make(options.target, services.registrationAuthority);\n          const work = Effect.provideContext(body, provided);\n\n          return options.transaction === undefined\n            ? work\n            : Effect.provideService(work, options.transaction, options.transaction.of(transaction));\n        },\n      ).pipe(Effect.provideService(NativeDatabase, database)),\n    );\n  }\n\n  return {\n    ...makeOAuthConnectedTarget<DatabaseId, D, T, Extra, Provided>(databaseService, configuration),\n    coordinateOAuthSignIn,\n    coordinateOAuthRegistrationIntents,\n    coordinateOAuthAccounts,\n    makeOAuthAccountsServices: <\n      S extends T,\n      O extends T,\n      C extends T,\n      AC extends T,\n      F extends T,\n      N,\n    >(\n      mapping: OAuthAccountsMapping<S, O, C, AC, F, N> & Extra,\n    ) =>\n      makeTargetOAuthAccountsServices(mapping, configuration).pipe(\n        Effect.provideServiceEffect(NativeDatabase, nativeDatabase(databaseService)),\n      ),\n    makeOAuthSignInServices: <S extends T, O extends T, C extends T, AC extends T, F extends T, N>(\n      mapping: OAuthSignInMapping<S, O, C, AC, F, N> & Extra,\n    ) =>\n      makeTargetOAuthSignInServices(mapping, configuration).pipe(\n        Effect.provideServiceEffect(NativeDatabase, nativeDatabase(databaseService)),\n      ),\n    makeOAuthRegistrationIntentServices: <O extends T, I extends T, N>(\n      mapping: OAuthRegistrationIntentMapping<O, I, N> & Extra,\n    ) =>\n      makeTargetOAuthRegistrationIntentServices(mapping, configuration).pipe(\n        Effect.provideServiceEffect(NativeDatabase, nativeDatabase(databaseService)),\n      ),\n    makeOAuthRegistrationServices: <\n      Registration,\n      S extends T,\n      O extends T,\n      C extends T,\n      AC extends T,\n      I extends T,\n      N,\n    >(\n      mapping: OAuthRegistrationMapping<Registration, S, O, C, AC, I, N> & Extra,\n    ) =>\n      makeTargetOAuthRegistrationServices<Registration>(mapping, configuration).pipe(\n        Effect.provideServiceEffect(NativeDatabase, nativeDatabase(databaseService)),\n      ),\n    coordinateOAuthRegistration,\n  };\n};\n"],"mappings":";;;;;;;;AA0CA,MAAa,mBAOX,iBACA,kBACG;CA+DH,SAAS,sBAgBP,SACA,SAIA,MAQA;EACA,OAAO,OAAO,QAAQ,eAAe,OAAO,IAAI,aAC9C,4BAME,UACA,QAAQ,SACR,gBAEE,aACA,aACG;GACH,MAAM,WAAW,QAAQ,KAAK,wBAAwB,SAAS,sBAAsB;GACrF,MAAM,OAAO,OAAO,eAAe,MAAM,QAAQ;GAEjD,OAAO,QAAQ,gBAAgB,KAAA,IAC3B,OACA,OAAO,eAAe,MAAM,QAAQ,aAAa,QAAQ,YAAY,GAAG,WAAW,CAAC;EAC1F,CACF,CAAC,CAAC,KAAK,OAAO,eAAe,gBAAgB,QAAQ,CAAC,CACxD;CACF;CAyDA,SAAS,mCAaP,SACA,SAIA,MAQA;EACA,OAAO,OAAO,QAAQ,eAAe,OAAO,IAAI,aAC9C,yCAME,UACA,QAAQ,SACR,gBAEE,aACA,aACG;GACH,MAAM,WAAW,QAAQ,KACvB,0BACA,SAAS,wBACX;GAEA,MAAM,OAAO,OAAO,eAAe,MAAM,QAAQ;GAEjD,OAAO,QAAQ,gBAAgB,KAAA,IAC3B,OACA,OAAO,eAAe,MAAM,QAAQ,aAAa,QAAQ,YAAY,GAAG,WAAW,CAAC;EAC1F,CACF,CAAC,CAAC,KAAK,OAAO,eAAe,gBAAgB,QAAQ,CAAC,CACxD;CACF;CA+DA,SAAS,wBAgBP,SACA,SAIA,MAQA;EACA,OAAO,OAAO,QAAQ,eAAe,OAAO,IAAI,aAC9C,8BAME,UACA,QAAQ,SACR,gBAEE,aACA,aACG;GACH,MAAM,WAAW,QAAQ,KACvB,0BACA,SAAS,wBACX;GAEA,MAAM,OAAO,OAAO,eAAe,MAAM,QAAQ;GAEjD,OAAO,QAAQ,gBAAgB,KAAA,IAC3B,OACA,OAAO,eAAe,MAAM,QAAQ,aAAa,QAAQ,YAAY,GAAG,WAAW,CAAC;EAC1F,CACF,CAAC,CAAC,KAAK,OAAO,eAAe,gBAAgB,QAAQ,CAAC,CACxD;CACF;CAqEA,SAAS,4BAkBP,SACA,SAKA,MAQA;EACA,OAAO,OAAO,QAAQ,eAAe,OAAO,IAAI,aAC9C,kCAOE,UACA,QAAQ,SACR,gBAEE,aACA,aACG;GACH,MAAM,WAAW,QAAQ,KAAK,QAAQ,QAAQ,SAAS,qBAAqB;GAC5E,MAAM,OAAO,OAAO,eAAe,MAAM,QAAQ;GAEjD,OAAO,QAAQ,gBAAgB,KAAA,IAC3B,OACA,OAAO,eAAe,MAAM,QAAQ,aAAa,QAAQ,YAAY,GAAG,WAAW,CAAC;EAC1F,CACF,CAAC,CAAC,KAAK,OAAO,eAAe,gBAAgB,QAAQ,CAAC,CACxD;CACF;CAEA,OAAO;EACL,GAAG,yBAA4D,iBAAiB,aAAa;EAC7F;EACA;EACA;EACA,4BAQE,YAEA,gCAAgC,SAAS,aAAa,CAAC,CAAC,KACtD,OAAO,qBAAqB,gBAAgB,eAAe,eAAe,CAAC,CAC7E;EACF,0BACE,YAEA,8BAA8B,SAAS,aAAa,CAAC,CAAC,KACpD,OAAO,qBAAqB,gBAAgB,eAAe,eAAe,CAAC,CAC7E;EACF,sCACE,YAEA,0CAA0C,SAAS,aAAa,CAAC,CAAC,KAChE,OAAO,qBAAqB,gBAAgB,eAAe,eAAe,CAAC,CAC7E;EACF,gCASE,YAEA,oCAAkD,SAAS,aAAa,CAAC,CAAC,KACxE,OAAO,qBAAqB,gBAAgB,eAAe,eAAe,CAAC,CAC7E;EACF;CACF;AACF"}