surreal-better-auth 2.0.0-beta.4 → 2.0.0-beta.6

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.
package/README.md CHANGED
@@ -79,6 +79,7 @@ import { surrealdbAdapter } from "surreal-better-auth";
79
79
  import { db } from "./db"; // Your SurrealDB client instance
80
80
 
81
81
  export const auth = betterAuth({
82
+ // Whenever possible, always prefer ws over http for surrealdb instances.
82
83
  database: surrealdbAdapter(db, {
83
84
  // ID strategy: "ULID", "UUIDv4", "UUIDv7", or "guid"
84
85
  idGenerator: "guid",
package/index.mjs CHANGED
@@ -1,7 +1,7 @@
1
- import{createAdapterFactory as e}from"better-auth/adapters";import{DateTime as t,RecordId as n,StringRecordId as r,Table as i,escapeIdent as a,raw as o,surql as s}from"surrealdb";import{logger as c}from"better-auth";function l(e,t,i){if(e instanceof n||e instanceof r)return e;if(typeof e==`string`){if(e.includes(`:`)){let[r,...i]=e.split(`:`),a=i.join(`:`);return t.has(r)?new n(r,a):e}if(i&&t.has(i))return new n(i,e)}return e}const u=(e,t,n,r,i)=>{if(r.account&&e===n(`account`)&&t===`accountId`){let e=r.user?n(`user`):null;return i?i.providerId===`credential`?e:null:e}if(r.oauthAccessToken&&r.oauthConsent){let i=n(`oauthAccessToken`),a=n(`oauthConsent`);if((e===i||e===a)&&t===`clientId`)return r.oauthApplication?n(`oauthApplication`):null}return null},d=(e,t,n,r,i)=>(c,d)=>{if(!c||c.length===0)return null;let f=s``,p=n(d);return c.forEach((c,m)=>{m>0&&f.append(s` ${o(c.connector||`AND`)} `);let h=e({field:c.field,model:d}),g=t({field:c.field,model:d}),_=c.value,v=u(p,c.field,n,i);if(!v&&(c.field===`id`||g?.references)){let e=g?.references?.model;v=e?n(e):p}v&&(Array.isArray(_)?_=_.map(e=>l(e,r,v)):_!=null&&(_=l(_,r,v)));let y=o(a(h));switch(c.operator){case`eq`:case void 0:f.append(s`${y} = ${_}`);break;case`ne`:f.append(s`${y} != ${_}`);break;case`gt`:f.append(s`${y} > ${_}`);break;case`gte`:f.append(s`${y} >= ${_}`);break;case`lt`:f.append(s`${y} < ${_}`);break;case`lte`:f.append(s`${y} <= ${_}`);break;case`in`:f.append(s`${y} IN ${_}`);break;case`not_in`:f.append(s`${y} NOT IN ${_}`);break;case`contains`:f.append(s`${y} CONTAINS ${_}`);break;case`starts_with`:f.append(s`string::starts_with(${y}, ${_})`);break;case`ends_with`:f.append(s`string::ends_with(${y}, ${_})`);break;default:throw Error(`[SurrealDB Adapter]: Unsupported operator "${c.operator}"`)}}),f},f=(e,t,n)=>e?Object.entries(e).map(([e,n])=>t({model:e,field:n.on.to})):null;function p(e){let t={...e};for(let e of Object.keys(t))t[e]===null&&(t[e]=void 0);return t}const m={modelNotFound:(e,t)=>{t?.debugLogs&&c.debug(`[surreal-better-auth]: Model '${e}' not found in schema, skipping operation `)},fieldMappingSkipped:(e,t,n)=>{n?.debugLogs&&c.debug(`[surreal-better-auth]: Skipping field mapping rule for '${e}': ${t} `)},unsupportedOperator:(e,t)=>{t?.debugLogs&&c.warn(`[surreal-better-auth]: Unknown operator '${e}', falling back to equality comparison `)}};function h(e,t,n,r,i,a,o){let s=g[i({model:r(e),field:t})];if(s)try{let n=a(s);return o?.debugLogs&&c.debug(`[surreal-better-auth]: Found default reference: ${e}.${t} -> ${n} `),n}catch{m.modelNotFound(s,o)}let l=n.tableSpecific[e]?.[t];return l&&o?.debugLogs&&c.debug(`[surreal-better-auth]: Found table-specific reference: ${e}.${t} -> ${l} `),l||null}const g={userId:`user`,organizationId:`organization`,teamId:`team`,inviterId:`user`,activeOrganizationId:`organization`,activeTeamId:`team`};function _(e,t,n){let r={tableSpecific:{}};if(!e)return r;for(let i in e){let a=e[i];if(!a?.fields)continue;let o=t(i);r.tableSpecific[o]||(r.tableSpecific[o]={});for(let e in a.fields){let s=a.fields[e];if(s?.references?.model){let a=n({model:i,field:e}),c=t(s.references.model);r.tableSpecific[o][a]=c}}}return r}const v={reset:`\x1B[0m`,bold:`\x1B[1m`,dim:`\x1B[90m`,border:`\x1B[38;5;238m`,fg:{blue:`\x1B[34m`,cyan:`\x1B[36m`,green:`\x1B[32m`,yellow:`\x1B[33m`,purple:`\x1B[35m`}};function y(e,t,n,r){if(!e?.debugLogs&&!e?.logSurrealQL||typeof e.debugLogs==`object`&&!(`isRunningAdapterTests`in e.debugLogs)&&!e.debugLogs[t])return;let i=r.query,a=r.bindings||{},o=e=>{if(typeof e==`string`)return e.includes(`:`)?`${v.fg.cyan}${e}${v.reset}`:`${v.fg.green}'${e}'${v.reset}`;if(typeof e==`number`||typeof e==`boolean`)return`${v.fg.yellow}${e}${v.reset}`;if(e===null)return`${v.dim}null${v.reset}`;if(e===void 0)return`${v.dim}undefined${v.reset}`;let t=``;try{t=JSON.stringify(e,null,2)}catch{t=String(e)}return t.replace(/"([^"]+)":/g,`${v.fg.cyan}$1${v.reset}:`).replace(/: "([^"]*)"/g,`: ${v.fg.green}'$1'${v.reset}`).replace(/: (true|false|null|-?\d+(?:\.\d+)?(?:[eE][+-]?\d+)?)/g,`: ${v.fg.yellow}$1${v.reset}`)},s=e=>e.replace(/\b(CREATE|CONTENT|SELECT|FROM|WHERE|UPDATE|MERGE|SET|DELETE|LIMIT|ORDER BY|START|FETCH|type::record|type::thing)\b/g,`${v.fg.purple}$1${v.reset}`).replace(/\b(rand::\w+(?:::\w+)?)\b/g,`${v.fg.blue}$1${v.reset}`).replace(/(\$bind__\w+)/g,`${v.fg.yellow}$1${v.reset}`),c=i;Object.keys(a).sort((e,t)=>t.length-e.length).forEach(e=>{let t=a[e],n=typeof t==`string`?`'${t}'`:JSON.stringify(t);c=c.replace(RegExp(`\\$${e}\\b`,`g`),`${v.fg.green}${n}${v.reset}`)});let l=`\n${v.border}┌── ${v.reset}${v.bold}SURREALDB DEBUG${v.reset} ${v.dim}───────────────────────────────────────${v.reset}\n`,u=(e=``)=>{e.split(`
2
- `).forEach(e=>{l+=`${v.border}│${v.reset} ${e}\n`})};u(`${v.dim}Method:${v.reset} ${v.bold}${t}${v.reset} ${v.dim}Model:${v.reset} ${v.fg.cyan}${n}${v.reset}`),u(),u(`${v.dim}Full Query (interpolated):${v.reset}`),u(s(c)),u(),u(`${v.dim}Raw SurQL:${v.reset}`),u(s(i)),u(),u(`${v.dim}Bindings:${v.reset}`),Object.entries(a).forEach(([e,t])=>{let n=` ${v.fg.yellow}${e}${v.reset} ${v.dim}=${v.reset} `,r=` ${e} = `.length,i=o(t);if(i.includes(`
1
+ import{createAdapterFactory as e}from"better-auth/adapters";import{DateTime as t,Features as n,RecordId as r,StringRecordId as i,Table as a,escapeIdent as o,raw as s,surql as c}from"surrealdb";import{logger as l}from"better-auth";function u(e,t,n){if(e instanceof r||e instanceof i)return e;if(typeof e==`string`){if(e.includes(`:`)){let[n,...i]=e.split(`:`),a=i.join(`:`);return t.has(n)?new r(n,a):e}if(n&&t.has(n))return new r(n,e)}return e}const d=(e,t,n,r,i)=>{if(r.account&&e===n(`account`)&&t===`accountId`){let e=r.user?n(`user`):null;return i?i.providerId===`credential`?e:null:e}if(r.oauthAccessToken&&r.oauthConsent){let i=n(`oauthAccessToken`),a=n(`oauthConsent`);if((e===i||e===a)&&t===`clientId`)return r.oauthApplication?n(`oauthApplication`):null}return null},f=(e,t,n,r,i)=>(a,l)=>{if(!a||a.length===0)return null;let f=c``,p=n(l);return a.forEach((a,m)=>{m>0&&f.append(c` ${s(a.connector||`AND`)} `);let h=e({field:a.field,model:l}),g=t({field:a.field,model:l}),_=a.value,v=d(p,a.field,n,i);if(!v&&(a.field===`id`||g?.references)){let e=g?.references?.model;v=e?n(e):p}v&&(Array.isArray(_)?_=_.map(e=>u(e,r,v)):_!=null&&(_=u(_,r,v)));let y=s(o(h));switch(a.operator){case`eq`:case void 0:f.append(c`${y} = ${_}`);break;case`ne`:f.append(c`${y} != ${_}`);break;case`gt`:f.append(c`${y} > ${_}`);break;case`gte`:f.append(c`${y} >= ${_}`);break;case`lt`:f.append(c`${y} < ${_}`);break;case`lte`:f.append(c`${y} <= ${_}`);break;case`in`:f.append(c`${y} IN ${_}`);break;case`not_in`:f.append(c`${y} NOT IN ${_}`);break;case`contains`:f.append(c`${y} CONTAINS ${_}`);break;case`starts_with`:f.append(c`string::starts_with(${y}, ${_})`);break;case`ends_with`:f.append(c`string::ends_with(${y}, ${_})`);break;default:throw Error(`[SurrealDB Adapter]: Unsupported operator "${a.operator}"`)}}),f},p=(e,t,n)=>e?Object.entries(e).map(([e,n])=>t({model:e,field:n.on.to})):null;function m(e){let t={...e};for(let e of Object.keys(t))t[e]===null&&(t[e]=void 0);return t}const h={modelNotFound:(e,t)=>{t?.debugLogs&&l.debug(`[surreal-better-auth]: Model '${e}' not found in schema, skipping operation `)},fieldMappingSkipped:(e,t,n)=>{n?.debugLogs&&l.debug(`[surreal-better-auth]: Skipping field mapping rule for '${e}': ${t} `)},unsupportedOperator:(e,t)=>{t?.debugLogs&&l.warn(`[surreal-better-auth]: Unknown operator '${e}', falling back to equality comparison `)}};function g(e,t,n,r,i,a,o){let s=_[i({model:r(e),field:t})];if(s)try{let n=a(s);return o?.debugLogs&&l.debug(`[surreal-better-auth]: Found default reference: ${e}.${t} -> ${n} `),n}catch{h.modelNotFound(s,o)}let c=n.tableSpecific[e]?.[t];return c&&o?.debugLogs&&l.debug(`[surreal-better-auth]: Found table-specific reference: ${e}.${t} -> ${c} `),c||null}const _={userId:`user`,organizationId:`organization`,teamId:`team`,inviterId:`user`,activeOrganizationId:`organization`,activeTeamId:`team`};function v(e,t,n){let r={tableSpecific:{}};if(!e)return r;for(let i in e){let a=e[i];if(!a?.fields)continue;let o=t(i);r.tableSpecific[o]||(r.tableSpecific[o]={});for(let e in a.fields){let s=a.fields[e];if(s?.references?.model){let a=n({model:i,field:e}),c=t(s.references.model);r.tableSpecific[o][a]=c}}}return r}const y={reset:`\x1B[0m`,bold:`\x1B[1m`,dim:`\x1B[90m`,border:`\x1B[38;5;238m`,fg:{blue:`\x1B[34m`,cyan:`\x1B[36m`,green:`\x1B[32m`,yellow:`\x1B[33m`,purple:`\x1B[35m`}};function b(e,t,n,r){if(!e?.debugLogs&&!e?.logSurrealQL||typeof e.debugLogs==`object`&&!(`isRunningAdapterTests`in e.debugLogs)&&!e.debugLogs[t])return;let i=r.query,a=r.bindings||{},o=e=>{if(typeof e==`string`)return e.includes(`:`)?`${y.fg.cyan}${e}${y.reset}`:`${y.fg.green}'${e}'${y.reset}`;if(typeof e==`number`||typeof e==`boolean`)return`${y.fg.yellow}${e}${y.reset}`;if(e===null)return`${y.dim}null${y.reset}`;if(e===void 0)return`${y.dim}undefined${y.reset}`;let t=``;try{t=JSON.stringify(e,null,2)}catch{t=String(e)}return t.replace(/"([^"]+)":/g,`${y.fg.cyan}$1${y.reset}:`).replace(/: "([^"]*)"/g,`: ${y.fg.green}'$1'${y.reset}`).replace(/: (true|false|null|-?\d+(?:\.\d+)?(?:[eE][+-]?\d+)?)/g,`: ${y.fg.yellow}$1${y.reset}`)},s=e=>e.replace(/\b(CREATE|CONTENT|SELECT|FROM|WHERE|UPDATE|MERGE|SET|DELETE|LIMIT|ORDER BY|START|FETCH|type::record|type::thing)\b/g,`${y.fg.purple}$1${y.reset}`).replace(/\b(rand::\w+(?:::\w+)?)\b/g,`${y.fg.blue}$1${y.reset}`).replace(/(\$bind__\w+)/g,`${y.fg.yellow}$1${y.reset}`),c=i;Object.keys(a).sort((e,t)=>t.length-e.length).forEach(e=>{let t=a[e],n=typeof t==`string`?`'${t}'`:JSON.stringify(t);c=c.replace(RegExp(`\\$${e}\\b`,`g`),`${y.fg.green}${n}${y.reset}`)});let l=`\n${y.border}┌── ${y.reset}${y.bold}SURREALDB DEBUG${y.reset} ${y.dim}───────────────────────────────────────${y.reset}\n`,u=(e=``)=>{e.split(`
2
+ `).forEach(e=>{l+=`${y.border}│${y.reset} ${e}\n`})};u(`${y.dim}Method:${y.reset} ${y.bold}${t}${y.reset} ${y.dim}Model:${y.reset} ${y.fg.cyan}${n}${y.reset}`),u(),u(`${y.dim}Full Query (interpolated):${y.reset}`),u(s(c)),u(),u(`${y.dim}Raw SurQL:${y.reset}`),u(s(i)),u(),u(`${y.dim}Bindings:${y.reset}`),Object.entries(a).forEach(([e,t])=>{let n=` ${y.fg.yellow}${e}${y.reset} ${y.dim}=${y.reset} `,r=` ${e} = `.length,i=o(t);if(i.includes(`
3
3
  `)){let e=` `.repeat(r);i=i.split(`
4
4
  `).map((t,n)=>n===0?t:`${e}${t}`).join(`
5
- `)}u(`${n}${i}`)}),l+=`${v.border}└──────────────────────────────────────────────────────────────${v.reset}\n`,console.log(l)}function b(e){let{file:t,tables:n,getModelName:r,getFieldName:i,getReferencedModel:a}=e,o=[],s=new Date,c=`${s.getUTCFullYear()}-${String(s.getUTCMonth()+1).padStart(2,`0`)}-${String(s.getUTCDate()).padStart(2,`0`)} at ${String(s.getUTCHours()).padStart(2,`0`)}:${String(s.getUTCMinutes()).padStart(2,`0`)}:${String(s.getUTCSeconds()).padStart(2,`0`)} UTC`;o.push(`-- ╔════════════════════════════════════════════════════════════════════════╗`,`-- ║ SurrealDB Better Auth Schema ║`,`-- ╟────────────────────────────────────────────────────────────────────────╢`,`-- ║ This schema was auto-generated for BetterAuth integration ║`,`-- ║ Adapter: surreal-better-auth ║`,`-- ║ Repo: https://github.com/oskar-gmerek/surreal-better-auth ║`,`-- ║ Author: Oskar Gmerek ║`,`-- ║ ║`,`-- ║ Generation Date: ${c.padEnd(53)}║`,`-- ╟────────────────────────────────────────────────────────────────────────╢`,`-- ║ Warning: It is strongly recommended to manually review the schema ║`,`-- ║ after each generation to ensure it fully meets your ║`,`-- ║ project's specific requirements. ║`,`-- ╟────────────────────────────────────────────────────────────────────────╢`,`-- ║ Tip: The easiest way to apply this schema to your database is to use ║`,`-- ║ import function in the Surrealist or via SurrealDB CLI. ║`,`-- ╚════════════════════════════════════════════════════════════════════════╝`,``,``,``);function l(e,t=76){let n=t-8,r=e.padEnd(n,` `);return[`-- ╔${`═`.repeat(t-4)}╗`,`-- ║ ${r} ║`,`-- ╚${`═`.repeat(t-4)}╝`]}function u(e,t,n){try{let n=r(`account`),a=r(`user`),o=i({model:`account`,field:`accountId`});if(e===n&&t===o)return`record<${a}> | string`}catch{}try{let n=r(`oauthAccessToken`),a=r(`oauthApplication`),o=i({model:`oauthAccessToken`,field:`clientId`});if(e===n&&t===o)return`record<${a}>`}catch{}try{let n=r(`oauthConsent`),a=r(`oauthApplication`),o=i({model:`oauthConsent`,field:`clientId`});if(e===n&&t===o)return`record<${a}>`}catch{}let o=a(e,t);return o?`record<${o}>`:{boolean:`bool`,date:`datetime`}[n||``]||n||`any`}for(let[e,t]of Object.entries(n)){let n=r(e);if(!t.disableMigrations){o.push(...l(`TABLE: ${n}`)),o.push(`DEFINE TABLE OVERWRITE ${n} SCHEMAFULL;`),o.push(``),o.push(`DEFINE FIELD OVERWRITE id ON TABLE ${n} TYPE record<${n}>;`);for(let[r,a]of Object.entries(t.fields)){let t=i({model:e,field:r}),s=u(n,t,a.type?.toString()),c=a.required===!1?`option<${s}>`:s;o.push(`DEFINE FIELD OVERWRITE ${t} ON TABLE ${n} TYPE ${c};`)}o.push(``),o.push(`DEFINE INDEX OVERWRITE idx_${n}_id ON ${n} COLUMNS id UNIQUE;`);for(let[r,a]of Object.entries(t.fields)){let t=i({model:e,field:r}),s={user:`email`,account:`userId`,session:[`userId`,`token`],verification:`identifier`,invitation:[`email`,`organizationId`],member:[`userId`,`organizationId`],organization:`slug`,passkey:`userId`,twoFactor:`secret`}[e];s&&(Array.isArray(s)&&s.includes(r)||s===r)&&o.push(`DEFINE INDEX OVERWRITE idx_${n}_${t} ON ${n} COLUMNS ${t}${a.unique?` UNIQUE`:``};`)}o.push(``)}}return{path:t??`schema.surql`,code:o.join(`
6
- `),overwrite:!0}}const x=(c,m)=>{let g,v=e=>({getFieldName:t,getFieldAttributes:n,getModelName:r,getDefaultFieldName:c,getDefaultModelName:v,options:x,schema:S})=>{g=x;let C=new Set;Object.keys(S).forEach(e=>{C.add(r(e))});let w=d(t,n,r,C,S),T=(e,t)=>{let i={...t},a=r(e);for(let t in i){let o=i[t];if(o==null)continue;let s=n({field:t,model:e}),c=u(a,t,r,S,i);if(!c&&(t===`id`||s?.references)){let e=s?.references?.model;c=e?r(e):a}i[t]=l(o,C,c)}return p(i)},E=_(x?.schema?.tables,r,t),D=(e,t)=>h(e,t,E,v,c,r,m);return{async create({model:t,data:n}){let r=m?.idGenerator,a=n.id,{id:o,...c}=n;function l(){if(a&&a!==`__surreal__`)return s`CREATE type::record(${t}, ${String(a)})`;switch(r){case`ULID`:return s`CREATE type::record(${t}, rand::ulid())`;case`UUIDv4`:return s`CREATE type::record(${t}, rand::uuid::v4())`;case`UUIDv7`:return s`CREATE type::record(${t}, rand::uuid())`;case`guid`:return s`CREATE type::record(${t}, rand::id())`;default:return s`CREATE ${new i(t)}`}}let u=l();u.append(s` CONTENT ${T(t,c)}`);let[d]=await e.query(u);return y(m,`create`,t,u),d[0]},async findOne({model:n,where:r,select:i,join:c}){let l=w(r,n);if(!l)return null;let u=o(a(n)),d;d=i&&i.length>0?s`SELECT ${o(i.map(e=>a(t({field:e,model:n}))).join(`, `))} FROM ${u} WHERE `:s`SELECT * FROM ${u} WHERE `,d.append(l).append(s` LIMIT 1`);let p=f(c,t,n);p&&p.length>0&&d.append(s` FETCH ${o(p.join(`, `))}`),y(m,`findOne`,n,d);let[h]=await e.query(d);return h?.[0]||null},async findMany({model:n,where:r,limit:i,offset:c,sortBy:l,join:u}){let d=s`SELECT * FROM ${o(a(n))}`,p=w(r,n);if(p&&d.append(s` WHERE `).append(p),l){let e=o(a(t({field:l.field,model:n}))),r=o(l.direction===`desc`?`DESC`:`ASC`);d.append(s` ORDER BY ${e} ${r}`)}if(i&&d.append(s` LIMIT ${i}`),c&&d.append(s` START ${c}`),u){let e=f(u,t,n);e&&e.length>0&&d.append(s` FETCH ${o(e.join(`, `))}`)}y(m,`findMany`,n,d);let[h]=await e.query(d);return h||[]},async update({model:t,where:n,update:r}){let i=w(n,t);if(!i)return null;let c=s`UPDATE ${o(a(t))} MERGE ${T(t,r)} WHERE `;c.append(i),y(m,`update`,t,c);let[l]=await e.query(c);return l?.[0]||null},async updateMany({model:t,where:n,update:r}){let i=w(n,t);if(!i)return 0;let c=s`UPDATE ${o(a(t))} MERGE ${p(r)} WHERE `;c.append(i),y(m,`updateMany`,t,c);let[l]=await e.query(c);return l?l.length:0},async count({model:t,where:n}){let r=w(n,t),i=s`SELECT count() FROM ${o(a(t))}`;r&&i.append(s` WHERE `).append(r),i.append(s` GROUP ALL`),y(m,`count`,t,i);let[c]=await e.query(i);return c?.[0]?.count||0},async delete({model:t,where:n}){let r=w(n,t);if(!r)return;let i=s`DELETE FROM ${o(a(t))} WHERE `;i.append(r),y(m,`delete`,t,i),await e.query(i)},async deleteMany({model:t,where:n}){let r=w(n,t);if(!r)return 0;let i=s`DELETE FROM ${o(a(t))} WHERE `;i.append(r),i.append(s` RETURN BEFORE`),y(m,`deleteMany`,t,i);let[c]=await e.query(i);return c?c.length:0},async createSchema({file:e,tables:n}){return b({file:e,tables:n,getModelName:r,getFieldName:t,getReferencedModel:D})}}},x={config:{adapterId:`surrealdb`,adapterName:`SurrealDB`,usePlural:m?.usePlural??!1,debugLogs:m?.debugLogs??!1,supportsJSON:!0,supportsArrays:!0,supportsUUIDs:!1,supportsJoin:!0,supportsDates:!0,supportsBooleans:!0,supportsNumericIds:!0,customIdGenerator:m?.idGenerator?()=>`__surreal__`:void 0,customTransformOutput:({data:e})=>e instanceof n||e instanceof r?e.toString():e instanceof t?e.toDate():e,transaction:async t=>{let n=await c.beginTransaction();try{let r=await t(e({config:x.config,adapter:v(n)})(g));return await n.commit(),r}catch(e){throw await n.cancel(),e}}},adapter:v(c)},S=e(x);return e=>S(e)};export{b as generateSchema,x as surrealdbAdapter};
5
+ `)}u(`${n}${i}`)}),l+=`${y.border}└──────────────────────────────────────────────────────────────${y.reset}\n`,console.log(l)}function x(e){let{file:t,tables:n,getModelName:r,getFieldName:i,getReferencedModel:a}=e,o=[],s=new Date,c=`${s.getUTCFullYear()}-${String(s.getUTCMonth()+1).padStart(2,`0`)}-${String(s.getUTCDate()).padStart(2,`0`)} at ${String(s.getUTCHours()).padStart(2,`0`)}:${String(s.getUTCMinutes()).padStart(2,`0`)}:${String(s.getUTCSeconds()).padStart(2,`0`)} UTC`;o.push(`-- ╔════════════════════════════════════════════════════════════════════════╗`,`-- ║ SurrealDB Better Auth Schema ║`,`-- ╟────────────────────────────────────────────────────────────────────────╢`,`-- ║ This schema was auto-generated for BetterAuth integration ║`,`-- ║ Adapter: surreal-better-auth ║`,`-- ║ Repo: https://github.com/oskar-gmerek/surreal-better-auth ║`,`-- ║ Author: Oskar Gmerek ║`,`-- ║ ║`,`-- ║ Generation Date: ${c.padEnd(53)}║`,`-- ╟────────────────────────────────────────────────────────────────────────╢`,`-- ║ Warning: It is strongly recommended to manually review the schema ║`,`-- ║ after each generation to ensure it fully meets your ║`,`-- ║ project's specific requirements. ║`,`-- ╟────────────────────────────────────────────────────────────────────────╢`,`-- ║ Tip: The easiest way to apply this schema to your database is to use ║`,`-- ║ import function in the Surrealist or via SurrealDB CLI. ║`,`-- ╚════════════════════════════════════════════════════════════════════════╝`,``,``,``);function l(e,t=76){let n=t-8,r=e.padEnd(n,` `);return[`-- ╔${`═`.repeat(t-4)}╗`,`-- ║ ${r} ║`,`-- ╚${`═`.repeat(t-4)}╝`]}function u(e,t,n){try{let n=r(`account`),a=r(`user`),o=i({model:`account`,field:`accountId`});if(e===n&&t===o)return`record<${a}> | string`}catch{}try{let n=r(`oauthAccessToken`),a=r(`oauthApplication`),o=i({model:`oauthAccessToken`,field:`clientId`});if(e===n&&t===o)return`record<${a}>`}catch{}try{let n=r(`oauthConsent`),a=r(`oauthApplication`),o=i({model:`oauthConsent`,field:`clientId`});if(e===n&&t===o)return`record<${a}>`}catch{}let o=a(e,t);return o?`record<${o}>`:{boolean:`bool`,date:`datetime`}[n||``]||n||`any`}for(let[e,t]of Object.entries(n)){let n=r(e);if(!t.disableMigrations){o.push(...l(`TABLE: ${n}`)),o.push(`DEFINE TABLE OVERWRITE ${n} SCHEMAFULL;`),o.push(``),o.push(`DEFINE FIELD OVERWRITE id ON TABLE ${n} TYPE any;`);for(let[r,a]of Object.entries(t.fields)){let t=i({model:e,field:r}),s=u(n,t,a.type?.toString()),c=a.required===!1?`option<${s}>`:s;o.push(`DEFINE FIELD OVERWRITE ${t} ON TABLE ${n} TYPE ${c};`)}o.push(``),o.push(`DEFINE INDEX OVERWRITE idx_${n}_id ON ${n} COLUMNS id UNIQUE;`);for(let[r,a]of Object.entries(t.fields)){let t=i({model:e,field:r}),s={user:`email`,account:`userId`,session:[`userId`,`token`],verification:`identifier`,invitation:[`email`,`organizationId`],member:[`userId`,`organizationId`],organization:`slug`,passkey:`userId`,twoFactor:`secret`}[e];s&&(Array.isArray(s)&&s.includes(r)||s===r)&&o.push(`DEFINE INDEX OVERWRITE idx_${n}_${t} ON ${n} COLUMNS ${t}${a.unique?` UNIQUE`:``};`)}o.push(``)}}return{path:t??`schema.surql`,code:o.join(`
6
+ `),overwrite:!0}}const S=(l,h)=>{let _,y=e=>({getFieldName:t,getFieldAttributes:n,getModelName:r,getDefaultFieldName:i,getDefaultModelName:l,options:y,schema:S})=>{_=y;let C=new Set;Object.keys(S).forEach(e=>{C.add(r(e))});let w=f(t,n,r,C,S),T=(e,t)=>{let i={...t},a=r(e);for(let t in i){let o=i[t];if(o==null)continue;let s=n({field:t,model:e}),c=d(a,t,r,S,i);if(!c&&(t===`id`||s?.references)){let e=s?.references?.model;c=e?r(e):a}i[t]=u(o,C,c)}return m(i)},E=v(y?.schema?.tables,r,t),D=(e,t)=>g(e,t,E,l,i,r,h);return{async create({model:t,data:n}){let r=h?.idGenerator,i=n.id,{id:o,...s}=n;function l(){if(i&&i!==`__surreal__`)return c`CREATE type::record(${t}, ${String(i)})`;switch(r){case`ULID`:return c`CREATE type::record(${t}, rand::ulid())`;case`UUIDv4`:return c`CREATE type::record(${t}, rand::uuid::v4())`;case`UUIDv7`:return c`CREATE type::record(${t}, rand::uuid())`;case`guid`:return c`CREATE type::record(${t}, rand::id())`;default:return c`CREATE ${new a(t)}`}}let u=l();u.append(c` CONTENT ${T(t,s)}`);let[d]=await e.query(u);return b(h,`create`,t,u),d[0]},async findOne({model:n,where:r,select:i,join:a}){let l=w(r,n);if(!l)return null;let u=s(o(n)),d;d=i&&i.length>0?c`SELECT ${s(i.map(e=>o(t({field:e,model:n}))).join(`, `))} FROM ${u} WHERE `:c`SELECT * FROM ${u} WHERE `,d.append(l).append(c` LIMIT 1`);let f=p(a,t,n);f&&f.length>0&&d.append(c` FETCH ${s(f.join(`, `))}`),b(h,`findOne`,n,d);let[m]=await e.query(d);return m?.[0]||null},async findMany({model:n,where:r,limit:i,offset:a,sortBy:l,join:u}){let d=c`SELECT * FROM ${s(o(n))}`,f=w(r,n);if(f&&d.append(c` WHERE `).append(f),l){let e=s(o(t({field:l.field,model:n}))),r=s(l.direction===`desc`?`DESC`:`ASC`);d.append(c` ORDER BY ${e} ${r}`)}if(i&&d.append(c` LIMIT ${i}`),a&&d.append(c` START ${a}`),u){let e=p(u,t,n);e&&e.length>0&&d.append(c` FETCH ${s(e.join(`, `))}`)}b(h,`findMany`,n,d);let[m]=await e.query(d);return m||[]},async update({model:t,where:n,update:r}){let i=w(n,t);if(!i)return null;let a=c`UPDATE ${s(o(t))} MERGE ${T(t,r)} WHERE `;a.append(i),b(h,`update`,t,a);let[l]=await e.query(a);return l?.[0]||null},async updateMany({model:t,where:n,update:r}){let i=w(n,t);if(!i)return 0;let a=c`UPDATE ${s(o(t))} MERGE ${m(r)} WHERE `;a.append(i),b(h,`updateMany`,t,a);let[l]=await e.query(a);return l?l.length:0},async count({model:t,where:n}){let r=w(n,t),i=c`SELECT count() FROM ${s(o(t))}`;r&&i.append(c` WHERE `).append(r),i.append(c` GROUP ALL`),b(h,`count`,t,i);let[a]=await e.query(i);return a?.[0]?.count||0},async delete({model:t,where:n}){let r=w(n,t);if(!r)return;let i=c`DELETE FROM ${s(o(t))} WHERE `;i.append(r),b(h,`delete`,t,i),await e.query(i)},async deleteMany({model:t,where:n}){let r=w(n,t);if(!r)return 0;let i=c`DELETE FROM ${s(o(t))} WHERE `;i.append(r),i.append(c` RETURN BEFORE`),b(h,`deleteMany`,t,i);let[a]=await e.query(i);return a?a.length:0},async createSchema({file:e,tables:n}){return x({file:e,tables:n,getModelName:r,getFieldName:t,getReferencedModel:D})}}};return a=>{let o=l.isFeatureSupported(n.Transactions);console.log({supportsTxn:o});let s={config:{adapterId:`surrealdb`,adapterName:`SurrealDB`,usePlural:h?.usePlural??!1,debugLogs:h?.debugLogs??!1,supportsJSON:!0,supportsArrays:!0,supportsUUIDs:!1,supportsJoin:!0,supportsDates:!0,supportsBooleans:!0,supportsNumericIds:!0,customIdGenerator:h?.idGenerator?()=>`__surreal__`:void 0,customTransformOutput:({data:e})=>e instanceof r||e instanceof i?e.toString():e instanceof t?e.toDate():e,transaction:o?async t=>{let n=await l.beginTransaction();try{let r=await t(e({config:s.config,adapter:y(n)})(_));return await n.commit(),r}catch(e){throw await n.cancel(),e}}:!1},adapter:y(l)};return e(s)(a)}};export{x as generateSchema,S as surrealdbAdapter};
7
7
  //# sourceMappingURL=index.mjs.map
package/index.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../src/utils.ts","../src/schema.ts","../src/adapter.ts"],"sourcesContent":["import { logger, type BetterAuthDBSchema, type JoinConfig } from \"better-auth\";\nimport { raw, escapeIdent, type BoundQuery, RecordId, StringRecordId, surql } from \"surrealdb\";\nimport { type RecordIdMap, type SurrealDBAdapterConfig } from \"./types\";\n\ntype GetFieldNameFn = (params: { field: string; model: string }) => string;\n\n/**\n * Converts a value to a SurrealDB RecordId or StringRecordId.\n * It validates the table prefix against the schema to avoid converting\n * non-record strings (like URLs or emails) that happen to contain colons.\n */\nexport function toRecordId(\n value: any,\n validTables: Set<string>,\n fallbackTable?: string | null,\n): any {\n if (value instanceof RecordId || value instanceof StringRecordId) return value;\n\n if (typeof value === \"string\") {\n if (value.includes(\":\")) {\n const [tablePrefix, ...rest] = value.split(\":\");\n const idPart = rest.join(\":\");\n\n if (validTables.has(tablePrefix)) {\n return new RecordId(tablePrefix, idPart);\n }\n return value;\n }\n\n if (fallbackTable && validTables.has(fallbackTable)) {\n return new RecordId(fallbackTable, value);\n }\n }\n\n return value;\n}\n\n/**\n * Resolves the target table for polymorphic fields or fields where\n * Better-Auth metadata might be missing explicit relationship info.\n */\nexport const getSpecialReferenceModel = (\n dbModelName: string,\n field: string,\n getModelName: (m: string) => string,\n schema: BetterAuthDBSchema,\n data?: Record<string, any>,\n): string | null => {\n if (schema.account && dbModelName === getModelName(\"account\") && field === \"accountId\") {\n const userModel = schema.user ? getModelName(\"user\") : null;\n if (data) {\n return data.providerId === \"credential\" ? userModel : null;\n }\n return userModel;\n }\n\n if (schema.oauthAccessToken && schema.oauthConsent) {\n const accessTokenTable = getModelName(\"oauthAccessToken\");\n const consentTable = getModelName(\"oauthConsent\");\n\n if (\n (dbModelName === accessTokenTable || dbModelName === consentTable) &&\n field === \"clientId\"\n ) {\n return schema.oauthApplication ? getModelName(\"oauthApplication\") : null;\n }\n }\n\n return null;\n};\n\n/**\n * Builds a BoundQuery for the WHERE clause, handling operator mapping\n * and automatic RecordId conversion for relational fields.\n */\nexport const createWhereBuilder = (\n getFieldName: any,\n getFieldAttributes: any,\n getModelName: any,\n validTables: Set<string>,\n schema: BetterAuthDBSchema,\n) => {\n return (where: any[] | undefined | null, modelName: string) => {\n if (!where || where.length === 0) return null;\n\n let query = surql``;\n const dbModelName = getModelName(modelName);\n\n where.forEach((w, index) => {\n if (index > 0) {\n query.append(surql` ${raw(w.connector || \"AND\")} `);\n }\n\n const dbField = getFieldName({ field: w.field, model: modelName });\n const attr = getFieldAttributes({ field: w.field, model: modelName });\n let val = w.value;\n\n let targetModel = getSpecialReferenceModel(dbModelName, w.field, getModelName, schema);\n\n if (!targetModel && (w.field === \"id\" || attr?.references)) {\n const refModel = attr?.references?.model;\n targetModel = refModel ? getModelName(refModel) : dbModelName;\n }\n\n if (targetModel) {\n if (Array.isArray(val)) {\n val = val.map((v) => toRecordId(v, validTables, targetModel));\n } else if (val !== undefined && val !== null) {\n val = toRecordId(val, validTables, targetModel);\n }\n }\n\n const fieldRaw = raw(escapeIdent(dbField));\n\n switch (w.operator) {\n case \"eq\":\n case undefined:\n query.append(surql`${fieldRaw} = ${val}`);\n break;\n case \"ne\":\n query.append(surql`${fieldRaw} != ${val}`);\n break;\n case \"gt\":\n query.append(surql`${fieldRaw} > ${val}`);\n break;\n case \"gte\":\n query.append(surql`${fieldRaw} >= ${val}`);\n break;\n case \"lt\":\n query.append(surql`${fieldRaw} < ${val}`);\n break;\n case \"lte\":\n query.append(surql`${fieldRaw} <= ${val}`);\n break;\n case \"in\":\n query.append(surql`${fieldRaw} IN ${val}`);\n break;\n case \"not_in\":\n query.append(surql`${fieldRaw} NOT IN ${val}`);\n break;\n case \"contains\":\n query.append(surql`${fieldRaw} CONTAINS ${val}`);\n break;\n case \"starts_with\":\n query.append(surql`string::starts_with(${fieldRaw}, ${val})`);\n break;\n case \"ends_with\":\n query.append(surql`string::ends_with(${fieldRaw}, ${val})`);\n break;\n default:\n throw new Error(`[SurrealDB Adapter]: Unsupported operator \"${w.operator}\"`);\n }\n });\n\n return query;\n };\n};\n\n/**\n * Maps join configurations to a list of fields for the SurrealDB FETCH clause.\n */\nexport const buildFetchLinks = (\n join: JoinConfig | undefined,\n getFieldName: GetFieldNameFn,\n _model: string,\n) => {\n if (!join) return null;\n\n const recordLinks = Object.entries(join).map(([joinedModel, config]): string => {\n return getFieldName({ model: joinedModel, field: config.on.to });\n });\n return recordLinks;\n};\n\n/**\n * Converts null values to undefined.\n * This is required for SurrealDB MERGE operations to effectively\n * unset/remove fields from a document rather than storing a NULL value.\n */\nexport function mapNullToUndefined<T extends Record<string, any>>(data: T): T {\n const out = { ...data };\n\n for (const key of Object.keys(out)) {\n if ((out as any)[key] === null) {\n (out as any)[key] = undefined;\n }\n }\n\n return out;\n}\n\n/**\n * Standardized error logging for adapter operations.\n */\nexport const ERROR_HANDLERS = {\n modelNotFound: (modelName: string, config?: SurrealDBAdapterConfig) => {\n if (config?.debugLogs) {\n logger.debug(\n `[surreal-better-auth]: Model '${modelName}' not found in schema, skipping operation `,\n );\n }\n },\n fieldMappingSkipped: (rule: string, reason: string, config?: SurrealDBAdapterConfig) => {\n if (config?.debugLogs) {\n logger.debug(`[surreal-better-auth]: Skipping field mapping rule for '${rule}': ${reason} `);\n }\n },\n unsupportedOperator: (operator: string, config?: SurrealDBAdapterConfig) => {\n if (config?.debugLogs) {\n logger.warn(\n `[surreal-better-auth]: Unknown operator '${operator}', falling back to equality comparison `,\n );\n }\n },\n};\n\n/**\n * Finds the referenced model name for a specific field based on schema or defaults.\n */\nexport function getReferencedModel(\n tableName: string,\n fieldName: string,\n recordIdMap: RecordIdMap,\n getDefaultModelName: (tableName: string) => string,\n getDefaultFieldName: (opts: { model: string; field: string }) => string,\n getModelName: (model: string) => string,\n config?: SurrealDBAdapterConfig,\n): string | null {\n const defaultModel = getDefaultModelName(tableName);\n const defaultField = getDefaultFieldName({\n model: defaultModel,\n field: fieldName,\n });\n\n const referencedModel = DEFAULT_FIELD_REFERENCES[defaultField];\n if (referencedModel) {\n try {\n const modelName = getModelName(referencedModel);\n if (config?.debugLogs) {\n logger.debug(\n `[surreal-better-auth]: Found default reference: ${tableName}.${fieldName} -> ${modelName} `,\n );\n }\n return modelName;\n // oxlint-disable-next-line\n } catch (error) {\n ERROR_HANDLERS.modelNotFound(referencedModel, config);\n }\n }\n\n const tableSpecificRef = recordIdMap.tableSpecific[tableName]?.[fieldName];\n if (tableSpecificRef && config?.debugLogs) {\n logger.debug(\n `[surreal-better-auth]: Found table-specific reference: ${tableName}.${fieldName} -> ${tableSpecificRef} `,\n );\n }\n\n return tableSpecificRef || null;\n}\n\n/**\n * Common field-to-model mappings used as a fallback for implicit relationships.\n */\nexport const DEFAULT_FIELD_REFERENCES: Record<string, string> = {\n userId: \"user\",\n organizationId: \"organization\",\n teamId: \"team\",\n inviterId: \"user\",\n activeOrganizationId: \"organization\",\n activeTeamId: \"team\",\n};\n\n/**\n * Scans Better-Auth tables to build a map of fields that reference other models.\n */\nexport function buildRecordIdMap(\n tables: any,\n getModelName: (model: string) => string,\n getFieldName: (opts: { model: string; field: string }) => string,\n): RecordIdMap {\n const map: RecordIdMap = { tableSpecific: {} };\n if (!tables) return map;\n\n for (const internalModelName in tables) {\n const tableDef = tables[internalModelName];\n if (!tableDef?.fields) continue;\n\n const actualTableName = getModelName(internalModelName);\n if (!map.tableSpecific[actualTableName]) {\n map.tableSpecific[actualTableName] = {};\n }\n\n for (const internalFieldName in tableDef.fields) {\n const fieldDef = tableDef.fields[internalFieldName];\n if (fieldDef?.references?.model) {\n const actualFieldName = getFieldName({\n model: internalModelName,\n field: internalFieldName,\n });\n const referencedActualTableName = getModelName(fieldDef.references.model);\n map.tableSpecific[actualTableName][actualFieldName] = referencedActualTableName;\n }\n }\n }\n return map;\n}\n\nconst colors = {\n reset: \"\\x1b[0m\",\n bold: \"\\x1b[1m\",\n dim: \"\\x1b[90m\",\n border: \"\\x1b[38;5;238m\",\n fg: {\n blue: \"\\x1b[34m\",\n cyan: \"\\x1b[36m\",\n green: \"\\x1b[32m\",\n yellow: \"\\x1b[33m\",\n purple: \"\\x1b[35m\",\n },\n};\n\n/**\n * Formats and logs SurrealQL queries to the console with syntax highlighting.\n * Helps developers debug the exact queries and bindings sent to the database.\n */\nexport function logSurrealQuery(config: any, method: string, model: string, queryObj: BoundQuery) {\n if (!config?.debugLogs && !config?.logSurrealQL) return;\n\n if (typeof config.debugLogs === \"object\" && !(\"isRunningAdapterTests\" in config.debugLogs)) {\n const logsMap = config.debugLogs as Record<string, boolean>;\n if (!logsMap[method]) return;\n }\n\n const q = queryObj.query;\n const b = queryObj.bindings || {};\n\n const formatValue = (val: any): string => {\n if (typeof val === \"string\") {\n if (val.includes(\":\")) return `${colors.fg.cyan}${val}${colors.reset}`;\n return `${colors.fg.green}'${val}'${colors.reset}`;\n }\n if (typeof val === \"number\" || typeof val === \"boolean\")\n return `${colors.fg.yellow}${val}${colors.reset}`;\n if (val === null) return `${colors.dim}null${colors.reset}`;\n if (val === undefined) return `${colors.dim}undefined${colors.reset}`;\n\n let jsonStr = \"\";\n try {\n jsonStr = JSON.stringify(val, null, 2);\n } catch {\n jsonStr = String(val);\n }\n\n return jsonStr\n .replace(/\"([^\"]+)\":/g, `${colors.fg.cyan}$1${colors.reset}:`)\n .replace(/: \"([^\"]*)\"/g, `: ${colors.fg.green}'$1'${colors.reset}`)\n .replace(\n /: (true|false|null|-?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?)/g,\n `: ${colors.fg.yellow}$1${colors.reset}`,\n );\n };\n\n const formatSQL = (str: string) =>\n str\n .replace(\n /\\b(CREATE|CONTENT|SELECT|FROM|WHERE|UPDATE|MERGE|SET|DELETE|LIMIT|ORDER BY|START|FETCH|type::record|type::thing)\\b/g,\n `${colors.fg.purple}$1${colors.reset}`,\n )\n .replace(/\\b(rand::\\w+(?:::\\w+)?)\\b/g, `${colors.fg.blue}$1${colors.reset}`)\n .replace(/(\\$bind__\\w+)/g, `${colors.fg.yellow}$1${colors.reset}`);\n\n let fullQuery = q;\n const sortedKeys = Object.keys(b).sort((a, b) => b.length - a.length);\n sortedKeys.forEach((key) => {\n const val = b[key];\n const displayVal = typeof val === \"string\" ? `'${val}'` : JSON.stringify(val);\n fullQuery = fullQuery.replace(\n new RegExp(`\\\\$${key}\\\\b`, \"g\"),\n `${colors.fg.green}${displayVal}${colors.reset}`,\n );\n });\n\n let logOut = `\\n${colors.border}┌── ${colors.reset}${colors.bold}SURREALDB DEBUG${colors.reset} ${colors.dim}───────────────────────────────────────${colors.reset}\\n`;\n\n const addLine = (content: string = \"\") => {\n const lines = content.split(\"\\n\");\n lines.forEach((line) => {\n logOut += `${colors.border}│${colors.reset} ${line}\\n`;\n });\n };\n\n addLine(\n `${colors.dim}Method:${colors.reset} ${colors.bold}${method}${colors.reset} ${colors.dim}Model:${colors.reset} ${colors.fg.cyan}${model}${colors.reset}`,\n );\n addLine();\n addLine(`${colors.dim}Full Query (interpolated):${colors.reset}`);\n addLine(formatSQL(fullQuery));\n addLine();\n addLine(`${colors.dim}Raw SurQL:${colors.reset}`);\n addLine(formatSQL(q));\n addLine();\n addLine(`${colors.dim}Bindings:${colors.reset}`);\n\n Object.entries(b).forEach(([key, val]) => {\n const prefix = ` ${colors.fg.yellow}${key}${colors.reset} ${colors.dim}=${colors.reset} `;\n const cleanPrefixLength = ` ${key} = `.length;\n\n let formattedVal = formatValue(val);\n\n if (formattedVal.includes(\"\\n\")) {\n const indentStr = \" \".repeat(cleanPrefixLength);\n formattedVal = formattedVal\n .split(\"\\n\")\n .map((l, i) => (i === 0 ? l : `${indentStr}${l}`))\n .join(\"\\n\");\n }\n\n addLine(`${prefix}${formattedVal}`);\n });\n\n logOut += `${colors.border}└──────────────────────────────────────────────────────────────${colors.reset}\\n`;\n\n console.log(logOut);\n}\n","/**\n * Schema generation utilities for SurrealDB Better Auth adapter.\n * Generates SurrealDB schema definitions with proper field types and indexes.\n */\n\nimport type { GenerateSchemaParams, GenerateSchemaResult } from \"./types\";\n\n/**\n * Generates SurrealDB schema from Better Auth table definitions with proper field types and indexes.\n */\nexport function generateSchema(params: GenerateSchemaParams): GenerateSchemaResult {\n const { file, tables, getModelName, getFieldName, getReferencedModel } = params;\n\n const schemaLines: string[] = [];\n const date = new Date();\n const formatted = `${date.getUTCFullYear()}-${String(date.getUTCMonth() + 1).padStart(2, \"0\")}-${String(date.getUTCDate()).padStart(2, \"0\")} at ${String(date.getUTCHours()).padStart(2, \"0\")}:${String(date.getUTCMinutes()).padStart(2, \"0\")}:${String(date.getUTCSeconds()).padStart(2, \"0\")} UTC`;\n\n schemaLines.push(\n \"-- ╔════════════════════════════════════════════════════════════════════════╗\",\n \"-- ║ SurrealDB Better Auth Schema ║\",\n \"-- ╟────────────────────────────────────────────────────────────────────────╢\",\n \"-- ║ This schema was auto-generated for BetterAuth integration ║\",\n \"-- ║ Adapter: surreal-better-auth ║\",\n \"-- ║ Repo: https://github.com/oskar-gmerek/surreal-better-auth ║\",\n \"-- ║ Author: Oskar Gmerek ║\",\n \"-- ║ ║\",\n `-- ║ Generation Date: ${formatted.padEnd(53)}║`,\n \"-- ╟────────────────────────────────────────────────────────────────────────╢\",\n \"-- ║ Warning: It is strongly recommended to manually review the schema ║\",\n \"-- ║ after each generation to ensure it fully meets your ║\",\n `-- ║ project's specific requirements. ║`,\n \"-- ╟────────────────────────────────────────────────────────────────────────╢\",\n \"-- ║ Tip: The easiest way to apply this schema to your database is to use ║\",\n \"-- ║ import function in the Surrealist or via SurrealDB CLI. ║\",\n \"-- ╚════════════════════════════════════════════════════════════════════════╝\",\n \"\",\n \"\",\n \"\",\n );\n\n /**\n * Builds decorative box around table names in schema output.\n */\n function buildTableBox(text: string, totalWidth = 76): string[] {\n const contentWidth = totalWidth - 8;\n const lineContent = text.padEnd(contentWidth, \" \");\n const top = `-- ╔${\"═\".repeat(totalWidth - 4)}╗`;\n const mid = `-- ║ ${lineContent} ║`;\n const bot = `-- ╚${\"═\".repeat(totalWidth - 4)}╝`;\n return [top, mid, bot];\n }\n\n /**\n * Maps Better Auth field types to SurrealDB types with special cases for references.\n */\n function mapFieldType(tableName: string, fieldName: string, type?: string): string {\n // Special cases for field-to-table mappings in schema generation\n try {\n const accountModelName = getModelName(\"account\");\n const userModelName = getModelName(\"user\");\n const accountIdFieldName = getFieldName({\n model: \"account\",\n field: \"accountId\",\n });\n\n if (tableName === accountModelName && fieldName === accountIdFieldName) {\n return `record<${userModelName}> | string`;\n }\n // oxlint-disable-next-line\n } catch (e) {\n // account or user model not in schema, skip\n }\n\n try {\n const oauthAccessTokenModelName = getModelName(\"oauthAccessToken\");\n const oauthApplicationModelName = getModelName(\"oauthApplication\");\n const oauthAccessTokenIdFieldName = getFieldName({\n model: \"oauthAccessToken\",\n field: \"clientId\",\n });\n\n if (tableName === oauthAccessTokenModelName && fieldName === oauthAccessTokenIdFieldName) {\n return `record<${oauthApplicationModelName}>`;\n }\n // oxlint-disable-next-line\n } catch (e) {\n // oauthAccessToken or oauthApplication model not in schema, skip\n }\n\n try {\n const oauthConsentModelName = getModelName(\"oauthConsent\");\n const oauthApplicationModelName = getModelName(\"oauthApplication\");\n const oauthConsentIdFieldName = getFieldName({\n model: \"oauthConsent\",\n field: \"clientId\",\n });\n\n if (tableName === oauthConsentModelName && fieldName === oauthConsentIdFieldName) {\n return `record<${oauthApplicationModelName}>`;\n }\n // oxlint-disable-next-line\n } catch (e) {\n // oauthConsent or oauthApplication model not in schema, skip\n }\n\n const referencedModel = getReferencedModel(tableName, fieldName);\n if (referencedModel) {\n return `record<${referencedModel}>`;\n }\n\n const typeMap: Record<string, string> = {\n boolean: \"bool\",\n date: \"datetime\",\n };\n\n return typeMap[type || \"\"] || type || \"any\";\n }\n\n // Generate schema for each table\n for (const [internalModelName, tableDef] of Object.entries(tables)) {\n const tableName = getModelName(internalModelName);\n if ((tableDef as any).disableMigrations) continue;\n\n schemaLines.push(...buildTableBox(`TABLE: ${tableName}`));\n schemaLines.push(`DEFINE TABLE OVERWRITE ${tableName} SCHEMAFULL;`);\n schemaLines.push(\"\");\n schemaLines.push(`DEFINE FIELD OVERWRITE id ON TABLE ${tableName} TYPE record<${tableName}>;`);\n\n // Generate field definitions\n for (const [internalFieldName, field] of Object.entries((tableDef as any).fields)) {\n const fieldName = getFieldName({\n model: internalModelName,\n field: internalFieldName,\n });\n const baseType = mapFieldType(tableName, fieldName, (field as any).type?.toString());\n const finalType = (field as any).required === false ? `option<${baseType}>` : baseType;\n schemaLines.push(\n `DEFINE FIELD OVERWRITE ${fieldName} ON TABLE ${tableName} TYPE ${finalType};`,\n );\n }\n\n schemaLines.push(\"\");\n schemaLines.push(\n `DEFINE INDEX OVERWRITE idx_${tableName}_id ON ${tableName} COLUMNS id UNIQUE;`,\n );\n\n // Generate indexes for specific fields\n for (const [internalFieldName, field] of Object.entries((tableDef as any).fields)) {\n const fieldName = getFieldName({\n model: internalModelName,\n field: internalFieldName,\n });\n\n const indexedFields: Record<string, string | string[]> = {\n user: \"email\",\n account: \"userId\",\n session: [\"userId\", \"token\"],\n verification: \"identifier\",\n invitation: [\"email\", \"organizationId\"],\n member: [\"userId\", \"organizationId\"],\n organization: \"slug\",\n passkey: \"userId\",\n twoFactor: \"secret\",\n };\n\n const fieldsToIndex = indexedFields[internalModelName];\n const shouldIndex =\n fieldsToIndex &&\n ((Array.isArray(fieldsToIndex) && fieldsToIndex.includes(internalFieldName)) ||\n fieldsToIndex === internalFieldName);\n\n if (shouldIndex) {\n schemaLines.push(\n `DEFINE INDEX OVERWRITE idx_${tableName}_${fieldName} ON ${tableName} COLUMNS ${fieldName}${(field as any).unique ? \" UNIQUE\" : \"\"};`,\n );\n }\n }\n schemaLines.push(\"\");\n }\n\n const path = file ?? \"schema.surql\";\n return {\n path,\n code: schemaLines.join(\"\\n\"),\n overwrite: true,\n };\n}\n","import {\n createAdapterFactory,\n type AdapterFactoryCustomizeAdapterCreator,\n type AdapterFactoryOptions,\n type DBAdapter,\n} from \"better-auth/adapters\";\nimport {\n BoundQuery,\n DateTime,\n escapeIdent,\n raw,\n RecordId,\n StringRecordId,\n surql,\n Table,\n type Surreal,\n type SurrealTransaction,\n type Values,\n} from \"surrealdb\";\nimport {\n buildFetchLinks,\n buildRecordIdMap,\n createWhereBuilder,\n getReferencedModel,\n getSpecialReferenceModel,\n logSurrealQuery,\n mapNullToUndefined,\n toRecordId,\n} from \"./utils\";\nimport type { SurrealDBAdapterConfig } from \"./types\";\nimport { generateSchema } from \"./schema\";\n\n/**\n * Better-Auth adapter for SurrealDB.\n * Supports native RecordId, transactions, and polymorphic relationships.\n *\n * @param db - An instance of SurrealDB client or transaction.\n * @param config - Optional configuration settings for the adapter.\n */\nexport const surrealdbAdapter = (db: Surreal, config?: SurrealDBAdapterConfig) => {\n let authOptions: any;\n\n const createCustomAdapter =\n (client: Surreal | SurrealTransaction): AdapterFactoryCustomizeAdapterCreator =>\n ({\n getFieldName,\n getFieldAttributes,\n getModelName,\n getDefaultFieldName,\n getDefaultModelName,\n options,\n schema,\n }) => {\n authOptions = options;\n\n const validTables = new Set<string>();\n Object.keys(schema).forEach((modelKey) => {\n validTables.add(getModelName(modelKey));\n });\n\n const buildWhere = createWhereBuilder(\n getFieldName,\n getFieldAttributes,\n getModelName,\n validTables,\n schema,\n );\n\n /**\n * Prepares data for SurrealDB storage by converting strings to RecordIds where appropriate\n * and mapping nulls to undefined for idiomatic MERGE behavior.\n */\n const transformDataForDB = (model: string, data: Record<string, any>) => {\n const transformed = { ...data };\n const currentDbTable = getModelName(model);\n\n for (const key in transformed) {\n const value = transformed[key];\n if (value === undefined || value === null) continue;\n\n const attr = getFieldAttributes({ field: key, model });\n\n let fallbackTable = getSpecialReferenceModel(\n currentDbTable,\n key,\n getModelName,\n schema,\n transformed,\n );\n\n if (!fallbackTable && (key === \"id\" || attr?.references)) {\n const refModel = attr?.references?.model;\n fallbackTable = refModel ? getModelName(refModel) : currentDbTable;\n }\n\n transformed[key] = toRecordId(value, validTables, fallbackTable);\n }\n return mapNullToUndefined(transformed);\n };\n\n const recordIdMap = buildRecordIdMap(\n (options as any)?.schema?.tables,\n getModelName,\n getFieldName,\n );\n\n const getReferencedModelFn = (tableName: string, fieldName: string) =>\n getReferencedModel(\n tableName,\n fieldName,\n recordIdMap,\n getDefaultModelName,\n getDefaultFieldName,\n getModelName,\n config,\n );\n\n return {\n async create({ model, data }) {\n const idGenerator = config?.idGenerator;\n const providedId = data.id;\n const { id: _, ...restData } = data;\n\n function buildCreateQuery() {\n if (providedId && providedId !== \"__surreal__\") {\n return surql`CREATE type::record(${model}, ${String(providedId)})`;\n }\n\n switch (idGenerator) {\n case \"ULID\":\n return surql`CREATE type::record(${model}, rand::ulid())`;\n case \"UUIDv4\":\n return surql`CREATE type::record(${model}, rand::uuid::v4())`;\n case \"UUIDv7\":\n return surql`CREATE type::record(${model}, rand::uuid())`;\n case \"guid\":\n return surql`CREATE type::record(${model}, rand::id())`;\n default:\n return surql`CREATE ${new Table(model)}`;\n }\n }\n\n let surrealql = buildCreateQuery();\n surrealql.append(surql` CONTENT ${transformDataForDB(model, restData)}`);\n\n const [record] = await client.query<[any[]]>(surrealql);\n logSurrealQuery(config, \"create\", model, surrealql);\n\n return record[0] as any;\n },\n\n async findOne({ model, where, select, join }) {\n const whereExpr = buildWhere(where, model);\n if (!whereExpr) return null;\n\n const tableIdent = raw(escapeIdent(model));\n let surrealql: BoundQuery;\n\n if (select && select.length > 0) {\n const fields = raw(\n select.map((f) => escapeIdent(getFieldName({ field: f, model }))).join(\", \"),\n );\n surrealql = surql`SELECT ${fields} FROM ${tableIdent} WHERE `;\n } else {\n surrealql = surql`SELECT * FROM ${tableIdent} WHERE `;\n }\n\n surrealql.append(whereExpr).append(surql` LIMIT 1`);\n\n const fetchLinks = buildFetchLinks(join, getFieldName, model);\n if (fetchLinks && fetchLinks.length > 0) {\n surrealql.append(surql` FETCH ${raw(fetchLinks.join(\", \"))}`);\n }\n\n logSurrealQuery(config, \"findOne\", model, surrealql);\n\n const [result] = await client.query<[any[]]>(surrealql);\n return result?.[0] || null;\n },\n\n async findMany({ model, where, limit, offset, sortBy, join }) {\n const tableIdent = raw(escapeIdent(model));\n let surrealql = surql`SELECT * FROM ${tableIdent}`;\n\n const whereExpr = buildWhere(where, model);\n if (whereExpr) {\n surrealql.append(surql` WHERE `).append(whereExpr);\n }\n\n if (sortBy) {\n const dbField = raw(escapeIdent(getFieldName({ field: sortBy.field, model })));\n const direction = raw(sortBy.direction === \"desc\" ? \"DESC\" : \"ASC\");\n surrealql.append(surql` ORDER BY ${dbField} ${direction}`);\n }\n\n if (limit) {\n surrealql.append(surql` LIMIT ${limit}`);\n }\n\n if (offset) {\n surrealql.append(surql` START ${offset}`);\n }\n\n if (join) {\n const fetchLinks = buildFetchLinks(join, getFieldName, model);\n if (fetchLinks && fetchLinks.length > 0) {\n surrealql.append(surql` FETCH ${raw(fetchLinks.join(\", \"))}`);\n }\n }\n\n logSurrealQuery(config, \"findMany\", model, surrealql);\n\n const [result] = await client.query<[any[]]>(surrealql);\n return result || [];\n },\n\n async update({ model, where, update }) {\n const whereExpr = buildWhere(where, model);\n if (!whereExpr) return null;\n\n const tableIdent = raw(escapeIdent(model));\n const transformedUpdate = transformDataForDB(model, update as any);\n\n let surrealql = surql`UPDATE ${tableIdent} MERGE ${transformedUpdate} WHERE `;\n surrealql.append(whereExpr);\n\n logSurrealQuery(config, \"update\", model, surrealql);\n\n const [result] = await client.query<[any[]]>(surrealql);\n return result?.[0] || null;\n },\n\n async updateMany({ model, where, update }) {\n const whereExpr = buildWhere(where, model);\n if (!whereExpr) return 0;\n\n const tableIdent = raw(escapeIdent(model));\n const data = mapNullToUndefined(update);\n\n let surrealql = surql`UPDATE ${tableIdent} MERGE ${data as Values<unknown>} WHERE `;\n surrealql.append(whereExpr);\n\n logSurrealQuery(config, \"updateMany\", model, surrealql);\n\n const [result] = await client.query<[any[]]>(surrealql);\n return result ? result.length : 0;\n },\n\n async count({ model, where }) {\n const whereExpr = buildWhere(where, model);\n const tableIdent = raw(escapeIdent(model));\n\n let surrealql = surql`SELECT count() FROM ${tableIdent}`;\n if (whereExpr) {\n surrealql.append(surql` WHERE `).append(whereExpr);\n }\n surrealql.append(surql` GROUP ALL`);\n\n logSurrealQuery(config, \"count\", model, surrealql);\n\n const [result] = await client.query<[any[]]>(surrealql);\n return result?.[0]?.count || 0;\n },\n\n async delete({ model, where }) {\n const whereExpr = buildWhere(where, model);\n if (!whereExpr) return;\n\n const tableIdent = raw(escapeIdent(model));\n let surrealql = surql`DELETE FROM ${tableIdent} WHERE `;\n surrealql.append(whereExpr);\n\n logSurrealQuery(config, \"delete\", model, surrealql);\n await client.query(surrealql);\n },\n\n async deleteMany({ model, where }) {\n const whereExpr = buildWhere(where, model);\n if (!whereExpr) return 0;\n\n const tableIdent = raw(escapeIdent(model));\n let surrealql = surql`DELETE FROM ${tableIdent} WHERE `;\n surrealql.append(whereExpr);\n surrealql.append(surql` RETURN BEFORE`);\n\n logSurrealQuery(config, \"deleteMany\", model, surrealql);\n\n const [result] = await client.query<[any[]]>(surrealql);\n return result ? result.length : 0;\n },\n\n async createSchema({ file, tables }) {\n return generateSchema({\n file,\n tables,\n getModelName,\n getFieldName,\n getReferencedModel: getReferencedModelFn,\n });\n },\n };\n };\n\n const adapterOptions: AdapterFactoryOptions = {\n config: {\n adapterId: \"surrealdb\",\n adapterName: \"SurrealDB\",\n usePlural: config?.usePlural ?? false,\n debugLogs: config?.debugLogs ?? false,\n supportsJSON: true,\n supportsArrays: true,\n supportsUUIDs: false,\n // @ts-expect-error\n supportsJoin: true,\n supportsDates: true,\n supportsBooleans: true,\n supportsNumericIds: true,\n customIdGenerator: config?.idGenerator\n ? () => {\n return \"__surreal__\";\n }\n : undefined,\n /**\n * Transforms SurrealDB specific types back to standard JavaScript types.\n * Converts RecordId to string and Surreal DateTime to native Date.\n */\n customTransformOutput: ({ data }) => {\n if (data instanceof RecordId || data instanceof StringRecordId) {\n return data.toString();\n }\n\n if (data instanceof DateTime) {\n return data.toDate();\n }\n\n return data;\n },\n /**\n * Wraps adapter operations in a SurrealDB transaction.\n */\n transaction: async (cb: any) => {\n const txn = await db.beginTransaction();\n try {\n const transactionalAdapter = createAdapterFactory({\n config: adapterOptions.config,\n adapter: createCustomAdapter(txn),\n })(authOptions);\n\n const result = await cb(transactionalAdapter);\n await txn.commit();\n return result;\n } catch (err) {\n await txn.cancel();\n throw err;\n }\n },\n },\n adapter: createCustomAdapter(db),\n };\n\n const lazyAdapter = createAdapterFactory(adapterOptions);\n\n return (options: any): DBAdapter => {\n return lazyAdapter(options);\n };\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../src/utils.ts","../src/schema.ts","../src/adapter.ts"],"sourcesContent":["import { logger, type BetterAuthDBSchema, type JoinConfig } from \"better-auth\";\nimport { raw, escapeIdent, type BoundQuery, RecordId, StringRecordId, surql } from \"surrealdb\";\nimport { type RecordIdMap, type SurrealDBAdapterConfig } from \"./types\";\n\ntype GetFieldNameFn = (params: { field: string; model: string }) => string;\n\n/**\n * Converts a value to a SurrealDB RecordId or StringRecordId.\n * It validates the table prefix against the schema to avoid converting\n * non-record strings (like URLs or emails) that happen to contain colons.\n */\nexport function toRecordId(\n value: any,\n validTables: Set<string>,\n fallbackTable?: string | null,\n): any {\n if (value instanceof RecordId || value instanceof StringRecordId) return value;\n\n if (typeof value === \"string\") {\n if (value.includes(\":\")) {\n const [tablePrefix, ...rest] = value.split(\":\");\n const idPart = rest.join(\":\");\n\n if (validTables.has(tablePrefix)) {\n return new RecordId(tablePrefix, idPart);\n }\n return value;\n }\n\n if (fallbackTable && validTables.has(fallbackTable)) {\n return new RecordId(fallbackTable, value);\n }\n }\n\n return value;\n}\n\n/**\n * Resolves the target table for polymorphic fields or fields where\n * Better-Auth metadata might be missing explicit relationship info.\n */\nexport const getSpecialReferenceModel = (\n dbModelName: string,\n field: string,\n getModelName: (m: string) => string,\n schema: BetterAuthDBSchema,\n data?: Record<string, any>,\n): string | null => {\n if (schema.account && dbModelName === getModelName(\"account\") && field === \"accountId\") {\n const userModel = schema.user ? getModelName(\"user\") : null;\n if (data) {\n return data.providerId === \"credential\" ? userModel : null;\n }\n return userModel;\n }\n\n if (schema.oauthAccessToken && schema.oauthConsent) {\n const accessTokenTable = getModelName(\"oauthAccessToken\");\n const consentTable = getModelName(\"oauthConsent\");\n\n if (\n (dbModelName === accessTokenTable || dbModelName === consentTable) &&\n field === \"clientId\"\n ) {\n return schema.oauthApplication ? getModelName(\"oauthApplication\") : null;\n }\n }\n\n return null;\n};\n\n/**\n * Builds a BoundQuery for the WHERE clause, handling operator mapping\n * and automatic RecordId conversion for relational fields.\n */\nexport const createWhereBuilder = (\n getFieldName: any,\n getFieldAttributes: any,\n getModelName: any,\n validTables: Set<string>,\n schema: BetterAuthDBSchema,\n) => {\n return (where: any[] | undefined | null, modelName: string) => {\n if (!where || where.length === 0) return null;\n\n let query = surql``;\n const dbModelName = getModelName(modelName);\n\n where.forEach((w, index) => {\n if (index > 0) {\n query.append(surql` ${raw(w.connector || \"AND\")} `);\n }\n\n const dbField = getFieldName({ field: w.field, model: modelName });\n const attr = getFieldAttributes({ field: w.field, model: modelName });\n let val = w.value;\n\n let targetModel = getSpecialReferenceModel(dbModelName, w.field, getModelName, schema);\n\n if (!targetModel && (w.field === \"id\" || attr?.references)) {\n const refModel = attr?.references?.model;\n targetModel = refModel ? getModelName(refModel) : dbModelName;\n }\n\n if (targetModel) {\n if (Array.isArray(val)) {\n val = val.map((v) => toRecordId(v, validTables, targetModel));\n } else if (val !== undefined && val !== null) {\n val = toRecordId(val, validTables, targetModel);\n }\n }\n\n const fieldRaw = raw(escapeIdent(dbField));\n\n switch (w.operator) {\n case \"eq\":\n case undefined:\n query.append(surql`${fieldRaw} = ${val}`);\n break;\n case \"ne\":\n query.append(surql`${fieldRaw} != ${val}`);\n break;\n case \"gt\":\n query.append(surql`${fieldRaw} > ${val}`);\n break;\n case \"gte\":\n query.append(surql`${fieldRaw} >= ${val}`);\n break;\n case \"lt\":\n query.append(surql`${fieldRaw} < ${val}`);\n break;\n case \"lte\":\n query.append(surql`${fieldRaw} <= ${val}`);\n break;\n case \"in\":\n query.append(surql`${fieldRaw} IN ${val}`);\n break;\n case \"not_in\":\n query.append(surql`${fieldRaw} NOT IN ${val}`);\n break;\n case \"contains\":\n query.append(surql`${fieldRaw} CONTAINS ${val}`);\n break;\n case \"starts_with\":\n query.append(surql`string::starts_with(${fieldRaw}, ${val})`);\n break;\n case \"ends_with\":\n query.append(surql`string::ends_with(${fieldRaw}, ${val})`);\n break;\n default:\n throw new Error(`[SurrealDB Adapter]: Unsupported operator \"${w.operator}\"`);\n }\n });\n\n return query;\n };\n};\n\n/**\n * Maps join configurations to a list of fields for the SurrealDB FETCH clause.\n */\nexport const buildFetchLinks = (\n join: JoinConfig | undefined,\n getFieldName: GetFieldNameFn,\n _model: string,\n) => {\n if (!join) return null;\n\n const recordLinks = Object.entries(join).map(([joinedModel, config]): string => {\n return getFieldName({ model: joinedModel, field: config.on.to });\n });\n return recordLinks;\n};\n\n/**\n * Converts null values to undefined.\n * This is required for SurrealDB MERGE operations to effectively\n * unset/remove fields from a document rather than storing a NULL value.\n */\nexport function mapNullToUndefined<T extends Record<string, any>>(data: T): T {\n const out = { ...data };\n\n for (const key of Object.keys(out)) {\n if ((out as any)[key] === null) {\n (out as any)[key] = undefined;\n }\n }\n\n return out;\n}\n\n/**\n * Standardized error logging for adapter operations.\n */\nexport const ERROR_HANDLERS = {\n modelNotFound: (modelName: string, config?: SurrealDBAdapterConfig) => {\n if (config?.debugLogs) {\n logger.debug(\n `[surreal-better-auth]: Model '${modelName}' not found in schema, skipping operation `,\n );\n }\n },\n fieldMappingSkipped: (rule: string, reason: string, config?: SurrealDBAdapterConfig) => {\n if (config?.debugLogs) {\n logger.debug(`[surreal-better-auth]: Skipping field mapping rule for '${rule}': ${reason} `);\n }\n },\n unsupportedOperator: (operator: string, config?: SurrealDBAdapterConfig) => {\n if (config?.debugLogs) {\n logger.warn(\n `[surreal-better-auth]: Unknown operator '${operator}', falling back to equality comparison `,\n );\n }\n },\n};\n\n/**\n * Finds the referenced model name for a specific field based on schema or defaults.\n */\nexport function getReferencedModel(\n tableName: string,\n fieldName: string,\n recordIdMap: RecordIdMap,\n getDefaultModelName: (tableName: string) => string,\n getDefaultFieldName: (opts: { model: string; field: string }) => string,\n getModelName: (model: string) => string,\n config?: SurrealDBAdapterConfig,\n): string | null {\n const defaultModel = getDefaultModelName(tableName);\n const defaultField = getDefaultFieldName({\n model: defaultModel,\n field: fieldName,\n });\n\n const referencedModel = DEFAULT_FIELD_REFERENCES[defaultField];\n if (referencedModel) {\n try {\n const modelName = getModelName(referencedModel);\n if (config?.debugLogs) {\n logger.debug(\n `[surreal-better-auth]: Found default reference: ${tableName}.${fieldName} -> ${modelName} `,\n );\n }\n return modelName;\n // oxlint-disable-next-line\n } catch (error) {\n ERROR_HANDLERS.modelNotFound(referencedModel, config);\n }\n }\n\n const tableSpecificRef = recordIdMap.tableSpecific[tableName]?.[fieldName];\n if (tableSpecificRef && config?.debugLogs) {\n logger.debug(\n `[surreal-better-auth]: Found table-specific reference: ${tableName}.${fieldName} -> ${tableSpecificRef} `,\n );\n }\n\n return tableSpecificRef || null;\n}\n\n/**\n * Common field-to-model mappings used as a fallback for implicit relationships.\n */\nexport const DEFAULT_FIELD_REFERENCES: Record<string, string> = {\n userId: \"user\",\n organizationId: \"organization\",\n teamId: \"team\",\n inviterId: \"user\",\n activeOrganizationId: \"organization\",\n activeTeamId: \"team\",\n};\n\n/**\n * Scans Better-Auth tables to build a map of fields that reference other models.\n */\nexport function buildRecordIdMap(\n tables: any,\n getModelName: (model: string) => string,\n getFieldName: (opts: { model: string; field: string }) => string,\n): RecordIdMap {\n const map: RecordIdMap = { tableSpecific: {} };\n if (!tables) return map;\n\n for (const internalModelName in tables) {\n const tableDef = tables[internalModelName];\n if (!tableDef?.fields) continue;\n\n const actualTableName = getModelName(internalModelName);\n if (!map.tableSpecific[actualTableName]) {\n map.tableSpecific[actualTableName] = {};\n }\n\n for (const internalFieldName in tableDef.fields) {\n const fieldDef = tableDef.fields[internalFieldName];\n if (fieldDef?.references?.model) {\n const actualFieldName = getFieldName({\n model: internalModelName,\n field: internalFieldName,\n });\n const referencedActualTableName = getModelName(fieldDef.references.model);\n map.tableSpecific[actualTableName][actualFieldName] = referencedActualTableName;\n }\n }\n }\n return map;\n}\n\nconst colors = {\n reset: \"\\x1b[0m\",\n bold: \"\\x1b[1m\",\n dim: \"\\x1b[90m\",\n border: \"\\x1b[38;5;238m\",\n fg: {\n blue: \"\\x1b[34m\",\n cyan: \"\\x1b[36m\",\n green: \"\\x1b[32m\",\n yellow: \"\\x1b[33m\",\n purple: \"\\x1b[35m\",\n },\n};\n\n/**\n * Formats and logs SurrealQL queries to the console with syntax highlighting.\n * Helps developers debug the exact queries and bindings sent to the database.\n */\nexport function logSurrealQuery(config: any, method: string, model: string, queryObj: BoundQuery) {\n if (!config?.debugLogs && !config?.logSurrealQL) return;\n\n if (typeof config.debugLogs === \"object\" && !(\"isRunningAdapterTests\" in config.debugLogs)) {\n const logsMap = config.debugLogs as Record<string, boolean>;\n if (!logsMap[method]) return;\n }\n\n const q = queryObj.query;\n const b = queryObj.bindings || {};\n\n const formatValue = (val: any): string => {\n if (typeof val === \"string\") {\n if (val.includes(\":\")) return `${colors.fg.cyan}${val}${colors.reset}`;\n return `${colors.fg.green}'${val}'${colors.reset}`;\n }\n if (typeof val === \"number\" || typeof val === \"boolean\")\n return `${colors.fg.yellow}${val}${colors.reset}`;\n if (val === null) return `${colors.dim}null${colors.reset}`;\n if (val === undefined) return `${colors.dim}undefined${colors.reset}`;\n\n let jsonStr = \"\";\n try {\n jsonStr = JSON.stringify(val, null, 2);\n } catch {\n jsonStr = String(val);\n }\n\n return jsonStr\n .replace(/\"([^\"]+)\":/g, `${colors.fg.cyan}$1${colors.reset}:`)\n .replace(/: \"([^\"]*)\"/g, `: ${colors.fg.green}'$1'${colors.reset}`)\n .replace(\n /: (true|false|null|-?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?)/g,\n `: ${colors.fg.yellow}$1${colors.reset}`,\n );\n };\n\n const formatSQL = (str: string) =>\n str\n .replace(\n /\\b(CREATE|CONTENT|SELECT|FROM|WHERE|UPDATE|MERGE|SET|DELETE|LIMIT|ORDER BY|START|FETCH|type::record|type::thing)\\b/g,\n `${colors.fg.purple}$1${colors.reset}`,\n )\n .replace(/\\b(rand::\\w+(?:::\\w+)?)\\b/g, `${colors.fg.blue}$1${colors.reset}`)\n .replace(/(\\$bind__\\w+)/g, `${colors.fg.yellow}$1${colors.reset}`);\n\n let fullQuery = q;\n const sortedKeys = Object.keys(b).sort((a, b) => b.length - a.length);\n sortedKeys.forEach((key) => {\n const val = b[key];\n const displayVal = typeof val === \"string\" ? `'${val}'` : JSON.stringify(val);\n fullQuery = fullQuery.replace(\n new RegExp(`\\\\$${key}\\\\b`, \"g\"),\n `${colors.fg.green}${displayVal}${colors.reset}`,\n );\n });\n\n let logOut = `\\n${colors.border}┌── ${colors.reset}${colors.bold}SURREALDB DEBUG${colors.reset} ${colors.dim}───────────────────────────────────────${colors.reset}\\n`;\n\n const addLine = (content: string = \"\") => {\n const lines = content.split(\"\\n\");\n lines.forEach((line) => {\n logOut += `${colors.border}│${colors.reset} ${line}\\n`;\n });\n };\n\n addLine(\n `${colors.dim}Method:${colors.reset} ${colors.bold}${method}${colors.reset} ${colors.dim}Model:${colors.reset} ${colors.fg.cyan}${model}${colors.reset}`,\n );\n addLine();\n addLine(`${colors.dim}Full Query (interpolated):${colors.reset}`);\n addLine(formatSQL(fullQuery));\n addLine();\n addLine(`${colors.dim}Raw SurQL:${colors.reset}`);\n addLine(formatSQL(q));\n addLine();\n addLine(`${colors.dim}Bindings:${colors.reset}`);\n\n Object.entries(b).forEach(([key, val]) => {\n const prefix = ` ${colors.fg.yellow}${key}${colors.reset} ${colors.dim}=${colors.reset} `;\n const cleanPrefixLength = ` ${key} = `.length;\n\n let formattedVal = formatValue(val);\n\n if (formattedVal.includes(\"\\n\")) {\n const indentStr = \" \".repeat(cleanPrefixLength);\n formattedVal = formattedVal\n .split(\"\\n\")\n .map((l, i) => (i === 0 ? l : `${indentStr}${l}`))\n .join(\"\\n\");\n }\n\n addLine(`${prefix}${formattedVal}`);\n });\n\n logOut += `${colors.border}└──────────────────────────────────────────────────────────────${colors.reset}\\n`;\n\n console.log(logOut);\n}\n","/**\n * Schema generation utilities for SurrealDB Better Auth adapter.\n * Generates SurrealDB schema definitions with proper field types and indexes.\n */\n\nimport type { GenerateSchemaParams, GenerateSchemaResult } from \"./types\";\n\n/**\n * Generates SurrealDB schema from Better Auth table definitions with proper field types and indexes.\n */\nexport function generateSchema(params: GenerateSchemaParams): GenerateSchemaResult {\n const { file, tables, getModelName, getFieldName, getReferencedModel } = params;\n\n const schemaLines: string[] = [];\n const date = new Date();\n const formatted = `${date.getUTCFullYear()}-${String(date.getUTCMonth() + 1).padStart(2, \"0\")}-${String(date.getUTCDate()).padStart(2, \"0\")} at ${String(date.getUTCHours()).padStart(2, \"0\")}:${String(date.getUTCMinutes()).padStart(2, \"0\")}:${String(date.getUTCSeconds()).padStart(2, \"0\")} UTC`;\n\n schemaLines.push(\n \"-- ╔════════════════════════════════════════════════════════════════════════╗\",\n \"-- ║ SurrealDB Better Auth Schema ║\",\n \"-- ╟────────────────────────────────────────────────────────────────────────╢\",\n \"-- ║ This schema was auto-generated for BetterAuth integration ║\",\n \"-- ║ Adapter: surreal-better-auth ║\",\n \"-- ║ Repo: https://github.com/oskar-gmerek/surreal-better-auth ║\",\n \"-- ║ Author: Oskar Gmerek ║\",\n \"-- ║ ║\",\n `-- ║ Generation Date: ${formatted.padEnd(53)}║`,\n \"-- ╟────────────────────────────────────────────────────────────────────────╢\",\n \"-- ║ Warning: It is strongly recommended to manually review the schema ║\",\n \"-- ║ after each generation to ensure it fully meets your ║\",\n `-- ║ project's specific requirements. ║`,\n \"-- ╟────────────────────────────────────────────────────────────────────────╢\",\n \"-- ║ Tip: The easiest way to apply this schema to your database is to use ║\",\n \"-- ║ import function in the Surrealist or via SurrealDB CLI. ║\",\n \"-- ╚════════════════════════════════════════════════════════════════════════╝\",\n \"\",\n \"\",\n \"\",\n );\n\n /**\n * Builds decorative box around table names in schema output.\n */\n function buildTableBox(text: string, totalWidth = 76): string[] {\n const contentWidth = totalWidth - 8;\n const lineContent = text.padEnd(contentWidth, \" \");\n const top = `-- ╔${\"═\".repeat(totalWidth - 4)}╗`;\n const mid = `-- ║ ${lineContent} ║`;\n const bot = `-- ╚${\"═\".repeat(totalWidth - 4)}╝`;\n return [top, mid, bot];\n }\n\n /**\n * Maps Better Auth field types to SurrealDB types with special cases for references.\n */\n function mapFieldType(tableName: string, fieldName: string, type?: string): string {\n // Special cases for field-to-table mappings in schema generation\n try {\n const accountModelName = getModelName(\"account\");\n const userModelName = getModelName(\"user\");\n const accountIdFieldName = getFieldName({\n model: \"account\",\n field: \"accountId\",\n });\n\n if (tableName === accountModelName && fieldName === accountIdFieldName) {\n return `record<${userModelName}> | string`;\n }\n // oxlint-disable-next-line\n } catch (e) {\n // account or user model not in schema, skip\n }\n\n try {\n const oauthAccessTokenModelName = getModelName(\"oauthAccessToken\");\n const oauthApplicationModelName = getModelName(\"oauthApplication\");\n const oauthAccessTokenIdFieldName = getFieldName({\n model: \"oauthAccessToken\",\n field: \"clientId\",\n });\n\n if (tableName === oauthAccessTokenModelName && fieldName === oauthAccessTokenIdFieldName) {\n return `record<${oauthApplicationModelName}>`;\n }\n // oxlint-disable-next-line\n } catch (e) {\n // oauthAccessToken or oauthApplication model not in schema, skip\n }\n\n try {\n const oauthConsentModelName = getModelName(\"oauthConsent\");\n const oauthApplicationModelName = getModelName(\"oauthApplication\");\n const oauthConsentIdFieldName = getFieldName({\n model: \"oauthConsent\",\n field: \"clientId\",\n });\n\n if (tableName === oauthConsentModelName && fieldName === oauthConsentIdFieldName) {\n return `record<${oauthApplicationModelName}>`;\n }\n // oxlint-disable-next-line\n } catch (e) {\n // oauthConsent or oauthApplication model not in schema, skip\n }\n\n const referencedModel = getReferencedModel(tableName, fieldName);\n if (referencedModel) {\n return `record<${referencedModel}>`;\n }\n\n const typeMap: Record<string, string> = {\n boolean: \"bool\",\n date: \"datetime\",\n };\n\n return typeMap[type || \"\"] || type || \"any\";\n }\n\n // Generate schema for each table\n for (const [internalModelName, tableDef] of Object.entries(tables)) {\n const tableName = getModelName(internalModelName);\n if ((tableDef as any).disableMigrations) continue;\n\n schemaLines.push(...buildTableBox(`TABLE: ${tableName}`));\n schemaLines.push(`DEFINE TABLE OVERWRITE ${tableName} SCHEMAFULL;`);\n schemaLines.push(\"\");\n schemaLines.push(`DEFINE FIELD OVERWRITE id ON TABLE ${tableName} TYPE any;`);\n\n // Generate field definitions\n for (const [internalFieldName, field] of Object.entries((tableDef as any).fields)) {\n const fieldName = getFieldName({\n model: internalModelName,\n field: internalFieldName,\n });\n const baseType = mapFieldType(tableName, fieldName, (field as any).type?.toString());\n const finalType = (field as any).required === false ? `option<${baseType}>` : baseType;\n schemaLines.push(\n `DEFINE FIELD OVERWRITE ${fieldName} ON TABLE ${tableName} TYPE ${finalType};`,\n );\n }\n\n schemaLines.push(\"\");\n schemaLines.push(\n `DEFINE INDEX OVERWRITE idx_${tableName}_id ON ${tableName} COLUMNS id UNIQUE;`,\n );\n\n // Generate indexes for specific fields\n for (const [internalFieldName, field] of Object.entries((tableDef as any).fields)) {\n const fieldName = getFieldName({\n model: internalModelName,\n field: internalFieldName,\n });\n\n const indexedFields: Record<string, string | string[]> = {\n user: \"email\",\n account: \"userId\",\n session: [\"userId\", \"token\"],\n verification: \"identifier\",\n invitation: [\"email\", \"organizationId\"],\n member: [\"userId\", \"organizationId\"],\n organization: \"slug\",\n passkey: \"userId\",\n twoFactor: \"secret\",\n };\n\n const fieldsToIndex = indexedFields[internalModelName];\n const shouldIndex =\n fieldsToIndex &&\n ((Array.isArray(fieldsToIndex) && fieldsToIndex.includes(internalFieldName)) ||\n fieldsToIndex === internalFieldName);\n\n if (shouldIndex) {\n schemaLines.push(\n `DEFINE INDEX OVERWRITE idx_${tableName}_${fieldName} ON ${tableName} COLUMNS ${fieldName}${(field as any).unique ? \" UNIQUE\" : \"\"};`,\n );\n }\n }\n schemaLines.push(\"\");\n }\n\n const path = file ?? \"schema.surql\";\n return {\n path,\n code: schemaLines.join(\"\\n\"),\n overwrite: true,\n };\n}\n","import {\n createAdapterFactory,\n type AdapterFactoryCustomizeAdapterCreator,\n type AdapterFactoryOptions,\n type DBAdapter,\n} from \"better-auth/adapters\";\nimport {\n BoundQuery,\n DateTime,\n escapeIdent,\n Features,\n raw,\n RecordId,\n StringRecordId,\n surql,\n Table,\n type Surreal,\n type SurrealTransaction,\n type Values,\n} from \"surrealdb\";\nimport {\n buildFetchLinks,\n buildRecordIdMap,\n createWhereBuilder,\n getReferencedModel,\n getSpecialReferenceModel,\n logSurrealQuery,\n mapNullToUndefined,\n toRecordId,\n} from \"./utils\";\nimport type { SurrealDBAdapterConfig } from \"./types\";\nimport { generateSchema } from \"./schema\";\n\n/**\n * Better-Auth adapter for SurrealDB.\n * Supports native RecordId, transactions, and polymorphic relationships.\n *\n * @param db - An instance of SurrealDB client or transaction.\n * @param config - Optional configuration settings for the adapter.\n */\nexport const surrealdbAdapter = (db: Surreal, config?: SurrealDBAdapterConfig) => {\n let authOptions: any;\n\n const createCustomAdapter =\n (client: Surreal | SurrealTransaction): AdapterFactoryCustomizeAdapterCreator =>\n ({\n getFieldName,\n getFieldAttributes,\n getModelName,\n getDefaultFieldName,\n getDefaultModelName,\n options,\n schema,\n }) => {\n authOptions = options;\n\n const validTables = new Set<string>();\n Object.keys(schema).forEach((modelKey) => {\n validTables.add(getModelName(modelKey));\n });\n\n const buildWhere = createWhereBuilder(\n getFieldName,\n getFieldAttributes,\n getModelName,\n validTables,\n schema,\n );\n\n /**\n * Prepares data for SurrealDB storage by converting strings to RecordIds where appropriate\n * and mapping nulls to undefined for idiomatic MERGE behavior.\n */\n const transformDataForDB = (model: string, data: Record<string, any>) => {\n const transformed = { ...data };\n const currentDbTable = getModelName(model);\n\n for (const key in transformed) {\n const value = transformed[key];\n if (value === undefined || value === null) continue;\n\n const attr = getFieldAttributes({ field: key, model });\n\n let fallbackTable = getSpecialReferenceModel(\n currentDbTable,\n key,\n getModelName,\n schema,\n transformed,\n );\n\n if (!fallbackTable && (key === \"id\" || attr?.references)) {\n const refModel = attr?.references?.model;\n fallbackTable = refModel ? getModelName(refModel) : currentDbTable;\n }\n\n transformed[key] = toRecordId(value, validTables, fallbackTable);\n }\n return mapNullToUndefined(transformed);\n };\n\n const recordIdMap = buildRecordIdMap(\n (options as any)?.schema?.tables,\n getModelName,\n getFieldName,\n );\n\n const getReferencedModelFn = (tableName: string, fieldName: string) =>\n getReferencedModel(\n tableName,\n fieldName,\n recordIdMap,\n getDefaultModelName,\n getDefaultFieldName,\n getModelName,\n config,\n );\n\n return {\n async create({ model, data }) {\n const idGenerator = config?.idGenerator;\n const providedId = data.id;\n const { id: _, ...restData } = data;\n\n function buildCreateQuery() {\n if (providedId && providedId !== \"__surreal__\") {\n return surql`CREATE type::record(${model}, ${String(providedId)})`;\n }\n\n switch (idGenerator) {\n case \"ULID\":\n return surql`CREATE type::record(${model}, rand::ulid())`;\n case \"UUIDv4\":\n return surql`CREATE type::record(${model}, rand::uuid::v4())`;\n case \"UUIDv7\":\n return surql`CREATE type::record(${model}, rand::uuid())`;\n case \"guid\":\n return surql`CREATE type::record(${model}, rand::id())`;\n default:\n return surql`CREATE ${new Table(model)}`;\n }\n }\n\n let surrealql = buildCreateQuery();\n surrealql.append(surql` CONTENT ${transformDataForDB(model, restData)}`);\n\n const [record] = await client.query<[any[]]>(surrealql);\n logSurrealQuery(config, \"create\", model, surrealql);\n\n return record[0] as any;\n },\n\n async findOne({ model, where, select, join }) {\n const whereExpr = buildWhere(where, model);\n if (!whereExpr) return null;\n\n const tableIdent = raw(escapeIdent(model));\n let surrealql: BoundQuery;\n\n if (select && select.length > 0) {\n const fields = raw(\n select.map((f) => escapeIdent(getFieldName({ field: f, model }))).join(\", \"),\n );\n surrealql = surql`SELECT ${fields} FROM ${tableIdent} WHERE `;\n } else {\n surrealql = surql`SELECT * FROM ${tableIdent} WHERE `;\n }\n\n surrealql.append(whereExpr).append(surql` LIMIT 1`);\n\n const fetchLinks = buildFetchLinks(join, getFieldName, model);\n if (fetchLinks && fetchLinks.length > 0) {\n surrealql.append(surql` FETCH ${raw(fetchLinks.join(\", \"))}`);\n }\n\n logSurrealQuery(config, \"findOne\", model, surrealql);\n\n const [result] = await client.query<[any[]]>(surrealql);\n return result?.[0] || null;\n },\n\n async findMany({ model, where, limit, offset, sortBy, join }) {\n const tableIdent = raw(escapeIdent(model));\n let surrealql = surql`SELECT * FROM ${tableIdent}`;\n\n const whereExpr = buildWhere(where, model);\n if (whereExpr) {\n surrealql.append(surql` WHERE `).append(whereExpr);\n }\n\n if (sortBy) {\n const dbField = raw(escapeIdent(getFieldName({ field: sortBy.field, model })));\n const direction = raw(sortBy.direction === \"desc\" ? \"DESC\" : \"ASC\");\n surrealql.append(surql` ORDER BY ${dbField} ${direction}`);\n }\n\n if (limit) {\n surrealql.append(surql` LIMIT ${limit}`);\n }\n\n if (offset) {\n surrealql.append(surql` START ${offset}`);\n }\n\n if (join) {\n const fetchLinks = buildFetchLinks(join, getFieldName, model);\n if (fetchLinks && fetchLinks.length > 0) {\n surrealql.append(surql` FETCH ${raw(fetchLinks.join(\", \"))}`);\n }\n }\n\n logSurrealQuery(config, \"findMany\", model, surrealql);\n\n const [result] = await client.query<[any[]]>(surrealql);\n return result || [];\n },\n\n async update({ model, where, update }) {\n const whereExpr = buildWhere(where, model);\n if (!whereExpr) return null;\n\n const tableIdent = raw(escapeIdent(model));\n const transformedUpdate = transformDataForDB(model, update as any);\n\n let surrealql = surql`UPDATE ${tableIdent} MERGE ${transformedUpdate} WHERE `;\n surrealql.append(whereExpr);\n\n logSurrealQuery(config, \"update\", model, surrealql);\n\n const [result] = await client.query<[any[]]>(surrealql);\n return result?.[0] || null;\n },\n\n async updateMany({ model, where, update }) {\n const whereExpr = buildWhere(where, model);\n if (!whereExpr) return 0;\n\n const tableIdent = raw(escapeIdent(model));\n const data = mapNullToUndefined(update);\n\n let surrealql = surql`UPDATE ${tableIdent} MERGE ${data as Values<unknown>} WHERE `;\n surrealql.append(whereExpr);\n\n logSurrealQuery(config, \"updateMany\", model, surrealql);\n\n const [result] = await client.query<[any[]]>(surrealql);\n return result ? result.length : 0;\n },\n\n async count({ model, where }) {\n const whereExpr = buildWhere(where, model);\n const tableIdent = raw(escapeIdent(model));\n\n let surrealql = surql`SELECT count() FROM ${tableIdent}`;\n if (whereExpr) {\n surrealql.append(surql` WHERE `).append(whereExpr);\n }\n surrealql.append(surql` GROUP ALL`);\n\n logSurrealQuery(config, \"count\", model, surrealql);\n\n const [result] = await client.query<[any[]]>(surrealql);\n return result?.[0]?.count || 0;\n },\n\n async delete({ model, where }) {\n const whereExpr = buildWhere(where, model);\n if (!whereExpr) return;\n\n const tableIdent = raw(escapeIdent(model));\n let surrealql = surql`DELETE FROM ${tableIdent} WHERE `;\n surrealql.append(whereExpr);\n\n logSurrealQuery(config, \"delete\", model, surrealql);\n await client.query(surrealql);\n },\n\n async deleteMany({ model, where }) {\n const whereExpr = buildWhere(where, model);\n if (!whereExpr) return 0;\n\n const tableIdent = raw(escapeIdent(model));\n let surrealql = surql`DELETE FROM ${tableIdent} WHERE `;\n surrealql.append(whereExpr);\n surrealql.append(surql` RETURN BEFORE`);\n\n logSurrealQuery(config, \"deleteMany\", model, surrealql);\n\n const [result] = await client.query<[any[]]>(surrealql);\n return result ? result.length : 0;\n },\n\n async createSchema({ file, tables }) {\n return generateSchema({\n file,\n tables,\n getModelName,\n getFieldName,\n getReferencedModel: getReferencedModelFn,\n });\n },\n };\n };\n\n return (options: any): DBAdapter => {\n const supportsTxn = db.isFeatureSupported(Features.Transactions);\n console.log({ supportsTxn });\n const adapterOptions: AdapterFactoryOptions = {\n config: {\n adapterId: \"surrealdb\",\n adapterName: \"SurrealDB\",\n usePlural: config?.usePlural ?? false,\n debugLogs: config?.debugLogs ?? false,\n supportsJSON: true,\n supportsArrays: true,\n supportsUUIDs: false,\n // @ts-expect-error\n supportsJoin: true,\n supportsDates: true,\n supportsBooleans: true,\n supportsNumericIds: true,\n customIdGenerator: config?.idGenerator\n ? () => {\n return \"__surreal__\";\n }\n : undefined,\n\n /**\n * Transforms SurrealDB specific types back to standard JavaScript types.\n * Converts RecordId to string and Surreal DateTime to native Date.\n */\n customTransformOutput: ({ data }) => {\n if (data instanceof RecordId || data instanceof StringRecordId) {\n return data.toString();\n }\n\n if (data instanceof DateTime) {\n return data.toDate();\n }\n\n return data;\n },\n /**\n * Wraps adapter operations in a SurrealDB transaction.\n */\n transaction: supportsTxn\n ? async (cb) => {\n const txn = await db.beginTransaction();\n try {\n const transactionalAdapter = createAdapterFactory({\n config: adapterOptions.config,\n adapter: createCustomAdapter(txn),\n })(authOptions);\n\n const result = await cb(transactionalAdapter);\n await txn.commit();\n return result;\n } catch (err) {\n await txn.cancel();\n throw err;\n }\n }\n : false,\n },\n adapter: createCustomAdapter(db),\n };\n\n return createAdapterFactory(adapterOptions)(options);\n };\n};\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "surreal-better-auth",
3
- "version": "2.0.0-beta.4",
3
+ "version": "2.0.0-beta.6",
4
4
  "author": {
5
5
  "name": "Oskar Gmerek",
6
6
  "url": "https://oskargmerek.com",