better-auth 0.0.9-beta.9 → 0.0.10-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/access.d.ts +3 -3
- package/dist/access.js +13 -3
- package/dist/access.js.map +1 -1
- package/dist/cli.js +136 -85
- package/dist/cli.js.map +1 -1
- package/dist/client/plugins.d.ts +43 -29
- package/dist/client/plugins.js +174 -39
- package/dist/client/plugins.js.map +1 -1
- package/dist/client.d.ts +42 -62
- package/dist/client.js +61 -31
- package/dist/client.js.map +1 -1
- package/dist/{helper-D8dhRz72.d.ts → helper-vUH9Oq11.d.ts} +1 -3
- package/dist/{index-Bh0E6nXA.d.ts → index-BAR_7S7m.d.ts} +465 -1041
- package/dist/{index-B9jOjqnF.d.ts → index-BMwSnG5w.d.ts} +1 -1
- package/dist/{index-CFnp-t4R.d.ts → index-W5Fzy-nR.d.ts} +132 -464
- package/dist/index.d.ts +4 -4
- package/dist/index.js +924 -183
- package/dist/index.js.map +1 -1
- package/dist/{internal-adapter-DXjewSmi.d.ts → internal-adapter-c3hLHHXV.d.ts} +8 -7
- package/dist/next-js.d.ts +12 -8
- package/dist/next-js.js +12 -8
- package/dist/next-js.js.map +1 -1
- package/dist/node.d.ts +13 -0
- package/dist/node.js +9 -0
- package/dist/node.js.map +1 -0
- package/dist/plugins.d.ts +219 -10
- package/dist/plugins.js +1827 -350
- package/dist/plugins.js.map +1 -1
- package/dist/react.d.ts +25 -103
- package/dist/react.js +68 -46
- package/dist/react.js.map +1 -1
- package/dist/{index-CcxejJTH.d.ts → schema-deEs0FFi.d.ts} +86 -86
- package/dist/social.d.ts +2 -2
- package/dist/social.js +583 -31
- package/dist/social.js.map +1 -1
- package/dist/solid-start.d.ts +4 -4
- package/dist/solid-start.js +3 -3
- package/dist/solid-start.js.map +1 -1
- package/dist/solid.d.ts +19 -71
- package/dist/solid.js +64 -33
- package/dist/solid.js.map +1 -1
- package/dist/{statement-D6SPoYOh.d.ts → statement-BUvhzMmI.d.ts} +1 -1
- package/dist/svelte-kit.d.ts +4 -4
- package/dist/svelte-kit.js +6 -5
- package/dist/svelte-kit.js.map +1 -1
- package/dist/svelte.d.ts +20 -72
- package/dist/svelte.js +63 -34
- package/dist/svelte.js.map +1 -1
- package/dist/{types-D7zF2-3F.d.ts → types-DMdTAtSL.d.ts} +6 -6
- package/dist/types.d.ts +4 -4
- package/dist/types.js +0 -2
- package/dist/types.js.map +1 -1
- package/dist/vue.d.ts +25 -103
- package/dist/vue.js +64 -33
- package/dist/vue.js.map +1 -1
- package/package.json +11 -6
package/dist/access.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export { A as AccessControl, a as AuthortizeResponse, P as ParsingError, R as Role, S as StatementsPrimitive, b as SubArray, c as Subset, d as adminAc, e as createAccessControl, f as defaultAc, g as defaultRoles, h as defaultStatements, m as memberAc, o as ownerAc } from './statement-
|
|
2
|
-
export { p as permissionFromString } from './index-
|
|
3
|
-
import './helper-
|
|
1
|
+
export { A as AccessControl, a as AuthortizeResponse, P as ParsingError, R as Role, S as StatementsPrimitive, b as SubArray, c as Subset, d as adminAc, e as createAccessControl, f as defaultAc, g as defaultRoles, h as defaultStatements, m as memberAc, o as ownerAc } from './statement-BUvhzMmI.js';
|
|
2
|
+
export { p as permissionFromString } from './index-BMwSnG5w.js';
|
|
3
|
+
import './helper-vUH9Oq11.js';
|
package/dist/access.js
CHANGED
|
@@ -110,7 +110,17 @@ var defaultRoles = {
|
|
|
110
110
|
var permissionFromString = (permission) => {
|
|
111
111
|
return Role.fromString(permission ?? "");
|
|
112
112
|
};
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
113
|
+
export {
|
|
114
|
+
AccessControl,
|
|
115
|
+
ParsingError,
|
|
116
|
+
Role,
|
|
117
|
+
adminAc,
|
|
118
|
+
createAccessControl,
|
|
119
|
+
defaultAc,
|
|
120
|
+
defaultRoles,
|
|
121
|
+
defaultStatements,
|
|
122
|
+
memberAc,
|
|
123
|
+
ownerAc,
|
|
124
|
+
permissionFromString
|
|
125
|
+
};
|
|
116
126
|
//# sourceMappingURL=access.js.map
|
package/dist/access.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/plugins/organization/access/src/access.ts","../src/plugins/organization/access/statement.ts","../src/plugins/organization/access/utils.ts"],"
|
|
1
|
+
{"version":3,"sources":["../src/plugins/organization/access/src/access.ts","../src/plugins/organization/access/statement.ts","../src/plugins/organization/access/utils.ts"],"sourcesContent":["import type { StatementsPrimitive as Statements, Subset } from \"./types\";\n\nexport class ParsingError extends Error {\n\tpublic readonly path: string;\n\tconstructor(message: string, path: string) {\n\t\tsuper(message);\n\t\tthis.path = path;\n\t}\n}\n\ntype Connector = \"OR\" | \"AND\";\n\nexport class AccessControl<TStatements extends Statements = Statements> {\n\tprivate readonly statements: TStatements;\n\tconstructor(private readonly s: TStatements) {\n\t\tthis.statements = s;\n\t}\n\tpublic newRole<K extends keyof TStatements>(\n\t\tstatements: Subset<K, TStatements>,\n\t) {\n\t\treturn new Role<Subset<K, TStatements>>(statements);\n\t}\n}\n\nexport type AuthortizeResponse =\n\t| { success: false; error: string }\n\t| { success: true; error?: never };\n\nexport class Role<TStatements extends Statements> {\n\tpublic readonly statements: TStatements;\n\n\tconstructor(statements: TStatements) {\n\t\tthis.statements = statements;\n\t}\n\n\tpublic authorize<K extends keyof TStatements>(\n\t\trequest: Subset<K, TStatements>,\n\t\tconnector?: Connector,\n\t): AuthortizeResponse {\n\t\tfor (const [requestedResource, requestedActions] of Object.entries(\n\t\t\trequest,\n\t\t)) {\n\t\t\tconst allowedActions = this.statements[requestedResource];\n\t\t\tif (!allowedActions) {\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\terror: `You are not allowed to access resource: ${requestedResource}`,\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst success =\n\t\t\t\tconnector === \"OR\"\n\t\t\t\t\t? (requestedActions as string[]).some((requestedAction) =>\n\t\t\t\t\t\t\tallowedActions.includes(requestedAction),\n\t\t\t\t\t\t)\n\t\t\t\t\t: (requestedActions as string[]).every((requestedAction) =>\n\t\t\t\t\t\t\tallowedActions.includes(requestedAction),\n\t\t\t\t\t\t);\n\t\t\tif (success) {\n\t\t\t\treturn { success };\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: `unauthorized to access resource \"${requestedResource}\"`,\n\t\t\t};\n\t\t}\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\terror: \"Not authorized\",\n\t\t};\n\t}\n\n\tstatic fromString<TStatements extends Statements>(s: string) {\n\t\tconst statements = JSON.parse(s) as TStatements;\n\n\t\tif (typeof statements !== \"object\") {\n\t\t\tthrow new ParsingError(\"statements is not an object\", \".\");\n\t\t}\n\t\tfor (const [resource, actions] of Object.entries(statements)) {\n\t\t\tif (typeof resource !== \"string\") {\n\t\t\t\tthrow new ParsingError(\"invalid resource identifier\", resource);\n\t\t\t}\n\t\t\tif (!Array.isArray(actions)) {\n\t\t\t\tthrow new ParsingError(\"actions is not an array\", resource);\n\t\t\t}\n\t\t\tfor (let i = 0; i < actions.length; i++) {\n\t\t\t\tif (typeof actions[i] !== \"string\") {\n\t\t\t\t\tthrow new ParsingError(\"action is not a string\", `${resource}[${i}]`);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn new Role<TStatements>(statements);\n\t}\n\n\tpublic toString(): string {\n\t\treturn JSON.stringify(this.statements);\n\t}\n}\n","import { AccessControl } from \"./src/access\";\nimport type { StatementsPrimitive } from \"./src/types\";\n\nexport const createAccessControl = <S extends StatementsPrimitive>(\n\tstatements: S,\n) => {\n\treturn new AccessControl<S>(statements);\n};\n\nexport const defaultStatements = {\n\torganization: [\"update\", \"delete\"],\n\tmember: [\"create\", \"update\", \"delete\"],\n\tinvitation: [\"create\", \"cancel\"],\n} as const;\n\nexport const defaultAc = createAccessControl(defaultStatements);\n\nexport const adminAc = defaultAc.newRole({\n\torganization: [\"update\"],\n\tinvitation: [\"create\", \"cancel\"],\n\tmember: [\"create\", \"update\", \"delete\"],\n});\n\nexport const ownerAc = defaultAc.newRole({\n\torganization: [\"update\", \"delete\"],\n\tmember: [\"create\", \"update\", \"delete\"],\n\tinvitation: [\"create\", \"cancel\"],\n});\n\nexport const memberAc = defaultAc.newRole({\n\torganization: [],\n\tmember: [],\n\tinvitation: [],\n});\n\nexport const defaultRoles = {\n\tadmin: adminAc,\n\towner: ownerAc,\n\tmember: memberAc,\n};\n","import { Role } from \"./src/access\";\n\nexport const permissionFromString = (permission?: string) => {\n\treturn Role.fromString(permission ?? \"\");\n};\n"],"mappings":"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","names":[]}
|
package/dist/cli.js
CHANGED
|
@@ -1,20 +1,17 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { Command } from 'commander';
|
|
3
|
-
import 'dotenv/config';
|
|
4
|
-
import path from 'node:path';
|
|
5
|
-
import jiti from 'jiti';
|
|
6
|
-
import { createConsola } from 'consola';
|
|
7
|
-
import { z } from 'zod';
|
|
8
|
-
import { existsSync } from 'fs';
|
|
9
|
-
import path2 from 'path';
|
|
10
|
-
import Database from 'better-sqlite3';
|
|
11
|
-
import { Kysely, MysqlDialect, PostgresDialect, SqliteDialect } from 'kysely';
|
|
12
|
-
import { createPool } from 'mysql2';
|
|
13
|
-
import pg from 'pg';
|
|
14
|
-
import ora from 'ora';
|
|
15
|
-
import chalk from 'chalk';
|
|
16
|
-
import prompts from 'prompts';
|
|
17
2
|
|
|
3
|
+
// src/cli/index.ts
|
|
4
|
+
import { Command as Command2 } from "commander";
|
|
5
|
+
import "dotenv/config";
|
|
6
|
+
|
|
7
|
+
// src/cli/commands/migrate.ts
|
|
8
|
+
import { Command } from "commander";
|
|
9
|
+
|
|
10
|
+
// src/cli/get-config.ts
|
|
11
|
+
import { loadConfig } from "c12";
|
|
12
|
+
|
|
13
|
+
// src/utils/logger.ts
|
|
14
|
+
import { createConsola } from "consola";
|
|
18
15
|
var consola = createConsola({
|
|
19
16
|
formatOptions: {
|
|
20
17
|
date: false,
|
|
@@ -28,41 +25,55 @@ var consola = createConsola({
|
|
|
28
25
|
var createLogger = (options) => {
|
|
29
26
|
return {
|
|
30
27
|
log: (...args) => {
|
|
31
|
-
consola.log("", ...args);
|
|
28
|
+
!options?.disabled && consola.log("", ...args);
|
|
32
29
|
},
|
|
33
30
|
error: (...args) => {
|
|
34
|
-
consola.error("", ...args);
|
|
31
|
+
!options?.disabled && consola.error("", ...args);
|
|
35
32
|
},
|
|
36
33
|
warn: (...args) => {
|
|
37
|
-
consola.warn("", ...args);
|
|
34
|
+
!options?.disabled && consola.warn("", ...args);
|
|
38
35
|
},
|
|
39
36
|
info: (...args) => {
|
|
40
|
-
consola.info("", ...args);
|
|
37
|
+
!options?.disabled && consola.info("", ...args);
|
|
41
38
|
},
|
|
42
39
|
debug: (...args) => {
|
|
43
|
-
consola.debug("", ...args);
|
|
40
|
+
!options?.disabled && consola.debug("", ...args);
|
|
44
41
|
},
|
|
45
42
|
box: (...args) => {
|
|
46
|
-
consola.box("", ...args);
|
|
43
|
+
!options?.disabled && consola.box("", ...args);
|
|
47
44
|
},
|
|
48
45
|
success: (...args) => {
|
|
49
|
-
consola.success("", ...args);
|
|
46
|
+
!options?.disabled && consola.success("", ...args);
|
|
50
47
|
},
|
|
51
48
|
break: (...args) => {
|
|
52
|
-
console.log("\n");
|
|
49
|
+
!options?.disabled && console.log("\n");
|
|
53
50
|
}
|
|
54
51
|
};
|
|
55
52
|
};
|
|
56
53
|
var logger = createLogger();
|
|
57
54
|
|
|
58
55
|
// src/cli/get-config.ts
|
|
59
|
-
|
|
56
|
+
import path from "path";
|
|
57
|
+
import babelPresetTypescript from "@babel/preset-typescript";
|
|
58
|
+
import babelPresetReact from "@babel/preset-react";
|
|
59
|
+
var possiblePaths = ["auth.ts", "auth.tsx"];
|
|
60
60
|
possiblePaths = [
|
|
61
61
|
...possiblePaths,
|
|
62
62
|
...possiblePaths.map((it) => `lib/${it}`),
|
|
63
63
|
...possiblePaths.map((it) => `utils/${it}`)
|
|
64
64
|
];
|
|
65
65
|
possiblePaths = [...possiblePaths, ...possiblePaths.map((it) => `src/${it}`)];
|
|
66
|
+
var jitiOptions = {
|
|
67
|
+
transformOptions: {
|
|
68
|
+
babel: {
|
|
69
|
+
presets: [
|
|
70
|
+
[babelPresetTypescript, { isTSX: true, allExtensions: true }],
|
|
71
|
+
[babelPresetReact, { runtime: "automatic" }]
|
|
72
|
+
]
|
|
73
|
+
}
|
|
74
|
+
},
|
|
75
|
+
extensions: [".ts", ".tsx", ".js", ".jsx"]
|
|
76
|
+
};
|
|
66
77
|
async function getConfig({
|
|
67
78
|
cwd,
|
|
68
79
|
configPath
|
|
@@ -70,35 +81,40 @@ async function getConfig({
|
|
|
70
81
|
try {
|
|
71
82
|
let configFile = null;
|
|
72
83
|
if (configPath) {
|
|
73
|
-
const config = await
|
|
74
|
-
path.join(cwd, configPath),
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
84
|
+
const { config } = await loadConfig({
|
|
85
|
+
configFile: path.join(cwd, configPath),
|
|
86
|
+
dotenv: true,
|
|
87
|
+
jitiOptions
|
|
88
|
+
});
|
|
89
|
+
if (!config.auth && !config.default) {
|
|
90
|
+
logger.error(
|
|
91
|
+
"[#better-auth]: Couldn't read your auth config. Make sure to default export your auth instance or to export as a variable named auth."
|
|
92
|
+
);
|
|
93
|
+
process.exit(1);
|
|
79
94
|
}
|
|
80
|
-
configFile = config.auth.options;
|
|
95
|
+
configFile = config.auth?.options || config.default?.options || null;
|
|
81
96
|
}
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
if (
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
+
if (!configFile) {
|
|
98
|
+
for (const possiblePath of possiblePaths) {
|
|
99
|
+
try {
|
|
100
|
+
const { config } = await loadConfig({
|
|
101
|
+
configFile: possiblePath,
|
|
102
|
+
jitiOptions
|
|
103
|
+
});
|
|
104
|
+
const hasConfig = Object.keys(config).length > 0;
|
|
105
|
+
if (hasConfig) {
|
|
106
|
+
configFile = config.auth?.options || config.default?.options || null;
|
|
107
|
+
if (!configFile) {
|
|
108
|
+
logger.error("[#better-auth]: Couldn't read your auth config.");
|
|
109
|
+
logger.break();
|
|
110
|
+
logger.info(
|
|
111
|
+
"[#better-auth]: Make sure to default export your auth instance or to export as a variable named auth."
|
|
112
|
+
);
|
|
113
|
+
process.exit(1);
|
|
114
|
+
}
|
|
115
|
+
break;
|
|
97
116
|
}
|
|
98
|
-
|
|
99
|
-
}
|
|
100
|
-
} catch (e) {
|
|
101
|
-
if (!(e instanceof Error && e.message.includes("Cannot find module"))) {
|
|
117
|
+
} catch (e) {
|
|
102
118
|
logger.error(e);
|
|
103
119
|
process.exit(1);
|
|
104
120
|
}
|
|
@@ -106,15 +122,32 @@ async function getConfig({
|
|
|
106
122
|
}
|
|
107
123
|
return configFile;
|
|
108
124
|
} catch (e) {
|
|
109
|
-
|
|
125
|
+
logger.error("Error while reading your auth config.", e);
|
|
126
|
+
process.exit(1);
|
|
110
127
|
}
|
|
111
128
|
}
|
|
112
|
-
|
|
129
|
+
|
|
130
|
+
// src/cli/commands/migrate.ts
|
|
131
|
+
import { z } from "zod";
|
|
132
|
+
import { existsSync } from "fs";
|
|
133
|
+
import path2 from "path";
|
|
134
|
+
|
|
135
|
+
// src/adapters/kysely.ts
|
|
136
|
+
import Database from "better-sqlite3";
|
|
137
|
+
import { Kysely } from "kysely";
|
|
138
|
+
import {
|
|
139
|
+
MysqlDialect,
|
|
140
|
+
PostgresDialect,
|
|
141
|
+
SqliteDialect
|
|
142
|
+
} from "kysely";
|
|
143
|
+
import { createPool } from "mysql2";
|
|
144
|
+
import postgres from "postgres";
|
|
145
|
+
import { PostgresJSDialect } from "kysely-postgres-js";
|
|
113
146
|
var getDialect = (config) => {
|
|
114
147
|
if (!config.database) {
|
|
115
148
|
return null;
|
|
116
149
|
}
|
|
117
|
-
if (
|
|
150
|
+
if ("createDriver" in config.database) {
|
|
118
151
|
return config.database;
|
|
119
152
|
}
|
|
120
153
|
let dialect = null;
|
|
@@ -122,11 +155,11 @@ var getDialect = (config) => {
|
|
|
122
155
|
const provider = config.database.provider;
|
|
123
156
|
const connectionString = config.database?.url?.trim();
|
|
124
157
|
if (provider === "postgres") {
|
|
125
|
-
const
|
|
126
|
-
|
|
158
|
+
const pg = postgres(connectionString, {
|
|
159
|
+
prepare: false
|
|
127
160
|
});
|
|
128
|
-
dialect = new
|
|
129
|
-
|
|
161
|
+
dialect = new PostgresJSDialect({
|
|
162
|
+
postgres: pg
|
|
130
163
|
});
|
|
131
164
|
}
|
|
132
165
|
if (provider === "mysql") {
|
|
@@ -177,6 +210,11 @@ var getDatabaseType = (config) => {
|
|
|
177
210
|
return "sqlite";
|
|
178
211
|
};
|
|
179
212
|
|
|
213
|
+
// src/cli/commands/migrate.ts
|
|
214
|
+
import ora from "ora";
|
|
215
|
+
import chalk from "chalk";
|
|
216
|
+
import prompts from "prompts";
|
|
217
|
+
|
|
180
218
|
// src/adapters/get-tables.ts
|
|
181
219
|
var getAuthTables = (options) => {
|
|
182
220
|
const pluginSchema = options.plugins?.reduce(
|
|
@@ -196,8 +234,8 @@ var getAuthTables = (options) => {
|
|
|
196
234
|
},
|
|
197
235
|
{}
|
|
198
236
|
);
|
|
237
|
+
const { user, session, account, ...pluginTables } = pluginSchema || {};
|
|
199
238
|
return {
|
|
200
|
-
...pluginSchema,
|
|
201
239
|
user: {
|
|
202
240
|
tableName: options.user?.modelName || "user",
|
|
203
241
|
fields: {
|
|
@@ -223,8 +261,9 @@ var getAuthTables = (options) => {
|
|
|
223
261
|
type: "date",
|
|
224
262
|
defaultValue: () => /* @__PURE__ */ new Date()
|
|
225
263
|
},
|
|
226
|
-
...
|
|
227
|
-
}
|
|
264
|
+
...user?.fields
|
|
265
|
+
},
|
|
266
|
+
order: 0
|
|
228
267
|
},
|
|
229
268
|
session: {
|
|
230
269
|
tableName: options.session?.modelName || "session",
|
|
@@ -248,8 +287,9 @@ var getAuthTables = (options) => {
|
|
|
248
287
|
onDelete: "cascade"
|
|
249
288
|
}
|
|
250
289
|
},
|
|
251
|
-
...
|
|
252
|
-
}
|
|
290
|
+
...session?.fields
|
|
291
|
+
},
|
|
292
|
+
order: 1
|
|
253
293
|
},
|
|
254
294
|
account: {
|
|
255
295
|
tableName: options.account?.modelName || "account",
|
|
@@ -292,9 +332,11 @@ var getAuthTables = (options) => {
|
|
|
292
332
|
type: "string",
|
|
293
333
|
required: false
|
|
294
334
|
},
|
|
295
|
-
...
|
|
296
|
-
}
|
|
297
|
-
|
|
335
|
+
...account?.fields
|
|
336
|
+
},
|
|
337
|
+
order: 2
|
|
338
|
+
},
|
|
339
|
+
...pluginTables
|
|
298
340
|
};
|
|
299
341
|
};
|
|
300
342
|
|
|
@@ -319,10 +361,10 @@ function getSchema(config) {
|
|
|
319
361
|
const baseSchema = getAuthTables(config);
|
|
320
362
|
const pluginSchema = getPluginTable(config);
|
|
321
363
|
const schema = [
|
|
322
|
-
...pluginSchema,
|
|
323
364
|
baseSchema.user,
|
|
324
365
|
baseSchema.session,
|
|
325
|
-
baseSchema.account
|
|
366
|
+
baseSchema.account,
|
|
367
|
+
...pluginSchema
|
|
326
368
|
].reduce((acc, curr) => {
|
|
327
369
|
acc[curr.tableName] = {
|
|
328
370
|
fields: {
|
|
@@ -397,16 +439,25 @@ async function getMigrations(config) {
|
|
|
397
439
|
const table = tableMetadata.find((t) => t.name === key);
|
|
398
440
|
if (!table) {
|
|
399
441
|
const tIndex = toBeCreated.findIndex((t) => t.table === key);
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
442
|
+
const tableData = {
|
|
443
|
+
table: key,
|
|
444
|
+
fields: value.fields,
|
|
445
|
+
order: value.order || Infinity
|
|
446
|
+
};
|
|
447
|
+
const insertIndex = toBeCreated.findIndex(
|
|
448
|
+
(t) => (t.order || Infinity) > tableData.order
|
|
449
|
+
);
|
|
450
|
+
if (insertIndex === -1) {
|
|
451
|
+
if (tIndex === -1) {
|
|
452
|
+
toBeCreated.push(tableData);
|
|
453
|
+
} else {
|
|
454
|
+
toBeCreated[tIndex].fields = {
|
|
455
|
+
...toBeCreated[tIndex].fields,
|
|
456
|
+
...value.fields
|
|
457
|
+
};
|
|
458
|
+
}
|
|
405
459
|
} else {
|
|
406
|
-
toBeCreated
|
|
407
|
-
...toBeCreated[tIndex].fields,
|
|
408
|
-
...value.fields
|
|
409
|
-
};
|
|
460
|
+
toBeCreated.splice(insertIndex, 0, tableData);
|
|
410
461
|
}
|
|
411
462
|
continue;
|
|
412
463
|
}
|
|
@@ -428,7 +479,8 @@ async function getMigrations(config) {
|
|
|
428
479
|
if (Object.keys(toBeAddedFields).length > 0) {
|
|
429
480
|
toBeAdded.push({
|
|
430
481
|
table: key,
|
|
431
|
-
fields: toBeAddedFields
|
|
482
|
+
fields: toBeAddedFields,
|
|
483
|
+
order: value.order || Infinity
|
|
432
484
|
});
|
|
433
485
|
}
|
|
434
486
|
}
|
|
@@ -441,9 +493,7 @@ async function getMigrations(config) {
|
|
|
441
493
|
const migrations = [];
|
|
442
494
|
if (toBeAdded.length) {
|
|
443
495
|
for (const table of toBeAdded) {
|
|
444
|
-
logger.info(`Adding fields to table ${table.table}`);
|
|
445
496
|
for (const [fieldName, field] of Object.entries(table.fields)) {
|
|
446
|
-
logger.info(`Adding field ${fieldName} with type ${field.type}`);
|
|
447
497
|
const type = typeMap[field.type];
|
|
448
498
|
const exec = db.schema.alterTable(table.table).addColumn(fieldName, type, (col) => {
|
|
449
499
|
col = field.required !== false ? col.notNull() : col;
|
|
@@ -477,7 +527,9 @@ async function getMigrations(config) {
|
|
|
477
527
|
}
|
|
478
528
|
}
|
|
479
529
|
async function runMigrations() {
|
|
480
|
-
|
|
530
|
+
for (const migration of migrations) {
|
|
531
|
+
await migration.execute();
|
|
532
|
+
}
|
|
481
533
|
}
|
|
482
534
|
return { toBeCreated, toBeAdded, runMigrations };
|
|
483
535
|
}
|
|
@@ -490,7 +542,7 @@ var migrate = new Command("migrate").option(
|
|
|
490
542
|
).option(
|
|
491
543
|
"--config <config>",
|
|
492
544
|
"the path to the configuration file. defaults to the first configuration file found."
|
|
493
|
-
).action(async (opts) => {
|
|
545
|
+
).option("--y", "").action(async (opts) => {
|
|
494
546
|
const options = z.object({
|
|
495
547
|
cwd: z.string(),
|
|
496
548
|
config: z.string().optional()
|
|
@@ -506,7 +558,7 @@ var migrate = new Command("migrate").option(
|
|
|
506
558
|
});
|
|
507
559
|
if (!config) {
|
|
508
560
|
logger.error(
|
|
509
|
-
"No configuration file found. Add a `auth.ts` or
|
|
561
|
+
"No configuration file found. Add a `auth.ts` file to your project or pass the path to the configuration file using the `--config` flag."
|
|
510
562
|
);
|
|
511
563
|
return;
|
|
512
564
|
}
|
|
@@ -524,7 +576,7 @@ var migrate = new Command("migrate").option(
|
|
|
524
576
|
}
|
|
525
577
|
spinner.stop();
|
|
526
578
|
logger.info(`\u{1F511} The migration will affect the following:`);
|
|
527
|
-
for (const table of [...
|
|
579
|
+
for (const table of [...toBeCreated, ...toBeAdded]) {
|
|
528
580
|
logger.info(
|
|
529
581
|
"->",
|
|
530
582
|
chalk.magenta(Object.keys(table.fields).join(", ")),
|
|
@@ -552,10 +604,9 @@ var migrate = new Command("migrate").option(
|
|
|
552
604
|
|
|
553
605
|
// src/cli/index.ts
|
|
554
606
|
async function main() {
|
|
555
|
-
const program = new
|
|
607
|
+
const program = new Command2().name("better-auth");
|
|
556
608
|
program.addCommand(migrate);
|
|
557
609
|
program.parse();
|
|
558
610
|
}
|
|
559
611
|
main();
|
|
560
|
-
//# sourceMappingURL=cli.js.map
|
|
561
612
|
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/logger.ts","../src/cli/get-config.ts","../src/adapters/kysely.ts","../src/adapters/get-tables.ts","../src/cli/utils/get-schema.ts","../src/cli/utils/get-migration.ts","../src/cli/commands/migrate.ts","../src/cli/index.ts"],"names":["path","migrate","Command"],"mappings":"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","file":"cli.js","sourcesContent":["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 path from \"node:path\";\nimport jiti from \"jiti\";\nimport type { BetterAuthOptions } from \"../types\";\nimport { logger } from \"../utils/logger\";\n\nlet possiblePaths = [\"auth.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 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()) || null;\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\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\tif (\n\t\tconfig.database instanceof MysqlDialect ||\n\t\tconfig.database instanceof PostgresDialect ||\n\t\tconfig.database instanceof SqliteDialect\n\t) {\n\t\treturn config.database;\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(\n\t\t(acc, plugin) => {\n\t\t\tconst schema = plugin.schema;\n\t\t\tif (!schema) return acc;\n\t\t\tfor (const [key, value] of Object.entries(schema)) {\n\t\t\t\tacc[key] = {\n\t\t\t\t\tfields: {\n\t\t\t\t\t\t...acc[key]?.fields,\n\t\t\t\t\t\t...value.fields,\n\t\t\t\t\t},\n\t\t\t\t\ttableName: key,\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn acc;\n\t\t},\n\t\t{} as Record<\n\t\t\tstring,\n\t\t\t{ fields: Record<string, FieldAttribute>; tableName: string }\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\t...pluginSchema?.user?.fields,\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\t...pluginSchema?.session?.fields,\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\t...pluginSchema?.account?.fields,\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\"int4\",\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","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(\n\t\t\t\t\"No configuration file found. Add a `auth.ts` or `auth.config.ts` file to your project.\",\n\t\t\t);\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","#!/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"]}
|
|
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.option(\"--y\", \"\")\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(\n\t\t\t\t\"No configuration file found. Add a `auth.ts` file to your project or pass the path to the configuration file using the `--config` flag.\",\n\t\t\t);\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 [...toBeCreated, ...toBeAdded]) {\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 { loadConfig } from \"c12\";\nimport type { BetterAuthOptions } from \"../types\";\nimport { logger } from \"../utils/logger\";\nimport path from \"path\";\n// @ts-ignore\nimport babelPresetTypescript from \"@babel/preset-typescript\";\n// @ts-ignore\nimport babelPresetReact from \"@babel/preset-react\";\n\nlet possiblePaths = [\"auth.ts\", \"auth.tsx\"];\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\n/**\n * .tsx files are not supported by Jiti.\n */\nconst jitiOptions = {\n\ttransformOptions: {\n\t\tbabel: {\n\t\t\tpresets: [\n\t\t\t\t[babelPresetTypescript, { isTSX: true, allExtensions: true }],\n\t\t\t\t[babelPresetReact, { runtime: \"automatic\" }],\n\t\t\t],\n\t\t},\n\t},\n\textensions: [\".ts\", \".tsx\", \".js\", \".jsx\"],\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 loadConfig<{\n\t\t\t\tauth: {\n\t\t\t\t\toptions: BetterAuthOptions;\n\t\t\t\t};\n\t\t\t\tdefault?: {\n\t\t\t\t\toptions: BetterAuthOptions;\n\t\t\t\t};\n\t\t\t}>({\n\t\t\t\tconfigFile: path.join(cwd, configPath),\n\t\t\t\tdotenv: true,\n\t\t\t\tjitiOptions,\n\t\t\t});\n\t\t\tif (!config.auth && !config.default) {\n\t\t\t\tlogger.error(\n\t\t\t\t\t\"[#better-auth]: Couldn't read your auth config. Make sure to default export your auth instance or to export as a variable named auth.\",\n\t\t\t\t);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\tconfigFile = config.auth?.options || config.default?.options || null;\n\t\t}\n\n\t\tif (!configFile) {\n\t\t\tfor (const possiblePath of possiblePaths) {\n\t\t\t\ttry {\n\t\t\t\t\tconst { config } = await loadConfig<{\n\t\t\t\t\t\tauth: {\n\t\t\t\t\t\t\toptions: BetterAuthOptions;\n\t\t\t\t\t\t};\n\t\t\t\t\t\tdefault?: {\n\t\t\t\t\t\t\toptions: BetterAuthOptions;\n\t\t\t\t\t\t};\n\t\t\t\t\t}>({\n\t\t\t\t\t\tconfigFile: possiblePath,\n\t\t\t\t\t\tjitiOptions,\n\t\t\t\t\t});\n\t\t\t\t\tconst hasConfig = Object.keys(config).length > 0;\n\t\t\t\t\tif (hasConfig) {\n\t\t\t\t\t\tconfigFile =\n\t\t\t\t\t\t\tconfig.auth?.options || config.default?.options || null;\n\t\t\t\t\t\tif (!configFile) {\n\t\t\t\t\t\t\tlogger.error(\"[#better-auth]: Couldn't read your auth config.\");\n\t\t\t\t\t\t\tlogger.break();\n\t\t\t\t\t\t\tlogger.info(\n\t\t\t\t\t\t\t\t\"[#better-auth]: Make sure to default export your auth instance or to export as a variable named auth.\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tprocess.exit(1);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t} catch (e) {\n\t\t\t\t\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\tlogger.error(\"Error while reading your auth config.\", e);\n\t\tprocess.exit(1);\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 postgres from \"postgres\";\nimport type { FieldAttribute } from \"../db\";\nimport type { BetterAuthOptions } from \"../types\";\nimport type { Adapter, Where } from \"../types/adapter\";\nimport { PostgresJSDialect } from \"kysely-postgres-js\";\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()) || null;\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\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\tif (\"createDriver\" in config.database) {\n\t\treturn config.database;\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 pg = postgres(connectionString, {\n\t\t\t\tprepare: false,\n\t\t\t});\n\t\t\tdialect = new PostgresJSDialect({\n\t\t\t\tpostgres: pg,\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\torder?: number;\n\t}\n>;\n\nexport const getAuthTables = (options: BetterAuthOptions) => {\n\tconst pluginSchema = options.plugins?.reduce(\n\t\t(acc, plugin) => {\n\t\t\tconst schema = plugin.schema;\n\t\t\tif (!schema) return acc;\n\t\t\tfor (const [key, value] of Object.entries(schema)) {\n\t\t\t\tacc[key] = {\n\t\t\t\t\tfields: {\n\t\t\t\t\t\t...acc[key]?.fields,\n\t\t\t\t\t\t...value.fields,\n\t\t\t\t\t},\n\t\t\t\t\ttableName: key,\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn acc;\n\t\t},\n\t\t{} as Record<\n\t\t\tstring,\n\t\t\t{ fields: Record<string, FieldAttribute>; tableName: string }\n\t\t>,\n\t);\n\n\tconst { user, session, account, ...pluginTables } = pluginSchema || {};\n\n\treturn {\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\t...user?.fields,\n\t\t\t},\n\t\t\torder: 0,\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\t...session?.fields,\n\t\t\t},\n\t\t\torder: 1,\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\t...account?.fields,\n\t\t\t},\n\t\t\torder: 2,\n\t\t},\n\t\t...pluginTables,\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\tbaseSchema.user,\n\t\tbaseSchema.session,\n\t\tbaseSchema.account,\n\t\t...pluginSchema,\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\"int4\",\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\torder: number;\n\t}[] = [];\n\tconst toBeAdded: {\n\t\ttable: string;\n\t\tfields: Record<string, FieldAttribute>;\n\t\torder: number;\n\t}[] = [];\n\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\tconst tableData = {\n\t\t\t\ttable: key,\n\t\t\t\tfields: value.fields,\n\t\t\t\torder: value.order || Infinity,\n\t\t\t};\n\n\t\t\tconst insertIndex = toBeCreated.findIndex(\n\t\t\t\t(t) => (t.order || Infinity) > tableData.order,\n\t\t\t);\n\n\t\t\tif (insertIndex === -1) {\n\t\t\t\tif (tIndex === -1) {\n\t\t\t\t\ttoBeCreated.push(tableData);\n\t\t\t\t} else {\n\t\t\t\t\ttoBeCreated[tIndex].fields = {\n\t\t\t\t\t\t...toBeCreated[tIndex].fields,\n\t\t\t\t\t\t...value.fields,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\ttoBeCreated.splice(insertIndex, 0, tableData);\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\torder: value.order || Infinity,\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\tfor (const [fieldName, field] of Object.entries(table.fields)) {\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\tfor (const migration of migrations) {\n\t\t\tawait migration.execute();\n\t\t}\n\t}\n\treturn { toBeCreated, toBeAdded, runMigrations };\n}\n"],"mappings":"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","names":["Command","path","path","migrate","Command"]}
|