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.
Files changed (88) hide show
  1. package/CHANGELOG.md +83 -0
  2. package/README.md +102 -15
  3. package/dist/auth/handler.d.ts +2 -0
  4. package/dist/auth/handler.js +183 -12
  5. package/dist/auth/handler.js.map +1 -1
  6. package/dist/auth/magic-link.d.ts +94 -0
  7. package/dist/auth/magic-link.js +188 -0
  8. package/dist/auth/magic-link.js.map +1 -0
  9. package/dist/auth/utils.d.ts +18 -0
  10. package/dist/auth/utils.js +38 -0
  11. package/dist/auth/utils.js.map +1 -1
  12. package/dist/database/providers/d1.d.ts +72 -0
  13. package/dist/database/providers/d1.js +117 -0
  14. package/dist/database/providers/d1.js.map +1 -0
  15. package/dist/database/providers/index.d.ts +18 -0
  16. package/dist/database/providers/index.js +19 -0
  17. package/dist/database/providers/index.js.map +1 -0
  18. package/dist/database/providers/neon.d.ts +41 -0
  19. package/dist/database/providers/neon.js +135 -0
  20. package/dist/database/providers/neon.js.map +1 -0
  21. package/dist/database/providers/planetscale.d.ts +51 -0
  22. package/dist/database/providers/planetscale.js +145 -0
  23. package/dist/database/providers/planetscale.js.map +1 -0
  24. package/dist/database/providers/supabase.d.ts +44 -0
  25. package/dist/database/providers/supabase.js +148 -0
  26. package/dist/database/providers/supabase.js.map +1 -0
  27. package/dist/database/providers/turso.d.ts +45 -0
  28. package/dist/database/providers/turso.js +149 -0
  29. package/dist/database/providers/turso.js.map +1 -0
  30. package/dist/database/schema.d.ts +28 -0
  31. package/dist/database/schema.js +6 -0
  32. package/dist/database/schema.js.map +1 -1
  33. package/dist/edge.d.ts +47 -0
  34. package/dist/edge.js +47 -0
  35. package/dist/edge.js.map +1 -1
  36. package/dist/email/manager.d.ts +26 -0
  37. package/dist/email/manager.js +88 -0
  38. package/dist/email/manager.js.map +1 -0
  39. package/dist/email/providers/postmark.d.ts +17 -0
  40. package/dist/email/providers/postmark.js +42 -0
  41. package/dist/email/providers/postmark.js.map +1 -0
  42. package/dist/email/providers/resend.d.ts +17 -0
  43. package/dist/email/providers/resend.js +40 -0
  44. package/dist/email/providers/resend.js.map +1 -0
  45. package/dist/email/providers/sendgrid.d.ts +20 -0
  46. package/dist/email/providers/sendgrid.js +52 -0
  47. package/dist/email/providers/sendgrid.js.map +1 -0
  48. package/dist/email/templates.d.ts +20 -0
  49. package/dist/email/templates.js +82 -0
  50. package/dist/email/templates.js.map +1 -0
  51. package/dist/index.d.ts +13 -3
  52. package/dist/index.js +15 -3
  53. package/dist/index.js.map +1 -1
  54. package/dist/oauth/apple.d.ts +9 -0
  55. package/dist/oauth/apple.js +36 -0
  56. package/dist/oauth/apple.js.map +1 -0
  57. package/dist/oauth/arctic-providers.d.ts +26 -1
  58. package/dist/oauth/arctic-providers.js +103 -1
  59. package/dist/oauth/arctic-providers.js.map +1 -1
  60. package/dist/oauth/callbacks.d.ts +3 -3
  61. package/dist/oauth/callbacks.js +2 -2
  62. package/dist/oauth/callbacks.js.map +1 -1
  63. package/dist/oauth/discord.d.ts +9 -0
  64. package/dist/oauth/discord.js +40 -0
  65. package/dist/oauth/discord.js.map +1 -0
  66. package/dist/oauth/handler.d.ts +1 -14
  67. package/dist/oauth/handler.js +103 -178
  68. package/dist/oauth/handler.js.map +1 -1
  69. package/dist/oauth/linkedin.d.ts +9 -0
  70. package/dist/oauth/linkedin.js +42 -0
  71. package/dist/oauth/linkedin.js.map +1 -0
  72. package/dist/oauth/meta.d.ts +9 -0
  73. package/dist/oauth/meta.js +40 -0
  74. package/dist/oauth/meta.js.map +1 -0
  75. package/dist/oauth/microsoft.d.ts +10 -0
  76. package/dist/oauth/microsoft.js +38 -0
  77. package/dist/oauth/microsoft.js.map +1 -0
  78. package/dist/react.d.ts +2 -0
  79. package/dist/react.js +16 -1
  80. package/dist/react.js.map +1 -1
  81. package/dist/session/validate.d.ts +87 -0
  82. package/dist/session/validate.js +125 -0
  83. package/dist/session/validate.js.map +1 -0
  84. package/dist/types.d.ts +78 -0
  85. package/dist/utils/cookies.d.ts +70 -0
  86. package/dist/utils/cookies.js +90 -0
  87. package/dist/utils/cookies.js.map +1 -0
  88. 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":"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"}
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.2",
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": {