@coursebuilder/adapter-drizzle 0.0.1

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/lib/mysql.js ADDED
@@ -0,0 +1,263 @@
1
+ import { addSeconds, isAfter } from 'date-fns';
2
+ import { and, eq, sql } from 'drizzle-orm';
3
+ import { mysqlTable as defaultMySqlTableFn, double, index, int, json, mysqlEnum, primaryKey, timestamp, varchar, } from 'drizzle-orm/mysql-core';
4
+ export function createTables(mySqlTable) {
5
+ const users = mySqlTable('user', {
6
+ id: varchar('id', { length: 255 }).notNull().primaryKey(),
7
+ name: varchar('name', { length: 255 }),
8
+ email: varchar('email', { length: 255 }).notNull(),
9
+ role: mysqlEnum('role', ['user', 'admin']).default('user'),
10
+ emailVerified: timestamp('emailVerified', {
11
+ mode: 'date',
12
+ fsp: 3,
13
+ }).defaultNow(),
14
+ image: varchar('image', { length: 255 }),
15
+ });
16
+ const accounts = mySqlTable('account', {
17
+ userId: varchar('userId', { length: 255 })
18
+ .notNull()
19
+ .references(() => users.id, { onDelete: 'cascade' }),
20
+ type: varchar('type', { length: 255 }).$type().notNull(),
21
+ provider: varchar('provider', { length: 255 }).notNull(),
22
+ providerAccountId: varchar('providerAccountId', {
23
+ length: 255,
24
+ }).notNull(),
25
+ refresh_token: varchar('refresh_token', { length: 255 }),
26
+ access_token: varchar('access_token', { length: 255 }),
27
+ expires_at: int('expires_at'),
28
+ token_type: varchar('token_type', { length: 255 }),
29
+ scope: varchar('scope', { length: 255 }),
30
+ id_token: varchar('id_token', { length: 255 }),
31
+ session_state: varchar('session_state', { length: 255 }),
32
+ }, (account) => ({
33
+ pk: primaryKey({ columns: [account.provider, account.providerAccountId] }),
34
+ userIdIdx: index('userId_idx').on(account.userId),
35
+ }));
36
+ const sessions = mySqlTable('session', {
37
+ sessionToken: varchar('sessionToken', { length: 255 }).notNull().primaryKey(),
38
+ userId: varchar('userId', { length: 255 })
39
+ .notNull()
40
+ .references(() => users.id, { onDelete: 'cascade' }),
41
+ expires: timestamp('expires', { mode: 'date' }).notNull(),
42
+ }, (session) => ({
43
+ userIdIdx: index('userId_idx').on(session.userId),
44
+ }));
45
+ const verificationTokens = mySqlTable('verificationToken', {
46
+ identifier: varchar('identifier', { length: 255 }).notNull(),
47
+ token: varchar('token', { length: 255 }).notNull(),
48
+ expires: timestamp('expires', { mode: 'date' }).notNull(),
49
+ createdAt: timestamp('createdAt', {
50
+ mode: 'date',
51
+ fsp: 3,
52
+ }).default(sql `CURRENT_TIMESTAMP(3)`),
53
+ }, (vt) => ({
54
+ pk: primaryKey({ columns: [vt.identifier, vt.token] }),
55
+ }));
56
+ const contentResource = mySqlTable('contentResource', {
57
+ id: varchar('id', { length: 255 }).notNull().primaryKey(),
58
+ type: varchar('type', { length: 255 }).notNull(),
59
+ createdById: varchar('createdById', { length: 255 }).notNull(),
60
+ fields: json('fields').$type().default({}),
61
+ createdAt: timestamp('createdAt', {
62
+ mode: 'date',
63
+ fsp: 3,
64
+ }).defaultNow(),
65
+ updatedAt: timestamp('updatedAt', {
66
+ mode: 'date',
67
+ fsp: 3,
68
+ }).defaultNow(),
69
+ deletedAt: timestamp('deletedAt', {
70
+ mode: 'date',
71
+ fsp: 3,
72
+ }),
73
+ }, (cm) => ({
74
+ typeIdx: index('type_idx').on(cm.type),
75
+ createdByIdx: index('createdById_idx').on(cm.createdById),
76
+ createdAtIdx: index('createdAt_idx').on(cm.createdAt),
77
+ }));
78
+ const contentResourceResource = mySqlTable('contentResourceResource', {
79
+ resourceOfId: varchar('resourceOfId', { length: 255 }).notNull(),
80
+ resourceId: varchar('resourceId', { length: 255 }).notNull(),
81
+ position: double('position').notNull().default(0),
82
+ metadata: json('fields').$type().default({}),
83
+ createdAt: timestamp('createdAt', {
84
+ mode: 'date',
85
+ fsp: 3,
86
+ }).defaultNow(),
87
+ updatedAt: timestamp('updatedAt', {
88
+ mode: 'date',
89
+ fsp: 3,
90
+ }).defaultNow(),
91
+ deletedAt: timestamp('deletedAt', {
92
+ mode: 'date',
93
+ fsp: 3,
94
+ }),
95
+ }, (crr) => ({
96
+ pk: primaryKey({ columns: [crr.resourceOfId, crr.resourceId] }),
97
+ contentResourceIdIdx: index('contentResourceId_idx').on(crr.resourceOfId),
98
+ resourceIdIdx: index('resourceId_idx').on(crr.resourceId),
99
+ }));
100
+ return { users, accounts, sessions, verificationTokens, contentResource, contentResourceResource };
101
+ }
102
+ export function mySqlDrizzleAdapter(client, tableFn = defaultMySqlTableFn) {
103
+ const { users, accounts, sessions, verificationTokens, contentResource } = createTables(tableFn);
104
+ return {
105
+ async createContentResource(data) {
106
+ const id = crypto.randomUUID();
107
+ await client.insert(contentResource).values({ ...data, id });
108
+ return await client
109
+ .select()
110
+ .from(contentResource)
111
+ .where(eq(contentResource.id, id))
112
+ .then((res) => res[0]);
113
+ },
114
+ async getContentResource(data) {
115
+ const thing = (await client
116
+ .select()
117
+ .from(contentResource)
118
+ .where(eq(contentResource.id, data))
119
+ .then((res) => res[0])) ?? null;
120
+ return thing;
121
+ },
122
+ async createUser(data) {
123
+ const id = crypto.randomUUID();
124
+ await client.insert(users).values({ ...data, id });
125
+ return await client
126
+ .select()
127
+ .from(users)
128
+ .where(eq(users.id, id))
129
+ .then((res) => res[0]);
130
+ },
131
+ async getUser(data) {
132
+ const thing = (await client
133
+ .select()
134
+ .from(users)
135
+ .where(eq(users.id, data))
136
+ .then((res) => res[0])) ?? null;
137
+ return thing;
138
+ },
139
+ async getUserByEmail(data) {
140
+ const user = (await client
141
+ .select()
142
+ .from(users)
143
+ .where(eq(users.email, data))
144
+ .then((res) => res[0])) ?? null;
145
+ return user;
146
+ },
147
+ async createSession(data) {
148
+ await client.insert(sessions).values(data);
149
+ return await client
150
+ .select()
151
+ .from(sessions)
152
+ .where(eq(sessions.sessionToken, data.sessionToken))
153
+ .then((res) => res[0]);
154
+ },
155
+ async getSessionAndUser(data) {
156
+ const sessionAndUser = (await client
157
+ .select({
158
+ session: sessions,
159
+ user: users,
160
+ })
161
+ .from(sessions)
162
+ .where(eq(sessions.sessionToken, data))
163
+ .innerJoin(users, eq(users.id, sessions.userId))
164
+ .then((res) => res[0])) ?? null;
165
+ return sessionAndUser;
166
+ },
167
+ async updateUser(data) {
168
+ if (!data.id) {
169
+ throw new Error('No user id.');
170
+ }
171
+ await client.update(users).set(data).where(eq(users.id, data.id));
172
+ return await client
173
+ .select()
174
+ .from(users)
175
+ .where(eq(users.id, data.id))
176
+ .then((res) => res[0]);
177
+ },
178
+ async updateSession(data) {
179
+ await client.update(sessions).set(data).where(eq(sessions.sessionToken, data.sessionToken));
180
+ return await client
181
+ .select()
182
+ .from(sessions)
183
+ .where(eq(sessions.sessionToken, data.sessionToken))
184
+ .then((res) => res[0]);
185
+ },
186
+ async linkAccount(rawAccount) {
187
+ await client.insert(accounts).values(rawAccount);
188
+ },
189
+ async getUserByAccount(account) {
190
+ const dbAccount = (await client
191
+ .select()
192
+ .from(accounts)
193
+ .where(and(eq(accounts.providerAccountId, account.providerAccountId), eq(accounts.provider, account.provider)))
194
+ .leftJoin(users, eq(accounts.userId, users.id))
195
+ .then((res) => res[0])) ?? null;
196
+ if (!dbAccount) {
197
+ return null;
198
+ }
199
+ return dbAccount.user;
200
+ },
201
+ async deleteSession(sessionToken) {
202
+ const session = (await client
203
+ .select()
204
+ .from(sessions)
205
+ .where(eq(sessions.sessionToken, sessionToken))
206
+ .then((res) => res[0])) ?? null;
207
+ await client.delete(sessions).where(eq(sessions.sessionToken, sessionToken));
208
+ return session;
209
+ },
210
+ async createVerificationToken(token) {
211
+ await client.insert(verificationTokens).values(token);
212
+ return await client
213
+ .select()
214
+ .from(verificationTokens)
215
+ .where(eq(verificationTokens.identifier, token.identifier))
216
+ .then((res) => res[0]);
217
+ },
218
+ async useVerificationToken(token) {
219
+ try {
220
+ const deletedToken = (await client
221
+ .select()
222
+ .from(verificationTokens)
223
+ .where(and(eq(verificationTokens.identifier, token.identifier), eq(verificationTokens.token, token.token)))
224
+ .then((res) => res[0])) ?? null;
225
+ if (deletedToken?.createdAt) {
226
+ const TIMEOUT_IN_SECONDS = 90;
227
+ const expireMultipleClicks = addSeconds(deletedToken.createdAt, TIMEOUT_IN_SECONDS);
228
+ const now = new Date();
229
+ if (isAfter(expireMultipleClicks, now)) {
230
+ // @ts-ignore
231
+ const { id: _, ...verificationToken } = token;
232
+ return deletedToken;
233
+ }
234
+ else {
235
+ await client
236
+ .delete(verificationTokens)
237
+ .where(and(eq(verificationTokens.identifier, token.identifier), eq(verificationTokens.token, token.token)));
238
+ return deletedToken;
239
+ }
240
+ }
241
+ return deletedToken;
242
+ }
243
+ catch (err) {
244
+ throw new Error('No verification token found.');
245
+ }
246
+ },
247
+ async deleteUser(id) {
248
+ const user = await client
249
+ .select()
250
+ .from(users)
251
+ .where(eq(users.id, id))
252
+ .then((res) => res[0] ?? null);
253
+ await client.delete(users).where(eq(users.id, id));
254
+ return user;
255
+ },
256
+ async unlinkAccount(account) {
257
+ await client
258
+ .delete(accounts)
259
+ .where(and(eq(accounts.providerAccountId, account.providerAccountId), eq(accounts.provider, account.provider)));
260
+ return undefined;
261
+ },
262
+ };
263
+ }
package/lib/pg.d.ts ADDED
@@ -0,0 +1,299 @@
1
+ import type { Adapter } from '@auth/core/adapters';
2
+ import { PgDatabase, PgTableFn } from 'drizzle-orm/pg-core';
3
+ export declare function createTables(pgTable: PgTableFn): {
4
+ users: import("drizzle-orm/pg-core/table.js").PgTableWithColumns<{
5
+ name: "user";
6
+ schema: undefined;
7
+ columns: {
8
+ id: import("drizzle-orm/pg-core/index.js").PgColumn<{
9
+ name: "id";
10
+ tableName: "user";
11
+ dataType: "string";
12
+ columnType: "PgText";
13
+ data: string;
14
+ driverParam: string;
15
+ notNull: true;
16
+ hasDefault: false;
17
+ enumValues: [string, ...string[]];
18
+ baseColumn: never;
19
+ }, {}, {}>;
20
+ name: import("drizzle-orm/pg-core/index.js").PgColumn<{
21
+ name: "name";
22
+ tableName: "user";
23
+ dataType: "string";
24
+ columnType: "PgText";
25
+ data: string;
26
+ driverParam: string;
27
+ notNull: false;
28
+ hasDefault: false;
29
+ enumValues: [string, ...string[]];
30
+ baseColumn: never;
31
+ }, {}, {}>;
32
+ email: import("drizzle-orm/pg-core/index.js").PgColumn<{
33
+ name: "email";
34
+ tableName: "user";
35
+ dataType: "string";
36
+ columnType: "PgText";
37
+ data: string;
38
+ driverParam: string;
39
+ notNull: true;
40
+ hasDefault: false;
41
+ enumValues: [string, ...string[]];
42
+ baseColumn: never;
43
+ }, {}, {}>;
44
+ emailVerified: import("drizzle-orm/pg-core/index.js").PgColumn<{
45
+ name: "emailVerified";
46
+ tableName: "user";
47
+ dataType: "date";
48
+ columnType: "PgTimestamp";
49
+ data: Date;
50
+ driverParam: string;
51
+ notNull: false;
52
+ hasDefault: false;
53
+ enumValues: undefined;
54
+ baseColumn: never;
55
+ }, {}, {}>;
56
+ image: import("drizzle-orm/pg-core/index.js").PgColumn<{
57
+ name: "image";
58
+ tableName: "user";
59
+ dataType: "string";
60
+ columnType: "PgText";
61
+ data: string;
62
+ driverParam: string;
63
+ notNull: false;
64
+ hasDefault: false;
65
+ enumValues: [string, ...string[]];
66
+ baseColumn: never;
67
+ }, {}, {}>;
68
+ };
69
+ dialect: "pg";
70
+ }>;
71
+ accounts: import("drizzle-orm/pg-core/table.js").PgTableWithColumns<{
72
+ name: "account";
73
+ schema: undefined;
74
+ columns: {
75
+ userId: import("drizzle-orm/pg-core/index.js").PgColumn<{
76
+ name: "userId";
77
+ tableName: "account";
78
+ dataType: "string";
79
+ columnType: "PgText";
80
+ data: string;
81
+ driverParam: string;
82
+ notNull: true;
83
+ hasDefault: false;
84
+ enumValues: [string, ...string[]];
85
+ baseColumn: never;
86
+ }, {}, {}>;
87
+ type: import("drizzle-orm/pg-core/index.js").PgColumn<{
88
+ name: "type";
89
+ tableName: "account";
90
+ dataType: "string";
91
+ columnType: "PgText";
92
+ data: "email" | "oidc" | "oauth" | "webauthn";
93
+ driverParam: string;
94
+ notNull: true;
95
+ hasDefault: false;
96
+ enumValues: [string, ...string[]];
97
+ baseColumn: never;
98
+ }, {}, {}>;
99
+ provider: import("drizzle-orm/pg-core/index.js").PgColumn<{
100
+ name: "provider";
101
+ tableName: "account";
102
+ dataType: "string";
103
+ columnType: "PgText";
104
+ data: string;
105
+ driverParam: string;
106
+ notNull: true;
107
+ hasDefault: false;
108
+ enumValues: [string, ...string[]];
109
+ baseColumn: never;
110
+ }, {}, {}>;
111
+ providerAccountId: import("drizzle-orm/pg-core/index.js").PgColumn<{
112
+ name: "providerAccountId";
113
+ tableName: "account";
114
+ dataType: "string";
115
+ columnType: "PgText";
116
+ data: string;
117
+ driverParam: string;
118
+ notNull: true;
119
+ hasDefault: false;
120
+ enumValues: [string, ...string[]];
121
+ baseColumn: never;
122
+ }, {}, {}>;
123
+ refresh_token: import("drizzle-orm/pg-core/index.js").PgColumn<{
124
+ name: "refresh_token";
125
+ tableName: "account";
126
+ dataType: "string";
127
+ columnType: "PgText";
128
+ data: string;
129
+ driverParam: string;
130
+ notNull: false;
131
+ hasDefault: false;
132
+ enumValues: [string, ...string[]];
133
+ baseColumn: never;
134
+ }, {}, {}>;
135
+ access_token: import("drizzle-orm/pg-core/index.js").PgColumn<{
136
+ name: "access_token";
137
+ tableName: "account";
138
+ dataType: "string";
139
+ columnType: "PgText";
140
+ data: string;
141
+ driverParam: string;
142
+ notNull: false;
143
+ hasDefault: false;
144
+ enumValues: [string, ...string[]];
145
+ baseColumn: never;
146
+ }, {}, {}>;
147
+ expires_at: import("drizzle-orm/pg-core/index.js").PgColumn<{
148
+ name: "expires_at";
149
+ tableName: "account";
150
+ dataType: "number";
151
+ columnType: "PgInteger";
152
+ data: number;
153
+ driverParam: string | number;
154
+ notNull: false;
155
+ hasDefault: false;
156
+ enumValues: undefined;
157
+ baseColumn: never;
158
+ }, {}, {}>;
159
+ token_type: import("drizzle-orm/pg-core/index.js").PgColumn<{
160
+ name: "token_type";
161
+ tableName: "account";
162
+ dataType: "string";
163
+ columnType: "PgText";
164
+ data: string;
165
+ driverParam: string;
166
+ notNull: false;
167
+ hasDefault: false;
168
+ enumValues: [string, ...string[]];
169
+ baseColumn: never;
170
+ }, {}, {}>;
171
+ scope: import("drizzle-orm/pg-core/index.js").PgColumn<{
172
+ name: "scope";
173
+ tableName: "account";
174
+ dataType: "string";
175
+ columnType: "PgText";
176
+ data: string;
177
+ driverParam: string;
178
+ notNull: false;
179
+ hasDefault: false;
180
+ enumValues: [string, ...string[]];
181
+ baseColumn: never;
182
+ }, {}, {}>;
183
+ id_token: import("drizzle-orm/pg-core/index.js").PgColumn<{
184
+ name: "id_token";
185
+ tableName: "account";
186
+ dataType: "string";
187
+ columnType: "PgText";
188
+ data: string;
189
+ driverParam: string;
190
+ notNull: false;
191
+ hasDefault: false;
192
+ enumValues: [string, ...string[]];
193
+ baseColumn: never;
194
+ }, {}, {}>;
195
+ session_state: import("drizzle-orm/pg-core/index.js").PgColumn<{
196
+ name: "session_state";
197
+ tableName: "account";
198
+ dataType: "string";
199
+ columnType: "PgText";
200
+ data: string;
201
+ driverParam: string;
202
+ notNull: false;
203
+ hasDefault: false;
204
+ enumValues: [string, ...string[]];
205
+ baseColumn: never;
206
+ }, {}, {}>;
207
+ };
208
+ dialect: "pg";
209
+ }>;
210
+ sessions: import("drizzle-orm/pg-core/table.js").PgTableWithColumns<{
211
+ name: "session";
212
+ schema: undefined;
213
+ columns: {
214
+ sessionToken: import("drizzle-orm/pg-core/index.js").PgColumn<{
215
+ name: "sessionToken";
216
+ tableName: "session";
217
+ dataType: "string";
218
+ columnType: "PgText";
219
+ data: string;
220
+ driverParam: string;
221
+ notNull: true;
222
+ hasDefault: false;
223
+ enumValues: [string, ...string[]];
224
+ baseColumn: never;
225
+ }, {}, {}>;
226
+ userId: import("drizzle-orm/pg-core/index.js").PgColumn<{
227
+ name: "userId";
228
+ tableName: "session";
229
+ dataType: "string";
230
+ columnType: "PgText";
231
+ data: string;
232
+ driverParam: string;
233
+ notNull: true;
234
+ hasDefault: false;
235
+ enumValues: [string, ...string[]];
236
+ baseColumn: never;
237
+ }, {}, {}>;
238
+ expires: import("drizzle-orm/pg-core/index.js").PgColumn<{
239
+ name: "expires";
240
+ tableName: "session";
241
+ dataType: "date";
242
+ columnType: "PgTimestamp";
243
+ data: Date;
244
+ driverParam: string;
245
+ notNull: true;
246
+ hasDefault: false;
247
+ enumValues: undefined;
248
+ baseColumn: never;
249
+ }, {}, {}>;
250
+ };
251
+ dialect: "pg";
252
+ }>;
253
+ verificationTokens: import("drizzle-orm/pg-core/table.js").PgTableWithColumns<{
254
+ name: "verificationToken";
255
+ schema: undefined;
256
+ columns: {
257
+ identifier: import("drizzle-orm/pg-core/index.js").PgColumn<{
258
+ name: "identifier";
259
+ tableName: "verificationToken";
260
+ dataType: "string";
261
+ columnType: "PgText";
262
+ data: string;
263
+ driverParam: string;
264
+ notNull: true;
265
+ hasDefault: false;
266
+ enumValues: [string, ...string[]];
267
+ baseColumn: never;
268
+ }, {}, {}>;
269
+ token: import("drizzle-orm/pg-core/index.js").PgColumn<{
270
+ name: "token";
271
+ tableName: "verificationToken";
272
+ dataType: "string";
273
+ columnType: "PgText";
274
+ data: string;
275
+ driverParam: string;
276
+ notNull: true;
277
+ hasDefault: false;
278
+ enumValues: [string, ...string[]];
279
+ baseColumn: never;
280
+ }, {}, {}>;
281
+ expires: import("drizzle-orm/pg-core/index.js").PgColumn<{
282
+ name: "expires";
283
+ tableName: "verificationToken";
284
+ dataType: "date";
285
+ columnType: "PgTimestamp";
286
+ data: Date;
287
+ driverParam: string;
288
+ notNull: true;
289
+ hasDefault: false;
290
+ enumValues: undefined;
291
+ baseColumn: never;
292
+ }, {}, {}>;
293
+ };
294
+ dialect: "pg";
295
+ }>;
296
+ };
297
+ export type DefaultSchema = ReturnType<typeof createTables>;
298
+ export declare function pgDrizzleAdapter(client: InstanceType<typeof PgDatabase>, tableFn?: PgTableFn<undefined>): Adapter;
299
+ //# sourceMappingURL=pg.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pg.d.ts","sourceRoot":"","sources":["../src/lib/pg.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAA+C,MAAM,qBAAqB,CAAA;AAE/F,OAAO,EAGL,UAAU,EACV,SAAS,EAIV,MAAM,qBAAqB,CAAA;AAI5B,wBAAgB,YAAY,CAAC,OAAO,EAAE,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoD9C;AAED,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAA;AAE3D,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,YAAY,CAAC,OAAO,UAAU,CAAC,EAAE,OAAO,uBAAmB,GAAG,OAAO,CA+H7G"}