better-auth 0.0.8-beta.5 → 0.0.8-beta.7
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/cli.d.ts +1 -2
- package/dist/cli.js +8 -1
- package/dist/cli.js.map +1 -1
- package/dist/client/plugins.d.ts +4 -4
- package/dist/client.d.ts +4 -4
- package/dist/client.js +11 -2
- package/dist/client.js.map +1 -1
- package/dist/{index-iluERAIb.d.ts → index-BMJlrpru.d.ts} +21 -3
- package/dist/{index-BqZFCrO-.d.ts → index-Dzn4azgH.d.ts} +66 -32
- package/dist/index.d.ts +15 -15
- package/dist/index.js +432 -395
- package/dist/index.js.map +1 -1
- package/dist/{internal-adapter-XKjmUYRj.d.ts → internal-adapter-ZyWLv09F.d.ts} +29 -21
- package/dist/next-js.d.ts +2 -2
- package/dist/plugins.d.ts +5 -5
- package/dist/plugins.js +445 -300
- package/dist/plugins.js.map +1 -1
- package/dist/react.d.ts +3 -3
- package/dist/react.js +11 -2
- package/dist/react.js.map +1 -1
- package/dist/social.d.ts +1 -1
- package/dist/social.js +152 -63
- package/dist/social.js.map +1 -1
- package/dist/solid-start.d.ts +2 -2
- package/dist/solid.d.ts +3 -3
- package/dist/solid.js +11 -2
- package/dist/solid.js.map +1 -1
- package/dist/svelte-kit.d.ts +2 -2
- package/dist/svelte.d.ts +3 -3
- package/dist/svelte.js +11 -2
- package/dist/svelte.js.map +1 -1
- package/dist/{types-Duqea10_.d.ts → types-ufQ1MIlW.d.ts} +1 -1
- package/dist/types.d.ts +2 -2
- package/dist/vue.d.ts +155 -7
- package/dist/vue.js +11 -2
- package/dist/vue.js.map +1 -1
- package/package.json +1 -1
package/dist/cli.d.ts
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
|
|
2
|
-
export { }
|
|
1
|
+
#!/usr/bin/env node
|
package/dist/cli.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
1
3
|
// src/cli/index.ts
|
|
2
4
|
import { Command as Command2 } from "commander";
|
|
3
5
|
import "dotenv/config";
|
|
@@ -13,7 +15,12 @@ import jiti from "jiti";
|
|
|
13
15
|
import { createConsola } from "consola";
|
|
14
16
|
var consola = createConsola({
|
|
15
17
|
formatOptions: {
|
|
16
|
-
date: false
|
|
18
|
+
date: false,
|
|
19
|
+
colors: true,
|
|
20
|
+
compact: true
|
|
21
|
+
},
|
|
22
|
+
defaults: {
|
|
23
|
+
tag: "[Better Auth]"
|
|
17
24
|
}
|
|
18
25
|
});
|
|
19
26
|
var createLogger = (options) => {
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli/index.ts","../src/cli/commands/migrate.ts","../src/cli/get-config.ts","../src/utils/logger.ts","../src/adapters/kysely.ts","../src/adapters/get-tables.ts","../src/cli/utils/get-schema.ts","../src/cli/utils/get-migration.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport \"dotenv/config\";\nimport { migrate } from \"./commands/migrate\";\nasync function main() {\n\tconst program = new Command().name(\"better-auth\");\n\tprogram.addCommand(migrate);\n\tprogram.parse();\n}\n\nmain();\n","import { Command } from \"commander\";\nimport { getConfig } from \"../get-config\";\nimport { z } from \"zod\";\nimport { existsSync } from \"fs\";\nimport path from \"path\";\nimport { logger } from \"../../utils/logger\";\nimport { createKyselyAdapter } from \"../../adapters/kysely\";\nimport ora from \"ora\";\nimport chalk from \"chalk\";\nimport prompts from \"prompts\";\nimport { getMigrations } from \"../utils/get-migration\";\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.action(async (opts) => {\n\t\tconst options = z\n\t\t\t.object({\n\t\t\t\tcwd: z.string(),\n\t\t\t\tconfig: z.string().optional(),\n\t\t\t})\n\t\t\t.parse(opts);\n\t\tconst cwd = path.resolve(options.cwd);\n\t\tif (!existsSync(cwd)) {\n\t\t\tlogger.error(`The directory \"${cwd}\" does not exist.`);\n\t\t\tprocess.exit(1);\n\t\t}\n\t\tconst config = await getConfig({\n\t\t\tcwd,\n\t\t\tconfigPath: options.config,\n\t\t});\n\t\tif (!config) {\n\t\t\tlogger.error(\"No configuration file found.\");\n\t\t\treturn;\n\t\t}\n\t\tconst db = createKyselyAdapter(config);\n\t\tif (!db) {\n\t\t\tlogger.error(\"Invalid database configuration.\");\n\t\t\tprocess.exit(1);\n\t\t}\n\t\tconst spinner = ora(\"preparing migration...\").start();\n\n\t\tconst { toBeAdded, toBeCreated, runMigrations } =\n\t\t\tawait getMigrations(config);\n\n\t\tif (!toBeAdded.length && !toBeCreated.length) {\n\t\t\tspinner.stop();\n\t\t\tlogger.success(\"🚀 No migrations needed.\");\n\t\t\tprocess.exit(0);\n\t\t}\n\n\t\tspinner.stop();\n\t\tlogger.info(`🔑 The migration will affect the following:`);\n\n\t\tfor (const table of [...toBeAdded, ...toBeCreated]) {\n\t\t\tlogger.info(\n\t\t\t\t\"->\",\n\t\t\t\tchalk.magenta(Object.keys(table.fields).join(\", \")),\n\t\t\t\tchalk.white(\"fields on\"),\n\t\t\t\tchalk.yellow(`${table.table}`),\n\t\t\t\tchalk.white(\"table.\"),\n\t\t\t);\n\t\t}\n\t\tconst { migrate } = 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\tif (!migrate) {\n\t\t\tlogger.info(\"Migration cancelled.\");\n\t\t\tprocess.exit(0);\n\t\t}\n\t\tspinner?.start(\"migrating...\");\n\t\tawait runMigrations();\n\t\tspinner.stop();\n\t\tlogger.success(\"🚀 migration was completed successfully!\");\n\t\tprocess.exit(0);\n\t});\n","import path from \"node:path\";\nimport jiti from \"jiti\";\nimport type { BetterAuthOptions } from \"../types\";\nimport { logger } from \"../utils/logger\";\n\nlet possiblePaths = [\"auth.ts\", \"auth.config.ts\"];\n\npossiblePaths = [\n\t...possiblePaths,\n\t...possiblePaths.map((it) => `lib/${it}`),\n\t...possiblePaths.map((it) => `utils/${it}`),\n];\npossiblePaths = [...possiblePaths, ...possiblePaths.map((it) => `src/${it}`)];\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 config = (await jiti(cwd).import(\n\t\t\t\tpath.join(cwd, configPath),\n\t\t\t\t{},\n\t\t\t)) as {\n\t\t\t\tauth: {\n\t\t\t\t\toptions: BetterAuthOptions;\n\t\t\t\t};\n\t\t\t};\n\t\t\tif (!config) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tconfigFile = config.auth.options;\n\t\t}\n\n\t\tfor (const possiblePath of possiblePaths) {\n\t\t\ttry {\n\t\t\t\tconst config = (await jiti(path.join(cwd, possiblePath)).import(\n\t\t\t\t\tpath.join(cwd, possiblePath),\n\t\t\t\t\t{},\n\t\t\t\t)) as {\n\t\t\t\t\tauth?: {\n\t\t\t\t\t\toptions: BetterAuthOptions;\n\t\t\t\t\t};\n\t\t\t\t\tdefault?: {\n\t\t\t\t\t\toptions: BetterAuthOptions;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t\tif (config) {\n\t\t\t\t\tconfigFile = config.auth?.options || config.default?.options || null;\n\t\t\t\t\tif (!configFile) {\n\t\t\t\t\t\tlogger.error(\"[#better-auth]: Couldn't read your auth config.\");\n\t\t\t\t\t\tlogger.break();\n\t\t\t\t\t\tlogger.info(\n\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);\n\t\t\t\t\t\tprocess.exit(1);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\tif (!(e instanceof Error && e.message.includes(\"Cannot find module\"))) {\n\t\t\t\t\tlogger.error(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\treturn null;\n\t}\n}\n\nexport { possiblePaths };\n","import { createConsola } from \"consola\";\n\nconst consola = createConsola({\n\tformatOptions: {\n\t\tdate: false,\n\t},\n});\n\nexport const createLogger = (options?: {\n\tdisabled?: boolean;\n}) => {\n\treturn {\n\t\tlog: (...args: any[]) => {\n\t\t\t!options?.disabled && consola.log(\"\", ...args);\n\t\t},\n\t\terror: (...args: any[]) => {\n\t\t\t!options?.disabled && consola.error(\"\", ...args);\n\t\t},\n\t\twarn: (...args: any[]) => {\n\t\t\t!options?.disabled && consola.warn(\"\", ...args);\n\t\t},\n\t\tinfo: (...args: any[]) => {\n\t\t\t!options?.disabled && consola.info(\"\", ...args);\n\t\t},\n\t\tdebug: (...args: any[]) => {\n\t\t\t!options?.disabled && consola.debug(\"\", ...args);\n\t\t},\n\t\tbox: (...args: any[]) => {\n\t\t\t!options?.disabled && consola.box(\"\", ...args);\n\t\t},\n\t\tsuccess: (...args: any[]) => {\n\t\t\t!options?.disabled && consola.success(\"\", ...args);\n\t\t},\n\t\tbreak: (...args: any[]) => {\n\t\t\t!options?.disabled && console.log(\"\\n\");\n\t\t},\n\t};\n};\n\nexport const logger = createLogger();\n","import Database from \"better-sqlite3\";\nimport { Kysely } from \"kysely\";\nimport {\n\ttype Dialect,\n\tMysqlDialect,\n\tPostgresDialect,\n\tSqliteDialect,\n} from \"kysely\";\nimport { createPool } from \"mysql2\";\nimport pg from \"pg\";\nimport type { FieldAttribute } from \"../db\";\nimport type { BetterAuthOptions } from \"../types\";\nimport type { Adapter, Where } from \"../types/adapter\";\n\nconst { Pool } = pg;\n\nfunction convertWhere(w?: Where[]) {\n\tif (!w)\n\t\treturn {\n\t\t\tand: null,\n\t\t\tor: null,\n\t\t};\n\tconst and = w\n\t\t?.filter((w) => w.connector === \"AND\" || !w.connector)\n\t\t.reduce(\n\t\t\t(acc, w) =>\n\t\t\t\t({\n\t\t\t\t\t...acc,\n\t\t\t\t\t[w.field]: w.value,\n\t\t\t\t}) as any,\n\t\t\t{},\n\t\t);\n\tconst or = w\n\t\t?.filter((w) => w.connector === \"OR\")\n\t\t.reduce(\n\t\t\t(acc, w) =>\n\t\t\t\t({\n\t\t\t\t\t...acc,\n\t\t\t\t\t[w.field]: w.value,\n\t\t\t\t}) as any,\n\t\t\t{},\n\t\t);\n\treturn {\n\t\tand: Object.keys(and).length ? and : null,\n\t\tor: Object.keys(or).length ? or : null,\n\t};\n}\n\nfunction transformTo(\n\tval: any,\n\tfields: Record<string, FieldAttribute>,\n\ttransform: KyselyAdapterConfig[\"transform\"],\n) {\n\tfor (const key in val) {\n\t\tif (\n\t\t\tval[key] === 0 &&\n\t\t\tfields[key]?.type === \"boolean\" &&\n\t\t\ttransform?.boolean\n\t\t) {\n\t\t\tval[key] = false;\n\t\t}\n\t\tif (\n\t\t\tval[key] === 1 &&\n\t\t\tfields[key]?.type === \"boolean\" &&\n\t\t\ttransform?.boolean\n\t\t) {\n\t\t\tval[key] = true;\n\t\t}\n\t\tif (fields[key]?.type === \"date\") {\n\t\t\tif (!(val[key] instanceof Date)) {\n\t\t\t\tval[key] = new Date(val[key]);\n\t\t\t}\n\t\t}\n\t}\n\treturn val;\n}\n\nfunction transformFrom(val: any, transform: KyselyAdapterConfig[\"transform\"]) {\n\tfor (const key in val) {\n\t\tif (typeof val[key] === \"boolean\" && transform?.boolean) {\n\t\t\tval[key] = val[key] ? 1 : 0;\n\t\t}\n\t\tif (val[key] instanceof Date) {\n\t\t\tval[key] = val[key].toISOString();\n\t\t}\n\t}\n\treturn val;\n}\n\nexport interface KyselyAdapterConfig {\n\t/**\n\t * Transform dates and booleans for sqlite.\n\t */\n\ttransform?: {\n\t\tschema: {\n\t\t\t[table: string]: Record<string, FieldAttribute>;\n\t\t};\n\t\tboolean: boolean;\n\t\tdate: boolean;\n\t};\n}\n\nexport const kyselyAdapter = (\n\tdb: Kysely<any>,\n\tconfig?: KyselyAdapterConfig,\n): Adapter => {\n\treturn {\n\t\tasync create(data) {\n\t\t\tlet { model, data: val, select } = data;\n\t\t\tif (config?.transform) {\n\t\t\t\tval = transformFrom(val, config.transform);\n\t\t\t}\n\t\t\tlet res = await db\n\t\t\t\t.insertInto(model)\n\t\t\t\t.values(val as any)\n\t\t\t\t.returningAll()\n\t\t\t\t.executeTakeFirst();\n\n\t\t\tif (config?.transform) {\n\t\t\t\tconst schema = config.transform.schema[model];\n\t\t\t\tres = schema ? transformTo(val, schema, config.transform) : res;\n\t\t\t}\n\n\t\t\tif (select?.length) {\n\t\t\t\tconst data = res\n\t\t\t\t\t? select.reduce((acc, cur) => {\n\t\t\t\t\t\t\tif (res?.[cur]) {\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t...acc,\n\t\t\t\t\t\t\t\t\t[cur]: res[cur],\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn acc;\n\t\t\t\t\t\t}, {} as any)\n\t\t\t\t\t: null;\n\t\t\t\tres = data;\n\t\t\t}\n\n\t\t\treturn res as any;\n\t\t},\n\t\tasync findOne(data) {\n\t\t\tconst { model, where, select } = data;\n\t\t\tconst { and, or } = convertWhere(where);\n\t\t\tlet query = db.selectFrom(model).selectAll();\n\t\t\tif (or) {\n\t\t\t\tquery = query.where((eb) => eb.or(or));\n\t\t\t}\n\t\t\tif (and) {\n\t\t\t\tquery = query.where((eb) => eb.and(and));\n\t\t\t}\n\t\t\tlet res = await query.executeTakeFirst();\n\t\t\tif (select?.length) {\n\t\t\t\tconst data = res\n\t\t\t\t\t? select.reduce((acc, cur) => {\n\t\t\t\t\t\t\tif (res?.[cur]) {\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t...acc,\n\t\t\t\t\t\t\t\t\t[cur]: res[cur],\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn acc;\n\t\t\t\t\t\t}, {} as any)\n\t\t\t\t\t: null;\n\t\t\t\tres = data;\n\t\t\t}\n\n\t\t\tif (config?.transform) {\n\t\t\t\tconst schema = config.transform.schema[model];\n\t\t\t\tres = res && schema ? transformTo(res, schema, config.transform) : res;\n\n\t\t\t\treturn res || null;\n\t\t\t}\n\t\t\treturn (res || null) as any;\n\t\t},\n\t\tasync findMany(data) {\n\t\t\tconst { model, where } = data;\n\t\t\tlet query = db.selectFrom(model);\n\t\t\tconst { and, or } = convertWhere(where);\n\t\t\tif (and) {\n\t\t\t\tquery = query.where((eb) => eb.and(and));\n\t\t\t}\n\t\t\tif (or) {\n\t\t\t\tquery = query.where((eb) => eb.or(or));\n\t\t\t}\n\t\t\tconst res = await query.selectAll().execute();\n\t\t\tif (config?.transform) {\n\t\t\t\tconst schema = config.transform.schema[model];\n\t\t\t\treturn schema\n\t\t\t\t\t? res.map((v) => transformTo(v, schema, config.transform))\n\t\t\t\t\t: res;\n\t\t\t}\n\t\t\treturn res as any;\n\t\t},\n\t\tasync update(data) {\n\t\t\tlet { model, where, update: val } = data;\n\t\t\tconst { and, or } = convertWhere(where);\n\n\t\t\tif (config?.transform) {\n\t\t\t\tval = transformFrom(val, config.transform);\n\t\t\t}\n\n\t\t\tlet query = db.updateTable(model).set(val);\n\t\t\tif (and) {\n\t\t\t\tquery = query.where((eb) => eb.and(and));\n\t\t\t}\n\t\t\tif (or) {\n\t\t\t\tquery = query.where((eb) => eb.or(or));\n\t\t\t}\n\t\t\tconst res = await query.returningAll().executeTakeFirst();\n\t\t\tif (config?.transform) {\n\t\t\t\tconst schema = config.transform.schema[model];\n\t\t\t\treturn schema ? transformTo(res, schema, config.transform) : res;\n\t\t\t}\n\t\t\treturn res as any;\n\t\t},\n\t\tasync delete(data) {\n\t\t\tconst { model, where } = data;\n\t\t\tconst { and, or } = convertWhere(where);\n\t\t\tlet query = db.deleteFrom(model);\n\n\t\t\tif (and) {\n\t\t\t\tquery = query.where((eb) => eb.and(and));\n\t\t\t}\n\t\t\tif (or) {\n\t\t\t\tquery = query.where((eb) => eb.or(or));\n\t\t\t}\n\n\t\t\tawait query.execute();\n\t\t},\n\t};\n};\n\nexport const getDialect = (config: BetterAuthOptions) => {\n\tif (!config.database) {\n\t\treturn null;\n\t}\n\tlet dialect: Dialect | null = null;\n\tif (\"provider\" in config.database) {\n\t\tconst provider = config.database.provider;\n\t\tconst connectionString = config.database.url.trim();\n\t\tif (provider === \"postgres\") {\n\t\t\tconst pool = new Pool({\n\t\t\t\tconnectionString,\n\t\t\t});\n\t\t\tdialect = new PostgresDialect({\n\t\t\t\tpool,\n\t\t\t});\n\t\t}\n\t\tif (provider === \"mysql\") {\n\t\t\tconst params = new URL(connectionString);\n\t\t\tconst pool = createPool({\n\t\t\t\thost: params.hostname,\n\t\t\t\tuser: params.username,\n\t\t\t\tpassword: params.password,\n\t\t\t\tdatabase: params.pathname.split(\"/\")[1],\n\t\t\t\tport: Number(params.port),\n\t\t\t});\n\t\t\tdialect = new MysqlDialect({ pool });\n\t\t}\n\n\t\tif (provider === \"sqlite\") {\n\t\t\tconst db = new Database(connectionString);\n\t\t\tdialect = new SqliteDialect({\n\t\t\t\tdatabase: db,\n\t\t\t});\n\t\t}\n\t}\n\treturn dialect;\n};\n\nexport const createKyselyAdapter = (config: BetterAuthOptions) => {\n\tconst dialect = getDialect(config);\n\tif (!dialect) {\n\t\treturn null;\n\t}\n\tconst db = new Kysely<any>({\n\t\tdialect,\n\t});\n\treturn db;\n};\n\nexport const getDatabaseType = (config: BetterAuthOptions) => {\n\tif (\"provider\" in config.database) {\n\t\treturn config.database.provider;\n\t}\n\tif (\"dialect\" in config.database) {\n\t\tif (config.database.dialect instanceof PostgresDialect) {\n\t\t\treturn \"postgres\";\n\t\t}\n\t\tif (config.database.dialect instanceof MysqlDialect) {\n\t\t\treturn \"mysql\";\n\t\t}\n\t\tif (config.database.dialect instanceof SqliteDialect) {\n\t\t\treturn \"sqlite\";\n\t\t}\n\t}\n\treturn \"sqlite\";\n};\n","import type { FieldAttribute } from \"../db\";\nimport type { BetterAuthOptions } from \"../types\";\n\nexport type BetterAuthDbSchema = Record<\n\tstring,\n\t{\n\t\ttableName: string;\n\t\tfields: Record<string, FieldAttribute>;\n\t\tdisableMigrations?: boolean;\n\t}\n>;\n\nexport const getAuthTables = (options: BetterAuthOptions) => {\n\tconst pluginSchema = options.plugins?.reduce((acc, plugin) => {\n\t\tconst schema = plugin.schema;\n\t\treturn {\n\t\t\t...acc,\n\t\t\t...schema,\n\t\t};\n\t}, {});\n\n\treturn {\n\t\t...pluginSchema,\n\t\tuser: {\n\t\t\ttableName: options.user?.modelName || \"user\",\n\t\t\tfields: {\n\t\t\t\tname: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t},\n\t\t\t\temail: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t},\n\t\t\t\temailVerified: {\n\t\t\t\t\ttype: \"boolean\",\n\t\t\t\t\tdefaultValue: () => false,\n\t\t\t\t},\n\t\t\t\timage: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\trequired: false,\n\t\t\t\t},\n\t\t\t\tcreatedAt: {\n\t\t\t\t\ttype: \"date\",\n\t\t\t\t\tdefaultValue: () => new Date(),\n\t\t\t\t},\n\t\t\t\tupdatedAt: {\n\t\t\t\t\ttype: \"date\",\n\t\t\t\t\tdefaultValue: () => new Date(),\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tsession: {\n\t\t\ttableName: options.session?.modelName || \"session\",\n\t\t\tfields: {\n\t\t\t\texpiresAt: {\n\t\t\t\t\ttype: \"date\",\n\t\t\t\t},\n\t\t\t\tipAddress: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\trequired: false,\n\t\t\t\t},\n\t\t\t\tuserAgent: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\trequired: false,\n\t\t\t\t},\n\t\t\t\tuserId: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\treferences: {\n\t\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\tonDelete: \"cascade\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\taccount: {\n\t\t\ttableName: options.account?.modelName || \"account\",\n\t\t\tfields: {\n\t\t\t\taccountId: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t},\n\t\t\t\tproviderId: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t},\n\t\t\t\tuserId: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\treferences: {\n\t\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\tonDelete: \"cascade\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\taccessToken: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\trequired: false,\n\t\t\t\t},\n\t\t\t\trefreshToken: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\trequired: false,\n\t\t\t\t},\n\t\t\t\tidToken: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\trequired: false,\n\t\t\t\t},\n\t\t\t\taccessTokenExpiresAt: {\n\t\t\t\t\ttype: \"date\",\n\t\t\t\t\trequired: false,\n\t\t\t\t},\n\t\t\t\trefreshTokenExpiresAt: {\n\t\t\t\t\ttype: \"date\",\n\t\t\t\t\trequired: false,\n\t\t\t\t},\n\t\t\t\tpassword: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\trequired: false,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t} satisfies BetterAuthDbSchema;\n};\n","import {\n\tgetAuthTables,\n\ttype BetterAuthDbSchema,\n} from \"../../adapters/get-tables\";\nimport type { FieldAttribute } from \"../../db\";\nimport type { BetterAuthOptions } from \"../../types\";\n\nexport function getPluginTable(config: BetterAuthOptions) {\n\tconst pluginsMigrations =\n\t\tconfig.plugins?.flatMap((plugin) =>\n\t\t\tObject.keys(plugin.schema || {})\n\t\t\t\t.map((key) => {\n\t\t\t\t\tconst schema = plugin.schema || {};\n\t\t\t\t\tconst table = schema[key]!;\n\t\t\t\t\tif (table?.disableMigration) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttableName: key,\n\t\t\t\t\t\tfields: table?.fields as Record<string, FieldAttribute>,\n\t\t\t\t\t};\n\t\t\t\t})\n\t\t\t\t.filter((value) => value !== undefined),\n\t\t) || [];\n\treturn pluginsMigrations;\n}\nexport function getSchema(config: BetterAuthOptions) {\n\tconst baseSchema = getAuthTables(config);\n\tconst pluginSchema = getPluginTable(config);\n\tconst schema = [\n\t\t...pluginSchema,\n\t\tbaseSchema.user,\n\t\tbaseSchema.session,\n\t\tbaseSchema.account,\n\t].reduce((acc, curr) => {\n\t\t//@ts-expect-error\n\t\tacc[curr.tableName] = {\n\t\t\tfields: {\n\t\t\t\t...acc[curr.tableName]?.fields,\n\t\t\t\t...curr.fields,\n\t\t\t},\n\t\t};\n\t\treturn acc;\n\t}, {} as BetterAuthDbSchema);\n\treturn schema;\n}\n","import type {\n\tAlterTableColumnAlteringBuilder,\n\tCreateTableBuilder,\n} from \"kysely\";\nimport type { FieldAttribute, FieldType } from \"../../db\";\nimport { logger } from \"../../utils/logger\";\nimport type { BetterAuthOptions } from \"../../types\";\nimport { getSchema } from \"./get-schema\";\nimport { createKyselyAdapter, getDatabaseType } from \"../../adapters/kysely\";\n\nconst postgresMap = {\n\tstring: [\"character varying\", \"text\"],\n\tnumber: [\n\t\t\"integer\",\n\t\t\"bigint\",\n\t\t\"smallint\",\n\t\t\"numeric\",\n\t\t\"real\",\n\t\t\"double precision\",\n\t],\n\tboolean: [\"bool\", \"boolean\"],\n\tdate: [\"timestamp\", \"date\"],\n};\nconst mysqlMap = {\n\tstring: [\"varchar\", \"text\"],\n\tnumber: [\n\t\t\"integer\",\n\t\t\"int\",\n\t\t\"bigint\",\n\t\t\"smallint\",\n\t\t\"decimal\",\n\t\t\"float\",\n\t\t\"double\",\n\t],\n\tboolean: [\"boolean\"],\n\tdate: [\"date\", \"datetime\"],\n};\n\nconst sqliteMap = {\n\tstring: [\"TEXT\"],\n\tnumber: [\"INTEGER\", \"REAL\"],\n\tboolean: [\"INTEGER\", \"BOOLEAN\"], // 0 or 1\n\tdate: [\"DATE\", \"INTEGER\"],\n};\n\nconst map = {\n\tpostgres: postgresMap,\n\tmysql: mysqlMap,\n\tsqlite: sqliteMap,\n};\n\nexport function matchType(\n\tcolumnDataType: string,\n\tfieldType: FieldType,\n\tdbType: \"postgres\" | \"sqlite\" | \"mysql\",\n) {\n\tconst types = map[dbType];\n\tconst type = types[fieldType].map((t) => t.toLowerCase());\n\tconst matches = type.includes(columnDataType.toLowerCase());\n\treturn matches;\n}\n\nexport async function getMigrations(config: BetterAuthOptions) {\n\tconst betterAuthSchema = getSchema(config);\n\tconst dbType = getDatabaseType(config);\n\tconst db = createKyselyAdapter(config);\n\tif (!db) {\n\t\tlogger.error(\"Invalid database configuration.\");\n\t\tprocess.exit(1);\n\t}\n\tconst tableMetadata = await db.introspection.getTables();\n\tconst toBeCreated: {\n\t\ttable: string;\n\t\tfields: Record<string, FieldAttribute>;\n\t}[] = [];\n\tconst toBeAdded: {\n\t\ttable: string;\n\t\tfields: Record<string, FieldAttribute>;\n\t}[] = [];\n\tfor (const [key, value] of Object.entries(betterAuthSchema)) {\n\t\tconst table = tableMetadata.find((t) => t.name === key);\n\t\tif (!table) {\n\t\t\tconst tIndex = toBeCreated.findIndex((t) => t.table === key);\n\t\t\tif (tIndex === -1) {\n\t\t\t\ttoBeCreated.push({\n\t\t\t\t\ttable: key,\n\t\t\t\t\tfields: value.fields,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\ttoBeCreated[tIndex].fields = {\n\t\t\t\t\t...toBeCreated[tIndex].fields,\n\t\t\t\t\t...value.fields,\n\t\t\t\t};\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tlet toBeAddedFields: Record<string, FieldAttribute> = {};\n\t\tfor (const [fieldName, field] of Object.entries(value.fields)) {\n\t\t\tconst column = table.columns.find((c) => c.name === fieldName);\n\t\t\tif (!column) {\n\t\t\t\ttoBeAddedFields[fieldName] = field;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (matchType(column.dataType, field.type, dbType)) {\n\t\t\t\tcontinue;\n\t\t\t} else {\n\t\t\t\tlogger.warn(\n\t\t\t\t\t`Field ${fieldName} in table ${key} has a different type in the database. Expected ${field.type} but got ${column.dataType}.`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tif (Object.keys(toBeAddedFields).length > 0) {\n\t\t\ttoBeAdded.push({\n\t\t\t\ttable: key,\n\t\t\t\tfields: toBeAddedFields,\n\t\t\t});\n\t\t}\n\t}\n\n\tconst typeMap = {\n\t\tstring: \"text\",\n\t\tboolean: \"boolean\",\n\t\tnumber: \"integer\",\n\t\tdate: \"date\",\n\t} as const;\n\tconst migrations: (\n\t\t| AlterTableColumnAlteringBuilder\n\t\t| CreateTableBuilder<string, string>\n\t)[] = [];\n\n\tif (toBeAdded.length) {\n\t\tfor (const table of toBeAdded) {\n\t\t\tlogger.info(`Adding fields to table ${table.table}`);\n\t\t\tfor (const [fieldName, field] of Object.entries(table.fields)) {\n\t\t\t\tlogger.info(`Adding field ${fieldName} with type ${field.type}`);\n\n\t\t\t\tconst type = typeMap[field.type];\n\t\t\t\tconst exec = db.schema\n\t\t\t\t\t.alterTable(table.table)\n\t\t\t\t\t.addColumn(fieldName, type, (col) => {\n\t\t\t\t\t\tcol = field.required !== false ? col.notNull() : col;\n\t\t\t\t\t\tif (field.references) {\n\t\t\t\t\t\t\tcol = col.references(\n\t\t\t\t\t\t\t\t`${field.references.model}.${field.references.field}`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn col;\n\t\t\t\t\t});\n\t\t\t\tmigrations.push(exec);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (toBeCreated.length) {\n\t\tfor (const table of toBeCreated) {\n\t\t\tlet dbT = db.schema\n\t\t\t\t.createTable(table.table)\n\t\t\t\t.addColumn(\"id\", \"text\", (col) => col.primaryKey());\n\t\t\tfor (const [fieldName, field] of Object.entries(table.fields)) {\n\t\t\t\tconst type = typeMap[field.type];\n\t\t\t\tdbT = dbT.addColumn(fieldName, type, (col) => {\n\t\t\t\t\tcol = field.required !== false ? col.notNull() : col;\n\t\t\t\t\tif (field.references) {\n\t\t\t\t\t\tcol = col.references(\n\t\t\t\t\t\t\t`${field.references.model}.${field.references.field}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\treturn col;\n\t\t\t\t});\n\t\t\t}\n\t\t\tmigrations.push(dbT);\n\t\t}\n\t}\n\tasync function runMigrations() {\n\t\treturn await Promise.all(migrations.map((m) => m.execute()));\n\t}\n\treturn { toBeCreated, toBeAdded, runMigrations };\n}\n"],"mappings":"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","names":["Command","path","path","migrate","Command"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli/index.ts","../src/cli/commands/migrate.ts","../src/cli/get-config.ts","../src/utils/logger.ts","../src/adapters/kysely.ts","../src/adapters/get-tables.ts","../src/cli/utils/get-schema.ts","../src/cli/utils/get-migration.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { Command } from \"commander\";\nimport \"dotenv/config\";\nimport { migrate } from \"./commands/migrate\";\nasync function main() {\n\tconst program = new Command().name(\"better-auth\");\n\tprogram.addCommand(migrate);\n\tprogram.parse();\n}\n\nmain();\n","import { Command } from \"commander\";\nimport { getConfig } from \"../get-config\";\nimport { z } from \"zod\";\nimport { existsSync } from \"fs\";\nimport path from \"path\";\nimport { logger } from \"../../utils/logger\";\nimport { createKyselyAdapter } from \"../../adapters/kysely\";\nimport ora from \"ora\";\nimport chalk from \"chalk\";\nimport prompts from \"prompts\";\nimport { getMigrations } from \"../utils/get-migration\";\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.action(async (opts) => {\n\t\tconst options = z\n\t\t\t.object({\n\t\t\t\tcwd: z.string(),\n\t\t\t\tconfig: z.string().optional(),\n\t\t\t})\n\t\t\t.parse(opts);\n\t\tconst cwd = path.resolve(options.cwd);\n\t\tif (!existsSync(cwd)) {\n\t\t\tlogger.error(`The directory \"${cwd}\" does not exist.`);\n\t\t\tprocess.exit(1);\n\t\t}\n\t\tconst config = await getConfig({\n\t\t\tcwd,\n\t\t\tconfigPath: options.config,\n\t\t});\n\t\tif (!config) {\n\t\t\tlogger.error(\"No configuration file found.\");\n\t\t\treturn;\n\t\t}\n\t\tconst db = createKyselyAdapter(config);\n\t\tif (!db) {\n\t\t\tlogger.error(\"Invalid database configuration.\");\n\t\t\tprocess.exit(1);\n\t\t}\n\t\tconst spinner = ora(\"preparing migration...\").start();\n\n\t\tconst { toBeAdded, toBeCreated, runMigrations } =\n\t\t\tawait getMigrations(config);\n\n\t\tif (!toBeAdded.length && !toBeCreated.length) {\n\t\t\tspinner.stop();\n\t\t\tlogger.success(\"🚀 No migrations needed.\");\n\t\t\tprocess.exit(0);\n\t\t}\n\n\t\tspinner.stop();\n\t\tlogger.info(`🔑 The migration will affect the following:`);\n\n\t\tfor (const table of [...toBeAdded, ...toBeCreated]) {\n\t\t\tlogger.info(\n\t\t\t\t\"->\",\n\t\t\t\tchalk.magenta(Object.keys(table.fields).join(\", \")),\n\t\t\t\tchalk.white(\"fields on\"),\n\t\t\t\tchalk.yellow(`${table.table}`),\n\t\t\t\tchalk.white(\"table.\"),\n\t\t\t);\n\t\t}\n\t\tconst { migrate } = 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\tif (!migrate) {\n\t\t\tlogger.info(\"Migration cancelled.\");\n\t\t\tprocess.exit(0);\n\t\t}\n\t\tspinner?.start(\"migrating...\");\n\t\tawait runMigrations();\n\t\tspinner.stop();\n\t\tlogger.success(\"🚀 migration was completed successfully!\");\n\t\tprocess.exit(0);\n\t});\n","import path from \"node:path\";\nimport jiti from \"jiti\";\nimport type { BetterAuthOptions } from \"../types\";\nimport { logger } from \"../utils/logger\";\n\nlet possiblePaths = [\"auth.ts\", \"auth.config.ts\"];\n\npossiblePaths = [\n\t...possiblePaths,\n\t...possiblePaths.map((it) => `lib/${it}`),\n\t...possiblePaths.map((it) => `utils/${it}`),\n];\npossiblePaths = [...possiblePaths, ...possiblePaths.map((it) => `src/${it}`)];\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 config = (await jiti(cwd).import(\n\t\t\t\tpath.join(cwd, configPath),\n\t\t\t\t{},\n\t\t\t)) as {\n\t\t\t\tauth: {\n\t\t\t\t\toptions: BetterAuthOptions;\n\t\t\t\t};\n\t\t\t};\n\t\t\tif (!config) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tconfigFile = config.auth.options;\n\t\t}\n\n\t\tfor (const possiblePath of possiblePaths) {\n\t\t\ttry {\n\t\t\t\tconst config = (await jiti(path.join(cwd, possiblePath)).import(\n\t\t\t\t\tpath.join(cwd, possiblePath),\n\t\t\t\t\t{},\n\t\t\t\t)) as {\n\t\t\t\t\tauth?: {\n\t\t\t\t\t\toptions: BetterAuthOptions;\n\t\t\t\t\t};\n\t\t\t\t\tdefault?: {\n\t\t\t\t\t\toptions: BetterAuthOptions;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t\tif (config) {\n\t\t\t\t\tconfigFile = config.auth?.options || config.default?.options || null;\n\t\t\t\t\tif (!configFile) {\n\t\t\t\t\t\tlogger.error(\"[#better-auth]: Couldn't read your auth config.\");\n\t\t\t\t\t\tlogger.break();\n\t\t\t\t\t\tlogger.info(\n\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);\n\t\t\t\t\t\tprocess.exit(1);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\tif (!(e instanceof Error && e.message.includes(\"Cannot find module\"))) {\n\t\t\t\t\tlogger.error(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\treturn null;\n\t}\n}\n\nexport { possiblePaths };\n","import { createConsola } from \"consola\";\n\nconst consola = createConsola({\n\tformatOptions: {\n\t\tdate: false,\n\t\tcolors: true,\n\t\tcompact: true,\n\t},\n\tdefaults: {\n\t\ttag: \"[Better Auth]\",\n\t},\n});\n\nexport const createLogger = (options?: {\n\tdisabled?: boolean;\n}) => {\n\treturn {\n\t\tlog: (...args: any[]) => {\n\t\t\t!options?.disabled && consola.log(\"\", ...args);\n\t\t},\n\t\terror: (...args: any[]) => {\n\t\t\t!options?.disabled && consola.error(\"\", ...args);\n\t\t},\n\t\twarn: (...args: any[]) => {\n\t\t\t!options?.disabled && consola.warn(\"\", ...args);\n\t\t},\n\t\tinfo: (...args: any[]) => {\n\t\t\t!options?.disabled && consola.info(\"\", ...args);\n\t\t},\n\t\tdebug: (...args: any[]) => {\n\t\t\t!options?.disabled && consola.debug(\"\", ...args);\n\t\t},\n\t\tbox: (...args: any[]) => {\n\t\t\t!options?.disabled && consola.box(\"\", ...args);\n\t\t},\n\t\tsuccess: (...args: any[]) => {\n\t\t\t!options?.disabled && consola.success(\"\", ...args);\n\t\t},\n\t\tbreak: (...args: any[]) => {\n\t\t\t!options?.disabled && console.log(\"\\n\");\n\t\t},\n\t};\n};\n\nexport const logger = createLogger();\n","import Database from \"better-sqlite3\";\nimport { Kysely } from \"kysely\";\nimport {\n\ttype Dialect,\n\tMysqlDialect,\n\tPostgresDialect,\n\tSqliteDialect,\n} from \"kysely\";\nimport { createPool } from \"mysql2\";\nimport pg from \"pg\";\nimport type { FieldAttribute } from \"../db\";\nimport type { BetterAuthOptions } from \"../types\";\nimport type { Adapter, Where } from \"../types/adapter\";\n\nconst { Pool } = pg;\n\nfunction convertWhere(w?: Where[]) {\n\tif (!w)\n\t\treturn {\n\t\t\tand: null,\n\t\t\tor: null,\n\t\t};\n\tconst and = w\n\t\t?.filter((w) => w.connector === \"AND\" || !w.connector)\n\t\t.reduce(\n\t\t\t(acc, w) =>\n\t\t\t\t({\n\t\t\t\t\t...acc,\n\t\t\t\t\t[w.field]: w.value,\n\t\t\t\t}) as any,\n\t\t\t{},\n\t\t);\n\tconst or = w\n\t\t?.filter((w) => w.connector === \"OR\")\n\t\t.reduce(\n\t\t\t(acc, w) =>\n\t\t\t\t({\n\t\t\t\t\t...acc,\n\t\t\t\t\t[w.field]: w.value,\n\t\t\t\t}) as any,\n\t\t\t{},\n\t\t);\n\treturn {\n\t\tand: Object.keys(and).length ? and : null,\n\t\tor: Object.keys(or).length ? or : null,\n\t};\n}\n\nfunction transformTo(\n\tval: any,\n\tfields: Record<string, FieldAttribute>,\n\ttransform: KyselyAdapterConfig[\"transform\"],\n) {\n\tfor (const key in val) {\n\t\tif (\n\t\t\tval[key] === 0 &&\n\t\t\tfields[key]?.type === \"boolean\" &&\n\t\t\ttransform?.boolean\n\t\t) {\n\t\t\tval[key] = false;\n\t\t}\n\t\tif (\n\t\t\tval[key] === 1 &&\n\t\t\tfields[key]?.type === \"boolean\" &&\n\t\t\ttransform?.boolean\n\t\t) {\n\t\t\tval[key] = true;\n\t\t}\n\t\tif (fields[key]?.type === \"date\") {\n\t\t\tif (!(val[key] instanceof Date)) {\n\t\t\t\tval[key] = new Date(val[key]);\n\t\t\t}\n\t\t}\n\t}\n\treturn val;\n}\n\nfunction transformFrom(val: any, transform: KyselyAdapterConfig[\"transform\"]) {\n\tfor (const key in val) {\n\t\tif (typeof val[key] === \"boolean\" && transform?.boolean) {\n\t\t\tval[key] = val[key] ? 1 : 0;\n\t\t}\n\t\tif (val[key] instanceof Date) {\n\t\t\tval[key] = val[key].toISOString();\n\t\t}\n\t}\n\treturn val;\n}\n\nexport interface KyselyAdapterConfig {\n\t/**\n\t * Transform dates and booleans for sqlite.\n\t */\n\ttransform?: {\n\t\tschema: {\n\t\t\t[table: string]: Record<string, FieldAttribute>;\n\t\t};\n\t\tboolean: boolean;\n\t\tdate: boolean;\n\t};\n}\n\nexport const kyselyAdapter = (\n\tdb: Kysely<any>,\n\tconfig?: KyselyAdapterConfig,\n): Adapter => {\n\treturn {\n\t\tasync create(data) {\n\t\t\tlet { model, data: val, select } = data;\n\t\t\tif (config?.transform) {\n\t\t\t\tval = transformFrom(val, config.transform);\n\t\t\t}\n\t\t\tlet res = await db\n\t\t\t\t.insertInto(model)\n\t\t\t\t.values(val as any)\n\t\t\t\t.returningAll()\n\t\t\t\t.executeTakeFirst();\n\n\t\t\tif (config?.transform) {\n\t\t\t\tconst schema = config.transform.schema[model];\n\t\t\t\tres = schema ? transformTo(val, schema, config.transform) : res;\n\t\t\t}\n\n\t\t\tif (select?.length) {\n\t\t\t\tconst data = res\n\t\t\t\t\t? select.reduce((acc, cur) => {\n\t\t\t\t\t\t\tif (res?.[cur]) {\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t...acc,\n\t\t\t\t\t\t\t\t\t[cur]: res[cur],\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn acc;\n\t\t\t\t\t\t}, {} as any)\n\t\t\t\t\t: null;\n\t\t\t\tres = data;\n\t\t\t}\n\n\t\t\treturn res as any;\n\t\t},\n\t\tasync findOne(data) {\n\t\t\tconst { model, where, select } = data;\n\t\t\tconst { and, or } = convertWhere(where);\n\t\t\tlet query = db.selectFrom(model).selectAll();\n\t\t\tif (or) {\n\t\t\t\tquery = query.where((eb) => eb.or(or));\n\t\t\t}\n\t\t\tif (and) {\n\t\t\t\tquery = query.where((eb) => eb.and(and));\n\t\t\t}\n\t\t\tlet res = await query.executeTakeFirst();\n\t\t\tif (select?.length) {\n\t\t\t\tconst data = res\n\t\t\t\t\t? select.reduce((acc, cur) => {\n\t\t\t\t\t\t\tif (res?.[cur]) {\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t...acc,\n\t\t\t\t\t\t\t\t\t[cur]: res[cur],\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn acc;\n\t\t\t\t\t\t}, {} as any)\n\t\t\t\t\t: null;\n\t\t\t\tres = data;\n\t\t\t}\n\n\t\t\tif (config?.transform) {\n\t\t\t\tconst schema = config.transform.schema[model];\n\t\t\t\tres = res && schema ? transformTo(res, schema, config.transform) : res;\n\n\t\t\t\treturn res || null;\n\t\t\t}\n\t\t\treturn (res || null) as any;\n\t\t},\n\t\tasync findMany(data) {\n\t\t\tconst { model, where } = data;\n\t\t\tlet query = db.selectFrom(model);\n\t\t\tconst { and, or } = convertWhere(where);\n\t\t\tif (and) {\n\t\t\t\tquery = query.where((eb) => eb.and(and));\n\t\t\t}\n\t\t\tif (or) {\n\t\t\t\tquery = query.where((eb) => eb.or(or));\n\t\t\t}\n\t\t\tconst res = await query.selectAll().execute();\n\t\t\tif (config?.transform) {\n\t\t\t\tconst schema = config.transform.schema[model];\n\t\t\t\treturn schema\n\t\t\t\t\t? res.map((v) => transformTo(v, schema, config.transform))\n\t\t\t\t\t: res;\n\t\t\t}\n\t\t\treturn res as any;\n\t\t},\n\t\tasync update(data) {\n\t\t\tlet { model, where, update: val } = data;\n\t\t\tconst { and, or } = convertWhere(where);\n\n\t\t\tif (config?.transform) {\n\t\t\t\tval = transformFrom(val, config.transform);\n\t\t\t}\n\n\t\t\tlet query = db.updateTable(model).set(val);\n\t\t\tif (and) {\n\t\t\t\tquery = query.where((eb) => eb.and(and));\n\t\t\t}\n\t\t\tif (or) {\n\t\t\t\tquery = query.where((eb) => eb.or(or));\n\t\t\t}\n\t\t\tconst res = await query.returningAll().executeTakeFirst();\n\t\t\tif (config?.transform) {\n\t\t\t\tconst schema = config.transform.schema[model];\n\t\t\t\treturn schema ? transformTo(res, schema, config.transform) : res;\n\t\t\t}\n\t\t\treturn res as any;\n\t\t},\n\t\tasync delete(data) {\n\t\t\tconst { model, where } = data;\n\t\t\tconst { and, or } = convertWhere(where);\n\t\t\tlet query = db.deleteFrom(model);\n\n\t\t\tif (and) {\n\t\t\t\tquery = query.where((eb) => eb.and(and));\n\t\t\t}\n\t\t\tif (or) {\n\t\t\t\tquery = query.where((eb) => eb.or(or));\n\t\t\t}\n\n\t\t\tawait query.execute();\n\t\t},\n\t};\n};\n\nexport const getDialect = (config: BetterAuthOptions) => {\n\tif (!config.database) {\n\t\treturn null;\n\t}\n\tlet dialect: Dialect | null = null;\n\tif (\"provider\" in config.database) {\n\t\tconst provider = config.database.provider;\n\t\tconst connectionString = config.database.url.trim();\n\t\tif (provider === \"postgres\") {\n\t\t\tconst pool = new Pool({\n\t\t\t\tconnectionString,\n\t\t\t});\n\t\t\tdialect = new PostgresDialect({\n\t\t\t\tpool,\n\t\t\t});\n\t\t}\n\t\tif (provider === \"mysql\") {\n\t\t\tconst params = new URL(connectionString);\n\t\t\tconst pool = createPool({\n\t\t\t\thost: params.hostname,\n\t\t\t\tuser: params.username,\n\t\t\t\tpassword: params.password,\n\t\t\t\tdatabase: params.pathname.split(\"/\")[1],\n\t\t\t\tport: Number(params.port),\n\t\t\t});\n\t\t\tdialect = new MysqlDialect({ pool });\n\t\t}\n\n\t\tif (provider === \"sqlite\") {\n\t\t\tconst db = new Database(connectionString);\n\t\t\tdialect = new SqliteDialect({\n\t\t\t\tdatabase: db,\n\t\t\t});\n\t\t}\n\t}\n\treturn dialect;\n};\n\nexport const createKyselyAdapter = (config: BetterAuthOptions) => {\n\tconst dialect = getDialect(config);\n\tif (!dialect) {\n\t\treturn null;\n\t}\n\tconst db = new Kysely<any>({\n\t\tdialect,\n\t});\n\treturn db;\n};\n\nexport const getDatabaseType = (config: BetterAuthOptions) => {\n\tif (\"provider\" in config.database) {\n\t\treturn config.database.provider;\n\t}\n\tif (\"dialect\" in config.database) {\n\t\tif (config.database.dialect instanceof PostgresDialect) {\n\t\t\treturn \"postgres\";\n\t\t}\n\t\tif (config.database.dialect instanceof MysqlDialect) {\n\t\t\treturn \"mysql\";\n\t\t}\n\t\tif (config.database.dialect instanceof SqliteDialect) {\n\t\t\treturn \"sqlite\";\n\t\t}\n\t}\n\treturn \"sqlite\";\n};\n","import type { FieldAttribute } from \"../db\";\nimport type { BetterAuthOptions } from \"../types\";\n\nexport type BetterAuthDbSchema = Record<\n\tstring,\n\t{\n\t\ttableName: string;\n\t\tfields: Record<string, FieldAttribute>;\n\t\tdisableMigrations?: boolean;\n\t}\n>;\n\nexport const getAuthTables = (options: BetterAuthOptions) => {\n\tconst pluginSchema = options.plugins?.reduce((acc, plugin) => {\n\t\tconst schema = plugin.schema;\n\t\treturn {\n\t\t\t...acc,\n\t\t\t...schema,\n\t\t};\n\t}, {});\n\n\treturn {\n\t\t...pluginSchema,\n\t\tuser: {\n\t\t\ttableName: options.user?.modelName || \"user\",\n\t\t\tfields: {\n\t\t\t\tname: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t},\n\t\t\t\temail: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t},\n\t\t\t\temailVerified: {\n\t\t\t\t\ttype: \"boolean\",\n\t\t\t\t\tdefaultValue: () => false,\n\t\t\t\t},\n\t\t\t\timage: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\trequired: false,\n\t\t\t\t},\n\t\t\t\tcreatedAt: {\n\t\t\t\t\ttype: \"date\",\n\t\t\t\t\tdefaultValue: () => new Date(),\n\t\t\t\t},\n\t\t\t\tupdatedAt: {\n\t\t\t\t\ttype: \"date\",\n\t\t\t\t\tdefaultValue: () => new Date(),\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tsession: {\n\t\t\ttableName: options.session?.modelName || \"session\",\n\t\t\tfields: {\n\t\t\t\texpiresAt: {\n\t\t\t\t\ttype: \"date\",\n\t\t\t\t},\n\t\t\t\tipAddress: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\trequired: false,\n\t\t\t\t},\n\t\t\t\tuserAgent: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\trequired: false,\n\t\t\t\t},\n\t\t\t\tuserId: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\treferences: {\n\t\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\tonDelete: \"cascade\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\taccount: {\n\t\t\ttableName: options.account?.modelName || \"account\",\n\t\t\tfields: {\n\t\t\t\taccountId: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t},\n\t\t\t\tproviderId: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t},\n\t\t\t\tuserId: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\treferences: {\n\t\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\tonDelete: \"cascade\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\taccessToken: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\trequired: false,\n\t\t\t\t},\n\t\t\t\trefreshToken: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\trequired: false,\n\t\t\t\t},\n\t\t\t\tidToken: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\trequired: false,\n\t\t\t\t},\n\t\t\t\taccessTokenExpiresAt: {\n\t\t\t\t\ttype: \"date\",\n\t\t\t\t\trequired: false,\n\t\t\t\t},\n\t\t\t\trefreshTokenExpiresAt: {\n\t\t\t\t\ttype: \"date\",\n\t\t\t\t\trequired: false,\n\t\t\t\t},\n\t\t\t\tpassword: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\trequired: false,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t} satisfies BetterAuthDbSchema;\n};\n","import {\n\tgetAuthTables,\n\ttype BetterAuthDbSchema,\n} from \"../../adapters/get-tables\";\nimport type { FieldAttribute } from \"../../db\";\nimport type { BetterAuthOptions } from \"../../types\";\n\nexport function getPluginTable(config: BetterAuthOptions) {\n\tconst pluginsMigrations =\n\t\tconfig.plugins?.flatMap((plugin) =>\n\t\t\tObject.keys(plugin.schema || {})\n\t\t\t\t.map((key) => {\n\t\t\t\t\tconst schema = plugin.schema || {};\n\t\t\t\t\tconst table = schema[key]!;\n\t\t\t\t\tif (table?.disableMigration) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttableName: key,\n\t\t\t\t\t\tfields: table?.fields as Record<string, FieldAttribute>,\n\t\t\t\t\t};\n\t\t\t\t})\n\t\t\t\t.filter((value) => value !== undefined),\n\t\t) || [];\n\treturn pluginsMigrations;\n}\nexport function getSchema(config: BetterAuthOptions) {\n\tconst baseSchema = getAuthTables(config);\n\tconst pluginSchema = getPluginTable(config);\n\tconst schema = [\n\t\t...pluginSchema,\n\t\tbaseSchema.user,\n\t\tbaseSchema.session,\n\t\tbaseSchema.account,\n\t].reduce((acc, curr) => {\n\t\t//@ts-expect-error\n\t\tacc[curr.tableName] = {\n\t\t\tfields: {\n\t\t\t\t...acc[curr.tableName]?.fields,\n\t\t\t\t...curr.fields,\n\t\t\t},\n\t\t};\n\t\treturn acc;\n\t}, {} as BetterAuthDbSchema);\n\treturn schema;\n}\n","import type {\n\tAlterTableColumnAlteringBuilder,\n\tCreateTableBuilder,\n} from \"kysely\";\nimport type { FieldAttribute, FieldType } from \"../../db\";\nimport { logger } from \"../../utils/logger\";\nimport type { BetterAuthOptions } from \"../../types\";\nimport { getSchema } from \"./get-schema\";\nimport { createKyselyAdapter, getDatabaseType } from \"../../adapters/kysely\";\n\nconst postgresMap = {\n\tstring: [\"character varying\", \"text\"],\n\tnumber: [\n\t\t\"integer\",\n\t\t\"bigint\",\n\t\t\"smallint\",\n\t\t\"numeric\",\n\t\t\"real\",\n\t\t\"double precision\",\n\t],\n\tboolean: [\"bool\", \"boolean\"],\n\tdate: [\"timestamp\", \"date\"],\n};\nconst mysqlMap = {\n\tstring: [\"varchar\", \"text\"],\n\tnumber: [\n\t\t\"integer\",\n\t\t\"int\",\n\t\t\"bigint\",\n\t\t\"smallint\",\n\t\t\"decimal\",\n\t\t\"float\",\n\t\t\"double\",\n\t],\n\tboolean: [\"boolean\"],\n\tdate: [\"date\", \"datetime\"],\n};\n\nconst sqliteMap = {\n\tstring: [\"TEXT\"],\n\tnumber: [\"INTEGER\", \"REAL\"],\n\tboolean: [\"INTEGER\", \"BOOLEAN\"], // 0 or 1\n\tdate: [\"DATE\", \"INTEGER\"],\n};\n\nconst map = {\n\tpostgres: postgresMap,\n\tmysql: mysqlMap,\n\tsqlite: sqliteMap,\n};\n\nexport function matchType(\n\tcolumnDataType: string,\n\tfieldType: FieldType,\n\tdbType: \"postgres\" | \"sqlite\" | \"mysql\",\n) {\n\tconst types = map[dbType];\n\tconst type = types[fieldType].map((t) => t.toLowerCase());\n\tconst matches = type.includes(columnDataType.toLowerCase());\n\treturn matches;\n}\n\nexport async function getMigrations(config: BetterAuthOptions) {\n\tconst betterAuthSchema = getSchema(config);\n\tconst dbType = getDatabaseType(config);\n\tconst db = createKyselyAdapter(config);\n\tif (!db) {\n\t\tlogger.error(\"Invalid database configuration.\");\n\t\tprocess.exit(1);\n\t}\n\tconst tableMetadata = await db.introspection.getTables();\n\tconst toBeCreated: {\n\t\ttable: string;\n\t\tfields: Record<string, FieldAttribute>;\n\t}[] = [];\n\tconst toBeAdded: {\n\t\ttable: string;\n\t\tfields: Record<string, FieldAttribute>;\n\t}[] = [];\n\tfor (const [key, value] of Object.entries(betterAuthSchema)) {\n\t\tconst table = tableMetadata.find((t) => t.name === key);\n\t\tif (!table) {\n\t\t\tconst tIndex = toBeCreated.findIndex((t) => t.table === key);\n\t\t\tif (tIndex === -1) {\n\t\t\t\ttoBeCreated.push({\n\t\t\t\t\ttable: key,\n\t\t\t\t\tfields: value.fields,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\ttoBeCreated[tIndex].fields = {\n\t\t\t\t\t...toBeCreated[tIndex].fields,\n\t\t\t\t\t...value.fields,\n\t\t\t\t};\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tlet toBeAddedFields: Record<string, FieldAttribute> = {};\n\t\tfor (const [fieldName, field] of Object.entries(value.fields)) {\n\t\t\tconst column = table.columns.find((c) => c.name === fieldName);\n\t\t\tif (!column) {\n\t\t\t\ttoBeAddedFields[fieldName] = field;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (matchType(column.dataType, field.type, dbType)) {\n\t\t\t\tcontinue;\n\t\t\t} else {\n\t\t\t\tlogger.warn(\n\t\t\t\t\t`Field ${fieldName} in table ${key} has a different type in the database. Expected ${field.type} but got ${column.dataType}.`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tif (Object.keys(toBeAddedFields).length > 0) {\n\t\t\ttoBeAdded.push({\n\t\t\t\ttable: key,\n\t\t\t\tfields: toBeAddedFields,\n\t\t\t});\n\t\t}\n\t}\n\n\tconst typeMap = {\n\t\tstring: \"text\",\n\t\tboolean: \"boolean\",\n\t\tnumber: \"integer\",\n\t\tdate: \"date\",\n\t} as const;\n\tconst migrations: (\n\t\t| AlterTableColumnAlteringBuilder\n\t\t| CreateTableBuilder<string, string>\n\t)[] = [];\n\n\tif (toBeAdded.length) {\n\t\tfor (const table of toBeAdded) {\n\t\t\tlogger.info(`Adding fields to table ${table.table}`);\n\t\t\tfor (const [fieldName, field] of Object.entries(table.fields)) {\n\t\t\t\tlogger.info(`Adding field ${fieldName} with type ${field.type}`);\n\n\t\t\t\tconst type = typeMap[field.type];\n\t\t\t\tconst exec = db.schema\n\t\t\t\t\t.alterTable(table.table)\n\t\t\t\t\t.addColumn(fieldName, type, (col) => {\n\t\t\t\t\t\tcol = field.required !== false ? col.notNull() : col;\n\t\t\t\t\t\tif (field.references) {\n\t\t\t\t\t\t\tcol = col.references(\n\t\t\t\t\t\t\t\t`${field.references.model}.${field.references.field}`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn col;\n\t\t\t\t\t});\n\t\t\t\tmigrations.push(exec);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (toBeCreated.length) {\n\t\tfor (const table of toBeCreated) {\n\t\t\tlet dbT = db.schema\n\t\t\t\t.createTable(table.table)\n\t\t\t\t.addColumn(\"id\", \"text\", (col) => col.primaryKey());\n\t\t\tfor (const [fieldName, field] of Object.entries(table.fields)) {\n\t\t\t\tconst type = typeMap[field.type];\n\t\t\t\tdbT = dbT.addColumn(fieldName, type, (col) => {\n\t\t\t\t\tcol = field.required !== false ? col.notNull() : col;\n\t\t\t\t\tif (field.references) {\n\t\t\t\t\t\tcol = col.references(\n\t\t\t\t\t\t\t`${field.references.model}.${field.references.field}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\treturn col;\n\t\t\t\t});\n\t\t\t}\n\t\t\tmigrations.push(dbT);\n\t\t}\n\t}\n\tasync function runMigrations() {\n\t\treturn await Promise.all(migrations.map((m) => m.execute()));\n\t}\n\treturn { toBeCreated, toBeAdded, runMigrations };\n}\n"],"mappings":"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","names":["Command","path","path","migrate","Command"]}
|
package/dist/client/plugins.d.ts
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import * as nanostores from 'nanostores';
|
|
2
2
|
import { A as AccessControl, S as StatementsPrimitive, R as Role } from '../statement-D6SPoYOh.js';
|
|
3
3
|
import * as _better_fetch_fetch from '@better-fetch/fetch';
|
|
4
|
-
import { o as organization, M as Member, I as Invitation, u as username } from '../index-
|
|
5
|
-
export { g as getPasskeyActions, c as passkeyClient, a as twoFactorClient } from '../index-
|
|
4
|
+
import { o as organization, M as Member, I as Invitation, u as username } from '../index-BMJlrpru.js';
|
|
5
|
+
export { g as getPasskeyActions, c as passkeyClient, a as twoFactorClient } from '../index-BMJlrpru.js';
|
|
6
6
|
import '../helper-D8dhRz72.js';
|
|
7
|
-
import '../index-
|
|
7
|
+
import '../index-Dzn4azgH.js';
|
|
8
8
|
import 'arctic';
|
|
9
9
|
import 'zod';
|
|
10
10
|
import 'better-call';
|
|
11
|
-
import '../internal-adapter-
|
|
11
|
+
import '../internal-adapter-ZyWLv09F.js';
|
|
12
12
|
import 'kysely';
|
|
13
13
|
import '@simplewebauthn/types';
|
|
14
14
|
|
package/dist/client.d.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import * as zod from 'zod';
|
|
2
2
|
import * as _better_fetch_fetch from '@better-fetch/fetch';
|
|
3
3
|
import * as nanostores from 'nanostores';
|
|
4
|
-
import { B as BetterAuthOptions, F as FieldAttribute, I as InferFieldOutput } from './internal-adapter-
|
|
4
|
+
import { B as BetterAuthOptions, F as FieldAttribute, I as InferFieldOutput } from './internal-adapter-ZyWLv09F.js';
|
|
5
5
|
import { Auth } from './index.js';
|
|
6
6
|
import { U as UnionToIntersection } from './helper-D8dhRz72.js';
|
|
7
|
-
import { C as ClientOptions, I as InferClientAPI, a as InferActions, A as AuthClientPlugin, b as IsSignal } from './types-
|
|
8
|
-
import './index-
|
|
7
|
+
import { C as ClientOptions, I as InferClientAPI, a as InferActions, A as AuthClientPlugin, b as IsSignal } from './types-ufQ1MIlW.js';
|
|
8
|
+
import './index-Dzn4azgH.js';
|
|
9
9
|
import 'arctic';
|
|
10
10
|
import 'better-call';
|
|
11
11
|
import 'kysely';
|
|
@@ -308,7 +308,7 @@ declare function createAuthClient<Option extends ClientOptions>(options?: Option
|
|
|
308
308
|
output?: (zod.ZodType | typeof Blob | typeof File) | undefined;
|
|
309
309
|
errorSchema?: zod.ZodType | undefined;
|
|
310
310
|
disableValidation?: boolean | undefined;
|
|
311
|
-
};
|
|
311
|
+
} | undefined;
|
|
312
312
|
}>;
|
|
313
313
|
})[];
|
|
314
314
|
cache?: RequestCache;
|
package/dist/client.js
CHANGED
|
@@ -77,6 +77,12 @@ var csrfPlugin = {
|
|
|
77
77
|
id: "csrf",
|
|
78
78
|
name: "CSRF Check",
|
|
79
79
|
async init(url, options) {
|
|
80
|
+
if (typeof window !== "undefined") {
|
|
81
|
+
const isTheSameOrigin = new URL(options?.baseURL || url).origin === window.location.origin;
|
|
82
|
+
if (isTheSameOrigin) {
|
|
83
|
+
return { url, options };
|
|
84
|
+
}
|
|
85
|
+
}
|
|
80
86
|
if (options?.method !== "GET") {
|
|
81
87
|
options = options || {};
|
|
82
88
|
const { data, error } = await betterFetch("/csrf", {
|
|
@@ -204,16 +210,19 @@ function createDynamicPathProxy(routes, client, knownPathMethods, atoms, atomLis
|
|
|
204
210
|
const { query, options, ...body } = arg;
|
|
205
211
|
return await client(routePath, {
|
|
206
212
|
...options,
|
|
207
|
-
body: method === "GET" ? void 0 :
|
|
213
|
+
body: method === "GET" ? void 0 : {
|
|
214
|
+
...body,
|
|
215
|
+
...options?.body || {}
|
|
216
|
+
},
|
|
208
217
|
query,
|
|
209
218
|
method,
|
|
210
219
|
async onSuccess(context) {
|
|
220
|
+
await options?.onSuccess?.(context);
|
|
211
221
|
const matches = atomListeners?.find((s) => s.matcher(routePath));
|
|
212
222
|
if (!matches) return;
|
|
213
223
|
const signal = atoms[matches.signal];
|
|
214
224
|
if (!signal) return;
|
|
215
225
|
signal.set(!signal.get());
|
|
216
|
-
await options?.onSuccess?.(context);
|
|
217
226
|
}
|
|
218
227
|
});
|
|
219
228
|
}
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/client/config.ts","../src/utils/base-url.ts","../src/client/fetch-plugins.ts","../src/error/better-auth-error.ts","../src/utils/misc.ts","../src/client/proxy.ts","../src/client/session-atom.ts","../src/client/vanilla.ts"],"sourcesContent":["import { createFetch } from \"@better-fetch/fetch\";\nimport { getBaseURL } from \"../utils/base-url\";\nimport { type Atom } from \"nanostores\";\nimport type { AtomListener, ClientOptions } from \"./types\";\n\nimport { addCurrentURL, csrfPlugin, redirectPlugin } from \"./fetch-plugins\";\n\nexport const getClientConfig = <O extends ClientOptions>(options?: O) => {\n\tconst $fetch = createFetch({\n\t\tbaseURL: getBaseURL(options?.fetchOptions?.baseURL),\n\t\t...options?.fetchOptions,\n\t\tplugins: [\n\t\t\tcsrfPlugin,\n\t\t\tredirectPlugin,\n\t\t\taddCurrentURL,\n\t\t\t...(options?.fetchOptions?.plugins || []),\n\t\t\t...(options?.plugins\n\t\t\t\t?.flatMap((plugin) => plugin.fetchPlugins)\n\t\t\t\t.filter((pl) => pl !== undefined) || []),\n\t\t],\n\t});\n\tconst plugins = options?.plugins || [];\n\tlet pluginsActions = {} as Record<string, any>;\n\tlet pluginsAtoms = {} as Record<string, Atom<any>>;\n\tlet pluginPathMethods: Record<string, \"POST\" | \"GET\"> = {\n\t\t\"/sign-out\": \"POST\",\n\t};\n\tconst atomListeners: AtomListener[] = [\n\t\t{\n\t\t\tsignal: \"_sessionSignal\",\n\t\t\tmatcher(path) {\n\t\t\t\treturn path === \"/sign-out\" || path === \"sign-up/email\";\n\t\t\t},\n\t\t},\n\t];\n\tfor (const plugin of plugins) {\n\t\tif (plugin.getActions) {\n\t\t\tObject.assign(pluginsActions, plugin.getActions?.($fetch));\n\t\t}\n\t\tif (plugin.getAtoms) {\n\t\t\tObject.assign(pluginsAtoms, plugin.getAtoms?.($fetch));\n\t\t}\n\t\tif (plugin.pathMethods) {\n\t\t\tObject.assign(pluginPathMethods, plugin.pathMethods);\n\t\t}\n\t\tif (plugin.atomListeners) {\n\t\t\tatomListeners.push(...plugin.atomListeners);\n\t\t}\n\t}\n\treturn {\n\t\tpluginsActions,\n\t\tpluginsAtoms,\n\t\tpluginPathMethods,\n\t\tatomListeners,\n\t\t$fetch,\n\t};\n};\n","function checkHasPath(url: string): boolean {\n\ttry {\n\t\tconst parsedUrl = new URL(url);\n\t\treturn parsedUrl.pathname !== \"/\";\n\t} catch (error) {\n\t\tconsole.error(\"Invalid URL:\", error);\n\t\treturn false;\n\t}\n}\n\nfunction withPath(url: string, path = \"/api/auth\") {\n\tconst hasPath = checkHasPath(url);\n\tif (hasPath) {\n\t\treturn url;\n\t}\n\tpath = path.startsWith(\"/\") ? path : `/${path}`;\n\treturn `${url}${path}`;\n}\n\nexport function getBaseURL(url?: string, path?: string) {\n\tif (url) {\n\t\treturn withPath(url, path);\n\t}\n\tconst env: any = typeof process !== \"undefined\" ? process.env : {};\n\tconst fromEnv =\n\t\tenv.BETTER_AUTH_URL ||\n\t\tenv.NEXT_PUBLIC_BETTER_AUTH_URL ||\n\t\tenv.PUBLIC_BETTER_AUTH_URL ||\n\t\tenv.NUXT_PUBLIC_BETTER_AUTH_URL ||\n\t\tenv.NUXT_PUBLIC_AUTH_URL;\n\tif (fromEnv) {\n\t\treturn withPath(fromEnv, path);\n\t}\n\n\tif (typeof window !== \"undefined\") {\n\t\treturn withPath(window.location.origin, path);\n\t}\n\n\treturn undefined;\n}\n","import { type BetterFetchPlugin, betterFetch } from \"@better-fetch/fetch\";\nimport { BetterAuthError } from \"../error/better-auth-error\";\n\nexport const redirectPlugin = {\n\tid: \"redirect\",\n\tname: \"Redirect\",\n\thooks: {\n\t\tonSuccess(context) {\n\t\t\tif (context.data?.url && context.data?.redirect) {\n\t\t\t\twindow.location.href = context.data.url;\n\t\t\t}\n\t\t},\n\t},\n} satisfies BetterFetchPlugin;\n\nexport const addCurrentURL = {\n\tid: \"add-current-url\",\n\tname: \"Add current URL\",\n\thooks: {\n\t\tonRequest(context) {\n\t\t\tif (typeof window !== \"undefined\") {\n\t\t\t\tconst url = new URL(context.url);\n\t\t\t\turl.searchParams.set(\"currentURL\", window.location.href);\n\t\t\t\tcontext.url = url;\n\t\t\t}\n\t\t\treturn context;\n\t\t},\n\t},\n} satisfies BetterFetchPlugin;\n\nexport const csrfPlugin = {\n\tid: \"csrf\",\n\tname: \"CSRF Check\",\n\tasync init(url, options) {\n\t\tif (options?.method !== \"GET\") {\n\t\t\toptions = options || {};\n\t\t\tconst { data, error } = await betterFetch<{\n\t\t\t\tcsrfToken: string;\n\t\t\t}>(\"/csrf\", {\n\t\t\t\tbody: undefined,\n\t\t\t\tbaseURL: options.baseURL,\n\t\t\t\tplugins: [],\n\t\t\t\tmethod: \"GET\",\n\t\t\t\tcredentials: \"include\",\n\t\t\t\tcustomFetchImpl: options.customFetchImpl,\n\t\t\t});\n\t\t\tif (error?.status === 404) {\n\t\t\t\tthrow new BetterAuthError(\n\t\t\t\t\t\"Route not found. Make sure the server is running and the base URL is correct and includes the path (e.g. http://localhost:3000/api/auth).\",\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (error) {\n\t\t\t\tthrow new BetterAuthError(error.message || \"Failed to get CSRF token.\");\n\t\t\t}\n\t\t\toptions.body = {\n\t\t\t\t...options?.body,\n\t\t\t\tcsrfToken: data.csrfToken,\n\t\t\t};\n\t\t}\n\t\toptions.credentials = \"include\";\n\t\treturn { url, options };\n\t},\n} satisfies BetterFetchPlugin;\n","export class BetterAuthError extends Error {\n\tconstructor(message: string) {\n\t\tsuper(message);\n\t}\n}\n","export function capitalizeFirstLetter(str: string) {\n\treturn str.charAt(0).toUpperCase() + str.slice(1);\n}\n","import type { BetterFetch } from \"@better-fetch/fetch\";\nimport type { Atom, PreinitializedWritableAtom } from \"nanostores\";\nimport type { ProxyRequest } from \"./path-to-object\";\nimport type { AuthClientPlugin } from \"./types\";\n\nfunction getMethod(\n\tpath: string,\n\tknownPathMethods: Record<string, \"POST\" | \"GET\">,\n\targs?: ProxyRequest,\n) {\n\tconst method = knownPathMethods[path];\n\tconst { options, query, ...body } = args || {};\n\tif (method) {\n\t\treturn method;\n\t}\n\tif (options?.method) {\n\t\treturn options.method;\n\t}\n\tif (body && Object.keys(body).length > 0) {\n\t\treturn \"POST\";\n\t}\n\treturn \"GET\";\n}\n\nexport type AuthProxySignal = {\n\tatom: PreinitializedWritableAtom<boolean>;\n\tmatcher: (path: string) => boolean;\n};\n\nexport function createDynamicPathProxy<T extends Record<string, any>>(\n\troutes: T,\n\tclient: BetterFetch,\n\tknownPathMethods: Record<string, \"POST\" | \"GET\">,\n\tatoms: Record<string, Atom>,\n\tatomListeners: AuthClientPlugin[\"atomListeners\"],\n): T {\n\tfunction createProxy(path: string[] = []): any {\n\t\treturn new Proxy(function () {}, {\n\t\t\tget(target, prop: string) {\n\t\t\t\tconst fullPath = [...path, prop];\n\t\t\t\tlet current: any = routes;\n\t\t\t\tfor (const segment of fullPath) {\n\t\t\t\t\tif (current && typeof current === \"object\" && segment in current) {\n\t\t\t\t\t\tcurrent = current[segment];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcurrent = undefined;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (typeof current === \"function\") {\n\t\t\t\t\treturn current;\n\t\t\t\t}\n\t\t\t\treturn createProxy(fullPath);\n\t\t\t},\n\t\t\tapply: async (_, __, args) => {\n\t\t\t\tconst routePath =\n\t\t\t\t\t\"/\" +\n\t\t\t\t\tpath\n\t\t\t\t\t\t.map((segment) =>\n\t\t\t\t\t\t\tsegment.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`),\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.join(\"/\");\n\n\t\t\t\tconst arg = (args[0] || {}) as ProxyRequest;\n\t\t\t\tconst method = getMethod(routePath, knownPathMethods, arg);\n\t\t\t\tconst { query, options, ...body } = arg;\n\n\t\t\t\treturn await client(routePath, {\n\t\t\t\t\t...options,\n\t\t\t\t\tbody: method === \"GET\" ? undefined : body,\n\t\t\t\t\tquery: query,\n\t\t\t\t\tmethod,\n\t\t\t\t\tasync onSuccess(context) {\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * We trigger listeners\n\t\t\t\t\t\t */\n\t\t\t\t\t\tconst matches = atomListeners?.find((s) => s.matcher(routePath));\n\t\t\t\t\t\tif (!matches) return;\n\t\t\t\t\t\tconst signal = atoms[matches.signal];\n\t\t\t\t\t\tif (!signal) return;\n\t\t\t\t\t\t//@ts-expect-error\n\t\t\t\t\t\tsignal.set(!signal.get());\n\t\t\t\t\t\tawait options?.onSuccess?.(context);\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t},\n\t\t});\n\t}\n\n\treturn createProxy() as T;\n}\n","import type { BetterFetch } from \"@better-fetch/fetch\";\nimport { atom, computed, task } from \"nanostores\";\nimport type { Auth as BetterAuth } from \"../auth\";\nimport type { Prettify } from \"../types/helper\";\nimport type { InferSession, InferUser } from \"../types/models\";\nimport type { AuthClientPlugin, ClientOptions } from \"./types\";\n\nexport function getSessionAtom<Option extends ClientOptions>(\n\tclient: BetterFetch,\n) {\n\ttype Plugins = Option[\"plugins\"] extends Array<AuthClientPlugin>\n\t\t? Array<Option[\"plugins\"][number][\"$InferServerPlugin\"]>\n\t\t: undefined;\n\n\ttype Auth = {\n\t\thandler: any;\n\t\tapi: any;\n\t\toptions: {\n\t\t\tdatabase: any;\n\t\t\tplugins: Plugins;\n\t\t};\n\t};\n\n\ttype UserWithAdditionalFields = InferUser<\n\t\tAuth extends BetterAuth ? Auth : never\n\t>;\n\n\t//@ts-expect-error\n\ttype SessionWithAdditionalFields = InferSession<Auth[\"options\"]>;\n\tconst $signal = atom<boolean>(false);\n\tconst $session = computed($signal, () =>\n\t\ttask(async () => {\n\t\t\tconst session = await client(\"/session\", {\n\t\t\t\tcredentials: \"include\",\n\t\t\t\tmethod: \"GET\",\n\t\t\t});\n\t\t\treturn session.data as {\n\t\t\t\tuser: Prettify<UserWithAdditionalFields>;\n\t\t\t\tsession: Prettify<SessionWithAdditionalFields>;\n\t\t\t} | null;\n\t\t}),\n\t);\n\treturn { $session, _sessionSignal: $signal };\n}\n","import { getClientConfig } from \"./config\";\nimport { capitalizeFirstLetter } from \"../utils/misc\";\nimport type {\n\tAuthClientPlugin,\n\tClientOptions,\n\tInferActions,\n\tInferClientAPI,\n\tIsSignal,\n} from \"./types\";\nimport { createDynamicPathProxy } from \"./proxy\";\nimport { getSessionAtom } from \"./session-atom\";\nimport type { UnionToIntersection } from \"../types/helper\";\n\ntype InferResolvedHooks<O extends ClientOptions> = O[\"plugins\"] extends Array<\n\tinfer Plugin\n>\n\t? Plugin extends AuthClientPlugin\n\t\t? Plugin[\"getAtoms\"] extends (fetch: any) => infer Atoms\n\t\t\t? Atoms extends Record<string, any>\n\t\t\t\t? {\n\t\t\t\t\t\t[key in keyof Atoms as IsSignal<key> extends true\n\t\t\t\t\t\t\t? never\n\t\t\t\t\t\t\t: key extends string\n\t\t\t\t\t\t\t\t? `use${Capitalize<key>}`\n\t\t\t\t\t\t\t\t: never]: () => Atoms[key];\n\t\t\t\t\t}\n\t\t\t\t: {}\n\t\t\t: {}\n\t\t: {}\n\t: {};\n\nexport function createAuthClient<Option extends ClientOptions>(\n\toptions?: Option,\n) {\n\tconst {\n\t\tpluginPathMethods,\n\t\tpluginsActions,\n\t\tpluginsAtoms,\n\t\t$fetch,\n\t\tatomListeners,\n\t} = getClientConfig(options);\n\tlet resolvedHooks: Record<string, any> = {};\n\tfor (const [key, value] of Object.entries(pluginsAtoms)) {\n\t\tresolvedHooks[`use${capitalizeFirstLetter(key)}`] = value;\n\t}\n\tconst { $session, _sessionSignal } = getSessionAtom<Option>($fetch);\n\tconst routes = {\n\t\t...pluginsActions,\n\t\t...resolvedHooks,\n\t\t$fetch,\n\t\tuseSession: $session,\n\t};\n\tconst proxy = createDynamicPathProxy(\n\t\troutes,\n\t\t$fetch,\n\t\tpluginPathMethods,\n\t\t{\n\t\t\t...pluginsAtoms,\n\t\t\t_sessionSignal,\n\t\t},\n\t\tatomListeners,\n\t);\n\treturn proxy as UnionToIntersection<InferResolvedHooks<Option>> &\n\t\tInferClientAPI<Option> &\n\t\tInferActions<Option> & {\n\t\t\tuseSession: typeof $session;\n\t\t\t$fetch: typeof $fetch;\n\t\t};\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/client/config.ts","../src/utils/base-url.ts","../src/client/fetch-plugins.ts","../src/error/better-auth-error.ts","../src/utils/misc.ts","../src/client/proxy.ts","../src/client/session-atom.ts","../src/client/vanilla.ts"],"sourcesContent":["import { createFetch } from \"@better-fetch/fetch\";\nimport { getBaseURL } from \"../utils/base-url\";\nimport { type Atom } from \"nanostores\";\nimport type { AtomListener, ClientOptions } from \"./types\";\n\nimport { addCurrentURL, csrfPlugin, redirectPlugin } from \"./fetch-plugins\";\n\nexport const getClientConfig = <O extends ClientOptions>(options?: O) => {\n\tconst $fetch = createFetch({\n\t\tbaseURL: getBaseURL(options?.fetchOptions?.baseURL),\n\t\t...options?.fetchOptions,\n\t\tplugins: [\n\t\t\tcsrfPlugin,\n\t\t\tredirectPlugin,\n\t\t\taddCurrentURL,\n\t\t\t...(options?.fetchOptions?.plugins || []),\n\t\t\t...(options?.plugins\n\t\t\t\t?.flatMap((plugin) => plugin.fetchPlugins)\n\t\t\t\t.filter((pl) => pl !== undefined) || []),\n\t\t],\n\t});\n\tconst plugins = options?.plugins || [];\n\tlet pluginsActions = {} as Record<string, any>;\n\tlet pluginsAtoms = {} as Record<string, Atom<any>>;\n\tlet pluginPathMethods: Record<string, \"POST\" | \"GET\"> = {\n\t\t\"/sign-out\": \"POST\",\n\t};\n\tconst atomListeners: AtomListener[] = [\n\t\t{\n\t\t\tsignal: \"_sessionSignal\",\n\t\t\tmatcher(path) {\n\t\t\t\treturn path === \"/sign-out\" || path === \"sign-up/email\";\n\t\t\t},\n\t\t},\n\t];\n\tfor (const plugin of plugins) {\n\t\tif (plugin.getActions) {\n\t\t\tObject.assign(pluginsActions, plugin.getActions?.($fetch));\n\t\t}\n\t\tif (plugin.getAtoms) {\n\t\t\tObject.assign(pluginsAtoms, plugin.getAtoms?.($fetch));\n\t\t}\n\t\tif (plugin.pathMethods) {\n\t\t\tObject.assign(pluginPathMethods, plugin.pathMethods);\n\t\t}\n\t\tif (plugin.atomListeners) {\n\t\t\tatomListeners.push(...plugin.atomListeners);\n\t\t}\n\t}\n\treturn {\n\t\tpluginsActions,\n\t\tpluginsAtoms,\n\t\tpluginPathMethods,\n\t\tatomListeners,\n\t\t$fetch,\n\t};\n};\n","function checkHasPath(url: string): boolean {\n\ttry {\n\t\tconst parsedUrl = new URL(url);\n\t\treturn parsedUrl.pathname !== \"/\";\n\t} catch (error) {\n\t\tconsole.error(\"Invalid URL:\", error);\n\t\treturn false;\n\t}\n}\n\nfunction withPath(url: string, path = \"/api/auth\") {\n\tconst hasPath = checkHasPath(url);\n\tif (hasPath) {\n\t\treturn url;\n\t}\n\tpath = path.startsWith(\"/\") ? path : `/${path}`;\n\treturn `${url}${path}`;\n}\n\nexport function getBaseURL(url?: string, path?: string) {\n\tif (url) {\n\t\treturn withPath(url, path);\n\t}\n\tconst env: any = typeof process !== \"undefined\" ? process.env : {};\n\tconst fromEnv =\n\t\tenv.BETTER_AUTH_URL ||\n\t\tenv.NEXT_PUBLIC_BETTER_AUTH_URL ||\n\t\tenv.PUBLIC_BETTER_AUTH_URL ||\n\t\tenv.NUXT_PUBLIC_BETTER_AUTH_URL ||\n\t\tenv.NUXT_PUBLIC_AUTH_URL;\n\tif (fromEnv) {\n\t\treturn withPath(fromEnv, path);\n\t}\n\n\tif (typeof window !== \"undefined\") {\n\t\treturn withPath(window.location.origin, path);\n\t}\n\n\treturn undefined;\n}\n","import { type BetterFetchPlugin, betterFetch } from \"@better-fetch/fetch\";\nimport { BetterAuthError } from \"../error/better-auth-error\";\n\nexport const redirectPlugin = {\n\tid: \"redirect\",\n\tname: \"Redirect\",\n\thooks: {\n\t\tonSuccess(context) {\n\t\t\tif (context.data?.url && context.data?.redirect) {\n\t\t\t\twindow.location.href = context.data.url;\n\t\t\t}\n\t\t},\n\t},\n} satisfies BetterFetchPlugin;\n\nexport const addCurrentURL = {\n\tid: \"add-current-url\",\n\tname: \"Add current URL\",\n\thooks: {\n\t\tonRequest(context) {\n\t\t\tif (typeof window !== \"undefined\") {\n\t\t\t\tconst url = new URL(context.url);\n\t\t\t\turl.searchParams.set(\"currentURL\", window.location.href);\n\t\t\t\tcontext.url = url;\n\t\t\t}\n\t\t\treturn context;\n\t\t},\n\t},\n} satisfies BetterFetchPlugin;\n\nexport const csrfPlugin = {\n\tid: \"csrf\",\n\tname: \"CSRF Check\",\n\tasync init(url, options) {\n\t\tif (typeof window !== \"undefined\") {\n\t\t\t/**\n\t\t\t * If origin is the same as baseURL\n\t\t\t * then we don't need to check the CSRF token.\n\t\t\t */\n\t\t\tconst isTheSameOrigin =\n\t\t\t\tnew URL(options?.baseURL || url).origin === window.location.origin;\n\t\t\tif (isTheSameOrigin) {\n\t\t\t\treturn { url, options };\n\t\t\t}\n\t\t}\n\t\tif (options?.method !== \"GET\") {\n\t\t\toptions = options || {};\n\t\t\tconst { data, error } = await betterFetch<{\n\t\t\t\tcsrfToken: string;\n\t\t\t}>(\"/csrf\", {\n\t\t\t\tbody: undefined,\n\t\t\t\tbaseURL: options.baseURL,\n\t\t\t\tplugins: [],\n\t\t\t\tmethod: \"GET\",\n\t\t\t\tcredentials: \"include\",\n\t\t\t\tcustomFetchImpl: options.customFetchImpl,\n\t\t\t});\n\t\t\tif (error?.status === 404) {\n\t\t\t\tthrow new BetterAuthError(\n\t\t\t\t\t\"Route not found. Make sure the server is running and the base URL is correct and includes the path (e.g. http://localhost:3000/api/auth).\",\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (error) {\n\t\t\t\tthrow new BetterAuthError(error.message || \"Failed to get CSRF token.\");\n\t\t\t}\n\t\t\toptions.body = {\n\t\t\t\t...options?.body,\n\t\t\t\tcsrfToken: data.csrfToken,\n\t\t\t};\n\t\t}\n\t\toptions.credentials = \"include\";\n\t\treturn { url, options };\n\t},\n} satisfies BetterFetchPlugin;\n","export class BetterAuthError extends Error {\n\tconstructor(message: string) {\n\t\tsuper(message);\n\t}\n}\n","export function capitalizeFirstLetter(str: string) {\n\treturn str.charAt(0).toUpperCase() + str.slice(1);\n}\n","import type { BetterFetch } from \"@better-fetch/fetch\";\nimport type { Atom, PreinitializedWritableAtom } from \"nanostores\";\nimport type { ProxyRequest } from \"./path-to-object\";\nimport type { AuthClientPlugin } from \"./types\";\n\nfunction getMethod(\n\tpath: string,\n\tknownPathMethods: Record<string, \"POST\" | \"GET\">,\n\targs?: ProxyRequest,\n) {\n\tconst method = knownPathMethods[path];\n\tconst { options, query, ...body } = args || {};\n\tif (method) {\n\t\treturn method;\n\t}\n\tif (options?.method) {\n\t\treturn options.method;\n\t}\n\tif (body && Object.keys(body).length > 0) {\n\t\treturn \"POST\";\n\t}\n\treturn \"GET\";\n}\n\nexport type AuthProxySignal = {\n\tatom: PreinitializedWritableAtom<boolean>;\n\tmatcher: (path: string) => boolean;\n};\n\nexport function createDynamicPathProxy<T extends Record<string, any>>(\n\troutes: T,\n\tclient: BetterFetch,\n\tknownPathMethods: Record<string, \"POST\" | \"GET\">,\n\tatoms: Record<string, Atom>,\n\tatomListeners: AuthClientPlugin[\"atomListeners\"],\n): T {\n\tfunction createProxy(path: string[] = []): any {\n\t\treturn new Proxy(function () {}, {\n\t\t\tget(target, prop: string) {\n\t\t\t\tconst fullPath = [...path, prop];\n\t\t\t\tlet current: any = routes;\n\t\t\t\tfor (const segment of fullPath) {\n\t\t\t\t\tif (current && typeof current === \"object\" && segment in current) {\n\t\t\t\t\t\tcurrent = current[segment];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcurrent = undefined;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (typeof current === \"function\") {\n\t\t\t\t\treturn current;\n\t\t\t\t}\n\t\t\t\treturn createProxy(fullPath);\n\t\t\t},\n\t\t\tapply: async (_, __, args) => {\n\t\t\t\tconst routePath =\n\t\t\t\t\t\"/\" +\n\t\t\t\t\tpath\n\t\t\t\t\t\t.map((segment) =>\n\t\t\t\t\t\t\tsegment.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`),\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.join(\"/\");\n\n\t\t\t\tconst arg = (args[0] || {}) as ProxyRequest;\n\t\t\t\tconst method = getMethod(routePath, knownPathMethods, arg);\n\t\t\t\tconst { query, options, ...body } = arg;\n\n\t\t\t\treturn await client(routePath, {\n\t\t\t\t\t...options,\n\t\t\t\t\tbody:\n\t\t\t\t\t\tmethod === \"GET\"\n\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\t\t...body,\n\t\t\t\t\t\t\t\t\t...(options?.body || {}),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\tquery: query,\n\t\t\t\t\tmethod,\n\t\t\t\t\tasync onSuccess(context) {\n\t\t\t\t\t\tawait options?.onSuccess?.(context);\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * We trigger listeners\n\t\t\t\t\t\t */\n\t\t\t\t\t\tconst matches = atomListeners?.find((s) => s.matcher(routePath));\n\t\t\t\t\t\tif (!matches) return;\n\t\t\t\t\t\tconst signal = atoms[matches.signal];\n\t\t\t\t\t\tif (!signal) return;\n\t\t\t\t\t\t//@ts-expect-error\n\t\t\t\t\t\tsignal.set(!signal.get());\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t},\n\t\t});\n\t}\n\n\treturn createProxy() as T;\n}\n","import type { BetterFetch } from \"@better-fetch/fetch\";\nimport { atom, computed, task } from \"nanostores\";\nimport type { Auth as BetterAuth } from \"../auth\";\nimport type { Prettify } from \"../types/helper\";\nimport type { InferSession, InferUser } from \"../types/models\";\nimport type { AuthClientPlugin, ClientOptions } from \"./types\";\n\nexport function getSessionAtom<Option extends ClientOptions>(\n\tclient: BetterFetch,\n) {\n\ttype Plugins = Option[\"plugins\"] extends Array<AuthClientPlugin>\n\t\t? Array<Option[\"plugins\"][number][\"$InferServerPlugin\"]>\n\t\t: undefined;\n\n\ttype Auth = {\n\t\thandler: any;\n\t\tapi: any;\n\t\toptions: {\n\t\t\tdatabase: any;\n\t\t\tplugins: Plugins;\n\t\t};\n\t};\n\n\ttype UserWithAdditionalFields = InferUser<\n\t\tAuth extends BetterAuth ? Auth : never\n\t>;\n\n\t//@ts-expect-error\n\ttype SessionWithAdditionalFields = InferSession<Auth[\"options\"]>;\n\tconst $signal = atom<boolean>(false);\n\tconst $session = computed($signal, () =>\n\t\ttask(async () => {\n\t\t\tconst session = await client(\"/session\", {\n\t\t\t\tcredentials: \"include\",\n\t\t\t\tmethod: \"GET\",\n\t\t\t});\n\t\t\treturn session.data as {\n\t\t\t\tuser: Prettify<UserWithAdditionalFields>;\n\t\t\t\tsession: Prettify<SessionWithAdditionalFields>;\n\t\t\t} | null;\n\t\t}),\n\t);\n\treturn { $session, _sessionSignal: $signal };\n}\n","import { getClientConfig } from \"./config\";\nimport { capitalizeFirstLetter } from \"../utils/misc\";\nimport type {\n\tAuthClientPlugin,\n\tClientOptions,\n\tInferActions,\n\tInferClientAPI,\n\tIsSignal,\n} from \"./types\";\nimport { createDynamicPathProxy } from \"./proxy\";\nimport { getSessionAtom } from \"./session-atom\";\nimport type { UnionToIntersection } from \"../types/helper\";\n\ntype InferResolvedHooks<O extends ClientOptions> = O[\"plugins\"] extends Array<\n\tinfer Plugin\n>\n\t? Plugin extends AuthClientPlugin\n\t\t? Plugin[\"getAtoms\"] extends (fetch: any) => infer Atoms\n\t\t\t? Atoms extends Record<string, any>\n\t\t\t\t? {\n\t\t\t\t\t\t[key in keyof Atoms as IsSignal<key> extends true\n\t\t\t\t\t\t\t? never\n\t\t\t\t\t\t\t: key extends string\n\t\t\t\t\t\t\t\t? `use${Capitalize<key>}`\n\t\t\t\t\t\t\t\t: never]: () => Atoms[key];\n\t\t\t\t\t}\n\t\t\t\t: {}\n\t\t\t: {}\n\t\t: {}\n\t: {};\n\nexport function createAuthClient<Option extends ClientOptions>(\n\toptions?: Option,\n) {\n\tconst {\n\t\tpluginPathMethods,\n\t\tpluginsActions,\n\t\tpluginsAtoms,\n\t\t$fetch,\n\t\tatomListeners,\n\t} = getClientConfig(options);\n\tlet resolvedHooks: Record<string, any> = {};\n\tfor (const [key, value] of Object.entries(pluginsAtoms)) {\n\t\tresolvedHooks[`use${capitalizeFirstLetter(key)}`] = value;\n\t}\n\tconst { $session, _sessionSignal } = getSessionAtom<Option>($fetch);\n\tconst routes = {\n\t\t...pluginsActions,\n\t\t...resolvedHooks,\n\t\t$fetch,\n\t\tuseSession: $session,\n\t};\n\tconst proxy = createDynamicPathProxy(\n\t\troutes,\n\t\t$fetch,\n\t\tpluginPathMethods,\n\t\t{\n\t\t\t...pluginsAtoms,\n\t\t\t_sessionSignal,\n\t\t},\n\t\tatomListeners,\n\t);\n\treturn proxy as UnionToIntersection<InferResolvedHooks<Option>> &\n\t\tInferClientAPI<Option> &\n\t\tInferActions<Option> & {\n\t\t\tuseSession: typeof $session;\n\t\t\t$fetch: typeof $fetch;\n\t\t};\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { U as User, S as Session } from './index-
|
|
1
|
+
import { U as User, S as Session } from './index-Dzn4azgH.js';
|
|
2
2
|
import * as better_call from 'better-call';
|
|
3
3
|
import { A as AccessControl, R as Role, S as StatementsPrimitive, g as defaultRoles } from './statement-D6SPoYOh.js';
|
|
4
4
|
import { z, ZodObject, ZodOptional, ZodArray, ZodLiteral } from 'zod';
|
|
5
5
|
import * as _better_fetch_fetch from '@better-fetch/fetch';
|
|
6
6
|
import { BetterFetch } from '@better-fetch/fetch';
|
|
7
|
-
import {
|
|
7
|
+
import { H as HookEndpointContext } from './internal-adapter-ZyWLv09F.js';
|
|
8
8
|
import * as _simplewebauthn_types from '@simplewebauthn/types';
|
|
9
9
|
import { CredentialDeviceType, PublicKeyCredentialCreationOptionsJSON } from '@simplewebauthn/types';
|
|
10
10
|
|
|
@@ -2542,6 +2542,13 @@ declare const twoFactor: <O extends TwoFactorOptions>(options: O) => {
|
|
|
2542
2542
|
send2FaOTP: {
|
|
2543
2543
|
(ctx_0?: better_call.Context<"/two-factor/send-otp", {
|
|
2544
2544
|
method: "POST";
|
|
2545
|
+
body: z.ZodOptional<z.ZodObject<{
|
|
2546
|
+
returnOTP: z.ZodDefault<z.ZodBoolean>;
|
|
2547
|
+
}, "strip", z.ZodTypeAny, {
|
|
2548
|
+
returnOTP: boolean;
|
|
2549
|
+
}, {
|
|
2550
|
+
returnOTP?: boolean | undefined;
|
|
2551
|
+
}>>;
|
|
2545
2552
|
use: better_call.Endpoint<better_call.Handler<string, better_call.EndpointOptions, {
|
|
2546
2553
|
valid: () => Promise<{
|
|
2547
2554
|
response: {
|
|
@@ -2575,11 +2582,22 @@ declare const twoFactor: <O extends TwoFactorOptions>(options: O) => {
|
|
|
2575
2582
|
};
|
|
2576
2583
|
}>, better_call.EndpointOptions>[];
|
|
2577
2584
|
}> | undefined): Promise<{
|
|
2585
|
+
OTP: string;
|
|
2586
|
+
status: boolean;
|
|
2587
|
+
} | {
|
|
2578
2588
|
status: boolean;
|
|
2589
|
+
OTP: undefined;
|
|
2579
2590
|
}>;
|
|
2580
2591
|
path: "/two-factor/send-otp";
|
|
2581
2592
|
options: {
|
|
2582
2593
|
method: "POST";
|
|
2594
|
+
body: z.ZodOptional<z.ZodObject<{
|
|
2595
|
+
returnOTP: z.ZodDefault<z.ZodBoolean>;
|
|
2596
|
+
}, "strip", z.ZodTypeAny, {
|
|
2597
|
+
returnOTP: boolean;
|
|
2598
|
+
}, {
|
|
2599
|
+
returnOTP?: boolean | undefined;
|
|
2600
|
+
}>>;
|
|
2583
2601
|
use: better_call.Endpoint<better_call.Handler<string, better_call.EndpointOptions, {
|
|
2584
2602
|
valid: () => Promise<{
|
|
2585
2603
|
response: {
|
|
@@ -2914,7 +2932,7 @@ declare const twoFactor: <O extends TwoFactorOptions>(options: O) => {
|
|
|
2914
2932
|
options: O;
|
|
2915
2933
|
hooks: {
|
|
2916
2934
|
after: {
|
|
2917
|
-
matcher(context:
|
|
2935
|
+
matcher(context: HookEndpointContext): boolean;
|
|
2918
2936
|
handler: better_call.Endpoint<better_call.Handler<string, better_call.EndpointOptions, {
|
|
2919
2937
|
response: Response;
|
|
2920
2938
|
} | undefined>, better_call.EndpointOptions>;
|