@fortressauth/adapter-sql 0.1.8 → 0.1.9

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.
Files changed (48) hide show
  1. package/README.md +57 -16
  2. package/dist/adapter.d.ts +13 -2
  3. package/dist/adapter.d.ts.map +1 -1
  4. package/dist/adapter.js +162 -11
  5. package/dist/adapter.js.map +1 -1
  6. package/dist/index.d.ts +4 -1
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +3 -1
  9. package/dist/index.js.map +1 -1
  10. package/dist/migrations/001_initial.d.ts +3 -2
  11. package/dist/migrations/001_initial.d.ts.map +1 -1
  12. package/dist/migrations/001_initial.js +47 -29
  13. package/dist/migrations/001_initial.js.map +1 -1
  14. package/dist/migrations/002_email_verification.d.ts +5 -0
  15. package/dist/migrations/002_email_verification.d.ts.map +1 -0
  16. package/dist/migrations/002_email_verification.js +31 -0
  17. package/dist/migrations/002_email_verification.js.map +1 -0
  18. package/dist/migrations/003_password_resets.d.ts +5 -0
  19. package/dist/migrations/003_password_resets.d.ts.map +1 -0
  20. package/dist/migrations/003_password_resets.js +31 -0
  21. package/dist/migrations/003_password_resets.js.map +1 -0
  22. package/dist/migrations/004_session_split_token.d.ts +5 -0
  23. package/dist/migrations/004_session_split_token.d.ts.map +1 -0
  24. package/dist/migrations/004_session_split_token.js +46 -0
  25. package/dist/migrations/004_session_split_token.js.map +1 -0
  26. package/dist/migrations/005_oauth_support.d.ts +5 -0
  27. package/dist/migrations/005_oauth_support.d.ts.map +1 -0
  28. package/dist/migrations/005_oauth_support.js +27 -0
  29. package/dist/migrations/005_oauth_support.js.map +1 -0
  30. package/dist/migrations/index.d.ts +9 -0
  31. package/dist/migrations/index.d.ts.map +1 -0
  32. package/dist/migrations/index.js +47 -0
  33. package/dist/migrations/index.js.map +1 -0
  34. package/dist/migrations/mysql.d.ts +4 -0
  35. package/dist/migrations/mysql.d.ts.map +1 -0
  36. package/dist/migrations/mysql.js +8 -0
  37. package/dist/migrations/mysql.js.map +1 -0
  38. package/dist/migrations/postgres.d.ts +4 -0
  39. package/dist/migrations/postgres.d.ts.map +1 -0
  40. package/dist/migrations/postgres.js +8 -0
  41. package/dist/migrations/postgres.js.map +1 -0
  42. package/dist/migrations/types.d.ts +9 -0
  43. package/dist/migrations/types.d.ts.map +1 -0
  44. package/dist/migrations/types.js +14 -0
  45. package/dist/migrations/types.js.map +1 -0
  46. package/dist/schema.d.ts +30 -1
  47. package/dist/schema.d.ts.map +1 -1
  48. package/package.json +15 -6
package/README.md CHANGED
@@ -4,10 +4,10 @@ SQL database adapter for FortressAuth using Kysely query builder.
4
4
 
5
5
  ## Features
6
6
 
7
- - 🗄️ **Multi-Database Support**: PostgreSQL, MySQL, SQLite
8
- - 🔍 **Type-Safe Queries**: Powered by Kysely
9
- - 🔄 **Transactions**: Full transaction support
10
- - 📊 **Migrations**: Built-in migration system
7
+ - Multi-Database Support: PostgreSQL, MySQL, SQLite
8
+ - Type-Safe Queries: Powered by Kysely
9
+ - Transactions: Full transaction support
10
+ - Migrations: Built-in migration system
11
11
 
12
12
  ## Installation
13
13
 
@@ -32,6 +32,19 @@ npm install mysql2
32
32
  npm install better-sqlite3
33
33
  ```
34
34
 
35
+ ## Environment Variables
36
+
37
+ ```bash
38
+ # SQLite (default for development)
39
+ DATABASE_URL=./fortress.db
40
+
41
+ # PostgreSQL
42
+ DATABASE_URL=postgresql://user:password@localhost:5432/fortressauth
43
+
44
+ # MySQL
45
+ DATABASE_URL=mysql://user:password@localhost:3306/fortressauth
46
+ ```
47
+
35
48
  ## Quick Start
36
49
 
37
50
  ### SQLite
@@ -47,7 +60,7 @@ const db = new Kysely({
47
60
  });
48
61
 
49
62
  // Run migrations
50
- await up(db);
63
+ await up(db, { dialect: 'sqlite' });
51
64
 
52
65
  // Create adapter
53
66
  const adapter = new SqlAdapter(db, { dialect: 'sqlite' });
@@ -63,13 +76,12 @@ import { SqlAdapter, up } from '@fortressauth/adapter-sql';
63
76
  const db = new Kysely({
64
77
  dialect: new PostgresDialect({
65
78
  pool: new Pool({
66
- host: 'localhost',
67
- database: 'auth',
79
+ connectionString: process.env.DATABASE_URL,
68
80
  }),
69
81
  }),
70
82
  });
71
83
 
72
- await up(db);
84
+ await up(db, { dialect: 'postgres' });
73
85
  const adapter = new SqlAdapter(db, { dialect: 'postgres' });
74
86
  ```
75
87
 
@@ -82,14 +94,11 @@ import { SqlAdapter, up } from '@fortressauth/adapter-sql';
82
94
 
83
95
  const db = new Kysely({
84
96
  dialect: new MysqlDialect({
85
- pool: createPool({
86
- host: 'localhost',
87
- database: 'auth',
88
- }),
97
+ pool: createPool(process.env.DATABASE_URL!),
89
98
  }),
90
99
  });
91
100
 
92
- await up(db);
101
+ await up(db, { dialect: 'mysql' });
93
102
  const adapter = new SqlAdapter(db, { dialect: 'mysql' });
94
103
  ```
95
104
 
@@ -107,13 +116,45 @@ The adapter creates four tables:
107
116
  ```typescript
108
117
  import { up, down } from '@fortressauth/adapter-sql';
109
118
 
110
- // Apply migrations
111
- await up(db);
119
+ // Apply migrations with the correct dialect
120
+ await up(db, { dialect: 'postgres' });
112
121
 
113
122
  // Rollback migrations
114
- await down(db);
123
+ await down(db, { dialect: 'postgres' });
115
124
  ```
116
125
 
126
+ ## Database Setup
127
+
128
+ ### PostgreSQL
129
+
130
+ Connection string example:
131
+
132
+ ```bash
133
+ postgresql://user:password@localhost:5432/fortressauth
134
+ ```
135
+
136
+ Required permissions for the database user:
137
+
138
+ - CREATE, ALTER, DROP tables
139
+ - CREATE, DROP indexes
140
+ - SELECT, INSERT, UPDATE, DELETE
141
+
142
+ ### MySQL
143
+
144
+ Connection string example:
145
+
146
+ ```bash
147
+ mysql://user:password@localhost:3306/fortressauth
148
+ ```
149
+
150
+ Required permissions for the database user:
151
+
152
+ - CREATE, ALTER, DROP tables
153
+ - CREATE, DROP indexes
154
+ - SELECT, INSERT, UPDATE, DELETE
155
+
156
+ MySQL migrations use `TINYINT` for boolean fields and `DATETIME` for timestamps.
157
+
117
158
  ## Transactions
118
159
 
119
160
  ```typescript
package/dist/adapter.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { Account, type AuthRepository, type LoginAttempt, type Result, Session, User } from '@fortressauth/core';
1
+ import { Account, type AuthRepository, EmailVerificationToken, type LoginAttempt, OAuthState, PasswordResetToken, type Result, Session, User } from '@fortressauth/core';
2
2
  import type { Kysely } from 'kysely';
3
3
  import type { Database } from './schema.js';
4
4
  export type DatabaseDialect = 'sqlite' | 'postgres' | 'mysql';
@@ -22,10 +22,21 @@ export declare class SqlAdapter implements AuthRepository {
22
22
  findAccountByProvider(providerId: string, providerUserId: string): Promise<Account | null>;
23
23
  findEmailAccountByUserId(userId: string): Promise<Account | null>;
24
24
  createAccount(account: Account): Promise<void>;
25
- findSessionByTokenHash(tokenHash: string): Promise<Session | null>;
25
+ updateEmailAccountPassword(userId: string, passwordHash: string): Promise<void>;
26
+ findSessionBySelector(selector: string): Promise<Session | null>;
26
27
  createSession(session: Session): Promise<void>;
27
28
  deleteSession(sessionId: string): Promise<void>;
28
29
  deleteSessionsByUserId(userId: string): Promise<void>;
30
+ createEmailVerificationToken(token: EmailVerificationToken): Promise<void>;
31
+ findEmailVerificationBySelector(selector: string): Promise<EmailVerificationToken | null>;
32
+ deleteEmailVerification(id: string): Promise<void>;
33
+ createPasswordResetToken(token: PasswordResetToken): Promise<void>;
34
+ findPasswordResetBySelector(selector: string): Promise<PasswordResetToken | null>;
35
+ findPasswordResetsByUserId(userId: string): Promise<PasswordResetToken[]>;
36
+ deletePasswordReset(id: string): Promise<void>;
37
+ createOAuthState(state: OAuthState): Promise<void>;
38
+ findOAuthStateByState(state: string): Promise<OAuthState | null>;
39
+ deleteOAuthState(id: string): Promise<void>;
29
40
  recordLoginAttempt(attempt: LoginAttempt): Promise<void>;
30
41
  countRecentFailedAttempts(email: string, windowMs: number): Promise<number>;
31
42
  transaction<T>(fn: (repo: AuthRepository) => Promise<T>): Promise<T>;
@@ -1 +1 @@
1
- {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EACP,KAAK,cAAc,EAEnB,KAAK,YAAY,EAEjB,KAAK,MAAM,EACX,OAAO,EACP,IAAI,EACL,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACrC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,UAAU,GAAG,OAAO,CAAC;AAE9D,MAAM,WAAW,iBAAiB;IAChC,uEAAuE;IACvE,OAAO,CAAC,EAAE,eAAe,CAAC;CAC3B;AAED,qBAAa,UAAW,YAAW,cAAc;IAI7C,OAAO,CAAC,QAAQ,CAAC,EAAE;IAHrB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkB;gBAGvB,EAAE,EAAE,MAAM,CAAC,QAAQ,CAAC,EACrC,OAAO,GAAE,iBAAsB;IAKjC,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,gBAAgB;IAIxB,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,aAAa;IAIf,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAqBpD,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAqB9C,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IA6B7D,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAarC,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAsB1F,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAsBjE,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAc9C,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAsBlE,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAe9C,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/C,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrD,kBAAkB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAcxD,yBAAyB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAgB3E,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;CAQ3E"}
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"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"}
package/dist/adapter.js CHANGED
@@ -1,4 +1,30 @@
1
- import { Account, err, ok, Session, User, } from '@fortressauth/core';
1
+ import { Account, EmailVerificationToken, err, OAuthState, ok, PasswordResetToken, Session, User, } from '@fortressauth/core';
2
+ /**
3
+ * Checks if an error is a duplicate key/unique constraint violation.
4
+ * Handles SQLite, PostgreSQL, and MySQL error formats.
5
+ */
6
+ function isDuplicateKeyError(error) {
7
+ if (!(error instanceof Error)) {
8
+ return false;
9
+ }
10
+ // Check error codes for different database drivers
11
+ const errorWithCode = error;
12
+ // SQLite: SQLITE_CONSTRAINT
13
+ // PostgreSQL: 23505 (unique_violation)
14
+ // MySQL: ER_DUP_ENTRY
15
+ if (errorWithCode.code === 'SQLITE_CONSTRAINT' ||
16
+ errorWithCode.code === '23505' ||
17
+ errorWithCode.code === 'ER_DUP_ENTRY') {
18
+ return true;
19
+ }
20
+ // MySQL errno 1062 = Duplicate entry
21
+ if (errorWithCode.errno === 1062) {
22
+ return true;
23
+ }
24
+ // Fallback: check error message patterns
25
+ const message = error.message ?? '';
26
+ return (message.includes('UNIQUE constraint failed') || /duplicate key|duplicate entry/i.test(message));
27
+ }
2
28
  export class SqlAdapter {
3
29
  db;
4
30
  dialect;
@@ -73,12 +99,7 @@ export class SqlAdapter {
73
99
  return ok(undefined);
74
100
  }
75
101
  catch (error) {
76
- // Check for unique constraint violation across different database drivers
77
- const isUniqueViolation = error instanceof Error &&
78
- (('code' in error && (error.code === 'SQLITE_CONSTRAINT' || error.code === '23505')) ||
79
- error.message?.includes('UNIQUE constraint failed') ||
80
- error.message?.includes('duplicate key'));
81
- if (isUniqueViolation) {
102
+ if (isDuplicateKeyError(error)) {
82
103
  return err('EMAIL_EXISTS');
83
104
  }
84
105
  throw error;
@@ -147,11 +168,19 @@ export class SqlAdapter {
147
168
  })
148
169
  .execute();
149
170
  }
150
- async findSessionByTokenHash(tokenHash) {
171
+ async updateEmailAccountPassword(userId, passwordHash) {
172
+ await this.db
173
+ .updateTable('accounts')
174
+ .set({ password_hash: passwordHash })
175
+ .where('user_id', '=', userId)
176
+ .where('provider_id', '=', 'email')
177
+ .execute();
178
+ }
179
+ async findSessionBySelector(selector) {
151
180
  const row = await this.db
152
181
  .selectFrom('sessions')
153
182
  .selectAll()
154
- .where('token_hash', '=', tokenHash)
183
+ .where('selector', '=', selector)
155
184
  .executeTakeFirst();
156
185
  if (!row) {
157
186
  return null;
@@ -159,7 +188,8 @@ export class SqlAdapter {
159
188
  return Session.rehydrate({
160
189
  id: row.id,
161
190
  userId: row.user_id,
162
- tokenHash: row.token_hash,
191
+ selector: row.selector,
192
+ verifierHash: row.verifier_hash,
163
193
  expiresAt: this.parseDate(row.expires_at),
164
194
  ipAddress: row.ip_address,
165
195
  userAgent: row.user_agent,
@@ -172,7 +202,8 @@ export class SqlAdapter {
172
202
  .values({
173
203
  id: session.id,
174
204
  user_id: session.userId,
175
- token_hash: session.tokenHash,
205
+ selector: session.selector,
206
+ verifier_hash: session.verifierHash,
176
207
  expires_at: this.serializeDate(session.expiresAt),
177
208
  ip_address: session.ipAddress,
178
209
  user_agent: session.userAgent,
@@ -186,6 +217,126 @@ export class SqlAdapter {
186
217
  async deleteSessionsByUserId(userId) {
187
218
  await this.db.deleteFrom('sessions').where('user_id', '=', userId).execute();
188
219
  }
220
+ async createEmailVerificationToken(token) {
221
+ await this.db
222
+ .insertInto('email_verifications')
223
+ .values({
224
+ id: token.id,
225
+ user_id: token.userId,
226
+ selector: token.selector,
227
+ verifier_hash: token.verifierHash,
228
+ expires_at: this.serializeDate(token.expiresAt),
229
+ created_at: this.serializeDate(token.createdAt),
230
+ })
231
+ .execute();
232
+ }
233
+ async findEmailVerificationBySelector(selector) {
234
+ const row = await this.db
235
+ .selectFrom('email_verifications')
236
+ .selectAll()
237
+ .where('selector', '=', selector)
238
+ .executeTakeFirst();
239
+ if (!row) {
240
+ return null;
241
+ }
242
+ return EmailVerificationToken.rehydrate({
243
+ id: row.id,
244
+ userId: row.user_id,
245
+ selector: row.selector,
246
+ verifierHash: row.verifier_hash,
247
+ expiresAt: this.parseDate(row.expires_at),
248
+ createdAt: this.parseDate(row.created_at),
249
+ });
250
+ }
251
+ async deleteEmailVerification(id) {
252
+ await this.db.deleteFrom('email_verifications').where('id', '=', id).execute();
253
+ }
254
+ async createPasswordResetToken(token) {
255
+ await this.db
256
+ .insertInto('password_resets')
257
+ .values({
258
+ id: token.id,
259
+ user_id: token.userId,
260
+ selector: token.selector,
261
+ verifier_hash: token.verifierHash,
262
+ expires_at: this.serializeDate(token.expiresAt),
263
+ created_at: this.serializeDate(token.createdAt),
264
+ })
265
+ .execute();
266
+ }
267
+ async findPasswordResetBySelector(selector) {
268
+ const row = await this.db
269
+ .selectFrom('password_resets')
270
+ .selectAll()
271
+ .where('selector', '=', selector)
272
+ .executeTakeFirst();
273
+ if (!row) {
274
+ return null;
275
+ }
276
+ return PasswordResetToken.rehydrate({
277
+ id: row.id,
278
+ userId: row.user_id,
279
+ selector: row.selector,
280
+ verifierHash: row.verifier_hash,
281
+ expiresAt: this.parseDate(row.expires_at),
282
+ createdAt: this.parseDate(row.created_at),
283
+ });
284
+ }
285
+ async findPasswordResetsByUserId(userId) {
286
+ const rows = await this.db
287
+ .selectFrom('password_resets')
288
+ .selectAll()
289
+ .where('user_id', '=', userId)
290
+ .orderBy('created_at', 'asc')
291
+ .execute();
292
+ return rows.map((row) => PasswordResetToken.rehydrate({
293
+ id: row.id,
294
+ userId: row.user_id,
295
+ selector: row.selector,
296
+ verifierHash: row.verifier_hash,
297
+ expiresAt: this.parseDate(row.expires_at),
298
+ createdAt: this.parseDate(row.created_at),
299
+ }));
300
+ }
301
+ async deletePasswordReset(id) {
302
+ await this.db.deleteFrom('password_resets').where('id', '=', id).execute();
303
+ }
304
+ async createOAuthState(state) {
305
+ await this.db
306
+ .insertInto('oauth_states')
307
+ .values({
308
+ id: state.id,
309
+ provider_id: state.providerId,
310
+ state: state.state,
311
+ code_verifier: state.codeVerifier,
312
+ redirect_uri: state.redirectUri,
313
+ expires_at: this.serializeDate(state.expiresAt),
314
+ created_at: this.serializeDate(state.createdAt),
315
+ })
316
+ .execute();
317
+ }
318
+ async findOAuthStateByState(state) {
319
+ const row = await this.db
320
+ .selectFrom('oauth_states')
321
+ .selectAll()
322
+ .where('state', '=', state)
323
+ .executeTakeFirst();
324
+ if (!row) {
325
+ return null;
326
+ }
327
+ return OAuthState.rehydrate({
328
+ id: row.id,
329
+ providerId: row.provider_id,
330
+ state: row.state,
331
+ codeVerifier: row.code_verifier,
332
+ redirectUri: row.redirect_uri,
333
+ expiresAt: this.parseDate(row.expires_at),
334
+ createdAt: this.parseDate(row.created_at),
335
+ });
336
+ }
337
+ async deleteOAuthState(id) {
338
+ await this.db.deleteFrom('oauth_states').where('id', '=', id).execute();
339
+ }
189
340
  async recordLoginAttempt(attempt) {
190
341
  await this.db
191
342
  .insertInto('login_attempts')
@@ -1 +1 @@
1
- {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,5 +1,8 @@
1
1
  export type { DatabaseDialect, SqlAdapterOptions } from './adapter.js';
2
2
  export { SqlAdapter } from './adapter.js';
3
- export { down, up } from './migrations/001_initial.js';
3
+ export type { MigrationDialect, MigrationOptions } from './migrations/index.js';
4
+ export { down, up } from './migrations/index.js';
5
+ export { down as downMysql, up as upMysql } from './migrations/mysql.js';
6
+ export { down as downPostgres, up as upPostgres } from './migrations/postgres.js';
4
7
  export type { Database } from './schema.js';
5
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,6BAA6B,CAAC;AACvD,YAAY,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAChF,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,IAAI,IAAI,SAAS,EAAE,EAAE,IAAI,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACzE,OAAO,EAAE,IAAI,IAAI,YAAY,EAAE,EAAE,IAAI,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAClF,YAAY,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC"}
package/dist/index.js CHANGED
@@ -1,3 +1,5 @@
1
1
  export { SqlAdapter } from './adapter.js';
2
- export { down, up } from './migrations/001_initial.js';
2
+ export { down, up } from './migrations/index.js';
3
+ export { down as downMysql, up as upMysql } from './migrations/mysql.js';
4
+ export { down as downPostgres, up as upPostgres } from './migrations/postgres.js';
3
5
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,6BAA6B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,IAAI,IAAI,SAAS,EAAE,EAAE,IAAI,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACzE,OAAO,EAAE,IAAI,IAAI,YAAY,EAAE,EAAE,IAAI,UAAU,EAAE,MAAM,0BAA0B,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import type { Kysely } from 'kysely';
2
- export declare function up<T>(db: Kysely<T>): Promise<void>;
3
- export declare function down<T>(db: Kysely<T>): Promise<void>;
2
+ import { type MigrationColumnTypes } from './types.js';
3
+ export declare function up<T>(db: Kysely<T>, columnTypes?: MigrationColumnTypes): Promise<void>;
4
+ export declare function down<T>(db: Kysely<T>, _columnTypes?: MigrationColumnTypes): Promise<void>;
4
5
  //# sourceMappingURL=001_initial.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"001_initial.d.ts","sourceRoot":"","sources":["../../src/migrations/001_initial.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAGrC,wBAAsB,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CA8DxD;AAED,wBAAsB,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAK1D"}
1
+ {"version":3,"file":"001_initial.d.ts","sourceRoot":"","sources":["../../src/migrations/001_initial.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAErC,OAAO,EAAE,KAAK,oBAAoB,EAAuB,MAAM,YAAY,CAAC;AAG5E,wBAAsB,EAAE,CAAC,CAAC,EACxB,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,EACb,WAAW,GAAE,oBAA0C,GACtD,OAAO,CAAC,IAAI,CAAC,CAkGf;AAED,wBAAsB,IAAI,CAAC,CAAC,EAC1B,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,EACb,YAAY,GAAE,oBAA0C,GACvD,OAAO,CAAC,IAAI,CAAC,CAKf"}
@@ -1,62 +1,80 @@
1
+ import { safeExecute } from './index.js';
2
+ import { SQLITE_COLUMN_TYPES } from './types.js';
1
3
  // Generic type parameter allows any database schema since migrations only use schema builder
2
- export async function up(db) {
3
- await db.schema
4
+ export async function up(db, columnTypes = SQLITE_COLUMN_TYPES) {
5
+ await safeExecute(db.schema
4
6
  .createTable('users')
7
+ .ifNotExists()
5
8
  .addColumn('id', 'text', (col) => col.primaryKey())
6
9
  .addColumn('email', 'text', (col) => col.notNull().unique())
7
- .addColumn('email_verified', 'boolean', (col) => col.notNull().defaultTo(false))
8
- .addColumn('created_at', 'timestamp', (col) => col.notNull())
9
- .addColumn('updated_at', 'timestamp', (col) => col.notNull())
10
- .addColumn('locked_until', 'timestamp')
11
- .execute();
10
+ .addColumn('email_verified', columnTypes.boolean, (col) => col.notNull().defaultTo(false))
11
+ .addColumn('created_at', columnTypes.timestamp, (col) => col.notNull())
12
+ .addColumn('updated_at', columnTypes.timestamp, (col) => col.notNull())
13
+ .addColumn('locked_until', columnTypes.timestamp)
14
+ .execute());
12
15
  // Note: email already has a unique constraint which creates an implicit index
13
- await db.schema
16
+ await safeExecute(db.schema
14
17
  .createTable('accounts')
18
+ .ifNotExists()
15
19
  .addColumn('id', 'text', (col) => col.primaryKey())
16
20
  .addColumn('user_id', 'text', (col) => col.notNull().references('users.id').onDelete('cascade'))
17
21
  .addColumn('provider_id', 'text', (col) => col.notNull())
18
22
  .addColumn('provider_user_id', 'text', (col) => col.notNull())
19
23
  .addColumn('password_hash', 'text')
20
- .addColumn('created_at', 'timestamp', (col) => col.notNull())
21
- .execute();
22
- await db.schema
24
+ .addColumn('created_at', columnTypes.timestamp, (col) => col.notNull())
25
+ .execute());
26
+ await safeExecute(db.schema
23
27
  .createIndex('accounts_provider_idx')
28
+ .ifNotExists()
24
29
  .on('accounts')
25
30
  .columns(['provider_id', 'provider_user_id'])
26
31
  .unique()
27
- .execute();
28
- await db.schema.createIndex('accounts_user_id_idx').on('accounts').column('user_id').execute();
29
- await db.schema
32
+ .execute());
33
+ await safeExecute(db.schema
34
+ .createIndex('accounts_user_id_idx')
35
+ .ifNotExists()
36
+ .on('accounts')
37
+ .column('user_id')
38
+ .execute());
39
+ await safeExecute(db.schema
30
40
  .createTable('sessions')
41
+ .ifNotExists()
31
42
  .addColumn('id', 'text', (col) => col.primaryKey())
32
43
  .addColumn('user_id', 'text', (col) => col.notNull().references('users.id').onDelete('cascade'))
33
44
  .addColumn('token_hash', 'text', (col) => col.notNull().unique())
34
- .addColumn('expires_at', 'timestamp', (col) => col.notNull())
45
+ .addColumn('expires_at', columnTypes.timestamp, (col) => col.notNull())
35
46
  .addColumn('ip_address', 'text')
36
47
  .addColumn('user_agent', 'text')
37
- .addColumn('created_at', 'timestamp', (col) => col.notNull())
38
- .execute();
48
+ .addColumn('created_at', columnTypes.timestamp, (col) => col.notNull())
49
+ .execute());
39
50
  // Note: token_hash already has a unique constraint which creates an implicit index
40
- await db.schema.createIndex('sessions_user_id_idx').on('sessions').column('user_id').execute();
41
- await db.schema
51
+ await safeExecute(db.schema
52
+ .createIndex('sessions_user_id_idx')
53
+ .ifNotExists()
54
+ .on('sessions')
55
+ .column('user_id')
56
+ .execute());
57
+ await safeExecute(db.schema
42
58
  .createTable('login_attempts')
59
+ .ifNotExists()
43
60
  .addColumn('id', 'text', (col) => col.primaryKey())
44
61
  .addColumn('user_id', 'text', (col) => col.references('users.id').onDelete('set null'))
45
62
  .addColumn('email', 'text', (col) => col.notNull())
46
63
  .addColumn('ip_address', 'text', (col) => col.notNull())
47
- .addColumn('success', 'boolean', (col) => col.notNull())
48
- .addColumn('created_at', 'timestamp', (col) => col.notNull())
49
- .execute();
50
- await db.schema
64
+ .addColumn('success', columnTypes.boolean, (col) => col.notNull())
65
+ .addColumn('created_at', columnTypes.timestamp, (col) => col.notNull())
66
+ .execute());
67
+ await safeExecute(db.schema
51
68
  .createIndex('login_attempts_email_created_idx')
69
+ .ifNotExists()
52
70
  .on('login_attempts')
53
71
  .columns(['email', 'created_at'])
54
- .execute();
72
+ .execute());
55
73
  }
56
- export async function down(db) {
57
- await db.schema.dropTable('login_attempts').execute();
58
- await db.schema.dropTable('sessions').execute();
59
- await db.schema.dropTable('accounts').execute();
60
- await db.schema.dropTable('users').execute();
74
+ export async function down(db, _columnTypes = SQLITE_COLUMN_TYPES) {
75
+ await db.schema.dropTable('login_attempts').ifExists().execute();
76
+ await db.schema.dropTable('sessions').ifExists().execute();
77
+ await db.schema.dropTable('accounts').ifExists().execute();
78
+ await db.schema.dropTable('users').ifExists().execute();
61
79
  }
62
80
  //# sourceMappingURL=001_initial.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"001_initial.js","sourceRoot":"","sources":["../../src/migrations/001_initial.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"001_initial.js","sourceRoot":"","sources":["../../src/migrations/001_initial.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { Kysely } from 'kysely';
2
+ import { type MigrationColumnTypes } from './types.js';
3
+ export declare function up<T>(db: Kysely<T>, columnTypes?: MigrationColumnTypes): Promise<void>;
4
+ export declare function down<T>(db: Kysely<T>, _columnTypes?: MigrationColumnTypes): Promise<void>;
5
+ //# sourceMappingURL=002_email_verification.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"002_email_verification.d.ts","sourceRoot":"","sources":["../../src/migrations/002_email_verification.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAErC,OAAO,EAAE,KAAK,oBAAoB,EAAuB,MAAM,YAAY,CAAC;AAE5E,wBAAsB,EAAE,CAAC,CAAC,EACxB,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,EACb,WAAW,GAAE,oBAA0C,GACtD,OAAO,CAAC,IAAI,CAAC,CAgCf;AAED,wBAAsB,IAAI,CAAC,CAAC,EAC1B,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,EACb,YAAY,GAAE,oBAA0C,GACvD,OAAO,CAAC,IAAI,CAAC,CAEf"}
@@ -0,0 +1,31 @@
1
+ import { safeExecute } from './index.js';
2
+ import { SQLITE_COLUMN_TYPES } from './types.js';
3
+ export async function up(db, columnTypes = SQLITE_COLUMN_TYPES) {
4
+ await safeExecute(db.schema
5
+ .createTable('email_verifications')
6
+ .ifNotExists()
7
+ .addColumn('id', 'text', (col) => col.primaryKey())
8
+ .addColumn('user_id', 'text', (col) => col.references('users.id').onDelete('cascade'))
9
+ .addColumn('selector', 'text', (col) => col.notNull())
10
+ .addColumn('verifier_hash', 'text', (col) => col.notNull())
11
+ .addColumn('expires_at', columnTypes.timestamp, (col) => col.notNull())
12
+ .addColumn('created_at', columnTypes.timestamp, (col) => col.notNull())
13
+ .execute());
14
+ await safeExecute(db.schema
15
+ .createIndex('email_verifications_selector_idx')
16
+ .ifNotExists()
17
+ .on('email_verifications')
18
+ .column('selector')
19
+ .unique()
20
+ .execute());
21
+ await safeExecute(db.schema
22
+ .createIndex('email_verifications_user_id_idx')
23
+ .ifNotExists()
24
+ .on('email_verifications')
25
+ .column('user_id')
26
+ .execute());
27
+ }
28
+ export async function down(db, _columnTypes = SQLITE_COLUMN_TYPES) {
29
+ await db.schema.dropTable('email_verifications').ifExists().execute();
30
+ }
31
+ //# sourceMappingURL=002_email_verification.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"002_email_verification.js","sourceRoot":"","sources":["../../src/migrations/002_email_verification.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAA6B,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAE5E,MAAM,CAAC,KAAK,UAAU,EAAE,CACtB,EAAa,EACb,cAAoC,mBAAmB;IAEvD,MAAM,WAAW,CACf,EAAE,CAAC,MAAM;SACN,WAAW,CAAC,qBAAqB,CAAC;SAClC,WAAW,EAAE;SACb,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC;SAClD,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;SACrF,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;SACrD,SAAS,CAAC,eAAe,EAAE,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;SAC1D,SAAS,CAAC,YAAY,EAAE,WAAW,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;SACtE,SAAS,CAAC,YAAY,EAAE,WAAW,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;SACtE,OAAO,EAAE,CACb,CAAC;IAEF,MAAM,WAAW,CACf,EAAE,CAAC,MAAM;SACN,WAAW,CAAC,kCAAkC,CAAC;SAC/C,WAAW,EAAE;SACb,EAAE,CAAC,qBAAqB,CAAC;SACzB,MAAM,CAAC,UAAU,CAAC;SAClB,MAAM,EAAE;SACR,OAAO,EAAE,CACb,CAAC;IAEF,MAAM,WAAW,CACf,EAAE,CAAC,MAAM;SACN,WAAW,CAAC,iCAAiC,CAAC;SAC9C,WAAW,EAAE;SACb,EAAE,CAAC,qBAAqB,CAAC;SACzB,MAAM,CAAC,SAAS,CAAC;SACjB,OAAO,EAAE,CACb,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,IAAI,CACxB,EAAa,EACb,eAAqC,mBAAmB;IAExD,MAAM,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,CAAC;AACxE,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { Kysely } from 'kysely';
2
+ import { type MigrationColumnTypes } from './types.js';
3
+ export declare function up<T>(db: Kysely<T>, columnTypes?: MigrationColumnTypes): Promise<void>;
4
+ export declare function down<T>(db: Kysely<T>, _columnTypes?: MigrationColumnTypes): Promise<void>;
5
+ //# sourceMappingURL=003_password_resets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"003_password_resets.d.ts","sourceRoot":"","sources":["../../src/migrations/003_password_resets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAErC,OAAO,EAAE,KAAK,oBAAoB,EAAuB,MAAM,YAAY,CAAC;AAE5E,wBAAsB,EAAE,CAAC,CAAC,EACxB,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,EACb,WAAW,GAAE,oBAA0C,GACtD,OAAO,CAAC,IAAI,CAAC,CAgCf;AAED,wBAAsB,IAAI,CAAC,CAAC,EAC1B,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,EACb,YAAY,GAAE,oBAA0C,GACvD,OAAO,CAAC,IAAI,CAAC,CAEf"}
@@ -0,0 +1,31 @@
1
+ import { safeExecute } from './index.js';
2
+ import { SQLITE_COLUMN_TYPES } from './types.js';
3
+ export async function up(db, columnTypes = SQLITE_COLUMN_TYPES) {
4
+ await safeExecute(db.schema
5
+ .createTable('password_resets')
6
+ .ifNotExists()
7
+ .addColumn('id', 'text', (col) => col.primaryKey())
8
+ .addColumn('user_id', 'text', (col) => col.references('users.id').onDelete('cascade'))
9
+ .addColumn('selector', 'text', (col) => col.notNull())
10
+ .addColumn('verifier_hash', 'text', (col) => col.notNull())
11
+ .addColumn('expires_at', columnTypes.timestamp, (col) => col.notNull())
12
+ .addColumn('created_at', columnTypes.timestamp, (col) => col.notNull())
13
+ .execute());
14
+ await safeExecute(db.schema
15
+ .createIndex('password_resets_selector_idx')
16
+ .ifNotExists()
17
+ .on('password_resets')
18
+ .column('selector')
19
+ .unique()
20
+ .execute());
21
+ await safeExecute(db.schema
22
+ .createIndex('password_resets_user_id_idx')
23
+ .ifNotExists()
24
+ .on('password_resets')
25
+ .column('user_id')
26
+ .execute());
27
+ }
28
+ export async function down(db, _columnTypes = SQLITE_COLUMN_TYPES) {
29
+ await db.schema.dropTable('password_resets').ifExists().execute();
30
+ }
31
+ //# sourceMappingURL=003_password_resets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"003_password_resets.js","sourceRoot":"","sources":["../../src/migrations/003_password_resets.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAA6B,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAE5E,MAAM,CAAC,KAAK,UAAU,EAAE,CACtB,EAAa,EACb,cAAoC,mBAAmB;IAEvD,MAAM,WAAW,CACf,EAAE,CAAC,MAAM;SACN,WAAW,CAAC,iBAAiB,CAAC;SAC9B,WAAW,EAAE;SACb,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC;SAClD,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;SACrF,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;SACrD,SAAS,CAAC,eAAe,EAAE,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;SAC1D,SAAS,CAAC,YAAY,EAAE,WAAW,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;SACtE,SAAS,CAAC,YAAY,EAAE,WAAW,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;SACtE,OAAO,EAAE,CACb,CAAC;IAEF,MAAM,WAAW,CACf,EAAE,CAAC,MAAM;SACN,WAAW,CAAC,8BAA8B,CAAC;SAC3C,WAAW,EAAE;SACb,EAAE,CAAC,iBAAiB,CAAC;SACrB,MAAM,CAAC,UAAU,CAAC;SAClB,MAAM,EAAE;SACR,OAAO,EAAE,CACb,CAAC;IAEF,MAAM,WAAW,CACf,EAAE,CAAC,MAAM;SACN,WAAW,CAAC,6BAA6B,CAAC;SAC1C,WAAW,EAAE;SACb,EAAE,CAAC,iBAAiB,CAAC;SACrB,MAAM,CAAC,SAAS,CAAC;SACjB,OAAO,EAAE,CACb,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,IAAI,CACxB,EAAa,EACb,eAAqC,mBAAmB;IAExD,MAAM,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,CAAC;AACpE,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { Kysely } from 'kysely';
2
+ import { type MigrationColumnTypes } from './types.js';
3
+ export declare function up<T>(db: Kysely<T>, columnTypes?: MigrationColumnTypes): Promise<void>;
4
+ export declare function down<T>(db: Kysely<T>, columnTypes?: MigrationColumnTypes): Promise<void>;
5
+ //# sourceMappingURL=004_session_split_token.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"004_session_split_token.d.ts","sourceRoot":"","sources":["../../src/migrations/004_session_split_token.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAErC,OAAO,EAAE,KAAK,oBAAoB,EAAuB,MAAM,YAAY,CAAC;AAE5E,wBAAsB,EAAE,CAAC,CAAC,EACxB,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,EACb,WAAW,GAAE,oBAA0C,GACtD,OAAO,CAAC,IAAI,CAAC,CA6Bf;AAED,wBAAsB,IAAI,CAAC,CAAC,EAC1B,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,EACb,WAAW,GAAE,oBAA0C,GACtD,OAAO,CAAC,IAAI,CAAC,CAsBf"}
@@ -0,0 +1,46 @@
1
+ import { safeExecute } from './index.js';
2
+ import { SQLITE_COLUMN_TYPES } from './types.js';
3
+ export async function up(db, columnTypes = SQLITE_COLUMN_TYPES) {
4
+ // Drop old sessions table if it exists to ensure schema matches split-token design
5
+ await db.schema.dropTable('sessions').ifExists().execute();
6
+ await safeExecute(db.schema
7
+ .createTable('sessions')
8
+ .ifNotExists()
9
+ .addColumn('id', 'text', (col) => col.primaryKey())
10
+ .addColumn('user_id', 'text', (col) => col.notNull().references('users.id').onDelete('cascade'))
11
+ .addColumn('selector', 'text', (col) => col.notNull().unique())
12
+ .addColumn('verifier_hash', 'text', (col) => col.notNull())
13
+ .addColumn('expires_at', columnTypes.timestamp, (col) => col.notNull())
14
+ .addColumn('ip_address', 'text')
15
+ .addColumn('user_agent', 'text')
16
+ .addColumn('created_at', columnTypes.timestamp, (col) => col.notNull())
17
+ .execute());
18
+ await safeExecute(db.schema
19
+ .createIndex('sessions_user_id_idx')
20
+ .ifNotExists()
21
+ .on('sessions')
22
+ .column('user_id')
23
+ .execute());
24
+ }
25
+ export async function down(db, columnTypes = SQLITE_COLUMN_TYPES) {
26
+ await db.schema.dropTable('sessions').ifExists().execute();
27
+ // Recreate legacy sessions table with token_hash
28
+ await db.schema
29
+ .createTable('sessions')
30
+ .ifNotExists()
31
+ .addColumn('id', 'text', (col) => col.primaryKey())
32
+ .addColumn('user_id', 'text', (col) => col.notNull().references('users.id').onDelete('cascade'))
33
+ .addColumn('token_hash', 'text', (col) => col.notNull().unique())
34
+ .addColumn('expires_at', columnTypes.timestamp, (col) => col.notNull())
35
+ .addColumn('ip_address', 'text')
36
+ .addColumn('user_agent', 'text')
37
+ .addColumn('created_at', columnTypes.timestamp, (col) => col.notNull())
38
+ .execute();
39
+ await db.schema
40
+ .createIndex('sessions_user_id_idx')
41
+ .ifNotExists()
42
+ .on('sessions')
43
+ .column('user_id')
44
+ .execute();
45
+ }
46
+ //# sourceMappingURL=004_session_split_token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"004_session_split_token.js","sourceRoot":"","sources":["../../src/migrations/004_session_split_token.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { Kysely } from 'kysely';
2
+ import type { MigrationColumnTypes } from './types.js';
3
+ export declare function up<T>(db: Kysely<T>, columnTypes?: MigrationColumnTypes): Promise<void>;
4
+ export declare function down<T>(db: Kysely<T>, _columnTypes?: MigrationColumnTypes): Promise<void>;
5
+ //# sourceMappingURL=005_oauth_support.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"005_oauth_support.d.ts","sourceRoot":"","sources":["../../src/migrations/005_oauth_support.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAErC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAGvD,wBAAsB,EAAE,CAAC,CAAC,EACxB,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,EACb,WAAW,GAAE,oBAA0C,GACtD,OAAO,CAAC,IAAI,CAAC,CAyBf;AAED,wBAAsB,IAAI,CAAC,CAAC,EAC1B,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,EACb,YAAY,GAAE,oBAA0C,GACvD,OAAO,CAAC,IAAI,CAAC,CAEf"}
@@ -0,0 +1,27 @@
1
+ import { safeExecute } from './index.js';
2
+ import { SQLITE_COLUMN_TYPES } from './types.js';
3
+ export async function up(db, columnTypes = SQLITE_COLUMN_TYPES) {
4
+ // Add oauth_states table
5
+ await safeExecute(db.schema
6
+ .createTable('oauth_states')
7
+ .ifNotExists()
8
+ .addColumn('id', 'text', (col) => col.primaryKey())
9
+ .addColumn('provider_id', 'text', (col) => col.notNull())
10
+ .addColumn('state', 'text', (col) => col.notNull())
11
+ .addColumn('code_verifier', 'text')
12
+ .addColumn('redirect_uri', 'text')
13
+ .addColumn('expires_at', columnTypes.timestamp, (col) => col.notNull())
14
+ .addColumn('created_at', columnTypes.timestamp, (col) => col.notNull())
15
+ .execute());
16
+ await safeExecute(db.schema
17
+ .createIndex('oauth_states_state_idx')
18
+ .ifNotExists()
19
+ .on('oauth_states')
20
+ .column('state')
21
+ .unique()
22
+ .execute());
23
+ }
24
+ export async function down(db, _columnTypes = SQLITE_COLUMN_TYPES) {
25
+ await db.schema.dropTable('oauth_states').ifExists().execute();
26
+ }
27
+ //# sourceMappingURL=005_oauth_support.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"005_oauth_support.js","sourceRoot":"","sources":["../../src/migrations/005_oauth_support.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEjD,MAAM,CAAC,KAAK,UAAU,EAAE,CACtB,EAAa,EACb,cAAoC,mBAAmB;IAEvD,yBAAyB;IACzB,MAAM,WAAW,CACf,EAAE,CAAC,MAAM;SACN,WAAW,CAAC,cAAc,CAAC;SAC3B,WAAW,EAAE;SACb,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC;SAClD,SAAS,CAAC,aAAa,EAAE,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;SACxD,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;SAClD,SAAS,CAAC,eAAe,EAAE,MAAM,CAAC;SAClC,SAAS,CAAC,cAAc,EAAE,MAAM,CAAC;SACjC,SAAS,CAAC,YAAY,EAAE,WAAW,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;SACtE,SAAS,CAAC,YAAY,EAAE,WAAW,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;SACtE,OAAO,EAAE,CACb,CAAC;IAEF,MAAM,WAAW,CACf,EAAE,CAAC,MAAM;SACN,WAAW,CAAC,wBAAwB,CAAC;SACrC,WAAW,EAAE;SACb,EAAE,CAAC,cAAc,CAAC;SAClB,MAAM,CAAC,OAAO,CAAC;SACf,MAAM,EAAE;SACR,OAAO,EAAE,CACb,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,IAAI,CACxB,EAAa,EACb,eAAqC,mBAAmB;IAExD,MAAM,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,CAAC;AACjE,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { Kysely } from 'kysely';
2
+ export type MigrationDialect = 'sqlite' | 'postgres' | 'mysql';
3
+ export interface MigrationOptions {
4
+ dialect?: MigrationDialect;
5
+ }
6
+ export declare function safeExecute(promise: Promise<unknown>): Promise<void>;
7
+ export declare function up<T>(db: Kysely<T>, options?: MigrationOptions): Promise<void>;
8
+ export declare function down<T>(db: Kysely<T>, options?: MigrationOptions): Promise<void>;
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/migrations/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAarC,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG,UAAU,GAAG,OAAO,CAAC;AAE/D,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,EAAE,gBAAgB,CAAC;CAC5B;AAkBD,wBAAsB,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ1E;AAED,wBAAsB,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAOxF;AAED,wBAAsB,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAO1F"}
@@ -0,0 +1,47 @@
1
+ import { down as down001, up as up001 } from './001_initial.js';
2
+ import { down as down002, up as up002 } from './002_email_verification.js';
3
+ import { down as down003, up as up003 } from './003_password_resets.js';
4
+ import { down as down004, up as up004 } from './004_session_split_token.js';
5
+ import { down as down005, up as up005 } from './005_oauth_support.js';
6
+ import { MYSQL_COLUMN_TYPES, POSTGRES_COLUMN_TYPES, SQLITE_COLUMN_TYPES, } from './types.js';
7
+ function isAlreadyExistsError(error) {
8
+ return error instanceof Error && /already exists|duplicate key name/i.test(error.message);
9
+ }
10
+ function resolveColumnTypes(options) {
11
+ const dialect = options?.dialect ?? 'sqlite';
12
+ switch (dialect) {
13
+ case 'postgres':
14
+ return POSTGRES_COLUMN_TYPES;
15
+ case 'mysql':
16
+ return MYSQL_COLUMN_TYPES;
17
+ default:
18
+ return SQLITE_COLUMN_TYPES;
19
+ }
20
+ }
21
+ export async function safeExecute(promise) {
22
+ try {
23
+ await promise;
24
+ }
25
+ catch (error) {
26
+ if (!isAlreadyExistsError(error)) {
27
+ throw error;
28
+ }
29
+ }
30
+ }
31
+ export async function up(db, options = {}) {
32
+ const columnTypes = resolveColumnTypes(options);
33
+ await up001(db, columnTypes);
34
+ await up002(db, columnTypes);
35
+ await up003(db, columnTypes);
36
+ await up004(db, columnTypes);
37
+ await up005(db, columnTypes);
38
+ }
39
+ export async function down(db, options = {}) {
40
+ const columnTypes = resolveColumnTypes(options);
41
+ await down005(db, columnTypes);
42
+ await down004(db, columnTypes);
43
+ await down003(db, columnTypes);
44
+ await down002(db, columnTypes);
45
+ await down001(db, columnTypes);
46
+ }
47
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/migrations/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,IAAI,OAAO,EAAE,EAAE,IAAI,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,EAAE,IAAI,IAAI,OAAO,EAAE,EAAE,IAAI,KAAK,EAAE,MAAM,6BAA6B,CAAC;AAC3E,OAAO,EAAE,IAAI,IAAI,OAAO,EAAE,EAAE,IAAI,KAAK,EAAE,MAAM,0BAA0B,CAAC;AACxE,OAAO,EAAE,IAAI,IAAI,OAAO,EAAE,EAAE,IAAI,KAAK,EAAE,MAAM,8BAA8B,CAAC;AAC5E,OAAO,EAAE,IAAI,IAAI,OAAO,EAAE,EAAE,IAAI,KAAK,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAEL,kBAAkB,EAClB,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,YAAY,CAAC;AAQpB,SAAS,oBAAoB,CAAC,KAAc;IAC1C,OAAO,KAAK,YAAY,KAAK,IAAI,oCAAoC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AAC5F,CAAC;AAED,SAAS,kBAAkB,CAAC,OAA0B;IACpD,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,QAAQ,CAAC;IAC7C,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,UAAU;YACb,OAAO,qBAAqB,CAAC;QAC/B,KAAK,OAAO;YACV,OAAO,kBAAkB,CAAC;QAC5B;YACE,OAAO,mBAAmB,CAAC;IAC/B,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAyB;IACzD,IAAI,CAAC;QACH,MAAM,OAAO,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,EAAE,CAAC;YACjC,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,EAAE,CAAI,EAAa,EAAE,UAA4B,EAAE;IACvE,MAAM,WAAW,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAChD,MAAM,KAAK,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;IAC7B,MAAM,KAAK,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;IAC7B,MAAM,KAAK,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;IAC7B,MAAM,KAAK,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;IAC7B,MAAM,KAAK,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,IAAI,CAAI,EAAa,EAAE,UAA4B,EAAE;IACzE,MAAM,WAAW,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAChD,MAAM,OAAO,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;IAC/B,MAAM,OAAO,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;IAC/B,MAAM,OAAO,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;IAC/B,MAAM,OAAO,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;IAC/B,MAAM,OAAO,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;AACjC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Kysely } from 'kysely';
2
+ export declare function up<T>(db: Kysely<T>): Promise<void>;
3
+ export declare function down<T>(db: Kysely<T>): Promise<void>;
4
+ //# sourceMappingURL=mysql.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mysql.d.ts","sourceRoot":"","sources":["../../src/migrations/mysql.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAGrC,wBAAsB,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAExD;AAED,wBAAsB,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAE1D"}
@@ -0,0 +1,8 @@
1
+ import { down as downBase, up as upBase } from './index.js';
2
+ export async function up(db) {
3
+ await upBase(db, { dialect: 'mysql' });
4
+ }
5
+ export async function down(db) {
6
+ await downBase(db, { dialect: 'mysql' });
7
+ }
8
+ //# sourceMappingURL=mysql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mysql.js","sourceRoot":"","sources":["../../src/migrations/mysql.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,IAAI,QAAQ,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,YAAY,CAAC;AAE5D,MAAM,CAAC,KAAK,UAAU,EAAE,CAAI,EAAa;IACvC,MAAM,MAAM,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,IAAI,CAAI,EAAa;IACzC,MAAM,QAAQ,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Kysely } from 'kysely';
2
+ export declare function up<T>(db: Kysely<T>): Promise<void>;
3
+ export declare function down<T>(db: Kysely<T>): Promise<void>;
4
+ //# sourceMappingURL=postgres.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres.d.ts","sourceRoot":"","sources":["../../src/migrations/postgres.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAGrC,wBAAsB,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAExD;AAED,wBAAsB,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAE1D"}
@@ -0,0 +1,8 @@
1
+ import { down as downBase, up as upBase } from './index.js';
2
+ export async function up(db) {
3
+ await upBase(db, { dialect: 'postgres' });
4
+ }
5
+ export async function down(db) {
6
+ await downBase(db, { dialect: 'postgres' });
7
+ }
8
+ //# sourceMappingURL=postgres.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres.js","sourceRoot":"","sources":["../../src/migrations/postgres.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,IAAI,QAAQ,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,YAAY,CAAC;AAE5D,MAAM,CAAC,KAAK,UAAU,EAAE,CAAI,EAAa;IACvC,MAAM,MAAM,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,IAAI,CAAI,EAAa;IACzC,MAAM,QAAQ,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;AAC9C,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { type ColumnDataType, type Expression } from 'kysely';
2
+ export type MigrationColumnTypes = {
3
+ boolean: ColumnDataType | Expression<unknown>;
4
+ timestamp: ColumnDataType | Expression<unknown>;
5
+ };
6
+ export declare const SQLITE_COLUMN_TYPES: MigrationColumnTypes;
7
+ export declare const POSTGRES_COLUMN_TYPES: MigrationColumnTypes;
8
+ export declare const MYSQL_COLUMN_TYPES: MigrationColumnTypes;
9
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/migrations/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,UAAU,EAAO,MAAM,QAAQ,CAAC;AAEnE,MAAM,MAAM,oBAAoB,GAAG;IACjC,OAAO,EAAE,cAAc,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IAC9C,SAAS,EAAE,cAAc,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;CACjD,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,oBAGjC,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,oBAGnC,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,oBAGhC,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { sql } from 'kysely';
2
+ export const SQLITE_COLUMN_TYPES = {
3
+ boolean: 'boolean',
4
+ timestamp: 'timestamp',
5
+ };
6
+ export const POSTGRES_COLUMN_TYPES = {
7
+ boolean: 'boolean',
8
+ timestamp: 'timestamp',
9
+ };
10
+ export const MYSQL_COLUMN_TYPES = {
11
+ boolean: sql `tinyint`,
12
+ timestamp: 'datetime',
13
+ };
14
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/migrations/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwC,GAAG,EAAE,MAAM,QAAQ,CAAC;AAOnE,MAAM,CAAC,MAAM,mBAAmB,GAAyB;IACvD,OAAO,EAAE,SAAS;IAClB,SAAS,EAAE,WAAW;CACvB,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAyB;IACzD,OAAO,EAAE,SAAS;IAClB,SAAS,EAAE,WAAW;CACvB,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAyB;IACtD,OAAO,EAAE,GAAG,CAAA,SAAS;IACrB,SAAS,EAAE,UAAU;CACtB,CAAC"}
package/dist/schema.d.ts CHANGED
@@ -18,7 +18,8 @@ export interface AccountsTable {
18
18
  export interface SessionsTable {
19
19
  id: string;
20
20
  user_id: string;
21
- token_hash: string;
21
+ selector: string;
22
+ verifier_hash: string;
22
23
  expires_at: ColumnType<Date, Date | string, Date | string>;
23
24
  ip_address: string | null;
24
25
  user_agent: string | null;
@@ -32,10 +33,38 @@ export interface LoginAttemptsTable {
32
33
  success: number | boolean;
33
34
  created_at: ColumnType<Date, Date | string, Date | string>;
34
35
  }
36
+ export interface EmailVerificationsTable {
37
+ id: string;
38
+ user_id: string;
39
+ selector: string;
40
+ verifier_hash: string;
41
+ expires_at: ColumnType<Date, Date | string, Date | string>;
42
+ created_at: ColumnType<Date, Date | string, Date | string>;
43
+ }
44
+ export interface PasswordResetsTable {
45
+ id: string;
46
+ user_id: string;
47
+ selector: string;
48
+ verifier_hash: string;
49
+ expires_at: ColumnType<Date, Date | string, Date | string>;
50
+ created_at: ColumnType<Date, Date | string, Date | string>;
51
+ }
52
+ export interface OAuthStatesTable {
53
+ id: string;
54
+ provider_id: string;
55
+ state: string;
56
+ code_verifier: string | null;
57
+ redirect_uri: string | null;
58
+ expires_at: ColumnType<Date, Date | string, Date | string>;
59
+ created_at: ColumnType<Date, Date | string, Date | string>;
60
+ }
35
61
  export interface Database {
36
62
  users: UsersTable;
37
63
  accounts: AccountsTable;
38
64
  sessions: SessionsTable;
39
65
  login_attempts: LoginAttemptsTable;
66
+ email_verifications: EmailVerificationsTable;
67
+ password_resets: PasswordResetsTable;
68
+ oauth_states: OAuthStatesTable;
40
69
  }
41
70
  //# sourceMappingURL=schema.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAEzC,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC;IACjC,UAAU,EAAE,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,EAAE,IAAI,GAAG,MAAM,CAAC,CAAC;IAC3D,UAAU,EAAE,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,EAAE,IAAI,GAAG,MAAM,CAAC,CAAC;IAC3D,YAAY,EAAE,UAAU,CAAC,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI,CAAC,CAAC;CACnF;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,UAAU,EAAE,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,EAAE,IAAI,GAAG,MAAM,CAAC,CAAC;CAC5D;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,EAAE,IAAI,GAAG,MAAM,CAAC,CAAC;IAC3D,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,EAAE,IAAI,GAAG,MAAM,CAAC,CAAC;CAC5D;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;IAC1B,UAAU,EAAE,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,EAAE,IAAI,GAAG,MAAM,CAAC,CAAC;CAC5D;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,UAAU,CAAC;IAClB,QAAQ,EAAE,aAAa,CAAC;IACxB,QAAQ,EAAE,aAAa,CAAC;IACxB,cAAc,EAAE,kBAAkB,CAAC;CACpC"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAEzC,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC;IACjC,UAAU,EAAE,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,EAAE,IAAI,GAAG,MAAM,CAAC,CAAC;IAC3D,UAAU,EAAE,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,EAAE,IAAI,GAAG,MAAM,CAAC,CAAC;IAC3D,YAAY,EAAE,UAAU,CAAC,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI,CAAC,CAAC;CACnF;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,UAAU,EAAE,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,EAAE,IAAI,GAAG,MAAM,CAAC,CAAC;CAC5D;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,EAAE,IAAI,GAAG,MAAM,CAAC,CAAC;IAC3D,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,EAAE,IAAI,GAAG,MAAM,CAAC,CAAC;CAC5D;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;IAC1B,UAAU,EAAE,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,EAAE,IAAI,GAAG,MAAM,CAAC,CAAC;CAC5D;AAED,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,EAAE,IAAI,GAAG,MAAM,CAAC,CAAC;IAC3D,UAAU,EAAE,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,EAAE,IAAI,GAAG,MAAM,CAAC,CAAC;CAC5D;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,EAAE,IAAI,GAAG,MAAM,CAAC,CAAC;IAC3D,UAAU,EAAE,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,EAAE,IAAI,GAAG,MAAM,CAAC,CAAC;CAC5D;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,EAAE,IAAI,GAAG,MAAM,CAAC,CAAC;IAC3D,UAAU,EAAE,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,EAAE,IAAI,GAAG,MAAM,CAAC,CAAC;CAC5D;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,UAAU,CAAC;IAClB,QAAQ,EAAE,aAAa,CAAC;IACxB,QAAQ,EAAE,aAAa,CAAC;IACxB,cAAc,EAAE,kBAAkB,CAAC;IACnC,mBAAmB,EAAE,uBAAuB,CAAC;IAC7C,eAAe,EAAE,mBAAmB,CAAC;IACrC,YAAY,EAAE,gBAAgB,CAAC;CAChC"}
package/package.json CHANGED
@@ -1,9 +1,12 @@
1
1
  {
2
2
  "name": "@fortressauth/adapter-sql",
3
- "version": "0.1.8",
3
+ "version": "0.1.9",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
7
+ "files": [
8
+ "dist"
9
+ ],
7
10
  "exports": {
8
11
  ".": {
9
12
  "types": "./dist/index.d.ts",
@@ -11,23 +14,29 @@
11
14
  }
12
15
  },
13
16
  "dependencies": {
14
- "kysely": "^0.28.8",
15
- "@fortressauth/core": "0.1.8"
17
+ "kysely": "^0.28.9",
18
+ "@fortressauth/core": "0.1.9"
16
19
  },
17
20
  "devDependencies": {
18
- "@biomejs/biome": "^2.3.8",
21
+ "@biomejs/biome": "^2.3.11",
19
22
  "@types/better-sqlite3": "^7.6.13",
20
- "@vitest/coverage-v8": "^4.0.15",
23
+ "@vitest/coverage-v8": "^4.0.16",
21
24
  "better-sqlite3": "^12.5.0",
25
+ "mysql2": "^3.16.0",
26
+ "pg": "^8.17.1",
27
+ "@types/pg": "^8.16.0",
22
28
  "typescript": "^5.9.3",
23
- "vitest": "^4.0.15"
29
+ "vitest": "^4.0.16"
24
30
  },
25
31
  "scripts": {
26
32
  "build": "tsc",
33
+ "pretest": "pnpm rebuild better-sqlite3",
27
34
  "test": "vitest run",
28
35
  "test:watch": "vitest",
36
+ "pretest:coverage": "pnpm rebuild better-sqlite3",
29
37
  "test:coverage": "vitest run --coverage",
30
38
  "lint": "biome check .",
39
+ "lint:fix": "biome check --write .",
31
40
  "typecheck": "tsc --noEmit"
32
41
  }
33
42
  }