@better-auth/cli 1.4.17 → 1.5.0-beta.10

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/LICENSE.md CHANGED
@@ -1,17 +1,20 @@
1
1
  The MIT License (MIT)
2
2
  Copyright (c) 2024 - present, Bereket Engida
3
3
 
4
- Permission is hereby granted, free of charge, to any person obtaining a copy of this software
5
- and associated documentation files (the "Software"), to deal in the Software without restriction,
6
- including without limitation the rights to use, copy, modify, merge, publish, distribute,
7
- sublicense, and/or sell copies of the Software, and to permit persons to whom the Software
8
- is furnished to do so, subject to the following conditions:
4
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
5
+ this software and associated documentation files (the Software), to deal in
6
+ the Software without restriction, including without limitation the rights to
7
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
8
+ the Software, and to permit persons to whom the Software is furnished to do so,
9
+ subject to the following conditions:
9
10
 
10
- The above copyright notice and this permission notice shall be included in all copies or
11
- substantial portions of the Software.
11
+ The above copyright notice and this permission notice shall be included in all
12
+ copies or substantial portions of the Software.
12
13
 
13
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
14
- BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
15
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
16
- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
17
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
14
+ THE SOFTWARE IS PROVIDED AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
16
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
17
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
18
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19
+ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
20
+ DEALINGS IN THE SOFTWARE.
package/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # Better Auth CLI
2
2
 
3
- Better Auth comes with a built-in CLI to help you manage the database schema needed for both core functionality and plugins.
4
-
3
+ Better Auth comes with a built-in CLI to help you manage the database schema
4
+ needed for both core functionality and plugins.
5
5
 
6
6
  ### **Init**
7
7
 
@@ -13,7 +13,11 @@ npx @better-auth/cli@latest init
13
13
 
14
14
  ### **Generate**
15
15
 
16
- The `generate` command creates the schema required by Better Auth. If you're using a database adapter like Prisma or Drizzle, this command will generate the right schema for your ORM. If you're using the built-in Kysely adapter, it will generate an SQL file you can run directly on your database.
16
+ The `generate` command creates the schema required by Better Auth.
17
+ If you’re using a database adapter like Prisma or Drizzle, this command will
18
+ generate the right schema for your ORM.
19
+ If you’re using the built-in Kysely adapter, it will generate an SQL file you
20
+ can run directly on your database.
17
21
 
18
22
  ```bash title="terminal"
19
23
  npx @better-auth/cli@latest generate
@@ -21,7 +25,10 @@ npx @better-auth/cli@latest generate
21
25
 
22
26
  ### **Migrate**
23
27
 
24
- The `migrate` command applies the Better Auth schema directly to your database. This is available if you’re using the built-in Kysely adapter. For other adapters, you'll need to apply the schema using your ORM's migration tool.
28
+ The `migrate` command applies the Better Auth schema directly to your database.
29
+ This is available if you’re using the built-in Kysely adapter.
30
+ For other adapters, you’ll need to apply the schema using your ORM’s migration
31
+ tool.
25
32
 
26
33
  ```bash title="terminal"
27
34
  npx @better-auth/cli@latest migrate
@@ -29,13 +36,13 @@ npx @better-auth/cli@latest migrate
29
36
 
30
37
  ### **Secret**
31
38
 
32
- The CLI also provides a way to generate a secret key for your Better Auth instance.
39
+ The CLI also provides a way to generate a secret key for your Better Auth
40
+ instance.
33
41
 
34
42
  ```bash title="terminal"
35
43
  npx @better-auth/cli@latest secret
36
44
  ```
37
45
 
38
-
39
46
  ## License
40
47
 
41
48
  MIT
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
package/dist/api.mjs CHANGED
@@ -1,3 +1,3 @@
1
- import { a as generateKyselySchema, n as generateSchema, o as generateDrizzleSchema, r as generatePrismaSchema, t as adapters } from "./generators-Ht8QYIi_.mjs";
1
+ import { a as generateKyselySchema, n as generateSchema, o as generateDrizzleSchema, r as generatePrismaSchema, t as adapters } from "./generators-BA4_Oq0Q.mjs";
2
2
 
3
3
  export { adapters, generateDrizzleSchema, generateKyselySchema, generatePrismaSchema, generateSchema };
@@ -1,10 +1,11 @@
1
1
  import fs, { existsSync } from "node:fs";
2
2
  import fs$1 from "node:fs/promises";
3
3
  import path from "node:path";
4
- import { getAuthTables, getMigrations } from "better-auth/db";
5
4
  import { initGetFieldName, initGetModelName } from "better-auth/adapters";
5
+ import { getAuthTables } from "better-auth/db";
6
6
  import prettier from "prettier";
7
- import { capitalizeFirstLetter } from "@better-auth/core/utils";
7
+ import { getMigrations } from "better-auth/db/migration";
8
+ import { capitalizeFirstLetter } from "@better-auth/core/utils/string";
8
9
  import { produceSchema } from "@mrleebo/prisma-ast";
9
10
 
10
11
  //#region src/generators/drizzle.ts
@@ -39,9 +40,9 @@ const generateDrizzleSchema = async ({ options, file, adapter }) => {
39
40
  if (!databaseType) throw new Error(`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`);
40
41
  name = convertToSnakeCase(name, adapter.options?.camelCase);
41
42
  if (field.references?.field === "id") {
42
- const useNumberId$1 = options.advanced?.database?.useNumberId || options.advanced?.database?.generateId === "serial";
43
+ const useNumberId = options.advanced?.database?.generateId === "serial";
43
44
  const useUUIDs = options.advanced?.database?.generateId === "uuid";
44
- if (useNumberId$1) if (databaseType === "pg") return `integer('${name}')`;
45
+ if (useNumberId) if (databaseType === "pg") return `integer('${name}')`;
45
46
  else if (databaseType === "mysql") return `int('${name}')`;
46
47
  else return `integer('${name}')`;
47
48
  if (useUUIDs && databaseType === "pg") return `uuid('${name}')`;
@@ -98,7 +99,7 @@ const generateDrizzleSchema = async ({ options, file, adapter }) => {
98
99
  return dbTypeMap[databaseType];
99
100
  }
100
101
  let id = "";
101
- const useNumberId = options.advanced?.database?.useNumberId || options.advanced?.database?.generateId === "serial";
102
+ const useNumberId = options.advanced?.database?.generateId === "serial";
102
103
  if (options.advanced?.database?.generateId === "uuid" && databaseType === "pg") id = `uuid("id").default(sql\`pg_catalog.gen_random_uuid()\`).primaryKey()`;
103
104
  else if (useNumberId) if (databaseType === "pg") id = `integer("id").generatedByDefaultAsIdentity().primaryKey()`;
104
105
  else if (databaseType === "sqlite") id = `integer("id", { mode: "number" }).primaryKey({ autoIncrement: true })`;
@@ -107,12 +108,12 @@ const generateDrizzleSchema = async ({ options, file, adapter }) => {
107
108
  else if (databaseType === "pg") id = `text('id').primaryKey()`;
108
109
  else id = `text('id').primaryKey()`;
109
110
  const indexes = [];
110
- const assignIndexes = (indexes$1) => {
111
- if (!indexes$1.length) return "";
112
- const code$1 = [`, (table) => [`];
113
- for (const index of indexes$1) code$1.push(` ${index.type}("${index.name}").on(table.${index.on}),`);
114
- code$1.push(`]`);
115
- return code$1.join("\n");
111
+ const assignIndexes = (indexes) => {
112
+ if (!indexes.length) return "";
113
+ const code = [`, (table) => [`];
114
+ for (const index of indexes) code.push(` ${index.type}("${index.name}").on(table.${index.on}),`);
115
+ code.push(`]`);
116
+ return code.join("\n");
116
117
  };
117
118
  const schema = `export const ${modelName} = ${databaseType}Table("${convertToSnakeCase(modelName, adapter.options?.camelCase)}", {
118
119
  id: ${id},
@@ -176,28 +177,28 @@ const generateDrizzleSchema = async ({ options, file, adapter }) => {
176
177
  }
177
178
  });
178
179
  }
179
- const otherModels = Object.entries(tables).filter(([modelName$1]) => modelName$1 !== tableKey);
180
+ const otherModels = Object.entries(tables).filter(([modelName]) => modelName !== tableKey);
180
181
  const modelRelationsMap = /* @__PURE__ */ new Map();
181
- for (const [modelName$1, otherTable] of otherModels) {
182
+ for (const [modelName, otherTable] of otherModels) {
182
183
  const foreignKeysPointingHere = Object.entries(otherTable.fields).filter(([_, field]) => field.references?.model === tableKey || field.references?.model === getModelName(tableKey));
183
184
  if (foreignKeysPointingHere.length === 0) continue;
184
185
  const hasUnique = foreignKeysPointingHere.some(([_, field]) => !!field.unique);
185
- const hasMany$1 = foreignKeysPointingHere.some(([_, field]) => !field.unique);
186
- modelRelationsMap.set(modelName$1, {
187
- modelName: modelName$1,
186
+ const hasMany = foreignKeysPointingHere.some(([_, field]) => !field.unique);
187
+ modelRelationsMap.set(modelName, {
188
+ modelName,
188
189
  hasUnique,
189
- hasMany: hasMany$1
190
+ hasMany
190
191
  });
191
192
  }
192
- for (const { modelName: modelName$1, hasMany: hasMany$1 } of modelRelationsMap.values()) {
193
- const relationType = hasMany$1 ? "many" : "one";
194
- let relationKey = getModelName(modelName$1);
193
+ for (const { modelName, hasMany } of modelRelationsMap.values()) {
194
+ const relationType = hasMany ? "many" : "one";
195
+ let relationKey = getModelName(modelName);
195
196
  if (!adapter.options?.adapterConfig?.usePlural && relationType === "many") relationKey = `${relationKey}s`;
196
197
  if (!manyRelationsSet.has(relationKey)) {
197
198
  manyRelationsSet.add(relationKey);
198
199
  manyRelations.push({
199
200
  key: relationKey,
200
- model: getModelName(modelName$1),
201
+ model: getModelName(modelName),
201
202
  type: relationType
202
203
  });
203
204
  }
@@ -267,7 +268,7 @@ function generateImport({ databaseType, tables, options }) {
267
268
  }
268
269
  if (hasJson && hasBigint) break;
269
270
  }
270
- const useNumberId = options.advanced?.database?.useNumberId || options.advanced?.database?.generateId === "serial";
271
+ const useNumberId = options.advanced?.database?.generateId === "serial";
271
272
  const useUUIDs = options.advanced?.database?.generateId === "uuid";
272
273
  coreImports.push(`${databaseType}Table`);
273
274
  coreImports.push(databaseType === "mysql" ? "varchar, text" : databaseType === "pg" ? "text" : "text");
@@ -275,13 +276,13 @@ function generateImport({ databaseType, tables, options }) {
275
276
  coreImports.push(databaseType !== "sqlite" ? "timestamp, boolean" : "");
276
277
  if (databaseType === "mysql") {
277
278
  const hasNonBigintNumber = Object.values(tables).some((table) => Object.values(table.fields).some((field) => (field.type === "number" || field.type === "number[]") && !field.bigint));
278
- if (!!useNumberId || hasNonBigintNumber) coreImports.push("int");
279
+ if (useNumberId || hasNonBigintNumber) coreImports.push("int");
279
280
  if (Object.values(tables).some((table) => Object.values(table.fields).some((field) => typeof field.type !== "string" && Array.isArray(field.type) && field.type.every((x) => typeof x === "string")))) coreImports.push("mysqlEnum");
280
281
  } else if (databaseType === "pg") {
281
282
  if (useUUIDs) rootImports.push("sql");
282
283
  const hasNonBigintNumber = Object.values(tables).some((table) => Object.values(table.fields).some((field) => (field.type === "number" || field.type === "number[]") && !field.bigint));
283
284
  const hasFkToId = Object.values(tables).some((table) => Object.values(table.fields).some((field) => field.references?.field === "id"));
284
- if (hasNonBigintNumber || (options.advanced?.database?.useNumberId || options.advanced?.database?.generateId === "serial") && hasFkToId) coreImports.push("integer");
285
+ if (hasNonBigintNumber || options.advanced?.database?.generateId === "serial" && hasFkToId) coreImports.push("integer");
285
286
  } else coreImports.push("integer");
286
287
  if (databaseType === "pg" && useUUIDs) coreImports.push("uuid");
287
288
  if (hasJson) {
@@ -406,7 +407,7 @@ const generatePrismaSchema = async ({ adapter, options, file }) => {
406
407
  const prismaModel = builder.findByType("model", { name: modelName });
407
408
  if (!prismaModel) if (provider === "mongodb") builder.model(modelName).field("id", "String").attribute("id").attribute(`map("_id")`);
408
409
  else {
409
- const useNumberId = options.advanced?.database?.useNumberId || options.advanced?.database?.generateId === "serial";
410
+ const useNumberId = options.advanced?.database?.generateId === "serial";
410
411
  const useUUIDs = options.advanced?.database?.generateId === "uuid";
411
412
  if (useNumberId) builder.model(modelName).field("id", "Int").attribute("id").attribute("default(autoincrement())");
412
413
  else if (useUUIDs && provider === "postgresql") builder.model(modelName).field("id", "String").attribute("id").attribute("default(dbgenerated(\"pg_catalog.gen_random_uuid()\"))").attribute("db.Uuid");
@@ -422,7 +423,7 @@ const generatePrismaSchema = async ({ adapter, options, file }) => {
422
423
  })) continue;
423
424
  }
424
425
  const useUUIDs = options.advanced?.database?.generateId === "uuid";
425
- const useNumberId = options.advanced?.database?.useNumberId || options.advanced?.database?.generateId === "serial";
426
+ const useNumberId = options.advanced?.database?.generateId === "serial";
426
427
  const fieldBuilder = builder.model(modelName).field(fieldName, field === "id" && useNumberId ? getType({
427
428
  isBigint: false,
428
429
  isOptional: false,
@@ -514,7 +515,7 @@ const generatePrismaSchema = async ({ adapter, options, file }) => {
514
515
  const field = Object.entries(fields).find(([key, attr]) => (attr.fieldName || key) === fieldName)?.[1];
515
516
  let indexField = fieldName;
516
517
  if (provider === "mysql" && field && field.type === "string") {
517
- const useNumberId = options.advanced?.database?.useNumberId || options.advanced?.database?.generateId === "serial";
518
+ const useNumberId = options.advanced?.database?.generateId === "serial";
518
519
  const useUUIDs = options.advanced?.database?.generateId === "uuid";
519
520
  if (field.references?.field === "id" && (useNumberId || useUUIDs)) indexField = `${fieldName}`;
520
521
  else indexField = `${fieldName}(length: 191)`;
@@ -568,4 +569,5 @@ const generateSchema = (opts) => {
568
569
  };
569
570
 
570
571
  //#endregion
571
- export { generateKyselySchema as a, getPackageInfo as i, generateSchema as n, generateDrizzleSchema as o, generatePrismaSchema as r, adapters as t };
572
+ export { generateKyselySchema as a, getPackageInfo as i, generateSchema as n, generateDrizzleSchema as o, generatePrismaSchema as r, adapters as t };
573
+ //# sourceMappingURL=generators-BA4_Oq0Q.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generators-BA4_Oq0Q.mjs","names":["fs"],"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 = options.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 = options.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 = options.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?.generateId === \"serial\" && hasFkToId);\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/migration\";\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/string\";\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?.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 = options.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?.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.d.mts CHANGED
@@ -1,2 +1 @@
1
- #!/usr/bin/env node
2
1
  import "dotenv/config";