@better-auth-kit/convex
Version:
Convex Database Adapter for Better-Auth.
4 lines (2 loc) • 12.3 kB
JavaScript
import{v as R}from"convex/values";function X(b,t){let u=y(b);return Z(u,{value:0},t)}function y(b){let t=[],u="",O=!1;for(let j=0;j<b.length;j++){let M=b[j];if(M==='"'&&b[j-1]!=="\\"){if(O)t.push({type:"string",value:u}),u="";O=!O;continue}if(O){u+=M;continue}if(M==="["||M==="]"){if(u){if(!Number.isNaN(Number(u.trim())))t.push({type:"number",value:u.trim()});else t.push({type:"function",value:u.trim()});u=""}t.push({type:"bracket",value:M})}else if(M==="("||M===")"){if(u){if(!Number.isNaN(Number(u.trim())))t.push({type:"number",value:u.trim()});else t.push({type:"function",value:u.trim()});u=""}t.push({type:"parenthesis",value:M})}else if(M===","){if(u){if(!Number.isNaN(Number(u.trim())))t.push({type:"number",value:u.trim()});else t.push({type:"function",value:u.trim()});u=""}t.push({type:"comma",value:","})}else if(M===" "){if(u){if(!Number.isNaN(Number(u.trim())))t.push({type:"number",value:u.trim()});else t.push({type:"function",value:u.trim()});u=""}}else u+=M}if(u)if(!Number.isNaN(Number(u.trim())))t.push({type:"number",value:u.trim()});else t.push({type:"function",value:u.trim()});return t}function Q(b,t,u){let O=[];t.value++;while(t.value<b.length&&b[t.value].type!=="bracket"){if(b[t.value].type==="comma"){t.value++;continue}O.push(Z(b,t,u))}if(b[t.value]?.value!=="]")throw new Error("Expected closing bracket for array");return t.value++,O}function Z(b,t,u){if(t.value>=b.length)throw new Error("Unexpected end of input");let O=b[t.value];if(t.value++,O.type==="bracket"&&O.value==="[")return t.value--,Q(b,t,u);if(O.type==="function"){if(O.value.startsWith("q.")){let j=O.value.slice(2);if(b[t.value]?.type!=="parenthesis"||b[t.value]?.value!=="(")throw new Error("Expected opening parenthesis");t.value++;let M=[];while(t.value<b.length&&b[t.value].type!=="parenthesis"){if(b[t.value].type==="comma"){t.value++;continue}let P=Z(b,t,u);if(j==="eq"&&M.length===1&&M[0]?.inner?.$field==="_id"&&typeof P==="string")M.push(P);else M.push(P)}if(b[t.value]?.value!==")")throw new Error("Expected closing parenthesis");return t.value++,u[j](...M)}}else if(O.type==="string")return O.value;else if(O.type==="number")return Number(O.value);throw new Error(`Unexpected token: ${JSON.stringify(O)}`)}function B(b){switch(b){case"id":return"_id";case"createdAt":return"_creationTime";default:return b}}var q={eq:(b,t)=>`q.eq(q.field("${B(b)}"), ${JSON.stringify(t)})`,add:(b,t)=>`q.add(q.field("${B(b)}"), ${JSON.stringify(t)})`,sub:(b,t)=>`q.sub(q.field("${B(b)}"), ${JSON.stringify(t)})`,mul:(b,t)=>`q.mul(q.field("${B(b)}"), ${JSON.stringify(t)})`,div:(b,t)=>`q.div(q.field("${B(b)}"), ${JSON.stringify(t)})`,mod:(b,t)=>`q.mod(q.field("${B(b)}"), ${JSON.stringify(t)})`,neg:(b,t)=>`q.neg(q.field("${B(b)}"), ${JSON.stringify(t)})`,gt:(b,t)=>`q.gt(q.field("${B(b)}"), ${JSON.stringify(t)})`,lt:(b,t)=>`q.lt(q.field("${B(b)}"), ${JSON.stringify(t)})`,gte:(b,t)=>`q.gte(q.field("${B(b)}"), ${JSON.stringify(t)})`,lte:(b,t)=>`q.lte(q.field("${B(b)}"), ${JSON.stringify(t)})`,in:(b,t)=>`q.in(q.field("${B(b)}"), ${JSON.stringify(t)})`,ne:(b,t)=>`q.neq(q.field("${B(b)}"), ${JSON.stringify(t)})`,and:(...b)=>`q.and(${b.join(", ")})`,or:(...b)=>`q.or(${b.join(", ")})`};function W(b){return b(q)}function v({action:b,internalQuery:t,internalMutation:u,internal:O},j){let M=b({args:{action:R.string(),value:R.any()},handler:async(N,A)=>{if(A.action==="query")return await N.runQuery(O.betterAuth.query,{query:A.value.query,tableName:A.value.tableName,limit:A.value.limit,offset:A.value.offset,order:A.value.order,single:A.value.single,paginationOpts:A.value.paginationOpts});if(A.action==="insert")try{return{_id:await N.runMutation(O.betterAuth.insert,{tableName:A.value.tableName,values:A.value.values}),...A.value.values}}catch(c){return c}if(A.action==="update")return await N.runMutation(O.betterAuth.update,{tableName:A.value.tableName,query:A.value.query,update:A.value.update});if(A.action==="delete")return await N.runMutation(O.betterAuth.delete_,{tableName:A.value.tableName,query:A.value.query,deleteAll:A.value.deleteAll});if(A.action==="count")return await N.runMutation(O.betterAuth.count,{tableName:A.value.tableName,query:A.value.query})}}),P=t({args:{tableName:R.string(),query:R.optional(R.any()),order:R.optional(R.string()),single:R.optional(R.boolean()),limit:R.optional(R.number()),paginationOpts:R.optional(R.object({numItems:R.optional(R.number()),cursor:R.optional(R.string())}))},handler:async(N,A)=>{let c=N.db.query(A.tableName).order(A.order||"asc");if(A.query)c=c.filter((L)=>{return X(A.query,L)});if(A.paginationOpts)return await c.paginate(A.paginationOpts);if(A.single===!0)return await c.first();if(typeof A.limit==="number")return await c.take(A.limit);return await c.collect()}}),K=u({args:{tableName:R.string(),values:R.any()},handler:async(N,A)=>{return await N.db.insert(A.tableName,A.values)}}),U=u({args:{tableName:R.string(),query:R.any(),update:R.any()},async handler(N,{tableName:A,update:c,query:L}){let m=await N.db.query(A).filter((I)=>{return X(L,I)}).first();if(!m)return;return await N.db.patch(m._id,c),Object.assign(m,c)}}),C=u({args:{tableName:R.string(),query:R.any(),deleteAll:R.optional(R.boolean())},async handler(N,{tableName:A,query:c,deleteAll:L}){let m=N.db.query(A).filter(($)=>{return X(c,$)});if(!L){let $=await m.first();if(!$)return;await N.db.delete($._id);return}let I=await m.collect();if(!I)return;I.forEach(($)=>{N.db.delete($._id)});return}}),D=t({args:{tableName:R.string(),query:R.optional(R.any())},handler:async(N,A)=>{return(await N.db.query(A.tableName).filter((L)=>{return X(A.query,L)}).collect()).length}}),H=t({args:{sessionToken:R.string()},handler:async(N,A)=>{return N.db.query(j?.sessionModelName||"session").filter((c)=>c.eq(c.field("token"),A.sessionToken)).first()}});return{betterAuth:M,query:P,insert:K,update:U,delete_:C,count:D,getSession:H}}import{generateId as _}from"better-auth";import{getAuthTables as F}from"better-auth/db";import{anyApi as Y}from"convex/server";async function z(b,t){return await b.action(Y.betterAuth.betterAuth,{action:"query",value:t})}async function G(b,t){return await b.action(Y.betterAuth.betterAuth,{action:"count",value:t})}async function p(b,t){return await b.action(Y.betterAuth.betterAuth,{action:"insert",value:t})}async function E(b,t){return await b.action(Y.betterAuth.betterAuth,{action:"update",value:t})}async function S(b,t){return await b.action(Y.betterAuth.betterAuth,{action:"delete",value:t})}var T=({config:b,options:t,client:u})=>{let O=F(t);function j(C){if(!C)return[];let D=[];for(let H of C)if(H.operator==="in")H.value.forEach((N,A)=>{D.push({field:H.field,value:N,operator:"eq",connector:A<H.value.length-1?"OR":void 0})});else D.push(H);return D}async function M(C){if(C.action==="query")return await z(u,{tableName:C.tableName,order:C.order,query:C.query,single:C.single,limit:C.limit,paginationOpts:C.paginationOpts});if(C.action==="insert")return await p(u,{tableName:C.tableName,values:C.values});if(C.action==="delete")return await S(u,{tableName:C.tableName,query:C.query,deleteAll:C.deleteAll});if(C.action==="update")return await E(u,{tableName:C.tableName,query:C.query,update:C.update});if(C.action==="count")return await G(u,{tableName:C.tableName,query:C.query});return""}let P=(C)=>{return O[C].modelName!==C?O[C].modelName:C};function K(C){if(!C)return;let D=["contains","starts_with","ends_with"];if(C.filter((H)=>D.includes(H.operator||"")).length>0)throw new Error(`Convex does not support ${D.join(", ")} operators`)}let U=t?.advanced?.generateId===!1;return{transformInput(C,D,H){let N=U||H==="update"?{}:{id:t.advanced?.generateId?t.advanced.generateId({model:D}):C.id||_()},A=O[D].fields;for(let c in A){let L=C[c];if(L===void 0&&!A[c].defaultValue)continue;N[A[c].fieldName||c]=n(L,A[c],H)}for(let c in N)if(c==="id")delete N[c];else if(c==="createdAt")delete N[c];else if(N[c]instanceof Date)N[c]=N[c].toISOString();return N},transformOutput(C,D){for(let H in C){let N=P(D);if(O[N]?.fields[H]?.type==="date")C[H]=new Date(C[H]);if(H==="_id")C.id=C[H],delete C[H];else if(H==="_creationTime")C.createdAt=new Date(C[H]),delete C[H]}return C},getModelName:P,db:M,filterInvalidOperators:K,transformWhereOperators:j}};function n(b,t,u){if(u==="update")return b;if(b===void 0||b===null){if(t.defaultValue){if(typeof t.defaultValue==="function")return t.defaultValue();return t.defaultValue}}return b}var e=(b,t={})=>{function u(O){if(t.enable_debug_logs)console.log("[convex-adapter]",...O)}return(O)=>{let{transformInput:j,filterInvalidOperators:M,db:P,transformOutput:K,transformWhereOperators:U}=T({config:t,options:O,client:b});return{id:"convex",create:async({data:C,model:D,select:H})=>{let N=Date.now();u(["create",{model:D,values:C,select:H}]);let A=j(C,D,"create"),c=await P({action:"insert",tableName:D,values:A}),L=null;if(!H||H.length===0)L=c;else{L={};for(let m of H)L[m]=c[m]}return L=L?K(L,D):L,u(["create result",{result:L,duration:`${Date.now()-N}ms`}]),L},findOne:async({model:C,where:D,select:H})=>{let N=Date.now();M(D),D=U(D),u(["findOne",{model:C,where:D,select:H}]);let A=await P({action:"query",tableName:C,query:W((L)=>{return D.map((I)=>L.eq(I.field,I.value)).reduce((I,$,J)=>L[(D[J-1].connector||"AND").toLowerCase()](I,$))}),single:!0}),c=null;if(!H||H.length===0)c=A;else{c={};for(let L of H)c[L]=A[L]}return c=c?K(c,C):c,u(["findOne result",{result:c,duration:`${Date.now()-N}ms`}]),c},findMany:async({model:C,where:D,limit:H,offset:N,sortBy:A})=>{let c=Date.now();M(D),D=U(D),u(["findMany",{model:C,where:D,limit:H,offset:N,sortBy:A}]);let L=D&&D.length>0?W((m)=>{let I=D.map(($)=>m[$.operator||"eq"]($.field,$.value));if(I.length===1)return I[0];return I.reduce(($,J,V)=>m[(D[V-1].connector||"AND").toLowerCase()]($,J))}):null;if(u(["findMany queryString",{queryString:L}]),typeof N==="number"){let m=void 0,I=!1,$=[];while(!I){let J=await P({action:"query",tableName:C,query:L??void 0,order:A?.direction,single:!1,limit:H,paginationOpts:{numItems:100,cursor:m}});if(m=J.continueCursor,$.push(...J.page),u(["findMany paginated page",{page:J.page}]),$.length>=N+(H||1)){I=!0;let V=(H?$.slice(N,N+H):$.slice(N)).map((f)=>K(f,C));return u(["findMany pagination done",{result:V,duration:`${Date.now()-c}ms`}]),V}}}else{let I=(await P({action:"query",tableName:C,query:L?L:void 0,order:A?.direction,single:!1,limit:H})).map(($)=>K($,C));return u(["findMany result",{result:I,duration:`${Date.now()-c}ms`}]),I}},update:async({model:C,where:D,update:H})=>{let N=Date.now();M(D),D=U(D),u(["update",{model:C,where:D,update:H}]);let A=j(H,C,"update"),c=await P({action:"update",tableName:C,query:W((m)=>{return D.map(($)=>m[$.operator||"eq"]($.field,$.value)).reduce(($,J,V)=>m[(D[V-1].connector||"AND").toLowerCase()]($,J))}),update:A}),L=K(c,C);return u(["update result",{result:L,duration:`${Date.now()-N}ms`}]),L},updateMany:async({model:C,where:D,update:H})=>{let N=Date.now();M(D),D=U(D),u(["updateMany",{model:C,where:D,update:H}]);let A=j(H,C,"update"),c=await P({action:"update",tableName:C,query:W((m)=>{return D.map(($)=>m[$.operator||"eq"]($.field,$.value)).reduce(($,J,V)=>m[(D[V-1].connector||"AND").toLowerCase()]($,J))}),update:A}),L=K(c,C);return u(["updateMany result",{result:L,duration:`${Date.now()-N}ms`}]),L},delete:async({model:C,where:D})=>{let H=Date.now();M(D),D=U(D),u(["delete",{model:C,where:D}]),await P({action:"delete",tableName:C,query:W((N)=>{return D.map((c)=>N[c.operator||"eq"](c.field,c.value)).reduce((c,L,m)=>N[(D[m-1].connector||"AND").toLowerCase()](c,L))})}),u(["delete complete",{duration:`${Date.now()-H}ms`}]);return},deleteMany:async({model:C,where:D})=>{let H=Date.now();M(D),D=U(D),u(["deleteMany",{model:C,where:D}]);let N=await P({action:"delete",tableName:C,deleteAll:!0,query:W((A)=>{return D.map((L)=>A[L.operator||"eq"](L.field,L.value)).reduce((L,m,I)=>A[(D[I-1].connector||"AND").toLowerCase()](L,m))})});return u(["deleteMany result",{result:N,duration:`${Date.now()-H}ms`}]),N},count:async({model:C,where:D})=>{return await P({action:"count",tableName:C,query:W((N)=>{if(!D)return"";return D.map((c)=>N[c.operator||"eq"](c.field,c.value)).reduce((c,L,m)=>N[(D[m-1].connector||"AND").toLowerCase()](c,L))})})}}}};export{e as convexAdapter};
//# debugId=EF32B4D6DF3BB27164756E2164756E21