@veloxts/auth 0.3.3 → 0.3.4

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 (54) hide show
  1. package/README.md +755 -30
  2. package/dist/adapter.d.ts +710 -0
  3. package/dist/adapter.d.ts.map +1 -0
  4. package/dist/adapter.js +581 -0
  5. package/dist/adapter.js.map +1 -0
  6. package/dist/adapters/better-auth.d.ts +271 -0
  7. package/dist/adapters/better-auth.d.ts.map +1 -0
  8. package/dist/adapters/better-auth.js +341 -0
  9. package/dist/adapters/better-auth.js.map +1 -0
  10. package/dist/adapters/index.d.ts +28 -0
  11. package/dist/adapters/index.d.ts.map +1 -0
  12. package/dist/adapters/index.js +28 -0
  13. package/dist/adapters/index.js.map +1 -0
  14. package/dist/csrf.d.ts +294 -0
  15. package/dist/csrf.d.ts.map +1 -0
  16. package/dist/csrf.js +396 -0
  17. package/dist/csrf.js.map +1 -0
  18. package/dist/guards.d.ts +139 -0
  19. package/dist/guards.d.ts.map +1 -0
  20. package/dist/guards.js +247 -0
  21. package/dist/guards.js.map +1 -0
  22. package/dist/hash.d.ts +85 -0
  23. package/dist/hash.d.ts.map +1 -0
  24. package/dist/hash.js +220 -0
  25. package/dist/hash.js.map +1 -0
  26. package/dist/index.d.ts +25 -32
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +63 -36
  29. package/dist/index.js.map +1 -1
  30. package/dist/jwt.d.ts +128 -0
  31. package/dist/jwt.d.ts.map +1 -0
  32. package/dist/jwt.js +363 -0
  33. package/dist/jwt.js.map +1 -0
  34. package/dist/middleware.d.ts +87 -0
  35. package/dist/middleware.d.ts.map +1 -0
  36. package/dist/middleware.js +241 -0
  37. package/dist/middleware.js.map +1 -0
  38. package/dist/plugin.d.ts +107 -0
  39. package/dist/plugin.d.ts.map +1 -0
  40. package/dist/plugin.js +174 -0
  41. package/dist/plugin.js.map +1 -0
  42. package/dist/policies.d.ts +137 -0
  43. package/dist/policies.d.ts.map +1 -0
  44. package/dist/policies.js +240 -0
  45. package/dist/policies.js.map +1 -0
  46. package/dist/session.d.ts +494 -0
  47. package/dist/session.d.ts.map +1 -0
  48. package/dist/session.js +795 -0
  49. package/dist/session.js.map +1 -0
  50. package/dist/types.d.ts +251 -0
  51. package/dist/types.d.ts.map +1 -0
  52. package/dist/types.js +33 -0
  53. package/dist/types.js.map +1 -0
  54. package/package.json +38 -7
package/dist/hash.js ADDED
@@ -0,0 +1,220 @@
1
+ /**
2
+ * Password hashing utilities for @veloxts/auth
3
+ * @module auth/hash
4
+ */
5
+ import { randomBytes, scrypt, timingSafeEqual } from 'node:crypto';
6
+ import { promisify } from 'node:util';
7
+ const scryptAsync = promisify(scrypt);
8
+ // ============================================================================
9
+ // Constants
10
+ // ============================================================================
11
+ const DEFAULT_BCRYPT_ROUNDS = 12;
12
+ const DEFAULT_ARGON2_MEMORY_COST = 65536; // 64 MB
13
+ const DEFAULT_ARGON2_TIME_COST = 3;
14
+ const DEFAULT_ARGON2_PARALLELISM = 4;
15
+ // ============================================================================
16
+ // Password Hasher Class
17
+ // ============================================================================
18
+ /**
19
+ * Password hasher with configurable algorithms
20
+ *
21
+ * Supports bcrypt and argon2 algorithms. Falls back to scrypt-based
22
+ * implementation when native modules are not available.
23
+ *
24
+ * @example
25
+ * ```typescript
26
+ * const hasher = new PasswordHasher({ algorithm: 'bcrypt', bcryptRounds: 12 });
27
+ *
28
+ * // Hash a password
29
+ * const hash = await hasher.hash('mypassword123');
30
+ *
31
+ * // Verify a password
32
+ * const isValid = await hasher.verify('mypassword123', hash);
33
+ * ```
34
+ */
35
+ export class PasswordHasher {
36
+ config;
37
+ bcrypt = null;
38
+ argon2 = null;
39
+ constructor(config = {}) {
40
+ this.config = {
41
+ algorithm: config.algorithm ?? 'bcrypt',
42
+ bcryptRounds: config.bcryptRounds ?? DEFAULT_BCRYPT_ROUNDS,
43
+ argon2MemoryCost: config.argon2MemoryCost ?? DEFAULT_ARGON2_MEMORY_COST,
44
+ argon2TimeCost: config.argon2TimeCost ?? DEFAULT_ARGON2_TIME_COST,
45
+ argon2Parallelism: config.argon2Parallelism ?? DEFAULT_ARGON2_PARALLELISM,
46
+ };
47
+ }
48
+ /**
49
+ * Lazily load bcrypt module
50
+ */
51
+ async loadBcrypt() {
52
+ if (!this.bcrypt) {
53
+ try {
54
+ this.bcrypt = await import('bcrypt');
55
+ }
56
+ catch {
57
+ throw new Error('bcrypt module not found. Install it with: pnpm add bcrypt && pnpm add -D @types/bcrypt');
58
+ }
59
+ }
60
+ return this.bcrypt;
61
+ }
62
+ /**
63
+ * Lazily load argon2 module
64
+ */
65
+ async loadArgon2() {
66
+ if (!this.argon2) {
67
+ try {
68
+ this.argon2 = await import('argon2');
69
+ }
70
+ catch {
71
+ throw new Error('argon2 module not found. Install it with: pnpm add argon2');
72
+ }
73
+ }
74
+ return this.argon2;
75
+ }
76
+ /**
77
+ * Hash a password using the configured algorithm
78
+ */
79
+ async hash(password) {
80
+ if (this.config.algorithm === 'argon2') {
81
+ return this.hashWithArgon2(password);
82
+ }
83
+ return this.hashWithBcrypt(password);
84
+ }
85
+ /**
86
+ * Verify a password against a hash
87
+ */
88
+ async verify(password, hash) {
89
+ // Detect hash type from format
90
+ if (hash.startsWith('$argon2')) {
91
+ return this.verifyWithArgon2(password, hash);
92
+ }
93
+ if (hash.startsWith('$2')) {
94
+ return this.verifyWithBcrypt(password, hash);
95
+ }
96
+ if (hash.startsWith('$scrypt$')) {
97
+ return this.verifyWithScrypt(password, hash);
98
+ }
99
+ throw new Error('Unknown hash format');
100
+ }
101
+ /**
102
+ * Hash using bcrypt
103
+ */
104
+ async hashWithBcrypt(password) {
105
+ try {
106
+ const bcrypt = await this.loadBcrypt();
107
+ return bcrypt.hash(password, this.config.bcryptRounds);
108
+ }
109
+ catch (error) {
110
+ // Fallback to scrypt if bcrypt fails
111
+ if (error.message.includes('not found')) {
112
+ console.warn('bcrypt not available, falling back to scrypt');
113
+ return this.hashWithScrypt(password);
114
+ }
115
+ throw error;
116
+ }
117
+ }
118
+ /**
119
+ * Verify using bcrypt
120
+ */
121
+ async verifyWithBcrypt(password, hash) {
122
+ const bcrypt = await this.loadBcrypt();
123
+ return bcrypt.compare(password, hash);
124
+ }
125
+ /**
126
+ * Hash using argon2
127
+ */
128
+ async hashWithArgon2(password) {
129
+ try {
130
+ const argon2 = await this.loadArgon2();
131
+ return argon2.hash(password, {
132
+ memoryCost: this.config.argon2MemoryCost,
133
+ timeCost: this.config.argon2TimeCost,
134
+ parallelism: this.config.argon2Parallelism,
135
+ type: 2, // argon2id
136
+ });
137
+ }
138
+ catch (error) {
139
+ // Fallback to scrypt if argon2 fails
140
+ if (error.message.includes('not found')) {
141
+ console.warn('argon2 not available, falling back to scrypt');
142
+ return this.hashWithScrypt(password);
143
+ }
144
+ throw error;
145
+ }
146
+ }
147
+ /**
148
+ * Verify using argon2
149
+ */
150
+ async verifyWithArgon2(password, hash) {
151
+ const argon2 = await this.loadArgon2();
152
+ return argon2.verify(hash, password);
153
+ }
154
+ /**
155
+ * Hash using Node.js built-in scrypt (fallback)
156
+ */
157
+ async hashWithScrypt(password) {
158
+ const salt = randomBytes(32);
159
+ const derivedKey = (await scryptAsync(password, salt, 64));
160
+ return `$scrypt$${salt.toString('hex')}$${derivedKey.toString('hex')}`;
161
+ }
162
+ /**
163
+ * Verify using scrypt
164
+ */
165
+ async verifyWithScrypt(password, hash) {
166
+ const parts = hash.split('$');
167
+ if (parts.length !== 4 || parts[1] !== 'scrypt') {
168
+ throw new Error('Invalid scrypt hash format');
169
+ }
170
+ const salt = Buffer.from(parts[2], 'hex');
171
+ const storedKey = Buffer.from(parts[3], 'hex');
172
+ const derivedKey = (await scryptAsync(password, salt, 64));
173
+ return timingSafeEqual(storedKey, derivedKey);
174
+ }
175
+ /**
176
+ * Check if a hash needs rehashing (algorithm or cost changed)
177
+ */
178
+ needsRehash(hash) {
179
+ // If using argon2 but hash is bcrypt/scrypt, rehash
180
+ if (this.config.algorithm === 'argon2' && !hash.startsWith('$argon2')) {
181
+ return true;
182
+ }
183
+ // If using bcrypt but hash is argon2/scrypt, rehash
184
+ if (this.config.algorithm === 'bcrypt' && !hash.startsWith('$2')) {
185
+ return true;
186
+ }
187
+ // TODO: Check bcrypt rounds from hash and compare
188
+ // bcrypt hashes include rounds in format: $2b$XX$...
189
+ return false;
190
+ }
191
+ }
192
+ /**
193
+ * Creates a new password hasher instance
194
+ */
195
+ export function createPasswordHasher(config) {
196
+ return new PasswordHasher(config);
197
+ }
198
+ /**
199
+ * Default password hasher instance (bcrypt, 12 rounds)
200
+ */
201
+ let defaultHasher = null;
202
+ /**
203
+ * Hash a password using the default hasher
204
+ */
205
+ export async function hashPassword(password) {
206
+ if (!defaultHasher) {
207
+ defaultHasher = new PasswordHasher();
208
+ }
209
+ return defaultHasher.hash(password);
210
+ }
211
+ /**
212
+ * Verify a password using the default hasher
213
+ */
214
+ export async function verifyPassword(password, hash) {
215
+ if (!defaultHasher) {
216
+ defaultHasher = new PasswordHasher();
217
+ }
218
+ return defaultHasher.verify(password, hash);
219
+ }
220
+ //# sourceMappingURL=hash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash.js","sourceRoot":"","sources":["../src/hash.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,40 +1,33 @@
1
1
  /**
2
2
  * @veloxts/auth - Authentication and authorization system
3
3
  *
4
- * Provides authentication middleware, session management, and authorization
5
- * guards for VeloxTS applications. Deferred to v1.1+ release.
4
+ * Provides JWT authentication, password hashing, authorization guards,
5
+ * resource policies, and rate limiting for VeloxTS applications.
6
6
  *
7
- * @note This package is a placeholder for MVP (v0.1.0)
7
+ * @packageDocumentation
8
+ * @module @veloxts/auth
8
9
  */
9
- /** Auth package version */
10
- export declare const AUTH_VERSION: string;
10
+ export { AUTH_VERSION } from './plugin.js';
11
+ export type { AuthConfig, AuthContext, AuthMiddlewareOptions, GuardDefinition, GuardFunction, HashConfig, JwtConfig,
11
12
  /**
12
- * User interface for authenticated requests
13
+ * @deprecated Use SessionConfig from session.ts for full session management
13
14
  */
14
- export interface User {
15
- id: string;
16
- email: string;
17
- [key: string]: unknown;
18
- }
19
- /**
20
- * Creates an authentication plugin for VeloxTS
21
- *
22
- * @param _config
23
- * @returns Auth plugin
24
- *
25
- * @note Full implementation coming in v1.1+
26
- */
27
- export declare function createAuth(_config?: {
28
- secret?: string;
29
- sessionStore?: unknown;
30
- }): {
31
- version: string;
32
- middleware: () => void;
33
- };
34
- /**
35
- * Authorization guard decorator (placeholder)
36
- *
37
- * @note Full implementation coming in v1.1+
38
- */
39
- export declare function guard(permissions: string[]): (target: unknown) => unknown;
15
+ LegacySessionConfig, PolicyAction, PolicyDefinition, RateLimitConfig, TokenPair, TokenPayload, User, } from './types.js';
16
+ export { AuthError } from './types.js';
17
+ export type { TokenStore } from './jwt.js';
18
+ export { createInMemoryTokenStore, createJwtManager, generateTokenId, JwtManager, parseTimeToSeconds, } from './jwt.js';
19
+ export { createPasswordHasher, hashPassword, PasswordHasher, verifyPassword, } from './hash.js';
20
+ export { allOf, anyOf, authenticated, defineGuard, emailVerified, executeGuard, executeGuards, guard, hasAnyPermission, hasPermission, hasRole, not, userCan, } from './guards.js';
21
+ export { authorize, can, cannot, clearPolicies, createAdminOnlyPolicy, createOwnerOrAdminPolicy, createPolicyBuilder, createReadOnlyPolicy, definePolicy, getPolicy, registerPolicy, } from './policies.js';
22
+ export { clearRateLimitStore, createAuthMiddleware, createRateLimitMiddleware, } from './middleware.js';
23
+ export type { AuthPluginOptions, AuthService } from './plugin.js';
24
+ export { authPlugin, createAuthPlugin } from './plugin.js';
25
+ export type { CsrfConfig, CsrfContext, CsrfCookieConfig, CsrfErrorCode, CsrfManager, CsrfMiddlewareOptions, CsrfTokenConfig, CsrfTokenData, CsrfTokenResult, CsrfValidationConfig, } from './csrf.js';
26
+ export { CsrfError, createCsrfManager, createCsrfMiddleware } from './csrf.js';
27
+ export type { Session, SessionAuthContext, SessionConfig, SessionContext, SessionCookieConfig, SessionData, SessionExpirationConfig, SessionManager, SessionMiddlewareOptions, SessionStore, StoredSession, } from './session.js';
28
+ export { createInMemorySessionStore, createSessionManager, createSessionMiddleware, isSessionAuthenticated, loginSession, logoutSession, } from './session.js';
29
+ export type { AdapterAuthContext, AdapterHttpMethod, AdapterMiddlewareOptions, AdapterRoute, AdapterSession, AdapterSessionResult, AdapterUser, AuthAdapter, AuthAdapterConfig, AuthAdapterErrorCode, AuthAdapterPluginOptions, InferAdapterConfig, } from './adapter.js';
30
+ export { AuthAdapterError, BaseAuthAdapter, createAdapterAuthMiddleware, createAuthAdapterPlugin, defineAuthAdapter, isAuthAdapter, } from './adapter.js';
31
+ export type { BetterAuthAdapterConfig, BetterAuthApi, BetterAuthHandler, BetterAuthInstance, BetterAuthSession, BetterAuthSessionResult, BetterAuthUser, } from './adapters/better-auth.js';
32
+ export { BetterAuthAdapter, createBetterAuthAdapter } from './adapters/better-auth.js';
40
33
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAQH,2BAA2B;AAC3B,eAAO,MAAM,YAAY,EAAE,MAA+C,CAAC;AAE3E;;GAEG;AACH,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,OAAO,CAAA;CAAO;;;EAOnF;AAED;;;;GAIG;AACH,wBAAgB,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,IACjC,QAAQ,OAAO,aAIxB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAM3C,YAAY,EACV,UAAU,EACV,WAAW,EACX,qBAAqB,EACrB,eAAe,EAEf,aAAa,EACb,UAAU,EAEV,SAAS;AACT;;GAEG;AACH,mBAAmB,EAEnB,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,SAAS,EACT,YAAY,EAEZ,IAAI,GACL,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAMvC,YAAY,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EACL,wBAAwB,EACxB,gBAAgB,EAChB,eAAe,EACf,UAAU,EACV,kBAAkB,GACnB,MAAM,UAAU,CAAC;AAMlB,OAAO,EACL,oBAAoB,EACpB,YAAY,EACZ,cAAc,EACd,cAAc,GACf,MAAM,WAAW,CAAC;AAMnB,OAAO,EAEL,KAAK,EACL,KAAK,EAEL,aAAa,EAEb,WAAW,EACX,aAAa,EAEb,YAAY,EACZ,aAAa,EACb,KAAK,EACL,gBAAgB,EAChB,aAAa,EACb,OAAO,EACP,GAAG,EACH,OAAO,GACR,MAAM,aAAa,CAAC;AAMrB,OAAO,EACL,SAAS,EAET,GAAG,EACH,MAAM,EACN,aAAa,EACb,qBAAqB,EAErB,wBAAwB,EACxB,mBAAmB,EACnB,oBAAoB,EAEpB,YAAY,EACZ,SAAS,EAET,cAAc,GACf,MAAM,eAAe,CAAC;AAMvB,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,yBAAyB,GAC1B,MAAM,iBAAiB,CAAC;AAMzB,YAAY,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAM3D,YAAY,EACV,UAAU,EACV,WAAW,EACX,gBAAgB,EAChB,aAAa,EACb,WAAW,EACX,qBAAqB,EACrB,eAAe,EACf,aAAa,EACb,eAAe,EACf,oBAAoB,GACrB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAM/E,YAAY,EAEV,OAAO,EAEP,kBAAkB,EAElB,aAAa,EACb,cAAc,EACd,mBAAmB,EAEnB,WAAW,EACX,uBAAuB,EAEvB,cAAc,EAEd,wBAAwB,EAExB,YAAY,EACZ,aAAa,GACd,MAAM,cAAc,CAAC;AACtB,OAAO,EAEL,0BAA0B,EAE1B,oBAAoB,EAEpB,uBAAuB,EAEvB,sBAAsB,EACtB,YAAY,EACZ,aAAa,GACd,MAAM,cAAc,CAAC;AAMtB,YAAY,EAEV,kBAAkB,EAElB,iBAAiB,EACjB,wBAAwB,EACxB,YAAY,EAEZ,cAAc,EACd,oBAAoB,EACpB,WAAW,EAEX,WAAW,EAEX,iBAAiB,EAEjB,oBAAoB,EAEpB,wBAAwB,EAExB,kBAAkB,GACnB,MAAM,cAAc,CAAC;AACtB,OAAO,EAEL,gBAAgB,EAEhB,eAAe,EAEf,2BAA2B,EAC3B,uBAAuB,EACvB,iBAAiB,EAEjB,aAAa,GACd,MAAM,cAAc,CAAC;AAMtB,YAAY,EACV,uBAAuB,EACvB,aAAa,EACb,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,uBAAuB,EACvB,cAAc,GACf,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC"}
package/dist/index.js CHANGED
@@ -1,42 +1,69 @@
1
1
  /**
2
2
  * @veloxts/auth - Authentication and authorization system
3
3
  *
4
- * Provides authentication middleware, session management, and authorization
5
- * guards for VeloxTS applications. Deferred to v1.1+ release.
4
+ * Provides JWT authentication, password hashing, authorization guards,
5
+ * resource policies, and rate limiting for VeloxTS applications.
6
6
  *
7
- * @note This package is a placeholder for MVP (v0.1.0)
7
+ * @packageDocumentation
8
+ * @module @veloxts/auth
8
9
  */
9
- import { createRequire } from 'node:module';
10
- // Read version from package.json dynamically
11
- const require = createRequire(import.meta.url);
12
- const packageJson = require('../package.json');
13
- /** Auth package version */
14
- export const AUTH_VERSION = packageJson.version ?? '0.0.0-unknown';
15
- /**
16
- * Creates an authentication plugin for VeloxTS
17
- *
18
- * @param _config
19
- * @returns Auth plugin
20
- *
21
- * @note Full implementation coming in v1.1+
22
- */
23
- export function createAuth(_config = {}) {
24
- return {
25
- version: AUTH_VERSION,
26
- middleware: () => {
27
- console.log('Auth middleware placeholder (v1.1+)');
28
- },
29
- };
30
- }
31
- /**
32
- * Authorization guard decorator (placeholder)
33
- *
34
- * @note Full implementation coming in v1.1+
35
- */
36
- export function guard(permissions) {
37
- return (target) => {
38
- console.log(`Guard decorator placeholder: ${permissions.join(', ')}`);
39
- return target;
40
- };
41
- }
10
+ // ============================================================================
11
+ // Version Export
12
+ // ============================================================================
13
+ export { AUTH_VERSION } from './plugin.js';
14
+ export { AuthError } from './types.js';
15
+ export { createInMemoryTokenStore, createJwtManager, generateTokenId, JwtManager, parseTimeToSeconds, } from './jwt.js';
16
+ // ============================================================================
17
+ // Password Hashing
18
+ // ============================================================================
19
+ export { createPasswordHasher, hashPassword, PasswordHasher, verifyPassword, } from './hash.js';
20
+ // ============================================================================
21
+ // Guards
22
+ // ============================================================================
23
+ export {
24
+ // Combinators
25
+ allOf, anyOf,
26
+ // Built-in guards
27
+ authenticated,
28
+ // Factory functions
29
+ defineGuard, emailVerified,
30
+ // Execution
31
+ executeGuard, executeGuards, guard, hasAnyPermission, hasPermission, hasRole, not, userCan, } from './guards.js';
32
+ // ============================================================================
33
+ // Policies
34
+ // ============================================================================
35
+ export { authorize,
36
+ // Authorization checks
37
+ can, cannot, clearPolicies, createAdminOnlyPolicy,
38
+ // Common patterns
39
+ createOwnerOrAdminPolicy, createPolicyBuilder, createReadOnlyPolicy,
40
+ // Factory
41
+ definePolicy, getPolicy,
42
+ // Registry
43
+ registerPolicy, } from './policies.js';
44
+ // ============================================================================
45
+ // Middleware
46
+ // ============================================================================
47
+ export { clearRateLimitStore, createAuthMiddleware, createRateLimitMiddleware, } from './middleware.js';
48
+ export { authPlugin, createAuthPlugin } from './plugin.js';
49
+ export { CsrfError, createCsrfManager, createCsrfMiddleware } from './csrf.js';
50
+ export {
51
+ // Store implementations
52
+ createInMemorySessionStore,
53
+ // Session manager
54
+ createSessionManager,
55
+ // Middleware factory
56
+ createSessionMiddleware,
57
+ // Helper functions
58
+ isSessionAuthenticated, loginSession, logoutSession, } from './session.js';
59
+ export {
60
+ // Error class
61
+ AuthAdapterError,
62
+ // Abstract base class
63
+ BaseAuthAdapter,
64
+ // Factory functions
65
+ createAdapterAuthMiddleware, createAuthAdapterPlugin, defineAuthAdapter,
66
+ // Type guard
67
+ isAuthAdapter, } from './adapter.js';
68
+ export { BetterAuthAdapter, createBetterAuthAdapter } from './adapters/better-auth.js';
42
69
  //# 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":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,6CAA6C;AAC7C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,WAAW,GAAG,OAAO,CAAC,iBAAiB,CAAwB,CAAC;AAEtE,2BAA2B;AAC3B,MAAM,CAAC,MAAM,YAAY,GAAW,WAAW,CAAC,OAAO,IAAI,eAAe,CAAC;AAW3E;;;;;;;GAOG;AACH,MAAM,UAAU,UAAU,CAAC,UAAuD,EAAE;IAClF,OAAO;QACL,OAAO,EAAE,YAAY;QACrB,UAAU,EAAE,GAAG,EAAE;YACf,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;QACrD,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,KAAK,CAAC,WAAqB;IACzC,OAAO,CAAC,MAAe,EAAE,EAAE;QACzB,OAAO,CAAC,GAAG,CAAC,gCAAgC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACtE,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,+EAA+E;AAC/E,iBAAiB;AACjB,+EAA+E;AAE/E,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AA6B3C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAOvC,OAAO,EACL,wBAAwB,EACxB,gBAAgB,EAChB,eAAe,EACf,UAAU,EACV,kBAAkB,GACnB,MAAM,UAAU,CAAC;AAElB,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E,OAAO,EACL,oBAAoB,EACpB,YAAY,EACZ,cAAc,EACd,cAAc,GACf,MAAM,WAAW,CAAC;AAEnB,+EAA+E;AAC/E,SAAS;AACT,+EAA+E;AAE/E,OAAO;AACL,cAAc;AACd,KAAK,EACL,KAAK;AACL,kBAAkB;AAClB,aAAa;AACb,oBAAoB;AACpB,WAAW,EACX,aAAa;AACb,YAAY;AACZ,YAAY,EACZ,aAAa,EACb,KAAK,EACL,gBAAgB,EAChB,aAAa,EACb,OAAO,EACP,GAAG,EACH,OAAO,GACR,MAAM,aAAa,CAAC;AAErB,+EAA+E;AAC/E,WAAW;AACX,+EAA+E;AAE/E,OAAO,EACL,SAAS;AACT,uBAAuB;AACvB,GAAG,EACH,MAAM,EACN,aAAa,EACb,qBAAqB;AACrB,kBAAkB;AAClB,wBAAwB,EACxB,mBAAmB,EACnB,oBAAoB;AACpB,UAAU;AACV,YAAY,EACZ,SAAS;AACT,WAAW;AACX,cAAc,GACf,MAAM,eAAe,CAAC;AAEvB,+EAA+E;AAC/E,aAAa;AACb,+EAA+E;AAE/E,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,yBAAyB,GAC1B,MAAM,iBAAiB,CAAC;AAOzB,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAkB3D,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AA0B/E,OAAO;AACL,wBAAwB;AACxB,0BAA0B;AAC1B,kBAAkB;AAClB,oBAAoB;AACpB,qBAAqB;AACrB,uBAAuB;AACvB,mBAAmB;AACnB,sBAAsB,EACtB,YAAY,EACZ,aAAa,GACd,MAAM,cAAc,CAAC;AA4BtB,OAAO;AACL,cAAc;AACd,gBAAgB;AAChB,sBAAsB;AACtB,eAAe;AACf,oBAAoB;AACpB,2BAA2B,EAC3B,uBAAuB,EACvB,iBAAiB;AACjB,aAAa;AACb,aAAa,GACd,MAAM,cAAc,CAAC;AAetB,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC"}
package/dist/jwt.d.ts ADDED
@@ -0,0 +1,128 @@
1
+ /**
2
+ * JWT token utilities for @veloxts/auth
3
+ * @module auth/jwt
4
+ */
5
+ import type { JwtConfig, TokenPair, TokenPayload, User } from './types.js';
6
+ /**
7
+ * Parses time string to seconds
8
+ * Supports: '15m', '1h', '7d', '30d', etc.
9
+ */
10
+ export declare function parseTimeToSeconds(time: string): number;
11
+ /**
12
+ * Generate a unique token ID
13
+ */
14
+ export declare function generateTokenId(): string;
15
+ /**
16
+ * JWT token manager
17
+ *
18
+ * Handles token creation, verification, and refresh.
19
+ * Uses HS256 (HMAC-SHA256) algorithm.
20
+ *
21
+ * @example
22
+ * ```typescript
23
+ * const jwt = new JwtManager({
24
+ * secret: process.env.JWT_SECRET!,
25
+ * accessTokenExpiry: '15m',
26
+ * refreshTokenExpiry: '7d',
27
+ * });
28
+ *
29
+ * // Create tokens for user
30
+ * const tokens = jwt.createTokenPair(user);
31
+ *
32
+ * // Verify access token
33
+ * const payload = jwt.verifyToken(tokens.accessToken);
34
+ *
35
+ * // Refresh tokens
36
+ * const newTokens = jwt.refreshTokens(tokens.refreshToken);
37
+ * ```
38
+ */
39
+ export declare class JwtManager {
40
+ private readonly config;
41
+ constructor(config: JwtConfig);
42
+ /**
43
+ * Creates a JWT token with the given payload
44
+ */
45
+ createToken(payload: Omit<TokenPayload, 'iat' | 'exp'> & {
46
+ sub: string;
47
+ email: string;
48
+ type: TokenPayload['type'];
49
+ }, expiresIn: string): string;
50
+ /**
51
+ * Verifies a JWT token and returns the payload
52
+ *
53
+ * @throws Error if token is invalid or expired
54
+ */
55
+ verifyToken(token: string): TokenPayload;
56
+ /**
57
+ * Creates an access/refresh token pair for a user
58
+ *
59
+ * @param user - The user to create tokens for
60
+ * @param additionalClaims - Custom claims to include (cannot override reserved claims)
61
+ * @throws Error if additionalClaims contains reserved JWT claims
62
+ */
63
+ createTokenPair(user: User, additionalClaims?: Record<string, unknown>): TokenPair;
64
+ /**
65
+ * Refreshes tokens using a valid refresh token
66
+ *
67
+ * @throws Error if refresh token is invalid or not a refresh token
68
+ */
69
+ refreshTokens(refreshToken: string, userLoader?: (userId: string) => Promise<User | null>): Promise<TokenPair>;
70
+ refreshTokens(refreshToken: string): TokenPair;
71
+ /**
72
+ * Decodes a token without verification
73
+ * Useful for extracting payload from expired tokens
74
+ */
75
+ decodeToken(token: string): TokenPayload | null;
76
+ /**
77
+ * Extracts token from Authorization header
78
+ * Supports 'Bearer <token>' format
79
+ */
80
+ extractFromHeader(authHeader: string | undefined): string | null;
81
+ }
82
+ /**
83
+ * Creates a new JWT manager instance
84
+ */
85
+ export declare function createJwtManager(config: JwtConfig): JwtManager;
86
+ /**
87
+ * Token store interface for revocation management
88
+ */
89
+ export interface TokenStore {
90
+ /** Revoke a token by its ID (jti) */
91
+ revoke: (tokenId: string) => void | Promise<void>;
92
+ /** Check if a token is revoked */
93
+ isRevoked: (tokenId: string) => boolean | Promise<boolean>;
94
+ /** Clear all revoked tokens (useful for testing) */
95
+ clear: () => void;
96
+ }
97
+ /**
98
+ * Creates an in-memory token store for development and testing
99
+ *
100
+ * ⚠️ WARNING: NOT suitable for production!
101
+ * - Does not persist across server restarts
102
+ * - Does not work across multiple server instances
103
+ * - No automatic cleanup of expired token IDs
104
+ *
105
+ * For production, use Redis or database-backed storage:
106
+ * - upstash/redis for serverless
107
+ * - ioredis for traditional servers
108
+ * - Database table for audit trail
109
+ *
110
+ * @example
111
+ * ```typescript
112
+ * // Development/Testing
113
+ * const tokenStore = createInMemoryTokenStore();
114
+ *
115
+ * const authConfig: AuthConfig = {
116
+ * jwt: { secret: process.env.JWT_SECRET! },
117
+ * isTokenRevoked: tokenStore.isRevoked,
118
+ * };
119
+ *
120
+ * // Revoke on logout
121
+ * app.post('/logout', async (req) => {
122
+ * const tokenId = req.auth.token.jti;
123
+ * tokenStore.revoke(tokenId);
124
+ * });
125
+ * ```
126
+ */
127
+ export declare function createInMemoryTokenStore(): TokenStore;
128
+ //# sourceMappingURL=jwt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jwt.d.ts","sourceRoot":"","sources":["../src/jwt.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAuC3E;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAqBvD;AA4BD;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAMD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAGX;gBAEA,MAAM,EAAE,SAAS;IAyB7B;;OAEG;IACH,WAAW,CACT,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,KAAK,GAAG,KAAK,CAAC,GAAG;QAC3C,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC;KAC5B,EACD,SAAS,EAAE,MAAM,GAChB,MAAM;IAsBT;;;;OAIG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY;IAkFxC;;;;;;OAMG;IACH,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS;IA0ClF;;;;OAIG;IACH,aAAa,CACX,YAAY,EAAE,MAAM,EACpB,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,GACpD,OAAO,CAAC,SAAS,CAAC;IACrB,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS;IA8B9C;;;OAGG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IAa/C;;;OAGG;IACH,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI;CAYjE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,GAAG,UAAU,CAE9D;AAMD;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,qCAAqC;IACrC,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,kCAAkC;IAClC,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3D,oDAAoD;IACpD,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,wBAAwB,IAAI,UAAU,CAYrD"}