{"version":3,"file":"index.mjs","names":["aliases: Record","tsConfigPath: string","text","result: Record","configFile: BetterAuthOptions | null","resolvedPath: string","spinner","confirm","fs","getPackageManager","frameworks: Record","databases: Record","result: any","new_content: string","format","required_envs: string[]","required_deps: string[]","database_code_str: string","start_of_betterauth","new_user_config: string","total_dependencies: string[]","total_envs: string[]","imports: {\n\t\t\tpath: string;\n\t\t\tvariables: {\n\t\t\t\tasType: boolean;\n\t\t\t\tname: string;\n\t\t\t}[];\n\t\t}[]","error: any","quoteChar: string | null","installCommand: string","prettierFormat","result: Import[]","packageManagerPreference: \"bun\" | \"pnpm\" | \"yarn\" | \"npm\" | undefined","config_path: string","framework: SupportedFrameworks","format","packageInfo: Record","targetEnvFile: string","tsconfigInfo: Record","fs","latest_betterauth_version: string","error: any","s","appName: string","possiblePaths","database: SupportedDatabases | null","add_plugins: SupportedPlugin[]","authClientConfigPath: string | null","contents","envs: string[]","packageManagerOptions: {\n\t\tvalue: \"bun\" | \"pnpm\" | \"yarn\" | \"npm\";\n\t\tlabel?: string;\n\t\thint?: string;\n\t}[]","previouslyGeneratedSecret: string | null","spinner","fs","os","openCommand: string","path","existingConfig: {\n\t\t\tmcp?: Record;\n\t\t\t[key: string]: unknown;\n\t\t}","fs","spinner","migrate","packageInfo: Record"],"sources":["../src/utils/add-cloudflare-modules.ts","../src/utils/add-svelte-kit-env-modules.ts","../src/utils/get-tsconfig-info.ts","../src/utils/get-config.ts","../src/commands/generate.ts","../src/commands/info.ts","../src/generators/auth-config.ts","../src/utils/check-package-managers.ts","../src/utils/format-ms.ts","../src/utils/install-dependencies.ts","../src/commands/secret.ts","../src/commands/init.ts","../src/commands/login.ts","../src/commands/mcp.ts","../src/commands/migrate.ts","../src/index.ts"],"sourcesContent":["const createModule = () => {\n\tconst moduleSource = `\nconst createStub = (label) => {\n const handler = {\n get(_, prop) {\n if (prop === \"toString\") return () => label;\n if (prop === \"valueOf\") return () => label;\n if (prop === Symbol.toPrimitive) return () => label;\n if (prop === Symbol.toStringTag) return \"Object\";\n if (prop === \"then\") return undefined;\n return createStub(label + \".\" + String(prop));\n },\n apply(_, __, args) {\n return createStub(label + \"()\")\n },\n construct() {\n return createStub(label + \"#instance\");\n },\n };\n const fn = () => createStub(label + \"()\");\n return new Proxy(fn, handler);\n};\n\nclass WorkerEntrypoint {\n constructor(ctx, env) {\n this.ctx = ctx;\n this.env = env;\n }\n}\n\nclass DurableObject {\n constructor(state, env) {\n this.state = state;\n this.env = env;\n }\n}\n\nclass RpcTarget {\n constructor(value) {\n this.value = value;\n }\n}\n\nconst RpcStub = RpcTarget;\n\nconst env = createStub(\"env\");\nconst caches = createStub(\"caches\");\nconst scheduler = createStub(\"scheduler\");\nconst executionCtx = createStub(\"executionCtx\");\n\nexport { DurableObject, RpcStub, RpcTarget, WorkerEntrypoint, caches, env, executionCtx, scheduler };\n\nconst defaultExport = {\n DurableObject,\n RpcStub,\n RpcTarget,\n WorkerEntrypoint,\n caches,\n env,\n executionCtx,\n scheduler,\n};\n\nexport default defaultExport;\n// jiti dirty hack: .unknown\n`;\n\n\treturn `data:text/javascript;charset=utf-8,${encodeURIComponent(moduleSource)}`;\n};\n\nconst CLOUDFLARE_STUB_MODULE = createModule();\n\nexport function addCloudflareModules(\n\taliases: Record,\n\t_cwd?: string,\n) {\n\tif (!aliases[\"cloudflare:workers\"]) {\n\t\taliases[\"cloudflare:workers\"] = CLOUDFLARE_STUB_MODULE;\n\t}\n\tif (!aliases[\"cloudflare:test\"]) {\n\t\taliases[\"cloudflare:test\"] = CLOUDFLARE_STUB_MODULE;\n\t}\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\n\n/**\n * Adds SvelteKit environment modules and path aliases\n * @param aliases - The aliases object to populate\n * @param cwd - Current working directory (optional, defaults to process.cwd())\n */\nexport function addSvelteKitEnvModules(\n\taliases: Record,\n\tcwd?: string,\n) {\n\tconst workingDir = cwd || process.cwd();\n\n\t// Add SvelteKit environment modules\n\taliases[\"$env/dynamic/private\"] = createDataUriModule(\n\t\tcreateDynamicEnvModule(),\n\t);\n\taliases[\"$env/dynamic/public\"] = createDataUriModule(\n\t\tcreateDynamicEnvModule(),\n\t);\n\taliases[\"$env/static/private\"] = createDataUriModule(\n\t\tcreateStaticEnvModule(filterPrivateEnv(\"PUBLIC_\", \"\")),\n\t);\n\taliases[\"$env/static/public\"] = createDataUriModule(\n\t\tcreateStaticEnvModule(filterPublicEnv(\"PUBLIC_\", \"\")),\n\t);\n\n\tconst svelteKitAliases = getSvelteKitPathAliases(workingDir);\n\tObject.assign(aliases, svelteKitAliases);\n}\n\nfunction getSvelteKitPathAliases(cwd: string): Record {\n\tconst aliases: Record = {};\n\n\tconst packageJsonPath = path.join(cwd, \"package.json\");\n\tconst svelteConfigPath = path.join(cwd, \"svelte.config.js\");\n\tconst svelteConfigTsPath = path.join(cwd, \"svelte.config.ts\");\n\n\tlet isSvelteKitProject = false;\n\n\tif (fs.existsSync(packageJsonPath)) {\n\t\ttry {\n\t\t\tconst packageJson = JSON.parse(fs.readFileSync(packageJsonPath, \"utf-8\"));\n\t\t\tconst deps = {\n\t\t\t\t...packageJson.dependencies,\n\t\t\t\t...packageJson.devDependencies,\n\t\t\t};\n\t\t\tisSvelteKitProject = !!deps[\"@sveltejs/kit\"];\n\t\t} catch {\n\t\t\t// Ignore JSON parse errors\n\t\t}\n\t}\n\n\tif (!isSvelteKitProject) {\n\t\tisSvelteKitProject =\n\t\t\tfs.existsSync(svelteConfigPath) || fs.existsSync(svelteConfigTsPath);\n\t}\n\n\tif (!isSvelteKitProject) {\n\t\treturn aliases;\n\t}\n\n\tconst libPaths = [path.join(cwd, \"src\", \"lib\"), path.join(cwd, \"lib\")];\n\n\tfor (const libPath of libPaths) {\n\t\tif (fs.existsSync(libPath)) {\n\t\t\taliases[\"$lib\"] = libPath;\n\t\t\t// handles a common subpaths\n\t\t\tconst commonSubPaths = [\"server\", \"utils\", \"components\", \"stores\"];\n\t\t\tfor (const subPath of commonSubPaths) {\n\t\t\t\tconst subDir = path.join(libPath, subPath);\n\t\t\t\tif (fs.existsSync(subDir)) {\n\t\t\t\t\taliases[`$lib/${subPath}`] = subDir;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t}\n\t// Add simple stub for $app/server to prevent CLI errors\n\taliases[\"$app/server\"] = createDataUriModule(createAppServerModule());\n\n\tconst customAliases = getSvelteConfigAliases(cwd);\n\tObject.assign(aliases, customAliases);\n\n\treturn aliases;\n}\n// for custom aliases in svelte.config.js/ts\nfunction getSvelteConfigAliases(cwd: string): Record {\n\tconst aliases: Record = {};\n\tconst configPaths = [\n\t\tpath.join(cwd, \"svelte.config.js\"),\n\t\tpath.join(cwd, \"svelte.config.ts\"),\n\t];\n\n\tfor (const configPath of configPaths) {\n\t\tif (fs.existsSync(configPath)) {\n\t\t\ttry {\n\t\t\t\tconst content = fs.readFileSync(configPath, \"utf-8\");\n\t\t\t\tconst aliasMatch = content.match(/alias\\s*:\\s*\\{([^}]+)\\}/);\n\t\t\t\tif (aliasMatch && aliasMatch[1]) {\n\t\t\t\t\tconst aliasContent = aliasMatch[1];\n\t\t\t\t\tconst aliasMatches = aliasContent.matchAll(\n\t\t\t\t\t\t/['\"`](\\$[^'\"`]+)['\"`]\\s*:\\s*['\"`]([^'\"`]+)['\"`]/g,\n\t\t\t\t\t);\n\n\t\t\t\t\tfor (const match of aliasMatches) {\n\t\t\t\t\t\tconst [, alias, target] = match;\n\t\t\t\t\t\tif (alias && target) {\n\t\t\t\t\t\t\taliases[alias + \"/*\"] = path.resolve(cwd, target) + \"/*\";\n\t\t\t\t\t\t\taliases[alias] = path.resolve(cwd, target);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// Ignore file reading/parsing errors\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn aliases;\n}\n\nfunction createAppServerModule(): string {\n\treturn `\n// $app/server stub for CLI compatibility\nexport default {};\n// jiti dirty hack: .unknown\n`;\n}\n\nfunction createDataUriModule(module: string) {\n\treturn `data:text/javascript;charset=utf-8,${encodeURIComponent(module)}`;\n}\n\nfunction createStaticEnvModule(env: Record) {\n\tconst declarations = Object.keys(env)\n\t\t.filter((k) => validIdentifier.test(k) && !reserved.has(k))\n\t\t.map((k) => `export const ${k} = ${JSON.stringify(env[k])};`);\n\n\treturn `\n ${declarations.join(\"\\n\")}\n // jiti dirty hack: .unknown\n `;\n}\n\nfunction createDynamicEnvModule() {\n\treturn `\n export const env = process.env;\n // jiti dirty hack: .unknown\n `;\n}\n\nfunction filterPrivateEnv(publicPrefix: string, privatePrefix: string) {\n\treturn Object.fromEntries(\n\t\tObject.entries(process.env).filter(\n\t\t\t([k]) =>\n\t\t\t\tk.startsWith(privatePrefix) &&\n\t\t\t\t(publicPrefix === \"\" || !k.startsWith(publicPrefix)),\n\t\t),\n\t) as Record;\n}\n\nfunction filterPublicEnv(publicPrefix: string, privatePrefix: string) {\n\treturn Object.fromEntries(\n\t\tObject.entries(process.env).filter(\n\t\t\t([k]) =>\n\t\t\t\tk.startsWith(publicPrefix) &&\n\t\t\t\t(privatePrefix === \"\" || !k.startsWith(privatePrefix)),\n\t\t),\n\t) as Record;\n}\n\nconst validIdentifier = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/;\nconst reserved = new Set([\n\t\"do\",\n\t\"if\",\n\t\"in\",\n\t\"for\",\n\t\"let\",\n\t\"new\",\n\t\"try\",\n\t\"var\",\n\t\"case\",\n\t\"else\",\n\t\"enum\",\n\t\"eval\",\n\t\"null\",\n\t\"this\",\n\t\"true\",\n\t\"void\",\n\t\"with\",\n\t\"await\",\n\t\"break\",\n\t\"catch\",\n\t\"class\",\n\t\"const\",\n\t\"false\",\n\t\"super\",\n\t\"throw\",\n\t\"while\",\n\t\"yield\",\n\t\"delete\",\n\t\"export\",\n\t\"import\",\n\t\"public\",\n\t\"return\",\n\t\"static\",\n\t\"switch\",\n\t\"typeof\",\n\t\"default\",\n\t\"extends\",\n\t\"finally\",\n\t\"package\",\n\t\"private\",\n\t\"continue\",\n\t\"debugger\",\n\t\"function\",\n\t\"arguments\",\n\t\"interface\",\n\t\"protected\",\n\t\"implements\",\n\t\"instanceof\",\n]);\n","import fs from \"node:fs\";\nimport path from \"node:path\";\n\nfunction stripJsonComments(jsonString: string): string {\n\treturn jsonString\n\t\t.replace(/\\\\\"|\"(?:\\\\\"|[^\"])*\"|(\\/\\/.*|\\/\\*[\\s\\S]*?\\*\\/)/g, (m, g) =>\n\t\t\tg ? \"\" : m,\n\t\t)\n\t\t.replace(/,(?=\\s*[}\\]])/g, \"\");\n}\n\nexport function getTsconfigInfo(cwd?: string, flatPath?: string) {\n\tlet tsConfigPath: string;\n\tif (flatPath) {\n\t\ttsConfigPath = flatPath;\n\t} else {\n\t\ttsConfigPath = cwd\n\t\t\t? path.join(cwd, \"tsconfig.json\")\n\t\t\t: path.join(\"tsconfig.json\");\n\t}\n\ttry {\n\t\tconst text = fs.readFileSync(tsConfigPath, \"utf-8\");\n\t\treturn JSON.parse(stripJsonComments(text));\n\t} catch (error) {\n\t\tthrow error;\n\t}\n}\n","import fs, { existsSync } from \"node:fs\";\nimport path from \"node:path\";\n// @ts-expect-error\nimport babelPresetReact from \"@babel/preset-react\";\n// @ts-expect-error\nimport babelPresetTypeScript from \"@babel/preset-typescript\";\nimport type { BetterAuthOptions } from \"@better-auth/core\";\nimport { BetterAuthError } from \"@better-auth/core/error\";\nimport { loadConfig } from \"c12\";\nimport type { JitiOptions } from \"jiti\";\nimport { addCloudflareModules } from \"./add-cloudflare-modules\";\nimport { addSvelteKitEnvModules } from \"./add-svelte-kit-env-modules\";\nimport { getTsconfigInfo } from \"./get-tsconfig-info\";\n\nlet possiblePaths = [\n\t\"auth.ts\",\n\t\"auth.tsx\",\n\t\"auth.js\",\n\t\"auth.jsx\",\n\t\"auth.server.js\",\n\t\"auth.server.ts\",\n\t\"auth/index.ts\",\n\t\"auth/index.tsx\",\n\t\"auth/index.js\",\n\t\"auth/index.jsx\",\n\t\"auth/index.server.js\",\n\t\"auth/index.server.ts\",\n];\n\npossiblePaths = [\n\t...possiblePaths,\n\t...possiblePaths.map((it) => `lib/server/${it}`),\n\t...possiblePaths.map((it) => `server/auth/${it}`),\n\t...possiblePaths.map((it) => `server/${it}`),\n\t...possiblePaths.map((it) => `auth/${it}`),\n\t...possiblePaths.map((it) => `lib/${it}`),\n\t...possiblePaths.map((it) => `utils/${it}`),\n];\npossiblePaths = [\n\t...possiblePaths,\n\t...possiblePaths.map((it) => `src/${it}`),\n\t...possiblePaths.map((it) => `app/${it}`),\n];\n\nfunction resolveReferencePath(configDir: string, refPath: string): string {\n\tconst resolvedPath = path.resolve(configDir, refPath);\n\n\t// If it ends with .json, treat as direct file reference\n\tif (refPath.endsWith(\".json\")) {\n\t\treturn resolvedPath;\n\t}\n\n\t// If the exact path exists and is a file, use it\n\tif (fs.existsSync(resolvedPath)) {\n\t\ttry {\n\t\t\tconst stats = fs.statSync(resolvedPath);\n\t\t\tif (stats.isFile()) {\n\t\t\t\treturn resolvedPath;\n\t\t\t}\n\t\t} catch {\n\t\t\t// Fall through to directory handling\n\t\t}\n\t}\n\n\t// Otherwise, assume directory reference\n\treturn path.resolve(configDir, refPath, \"tsconfig.json\");\n}\n\nfunction getPathAliasesRecursive(\n\ttsconfigPath: string,\n\tvisited = new Set(),\n): Record {\n\tif (visited.has(tsconfigPath)) {\n\t\treturn {};\n\t}\n\tvisited.add(tsconfigPath);\n\n\tif (!fs.existsSync(tsconfigPath)) {\n\t\tconsole.warn(`Referenced tsconfig not found: ${tsconfigPath}`);\n\t\treturn {};\n\t}\n\n\ttry {\n\t\tconst tsConfig = getTsconfigInfo(undefined, tsconfigPath);\n\t\tconst { paths = {}, baseUrl = \".\" } = tsConfig.compilerOptions || {};\n\t\tconst result: Record = {};\n\n\t\tconst configDir = path.dirname(tsconfigPath);\n\t\tconst obj = Object.entries(paths) as [string, string[]][];\n\t\tfor (const [alias, aliasPaths] of obj) {\n\t\t\tfor (const aliasedPath of aliasPaths) {\n\t\t\t\tconst resolvedBaseUrl = path.resolve(configDir, baseUrl);\n\t\t\t\tconst finalAlias = alias.slice(-1) === \"*\" ? alias.slice(0, -1) : alias;\n\t\t\t\tconst finalAliasedPath =\n\t\t\t\t\taliasedPath.slice(-1) === \"*\"\n\t\t\t\t\t\t? aliasedPath.slice(0, -1)\n\t\t\t\t\t\t: aliasedPath;\n\n\t\t\t\tresult[finalAlias || \"\"] = path.join(resolvedBaseUrl, finalAliasedPath);\n\t\t\t}\n\t\t}\n\n\t\tif (tsConfig.references) {\n\t\t\tfor (const ref of tsConfig.references) {\n\t\t\t\tconst refPath = resolveReferencePath(configDir, ref.path);\n\t\t\t\tconst refAliases = getPathAliasesRecursive(refPath, visited);\n\t\t\t\tfor (const [alias, aliasPath] of Object.entries(refAliases)) {\n\t\t\t\t\tif (!(alias in result)) {\n\t\t\t\t\t\tresult[alias] = aliasPath;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t} catch (error) {\n\t\tconsole.warn(`Error parsing tsconfig at ${tsconfigPath}: ${error}`);\n\t\treturn {};\n\t}\n}\n\nfunction getPathAliases(cwd: string): Record | null {\n\tlet tsConfigPath = path.join(cwd, \"tsconfig.json\");\n\tif (!fs.existsSync(tsConfigPath)) {\n\t\ttsConfigPath = path.join(cwd, \"jsconfig.json\");\n\t}\n\tif (!fs.existsSync(tsConfigPath)) {\n\t\treturn null;\n\t}\n\ttry {\n\t\tconst result = getPathAliasesRecursive(tsConfigPath);\n\t\taddSvelteKitEnvModules(result);\n\t\taddCloudflareModules(result);\n\t\treturn result;\n\t} catch (error) {\n\t\tconsole.error(error);\n\t\tthrow new BetterAuthError(\"Error parsing tsconfig.json\");\n\t}\n}\n/**\n * .tsx files are not supported by Jiti.\n */\nconst jitiOptions = (cwd: string): JitiOptions => {\n\tconst alias = getPathAliases(cwd) || {};\n\treturn {\n\t\ttransformOptions: {\n\t\t\tbabel: {\n\t\t\t\tpresets: [\n\t\t\t\t\t[\n\t\t\t\t\t\tbabelPresetTypeScript,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tisTSX: true,\n\t\t\t\t\t\t\tallExtensions: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\t[babelPresetReact, { runtime: \"automatic\" }],\n\t\t\t\t],\n\t\t\t},\n\t\t},\n\t\textensions: [\".ts\", \".tsx\", \".js\", \".jsx\"],\n\t\talias,\n\t};\n};\n\nconst isDefaultExport = (\n\tobject: Record,\n): object is BetterAuthOptions => {\n\treturn (\n\t\ttypeof object === \"object\" &&\n\t\tobject !== null &&\n\t\t!Array.isArray(object) &&\n\t\tObject.keys(object).length > 0 &&\n\t\t\"options\" in object\n\t);\n};\nexport async function getConfig({\n\tcwd,\n\tconfigPath,\n\tshouldThrowOnError = false,\n}: {\n\tcwd: string;\n\tconfigPath?: string;\n\tshouldThrowOnError?: boolean;\n}) {\n\ttry {\n\t\tlet configFile: BetterAuthOptions | null = null;\n\t\tif (configPath) {\n\t\t\tlet resolvedPath: string = path.join(cwd, configPath);\n\t\t\tif (existsSync(configPath)) resolvedPath = configPath; // If the configPath is a file, use it as is, as it means the path wasn't relative.\n\t\t\tconst { config } = await loadConfig<\n\t\t\t\t| {\n\t\t\t\t\t\tauth: {\n\t\t\t\t\t\t\toptions: BetterAuthOptions;\n\t\t\t\t\t\t};\n\t\t\t\t }\n\t\t\t\t| {\n\t\t\t\t\t\toptions: BetterAuthOptions;\n\t\t\t\t }\n\t\t\t>({\n\t\t\t\tconfigFile: resolvedPath,\n\t\t\t\tdotenv: {\n\t\t\t\t\tfileName: [\".env\", \".env.local\"],\n\t\t\t\t},\n\t\t\t\tjitiOptions: jitiOptions(cwd),\n\t\t\t\tcwd,\n\t\t\t});\n\t\t\tif (!(\"auth\" in config) && !isDefaultExport(config)) {\n\t\t\t\tif (shouldThrowOnError) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Couldn't read your auth config in ${resolvedPath}. Make sure to default export your auth instance or to export as a variable named auth.`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tconsole.error(\n\t\t\t\t\t`[#better-auth]: Couldn't read your auth config in ${resolvedPath}. Make sure to default export your auth instance or to export as a variable named auth.`,\n\t\t\t\t);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\tconfigFile = \"auth\" in config ? config.auth?.options : config.options;\n\t\t}\n\n\t\tif (!configFile) {\n\t\t\tfor (const possiblePath of possiblePaths) {\n\t\t\t\ttry {\n\t\t\t\t\tconst { config } = await loadConfig<{\n\t\t\t\t\t\tauth: {\n\t\t\t\t\t\t\toptions: BetterAuthOptions;\n\t\t\t\t\t\t};\n\t\t\t\t\t\tdefault?: {\n\t\t\t\t\t\t\toptions: BetterAuthOptions;\n\t\t\t\t\t\t};\n\t\t\t\t\t}>({\n\t\t\t\t\t\tconfigFile: possiblePath,\n\t\t\t\t\t\tdotenv: {\n\t\t\t\t\t\t\tfileName: [\".env\", \".env.local\"],\n\t\t\t\t\t\t},\n\t\t\t\t\t\tjitiOptions: jitiOptions(cwd),\n\t\t\t\t\t\tcwd,\n\t\t\t\t\t});\n\t\t\t\t\tconst hasConfig = Object.keys(config).length > 0;\n\t\t\t\t\tif (hasConfig) {\n\t\t\t\t\t\tconfigFile =\n\t\t\t\t\t\t\tconfig.auth?.options || config.default?.options || null;\n\t\t\t\t\t\tif (!configFile) {\n\t\t\t\t\t\t\tif (shouldThrowOnError) {\n\t\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t\t\"Couldn't read your auth config. Make sure to default export your auth instance or to export as a variable named auth.\",\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconsole.error(\"[#better-auth]: Couldn't read your auth config.\");\n\t\t\t\t\t\t\tconsole.log(\"\");\n\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t\"[#better-auth]: Make sure to default export your auth instance or to export as a variable named auth.\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tprocess.exit(1);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t} catch (e) {\n\t\t\t\t\tif (\n\t\t\t\t\t\ttypeof e === \"object\" &&\n\t\t\t\t\t\te &&\n\t\t\t\t\t\t\"message\" in e &&\n\t\t\t\t\t\ttypeof e.message === \"string\" &&\n\t\t\t\t\t\te.message.includes(\n\t\t\t\t\t\t\t\"This module cannot be imported from a Client Component module\",\n\t\t\t\t\t\t)\n\t\t\t\t\t) {\n\t\t\t\t\t\tif (shouldThrowOnError) {\n\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t`Please remove import 'server-only' from your auth config file temporarily. The CLI cannot resolve the configuration with it included. You can re-add it after running the CLI.`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\t`Please remove import 'server-only' from your auth config file temporarily. The CLI cannot resolve the configuration with it included. You can re-add it after running the CLI.`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tprocess.exit(1);\n\t\t\t\t\t}\n\t\t\t\t\tif (shouldThrowOnError) {\n\t\t\t\t\t\tthrow e;\n\t\t\t\t\t}\n\t\t\t\t\tconsole.error(\"[#better-auth]: Couldn't read your auth config.\", e);\n\t\t\t\t\tprocess.exit(1);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn configFile;\n\t} catch (e) {\n\t\tif (\n\t\t\ttypeof e === \"object\" &&\n\t\t\te &&\n\t\t\t\"message\" in e &&\n\t\t\ttypeof e.message === \"string\" &&\n\t\t\te.message.includes(\n\t\t\t\t\"This module cannot be imported from a Client Component module\",\n\t\t\t)\n\t\t) {\n\t\t\tif (shouldThrowOnError) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Please remove import 'server-only' from your auth config file temporarily. The CLI cannot resolve the configuration with it included. You can re-add it after running the CLI.`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tconsole.error(\n\t\t\t\t`Please remove import 'server-only' from your auth config file temporarily. The CLI cannot resolve the configuration with it included. You can re-add it after running the CLI.`,\n\t\t\t);\n\t\t\tprocess.exit(1);\n\t\t}\n\t\tif (shouldThrowOnError) {\n\t\t\tthrow e;\n\t\t}\n\n\t\tconsole.error(\"Couldn't read your auth config.\", e);\n\t\tprocess.exit(1);\n\t}\n}\n","import { existsSync } from \"node:fs\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport {\n\tcreateTelemetry,\n\tgetTelemetryAuthConfig,\n} from \"@better-auth/telemetry\";\nimport { getAdapter } from \"better-auth/db\";\nimport chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport prompts from \"prompts\";\nimport yoctoSpinner from \"yocto-spinner\";\nimport * as z from \"zod/v4\";\nimport { generateSchema } from \"../generators\";\nimport { getConfig } from \"../utils/get-config\";\n\nasync function generateAction(opts: any) {\n\tconst options = z\n\t\t.object({\n\t\t\tcwd: z.string(),\n\t\t\tconfig: z.string().optional(),\n\t\t\toutput: z.string().optional(),\n\t\t\ty: z.boolean().optional(),\n\t\t\tyes: z.boolean().optional(),\n\t\t})\n\t\t.parse(opts);\n\n\tconst cwd = path.resolve(options.cwd);\n\tif (!existsSync(cwd)) {\n\t\tconsole.error(`The directory \"${cwd}\" does not exist.`);\n\t\tprocess.exit(1);\n\t}\n\tconst config = await getConfig({\n\t\tcwd,\n\t\tconfigPath: options.config,\n\t});\n\tif (!config) {\n\t\tconsole.error(\n\t\t\t\"No configuration file found. Add a `auth.ts` file to your project or pass the path to the configuration file using the `--config` flag.\",\n\t\t);\n\t\treturn;\n\t}\n\n\tconst adapter = await getAdapter(config).catch((e) => {\n\t\tconsole.error(e.message);\n\t\tprocess.exit(1);\n\t});\n\n\tconst spinner = yoctoSpinner({ text: \"preparing schema...\" }).start();\n\n\tconst schema = await generateSchema({\n\t\tadapter,\n\t\tfile: options.output,\n\t\toptions: config,\n\t});\n\n\tspinner.stop();\n\tif (!schema.code) {\n\t\tconsole.log(\"Your schema is already up to date.\");\n\t\t// telemetry: track generate attempted, no changes\n\t\ttry {\n\t\t\tconst telemetry = await createTelemetry(config);\n\t\t\tawait telemetry.publish({\n\t\t\t\ttype: \"cli_generate\",\n\t\t\t\tpayload: {\n\t\t\t\t\toutcome: \"no_changes\",\n\t\t\t\t\tconfig: getTelemetryAuthConfig(config, {\n\t\t\t\t\t\tadapter: adapter.id,\n\t\t\t\t\t\tdatabase:\n\t\t\t\t\t\t\ttypeof config.database === \"function\" ? \"adapter\" : \"kysely\",\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t});\n\t\t} catch {}\n\t\tprocess.exit(0);\n\t}\n\tif (schema.overwrite) {\n\t\tlet confirm = options.y || options.yes;\n\t\tif (!confirm) {\n\t\t\tconst response = await prompts({\n\t\t\t\ttype: \"confirm\",\n\t\t\t\tname: \"confirm\",\n\t\t\t\tmessage: `The file ${\n\t\t\t\t\tschema.fileName\n\t\t\t\t} already exists. Do you want to ${chalk.yellow(\n\t\t\t\t\t`${schema.overwrite ? \"overwrite\" : \"append\"}`,\n\t\t\t\t)} the schema to the file?`,\n\t\t\t});\n\t\t\tconfirm = response.confirm;\n\t\t}\n\n\t\tif (confirm) {\n\t\t\tconst exist = existsSync(path.join(cwd, schema.fileName));\n\t\t\tif (!exist) {\n\t\t\t\tawait fs.mkdir(path.dirname(path.join(cwd, schema.fileName)), {\n\t\t\t\t\trecursive: true,\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (schema.overwrite) {\n\t\t\t\tawait fs.writeFile(path.join(cwd, schema.fileName), schema.code);\n\t\t\t} else {\n\t\t\t\tawait fs.appendFile(path.join(cwd, schema.fileName), schema.code);\n\t\t\t}\n\t\t\tconsole.log(\n\t\t\t\t`šŸš€ Schema was ${\n\t\t\t\t\tschema.overwrite ? \"overwritten\" : \"appended\"\n\t\t\t\t} successfully!`,\n\t\t\t);\n\t\t\t// telemetry: track generate success overwrite/append\n\t\t\ttry {\n\t\t\t\tconst telemetry = await createTelemetry(config);\n\t\t\t\tawait telemetry.publish({\n\t\t\t\t\ttype: \"cli_generate\",\n\t\t\t\t\tpayload: {\n\t\t\t\t\t\toutcome: schema.overwrite ? \"overwritten\" : \"appended\",\n\t\t\t\t\t\tconfig: getTelemetryAuthConfig(config),\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t} catch {}\n\t\t\tprocess.exit(0);\n\t\t} else {\n\t\t\tconsole.error(\"Schema generation aborted.\");\n\t\t\t// telemetry: track generate aborted\n\t\t\ttry {\n\t\t\t\tconst telemetry = await createTelemetry(config);\n\t\t\t\tawait telemetry.publish({\n\t\t\t\t\ttype: \"cli_generate\",\n\t\t\t\t\tpayload: {\n\t\t\t\t\t\toutcome: \"aborted\",\n\t\t\t\t\t\tconfig: getTelemetryAuthConfig(config),\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t} catch {}\n\t\t\tprocess.exit(1);\n\t\t}\n\t}\n\n\tif (options.y) {\n\t\tconsole.warn(\"WARNING: --y is deprecated. Consider -y or --yes\");\n\t\toptions.yes = true;\n\t}\n\n\tlet confirm = options.yes;\n\n\tif (!confirm) {\n\t\tconst response = await prompts({\n\t\t\ttype: \"confirm\",\n\t\t\tname: \"confirm\",\n\t\t\tmessage: `Do you want to generate the schema to ${chalk.yellow(\n\t\t\t\tschema.fileName,\n\t\t\t)}?`,\n\t\t});\n\t\tconfirm = response.confirm;\n\t}\n\n\tif (!confirm) {\n\t\tconsole.error(\"Schema generation aborted.\");\n\t\t// telemetry: track generate aborted before write\n\t\ttry {\n\t\t\tconst telemetry = await createTelemetry(config);\n\t\t\tawait telemetry.publish({\n\t\t\t\ttype: \"cli_generate\",\n\t\t\t\tpayload: { outcome: \"aborted\", config: getTelemetryAuthConfig(config) },\n\t\t\t});\n\t\t} catch {}\n\t\tprocess.exit(1);\n\t}\n\n\tif (!options.output) {\n\t\tconst dirExist = existsSync(path.dirname(path.join(cwd, schema.fileName)));\n\t\tif (!dirExist) {\n\t\t\tawait fs.mkdir(path.dirname(path.join(cwd, schema.fileName)), {\n\t\t\t\trecursive: true,\n\t\t\t});\n\t\t}\n\t}\n\tawait fs.writeFile(\n\t\toptions.output || path.join(cwd, schema.fileName),\n\t\tschema.code,\n\t);\n\tconsole.log(`šŸš€ Schema was generated successfully!`);\n\t// telemetry: track generate success\n\ttry {\n\t\tconst telemetry = await createTelemetry(config);\n\t\tawait telemetry.publish({\n\t\t\ttype: \"cli_generate\",\n\t\t\tpayload: { outcome: \"generated\", config: getTelemetryAuthConfig(config) },\n\t\t});\n\t} catch {}\n\tprocess.exit(0);\n}\n\nexport const generate = new Command(\"generate\")\n\t.option(\n\t\t\"-c, --cwd \",\n\t\t\"the working directory. defaults to the current directory.\",\n\t\tprocess.cwd(),\n\t)\n\t.option(\n\t\t\"--config \",\n\t\t\"the path to the configuration file. defaults to the first configuration file found.\",\n\t)\n\t.option(\"--output \", \"the file to output to the generated schema\")\n\t.option(\"-y, --yes\", \"automatically answer yes to all prompts\", false)\n\t.option(\"--y\", \"(deprecated) same as --yes\", false)\n\t.action(generateAction);\n","import { execSync } from \"node:child_process\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport { getConfig } from \"../utils/get-config\";\nimport { getPackageInfo } from \"../utils/get-package-info\";\n\nfunction getSystemInfo() {\n\tconst platform = os.platform();\n\tconst arch = os.arch();\n\tconst version = os.version();\n\tconst release = os.release();\n\tconst cpus = os.cpus();\n\tconst memory = os.totalmem();\n\tconst freeMemory = os.freemem();\n\n\treturn {\n\t\tplatform,\n\t\tarch,\n\t\tversion,\n\t\trelease,\n\t\tcpuCount: cpus.length,\n\t\tcpuModel: cpus[0]?.model || \"Unknown\",\n\t\ttotalMemory: `${(memory / 1024 / 1024 / 1024).toFixed(2)} GB`,\n\t\tfreeMemory: `${(freeMemory / 1024 / 1024 / 1024).toFixed(2)} GB`,\n\t};\n}\n\nfunction getNodeInfo() {\n\treturn {\n\t\tversion: process.version,\n\t\tenv: process.env.NODE_ENV || \"development\",\n\t};\n}\n\nfunction getPackageManager() {\n\tconst userAgent = process.env.npm_config_user_agent || \"\";\n\n\tif (userAgent.includes(\"yarn\")) {\n\t\treturn { name: \"yarn\", version: getVersion(\"yarn\") };\n\t}\n\tif (userAgent.includes(\"pnpm\")) {\n\t\treturn { name: \"pnpm\", version: getVersion(\"pnpm\") };\n\t}\n\tif (userAgent.includes(\"bun\")) {\n\t\treturn { name: \"bun\", version: getVersion(\"bun\") };\n\t}\n\treturn { name: \"npm\", version: getVersion(\"npm\") };\n}\n\nfunction getVersion(command: string): string {\n\ttry {\n\t\tconst output = execSync(`${command} --version`, { encoding: \"utf8\" });\n\t\treturn output.trim();\n\t} catch {\n\t\treturn \"Not installed\";\n\t}\n}\n\nfunction getFrameworkInfo(projectRoot: string) {\n\tconst packageJsonPath = path.join(projectRoot, \"package.json\");\n\n\tif (!existsSync(packageJsonPath)) {\n\t\treturn null;\n\t}\n\n\ttry {\n\t\tconst packageJson = JSON.parse(readFileSync(packageJsonPath, \"utf8\"));\n\t\tconst deps = {\n\t\t\t...packageJson.dependencies,\n\t\t\t...packageJson.devDependencies,\n\t\t};\n\n\t\tconst frameworks: Record = {\n\t\t\tnext: deps[\"next\"],\n\t\t\treact: deps[\"react\"],\n\t\t\tvue: deps[\"vue\"],\n\t\t\tnuxt: deps[\"nuxt\"],\n\t\t\tsvelte: deps[\"svelte\"],\n\t\t\t\"@sveltejs/kit\": deps[\"@sveltejs/kit\"],\n\t\t\texpress: deps[\"express\"],\n\t\t\tfastify: deps[\"fastify\"],\n\t\t\thono: deps[\"hono\"],\n\t\t\tremix: deps[\"@remix-run/react\"],\n\t\t\tastro: deps[\"astro\"],\n\t\t\tsolid: deps[\"solid-js\"],\n\t\t\tqwik: deps[\"@builder.io/qwik\"],\n\t\t};\n\n\t\tconst installedFrameworks = Object.entries(frameworks)\n\t\t\t.filter(([_, version]) => version)\n\t\t\t.map(([name, version]) => ({ name, version }));\n\n\t\treturn installedFrameworks.length > 0 ? installedFrameworks : null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction getDatabaseInfo(projectRoot: string) {\n\tconst packageJsonPath = path.join(projectRoot, \"package.json\");\n\n\tif (!existsSync(packageJsonPath)) {\n\t\treturn null;\n\t}\n\n\ttry {\n\t\tconst packageJson = JSON.parse(readFileSync(packageJsonPath, \"utf8\"));\n\t\tconst deps = {\n\t\t\t...packageJson.dependencies,\n\t\t\t...packageJson.devDependencies,\n\t\t};\n\n\t\tconst databases: Record = {\n\t\t\t\"better-sqlite3\": deps[\"better-sqlite3\"],\n\t\t\t\"@libsql/client\": deps[\"@libsql/client\"],\n\t\t\t\"@libsql/kysely-libsql\": deps[\"@libsql/kysely-libsql\"],\n\t\t\tmysql2: deps[\"mysql2\"],\n\t\t\tpg: deps[\"pg\"],\n\t\t\tpostgres: deps[\"postgres\"],\n\t\t\t\"@prisma/client\": deps[\"@prisma/client\"],\n\t\t\tdrizzle: deps[\"drizzle-orm\"],\n\t\t\tkysely: deps[\"kysely\"],\n\t\t\tmongodb: deps[\"mongodb\"],\n\t\t\t\"@neondatabase/serverless\": deps[\"@neondatabase/serverless\"],\n\t\t\t\"@vercel/postgres\": deps[\"@vercel/postgres\"],\n\t\t\t\"@planetscale/database\": deps[\"@planetscale/database\"],\n\t\t};\n\n\t\tconst installedDatabases = Object.entries(databases)\n\t\t\t.filter(([_, version]) => version)\n\t\t\t.map(([name, version]) => ({ name, version }));\n\n\t\treturn installedDatabases.length > 0 ? installedDatabases : null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction sanitizeBetterAuthConfig(config: any): any {\n\tif (!config) return null;\n\n\tconst sanitized = JSON.parse(JSON.stringify(config));\n\n\t// List of sensitive keys to redact\n\tconst sensitiveKeys = [\n\t\t\"secret\",\n\t\t\"clientSecret\",\n\t\t\"clientId\",\n\t\t\"authToken\",\n\t\t\"apiKey\",\n\t\t\"apiSecret\",\n\t\t\"privateKey\",\n\t\t\"publicKey\",\n\t\t\"password\",\n\t\t\"token\",\n\t\t\"webhook\",\n\t\t\"connectionString\",\n\t\t\"databaseUrl\",\n\t\t\"databaseURL\",\n\t\t\"TURSO_AUTH_TOKEN\",\n\t\t\"TURSO_DATABASE_URL\",\n\t\t\"MYSQL_DATABASE_URL\",\n\t\t\"DATABASE_URL\",\n\t\t\"POSTGRES_URL\",\n\t\t\"MONGODB_URI\",\n\t\t\"stripeKey\",\n\t\t\"stripeWebhookSecret\",\n\t];\n\n\t// Keys that should NOT be redacted even if they contain sensitive keywords\n\tconst allowedKeys = [\n\t\t\"baseURL\",\n\t\t\"callbackURL\",\n\t\t\"redirectURL\",\n\t\t\"trustedOrigins\",\n\t\t\"appName\",\n\t];\n\n\tfunction redactSensitive(obj: any, parentKey?: string): any {\n\t\tif (typeof obj !== \"object\" || obj === null) {\n\t\t\t// Check if the parent key is sensitive\n\t\t\tif (parentKey && typeof obj === \"string\" && obj.length > 0) {\n\t\t\t\t// First check if it's in the allowed list\n\t\t\t\tif (\n\t\t\t\t\tallowedKeys.some(\n\t\t\t\t\t\t(allowed) => parentKey.toLowerCase() === allowed.toLowerCase(),\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\treturn obj;\n\t\t\t\t}\n\n\t\t\t\tconst lowerKey = parentKey.toLowerCase();\n\t\t\t\tif (\n\t\t\t\t\tsensitiveKeys.some((key) => {\n\t\t\t\t\t\tconst lowerSensitiveKey = key.toLowerCase();\n\t\t\t\t\t\t// Exact match or the key ends with the sensitive key\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\tlowerKey === lowerSensitiveKey ||\n\t\t\t\t\t\t\tlowerKey.endsWith(lowerSensitiveKey)\n\t\t\t\t\t\t);\n\t\t\t\t\t})\n\t\t\t\t) {\n\t\t\t\t\treturn \"[REDACTED]\";\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn obj;\n\t\t}\n\n\t\tif (Array.isArray(obj)) {\n\t\t\treturn obj.map((item) => redactSensitive(item, parentKey));\n\t\t}\n\n\t\tconst result: any = {};\n\t\tfor (const [key, value] of Object.entries(obj)) {\n\t\t\t// First check if this key is in the allowed list\n\t\t\tif (\n\t\t\t\tallowedKeys.some(\n\t\t\t\t\t(allowed) => key.toLowerCase() === allowed.toLowerCase(),\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\tresult[key] = value;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst lowerKey = key.toLowerCase();\n\n\t\t\t// Check if this key should be redacted\n\t\t\tif (\n\t\t\t\tsensitiveKeys.some((sensitiveKey) => {\n\t\t\t\t\tconst lowerSensitiveKey = sensitiveKey.toLowerCase();\n\t\t\t\t\t// Exact match or the key ends with the sensitive key\n\t\t\t\t\treturn (\n\t\t\t\t\t\tlowerKey === lowerSensitiveKey ||\n\t\t\t\t\t\tlowerKey.endsWith(lowerSensitiveKey)\n\t\t\t\t\t);\n\t\t\t\t})\n\t\t\t) {\n\t\t\t\tif (typeof value === \"string\" && value.length > 0) {\n\t\t\t\t\tresult[key] = \"[REDACTED]\";\n\t\t\t\t} else if (typeof value === \"object\" && value !== null) {\n\t\t\t\t\t// Still recurse into objects but mark them as potentially sensitive\n\t\t\t\t\tresult[key] = redactSensitive(value, key);\n\t\t\t\t} else {\n\t\t\t\t\tresult[key] = value;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tresult[key] = redactSensitive(value, key);\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\n\t// Special handling for specific config sections\n\tif (sanitized.database) {\n\t\t// Redact database connection details\n\t\tif (typeof sanitized.database === \"string\") {\n\t\t\tsanitized.database = \"[REDACTED]\";\n\t\t} else if (sanitized.database.url) {\n\t\t\tsanitized.database.url = \"[REDACTED]\";\n\t\t}\n\t\tif (sanitized.database.authToken) {\n\t\t\tsanitized.database.authToken = \"[REDACTED]\";\n\t\t}\n\t}\n\n\tif (sanitized.socialProviders) {\n\t\t// Redact all social provider secrets\n\t\tfor (const provider in sanitized.socialProviders) {\n\t\t\tif (sanitized.socialProviders[provider]) {\n\t\t\t\tsanitized.socialProviders[provider] = redactSensitive(\n\t\t\t\t\tsanitized.socialProviders[provider],\n\t\t\t\t\tprovider,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (sanitized.emailAndPassword?.sendResetPassword) {\n\t\tsanitized.emailAndPassword.sendResetPassword = \"[Function]\";\n\t}\n\n\tif (sanitized.emailVerification?.sendVerificationEmail) {\n\t\tsanitized.emailVerification.sendVerificationEmail = \"[Function]\";\n\t}\n\n\t// Redact plugin configurations\n\tif (sanitized.plugins && Array.isArray(sanitized.plugins)) {\n\t\tsanitized.plugins = sanitized.plugins.map((plugin: any) => {\n\t\t\tif (typeof plugin === \"function\") {\n\t\t\t\treturn \"[Plugin Function]\";\n\t\t\t}\n\t\t\tif (plugin && typeof plugin === \"object\") {\n\t\t\t\t// Get plugin name if available\n\t\t\t\tconst pluginName = plugin.id || plugin.name || \"unknown\";\n\t\t\t\treturn {\n\t\t\t\t\tname: pluginName,\n\t\t\t\t\tconfig: redactSensitive(plugin.config || plugin),\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn plugin;\n\t\t});\n\t}\n\n\treturn redactSensitive(sanitized);\n}\n\nasync function getBetterAuthInfo(\n\tprojectRoot: string,\n\tconfigPath?: string,\n\tsuppressLogs = false,\n) {\n\ttry {\n\t\t// Temporarily suppress console output if needed\n\t\tconst originalLog = console.log;\n\t\tconst originalWarn = console.warn;\n\t\tconst originalError = console.error;\n\n\t\tif (suppressLogs) {\n\t\t\tconsole.log = () => {};\n\t\t\tconsole.warn = () => {};\n\t\t\tconsole.error = () => {};\n\t\t}\n\n\t\ttry {\n\t\t\tconst config = await getConfig({\n\t\t\t\tcwd: projectRoot,\n\t\t\t\tconfigPath,\n\t\t\t\tshouldThrowOnError: true,\n\t\t\t});\n\t\t\tconst packageInfo = await getPackageInfo();\n\t\t\tconst betterAuthVersion =\n\t\t\t\tpackageInfo.dependencies?.[\"better-auth\"] ||\n\t\t\t\tpackageInfo.devDependencies?.[\"better-auth\"] ||\n\t\t\t\tpackageInfo.peerDependencies?.[\"better-auth\"] ||\n\t\t\t\tpackageInfo.optionalDependencies?.[\"better-auth\"] ||\n\t\t\t\t\"Unknown\";\n\n\t\t\treturn {\n\t\t\t\tversion: betterAuthVersion,\n\t\t\t\tconfig: sanitizeBetterAuthConfig(config),\n\t\t\t};\n\t\t} finally {\n\t\t\t// Restore console methods\n\t\t\tif (suppressLogs) {\n\t\t\t\tconsole.log = originalLog;\n\t\t\t\tconsole.warn = originalWarn;\n\t\t\t\tconsole.error = originalError;\n\t\t\t}\n\t\t}\n\t} catch (error) {\n\t\treturn {\n\t\t\tversion: \"Unknown\",\n\t\t\tconfig: null,\n\t\t\terror:\n\t\t\t\terror instanceof Error\n\t\t\t\t\t? error.message\n\t\t\t\t\t: \"Failed to load Better Auth config\",\n\t\t};\n\t}\n}\n\nfunction formatOutput(data: any, indent = 0): string {\n\tconst spaces = \" \".repeat(indent);\n\n\tif (data === null || data === undefined) {\n\t\treturn `${spaces}${chalk.gray(\"N/A\")}`;\n\t}\n\n\tif (\n\t\ttypeof data === \"string\" ||\n\t\ttypeof data === \"number\" ||\n\t\ttypeof data === \"boolean\"\n\t) {\n\t\treturn `${spaces}${data}`;\n\t}\n\n\tif (Array.isArray(data)) {\n\t\tif (data.length === 0) {\n\t\t\treturn `${spaces}${chalk.gray(\"[]\")}`;\n\t\t}\n\t\treturn data.map((item) => formatOutput(item, indent)).join(\"\\n\");\n\t}\n\n\tif (typeof data === \"object\") {\n\t\tconst entries = Object.entries(data);\n\t\tif (entries.length === 0) {\n\t\t\treturn `${spaces}${chalk.gray(\"{}\")}`;\n\t\t}\n\n\t\treturn entries\n\t\t\t.map(([key, value]) => {\n\t\t\t\tif (\n\t\t\t\t\ttypeof value === \"object\" &&\n\t\t\t\t\tvalue !== null &&\n\t\t\t\t\t!Array.isArray(value)\n\t\t\t\t) {\n\t\t\t\t\treturn `${spaces}${chalk.cyan(key)}:\\n${formatOutput(value, indent + 2)}`;\n\t\t\t\t}\n\t\t\t\treturn `${spaces}${chalk.cyan(key)}: ${formatOutput(value, 0)}`;\n\t\t\t})\n\t\t\t.join(\"\\n\");\n\t}\n\n\treturn `${spaces}${JSON.stringify(data)}`;\n}\n\nexport const info = new Command(\"info\")\n\t.description(\"Display system and Better Auth configuration information\")\n\t.option(\"--cwd \", \"The working directory\", process.cwd())\n\t.option(\"--config \", \"Path to the Better Auth configuration file\")\n\t.option(\"-j, --json\", \"Output as JSON\")\n\t.option(\"-c, --copy\", \"Copy output to clipboard (requires pbcopy/xclip)\")\n\t.action(async (options) => {\n\t\tconst projectRoot = path.resolve(options.cwd || process.cwd());\n\n\t\t// Collect all information\n\t\tconst systemInfo = getSystemInfo();\n\t\tconst nodeInfo = getNodeInfo();\n\t\tconst packageManager = getPackageManager();\n\t\tconst frameworks = getFrameworkInfo(projectRoot);\n\t\tconst databases = getDatabaseInfo(projectRoot);\n\t\tconst betterAuthInfo = await getBetterAuthInfo(\n\t\t\tprojectRoot,\n\t\t\toptions.config,\n\t\t\toptions.json,\n\t\t);\n\n\t\tconst fullInfo = {\n\t\t\tsystem: systemInfo,\n\t\t\tnode: nodeInfo,\n\t\t\tpackageManager,\n\t\t\tframeworks,\n\t\t\tdatabases,\n\t\t\tbetterAuth: betterAuthInfo,\n\t\t};\n\n\t\tif (options.json) {\n\t\t\tconst jsonOutput = JSON.stringify(fullInfo, null, 2);\n\t\t\tconsole.log(jsonOutput);\n\n\t\t\tif (options.copy) {\n\t\t\t\ttry {\n\t\t\t\t\tconst platform = os.platform();\n\t\t\t\t\tif (platform === \"darwin\") {\n\t\t\t\t\t\texecSync(\"pbcopy\", { input: jsonOutput });\n\t\t\t\t\t\tconsole.log(chalk.green(\"\\nāœ“ Copied to clipboard\"));\n\t\t\t\t\t} else if (platform === \"linux\") {\n\t\t\t\t\t\texecSync(\"xclip -selection clipboard\", { input: jsonOutput });\n\t\t\t\t\t\tconsole.log(chalk.green(\"\\nāœ“ Copied to clipboard\"));\n\t\t\t\t\t} else if (platform === \"win32\") {\n\t\t\t\t\t\texecSync(\"clip\", { input: jsonOutput });\n\t\t\t\t\t\tconsole.log(chalk.green(\"\\nāœ“ Copied to clipboard\"));\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\tconsole.log(chalk.yellow(\"\\n⚠ Could not copy to clipboard\"));\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Format and display output\n\t\tconsole.log(chalk.bold(\"\\nšŸ“Š Better Auth System Information\\n\"));\n\t\tconsole.log(chalk.gray(\"=\".repeat(50)));\n\n\t\tconsole.log(chalk.bold.white(\"\\nšŸ–„ļø System Information:\"));\n\t\tconsole.log(formatOutput(systemInfo, 2));\n\n\t\tconsole.log(chalk.bold.white(\"\\nšŸ“¦ Node.js:\"));\n\t\tconsole.log(formatOutput(nodeInfo, 2));\n\n\t\tconsole.log(chalk.bold.white(\"\\nšŸ“¦ Package Manager:\"));\n\t\tconsole.log(formatOutput(packageManager, 2));\n\n\t\tif (frameworks) {\n\t\t\tconsole.log(chalk.bold.white(\"\\nšŸš€ Frameworks:\"));\n\t\t\tconsole.log(formatOutput(frameworks, 2));\n\t\t}\n\n\t\tif (databases) {\n\t\t\tconsole.log(chalk.bold.white(\"\\nšŸ’¾ Database Clients:\"));\n\t\t\tconsole.log(formatOutput(databases, 2));\n\t\t}\n\n\t\tconsole.log(chalk.bold.white(\"\\nšŸ” Better Auth:\"));\n\t\tif (betterAuthInfo.error) {\n\t\t\tconsole.log(` ${chalk.red(\"Error:\")} ${betterAuthInfo.error}`);\n\t\t} else {\n\t\t\tconsole.log(` ${chalk.cyan(\"Version\")}: ${betterAuthInfo.version}`);\n\t\t\tif (betterAuthInfo.config) {\n\t\t\t\tconsole.log(` ${chalk.cyan(\"Configuration\")}:`);\n\t\t\t\tconsole.log(formatOutput(betterAuthInfo.config, 4));\n\t\t\t}\n\t\t}\n\n\t\tconsole.log(chalk.gray(\"\\n\" + \"=\".repeat(50)));\n\t\tconsole.log(chalk.gray(\"\\nšŸ’” Tip: Use --json flag for JSON output\"));\n\t\tconsole.log(chalk.gray(\"šŸ’” Use --copy flag to copy output to clipboard\"));\n\t\tconsole.log(\n\t\t\tchalk.gray(\"šŸ’” When reporting issues, include this information\\n\"),\n\t\t);\n\n\t\tif (options.copy) {\n\t\t\tconst textOutput = `\nBetter Auth System Information\n==============================\n\nSystem Information:\n${JSON.stringify(systemInfo, null, 2)}\n\nNode.js:\n${JSON.stringify(nodeInfo, null, 2)}\n\nPackage Manager:\n${JSON.stringify(packageManager, null, 2)}\n\nFrameworks:\n${JSON.stringify(frameworks, null, 2)}\n\nDatabase Clients:\n${JSON.stringify(databases, null, 2)}\n\nBetter Auth:\n${JSON.stringify(betterAuthInfo, null, 2)}\n`;\n\n\t\t\ttry {\n\t\t\t\tconst platform = os.platform();\n\t\t\t\tif (platform === \"darwin\") {\n\t\t\t\t\texecSync(\"pbcopy\", { input: textOutput });\n\t\t\t\t\tconsole.log(chalk.green(\"āœ“ Copied to clipboard\"));\n\t\t\t\t} else if (platform === \"linux\") {\n\t\t\t\t\texecSync(\"xclip -selection clipboard\", { input: textOutput });\n\t\t\t\t\tconsole.log(chalk.green(\"āœ“ Copied to clipboard\"));\n\t\t\t\t} else if (platform === \"win32\") {\n\t\t\t\t\texecSync(\"clip\", { input: textOutput });\n\t\t\t\t\tconsole.log(chalk.green(\"āœ“ Copied to clipboard\"));\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\tconsole.log(chalk.yellow(\"⚠ Could not copy to clipboard\"));\n\t\t\t}\n\t\t}\n\t});\n","import type { spinner as clackSpinner } from \"@clack/prompts\";\nimport type { SupportedDatabases, SupportedPlugin } from \"../commands/init\";\n\nexport type Import = {\n\tpath: string;\n\tvariables:\n\t\t| { asType?: boolean; name: string; as?: string }[]\n\t\t| { asType?: boolean; name: string; as?: string };\n};\n\ntype Format = (code: string) => Promise;\n\ntype CommonIndexConfig_Regex = {\n\ttype: \"regex\";\n\tregex: RegExp;\n\tgetIndex: (args: {\n\t\tmatchIndex: number;\n\t\tmatch: RegExpMatchArray;\n\t\tadditionalFields: AdditionalFields;\n\t}) => number | null;\n};\ntype CommonIndexConfig_manual = {\n\ttype: \"manual\";\n\tgetIndex: (args: {\n\t\tcontent: string;\n\t\tadditionalFields: AdditionalFields;\n\t}) => number | null;\n};\n\nexport type CommonIndexConfig =\n\t| CommonIndexConfig_Regex\n\t| CommonIndexConfig_manual;\n\nexport async function generateAuthConfig({\n\tformat,\n\tcurrent_user_config,\n\tspinner,\n\tplugins,\n\tdatabase,\n}: {\n\tformat: Format;\n\tcurrent_user_config: string;\n\tspinner: ReturnType;\n\tplugins: SupportedPlugin[];\n\tdatabase: SupportedDatabases | null;\n}): Promise<{\n\tgeneratedCode: string;\n\tdependencies: string[];\n\tenvs: string[];\n}> {\n\tconst _start_of_plugins_common_index = {\n\t\tSTART_OF_PLUGINS: {\n\t\t\ttype: \"regex\",\n\t\t\tregex: /betterAuth\\([\\w\\W]*plugins:[\\W]*\\[()/m,\n\t\t\tgetIndex: ({ matchIndex, match }) => {\n\t\t\t\treturn matchIndex + match[0].length;\n\t\t\t},\n\t\t} satisfies CommonIndexConfig<{}>,\n\t};\n\tconst common_indexes = {\n\t\tSTART_OF_PLUGINS:\n\t\t\t_start_of_plugins_common_index.START_OF_PLUGINS satisfies CommonIndexConfig<{}>,\n\t\tEND_OF_PLUGINS: {\n\t\t\ttype: \"manual\",\n\t\t\tgetIndex: ({ content, additionalFields }) => {\n\t\t\t\tconst closingBracketIndex = findClosingBracket(\n\t\t\t\t\tcontent,\n\t\t\t\t\tadditionalFields.start_of_plugins,\n\t\t\t\t\t\"[\",\n\t\t\t\t\t\"]\",\n\t\t\t\t);\n\t\t\t\treturn closingBracketIndex;\n\t\t\t},\n\t\t} satisfies CommonIndexConfig<{ start_of_plugins: number }>,\n\t\tSTART_OF_BETTERAUTH: {\n\t\t\ttype: \"regex\",\n\t\t\tregex: /betterAuth\\({()/m,\n\t\t\tgetIndex: ({ matchIndex }) => {\n\t\t\t\treturn matchIndex + \"betterAuth({\".length;\n\t\t\t},\n\t\t} satisfies CommonIndexConfig<{}>,\n\t};\n\n\tconst config_generation = {\n\t\tadd_plugin: async (opts: {\n\t\t\tdirection_in_plugins_array: \"append\" | \"prepend\";\n\t\t\tpluginFunctionName: string;\n\t\t\tpluginContents: string;\n\t\t\tconfig: string;\n\t\t}): Promise<{ code: string; dependencies: string[]; envs: string[] }> => {\n\t\t\tconst start_of_plugins = getGroupInfo(\n\t\t\t\topts.config,\n\t\t\t\tcommon_indexes.START_OF_PLUGINS,\n\t\t\t\t{},\n\t\t\t);\n\n\t\t\t// console.log(`start of plugins:`, start_of_plugins);\n\n\t\t\tif (!start_of_plugins) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"Couldn't find start of your plugins array in your auth config file.\",\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst end_of_plugins = getGroupInfo(\n\t\t\t\topts.config,\n\t\t\t\tcommon_indexes.END_OF_PLUGINS,\n\t\t\t\t{ start_of_plugins: start_of_plugins.index },\n\t\t\t);\n\n\t\t\t// console.log(`end of plugins:`, end_of_plugins);\n\n\t\t\tif (!end_of_plugins) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"Couldn't find end of your plugins array in your auth config file.\",\n\t\t\t\t);\n\t\t\t}\n\t\t\t// console.log(\n\t\t\t// \t\"slice:\\n\",\n\t\t\t// \topts.config.slice(start_of_plugins.index, end_of_plugins.index),\n\t\t\t// );\n\t\t\tlet new_content: string;\n\n\t\t\tif (opts.direction_in_plugins_array === \"prepend\") {\n\t\t\t\tnew_content = insertContent({\n\t\t\t\t\tline: start_of_plugins.line,\n\t\t\t\t\tcharacter: start_of_plugins.character,\n\t\t\t\t\tcontent: opts.config,\n\t\t\t\t\tinsert_content: `${opts.pluginFunctionName}(${opts.pluginContents}),`,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tconst pluginArrayContent = opts.config\n\t\t\t\t\t.slice(start_of_plugins.index, end_of_plugins.index)\n\t\t\t\t\t.trim();\n\t\t\t\tconst isPluginArrayEmpty = pluginArrayContent === \"\";\n\t\t\t\tconst isPluginArrayEndsWithComma = pluginArrayContent.endsWith(\",\");\n\t\t\t\tconst needsComma = !isPluginArrayEmpty && !isPluginArrayEndsWithComma;\n\n\t\t\t\tnew_content = insertContent({\n\t\t\t\t\tline: end_of_plugins.line,\n\t\t\t\t\tcharacter: end_of_plugins.character,\n\t\t\t\t\tcontent: opts.config,\n\t\t\t\t\tinsert_content: `${needsComma ? \",\" : \"\"}${opts.pluginFunctionName}(${\n\t\t\t\t\t\topts.pluginContents\n\t\t\t\t\t})`,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// console.log(`new_content`, new_content);\n\t\t\ttry {\n\t\t\t\tnew_content = await format(new_content);\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(error);\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Failed to generate new auth config during plugin addition phase.`,\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn { code: new_content, dependencies: [], envs: [] };\n\t\t},\n\t\tadd_import: async (opts: {\n\t\t\timports: Import[];\n\t\t\tconfig: string;\n\t\t}): Promise<{ code: string; dependencies: string[]; envs: string[] }> => {\n\t\t\tlet importString = \"\";\n\t\t\tfor (const import_ of opts.imports) {\n\t\t\t\tif (Array.isArray(import_.variables)) {\n\t\t\t\t\timportString += `import { ${import_.variables\n\t\t\t\t\t\t.map(\n\t\t\t\t\t\t\t(x) =>\n\t\t\t\t\t\t\t\t`${x.asType ? \"type \" : \"\"}${x.name}${\n\t\t\t\t\t\t\t\t\tx.as ? ` as ${x.as}` : \"\"\n\t\t\t\t\t\t\t\t}`,\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.join(\", \")} } from \"${import_.path}\";\\n`;\n\t\t\t\t} else {\n\t\t\t\t\timportString += `import ${import_.variables.asType ? \"type \" : \"\"}${\n\t\t\t\t\t\timport_.variables.name\n\t\t\t\t\t}${import_.variables.as ? ` as ${import_.variables.as}` : \"\"} from \"${\n\t\t\t\t\t\timport_.path\n\t\t\t\t\t}\";\\n`;\n\t\t\t\t}\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst new_content = format(importString + opts.config);\n\t\t\t\treturn { code: await new_content, dependencies: [], envs: [] };\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(error);\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Failed to generate new auth config during import addition phase.`,\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\t\tadd_database: async (opts: {\n\t\t\tdatabase: SupportedDatabases;\n\t\t\tconfig: string;\n\t\t}): Promise<{ code: string; dependencies: string[]; envs: string[] }> => {\n\t\t\tconst required_envs: string[] = [];\n\t\t\tconst required_deps: string[] = [];\n\t\t\tlet database_code_str: string = \"\";\n\n\t\t\tasync function add_db({\n\t\t\t\tdb_code,\n\t\t\t\tdependencies,\n\t\t\t\tenvs,\n\t\t\t\timports,\n\t\t\t\tcode_before_betterAuth,\n\t\t\t}: {\n\t\t\t\timports: Import[];\n\t\t\t\tdb_code: string;\n\t\t\t\tenvs: string[];\n\t\t\t\tdependencies: string[];\n\t\t\t\t/**\n\t\t\t\t * Any code you want to put before the betterAuth export\n\t\t\t\t */\n\t\t\t\tcode_before_betterAuth?: string;\n\t\t\t}) {\n\t\t\t\tif (code_before_betterAuth) {\n\t\t\t\t\tconst start_of_betterauth = getGroupInfo(\n\t\t\t\t\t\topts.config,\n\t\t\t\t\t\tcommon_indexes.START_OF_BETTERAUTH,\n\t\t\t\t\t\t{},\n\t\t\t\t\t);\n\t\t\t\t\tif (!start_of_betterauth) {\n\t\t\t\t\t\tthrow new Error(\"Couldn't find start of betterAuth() function.\");\n\t\t\t\t\t}\n\t\t\t\t\topts.config = insertContent({\n\t\t\t\t\t\tline: start_of_betterauth.line - 1,\n\t\t\t\t\t\tcharacter: 0,\n\t\t\t\t\t\tcontent: opts.config,\n\t\t\t\t\t\tinsert_content: `\\n${code_before_betterAuth}\\n`,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tconst code_gen = await config_generation.add_import({\n\t\t\t\t\tconfig: opts.config,\n\t\t\t\t\timports: imports,\n\t\t\t\t});\n\t\t\t\topts.config = code_gen.code;\n\t\t\t\tdatabase_code_str = db_code;\n\t\t\t\trequired_envs.push(...envs, ...code_gen.envs);\n\t\t\t\trequired_deps.push(...dependencies, ...code_gen.dependencies);\n\t\t\t}\n\n\t\t\tif (opts.database === \"sqlite\") {\n\t\t\t\tawait add_db({\n\t\t\t\t\tdb_code: `new Database(process.env.DATABASE_URL || \"database.sqlite\")`,\n\t\t\t\t\tdependencies: [\"better-sqlite3\"],\n\t\t\t\t\tenvs: [\"DATABASE_URL\"],\n\t\t\t\t\timports: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpath: \"better-sqlite3\",\n\t\t\t\t\t\t\tvariables: {\n\t\t\t\t\t\t\t\tasType: false,\n\t\t\t\t\t\t\t\tname: \"Database\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t});\n\t\t\t} else if (opts.database === \"postgres\") {\n\t\t\t\tawait add_db({\n\t\t\t\t\tdb_code: `new Pool({\\nconnectionString: process.env.DATABASE_URL || \"postgresql://postgres:password@localhost:5432/database\"\\n})`,\n\t\t\t\t\tdependencies: [\"pg\"],\n\t\t\t\t\tenvs: [\"DATABASE_URL\"],\n\t\t\t\t\timports: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpath: \"pg\",\n\t\t\t\t\t\t\tvariables: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tasType: false,\n\t\t\t\t\t\t\t\t\tname: \"Pool\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t});\n\t\t\t} else if (opts.database === \"mysql\") {\n\t\t\t\tawait add_db({\n\t\t\t\t\tdb_code: `createPool(process.env.DATABASE_URL!)`,\n\t\t\t\t\tdependencies: [\"mysql2\"],\n\t\t\t\t\tenvs: [\"DATABASE_URL\"],\n\t\t\t\t\timports: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpath: \"mysql2/promise\",\n\t\t\t\t\t\t\tvariables: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tasType: false,\n\t\t\t\t\t\t\t\t\tname: \"createPool\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t});\n\t\t\t} else if (opts.database === \"mssql\") {\n\t\t\t\tconst dialectCode = `new MssqlDialect({\n\t\t\t\t\t\ttarn: {\n\t\t\t\t\t\t\t...Tarn,\n\t\t\t\t\t\t\toptions: {\n\t\t\t\t\t\t\tmin: 0,\n\t\t\t\t\t\t\tmax: 10,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\ttedious: {\n\t\t\t\t\t\t\t...Tedious,\n\t\t\t\t\t\t\tconnectionFactory: () => new Tedious.Connection({\n\t\t\t\t\t\t\tauthentication: {\n\t\t\t\t\t\t\t\toptions: {\n\t\t\t\t\t\t\t\tpassword: 'password',\n\t\t\t\t\t\t\t\tuserName: 'username',\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\ttype: 'default',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\toptions: {\n\t\t\t\t\t\t\t\tdatabase: 'some_db',\n\t\t\t\t\t\t\t\tport: 1433,\n\t\t\t\t\t\t\t\ttrustServerCertificate: true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tserver: 'localhost',\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t},\n\t\t\t\t\t})`;\n\t\t\t\tawait add_db({\n\t\t\t\t\tcode_before_betterAuth: dialectCode,\n\t\t\t\t\tdb_code: `dialect`,\n\t\t\t\t\tdependencies: [\"tedious\", \"tarn\", \"kysely\"],\n\t\t\t\t\tenvs: [\"DATABASE_URL\"],\n\t\t\t\t\timports: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpath: \"tedious\",\n\t\t\t\t\t\t\tvariables: {\n\t\t\t\t\t\t\t\tname: \"*\",\n\t\t\t\t\t\t\t\tas: \"Tedious\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpath: \"tarn\",\n\t\t\t\t\t\t\tvariables: {\n\t\t\t\t\t\t\t\tname: \"*\",\n\t\t\t\t\t\t\t\tas: \"Tarn\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpath: \"kysely\",\n\t\t\t\t\t\t\tvariables: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tname: \"MssqlDialect\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t});\n\t\t\t} else if (\n\t\t\t\topts.database === \"drizzle:mysql\" ||\n\t\t\t\topts.database === \"drizzle:sqlite\" ||\n\t\t\t\topts.database === \"drizzle:pg\"\n\t\t\t) {\n\t\t\t\tawait add_db({\n\t\t\t\t\tdb_code: `drizzleAdapter(db, {\\nprovider: \"${opts.database.replace(\n\t\t\t\t\t\t\"drizzle:\",\n\t\t\t\t\t\t\"\",\n\t\t\t\t\t)}\",\\n})`,\n\t\t\t\t\tdependencies: [\"\"],\n\t\t\t\t\tenvs: [],\n\t\t\t\t\timports: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpath: \"better-auth/adapters/drizzle\",\n\t\t\t\t\t\t\tvariables: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tname: \"drizzleAdapter\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpath: \"./database.ts\",\n\t\t\t\t\t\t\tvariables: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tname: \"db\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t});\n\t\t\t} else if (\n\t\t\t\topts.database === \"prisma:mysql\" ||\n\t\t\t\topts.database === \"prisma:sqlite\" ||\n\t\t\t\topts.database === \"prisma:postgresql\"\n\t\t\t) {\n\t\t\t\tawait add_db({\n\t\t\t\t\tdb_code: `prismaAdapter(client, {\\nprovider: \"${opts.database.replace(\n\t\t\t\t\t\t\"prisma:\",\n\t\t\t\t\t\t\"\",\n\t\t\t\t\t)}\",\\n})`,\n\t\t\t\t\tdependencies: [`@prisma/client`],\n\t\t\t\t\tenvs: [],\n\t\t\t\t\tcode_before_betterAuth: \"const client = new PrismaClient();\",\n\t\t\t\t\timports: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpath: \"better-auth/adapters/prisma\",\n\t\t\t\t\t\t\tvariables: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tname: \"prismaAdapter\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpath: \"@prisma/client\",\n\t\t\t\t\t\t\tvariables: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tname: \"PrismaClient\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t});\n\t\t\t} else if (opts.database === \"mongodb\") {\n\t\t\t\tawait add_db({\n\t\t\t\t\tdb_code: `mongodbAdapter(db)`,\n\t\t\t\t\tdependencies: [\"mongodb\"],\n\t\t\t\t\tenvs: [`DATABASE_URL`],\n\t\t\t\t\tcode_before_betterAuth: [\n\t\t\t\t\t\t`const client = new MongoClient(process.env.DATABASE_URL || \"mongodb://localhost:27017/database\");`,\n\t\t\t\t\t\t`const db = client.db();`,\n\t\t\t\t\t].join(\"\\n\"),\n\t\t\t\t\timports: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpath: \"better-auth/adapters/mongodb\",\n\t\t\t\t\t\t\tvariables: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tname: \"mongodbAdapter\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpath: \"mongodb\",\n\t\t\t\t\t\t\tvariables: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tname: \"MongoClient\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst start_of_betterauth = getGroupInfo(\n\t\t\t\topts.config,\n\t\t\t\tcommon_indexes.START_OF_BETTERAUTH,\n\t\t\t\t{},\n\t\t\t);\n\t\t\tif (!start_of_betterauth) {\n\t\t\t\tthrow new Error(\"Couldn't find start of betterAuth() function.\");\n\t\t\t}\n\t\t\tlet new_content: string;\n\t\t\tnew_content = insertContent({\n\t\t\t\tline: start_of_betterauth.line,\n\t\t\t\tcharacter: start_of_betterauth.character,\n\t\t\t\tcontent: opts.config,\n\t\t\t\tinsert_content: `database: ${database_code_str},`,\n\t\t\t});\n\n\t\t\ttry {\n\t\t\t\tnew_content = await format(new_content);\n\t\t\t\treturn {\n\t\t\t\t\tcode: new_content,\n\t\t\t\t\tdependencies: required_deps,\n\t\t\t\t\tenvs: required_envs,\n\t\t\t\t};\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(error);\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Failed to generate new auth config during database addition phase.`,\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\t};\n\n\tlet new_user_config: string = await format(current_user_config);\n\tconst total_dependencies: string[] = [];\n\tconst total_envs: string[] = [];\n\n\tif (plugins.length !== 0) {\n\t\tconst imports: {\n\t\t\tpath: string;\n\t\t\tvariables: {\n\t\t\t\tasType: boolean;\n\t\t\t\tname: string;\n\t\t\t}[];\n\t\t}[] = [];\n\t\tfor await (const plugin of plugins) {\n\t\t\tconst existingIndex = imports.findIndex((x) => x.path === plugin.path);\n\t\t\tif (existingIndex !== -1) {\n\t\t\t\timports[existingIndex]!.variables.push({\n\t\t\t\t\tname: plugin.name,\n\t\t\t\t\tasType: false,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\timports.push({\n\t\t\t\t\tpath: plugin.path,\n\t\t\t\t\tvariables: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tname: plugin.name,\n\t\t\t\t\t\t\tasType: false,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tif (imports.length !== 0) {\n\t\t\tconst { code, envs, dependencies } = await config_generation.add_import({\n\t\t\t\tconfig: new_user_config,\n\t\t\t\timports: imports,\n\t\t\t});\n\t\t\ttotal_dependencies.push(...dependencies);\n\t\t\ttotal_envs.push(...envs);\n\t\t\tnew_user_config = code;\n\t\t}\n\t}\n\n\tfor await (const plugin of plugins) {\n\t\ttry {\n\t\t\t// console.log(`--------- UPDATE: ${plugin} ---------`);\n\t\t\tlet pluginContents = \"\";\n\t\t\tif (plugin.id === \"magic-link\") {\n\t\t\t\tpluginContents = `{\\nsendMagicLink({ email, token, url }, request) {\\n// Send email with magic link\\n},\\n}`;\n\t\t\t} else if (plugin.id === \"email-otp\") {\n\t\t\t\tpluginContents = `{\\nasync sendVerificationOTP({ email, otp, type }, request) {\\n// Send email with OTP\\n},\\n}`;\n\t\t\t} else if (plugin.id === \"generic-oauth\") {\n\t\t\t\tpluginContents = `{\\nconfig: [],\\n}`;\n\t\t\t} else if (plugin.id === \"oidc\") {\n\t\t\t\tpluginContents = `{\\nloginPage: \"/sign-in\",\\n}`;\n\t\t\t}\n\t\t\tconst { code, dependencies, envs } = await config_generation.add_plugin({\n\t\t\t\tconfig: new_user_config,\n\t\t\t\tdirection_in_plugins_array:\n\t\t\t\t\tplugin.id === \"next-cookies\" ? \"append\" : \"prepend\",\n\t\t\t\tpluginFunctionName: plugin.name,\n\t\t\t\tpluginContents: pluginContents,\n\t\t\t});\n\t\t\tnew_user_config = code;\n\t\t\ttotal_envs.push(...envs);\n\t\t\ttotal_dependencies.push(...dependencies);\n\t\t\t// console.log(new_user_config);\n\t\t\t// console.log(`--------- UPDATE END ---------`);\n\t\t} catch (error: any) {\n\t\t\tspinner.stop(\n\t\t\t\t`Something went wrong while generating/updating your new auth config file.`,\n\t\t\t\t1,\n\t\t\t);\n\t\t\tconsole.error(error.message);\n\t\t\tprocess.exit(1);\n\t\t}\n\t}\n\n\tif (database) {\n\t\ttry {\n\t\t\tconst { code, dependencies, envs } = await config_generation.add_database(\n\t\t\t\t{\n\t\t\t\t\tconfig: new_user_config,\n\t\t\t\t\tdatabase: database,\n\t\t\t\t},\n\t\t\t);\n\t\t\tnew_user_config = code;\n\t\t\ttotal_dependencies.push(...dependencies);\n\t\t\ttotal_envs.push(...envs);\n\t\t} catch (error: any) {\n\t\t\tspinner.stop(\n\t\t\t\t`Something went wrong while generating/updating your new auth config file.`,\n\t\t\t\t1,\n\t\t\t);\n\t\t\tconsole.error(error.message);\n\t\t\tprocess.exit(1);\n\t\t}\n\t}\n\n\treturn {\n\t\tgeneratedCode: new_user_config,\n\t\tdependencies: total_dependencies,\n\t\tenvs: total_envs,\n\t};\n}\n\nfunction findClosingBracket(\n\tcontent: string,\n\tstartIndex: number,\n\topeningBracket: string,\n\tclosingBracket: string,\n): number | null {\n\tlet stack = 0;\n\tlet inString = false; // To track if we are inside a string\n\tlet quoteChar: string | null = null; // To track the type of quote\n\n\tfor (let i = startIndex; i < content.length; i++) {\n\t\tconst char = content[i];\n\n\t\t// Check if we are entering or exiting a string\n\t\tif (char === '\"' || char === \"'\" || char === \"`\") {\n\t\t\tif (!inString) {\n\t\t\t\tinString = true;\n\t\t\t\tquoteChar = char; // Set the quote character\n\t\t\t} else if (char === quoteChar) {\n\t\t\t\tinString = false; // Exiting the string\n\t\t\t\tquoteChar = null; // Reset the quote character\n\t\t\t}\n\t\t\tcontinue; // Skip processing for characters inside strings\n\t\t}\n\n\t\t// If we are not inside a string, check for brackets\n\t\tif (!inString) {\n\t\t\tif (char === openingBracket) {\n\t\t\t\t// console.log(`Found opening bracket:`, stack);\n\t\t\t\tstack++;\n\t\t\t} else if (char === closingBracket) {\n\t\t\t\t// console.log(`Found closing bracket:`, stack, closingBracket, i);\n\t\t\t\tif (stack === 0) {\n\t\t\t\t\treturn i; // Found the matching closing bracket\n\t\t\t\t}\n\t\t\t\tstack--;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn null; // No matching closing bracket found\n}\n\n/**\n * Helper function to insert content at a specific line and character position in a string.\n */\nfunction insertContent(params: {\n\tline: number;\n\tcharacter: number;\n\tcontent: string;\n\tinsert_content: string;\n}): string {\n\tconst { line, character, content, insert_content } = params;\n\n\t// Split the content into lines\n\tconst lines = content.split(\"\\n\");\n\n\t// Check if the specified line number is valid\n\tif (line < 1 || line > lines.length) {\n\t\tthrow new Error(\"Invalid line number\");\n\t}\n\n\t// Adjust for zero-based index\n\tconst targetLineIndex = line - 1;\n\n\t// Check if the specified character index is valid\n\tif (character < 0 || character > lines[targetLineIndex]!.length) {\n\t\tthrow new Error(\"Invalid character index\");\n\t}\n\n\t// Insert the new content at the specified position\n\tconst targetLine = lines[targetLineIndex]!;\n\tconst updatedLine =\n\t\ttargetLine.slice(0, character) +\n\t\tinsert_content +\n\t\ttargetLine.slice(character);\n\tlines[targetLineIndex] = updatedLine;\n\n\t// Join the lines back into a single string\n\treturn lines.join(\"\\n\");\n}\n\n/**\n * Helper function to get the line and character position of a specific group in a string using a CommonIndexConfig.\n */\nfunction getGroupInfo(\n\tcontent: string,\n\tcommonIndexConfig: CommonIndexConfig,\n\tadditionalFields: AdditionalFields,\n): {\n\tline: number;\n\tcharacter: number;\n\tindex: number;\n} | null {\n\tif (commonIndexConfig.type === \"regex\") {\n\t\tconst { regex, getIndex } = commonIndexConfig;\n\t\tconst match = regex.exec(content);\n\t\tif (match) {\n\t\t\tconst matchIndex = match.index;\n\t\t\tconst groupIndex = getIndex({ matchIndex, match, additionalFields });\n\t\t\tif (groupIndex === null) return null;\n\t\t\tconst position = getPosition(content, groupIndex);\n\t\t\treturn {\n\t\t\t\tline: position.line,\n\t\t\t\tcharacter: position.character,\n\t\t\t\tindex: groupIndex,\n\t\t\t};\n\t\t}\n\n\t\treturn null; // Return null if no match is found\n\t} else {\n\t\tconst { getIndex } = commonIndexConfig;\n\t\tconst index = getIndex({ content, additionalFields });\n\t\tif (index === null) return null;\n\n\t\tconst { line, character } = getPosition(content, index);\n\t\treturn {\n\t\t\tline: line,\n\t\t\tcharacter: character,\n\t\t\tindex,\n\t\t};\n\t}\n}\n\n/**\n * Helper function to calculate line and character position based on an index\n */\nconst getPosition = (str: string, index: number) => {\n\tconst lines = str.slice(0, index).split(\"\\n\");\n\treturn {\n\t\tline: lines.length,\n\t\tcharacter: lines[lines.length - 1]!.length,\n\t};\n};\n","import { exec } from \"node:child_process\";\n\nfunction checkCommand(command: string): Promise {\n\treturn new Promise((resolve) => {\n\t\texec(`${command} --version`, (error) => {\n\t\t\tif (error) {\n\t\t\t\tresolve(false); // Command not found or error occurred\n\t\t\t} else {\n\t\t\t\tresolve(true); // Command exists\n\t\t\t}\n\t\t});\n\t});\n}\n\nexport async function checkPackageManagers(): Promise<{\n\thasPnpm: boolean;\n\thasBun: boolean;\n}> {\n\tconst hasPnpm = await checkCommand(\"pnpm\");\n\tconst hasBun = await checkCommand(\"bun\");\n\n\treturn {\n\t\thasPnpm,\n\t\thasBun,\n\t};\n}\n","/**\n * Only supports up to seconds.\n */\nexport function formatMilliseconds(ms: number) {\n\tif (ms < 0) {\n\t\tthrow new Error(\"Milliseconds cannot be negative\");\n\t}\n\tif (ms < 1000) {\n\t\treturn `${ms}ms`;\n\t}\n\n\tconst seconds = Math.floor(ms / 1000);\n\tconst milliseconds = ms % 1000;\n\n\treturn `${seconds}s ${milliseconds}ms`;\n}\n","import { exec } from \"node:child_process\";\n\nexport function installDependencies({\n\tdependencies,\n\tpackageManager,\n\tcwd,\n}: {\n\tdependencies: string[];\n\tpackageManager: \"npm\" | \"pnpm\" | \"bun\" | \"yarn\";\n\tcwd: string;\n}): Promise {\n\tlet installCommand: string;\n\tswitch (packageManager) {\n\t\tcase \"npm\":\n\t\t\tinstallCommand = \"npm install --force\";\n\t\t\tbreak;\n\t\tcase \"pnpm\":\n\t\t\tinstallCommand = \"pnpm install\";\n\t\t\tbreak;\n\t\tcase \"bun\":\n\t\t\tinstallCommand = \"bun install\";\n\t\t\tbreak;\n\t\tcase \"yarn\":\n\t\t\tinstallCommand = \"yarn install\";\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tthrow new Error(\"Invalid package manager\");\n\t}\n\tconst command = `${installCommand} ${dependencies.join(\" \")}`;\n\n\treturn new Promise((resolve, reject) => {\n\t\texec(command, { cwd }, (error, stdout, stderr) => {\n\t\t\tif (error) {\n\t\t\t\treject(new Error(stderr));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tresolve(true);\n\t\t});\n\t});\n}\n","import Crypto from \"node:crypto\";\nimport chalk from \"chalk\";\nimport { Command } from \"commander\";\n\nexport const generateSecret = new Command(\"secret\").action(() => {\n\tconst secret = generateSecretHash();\n\tconsole.log(`\\nAdd the following to your .env file: \n${\n\tchalk.gray(\"# Auth Secret\") + chalk.green(`\\nBETTER_AUTH_SECRET=${secret}`)\n}`);\n});\n\nexport const generateSecretHash = () => {\n\treturn Crypto.randomBytes(32).toString(\"hex\");\n};\n","import { existsSync } from \"node:fs\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport {\n\tcancel,\n\tconfirm,\n\tintro,\n\tisCancel,\n\tlog,\n\tmultiselect,\n\toutro,\n\tselect,\n\tspinner,\n\ttext,\n} from \"@clack/prompts\";\nimport chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport { parse } from \"dotenv\";\nimport { format as prettierFormat } from \"prettier\";\nimport semver from \"semver\";\nimport * as z from \"zod/v4\";\nimport { generateAuthConfig } from \"../generators/auth-config\";\nimport { checkPackageManagers } from \"../utils/check-package-managers\";\nimport { formatMilliseconds } from \"../utils/format-ms\";\nimport { getPackageInfo } from \"../utils/get-package-info\";\nimport { getTsconfigInfo } from \"../utils/get-tsconfig-info\";\nimport { installDependencies } from \"../utils/install-dependencies\";\nimport { generateSecretHash } from \"./secret\";\n\n/**\n * Should only use any database that is core DBs, and supports the Better Auth CLI generate functionality.\n */\nconst supportedDatabases = [\n\t// Built-in kysely\n\t\"sqlite\",\n\t\"mysql\",\n\t\"mssql\",\n\t\"postgres\",\n\t// Drizzle\n\t\"drizzle:pg\",\n\t\"drizzle:mysql\",\n\t\"drizzle:sqlite\",\n\t// Prisma\n\t\"prisma:postgresql\",\n\t\"prisma:mysql\",\n\t\"prisma:sqlite\",\n\t// Mongo\n\t\"mongodb\",\n] as const;\n\nexport type SupportedDatabases = (typeof supportedDatabases)[number];\n\nconst supportedPlugins = [\n\t{\n\t\tid: \"two-factor\",\n\t\tname: \"twoFactor\",\n\t\tpath: `better-auth/plugins`,\n\t\tclientName: \"twoFactorClient\",\n\t\tclientPath: \"better-auth/client/plugins\",\n\t},\n\t{\n\t\tid: \"username\",\n\t\tname: \"username\",\n\t\tclientName: \"usernameClient\",\n\t\tpath: `better-auth/plugins`,\n\t\tclientPath: \"better-auth/client/plugins\",\n\t},\n\t{\n\t\tid: \"anonymous\",\n\t\tname: \"anonymous\",\n\t\tclientName: \"anonymousClient\",\n\t\tpath: `better-auth/plugins`,\n\t\tclientPath: \"better-auth/client/plugins\",\n\t},\n\t{\n\t\tid: \"phone-number\",\n\t\tname: \"phoneNumber\",\n\t\tclientName: \"phoneNumberClient\",\n\t\tpath: `better-auth/plugins`,\n\t\tclientPath: \"better-auth/client/plugins\",\n\t},\n\t{\n\t\tid: \"magic-link\",\n\t\tname: \"magicLink\",\n\t\tclientName: \"magicLinkClient\",\n\t\tclientPath: \"better-auth/client/plugins\",\n\t\tpath: `better-auth/plugins`,\n\t},\n\t{\n\t\tid: \"email-otp\",\n\t\tname: \"emailOTP\",\n\t\tclientName: \"emailOTPClient\",\n\t\tpath: `better-auth/plugins`,\n\t\tclientPath: \"better-auth/client/plugins\",\n\t},\n\t{\n\t\tid: \"passkey\",\n\t\tname: \"passkey\",\n\t\tclientName: \"passkeyClient\",\n\t\tpath: `@better-auth/passkey`,\n\t\tclientPath: \"@better-auth/passkey/client\",\n\t},\n\t{\n\t\tid: \"generic-oauth\",\n\t\tname: \"genericOAuth\",\n\t\tclientName: \"genericOAuthClient\",\n\t\tpath: `better-auth/plugins`,\n\t\tclientPath: \"better-auth/client/plugins\",\n\t},\n\t{\n\t\tid: \"one-tap\",\n\t\tname: \"oneTap\",\n\t\tclientName: \"oneTapClient\",\n\t\tpath: `better-auth/plugins`,\n\t\tclientPath: \"better-auth/client/plugins\",\n\t},\n\t{\n\t\tid: \"api-key\",\n\t\tname: \"apiKey\",\n\t\tclientName: \"apiKeyClient\",\n\t\tpath: `better-auth/plugins`,\n\t\tclientPath: \"better-auth/client/plugins\",\n\t},\n\t{\n\t\tid: \"admin\",\n\t\tname: \"admin\",\n\t\tclientName: \"adminClient\",\n\t\tpath: `better-auth/plugins`,\n\t\tclientPath: \"better-auth/client/plugins\",\n\t},\n\t{\n\t\tid: \"organization\",\n\t\tname: \"organization\",\n\t\tclientName: \"organizationClient\",\n\t\tpath: `better-auth/plugins`,\n\t\tclientPath: \"better-auth/client/plugins\",\n\t},\n\t{\n\t\tid: \"oidc\",\n\t\tname: \"oidcProvider\",\n\t\tclientName: \"oidcClient\",\n\t\tpath: `better-auth/plugins`,\n\t\tclientPath: \"better-auth/client/plugins\",\n\t},\n\t{\n\t\tid: \"sso\",\n\t\tname: \"sso\",\n\t\tclientName: \"ssoClient\",\n\t\tpath: `@better-auth/sso`,\n\t\tclientPath: \"@better-auth/sso/client\",\n\t},\n\t{\n\t\tid: \"bearer\",\n\t\tname: \"bearer\",\n\t\tclientName: undefined,\n\t\tpath: `better-auth/plugins`,\n\t\tclientPath: undefined,\n\t},\n\t{\n\t\tid: \"multi-session\",\n\t\tname: \"multiSession\",\n\t\tclientName: \"multiSessionClient\",\n\t\tpath: `better-auth/plugins`,\n\t\tclientPath: \"better-auth/client/plugins\",\n\t},\n\t{\n\t\tid: \"oauth-provider\",\n\t\tname: \"oauthProvider\",\n\t\tclientName: \"oauthProviderClient\",\n\t\tpath: `@better-auth/oauth-provider`,\n\t\tclientPath: \"@better-auth/oauth-provider/client\",\n\t},\n\t{\n\t\tid: \"oauth-provider-resource-client\",\n\t\tname: \"oauthProviderResource\",\n\t\tclientName: \"oauthProviderResourceClient\",\n\t\tpath: `@better-auth/oauth-provider`,\n\t\tclientPath: \"@better-auth/oauth-provider/client\",\n\t},\n\t{\n\t\tid: \"oauth-proxy\",\n\t\tname: \"oAuthProxy\",\n\t\tclientName: undefined,\n\t\tpath: `better-auth/plugins`,\n\t\tclientPath: undefined,\n\t},\n\t{\n\t\tid: \"open-api\",\n\t\tname: \"openAPI\",\n\t\tclientName: undefined,\n\t\tpath: `better-auth/plugins`,\n\t\tclientPath: undefined,\n\t},\n\t{\n\t\tid: \"jwt\",\n\t\tname: \"jwt\",\n\t\tclientName: undefined,\n\t\tclientPath: undefined,\n\t\tpath: `better-auth/plugins`,\n\t},\n\t{\n\t\tid: \"next-cookies\",\n\t\tname: \"nextCookies\",\n\t\tclientPath: undefined,\n\t\tclientName: undefined,\n\t\tpath: `better-auth/next-js`,\n\t},\n] as const;\n\nexport type SupportedPlugin = (typeof supportedPlugins)[number];\n\nconst defaultFormatOptions = {\n\ttrailingComma: \"all\" as const,\n\tuseTabs: false,\n\ttabWidth: 4,\n};\n\nconst getDefaultAuthConfig = async ({ appName }: { appName?: string }) =>\n\tawait prettierFormat(\n\t\t[\n\t\t\t\"import { betterAuth } from 'better-auth';\",\n\t\t\t\"\",\n\t\t\t\"export const auth = betterAuth({\",\n\t\t\tappName ? `appName: \"${appName}\",` : \"\",\n\t\t\t\"plugins: [],\",\n\t\t\t\"});\",\n\t\t].join(\"\\n\"),\n\t\t{\n\t\t\tfilepath: \"auth.ts\",\n\t\t\t...defaultFormatOptions,\n\t\t},\n\t);\n\ntype SupportedFrameworks =\n\t| \"vanilla\"\n\t| \"react\"\n\t| \"vue\"\n\t| \"svelte\"\n\t| \"solid\"\n\t| \"nextjs\";\n\ntype Import = {\n\tpath: string;\n\tvariables:\n\t\t| { asType?: boolean; name: string; as?: string }[]\n\t\t| { asType?: boolean; name: string; as?: string };\n};\n\nconst getDefaultAuthClientConfig = async ({\n\tauth_config_path,\n\tframework,\n\tclientPlugins,\n}: {\n\tframework: SupportedFrameworks;\n\tauth_config_path: string;\n\tclientPlugins: {\n\t\tid: string;\n\t\tname: string;\n\t\tcontents: string;\n\t\timports: Import[];\n\t}[];\n}) => {\n\tfunction groupImportVariables(): Import[] {\n\t\tconst result: Import[] = [\n\t\t\t{\n\t\t\t\tpath: \"better-auth/client/plugins\",\n\t\t\t\tvariables: [{ name: \"inferAdditionalFields\" }],\n\t\t\t},\n\t\t];\n\t\tfor (const plugin of clientPlugins) {\n\t\t\tfor (const import_ of plugin.imports) {\n\t\t\t\tif (Array.isArray(import_.variables)) {\n\t\t\t\t\tfor (const variable of import_.variables) {\n\t\t\t\t\t\tconst existingIndex = result.findIndex(\n\t\t\t\t\t\t\t(x) => x.path === import_.path,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (existingIndex !== -1) {\n\t\t\t\t\t\t\tconst vars = result[existingIndex]!.variables;\n\t\t\t\t\t\t\tif (Array.isArray(vars)) {\n\t\t\t\t\t\t\t\tvars.push(variable);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tresult[existingIndex]!.variables = [vars, variable];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tresult.push({\n\t\t\t\t\t\t\t\tpath: import_.path,\n\t\t\t\t\t\t\t\tvariables: [variable],\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconst existingIndex = result.findIndex(\n\t\t\t\t\t\t(x) => x.path === import_.path,\n\t\t\t\t\t);\n\t\t\t\t\tif (existingIndex !== -1) {\n\t\t\t\t\t\tconst vars = result[existingIndex]!.variables;\n\t\t\t\t\t\tif (Array.isArray(vars)) {\n\t\t\t\t\t\t\tvars.push(import_.variables);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tresult[existingIndex]!.variables = [vars, import_.variables];\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresult.push({\n\t\t\t\t\t\t\tpath: import_.path,\n\t\t\t\t\t\t\tvariables: [import_.variables],\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\tconst imports = groupImportVariables();\n\tlet importString = \"\";\n\tfor (const import_ of imports) {\n\t\tif (Array.isArray(import_.variables)) {\n\t\t\timportString += `import { ${import_.variables\n\t\t\t\t.map(\n\t\t\t\t\t(x) =>\n\t\t\t\t\t\t`${x.asType ? \"type \" : \"\"}${x.name}${x.as ? ` as ${x.as}` : \"\"}`,\n\t\t\t\t)\n\t\t\t\t.join(\", \")} } from \"${import_.path}\";\\n`;\n\t\t} else {\n\t\t\timportString += `import ${import_.variables.asType ? \"type \" : \"\"}${\n\t\t\t\timport_.variables.name\n\t\t\t}${import_.variables.as ? ` as ${import_.variables.as}` : \"\"} from \"${\n\t\t\t\timport_.path\n\t\t\t}\";\\n`;\n\t\t}\n\t}\n\n\treturn await prettierFormat(\n\t\t[\n\t\t\t`import { createAuthClient } from \"better-auth/${\n\t\t\t\tframework === \"nextjs\"\n\t\t\t\t\t? \"react\"\n\t\t\t\t\t: framework === \"vanilla\"\n\t\t\t\t\t\t? \"client\"\n\t\t\t\t\t\t: framework\n\t\t\t}\";`,\n\t\t\t`import type { auth } from \"${auth_config_path}\";`,\n\t\t\timportString,\n\t\t\t``,\n\t\t\t`export const authClient = createAuthClient({`,\n\t\t\t`baseURL: \"http://localhost:3000\",`,\n\t\t\t`plugins: [inferAdditionalFields(),${clientPlugins\n\t\t\t\t.map((x) => `${x.name}(${x.contents})`)\n\t\t\t\t.join(\", \")}],`,\n\t\t\t`});`,\n\t\t].join(\"\\n\"),\n\t\t{\n\t\t\tfilepath: \"auth-client.ts\",\n\t\t\t...defaultFormatOptions,\n\t\t},\n\t);\n};\n\nconst optionsSchema = z.object({\n\tcwd: z.string(),\n\tconfig: z.string().optional(),\n\tdatabase: z.enum(supportedDatabases).optional(),\n\t\"skip-db\": z.boolean().optional(),\n\t\"skip-plugins\": z.boolean().optional(),\n\t\"package-manager\": z.string().optional(),\n\ttsconfig: z.string().optional(),\n});\n\nconst outroText = `🄳 All Done, Happy Hacking!`;\n\nasync function initAction(opts: any) {\n\tconsole.log();\n\tintro(\"šŸ‘‹ Initializing Better Auth\");\n\n\tconst options = optionsSchema.parse(opts);\n\n\tconst cwd = path.resolve(options.cwd);\n\tlet packageManagerPreference: \"bun\" | \"pnpm\" | \"yarn\" | \"npm\" | undefined =\n\t\tundefined;\n\n\tlet config_path: string = \"\";\n\tlet framework: SupportedFrameworks = \"vanilla\";\n\n\tconst format = async (code: string) =>\n\t\tawait prettierFormat(code, {\n\t\t\tfilepath: config_path,\n\t\t\t...defaultFormatOptions,\n\t\t});\n\n\t// ===== package.json =====\n\tlet packageInfo: Record;\n\ttry {\n\t\tpackageInfo = getPackageInfo(cwd);\n\t} catch (error) {\n\t\tlog.error(`āŒ Couldn't read your package.json file. (dir: ${cwd})`);\n\t\tlog.error(JSON.stringify(error, null, 2));\n\t\tprocess.exit(1);\n\t}\n\n\t// ===== ENV files =====\n\tconst envFiles = await getEnvFiles(cwd);\n\tif (!envFiles.length) {\n\t\toutro(\"āŒ No .env files found. Please create an env file first.\");\n\t\tprocess.exit(0);\n\t}\n\tlet targetEnvFile: string;\n\tif (envFiles.includes(\".env\")) targetEnvFile = \".env\";\n\telse if (envFiles.includes(\".env.local\")) targetEnvFile = \".env.local\";\n\telse if (envFiles.includes(\".env.development\"))\n\t\ttargetEnvFile = \".env.development\";\n\telse if (envFiles.length === 1) targetEnvFile = envFiles[0]!;\n\telse targetEnvFile = \"none\";\n\n\t// ===== tsconfig.json =====\n\tlet tsconfigInfo: Record;\n\ttry {\n\t\tconst tsconfigPath =\n\t\t\toptions.tsconfig !== undefined\n\t\t\t\t? path.resolve(cwd, options.tsconfig)\n\t\t\t\t: path.join(cwd, \"tsconfig.json\");\n\n\t\ttsconfigInfo = await getTsconfigInfo(cwd, tsconfigPath);\n\t} catch (error) {\n\t\tlog.error(`āŒ Couldn't read your tsconfig.json file. (dir: ${cwd})`);\n\t\tconsole.error(error);\n\t\tprocess.exit(1);\n\t}\n\tif (\n\t\t!(\n\t\t\t\"compilerOptions\" in tsconfigInfo &&\n\t\t\t\"strict\" in tsconfigInfo.compilerOptions &&\n\t\t\ttsconfigInfo.compilerOptions.strict === true\n\t\t)\n\t) {\n\t\tlog.warn(\n\t\t\t`Better Auth requires your tsconfig.json to have \"compilerOptions.strict\" set to true.`,\n\t\t);\n\t\tconst shouldAdd = await confirm({\n\t\t\tmessage: `Would you like us to set ${chalk.bold(\n\t\t\t\t`strict`,\n\t\t\t)} to ${chalk.bold(`true`)}?`,\n\t\t});\n\t\tif (isCancel(shouldAdd)) {\n\t\t\tcancel(`āœ‹ Operation cancelled.`);\n\t\t\tprocess.exit(0);\n\t\t}\n\t\tif (shouldAdd) {\n\t\t\ttry {\n\t\t\t\tawait fs.writeFile(\n\t\t\t\t\tpath.join(cwd, \"tsconfig.json\"),\n\t\t\t\t\tawait prettierFormat(\n\t\t\t\t\t\tJSON.stringify(\n\t\t\t\t\t\t\tObject.assign(tsconfigInfo, {\n\t\t\t\t\t\t\t\tcompilerOptions: {\n\t\t\t\t\t\t\t\t\tstrict: true,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t),\n\t\t\t\t\t\t{ filepath: \"tsconfig.json\", ...defaultFormatOptions },\n\t\t\t\t\t),\n\t\t\t\t\t\"utf-8\",\n\t\t\t\t);\n\t\t\t\tlog.success(`šŸš€ tsconfig.json successfully updated!`);\n\t\t\t} catch (error) {\n\t\t\t\tlog.error(\n\t\t\t\t\t`Failed to add \"compilerOptions.strict\" to your tsconfig.json file.`,\n\t\t\t\t);\n\t\t\t\tconsole.error(error);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t}\n\t}\n\n\t// ===== install better-auth =====\n\tconst s = spinner({ indicator: \"dots\" });\n\ts.start(`Checking better-auth installation`);\n\n\tlet latest_betterauth_version: string;\n\ttry {\n\t\tlatest_betterauth_version = await getLatestNpmVersion(\"better-auth\");\n\t} catch (error) {\n\t\tlog.error(`āŒ Couldn't get latest version of better-auth.`);\n\t\tconsole.error(error);\n\t\tprocess.exit(1);\n\t}\n\n\tif (\n\t\t!packageInfo.dependencies ||\n\t\t!Object.keys(packageInfo.dependencies).includes(\"better-auth\")\n\t) {\n\t\ts.stop(\"Finished fetching latest version of better-auth.\");\n\t\tconst s2 = spinner({ indicator: \"dots\" });\n\t\tconst shouldInstallBetterAuthDep = await confirm({\n\t\t\tmessage: `Would you like to install Better Auth?`,\n\t\t});\n\t\tif (isCancel(shouldInstallBetterAuthDep)) {\n\t\t\tcancel(`āœ‹ Operation cancelled.`);\n\t\t\tprocess.exit(0);\n\t\t}\n\t\tif (packageManagerPreference === undefined) {\n\t\t\tpackageManagerPreference = await getPackageManager();\n\t\t}\n\t\tif (shouldInstallBetterAuthDep) {\n\t\t\ts2.start(\n\t\t\t\t`Installing Better Auth using ${chalk.bold(packageManagerPreference)}`,\n\t\t\t);\n\t\t\ttry {\n\t\t\t\tconst start = Date.now();\n\t\t\t\tawait installDependencies({\n\t\t\t\t\tdependencies: [\"better-auth@latest\"],\n\t\t\t\t\tpackageManager: packageManagerPreference,\n\t\t\t\t\tcwd: cwd,\n\t\t\t\t});\n\t\t\t\ts2.stop(\n\t\t\t\t\t`Better Auth installed ${chalk.greenBright(\n\t\t\t\t\t\t`successfully`,\n\t\t\t\t\t)}! ${chalk.gray(`(${formatMilliseconds(Date.now() - start)})`)}`,\n\t\t\t\t);\n\t\t\t} catch (error: any) {\n\t\t\t\ts2.stop(`Failed to install Better Auth:`);\n\t\t\t\tconsole.error(error);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t}\n\t} else if (\n\t\tpackageInfo.dependencies[\"better-auth\"] !== \"workspace:*\" &&\n\t\tsemver.lt(\n\t\t\tsemver.coerce(packageInfo.dependencies[\"better-auth\"])?.toString()!,\n\t\t\tsemver.clean(latest_betterauth_version)!,\n\t\t)\n\t) {\n\t\ts.stop(\"Finished fetching latest version of better-auth.\");\n\t\tconst shouldInstallBetterAuthDep = await confirm({\n\t\t\tmessage: `Your current Better Auth dependency is out-of-date. Would you like to update it? (${chalk.bold(\n\t\t\t\tpackageInfo.dependencies[\"better-auth\"],\n\t\t\t)} → ${chalk.bold(`v${latest_betterauth_version}`)})`,\n\t\t});\n\t\tif (isCancel(shouldInstallBetterAuthDep)) {\n\t\t\tcancel(`āœ‹ Operation cancelled.`);\n\t\t\tprocess.exit(0);\n\t\t}\n\t\tif (shouldInstallBetterAuthDep) {\n\t\t\tif (packageManagerPreference === undefined) {\n\t\t\t\tpackageManagerPreference = await getPackageManager();\n\t\t\t}\n\t\t\tconst s = spinner({ indicator: \"dots\" });\n\t\t\ts.start(\n\t\t\t\t`Updating Better Auth using ${chalk.bold(packageManagerPreference)}`,\n\t\t\t);\n\t\t\ttry {\n\t\t\t\tconst start = Date.now();\n\t\t\t\tawait installDependencies({\n\t\t\t\t\tdependencies: [\"better-auth@latest\"],\n\t\t\t\t\tpackageManager: packageManagerPreference,\n\t\t\t\t\tcwd: cwd,\n\t\t\t\t});\n\t\t\t\ts.stop(\n\t\t\t\t\t`Better Auth updated ${chalk.greenBright(\n\t\t\t\t\t\t`successfully`,\n\t\t\t\t\t)}! ${chalk.gray(`(${formatMilliseconds(Date.now() - start)})`)}`,\n\t\t\t\t);\n\t\t\t} catch (error: any) {\n\t\t\t\ts.stop(`Failed to update Better Auth:`);\n\t\t\t\tlog.error(error.message);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t}\n\t} else {\n\t\ts.stop(`Better Auth dependencies are ${chalk.greenBright(`up to date`)}!`);\n\t}\n\n\t// ===== appName =====\n\n\tconst packageJson = getPackageInfo(cwd);\n\tlet appName: string;\n\tif (!packageJson.name) {\n\t\tconst newAppName = await text({\n\t\t\tmessage: \"What is the name of your application?\",\n\t\t});\n\t\tif (isCancel(newAppName)) {\n\t\t\tcancel(\"āœ‹ Operation cancelled.\");\n\t\t\tprocess.exit(0);\n\t\t}\n\t\tappName = newAppName;\n\t} else {\n\t\tappName = packageJson.name;\n\t}\n\n\t// ===== config path =====\n\n\tlet possiblePaths = [\"auth.ts\", \"auth.tsx\", \"auth.js\", \"auth.jsx\"];\n\tpossiblePaths = [\n\t\t...possiblePaths,\n\t\t...possiblePaths.map((it) => `lib/server/${it}`),\n\t\t...possiblePaths.map((it) => `server/${it}`),\n\t\t...possiblePaths.map((it) => `lib/${it}`),\n\t\t...possiblePaths.map((it) => `utils/${it}`),\n\t];\n\tpossiblePaths = [\n\t\t...possiblePaths,\n\t\t...possiblePaths.map((it) => `src/${it}`),\n\t\t...possiblePaths.map((it) => `app/${it}`),\n\t];\n\n\tif (options.config) {\n\t\tconfig_path = path.join(cwd, options.config);\n\t} else {\n\t\tfor (const possiblePath of possiblePaths) {\n\t\t\tconst doesExist = existsSync(path.join(cwd, possiblePath));\n\t\t\tif (doesExist) {\n\t\t\t\tconfig_path = path.join(cwd, possiblePath);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// ===== create auth config =====\n\tlet current_user_config = \"\";\n\tlet database: SupportedDatabases | null = null;\n\tlet add_plugins: SupportedPlugin[] = [];\n\n\tif (!config_path) {\n\t\tconst shouldCreateAuthConfig = await select({\n\t\t\tmessage: `Would you like to create an auth config file?`,\n\t\t\toptions: [\n\t\t\t\t{ label: \"Yes\", value: \"yes\" },\n\t\t\t\t{ label: \"No\", value: \"no\" },\n\t\t\t],\n\t\t});\n\t\tif (isCancel(shouldCreateAuthConfig)) {\n\t\t\tcancel(`āœ‹ Operation cancelled.`);\n\t\t\tprocess.exit(0);\n\t\t}\n\t\tif (shouldCreateAuthConfig === \"yes\") {\n\t\t\tconst shouldSetupDb = await confirm({\n\t\t\t\tmessage: `Would you like to set up your ${chalk.bold(`database`)}?`,\n\t\t\t\tinitialValue: true,\n\t\t\t});\n\t\t\tif (isCancel(shouldSetupDb)) {\n\t\t\t\tcancel(`āœ‹ Operating cancelled.`);\n\t\t\t\tprocess.exit(0);\n\t\t\t}\n\t\t\tif (shouldSetupDb) {\n\t\t\t\tconst prompted_database = await select({\n\t\t\t\t\tmessage: \"Choose a Database Dialect\",\n\t\t\t\t\toptions: supportedDatabases.map((it) => ({ value: it, label: it })),\n\t\t\t\t});\n\t\t\t\tif (isCancel(prompted_database)) {\n\t\t\t\t\tcancel(`āœ‹ Operating cancelled.`);\n\t\t\t\t\tprocess.exit(0);\n\t\t\t\t}\n\t\t\t\tdatabase = prompted_database;\n\t\t\t}\n\n\t\t\tif (options[\"skip-plugins\"] !== false) {\n\t\t\t\tconst shouldSetupPlugins = await confirm({\n\t\t\t\t\tmessage: `Would you like to set up ${chalk.bold(`plugins`)}?`,\n\t\t\t\t});\n\t\t\t\tif (isCancel(shouldSetupPlugins)) {\n\t\t\t\t\tcancel(`āœ‹ Operating cancelled.`);\n\t\t\t\t\tprocess.exit(0);\n\t\t\t\t}\n\t\t\t\tif (shouldSetupPlugins) {\n\t\t\t\t\tconst prompted_plugins = await multiselect({\n\t\t\t\t\t\tmessage: \"Select your new plugins\",\n\t\t\t\t\t\toptions: supportedPlugins\n\t\t\t\t\t\t\t.filter((x) => x.id !== \"next-cookies\")\n\t\t\t\t\t\t\t.map((x) => ({ value: x.id, label: x.id })),\n\t\t\t\t\t\trequired: false,\n\t\t\t\t\t});\n\t\t\t\t\tif (isCancel(prompted_plugins)) {\n\t\t\t\t\t\tcancel(`āœ‹ Operating cancelled.`);\n\t\t\t\t\t\tprocess.exit(0);\n\t\t\t\t\t}\n\t\t\t\t\tadd_plugins = prompted_plugins.map(\n\t\t\t\t\t\t(x) => supportedPlugins.find((y) => y.id === x)!,\n\t\t\t\t\t);\n\n\t\t\t\t\tconst possible_next_config_paths = [\n\t\t\t\t\t\t\"next.config.js\",\n\t\t\t\t\t\t\"next.config.ts\",\n\t\t\t\t\t\t\"next.config.mjs\",\n\t\t\t\t\t\t\".next/server/next.config.js\",\n\t\t\t\t\t\t\".next/server/next.config.ts\",\n\t\t\t\t\t\t\".next/server/next.config.mjs\",\n\t\t\t\t\t];\n\t\t\t\t\tfor (const possible_next_config_path of possible_next_config_paths) {\n\t\t\t\t\t\tif (existsSync(path.join(cwd, possible_next_config_path))) {\n\t\t\t\t\t\t\tframework = \"nextjs\";\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (framework === \"nextjs\") {\n\t\t\t\t\t\tconst result = await confirm({\n\t\t\t\t\t\t\tmessage: `It looks like you're using NextJS. Do you want to add the next-cookies plugin? ${chalk.bold(\n\t\t\t\t\t\t\t\t`(Recommended)`,\n\t\t\t\t\t\t\t)}`,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tif (isCancel(result)) {\n\t\t\t\t\t\t\tcancel(`āœ‹ Operating cancelled.`);\n\t\t\t\t\t\t\tprocess.exit(0);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (result) {\n\t\t\t\t\t\t\tadd_plugins.push(\n\t\t\t\t\t\t\t\tsupportedPlugins.find((x) => x.id === \"next-cookies\")!,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst filePath = path.join(cwd, \"auth.ts\");\n\t\t\tconfig_path = filePath;\n\t\t\tlog.info(`Creating auth config file: ${filePath}`);\n\t\t\ttry {\n\t\t\t\tcurrent_user_config = await getDefaultAuthConfig({\n\t\t\t\t\tappName,\n\t\t\t\t});\n\t\t\t\tconst { dependencies, envs, generatedCode } = await generateAuthConfig({\n\t\t\t\t\tcurrent_user_config,\n\t\t\t\t\tformat,\n\t\t\t\t\t//@ts-expect-error\n\t\t\t\t\ts,\n\t\t\t\t\tplugins: add_plugins,\n\t\t\t\t\tdatabase,\n\t\t\t\t});\n\t\t\t\tcurrent_user_config = generatedCode;\n\t\t\t\tawait fs.writeFile(filePath, current_user_config);\n\t\t\t\tconfig_path = filePath;\n\t\t\t\tlog.success(`šŸš€ Auth config file successfully created!`);\n\n\t\t\t\tif (envs.length !== 0) {\n\t\t\t\t\tlog.info(\n\t\t\t\t\t\t`There are ${envs.length} environment variables for your database of choice.`,\n\t\t\t\t\t);\n\t\t\t\t\tconst shouldUpdateEnvs = await confirm({\n\t\t\t\t\t\tmessage: `Would you like us to update your ENV files?`,\n\t\t\t\t\t});\n\t\t\t\t\tif (isCancel(shouldUpdateEnvs)) {\n\t\t\t\t\t\tcancel(\"āœ‹ Operation cancelled.\");\n\t\t\t\t\t\tprocess.exit(0);\n\t\t\t\t\t}\n\t\t\t\t\tif (shouldUpdateEnvs) {\n\t\t\t\t\t\tconst filesToUpdate = await multiselect({\n\t\t\t\t\t\t\tmessage: \"Select the .env files you want to update\",\n\t\t\t\t\t\t\toptions: envFiles.map((x) => ({\n\t\t\t\t\t\t\t\tvalue: path.join(cwd, x),\n\t\t\t\t\t\t\t\tlabel: x,\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\trequired: false,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tif (isCancel(filesToUpdate)) {\n\t\t\t\t\t\t\tcancel(\"āœ‹ Operation cancelled.\");\n\t\t\t\t\t\t\tprocess.exit(0);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (filesToUpdate.length === 0) {\n\t\t\t\t\t\t\tlog.info(\"No .env files to update. Skipping...\");\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tawait updateEnvs({\n\t\t\t\t\t\t\t\t\tfiles: filesToUpdate,\n\t\t\t\t\t\t\t\t\tenvs,\n\t\t\t\t\t\t\t\t\tisCommented: true,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\tlog.error(`Failed to update .env files:`);\n\t\t\t\t\t\t\t\tlog.error(JSON.stringify(error, null, 2));\n\t\t\t\t\t\t\t\tprocess.exit(1);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tlog.success(`šŸš€ ENV files successfully updated!`);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (dependencies.length !== 0) {\n\t\t\t\t\tlog.info(\n\t\t\t\t\t\t`There are ${\n\t\t\t\t\t\t\tdependencies.length\n\t\t\t\t\t\t} dependencies to install. (${dependencies\n\t\t\t\t\t\t\t.map((x) => chalk.green(x))\n\t\t\t\t\t\t\t.join(\", \")})`,\n\t\t\t\t\t);\n\t\t\t\t\tconst shouldInstallDeps = await confirm({\n\t\t\t\t\t\tmessage: `Would you like us to install dependencies?`,\n\t\t\t\t\t});\n\t\t\t\t\tif (isCancel(shouldInstallDeps)) {\n\t\t\t\t\t\tcancel(\"āœ‹ Operation cancelled.\");\n\t\t\t\t\t\tprocess.exit(0);\n\t\t\t\t\t}\n\t\t\t\t\tif (shouldInstallDeps) {\n\t\t\t\t\t\tconst s = spinner({ indicator: \"dots\" });\n\t\t\t\t\t\tif (packageManagerPreference === undefined) {\n\t\t\t\t\t\t\tpackageManagerPreference = await getPackageManager();\n\t\t\t\t\t\t}\n\t\t\t\t\t\ts.start(\n\t\t\t\t\t\t\t`Installing dependencies using ${chalk.bold(\n\t\t\t\t\t\t\t\tpackageManagerPreference,\n\t\t\t\t\t\t\t)}...`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst start = Date.now();\n\t\t\t\t\t\t\tawait installDependencies({\n\t\t\t\t\t\t\t\tdependencies: dependencies,\n\t\t\t\t\t\t\t\tpackageManager: packageManagerPreference,\n\t\t\t\t\t\t\t\tcwd: cwd,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\ts.stop(\n\t\t\t\t\t\t\t\t`Dependencies installed ${chalk.greenBright(\n\t\t\t\t\t\t\t\t\t`successfully`,\n\t\t\t\t\t\t\t\t)} ${chalk.gray(\n\t\t\t\t\t\t\t\t\t`(${formatMilliseconds(Date.now() - start)})`,\n\t\t\t\t\t\t\t\t)}`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} catch (error: any) {\n\t\t\t\t\t\t\ts.stop(\n\t\t\t\t\t\t\t\t`Failed to install dependencies using ${packageManagerPreference}:`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tlog.error(error.message);\n\t\t\t\t\t\t\tprocess.exit(1);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tlog.error(`Failed to create auth config file: ${filePath}`);\n\t\t\t\tconsole.error(error);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t} else if (shouldCreateAuthConfig === \"no\") {\n\t\t\tlog.info(`Skipping auth config file creation.`);\n\t\t}\n\t} else {\n\t\tlog.message();\n\t\tlog.success(`Found auth config file. ${chalk.gray(`(${config_path})`)}`);\n\t\tlog.message();\n\t}\n\n\t// ===== auth client path =====\n\n\tlet possibleClientPaths = [\n\t\t\"auth-client.ts\",\n\t\t\"auth-client.tsx\",\n\t\t\"auth-client.js\",\n\t\t\"auth-client.jsx\",\n\t\t\"client.ts\",\n\t\t\"client.tsx\",\n\t\t\"client.js\",\n\t\t\"client.jsx\",\n\t];\n\tpossibleClientPaths = [\n\t\t...possibleClientPaths,\n\t\t...possibleClientPaths.map((it) => `lib/server/${it}`),\n\t\t...possibleClientPaths.map((it) => `server/${it}`),\n\t\t...possibleClientPaths.map((it) => `lib/${it}`),\n\t\t...possibleClientPaths.map((it) => `utils/${it}`),\n\t];\n\tpossibleClientPaths = [\n\t\t...possibleClientPaths,\n\t\t...possibleClientPaths.map((it) => `src/${it}`),\n\t\t...possibleClientPaths.map((it) => `app/${it}`),\n\t];\n\n\tlet authClientConfigPath: string | null = null;\n\tfor (const possiblePath of possibleClientPaths) {\n\t\tconst doesExist = existsSync(path.join(cwd, possiblePath));\n\t\tif (doesExist) {\n\t\t\tauthClientConfigPath = path.join(cwd, possiblePath);\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (!authClientConfigPath) {\n\t\tconst choice = await select({\n\t\t\tmessage: `Would you like to create an auth client config file?`,\n\t\t\toptions: [\n\t\t\t\t{ label: \"Yes\", value: \"yes\" },\n\t\t\t\t{ label: \"No\", value: \"no\" },\n\t\t\t],\n\t\t});\n\t\tif (isCancel(choice)) {\n\t\t\tcancel(`āœ‹ Operation cancelled.`);\n\t\t\tprocess.exit(0);\n\t\t}\n\t\tif (choice === \"yes\") {\n\t\t\tauthClientConfigPath = path.join(cwd, \"auth-client.ts\");\n\t\t\tlog.info(`Creating auth client config file: ${authClientConfigPath}`);\n\t\t\ttry {\n\t\t\t\tconst contents = await getDefaultAuthClientConfig({\n\t\t\t\t\tauth_config_path: (\n\t\t\t\t\t\t\"./\" + path.join(config_path.replace(cwd, \"\"))\n\t\t\t\t\t).replace(\".//\", \"./\"),\n\t\t\t\t\tclientPlugins: add_plugins\n\t\t\t\t\t\t.filter((x) => x.clientName)\n\t\t\t\t\t\t.map((plugin) => {\n\t\t\t\t\t\t\tlet contents = \"\";\n\t\t\t\t\t\t\tif (plugin.id === \"one-tap\") {\n\t\t\t\t\t\t\t\tcontents = `{ clientId: \"MY_CLIENT_ID\" }`;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tcontents,\n\t\t\t\t\t\t\t\tid: plugin.id,\n\t\t\t\t\t\t\t\tname: plugin.clientName!,\n\t\t\t\t\t\t\t\timports: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tpath: \"better-auth/client/plugins\",\n\t\t\t\t\t\t\t\t\t\tvariables: [{ name: plugin.clientName! }],\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}),\n\t\t\t\t\tframework: framework,\n\t\t\t\t});\n\t\t\t\tawait fs.writeFile(authClientConfigPath, contents);\n\t\t\t\tlog.success(`šŸš€ Auth client config file successfully created!`);\n\t\t\t} catch (error) {\n\t\t\t\tlog.error(\n\t\t\t\t\t`Failed to create auth client config file: ${authClientConfigPath}`,\n\t\t\t\t);\n\t\t\t\tlog.error(JSON.stringify(error, null, 2));\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t} else if (choice === \"no\") {\n\t\t\tlog.info(`Skipping auth client config file creation.`);\n\t\t}\n\t} else {\n\t\tlog.success(\n\t\t\t`Found auth client config file. ${chalk.gray(\n\t\t\t\t`(${authClientConfigPath})`,\n\t\t\t)}`,\n\t\t);\n\t}\n\n\tif (targetEnvFile !== \"none\") {\n\t\ttry {\n\t\t\tconst fileContents = await fs.readFile(\n\t\t\t\tpath.join(cwd, targetEnvFile),\n\t\t\t\t\"utf8\",\n\t\t\t);\n\t\t\tconst parsed = parse(fileContents);\n\t\t\tlet isMissingSecret = false;\n\t\t\tlet isMissingUrl = false;\n\t\t\tif (parsed.BETTER_AUTH_SECRET === undefined) isMissingSecret = true;\n\t\t\tif (parsed.BETTER_AUTH_URL === undefined) isMissingUrl = true;\n\t\t\tif (isMissingSecret || isMissingUrl) {\n\t\t\t\tlet txt = \"\";\n\t\t\t\tif (isMissingSecret && !isMissingUrl)\n\t\t\t\t\ttxt = chalk.bold(`BETTER_AUTH_SECRET`);\n\t\t\t\telse if (!isMissingSecret && isMissingUrl)\n\t\t\t\t\ttxt = chalk.bold(`BETTER_AUTH_URL`);\n\t\t\t\telse\n\t\t\t\t\ttxt =\n\t\t\t\t\t\tchalk.bold.underline(`BETTER_AUTH_SECRET`) +\n\t\t\t\t\t\t` and ` +\n\t\t\t\t\t\tchalk.bold.underline(`BETTER_AUTH_URL`);\n\t\t\t\tlog.warn(`Missing ${txt} in ${targetEnvFile}`);\n\n\t\t\t\tconst shouldAdd = await select({\n\t\t\t\t\tmessage: `Do you want to add ${txt} to ${targetEnvFile}?`,\n\t\t\t\t\toptions: [\n\t\t\t\t\t\t{ label: \"Yes\", value: \"yes\" },\n\t\t\t\t\t\t{ label: \"No\", value: \"no\" },\n\t\t\t\t\t\t{ label: \"Choose other file(s)\", value: \"other\" },\n\t\t\t\t\t],\n\t\t\t\t});\n\t\t\t\tif (isCancel(shouldAdd)) {\n\t\t\t\t\tcancel(`āœ‹ Operation cancelled.`);\n\t\t\t\t\tprocess.exit(0);\n\t\t\t\t}\n\t\t\t\tconst envs: string[] = [];\n\t\t\t\tif (isMissingSecret) {\n\t\t\t\t\tenvs.push(\"BETTER_AUTH_SECRET\");\n\t\t\t\t}\n\t\t\t\tif (isMissingUrl) {\n\t\t\t\t\tenvs.push(\"BETTER_AUTH_URL\");\n\t\t\t\t}\n\t\t\t\tif (shouldAdd === \"yes\") {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait updateEnvs({\n\t\t\t\t\t\t\tfiles: [path.join(cwd, targetEnvFile)],\n\t\t\t\t\t\t\tenvs: envs,\n\t\t\t\t\t\t\tisCommented: false,\n\t\t\t\t\t\t});\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tlog.error(`Failed to add ENV variables to ${targetEnvFile}`);\n\t\t\t\t\t\tlog.error(JSON.stringify(error, null, 2));\n\t\t\t\t\t\tprocess.exit(1);\n\t\t\t\t\t}\n\t\t\t\t\tlog.success(`šŸš€ ENV variables successfully added!`);\n\t\t\t\t\tif (isMissingUrl) {\n\t\t\t\t\t\tlog.info(\n\t\t\t\t\t\t\t`Be sure to update your BETTER_AUTH_URL according to your app's needs.`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t} else if (shouldAdd === \"no\") {\n\t\t\t\t\tlog.info(`Skipping ENV step.`);\n\t\t\t\t} else if (shouldAdd === \"other\") {\n\t\t\t\t\tif (!envFiles.length) {\n\t\t\t\t\t\tcancel(\"No env files found. Please create an env file first.\");\n\t\t\t\t\t\tprocess.exit(0);\n\t\t\t\t\t}\n\t\t\t\t\tconst envFilesToUpdate = await multiselect({\n\t\t\t\t\t\tmessage: \"Select the .env files you want to update\",\n\t\t\t\t\t\toptions: envFiles.map((x) => ({\n\t\t\t\t\t\t\tvalue: path.join(cwd, x),\n\t\t\t\t\t\t\tlabel: x,\n\t\t\t\t\t\t})),\n\t\t\t\t\t\trequired: false,\n\t\t\t\t\t});\n\t\t\t\t\tif (isCancel(envFilesToUpdate)) {\n\t\t\t\t\t\tcancel(\"āœ‹ Operation cancelled.\");\n\t\t\t\t\t\tprocess.exit(0);\n\t\t\t\t\t}\n\t\t\t\t\tif (envFilesToUpdate.length === 0) {\n\t\t\t\t\t\tlog.info(\"No .env files to update. Skipping...\");\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait updateEnvs({\n\t\t\t\t\t\t\t\tfiles: envFilesToUpdate,\n\t\t\t\t\t\t\t\tenvs: envs,\n\t\t\t\t\t\t\t\tisCommented: false,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tlog.error(`Failed to update .env files:`);\n\t\t\t\t\t\t\tlog.error(JSON.stringify(error, null, 2));\n\t\t\t\t\t\t\tprocess.exit(1);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tlog.success(`šŸš€ ENV files successfully updated!`);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {\n\t\t\t// if fails, ignore, and do not proceed with ENV operations.\n\t\t}\n\t}\n\n\toutro(outroText);\n\tconsole.log();\n\tprocess.exit(0);\n}\n\n// ===== Init Command =====\n\nexport const init = new Command(\"init\")\n\t.option(\"-c, --cwd \", \"The working directory.\", process.cwd())\n\t.option(\n\t\t\"--config \",\n\t\t\"The path to the auth configuration file. defaults to the first `auth.ts` file found.\",\n\t)\n\t.option(\"--tsconfig \", \"The path to the tsconfig file.\")\n\t.option(\"--skip-db\", \"Skip the database setup.\")\n\t.option(\"--skip-plugins\", \"Skip the plugins setup.\")\n\t.option(\n\t\t\"--package-manager \",\n\t\t\"The package manager you want to use.\",\n\t)\n\t.action(initAction);\n\nasync function getLatestNpmVersion(packageName: string): Promise {\n\ttry {\n\t\tconst response = await fetch(`https://registry.npmjs.org/${packageName}`);\n\n\t\tif (!response.ok) {\n\t\t\tthrow new Error(`Package not found: ${response.statusText}`);\n\t\t}\n\n\t\tconst data = await response.json();\n\t\treturn data[\"dist-tags\"].latest; // Get the latest version from dist-tags\n\t} catch (error: any) {\n\t\tthrow error?.message;\n\t}\n}\n\nasync function getPackageManager() {\n\tconst { hasBun, hasPnpm } = await checkPackageManagers();\n\tif (!hasBun && !hasPnpm) return \"npm\";\n\n\tconst packageManagerOptions: {\n\t\tvalue: \"bun\" | \"pnpm\" | \"yarn\" | \"npm\";\n\t\tlabel?: string;\n\t\thint?: string;\n\t}[] = [];\n\n\tif (hasPnpm) {\n\t\tpackageManagerOptions.push({\n\t\t\tvalue: \"pnpm\",\n\t\t\tlabel: \"pnpm\",\n\t\t\thint: \"recommended\",\n\t\t});\n\t}\n\tif (hasBun) {\n\t\tpackageManagerOptions.push({\n\t\t\tvalue: \"bun\",\n\t\t\tlabel: \"bun\",\n\t\t});\n\t}\n\tpackageManagerOptions.push({\n\t\tvalue: \"npm\",\n\t\thint: \"not recommended\",\n\t});\n\n\tconst packageManager = await select({\n\t\tmessage: \"Choose a package manager\",\n\t\toptions: packageManagerOptions,\n\t});\n\tif (isCancel(packageManager)) {\n\t\tcancel(`Operation cancelled.`);\n\t\tprocess.exit(0);\n\t}\n\treturn packageManager;\n}\n\nasync function getEnvFiles(cwd: string) {\n\tconst files = await fs.readdir(cwd);\n\treturn files.filter((x) => x.startsWith(\".env\"));\n}\n\nasync function updateEnvs({\n\tenvs,\n\tfiles,\n\tisCommented,\n}: {\n\t/**\n\t * The ENVs to append to the file\n\t */\n\tenvs: string[];\n\t/**\n\t * Full file paths\n\t */\n\tfiles: string[];\n\t/**\n\t * Whether to comment the all of the envs or not\n\t */\n\tisCommented: boolean;\n}) {\n\tlet previouslyGeneratedSecret: string | null = null;\n\tfor (const file of files) {\n\t\tconst content = await fs.readFile(file, \"utf8\");\n\t\tconst lines = content.split(\"\\n\");\n\t\tconst newLines = envs.map(\n\t\t\t(x) =>\n\t\t\t\t`${isCommented ? \"# \" : \"\"}${x}=${\n\t\t\t\t\tgetEnvDescription(x) ?? `\"some_value\"`\n\t\t\t\t}`,\n\t\t);\n\t\tnewLines.push(\"\");\n\t\tnewLines.push(...lines);\n\t\tawait fs.writeFile(file, newLines.join(\"\\n\"), \"utf8\");\n\t}\n\n\tfunction getEnvDescription(env: string) {\n\t\tif (env === \"DATABASE_HOST\") {\n\t\t\treturn `\"The host of your database\"`;\n\t\t}\n\t\tif (env === \"DATABASE_PORT\") {\n\t\t\treturn `\"The port of your database\"`;\n\t\t}\n\t\tif (env === \"DATABASE_USER\") {\n\t\t\treturn `\"The username of your database\"`;\n\t\t}\n\t\tif (env === \"DATABASE_PASSWORD\") {\n\t\t\treturn `\"The password of your database\"`;\n\t\t}\n\t\tif (env === \"DATABASE_NAME\") {\n\t\t\treturn `\"The name of your database\"`;\n\t\t}\n\t\tif (env === \"DATABASE_URL\") {\n\t\t\treturn `\"The URL of your database\"`;\n\t\t}\n\t\tif (env === \"BETTER_AUTH_SECRET\") {\n\t\t\tpreviouslyGeneratedSecret =\n\t\t\t\tpreviouslyGeneratedSecret ?? generateSecretHash();\n\t\t\treturn `\"${previouslyGeneratedSecret}\"`;\n\t\t}\n\t\tif (env === \"BETTER_AUTH_URL\") {\n\t\t\treturn `\"http://localhost:3000\" # Your APP URL`;\n\t\t}\n\t}\n}\n","import fs from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { cancel, confirm, intro, isCancel, outro } from \"@clack/prompts\";\nimport { createAuthClient } from \"better-auth/client\";\nimport { deviceAuthorizationClient } from \"better-auth/client/plugins\";\nimport chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport open from \"open\";\nimport yoctoSpinner from \"yocto-spinner\";\nimport * as z from \"zod/v4\";\n\nconst DEMO_URL = \"https://demo.better-auth.com\";\nconst CLIENT_ID = \"better-auth-cli\";\nconst CONFIG_DIR = path.join(os.homedir(), \".better-auth\");\nconst TOKEN_FILE = path.join(CONFIG_DIR, \"token.json\");\n\nasync function loginAction(opts: any) {\n\tconst options = z\n\t\t.object({\n\t\t\tserverUrl: z.string().optional(),\n\t\t\tclientId: z.string().optional(),\n\t\t})\n\t\t.parse(opts);\n\n\tconst serverUrl = options.serverUrl || DEMO_URL;\n\tconst clientId = options.clientId || CLIENT_ID;\n\n\tintro(chalk.bold(\"šŸ” Better Auth CLI Login (Demo)\"));\n\n\tconsole.log(\n\t\tchalk.yellow(\n\t\t\t\"āš ļø This is a demo feature for testing device authorization flow.\",\n\t\t),\n\t);\n\tconsole.log(\n\t\tchalk.gray(\n\t\t\t\" It connects to the Better Auth demo server for testing purposes.\\n\",\n\t\t),\n\t);\n\n\t// Check if already logged in\n\tconst existingToken = await getStoredToken();\n\tif (existingToken) {\n\t\tconst shouldReauth = await confirm({\n\t\t\tmessage: \"You're already logged in. Do you want to log in again?\",\n\t\t\tinitialValue: false,\n\t\t});\n\n\t\tif (isCancel(shouldReauth) || !shouldReauth) {\n\t\t\tcancel(\"Login cancelled\");\n\t\t\tprocess.exit(0);\n\t\t}\n\t}\n\n\t// Create the auth client\n\tconst authClient = createAuthClient({\n\t\tbaseURL: serverUrl,\n\t\tplugins: [deviceAuthorizationClient()],\n\t});\n\n\tconst spinner = yoctoSpinner({ text: \"Requesting device authorization...\" });\n\tspinner.start();\n\n\ttry {\n\t\t// Request device code\n\t\tconst { data, error } = await authClient.device.code({\n\t\t\tclient_id: clientId,\n\t\t\tscope: \"openid profile email\",\n\t\t});\n\n\t\tspinner.stop();\n\n\t\tif (error || !data) {\n\t\t\tconsole.error(\n\t\t\t\t`Failed to request device authorization: ${error?.error_description || \"Unknown error\"}`,\n\t\t\t);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tconst {\n\t\t\tdevice_code,\n\t\t\tuser_code,\n\t\t\tverification_uri,\n\t\t\tverification_uri_complete,\n\t\t\tinterval = 5,\n\t\t\texpires_in,\n\t\t} = data;\n\n\t\t// Display authorization instructions\n\t\tconsole.log(\"\");\n\t\tconsole.log(chalk.cyan(\"šŸ“± Device Authorization Required\"));\n\t\tconsole.log(\"\");\n\t\tconsole.log(`Please visit: ${chalk.underline.blue(verification_uri)}`);\n\t\tconsole.log(`Enter code: ${chalk.bold.green(user_code)}`);\n\t\tconsole.log(\"\");\n\n\t\t// Ask if user wants to open browser\n\t\tconst shouldOpen = await confirm({\n\t\t\tmessage: \"Open browser automatically?\",\n\t\t\tinitialValue: true,\n\t\t});\n\n\t\tif (!isCancel(shouldOpen) && shouldOpen) {\n\t\t\tconst urlToOpen = verification_uri_complete || verification_uri;\n\t\t\tawait open(urlToOpen);\n\t\t}\n\n\t\t// Start polling\n\t\tconsole.log(\n\t\t\tchalk.gray(\n\t\t\t\t`Waiting for authorization (expires in ${Math.floor(expires_in / 60)} minutes)...`,\n\t\t\t),\n\t\t);\n\n\t\tconst token = await pollForToken(\n\t\t\tauthClient,\n\t\t\tdevice_code,\n\t\t\tclientId,\n\t\t\tinterval,\n\t\t);\n\n\t\tif (token) {\n\t\t\t// Store the token\n\t\t\tawait storeToken(token);\n\n\t\t\t// Get user info\n\t\t\tconst { data: session } = await authClient.getSession({\n\t\t\t\tfetchOptions: {\n\t\t\t\t\theaders: {\n\t\t\t\t\t\tAuthorization: `Bearer ${token.access_token}`,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t});\n\n\t\t\toutro(\n\t\t\t\tchalk.green(\n\t\t\t\t\t`āœ… Demo login successful! Logged in as ${session?.user?.name || session?.user?.email || \"User\"}`,\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tconsole.log(\n\t\t\t\tchalk.gray(\n\t\t\t\t\t\"\\nšŸ“ Note: This was a demo authentication for testing purposes.\",\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tconsole.log(\n\t\t\t\tchalk.blue(\n\t\t\t\t\t\"\\nFor more information, visit: https://better-auth.com/docs/plugins/device-authorization\",\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t} catch (err) {\n\t\tspinner.stop();\n\t\tconsole.error(\n\t\t\t`Login failed: ${err instanceof Error ? err.message : \"Unknown error\"}`,\n\t\t);\n\t\tprocess.exit(1);\n\t}\n}\n\nasync function pollForToken(\n\tauthClient: any,\n\tdeviceCode: string,\n\tclientId: string,\n\tinitialInterval: number,\n): Promise {\n\tlet pollingInterval = initialInterval;\n\tconst spinner = yoctoSpinner({ text: \"\", color: \"cyan\" });\n\tlet dots = 0;\n\n\treturn new Promise((resolve, reject) => {\n\t\tconst poll = async () => {\n\t\t\t// Update spinner text with animated dots\n\t\t\tdots = (dots + 1) % 4;\n\t\t\tspinner.text = chalk.gray(\n\t\t\t\t`Polling for authorization${\".\".repeat(dots)}${\" \".repeat(3 - dots)}`,\n\t\t\t);\n\t\t\tif (!spinner.isSpinning) spinner.start();\n\n\t\t\ttry {\n\t\t\t\tconst { data, error } = await authClient.device.token({\n\t\t\t\t\tgrant_type: \"urn:ietf:params:oauth:grant-type:device_code\",\n\t\t\t\t\tdevice_code: deviceCode,\n\t\t\t\t\tclient_id: clientId,\n\t\t\t\t\tfetchOptions: {\n\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\t\"user-agent\": `Better Auth CLI`,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\tif (data?.access_token) {\n\t\t\t\t\tspinner.stop();\n\t\t\t\t\tresolve(data);\n\t\t\t\t\treturn;\n\t\t\t\t} else if (error) {\n\t\t\t\t\tswitch (error.error) {\n\t\t\t\t\t\tcase \"authorization_pending\":\n\t\t\t\t\t\t\t// Continue polling\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"slow_down\":\n\t\t\t\t\t\t\tpollingInterval += 5;\n\t\t\t\t\t\t\tspinner.text = chalk.yellow(\n\t\t\t\t\t\t\t\t`Slowing down polling to ${pollingInterval}s`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"access_denied\":\n\t\t\t\t\t\t\tspinner.stop();\n\t\t\t\t\t\t\tconsole.error(\"Access was denied by the user\");\n\t\t\t\t\t\t\tprocess.exit(1);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"expired_token\":\n\t\t\t\t\t\t\tspinner.stop();\n\t\t\t\t\t\t\tconsole.error(\"The device code has expired. Please try again.\");\n\t\t\t\t\t\t\tprocess.exit(1);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tspinner.stop();\n\t\t\t\t\t\t\tconsole.error(`Error: ${error.error_description}`);\n\t\t\t\t\t\t\tprocess.exit(1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\tspinner.stop();\n\t\t\t\tconsole.error(\n\t\t\t\t\t`Network error: ${err instanceof Error ? err.message : \"Unknown error\"}`,\n\t\t\t\t);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\tsetTimeout(poll, pollingInterval * 1000);\n\t\t};\n\n\t\t// Start polling after initial interval\n\t\tsetTimeout(poll, pollingInterval * 1000);\n\t});\n}\n\nasync function storeToken(token: any): Promise {\n\ttry {\n\t\t// Ensure config directory exists\n\t\tawait fs.mkdir(CONFIG_DIR, { recursive: true });\n\n\t\t// Store token with metadata\n\t\tconst tokenData = {\n\t\t\taccess_token: token.access_token,\n\t\t\ttoken_type: token.token_type || \"Bearer\",\n\t\t\tscope: token.scope,\n\t\t\tcreated_at: new Date().toISOString(),\n\t\t};\n\n\t\tawait fs.writeFile(TOKEN_FILE, JSON.stringify(tokenData, null, 2), \"utf-8\");\n\t} catch {\n\t\tconsole.warn(\"Failed to store authentication token locally\");\n\t}\n}\n\nasync function getStoredToken(): Promise {\n\ttry {\n\t\tconst data = await fs.readFile(TOKEN_FILE, \"utf-8\");\n\t\treturn JSON.parse(data);\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nexport const login = new Command(\"login\")\n\t.description(\n\t\t\"Demo: Test device authorization flow with Better Auth demo server\",\n\t)\n\t.option(\"--server-url \", \"The Better Auth server URL\", DEMO_URL)\n\t.option(\"--client-id \", \"The OAuth client ID\", CLIENT_ID)\n\t.action(loginAction);\n","import { execSync } from \"node:child_process\";\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport { base64 } from \"@better-auth/utils/base64\";\nimport chalk from \"chalk\";\nimport { Command } from \"commander\";\n\ninterface MCPOptions {\n\tcursor?: boolean;\n\tclaudeCode?: boolean;\n\topenCode?: boolean;\n\tmanual?: boolean;\n}\n\nconst REMOTE_MCP_URL = \"https://mcp.inkeep.com/better-auth/mcp\";\n\nasync function mcpAction(options: MCPOptions) {\n\tif (options.cursor) {\n\t\tawait handleCursorAction();\n\t} else if (options.claudeCode) {\n\t\thandleClaudeCodeAction();\n\t} else if (options.openCode) {\n\t\thandleOpenCodeAction();\n\t} else if (options.manual) {\n\t\thandleManualAction();\n\t} else {\n\t\tshowAllOptions();\n\t}\n}\n\nasync function handleCursorAction() {\n\tconsole.log(chalk.bold.blue(\"šŸš€ Adding Better Auth MCP to Cursor...\"));\n\n\tconst platform = os.platform();\n\tlet openCommand: string;\n\n\tswitch (platform) {\n\t\tcase \"darwin\":\n\t\t\topenCommand = \"open\";\n\t\t\tbreak;\n\t\tcase \"win32\":\n\t\t\topenCommand = \"start\";\n\t\t\tbreak;\n\t\tcase \"linux\":\n\t\t\topenCommand = \"xdg-open\";\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tthrow new Error(`Unsupported platform: ${platform}`);\n\t}\n\n\tconst remoteConfig = { url: REMOTE_MCP_URL };\n\tconst encodedRemote = base64.encode(\n\t\tnew TextEncoder().encode(JSON.stringify(remoteConfig)),\n\t);\n\tconst remoteDeeplink = `cursor://anysphere.cursor-deeplink/mcp/install?name=${encodeURIComponent(\"better-auth\")}&config=${encodedRemote}`;\n\n\ttry {\n\t\tconst cmd =\n\t\t\tplatform === \"win32\"\n\t\t\t\t? `start \"\" \"${remoteDeeplink}\"`\n\t\t\t\t: `${openCommand} \"${remoteDeeplink}\"`;\n\t\texecSync(cmd, { stdio: \"inherit\" });\n\t\tconsole.log(chalk.green(\"\\nāœ“ Better Auth MCP server installed!\"));\n\t} catch {\n\t\tconsole.log(\n\t\t\tchalk.yellow(\n\t\t\t\t\"\\n⚠ Could not automatically open Cursor for MCP installation.\",\n\t\t\t),\n\t\t);\n\t}\n\n\tconsole.log(chalk.bold.white(\"\\n✨ Next Steps:\"));\n\tconsole.log(\n\t\tchalk.gray(\"• The MCP server will be added to your Cursor configuration\"),\n\t);\n\tconsole.log(\n\t\tchalk.gray(\"• You can now use Better Auth features directly in Cursor\"),\n\t);\n\tconsole.log(\n\t\tchalk.gray(\n\t\t\t'• Try: \"Set up Better Auth with Google login\" or \"Help me debug my auth\"',\n\t\t),\n\t);\n}\n\nfunction handleClaudeCodeAction() {\n\tconsole.log(chalk.bold.blue(\"šŸ¤– Adding Better Auth MCP to Claude Code...\"));\n\n\tconst command = `claude mcp add --transport http better-auth ${REMOTE_MCP_URL}`;\n\n\ttry {\n\t\texecSync(command, { stdio: \"inherit\" });\n\t\tconsole.log(chalk.green(\"\\nāœ“ Claude Code MCP configured!\"));\n\t} catch {\n\t\tconsole.log(\n\t\t\tchalk.yellow(\n\t\t\t\t\"\\n⚠ Could not automatically add to Claude Code. Please run this command manually:\",\n\t\t\t),\n\t\t);\n\t\tconsole.log(chalk.cyan(command));\n\t}\n\n\tconsole.log(chalk.bold.white(\"\\n✨ Next Steps:\"));\n\tconsole.log(\n\t\tchalk.gray(\n\t\t\t\"• The MCP server will be added to your Claude Code configuration\",\n\t\t),\n\t);\n\tconsole.log(\n\t\tchalk.gray(\n\t\t\t\"• You can now use Better Auth features directly in Claude Code\",\n\t\t),\n\t);\n}\n\nfunction handleOpenCodeAction() {\n\tconsole.log(chalk.bold.blue(\"šŸ”§ Adding Better Auth MCP to Open Code...\"));\n\n\tconst openCodeConfig = {\n\t\t$schema: \"https://opencode.ai/config.json\",\n\t\tmcp: {\n\t\t\t\"better-auth\": {\n\t\t\t\ttype: \"remote\",\n\t\t\t\turl: REMOTE_MCP_URL,\n\t\t\t\tenabled: true,\n\t\t\t},\n\t\t},\n\t};\n\n\tconst configPath = path.join(process.cwd(), \"opencode.json\");\n\n\ttry {\n\t\tlet existingConfig: {\n\t\t\tmcp?: Record;\n\t\t\t[key: string]: unknown;\n\t\t} = {};\n\t\tif (fs.existsSync(configPath)) {\n\t\t\tconst existingContent = fs.readFileSync(configPath, \"utf8\");\n\t\t\texistingConfig = JSON.parse(existingContent);\n\t\t}\n\n\t\tconst mergedConfig = {\n\t\t\t...existingConfig,\n\t\t\t...openCodeConfig,\n\t\t\tmcp: {\n\t\t\t\t...existingConfig.mcp,\n\t\t\t\t...openCodeConfig.mcp,\n\t\t\t},\n\t\t};\n\n\t\tfs.writeFileSync(configPath, JSON.stringify(mergedConfig, null, 2));\n\t\tconsole.log(\n\t\t\tchalk.green(`\\nāœ“ Open Code configuration written to ${configPath}`),\n\t\t);\n\t\tconsole.log(chalk.green(\"āœ“ Better Auth MCP server added successfully!\"));\n\t} catch {\n\t\tconsole.log(\n\t\t\tchalk.yellow(\n\t\t\t\t\"\\n⚠ Could not automatically write opencode.json. Please add this configuration manually:\",\n\t\t\t),\n\t\t);\n\t\tconsole.log(chalk.cyan(JSON.stringify(openCodeConfig, null, 2)));\n\t}\n\n\tconsole.log(chalk.bold.white(\"\\n✨ Next Steps:\"));\n\tconsole.log(chalk.gray(\"• Restart Open Code to load the new MCP server\"));\n\tconsole.log(\n\t\tchalk.gray(\"• You can now use Better Auth features directly in Open Code\"),\n\t);\n}\n\nfunction handleManualAction() {\n\tconsole.log(chalk.bold.blue(\"šŸ“ Better Auth MCP Configuration...\"));\n\n\tconst manualConfig = {\n\t\t\"better-auth\": {\n\t\t\turl: REMOTE_MCP_URL,\n\t\t},\n\t};\n\n\tconst configPath = path.join(process.cwd(), \"mcp.json\");\n\n\ttry {\n\t\tlet existingConfig = {};\n\t\tif (fs.existsSync(configPath)) {\n\t\t\tconst existingContent = fs.readFileSync(configPath, \"utf8\");\n\t\t\texistingConfig = JSON.parse(existingContent);\n\t\t}\n\n\t\tconst mergedConfig = {\n\t\t\t...existingConfig,\n\t\t\t...manualConfig,\n\t\t};\n\n\t\tfs.writeFileSync(configPath, JSON.stringify(mergedConfig, null, 2));\n\t\tconsole.log(chalk.green(`\\nāœ“ MCP configuration written to ${configPath}`));\n\t\tconsole.log(chalk.green(\"āœ“ Better Auth MCP server added successfully!\"));\n\t} catch {\n\t\tconsole.log(\n\t\t\tchalk.yellow(\n\t\t\t\t\"\\n⚠ Could not automatically write mcp.json. Please add this configuration manually:\",\n\t\t\t),\n\t\t);\n\t\tconsole.log(chalk.cyan(JSON.stringify(manualConfig, null, 2)));\n\t}\n\n\tconsole.log(chalk.bold.white(\"\\n✨ Next Steps:\"));\n\tconsole.log(chalk.gray(\"• Restart your MCP client to load the new server\"));\n\tconsole.log(\n\t\tchalk.gray(\n\t\t\t\"• You can now use Better Auth features directly in your MCP client\",\n\t\t),\n\t);\n}\n\nfunction showAllOptions() {\n\tconsole.log(chalk.bold.blue(\"šŸ”Œ Better Auth MCP Server\"));\n\tconsole.log(chalk.gray(\"Choose your MCP client to get started:\"));\n\tconsole.log();\n\n\tconsole.log(chalk.bold.white(\"MCP Clients:\"));\n\tconsole.log(chalk.cyan(\" --cursor \") + chalk.gray(\"Add to Cursor\"));\n\tconsole.log(\n\t\tchalk.cyan(\" --claude-code \") + chalk.gray(\"Add to Claude Code\"),\n\t);\n\tconsole.log(chalk.cyan(\" --open-code \") + chalk.gray(\"Add to Open Code\"));\n\tconsole.log(\n\t\tchalk.cyan(\" --manual \") + chalk.gray(\"Manual configuration\"),\n\t);\n\tconsole.log();\n\n\tconsole.log(chalk.bold.white(\"Server:\"));\n\tconsole.log(\n\t\tchalk.gray(\" • \") +\n\t\t\tchalk.white(\"better-auth\") +\n\t\t\tchalk.gray(\" - Search documentation, code examples, setup assistance\"),\n\t);\n\tconsole.log();\n}\n\nexport const mcp = new Command(\"mcp\")\n\t.description(\"Add Better Auth MCP server to MCP Clients\")\n\t.option(\"--cursor\", \"Automatically open Cursor with the MCP configuration\")\n\t.option(\"--claude-code\", \"Show Claude Code MCP configuration command\")\n\t.option(\"--open-code\", \"Show Open Code MCP configuration\")\n\t.option(\"--manual\", \"Show manual MCP configuration for mcp.json\")\n\t.action(mcpAction);\n","import { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport {\n\tcreateTelemetry,\n\tgetTelemetryAuthConfig,\n} from \"@better-auth/telemetry\";\nimport { getAdapter, getMigrations } from \"better-auth/db\";\nimport chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport prompts from \"prompts\";\nimport yoctoSpinner from \"yocto-spinner\";\nimport * as z from \"zod/v4\";\nimport { getConfig } from \"../utils/get-config\";\n\n/** @internal */\nexport async function migrateAction(opts: any) {\n\tconst options = z\n\t\t.object({\n\t\t\tcwd: z.string(),\n\t\t\tconfig: z.string().optional(),\n\t\t\ty: z.boolean().optional(),\n\t\t\tyes: z.boolean().optional(),\n\t\t})\n\t\t.parse(opts);\n\n\tconst cwd = path.resolve(options.cwd);\n\tif (!existsSync(cwd)) {\n\t\tconsole.error(`The directory \"${cwd}\" does not exist.`);\n\t\tprocess.exit(1);\n\t}\n\n\tconst config = await getConfig({\n\t\tcwd,\n\t\tconfigPath: options.config,\n\t});\n\tif (!config) {\n\t\tconsole.error(\n\t\t\t\"No configuration file found. Add a `auth.ts` file to your project or pass the path to the configuration file using the `--config` flag.\",\n\t\t);\n\t\treturn;\n\t}\n\n\tconst db = await getAdapter(config);\n\n\tif (!db) {\n\t\tconsole.error(\n\t\t\t\"Invalid database configuration. Make sure you're not using adapters. Migrate command only works with built-in Kysely adapter.\",\n\t\t);\n\t\tprocess.exit(1);\n\t}\n\n\tif (db.id !== \"kysely\") {\n\t\tif (db.id === \"prisma\") {\n\t\t\tconsole.error(\n\t\t\t\t\"The migrate command only works with the built-in Kysely adapter. For Prisma, run `npx @better-auth/cli generate` to create the schema, then use Prisma's migrate or push to apply it.\",\n\t\t\t);\n\t\t\ttry {\n\t\t\t\tconst telemetry = await createTelemetry(config);\n\t\t\t\tawait telemetry.publish({\n\t\t\t\t\ttype: \"cli_migrate\",\n\t\t\t\t\tpayload: {\n\t\t\t\t\t\toutcome: \"unsupported_adapter\",\n\t\t\t\t\t\tadapter: \"prisma\",\n\t\t\t\t\t\tconfig: getTelemetryAuthConfig(config),\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t} catch {}\n\t\t\tprocess.exit(0);\n\t\t}\n\t\tif (db.id === \"drizzle\") {\n\t\t\tconsole.error(\n\t\t\t\t\"The migrate command only works with the built-in Kysely adapter. For Drizzle, run `npx @better-auth/cli generate` to create the schema, then use Drizzle's migrate or push to apply it.\",\n\t\t\t);\n\t\t\ttry {\n\t\t\t\tconst telemetry = await createTelemetry(config);\n\t\t\t\tawait telemetry.publish({\n\t\t\t\t\ttype: \"cli_migrate\",\n\t\t\t\t\tpayload: {\n\t\t\t\t\t\toutcome: \"unsupported_adapter\",\n\t\t\t\t\t\tadapter: \"drizzle\",\n\t\t\t\t\t\tconfig: getTelemetryAuthConfig(config),\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t} catch {}\n\t\t\tprocess.exit(0);\n\t\t}\n\t\tconsole.error(\"Migrate command isn't supported for this adapter.\");\n\t\ttry {\n\t\t\tconst telemetry = await createTelemetry(config);\n\t\t\tawait telemetry.publish({\n\t\t\t\ttype: \"cli_migrate\",\n\t\t\t\tpayload: {\n\t\t\t\t\toutcome: \"unsupported_adapter\",\n\t\t\t\t\tadapter: db.id,\n\t\t\t\t\tconfig: getTelemetryAuthConfig(config),\n\t\t\t\t},\n\t\t\t});\n\t\t} catch {}\n\t\tprocess.exit(1);\n\t}\n\n\tconst spinner = yoctoSpinner({ text: \"preparing migration...\" }).start();\n\n\tconst { toBeAdded, toBeCreated, runMigrations } = await getMigrations(config);\n\n\tif (!toBeAdded.length && !toBeCreated.length) {\n\t\tspinner.stop();\n\t\tconsole.log(\"šŸš€ No migrations needed.\");\n\t\ttry {\n\t\t\tconst telemetry = await createTelemetry(config);\n\t\t\tawait telemetry.publish({\n\t\t\t\ttype: \"cli_migrate\",\n\t\t\t\tpayload: {\n\t\t\t\t\toutcome: \"no_changes\",\n\t\t\t\t\tconfig: getTelemetryAuthConfig(config),\n\t\t\t\t},\n\t\t\t});\n\t\t} catch {}\n\t\tprocess.exit(0);\n\t}\n\n\tspinner.stop();\n\tconsole.log(`šŸ”‘ The migration will affect the following:`);\n\n\tfor (const table of [...toBeCreated, ...toBeAdded]) {\n\t\tconsole.log(\n\t\t\t\"->\",\n\t\t\tchalk.magenta(Object.keys(table.fields).join(\", \")),\n\t\t\tchalk.white(\"fields on\"),\n\t\t\tchalk.yellow(`${table.table}`),\n\t\t\tchalk.white(\"table.\"),\n\t\t);\n\t}\n\n\tif (options.y) {\n\t\tconsole.warn(\"WARNING: --y is deprecated. Consider -y or --yes\");\n\t\toptions.yes = true;\n\t}\n\n\tlet migrate = options.yes;\n\tif (!migrate) {\n\t\tconst response = await prompts({\n\t\t\ttype: \"confirm\",\n\t\t\tname: \"migrate\",\n\t\t\tmessage: \"Are you sure you want to run these migrations?\",\n\t\t\tinitial: false,\n\t\t});\n\t\tmigrate = response.migrate;\n\t}\n\n\tif (!migrate) {\n\t\tconsole.log(\"Migration cancelled.\");\n\t\ttry {\n\t\t\tconst telemetry = await createTelemetry(config);\n\t\t\tawait telemetry.publish({\n\t\t\t\ttype: \"cli_migrate\",\n\t\t\t\tpayload: { outcome: \"aborted\", config: getTelemetryAuthConfig(config) },\n\t\t\t});\n\t\t} catch {}\n\t\tprocess.exit(0);\n\t}\n\n\tspinner?.start(\"migrating...\");\n\tawait runMigrations();\n\tspinner.stop();\n\tconsole.log(\"šŸš€ migration was completed successfully!\");\n\ttry {\n\t\tconst telemetry = await createTelemetry(config);\n\t\tawait telemetry.publish({\n\t\t\ttype: \"cli_migrate\",\n\t\t\tpayload: { outcome: \"migrated\", config: getTelemetryAuthConfig(config) },\n\t\t});\n\t} catch {}\n\tprocess.exit(0);\n}\n\nexport const migrate = new Command(\"migrate\")\n\t.option(\n\t\t\"-c, --cwd \",\n\t\t\"the working directory. defaults to the current directory.\",\n\t\tprocess.cwd(),\n\t)\n\t.option(\n\t\t\"--config \",\n\t\t\"the path to the configuration file. defaults to the first configuration file found.\",\n\t)\n\t.option(\n\t\t\"-y, --yes\",\n\t\t\"automatically accept and run migrations without prompting\",\n\t\tfalse,\n\t)\n\t.option(\"--y\", \"(deprecated) same as --yes\", false)\n\t.action(migrateAction);\n","#!/usr/bin/env node\n\nimport { Command } from \"commander\";\nimport { generate } from \"./commands/generate\";\nimport { info } from \"./commands/info\";\nimport { init } from \"./commands/init\";\nimport { login } from \"./commands/login\";\nimport { mcp } from \"./commands/mcp\";\nimport { migrate } from \"./commands/migrate\";\nimport { generateSecret } from \"./commands/secret\";\nimport { getPackageInfo } from \"./utils/get-package-info\";\n\nimport \"dotenv/config\";\n\n// handle exit\nprocess.on(\"SIGINT\", () => process.exit(0));\nprocess.on(\"SIGTERM\", () => process.exit(0));\n\nasync function main() {\n\tconst program = new Command(\"better-auth\");\n\n\tlet packageInfo: Record = {};\n\ttry {\n\t\tpackageInfo = await getPackageInfo();\n\t} catch {\n\t\t// it doesn't matter if we can't read the package.json file, we'll just use an empty object\n\t}\n\tprogram\n\t\t.addCommand(init)\n\t\t.addCommand(migrate)\n\t\t.addCommand(generate)\n\t\t.addCommand(generateSecret)\n\t\t.addCommand(info)\n\t\t.addCommand(login)\n\t\t.addCommand(mcp)\n\t\t.version(packageInfo.version || \"1.1.2\")\n\t\t.description(\"Better Auth CLI\")\n\t\t.action(() => program.help());\n\n\tprogram.parse();\n}\n\nmain().catch((error) => {\n\tconsole.error(\"Error running Better Auth CLI:\", error);\n\tprocess.exit(1);\n});\n"],"mappings":"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"}