@better-auth/cli 1.5.0-beta.11 → 1.5.0-beta.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -384,7 +384,7 @@ async function getConfig({ cwd, configPath, shouldThrowOnError = false }) {
384
384
  if (existsSync(configPath)) resolvedPath = configPath;
385
385
  const { config } = await loadConfig({
386
386
  configFile: resolvedPath,
387
- dotenv: true,
387
+ dotenv: { fileName: [".env", ".env.local"] },
388
388
  jitiOptions: jitiOptions(cwd),
389
389
  cwd
390
390
  });
@@ -398,6 +398,7 @@ async function getConfig({ cwd, configPath, shouldThrowOnError = false }) {
398
398
  if (!configFile) for (const possiblePath of possiblePaths) try {
399
399
  const { config } = await loadConfig({
400
400
  configFile: possiblePath,
401
+ dotenv: { fileName: [".env", ".env.local"] },
401
402
  jitiOptions: jitiOptions(cwd),
402
403
  cwd
403
404
  });
@@ -476,7 +477,7 @@ async function generateAction(opts) {
476
477
  type: "cli_generate",
477
478
  payload: {
478
479
  outcome: "no_changes",
479
- config: getTelemetryAuthConfig(config, {
480
+ config: await getTelemetryAuthConfig(config, {
480
481
  adapter: adapter.id,
481
482
  database: typeof config.database === "function" ? "adapter" : "kysely"
482
483
  })
@@ -502,7 +503,7 @@ async function generateAction(opts) {
502
503
  type: "cli_generate",
503
504
  payload: {
504
505
  outcome: schema.overwrite ? "overwritten" : "appended",
505
- config: getTelemetryAuthConfig(config)
506
+ config: await getTelemetryAuthConfig(config)
506
507
  }
507
508
  });
508
509
  } catch {}
@@ -514,7 +515,7 @@ async function generateAction(opts) {
514
515
  type: "cli_generate",
515
516
  payload: {
516
517
  outcome: "aborted",
517
- config: getTelemetryAuthConfig(config)
518
+ config: await getTelemetryAuthConfig(config)
518
519
  }
519
520
  });
520
521
  } catch {}
@@ -538,7 +539,7 @@ async function generateAction(opts) {
538
539
  type: "cli_generate",
539
540
  payload: {
540
541
  outcome: "aborted",
541
- config: getTelemetryAuthConfig(config)
542
+ config: await getTelemetryAuthConfig(config)
542
543
  }
543
544
  });
544
545
  } catch {}
@@ -554,7 +555,7 @@ async function generateAction(opts) {
554
555
  type: "cli_generate",
555
556
  payload: {
556
557
  outcome: "generated",
557
- config: getTelemetryAuthConfig(config)
558
+ config: await getTelemetryAuthConfig(config)
558
559
  }
559
560
  });
560
561
  } catch {}
@@ -634,7 +635,7 @@ function getFrameworkInfo(projectRoot) {
634
635
  express: deps["express"],
635
636
  fastify: deps["fastify"],
636
637
  hono: deps["hono"],
637
- remix: deps["@remix-run/react"],
638
+ "react-router": deps["react-router"],
638
639
  astro: deps["astro"],
639
640
  solid: deps["solid-js"],
640
641
  qwik: deps["@builder.io/qwik"]
@@ -2517,7 +2518,7 @@ async function migrateAction(opts) {
2517
2518
  payload: {
2518
2519
  outcome: "unsupported_adapter",
2519
2520
  adapter: "prisma",
2520
- config: getTelemetryAuthConfig(config)
2521
+ config: await getTelemetryAuthConfig(config)
2521
2522
  }
2522
2523
  });
2523
2524
  } catch {}
@@ -2531,7 +2532,7 @@ async function migrateAction(opts) {
2531
2532
  payload: {
2532
2533
  outcome: "unsupported_adapter",
2533
2534
  adapter: "drizzle",
2534
- config: getTelemetryAuthConfig(config)
2535
+ config: await getTelemetryAuthConfig(config)
2535
2536
  }
2536
2537
  });
2537
2538
  } catch {}
@@ -2544,7 +2545,7 @@ async function migrateAction(opts) {
2544
2545
  payload: {
2545
2546
  outcome: "unsupported_adapter",
2546
2547
  adapter: db.id,
2547
- config: getTelemetryAuthConfig(config)
2548
+ config: await getTelemetryAuthConfig(config)
2548
2549
  }
2549
2550
  });
2550
2551
  } catch {}
@@ -2560,7 +2561,7 @@ async function migrateAction(opts) {
2560
2561
  type: "cli_migrate",
2561
2562
  payload: {
2562
2563
  outcome: "no_changes",
2563
- config: getTelemetryAuthConfig(config)
2564
+ config: await getTelemetryAuthConfig(config)
2564
2565
  }
2565
2566
  });
2566
2567
  } catch {}
@@ -2587,7 +2588,7 @@ async function migrateAction(opts) {
2587
2588
  type: "cli_migrate",
2588
2589
  payload: {
2589
2590
  outcome: "aborted",
2590
- config: getTelemetryAuthConfig(config)
2591
+ config: await getTelemetryAuthConfig(config)
2591
2592
  }
2592
2593
  });
2593
2594
  } catch {}
@@ -2602,7 +2603,7 @@ async function migrateAction(opts) {
2602
2603
  type: "cli_migrate",
2603
2604
  payload: {
2604
2605
  outcome: "migrated",
2605
- config: getTelemetryAuthConfig(config)
2606
+ config: await getTelemetryAuthConfig(config)
2606
2607
  }
2607
2608
  });
2608
2609
  } catch {}
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["fs","getPackageManager","prettierFormat","format","fs","fs","os","path","fs"],"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<string, string>,\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<string, string>,\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<string, string> {\n\tconst aliases: Record<string, string> = {};\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<string, string> {\n\tconst aliases: Record<string, string> = {};\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<string, string>) {\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<string, string>;\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<string, string>;\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<string>(),\n): Record<string, string> {\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<string, string> = {};\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<string, string> | 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<string, unknown>,\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: true,\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\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/adapter\";\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 <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 <config>\",\n\t\t\"the path to the configuration file. defaults to the first configuration file found.\",\n\t)\n\t.option(\"--output <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<string, string | undefined> = {\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<string, string | undefined> = {\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 <cwd>\", \"The working directory\", process.cwd())\n\t.option(\"--config <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<string>;\n\ntype CommonIndexConfig_Regex<AdditionalFields> = {\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<AdditionalFields> = {\n\ttype: \"manual\";\n\tgetIndex: (args: {\n\t\tcontent: string;\n\t\tadditionalFields: AdditionalFields;\n\t}) => number | null;\n};\n\nexport type CommonIndexConfig<AdditionalFields> =\n\t| CommonIndexConfig_Regex<AdditionalFields>\n\t| CommonIndexConfig_manual<AdditionalFields>;\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<typeof clackSpinner>;\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<AdditionalFields>(\n\tcontent: string,\n\tcommonIndexConfig: CommonIndexConfig<AdditionalFields>,\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<boolean> {\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<boolean> {\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<typeof auth>(),${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<string, any>;\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<string, any>;\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 <cwd>\", \"The working directory.\", process.cwd())\n\t.option(\n\t\t\"--config <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 <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 <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<string> {\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<any> {\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<void> {\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<any> {\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 <url>\", \"The Better Auth server URL\", DEMO_URL)\n\t.option(\"--client-id <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<string, unknown>;\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 } from \"better-auth/db/adapter\";\nimport { getMigrations } from \"better-auth/db/migration\";\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 <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 <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<string, any> = {};\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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"}
1
+ {"version":3,"file":"index.mjs","names":["fs","getPackageManager","prettierFormat","format","fs","fs","os","path","fs"],"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<string, string>,\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<string, string>,\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<string, string> {\n\tconst aliases: Record<string, string> = {};\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<string, string> {\n\tconst aliases: Record<string, string> = {};\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<string, string>) {\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<string, string>;\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<string, string>;\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<string>(),\n): Record<string, string> {\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<string, string> = {};\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<string, string> | 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<string, unknown>,\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/adapter\";\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: await 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: await 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: await 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: {\n\t\t\t\t\toutcome: \"aborted\",\n\t\t\t\t\tconfig: await getTelemetryAuthConfig(config),\n\t\t\t\t},\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: {\n\t\t\t\toutcome: \"generated\",\n\t\t\t\tconfig: await getTelemetryAuthConfig(config),\n\t\t\t},\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 <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 <config>\",\n\t\t\"the path to the configuration file. defaults to the first configuration file found.\",\n\t)\n\t.option(\"--output <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<string, string | undefined> = {\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\t\"react-router\": deps[\"react-router\"],\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<string, string | undefined> = {\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 <cwd>\", \"The working directory\", process.cwd())\n\t.option(\"--config <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<string>;\n\ntype CommonIndexConfig_Regex<AdditionalFields> = {\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<AdditionalFields> = {\n\ttype: \"manual\";\n\tgetIndex: (args: {\n\t\tcontent: string;\n\t\tadditionalFields: AdditionalFields;\n\t}) => number | null;\n};\n\nexport type CommonIndexConfig<AdditionalFields> =\n\t| CommonIndexConfig_Regex<AdditionalFields>\n\t| CommonIndexConfig_manual<AdditionalFields>;\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<typeof clackSpinner>;\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<AdditionalFields>(\n\tcontent: string,\n\tcommonIndexConfig: CommonIndexConfig<AdditionalFields>,\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<boolean> {\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<boolean> {\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<typeof auth>(),${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<string, any>;\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<string, any>;\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 <cwd>\", \"The working directory.\", process.cwd())\n\t.option(\n\t\t\"--config <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 <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 <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<string> {\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<any> {\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<void> {\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<any> {\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 <url>\", \"The Better Auth server URL\", DEMO_URL)\n\t.option(\"--client-id <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<string, unknown>;\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 } from \"better-auth/db/adapter\";\nimport { getMigrations } from \"better-auth/db/migration\";\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: await 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: await 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: await 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: await 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: {\n\t\t\t\t\toutcome: \"aborted\",\n\t\t\t\t\tconfig: await 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?.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: {\n\t\t\t\toutcome: \"migrated\",\n\t\t\t\tconfig: await getTelemetryAuthConfig(config),\n\t\t\t},\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 <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 <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<string, any> = {};\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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@better-auth/cli",
3
- "version": "1.5.0-beta.11",
3
+ "version": "1.5.0-beta.13",
4
4
  "type": "module",
5
5
  "description": "The CLI for Better Auth",
6
6
  "module": "dist/index.mjs",
@@ -44,13 +44,14 @@
44
44
  "devDependencies": {
45
45
  "@types/better-sqlite3": "^7.6.13",
46
46
  "@types/prompts": "^2.4.9",
47
+ "better-sqlite3": "^12.6.2",
47
48
  "@types/semver": "^7.7.1",
48
49
  "jiti": "^2.6.0",
49
50
  "tsdown": "^0.20.1",
50
51
  "tsx": "^4.20.6",
51
52
  "type-fest": "^5.4.2",
52
53
  "typescript": "^5.9.3",
53
- "@better-auth/passkey": "1.5.0-beta.11"
54
+ "@better-auth/passkey": "1.5.0-beta.13"
54
55
  },
55
56
  "dependencies": {
56
57
  "@babel/core": "^7.28.4",
@@ -61,7 +62,6 @@
61
62
  "@mrleebo/prisma-ast": "^0.13.1",
62
63
  "@prisma/client": "^5.22.0",
63
64
  "@types/pg": "^8.15.5",
64
- "better-sqlite3": "^12.6.2",
65
65
  "c12": "^3.3.3",
66
66
  "chalk": "^5.6.2",
67
67
  "commander": "^12.1.0",
@@ -74,9 +74,9 @@
74
74
  "semver": "^7.7.2",
75
75
  "yocto-spinner": "^0.2.3",
76
76
  "zod": "^4.3.6",
77
- "better-auth": "1.5.0-beta.11",
78
- "@better-auth/core": "1.5.0-beta.11",
79
- "@better-auth/telemetry": "1.5.0-beta.11"
77
+ "@better-auth/core": "1.5.0-beta.13",
78
+ "better-auth": "1.5.0-beta.13",
79
+ "@better-auth/telemetry": "1.5.0-beta.13"
80
80
  },
81
81
  "files": [
82
82
  "dist"