clearauth 0.3.2 → 0.4.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.
- package/CHANGELOG.md +83 -0
- package/README.md +102 -15
- package/dist/auth/handler.d.ts +2 -0
- package/dist/auth/handler.js +183 -12
- package/dist/auth/handler.js.map +1 -1
- package/dist/auth/magic-link.d.ts +94 -0
- package/dist/auth/magic-link.js +188 -0
- package/dist/auth/magic-link.js.map +1 -0
- package/dist/auth/utils.d.ts +18 -0
- package/dist/auth/utils.js +38 -0
- package/dist/auth/utils.js.map +1 -1
- package/dist/database/providers/d1.d.ts +72 -0
- package/dist/database/providers/d1.js +117 -0
- package/dist/database/providers/d1.js.map +1 -0
- package/dist/database/providers/index.d.ts +18 -0
- package/dist/database/providers/index.js +19 -0
- package/dist/database/providers/index.js.map +1 -0
- package/dist/database/providers/neon.d.ts +41 -0
- package/dist/database/providers/neon.js +135 -0
- package/dist/database/providers/neon.js.map +1 -0
- package/dist/database/providers/planetscale.d.ts +51 -0
- package/dist/database/providers/planetscale.js +145 -0
- package/dist/database/providers/planetscale.js.map +1 -0
- package/dist/database/providers/supabase.d.ts +44 -0
- package/dist/database/providers/supabase.js +148 -0
- package/dist/database/providers/supabase.js.map +1 -0
- package/dist/database/providers/turso.d.ts +45 -0
- package/dist/database/providers/turso.js +149 -0
- package/dist/database/providers/turso.js.map +1 -0
- package/dist/database/schema.d.ts +28 -0
- package/dist/database/schema.js +6 -0
- package/dist/database/schema.js.map +1 -1
- package/dist/edge.d.ts +47 -0
- package/dist/edge.js +47 -0
- package/dist/edge.js.map +1 -1
- package/dist/email/manager.d.ts +26 -0
- package/dist/email/manager.js +88 -0
- package/dist/email/manager.js.map +1 -0
- package/dist/email/providers/postmark.d.ts +17 -0
- package/dist/email/providers/postmark.js +42 -0
- package/dist/email/providers/postmark.js.map +1 -0
- package/dist/email/providers/resend.d.ts +17 -0
- package/dist/email/providers/resend.js +40 -0
- package/dist/email/providers/resend.js.map +1 -0
- package/dist/email/providers/sendgrid.d.ts +20 -0
- package/dist/email/providers/sendgrid.js +52 -0
- package/dist/email/providers/sendgrid.js.map +1 -0
- package/dist/email/templates.d.ts +20 -0
- package/dist/email/templates.js +82 -0
- package/dist/email/templates.js.map +1 -0
- package/dist/index.d.ts +13 -3
- package/dist/index.js +15 -3
- package/dist/index.js.map +1 -1
- package/dist/oauth/apple.d.ts +9 -0
- package/dist/oauth/apple.js +36 -0
- package/dist/oauth/apple.js.map +1 -0
- package/dist/oauth/arctic-providers.d.ts +26 -1
- package/dist/oauth/arctic-providers.js +103 -1
- package/dist/oauth/arctic-providers.js.map +1 -1
- package/dist/oauth/callbacks.d.ts +3 -3
- package/dist/oauth/callbacks.js +2 -2
- package/dist/oauth/callbacks.js.map +1 -1
- package/dist/oauth/discord.d.ts +9 -0
- package/dist/oauth/discord.js +40 -0
- package/dist/oauth/discord.js.map +1 -0
- package/dist/oauth/handler.d.ts +1 -14
- package/dist/oauth/handler.js +103 -178
- package/dist/oauth/handler.js.map +1 -1
- package/dist/oauth/linkedin.d.ts +9 -0
- package/dist/oauth/linkedin.js +42 -0
- package/dist/oauth/linkedin.js.map +1 -0
- package/dist/oauth/meta.d.ts +9 -0
- package/dist/oauth/meta.js +40 -0
- package/dist/oauth/meta.js.map +1 -0
- package/dist/oauth/microsoft.d.ts +10 -0
- package/dist/oauth/microsoft.js +38 -0
- package/dist/oauth/microsoft.js.map +1 -0
- package/dist/react.d.ts +2 -0
- package/dist/react.js +16 -1
- package/dist/react.js.map +1 -1
- package/dist/session/validate.d.ts +87 -0
- package/dist/session/validate.js +125 -0
- package/dist/session/validate.js.map +1 -0
- package/dist/types.d.ts +78 -0
- package/dist/utils/cookies.d.ts +70 -0
- package/dist/utils/cookies.js +90 -0
- package/dist/utils/cookies.js.map +1 -0
- package/package.json +18 -2
package/dist/react.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react.js","sourceRoot":"","sources":["../src/react.tsx"],"names":[],"mappings":";AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"react.js","sourceRoot":"","sources":["../src/react.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session Validation Utilities
|
|
3
|
+
*
|
|
4
|
+
* Edge-compatible session validation functions that work without native dependencies.
|
|
5
|
+
* These utilities can be used in Cloudflare Workers, Vercel Edge, and other edge runtimes.
|
|
6
|
+
*
|
|
7
|
+
* @module session/validate
|
|
8
|
+
*/
|
|
9
|
+
import type { Kysely } from 'kysely';
|
|
10
|
+
import type { Database, Session, PublicUser } from '../database/schema.js';
|
|
11
|
+
/**
|
|
12
|
+
* Result of session validation
|
|
13
|
+
*/
|
|
14
|
+
export interface ValidateSessionResult {
|
|
15
|
+
/** Public user data (no sensitive fields) */
|
|
16
|
+
user: PublicUser;
|
|
17
|
+
/** Session data */
|
|
18
|
+
session: Session;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Validate a session token and return the associated user
|
|
22
|
+
*
|
|
23
|
+
* This function is edge-compatible and can be used in middleware to validate
|
|
24
|
+
* session cookies before processing requests.
|
|
25
|
+
*
|
|
26
|
+
* @param sessionToken - The session token from cookie
|
|
27
|
+
* @param db - Kysely database instance
|
|
28
|
+
* @returns User and session if valid, null otherwise
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* ```typescript
|
|
32
|
+
* import { validateSession, parseCookies, createMechKysely } from 'clearauth/edge';
|
|
33
|
+
*
|
|
34
|
+
* // In Cloudflare Workers middleware
|
|
35
|
+
* const cookies = parseCookies(request.headers.get('Cookie'));
|
|
36
|
+
* const sessionToken = cookies.get('session');
|
|
37
|
+
*
|
|
38
|
+
* if (sessionToken) {
|
|
39
|
+
* const db = createMechKysely({ appId, apiKey });
|
|
40
|
+
* const result = await validateSession(sessionToken, db);
|
|
41
|
+
*
|
|
42
|
+
* if (result) {
|
|
43
|
+
* // User is authenticated
|
|
44
|
+
* console.log('User:', result.user.email);
|
|
45
|
+
* }
|
|
46
|
+
* }
|
|
47
|
+
* ```
|
|
48
|
+
*/
|
|
49
|
+
export declare function validateSession(sessionToken: string, db: Kysely<Database>): Promise<ValidateSessionResult | null>;
|
|
50
|
+
/**
|
|
51
|
+
* Options for getSessionFromCookie
|
|
52
|
+
*/
|
|
53
|
+
export interface GetSessionFromCookieOptions {
|
|
54
|
+
/** Cookie name to read session from (default: 'session') */
|
|
55
|
+
cookieName?: string;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Get session from a request's Cookie header
|
|
59
|
+
*
|
|
60
|
+
* Convenience function that combines cookie parsing and session validation.
|
|
61
|
+
* Useful for middleware that needs to validate authentication on every request.
|
|
62
|
+
*
|
|
63
|
+
* @param request - The HTTP request object
|
|
64
|
+
* @param db - Kysely database instance
|
|
65
|
+
* @param options - Optional configuration
|
|
66
|
+
* @returns User and session if valid, null otherwise
|
|
67
|
+
*
|
|
68
|
+
* @example
|
|
69
|
+
* ```typescript
|
|
70
|
+
* import { getSessionFromCookie, createMechKysely } from 'clearauth/edge';
|
|
71
|
+
*
|
|
72
|
+
* // In Cloudflare Workers
|
|
73
|
+
* export default {
|
|
74
|
+
* async fetch(request: Request, env: Env) {
|
|
75
|
+
* const db = createMechKysely({ appId: env.MECH_APP_ID, apiKey: env.MECH_API_KEY });
|
|
76
|
+
* const session = await getSessionFromCookie(request, db);
|
|
77
|
+
*
|
|
78
|
+
* if (!session) {
|
|
79
|
+
* return new Response('Unauthorized', { status: 401 });
|
|
80
|
+
* }
|
|
81
|
+
*
|
|
82
|
+
* return new Response(`Hello, ${session.user.email}!`);
|
|
83
|
+
* }
|
|
84
|
+
* }
|
|
85
|
+
* ```
|
|
86
|
+
*/
|
|
87
|
+
export declare function getSessionFromCookie(request: Request, db: Kysely<Database>, options?: GetSessionFromCookieOptions): Promise<ValidateSessionResult | null>;
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session Validation Utilities
|
|
3
|
+
*
|
|
4
|
+
* Edge-compatible session validation functions that work without native dependencies.
|
|
5
|
+
* These utilities can be used in Cloudflare Workers, Vercel Edge, and other edge runtimes.
|
|
6
|
+
*
|
|
7
|
+
* @module session/validate
|
|
8
|
+
*/
|
|
9
|
+
import { parseCookies } from '../utils/cookies.js';
|
|
10
|
+
/**
|
|
11
|
+
* Validate a session token and return the associated user
|
|
12
|
+
*
|
|
13
|
+
* This function is edge-compatible and can be used in middleware to validate
|
|
14
|
+
* session cookies before processing requests.
|
|
15
|
+
*
|
|
16
|
+
* @param sessionToken - The session token from cookie
|
|
17
|
+
* @param db - Kysely database instance
|
|
18
|
+
* @returns User and session if valid, null otherwise
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```typescript
|
|
22
|
+
* import { validateSession, parseCookies, createMechKysely } from 'clearauth/edge';
|
|
23
|
+
*
|
|
24
|
+
* // In Cloudflare Workers middleware
|
|
25
|
+
* const cookies = parseCookies(request.headers.get('Cookie'));
|
|
26
|
+
* const sessionToken = cookies.get('session');
|
|
27
|
+
*
|
|
28
|
+
* if (sessionToken) {
|
|
29
|
+
* const db = createMechKysely({ appId, apiKey });
|
|
30
|
+
* const result = await validateSession(sessionToken, db);
|
|
31
|
+
*
|
|
32
|
+
* if (result) {
|
|
33
|
+
* // User is authenticated
|
|
34
|
+
* console.log('User:', result.user.email);
|
|
35
|
+
* }
|
|
36
|
+
* }
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
39
|
+
export async function validateSession(sessionToken, db) {
|
|
40
|
+
// Empty token is invalid
|
|
41
|
+
if (!sessionToken) {
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
// Look up session in database
|
|
45
|
+
const session = await db
|
|
46
|
+
.selectFrom('sessions')
|
|
47
|
+
.selectAll()
|
|
48
|
+
.where('id', '=', sessionToken)
|
|
49
|
+
.executeTakeFirst();
|
|
50
|
+
if (!session) {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
// Check if session is expired
|
|
54
|
+
const expiresAt = session.expires_at instanceof Date
|
|
55
|
+
? session.expires_at
|
|
56
|
+
: new Date(session.expires_at);
|
|
57
|
+
if (expiresAt <= new Date()) {
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
// Look up user
|
|
61
|
+
const user = await db
|
|
62
|
+
.selectFrom('users')
|
|
63
|
+
.select(['id', 'email', 'email_verified', 'name', 'avatar_url', 'created_at'])
|
|
64
|
+
.where('id', '=', session.user_id)
|
|
65
|
+
.executeTakeFirst();
|
|
66
|
+
if (!user) {
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
// Return public user data (no password_hash or other sensitive fields)
|
|
70
|
+
return {
|
|
71
|
+
user: {
|
|
72
|
+
id: user.id,
|
|
73
|
+
email: user.email,
|
|
74
|
+
email_verified: user.email_verified,
|
|
75
|
+
name: user.name,
|
|
76
|
+
avatar_url: user.avatar_url,
|
|
77
|
+
created_at: user.created_at,
|
|
78
|
+
},
|
|
79
|
+
session,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Get session from a request's Cookie header
|
|
84
|
+
*
|
|
85
|
+
* Convenience function that combines cookie parsing and session validation.
|
|
86
|
+
* Useful for middleware that needs to validate authentication on every request.
|
|
87
|
+
*
|
|
88
|
+
* @param request - The HTTP request object
|
|
89
|
+
* @param db - Kysely database instance
|
|
90
|
+
* @param options - Optional configuration
|
|
91
|
+
* @returns User and session if valid, null otherwise
|
|
92
|
+
*
|
|
93
|
+
* @example
|
|
94
|
+
* ```typescript
|
|
95
|
+
* import { getSessionFromCookie, createMechKysely } from 'clearauth/edge';
|
|
96
|
+
*
|
|
97
|
+
* // In Cloudflare Workers
|
|
98
|
+
* export default {
|
|
99
|
+
* async fetch(request: Request, env: Env) {
|
|
100
|
+
* const db = createMechKysely({ appId: env.MECH_APP_ID, apiKey: env.MECH_API_KEY });
|
|
101
|
+
* const session = await getSessionFromCookie(request, db);
|
|
102
|
+
*
|
|
103
|
+
* if (!session) {
|
|
104
|
+
* return new Response('Unauthorized', { status: 401 });
|
|
105
|
+
* }
|
|
106
|
+
*
|
|
107
|
+
* return new Response(`Hello, ${session.user.email}!`);
|
|
108
|
+
* }
|
|
109
|
+
* }
|
|
110
|
+
* ```
|
|
111
|
+
*/
|
|
112
|
+
export async function getSessionFromCookie(request, db, options) {
|
|
113
|
+
const cookieName = options?.cookieName ?? 'session';
|
|
114
|
+
const cookieHeader = request.headers.get('Cookie');
|
|
115
|
+
if (!cookieHeader) {
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
const cookies = parseCookies(cookieHeader);
|
|
119
|
+
const sessionToken = cookies.get(cookieName);
|
|
120
|
+
if (!sessionToken) {
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
return validateSession(sessionToken, db);
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/session/validate.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAYlD;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,YAAoB,EACpB,EAAoB;IAEpB,yBAAyB;IACzB,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,8BAA8B;IAC9B,MAAM,OAAO,GAAG,MAAM,EAAE;SACrB,UAAU,CAAC,UAAU,CAAC;SACtB,SAAS,EAAE;SACX,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,YAAY,CAAC;SAC9B,gBAAgB,EAAE,CAAA;IAErB,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,IAAI,CAAA;IACb,CAAC;IAED,8BAA8B;IAC9B,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,YAAY,IAAI;QAClD,CAAC,CAAC,OAAO,CAAC,UAAU;QACpB,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;IAEhC,IAAI,SAAS,IAAI,IAAI,IAAI,EAAE,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAA;IACb,CAAC;IAED,eAAe;IACf,MAAM,IAAI,GAAG,MAAM,EAAE;SAClB,UAAU,CAAC,OAAO,CAAC;SACnB,MAAM,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC;SAC7E,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,OAAO,CAAC;SACjC,gBAAgB,EAAE,CAAA;IAErB,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,IAAI,CAAA;IACb,CAAC;IAED,uEAAuE;IACvE,OAAO;QACL,IAAI,EAAE;YACJ,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,cAAc,EAAE,IAAI,CAAC,cAAc;YACnC,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,UAAU,EAAE,IAAI,CAAC,UAAU;SAC5B;QACD,OAAO;KACR,CAAA;AACH,CAAC;AAUD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,OAAgB,EAChB,EAAoB,EACpB,OAAqC;IAErC,MAAM,UAAU,GAAG,OAAO,EAAE,UAAU,IAAI,SAAS,CAAA;IACnD,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;IAElD,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,OAAO,GAAG,YAAY,CAAC,YAAY,CAAC,CAAA;IAC1C,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;IAE5C,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,OAAO,eAAe,CAAC,YAAY,EAAE,EAAE,CAAC,CAAA;AAC1C,CAAC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -17,9 +17,21 @@ export interface OAuthProviderConfig {
|
|
|
17
17
|
/**
|
|
18
18
|
* OAuth Providers Configuration
|
|
19
19
|
*/
|
|
20
|
+
export type OAuthProvider = 'github' | 'google' | 'discord' | 'apple' | 'microsoft' | 'linkedin' | 'meta';
|
|
20
21
|
export interface OAuthProvidersConfig {
|
|
21
22
|
github?: OAuthProviderConfig;
|
|
22
23
|
google?: OAuthProviderConfig;
|
|
24
|
+
discord?: OAuthProviderConfig;
|
|
25
|
+
apple?: OAuthProviderConfig & {
|
|
26
|
+
teamId: string;
|
|
27
|
+
keyId: string;
|
|
28
|
+
privateKey: string;
|
|
29
|
+
};
|
|
30
|
+
microsoft?: OAuthProviderConfig & {
|
|
31
|
+
tenantId?: string;
|
|
32
|
+
};
|
|
33
|
+
linkedin?: OAuthProviderConfig;
|
|
34
|
+
meta?: OAuthProviderConfig;
|
|
23
35
|
}
|
|
24
36
|
/**
|
|
25
37
|
* Session Configuration
|
|
@@ -60,6 +72,68 @@ export interface PasswordConfig {
|
|
|
60
72
|
*/
|
|
61
73
|
minLength?: number;
|
|
62
74
|
}
|
|
75
|
+
/**
|
|
76
|
+
* Email Provider Interface
|
|
77
|
+
*
|
|
78
|
+
* Interface for email service adapters (Resend, Postmark, etc.)
|
|
79
|
+
*/
|
|
80
|
+
export interface EmailProvider {
|
|
81
|
+
/** Provider name */
|
|
82
|
+
name: string;
|
|
83
|
+
/**
|
|
84
|
+
* Send an email
|
|
85
|
+
* @param to - Recipient email address
|
|
86
|
+
* @param subject - Email subject
|
|
87
|
+
* @param html - HTML content
|
|
88
|
+
* @param text - Plain text content
|
|
89
|
+
*/
|
|
90
|
+
send: (to: string, subject: string, html: string, text: string) => Promise<void>;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Email Configuration
|
|
94
|
+
*/
|
|
95
|
+
export interface EmailConfig extends EmailCallbacksConfig {
|
|
96
|
+
/**
|
|
97
|
+
* Email provider adapter
|
|
98
|
+
* If provided, ClearAuth will use this to send emails automatically
|
|
99
|
+
* using default templates, unless specific callbacks are provided.
|
|
100
|
+
*/
|
|
101
|
+
provider?: EmailProvider;
|
|
102
|
+
/**
|
|
103
|
+
* Default 'from' address for emails
|
|
104
|
+
* Required if using a provider
|
|
105
|
+
*/
|
|
106
|
+
from?: string;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Email Callbacks Configuration
|
|
110
|
+
*
|
|
111
|
+
* Optional callbacks for sending emails. Implement these to send emails
|
|
112
|
+
* for verification, password reset, and magic links.
|
|
113
|
+
*/
|
|
114
|
+
export interface EmailCallbacksConfig {
|
|
115
|
+
/**
|
|
116
|
+
* Send email verification link
|
|
117
|
+
* @param email - User's email address
|
|
118
|
+
* @param token - Verification token
|
|
119
|
+
* @param linkUrl - Relative URL path for verification (e.g., /auth/verify-email?token=...)
|
|
120
|
+
*/
|
|
121
|
+
sendVerificationEmail?: (email: string, token: string, linkUrl: string) => Promise<void>;
|
|
122
|
+
/**
|
|
123
|
+
* Send password reset link
|
|
124
|
+
* @param email - User's email address
|
|
125
|
+
* @param token - Reset token
|
|
126
|
+
* @param linkUrl - Relative URL path for reset (e.g., /auth/reset-password?token=...)
|
|
127
|
+
*/
|
|
128
|
+
sendPasswordResetEmail?: (email: string, token: string, linkUrl: string) => Promise<void>;
|
|
129
|
+
/**
|
|
130
|
+
* Send magic link for passwordless login
|
|
131
|
+
* @param email - User's email address
|
|
132
|
+
* @param token - Magic link token
|
|
133
|
+
* @param linkUrl - Relative URL path for magic link (e.g., /auth/magic-link/verify?token=...)
|
|
134
|
+
*/
|
|
135
|
+
sendMagicLink?: (email: string, token: string, linkUrl: string) => Promise<void>;
|
|
136
|
+
}
|
|
63
137
|
/**
|
|
64
138
|
* CORS Configuration
|
|
65
139
|
*/
|
|
@@ -133,6 +207,10 @@ export interface ClearAuthConfig {
|
|
|
133
207
|
* Password hashing implementation
|
|
134
208
|
*/
|
|
135
209
|
passwordHasher?: PasswordHasher;
|
|
210
|
+
/**
|
|
211
|
+
* Email configuration for sending verification, reset, and magic link emails
|
|
212
|
+
*/
|
|
213
|
+
email?: EmailConfig;
|
|
136
214
|
/**
|
|
137
215
|
* CORS configuration for browser clients
|
|
138
216
|
*/
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cookie Utilities
|
|
3
|
+
*
|
|
4
|
+
* Edge-compatible cookie parsing and creation utilities.
|
|
5
|
+
* These utilities work in Cloudflare Workers, Vercel Edge, and other edge runtimes.
|
|
6
|
+
*
|
|
7
|
+
* @module utils/cookies
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Parse a Cookie header into a Map of cookie names and values
|
|
11
|
+
*
|
|
12
|
+
* @param cookieHeader - The Cookie header string (from request.headers.get('Cookie'))
|
|
13
|
+
* @returns Map of cookie name to value
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```typescript
|
|
17
|
+
* const cookies = parseCookies(request.headers.get('Cookie'));
|
|
18
|
+
* const sessionToken = cookies.get('session');
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
export declare function parseCookies(cookieHeader: string | null): Map<string, string>;
|
|
22
|
+
/**
|
|
23
|
+
* Session cookie configuration options
|
|
24
|
+
*/
|
|
25
|
+
export interface SessionCookieConfig {
|
|
26
|
+
/** Session configuration */
|
|
27
|
+
session?: {
|
|
28
|
+
/** Session expiration in seconds */
|
|
29
|
+
expiresIn?: number;
|
|
30
|
+
/** Cookie settings */
|
|
31
|
+
cookie?: {
|
|
32
|
+
/** Cookie name (default: 'session') */
|
|
33
|
+
name?: string;
|
|
34
|
+
/** SameSite attribute (default: 'lax') */
|
|
35
|
+
sameSite?: 'strict' | 'lax' | 'none';
|
|
36
|
+
/** Cookie path (default: '/') */
|
|
37
|
+
path?: string;
|
|
38
|
+
/** Cookie domain for cross-subdomain sharing */
|
|
39
|
+
domain?: string;
|
|
40
|
+
};
|
|
41
|
+
};
|
|
42
|
+
/** Production mode - enables Secure flag */
|
|
43
|
+
isProduction?: boolean;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Create a Set-Cookie header value for a session cookie
|
|
47
|
+
*
|
|
48
|
+
* @param sessionId - The session ID to store in the cookie
|
|
49
|
+
* @param config - Cookie configuration options
|
|
50
|
+
* @returns Set-Cookie header value
|
|
51
|
+
*
|
|
52
|
+
* @example
|
|
53
|
+
* ```typescript
|
|
54
|
+
* const cookie = createSessionCookie(sessionId, {
|
|
55
|
+
* isProduction: true,
|
|
56
|
+
* session: {
|
|
57
|
+
* expiresIn: 60 * 60 * 24 * 7, // 7 days
|
|
58
|
+
* cookie: {
|
|
59
|
+
* name: 'session',
|
|
60
|
+
* domain: '.example.com',
|
|
61
|
+
* }
|
|
62
|
+
* }
|
|
63
|
+
* });
|
|
64
|
+
*
|
|
65
|
+
* return new Response('OK', {
|
|
66
|
+
* headers: { 'Set-Cookie': cookie }
|
|
67
|
+
* });
|
|
68
|
+
* ```
|
|
69
|
+
*/
|
|
70
|
+
export declare function createSessionCookie(sessionId: string, config: SessionCookieConfig): string;
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cookie Utilities
|
|
3
|
+
*
|
|
4
|
+
* Edge-compatible cookie parsing and creation utilities.
|
|
5
|
+
* These utilities work in Cloudflare Workers, Vercel Edge, and other edge runtimes.
|
|
6
|
+
*
|
|
7
|
+
* @module utils/cookies
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Parse a Cookie header into a Map of cookie names and values
|
|
11
|
+
*
|
|
12
|
+
* @param cookieHeader - The Cookie header string (from request.headers.get('Cookie'))
|
|
13
|
+
* @returns Map of cookie name to value
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```typescript
|
|
17
|
+
* const cookies = parseCookies(request.headers.get('Cookie'));
|
|
18
|
+
* const sessionToken = cookies.get('session');
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
export function parseCookies(cookieHeader) {
|
|
22
|
+
const cookies = new Map();
|
|
23
|
+
if (!cookieHeader) {
|
|
24
|
+
return cookies;
|
|
25
|
+
}
|
|
26
|
+
for (const pair of cookieHeader.split(';')) {
|
|
27
|
+
const trimmed = pair.trim();
|
|
28
|
+
if (!trimmed)
|
|
29
|
+
continue;
|
|
30
|
+
const eqIndex = trimmed.indexOf('=');
|
|
31
|
+
if (eqIndex === -1)
|
|
32
|
+
continue; // Skip cookies without =
|
|
33
|
+
const name = trimmed.slice(0, eqIndex).trim();
|
|
34
|
+
const value = trimmed.slice(eqIndex + 1).trim();
|
|
35
|
+
if (name) {
|
|
36
|
+
cookies.set(name, value);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return cookies;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Create a Set-Cookie header value for a session cookie
|
|
43
|
+
*
|
|
44
|
+
* @param sessionId - The session ID to store in the cookie
|
|
45
|
+
* @param config - Cookie configuration options
|
|
46
|
+
* @returns Set-Cookie header value
|
|
47
|
+
*
|
|
48
|
+
* @example
|
|
49
|
+
* ```typescript
|
|
50
|
+
* const cookie = createSessionCookie(sessionId, {
|
|
51
|
+
* isProduction: true,
|
|
52
|
+
* session: {
|
|
53
|
+
* expiresIn: 60 * 60 * 24 * 7, // 7 days
|
|
54
|
+
* cookie: {
|
|
55
|
+
* name: 'session',
|
|
56
|
+
* domain: '.example.com',
|
|
57
|
+
* }
|
|
58
|
+
* }
|
|
59
|
+
* });
|
|
60
|
+
*
|
|
61
|
+
* return new Response('OK', {
|
|
62
|
+
* headers: { 'Set-Cookie': cookie }
|
|
63
|
+
* });
|
|
64
|
+
* ```
|
|
65
|
+
*/
|
|
66
|
+
export function createSessionCookie(sessionId, config) {
|
|
67
|
+
const { session, isProduction } = config;
|
|
68
|
+
const name = session?.cookie?.name ?? 'session';
|
|
69
|
+
const path = session?.cookie?.path ?? '/';
|
|
70
|
+
const sameSite = session?.cookie?.sameSite ?? 'lax';
|
|
71
|
+
const domain = session?.cookie?.domain;
|
|
72
|
+
const maxAge = session?.expiresIn ?? 60 * 60 * 24 * 7; // Default: 7 days
|
|
73
|
+
// Capitalize first letter of sameSite for cookie header
|
|
74
|
+
const sameSiteFormatted = sameSite.charAt(0).toUpperCase() + sameSite.slice(1);
|
|
75
|
+
const parts = [
|
|
76
|
+
`${name}=${sessionId}`,
|
|
77
|
+
`Path=${path}`,
|
|
78
|
+
'HttpOnly',
|
|
79
|
+
`SameSite=${sameSiteFormatted}`,
|
|
80
|
+
`Max-Age=${maxAge}`,
|
|
81
|
+
];
|
|
82
|
+
if (isProduction) {
|
|
83
|
+
parts.push('Secure');
|
|
84
|
+
}
|
|
85
|
+
if (domain) {
|
|
86
|
+
parts.push(`Domain=${domain}`);
|
|
87
|
+
}
|
|
88
|
+
return parts.join('; ');
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=cookies.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cookies.js","sourceRoot":"","sources":["../../src/utils/cookies.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,YAAY,CAAC,YAA2B;IACtD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAA;IAEzC,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAA;QAC3B,IAAI,CAAC,OAAO;YAAE,SAAQ;QAEtB,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QACpC,IAAI,OAAO,KAAK,CAAC,CAAC;YAAE,SAAQ,CAAC,yBAAyB;QAEtD,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAA;QAC7C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;QAE/C,IAAI,IAAI,EAAE,CAAC;YACT,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;QAC1B,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAA;AAChB,CAAC;AA0BD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,UAAU,mBAAmB,CACjC,SAAiB,EACjB,MAA2B;IAE3B,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,MAAM,CAAA;IAExC,MAAM,IAAI,GAAG,OAAO,EAAE,MAAM,EAAE,IAAI,IAAI,SAAS,CAAA;IAC/C,MAAM,IAAI,GAAG,OAAO,EAAE,MAAM,EAAE,IAAI,IAAI,GAAG,CAAA;IACzC,MAAM,QAAQ,GAAG,OAAO,EAAE,MAAM,EAAE,QAAQ,IAAI,KAAK,CAAA;IACnD,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,EAAE,MAAM,CAAA;IACtC,MAAM,MAAM,GAAG,OAAO,EAAE,SAAS,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA,CAAC,kBAAkB;IAExE,wDAAwD;IACxD,MAAM,iBAAiB,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IAE9E,MAAM,KAAK,GAAG;QACZ,GAAG,IAAI,IAAI,SAAS,EAAE;QACtB,QAAQ,IAAI,EAAE;QACd,UAAU;QACV,YAAY,iBAAiB,EAAE;QAC/B,WAAW,MAAM,EAAE;KACpB,CAAA;IAED,IAAI,YAAY,EAAE,CAAC;QACjB,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IACtB,CAAC;IAED,IAAI,MAAM,EAAE,CAAC;QACX,KAAK,CAAC,IAAI,CAAC,UAAU,MAAM,EAAE,CAAC,CAAA;IAChC,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "clearauth",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "ClearAuth: lightweight authentication library with Arctic OAuth, pluggable password hashing, and Kysely-backed storage",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"clearauth",
|
|
@@ -68,11 +68,27 @@
|
|
|
68
68
|
"test:coverage": "vitest --coverage"
|
|
69
69
|
},
|
|
70
70
|
"peerDependencies": {
|
|
71
|
-
"react": ">=18"
|
|
71
|
+
"react": ">=18",
|
|
72
|
+
"@neondatabase/serverless": "^0.10.0",
|
|
73
|
+
"@libsql/client": "^0.14.0",
|
|
74
|
+
"@planetscale/database": "^1.19.0",
|
|
75
|
+
"postgres": "^3.4.0"
|
|
72
76
|
},
|
|
73
77
|
"peerDependenciesMeta": {
|
|
74
78
|
"react": {
|
|
75
79
|
"optional": true
|
|
80
|
+
},
|
|
81
|
+
"@neondatabase/serverless": {
|
|
82
|
+
"optional": true
|
|
83
|
+
},
|
|
84
|
+
"@libsql/client": {
|
|
85
|
+
"optional": true
|
|
86
|
+
},
|
|
87
|
+
"@planetscale/database": {
|
|
88
|
+
"optional": true
|
|
89
|
+
},
|
|
90
|
+
"postgres": {
|
|
91
|
+
"optional": true
|
|
76
92
|
}
|
|
77
93
|
},
|
|
78
94
|
"dependencies": {
|