@better-auth/cli 1.1.16 → 1.1.17-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.mjs +10 -10
- package/dist/index.mjs.map +1 -1
- package/package.json +5 -2
package/dist/index.mjs
CHANGED
|
@@ -1,27 +1,27 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{Command as
|
|
3
|
-
${Object.keys(e).filter(t=>
|
|
2
|
+
import{Command as De}from"commander";import{Command as de}from"commander";import{z as M}from"zod";import{existsSync as ue}from"fs";import ge from"path";import he from"yocto-spinner";import E from"chalk";import ye from"prompts";import{logger as w}from"better-auth";import{getAdapter as be,getMigrations as we}from"better-auth/db";import{loadConfig as R}from"c12";import{logger as A}from"better-auth";import q from"path";import ce from"@babel/preset-typescript";import me from"@babel/preset-react";import L from"fs";import{BetterAuthError as pe}from"better-auth";function D(e){e["$env/dynamic/private"]=B(F()),e["$env/dynamic/public"]=B(F()),e["$env/static/private"]=B(z(ie("PUBLIC_",""))),e["$env/static/public"]=B(z(ne("PUBLIC_","")))}function B(e){return`data:text/javascript;charset=utf-8,${encodeURIComponent(e)}`}function z(e){return`
|
|
3
|
+
${Object.keys(e).filter(t=>se.test(t)&&!ae.has(t)).map(t=>`export const ${t} = ${JSON.stringify(e[t])};`).join(`
|
|
4
4
|
`)}
|
|
5
5
|
// jiti dirty hack: .unknown
|
|
6
|
-
`}function
|
|
6
|
+
`}function F(){return`
|
|
7
7
|
export const env = process.env;
|
|
8
8
|
// jiti dirty hack: .unknown
|
|
9
|
-
`}function
|
|
10
|
-
|
|
11
|
-
id: ${
|
|
12
|
-
${Object.keys(
|
|
9
|
+
`}function ie(e,o){return Object.fromEntries(Object.entries(process.env).filter(([t])=>t.startsWith(o)&&(e===""||!t.startsWith(e))))}function ne(e,o){return Object.fromEntries(Object.entries(process.env).filter(([t])=>t.startsWith(e)&&(o===""||!t.startsWith(o))))}var se=/^[a-zA-Z_$][a-zA-Z0-9_$]*$/,ae=new Set(["do","if","in","for","let","new","try","var","case","else","enum","eval","null","this","true","void","with","await","break","catch","class","const","false","super","throw","while","yield","delete","export","import","public","return","static","switch","typeof","default","extends","finally","package","private","continue","debugger","function","arguments","interface","protected","implements","instanceof"]);var h=["auth.ts","auth.tsx","auth.js","auth.jsx"];h=[...h,...h.map(e=>`lib/server/${e}`),...h.map(e=>`server/${e}`),...h.map(e=>`lib/${e}`),...h.map(e=>`utils/${e}`)];h=[...h,...h.map(e=>`src/${e}`),...h.map(e=>`app/${e}`)];function fe(e){return e.replace(/\\"|"(?:\\"|[^"])*"|(\/\/.*|\/\*[\s\S]*?\*\/)/g,(o,t)=>t?"":o).replace(/,(?=\s*[}\]])/g,"")}function le(e){let o=q.join(e,"tsconfig.json");if(!L.existsSync(o))return null;try{let t=L.readFileSync(o,"utf8"),s=fe(t),r=JSON.parse(s),{paths:c={},baseUrl:i="."}=r.compilerOptions||{},d={},p=Object.entries(c);for(let[u,m]of p)for(let v of m){let x=q.join(e,i),$=u.slice(-1)==="*"?u.slice(0,-1):u,b=v.slice(-1)==="*"?v.slice(0,-1):v;d[$||""]=q.join(x,b)}return D(d),d}catch(t){throw console.error(t),new pe("Error parsing tsconfig.json")}}var G=e=>{let o=le(e)||{};return{transformOptions:{babel:{presets:[[ce,{isTSX:!0,allExtensions:!0}],[me,{runtime:"automatic"}]]}},extensions:[".ts",".tsx",".js",".jsx"],alias:o}};async function N({cwd:e,configPath:o}){try{let t=null;if(o){let s=q.join(e,o),{config:r}=await R({configFile:s,dotenv:!0,jitiOptions:G(e)});!r.auth&&!r.default&&(A.error(`[#better-auth]: Couldn't read your auth config in ${s}. Make sure to default export your auth instance or to export as a variable named auth.`),process.exit(1)),t=r.auth?.options||r.default?.options||null}if(!t)for(let s of h)try{let{config:r}=await R({configFile:s,jitiOptions:G(e)});if(Object.keys(r).length>0){t=r.auth?.options||r.default?.options||null,t||(A.error("[#better-auth]: Couldn't read your auth config."),console.log(""),A.info("[#better-auth]: Make sure to default export your auth instance or to export as a variable named auth."),process.exit(1));break}}catch(r){typeof r=="object"&&r&&"message"in r&&typeof r.message=="string"&&r.message.includes("This module cannot be imported from a Client Component module")&&(A.error("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."),process.exit(1)),A.error("[#better-auth]: Couldn't read your auth config.",r),process.exit(1)}return t}catch(t){typeof t=="object"&&t&&"message"in t&&typeof t.message=="string"&&t.message.includes("This module cannot be imported from a Client Component module")&&(A.error("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."),process.exit(1)),A.error("Couldn't read your auth config.",t),process.exit(1)}}async function xe(e){let o=M.object({cwd:M.string(),config:M.string().optional(),y:M.boolean().optional()}).parse(e),t=ge.resolve(o.cwd);ue(t)||(w.error(`The directory "${t}" does not exist.`),process.exit(1));let s=await N({cwd:t,configPath:o.config});if(!s){w.error("No configuration file found. Add a `auth.ts` file to your project or pass the path to the configuration file using the `--config` flag.");return}let r=await be(s);r||(w.error("Invalid database configuration. Make sure you're not using adapters. Migrate command only works with built-in Kysely adapter."),process.exit(1)),r.id!=="kysely"&&(r.id==="prisma"&&(w.error("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\u2019s migrate or push to apply it."),process.exit(0)),r.id==="drizzle"&&(w.error("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\u2019s migrate or push to apply it."),process.exit(0)),w.error("Migrate command isn't supported for this adapter."),process.exit(1));let c=he({text:"preparing migration..."}).start(),{toBeAdded:i,toBeCreated:d,runMigrations:p}=await we(s);!i.length&&!d.length&&(c.stop(),w.info("\u{1F680} No migrations needed."),process.exit(0)),c.stop(),w.info("\u{1F511} The migration will affect the following:");for(let m of[...d,...i])console.log("->",E.magenta(Object.keys(m.fields).join(", ")),E.white("fields on"),E.yellow(`${m.table}`),E.white("table."));let u=o.y;u||(u=(await ye({type:"confirm",name:"migrate",message:"Are you sure you want to run these migrations?",initial:!1})).migrate),u||(w.info("Migration cancelled."),process.exit(0)),c?.start("migrating..."),await p(),c.stop(),w.info("\u{1F680} migration was completed successfully!"),process.exit(0)}var _=new de("migrate").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("--config <config>","the path to the configuration file. defaults to the first configuration file found.").option("-y, --y","automatically accept and run migrations without prompting",!1).action(xe);import{Command as Be}from"commander";import{z as T}from"zod";import{existsSync as O}from"fs";import y from"path";import{logger as j}from"better-auth";import qe from"yocto-spinner";import X from"prompts";import k from"fs/promises";import Q from"chalk";import{getAdapter as Ne}from"better-auth/db";import{logger as Pe}from"better-auth";import{getAuthTables as $e}from"better-auth/db";import{existsSync as ve}from"fs";function U(e){return e.replace(/[A-Z]/g,o=>`_${o.toLowerCase()}`)}var K=async({options:e,file:o,adapter:t})=>{let s=$e(e),r=o||"./auth-schema.ts",c=t.options?.provider,i=t.options?.usePlural,d=c!=="sqlite"?"timestamp, boolean":"",p=c==="mysql"?"int":"integer",u=Object.values(s).some(l=>Object.values(l.fields).some(C=>C.bigint)),x=`import { ${c}Table, ${c==="mysql"?"varchar, text":"text"}, ${p}${u?`, ${c!=="sqlite"?"bigint":""}`:""}, ${d} } from "drizzle-orm/${c}-core";
|
|
10
|
+
`,$=ve(r);for(let l in s){let P=function(n,g){n=U(n);let re=g.type;return{string:{sqlite:`text('${n}')`,pg:`text('${n}')`,mysql:g.unique?`varchar('${n}', { length: 255 })`:g.references?`varchar('${n}', { length: 36 })`:`text('${n}')`},boolean:{sqlite:`integer('${n}', { mode: 'boolean' })`,pg:`boolean('${n}')`,mysql:`boolean('${n}')`},number:{sqlite:`integer('${n}')`,pg:g.bigint?`bigint('${n}', { mode: 'number' })`:`integer('${n}')`,mysql:g.bigint?`bigint('${n}', { mode: 'number' })`:`int('${n}')`},date:{sqlite:`integer('${n}', { mode: 'timestamp' })`,pg:`timestamp('${n}')`,mysql:`timestamp('${n}')`}}[re][c||"sqlite"]};var b=P;let C=i?`${s[l].modelName}s`:s[l].modelName,S=s[l].fields,f=c==="mysql"?'varchar("id", { length: 36 }).primaryKey()':'text("id").primaryKey()',a=`export const ${C} = ${c}Table("${U(C)}", {
|
|
11
|
+
id: ${f},
|
|
12
|
+
${Object.keys(S).map(n=>{let g=S[n];return`${n}: ${P(n,g)}${g.required?".notNull()":""}${g.unique?".unique()":""}${g.references?`.references(()=> ${i?`${g.references.model}s`:g.references.model}.${g.references.field})`:""}`}).join(`,
|
|
13
13
|
`)}
|
|
14
14
|
});`;x+=`
|
|
15
15
|
${a}
|
|
16
|
-
`}return{code:x,fileName:r,overwrite:$}};import{getAuthTables as
|
|
16
|
+
`}return{code:x,fileName:r,overwrite:$}};import{getAuthTables as Se}from"better-auth/db";import{produceSchema as je}from"@mrleebo/prisma-ast";import{existsSync as Ce}from"fs";import J from"path";import Ae from"fs/promises";import{capitalizeFirstLetter as I}from"better-auth";var W=async({adapter:e,options:o,file:t})=>{let s=e.options?.provider||"postgresql",r=Se(o),c=t||"./prisma/schema.prisma",i=Ce(J.join(process.cwd(),c)),d="";i?d=await Ae.readFile(J.join(process.cwd(),c),"utf-8"):d=Te(s);let p=new Map;for(let m in r){let v=r[m]?.fields;for(let x in v){let $=v[x];if($.references){let b=I($.references.model);p.has(b)||p.set(b,new Set),p.get(b).add(I(m))}}}let u=je(d,m=>{for(let x in r){let C=function(f,a,n){if(f==="string")return a?"String?":"String";if(f==="number"&&n)return a?"BigInt?":"BigInt";if(f==="number")return a?"Int?":"Int";if(f==="boolean")return a?"Boolean?":"Boolean";if(f==="date")return a?"DateTime?":"DateTime";if(f==="string[]")return"String[]";if(f==="number[]")return"Int[]"};var v=C;let $=r[x]?.fields,b=r[x]?.modelName,l=I(b||""),S=m.findByType("model",{name:l});S||(s==="mongodb"?m.model(l).field("id","String").attribute("id").attribute('map("_id")'):m.model(l).field("id","String").attribute("id"));for(let f in $){let a=$[f];S&&m.findByType("field",{name:f,within:S.properties})||(m.model(l).field(f,C(a.type,!a?.required,a?.bigint||!1)),a.unique&&m.model(l).blockAttribute(`unique([${f}])`),a.references&&m.model(l).field(`${a.references.model.toLowerCase()}`,I(a.references.model)).attribute(`relation(fields: [${f}], references: [${a.references.field}], onDelete: Cascade)`),!a.unique&&!a.references&&s==="mysql"&&a.type==="string"&&m.model(l).field(f).attribute("db.Text"))}if(p.has(l))for(let f of p.get(l)){let a=`${f.toLowerCase()}s`;m.findByType("field",{name:a,within:S?.properties})||m.model(l).field(a,`${f}[]`)}let P=m.findByType("attribute",{name:"map",within:S?.properties});b!==l&&!P&&m.model(l).blockAttribute("map",b)}});return{code:u.trim()===d.trim()?"":u,fileName:c}},Te=e=>`generator client {
|
|
17
17
|
provider = "prisma-client-js"
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
datasource db {
|
|
21
21
|
provider = "${e}"
|
|
22
22
|
url = ${e==="sqlite"?'"file:./dev.db"':'env("DATABASE_URL")'}
|
|
23
|
-
}`;import{getMigrations as
|
|
23
|
+
}`;import{getMigrations as ke}from"better-auth/db";var Y=async({options:e})=>{let{compileMigrations:o}=await ke(e);return{code:await o(),fileName:`./better-auth_migrations/${new Date().toISOString().replace(/:/g,"-")}.sql`}};var Z={prisma:W,drizzle:K,kysely:Y},H=e=>{let o=e.adapter,t=o.id in Z?Z[o.id]:null;return t||(Pe.error(`${o.id} is not supported.`),process.exit(1)),t(e)};async function Me(e){let o=T.object({cwd:T.string(),config:T.string().optional(),output:T.string().optional(),y:T.boolean().optional()}).parse(e),t=y.resolve(o.cwd);O(t)||(j.error(`The directory "${t}" does not exist.`),process.exit(1));let s=await N({cwd:t,configPath:o.config});if(!s){j.error("No configuration file found. Add a `auth.ts` file to your project or pass the path to the configuration file using the `--config` flag.");return}let r=await Ne(s).catch(p=>{j.error(p.message),process.exit(1)}),c=qe({text:"preparing schema..."}).start(),i=await H({adapter:r,file:o.output,options:s});if(c.stop(),i.code||(j.info("Your schema is already up to date."),process.exit(0)),i.append||i.overwrite){let p=o.y;p||(p=(await X({type:"confirm",name:"confirm",message:`The file ${i.fileName} already exists. Do you want to ${Q.yellow(`${i.overwrite?"overwrite":"append"}`)} the schema to the file?`})).confirm),p?(O(y.join(t,i.fileName))||await k.mkdir(y.dirname(y.join(t,i.fileName)),{recursive:!0}),i.overwrite?await k.writeFile(y.join(t,i.fileName),i.code):await k.appendFile(y.join(t,i.fileName),i.code),j.success(`\u{1F680} Schema was ${i.overwrite?"overwritten":"appended"} successfully!`),process.exit(0)):(j.error("Schema generation aborted."),process.exit(1))}let d=o.y;d||(d=(await X({type:"confirm",name:"confirm",message:`Do you want to generate the schema to ${Q.yellow(i.fileName)}?`})).confirm),d||(j.error("Schema generation aborted."),process.exit(1)),o.output||O(y.dirname(y.join(t,i.fileName)))||await k.mkdir(y.dirname(y.join(t,i.fileName)),{recursive:!0}),await k.writeFile(o.output||y.join(t,i.fileName),i.code),j.success("\u{1F680} Schema was generated successfully!"),process.exit(0)}var V=new Be("generate").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("--config <config>","the path to the configuration file. defaults to the first configuration file found.").option("--output <output>","the file to output to the generated schema").option("-y, --y","automatically answer yes to all prompts",!1).action(Me);import"dotenv/config";import{logger as Ee}from"better-auth";import ee from"chalk";import{Command as Ie}from"commander";import Oe from"crypto";var te=new Ie("secret").action(()=>{let e=Oe.randomBytes(32).toString("hex");Ee.info(`
|
|
24
24
|
Add the following to your .env file:
|
|
25
25
|
${ee.gray("# Auth Secret")+ee.green(`
|
|
26
|
-
BETTER_AUTH_SECRET=${e}`)}`)});
|
|
26
|
+
BETTER_AUTH_SECRET=${e}`)}`)});import ze from"path";import Fe from"fs-extra";function oe(){let e=ze.join("package.json");return Fe.readJSONSync(e)}process.on("SIGINT",()=>process.exit(0));process.on("SIGTERM",()=>process.exit(0));async function Re(){let e=new De("better-auth"),o=await oe();e.addCommand(_).addCommand(V).addCommand(te).version(o.version||"1.1.2").description("Better Auth CLI"),e.parse()}Re();
|
|
27
27
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/commands/migrate.ts","../src/utils/get-config.ts","../src/utils/add-svelte-kit-env-modules.ts","../src/commands/generate.ts","../src/generators/index.ts","../src/generators/drizzle.ts","../src/generators/prisma.ts","../src/generators/kysely.ts","../src/commands/secret.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { Command } from \"commander\";\nimport { migrate } from \"./commands/migrate\";\nimport { generate } from \"./commands/generate\";\nimport \"dotenv/config\";\nimport { generateSecret } from \"./commands/secret\";\n\nasync function main() {\n\tconst program = new Command(\"better-auth\");\n\tprogram\n\t\t.addCommand(migrate)\n\t\t.addCommand(generate)\n\t\t.addCommand(generateSecret)\n\t\t.version(\"0.0.1\")\n\t\t.description(\"Better Auth CLI\");\n\tprogram.parse();\n}\n\nmain();\n","import { Command } from \"commander\";\nimport { z } from \"zod\";\nimport { existsSync } from \"fs\";\nimport path from \"path\";\nimport yoctoSpinner from \"yocto-spinner\";\nimport chalk from \"chalk\";\nimport prompts from \"prompts\";\nimport { logger } from \"better-auth\";\nimport { getAdapter, getMigrations } from \"better-auth/db\";\nimport { getConfig } from \"../utils/get-config\";\n\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})\n\t\t.parse(opts);\n\tconst cwd = path.resolve(options.cwd);\n\tif (!existsSync(cwd)) {\n\t\tlogger.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\tlogger.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\tlogger.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\tlogger.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\tprocess.exit(0);\n\t\t}\n\t\tif (db.id === \"drizzle\") {\n\t\t\tlogger.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\tprocess.exit(0);\n\t\t}\n\t\tlogger.error(\"Migrate command isn't supported for this adapter.\");\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\tlogger.info(\"🚀 No migrations needed.\");\n\t\tprocess.exit(0);\n\t}\n\n\tspinner.stop();\n\tlogger.info(`🔑 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\tlet migrate = options.y;\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\tlogger.info(\"Migration cancelled.\");\n\t\tprocess.exit(0);\n\t}\n\n\tspinner?.start(\"migrating...\");\n\tawait runMigrations();\n\tspinner.stop();\n\tlogger.info(\"🚀 migration was completed successfully!\");\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, --y\",\n\t\t\"automatically accept and run migrations without prompting\",\n\t\tfalse,\n\t)\n\t.action(migrateAction);\n","import { loadConfig } from \"c12\";\nimport type { BetterAuthOptions } from \"better-auth\";\nimport { logger } from \"better-auth\";\nimport path from \"path\";\n// @ts-ignore\nimport babelPresetTypescript from \"@babel/preset-typescript\";\n// @ts-ignore\nimport babelPresetReact from \"@babel/preset-react\";\nimport fs from \"fs\";\nimport { BetterAuthError } from \"better-auth\";\nimport { addSvelteKitEnvModules } from \"./add-svelte-kit-env-modules\";\n\nlet possiblePaths = [\"auth.ts\", \"auth.tsx\", \"auth.js\", \"auth.jsx\"];\n\npossiblePaths = [\n\t...possiblePaths,\n\t...possiblePaths.map((it) => `lib/server/${it}`),\n\t...possiblePaths.map((it) => `server/${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 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\nfunction getPathAliases(cwd: string): Record<string, string> | null {\n\tconst tsConfigPath = path.join(cwd, \"tsconfig.json\");\n\tif (!fs.existsSync(tsConfigPath)) {\n\t\treturn null;\n\t}\n\ttry {\n\t\tconst tsConfigContent = fs.readFileSync(tsConfigPath, \"utf8\");\n\t\tconst strippedTsConfigContent = stripJsonComments(tsConfigContent);\n\t\tconst tsConfig = JSON.parse(strippedTsConfigContent);\n\t\tconst { paths = {}, baseUrl = \".\" } = tsConfig.compilerOptions || {};\n\n\t\tconst result: Record<string, string> = {};\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.join(cwd, 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\t\taddSvelteKitEnvModules(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) => {\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};\nexport async function getConfig({\n\tcwd,\n\tconfigPath,\n}: {\n\tcwd: string;\n\tconfigPath?: string;\n}) {\n\ttry {\n\t\tlet configFile: BetterAuthOptions | null = null;\n\t\tif (configPath) {\n\t\t\tconst resolvedPath = path.join(cwd, configPath);\n\t\t\tconst { config } = await loadConfig<{\n\t\t\t\tauth: {\n\t\t\t\t\toptions: BetterAuthOptions;\n\t\t\t\t};\n\t\t\t\tdefault?: {\n\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});\n\t\t\tif (!config.auth && !config.default) {\n\t\t\t\tlogger.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 = config.auth?.options || config.default?.options || null;\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});\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\tlogger.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\tlogger.info(\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\tlogger.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\tlogger.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\tlogger.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\tlogger.error(\"Couldn't read your auth config.\", e);\n\t\tprocess.exit(1);\n\t}\n}\n\nexport { possiblePaths };\n","export function addSvelteKitEnvModules(aliases: Record<string, string>) {\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\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\nexport function 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\nexport function 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 { Command } from \"commander\";\nimport { getConfig } from \"../utils/get-config\";\nimport { z } from \"zod\";\nimport { existsSync } from \"fs\";\nimport path from \"path\";\nimport { logger } from \"better-auth\";\nimport yoctoSpinner from \"yocto-spinner\";\nimport prompts from \"prompts\";\nimport fs from \"fs/promises\";\nimport chalk from \"chalk\";\nimport { getAdapter } from \"better-auth/db\";\nimport { getGenerator } from \"../generators\";\n\nexport async 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})\n\t\t.parse(opts);\n\n\tconst cwd = path.resolve(options.cwd);\n\tif (!existsSync(cwd)) {\n\t\tlogger.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\tlogger.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\tlogger.error(e.message);\n\t\tprocess.exit(1);\n\t});\n\n\tconst spinner = yoctoSpinner({ text: \"preparing schema...\" }).start();\n\n\tconst schema = await getGenerator({\n\t\tadapter,\n\t\tfile: options.output,\n\t\toptions: config,\n\t});\n\n\tspinner.stop();\n\tif (!schema.code) {\n\t\tlogger.info(\"Your schema is already up to date.\");\n\t\tprocess.exit(0);\n\t}\n\tif (schema.append || schema.overwrite) {\n\t\tlet confirm = options.y;\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\tlogger.success(\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\tprocess.exit(0);\n\t\t} else {\n\t\t\tlogger.error(\"Schema generation aborted.\");\n\t\t\tprocess.exit(1);\n\t\t}\n\t}\n\n\tlet confirm = options.y;\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\tlogger.error(\"Schema generation aborted.\");\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\tlogger.success(`🚀 Schema was generated successfully!`);\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, --y\", \"automatically answer yes to all prompts\", false)\n\t.action(generateAction);\n","import { logger, type Adapter, type BetterAuthOptions } from \"better-auth\";\nimport { generateDrizzleSchema } from \"./drizzle\";\nimport { generatePrismaSchema } from \"./prisma\";\nimport { generateMigrations } from \"./kysely\";\n\nexport const adapters = {\n\tprisma: generatePrismaSchema,\n\tdrizzle: generateDrizzleSchema,\n\tkysely: generateMigrations,\n};\n\nexport const getGenerator = (opts: {\n\tadapter: Adapter;\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\tlogger.error(`${adapter.id} is not supported.`);\n\t\tprocess.exit(1);\n\t}\n\treturn generator(opts);\n};\n","import { getAuthTables, type FieldAttribute } from \"better-auth/db\";\nimport { existsSync } from \"fs\";\nimport type { SchemaGenerator } from \"./types\";\n\nexport function convertToSnakeCase(str: string) {\n\treturn str.replace(/[A-Z]/g, (letter) => `_${letter.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 = adapter.options?.provider;\n\tconst usePlural = adapter.options?.usePlural;\n\tconst timestampAndBoolean =\n\t\tdatabaseType !== \"sqlite\" ? \"timestamp, boolean\" : \"\";\n\tconst int = databaseType === \"mysql\" ? \"int\" : \"integer\";\n\tconst hasBigint = Object.values(tables).some((table) =>\n\t\tObject.values(table.fields).some((field) => field.bigint),\n\t);\n\tconst bigint = databaseType !== \"sqlite\" ? \"bigint\" : \"\";\n\tconst text = databaseType === \"mysql\" ? \"varchar, text\" : \"text\";\n\tlet code = `import { ${databaseType}Table, ${text}, ${int}${\n\t\thasBigint ? `, ${bigint}` : \"\"\n\t}, ${timestampAndBoolean} } from \"drizzle-orm/${databaseType}-core\";\n\t\t\t`;\n\n\tconst fileExist = existsSync(filePath);\n\n\tfor (const table in tables) {\n\t\tconst modelName = usePlural\n\t\t\t? `${tables[table].modelName}s`\n\t\t\t: tables[table].modelName;\n\t\tconst fields = tables[table].fields;\n\t\tfunction getType(name: string, field: FieldAttribute) {\n\t\t\tname = convertToSnakeCase(name);\n\t\t\tconst type = field.type;\n\t\t\tconst typeMap = {\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: `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' })`,\n\t\t\t\t\tpg: `timestamp('${name}')`,\n\t\t\t\t\tmysql: `timestamp('${name}')`,\n\t\t\t\t},\n\t\t\t} as const;\n\t\t\treturn typeMap[type as \"boolean\"][(databaseType as \"sqlite\") || \"sqlite\"];\n\t\t}\n\t\tconst id =\n\t\t\tdatabaseType === \"mysql\"\n\t\t\t\t? `varchar(\"id\", { length: 36 }).primaryKey()`\n\t\t\t\t: `text(\"id\").primaryKey()`;\n\t\tconst schema = `export const ${modelName} = ${databaseType}Table(\"${convertToSnakeCase(\n\t\t\tmodelName,\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\treturn `${field}: ${getType(field, attr)}${\n\t\t\t\t\t\t\t\tattr.required ? \".notNull()\" : \"\"\n\t\t\t\t\t\t\t}${attr.unique ? \".unique()\" : \"\"}${\n\t\t\t\t\t\t\t\tattr.references\n\t\t\t\t\t\t\t\t\t? `.references(()=> ${\n\t\t\t\t\t\t\t\t\t\t\tusePlural\n\t\t\t\t\t\t\t\t\t\t\t\t? `${attr.references.model}s`\n\t\t\t\t\t\t\t\t\t\t\t\t: attr.references.model\n\t\t\t\t\t\t\t\t\t\t}.${attr.references.field})`\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});`;\n\t\tcode += `\\n${schema}\\n`;\n\t}\n\n\treturn {\n\t\tcode: code,\n\t\tfileName: filePath,\n\t\toverwrite: fileExist,\n\t};\n};\n","import { getAuthTables, type FieldType } from \"better-auth/db\";\nimport { produceSchema } from \"@mrleebo/prisma-ast\";\nimport { existsSync } from \"fs\";\nimport path from \"path\";\nimport fs from \"fs/promises\";\nimport { capitalizeFirstLetter } from \"better-auth\";\nimport type { SchemaGenerator } from \"./types\";\n\nexport const generatePrismaSchema: SchemaGenerator = async ({\n\tadapter,\n\toptions,\n\tfile,\n}) => {\n\tconst provider = adapter.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\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);\n\t}\n\n\t// Create a map to store many-to-many relationships\n\tconst manyToManyRelations = new Map();\n\n\t// First pass: identify many-to-many relationships\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 referencedModel = capitalizeFirstLetter(attr.references.model);\n\t\t\t\tif (!manyToManyRelations.has(referencedModel)) {\n\t\t\t\t\tmanyToManyRelations.set(referencedModel, new Set());\n\t\t\t\t}\n\t\t\t\tmanyToManyRelations\n\t\t\t\t\t.get(referencedModel)\n\t\t\t\t\t.add(capitalizeFirstLetter(table));\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 fields = tables[table]?.fields;\n\t\t\tconst originalTable = tables[table]?.modelName;\n\t\t\tconst modelName = capitalizeFirstLetter(originalTable || \"\");\n\n\t\t\tfunction getType(\n\t\t\t\ttype: FieldType,\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 === \"string[]\") {\n\t\t\t\t\treturn isOptional ? \"String[]\" : \"String[]\";\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}\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\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\tbuilder.model(modelName).field(\"id\", \"String\").attribute(\"id\");\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\n\t\t\t\tif (prismaModel) {\n\t\t\t\t\tconst isAlreadyExist = builder.findByType(\"field\", {\n\t\t\t\t\t\tname: field,\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\n\t\t\t\tbuilder\n\t\t\t\t\t.model(modelName)\n\t\t\t\t\t.field(\n\t\t\t\t\t\tfield,\n\t\t\t\t\t\tgetType(attr.type, !attr?.required, attr?.bigint || false),\n\t\t\t\t\t);\n\t\t\t\tif (attr.unique) {\n\t\t\t\t\tbuilder.model(modelName).blockAttribute(`unique([${field}])`);\n\t\t\t\t}\n\t\t\t\tif (attr.references) {\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\t`${attr.references.model.toLowerCase()}`,\n\t\t\t\t\t\t\tcapitalizeFirstLetter(attr.references.model),\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.attribute(\n\t\t\t\t\t\t\t`relation(fields: [${field}], references: [${attr.references.field}], onDelete: Cascade)`,\n\t\t\t\t\t\t);\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(field).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\tconst fieldName = `${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.model(modelName).field(fieldName, `${relatedModel}[]`);\n\t\t\t\t\t}\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\tif (originalTable !== modelName && !hasAttribute) {\n\t\t\t\tbuilder.model(modelName).blockAttribute(\"map\", originalTable);\n\t\t\t}\n\t\t}\n\t});\n\n\treturn {\n\t\tcode: schema.trim() === schemaPrisma.trim() ? \"\" : schema,\n\t\tfileName: filePath,\n\t};\n};\n\nconst getNewPrisma = (provider: string) => `generator client {\n provider = \"prisma-client-js\"\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","import { getMigrations } from \"better-auth/db\";\nimport type { SchemaGenerator } from \"./types\";\n\nexport const generateMigrations: SchemaGenerator = async ({ options }) => {\n\tconst { compileMigrations } = await getMigrations(options);\n\tconst migrations = await compileMigrations();\n\treturn {\n\t\tcode: migrations,\n\t\tfileName: `./better-auth_migrations/${new Date()\n\t\t\t.toISOString()\n\t\t\t.replace(/:/g, \"-\")}.sql`,\n\t};\n};\n","import { logger } from \"better-auth\";\nimport chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport Crypto from \"crypto\";\n\nexport const generateSecret = new Command(\"secret\").action(() => {\n\tconst secret = Crypto.randomBytes(32).toString(\"hex\");\n\tlogger.info(`\\nAdd the following to your .env file: \n${\n\tchalk.gray(\"# Auth Secret\") + chalk.green(`\\nBETTER_AUTH_SECRET=${secret}`)\n}`);\n});\n"],"mappings":"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","names":["Command","Command","z","existsSync","path","yoctoSpinner","chalk","prompts","logger","getAdapter","getMigrations","loadConfig","logger","path","babelPresetTypescript","babelPresetReact","fs","BetterAuthError","addSvelteKitEnvModules","aliases","createDataUriModule","createDynamicEnvModule","createStaticEnvModule","filterPrivateEnv","filterPublicEnv","module","env","k","validIdentifier","reserved","publicPrefix","privatePrefix","possiblePaths","it","stripJsonComments","jsonString","m","g","getPathAliases","cwd","tsConfigPath","path","fs","tsConfigContent","strippedTsConfigContent","tsConfig","paths","baseUrl","result","obj","alias","aliasPaths","aliasedPath","resolvedBaseUrl","finalAlias","finalAliasedPath","addSvelteKitEnvModules","error","BetterAuthError","jitiOptions","babelPresetTypescript","babelPresetReact","getConfig","configPath","configFile","resolvedPath","config","loadConfig","logger","possiblePath","e","migrateAction","opts","options","z","cwd","path","existsSync","logger","config","getConfig","db","getAdapter","spinner","yoctoSpinner","toBeAdded","toBeCreated","runMigrations","getMigrations","table","chalk","migrate","prompts","Command","Command","z","existsSync","path","logger","yoctoSpinner","prompts","fs","chalk","getAdapter","logger","getAuthTables","existsSync","convertToSnakeCase","str","letter","generateDrizzleSchema","options","file","adapter","tables","filePath","databaseType","usePlural","timestampAndBoolean","int","hasBigint","table","field","code","fileExist","getType","name","type","modelName","fields","id","schema","attr","getAuthTables","produceSchema","existsSync","path","fs","capitalizeFirstLetter","generatePrismaSchema","adapter","options","file","provider","tables","filePath","schemaPrismaExist","schemaPrisma","getNewPrisma","manyToManyRelations","table","fields","field","attr","referencedModel","schema","builder","getType","type","isOptional","isBigint","originalTable","modelName","prismaModel","relatedModel","fieldName","hasAttribute","getMigrations","generateMigrations","options","compileMigrations","adapters","generatePrismaSchema","generateDrizzleSchema","generateMigrations","getGenerator","opts","adapter","generator","logger","generateAction","opts","options","z","cwd","path","existsSync","logger","config","getConfig","adapter","getAdapter","e","spinner","yoctoSpinner","schema","getGenerator","confirm","prompts","chalk","fs","generate","Command","logger","chalk","Command","Crypto","generateSecret","secret","main","program","Command","migrate","generate","generateSecret"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/commands/migrate.ts","../src/utils/get-config.ts","../src/utils/add-svelte-kit-env-modules.ts","../src/commands/generate.ts","../src/generators/index.ts","../src/generators/drizzle.ts","../src/generators/prisma.ts","../src/generators/kysely.ts","../src/commands/secret.ts","../src/utils/get-package-info.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { Command } from \"commander\";\nimport { migrate } from \"./commands/migrate\";\nimport { generate } from \"./commands/generate\";\nimport \"dotenv/config\";\nimport { generateSecret } from \"./commands/secret\";\nimport { getPackageInfo } from \"./utils/get-package-info\";\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\tconst packageInfo = await getPackageInfo();\n\tprogram\n\t\t.addCommand(migrate)\n\t\t.addCommand(generate)\n\t\t.addCommand(generateSecret)\n\t\t.version(packageInfo.version || \"1.1.2\")\n\t\t.description(\"Better Auth CLI\");\n\tprogram.parse();\n}\n\nmain();\n","import { Command } from \"commander\";\nimport { z } from \"zod\";\nimport { existsSync } from \"fs\";\nimport path from \"path\";\nimport yoctoSpinner from \"yocto-spinner\";\nimport chalk from \"chalk\";\nimport prompts from \"prompts\";\nimport { logger } from \"better-auth\";\nimport { getAdapter, getMigrations } from \"better-auth/db\";\nimport { getConfig } from \"../utils/get-config\";\n\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})\n\t\t.parse(opts);\n\tconst cwd = path.resolve(options.cwd);\n\tif (!existsSync(cwd)) {\n\t\tlogger.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\tlogger.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\tlogger.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\tlogger.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\tprocess.exit(0);\n\t\t}\n\t\tif (db.id === \"drizzle\") {\n\t\t\tlogger.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\tprocess.exit(0);\n\t\t}\n\t\tlogger.error(\"Migrate command isn't supported for this adapter.\");\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\tlogger.info(\"🚀 No migrations needed.\");\n\t\tprocess.exit(0);\n\t}\n\n\tspinner.stop();\n\tlogger.info(`🔑 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\tlet migrate = options.y;\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\tlogger.info(\"Migration cancelled.\");\n\t\tprocess.exit(0);\n\t}\n\n\tspinner?.start(\"migrating...\");\n\tawait runMigrations();\n\tspinner.stop();\n\tlogger.info(\"🚀 migration was completed successfully!\");\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, --y\",\n\t\t\"automatically accept and run migrations without prompting\",\n\t\tfalse,\n\t)\n\t.action(migrateAction);\n","import { loadConfig } from \"c12\";\nimport type { BetterAuthOptions } from \"better-auth\";\nimport { logger } from \"better-auth\";\nimport path from \"path\";\n// @ts-ignore\nimport babelPresetTypescript from \"@babel/preset-typescript\";\n// @ts-ignore\nimport babelPresetReact from \"@babel/preset-react\";\nimport fs from \"fs\";\nimport { BetterAuthError } from \"better-auth\";\nimport { addSvelteKitEnvModules } from \"./add-svelte-kit-env-modules\";\n\nlet possiblePaths = [\"auth.ts\", \"auth.tsx\", \"auth.js\", \"auth.jsx\"];\n\npossiblePaths = [\n\t...possiblePaths,\n\t...possiblePaths.map((it) => `lib/server/${it}`),\n\t...possiblePaths.map((it) => `server/${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 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\nfunction getPathAliases(cwd: string): Record<string, string> | null {\n\tconst tsConfigPath = path.join(cwd, \"tsconfig.json\");\n\tif (!fs.existsSync(tsConfigPath)) {\n\t\treturn null;\n\t}\n\ttry {\n\t\tconst tsConfigContent = fs.readFileSync(tsConfigPath, \"utf8\");\n\t\tconst strippedTsConfigContent = stripJsonComments(tsConfigContent);\n\t\tconst tsConfig = JSON.parse(strippedTsConfigContent);\n\t\tconst { paths = {}, baseUrl = \".\" } = tsConfig.compilerOptions || {};\n\n\t\tconst result: Record<string, string> = {};\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.join(cwd, 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\t\taddSvelteKitEnvModules(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) => {\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};\nexport async function getConfig({\n\tcwd,\n\tconfigPath,\n}: {\n\tcwd: string;\n\tconfigPath?: string;\n}) {\n\ttry {\n\t\tlet configFile: BetterAuthOptions | null = null;\n\t\tif (configPath) {\n\t\t\tconst resolvedPath = path.join(cwd, configPath);\n\t\t\tconst { config } = await loadConfig<{\n\t\t\t\tauth: {\n\t\t\t\t\toptions: BetterAuthOptions;\n\t\t\t\t};\n\t\t\t\tdefault?: {\n\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});\n\t\t\tif (!config.auth && !config.default) {\n\t\t\t\tlogger.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 = config.auth?.options || config.default?.options || null;\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});\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\tlogger.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\tlogger.info(\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\tlogger.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\tlogger.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\tlogger.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\tlogger.error(\"Couldn't read your auth config.\", e);\n\t\tprocess.exit(1);\n\t}\n}\n\nexport { possiblePaths };\n","export function addSvelteKitEnvModules(aliases: Record<string, string>) {\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\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\nexport function 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\nexport function 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 { Command } from \"commander\";\nimport { getConfig } from \"../utils/get-config\";\nimport { z } from \"zod\";\nimport { existsSync } from \"fs\";\nimport path from \"path\";\nimport { logger } from \"better-auth\";\nimport yoctoSpinner from \"yocto-spinner\";\nimport prompts from \"prompts\";\nimport fs from \"fs/promises\";\nimport chalk from \"chalk\";\nimport { getAdapter } from \"better-auth/db\";\nimport { getGenerator } from \"../generators\";\n\nexport async 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})\n\t\t.parse(opts);\n\n\tconst cwd = path.resolve(options.cwd);\n\tif (!existsSync(cwd)) {\n\t\tlogger.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\tlogger.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\tlogger.error(e.message);\n\t\tprocess.exit(1);\n\t});\n\n\tconst spinner = yoctoSpinner({ text: \"preparing schema...\" }).start();\n\n\tconst schema = await getGenerator({\n\t\tadapter,\n\t\tfile: options.output,\n\t\toptions: config,\n\t});\n\n\tspinner.stop();\n\tif (!schema.code) {\n\t\tlogger.info(\"Your schema is already up to date.\");\n\t\tprocess.exit(0);\n\t}\n\tif (schema.append || schema.overwrite) {\n\t\tlet confirm = options.y;\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\tlogger.success(\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\tprocess.exit(0);\n\t\t} else {\n\t\t\tlogger.error(\"Schema generation aborted.\");\n\t\t\tprocess.exit(1);\n\t\t}\n\t}\n\n\tlet confirm = options.y;\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\tlogger.error(\"Schema generation aborted.\");\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\tlogger.success(`🚀 Schema was generated successfully!`);\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, --y\", \"automatically answer yes to all prompts\", false)\n\t.action(generateAction);\n","import { logger, type Adapter, type BetterAuthOptions } from \"better-auth\";\nimport { generateDrizzleSchema } from \"./drizzle\";\nimport { generatePrismaSchema } from \"./prisma\";\nimport { generateMigrations } from \"./kysely\";\n\nexport const adapters = {\n\tprisma: generatePrismaSchema,\n\tdrizzle: generateDrizzleSchema,\n\tkysely: generateMigrations,\n};\n\nexport const getGenerator = (opts: {\n\tadapter: Adapter;\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\tlogger.error(`${adapter.id} is not supported.`);\n\t\tprocess.exit(1);\n\t}\n\treturn generator(opts);\n};\n","import { getAuthTables, type FieldAttribute } from \"better-auth/db\";\nimport { existsSync } from \"fs\";\nimport type { SchemaGenerator } from \"./types\";\n\nexport function convertToSnakeCase(str: string) {\n\treturn str.replace(/[A-Z]/g, (letter) => `_${letter.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 = adapter.options?.provider;\n\tconst usePlural = adapter.options?.usePlural;\n\tconst timestampAndBoolean =\n\t\tdatabaseType !== \"sqlite\" ? \"timestamp, boolean\" : \"\";\n\tconst int = databaseType === \"mysql\" ? \"int\" : \"integer\";\n\tconst hasBigint = Object.values(tables).some((table) =>\n\t\tObject.values(table.fields).some((field) => field.bigint),\n\t);\n\tconst bigint = databaseType !== \"sqlite\" ? \"bigint\" : \"\";\n\tconst text = databaseType === \"mysql\" ? \"varchar, text\" : \"text\";\n\tlet code = `import { ${databaseType}Table, ${text}, ${int}${\n\t\thasBigint ? `, ${bigint}` : \"\"\n\t}, ${timestampAndBoolean} } from \"drizzle-orm/${databaseType}-core\";\n\t\t\t`;\n\n\tconst fileExist = existsSync(filePath);\n\n\tfor (const table in tables) {\n\t\tconst modelName = usePlural\n\t\t\t? `${tables[table].modelName}s`\n\t\t\t: tables[table].modelName;\n\t\tconst fields = tables[table].fields;\n\t\tfunction getType(name: string, field: FieldAttribute) {\n\t\t\tname = convertToSnakeCase(name);\n\t\t\tconst type = field.type;\n\t\t\tconst typeMap = {\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: `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' })`,\n\t\t\t\t\tpg: `timestamp('${name}')`,\n\t\t\t\t\tmysql: `timestamp('${name}')`,\n\t\t\t\t},\n\t\t\t} as const;\n\t\t\treturn typeMap[type as \"boolean\"][(databaseType as \"sqlite\") || \"sqlite\"];\n\t\t}\n\t\tconst id =\n\t\t\tdatabaseType === \"mysql\"\n\t\t\t\t? `varchar(\"id\", { length: 36 }).primaryKey()`\n\t\t\t\t: `text(\"id\").primaryKey()`;\n\t\tconst schema = `export const ${modelName} = ${databaseType}Table(\"${convertToSnakeCase(\n\t\t\tmodelName,\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\treturn `${field}: ${getType(field, attr)}${\n\t\t\t\t\t\t\t\tattr.required ? \".notNull()\" : \"\"\n\t\t\t\t\t\t\t}${attr.unique ? \".unique()\" : \"\"}${\n\t\t\t\t\t\t\t\tattr.references\n\t\t\t\t\t\t\t\t\t? `.references(()=> ${\n\t\t\t\t\t\t\t\t\t\t\tusePlural\n\t\t\t\t\t\t\t\t\t\t\t\t? `${attr.references.model}s`\n\t\t\t\t\t\t\t\t\t\t\t\t: attr.references.model\n\t\t\t\t\t\t\t\t\t\t}.${attr.references.field})`\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});`;\n\t\tcode += `\\n${schema}\\n`;\n\t}\n\n\treturn {\n\t\tcode: code,\n\t\tfileName: filePath,\n\t\toverwrite: fileExist,\n\t};\n};\n","import { getAuthTables, type FieldType } from \"better-auth/db\";\nimport { produceSchema } from \"@mrleebo/prisma-ast\";\nimport { existsSync } from \"fs\";\nimport path from \"path\";\nimport fs from \"fs/promises\";\nimport { capitalizeFirstLetter } from \"better-auth\";\nimport type { SchemaGenerator } from \"./types\";\n\nexport const generatePrismaSchema: SchemaGenerator = async ({\n\tadapter,\n\toptions,\n\tfile,\n}) => {\n\tconst provider = adapter.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\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);\n\t}\n\n\t// Create a map to store many-to-many relationships\n\tconst manyToManyRelations = new Map();\n\n\t// First pass: identify many-to-many relationships\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 referencedModel = capitalizeFirstLetter(attr.references.model);\n\t\t\t\tif (!manyToManyRelations.has(referencedModel)) {\n\t\t\t\t\tmanyToManyRelations.set(referencedModel, new Set());\n\t\t\t\t}\n\t\t\t\tmanyToManyRelations\n\t\t\t\t\t.get(referencedModel)\n\t\t\t\t\t.add(capitalizeFirstLetter(table));\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 fields = tables[table]?.fields;\n\t\t\tconst originalTable = tables[table]?.modelName;\n\t\t\tconst modelName = capitalizeFirstLetter(originalTable || \"\");\n\n\t\t\tfunction getType(\n\t\t\t\ttype: FieldType,\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 === \"string[]\") {\n\t\t\t\t\treturn isOptional ? \"String[]\" : \"String[]\";\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}\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\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\tbuilder.model(modelName).field(\"id\", \"String\").attribute(\"id\");\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\n\t\t\t\tif (prismaModel) {\n\t\t\t\t\tconst isAlreadyExist = builder.findByType(\"field\", {\n\t\t\t\t\t\tname: field,\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\n\t\t\t\tbuilder\n\t\t\t\t\t.model(modelName)\n\t\t\t\t\t.field(\n\t\t\t\t\t\tfield,\n\t\t\t\t\t\tgetType(attr.type, !attr?.required, attr?.bigint || false),\n\t\t\t\t\t);\n\t\t\t\tif (attr.unique) {\n\t\t\t\t\tbuilder.model(modelName).blockAttribute(`unique([${field}])`);\n\t\t\t\t}\n\t\t\t\tif (attr.references) {\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\t`${attr.references.model.toLowerCase()}`,\n\t\t\t\t\t\t\tcapitalizeFirstLetter(attr.references.model),\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.attribute(\n\t\t\t\t\t\t\t`relation(fields: [${field}], references: [${attr.references.field}], onDelete: Cascade)`,\n\t\t\t\t\t\t);\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(field).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\tconst fieldName = `${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.model(modelName).field(fieldName, `${relatedModel}[]`);\n\t\t\t\t\t}\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\tif (originalTable !== modelName && !hasAttribute) {\n\t\t\t\tbuilder.model(modelName).blockAttribute(\"map\", originalTable);\n\t\t\t}\n\t\t}\n\t});\n\n\treturn {\n\t\tcode: schema.trim() === schemaPrisma.trim() ? \"\" : schema,\n\t\tfileName: filePath,\n\t};\n};\n\nconst getNewPrisma = (provider: string) => `generator client {\n provider = \"prisma-client-js\"\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","import { getMigrations } from \"better-auth/db\";\nimport type { SchemaGenerator } from \"./types\";\n\nexport const generateMigrations: SchemaGenerator = async ({ options }) => {\n\tconst { compileMigrations } = await getMigrations(options);\n\tconst migrations = await compileMigrations();\n\treturn {\n\t\tcode: migrations,\n\t\tfileName: `./better-auth_migrations/${new Date()\n\t\t\t.toISOString()\n\t\t\t.replace(/:/g, \"-\")}.sql`,\n\t};\n};\n","import { logger } from \"better-auth\";\nimport chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport Crypto from \"crypto\";\n\nexport const generateSecret = new Command(\"secret\").action(() => {\n\tconst secret = Crypto.randomBytes(32).toString(\"hex\");\n\tlogger.info(`\\nAdd the following to your .env file: \n${\n\tchalk.gray(\"# Auth Secret\") + chalk.green(`\\nBETTER_AUTH_SECRET=${secret}`)\n}`);\n});\n","import path from \"path\";\nimport fs from \"fs-extra\";\n\nexport function getPackageInfo() {\n\tconst packageJsonPath = path.join(\"package.json\");\n\treturn fs.readJSONSync(packageJsonPath);\n}\n"],"mappings":"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","names":["Command","Command","z","existsSync","path","yoctoSpinner","chalk","prompts","logger","getAdapter","getMigrations","loadConfig","logger","path","babelPresetTypescript","babelPresetReact","fs","BetterAuthError","addSvelteKitEnvModules","aliases","createDataUriModule","createDynamicEnvModule","createStaticEnvModule","filterPrivateEnv","filterPublicEnv","module","env","k","validIdentifier","reserved","publicPrefix","privatePrefix","possiblePaths","it","stripJsonComments","jsonString","m","g","getPathAliases","cwd","tsConfigPath","path","fs","tsConfigContent","strippedTsConfigContent","tsConfig","paths","baseUrl","result","obj","alias","aliasPaths","aliasedPath","resolvedBaseUrl","finalAlias","finalAliasedPath","addSvelteKitEnvModules","error","BetterAuthError","jitiOptions","babelPresetTypescript","babelPresetReact","getConfig","configPath","configFile","resolvedPath","config","loadConfig","logger","possiblePath","e","migrateAction","opts","options","z","cwd","path","existsSync","logger","config","getConfig","db","getAdapter","spinner","yoctoSpinner","toBeAdded","toBeCreated","runMigrations","getMigrations","table","chalk","migrate","prompts","Command","Command","z","existsSync","path","logger","yoctoSpinner","prompts","fs","chalk","getAdapter","logger","getAuthTables","existsSync","convertToSnakeCase","str","letter","generateDrizzleSchema","options","file","adapter","tables","filePath","databaseType","usePlural","timestampAndBoolean","int","hasBigint","table","field","code","fileExist","getType","name","type","modelName","fields","id","schema","attr","getAuthTables","produceSchema","existsSync","path","fs","capitalizeFirstLetter","generatePrismaSchema","adapter","options","file","provider","tables","filePath","schemaPrismaExist","schemaPrisma","getNewPrisma","manyToManyRelations","table","fields","field","attr","referencedModel","schema","builder","getType","type","isOptional","isBigint","originalTable","modelName","prismaModel","relatedModel","fieldName","hasAttribute","getMigrations","generateMigrations","options","compileMigrations","adapters","generatePrismaSchema","generateDrizzleSchema","generateMigrations","getGenerator","opts","adapter","generator","logger","generateAction","opts","options","z","cwd","path","existsSync","logger","config","getConfig","adapter","getAdapter","e","spinner","yoctoSpinner","schema","getGenerator","confirm","prompts","chalk","fs","generate","Command","logger","chalk","Command","Crypto","generateSecret","secret","path","fs","getPackageInfo","packageJsonPath","main","program","Command","packageInfo","getPackageInfo","migrate","generate","generateSecret"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@better-auth/cli",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.17-beta.2",
|
|
4
4
|
"description": "The CLI for Better Auth",
|
|
5
5
|
"module": "dist/index.mjs",
|
|
6
6
|
"repository": {
|
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
"exports": "./dist/index.mjs",
|
|
18
18
|
"bin": "./dist/index.mjs",
|
|
19
19
|
"devDependencies": {
|
|
20
|
+
"@types/fs-extra": "^11.0.4",
|
|
20
21
|
"tsup": "^8.3.5",
|
|
21
22
|
"typescript": "^5.7.2",
|
|
22
23
|
"vitest": "^1.6.0"
|
|
@@ -34,19 +35,21 @@
|
|
|
34
35
|
"commander": "^12.1.0",
|
|
35
36
|
"dotenv": "^16.4.7",
|
|
36
37
|
"drizzle-orm": "^0.33.0",
|
|
38
|
+
"fs-extra": "^11.3.0",
|
|
37
39
|
"get-tsconfig": "^4.8.1",
|
|
38
40
|
"prisma": "^5.22.0",
|
|
39
41
|
"prompts": "^2.4.2",
|
|
40
42
|
"tinyexec": "^0.3.1",
|
|
41
43
|
"yocto-spinner": "^0.1.1",
|
|
42
44
|
"zod": "^3.23.8",
|
|
43
|
-
"better-auth": "1.1.
|
|
45
|
+
"better-auth": "1.1.17-beta.2"
|
|
44
46
|
},
|
|
45
47
|
"files": [
|
|
46
48
|
"dist"
|
|
47
49
|
],
|
|
48
50
|
"scripts": {
|
|
49
51
|
"dev": "tsup --watch --sourcemap",
|
|
52
|
+
"start": "node ./dist/index.mjs",
|
|
50
53
|
"test": "vitest",
|
|
51
54
|
"build": "tsup --clean"
|
|
52
55
|
}
|