/**
*
*
Built-in Loops integration.
*
*
*
*
*
* @module providers/loops
*/
import type { EmailConfig, EmailUserConfig } from "./email.js"
export type LoopsUserConfig = Omit, "options" | "type">
export interface LoopsConfig
extends Omit {
id: string
apiKey: string
transactionalId: string
sendVerificationRequest: (params: Params) => Promise
options: LoopsUserConfig
}
type Params = Parameters[0] & {
provider: LoopsConfig
}
/**
*
* @param config
* @returns LoopsConfig
* @requires LoopsUserConfig
* @example
* ```ts
* Loops({
* apiKey: process.env.AUTH_LOOPS_KEY,
* transactionalId: process.env.AUTH_LOOPS_TRANSACTIONAL_ID,
* })
* ```
*
* @typedef LoopsUserConfig
*/
export default function Loops(config: LoopsUserConfig): LoopsConfig {
return {
id: "loops",
apiKey: "",
type: "email",
name: "Loops",
from: "Auth.js ",
maxAge: 24 * 60 * 60,
transactionalId: config.transactionalId || "",
async sendVerificationRequest(params: Params) {
const { identifier: to, provider, url } = params
if (!provider.apiKey || !provider.transactionalId)
throw new TypeError("Missing Loops API Key or TransactionalId")
const res = await fetch("https://app.loops.so/api/v1/transactional", {
method: "POST",
headers: {
Authorization: `Bearer ${provider.apiKey}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
transactionalId: provider.transactionalId,
email: to,
dataVariables: {
url: url,
},
}),
})
if (!res.ok) {
throw new Error("Loops Send Error: " + JSON.stringify(await res.json()))
}
},
options: config,
}
}