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/CHANGELOG.md CHANGED
@@ -5,6 +5,89 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [Unreleased]
9
+
10
+ ## [0.4.0] - 2026-01-12
11
+
12
+ ### Added
13
+
14
+ - **Multi-Database Provider Support** - Expanded database compatibility beyond Mech Storage
15
+ - **Neon PostgreSQL** - Serverless PostgreSQL with HTTP API (edge-compatible)
16
+ - **Turso (libSQL)** - Edge-hosted distributed SQLite database
17
+ - **Cloudflare D1** - Native SQLite for Cloudflare Workers
18
+ - **PlanetScale** - Serverless MySQL with HTTP API (edge-compatible)
19
+ - **Supabase PostgreSQL** - PostgreSQL with connection pooler for edge
20
+ - Complete Kysely adapters for all providers with consistent API
21
+ - Dynamic imports to avoid bundling unused providers
22
+ - Connection pooling at Driver level for optimal performance
23
+ - Comprehensive documentation in `docs/DATABASE_PROVIDERS.md`
24
+ - Transparent limitations documentation in `docs/DATABASE_PROVIDERS_LIMITATIONS.md`
25
+ - Complete migration scripts for SQLite (Turso/D1) and MySQL (PlanetScale)
26
+ - All 5 database tables supported: users, sessions, email_verification_tokens, password_reset_tokens, magic_link_tokens
27
+ - 29 passing tests covering all providers
28
+ - Error sanitization to prevent credential exposure in logs
29
+ - Helpful error messages with installation instructions
30
+
31
+ ### Fixed
32
+
33
+ - **Connection Pooling** - Clients now cached at Driver level instead of per-query
34
+ - Turso: Proper client caching with cleanup via `close()`
35
+ - Supabase: postgres.js client cached with cleanup via `end()`
36
+ - PlanetScale: Connection cached (stateless HTTP)
37
+ - Prevents memory leaks and improves performance
38
+ - **Error Handling** - Better module detection and credential sanitization
39
+ - Detects missing modules in both CJS and ESM environments
40
+ - Sanitizes connection strings, auth tokens, and passwords in error messages
41
+ - Provides helpful installation instructions with GitHub links
42
+ - **SQLite Trigger** - Fixed potential infinite recursion in timestamp update trigger
43
+ - Added WHEN clause to only trigger when timestamp hasn't changed
44
+
45
+ ### Documentation
46
+
47
+ - Added `DATABASE_PROVIDERS.md` with setup guides for all 6 providers
48
+ - Added `DATABASE_PROVIDERS_LIMITATIONS.md` documenting:
49
+ - Schema type differences (PostgreSQL vs SQLite vs MySQL)
50
+ - Transaction support limitations
51
+ - Connection pooling constraints
52
+ - Edge runtime requirements
53
+ - Security considerations
54
+ - Type conversion examples and workarounds
55
+ - Updated migration READMEs with complete setup instructions
56
+
57
+ ## [0.3.2] - Previous Release
58
+
59
+ ### Added
60
+
61
+ - **Magic Link Authentication** - Passwordless login via email
62
+ - `POST /auth/request-magic-link` - Request magic link for existing users
63
+ - `GET /auth/magic-link/verify` - Verify magic link and redirect with session cookie
64
+ - Login-only flow (existing users only, prevents signup spam)
65
+ - 15-minute token expiration for security
66
+ - One-time use tokens (deleted after consumption)
67
+ - Email enumeration prevention (always returns success)
68
+ - Automatic email verification on successful login
69
+ - `returnTo` redirect support with same-origin validation
70
+ - React `requestMagicLink(email, returnTo?)` action
71
+ - Comprehensive test coverage (19 tests)
72
+ - Database schema: `magic_link_tokens` table
73
+
74
+ ### Fixed
75
+
76
+ - **Cloudflare Pages Functions Compatibility** - Fixed request body parsing for edge runtimes
77
+ - Changed from `request.json()` to `request.text()` + `JSON.parse()` approach
78
+ - Resolves "Invalid JSON body" errors in Cloudflare Pages Functions
79
+ - Better error messages for empty bodies, consumed streams, and malformed JSON
80
+ - Added comprehensive test coverage (14 tests) for various body types and edge cases
81
+ - Compatible with ReadableStream, Uint8Array, and standard string bodies
82
+ - Fixes issue where POST requests (register, login, etc.) would fail in Cloudflare Pages Functions
83
+
84
+ - Fixed password reset payload mismatch between React client and server handler
85
+ - Server now accepts both `password` (canonical) and `newPassword` (deprecated) fields for backward compatibility
86
+ - React client updated to send `password` field to match server contract
87
+ - Resolves issue where password reset requests from React client would fail
88
+ - Added comprehensive test coverage for backward compatibility behavior
89
+ - `newPassword` field support will be removed in v2.0.0
90
+
8
91
  ## [0.3.0] - 2025-12-12
9
92
 
10
93
  ### 🎉 Major Refactor - Arctic Migration
package/README.md CHANGED
@@ -49,7 +49,7 @@ Or add to `package.json`:
49
49
  - **`clearauth/edge`**
50
50
  - **Environment:** Cloudflare Workers / edge runtimes
51
51
  - **Default password hasher:** PBKDF2 (no native dependencies)
52
- - **API:** `createClearAuth(...)`
52
+ - **API:** `createClearAuth(...)`, `handleClearAuthEdgeRequest(...)`, `validateSession(...)`, `getSessionFromCookie(...)`, `parseCookies(...)`, `createSessionCookie(...)`, `createMechKysely(...)`
53
53
  - **`clearauth/argon2`**
54
54
  - **Environment:** Node.js
55
55
  - **Export:** `createArgon2idPasswordHasher(...)` (use to explicitly override)
@@ -104,29 +104,25 @@ export async function POST(request: Request) {
104
104
 
105
105
  ### Cloudflare Workers
106
106
 
107
- Create `src/auth.ts`:
107
+ ClearAuth runs entirely on Cloudflare Workers with no Node.js backend required. See [CLOUDFLARE.md](./CLOUDFLARE.md) for the full guide.
108
108
 
109
109
  ```ts
110
110
  import { createClearAuth, handleClearAuthEdgeRequest } from "clearauth/edge"
111
111
 
112
- export function createAuth(env: Env) {
113
- return createClearAuth({
114
- secret: env.AUTH_SECRET,
115
- baseUrl: "https://your-worker.workers.dev",
116
- database: {
117
- appId: env.MECH_APP_ID,
118
- apiKey: env.MECH_API_KEY,
119
- },
120
- isProduction: true,
121
- })
122
- }
123
-
124
112
  export default {
125
113
  async fetch(request: Request, env: Env): Promise<Response> {
126
114
  const url = new URL(request.url)
127
115
 
128
116
  if (url.pathname.startsWith("/auth")) {
129
- const config = createAuth(env)
117
+ const config = createClearAuth({
118
+ secret: env.AUTH_SECRET,
119
+ baseUrl: "https://your-worker.workers.dev",
120
+ database: {
121
+ appId: env.MECH_APP_ID,
122
+ apiKey: env.MECH_API_KEY,
123
+ },
124
+ isProduction: true,
125
+ })
130
126
  return handleClearAuthEdgeRequest(request, config)
131
127
  }
132
128
 
@@ -135,6 +131,64 @@ export default {
135
131
  }
136
132
  ```
137
133
 
134
+ #### Session Validation Middleware
135
+
136
+ ```ts
137
+ import { getSessionFromCookie, createMechKysely } from "clearauth/edge"
138
+
139
+ // In your worker
140
+ const db = createMechKysely({ appId: env.MECH_APP_ID, apiKey: env.MECH_API_KEY })
141
+ const session = await getSessionFromCookie(request, db)
142
+
143
+ if (!session) {
144
+ return new Response("Unauthorized", { status: 401 })
145
+ }
146
+ // session.user.email, session.user.id, etc.
147
+ ```
148
+
149
+ See [`examples/cloudflare-workers/`](./examples/cloudflare-workers/) for a complete example.
150
+
151
+ ### Express API
152
+
153
+ ```ts
154
+ import express from 'express';
155
+ import { handleClearAuthRequest, validateSession, parseCookies } from 'clearauth';
156
+ import { createClearAuthNode } from 'clearauth/node';
157
+
158
+ const app = express();
159
+ const auth = createClearAuthNode({
160
+ secret: process.env.AUTH_SECRET,
161
+ baseUrl: process.env.BASE_URL,
162
+ database: { appId: process.env.MECH_APP_ID, apiKey: process.env.MECH_API_KEY },
163
+ });
164
+
165
+ // Mount ClearAuth routes
166
+ app.all('/api/auth/*', async (req, res) => {
167
+ const request = new Request(`${req.protocol}://${req.get('host')}${req.originalUrl}`, {
168
+ method: req.method,
169
+ headers: new Headers(req.headers),
170
+ body: req.method !== 'GET' ? JSON.stringify(req.body) : undefined,
171
+ });
172
+ const response = await handleClearAuthRequest(request, auth);
173
+ res.status(response.status).send(await response.text());
174
+ });
175
+
176
+ // Auth middleware
177
+ async function requireAuth(req, res, next) {
178
+ const cookies = parseCookies(req.headers.cookie || '');
179
+ const sessionId = cookies.get('session');
180
+ if (sessionId) {
181
+ const result = await validateSession(sessionId, auth.database);
182
+ if (result) { req.user = result.user; return next(); }
183
+ }
184
+ res.status(401).json({ error: 'Unauthorized' });
185
+ }
186
+
187
+ app.get('/api/me', requireAuth, (req, res) => res.json({ user: req.user }));
188
+ ```
189
+
190
+ See [`examples/express-api/`](./examples/express-api/) for a complete example.
191
+
138
192
  ### React Client
139
193
 
140
194
  Wrap your app with `AuthProvider`:
@@ -206,6 +260,39 @@ All configuration must be passed explicitly to `createClearAuth()`:
206
260
  | `password` | `PasswordConfig` | Password validation rules (minLength) |
207
261
  | `cors` | `CorsConfig` | CORS configuration for browser clients |
208
262
 
263
+ ### Email Providers (Verification / Reset / Magic Link)
264
+
265
+ ClearAuth supports two approaches:
266
+
267
+ 1. **Callbacks** via `config.email.sendVerificationEmail`, `config.email.sendPasswordResetEmail`, `config.email.sendMagicLink`.
268
+ 2. **Built-in provider adapters** via `config.email.provider` (default templates).
269
+
270
+ Supported built-in provider adapters:
271
+ - `ResendProvider`
272
+ - `PostmarkProvider`
273
+ - `SendGridProvider`
274
+
275
+ Example (Resend):
276
+
277
+ ```ts
278
+ import { createClearAuthNode, ResendProvider } from "clearauth"
279
+
280
+ const auth = createClearAuthNode({
281
+ secret: process.env.AUTH_SECRET!,
282
+ baseUrl: process.env.BASE_URL!,
283
+ database: {
284
+ appId: process.env.MECH_APP_ID!,
285
+ apiKey: process.env.MECH_API_KEY!,
286
+ },
287
+ email: {
288
+ provider: new ResendProvider({
289
+ apiKey: process.env.RESEND_API_KEY!,
290
+ from: "Your App <no-reply@yourdomain.com>",
291
+ }),
292
+ },
293
+ })
294
+ ```
295
+
209
296
  ### Session Presets
210
297
 
211
298
  Three session configurations are available:
@@ -17,6 +17,7 @@ import type { ClearAuthConfig } from '../types.js';
17
17
  *
18
18
  * Supported routes:
19
19
  * - GET /auth/session - Get current user session
20
+ * - GET /auth/magic-link/verify - Verify magic link and redirect
20
21
  * - POST /auth/register - Register new user
21
22
  * - POST /auth/verify-email - Verify email with token
22
23
  * - POST /auth/resend-verification - Resend verification email
@@ -24,6 +25,7 @@ import type { ClearAuthConfig } from '../types.js';
24
25
  * - POST /auth/logout - Logout user
25
26
  * - POST /auth/request-reset - Request password reset
26
27
  * - POST /auth/reset-password - Reset password with token
28
+ * - POST /auth/request-magic-link - Request magic link for passwordless login
27
29
  *
28
30
  * @param request - HTTP request
29
31
  * @param config - Clear Auth configuration
@@ -13,22 +13,50 @@ import { registerUser, toPublicRegisterResult } from './register.js';
13
13
  import { verifyEmail, resendVerificationEmail } from './verify-email.js';
14
14
  import { loginUser, toPublicLoginResult } from './login.js';
15
15
  import { requestPasswordReset, resetPassword } from './reset-password.js';
16
+ import { requestMagicLink, consumeMagicLink } from './magic-link.js';
16
17
  import { deleteSession, validateSession, parseCookies, createDeleteCookieHeader, createCookieHeader, } from '../oauth/callbacks.js';
17
- import { AuthError } from './utils.js';
18
+ import { AuthError, isValidReturnTo } from './utils.js';
18
19
  import { toPublicUser } from '../database/schema.js';
20
+ import { EmailManager } from '../email/manager.js';
19
21
  /**
20
22
  * Parse JSON request body
21
23
  *
24
+ * This implementation uses request.text() + JSON.parse() instead of request.json()
25
+ * to ensure compatibility with Cloudflare Pages Functions and other edge runtimes
26
+ * where the request body stream may be consumed or locked.
27
+ *
22
28
  * @param request - HTTP request
23
29
  * @returns Parsed JSON body
30
+ * @throws {AuthError} If body is empty, already consumed, or contains invalid JSON
24
31
  * @internal
25
32
  */
26
33
  async function parseJsonBody(request) {
27
34
  try {
28
- return await request.json();
35
+ // Check if body has already been consumed
36
+ if (request.bodyUsed) {
37
+ throw new AuthError('Request body has already been consumed', 'BODY_CONSUMED', 400);
38
+ }
39
+ // Read body as text first (more reliable across different runtimes)
40
+ const bodyText = await request.text();
41
+ // Check if body is empty
42
+ if (!bodyText || !bodyText.trim()) {
43
+ throw new AuthError('Request body is empty', 'EMPTY_BODY', 400);
44
+ }
45
+ // Parse JSON manually with better error messages
46
+ try {
47
+ return JSON.parse(bodyText);
48
+ }
49
+ catch (parseError) {
50
+ throw new AuthError(`Invalid JSON in request body: ${parseError instanceof Error ? parseError.message : 'Unknown error'}`, 'INVALID_JSON', 400);
51
+ }
29
52
  }
30
53
  catch (error) {
31
- throw new AuthError('Invalid JSON body', 'INVALID_JSON', 400);
54
+ // If it's already an AuthError, re-throw it
55
+ if (error instanceof AuthError) {
56
+ throw error;
57
+ }
58
+ // Handle other errors (e.g., network issues, stream errors)
59
+ throw new AuthError(`Failed to read request body: ${error instanceof Error ? error.message : 'Unknown error'}`, 'BODY_READ_ERROR', 400);
32
60
  }
33
61
  }
34
62
  /**
@@ -119,6 +147,18 @@ async function handleRegister(request, config) {
119
147
  const context = getRequestContext(request);
120
148
  const result = await registerUser(config.database, email, password, context, config.passwordHasher);
121
149
  const publicResult = toPublicRegisterResult(result);
150
+ // Send verification email if required
151
+ if (config.emailPassword?.requireEmailVerification) {
152
+ const emailManager = new EmailManager(config);
153
+ const verificationUrl = `/auth/verify-email?token=${result.verificationToken}`;
154
+ try {
155
+ await emailManager.sendVerificationEmail(email, result.verificationToken, verificationUrl);
156
+ }
157
+ catch (error) {
158
+ console.error('[ClearAuth] Failed to send verification email:', error);
159
+ // Don't fail registration if email sending fails
160
+ }
161
+ }
122
162
  const cookieName = config.session?.cookie?.name ?? 'session';
123
163
  const expiresInSeconds = config.session?.expiresIn ?? 2592000;
124
164
  const sessionCookie = createCookieHeader(cookieName, result.sessionId, {
@@ -192,6 +232,16 @@ async function handleResendVerification(request, config) {
192
232
  throw new AuthError('Email is required', 'MISSING_EMAIL', 400);
193
233
  }
194
234
  const result = await resendVerificationEmail(config.database, email);
235
+ // Send the new verification email
236
+ const emailManager = new EmailManager(config);
237
+ const verificationUrl = `/auth/verify-email?token=${result.token}`;
238
+ try {
239
+ await emailManager.sendVerificationEmail(email, result.token, verificationUrl);
240
+ }
241
+ catch (error) {
242
+ console.error('[ClearAuth] Failed to send verification email:', error);
243
+ // Don't fail the request if email sending fails
244
+ }
195
245
  return jsonResponse(result);
196
246
  }
197
247
  /**
@@ -340,9 +390,17 @@ async function handleRequestReset(request, config) {
340
390
  if (!email) {
341
391
  throw new AuthError('Email is required', 'MISSING_EMAIL', 400);
342
392
  }
343
- // Note: onTokenGenerated callback should be provided by config for email sending
344
- // For now, we just store the token - users need to implement email sending
345
- await requestPasswordReset(config.database, email);
393
+ const emailManager = new EmailManager(config);
394
+ await requestPasswordReset(config.database, email, async (resolvedEmail, token) => {
395
+ const resetUrl = `/auth/reset-password?token=${token}`;
396
+ try {
397
+ await emailManager.sendPasswordResetEmail(resolvedEmail, token, resetUrl);
398
+ }
399
+ catch (error) {
400
+ console.error('[ClearAuth] Failed to send password reset email:', error);
401
+ // Don't fail the request if email sending fails
402
+ }
403
+ });
346
404
  // Always return success to prevent email enumeration
347
405
  return jsonResponse({
348
406
  success: true,
@@ -371,13 +429,116 @@ async function handleRequestReset(request, config) {
371
429
  */
372
430
  async function handleResetPassword(request, config) {
373
431
  const body = await parseJsonBody(request);
374
- const { token, password } = body;
375
- if (!token || !password) {
432
+ const { token, password, newPassword } = body;
433
+ // Backward compatibility: Accept both 'password' (canonical) and 'newPassword' (deprecated)
434
+ // TODO: Remove 'newPassword' support in v2.0.0
435
+ const resolvedPassword = password ?? newPassword;
436
+ if (!token || !resolvedPassword) {
376
437
  throw new AuthError('Token and password are required', 'MISSING_FIELDS', 400);
377
438
  }
378
- const result = await resetPassword(config.database, token, password, config.passwordHasher);
439
+ const result = await resetPassword(config.database, token, resolvedPassword, config.passwordHasher);
379
440
  return jsonResponse(result);
380
441
  }
442
+ /**
443
+ * Handle POST /auth/request-magic-link
444
+ *
445
+ * Request a magic link for passwordless login.
446
+ *
447
+ * **Security Note:** This endpoint always returns success, even if the email doesn't exist.
448
+ * This prevents email enumeration attacks.
449
+ *
450
+ * Request body:
451
+ * ```json
452
+ * {
453
+ * "email": "user@example.com",
454
+ * "returnTo": "/dashboard"
455
+ * }
456
+ * ```
457
+ *
458
+ * Response (always):
459
+ * ```json
460
+ * {
461
+ * "success": true,
462
+ * "message": "If your email is registered, you will receive a magic link to sign in."
463
+ * }
464
+ * ```
465
+ */
466
+ async function handleRequestMagicLink(request, config) {
467
+ const body = await parseJsonBody(request);
468
+ const { email, returnTo } = body;
469
+ if (!email) {
470
+ throw new AuthError('Email is required', 'MISSING_EMAIL', 400);
471
+ }
472
+ // Validate returnTo if provided
473
+ if (returnTo && !isValidReturnTo(returnTo, config.baseUrl)) {
474
+ throw new AuthError('Invalid returnTo URL', 'INVALID_RETURN_TO', 400);
475
+ }
476
+ const emailManager = new EmailManager(config);
477
+ await requestMagicLink(config.database, email, returnTo, async (resolvedEmail, token, linkUrl) => {
478
+ // linkUrl is relative and already includes returnTo encoding when provided
479
+ try {
480
+ await emailManager.sendMagicLink(resolvedEmail, token, linkUrl);
481
+ }
482
+ catch (error) {
483
+ console.error('[ClearAuth] Failed to send magic link email:', error);
484
+ // Don't fail the request if email sending fails
485
+ }
486
+ });
487
+ // Always return success to prevent email enumeration
488
+ return jsonResponse({
489
+ success: true,
490
+ message: 'If your email is registered, you will receive a magic link to sign in.',
491
+ });
492
+ }
493
+ /**
494
+ * Handle GET /auth/magic-link/verify
495
+ *
496
+ * Verify magic link token and log user in with HTTP redirect.
497
+ *
498
+ * Query parameters:
499
+ * - token: Magic link token (required)
500
+ * - returnTo: URL to redirect to after login (optional)
501
+ *
502
+ * Success: 302 redirect to returnTo (or default)
503
+ * Error: 400/404 with JSON error
504
+ */
505
+ async function handleVerifyMagicLink(request, config) {
506
+ const url = new URL(request.url);
507
+ const token = url.searchParams.get('token');
508
+ const returnTo = url.searchParams.get('returnTo');
509
+ if (!token) {
510
+ throw new AuthError('Magic link token is required', 'MISSING_TOKEN', 400);
511
+ }
512
+ const context = getRequestContext(request);
513
+ const result = await consumeMagicLink(config.database, token, context);
514
+ // Determine redirect URL
515
+ let redirectUrl = '/';
516
+ if (returnTo && isValidReturnTo(returnTo, config.baseUrl)) {
517
+ redirectUrl = returnTo;
518
+ }
519
+ else if (result.returnTo && isValidReturnTo(result.returnTo, config.baseUrl)) {
520
+ redirectUrl = result.returnTo;
521
+ }
522
+ // Create session cookie
523
+ const cookieName = config.session?.cookie?.name ?? 'session';
524
+ const expiresInSeconds = config.session?.expiresIn ?? 2592000;
525
+ const sessionCookie = createCookieHeader(cookieName, result.sessionId, {
526
+ httpOnly: config.session?.cookie?.httpOnly ?? true,
527
+ secure: config.session?.cookie?.secure ?? config.isProduction ?? true,
528
+ sameSite: config.session?.cookie?.sameSite ?? 'lax',
529
+ path: config.session?.cookie?.path ?? '/',
530
+ domain: config.session?.cookie?.domain,
531
+ maxAge: expiresInSeconds,
532
+ });
533
+ // HTTP 302 redirect with session cookie
534
+ return new Response(null, {
535
+ status: 302,
536
+ headers: {
537
+ 'Location': redirectUrl,
538
+ 'Set-Cookie': sessionCookie,
539
+ },
540
+ });
541
+ }
381
542
  /**
382
543
  * Handle GET /auth/session
383
544
  *
@@ -429,6 +590,7 @@ async function handleSession(request, config) {
429
590
  *
430
591
  * Supported routes:
431
592
  * - GET /auth/session - Get current user session
593
+ * - GET /auth/magic-link/verify - Verify magic link and redirect
432
594
  * - POST /auth/register - Register new user
433
595
  * - POST /auth/verify-email - Verify email with token
434
596
  * - POST /auth/resend-verification - Resend verification email
@@ -436,6 +598,7 @@ async function handleSession(request, config) {
436
598
  * - POST /auth/logout - Logout user
437
599
  * - POST /auth/request-reset - Request password reset
438
600
  * - POST /auth/reset-password - Reset password with token
601
+ * - POST /auth/request-magic-link - Request magic link for passwordless login
439
602
  *
440
603
  * @param request - HTTP request
441
604
  * @param config - Clear Auth configuration
@@ -451,9 +614,15 @@ export async function handleAuthRequest(request, config) {
451
614
  try {
452
615
  const url = new URL(request.url);
453
616
  const path = url.pathname.startsWith('/api/auth') ? url.pathname.replace(/^\/api/, '') : url.pathname;
454
- // Handle GET /auth/session
455
- if (request.method === 'GET' && path === '/auth/session') {
456
- return await handleSession(request, config);
617
+ // Handle GET requests
618
+ if (request.method === 'GET') {
619
+ if (path === '/auth/session') {
620
+ return await handleSession(request, config);
621
+ }
622
+ if (path === '/auth/magic-link/verify') {
623
+ return await handleVerifyMagicLink(request, config);
624
+ }
625
+ return jsonResponse({ error: 'Not found' }, 404);
457
626
  }
458
627
  // Only handle POST requests for other routes
459
628
  if (request.method !== 'POST') {
@@ -475,6 +644,8 @@ export async function handleAuthRequest(request, config) {
475
644
  return await handleRequestReset(request, config);
476
645
  case '/auth/reset-password':
477
646
  return await handleResetPassword(request, config);
647
+ case '/auth/request-magic-link':
648
+ return await handleRequestMagicLink(request, config);
478
649
  default:
479
650
  return jsonResponse({ error: 'Not found' }, 404);
480
651
  }
@@ -1 +1 @@
1
- {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/auth/handler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/auth/handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAA;AACpE,OAAO,EAAE,WAAW,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAA;AACxE,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAC3D,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACzE,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AACpE,OAAO,EACL,aAAa,EACb,eAAe,EACf,YAAY,EACZ,wBAAwB,EACxB,kBAAkB,GACnB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAElD;;;;;;;;;;;GAWG;AACH,KAAK,UAAU,aAAa,CAAC,OAAgB;IAC3C,IAAI,CAAC;QACH,0CAA0C;QAC1C,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrB,MAAM,IAAI,SAAS,CAAC,wCAAwC,EAAE,eAAe,EAAE,GAAG,CAAC,CAAA;QACrF,CAAC;QAED,oEAAoE;QACpE,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAA;QAErC,yBAAyB;QACzB,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;YAClC,MAAM,IAAI,SAAS,CAAC,uBAAuB,EAAE,YAAY,EAAE,GAAG,CAAC,CAAA;QACjE,CAAC;QAED,iDAAiD;QACjD,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;QAC7B,CAAC;QAAC,OAAO,UAAU,EAAE,CAAC;YACpB,MAAM,IAAI,SAAS,CACjB,iCAAiC,UAAU,YAAY,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,EACrG,cAAc,EACd,GAAG,CACJ,CAAA;QACH,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,4CAA4C;QAC5C,IAAI,KAAK,YAAY,SAAS,EAAE,CAAC;YAC/B,MAAM,KAAK,CAAA;QACb,CAAC;QAED,4DAA4D;QAC5D,MAAM,IAAI,SAAS,CACjB,gCAAgC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,EAC1F,iBAAiB,EACjB,GAAG,CACJ,CAAA;IACH,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,SAAS,iBAAiB,CAAC,OAAgB;IACzC,OAAO;QACL,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,SAAS;QACzG,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,SAAS;KAC1D,CAAA;AACH,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,YAAY,CAAC,IAAS,EAAE,SAAiB,GAAG;IACnD,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE;QACxC,MAAM;QACN,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;SACnC;KACF,CAAC,CAAA;AACJ,CAAC;AAED;;;;;;GAMG;AACH,SAAS,aAAa,CAAC,KAAU;IAC/B,IAAI,KAAK,YAAY,SAAS,EAAE,CAAC;QAC/B,OAAO,YAAY,CACjB;YACE,KAAK,EAAE,KAAK,CAAC,OAAO;YACpB,IAAI,EAAE,KAAK,CAAC,IAAI;SACjB,EACD,KAAK,CAAC,UAAU,CACjB,CAAA;IACH,CAAC;IAED,gBAAgB;IAChB,OAAO,CAAC,KAAK,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAA;IACzC,OAAO,YAAY,CACjB;QACE,KAAK,EAAE,uBAAuB;QAC9B,IAAI,EAAE,gBAAgB;KACvB,EACD,GAAG,CACJ,CAAA;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,KAAK,UAAU,cAAc,CAAC,OAAgB,EAAE,MAAuB;IACrE,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,CAAA;IACzC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAA;IAEhC,IAAI,CAAC,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;QACxB,MAAM,IAAI,SAAS,CAAC,iCAAiC,EAAE,gBAAgB,EAAE,GAAG,CAAC,CAAA;IAC/E,CAAC;IAED,MAAM,OAAO,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAA;IAC1C,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,cAAc,CAAC,CAAA;IACnG,MAAM,YAAY,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAA;IAEnD,sCAAsC;IACtC,IAAI,MAAM,CAAC,aAAa,EAAE,wBAAwB,EAAE,CAAC;QACnD,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAA;QAC7C,MAAM,eAAe,GAAG,4BAA4B,MAAM,CAAC,iBAAiB,EAAE,CAAA;QAC9E,IAAI,CAAC;YACH,MAAM,YAAY,CAAC,qBAAqB,CAAC,KAAK,EAAE,MAAM,CAAC,iBAAiB,EAAE,eAAe,CAAC,CAAA;QAC5F,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,gDAAgD,EAAE,KAAK,CAAC,CAAA;YACtE,iDAAiD;QACnD,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,IAAI,SAAS,CAAA;IAC5D,MAAM,gBAAgB,GAAG,MAAM,CAAC,OAAO,EAAE,SAAS,IAAI,OAAO,CAAA;IAC7D,MAAM,aAAa,GAAG,kBAAkB,CAAC,UAAU,EAAE,MAAM,CAAC,SAAS,EAAE;QACrE,QAAQ,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,IAAI,IAAI;QAClD,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,MAAM,CAAC,YAAY,IAAI,IAAI;QACrE,QAAQ,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,IAAI,KAAK;QACnD,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,IAAI,GAAG;QACzC,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM;QACtC,MAAM,EAAE,gBAAgB;KACzB,CAAC,CAAA;IAEF,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE;QAChD,MAAM,EAAE,GAAG;QACX,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,YAAY,EAAE,aAAa;SAC5B;KACF,CAAC,CAAA;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,KAAK,UAAU,iBAAiB,CAAC,OAAgB,EAAE,MAAuB;IACxE,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,CAAA;IACzC,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAA;IAEtB,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,SAAS,CAAC,gCAAgC,EAAE,eAAe,EAAE,GAAG,CAAC,CAAA;IAC7E,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;IACxD,OAAO,YAAY,CAAC,MAAM,CAAC,CAAA;AAC7B,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,KAAK,UAAU,wBAAwB,CAAC,OAAgB,EAAE,MAAuB;IAC/E,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,CAAA;IACzC,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAA;IAEtB,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,SAAS,CAAC,mBAAmB,EAAE,eAAe,EAAE,GAAG,CAAC,CAAA;IAChE,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,uBAAuB,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;IAEpE,kCAAkC;IAClC,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAA;IAC7C,MAAM,eAAe,GAAG,4BAA4B,MAAM,CAAC,KAAK,EAAE,CAAA;IAClE,IAAI,CAAC;QACH,MAAM,YAAY,CAAC,qBAAqB,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,eAAe,CAAC,CAAA;IAChF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,gDAAgD,EAAE,KAAK,CAAC,CAAA;QACtE,gDAAgD;IAClD,CAAC;IAED,OAAO,YAAY,CAAC,MAAM,CAAC,CAAA;AAC7B,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,KAAK,UAAU,WAAW,CAAC,OAAgB,EAAE,MAAuB;IAClE,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,CAAA;IACzC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAA;IAEhC,IAAI,CAAC,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;QACxB,MAAM,IAAI,SAAS,CAAC,iCAAiC,EAAE,gBAAgB,EAAE,GAAG,CAAC,CAAA;IAC/E,CAAC;IAED,MAAM,OAAO,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAA;IAC1C,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,cAAc,CAAC,CAAA;IAChG,MAAM,YAAY,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAA;IAEhD,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,IAAI,SAAS,CAAA;IAC5D,MAAM,gBAAgB,GAAG,MAAM,CAAC,OAAO,EAAE,SAAS,IAAI,OAAO,CAAA;IAC7D,MAAM,aAAa,GAAG,kBAAkB,CAAC,UAAU,EAAE,MAAM,CAAC,SAAS,EAAE;QACrE,QAAQ,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,IAAI,IAAI;QAClD,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,MAAM,CAAC,YAAY,IAAI,IAAI;QACrE,QAAQ,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,IAAI,KAAK;QACnD,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,IAAI,GAAG;QACzC,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM;QACtC,MAAM,EAAE,gBAAgB;KACzB,CAAC,CAAA;IAEF,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE;QAChD,MAAM,EAAE,GAAG;QACX,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,YAAY,EAAE,aAAa;SAC5B;KACF,CAAC,CAAA;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,KAAK,UAAU,YAAY,CAAC,OAAgB,EAAE,MAAuB;IACnE,IAAI,SAA6B,CAAA;IACjC,IAAI,kBAAkB,GAAG,KAAK,CAAA;IAC9B,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAA;QACjC,SAAS,GAAG,IAAI,EAAE,SAAS,CAAA;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,wDAAwD;IAC1D,CAAC;IAED,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QAClD,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,OAAO,GAAG,YAAY,CAAC,YAAY,CAAC,CAAA;YAC1C,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,IAAI,SAAS,CAAA;YAC5D,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;YAC/B,kBAAkB,GAAG,OAAO,CAAC,SAAS,CAAC,CAAA;QACzC,CAAC;IACH,CAAC;IAED,IAAI,kBAAkB,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QAC5C,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAA;YACjD,IAAI,MAAM,KAAK,aAAa,EAAE,CAAC;gBAC7B,MAAM,IAAI,SAAS,CAAC,WAAW,EAAE,WAAW,EAAE,GAAG,CAAC,CAAA;YACpD,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,IAAI,SAAS,CAAA;IAC5D,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,IAAI,GAAG,CAAA;IACtD,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAA;IAEnD,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,aAAa,CAAC,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAA;IACjD,CAAC;IAED,MAAM,mBAAmB,GAAG,wBAAwB,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAA;IAC5G,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE;QACrD,MAAM,EAAE,GAAG;QACX,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,YAAY,EAAE,mBAAmB;SAClC;KACF,CAAC,CAAA;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,KAAK,UAAU,kBAAkB,CAAC,OAAgB,EAAE,MAAuB;IACzE,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,CAAA;IACzC,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAA;IAEtB,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,SAAS,CAAC,mBAAmB,EAAE,eAAe,EAAE,GAAG,CAAC,CAAA;IAChE,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAA;IAC7C,MAAM,oBAAoB,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,EAAE;QAChF,MAAM,QAAQ,GAAG,8BAA8B,KAAK,EAAE,CAAA;QACtD,IAAI,CAAC;YACH,MAAM,YAAY,CAAC,sBAAsB,CAAC,aAAa,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAA;QAC3E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,kDAAkD,EAAE,KAAK,CAAC,CAAA;YACxE,gDAAgD;QAClD,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,qDAAqD;IACrD,OAAO,YAAY,CAAC;QAClB,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,sEAAsE;KAChF,CAAC,CAAA;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,KAAK,UAAU,mBAAmB,CAAC,OAAgB,EAAE,MAAuB;IAC1E,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,CAAA;IACzC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,IAAI,CAAA;IAC7C,4FAA4F;IAC5F,+CAA+C;IAC/C,MAAM,gBAAgB,GAAG,QAAQ,IAAI,WAAW,CAAA;IAEhD,IAAI,CAAC,KAAK,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAChC,MAAM,IAAI,SAAS,CAAC,iCAAiC,EAAE,gBAAgB,EAAE,GAAG,CAAC,CAAA;IAC/E,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,EAAE,gBAAgB,EAAE,MAAM,CAAC,cAAc,CAAC,CAAA;IACnG,OAAO,YAAY,CAAC,MAAM,CAAC,CAAA;AAC7B,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,KAAK,UAAU,sBAAsB,CAAC,OAAgB,EAAE,MAAuB;IAC7E,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,CAAA;IACzC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAA;IAEhC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,SAAS,CAAC,mBAAmB,EAAE,eAAe,EAAE,GAAG,CAAC,CAAA;IAChE,CAAC;IAED,gCAAgC;IAChC,IAAI,QAAQ,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3D,MAAM,IAAI,SAAS,CAAC,sBAAsB,EAAE,mBAAmB,EAAE,GAAG,CAAC,CAAA;IACvE,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAA;IAC7C,MAAM,gBAAgB,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QAC/F,2EAA2E;QAC3E,IAAI,CAAC;YACH,MAAM,YAAY,CAAC,aAAa,CAAC,aAAa,EAAE,KAAK,EAAE,OAAO,CAAC,CAAA;QACjE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,8CAA8C,EAAE,KAAK,CAAC,CAAA;YACpE,gDAAgD;QAClD,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,qDAAqD;IACrD,OAAO,YAAY,CAAC;QAClB,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,wEAAwE;KAClF,CAAC,CAAA;AACJ,CAAC;AAED;;;;;;;;;;;GAWG;AACH,KAAK,UAAU,qBAAqB,CAAC,OAAgB,EAAE,MAAuB;IAC5E,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IAChC,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;IAC3C,MAAM,QAAQ,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;IAEjD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,SAAS,CAAC,8BAA8B,EAAE,eAAe,EAAE,GAAG,CAAC,CAAA;IAC3E,CAAC;IAED,MAAM,OAAO,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAA;IAC1C,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,CAAA;IAEtE,yBAAyB;IACzB,IAAI,WAAW,GAAG,GAAG,CAAA;IACrB,IAAI,QAAQ,IAAI,eAAe,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1D,WAAW,GAAG,QAAQ,CAAA;IACxB,CAAC;SAAM,IAAI,MAAM,CAAC,QAAQ,IAAI,eAAe,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/E,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAA;IAC/B,CAAC;IAED,wBAAwB;IACxB,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,IAAI,SAAS,CAAA;IAC5D,MAAM,gBAAgB,GAAG,MAAM,CAAC,OAAO,EAAE,SAAS,IAAI,OAAO,CAAA;IAC7D,MAAM,aAAa,GAAG,kBAAkB,CAAC,UAAU,EAAE,MAAM,CAAC,SAAS,EAAE;QACrE,QAAQ,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,IAAI,IAAI;QAClD,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,MAAM,CAAC,YAAY,IAAI,IAAI;QACrE,QAAQ,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,IAAI,KAAK;QACnD,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,IAAI,GAAG;QACzC,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM;QACtC,MAAM,EAAE,gBAAgB;KACzB,CAAC,CAAA;IAEF,wCAAwC;IACxC,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE;QACxB,MAAM,EAAE,GAAG;QACX,OAAO,EAAE;YACP,UAAU,EAAE,WAAW;YACvB,YAAY,EAAE,aAAa;SAC5B;KACF,CAAC,CAAA;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,KAAK,UAAU,aAAa,CAAC,OAAgB,EAAE,MAAuB;IACpE,6BAA6B;IAC7B,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;IAClD,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,YAAY,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;IACrC,CAAC;IAED,MAAM,OAAO,GAAG,YAAY,CAAC,YAAY,CAAC,CAAA;IAC1C,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,IAAI,SAAS,CAAC,CAAA;IAEpE,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,YAAY,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;IACrC,CAAC;IAED,mBAAmB;IACnB,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAA;IAE9D,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,YAAY,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;IACrC,CAAC;IAED,OAAO,YAAY,CAAC,EAAE,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;AACnD,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,OAAgB,EAChB,MAAuB;IAEvB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QAChC,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAA;QAErG,sBAAsB;QACtB,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;YAC7B,IAAI,IAAI,KAAK,eAAe,EAAE,CAAC;gBAC7B,OAAO,MAAM,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;YAC7C,CAAC;YACD,IAAI,IAAI,KAAK,yBAAyB,EAAE,CAAC;gBACvC,OAAO,MAAM,qBAAqB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;YACrD,CAAC;YACD,OAAO,YAAY,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,GAAG,CAAC,CAAA;QAClD,CAAC;QAED,6CAA6C;QAC7C,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC9B,OAAO,YAAY,CAAC,EAAE,KAAK,EAAE,oBAAoB,EAAE,EAAE,GAAG,CAAC,CAAA;QAC3D,CAAC;QAED,+BAA+B;QAC/B,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,gBAAgB;gBACnB,OAAO,MAAM,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;YAE9C,KAAK,oBAAoB;gBACvB,OAAO,MAAM,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;YAEjD,KAAK,2BAA2B;gBAC9B,OAAO,MAAM,wBAAwB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;YAExD,KAAK,aAAa;gBAChB,OAAO,MAAM,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;YAE3C,KAAK,cAAc;gBACjB,OAAO,MAAM,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;YAE5C,KAAK,qBAAqB;gBACxB,OAAO,MAAM,kBAAkB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;YAElD,KAAK,sBAAsB;gBACzB,OAAO,MAAM,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;YAEnD,KAAK,0BAA0B;gBAC7B,OAAO,MAAM,sBAAsB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;YAEtD;gBACE,OAAO,YAAY,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,GAAG,CAAC,CAAA;QACpD,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,aAAa,CAAC,KAAK,CAAC,CAAA;IAC7B,CAAC;AACH,CAAC"}