From 8f59cddf5c7590d6676604513aab35e0d4dac49b Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Mon, 5 Jan 2026 20:24:17 +0000 Subject: [PATCH 1/3] Refactor: Improve adapter config handling and update dependencies This commit refactors how FileMaker adapter configurations are accessed, making it more robust. It also updates various dependencies, including rolldown and its related packages, to their latest versions. Co-authored-by: eric.luce --- packages/better-auth/src/adapter.ts | 3 +- packages/better-auth/src/cli/index.ts | 31 ++++- packages/better-auth/src/migrate.ts | 43 +++++- pnpm-lock.yaml | 184 +++++++++++++------------- 4 files changed, 159 insertions(+), 102 deletions(-) diff --git a/packages/better-auth/src/adapter.ts b/packages/better-auth/src/adapter.ts index c4c91cb1..df20fb50 100644 --- a/packages/better-auth/src/adapter.ts +++ b/packages/better-auth/src/adapter.ts @@ -1,7 +1,6 @@ import { CleanedWhere, createAdapter, - type AdapterDebugLogs, } from "better-auth/adapters"; import { createRawFetch, type FmOdataConfig } from "./odata"; import { prettifyError, z } from "zod/v4"; @@ -25,7 +24,7 @@ interface FileMakerAdapterConfig { /** * Helps you debug issues with the adapter. */ - debugLogs?: AdapterDebugLogs; + debugLogs?: boolean | { isRunningAdapterTests?: boolean }; /** * If the table names in the schema are plural. */ diff --git a/packages/better-auth/src/cli/index.ts b/packages/better-auth/src/cli/index.ts index 8bfad9b1..36cd3e6a 100644 --- a/packages/better-auth/src/cli/index.ts +++ b/packages/better-auth/src/cli/index.ts @@ -16,6 +16,33 @@ import { AdapterOptions } from "../adapter"; import { createRawFetch } from "../odata"; import "dotenv/config"; +function getFileMakerAdapterConfigFromAdapterOptions( + options: unknown, +): AdapterOptions["config"] { + if (!options || typeof options !== "object") { + throw new Error("FileMaker adapter options were missing."); + } + + const opts = options as Record; + + // Our adapter returns: { options: { config: FileMakerAdapterConfig } } + if (opts.config && typeof opts.config === "object") { + return opts.config as AdapterOptions["config"]; + } + + // Some Better Auth versions wrap adapter options under `adapterConfig`. + if (opts.adapterConfig && typeof opts.adapterConfig === "object") { + const adapterConfig = opts.adapterConfig as Record; + if (adapterConfig.config && typeof adapterConfig.config === "object") { + return adapterConfig.config as AdapterOptions["config"]; + } + } + + throw new Error( + "Could not locate FileMaker adapter configuration from Better Auth adapter options.", + ); +} + async function main() { const program = new Command(); @@ -63,7 +90,9 @@ async function main() { const betterAuthSchema = getAuthTables(config); - const adapterConfig = (adapter.options as AdapterOptions).config; + const adapterConfig = getFileMakerAdapterConfigFromAdapterOptions( + adapter.options, + ); const { fetch } = createRawFetch({ ...adapterConfig.odata, auth: diff --git a/packages/better-auth/src/migrate.ts b/packages/better-auth/src/migrate.ts index a273d92b..f2dab828 100644 --- a/packages/better-auth/src/migrate.ts +++ b/packages/better-auth/src/migrate.ts @@ -1,9 +1,27 @@ -import { type BetterAuthDbSchema } from "better-auth/db"; import { type Metadata } from "fm-odata-client"; import chalk from "chalk"; import z from "zod/v4"; import { createRawFetch } from "./odata"; +type BetterAuthTableField = { + fieldName?: string; + type: unknown; +}; + +type BetterAuthTableDef = { + modelName: string; + fields: Record; + order?: number; +}; + +export type BetterAuthAuthTables = Record; + +function normalizeBetterAuthFieldType(fieldType: unknown): string { + if (typeof fieldType === "string") return fieldType; + if (Array.isArray(fieldType)) return fieldType.map(String).join("|"); + return String(fieldType); +} + export async function getMetadata( fetch: ReturnType["fetch"], databaseName: string, @@ -31,7 +49,7 @@ export async function getMetadata( export async function planMigration( fetch: ReturnType["fetch"], - betterAuthSchema: BetterAuthDbSchema, + betterAuthSchema: BetterAuthAuthTables, databaseName: string, ): Promise { const metadata = await getMetadata(fetch, databaseName); @@ -93,12 +111,23 @@ export async function planMigration( const fields: FmField[] = Object.entries(baTable.fields).map( ([key, field]) => ({ name: field.fieldName ?? key, + // Better Auth's FieldType can be a string literal union or arrays. + // Normalize it to a string so our FM mapping logic remains stable. + // Examples: "number", "string[]", ["string", "number"] (plugin-defined) + // See Better Auth: FieldType = "string" | "number" | ... | Array + // + // We only need coarse mapping for FileMaker field creation. + // Anything unknown falls back to "varchar". + // type: - field.type === "boolean" || field.type.includes("number") - ? "numeric" - : field.type === "date" - ? "timestamp" - : "varchar", + (() => { + const t = normalizeBetterAuthFieldType(field.type); + return t === "boolean" || t.includes("number") + ? "numeric" + : t === "date" + ? "timestamp" + : "varchar"; + })(), }), ); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d88b4e55..16cdee8b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -443,7 +443,7 @@ importers: version: 11.0.0-rc.441(@trpc/server@11.0.0-rc.441) '@trpc/next': specifier: 11.0.0-rc.441 - version: 11.0.0-rc.441(@tanstack/react-query@5.76.1(react@19.1.1))(@trpc/client@11.0.0-rc.441(@trpc/server@11.0.0-rc.441))(@trpc/react-query@11.0.0-rc.441(@tanstack/react-query@5.76.1(react@19.1.1))(@trpc/client@11.0.0-rc.441(@trpc/server@11.0.0-rc.441))(@trpc/server@11.0.0-rc.441)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@trpc/server@11.0.0-rc.441)(next@15.5.8(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 11.0.0-rc.441(@tanstack/react-query@5.76.1(react@19.1.1))(@trpc/client@11.0.0-rc.441(@trpc/server@11.0.0-rc.441))(@trpc/react-query@11.0.0-rc.441(@tanstack/react-query@5.76.1(react@19.1.1))(@trpc/client@11.0.0-rc.441(@trpc/server@11.0.0-rc.441))(@trpc/server@11.0.0-rc.441)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@trpc/server@11.0.0-rc.441)(next@15.5.8(@babel/core@7.28.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@trpc/react-query': specifier: 11.0.0-rc.441 version: 11.0.0-rc.441(@tanstack/react-query@5.76.1(react@19.1.1))(@trpc/client@11.0.0-rc.441(@trpc/server@11.0.0-rc.441))(@trpc/server@11.0.0-rc.441)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) @@ -485,10 +485,10 @@ importers: version: 3.14.1 next: specifier: ^15.5.8 - version: 15.5.8(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 15.5.8(@babel/core@7.28.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) next-auth: specifier: ^4.24.7 - version: 4.24.11(next@15.5.8(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 4.24.11(next@15.5.8(@babel/core@7.28.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1) postgres: specifier: ^3.4.4 version: 3.4.5 @@ -694,8 +694,6 @@ importers: specifier: ^4.0.7 version: 4.0.15(@types/node@22.17.1)(happy-dom@15.11.7)(jiti@1.21.7)(lightningcss@1.30.2)(msw@2.10.2(@types/node@22.17.1)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.0) - packages/tmp: {} - packages/typegen: dependencies: '@clack/prompts': @@ -2748,8 +2746,8 @@ packages: '@napi-rs/wasm-runtime@0.2.12': resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} - '@napi-rs/wasm-runtime@1.1.0': - resolution: {integrity: sha512-Fq6DJW+Bb5jaWE69/qOE0D1TUN9+6uWhCeZpdnSBk14pjLcCWR7Q8n49PTSPHazM37JqrsdpEthXy2xn6jWWiA==} + '@napi-rs/wasm-runtime@1.1.1': + resolution: {integrity: sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==} '@neon-rs/load@0.0.4': resolution: {integrity: sha512-kTPhdZyTQxB+2wpiRcFWrDcejc4JI6tkPuS7UZCG4l6Zvc5kU/gGQ/ozvHTh1XR5tS+UlfAfGuPajjzQjCiHCw==} @@ -2946,8 +2944,8 @@ packages: resolution: {integrity: sha512-Iq4RxYC7y0pA/hLgcUGpYYs5Vze4qNmJk0Qi1uIrg2bHGpm6A06nbjWcH9h4HQsddkDFFlanLj/zYBH3Sxdb4w==} engines: {node: '>= 20.0.0'} - '@oxc-project/types@0.103.0': - resolution: {integrity: sha512-bkiYX5kaXWwUessFRSoXFkGIQTmc6dLGdxuRTrC+h8PSnIdZyuXHHlLAeTmOue5Br/a0/a7dHH0Gca6eXn9MKg==} + '@oxc-project/types@0.106.0': + resolution: {integrity: sha512-QdsH3rZq480VnOHSHgPYOhjL8O8LBdcnSjM408BpPCCUc0JYYZPG9Gafl9i3OcGk/7137o+gweb4cCv3WAUykg==} '@oxc-resolver/binding-darwin-arm64@9.0.2': resolution: {integrity: sha512-MVyRgP2gzJJtAowjG/cHN3VQXwNLWnY+FpOEsyvDepJki1SdAX/8XDijM1yN6ESD1kr9uhBKjGelC6h3qtT+rA==} @@ -3873,79 +3871,79 @@ packages: peerDependencies: react: '>=18.2.0' - '@rolldown/binding-android-arm64@1.0.0-beta.56': - resolution: {integrity: sha512-GFsly+vPnl1Sa61sC2LwK4Hrz48W+YBqBmLSxBEj9IJW6nHNsWof1wwh1gwnxMIm/yN5F9M0B/cRAwn6rTINyg==} + '@rolldown/binding-android-arm64@1.0.0-beta.58': + resolution: {integrity: sha512-mWj5eE4Qc8TbPdGGaaLvBb9XfDPvE1EmZkJQgiGKwchkWH4oAJcRAKMTw7ZHnb1L+t7Ah41sBkAecaIsuUgsug==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@rolldown/binding-darwin-arm64@1.0.0-beta.56': - resolution: {integrity: sha512-8fSkk5g5MVZpddrH8hOyc9O5t5Dqv2Vi3Qe628xe+2zJedJxucUc5DX/KY1OVBRp8XY09LJO+J1V56LsxeBVPA==} + '@rolldown/binding-darwin-arm64@1.0.0-beta.58': + resolution: {integrity: sha512-wFxUymI/5R8bH8qZFYDfAxAN9CyISEIYke+95oZPiv6EWo88aa5rskjVcCpKA532R+klFmdqjbbaD56GNmTF4Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-x64@1.0.0-beta.56': - resolution: {integrity: sha512-R+Q5zd763MKvgYSkBfr2gr/3nZQENaK88qEqfRUUYrpq/W0okOpbOJaxn5FDIIS+yq3cjyktYm115I5RiI6G5A==} + '@rolldown/binding-darwin-x64@1.0.0-beta.58': + resolution: {integrity: sha512-ybp3MkPj23VDV9PhtRwdU5qrGhlViWRV5BjKwO6epaSlUD5lW0WyY+roN3ZAzbma/9RrMTgZ/a/gtQq8YXOcqw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@rolldown/binding-freebsd-x64@1.0.0-beta.56': - resolution: {integrity: sha512-YEsv0rfJoHHRNaVx6AfW/o4bmwTY7BJnSQ45rRCyU6DWEgvFZMojh6qzMQmW5ZVdcikE3cU1ZnrQQ2yem9H9Yg==} + '@rolldown/binding-freebsd-x64@1.0.0-beta.58': + resolution: {integrity: sha512-Evxj3yh7FWvyklUYZa0qTVT9N2zX9TPDqGF056hl8hlCZ9/ndQ2xMv6uw9PD1VlLpukbsqL+/C6M0qwipL0QMg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.56': - resolution: {integrity: sha512-mpaV+NCKcHUOkcAThvz1KiXcNshLQRSBLNNKqum2dG7oLZKk+z+02Fxa8BSuFFqq/rmmO6Fq2TPAdZUgOrwiqw==} + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.58': + resolution: {integrity: sha512-tYeXprDOrEgVHUbPXH6MPso4cM/c6RTkmJNICMQlYdki4hGMh92aj3yU6CKs+4X5gfG0yj5kVUw/L4M685SYag==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.56': - resolution: {integrity: sha512-wj1uQRN4GEhYw5cs0dobGzZg3oKMLuQ3hY3fW7cLzvlwi9XRdzW7NmU58e6YUp6boOQLarSxdmAaqCMgaMZfcQ==} + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.58': + resolution: {integrity: sha512-N78vmZzP6zG967Ohr+MasCjmKtis0geZ1SOVmxrA0/bklTQSzH5kHEjW5Qn+i1taFno6GEre1E40v0wuWsNOQw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - '@rolldown/binding-linux-arm64-musl@1.0.0-beta.56': - resolution: {integrity: sha512-Z2PWbAHjW2EUflb1/tPvouMqppwWF5Va1Y9b4GQpO6QlpGK0Wqmn90GO2VKiheDh/gSZlsxZ7uOZoXh2y8R7Kg==} + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.58': + resolution: {integrity: sha512-l+p4QVtG72C7wI2SIkNQw/KQtSjuYwS3rV6AKcWrRBF62ClsFUcif5vLaZIEbPrCXu5OFRXigXFJnxYsVVZqdQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - '@rolldown/binding-linux-x64-gnu@1.0.0-beta.56': - resolution: {integrity: sha512-Z/uv04/Tsf7oqhwjPUiDiSildhWmCpsklA0e5PEB+0eGGmm07B+M2SmqRe9Fd0ypfU2TPGhq+Hn7RVUGIfSMxg==} + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.58': + resolution: {integrity: sha512-urzJX0HrXxIh0FfxwWRjfPCMeInU9qsImLQxHBgLp5ivji1EEUnOfux8KxPPnRQthJyneBrN2LeqUix9DYrNaQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] - '@rolldown/binding-linux-x64-musl@1.0.0-beta.56': - resolution: {integrity: sha512-u+yP0Pt9ar3PkLGGiyGmQKVj9j20X0E831DY0OVmbKYHAAbTyLKYx+UIIorCm+SQnhGKfkD+0pmwfTc2t2Vt/g==} + '@rolldown/binding-linux-x64-musl@1.0.0-beta.58': + resolution: {integrity: sha512-7ijfVK3GISnXIwq/1FZo+KyAUJjL3kWPJ7rViAL6MWeEBhEgRzJ0yEd9I8N9aut8Y8ab+EKFJyRNMWZuUBwQ0A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] - '@rolldown/binding-openharmony-arm64@1.0.0-beta.56': - resolution: {integrity: sha512-Kuc6r5Uya+KxdJ7MUSok3K8zta/1bcsaSNxTvYujm2mWYuffadqgkkR3d0UCRbbCH5klZ+7VG6DR3VtPRlCntw==} + '@rolldown/binding-openharmony-arm64@1.0.0-beta.58': + resolution: {integrity: sha512-/m7sKZCS+cUULbzyJTIlv8JbjNohxbpAOA6cM+lgWgqVzPee3U6jpwydrib328JFN/gF9A99IZEnuGYqEDJdww==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@rolldown/binding-wasm32-wasi@1.0.0-beta.56': - resolution: {integrity: sha512-pejT5oLj8xlfn8tjC3bJKeuAsk/un6GKwjbsBQG0AchefdaHf2+S4QRn8XfEMB1l1ZTbe5yEiiV92mr7Jdjaeg==} + '@rolldown/binding-wasm32-wasi@1.0.0-beta.58': + resolution: {integrity: sha512-6SZk7zMgv+y3wFFQ9qE5P9NnRHcRsptL1ypmudD26PDY+PvFCvfHRkJNfclWnvacVGxjowr7JOL3a9fd1wWhUw==} engines: {node: '>=14.0.0'} cpu: [wasm32] - '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.56': - resolution: {integrity: sha512-1NKkRLQR2ghmHMd+14nm1noOhoLei62pkdGlf1g4F+9lfFws66+9LBnP6Z+E+KK8Do9hzQ6FFRwtkC3EADAeyA==} + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.58': + resolution: {integrity: sha512-sFqfYPnBZ6xBhMkadB7UD0yjEDRvs7ipR3nCggblN+N4ODCXY6qhg/bKL39+W+dgQybL7ErD4EGERVbW9DAWvg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.0.0-beta.56': - resolution: {integrity: sha512-BC3mObCr7/O+1jMJ/Hm3INikBk5D25RTxCha10Rq8b1gHlBfb9eA460+7xQfc8FxUsMCUgHtvrK3Vs5izgwBOQ==} + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.58': + resolution: {integrity: sha512-AnFWJdAqB8+IDPcGrATYs67Kik/6tnndNJV2jGRmwlbeNiQQ8GhRJU8ETRlINfII0pqi9k4WWLnb00p1QCxw/Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] @@ -3953,8 +3951,8 @@ packages: '@rolldown/pluginutils@1.0.0-beta.27': resolution: {integrity: sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==} - '@rolldown/pluginutils@1.0.0-beta.56': - resolution: {integrity: sha512-cw9jwAgCs024Nic4OB8PeFDLBHLD1Athcv3bRvyYATIVD9B/gL5X5cJkezT94Y7m7Dk9HXaUMcvb7ypvSX46sA==} + '@rolldown/pluginutils@1.0.0-beta.58': + resolution: {integrity: sha512-qWhDs6yFGR5xDfdrwiSa3CWGIHxD597uGE/A9xGqytBjANvh4rLCTTkq7szhMV4+Ygh+PMS90KVJ8xWG/TkX4w==} '@rollup/plugin-replace@6.0.3': resolution: {integrity: sha512-J4RZarRvQAm5IF0/LwUUg+obsm+xZhYnbMXmXROyoSE1ATJe3oXSb9L5MMppdxP2ylNSjv6zFBwKYjcKMucVfA==} @@ -8759,8 +8757,8 @@ packages: vue-tsc: optional: true - rolldown@1.0.0-beta.56: - resolution: {integrity: sha512-9MHiUvRH2R8rb6ad6EaLxahS3RbQKdMMlrh9XKmbz2HiCGfK4IWKSNv4N6GhYr+7kHExg6oIc5EF1xA3iR4x1A==} + rolldown@1.0.0-beta.58: + resolution: {integrity: sha512-v1FCjMZCan7f+xGAHBi+mqiE4MlH7I+SXEHSQSJoMOGNNB2UYtvMiejsq9YuUOiZjNeUeV/a21nSFbrUR+4ZCQ==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true @@ -11816,7 +11814,7 @@ snapshots: '@tybys/wasm-util': 0.10.1 optional: true - '@napi-rs/wasm-runtime@1.1.0': + '@napi-rs/wasm-runtime@1.1.1': dependencies: '@emnapi/core': 1.7.1 '@emnapi/runtime': 1.7.1 @@ -11936,7 +11934,7 @@ snapshots: '@orama/orama@3.1.14': {} - '@oxc-project/types@0.103.0': {} + '@oxc-project/types@0.106.0': {} '@oxc-resolver/binding-darwin-arm64@9.0.2': optional: true @@ -13217,50 +13215,50 @@ snapshots: dependencies: react: 19.2.3 - '@rolldown/binding-android-arm64@1.0.0-beta.56': + '@rolldown/binding-android-arm64@1.0.0-beta.58': optional: true - '@rolldown/binding-darwin-arm64@1.0.0-beta.56': + '@rolldown/binding-darwin-arm64@1.0.0-beta.58': optional: true - '@rolldown/binding-darwin-x64@1.0.0-beta.56': + '@rolldown/binding-darwin-x64@1.0.0-beta.58': optional: true - '@rolldown/binding-freebsd-x64@1.0.0-beta.56': + '@rolldown/binding-freebsd-x64@1.0.0-beta.58': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.56': + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.58': optional: true - '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.56': + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.58': optional: true - '@rolldown/binding-linux-arm64-musl@1.0.0-beta.56': + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.58': optional: true - '@rolldown/binding-linux-x64-gnu@1.0.0-beta.56': + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.58': optional: true - '@rolldown/binding-linux-x64-musl@1.0.0-beta.56': + '@rolldown/binding-linux-x64-musl@1.0.0-beta.58': optional: true - '@rolldown/binding-openharmony-arm64@1.0.0-beta.56': + '@rolldown/binding-openharmony-arm64@1.0.0-beta.58': optional: true - '@rolldown/binding-wasm32-wasi@1.0.0-beta.56': + '@rolldown/binding-wasm32-wasi@1.0.0-beta.58': dependencies: - '@napi-rs/wasm-runtime': 1.1.0 + '@napi-rs/wasm-runtime': 1.1.1 optional: true - '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.56': + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.58': optional: true - '@rolldown/binding-win32-x64-msvc@1.0.0-beta.56': + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.58': optional: true '@rolldown/pluginutils@1.0.0-beta.27': {} - '@rolldown/pluginutils@1.0.0-beta.56': {} + '@rolldown/pluginutils@1.0.0-beta.58': {} '@rollup/plugin-replace@6.0.3(rollup@4.40.2)': dependencies: @@ -13726,11 +13724,11 @@ snapshots: dependencies: '@trpc/server': 11.0.0-rc.441 - '@trpc/next@11.0.0-rc.441(@tanstack/react-query@5.76.1(react@19.1.1))(@trpc/client@11.0.0-rc.441(@trpc/server@11.0.0-rc.441))(@trpc/react-query@11.0.0-rc.441(@tanstack/react-query@5.76.1(react@19.1.1))(@trpc/client@11.0.0-rc.441(@trpc/server@11.0.0-rc.441))(@trpc/server@11.0.0-rc.441)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@trpc/server@11.0.0-rc.441)(next@15.5.8(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@trpc/next@11.0.0-rc.441(@tanstack/react-query@5.76.1(react@19.1.1))(@trpc/client@11.0.0-rc.441(@trpc/server@11.0.0-rc.441))(@trpc/react-query@11.0.0-rc.441(@tanstack/react-query@5.76.1(react@19.1.1))(@trpc/client@11.0.0-rc.441(@trpc/server@11.0.0-rc.441))(@trpc/server@11.0.0-rc.441)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@trpc/server@11.0.0-rc.441)(next@15.5.8(@babel/core@7.28.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@trpc/client': 11.0.0-rc.441(@trpc/server@11.0.0-rc.441) '@trpc/server': 11.0.0-rc.441 - next: 15.5.8(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + next: 15.5.8(@babel/core@7.28.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) optionalDependencies: @@ -15535,7 +15533,7 @@ snapshots: '@next/eslint-plugin-next': 16.1.0 eslint: 9.27.0(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.50.0(eslint@9.27.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.27.0(jiti@2.6.1)))(eslint@9.27.0(jiti@2.6.1)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.27.0(jiti@2.6.1)) eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.50.0(eslint@9.27.0(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.27.0(jiti@2.6.1)) eslint-plugin-jsx-a11y: 6.10.2(eslint@9.27.0(jiti@2.6.1)) eslint-plugin-react: 7.37.5(eslint@9.27.0(jiti@2.6.1)) @@ -15558,7 +15556,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.50.0(eslint@9.27.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.27.0(jiti@2.6.1)))(eslint@9.27.0(jiti@2.6.1)): + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.27.0(jiti@2.6.1)): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.1(supports-color@5.5.0) @@ -15573,14 +15571,14 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.50.0(eslint@9.27.0(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.50.0(eslint@9.27.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.27.0(jiti@2.6.1)))(eslint@9.27.0(jiti@2.6.1)))(eslint@9.27.0(jiti@2.6.1)): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.50.0(eslint@9.27.0(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.27.0(jiti@2.6.1)): dependencies: debug: 3.2.7 optionalDependencies: '@typescript-eslint/parser': 8.50.0(eslint@9.27.0(jiti@2.6.1))(typescript@5.9.3) eslint: 9.27.0(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.50.0(eslint@9.27.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.27.0(jiti@2.6.1)))(eslint@9.27.0(jiti@2.6.1)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.27.0(jiti@2.6.1)) transitivePeerDependencies: - supports-color @@ -15595,7 +15593,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.27.0(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.50.0(eslint@9.27.0(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.50.0(eslint@9.27.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.27.0(jiti@2.6.1)))(eslint@9.27.0(jiti@2.6.1)))(eslint@9.27.0(jiti@2.6.1)) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.50.0(eslint@9.27.0(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.27.0(jiti@2.6.1)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -17808,13 +17806,13 @@ snapshots: optionalDependencies: '@rollup/rollup-linux-x64-gnu': 4.40.2 - next-auth@4.24.11(next@15.5.8(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + next-auth@4.24.11(next@15.5.8(@babel/core@7.28.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1): dependencies: '@babel/runtime': 7.27.1 '@panva/hkdf': 1.2.1 cookie: 0.7.2 jose: 4.15.9 - next: 15.5.8(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + next: 15.5.8(@babel/core@7.28.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) oauth: 0.9.15 openid-client: 5.7.1 preact: 10.26.6 @@ -17830,7 +17828,7 @@ snapshots: next-tick@1.1.0: {} - next@15.5.8(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + next@15.5.8(@babel/core@7.28.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1): dependencies: '@next/env': 15.5.8 '@swc/helpers': 0.5.15 @@ -17838,7 +17836,7 @@ snapshots: postcss: 8.4.31 react: 19.1.1 react-dom: 19.1.1(react@19.1.1) - styled-jsx: 5.1.6(react@19.1.1) + styled-jsx: 5.1.6(@babel/core@7.28.5)(react@19.1.1) optionalDependencies: '@next/swc-darwin-arm64': 15.5.7 '@next/swc-darwin-x64': 15.5.7 @@ -18775,7 +18773,7 @@ snapshots: reusify@1.1.0: {} - rolldown-plugin-dts@0.15.10(rolldown@1.0.0-beta.56)(typescript@5.9.3): + rolldown-plugin-dts@0.15.10(rolldown@1.0.0-beta.58)(typescript@5.9.3): dependencies: '@babel/generator': 7.28.5 '@babel/parser': 7.28.5 @@ -18785,14 +18783,14 @@ snapshots: debug: 4.4.1(supports-color@5.5.0) dts-resolver: 2.1.3 get-tsconfig: 4.13.0 - rolldown: 1.0.0-beta.56 + rolldown: 1.0.0-beta.58 optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - oxc-resolver - supports-color - rolldown-plugin-dts@0.15.6(rolldown@1.0.0-beta.56)(typescript@5.9.3): + rolldown-plugin-dts@0.15.6(rolldown@1.0.0-beta.58)(typescript@5.9.3): dependencies: '@babel/generator': 7.28.3 '@babel/parser': 7.28.3 @@ -18802,31 +18800,31 @@ snapshots: debug: 4.4.1(supports-color@5.5.0) dts-resolver: 2.1.1 get-tsconfig: 4.13.0 - rolldown: 1.0.0-beta.56 + rolldown: 1.0.0-beta.58 optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - oxc-resolver - supports-color - rolldown@1.0.0-beta.56: + rolldown@1.0.0-beta.58: dependencies: - '@oxc-project/types': 0.103.0 - '@rolldown/pluginutils': 1.0.0-beta.56 + '@oxc-project/types': 0.106.0 + '@rolldown/pluginutils': 1.0.0-beta.58 optionalDependencies: - '@rolldown/binding-android-arm64': 1.0.0-beta.56 - '@rolldown/binding-darwin-arm64': 1.0.0-beta.56 - '@rolldown/binding-darwin-x64': 1.0.0-beta.56 - '@rolldown/binding-freebsd-x64': 1.0.0-beta.56 - '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.56 - '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.56 - '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.56 - '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.56 - '@rolldown/binding-linux-x64-musl': 1.0.0-beta.56 - '@rolldown/binding-openharmony-arm64': 1.0.0-beta.56 - '@rolldown/binding-wasm32-wasi': 1.0.0-beta.56 - '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.56 - '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.56 + '@rolldown/binding-android-arm64': 1.0.0-beta.58 + '@rolldown/binding-darwin-arm64': 1.0.0-beta.58 + '@rolldown/binding-darwin-x64': 1.0.0-beta.58 + '@rolldown/binding-freebsd-x64': 1.0.0-beta.58 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.58 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.58 + '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.58 + '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.58 + '@rolldown/binding-linux-x64-musl': 1.0.0-beta.58 + '@rolldown/binding-openharmony-arm64': 1.0.0-beta.58 + '@rolldown/binding-wasm32-wasi': 1.0.0-beta.58 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.58 + '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.58 rollup-plugin-preserve-directives@0.4.0(rollup@4.40.2): dependencies: @@ -19369,10 +19367,12 @@ snapshots: optionalDependencies: '@babel/core': 7.27.7 - styled-jsx@5.1.6(react@19.1.1): + styled-jsx@5.1.6(@babel/core@7.28.5)(react@19.1.1): dependencies: client-only: 0.0.1 react: 19.1.1 + optionalDependencies: + '@babel/core': 7.28.5 superjson@2.2.2: dependencies: @@ -19577,8 +19577,8 @@ snapshots: diff: 8.0.2 empathic: 2.0.0 hookable: 5.5.3 - rolldown: 1.0.0-beta.56 - rolldown-plugin-dts: 0.15.6(rolldown@1.0.0-beta.56)(typescript@5.9.3) + rolldown: 1.0.0-beta.58 + rolldown-plugin-dts: 0.15.6(rolldown@1.0.0-beta.58)(typescript@5.9.3) semver: 7.7.2 tinyexec: 1.0.1 tinyglobby: 0.2.14 @@ -19602,8 +19602,8 @@ snapshots: diff: 8.0.2 empathic: 2.0.0 hookable: 5.5.3 - rolldown: 1.0.0-beta.56 - rolldown-plugin-dts: 0.15.10(rolldown@1.0.0-beta.56)(typescript@5.9.3) + rolldown: 1.0.0-beta.58 + rolldown-plugin-dts: 0.15.10(rolldown@1.0.0-beta.58)(typescript@5.9.3) semver: 7.7.2 tinyexec: 1.0.1 tinyglobby: 0.2.14 From 80012496d01641aa8825bf2b86a98b81a0509517 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Mon, 5 Jan 2026 20:36:11 +0000 Subject: [PATCH 2/3] Fix: Improve adapter/migration type resilience Co-authored-by: eric.luce --- .changeset/better-auth-type-errors.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .changeset/better-auth-type-errors.md diff --git a/.changeset/better-auth-type-errors.md b/.changeset/better-auth-type-errors.md new file mode 100644 index 00000000..b78724b0 --- /dev/null +++ b/.changeset/better-auth-type-errors.md @@ -0,0 +1,6 @@ +--- +"@proofkit/better-auth": patch +--- + +Fix TypeScript build errors by making adapter/migration types resilient to upstream Better Auth changes. + From c79a5de46a27b7fe4cfe702105dd4bb108db0457 Mon Sep 17 00:00:00 2001 From: Eric Luce <37158449+eluce2@users.noreply.github.com> Date: Mon, 12 Jan 2026 09:52:14 -0600 Subject: [PATCH 3/3] fix: use includes() for all type checks in migrate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Handles array types like ["boolean", "null"] → "boolean|null" Co-Authored-By: Claude Opus 4.5 --- packages/better-auth/src/migrate.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/better-auth/src/migrate.ts b/packages/better-auth/src/migrate.ts index 5f75179e..3e712675 100644 --- a/packages/better-auth/src/migrate.ts +++ b/packages/better-auth/src/migrate.ts @@ -113,9 +113,10 @@ export async function planMigration( const fields: FmField[] = Object.entries(baTable.fields).map(([key, field]) => { // Better Auth's FieldType can be a string literal union or arrays. // Normalize it to a string so our FM mapping logic remains stable. + // Use .includes() for all checks to handle array types like ["boolean", "null"] → "boolean|null" const t = normalizeBetterAuthFieldType(field.type); const type: "varchar" | "numeric" | "timestamp" = - t === "boolean" || t.includes("number") ? "numeric" : t === "date" ? "timestamp" : "varchar"; + t.includes("boolean") || t.includes("number") ? "numeric" : t.includes("date") ? "timestamp" : "varchar"; return { name: field.fieldName ?? key, type,