surreal-better-auth 2.0.0-beta.6 → 2.0.0-beta.7
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 +1 -1
- package/index.d.mts +6 -3
- package/index.mjs +3 -3
- package/index.mjs.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -50,7 +50,7 @@ Built with real-world scenarios in mind, this adapter goes beyond simple CRUD op
|
|
|
50
50
|
## <img width="32" height="32" align="center" alt="Image" src="https://github.com/oskar-gmerek/surreal-better-auth/blob/beta/assets/requirements.png?raw=true" /> Requirements
|
|
51
51
|
|
|
52
52
|
- **Bun**: >= 1.3.10 (or **Node.js**: >= 20.0.0)
|
|
53
|
-
- **Better Auth**: ^1.
|
|
53
|
+
- **Better Auth**: ^1.5.1
|
|
54
54
|
- **SurrealDB JS SDK**: ^2.0.0
|
|
55
55
|
- **SurrealDB Server**: v3.0.0+
|
|
56
56
|
|
package/index.d.mts
CHANGED
|
@@ -16,6 +16,7 @@ type IdGenerator = "ULID" | "UUIDv4" | "UUIDv7" | "guid";
|
|
|
16
16
|
interface SurrealDBAdapterConfig {
|
|
17
17
|
/**
|
|
18
18
|
* Enable granular debug logging for adapter operations.
|
|
19
|
+
* @default false
|
|
19
20
|
*/
|
|
20
21
|
debugLogs?: DBAdapterDebugLogOption;
|
|
21
22
|
/**
|
|
@@ -26,10 +27,12 @@ interface SurrealDBAdapterConfig {
|
|
|
26
27
|
/**
|
|
27
28
|
* Strategy for generating record IDs in SurrealDB.
|
|
28
29
|
* If undefined, falls back to Better-Auth's default behavior.
|
|
30
|
+
* @default undefined
|
|
29
31
|
*/
|
|
30
32
|
idGenerator?: IdGenerator;
|
|
31
33
|
/**
|
|
32
34
|
* Displays the interpolated SurrealQL queries in the console for debugging purposes.
|
|
35
|
+
* @default false
|
|
33
36
|
*/
|
|
34
37
|
logSurrealQL?: boolean;
|
|
35
38
|
}
|
|
@@ -66,10 +69,10 @@ interface GenerateSchemaResult {
|
|
|
66
69
|
//#region src/adapter.d.ts
|
|
67
70
|
/**
|
|
68
71
|
* Better-Auth adapter for SurrealDB.
|
|
69
|
-
* Supports native RecordId, transactions, and
|
|
72
|
+
* Supports native RecordId, transactions, and fetch-based joins.
|
|
70
73
|
*
|
|
71
|
-
* @param db - An instance of SurrealDB client
|
|
72
|
-
* @param config -
|
|
74
|
+
* @param db - An instance of SurrealDB client.
|
|
75
|
+
* @param config - Configuration settings for the adapter.
|
|
73
76
|
*/
|
|
74
77
|
declare const surrealdbAdapter: (db: Surreal, config?: SurrealDBAdapterConfig) => (options: any) => DBAdapter;
|
|
75
78
|
//#endregion
|
package/index.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
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
|
|
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`&&e.length>0){let i=e.indexOf(`:`);if(i>0){let n=e.substring(0,i);return t.has(n)?new r(n,e.substring(i+1)):e}if(n&&i===-1&&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)=>{if(!e)return null;let r=Object.keys(e),i=[];for(let a=0;a<r.length;a++){let o=e[r[a]];o&&typeof o==`object`&&`on`in o&&i.push(t({model:n,field:o.on.from}))}return i.length>0?i:null};function m(e){let t={...e},n=Object.keys(t);for(let e=0;e<n.length;e++){let r=n[e];t[r]===null&&(t[r]=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{return a(s)}catch{h.modelNotFound(s,o)}return n.tableSpecific[e]?.[t]||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
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+=`${y.border}└──────────────────────────────────────────────────────────────${y.reset}\n`,console.log(l)}
|
|
6
|
-
`),overwrite:!0}}const
|
|
5
|
+
`)}u(`${n}${i}`)}),l+=`${y.border}└──────────────────────────────────────────────────────────────${y.reset}\n`,console.log(l)}const x=(e,t,n,a)=>{if(!e||!t)return e;let o=Array.isArray(e),s=o?e:[e];if(s.length===0)return e;let c=Object.keys(t),l=[];for(let e=0;e<c.length;e++){let r=c[e];l.push({relName:r,relField:a({model:n,field:t[r].on.from})})}for(let e=0;e<s.length;e++){let t=s[e];if(t)for(let e=0;e<l.length;e++){let{relName:n,relField:a}=l[e],o=t[a];o&&typeof o==`object`&&!(o instanceof r)&&!(o instanceof i)&&(t[n]=o,t[a]=o.id?.toString()||o.id)}}return o?s:s[0]};function S(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 C=(l,h)=>{let _,y=e=>({getFieldName:t,getFieldAttributes:n,getModelName:r,getDefaultFieldName:i,getDefaultModelName:l,options:y,schema:C})=>{_=y;let w=new Set;Object.keys(C).forEach(e=>{w.add(r(e))});let T=f(t,n,r,w,C),E=(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,C,i);if(!c&&(t===`id`||s?.references)){let e=s?.references?.model;c=e?r(e):a}i[t]=u(o,w,c)}return m(i)},D=v(C,r,t),O=(e,t)=>g(e,t,D,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__`&&y.advanced?.database?.generateId)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 ${E(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=T(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 x(m?.[0],a,n,t)||null},async findMany({model:n,where:r,limit:i,offset:a,sortBy:l,join:u}){let d=c`SELECT * FROM ${s(o(n))}`,f=T(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}`)}i&&d.append(c` LIMIT ${i}`),a&&d.append(c` START ${a}`);let m=p(u,t,n);m&&m.length>0&&d.append(c` FETCH ${s(m.join(`, `))}`),b(h,`findMany`,n,d);let[g]=await e.query(d);return x(g||[],u,n,t)},async update({model:t,where:n,update:r}){let i=T(n,t);if(!i)return null;let a=c`UPDATE ${s(o(t))} MERGE ${E(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=T(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=T(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=T(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=T(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 S({file:e,tables:n,getModelName:r,getFieldName:t,getReferencedModel:O})}}};return a=>{let o=l.isFeatureSupported(n.Transactions),s={config:{adapterId:`surrealdb`,adapterName:`SurrealDB`,usePlural:h?.usePlural??!1,debugLogs:h?.debugLogs??!1,supportsJSON:!0,supportsArrays:!0,supportsUUIDs:!0,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=>{h?.debugLogs&&console.log(`--- [TXN] Starting transaction... ---`);let n=await l.beginTransaction();try{let r=await t(e({config:s.config,adapter:y(n)})(_));return h?.debugLogs&&console.log(`--- [TXN] Committing transaction... ---`),await n.commit(),r}catch(e){throw h?.debugLogs&&console.log(`--- [TXN] Rolling back transaction... ---`),await n.cancel(),e}}:!1},adapter:y(l)};return e(s)(a)}};export{S as generateSchema,C 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 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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"}
|
|
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\n/**\n * Function type to resolve actual database field names from internal model field names.\n */\ntype GetFieldNameFn = (params: { field: string; model: string }) => string;\n\n/**\n * Converts a string or primitive value to a SurrealDB RecordId or StringRecordId.\n * Validates the table prefix against the valid tables set to prevent accidental\n * conversion of non-record strings (e.g., URLs) containing colons.\n *\n * @param value - The value to convert.\n * @param validTables - A set of valid table names in the current database.\n * @param fallbackTable - Optional table name to use if the value lacks a prefix.\n * @returns A RecordId instance or the original value.\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\" && value.length > 0) {\n const colonIndex = value.indexOf(\":\");\n\n if (colonIndex > 0) {\n const tablePrefix = value.substring(0, colonIndex);\n if (validTables.has(tablePrefix)) {\n return new RecordId(tablePrefix, value.substring(colonIndex + 1));\n }\n return value;\n }\n\n if (fallbackTable && colonIndex === -1 && validTables.has(fallbackTable)) {\n return new RecordId(fallbackTable, value);\n }\n }\n\n return value;\n}\n\n/**\n * Identifies the target model for polymorphic fields or fields where metadata info might be missing.\n * Specifically handles 'accountId' for accounts and 'clientId' for OAuth models.\n *\n * @param dbModelName - The actual database table name.\n * @param field - The internal field name.\n * @param getModelName - Resolver for database table names.\n * @param schema - The Better-Auth database schema.\n * @param data - Optional data object for context-sensitive resolution.\n * @returns The target model name or null if not resolved.\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 * Factory for creating the WHERE clause builder.\n * Handles operator mapping and automatic RecordId conversion for relational fields.\n *\n * @param getFieldName - Resolver for field names.\n * @param getFieldAttributes - Resolver for field metadata.\n * @param getModelName - Resolver for table names.\n * @param validTables - Set of valid database tables.\n * @param schema - Better-Auth DB schema.\n * @returns A function that generates a BoundQuery for WHERE clauses.\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 * Extracts field names from join configurations to build the SurrealDB FETCH clause.\n *\n * @param join - Better-Auth join configuration.\n * @param getFieldName - Resolver for field names.\n * @param model - Base model name.\n * @returns Array of field names to fetch or null.\n */\nexport const buildFetchLinks = (\n join: JoinConfig | undefined,\n getFieldName: GetFieldNameFn,\n model: string,\n): string[] | null => {\n if (!join) return null;\n\n const keys = Object.keys(join);\n const recordLinks: string[] = [];\n\n for (let i = 0; i < keys.length; i++) {\n const config = join[keys[i]];\n if (config && typeof config === \"object\" && \"on\" in config) {\n recordLinks.push(getFieldName({ model, field: config.on.from }));\n }\n }\n\n return recordLinks.length > 0 ? recordLinks : null;\n};\n\n/**\n * Converts null values to undefined within an object.\n * Required for SurrealDB MERGE operations to effectively remove fields\n * rather than storing null values.\n *\n * @param data - The object to transform.\n * @returns The transformed object with nulls replaced by undefined.\n */\nexport function mapNullToUndefined<T extends Record<string, any>>(data: T): T {\n const out = { ...data };\n const keys = Object.keys(out);\n\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n if (out[key] === null) {\n (out as any)[key] = undefined;\n }\n }\n\n return out;\n}\n\n/**\n * Internal error reporting utilities for debugging purposes.\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 * Resolves the referenced model for a specific field using explicit mappings or defaults.\n *\n * @returns The referenced model name or null.\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 return getModelName(referencedModel);\n // oxlint-disable-next-line\n } catch (error) {\n ERROR_HANDLERS.modelNotFound(referencedModel, config);\n }\n }\n\n return recordIdMap.tableSpecific[tableName]?.[fieldName] || null;\n}\n\n/**\n * Standard relational mappings used for common Better-Auth fields.\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 the Better-Auth schema to build a map of fields referencing other tables.\n * Used to automatically resolve RecordId types.\n *\n * @returns A populated RecordIdMap object.\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\n/**\n * ANSI Escape sequences for colorized console output.\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 outputs SurrealQL queries to the console with syntax highlighting.\n * Helps developers verify queries and bindings sent to SurrealDB.\n *\n * @param config - Adapter configuration containing logging flags.\n * @param method - The name of the adapter method being called.\n * @param model - The model name.\n * @param queryObj - The BoundQuery containing the SurQL string and bindings.\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/**\n * Normalizes SurrealDB results by processing the FETCH clause output.\n * Moves successfully fetched documents to their corresponding relation keys\n * and restores simple string IDs in the original foreign key fields to maintain type stability.\n * Optimized for performance by pre-calculating join meta-data.\n *\n * @param data - Single record or array of records from SurrealDB.\n * @param join - Better-Auth join configuration.\n * @param model - Internal model name.\n * @param getFieldName - Resolver for field names.\n * @returns The normalized data matching Better-Auth's relational structure.\n */\nexport const mapFetchedRelations = <T extends Record<string, any>>(\n data: T | T[] | null | undefined,\n join: JoinConfig | undefined,\n model: string,\n getFieldName: GetFieldNameFn,\n): T | T[] | null | undefined => {\n if (!data || !join) return data;\n\n const isArray = Array.isArray(data);\n const records = isArray ? (data as T[]) : [data as T];\n if (records.length === 0) return data;\n\n const joinKeys = Object.keys(join);\n const joinMeta = [];\n for (let i = 0; i < joinKeys.length; i++) {\n const relName = joinKeys[i];\n joinMeta.push({\n relName,\n relField: getFieldName({ model, field: (join[relName] as any).on.from }),\n });\n }\n\n for (let i = 0; i < records.length; i++) {\n const table = records[i];\n if (!table) continue;\n\n for (let j = 0; j < joinMeta.length; j++) {\n const { relName, relField } = joinMeta[j];\n const val = table[relField];\n\n if (\n val &&\n typeof val === \"object\" &&\n !(val instanceof RecordId) &&\n !(val instanceof StringRecordId)\n ) {\n table[relName as keyof T] = val;\n table[relField as keyof T] = (val.id?.toString() || val.id) as any;\n }\n }\n }\n\n return isArray ? records : records[0];\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 mapFetchedRelations,\n mapNullToUndefined,\n toRecordId,\n} from \"./utils\";\nimport type { SurrealDBAdapterConfig } from \"./types\";\nimport { generateSchema } from \"./schema\";\nimport type { BetterAuthOptions } from \"better-auth\";\n\n/**\n * Better-Auth adapter for SurrealDB.\n * Supports native RecordId, transactions, and fetch-based joins.\n *\n * @param db - An instance of SurrealDB client.\n * @param config - Configuration settings for the adapter.\n */\nexport const surrealdbAdapter = (db: Surreal, config?: SurrealDBAdapterConfig) => {\n let authOptions: BetterAuthOptions;\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 * Transforms data for SurrealDB by converting appropriate strings to RecordIds\n * and mapping nulls to undefined for correct 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(schema, getModelName, getFieldName);\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 function buildCreateQuery() {\n if (\n providedId &&\n providedId !== \"__surreal__\" &&\n options.advanced?.database?.generateId\n ) {\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 const surrealql = buildCreateQuery();\n surrealql.append(surql` CONTENT ${transformDataForDB(model, restData)}`);\n\n const [result] = await client.query<[any[]]>(surrealql);\n logSurrealQuery(config, \"create\", model, surrealql);\n\n return result[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 mapFetchedRelations(result?.[0], join, model, getFieldName) || 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 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, \"findMany\", model, surrealql);\n\n const [result] = await client.query<[any[]]>(surrealql);\n return mapFetchedRelations(result || [], join, model, getFieldName);\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 const 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 const 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 const 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 const 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 const 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 // Determine transaction support dynamically\n const supportsTxn = db.isFeatureSupported(Features.Transactions);\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: true,\n // @ts-expect-error\n supportsJoin: true,\n supportsDates: true,\n supportsBooleans: true,\n supportsNumericIds: true,\n customIdGenerator: config?.idGenerator ? () => \"__surreal__\" : undefined,\n\n /**\n * Transforms SurrealDB specific types back to standard JavaScript types.\n */\n customTransformOutput: ({ data }) => {\n if (data instanceof RecordId || data instanceof StringRecordId) {\n return data.toString();\n }\n if (data instanceof DateTime) {\n return data.toDate();\n }\n return data;\n },\n\n /**\n * Handles database transactions by creating a dedicated transactional adapter.\n */\n transaction: supportsTxn\n ? async (cb) => {\n if (config?.debugLogs) console.log(\"--- [TXN] Starting transaction... ---\");\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 if (config?.debugLogs) console.log(\"--- [TXN] Committing transaction... ---\");\n await txn.commit();\n return result;\n } catch (err) {\n if (config?.debugLogs) console.log(\"--- [TXN] Rolling back transaction... ---\");\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.
|
|
3
|
+
"version": "2.0.0-beta.7",
|
|
4
4
|
"author": {
|
|
5
5
|
"name": "Oskar Gmerek",
|
|
6
6
|
"url": "https://oskargmerek.com",
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
"main": "./index.mjs",
|
|
15
15
|
"module": "./index.mjs",
|
|
16
16
|
"peerDependencies": {
|
|
17
|
-
"better-auth": "^1.
|
|
17
|
+
"better-auth": "^1.5.1",
|
|
18
18
|
"surrealdb": "^2.0.0"
|
|
19
19
|
},
|
|
20
20
|
"exports": {
|