@auth/drizzle-adapter 0.8.2 → 1.0.0
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/README.md +1 -1
- package/index.d.ts +59 -32
- package/index.d.ts.map +1 -1
- package/index.js +64 -37
- package/lib/mysql.d.ts +317 -296
- package/lib/mysql.d.ts.map +1 -1
- package/lib/mysql.js +134 -142
- package/lib/pg.d.ts +317 -296
- package/lib/pg.d.ts.map +1 -1
- package/lib/pg.js +128 -123
- package/lib/sqlite.d.ts +317 -296
- package/lib/sqlite.d.ts.map +1 -1
- package/lib/sqlite.js +109 -108
- package/lib/utils.d.ts +10 -21
- package/lib/utils.d.ts.map +1 -1
- package/lib/utils.js +1 -7
- package/package.json +7 -7
- package/src/index.ts +83 -41
- package/src/lib/mysql.ts +209 -190
- package/src/lib/pg.ts +194 -155
- package/src/lib/sqlite.ts +175 -133
- package/src/lib/utils.ts +22 -41
package/lib/mysql.js
CHANGED
|
@@ -1,189 +1,181 @@
|
|
|
1
1
|
import { and, eq } from "drizzle-orm";
|
|
2
|
-
import { int, timestamp,
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
})
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
})
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
2
|
+
import { int, timestamp, primaryKey, varchar, mysqlTable, index, } from "drizzle-orm/mysql-core";
|
|
3
|
+
import { randomUUID } from "crypto";
|
|
4
|
+
export const mysqlUsersTable = mysqlTable("user", {
|
|
5
|
+
id: varchar("id", { length: 255 })
|
|
6
|
+
.primaryKey()
|
|
7
|
+
.$defaultFn(() => randomUUID()),
|
|
8
|
+
name: varchar("name", { length: 255 }),
|
|
9
|
+
email: varchar("email", { length: 255 }).notNull().unique(),
|
|
10
|
+
emailVerified: timestamp("emailVerified", { mode: "date", fsp: 3 }),
|
|
11
|
+
image: varchar("image", { length: 255 }),
|
|
12
|
+
});
|
|
13
|
+
export const mysqlAccountsTable = mysqlTable("account", {
|
|
14
|
+
userId: varchar("userId", { length: 255 })
|
|
15
|
+
.notNull()
|
|
16
|
+
.references(() => mysqlUsersTable.id, { onDelete: "cascade" }),
|
|
17
|
+
type: varchar("type", { length: 255 }).notNull(),
|
|
18
|
+
provider: varchar("provider", { length: 255 }).notNull(),
|
|
19
|
+
providerAccountId: varchar("providerAccountId", { length: 255 }).notNull(),
|
|
20
|
+
refresh_token: varchar("refresh_token", { length: 255 }),
|
|
21
|
+
access_token: varchar("access_token", { length: 255 }),
|
|
22
|
+
expires_at: int("expires_at"),
|
|
23
|
+
token_type: varchar("token_type", { length: 255 }),
|
|
24
|
+
scope: varchar("scope", { length: 255 }),
|
|
25
|
+
id_token: varchar("id_token", { length: 2048 }),
|
|
26
|
+
session_state: varchar("session_state", { length: 255 }),
|
|
27
|
+
}, (account) => ({
|
|
28
|
+
compositePk: primaryKey({
|
|
29
|
+
columns: [account.provider, account.providerAccountId],
|
|
30
|
+
}),
|
|
31
|
+
userIdIdx: index("Account_userId_index").on(account.userId),
|
|
32
|
+
}));
|
|
33
|
+
export const mysqlSessionsTable = mysqlTable("session", {
|
|
34
|
+
id: varchar("id", { length: 255 })
|
|
35
|
+
.primaryKey()
|
|
36
|
+
.$defaultFn(() => randomUUID()),
|
|
37
|
+
sessionToken: varchar("sessionToken", { length: 255 }).notNull().unique(),
|
|
38
|
+
userId: varchar("userId", { length: 255 })
|
|
39
|
+
.notNull()
|
|
40
|
+
.references(() => mysqlUsersTable.id, { onDelete: "cascade" }),
|
|
41
|
+
expires: timestamp("expires", { mode: "date" }).notNull(),
|
|
42
|
+
}, (session) => ({
|
|
43
|
+
userIdIdx: index("Session_userId_index").on(session.userId),
|
|
44
|
+
}));
|
|
45
|
+
export const mysqlVerificationTokensTable = mysqlTable("verificationToken", {
|
|
46
|
+
identifier: varchar("identifier", { length: 255 }).notNull(),
|
|
47
|
+
token: varchar("token", { length: 255 }).notNull().unique(),
|
|
48
|
+
expires: timestamp("expires", { mode: "date" }).notNull(),
|
|
49
|
+
}, (vt) => ({
|
|
50
|
+
compositePk: primaryKey({ columns: [vt.identifier, vt.token] }),
|
|
51
|
+
}));
|
|
52
|
+
export function MySqlDrizzleAdapter(client, schema = {
|
|
53
|
+
usersTable: mysqlUsersTable,
|
|
54
|
+
accountsTable: mysqlAccountsTable,
|
|
55
|
+
sessionsTable: mysqlSessionsTable,
|
|
56
|
+
verificationTokensTable: mysqlVerificationTokensTable,
|
|
57
|
+
}) {
|
|
58
|
+
const { usersTable, accountsTable, sessionsTable, verificationTokensTable } = schema;
|
|
55
59
|
return {
|
|
56
60
|
async createUser(data) {
|
|
57
|
-
const id =
|
|
58
|
-
await client.insert(
|
|
59
|
-
return
|
|
61
|
+
const id = randomUUID();
|
|
62
|
+
await client.insert(usersTable).values({ ...data, id });
|
|
63
|
+
return client
|
|
60
64
|
.select()
|
|
61
|
-
.from(
|
|
62
|
-
.where(eq(
|
|
65
|
+
.from(usersTable)
|
|
66
|
+
.where(eq(usersTable.id, id))
|
|
63
67
|
.then((res) => res[0]);
|
|
64
68
|
},
|
|
65
|
-
async getUser(
|
|
66
|
-
|
|
69
|
+
async getUser(userId) {
|
|
70
|
+
return client
|
|
67
71
|
.select()
|
|
68
|
-
.from(
|
|
69
|
-
.where(eq(
|
|
70
|
-
.then((res) => res[0]
|
|
71
|
-
return thing;
|
|
72
|
+
.from(usersTable)
|
|
73
|
+
.where(eq(usersTable.id, userId))
|
|
74
|
+
.then((res) => (res.length > 0 ? res[0] : null));
|
|
72
75
|
},
|
|
73
|
-
async getUserByEmail(
|
|
74
|
-
|
|
76
|
+
async getUserByEmail(email) {
|
|
77
|
+
return client
|
|
75
78
|
.select()
|
|
76
|
-
.from(
|
|
77
|
-
.where(eq(
|
|
78
|
-
.then((res) => res[0]
|
|
79
|
-
return user;
|
|
79
|
+
.from(usersTable)
|
|
80
|
+
.where(eq(usersTable.email, email))
|
|
81
|
+
.then((res) => (res.length > 0 ? res[0] : null));
|
|
80
82
|
},
|
|
81
83
|
async createSession(data) {
|
|
82
|
-
|
|
83
|
-
|
|
84
|
+
const id = randomUUID();
|
|
85
|
+
await client.insert(sessionsTable).values({ ...data, id });
|
|
86
|
+
return client
|
|
84
87
|
.select()
|
|
85
|
-
.from(
|
|
86
|
-
.where(eq(
|
|
88
|
+
.from(sessionsTable)
|
|
89
|
+
.where(eq(sessionsTable.id, id))
|
|
87
90
|
.then((res) => res[0]);
|
|
88
91
|
},
|
|
89
|
-
async getSessionAndUser(
|
|
90
|
-
|
|
92
|
+
async getSessionAndUser(sessionToken) {
|
|
93
|
+
return client
|
|
91
94
|
.select({
|
|
92
|
-
session:
|
|
93
|
-
user:
|
|
95
|
+
session: sessionsTable,
|
|
96
|
+
user: usersTable,
|
|
94
97
|
})
|
|
95
|
-
.from(
|
|
96
|
-
.where(eq(
|
|
97
|
-
.innerJoin(
|
|
98
|
-
.then((res) => res[0]
|
|
99
|
-
return sessionAndUser;
|
|
98
|
+
.from(sessionsTable)
|
|
99
|
+
.where(eq(sessionsTable.sessionToken, sessionToken))
|
|
100
|
+
.innerJoin(usersTable, eq(usersTable.id, sessionsTable.userId))
|
|
101
|
+
.then((res) => (res.length > 0 ? res[0] : null));
|
|
100
102
|
},
|
|
101
103
|
async updateUser(data) {
|
|
102
104
|
if (!data.id) {
|
|
103
105
|
throw new Error("No user id.");
|
|
104
106
|
}
|
|
105
|
-
await client
|
|
106
|
-
|
|
107
|
+
await client
|
|
108
|
+
.update(usersTable)
|
|
109
|
+
.set(data)
|
|
110
|
+
.where(eq(usersTable.id, data.id));
|
|
111
|
+
const [result] = await client
|
|
107
112
|
.select()
|
|
108
|
-
.from(
|
|
109
|
-
.where(eq(
|
|
110
|
-
|
|
113
|
+
.from(usersTable)
|
|
114
|
+
.where(eq(usersTable.id, data.id));
|
|
115
|
+
if (!result) {
|
|
116
|
+
throw new Error("No user found.");
|
|
117
|
+
}
|
|
118
|
+
return result;
|
|
111
119
|
},
|
|
112
120
|
async updateSession(data) {
|
|
113
121
|
await client
|
|
114
|
-
.update(
|
|
122
|
+
.update(sessionsTable)
|
|
115
123
|
.set(data)
|
|
116
|
-
.where(eq(
|
|
117
|
-
return
|
|
124
|
+
.where(eq(sessionsTable.sessionToken, data.sessionToken));
|
|
125
|
+
return client
|
|
118
126
|
.select()
|
|
119
|
-
.from(
|
|
120
|
-
.where(eq(
|
|
127
|
+
.from(sessionsTable)
|
|
128
|
+
.where(eq(sessionsTable.sessionToken, data.sessionToken))
|
|
121
129
|
.then((res) => res[0]);
|
|
122
130
|
},
|
|
123
|
-
async linkAccount(
|
|
124
|
-
await client.insert(
|
|
131
|
+
async linkAccount(data) {
|
|
132
|
+
await client.insert(accountsTable).values(data);
|
|
125
133
|
},
|
|
126
134
|
async getUserByAccount(account) {
|
|
127
|
-
const
|
|
128
|
-
.select(
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
.
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
return
|
|
135
|
+
const result = await client
|
|
136
|
+
.select({
|
|
137
|
+
account: accountsTable,
|
|
138
|
+
user: usersTable,
|
|
139
|
+
})
|
|
140
|
+
.from(accountsTable)
|
|
141
|
+
.innerJoin(usersTable, eq(accountsTable.userId, usersTable.id))
|
|
142
|
+
.where(and(eq(accountsTable.provider, account.provider), eq(accountsTable.providerAccountId, account.providerAccountId)))
|
|
143
|
+
.then((res) => res[0]);
|
|
144
|
+
return result?.user ?? null;
|
|
137
145
|
},
|
|
138
146
|
async deleteSession(sessionToken) {
|
|
139
|
-
const session = (await client
|
|
140
|
-
.select()
|
|
141
|
-
.from(sessions)
|
|
142
|
-
.where(eq(sessions.sessionToken, sessionToken))
|
|
143
|
-
.then((res) => res[0])) ?? null;
|
|
144
147
|
await client
|
|
145
|
-
.delete(
|
|
146
|
-
.where(eq(
|
|
147
|
-
return session;
|
|
148
|
+
.delete(sessionsTable)
|
|
149
|
+
.where(eq(sessionsTable.sessionToken, sessionToken));
|
|
148
150
|
},
|
|
149
|
-
async createVerificationToken(
|
|
150
|
-
await client.insert(
|
|
151
|
-
return
|
|
151
|
+
async createVerificationToken(data) {
|
|
152
|
+
await client.insert(verificationTokensTable).values(data);
|
|
153
|
+
return client
|
|
152
154
|
.select()
|
|
153
|
-
.from(
|
|
154
|
-
.where(eq(
|
|
155
|
+
.from(verificationTokensTable)
|
|
156
|
+
.where(eq(verificationTokensTable.identifier, data.identifier))
|
|
155
157
|
.then((res) => res[0]);
|
|
156
158
|
},
|
|
157
|
-
async useVerificationToken(
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
159
|
+
async useVerificationToken(params) {
|
|
160
|
+
const deletedToken = await client
|
|
161
|
+
.select()
|
|
162
|
+
.from(verificationTokensTable)
|
|
163
|
+
.where(and(eq(verificationTokensTable.identifier, params.identifier), eq(verificationTokensTable.token, params.token)))
|
|
164
|
+
.then((res) => (res.length > 0 ? res[0] : null));
|
|
165
|
+
if (deletedToken) {
|
|
164
166
|
await client
|
|
165
|
-
.delete(
|
|
166
|
-
.where(and(eq(
|
|
167
|
-
return deletedToken;
|
|
168
|
-
}
|
|
169
|
-
catch (err) {
|
|
170
|
-
throw new Error("No verification token found.");
|
|
167
|
+
.delete(verificationTokensTable)
|
|
168
|
+
.where(and(eq(verificationTokensTable.identifier, params.identifier), eq(verificationTokensTable.token, params.token)));
|
|
171
169
|
}
|
|
170
|
+
return deletedToken;
|
|
172
171
|
},
|
|
173
172
|
async deleteUser(id) {
|
|
174
|
-
|
|
175
|
-
.select()
|
|
176
|
-
.from(users)
|
|
177
|
-
.where(eq(users.id, id))
|
|
178
|
-
.then((res) => res[0] ?? null);
|
|
179
|
-
await client.delete(users).where(eq(users.id, id));
|
|
180
|
-
return user;
|
|
173
|
+
await client.delete(usersTable).where(eq(usersTable.id, id));
|
|
181
174
|
},
|
|
182
|
-
async unlinkAccount(
|
|
175
|
+
async unlinkAccount(params) {
|
|
183
176
|
await client
|
|
184
|
-
.delete(
|
|
185
|
-
.where(and(eq(
|
|
186
|
-
return undefined;
|
|
177
|
+
.delete(accountsTable)
|
|
178
|
+
.where(and(eq(accountsTable.provider, params.provider), eq(accountsTable.providerAccountId, params.providerAccountId)));
|
|
187
179
|
},
|
|
188
180
|
};
|
|
189
181
|
}
|