@alliance-droid/svelte-auth-core 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (178) hide show
  1. package/dist/adapter-context.d.ts +19 -0
  2. package/dist/adapter-context.d.ts.map +1 -0
  3. package/dist/adapter-context.js +68 -0
  4. package/dist/adapter-context.js.map +1 -0
  5. package/dist/adapters/__tests__/adapter-tests.d.ts +7 -0
  6. package/dist/adapters/__tests__/adapter-tests.d.ts.map +1 -0
  7. package/dist/adapters/__tests__/adapter-tests.js +206 -0
  8. package/dist/adapters/__tests__/adapter-tests.js.map +1 -0
  9. package/dist/adapters/adapter.d.ts +60 -0
  10. package/dist/adapters/adapter.d.ts.map +1 -0
  11. package/dist/adapters/adapter.js +2 -0
  12. package/dist/adapters/adapter.js.map +1 -0
  13. package/dist/adapters/filesystem-adapter.d.ts +26 -0
  14. package/dist/adapters/filesystem-adapter.d.ts.map +1 -0
  15. package/dist/adapters/filesystem-adapter.js +148 -0
  16. package/dist/adapters/filesystem-adapter.js.map +1 -0
  17. package/dist/adapters/index.d.ts +6 -0
  18. package/dist/adapters/index.d.ts.map +1 -0
  19. package/dist/adapters/index.js +5 -0
  20. package/dist/adapters/index.js.map +1 -0
  21. package/dist/adapters/mongodb-adapter.d.ts +27 -0
  22. package/dist/adapters/mongodb-adapter.d.ts.map +1 -0
  23. package/dist/adapters/mongodb-adapter.js +213 -0
  24. package/dist/adapters/mongodb-adapter.js.map +1 -0
  25. package/dist/adapters/postgres-adapter.d.ts +30 -0
  26. package/dist/adapters/postgres-adapter.d.ts.map +1 -0
  27. package/dist/adapters/postgres-adapter.js +237 -0
  28. package/dist/adapters/postgres-adapter.js.map +1 -0
  29. package/dist/adapters/sqlite-adapter.d.ts +26 -0
  30. package/dist/adapters/sqlite-adapter.d.ts.map +1 -0
  31. package/dist/adapters/sqlite-adapter.js +261 -0
  32. package/dist/adapters/sqlite-adapter.js.map +1 -0
  33. package/dist/auth.d.ts +48 -0
  34. package/dist/auth.d.ts.map +1 -0
  35. package/dist/auth.js +205 -0
  36. package/dist/auth.js.map +1 -0
  37. package/dist/client-jwt.d.ts +30 -0
  38. package/dist/client-jwt.d.ts.map +1 -0
  39. package/dist/client-jwt.js +57 -0
  40. package/dist/client-jwt.js.map +1 -0
  41. package/dist/client-store.d.ts +31 -0
  42. package/dist/client-store.d.ts.map +1 -0
  43. package/dist/client-store.js +122 -0
  44. package/dist/client-store.js.map +1 -0
  45. package/dist/cors.d.ts +48 -0
  46. package/dist/cors.d.ts.map +1 -0
  47. package/dist/cors.js +88 -0
  48. package/dist/cors.js.map +1 -0
  49. package/dist/csrf.d.ts +57 -0
  50. package/dist/csrf.d.ts.map +1 -0
  51. package/dist/csrf.js +95 -0
  52. package/dist/csrf.js.map +1 -0
  53. package/dist/db.d.ts +22 -0
  54. package/dist/db.d.ts.map +1 -0
  55. package/dist/db.js +43 -0
  56. package/dist/db.js.map +1 -0
  57. package/dist/index.d.ts +35 -0
  58. package/dist/index.d.ts.map +1 -0
  59. package/dist/index.js +36 -0
  60. package/dist/index.js.map +1 -0
  61. package/dist/input-validation.d.ts +78 -0
  62. package/dist/input-validation.d.ts.map +1 -0
  63. package/dist/input-validation.js +238 -0
  64. package/dist/input-validation.js.map +1 -0
  65. package/dist/oauth-callback.d.ts +31 -0
  66. package/dist/oauth-callback.d.ts.map +1 -0
  67. package/dist/oauth-callback.js +254 -0
  68. package/dist/oauth-callback.js.map +1 -0
  69. package/dist/oauth-providers.d.ts +92 -0
  70. package/dist/oauth-providers.d.ts.map +1 -0
  71. package/dist/oauth-providers.js +213 -0
  72. package/dist/oauth-providers.js.map +1 -0
  73. package/dist/oauth-types.d.ts +77 -0
  74. package/dist/oauth-types.d.ts.map +1 -0
  75. package/dist/oauth-types.js +2 -0
  76. package/dist/oauth-types.js.map +1 -0
  77. package/dist/password.d.ts +31 -0
  78. package/dist/password.d.ts.map +1 -0
  79. package/dist/password.js +54 -0
  80. package/dist/password.js.map +1 -0
  81. package/dist/providers/github-oauth.d.ts +58 -0
  82. package/dist/providers/github-oauth.d.ts.map +1 -0
  83. package/dist/providers/github-oauth.js +230 -0
  84. package/dist/providers/github-oauth.js.map +1 -0
  85. package/dist/providers/google-oauth.d.ts +46 -0
  86. package/dist/providers/google-oauth.d.ts.map +1 -0
  87. package/dist/providers/google-oauth.js +177 -0
  88. package/dist/providers/google-oauth.js.map +1 -0
  89. package/dist/providers/oidc-oauth.d.ts +85 -0
  90. package/dist/providers/oidc-oauth.d.ts.map +1 -0
  91. package/dist/providers/oidc-oauth.js +301 -0
  92. package/dist/providers/oidc-oauth.js.map +1 -0
  93. package/dist/rate-limit.d.ts +36 -0
  94. package/dist/rate-limit.d.ts.map +1 -0
  95. package/dist/rate-limit.js +88 -0
  96. package/dist/rate-limit.js.map +1 -0
  97. package/dist/rate-limiting.d.ts +113 -0
  98. package/dist/rate-limiting.d.ts.map +1 -0
  99. package/dist/rate-limiting.js +221 -0
  100. package/dist/rate-limiting.js.map +1 -0
  101. package/dist/security-headers.d.ts +54 -0
  102. package/dist/security-headers.d.ts.map +1 -0
  103. package/dist/security-headers.js +123 -0
  104. package/dist/security-headers.js.map +1 -0
  105. package/dist/session.d.ts +13 -0
  106. package/dist/session.d.ts.map +1 -0
  107. package/dist/session.js +33 -0
  108. package/dist/session.js.map +1 -0
  109. package/dist/sql-injection-prevention.d.ts +94 -0
  110. package/dist/sql-injection-prevention.d.ts.map +1 -0
  111. package/dist/sql-injection-prevention.js +222 -0
  112. package/dist/sql-injection-prevention.js.map +1 -0
  113. package/dist/token.d.ts +22 -0
  114. package/dist/token.d.ts.map +1 -0
  115. package/dist/token.js +31 -0
  116. package/dist/token.js.map +1 -0
  117. package/dist/types.d.ts +81 -0
  118. package/dist/types.d.ts.map +1 -0
  119. package/dist/types.js +2 -0
  120. package/dist/types.js.map +1 -0
  121. package/dist/user.d.ts +33 -0
  122. package/dist/user.d.ts.map +1 -0
  123. package/dist/user.js +144 -0
  124. package/dist/user.js.map +1 -0
  125. package/package.json +48 -0
  126. package/src/adapter-context.ts +72 -0
  127. package/src/adapters/__tests__/adapter-tests.ts +254 -0
  128. package/src/adapters/__tests__/filesystem-adapter.test.ts +48 -0
  129. package/src/adapters/__tests__/mongodb-adapter.test.ts +64 -0
  130. package/src/adapters/__tests__/postgres-adapter.test.ts +62 -0
  131. package/src/adapters/__tests__/sqlite-adapter.test.ts +103 -0
  132. package/src/adapters/__tests__/test-fs-adapter.json +4 -0
  133. package/src/adapters/adapter.ts +72 -0
  134. package/src/adapters/filesystem-adapter.ts +153 -0
  135. package/src/adapters/index.ts +5 -0
  136. package/src/adapters/mongodb-adapter.ts +208 -0
  137. package/src/adapters/postgres-adapter.ts +261 -0
  138. package/src/adapters/sqlite-adapter.ts +284 -0
  139. package/src/auth.ts +239 -0
  140. package/src/client-jwt.test.ts +137 -0
  141. package/src/client-jwt.ts +67 -0
  142. package/src/client-store.test.ts +149 -0
  143. package/src/client-store.ts +144 -0
  144. package/src/cors.test.ts +175 -0
  145. package/src/cors.ts +115 -0
  146. package/src/csrf.test.ts +226 -0
  147. package/src/csrf.ts +126 -0
  148. package/src/db.ts +57 -0
  149. package/src/index.ts +143 -0
  150. package/src/input-validation.test.ts +347 -0
  151. package/src/input-validation.ts +307 -0
  152. package/src/integration.test.ts +322 -0
  153. package/src/oauth-callback.test.ts +282 -0
  154. package/src/oauth-callback.ts +323 -0
  155. package/src/oauth-providers.ts +232 -0
  156. package/src/oauth-types.ts +82 -0
  157. package/src/password.test.ts +89 -0
  158. package/src/password.ts +62 -0
  159. package/src/providers/github-oauth.test.ts +290 -0
  160. package/src/providers/github-oauth.ts +226 -0
  161. package/src/providers/google-oauth.test.ts +240 -0
  162. package/src/providers/google-oauth.ts +166 -0
  163. package/src/providers/oidc-oauth.test.ts +367 -0
  164. package/src/providers/oidc-oauth.ts +302 -0
  165. package/src/rate-limit.test.ts +308 -0
  166. package/src/rate-limit.ts +118 -0
  167. package/src/rate-limiting.test.ts +390 -0
  168. package/src/rate-limiting.ts +275 -0
  169. package/src/security-headers.test.ts +242 -0
  170. package/src/security-headers.ts +160 -0
  171. package/src/security-penetration.test.ts +705 -0
  172. package/src/session.ts +42 -0
  173. package/src/sql-injection-prevention.test.ts +337 -0
  174. package/src/sql-injection-prevention.ts +272 -0
  175. package/src/token.test.ts +67 -0
  176. package/src/token.ts +34 -0
  177. package/src/types.ts +87 -0
  178. package/src/user.ts +165 -0
@@ -0,0 +1,19 @@
1
+ import type { DatabaseAdapter } from './adapters/adapter';
2
+ /**
3
+ * Initialize the database adapter
4
+ * Must be called before any auth operations
5
+ */
6
+ export declare function initializeAdapter(adapter: DatabaseAdapter): Promise<void>;
7
+ /**
8
+ * Initialize with the default FileSystem adapter
9
+ */
10
+ export declare function initializeDefaultAdapter(dbPath?: string): Promise<void>;
11
+ /**
12
+ * Get the current adapter
13
+ */
14
+ export declare function getAdapter(): DatabaseAdapter;
15
+ /**
16
+ * Close the current adapter
17
+ */
18
+ export declare function closeAdapter(): Promise<void>;
19
+ //# sourceMappingURL=adapter-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter-context.d.ts","sourceRoot":"","sources":["../src/adapter-context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAyC1D;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAG/E;AAED;;GAEG;AACH,wBAAsB,wBAAwB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAG7E;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,eAAe,CAE5C;AAED;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAGlD"}
@@ -0,0 +1,68 @@
1
+ import { FileSystemAdapter } from './adapters/filesystem-adapter';
2
+ /**
3
+ * Global adapter context
4
+ * Manages the active database adapter instance
5
+ */
6
+ class AdapterContext {
7
+ constructor() {
8
+ Object.defineProperty(this, "adapter", {
9
+ enumerable: true,
10
+ configurable: true,
11
+ writable: true,
12
+ value: null
13
+ });
14
+ }
15
+ /**
16
+ * Set the database adapter
17
+ */
18
+ setAdapter(adapter) {
19
+ this.adapter = adapter;
20
+ }
21
+ /**
22
+ * Get the current database adapter
23
+ * Throws if no adapter is set
24
+ */
25
+ getAdapter() {
26
+ if (!this.adapter) {
27
+ throw new Error('Database adapter not initialized. Call initializeAdapter() first.');
28
+ }
29
+ return this.adapter;
30
+ }
31
+ /**
32
+ * Check if adapter is initialized
33
+ */
34
+ isInitialized() {
35
+ return this.adapter !== null;
36
+ }
37
+ }
38
+ // Global singleton instance
39
+ const context = new AdapterContext();
40
+ /**
41
+ * Initialize the database adapter
42
+ * Must be called before any auth operations
43
+ */
44
+ export async function initializeAdapter(adapter) {
45
+ context.setAdapter(adapter);
46
+ await adapter.initialize();
47
+ }
48
+ /**
49
+ * Initialize with the default FileSystem adapter
50
+ */
51
+ export async function initializeDefaultAdapter(dbPath) {
52
+ const adapter = new FileSystemAdapter(dbPath);
53
+ await initializeAdapter(adapter);
54
+ }
55
+ /**
56
+ * Get the current adapter
57
+ */
58
+ export function getAdapter() {
59
+ return context.getAdapter();
60
+ }
61
+ /**
62
+ * Close the current adapter
63
+ */
64
+ export async function closeAdapter() {
65
+ const adapter = context.getAdapter();
66
+ await adapter.close();
67
+ }
68
+ //# sourceMappingURL=adapter-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter-context.js","sourceRoot":"","sources":["../src/adapter-context.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAElE;;;GAGG;AACH,MAAM,cAAc;IAApB;QACS;;;;mBAAkC,IAAI;WAAC;IA4BhD,CAAC;IA1BA;;OAEG;IACH,UAAU,CAAC,OAAwB;QAClC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACxB,CAAC;IAED;;;OAGG;IACH,UAAU;QACT,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CACd,mEAAmE,CACnE,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAC;IACrB,CAAC;IAED;;OAEG;IACH,aAAa;QACZ,OAAO,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC;IAC9B,CAAC;CACD;AAED,4BAA4B;AAC5B,MAAM,OAAO,GAAG,IAAI,cAAc,EAAE,CAAC;AAErC;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,OAAwB;IAC/D,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAC5B,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;AAC5B,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,MAAe;IAC7D,MAAM,OAAO,GAAG,IAAI,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC9C,MAAM,iBAAiB,CAAC,OAAO,CAAC,CAAC;AAClC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU;IACzB,OAAO,OAAO,CAAC,UAAU,EAAE,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY;IACjC,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IACrC,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;AACvB,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { DatabaseAdapter } from '../adapter';
2
+ /**
3
+ * Shared test suite for database adapters
4
+ * Can be used to test any implementation of DatabaseAdapter
5
+ */
6
+ export declare function createAdapterTestSuite(name: string, createAdapter: () => DatabaseAdapter): void;
7
+ //# sourceMappingURL=adapter-tests.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter-tests.d.ts","sourceRoot":"","sources":["../../../src/adapters/__tests__/adapter-tests.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAGlD;;;GAGG;AACH,wBAAgB,sBAAsB,CACrC,IAAI,EAAE,MAAM,EACZ,aAAa,EAAE,MAAM,eAAe,QAmPpC"}
@@ -0,0 +1,206 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
+ /**
3
+ * Shared test suite for database adapters
4
+ * Can be used to test any implementation of DatabaseAdapter
5
+ */
6
+ export function createAdapterTestSuite(name, createAdapter) {
7
+ describe(`${name} Adapter Tests`, () => {
8
+ let adapter;
9
+ beforeEach(async () => {
10
+ adapter = createAdapter();
11
+ await adapter.initialize();
12
+ });
13
+ afterEach(async () => {
14
+ await adapter.close();
15
+ });
16
+ describe('User Operations', () => {
17
+ it('should create a user', async () => {
18
+ const user = {
19
+ id: 'user-1',
20
+ email: 'test@example.com',
21
+ passwordHash: 'hashed-password',
22
+ emailVerified: false,
23
+ createdAt: Date.now(),
24
+ updatedAt: Date.now()
25
+ };
26
+ await adapter.createUser(user);
27
+ const retrieved = await adapter.getUserById('user-1');
28
+ expect(retrieved).toBeDefined();
29
+ expect(retrieved?.email).toBe('test@example.com');
30
+ });
31
+ it('should get user by email', async () => {
32
+ const user = {
33
+ id: 'user-2',
34
+ email: 'test2@example.com',
35
+ passwordHash: 'hashed-password',
36
+ emailVerified: false,
37
+ createdAt: Date.now(),
38
+ updatedAt: Date.now()
39
+ };
40
+ await adapter.createUser(user);
41
+ const retrieved = await adapter.getUserByEmail('test2@example.com');
42
+ expect(retrieved).toBeDefined();
43
+ expect(retrieved?.id).toBe('user-2');
44
+ });
45
+ it('should return null for non-existent user', async () => {
46
+ const user = await adapter.getUserById('non-existent');
47
+ expect(user).toBeNull();
48
+ });
49
+ it('should update user', async () => {
50
+ const user = {
51
+ id: 'user-3',
52
+ email: 'test3@example.com',
53
+ passwordHash: 'hashed-password',
54
+ emailVerified: false,
55
+ createdAt: Date.now(),
56
+ updatedAt: Date.now()
57
+ };
58
+ await adapter.createUser(user);
59
+ await adapter.updateUser('user-3', {
60
+ emailVerified: true,
61
+ passwordHash: 'new-hashed-password'
62
+ });
63
+ const updated = await adapter.getUserById('user-3');
64
+ expect(updated?.emailVerified).toBe(true);
65
+ expect(updated?.passwordHash).toBe('new-hashed-password');
66
+ });
67
+ it('should get all users', async () => {
68
+ const user1 = {
69
+ id: 'user-4',
70
+ email: 'test4@example.com',
71
+ passwordHash: 'hashed-password',
72
+ emailVerified: false,
73
+ createdAt: Date.now(),
74
+ updatedAt: Date.now()
75
+ };
76
+ const user2 = {
77
+ id: 'user-5',
78
+ email: 'test5@example.com',
79
+ passwordHash: 'hashed-password',
80
+ emailVerified: false,
81
+ createdAt: Date.now(),
82
+ updatedAt: Date.now()
83
+ };
84
+ await adapter.createUser(user1);
85
+ await adapter.createUser(user2);
86
+ const users = await adapter.getAllUsers();
87
+ expect(users.length).toBeGreaterThanOrEqual(2);
88
+ });
89
+ });
90
+ describe('Session Operations', () => {
91
+ it('should create a session', async () => {
92
+ const session = {
93
+ userId: 'user-1',
94
+ email: 'test@example.com',
95
+ createdAt: Date.now(),
96
+ expiresAt: Date.now() + 7 * 24 * 60 * 60 * 1000
97
+ };
98
+ await adapter.createSession('session-1', session);
99
+ const retrieved = await adapter.getSession('session-1');
100
+ expect(retrieved).toBeDefined();
101
+ expect(retrieved?.userId).toBe('user-1');
102
+ expect(retrieved?.email).toBe('test@example.com');
103
+ });
104
+ it('should return null for non-existent session', async () => {
105
+ const session = await adapter.getSession('non-existent');
106
+ expect(session).toBeNull();
107
+ });
108
+ it('should return null for expired session', async () => {
109
+ const now = Date.now();
110
+ const expiredSession = {
111
+ userId: 'user-1',
112
+ email: 'test@example.com',
113
+ createdAt: now - 1000,
114
+ expiresAt: now - 100 // Expired 100ms ago
115
+ };
116
+ await adapter.createSession('expired-session', expiredSession);
117
+ const retrieved = await adapter.getSession('expired-session');
118
+ expect(retrieved).toBeNull();
119
+ });
120
+ it('should delete session', async () => {
121
+ const session = {
122
+ userId: 'user-1',
123
+ email: 'test@example.com',
124
+ createdAt: Date.now(),
125
+ expiresAt: Date.now() + 7 * 24 * 60 * 60 * 1000
126
+ };
127
+ await adapter.createSession('session-to-delete', session);
128
+ await adapter.deleteSession('session-to-delete');
129
+ const retrieved = await adapter.getSession('session-to-delete');
130
+ expect(retrieved).toBeNull();
131
+ });
132
+ it('should delete expired sessions', async () => {
133
+ const now = Date.now();
134
+ const expiredSession1 = {
135
+ userId: 'user-1',
136
+ email: 'test@example.com',
137
+ createdAt: now - 2000,
138
+ expiresAt: now - 1000
139
+ };
140
+ const expiredSession2 = {
141
+ userId: 'user-2',
142
+ email: 'test2@example.com',
143
+ createdAt: now - 2000,
144
+ expiresAt: now - 500
145
+ };
146
+ const validSession = {
147
+ userId: 'user-3',
148
+ email: 'test3@example.com',
149
+ createdAt: now,
150
+ expiresAt: now + 7 * 24 * 60 * 60 * 1000
151
+ };
152
+ await adapter.createSession('expired-1', expiredSession1);
153
+ await adapter.createSession('expired-2', expiredSession2);
154
+ await adapter.createSession('valid', validSession);
155
+ const deletedCount = await adapter.deleteExpiredSessions();
156
+ expect(deletedCount).toBeGreaterThanOrEqual(2);
157
+ const valid = await adapter.getSession('valid');
158
+ expect(valid).toBeDefined();
159
+ });
160
+ it('should get all sessions', async () => {
161
+ const session1 = {
162
+ userId: 'user-1',
163
+ email: 'test@example.com',
164
+ createdAt: Date.now(),
165
+ expiresAt: Date.now() + 7 * 24 * 60 * 60 * 1000
166
+ };
167
+ const session2 = {
168
+ userId: 'user-2',
169
+ email: 'test2@example.com',
170
+ createdAt: Date.now(),
171
+ expiresAt: Date.now() + 7 * 24 * 60 * 60 * 1000
172
+ };
173
+ await adapter.createSession('session-all-1', session1);
174
+ await adapter.createSession('session-all-2', session2);
175
+ const sessions = await adapter.getAllSessions();
176
+ expect(sessions.length).toBeGreaterThanOrEqual(2);
177
+ });
178
+ });
179
+ describe('Data Clearing', () => {
180
+ it('should clear all data', async () => {
181
+ const user = {
182
+ id: 'user-clear',
183
+ email: 'clear@example.com',
184
+ passwordHash: 'hashed-password',
185
+ emailVerified: false,
186
+ createdAt: Date.now(),
187
+ updatedAt: Date.now()
188
+ };
189
+ const session = {
190
+ userId: 'user-clear',
191
+ email: 'clear@example.com',
192
+ createdAt: Date.now(),
193
+ expiresAt: Date.now() + 7 * 24 * 60 * 60 * 1000
194
+ };
195
+ await adapter.createUser(user);
196
+ await adapter.createSession('session-clear', session);
197
+ await adapter.clear();
198
+ const users = await adapter.getAllUsers();
199
+ const sessions = await adapter.getAllSessions();
200
+ expect(users.length).toBe(0);
201
+ expect(sessions.length).toBe(0);
202
+ });
203
+ });
204
+ });
205
+ }
206
+ //# sourceMappingURL=adapter-tests.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter-tests.js","sourceRoot":"","sources":["../../../src/adapters/__tests__/adapter-tests.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ import type { User, Session } from '../types';
2
+ /**
3
+ * Database adapter interface
4
+ * Defines the contract that all database adapters must implement
5
+ */
6
+ export interface DatabaseAdapter {
7
+ /**
8
+ * Initialize the database connection and schema
9
+ */
10
+ initialize(): Promise<void>;
11
+ /**
12
+ * Close the database connection
13
+ */
14
+ close(): Promise<void>;
15
+ /**
16
+ * Create a new user
17
+ */
18
+ createUser(user: User): Promise<void>;
19
+ /**
20
+ * Get user by ID
21
+ */
22
+ getUserById(id: string): Promise<User | null>;
23
+ /**
24
+ * Get user by email
25
+ */
26
+ getUserByEmail(email: string): Promise<User | null>;
27
+ /**
28
+ * Update user
29
+ */
30
+ updateUser(id: string, updates: Partial<User>): Promise<void>;
31
+ /**
32
+ * Create a new session
33
+ */
34
+ createSession(sessionId: string, session: Session): Promise<void>;
35
+ /**
36
+ * Get session by ID
37
+ */
38
+ getSession(sessionId: string): Promise<Session | null>;
39
+ /**
40
+ * Delete session
41
+ */
42
+ deleteSession(sessionId: string): Promise<void>;
43
+ /**
44
+ * Delete all expired sessions
45
+ */
46
+ deleteExpiredSessions(): Promise<number>;
47
+ /**
48
+ * Get all users (for testing/admin purposes)
49
+ */
50
+ getAllUsers(): Promise<User[]>;
51
+ /**
52
+ * Get all sessions (for testing/admin purposes)
53
+ */
54
+ getAllSessions(): Promise<Session[]>;
55
+ /**
56
+ * Clear all data (for testing)
57
+ */
58
+ clear(): Promise<void>;
59
+ }
60
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAE9C;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC/B;;OAEG;IACH,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAE5B;;OAEG;IACH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvB;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtC;;OAEG;IACH,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IAE9C;;OAEG;IACH,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IAEpD;;OAEG;IACH,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE9D;;OAEG;IACH,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAElE;;OAEG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IAEvD;;OAEG;IACH,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEhD;;OAEG;IACH,qBAAqB,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAEzC;;OAEG;IACH,WAAW,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAE/B;;OAEG;IACH,cAAc,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAErC;;OAEG;IACH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../src/adapters/adapter.ts"],"names":[],"mappings":""}
@@ -0,0 +1,26 @@
1
+ import type { User, Session } from '../types';
2
+ import type { DatabaseAdapter } from './adapter';
3
+ /**
4
+ * File system adapter - JSON file-based storage
5
+ * Useful for development and testing
6
+ */
7
+ export declare class FileSystemAdapter implements DatabaseAdapter {
8
+ private dbPath;
9
+ private store;
10
+ constructor(dbPath?: string);
11
+ initialize(): Promise<void>;
12
+ close(): Promise<void>;
13
+ createUser(user: User): Promise<void>;
14
+ getUserById(id: string): Promise<User | null>;
15
+ getUserByEmail(email: string): Promise<User | null>;
16
+ updateUser(id: string, updates: Partial<User>): Promise<void>;
17
+ createSession(sessionId: string, session: Session): Promise<void>;
18
+ getSession(sessionId: string): Promise<Session | null>;
19
+ deleteSession(sessionId: string): Promise<void>;
20
+ deleteExpiredSessions(): Promise<number>;
21
+ getAllUsers(): Promise<User[]>;
22
+ getAllSessions(): Promise<Session[]>;
23
+ clear(): Promise<void>;
24
+ private save;
25
+ }
26
+ //# sourceMappingURL=filesystem-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filesystem-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/filesystem-adapter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAOjD;;;GAGG;AACH,qBAAa,iBAAkB,YAAW,eAAe;IACxD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAA8B;gBAE/B,MAAM,CAAC,EAAE,MAAM;IAIrB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAqB3B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAOtB,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAMrC,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAK7C,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAOnD,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAS7D,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAMjE,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAWtD,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM/C,qBAAqB,IAAI,OAAO,CAAC,MAAM,CAAC;IAmBxC,WAAW,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;IAK9B,cAAc,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAKpC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAS5B,OAAO,CAAC,IAAI;CAcZ"}
@@ -0,0 +1,148 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ /**
4
+ * File system adapter - JSON file-based storage
5
+ * Useful for development and testing
6
+ */
7
+ export class FileSystemAdapter {
8
+ constructor(dbPath) {
9
+ Object.defineProperty(this, "dbPath", {
10
+ enumerable: true,
11
+ configurable: true,
12
+ writable: true,
13
+ value: void 0
14
+ });
15
+ Object.defineProperty(this, "store", {
16
+ enumerable: true,
17
+ configurable: true,
18
+ writable: true,
19
+ value: null
20
+ });
21
+ this.dbPath = dbPath || path.join(process.cwd(), 'auth.json');
22
+ }
23
+ async initialize() {
24
+ try {
25
+ if (fs.existsSync(this.dbPath)) {
26
+ const data = fs.readFileSync(this.dbPath, 'utf-8');
27
+ this.store = JSON.parse(data);
28
+ }
29
+ else {
30
+ this.store = {
31
+ users: {},
32
+ sessions: {}
33
+ };
34
+ this.save();
35
+ }
36
+ }
37
+ catch (error) {
38
+ console.error('Failed to initialize filesystem adapter:', error);
39
+ this.store = {
40
+ users: {},
41
+ sessions: {}
42
+ };
43
+ }
44
+ }
45
+ async close() {
46
+ if (this.store) {
47
+ this.save();
48
+ this.store = null;
49
+ }
50
+ }
51
+ async createUser(user) {
52
+ if (!this.store)
53
+ throw new Error('Database not initialized');
54
+ this.store.users[user.id] = user;
55
+ this.save();
56
+ }
57
+ async getUserById(id) {
58
+ if (!this.store)
59
+ throw new Error('Database not initialized');
60
+ return this.store.users[id] || null;
61
+ }
62
+ async getUserByEmail(email) {
63
+ if (!this.store)
64
+ throw new Error('Database not initialized');
65
+ return (Object.values(this.store.users).find((u) => u.email === email) || null);
66
+ }
67
+ async updateUser(id, updates) {
68
+ if (!this.store)
69
+ throw new Error('Database not initialized');
70
+ const user = this.store.users[id];
71
+ if (!user)
72
+ throw new Error('User not found');
73
+ this.store.users[id] = { ...user, ...updates };
74
+ this.save();
75
+ }
76
+ async createSession(sessionId, session) {
77
+ if (!this.store)
78
+ throw new Error('Database not initialized');
79
+ this.store.sessions[sessionId] = session;
80
+ this.save();
81
+ }
82
+ async getSession(sessionId) {
83
+ if (!this.store)
84
+ throw new Error('Database not initialized');
85
+ const session = this.store.sessions[sessionId];
86
+ if (!session || session.expiresAt < Date.now()) {
87
+ return null;
88
+ }
89
+ return session;
90
+ }
91
+ async deleteSession(sessionId) {
92
+ if (!this.store)
93
+ throw new Error('Database not initialized');
94
+ delete this.store.sessions[sessionId];
95
+ this.save();
96
+ }
97
+ async deleteExpiredSessions() {
98
+ if (!this.store)
99
+ throw new Error('Database not initialized');
100
+ const now = Date.now();
101
+ let count = 0;
102
+ for (const [sessionId, session] of Object.entries(this.store.sessions)) {
103
+ if (session.expiresAt < now) {
104
+ delete this.store.sessions[sessionId];
105
+ count++;
106
+ }
107
+ }
108
+ if (count > 0) {
109
+ this.save();
110
+ }
111
+ return count;
112
+ }
113
+ async getAllUsers() {
114
+ if (!this.store)
115
+ throw new Error('Database not initialized');
116
+ return Object.values(this.store.users);
117
+ }
118
+ async getAllSessions() {
119
+ if (!this.store)
120
+ throw new Error('Database not initialized');
121
+ return Object.values(this.store.sessions);
122
+ }
123
+ async clear() {
124
+ if (!this.store)
125
+ throw new Error('Database not initialized');
126
+ this.store = {
127
+ users: {},
128
+ sessions: {}
129
+ };
130
+ this.save();
131
+ }
132
+ save() {
133
+ if (this.store && this.dbPath) {
134
+ try {
135
+ const dir = path.dirname(this.dbPath);
136
+ if (!fs.existsSync(dir)) {
137
+ fs.mkdirSync(dir, { recursive: true });
138
+ }
139
+ fs.writeFileSync(this.dbPath, JSON.stringify(this.store, null, 2), 'utf-8');
140
+ }
141
+ catch (error) {
142
+ console.error('Failed to save database:', error);
143
+ throw error;
144
+ }
145
+ }
146
+ }
147
+ }
148
+ //# sourceMappingURL=filesystem-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filesystem-adapter.js","sourceRoot":"","sources":["../../src/adapters/filesystem-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export type { DatabaseAdapter } from './adapter';
2
+ export { FileSystemAdapter } from './filesystem-adapter';
3
+ export { PostgresAdapter } from './postgres-adapter';
4
+ export { MongoDBAdapter } from './mongodb-adapter';
5
+ export { SqliteAdapter } from './sqlite-adapter';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { FileSystemAdapter } from './filesystem-adapter';
2
+ export { PostgresAdapter } from './postgres-adapter';
3
+ export { MongoDBAdapter } from './mongodb-adapter';
4
+ export { SqliteAdapter } from './sqlite-adapter';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,27 @@
1
+ import type { User, Session } from '../types';
2
+ import type { DatabaseAdapter } from './adapter';
3
+ /**
4
+ * MongoDB adapter
5
+ * Requires a MongoDB instance (local or MongoDB Atlas)
6
+ */
7
+ export declare class MongoDBAdapter implements DatabaseAdapter {
8
+ private client;
9
+ private db;
10
+ private usersCollection;
11
+ private sessionsCollection;
12
+ constructor(connectionUri?: string);
13
+ initialize(): Promise<void>;
14
+ close(): Promise<void>;
15
+ createUser(user: User): Promise<void>;
16
+ getUserById(id: string): Promise<User | null>;
17
+ getUserByEmail(email: string): Promise<User | null>;
18
+ updateUser(id: string, updates: Partial<User>): Promise<void>;
19
+ createSession(sessionId: string, session: Session): Promise<void>;
20
+ getSession(sessionId: string): Promise<Session | null>;
21
+ deleteSession(sessionId: string): Promise<void>;
22
+ deleteExpiredSessions(): Promise<number>;
23
+ getAllUsers(): Promise<User[]>;
24
+ getAllSessions(): Promise<Session[]>;
25
+ clear(): Promise<void>;
26
+ }
27
+ //# sourceMappingURL=mongodb-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mongodb-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/mongodb-adapter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAEjD;;;GAGG;AACH,qBAAa,cAAe,YAAW,eAAe;IACrD,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,EAAE,CAAmB;IAC7B,OAAO,CAAC,eAAe,CAAiC;IACxD,OAAO,CAAC,kBAAkB,CAAoC;gBAElD,aAAa,CAAC,EAAE,MAAM;IAK5B,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAiC3B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAYtB,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAWrC,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAY7C,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAYnD,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAkB7D,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAWjE,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAiBtD,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAW/C,qBAAqB,IAAI,OAAO,CAAC,MAAM,CAAC;IAcxC,WAAW,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;IAY9B,cAAc,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAYpC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAa5B"}