better-auth-harmony
Version:
Validation and normalization for better-auth
1 lines • 1.93 kB
JavaScript
import {APIError}from'better-auth/api';import {createAuthMiddleware}from'better-auth/plugins';import y from'mailchecker';import E from'validator/es/lib/isEmail.js';import b from'validator/es/lib/normalizeEmail.js';var m=["/sign-up/email","/email-otp/verify-email","/sign-in/email-otp","/sign-in/magic-link","/sign-in/email","/forget-password/email-otp","/email-otp/reset-password","/email-otp/create-verification-otp","/email-otp/get-verification-otp","/email-otp/send-verification-otp","/forget-password","/send-verification-email","/change-email"],g=new Set(m),u=new Set(m.slice(1,12)),s=({path:t})=>g.has(t),p=({path:t})=>u.has(t);var x=t=>E(t)&&y.isValid(t),d=t=>({email:t.body?.email??t.query?.email,container:t.body?"body":"query"}),M=({allowNormalizedSignin:t=false,validator:f=x,matchers:n={},normalizer:l=b}={})=>({id:"harmony-email",init(){let e=async i=>{let{email:r,phoneNumber:a}=i;if(!r||a)return {data:i};let o=l(r);return o?{data:{...i,normalizedEmail:o}}:false};return {options:{databaseHooks:{user:{create:{before:e},update:{before:e}}}}}},schema:{user:{fields:{normalizedEmail:{type:"string",required:false,unique:true,input:false,returned:false}}}},hooks:{before:[{matcher:e=>n.validation?n.validation.some(i=>i(e)):s(e),handler:createAuthMiddleware(async e=>{let i=e.path==="/change-email"?e.body?.newEmail:d(e).email;if(typeof i!="string")return;if(!await f(i))throw new APIError("BAD_REQUEST",{message:"Invalid email"})})},{matcher:e=>t&&(n.signIn?n.signIn.some(i=>i(e)):p(e)),handler:createAuthMiddleware(async e=>{let{email:i,container:r}=d(e);if(typeof i!="string")return;let a=l(i);if(a!==i){let o=await e.context.adapter.findOne({model:"user",where:[{field:"normalizedEmail",value:a}]});return o?r==="query"?{context:{...e,query:{...e.query,email:o.email,normalizedEmail:a}}}:{context:{...e,body:{...e.body,email:o.email,normalizedEmail:a}}}:void 0}})}]}}),O=M;export{O as default,x as validateEmail};