@better-auth/cli 1.4.17 → 1.4.18
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/api.d.mts +2 -1
- package/dist/generators-Ht8QYIi_.mjs +2 -1
- package/dist/generators-Ht8QYIi_.mjs.map +1 -0
- package/dist/index.mjs +40 -79
- package/dist/index.mjs.map +1 -0
- package/package.json +5 -5
package/dist/api.d.mts
CHANGED
|
@@ -41,4 +41,5 @@ declare const generateKyselySchema: SchemaGenerator;
|
|
|
41
41
|
//#region src/generators/prisma.d.ts
|
|
42
42
|
declare const generatePrismaSchema: SchemaGenerator;
|
|
43
43
|
//#endregion
|
|
44
|
-
export { type DBAdapter, type SchemaGenerator, type SchemaGeneratorResult, adapters, generateDrizzleSchema, generateKyselySchema, generatePrismaSchema, generateSchema };
|
|
44
|
+
export { type DBAdapter, type SchemaGenerator, type SchemaGeneratorResult, adapters, generateDrizzleSchema, generateKyselySchema, generatePrismaSchema, generateSchema };
|
|
45
|
+
//# sourceMappingURL=api.d.mts.map
|
|
@@ -568,4 +568,5 @@ const generateSchema = (opts) => {
|
|
|
568
568
|
};
|
|
569
569
|
|
|
570
570
|
//#endregion
|
|
571
|
-
export { generateKyselySchema as a, getPackageInfo as i, generateSchema as n, generateDrizzleSchema as o, generatePrismaSchema as r, adapters as t };
|
|
571
|
+
export { generateKyselySchema as a, getPackageInfo as i, generateSchema as n, generateDrizzleSchema as o, generatePrismaSchema as r, adapters as t };
|
|
572
|
+
//# sourceMappingURL=generators-Ht8QYIi_.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generators-Ht8QYIi_.mjs","names":["generateDrizzleSchema: SchemaGenerator","databaseType: \"sqlite\" | \"mysql\" | \"pg\" | undefined","code: string","useNumberId","id: string","indexes: Index[]","indexes","code: string[]","code","relationsString: string","oneRelations: Relation[]","manyRelations: Relation[]","modelName","hasMany","duplicateRelations: Relation[]","singleRelations: Relation[]","rootImports: string[]","coreImports: string[]","generateKyselySchema: SchemaGenerator","generatePrismaSchema: SchemaGenerator","provider: \"sqlite\" | \"postgresql\" | \"mysql\" | \"mongodb\"","fs","generator: any"],"sources":["../src/generators/drizzle.ts","../src/generators/kysely.ts","../src/utils/get-package-info.ts","../src/generators/prisma.ts","../src/generators/index.ts"],"sourcesContent":["import { existsSync } from \"node:fs\";\nimport { initGetFieldName, initGetModelName } from \"better-auth/adapters\";\nimport type { BetterAuthDBSchema, DBFieldAttribute } from \"better-auth/db\";\nimport { getAuthTables } from \"better-auth/db\";\nimport type { BetterAuthOptions } from \"better-auth/types\";\nimport prettier from \"prettier\";\nimport type { SchemaGenerator } from \"./types\";\n\nfunction convertToSnakeCase(str: string, camelCase?: boolean) {\n\tif (camelCase) {\n\t\treturn str;\n\t}\n\t// Handle consecutive capitals (like ID, URL, API) by treating them as a single word\n\treturn str\n\t\t.replace(/([A-Z]+)([A-Z][a-z])/g, \"$1_$2\") // Handle AABb -> AA_Bb\n\t\t.replace(/([a-z\\d])([A-Z])/g, \"$1_$2\") // Handle aBb -> a_Bb\n\t\t.toLowerCase();\n}\n\nexport const generateDrizzleSchema: SchemaGenerator = async ({\n\toptions,\n\tfile,\n\tadapter,\n}) => {\n\tconst tables = getAuthTables(options);\n\tconst filePath = file || \"./auth-schema.ts\";\n\tconst databaseType: \"sqlite\" | \"mysql\" | \"pg\" | undefined =\n\t\tadapter.options?.provider;\n\n\tif (!databaseType) {\n\t\tthrow new Error(\n\t\t\t`Database provider type is undefined during Drizzle schema generation. Please define a \\`provider\\` in the Drizzle adapter config. Read more at https://better-auth.com/docs/adapters/drizzle`,\n\t\t);\n\t}\n\tconst fileExist = existsSync(filePath);\n\n\tlet code: string = generateImport({\n\t\tdatabaseType,\n\t\ttables,\n\t\toptions,\n\t});\n\n\tconst getModelName = initGetModelName({\n\t\tschema: tables,\n\t\tusePlural: adapter.options?.adapterConfig?.usePlural,\n\t});\n\n\tconst getFieldName = initGetFieldName({\n\t\tschema: tables,\n\t\tusePlural: adapter.options?.adapterConfig?.usePlural,\n\t});\n\n\tfor (const tableKey in tables) {\n\t\tconst table = tables[tableKey]!;\n\t\tconst modelName = getModelName(tableKey);\n\t\tconst fields = table.fields;\n\n\t\tfunction getType(name: string, field: DBFieldAttribute) {\n\t\t\t// Not possible to reach, it's here to make typescript happy\n\t\t\tif (!databaseType) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Database provider type is undefined during Drizzle schema generation. Please define a \\`provider\\` in the Drizzle adapter config. Read more at https://better-auth.com/docs/adapters/drizzle`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tname = convertToSnakeCase(name, adapter.options?.camelCase);\n\t\t\tif (field.references?.field === \"id\") {\n\t\t\t\tconst useNumberId =\n\t\t\t\t\toptions.advanced?.database?.useNumberId ||\n\t\t\t\t\toptions.advanced?.database?.generateId === \"serial\";\n\t\t\t\tconst useUUIDs = options.advanced?.database?.generateId === \"uuid\";\n\t\t\t\tif (useNumberId) {\n\t\t\t\t\tif (databaseType === \"pg\") {\n\t\t\t\t\t\treturn `integer('${name}')`;\n\t\t\t\t\t} else if (databaseType === \"mysql\") {\n\t\t\t\t\t\treturn `int('${name}')`;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// using sqlite\n\t\t\t\t\t\treturn `integer('${name}')`;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (useUUIDs && databaseType === \"pg\") {\n\t\t\t\t\treturn `uuid('${name}')`;\n\t\t\t\t}\n\t\t\t\tif (field.references.field) {\n\t\t\t\t\tif (databaseType === \"mysql\") {\n\t\t\t\t\t\treturn `varchar('${name}', { length: 36 })`;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn `text('${name}')`;\n\t\t\t}\n\t\t\tconst type = field.type;\n\t\t\tif (typeof type !== \"string\") {\n\t\t\t\tif (Array.isArray(type) && type.every((x) => typeof x === \"string\")) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsqlite: `text({ enum: [${type.map((x) => `'${x}'`).join(\", \")}] })`,\n\t\t\t\t\t\tpg: `text('${name}', { enum: [${type.map((x) => `'${x}'`).join(\", \")}] })`,\n\t\t\t\t\t\tmysql: `mysqlEnum([${type.map((x) => `'${x}'`).join(\", \")}])`,\n\t\t\t\t\t}[databaseType];\n\t\t\t\t} else {\n\t\t\t\t\tthrow new TypeError(\n\t\t\t\t\t\t`Invalid field type for field ${name} in model ${modelName}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst typeMap: Record<\n\t\t\t\ttypeof type,\n\t\t\t\tRecord<typeof databaseType, string>\n\t\t\t> = {\n\t\t\t\tstring: {\n\t\t\t\t\tsqlite: `text('${name}')`,\n\t\t\t\t\tpg: `text('${name}')`,\n\t\t\t\t\tmysql: field.unique\n\t\t\t\t\t\t? `varchar('${name}', { length: 255 })`\n\t\t\t\t\t\t: field.references\n\t\t\t\t\t\t\t? `varchar('${name}', { length: 36 })`\n\t\t\t\t\t\t\t: field.sortable\n\t\t\t\t\t\t\t\t? `varchar('${name}', { length: 255 })`\n\t\t\t\t\t\t\t\t: field.index\n\t\t\t\t\t\t\t\t\t? `varchar('${name}', { length: 255 })`\n\t\t\t\t\t\t\t\t\t: `text('${name}')`,\n\t\t\t\t},\n\t\t\t\tboolean: {\n\t\t\t\t\tsqlite: `integer('${name}', { mode: 'boolean' })`,\n\t\t\t\t\tpg: `boolean('${name}')`,\n\t\t\t\t\tmysql: `boolean('${name}')`,\n\t\t\t\t},\n\t\t\t\tnumber: {\n\t\t\t\t\tsqlite: `integer('${name}')`,\n\t\t\t\t\tpg: field.bigint\n\t\t\t\t\t\t? `bigint('${name}', { mode: 'number' })`\n\t\t\t\t\t\t: `integer('${name}')`,\n\t\t\t\t\tmysql: field.bigint\n\t\t\t\t\t\t? `bigint('${name}', { mode: 'number' })`\n\t\t\t\t\t\t: `int('${name}')`,\n\t\t\t\t},\n\t\t\t\tdate: {\n\t\t\t\t\tsqlite: `integer('${name}', { mode: 'timestamp_ms' })`,\n\t\t\t\t\tpg: `timestamp('${name}')`,\n\t\t\t\t\tmysql: `timestamp('${name}', { fsp: 3 })`,\n\t\t\t\t},\n\t\t\t\t\"number[]\": {\n\t\t\t\t\tsqlite: `text('${name}', { mode: \"json\" })`,\n\t\t\t\t\tpg: field.bigint\n\t\t\t\t\t\t? `bigint('${name}', { mode: 'number' }).array()`\n\t\t\t\t\t\t: `integer('${name}').array()`,\n\t\t\t\t\tmysql: `text('${name}', { mode: 'json' })`,\n\t\t\t\t},\n\t\t\t\t\"string[]\": {\n\t\t\t\t\tsqlite: `text('${name}', { mode: \"json\" })`,\n\t\t\t\t\tpg: `text('${name}').array()`,\n\t\t\t\t\tmysql: `text('${name}', { mode: \"json\" })`,\n\t\t\t\t},\n\t\t\t\tjson: {\n\t\t\t\t\tsqlite: `text('${name}', { mode: \"json\" })`,\n\t\t\t\t\tpg: `jsonb('${name}')`,\n\t\t\t\t\tmysql: `json('${name}', { mode: \"json\" })`,\n\t\t\t\t},\n\t\t\t} as const;\n\t\t\tconst dbTypeMap = (\n\t\t\t\ttypeMap as Record<string, Record<typeof databaseType, string>>\n\t\t\t)[type as string];\n\t\t\tif (!dbTypeMap) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Unsupported field type '${field.type}' for field '${name}'.`,\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn dbTypeMap[databaseType];\n\t\t}\n\n\t\tlet id: string = \"\";\n\n\t\tconst useNumberId =\n\t\t\toptions.advanced?.database?.useNumberId ||\n\t\t\toptions.advanced?.database?.generateId === \"serial\";\n\t\tconst useUUIDs = options.advanced?.database?.generateId === \"uuid\";\n\n\t\tif (useUUIDs && databaseType === \"pg\") {\n\t\t\tid = `uuid(\"id\").default(sql\\`pg_catalog.gen_random_uuid()\\`).primaryKey()`;\n\t\t} else if (useNumberId) {\n\t\t\tif (databaseType === \"pg\") {\n\t\t\t\tid = `integer(\"id\").generatedByDefaultAsIdentity().primaryKey()`;\n\t\t\t} else if (databaseType === \"sqlite\") {\n\t\t\t\tid = `integer(\"id\", { mode: \"number\" }).primaryKey({ autoIncrement: true })`;\n\t\t\t} else {\n\t\t\t\tid = `int(\"id\").autoincrement().primaryKey()`;\n\t\t\t}\n\t\t} else {\n\t\t\tif (databaseType === \"mysql\") {\n\t\t\t\tid = `varchar('id', { length: 36 }).primaryKey()`;\n\t\t\t} else if (databaseType === \"pg\") {\n\t\t\t\tid = `text('id').primaryKey()`;\n\t\t\t} else {\n\t\t\t\tid = `text('id').primaryKey()`;\n\t\t\t}\n\t\t}\n\n\t\ttype Index = { type: \"uniqueIndex\" | \"index\"; name: string; on: string };\n\n\t\tconst indexes: Index[] = [];\n\n\t\tconst assignIndexes = (indexes: Index[]): string => {\n\t\t\tif (!indexes.length) return \"\";\n\n\t\t\tconst code: string[] = [`, (table) => [`];\n\n\t\t\tfor (const index of indexes) {\n\t\t\t\tcode.push(` ${index.type}(\"${index.name}\").on(table.${index.on}),`);\n\t\t\t}\n\n\t\t\tcode.push(`]`);\n\n\t\t\treturn code.join(\"\\n\");\n\t\t};\n\n\t\tconst schema = `export const ${modelName} = ${databaseType}Table(\"${convertToSnakeCase(\n\t\t\tmodelName,\n\t\t\tadapter.options?.camelCase,\n\t\t)}\", {\n\t\t\t\t\tid: ${id},\n\t\t\t\t\t${Object.keys(fields)\n\t\t\t\t\t\t.map((field) => {\n\t\t\t\t\t\t\tconst attr = fields[field]!;\n\t\t\t\t\t\t\tconst fieldName = attr.fieldName || field;\n\t\t\t\t\t\t\tlet type = getType(fieldName, attr);\n\n\t\t\t\t\t\t\tif (attr.index && !attr.unique) {\n\t\t\t\t\t\t\t\tindexes.push({\n\t\t\t\t\t\t\t\t\ttype: \"index\",\n\t\t\t\t\t\t\t\t\tname: `${modelName}_${fieldName}_idx`,\n\t\t\t\t\t\t\t\t\ton: fieldName,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t} else if (attr.index && attr.unique) {\n\t\t\t\t\t\t\t\tindexes.push({\n\t\t\t\t\t\t\t\t\ttype: \"uniqueIndex\",\n\t\t\t\t\t\t\t\t\tname: `${modelName}_${fieldName}_uidx`,\n\t\t\t\t\t\t\t\t\ton: fieldName,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tattr.defaultValue !== null &&\n\t\t\t\t\t\t\t\ttypeof attr.defaultValue !== \"undefined\"\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tif (typeof attr.defaultValue === \"function\") {\n\t\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\t\tattr.type === \"date\" &&\n\t\t\t\t\t\t\t\t\t\tattr.defaultValue.toString().includes(\"new Date()\")\n\t\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\t\tif (databaseType === \"sqlite\") {\n\t\t\t\t\t\t\t\t\t\t\ttype += `.default(sql\\`(cast(unixepoch('subsecond') * 1000 as integer))\\`)`;\n\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\ttype += `.defaultNow()`;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t// we are intentionally not adding .$defaultFn(${attr.defaultValue})\n\t\t\t\t\t\t\t\t\t\t// this is because if the defaultValue is a function, it could have\n\t\t\t\t\t\t\t\t\t\t// custom logic within that function that might not work in drizzle's context.\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else if (typeof attr.defaultValue === \"string\") {\n\t\t\t\t\t\t\t\t\ttype += `.default(\"${attr.defaultValue}\")`;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\ttype += `.default(${attr.defaultValue})`;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// Add .$onUpdate() for fields with onUpdate property\n\t\t\t\t\t\t\t// Supported for all database types: PostgreSQL, MySQL, and SQLite\n\t\t\t\t\t\t\tif (attr.onUpdate && attr.type === \"date\") {\n\t\t\t\t\t\t\t\tif (typeof attr.onUpdate === \"function\") {\n\t\t\t\t\t\t\t\t\ttype += `.$onUpdate(${attr.onUpdate})`;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn `${fieldName}: ${type}${attr.required ? \".notNull()\" : \"\"}${\n\t\t\t\t\t\t\t\tattr.unique ? \".unique()\" : \"\"\n\t\t\t\t\t\t\t}${\n\t\t\t\t\t\t\t\tattr.references\n\t\t\t\t\t\t\t\t\t? `.references(()=> ${getModelName(\n\t\t\t\t\t\t\t\t\t\t\tattr.references.model,\n\t\t\t\t\t\t\t\t\t\t)}.${getFieldName({ model: attr.references.model, field: attr.references.field })}, { onDelete: '${\n\t\t\t\t\t\t\t\t\t\t\tattr.references.onDelete || \"cascade\"\n\t\t\t\t\t\t\t\t\t\t}' })`\n\t\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.join(\",\\n \")}\n\t\t\t\t\t}${assignIndexes(indexes)});`;\n\t\tcode += `\\n${schema}\\n`;\n\t}\n\n\tlet relationsString: string = \"\";\n\tfor (const tableKey in tables) {\n\t\tconst table = tables[tableKey]!;\n\t\tconst modelName = getModelName(tableKey);\n\n\t\ttype Relation = {\n\t\t\t/**\n\t\t\t * The key of the relation that will be defined in the Drizzle schema.\n\t\t\t * For \"one\" relations: singular (e.g., \"user\")\n\t\t\t * For \"many\" relations: plural (e.g., \"posts\")\n\t\t\t */\n\t\t\tkey: string;\n\t\t\t/**\n\t\t\t * The model name being referenced.\n\t\t\t */\n\t\t\tmodel: string;\n\t\t\t/**\n\t\t\t * The type of the relation: \"one\" (many-to-one) or \"many\" (one-to-many).\n\t\t\t */\n\t\t\ttype: \"one\" | \"many\";\n\t\t\t/**\n\t\t\t * Foreign key field name and reference details (only for \"one\" relations).\n\t\t\t */\n\t\t\treference?: {\n\t\t\t\tfield: string;\n\t\t\t\treferences: string;\n\t\t\t\tfieldName: string; // Original field name for generating unique relation export names\n\t\t\t};\n\t\t};\n\n\t\tconst oneRelations: Relation[] = [];\n\t\tconst manyRelations: Relation[] = [];\n\t\t// Set to track \"many\" relations by key to prevent duplicates\n\t\tconst manyRelationsSet = new Set<string>();\n\n\t\t// 1. Find all foreign keys in THIS table (creates \"one\" relations)\n\t\tconst fields = Object.entries(table.fields);\n\t\tconst foreignFields = fields.filter(([_, field]) => field.references);\n\n\t\tfor (const [fieldName, field] of foreignFields) {\n\t\t\tconst referencedModel = field.references!.model;\n\t\t\tconst relationKey = getModelName(referencedModel);\n\t\t\tconst fieldRef = `${getModelName(tableKey)}.${getFieldName({ model: tableKey, field: fieldName })}`;\n\t\t\tconst referenceRef = `${getModelName(referencedModel)}.${getFieldName({ model: referencedModel, field: field.references!.field || \"id\" })}`;\n\n\t\t\t// Create a separate relation for each foreign key\n\t\t\toneRelations.push({\n\t\t\t\tkey: relationKey,\n\t\t\t\tmodel: getModelName(referencedModel),\n\t\t\t\ttype: \"one\",\n\t\t\t\treference: {\n\t\t\t\t\tfield: fieldRef,\n\t\t\t\t\treferences: referenceRef,\n\t\t\t\t\tfieldName: fieldName,\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\n\t\t// 2. Find all OTHER tables that reference THIS table (creates \"many\" relations)\n\t\tconst otherModels = Object.entries(tables).filter(\n\t\t\t([modelName]) => modelName !== tableKey,\n\t\t);\n\n\t\t// Map to track relations by model name to determine if unique or many\n\t\tconst modelRelationsMap = new Map<\n\t\t\tstring,\n\t\t\t{\n\t\t\t\tmodelName: string;\n\t\t\t\thasUnique: boolean;\n\t\t\t\thasMany: boolean;\n\t\t\t}\n\t\t>();\n\n\t\tfor (const [modelName, otherTable] of otherModels) {\n\t\t\tconst foreignKeysPointingHere = Object.entries(otherTable.fields).filter(\n\t\t\t\t([_, field]) =>\n\t\t\t\t\tfield.references?.model === tableKey ||\n\t\t\t\t\tfield.references?.model === getModelName(tableKey),\n\t\t\t);\n\n\t\t\tif (foreignKeysPointingHere.length === 0) continue;\n\n\t\t\t// Check if any foreign key is unique\n\t\t\tconst hasUnique = foreignKeysPointingHere.some(\n\t\t\t\t([_, field]) => !!field.unique,\n\t\t\t);\n\t\t\tconst hasMany = foreignKeysPointingHere.some(\n\t\t\t\t([_, field]) => !field.unique,\n\t\t\t);\n\n\t\t\tmodelRelationsMap.set(modelName, {\n\t\t\t\tmodelName,\n\t\t\t\thasUnique,\n\t\t\t\thasMany,\n\t\t\t});\n\t\t}\n\n\t\t// Add relations, deduplicating by relationKey\n\t\tfor (const { modelName, hasMany } of modelRelationsMap.values()) {\n\t\t\t// Determine relation type: if all are unique, it's \"one\", otherwise \"many\"\n\t\t\tconst relationType = hasMany ? \"many\" : \"one\";\n\t\t\tlet relationKey = getModelName(modelName);\n\n\t\t\t// We have to apply this after checking if they have usePlural because otherwise they will end up seeing:\n\t\t\t/* cspell:disable-next-line */\n\t\t\t// \"sesionss\", or \"accountss\" - double s's.\n\t\t\tif (\n\t\t\t\t!adapter.options?.adapterConfig?.usePlural &&\n\t\t\t\trelationType === \"many\"\n\t\t\t) {\n\t\t\t\trelationKey = `${relationKey}s`;\n\t\t\t}\n\n\t\t\t// Only add if we haven't seen this key before\n\t\t\tif (!manyRelationsSet.has(relationKey)) {\n\t\t\t\tmanyRelationsSet.add(relationKey);\n\t\t\t\tmanyRelations.push({\n\t\t\t\t\tkey: relationKey,\n\t\t\t\t\tmodel: getModelName(modelName),\n\t\t\t\t\ttype: relationType,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// Group \"one\" relations by referenced model to detect duplicates\n\t\tconst relationsByModel = new Map<string, Relation[]>();\n\t\tfor (const relation of oneRelations) {\n\t\t\tif (relation.reference) {\n\t\t\t\tconst modelKey = relation.key;\n\t\t\t\tif (!relationsByModel.has(modelKey)) {\n\t\t\t\t\trelationsByModel.set(modelKey, []);\n\t\t\t\t}\n\t\t\t\trelationsByModel.get(modelKey)!.push(relation);\n\t\t\t}\n\t\t}\n\n\t\t// Separate relations with duplicates (same model) from those without\n\t\tconst duplicateRelations: Relation[] = [];\n\t\tconst singleRelations: Relation[] = [];\n\n\t\tfor (const [_modelKey, relations] of relationsByModel.entries()) {\n\t\t\tif (relations.length > 1) {\n\t\t\t\t// Multiple relations to the same model - these need field-specific naming\n\t\t\t\tduplicateRelations.push(...relations);\n\t\t\t} else {\n\t\t\t\t// Single relation to this model - can be combined with others\n\t\t\t\tsingleRelations.push(relations[0]!);\n\t\t\t}\n\t\t}\n\n\t\t// Generate field-specific exports for duplicate relations\n\t\tfor (const relation of duplicateRelations) {\n\t\t\tif (relation.reference) {\n\t\t\t\tconst fieldName = relation.reference.fieldName;\n\t\t\t\tconst relationExportName = `${modelName}${fieldName.charAt(0).toUpperCase() + fieldName.slice(1)}Relations`;\n\n\t\t\t\tconst tableRelation = `export const ${relationExportName} = relations(${getModelName(\n\t\t\t\t\ttable.modelName,\n\t\t\t\t)}, ({ one }) => ({\n\t\t\t\t${relation.key}: one(${relation.model}, {\n\t\t\t\t\tfields: [${relation.reference.field}],\n\t\t\t\t\treferences: [${relation.reference.references}],\n\t\t\t\t})\n\t\t\t}))`;\n\n\t\t\t\trelationsString += `\\n${tableRelation}\\n`;\n\t\t\t}\n\t\t}\n\n\t\t// Combine all single \"one\" relations and \"many\" relations into exports\n\t\tconst hasOne = singleRelations.length > 0;\n\t\tconst hasMany = manyRelations.length > 0;\n\n\t\tif (hasOne && hasMany) {\n\t\t\t// Both \"one\" and \"many\" relations exist - combine in one export\n\t\t\tconst tableRelation = `export const ${modelName}Relations = relations(${getModelName(\n\t\t\t\ttable.modelName,\n\t\t\t)}, ({ one, many }) => ({\n\t\t\t\t${singleRelations\n\t\t\t\t\t.map((relation) =>\n\t\t\t\t\t\trelation.reference\n\t\t\t\t\t\t\t? ` ${relation.key}: one(${relation.model}, {\n\t\t\t\t\tfields: [${relation.reference.field}],\n\t\t\t\t\treferences: [${relation.reference.references}],\n\t\t\t\t})`\n\t\t\t\t\t\t\t: \"\",\n\t\t\t\t\t)\n\t\t\t\t\t.filter((x) => x !== \"\")\n\t\t\t\t\t.join(\",\\n \")}${\n\t\t\t\t\tsingleRelations.length > 0 && manyRelations.length > 0 ? \",\" : \"\"\n\t\t\t\t}\n\t\t\t\t${manyRelations\n\t\t\t\t\t.map(({ key, model }) => ` ${key}: many(${model})`)\n\t\t\t\t\t.join(\",\\n \")}\n\t\t\t}))`;\n\n\t\t\trelationsString += `\\n${tableRelation}\\n`;\n\t\t} else if (hasOne) {\n\t\t\t// Only \"one\" relations exist\n\t\t\tconst tableRelation = `export const ${modelName}Relations = relations(${getModelName(\n\t\t\t\ttable.modelName,\n\t\t\t)}, ({ one }) => ({\n\t\t\t\t${singleRelations\n\t\t\t\t\t.map((relation) =>\n\t\t\t\t\t\trelation.reference\n\t\t\t\t\t\t\t? ` ${relation.key}: one(${relation.model}, {\n\t\t\t\t\tfields: [${relation.reference.field}],\n\t\t\t\t\treferences: [${relation.reference.references}],\n\t\t\t\t})`\n\t\t\t\t\t\t\t: \"\",\n\t\t\t\t\t)\n\t\t\t\t\t.filter((x) => x !== \"\")\n\t\t\t\t\t.join(\",\\n \")}\n\t\t\t}))`;\n\n\t\t\trelationsString += `\\n${tableRelation}\\n`;\n\t\t} else if (hasMany) {\n\t\t\t// Only \"many\" relations exist\n\t\t\tconst tableRelation = `export const ${modelName}Relations = relations(${getModelName(\n\t\t\t\ttable.modelName,\n\t\t\t)}, ({ many }) => ({\n\t\t\t\t${manyRelations\n\t\t\t\t\t.map(({ key, model }) => ` ${key}: many(${model})`)\n\t\t\t\t\t.join(\",\\n \")}\n\t\t\t}))`;\n\n\t\t\trelationsString += `\\n${tableRelation}\\n`;\n\t\t}\n\t}\n\tcode += `\\n${relationsString}`;\n\n\tconst formattedCode = await prettier.format(code, {\n\t\tparser: \"typescript\",\n\t});\n\treturn {\n\t\tcode: formattedCode,\n\t\tfileName: filePath,\n\t\toverwrite: fileExist,\n\t};\n};\n\nfunction generateImport({\n\tdatabaseType,\n\ttables,\n\toptions,\n}: {\n\tdatabaseType: \"sqlite\" | \"mysql\" | \"pg\";\n\ttables: BetterAuthDBSchema;\n\toptions: BetterAuthOptions;\n}) {\n\tconst rootImports: string[] = [\"relations\"];\n\tconst coreImports: string[] = [];\n\n\tlet hasBigint = false;\n\tlet hasJson = false;\n\n\tfor (const table of Object.values(tables)) {\n\t\tfor (const field of Object.values(table.fields)) {\n\t\t\tif (field.bigint) hasBigint = true;\n\t\t\tif (field.type === \"json\") hasJson = true;\n\t\t}\n\t\tif (hasJson && hasBigint) break;\n\t}\n\n\tconst useNumberId =\n\t\toptions.advanced?.database?.useNumberId ||\n\t\toptions.advanced?.database?.generateId === \"serial\";\n\n\tconst useUUIDs = options.advanced?.database?.generateId === \"uuid\";\n\n\tcoreImports.push(`${databaseType}Table`);\n\tcoreImports.push(\n\t\tdatabaseType === \"mysql\"\n\t\t\t? \"varchar, text\"\n\t\t\t: databaseType === \"pg\"\n\t\t\t\t? \"text\"\n\t\t\t\t: \"text\",\n\t);\n\tcoreImports.push(\n\t\thasBigint ? (databaseType !== \"sqlite\" ? \"bigint\" : \"\") : \"\",\n\t);\n\tcoreImports.push(databaseType !== \"sqlite\" ? \"timestamp, boolean\" : \"\");\n\tif (databaseType === \"mysql\") {\n\t\t// Only include int for MySQL if actually needed\n\t\tconst hasNonBigintNumber = Object.values(tables).some((table) =>\n\t\t\tObject.values(table.fields).some(\n\t\t\t\t(field) =>\n\t\t\t\t\t(field.type === \"number\" || field.type === \"number[]\") &&\n\t\t\t\t\t!field.bigint,\n\t\t\t),\n\t\t);\n\t\tconst needsInt = !!useNumberId || hasNonBigintNumber;\n\t\tif (needsInt) {\n\t\t\tcoreImports.push(\"int\");\n\t\t}\n\t\tconst hasEnum = Object.values(tables).some((table) =>\n\t\t\tObject.values(table.fields).some(\n\t\t\t\t(field) =>\n\t\t\t\t\ttypeof field.type !== \"string\" &&\n\t\t\t\t\tArray.isArray(field.type) &&\n\t\t\t\t\tfield.type.every((x) => typeof x === \"string\"),\n\t\t\t),\n\t\t);\n\t\tif (hasEnum) {\n\t\t\tcoreImports.push(\"mysqlEnum\");\n\t\t}\n\t} else if (databaseType === \"pg\") {\n\t\tif (useUUIDs) {\n\t\t\trootImports.push(\"sql\");\n\t\t}\n\n\t\t// Only include integer for PG if actually needed\n\t\tconst hasNonBigintNumber = Object.values(tables).some((table) =>\n\t\t\tObject.values(table.fields).some(\n\t\t\t\t(field) =>\n\t\t\t\t\t(field.type === \"number\" || field.type === \"number[]\") &&\n\t\t\t\t\t!field.bigint,\n\t\t\t),\n\t\t);\n\t\tconst hasFkToId = Object.values(tables).some((table) =>\n\t\t\tObject.values(table.fields).some(\n\t\t\t\t(field) => field.references?.field === \"id\",\n\t\t\t),\n\t\t);\n\t\t// handles the references field with useNumberId\n\t\tconst needsInteger =\n\t\t\thasNonBigintNumber ||\n\t\t\t((options.advanced?.database?.useNumberId ||\n\t\t\t\toptions.advanced?.database?.generateId === \"serial\") &&\n\t\t\t\thasFkToId);\n\t\tif (needsInteger) {\n\t\t\tcoreImports.push(\"integer\");\n\t\t}\n\t} else {\n\t\tcoreImports.push(\"integer\");\n\t}\n\tif (databaseType === \"pg\" && useUUIDs) {\n\t\tcoreImports.push(\"uuid\");\n\t}\n\n\t//handle json last on the import order\n\tif (hasJson) {\n\t\tif (databaseType === \"pg\") coreImports.push(\"jsonb\");\n\t\tif (databaseType === \"mysql\") coreImports.push(\"json\");\n\t\t// sqlite uses text for JSON, so there's no need to handle this case\n\t}\n\n\t// Add sql import for SQLite timestamps with defaultNow\n\tconst hasSQLiteTimestamp =\n\t\tdatabaseType === \"sqlite\" &&\n\t\tObject.values(tables).some((table) =>\n\t\t\tObject.values(table.fields).some(\n\t\t\t\t(field) =>\n\t\t\t\t\tfield.type === \"date\" &&\n\t\t\t\t\tfield.defaultValue &&\n\t\t\t\t\ttypeof field.defaultValue === \"function\" &&\n\t\t\t\t\tfield.defaultValue.toString().includes(\"new Date()\"),\n\t\t\t),\n\t\t);\n\n\tif (hasSQLiteTimestamp) {\n\t\trootImports.push(\"sql\");\n\t}\n\n\t//handle indexes\n\tconst hasIndexes = Object.values(tables).some((table) =>\n\t\tObject.values(table.fields).some((field) => field.index && !field.unique),\n\t);\n\tconst hasUniqueIndexes = Object.values(tables).some((table) =>\n\t\tObject.values(table.fields).some((field) => field.unique && field.index),\n\t);\n\tif (hasIndexes) {\n\t\tcoreImports.push(\"index\");\n\t}\n\tif (hasUniqueIndexes) {\n\t\tcoreImports.push(\"uniqueIndex\");\n\t}\n\n\treturn `${rootImports.length > 0 ? `import { ${rootImports.join(\", \")} } from \"drizzle-orm\";\\n` : \"\"}import { ${coreImports\n\t\t.map((x) => x.trim())\n\t\t.filter((x) => x !== \"\")\n\t\t.join(\", \")} } from \"drizzle-orm/${databaseType}-core\";\\n`;\n}\n","import { getMigrations } from \"better-auth/db\";\nimport type { SchemaGenerator } from \"./types\";\n\nexport const generateKyselySchema: SchemaGenerator = async ({\n\toptions,\n\tfile,\n}) => {\n\tconst { compileMigrations } = await getMigrations(options);\n\tconst migrations = await compileMigrations();\n\treturn {\n\t\tcode: migrations.trim() === \";\" ? \"\" : migrations,\n\t\tfileName:\n\t\t\tfile ||\n\t\t\t`./better-auth_migrations/${new Date()\n\t\t\t\t.toISOString()\n\t\t\t\t.replace(/:/g, \"-\")}.sql`,\n\t};\n};\n","import fs from \"node:fs\";\nimport path from \"node:path\";\n\nexport function getPackageInfo(cwd?: string) {\n\tconst packageJsonPath = cwd\n\t\t? path.join(cwd, \"package.json\")\n\t\t: path.join(\"package.json\");\n\treturn JSON.parse(fs.readFileSync(packageJsonPath, \"utf-8\"));\n}\n\nexport function getPrismaVersion(cwd?: string): number | null {\n\ttry {\n\t\tconst packageInfo = getPackageInfo(cwd);\n\t\tconst prismaVersion =\n\t\t\tpackageInfo.dependencies?.prisma ||\n\t\t\tpackageInfo.devDependencies?.prisma ||\n\t\t\tpackageInfo.dependencies?.[\"@prisma/client\"] ||\n\t\t\tpackageInfo.devDependencies?.[\"@prisma/client\"];\n\n\t\tif (!prismaVersion) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Extract major version number from version string\n\t\t// Handles versions like \"^5.0.0\", \"~7.1.0\", \"7.0.0\", etc.\n\t\tconst match = prismaVersion.match(/(\\d+)/);\n\t\treturn match ? parseInt(match[1], 10) : null;\n\t} catch {\n\t\t// If package.json doesn't exist or can't be read, return null\n\t\treturn null;\n\t}\n}\n","import { existsSync } from \"node:fs\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { capitalizeFirstLetter } from \"@better-auth/core/utils\";\nimport { produceSchema } from \"@mrleebo/prisma-ast\";\nimport { initGetFieldName, initGetModelName } from \"better-auth/adapters\";\nimport type { DBFieldType } from \"better-auth/db\";\nimport { getAuthTables } from \"better-auth/db\";\nimport { getPrismaVersion } from \"../utils/get-package-info\";\nimport type { SchemaGenerator } from \"./types\";\n\nexport const generatePrismaSchema: SchemaGenerator = async ({\n\tadapter,\n\toptions,\n\tfile,\n}) => {\n\tconst provider: \"sqlite\" | \"postgresql\" | \"mysql\" | \"mongodb\" =\n\t\tadapter.options?.provider || \"postgresql\";\n\tconst tables = getAuthTables(options);\n\tconst filePath = file || \"./prisma/schema.prisma\";\n\tconst schemaPrismaExist = existsSync(path.join(process.cwd(), filePath));\n\n\tconst getModelName = initGetModelName({\n\t\tschema: getAuthTables(options),\n\t\tusePlural: adapter.options?.adapterConfig?.usePlural,\n\t});\n\tconst getFieldName = initGetFieldName({\n\t\tschema: getAuthTables(options),\n\t\tusePlural: false,\n\t});\n\n\tlet schemaPrisma = \"\";\n\tif (schemaPrismaExist) {\n\t\tschemaPrisma = await fs.readFile(\n\t\t\tpath.join(process.cwd(), filePath),\n\t\t\t\"utf-8\",\n\t\t);\n\t} else {\n\t\tschemaPrisma = getNewPrisma(provider, process.cwd());\n\t}\n\n\t// Update generator block for Prisma v7+ in existing schemas\n\tconst prismaVersion = getPrismaVersion(process.cwd());\n\tif (prismaVersion && prismaVersion >= 7 && schemaPrismaExist) {\n\t\tschemaPrisma = produceSchema(schemaPrisma, (builder) => {\n\t\t\tconst generator: any = builder.findByType(\"generator\", {\n\t\t\t\tname: \"client\",\n\t\t\t});\n\t\t\tif (generator && generator.properties) {\n\t\t\t\tconst providerProp = generator.properties.find(\n\t\t\t\t\t(prop: any) => prop.type === \"assignment\" && prop.key === \"provider\",\n\t\t\t\t);\n\t\t\t\tif (providerProp && providerProp.value === '\"prisma-client-js\"') {\n\t\t\t\t\tproviderProp.value = '\"prisma-client\"';\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tconst manyToManyRelations = new Map();\n\n\tfor (const table in tables) {\n\t\tconst fields = tables[table]?.fields;\n\t\tfor (const field in fields) {\n\t\t\tconst attr = fields[field]!;\n\t\t\tif (attr.references) {\n\t\t\t\tconst referencedOriginalModel = attr.references.model;\n\t\t\t\tconst referencedCustomModel =\n\t\t\t\t\ttables[referencedOriginalModel]?.modelName || referencedOriginalModel;\n\t\t\t\tconst referencedModelNameCap = capitalizeFirstLetter(\n\t\t\t\t\tgetModelName(referencedCustomModel),\n\t\t\t\t);\n\n\t\t\t\tif (!manyToManyRelations.has(referencedModelNameCap)) {\n\t\t\t\t\tmanyToManyRelations.set(referencedModelNameCap, new Set());\n\t\t\t\t}\n\n\t\t\t\tconst currentCustomModel = tables[table]?.modelName || table;\n\t\t\t\tconst currentModelNameCap = capitalizeFirstLetter(\n\t\t\t\t\tgetModelName(currentCustomModel),\n\t\t\t\t);\n\n\t\t\t\tmanyToManyRelations\n\t\t\t\t\t.get(referencedModelNameCap)\n\t\t\t\t\t.add(currentModelNameCap);\n\t\t\t}\n\t\t}\n\t}\n\n\tconst indexedFields = new Map<string, string[]>();\n\tfor (const table in tables) {\n\t\tconst fields = tables[table]?.fields;\n\t\tconst customModelName = tables[table]?.modelName || table;\n\t\tconst modelName = capitalizeFirstLetter(getModelName(customModelName));\n\t\tindexedFields.set(modelName, []);\n\n\t\tfor (const field in fields) {\n\t\t\tconst attr = fields[field]!;\n\t\t\tif (attr.index && !attr.unique) {\n\t\t\t\tconst fieldName = attr.fieldName || field;\n\t\t\t\tindexedFields.get(modelName)!.push(fieldName);\n\t\t\t}\n\t\t}\n\t}\n\n\tconst schema = produceSchema(schemaPrisma, (builder) => {\n\t\tfor (const table in tables) {\n\t\t\tconst originalTableName = table;\n\t\t\tconst customModelName = tables[table]?.modelName || table;\n\t\t\tconst modelName = capitalizeFirstLetter(getModelName(customModelName));\n\t\t\tconst fields = tables[table]?.fields;\n\t\t\tfunction getType({\n\t\t\t\tisBigint,\n\t\t\t\tisOptional,\n\t\t\t\ttype,\n\t\t\t}: {\n\t\t\t\ttype: DBFieldType;\n\t\t\t\tisOptional: boolean;\n\t\t\t\tisBigint: boolean;\n\t\t\t}) {\n\t\t\t\tif (type === \"string\") {\n\t\t\t\t\treturn isOptional ? \"String?\" : \"String\";\n\t\t\t\t}\n\t\t\t\tif (type === \"number\" && isBigint) {\n\t\t\t\t\treturn isOptional ? \"BigInt?\" : \"BigInt\";\n\t\t\t\t}\n\t\t\t\tif (type === \"number\") {\n\t\t\t\t\treturn isOptional ? \"Int?\" : \"Int\";\n\t\t\t\t}\n\t\t\t\tif (type === \"boolean\") {\n\t\t\t\t\treturn isOptional ? \"Boolean?\" : \"Boolean\";\n\t\t\t\t}\n\t\t\t\tif (type === \"date\") {\n\t\t\t\t\treturn isOptional ? \"DateTime?\" : \"DateTime\";\n\t\t\t\t}\n\t\t\t\tif (type === \"json\") {\n\t\t\t\t\tif (provider === \"sqlite\" || provider === \"mysql\") {\n\t\t\t\t\t\treturn isOptional ? \"String?\" : \"String\";\n\t\t\t\t\t}\n\t\t\t\t\treturn isOptional ? \"Json?\" : \"Json\";\n\t\t\t\t}\n\t\t\t\tif (type === \"string[]\") {\n\t\t\t\t\t// SQLite and MySQL don't support array of strings, so we use string instead\n\t\t\t\t\t// adapter should handle JSON.stringify and JSON.parse conversion for these fields\n\t\t\t\t\tif (provider === \"sqlite\" || provider === \"mysql\") {\n\t\t\t\t\t\treturn isOptional ? \"String?\" : \"String\";\n\t\t\t\t\t}\n\t\t\t\t\treturn \"String[]\";\n\t\t\t\t}\n\t\t\t\tif (type === \"number[]\") {\n\t\t\t\t\t// SQLite and MySQL don't support array of numbers, so we use int instead\n\t\t\t\t\t// adapter should handle JSON.stringify and JSON.parse conversion for these fields\n\t\t\t\t\tif (provider === \"sqlite\" || provider === \"mysql\") {\n\t\t\t\t\t\treturn \"String\";\n\t\t\t\t\t}\n\t\t\t\t\treturn \"Int[]\";\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst prismaModel = builder.findByType(\"model\", {\n\t\t\t\tname: modelName,\n\t\t\t});\n\n\t\t\tif (!prismaModel) {\n\t\t\t\tif (provider === \"mongodb\") {\n\t\t\t\t\t// Mongo DB doesn't support auto increment, so just use their normal _id.\n\t\t\t\t\tbuilder\n\t\t\t\t\t\t.model(modelName)\n\t\t\t\t\t\t.field(\"id\", \"String\")\n\t\t\t\t\t\t.attribute(\"id\")\n\t\t\t\t\t\t.attribute(`map(\"_id\")`);\n\t\t\t\t} else {\n\t\t\t\t\tconst useNumberId =\n\t\t\t\t\t\toptions.advanced?.database?.useNumberId ||\n\t\t\t\t\t\toptions.advanced?.database?.generateId === \"serial\";\n\t\t\t\t\tconst useUUIDs = options.advanced?.database?.generateId === \"uuid\";\n\t\t\t\t\tif (useNumberId) {\n\t\t\t\t\t\tbuilder\n\t\t\t\t\t\t\t.model(modelName)\n\t\t\t\t\t\t\t.field(\"id\", \"Int\")\n\t\t\t\t\t\t\t.attribute(\"id\")\n\t\t\t\t\t\t\t.attribute(\"default(autoincrement())\");\n\t\t\t\t\t} else if (useUUIDs && provider === \"postgresql\") {\n\t\t\t\t\t\tbuilder\n\t\t\t\t\t\t\t.model(modelName)\n\t\t\t\t\t\t\t.field(\"id\", \"String\")\n\t\t\t\t\t\t\t.attribute(\"id\")\n\t\t\t\t\t\t\t.attribute('default(dbgenerated(\"pg_catalog.gen_random_uuid()\"))')\n\t\t\t\t\t\t\t.attribute(\"db.Uuid\");\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbuilder.model(modelName).field(\"id\", \"String\").attribute(\"id\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (const field in fields) {\n\t\t\t\tconst attr = fields[field]!;\n\t\t\t\tconst fieldName = attr.fieldName || field;\n\n\t\t\t\tif (prismaModel) {\n\t\t\t\t\tconst isAlreadyExist = builder.findByType(\"field\", {\n\t\t\t\t\t\tname: fieldName,\n\t\t\t\t\t\twithin: prismaModel.properties,\n\t\t\t\t\t});\n\t\t\t\t\tif (isAlreadyExist) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst useUUIDs = options.advanced?.database?.generateId === \"uuid\";\n\t\t\t\tconst useNumberId =\n\t\t\t\t\toptions.advanced?.database?.useNumberId ||\n\t\t\t\t\toptions.advanced?.database?.generateId === \"serial\";\n\t\t\t\tconst fieldBuilder = builder.model(modelName).field(\n\t\t\t\t\tfieldName,\n\t\t\t\t\tfield === \"id\" && useNumberId\n\t\t\t\t\t\t? getType({\n\t\t\t\t\t\t\t\tisBigint: false,\n\t\t\t\t\t\t\t\tisOptional: false,\n\t\t\t\t\t\t\t\ttype: \"number\",\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t: getType({\n\t\t\t\t\t\t\t\tisBigint: attr?.bigint || false,\n\t\t\t\t\t\t\t\tisOptional: !attr?.required,\n\t\t\t\t\t\t\t\ttype:\n\t\t\t\t\t\t\t\t\tattr.references?.field === \"id\"\n\t\t\t\t\t\t\t\t\t\t? useNumberId\n\t\t\t\t\t\t\t\t\t\t\t? \"number\"\n\t\t\t\t\t\t\t\t\t\t\t: \"string\"\n\t\t\t\t\t\t\t\t\t\t: attr.type,\n\t\t\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t\tif (field === \"id\") {\n\t\t\t\t\tfieldBuilder.attribute(\"id\");\n\t\t\t\t\tif (provider === \"mongodb\") {\n\t\t\t\t\t\tfieldBuilder.attribute(`map(\"_id\")`);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (attr.unique) {\n\t\t\t\t\tbuilder.model(modelName).blockAttribute(`unique([${fieldName}])`);\n\t\t\t\t}\n\n\t\t\t\tif (attr.defaultValue !== undefined) {\n\t\t\t\t\tif (Array.isArray(attr.defaultValue)) {\n\t\t\t\t\t\t// for json objects and array of object\n\n\t\t\t\t\t\tif (attr.type === \"json\") {\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tObject.prototype.toString.call(attr.defaultValue[0]) ===\n\t\t\t\t\t\t\t\t\"[object Object]\"\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tfieldBuilder.attribute(\n\t\t\t\t\t\t\t\t\t`default(\"${JSON.stringify(attr.defaultValue).replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"')}\")`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst jsonArray = [];\n\t\t\t\t\t\t\tfor (const value of attr.defaultValue) jsonArray.push(value);\n\t\t\t\t\t\t\tfieldBuilder.attribute(\n\t\t\t\t\t\t\t\t`default(\"${JSON.stringify(jsonArray).replace(/\"/g, '\\\\\"')}\")`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (attr.defaultValue.length === 0) {\n\t\t\t\t\t\t\tfieldBuilder.attribute(`default([])`);\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\ttypeof attr.defaultValue[0] === \"string\" &&\n\t\t\t\t\t\t\tattr.type === \"string[]\"\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tconst valueArray = [];\n\t\t\t\t\t\t\tfor (const value of attr.defaultValue)\n\t\t\t\t\t\t\t\tvalueArray.push(JSON.stringify(value));\n\t\t\t\t\t\t\tfieldBuilder.attribute(`default([${valueArray}])`);\n\t\t\t\t\t\t} else if (typeof attr.defaultValue[0] === \"number\") {\n\t\t\t\t\t\t\tconst valueArray = [];\n\t\t\t\t\t\t\tfor (const value of attr.defaultValue)\n\t\t\t\t\t\t\t\tvalueArray.push(`${value}`);\n\t\t\t\t\t\t\tfieldBuilder.attribute(`default([${valueArray}])`);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// for json objects\n\t\t\t\t\telse if (\n\t\t\t\t\t\ttypeof attr.defaultValue === \"object\" &&\n\t\t\t\t\t\t!Array.isArray(attr.defaultValue) &&\n\t\t\t\t\t\tattr.defaultValue !== null\n\t\t\t\t\t) {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tObject.entries(attr.defaultValue as Record<string, any>)\n\t\t\t\t\t\t\t\t.length === 0\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tfieldBuilder.attribute(`default(\"{}\")`);\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfieldBuilder.attribute(\n\t\t\t\t\t\t\t`default(\"${JSON.stringify(attr.defaultValue).replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"')}\")`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tif (field === \"createdAt\") {\n\t\t\t\t\t\tfieldBuilder.attribute(\"default(now())\");\n\t\t\t\t\t} else if (\n\t\t\t\t\t\ttypeof attr.defaultValue === \"string\" &&\n\t\t\t\t\t\tprovider !== \"mysql\"\n\t\t\t\t\t) {\n\t\t\t\t\t\tfieldBuilder.attribute(`default(\"${attr.defaultValue}\")`);\n\t\t\t\t\t} else if (\n\t\t\t\t\t\ttypeof attr.defaultValue === \"boolean\" ||\n\t\t\t\t\t\ttypeof attr.defaultValue === \"number\"\n\t\t\t\t\t) {\n\t\t\t\t\t\tfieldBuilder.attribute(`default(${attr.defaultValue})`);\n\t\t\t\t\t} else if (typeof attr.defaultValue === \"function\") {\n\t\t\t\t\t\t// we are intentionally not adding the default value here\n\t\t\t\t\t\t// this is because if the defaultValue is a function, it could have\n\t\t\t\t\t\t// custom logic within that function that might not work in prisma's context.\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// This is a special handling for updatedAt fields\n\t\t\t\tif (field === \"updatedAt\" && attr.onUpdate) {\n\t\t\t\t\tfieldBuilder.attribute(\"updatedAt\");\n\t\t\t\t} else if (attr.onUpdate) {\n\t\t\t\t\t// we are intentionally not adding the onUpdate value here\n\t\t\t\t\t// this is because if the onUpdate is a function, it could have\n\t\t\t\t\t// custom logic within that function that might not work in prisma's context.\n\t\t\t\t}\n\n\t\t\t\tif (attr.references) {\n\t\t\t\t\tif (\n\t\t\t\t\t\tuseUUIDs &&\n\t\t\t\t\t\tprovider === \"postgresql\" &&\n\t\t\t\t\t\tattr.references?.field === \"id\"\n\t\t\t\t\t) {\n\t\t\t\t\t\tbuilder.model(modelName).field(fieldName).attribute(`db.Uuid`);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst referencedOriginalModelName = getModelName(\n\t\t\t\t\t\tattr.references.model,\n\t\t\t\t\t);\n\t\t\t\t\tconst referencedCustomModelName =\n\t\t\t\t\t\ttables[referencedOriginalModelName]?.modelName ||\n\t\t\t\t\t\treferencedOriginalModelName;\n\t\t\t\t\tlet action = \"Cascade\";\n\t\t\t\t\tif (attr.references.onDelete === \"no action\") action = \"NoAction\";\n\t\t\t\t\telse if (attr.references.onDelete === \"set null\") action = \"SetNull\";\n\t\t\t\t\telse if (attr.references.onDelete === \"set default\")\n\t\t\t\t\t\taction = \"SetDefault\";\n\t\t\t\t\telse if (attr.references.onDelete === \"restrict\") action = \"Restrict\";\n\n\t\t\t\t\tconst relationField = `relation(fields: [${getFieldName({ model: originalTableName, field: fieldName })}], references: [${getFieldName({ model: attr.references.model, field: attr.references.field })}], onDelete: ${action})`;\n\t\t\t\t\tbuilder\n\t\t\t\t\t\t.model(modelName)\n\t\t\t\t\t\t.field(\n\t\t\t\t\t\t\treferencedCustomModelName.toLowerCase(),\n\t\t\t\t\t\t\t`${capitalizeFirstLetter(referencedCustomModelName)}${\n\t\t\t\t\t\t\t\t!attr.required ? \"?\" : \"\"\n\t\t\t\t\t\t\t}`,\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.attribute(relationField);\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\t!attr.unique &&\n\t\t\t\t\t!attr.references &&\n\t\t\t\t\tprovider === \"mysql\" &&\n\t\t\t\t\tattr.type === \"string\"\n\t\t\t\t) {\n\t\t\t\t\tbuilder.model(modelName).field(fieldName).attribute(\"db.Text\");\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add many-to-many fields\n\t\t\tif (manyToManyRelations.has(modelName)) {\n\t\t\t\tfor (const relatedModel of manyToManyRelations.get(modelName)) {\n\t\t\t\t\t// Find the FK field on the related model that points to this model\n\t\t\t\t\tconst relatedTableName = Object.keys(tables).find(\n\t\t\t\t\t\t(key) =>\n\t\t\t\t\t\t\tcapitalizeFirstLetter(tables[key]?.modelName || key) ===\n\t\t\t\t\t\t\trelatedModel,\n\t\t\t\t\t);\n\t\t\t\t\tconst relatedFields = relatedTableName\n\t\t\t\t\t\t? tables[relatedTableName]?.fields\n\t\t\t\t\t\t: {};\n\t\t\t\t\tconst fkField = Object.entries(relatedFields || {}).find(\n\t\t\t\t\t\t([_fieldName, fieldAttr]: any) =>\n\t\t\t\t\t\t\tfieldAttr.references &&\n\t\t\t\t\t\t\tgetModelName(fieldAttr.references.model) ===\n\t\t\t\t\t\t\t\tgetModelName(originalTableName),\n\t\t\t\t\t);\n\t\t\t\t\tconst [_fieldKey, fkFieldAttr] = fkField || [];\n\t\t\t\t\tconst isUnique = fkFieldAttr?.unique === true;\n\n\t\t\t\t\tconst fieldName =\n\t\t\t\t\t\tisUnique || adapter.options?.usePlural === true\n\t\t\t\t\t\t\t? `${relatedModel.toLowerCase()}`\n\t\t\t\t\t\t\t: `${relatedModel.toLowerCase()}s`;\n\t\t\t\t\tconst existingField = builder.findByType(\"field\", {\n\t\t\t\t\t\tname: fieldName,\n\t\t\t\t\t\twithin: prismaModel?.properties,\n\t\t\t\t\t});\n\t\t\t\t\tif (!existingField) {\n\t\t\t\t\t\tbuilder\n\t\t\t\t\t\t\t.model(modelName)\n\t\t\t\t\t\t\t.field(fieldName, `${relatedModel}${isUnique ? \"?\" : \"[]\"}`);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add indexes\n\t\t\tconst indexedFieldsForModel = indexedFields.get(modelName);\n\t\t\tif (indexedFieldsForModel && indexedFieldsForModel.length > 0) {\n\t\t\t\tfor (const fieldName of indexedFieldsForModel) {\n\t\t\t\t\tif (prismaModel) {\n\t\t\t\t\t\tconst indexExist = prismaModel.properties.some(\n\t\t\t\t\t\t\t(v) =>\n\t\t\t\t\t\t\t\tv.type === \"attribute\" &&\n\t\t\t\t\t\t\t\tv.name === \"index\" &&\n\t\t\t\t\t\t\t\tJSON.stringify(v.args[0]?.value).includes(fieldName),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (indexExist) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tconst field = Object.entries(fields!).find(\n\t\t\t\t\t\t([key, attr]) => (attr.fieldName || key) === fieldName,\n\t\t\t\t\t)?.[1];\n\n\t\t\t\t\tlet indexField = fieldName;\n\t\t\t\t\tif (provider === \"mysql\" && field && field.type === \"string\") {\n\t\t\t\t\t\tconst useNumberId =\n\t\t\t\t\t\t\toptions.advanced?.database?.useNumberId ||\n\t\t\t\t\t\t\toptions.advanced?.database?.generateId === \"serial\";\n\t\t\t\t\t\tconst useUUIDs = options.advanced?.database?.generateId === \"uuid\";\n\t\t\t\t\t\tif (field.references?.field === \"id\" && (useNumberId || useUUIDs)) {\n\t\t\t\t\t\t\tindexField = `${fieldName}`;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tindexField = `${fieldName}(length: 191)`; // length of 191 because String in Prisma is varchar(191)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tbuilder.model(modelName).blockAttribute(`index([${indexField}])`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst hasAttribute = builder.findByType(\"attribute\", {\n\t\t\t\tname: \"map\",\n\t\t\t\twithin: prismaModel?.properties,\n\t\t\t});\n\t\t\tconst hasChanged = customModelName !== originalTableName;\n\t\t\tif (!hasAttribute) {\n\t\t\t\tbuilder\n\t\t\t\t\t.model(modelName)\n\t\t\t\t\t.blockAttribute(\n\t\t\t\t\t\t\"map\",\n\t\t\t\t\t\t`${getModelName(hasChanged ? customModelName : originalTableName)}`,\n\t\t\t\t\t);\n\t\t\t}\n\t\t}\n\t});\n\n\tconst schemaChanged = schema.trim() !== schemaPrisma.trim();\n\n\treturn {\n\t\tcode: schemaChanged ? schema : \"\",\n\t\tfileName: filePath,\n\t\toverwrite: schemaPrismaExist && schemaChanged,\n\t};\n};\n\nconst getNewPrisma = (provider: string, cwd?: string) => {\n\tconst prismaVersion = getPrismaVersion(cwd);\n\t// Use \"prisma-client\" for Prisma v7+, otherwise use \"prisma-client-js\"\n\tconst clientProvider =\n\t\tprismaVersion && prismaVersion >= 7 ? \"prisma-client\" : \"prisma-client-js\";\n\n\treturn `generator client {\n provider = \"${clientProvider}\"\n }\n\n datasource db {\n provider = \"${provider}\"\n url = ${\n\t\t\tprovider === \"sqlite\" ? `\"file:./dev.db\"` : `env(\"DATABASE_URL\")`\n\t\t}\n }`;\n};\n","import type { BetterAuthOptions } from \"@better-auth/core\";\nimport type { DBAdapter } from \"@better-auth/core/db/adapter\";\nimport { generateDrizzleSchema } from \"./drizzle\";\nimport { generateKyselySchema } from \"./kysely\";\nimport { generatePrismaSchema } from \"./prisma\";\n\nexport const adapters = {\n\tprisma: generatePrismaSchema,\n\tdrizzle: generateDrizzleSchema,\n\tkysely: generateKyselySchema,\n};\n\nexport const generateSchema = (opts: {\n\tadapter: DBAdapter;\n\tfile?: string;\n\toptions: BetterAuthOptions;\n}) => {\n\tconst adapter = opts.adapter;\n\tconst generator =\n\t\tadapter.id in adapters\n\t\t\t? adapters[adapter.id as keyof typeof adapters]\n\t\t\t: null;\n\tif (generator) {\n\t\t// generator from the built-in list above\n\t\treturn generator(opts);\n\t}\n\tif (adapter.createSchema) {\n\t\t// use the custom adapter's createSchema method\n\t\treturn adapter\n\t\t\t.createSchema(opts.options, opts.file)\n\t\t\t.then(({ code, path: fileName, overwrite }) => ({\n\t\t\t\tcode,\n\t\t\t\tfileName,\n\t\t\t\toverwrite,\n\t\t\t}));\n\t}\n\n\tthrow new Error(\n\t\t`${adapter.id} is not supported. If it is a custom adapter, please request the maintainer to implement createSchema`,\n\t);\n};\n"],"mappings":"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"}
|
package/dist/index.mjs
CHANGED
|
@@ -340,7 +340,8 @@ function getPathAliasesRecursive(tsconfigPath, visited = /* @__PURE__ */ new Set
|
|
|
340
340
|
}
|
|
341
341
|
}
|
|
342
342
|
function getPathAliases(cwd) {
|
|
343
|
-
|
|
343
|
+
let tsConfigPath = path.join(cwd, "tsconfig.json");
|
|
344
|
+
if (!fs.existsSync(tsConfigPath)) tsConfigPath = path.join(cwd, "jsconfig.json");
|
|
344
345
|
if (!fs.existsSync(tsConfigPath)) return null;
|
|
345
346
|
try {
|
|
346
347
|
const result = getPathAliasesRecursive(tsConfigPath);
|
|
@@ -2349,18 +2350,15 @@ const login = new Command("login").description("Demo: Test device authorization
|
|
|
2349
2350
|
|
|
2350
2351
|
//#endregion
|
|
2351
2352
|
//#region src/commands/mcp.ts
|
|
2352
|
-
const REMOTE_MCP_URL = "https://mcp.
|
|
2353
|
-
const LOCAL_MCP_COMMAND = "npx @better-auth/mcp";
|
|
2353
|
+
const REMOTE_MCP_URL = "https://mcp.inkeep.com/better-auth/mcp";
|
|
2354
2354
|
async function mcpAction(options) {
|
|
2355
|
-
|
|
2356
|
-
|
|
2357
|
-
if (options.
|
|
2358
|
-
else if (options.
|
|
2359
|
-
else if (options.openCode) handleOpenCodeAction(installLocal, installRemote);
|
|
2360
|
-
else if (options.manual) handleManualAction(installLocal, installRemote);
|
|
2355
|
+
if (options.cursor) await handleCursorAction();
|
|
2356
|
+
else if (options.claudeCode) handleClaudeCodeAction();
|
|
2357
|
+
else if (options.openCode) handleOpenCodeAction();
|
|
2358
|
+
else if (options.manual) handleManualAction();
|
|
2361
2359
|
else showAllOptions();
|
|
2362
2360
|
}
|
|
2363
|
-
async function handleCursorAction(
|
|
2361
|
+
async function handleCursorAction() {
|
|
2364
2362
|
console.log(chalk.bold.blue("🚀 Adding Better Auth MCP to Cursor..."));
|
|
2365
2363
|
const platform = os$1.platform();
|
|
2366
2364
|
let openCommand;
|
|
@@ -2376,73 +2374,43 @@ async function handleCursorAction(installLocal, installRemote) {
|
|
|
2376
2374
|
break;
|
|
2377
2375
|
default: throw new Error(`Unsupported platform: ${platform}`);
|
|
2378
2376
|
}
|
|
2379
|
-
const
|
|
2380
|
-
|
|
2381
|
-
|
|
2382
|
-
|
|
2383
|
-
|
|
2384
|
-
|
|
2385
|
-
|
|
2386
|
-
|
|
2387
|
-
} catch {
|
|
2388
|
-
console.log(chalk.yellow("\n⚠ Could not automatically open Cursor for remote MCP."));
|
|
2389
|
-
}
|
|
2390
|
-
}
|
|
2391
|
-
if (installLocal) {
|
|
2392
|
-
await new Promise((resolve) => setTimeout(resolve, 1e3));
|
|
2393
|
-
const localConfig = { command: LOCAL_MCP_COMMAND };
|
|
2394
|
-
const encodedLocal = base64.encode(new TextEncoder().encode(JSON.stringify(localConfig)));
|
|
2395
|
-
const localDeeplink = `cursor://anysphere.cursor-deeplink/mcp/install?name=${encodeURIComponent("better-auth")}&config=${encodedLocal}`;
|
|
2396
|
-
try {
|
|
2397
|
-
execSync(platform === "win32" ? `start "" "${localDeeplink}"` : `${openCommand} "${localDeeplink}"`, { stdio: "inherit" });
|
|
2398
|
-
installed.push("better-auth (local - setup & diagnostics)");
|
|
2399
|
-
} catch {
|
|
2400
|
-
console.log(chalk.yellow("\n⚠ Could not automatically open Cursor for local MCP."));
|
|
2401
|
-
}
|
|
2402
|
-
}
|
|
2403
|
-
if (installed.length > 0) {
|
|
2404
|
-
console.log(chalk.green("\n✓ Cursor MCP servers installed:"));
|
|
2405
|
-
for (const name of installed) console.log(chalk.green(` • ${name}`));
|
|
2377
|
+
const remoteConfig = { url: REMOTE_MCP_URL };
|
|
2378
|
+
const encodedRemote = base64.encode(new TextEncoder().encode(JSON.stringify(remoteConfig)));
|
|
2379
|
+
const remoteDeeplink = `cursor://anysphere.cursor-deeplink/mcp/install?name=${encodeURIComponent("better-auth")}&config=${encodedRemote}`;
|
|
2380
|
+
try {
|
|
2381
|
+
execSync(platform === "win32" ? `start "" "${remoteDeeplink}"` : `${openCommand} "${remoteDeeplink}"`, { stdio: "inherit" });
|
|
2382
|
+
console.log(chalk.green("\n✓ Better Auth MCP server installed!"));
|
|
2383
|
+
} catch {
|
|
2384
|
+
console.log(chalk.yellow("\n⚠ Could not automatically open Cursor for MCP installation."));
|
|
2406
2385
|
}
|
|
2407
2386
|
console.log(chalk.bold.white("\n✨ Next Steps:"));
|
|
2408
|
-
console.log(chalk.gray("• The MCP
|
|
2387
|
+
console.log(chalk.gray("• The MCP server will be added to your Cursor configuration"));
|
|
2409
2388
|
console.log(chalk.gray("• You can now use Better Auth features directly in Cursor"));
|
|
2410
2389
|
console.log(chalk.gray("• Try: \"Set up Better Auth with Google login\" or \"Help me debug my auth\""));
|
|
2411
2390
|
}
|
|
2412
|
-
function handleClaudeCodeAction(
|
|
2391
|
+
function handleClaudeCodeAction() {
|
|
2413
2392
|
console.log(chalk.bold.blue("🤖 Adding Better Auth MCP to Claude Code..."));
|
|
2414
|
-
const
|
|
2415
|
-
|
|
2416
|
-
if (installLocal) commands.push(`claude mcp add better-auth -- ${LOCAL_MCP_COMMAND}`);
|
|
2417
|
-
let anySucceeded = false;
|
|
2418
|
-
for (const command of commands) try {
|
|
2393
|
+
const command = `claude mcp add --transport http better-auth ${REMOTE_MCP_URL}`;
|
|
2394
|
+
try {
|
|
2419
2395
|
execSync(command, { stdio: "inherit" });
|
|
2420
|
-
|
|
2396
|
+
console.log(chalk.green("\n✓ Claude Code MCP configured!"));
|
|
2421
2397
|
} catch {
|
|
2422
2398
|
console.log(chalk.yellow("\n⚠ Could not automatically add to Claude Code. Please run this command manually:"));
|
|
2423
2399
|
console.log(chalk.cyan(command));
|
|
2424
2400
|
}
|
|
2425
|
-
if (anySucceeded) console.log(chalk.green("\n✓ Claude Code MCP configured!"));
|
|
2426
2401
|
console.log(chalk.bold.white("\n✨ Next Steps:"));
|
|
2427
|
-
console.log(chalk.gray("• The MCP
|
|
2402
|
+
console.log(chalk.gray("• The MCP server will be added to your Claude Code configuration"));
|
|
2428
2403
|
console.log(chalk.gray("• You can now use Better Auth features directly in Claude Code"));
|
|
2429
2404
|
}
|
|
2430
|
-
function handleOpenCodeAction(
|
|
2405
|
+
function handleOpenCodeAction() {
|
|
2431
2406
|
console.log(chalk.bold.blue("🔧 Adding Better Auth MCP to Open Code..."));
|
|
2432
|
-
const mcpConfig = {};
|
|
2433
|
-
if (installRemote) mcpConfig["better-auth-docs"] = {
|
|
2434
|
-
type: "remote",
|
|
2435
|
-
url: REMOTE_MCP_URL,
|
|
2436
|
-
enabled: true
|
|
2437
|
-
};
|
|
2438
|
-
if (installLocal) mcpConfig["better-auth"] = {
|
|
2439
|
-
type: "local",
|
|
2440
|
-
command: [LOCAL_MCP_COMMAND],
|
|
2441
|
-
enabled: true
|
|
2442
|
-
};
|
|
2443
2407
|
const openCodeConfig = {
|
|
2444
2408
|
$schema: "https://opencode.ai/config.json",
|
|
2445
|
-
mcp:
|
|
2409
|
+
mcp: { "better-auth": {
|
|
2410
|
+
type: "remote",
|
|
2411
|
+
url: REMOTE_MCP_URL,
|
|
2412
|
+
enabled: true
|
|
2413
|
+
} }
|
|
2446
2414
|
};
|
|
2447
2415
|
const configPath = path$1.join(process.cwd(), "opencode.json");
|
|
2448
2416
|
try {
|
|
@@ -2461,20 +2429,18 @@ function handleOpenCodeAction(installLocal, installRemote) {
|
|
|
2461
2429
|
};
|
|
2462
2430
|
fs$2.writeFileSync(configPath, JSON.stringify(mergedConfig, null, 2));
|
|
2463
2431
|
console.log(chalk.green(`\n✓ Open Code configuration written to ${configPath}`));
|
|
2464
|
-
console.log(chalk.green("✓ Better Auth MCP
|
|
2432
|
+
console.log(chalk.green("✓ Better Auth MCP server added successfully!"));
|
|
2465
2433
|
} catch {
|
|
2466
2434
|
console.log(chalk.yellow("\n⚠ Could not automatically write opencode.json. Please add this configuration manually:"));
|
|
2467
2435
|
console.log(chalk.cyan(JSON.stringify(openCodeConfig, null, 2)));
|
|
2468
2436
|
}
|
|
2469
2437
|
console.log(chalk.bold.white("\n✨ Next Steps:"));
|
|
2470
|
-
console.log(chalk.gray("• Restart Open Code to load the new MCP
|
|
2438
|
+
console.log(chalk.gray("• Restart Open Code to load the new MCP server"));
|
|
2471
2439
|
console.log(chalk.gray("• You can now use Better Auth features directly in Open Code"));
|
|
2472
2440
|
}
|
|
2473
|
-
function handleManualAction(
|
|
2441
|
+
function handleManualAction() {
|
|
2474
2442
|
console.log(chalk.bold.blue("📝 Better Auth MCP Configuration..."));
|
|
2475
|
-
const manualConfig = {};
|
|
2476
|
-
if (installRemote) manualConfig["better-auth-docs"] = { url: REMOTE_MCP_URL };
|
|
2477
|
-
if (installLocal) manualConfig["better-auth"] = { command: LOCAL_MCP_COMMAND };
|
|
2443
|
+
const manualConfig = { "better-auth": { url: REMOTE_MCP_URL } };
|
|
2478
2444
|
const configPath = path$1.join(process.cwd(), "mcp.json");
|
|
2479
2445
|
try {
|
|
2480
2446
|
let existingConfig = {};
|
|
@@ -2488,17 +2454,17 @@ function handleManualAction(installLocal, installRemote) {
|
|
|
2488
2454
|
};
|
|
2489
2455
|
fs$2.writeFileSync(configPath, JSON.stringify(mergedConfig, null, 2));
|
|
2490
2456
|
console.log(chalk.green(`\n✓ MCP configuration written to ${configPath}`));
|
|
2491
|
-
console.log(chalk.green("✓ Better Auth MCP
|
|
2457
|
+
console.log(chalk.green("✓ Better Auth MCP server added successfully!"));
|
|
2492
2458
|
} catch {
|
|
2493
2459
|
console.log(chalk.yellow("\n⚠ Could not automatically write mcp.json. Please add this configuration manually:"));
|
|
2494
2460
|
console.log(chalk.cyan(JSON.stringify(manualConfig, null, 2)));
|
|
2495
2461
|
}
|
|
2496
2462
|
console.log(chalk.bold.white("\n✨ Next Steps:"));
|
|
2497
|
-
console.log(chalk.gray("• Restart your MCP client to load the new
|
|
2463
|
+
console.log(chalk.gray("• Restart your MCP client to load the new server"));
|
|
2498
2464
|
console.log(chalk.gray("• You can now use Better Auth features directly in your MCP client"));
|
|
2499
2465
|
}
|
|
2500
2466
|
function showAllOptions() {
|
|
2501
|
-
console.log(chalk.bold.blue("🔌 Better Auth MCP
|
|
2467
|
+
console.log(chalk.bold.blue("🔌 Better Auth MCP Server"));
|
|
2502
2468
|
console.log(chalk.gray("Choose your MCP client to get started:"));
|
|
2503
2469
|
console.log();
|
|
2504
2470
|
console.log(chalk.bold.white("MCP Clients:"));
|
|
@@ -2507,17 +2473,11 @@ function showAllOptions() {
|
|
|
2507
2473
|
console.log(chalk.cyan(" --open-code ") + chalk.gray("Add to Open Code"));
|
|
2508
2474
|
console.log(chalk.cyan(" --manual ") + chalk.gray("Manual configuration"));
|
|
2509
2475
|
console.log();
|
|
2510
|
-
console.log(chalk.bold.white("Server
|
|
2511
|
-
console.log(chalk.
|
|
2512
|
-
console.log(chalk.cyan(" --remote-only ") + chalk.gray("Install only remote MCP (documentation & search)"));
|
|
2513
|
-
console.log(chalk.gray(" (default: install both servers)"));
|
|
2514
|
-
console.log();
|
|
2515
|
-
console.log(chalk.bold.white("Servers:"));
|
|
2516
|
-
console.log(chalk.gray(" • ") + chalk.white("better-auth") + chalk.gray(" (local) - Setup auth, diagnose issues, validate config"));
|
|
2517
|
-
console.log(chalk.gray(" • ") + chalk.white("better-auth-docs") + chalk.gray(" (remote) - Search documentation, code examples"));
|
|
2476
|
+
console.log(chalk.bold.white("Server:"));
|
|
2477
|
+
console.log(chalk.gray(" • ") + chalk.white("better-auth") + chalk.gray(" - Search documentation, code examples, setup assistance"));
|
|
2518
2478
|
console.log();
|
|
2519
2479
|
}
|
|
2520
|
-
const mcp = new Command("mcp").description("Add Better Auth MCP
|
|
2480
|
+
const mcp = new Command("mcp").description("Add Better Auth MCP server to MCP Clients").option("--cursor", "Automatically open Cursor with the MCP configuration").option("--claude-code", "Show Claude Code MCP configuration command").option("--open-code", "Show Open Code MCP configuration").option("--manual", "Show manual MCP configuration for mcp.json").action(mcpAction);
|
|
2521
2481
|
|
|
2522
2482
|
//#endregion
|
|
2523
2483
|
//#region src/commands/migrate.ts
|
|
@@ -2668,4 +2628,5 @@ main().catch((error) => {
|
|
|
2668
2628
|
});
|
|
2669
2629
|
|
|
2670
2630
|
//#endregion
|
|
2671
|
-
export { };
|
|
2631
|
+
export { };
|
|
2632
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["aliases: Record<string, string>","tsConfigPath: string","text","result: Record<string, string>","configFile: BetterAuthOptions | null","resolvedPath: string","spinner","confirm","fs","getPackageManager","frameworks: Record<string, string | undefined>","databases: Record<string, string | undefined>","result: any","new_content: string","format","required_envs: string[]","required_deps: string[]","database_code_str: string","start_of_betterauth","new_user_config: string","total_dependencies: string[]","total_envs: string[]","imports: {\n\t\t\tpath: string;\n\t\t\tvariables: {\n\t\t\t\tasType: boolean;\n\t\t\t\tname: string;\n\t\t\t}[];\n\t\t}[]","error: any","quoteChar: string | null","installCommand: string","prettierFormat","result: Import[]","packageManagerPreference: \"bun\" | \"pnpm\" | \"yarn\" | \"npm\" | undefined","config_path: string","framework: SupportedFrameworks","format","packageInfo: Record<string, any>","targetEnvFile: string","tsconfigInfo: Record<string, any>","fs","latest_betterauth_version: string","error: any","s","appName: string","possiblePaths","database: SupportedDatabases | null","add_plugins: SupportedPlugin[]","authClientConfigPath: string | null","contents","envs: string[]","packageManagerOptions: {\n\t\tvalue: \"bun\" | \"pnpm\" | \"yarn\" | \"npm\";\n\t\tlabel?: string;\n\t\thint?: string;\n\t}[]","previouslyGeneratedSecret: string | null","spinner","fs","os","openCommand: string","path","existingConfig: {\n\t\t\tmcp?: Record<string, unknown>;\n\t\t\t[key: string]: unknown;\n\t\t}","fs","spinner","migrate","packageInfo: Record<string, any>"],"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\";\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, getMigrations } from \"better-auth/db\";\nimport chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport prompts from \"prompts\";\nimport yoctoSpinner from \"yocto-spinner\";\nimport * as z from \"zod/v4\";\nimport { getConfig } from \"../utils/get-config\";\n\n/** @internal */\nexport async function migrateAction(opts: any) {\n\tconst options = z\n\t\t.object({\n\t\t\tcwd: z.string(),\n\t\t\tconfig: z.string().optional(),\n\t\t\ty: z.boolean().optional(),\n\t\t\tyes: z.boolean().optional(),\n\t\t})\n\t\t.parse(opts);\n\n\tconst cwd = path.resolve(options.cwd);\n\tif (!existsSync(cwd)) {\n\t\tconsole.error(`The directory \"${cwd}\" does not exist.`);\n\t\tprocess.exit(1);\n\t}\n\n\tconst config = await getConfig({\n\t\tcwd,\n\t\tconfigPath: options.config,\n\t});\n\tif (!config) {\n\t\tconsole.error(\n\t\t\t\"No configuration file found. Add a `auth.ts` file to your project or pass the path to the configuration file using the `--config` flag.\",\n\t\t);\n\t\treturn;\n\t}\n\n\tconst db = await getAdapter(config);\n\n\tif (!db) {\n\t\tconsole.error(\n\t\t\t\"Invalid database configuration. Make sure you're not using adapters. Migrate command only works with built-in Kysely adapter.\",\n\t\t);\n\t\tprocess.exit(1);\n\t}\n\n\tif (db.id !== \"kysely\") {\n\t\tif (db.id === \"prisma\") {\n\t\t\tconsole.error(\n\t\t\t\t\"The migrate command only works with the built-in Kysely adapter. For Prisma, run `npx @better-auth/cli generate` to create the schema, then use Prisma's migrate or push to apply it.\",\n\t\t\t);\n\t\t\ttry {\n\t\t\t\tconst telemetry = await createTelemetry(config);\n\t\t\t\tawait telemetry.publish({\n\t\t\t\t\ttype: \"cli_migrate\",\n\t\t\t\t\tpayload: {\n\t\t\t\t\t\toutcome: \"unsupported_adapter\",\n\t\t\t\t\t\tadapter: \"prisma\",\n\t\t\t\t\t\tconfig: getTelemetryAuthConfig(config),\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t} catch {}\n\t\t\tprocess.exit(0);\n\t\t}\n\t\tif (db.id === \"drizzle\") {\n\t\t\tconsole.error(\n\t\t\t\t\"The migrate command only works with the built-in Kysely adapter. For Drizzle, run `npx @better-auth/cli generate` to create the schema, then use Drizzle's migrate or push to apply it.\",\n\t\t\t);\n\t\t\ttry {\n\t\t\t\tconst telemetry = await createTelemetry(config);\n\t\t\t\tawait telemetry.publish({\n\t\t\t\t\ttype: \"cli_migrate\",\n\t\t\t\t\tpayload: {\n\t\t\t\t\t\toutcome: \"unsupported_adapter\",\n\t\t\t\t\t\tadapter: \"drizzle\",\n\t\t\t\t\t\tconfig: getTelemetryAuthConfig(config),\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t} catch {}\n\t\t\tprocess.exit(0);\n\t\t}\n\t\tconsole.error(\"Migrate command isn't supported for this adapter.\");\n\t\ttry {\n\t\t\tconst telemetry = await createTelemetry(config);\n\t\t\tawait telemetry.publish({\n\t\t\t\ttype: \"cli_migrate\",\n\t\t\t\tpayload: {\n\t\t\t\t\toutcome: \"unsupported_adapter\",\n\t\t\t\t\tadapter: db.id,\n\t\t\t\t\tconfig: getTelemetryAuthConfig(config),\n\t\t\t\t},\n\t\t\t});\n\t\t} catch {}\n\t\tprocess.exit(1);\n\t}\n\n\tconst spinner = yoctoSpinner({ text: \"preparing migration...\" }).start();\n\n\tconst { toBeAdded, toBeCreated, runMigrations } = await getMigrations(config);\n\n\tif (!toBeAdded.length && !toBeCreated.length) {\n\t\tspinner.stop();\n\t\tconsole.log(\"🚀 No migrations needed.\");\n\t\ttry {\n\t\t\tconst telemetry = await createTelemetry(config);\n\t\t\tawait telemetry.publish({\n\t\t\t\ttype: \"cli_migrate\",\n\t\t\t\tpayload: {\n\t\t\t\t\toutcome: \"no_changes\",\n\t\t\t\t\tconfig: getTelemetryAuthConfig(config),\n\t\t\t\t},\n\t\t\t});\n\t\t} catch {}\n\t\tprocess.exit(0);\n\t}\n\n\tspinner.stop();\n\tconsole.log(`🔑 The migration will affect the following:`);\n\n\tfor (const table of [...toBeCreated, ...toBeAdded]) {\n\t\tconsole.log(\n\t\t\t\"->\",\n\t\t\tchalk.magenta(Object.keys(table.fields).join(\", \")),\n\t\t\tchalk.white(\"fields on\"),\n\t\t\tchalk.yellow(`${table.table}`),\n\t\t\tchalk.white(\"table.\"),\n\t\t);\n\t}\n\n\tif (options.y) {\n\t\tconsole.warn(\"WARNING: --y is deprecated. Consider -y or --yes\");\n\t\toptions.yes = true;\n\t}\n\n\tlet migrate = options.yes;\n\tif (!migrate) {\n\t\tconst response = await prompts({\n\t\t\ttype: \"confirm\",\n\t\t\tname: \"migrate\",\n\t\t\tmessage: \"Are you sure you want to run these migrations?\",\n\t\t\tinitial: false,\n\t\t});\n\t\tmigrate = response.migrate;\n\t}\n\n\tif (!migrate) {\n\t\tconsole.log(\"Migration cancelled.\");\n\t\ttry {\n\t\t\tconst telemetry = await createTelemetry(config);\n\t\t\tawait telemetry.publish({\n\t\t\t\ttype: \"cli_migrate\",\n\t\t\t\tpayload: { outcome: \"aborted\", config: getTelemetryAuthConfig(config) },\n\t\t\t});\n\t\t} catch {}\n\t\tprocess.exit(0);\n\t}\n\n\tspinner?.start(\"migrating...\");\n\tawait runMigrations();\n\tspinner.stop();\n\tconsole.log(\"🚀 migration was completed successfully!\");\n\ttry {\n\t\tconst telemetry = await createTelemetry(config);\n\t\tawait telemetry.publish({\n\t\t\ttype: \"cli_migrate\",\n\t\t\tpayload: { outcome: \"migrated\", config: getTelemetryAuthConfig(config) },\n\t\t});\n\t} catch {}\n\tprocess.exit(0);\n}\n\nexport const migrate = new Command(\"migrate\")\n\t.option(\n\t\t\"-c, --cwd <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.4.
|
|
3
|
+
"version": "1.4.18",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "The CLI for Better Auth",
|
|
6
6
|
"module": "dist/index.mjs",
|
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
"tsx": "^4.20.6",
|
|
51
51
|
"type-fest": "^5.2.0",
|
|
52
52
|
"typescript": "^5.9.3",
|
|
53
|
-
"@better-auth/passkey": "1.4.
|
|
53
|
+
"@better-auth/passkey": "1.4.18"
|
|
54
54
|
},
|
|
55
55
|
"dependencies": {
|
|
56
56
|
"@babel/core": "^7.28.4",
|
|
@@ -74,9 +74,9 @@
|
|
|
74
74
|
"semver": "^7.7.2",
|
|
75
75
|
"yocto-spinner": "^0.2.3",
|
|
76
76
|
"zod": "^4.3.5",
|
|
77
|
-
"@better-auth/core": "1.4.
|
|
78
|
-
"@better-auth/telemetry": "1.4.
|
|
79
|
-
"better-auth": "^1.4.
|
|
77
|
+
"@better-auth/core": "1.4.18",
|
|
78
|
+
"@better-auth/telemetry": "1.4.18",
|
|
79
|
+
"better-auth": "^1.4.18"
|
|
80
80
|
},
|
|
81
81
|
"files": [
|
|
82
82
|
"dist"
|