@holeauth/2fa-drizzle 0.0.1-alpha.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.
@@ -0,0 +1,154 @@
1
+ import * as drizzle_orm from 'drizzle-orm';
2
+ import * as drizzle_orm_pg_core from 'drizzle-orm/pg-core';
3
+ import { PgTableWithColumns } from 'drizzle-orm/pg-core';
4
+ import { TwoFactorAdapter } from '@holeauth/plugin-2fa';
5
+
6
+ type PgUsersTable = PgTableWithColumns<any> & {
7
+ id: any;
8
+ };
9
+ interface CreateTwoFactorTablesOptions<U extends PgUsersTable> {
10
+ usersTable: U;
11
+ prefix?: string;
12
+ }
13
+ declare function createTwoFactorTables<U extends PgUsersTable>(opts: CreateTwoFactorTablesOptions<U>): {
14
+ tables: {
15
+ twoFactor: PgTableWithColumns<{
16
+ name: string;
17
+ schema: undefined;
18
+ columns: {
19
+ userId: drizzle_orm_pg_core.PgColumn<{
20
+ name: "user_id";
21
+ tableName: string;
22
+ dataType: "string";
23
+ columnType: "PgText";
24
+ data: string;
25
+ driverParam: string;
26
+ notNull: true;
27
+ hasDefault: false;
28
+ isPrimaryKey: true;
29
+ isAutoincrement: false;
30
+ hasRuntimeDefault: false;
31
+ enumValues: [string, ...string[]];
32
+ baseColumn: never;
33
+ identity: undefined;
34
+ generated: undefined;
35
+ }, {}, {}>;
36
+ secret: drizzle_orm_pg_core.PgColumn<{
37
+ name: "secret";
38
+ tableName: string;
39
+ dataType: "string";
40
+ columnType: "PgText";
41
+ data: string;
42
+ driverParam: string;
43
+ notNull: true;
44
+ hasDefault: false;
45
+ isPrimaryKey: false;
46
+ isAutoincrement: false;
47
+ hasRuntimeDefault: false;
48
+ enumValues: [string, ...string[]];
49
+ baseColumn: never;
50
+ identity: undefined;
51
+ generated: undefined;
52
+ }, {}, {}>;
53
+ enabled: drizzle_orm_pg_core.PgColumn<{
54
+ name: "enabled";
55
+ tableName: string;
56
+ dataType: "boolean";
57
+ columnType: "PgBoolean";
58
+ data: boolean;
59
+ driverParam: boolean;
60
+ notNull: true;
61
+ hasDefault: true;
62
+ isPrimaryKey: false;
63
+ isAutoincrement: false;
64
+ hasRuntimeDefault: false;
65
+ enumValues: undefined;
66
+ baseColumn: never;
67
+ identity: undefined;
68
+ generated: undefined;
69
+ }, {}, {}>;
70
+ recoveryCodes: drizzle_orm_pg_core.PgColumn<{
71
+ name: "recovery_codes";
72
+ tableName: string;
73
+ dataType: "array";
74
+ columnType: "PgArray";
75
+ data: string[];
76
+ driverParam: string | string[];
77
+ notNull: true;
78
+ hasDefault: true;
79
+ isPrimaryKey: false;
80
+ isAutoincrement: false;
81
+ hasRuntimeDefault: false;
82
+ enumValues: [string, ...string[]];
83
+ baseColumn: drizzle_orm.Column<{
84
+ name: "recovery_codes";
85
+ tableName: string;
86
+ dataType: "string";
87
+ columnType: "PgText";
88
+ data: string;
89
+ driverParam: string;
90
+ notNull: false;
91
+ hasDefault: false;
92
+ isPrimaryKey: false;
93
+ isAutoincrement: false;
94
+ hasRuntimeDefault: false;
95
+ enumValues: [string, ...string[]];
96
+ baseColumn: never;
97
+ identity: undefined;
98
+ generated: undefined;
99
+ }, object, object>;
100
+ identity: undefined;
101
+ generated: undefined;
102
+ }, {}, {}>;
103
+ createdAt: drizzle_orm_pg_core.PgColumn<{
104
+ name: "created_at";
105
+ tableName: string;
106
+ dataType: "date";
107
+ columnType: "PgTimestamp";
108
+ data: Date;
109
+ driverParam: string;
110
+ notNull: true;
111
+ hasDefault: true;
112
+ isPrimaryKey: false;
113
+ isAutoincrement: false;
114
+ hasRuntimeDefault: false;
115
+ enumValues: undefined;
116
+ baseColumn: never;
117
+ identity: undefined;
118
+ generated: undefined;
119
+ }, {}, {}>;
120
+ updatedAt: drizzle_orm_pg_core.PgColumn<{
121
+ name: "updated_at";
122
+ tableName: string;
123
+ dataType: "date";
124
+ columnType: "PgTimestamp";
125
+ data: Date;
126
+ driverParam: string;
127
+ notNull: true;
128
+ hasDefault: true;
129
+ isPrimaryKey: false;
130
+ isAutoincrement: false;
131
+ hasRuntimeDefault: false;
132
+ enumValues: undefined;
133
+ baseColumn: never;
134
+ identity: undefined;
135
+ generated: undefined;
136
+ }, {}, {}>;
137
+ };
138
+ dialect: "pg";
139
+ }>;
140
+ };
141
+ relations: {
142
+ twoFactorRelations: drizzle_orm.Relations<string, {
143
+ user: drizzle_orm.One<U["_"]["name"], true>;
144
+ }>;
145
+ };
146
+ };
147
+ type Tables = ReturnType<typeof createTwoFactorTables>['tables'];
148
+ interface CreateTwoFactorAdapterOptions {
149
+ db: any;
150
+ tables: Tables;
151
+ }
152
+ declare function createTwoFactorAdapter(opts: CreateTwoFactorAdapterOptions): TwoFactorAdapter;
153
+
154
+ export { type CreateTwoFactorAdapterOptions, type CreateTwoFactorTablesOptions, type PgUsersTable, createTwoFactorAdapter, createTwoFactorTables };
@@ -0,0 +1,154 @@
1
+ import * as drizzle_orm from 'drizzle-orm';
2
+ import * as drizzle_orm_pg_core from 'drizzle-orm/pg-core';
3
+ import { PgTableWithColumns } from 'drizzle-orm/pg-core';
4
+ import { TwoFactorAdapter } from '@holeauth/plugin-2fa';
5
+
6
+ type PgUsersTable = PgTableWithColumns<any> & {
7
+ id: any;
8
+ };
9
+ interface CreateTwoFactorTablesOptions<U extends PgUsersTable> {
10
+ usersTable: U;
11
+ prefix?: string;
12
+ }
13
+ declare function createTwoFactorTables<U extends PgUsersTable>(opts: CreateTwoFactorTablesOptions<U>): {
14
+ tables: {
15
+ twoFactor: PgTableWithColumns<{
16
+ name: string;
17
+ schema: undefined;
18
+ columns: {
19
+ userId: drizzle_orm_pg_core.PgColumn<{
20
+ name: "user_id";
21
+ tableName: string;
22
+ dataType: "string";
23
+ columnType: "PgText";
24
+ data: string;
25
+ driverParam: string;
26
+ notNull: true;
27
+ hasDefault: false;
28
+ isPrimaryKey: true;
29
+ isAutoincrement: false;
30
+ hasRuntimeDefault: false;
31
+ enumValues: [string, ...string[]];
32
+ baseColumn: never;
33
+ identity: undefined;
34
+ generated: undefined;
35
+ }, {}, {}>;
36
+ secret: drizzle_orm_pg_core.PgColumn<{
37
+ name: "secret";
38
+ tableName: string;
39
+ dataType: "string";
40
+ columnType: "PgText";
41
+ data: string;
42
+ driverParam: string;
43
+ notNull: true;
44
+ hasDefault: false;
45
+ isPrimaryKey: false;
46
+ isAutoincrement: false;
47
+ hasRuntimeDefault: false;
48
+ enumValues: [string, ...string[]];
49
+ baseColumn: never;
50
+ identity: undefined;
51
+ generated: undefined;
52
+ }, {}, {}>;
53
+ enabled: drizzle_orm_pg_core.PgColumn<{
54
+ name: "enabled";
55
+ tableName: string;
56
+ dataType: "boolean";
57
+ columnType: "PgBoolean";
58
+ data: boolean;
59
+ driverParam: boolean;
60
+ notNull: true;
61
+ hasDefault: true;
62
+ isPrimaryKey: false;
63
+ isAutoincrement: false;
64
+ hasRuntimeDefault: false;
65
+ enumValues: undefined;
66
+ baseColumn: never;
67
+ identity: undefined;
68
+ generated: undefined;
69
+ }, {}, {}>;
70
+ recoveryCodes: drizzle_orm_pg_core.PgColumn<{
71
+ name: "recovery_codes";
72
+ tableName: string;
73
+ dataType: "array";
74
+ columnType: "PgArray";
75
+ data: string[];
76
+ driverParam: string | string[];
77
+ notNull: true;
78
+ hasDefault: true;
79
+ isPrimaryKey: false;
80
+ isAutoincrement: false;
81
+ hasRuntimeDefault: false;
82
+ enumValues: [string, ...string[]];
83
+ baseColumn: drizzle_orm.Column<{
84
+ name: "recovery_codes";
85
+ tableName: string;
86
+ dataType: "string";
87
+ columnType: "PgText";
88
+ data: string;
89
+ driverParam: string;
90
+ notNull: false;
91
+ hasDefault: false;
92
+ isPrimaryKey: false;
93
+ isAutoincrement: false;
94
+ hasRuntimeDefault: false;
95
+ enumValues: [string, ...string[]];
96
+ baseColumn: never;
97
+ identity: undefined;
98
+ generated: undefined;
99
+ }, object, object>;
100
+ identity: undefined;
101
+ generated: undefined;
102
+ }, {}, {}>;
103
+ createdAt: drizzle_orm_pg_core.PgColumn<{
104
+ name: "created_at";
105
+ tableName: string;
106
+ dataType: "date";
107
+ columnType: "PgTimestamp";
108
+ data: Date;
109
+ driverParam: string;
110
+ notNull: true;
111
+ hasDefault: true;
112
+ isPrimaryKey: false;
113
+ isAutoincrement: false;
114
+ hasRuntimeDefault: false;
115
+ enumValues: undefined;
116
+ baseColumn: never;
117
+ identity: undefined;
118
+ generated: undefined;
119
+ }, {}, {}>;
120
+ updatedAt: drizzle_orm_pg_core.PgColumn<{
121
+ name: "updated_at";
122
+ tableName: string;
123
+ dataType: "date";
124
+ columnType: "PgTimestamp";
125
+ data: Date;
126
+ driverParam: string;
127
+ notNull: true;
128
+ hasDefault: true;
129
+ isPrimaryKey: false;
130
+ isAutoincrement: false;
131
+ hasRuntimeDefault: false;
132
+ enumValues: undefined;
133
+ baseColumn: never;
134
+ identity: undefined;
135
+ generated: undefined;
136
+ }, {}, {}>;
137
+ };
138
+ dialect: "pg";
139
+ }>;
140
+ };
141
+ relations: {
142
+ twoFactorRelations: drizzle_orm.Relations<string, {
143
+ user: drizzle_orm.One<U["_"]["name"], true>;
144
+ }>;
145
+ };
146
+ };
147
+ type Tables = ReturnType<typeof createTwoFactorTables>['tables'];
148
+ interface CreateTwoFactorAdapterOptions {
149
+ db: any;
150
+ tables: Tables;
151
+ }
152
+ declare function createTwoFactorAdapter(opts: CreateTwoFactorAdapterOptions): TwoFactorAdapter;
153
+
154
+ export { type CreateTwoFactorAdapterOptions, type CreateTwoFactorTablesOptions, type PgUsersTable, createTwoFactorAdapter, createTwoFactorTables };
@@ -0,0 +1,68 @@
1
+ import { pgTable, timestamp, text, boolean } from 'drizzle-orm/pg-core';
2
+ import { relations, eq } from 'drizzle-orm';
3
+
4
+ // src/pg/index.ts
5
+ function createTwoFactorTables(opts) {
6
+ const { usersTable, prefix = "holeauth_2fa_" } = opts;
7
+ const p = (s) => `${prefix}${s}`;
8
+ const twoFactor = pgTable(p("credential"), {
9
+ userId: text("user_id").primaryKey().references(() => usersTable.id, { onDelete: "cascade" }),
10
+ secret: text("secret").notNull(),
11
+ enabled: boolean("enabled").notNull().default(false),
12
+ recoveryCodes: text("recovery_codes").array().notNull().default([]),
13
+ createdAt: timestamp("created_at", { withTimezone: true, mode: "date" }).notNull().defaultNow(),
14
+ updatedAt: timestamp("updated_at", { withTimezone: true, mode: "date" }).notNull().defaultNow()
15
+ });
16
+ const twoFactorRelations = relations(twoFactor, ({ one }) => ({
17
+ user: one(usersTable, { fields: [twoFactor.userId], references: [usersTable.id] })
18
+ }));
19
+ return { tables: { twoFactor }, relations: { twoFactorRelations } };
20
+ }
21
+ var rowToRecord = (r) => ({
22
+ userId: String(r.userId),
23
+ secret: String(r.secret),
24
+ enabled: Boolean(r.enabled),
25
+ recoveryCodes: r.recoveryCodes ?? [],
26
+ createdAt: r.createdAt,
27
+ updatedAt: r.updatedAt
28
+ });
29
+ function createTwoFactorAdapter(opts) {
30
+ const { db, tables } = opts;
31
+ const { twoFactor } = tables;
32
+ return {
33
+ async getByUserId(userId) {
34
+ const rows = await db.select().from(twoFactor).where(eq(twoFactor.userId, userId)).limit(1);
35
+ return rows[0] ? rowToRecord(rows[0]) : null;
36
+ },
37
+ async upsert(record) {
38
+ const [row] = await db.insert(twoFactor).values({
39
+ userId: record.userId,
40
+ secret: record.secret,
41
+ enabled: record.enabled,
42
+ recoveryCodes: record.recoveryCodes
43
+ }).onConflictDoUpdate({
44
+ target: twoFactor.userId,
45
+ set: {
46
+ secret: record.secret,
47
+ enabled: record.enabled,
48
+ recoveryCodes: record.recoveryCodes,
49
+ updatedAt: /* @__PURE__ */ new Date()
50
+ }
51
+ }).returning();
52
+ return rowToRecord(row);
53
+ },
54
+ async update(userId, patch) {
55
+ const toSet = { ...patch, updatedAt: /* @__PURE__ */ new Date() };
56
+ delete toSet.userId;
57
+ const [row] = await db.update(twoFactor).set(toSet).where(eq(twoFactor.userId, userId)).returning();
58
+ return row ? rowToRecord(row) : null;
59
+ },
60
+ async delete(userId) {
61
+ await db.delete(twoFactor).where(eq(twoFactor.userId, userId));
62
+ }
63
+ };
64
+ }
65
+
66
+ export { createTwoFactorAdapter, createTwoFactorTables };
67
+ //# sourceMappingURL=index.js.map
68
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/pg/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import { pgTable, text, timestamp, boolean, type PgTableWithColumns } from 'drizzle-orm/pg-core';\nimport { relations, eq } from 'drizzle-orm';\nimport type { TwoFactorAdapter, TwoFactorRecord } from '@holeauth/plugin-2fa';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type PgUsersTable = PgTableWithColumns<any> & { id: any };\n\nexport interface CreateTwoFactorTablesOptions<U extends PgUsersTable> {\n usersTable: U;\n prefix?: string;\n}\n\nexport function createTwoFactorTables<U extends PgUsersTable>(opts: CreateTwoFactorTablesOptions<U>) {\n const { usersTable, prefix = 'holeauth_2fa_' } = opts;\n const p = (s: string) => `${prefix}${s}`;\n\n const twoFactor = pgTable(p('credential'), {\n userId: text('user_id')\n .primaryKey()\n .references(() => usersTable.id, { onDelete: 'cascade' }),\n secret: text('secret').notNull(),\n enabled: boolean('enabled').notNull().default(false),\n recoveryCodes: text('recovery_codes').array().notNull().default([]),\n createdAt: timestamp('created_at', { withTimezone: true, mode: 'date' }).notNull().defaultNow(),\n updatedAt: timestamp('updated_at', { withTimezone: true, mode: 'date' }).notNull().defaultNow(),\n });\n\n const twoFactorRelations = relations(twoFactor, ({ one }) => ({\n user: one(usersTable, { fields: [twoFactor.userId], references: [usersTable.id] }),\n }));\n\n return { tables: { twoFactor }, relations: { twoFactorRelations } };\n}\n\ntype Tables = ReturnType<typeof createTwoFactorTables>['tables'];\n\nexport interface CreateTwoFactorAdapterOptions {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n db: any;\n tables: Tables;\n}\n\nconst rowToRecord = (r: Record<string, unknown>): TwoFactorRecord => ({\n userId: String(r.userId),\n secret: String(r.secret),\n enabled: Boolean(r.enabled),\n recoveryCodes: (r.recoveryCodes as string[] | null | undefined) ?? [],\n createdAt: r.createdAt as Date | undefined,\n updatedAt: r.updatedAt as Date | undefined,\n});\n\nexport function createTwoFactorAdapter(opts: CreateTwoFactorAdapterOptions): TwoFactorAdapter {\n const { db, tables } = opts;\n const { twoFactor } = tables;\n return {\n async getByUserId(userId) {\n const rows = await db.select().from(twoFactor).where(eq(twoFactor.userId, userId)).limit(1);\n return rows[0] ? rowToRecord(rows[0]) : null;\n },\n async upsert(record) {\n const [row] = await db\n .insert(twoFactor)\n .values({\n userId: record.userId,\n secret: record.secret,\n enabled: record.enabled,\n recoveryCodes: record.recoveryCodes,\n })\n .onConflictDoUpdate({\n target: twoFactor.userId,\n set: {\n secret: record.secret,\n enabled: record.enabled,\n recoveryCodes: record.recoveryCodes,\n updatedAt: new Date(),\n },\n })\n .returning();\n return rowToRecord(row);\n },\n async update(userId, patch) {\n const toSet: Record<string, unknown> = { ...patch, updatedAt: new Date() };\n delete toSet.userId;\n const [row] = await db.update(twoFactor).set(toSet).where(eq(twoFactor.userId, userId)).returning();\n return row ? rowToRecord(row) : null;\n },\n async delete(userId) {\n await db.delete(twoFactor).where(eq(twoFactor.userId, userId));\n },\n };\n}\n"]}
@@ -0,0 +1,71 @@
1
+ 'use strict';
2
+
3
+ var sqliteCore = require('drizzle-orm/sqlite-core');
4
+ var drizzleOrm = require('drizzle-orm');
5
+
6
+ // src/sqlite/index.ts
7
+ function createTwoFactorTables(opts) {
8
+ const { usersTable, prefix = "holeauth_2fa_" } = opts;
9
+ const p = (s) => `${prefix}${s}`;
10
+ const twoFactor = sqliteCore.sqliteTable(p("credential"), {
11
+ userId: sqliteCore.text("user_id").primaryKey().references(() => usersTable.id, { onDelete: "cascade" }),
12
+ secret: sqliteCore.text("secret").notNull(),
13
+ enabled: sqliteCore.integer("enabled", { mode: "boolean" }).notNull().default(false),
14
+ recoveryCodes: sqliteCore.text("recovery_codes", { mode: "json" }).$type().notNull().default([]),
15
+ createdAt: sqliteCore.integer("created_at", { mode: "timestamp_ms" }).notNull().$defaultFn(() => /* @__PURE__ */ new Date()),
16
+ updatedAt: sqliteCore.integer("updated_at", { mode: "timestamp_ms" }).notNull().$defaultFn(() => /* @__PURE__ */ new Date())
17
+ });
18
+ const twoFactorRelations = drizzleOrm.relations(twoFactor, ({ one }) => ({
19
+ user: one(usersTable, { fields: [twoFactor.userId], references: [usersTable.id] })
20
+ }));
21
+ return { tables: { twoFactor }, relations: { twoFactorRelations } };
22
+ }
23
+ var rowToRecord = (r) => ({
24
+ userId: String(r.userId),
25
+ secret: String(r.secret),
26
+ enabled: Boolean(r.enabled),
27
+ recoveryCodes: r.recoveryCodes ?? [],
28
+ createdAt: r.createdAt,
29
+ updatedAt: r.updatedAt
30
+ });
31
+ function createTwoFactorAdapter(opts) {
32
+ const { db, tables } = opts;
33
+ const { twoFactor } = tables;
34
+ return {
35
+ async getByUserId(userId) {
36
+ const rows = await db.select().from(twoFactor).where(drizzleOrm.eq(twoFactor.userId, userId)).limit(1);
37
+ return rows[0] ? rowToRecord(rows[0]) : null;
38
+ },
39
+ async upsert(record) {
40
+ const [row] = await db.insert(twoFactor).values({
41
+ userId: record.userId,
42
+ secret: record.secret,
43
+ enabled: record.enabled,
44
+ recoveryCodes: record.recoveryCodes
45
+ }).onConflictDoUpdate({
46
+ target: twoFactor.userId,
47
+ set: {
48
+ secret: record.secret,
49
+ enabled: record.enabled,
50
+ recoveryCodes: record.recoveryCodes,
51
+ updatedAt: /* @__PURE__ */ new Date()
52
+ }
53
+ }).returning();
54
+ return rowToRecord(row);
55
+ },
56
+ async update(userId, patch) {
57
+ const toSet = { ...patch, updatedAt: /* @__PURE__ */ new Date() };
58
+ delete toSet.userId;
59
+ const [row] = await db.update(twoFactor).set(toSet).where(drizzleOrm.eq(twoFactor.userId, userId)).returning();
60
+ return row ? rowToRecord(row) : null;
61
+ },
62
+ async delete(userId) {
63
+ await db.delete(twoFactor).where(drizzleOrm.eq(twoFactor.userId, userId));
64
+ }
65
+ };
66
+ }
67
+
68
+ exports.createTwoFactorAdapter = createTwoFactorAdapter;
69
+ exports.createTwoFactorTables = createTwoFactorTables;
70
+ //# sourceMappingURL=index.cjs.map
71
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/sqlite/index.ts"],"names":["sqliteTable","text","integer","relations","eq"],"mappings":"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","file":"index.cjs","sourcesContent":["import { sqliteTable, text, integer, type SQLiteTableWithColumns } from 'drizzle-orm/sqlite-core';\nimport { relations, eq } from 'drizzle-orm';\nimport type { TwoFactorAdapter, TwoFactorRecord } from '@holeauth/plugin-2fa';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type SqliteUsersTable = SQLiteTableWithColumns<any> & { id: any };\n\nexport interface CreateTwoFactorTablesOptions<U extends SqliteUsersTable> {\n usersTable: U;\n prefix?: string;\n}\n\nexport function createTwoFactorTables<U extends SqliteUsersTable>(opts: CreateTwoFactorTablesOptions<U>) {\n const { usersTable, prefix = 'holeauth_2fa_' } = opts;\n const p = (s: string) => `${prefix}${s}`;\n const twoFactor = sqliteTable(p('credential'), {\n userId: text('user_id')\n .primaryKey()\n .references(() => usersTable.id, { onDelete: 'cascade' }),\n secret: text('secret').notNull(),\n enabled: integer('enabled', { mode: 'boolean' }).notNull().default(false),\n recoveryCodes: text('recovery_codes', { mode: 'json' }).$type<string[]>().notNull().default([]),\n createdAt: integer('created_at', { mode: 'timestamp_ms' })\n .notNull()\n .$defaultFn(() => new Date()),\n updatedAt: integer('updated_at', { mode: 'timestamp_ms' })\n .notNull()\n .$defaultFn(() => new Date()),\n });\n const twoFactorRelations = relations(twoFactor, ({ one }) => ({\n user: one(usersTable, { fields: [twoFactor.userId], references: [usersTable.id] }),\n }));\n return { tables: { twoFactor }, relations: { twoFactorRelations } };\n}\n\ntype Tables = ReturnType<typeof createTwoFactorTables>['tables'];\n\nexport interface CreateTwoFactorAdapterOptions {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n db: any;\n tables: Tables;\n}\n\nconst rowToRecord = (r: Record<string, unknown>): TwoFactorRecord => ({\n userId: String(r.userId),\n secret: String(r.secret),\n enabled: Boolean(r.enabled),\n recoveryCodes: (r.recoveryCodes as string[] | null | undefined) ?? [],\n createdAt: r.createdAt as Date | undefined,\n updatedAt: r.updatedAt as Date | undefined,\n});\n\nexport function createTwoFactorAdapter(opts: CreateTwoFactorAdapterOptions): TwoFactorAdapter {\n const { db, tables } = opts;\n const { twoFactor } = tables;\n return {\n async getByUserId(userId) {\n const rows = await db.select().from(twoFactor).where(eq(twoFactor.userId, userId)).limit(1);\n return rows[0] ? rowToRecord(rows[0]) : null;\n },\n async upsert(record) {\n const [row] = await db\n .insert(twoFactor)\n .values({\n userId: record.userId,\n secret: record.secret,\n enabled: record.enabled,\n recoveryCodes: record.recoveryCodes,\n })\n .onConflictDoUpdate({\n target: twoFactor.userId,\n set: {\n secret: record.secret,\n enabled: record.enabled,\n recoveryCodes: record.recoveryCodes,\n updatedAt: new Date(),\n },\n })\n .returning();\n return rowToRecord(row);\n },\n async update(userId, patch) {\n const toSet: Record<string, unknown> = { ...patch, updatedAt: new Date() };\n delete toSet.userId;\n const [row] = await db.update(twoFactor).set(toSet).where(eq(twoFactor.userId, userId)).returning();\n return row ? rowToRecord(row) : null;\n },\n async delete(userId) {\n await db.delete(twoFactor).where(eq(twoFactor.userId, userId));\n },\n };\n}\n"]}
@@ -0,0 +1,138 @@
1
+ import * as drizzle_orm from 'drizzle-orm';
2
+ import * as drizzle_orm_sqlite_core from 'drizzle-orm/sqlite-core';
3
+ import { SQLiteTableWithColumns } from 'drizzle-orm/sqlite-core';
4
+ import { TwoFactorAdapter } from '@holeauth/plugin-2fa';
5
+
6
+ type SqliteUsersTable = SQLiteTableWithColumns<any> & {
7
+ id: any;
8
+ };
9
+ interface CreateTwoFactorTablesOptions<U extends SqliteUsersTable> {
10
+ usersTable: U;
11
+ prefix?: string;
12
+ }
13
+ declare function createTwoFactorTables<U extends SqliteUsersTable>(opts: CreateTwoFactorTablesOptions<U>): {
14
+ tables: {
15
+ twoFactor: SQLiteTableWithColumns<{
16
+ name: string;
17
+ schema: undefined;
18
+ columns: {
19
+ userId: drizzle_orm_sqlite_core.SQLiteColumn<{
20
+ name: "user_id";
21
+ tableName: string;
22
+ dataType: "string";
23
+ columnType: "SQLiteText";
24
+ data: string;
25
+ driverParam: string;
26
+ notNull: true;
27
+ hasDefault: false;
28
+ isPrimaryKey: true;
29
+ isAutoincrement: false;
30
+ hasRuntimeDefault: false;
31
+ enumValues: [string, ...string[]];
32
+ baseColumn: never;
33
+ identity: undefined;
34
+ generated: undefined;
35
+ }, object>;
36
+ secret: drizzle_orm_sqlite_core.SQLiteColumn<{
37
+ name: "secret";
38
+ tableName: string;
39
+ dataType: "string";
40
+ columnType: "SQLiteText";
41
+ data: string;
42
+ driverParam: string;
43
+ notNull: true;
44
+ hasDefault: false;
45
+ isPrimaryKey: false;
46
+ isAutoincrement: false;
47
+ hasRuntimeDefault: false;
48
+ enumValues: [string, ...string[]];
49
+ baseColumn: never;
50
+ identity: undefined;
51
+ generated: undefined;
52
+ }, object>;
53
+ enabled: drizzle_orm_sqlite_core.SQLiteColumn<{
54
+ name: "enabled";
55
+ tableName: string;
56
+ dataType: "boolean";
57
+ columnType: "SQLiteBoolean";
58
+ data: boolean;
59
+ driverParam: number;
60
+ notNull: true;
61
+ hasDefault: true;
62
+ isPrimaryKey: false;
63
+ isAutoincrement: false;
64
+ hasRuntimeDefault: false;
65
+ enumValues: undefined;
66
+ baseColumn: never;
67
+ identity: undefined;
68
+ generated: undefined;
69
+ }, object>;
70
+ recoveryCodes: drizzle_orm_sqlite_core.SQLiteColumn<{
71
+ name: "recovery_codes";
72
+ tableName: string;
73
+ dataType: "json";
74
+ columnType: "SQLiteTextJson";
75
+ data: string[];
76
+ driverParam: string;
77
+ notNull: true;
78
+ hasDefault: true;
79
+ isPrimaryKey: false;
80
+ isAutoincrement: false;
81
+ hasRuntimeDefault: false;
82
+ enumValues: undefined;
83
+ baseColumn: never;
84
+ identity: undefined;
85
+ generated: undefined;
86
+ }, object>;
87
+ createdAt: drizzle_orm_sqlite_core.SQLiteColumn<{
88
+ name: "created_at";
89
+ tableName: string;
90
+ dataType: "date";
91
+ columnType: "SQLiteTimestamp";
92
+ data: Date;
93
+ driverParam: number;
94
+ notNull: true;
95
+ hasDefault: true;
96
+ isPrimaryKey: false;
97
+ isAutoincrement: false;
98
+ hasRuntimeDefault: true;
99
+ enumValues: undefined;
100
+ baseColumn: never;
101
+ identity: undefined;
102
+ generated: undefined;
103
+ }, object>;
104
+ updatedAt: drizzle_orm_sqlite_core.SQLiteColumn<{
105
+ name: "updated_at";
106
+ tableName: string;
107
+ dataType: "date";
108
+ columnType: "SQLiteTimestamp";
109
+ data: Date;
110
+ driverParam: number;
111
+ notNull: true;
112
+ hasDefault: true;
113
+ isPrimaryKey: false;
114
+ isAutoincrement: false;
115
+ hasRuntimeDefault: true;
116
+ enumValues: undefined;
117
+ baseColumn: never;
118
+ identity: undefined;
119
+ generated: undefined;
120
+ }, object>;
121
+ };
122
+ dialect: "sqlite";
123
+ }>;
124
+ };
125
+ relations: {
126
+ twoFactorRelations: drizzle_orm.Relations<string, {
127
+ user: drizzle_orm.One<U["_"]["name"], true>;
128
+ }>;
129
+ };
130
+ };
131
+ type Tables = ReturnType<typeof createTwoFactorTables>['tables'];
132
+ interface CreateTwoFactorAdapterOptions {
133
+ db: any;
134
+ tables: Tables;
135
+ }
136
+ declare function createTwoFactorAdapter(opts: CreateTwoFactorAdapterOptions): TwoFactorAdapter;
137
+
138
+ export { type CreateTwoFactorAdapterOptions, type CreateTwoFactorTablesOptions, type SqliteUsersTable, createTwoFactorAdapter, createTwoFactorTables };