@access-dlsu/leapify 0.260505.5 → 0.260506.1
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/dist/app.d.ts +15 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/auth/auth.d.ts +99 -0
- package/dist/auth/auth.d.ts.map +1 -0
- package/dist/auth/middleware.d.ts +20 -0
- package/dist/auth/middleware.d.ts.map +1 -0
- package/dist/auth/types.d.ts +17 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/bun-sqlite-dialect-na--YwnN-CVHVB5NF.js +160 -0
- package/dist/bun-sqlite-dialect-na--YwnN-CVHVB5NF.js.map +1 -0
- package/dist/bun-sqlite-dialect-na--YwnN-QDBSQQTR.cjs +162 -0
- package/dist/bun-sqlite-dialect-na--YwnN-QDBSQQTR.cjs.map +1 -0
- package/dist/chunk-4DPT2KQR.cjs +467 -0
- package/dist/chunk-4DPT2KQR.cjs.map +1 -0
- package/dist/chunk-57ANXUP7.cjs +6191 -0
- package/dist/chunk-57ANXUP7.cjs.map +1 -0
- package/dist/chunk-5JKLV7IE.cjs +2962 -0
- package/dist/chunk-5JKLV7IE.cjs.map +1 -0
- package/dist/{chunk-FLR7TNLN.js → chunk-63CUZGSZ.js} +4 -12
- package/dist/chunk-63CUZGSZ.js.map +1 -0
- package/dist/chunk-ANNHE3PZ.js +2285 -0
- package/dist/chunk-ANNHE3PZ.js.map +1 -0
- package/dist/chunk-DPPGYCX3.cjs +72 -0
- package/dist/chunk-DPPGYCX3.cjs.map +1 -0
- package/dist/chunk-EGRHWZRV.js +3 -0
- package/dist/chunk-EGRHWZRV.js.map +1 -0
- package/dist/chunk-EIF2O2BG.js +6187 -0
- package/dist/chunk-EIF2O2BG.js.map +1 -0
- package/dist/chunk-EMMSS5I5.cjs +37 -0
- package/dist/chunk-EMMSS5I5.cjs.map +1 -0
- package/dist/chunk-FTSMZYD7.js +3025 -0
- package/dist/chunk-FTSMZYD7.js.map +1 -0
- package/dist/chunk-G3PMV62Z.js +33 -0
- package/dist/chunk-G3PMV62Z.js.map +1 -0
- package/dist/chunk-GNRL67OU.js +2949 -0
- package/dist/chunk-GNRL67OU.js.map +1 -0
- package/dist/chunk-HHNEB7YR.js +8 -0
- package/dist/chunk-HHNEB7YR.js.map +1 -0
- package/dist/chunk-IQEWVHLM.js +889 -0
- package/dist/chunk-IQEWVHLM.js.map +1 -0
- package/dist/chunk-JPVIXCF5.cjs +10 -0
- package/dist/chunk-JPVIXCF5.cjs.map +1 -0
- package/dist/chunk-MNEW2V4T.js +447 -0
- package/dist/chunk-MNEW2V4T.js.map +1 -0
- package/dist/chunk-NKIQRCOM.cjs +4 -0
- package/dist/chunk-NKIQRCOM.cjs.map +1 -0
- package/dist/chunk-QARF2YFF.cjs +2296 -0
- package/dist/chunk-QARF2YFF.cjs.map +1 -0
- package/dist/chunk-RFP2X2FA.cjs +903 -0
- package/dist/chunk-RFP2X2FA.cjs.map +1 -0
- package/dist/chunk-SXBTHGIL.js +7138 -0
- package/dist/chunk-SXBTHGIL.js.map +1 -0
- package/dist/chunk-UWXYXU7J.cjs +7166 -0
- package/dist/chunk-UWXYXU7J.cjs.map +1 -0
- package/dist/chunk-XY4KBWXT.cjs +3066 -0
- package/dist/chunk-XY4KBWXT.cjs.map +1 -0
- package/dist/{chunk-3ZWIJNZG.cjs → chunk-YFJBE3AU.cjs} +4 -12
- package/dist/chunk-YFJBE3AU.cjs.map +1 -0
- package/dist/chunk-ZYHBHSSO.js +68 -0
- package/dist/chunk-ZYHBHSSO.js.map +1 -0
- package/dist/client/{index.d.cts → auth.d.ts} +140 -394
- package/dist/client/auth.d.ts.map +1 -0
- package/dist/client/index.cjs +840 -48
- package/dist/client/index.cjs.map +1 -1
- package/dist/client/index.d.ts +34 -1134
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +839 -47
- package/dist/client/index.js.map +1 -1
- package/dist/client/pow.d.ts +28 -0
- package/dist/client/pow.d.ts.map +1 -0
- package/dist/client/session.d.ts +29 -0
- package/dist/client/session.d.ts.map +1 -0
- package/dist/client/types.d.ts +25 -23
- package/dist/client/types.d.ts.map +1 -0
- package/dist/cron/batch-release.d.ts +9 -0
- package/dist/cron/batch-release.d.ts.map +1 -0
- package/dist/cron/lifecycle-check.d.ts +10 -0
- package/dist/cron/lifecycle-check.d.ts.map +1 -0
- package/dist/cron/reconcile-slots.d.ts +10 -0
- package/dist/cron/reconcile-slots.d.ts.map +1 -0
- package/dist/cron/reminder-emails.d.ts +9 -0
- package/dist/cron/reminder-emails.d.ts.map +1 -0
- package/dist/cron/renew-watches.d.ts +9 -0
- package/dist/cron/renew-watches.d.ts.map +1 -0
- package/dist/d1-sqlite-dialect-C2B7YsIT-CEUMIZZI.js +122 -0
- package/dist/d1-sqlite-dialect-C2B7YsIT-CEUMIZZI.js.map +1 -0
- package/dist/d1-sqlite-dialect-C2B7YsIT-JUX3YYMX.cjs +124 -0
- package/dist/d1-sqlite-dialect-C2B7YsIT-JUX3YYMX.cjs.map +1 -0
- package/dist/db/index.d.ts +7 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/migrate.d.ts +23 -0
- package/dist/db/migrate.d.ts.map +1 -0
- package/dist/db/schema/auth.d.ts +649 -0
- package/dist/db/schema/auth.d.ts.map +1 -0
- package/dist/db/schema/bookmarks.d.ts +88 -0
- package/dist/db/schema/bookmarks.d.ts.map +1 -0
- package/dist/db/schema/events.d.ts +539 -0
- package/dist/db/schema/events.d.ts.map +1 -0
- package/dist/db/schema/faqs.d.ts +154 -0
- package/dist/db/schema/faqs.d.ts.map +1 -0
- package/dist/db/schema/index.d.ts +8 -0
- package/dist/db/schema/index.d.ts.map +1 -0
- package/dist/db/schema/site-config.d.ts +64 -0
- package/dist/db/schema/site-config.d.ts.map +1 -0
- package/dist/db/schema/themes.d.ts +123 -0
- package/dist/db/schema/themes.d.ts.map +1 -0
- package/dist/{types-lTjxCp88.d.cts → db/schema/users.d.ts} +11 -96
- package/dist/db/schema/users.d.ts.map +1 -0
- package/dist/dist-DZHA5VYX.cjs +260 -0
- package/dist/dist-DZHA5VYX.cjs.map +1 -0
- package/dist/dist-RRQUBLLO.js +258 -0
- package/dist/dist-RRQUBLLO.js.map +1 -0
- package/dist/index.cjs +36987 -781
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +23 -1818
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +36846 -642
- package/dist/index.js.map +1 -1
- package/dist/kysely-adapter-5ZCECLNV.cjs +27 -0
- package/dist/kysely-adapter-5ZCECLNV.cjs.map +1 -0
- package/dist/kysely-adapter-6CZEASJQ.js +10 -0
- package/dist/kysely-adapter-6CZEASJQ.js.map +1 -0
- package/dist/lib/errors.d.ts +15 -0
- package/dist/lib/errors.d.ts.map +1 -0
- package/dist/lib/middleware/cors.d.ts +3 -0
- package/dist/lib/middleware/cors.d.ts.map +1 -0
- package/dist/lib/middleware/error-handler.d.ts +3 -0
- package/dist/lib/middleware/error-handler.d.ts.map +1 -0
- package/dist/lib/middleware/pow-challenge.cjs +7 -7
- package/dist/lib/middleware/pow-challenge.d.ts +29 -18
- package/dist/lib/middleware/pow-challenge.d.ts.map +1 -0
- package/dist/lib/middleware/pow-challenge.js +2 -2
- package/dist/lib/middleware/rate-limit.d.ts +48 -0
- package/dist/lib/middleware/rate-limit.d.ts.map +1 -0
- package/dist/lib/middleware/referer-guard.d.ts +18 -0
- package/dist/lib/middleware/referer-guard.d.ts.map +1 -0
- package/dist/lib/retry.d.ts +12 -0
- package/dist/lib/retry.d.ts.map +1 -0
- package/dist/node-sqlite-dialect-HEMUZ4B2.js +160 -0
- package/dist/node-sqlite-dialect-HEMUZ4B2.js.map +1 -0
- package/dist/node-sqlite-dialect-QUBEEKKU.cjs +162 -0
- package/dist/node-sqlite-dialect-QUBEEKKU.cjs.map +1 -0
- package/dist/queues/handlers.d.ts +13 -0
- package/dist/queues/handlers.d.ts.map +1 -0
- package/dist/queues/jobs.d.ts +42 -0
- package/dist/queues/jobs.d.ts.map +1 -0
- package/dist/routes/events.d.ts +4 -0
- package/dist/routes/events.d.ts.map +1 -0
- package/dist/routes/faqs.d.ts +4 -0
- package/dist/routes/faqs.d.ts.map +1 -0
- package/dist/routes/health.d.ts +4 -0
- package/dist/routes/health.d.ts.map +1 -0
- package/dist/routes/internal/gforms-webhook.d.ts +4 -0
- package/dist/routes/internal/gforms-webhook.d.ts.map +1 -0
- package/dist/routes/site-config.d.ts +4 -0
- package/dist/routes/site-config.d.ts.map +1 -0
- package/dist/routes/themes.d.ts +4 -0
- package/dist/routes/themes.d.ts.map +1 -0
- package/dist/routes/uploads.d.ts +4 -0
- package/dist/routes/uploads.d.ts.map +1 -0
- package/dist/routes/users.d.ts +4 -0
- package/dist/routes/users.d.ts.map +1 -0
- package/dist/services/cache.d.ts +22 -0
- package/dist/services/cache.d.ts.map +1 -0
- package/dist/services/contentful-management.d.ts +53 -0
- package/dist/services/contentful-management.d.ts.map +1 -0
- package/dist/services/contentful.d.ts +97 -0
- package/dist/services/contentful.d.ts.map +1 -0
- package/dist/services/email.d.ts +75 -0
- package/dist/services/email.d.ts.map +1 -0
- package/dist/services/gforms.d.ts +60 -0
- package/dist/services/gforms.d.ts.map +1 -0
- package/dist/services/resend.d.ts +34 -0
- package/dist/services/resend.d.ts.map +1 -0
- package/dist/services/ses.d.ts +58 -0
- package/dist/services/ses.d.ts.map +1 -0
- package/dist/services/slots.d.ts +48 -0
- package/dist/services/slots.d.ts.map +1 -0
- package/dist/services/snapshot.d.ts +90 -0
- package/dist/services/snapshot.d.ts.map +1 -0
- package/dist/types.d.ts +66 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/worker-handler.d.ts +64 -0
- package/dist/worker-handler.d.ts.map +1 -0
- package/dist/worker.d.ts +36 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +2195 -2553
- package/dist/worker.js.map +1 -1
- package/package.json +152 -152
- package/dist/chunk-3ZWIJNZG.cjs.map +0 -1
- package/dist/chunk-FLR7TNLN.js.map +0 -1
- package/dist/client/types.d.cts +0 -192
- package/dist/index.d.cts +0 -1879
- package/dist/lib/middleware/pow-challenge.d.cts +0 -47
- package/dist/types-lTjxCp88.d.ts +0 -208
package/dist/client/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/client/auth.ts","../../src/client/pow.ts","../../src/client/session.ts","../../src/client/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Better Auth client helper for Leapify API consumers.\n *\n * This module is **browser-safe** — no Cloudflare, Drizzle, or Hono deps.\n * It wraps Better Auth's client SDK with the bearer plugin so that tokens\n * can be stored and retrieved as plain strings (no cookie dependency on\n * the consumer's frontend).\n *\n * @example\n * // lib/auth.ts (frontend)\n * import { createLeapifyAuthClient, signInWithGoogleRedirect } from 'leapify/client'\n *\n * export const authClient = createLeapifyAuthClient(process.env.NEXT_PUBLIC_API_URL!)\n *\n * // Redirect-based Google sign-in:\n * await signInWithGoogleRedirect(authClient, '/dashboard')\n */\n\nimport { createAuthClient } from 'better-auth/client'\n\nconst AUTH_TOKEN_KEY = 'better-auth.session_token'\n\n/**\n * Create a Better Auth client bound to the Leapify Worker URL.\n *\n * It uses the 'Bearer' auth type to send the stored session token\n * in the Authorization header.\n */\nexport function createLeapifyAuthClient(baseUrl: string) {\n return createAuthClient({\n baseURL: baseUrl,\n fetchOptions: {\n auth: {\n type: 'Bearer',\n token: () => {\n if (typeof window !== 'undefined') {\n return localStorage.getItem(AUTH_TOKEN_KEY) || ''\n }\n return ''\n }\n }\n }\n })\n}\n\nexport type LeapifyAuthClient = ReturnType<typeof createLeapifyAuthClient>\n\n/**\n * Sign in with Google via OAuth redirect flow.\n *\n * Redirects the browser to Google's OAuth page. After authentication,\n * Google redirects back to the Better Auth callback endpoint, which\n * creates a session and redirects to `callbackURL`.\n *\n * Call `syncCookieSessionToStorage()` on app init to restore the\n * session from the cookie after a redirect-based sign-in.\n *\n * @param authClient - Client created by createLeapifyAuthClient\n * @param callbackURL - Path or URL to redirect to after successful auth (e.g. '/dashboard')\n *\n * @example\n * import { signInWithGoogleRedirect } from 'leapify/client'\n *\n * document.getElementById('google-btn').onclick = () => {\n * signInWithGoogleRedirect(authClient, '/dashboard')\n * }\n */\nexport async function signInWithGoogleRedirect(\n authClient: LeapifyAuthClient,\n callbackURL: string,\n): Promise<void> {\n await authClient.signIn.social({\n provider: 'google',\n callbackURL,\n })\n}\n\n/**\n * Sync a cookie-based Better Auth session into localStorage.\n *\n * After an OAuth redirect flow, Better Auth stores the session in an\n * HTTP-only cookie. This function reads that session via `getSession()`\n * and stores the token in localStorage so that subsequent API calls\n * using the Bearer token work correctly.\n *\n * Call this once on app initialization, before `initializeSession()`.\n *\n * @param authClient - Client created by createLeapifyAuthClient\n *\n * @example\n * import { syncCookieSessionToStorage, initializeSession } from 'leapify/client'\n *\n * // On app mount:\n * await syncCookieSessionToStorage(authClient)\n * const user = await initializeSession(API_URL, getToken)\n */\nexport async function syncCookieSessionToStorage(\n authClient: LeapifyAuthClient,\n): Promise<void> {\n try {\n const result = await authClient.getSession()\n const data = result?.data as { session?: { token?: string } } | undefined\n const token = data?.session?.token\n if (token) {\n localStorage.setItem(AUTH_TOKEN_KEY, token)\n }\n } catch {\n // No cookie session — user is a guest.\n }\n}\n\n/**\n * Get the current bearer token from storage, or null for guests.\n * Pass this to `createLeapifyClient` as the `getToken` option.\n *\n * @example\n * import { createLeapifyClient } from 'leapify/client'\n * import { createLeapifyAuthClient, getLeapifyToken } from 'leapify/client'\n *\n * const authClient = createLeapifyAuthClient(API_URL)\n * const api = createLeapifyClient(API_URL, () => getLeapifyToken(authClient))\n */\nexport async function getLeapifyToken(\n // @ts-ignore - Kept for backwards compatibility with previous signature\n authClient?: LeapifyAuthClient,\n): Promise<string | null> {\n if (typeof window !== 'undefined') {\n return localStorage.getItem(AUTH_TOKEN_KEY)\n }\n return null\n}\n\n/**\n * Sign out the current user.\n */\nexport async function signOut(authClient: LeapifyAuthClient) {\n const result = await authClient.signOut()\n if (typeof window !== 'undefined') {\n localStorage.removeItem(AUTH_TOKEN_KEY)\n }\n return result\n}\n","/**\n * Browser-safe Proof-of-Work challenge solver.\n *\n * Solves the SHA-256 PoW challenge served by the leapify backend middleware.\n * After solving, the server sets a signed cookie (1h TTL) so subsequent\n * requests bypass the challenge automatically.\n *\n * Import from 'leapify/client' — no Cloudflare, Drizzle, or Hono deps.\n *\n * @example\n * import { solvePowChallenge } from 'leapify/client'\n *\n * // Call once on app load before any API requests\n * await solvePowChallenge('https://api.leap.yourdomain.com')\n */\n\nconst POW_VERIFY_PATH = \"/.well-known/leapify/pow/verify\";\n\n/**\n * Solve the backend's Proof-of-Work challenge if one is active.\n *\n * Probes the given base URL for an HTML challenge page. If detected,\n * brute-forces a SHA-256 nonce (~100-500ms) and submits the solution.\n * The resulting cookie covers all API paths for 1 hour.\n *\n * @param baseUrl - The Leapify Worker URL (e.g. `https://api.leap.yourdomain.com`).\n * If omitted, uses the current page origin (same-origin requests).\n * @returns `true` if a challenge was solved, `false` if no challenge was needed.\n */\nexport async function solvePowChallenge(baseUrl?: string): Promise<boolean> {\n const base = baseUrl?.replace(/\\/$/, \"\") ?? \"\";\n\n let html: string;\n try {\n const res = await fetch(`${base}/events`, { credentials: \"include\" });\n const ct = res.headers.get(\"content-type\") || \"\";\n if (!ct.includes(\"text/html\")) {\n return false;\n }\n html = await res.text();\n } catch {\n return false;\n }\n\n const idMatch = html.match(/challengeId\\s*=\\s*\"([^\"]+)\"/);\n const diffMatch = html.match(/difficulty\\s*=\\s*(\\d+)/);\n if (!idMatch || !diffMatch) {\n return false;\n }\n\n const challengeId = idMatch[1];\n const difficulty = Number(diffMatch[1]);\n const prefix = \"0\".repeat(Math.ceil(difficulty / 4));\n\n let nonce = 0;\n while (true) {\n const input = new TextEncoder().encode(`${challengeId}:${nonce}`);\n const hash = await crypto.subtle.digest(\"SHA-256\", input);\n const hex = Array.from(new Uint8Array(hash))\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n if (hex.startsWith(prefix)) {\n await fetch(`${base}${POW_VERIFY_PATH}`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ id: challengeId, nonce, elapsed: 0 }),\n credentials: \"include\",\n });\n return true;\n }\n nonce++;\n }\n}\n","/**\n * Browser-safe session initialization helper.\n *\n * Solves the PoW challenge (if active), checks for an existing session token,\n * and fetches the user profile. Returns the authenticated user or null.\n *\n * Import from 'leapify/client' — no Cloudflare, Drizzle, or Hono deps.\n *\n * @example\n * import { initializeSession, createLeapifyClient } from 'leapify/client'\n *\n * const user = await initializeSession(\n * 'https://api.leap.yourdomain.com',\n * () => getLeapifyToken(),\n * )\n * if (user) {\n * console.log(`Welcome ${user.name} (${user.role})`)\n * }\n */\n\nimport { solvePowChallenge } from \"./pow\";\nimport type { UserProfile } from \"./types\";\n\n/**\n * Initialize a browser session: solve PoW, restore existing token, fetch profile.\n *\n * @param baseUrl - The Leapify Worker URL.\n * @param getToken - Async function returning the current session token, or null.\n * @returns The authenticated user profile, or null if not signed in.\n */\nexport async function initializeSession(\n baseUrl: string,\n getToken: () => Promise<string | null>,\n): Promise<UserProfile | null> {\n await solvePowChallenge(baseUrl);\n\n const token = await getToken();\n if (!token) return null;\n\n const base = baseUrl.replace(/\\/$/, \"\");\n const res = await fetch(`${base}/users/me`, {\n headers: { Authorization: `Bearer ${token}` },\n });\n\n if (!res.ok) return null;\n\n const body = await res.json().catch(() => ({}));\n return (body as { data: UserProfile | null }).data ?? null;\n}\n","/**\r\n * Leapify browser-safe API client.\r\n *\r\n * Import from 'leapify/client' — no Cloudflare, Drizzle, or Hono dependencies.\r\n *\r\n * @example\r\n * import { createLeapifyClient, createLeapifyAuthClient, getLeapifyToken } from 'leapify/client'\r\n *\r\n * const authClient = createLeapifyAuthClient(process.env.NEXT_PUBLIC_API_URL!)\r\n * const api = createLeapifyClient(\r\n * process.env.NEXT_PUBLIC_API_URL!,\r\n * () => getLeapifyToken(authClient),\r\n * )\r\n *\r\n * const events = await api.getEvents()\r\n */\r\n\r\nexport type {\r\n LeapEvent,\r\n SlotInfo,\r\n UserProfile,\r\n BookmarkEntry,\r\n Faq,\r\n Theme,\r\n SiteConfig,\r\n ToggleBookmarkResult,\r\n LeapifyErrorBody,\r\n UserRole,\r\n EventStatus,\r\n CreateEventBody,\r\n CreateFaqBody,\r\n SnapshotResult,\r\n HealthResponse,\r\n RuntimeConfig,\r\n} from \"./types\";\r\n\r\nexport {\r\n createLeapifyAuthClient,\r\n signInWithGoogleRedirect,\r\n syncCookieSessionToStorage,\r\n getLeapifyToken,\r\n signOut,\r\n} from \"./auth\";\r\nexport type { LeapifyAuthClient } from \"./auth\";\r\n\r\nexport { solvePowChallenge } from \"./pow\";\r\nexport { initializeSession } from \"./session\";\r\n\r\n/**\r\n * Read the runtime config injected by the worker into HTML pages.\r\n * Returns null if not running in a browser or config not injected.\r\n */\r\nexport function getClientConfig(): RuntimeConfig | null {\r\n if (typeof window === \"undefined\") return null;\r\n const config = (window as unknown as Record<string, unknown>).__CONFIG__;\r\n if (!config || typeof config !== \"object\") return null;\r\n return config as RuntimeConfig;\r\n}\r\n\r\nimport type { RuntimeConfig } from \"./types\";\r\n\r\n/**\r\n * Structured error thrown by all client methods on non-2xx responses.\r\n *\r\n * @example\r\n * import { LeapifyApiError } from 'leapify/client'\r\n *\r\n * try {\r\n * await api.toggleBookmark(eventId)\r\n * } catch (err) {\r\n * if (err instanceof LeapifyApiError && err.code === 'UNAUTHORIZED') {\r\n * // redirect to sign-in\r\n * }\r\n * }\r\n */\r\nexport class LeapifyApiError extends Error {\r\n constructor(\r\n public readonly status: number,\r\n public readonly code: string,\r\n message: string,\r\n ) {\r\n super(message);\r\n this.name = \"LeapifyApiError\";\r\n }\r\n}\r\n\r\n// ─── Error code constants ───────────────────────────────────────────────────\r\n\r\nexport const LEAPIFY_ERROR_CODES = {\r\n UNAUTHORIZED: \"UNAUTHORIZED\",\r\n DOMAIN_RESTRICTED: \"DOMAIN_RESTRICTED\",\r\n FORBIDDEN: \"FORBIDDEN\",\r\n NOT_FOUND: \"NOT_FOUND\",\r\n CONFLICT: \"CONFLICT\",\r\n TOO_MANY_REQUESTS: \"TOO_MANY_REQUESTS\",\r\n SERVICE_UNAVAILABLE: \"SERVICE_UNAVAILABLE\",\r\n INTERNAL_ERROR: \"INTERNAL_ERROR\",\r\n} as const;\r\n\r\nexport type LeapifyErrorCode = keyof typeof LEAPIFY_ERROR_CODES;\r\n\r\n// ─── Client factory ─────────────────────────────────────────────────────────\r\n\r\nimport type {\r\n LeapEvent,\r\n SlotInfo,\r\n UserProfile,\r\n BookmarkEntry,\r\n Faq,\r\n Theme,\r\n SiteConfig,\r\n ToggleBookmarkResult,\r\n LeapifyErrorBody,\r\n CreateEventBody,\r\n CreateFaqBody,\r\n SnapshotResult,\r\n HealthResponse,\r\n} from \"./types\";\r\n\r\ntype GetTokenFn = () => Promise<string | null>;\r\n\r\nasync function buildHeaders(\r\n getToken: GetTokenFn | undefined,\r\n extra: Record<string, string> = {},\r\n): Promise<Record<string, string>> {\r\n const headers: Record<string, string> = {\r\n \"Content-Type\": \"application/json\",\r\n ...extra,\r\n };\r\n if (getToken) {\r\n const token = await getToken();\r\n if (token) headers[\"Authorization\"] = `Bearer ${token}`;\r\n }\r\n return headers;\r\n}\r\n\r\nasync function parseResponse<T>(res: Response): Promise<T> {\r\n if (res.status === 204) return undefined as T;\r\n\r\n const body = await res.json().catch(() => ({}));\r\n\r\n if (!res.ok) {\r\n const err = (body as LeapifyErrorBody)?.error;\r\n throw new LeapifyApiError(\r\n res.status,\r\n err?.code ?? \"UNKNOWN\",\r\n err?.message ?? res.statusText,\r\n );\r\n }\r\n\r\n return (body as { data: T }).data;\r\n}\r\n\r\n/**\r\n * Creates a typed Leapify API client bound to a base URL.\r\n *\r\n * @param baseUrl - The deployed Leapify Worker URL (e.g. `https://api.leap.yourdomain.com`).\r\n * @param getToken - Optional async function that returns a session token string,\r\n * or null for guest requests. Use `getLeapifyToken()` from this module.\r\n *\r\n * @example\r\n * // lib/api.ts\r\n * import { createLeapifyClient, getLeapifyToken } from 'leapify/client'\r\n *\r\n * export const api = createLeapifyClient(\r\n * process.env.NEXT_PUBLIC_API_URL!,\r\n * () => getLeapifyToken(),\r\n * )\r\n */\r\nexport function createLeapifyClient(baseUrl: string, getToken?: GetTokenFn) {\r\n const base = baseUrl.replace(/\\/$/, \"\");\r\n\r\n async function get<T>(path: string, init?: RequestInit): Promise<T> {\r\n const headers = await buildHeaders(getToken, init?.headers as Record<string, string>);\r\n const res = await fetch(`${base}${path}`, { ...init, method: \"GET\", headers });\r\n return parseResponse<T>(res);\r\n }\r\n\r\n async function post<T>(path: string, body?: unknown): Promise<T> {\r\n const headers = await buildHeaders(getToken);\r\n const res = await fetch(`${base}${path}`, {\r\n method: \"POST\",\r\n headers,\r\n ...(body !== undefined ? { body: JSON.stringify(body) } : {}),\r\n });\r\n return parseResponse<T>(res);\r\n }\r\n\r\n async function postFormData<T>(path: string, formData: FormData): Promise<T> {\r\n const headers: Record<string, string> = {};\r\n if (getToken) {\r\n const token = await getToken();\r\n if (token) headers[\"Authorization\"] = `Bearer ${token}`;\r\n }\r\n const res = await fetch(`${base}${path}`, {\r\n method: \"POST\",\r\n headers,\r\n body: formData,\r\n });\r\n return parseResponse<T>(res);\r\n }\r\n\r\n async function patch<T>(path: string, body: unknown): Promise<T> {\r\n const headers = await buildHeaders(getToken);\r\n const res = await fetch(`${base}${path}`, {\r\n method: \"PATCH\",\r\n headers,\r\n body: JSON.stringify(body),\r\n });\r\n return parseResponse<T>(res);\r\n }\r\n\r\n async function del<T>(path: string): Promise<T> {\r\n const headers = await buildHeaders(getToken);\r\n const res = await fetch(`${base}${path}`, { method: \"DELETE\", headers });\r\n return parseResponse<T>(res);\r\n }\r\n\r\n return {\r\n // ── Site Config ────────────────────────────────────────────────────────\r\n\r\n /**\r\n * GET /config\r\n * Returns site-wide configuration. Check `maintenanceMode` and\r\n * `comingSoonUntil` on app load to gate the UI appropriately.\r\n * Use `now` (server unix epoch) for timestamp comparisons.\r\n */\r\n getConfig(): Promise<SiteConfig> {\r\n return get<SiteConfig>(\"/config\");\r\n },\r\n\r\n /**\r\n * PATCH /config/:key — admin only.\r\n * Upserts a site config value. Requires admin or super_admin role.\r\n */\r\n updateConfig<K extends string>(key: K, value: unknown): Promise<{ key: K; value: unknown }> {\r\n return patch(`/config/${encodeURIComponent(key)}`, { value });\r\n },\r\n\r\n // ── Events ─────────────────────────────────────────────────────────────\r\n\r\n /**\r\n * GET /events\r\n * Returns all published events. Response is ETag-cached for 7 days.\r\n */\r\n getEvents(): Promise<LeapEvent[]> {\r\n return get<LeapEvent[]>(\"/events\");\r\n },\r\n\r\n /**\r\n * GET /events/:slug\r\n * Returns a single published event by slug.\r\n */\r\n getEvent(slug: string): Promise<LeapEvent> {\r\n return get<LeapEvent>(`/events/${encodeURIComponent(slug)}`);\r\n },\r\n\r\n /**\r\n * GET /events/:slug/slots\r\n * Returns real-time slot availability. CF edge caches this for 5 seconds.\r\n * Poll every 8–10 seconds on event detail pages.\r\n */\r\n getSlots(slug: string): Promise<SlotInfo> {\r\n return get<SlotInfo>(`/events/${encodeURIComponent(slug)}/slots`);\r\n },\r\n\r\n /**\r\n * POST /events — admin only.\r\n * Creates a new event. Auto-generates slug from title.\r\n */\r\n createEvent(data: CreateEventBody): Promise<LeapEvent> {\r\n return post<LeapEvent>(\"/events\", data);\r\n },\r\n\r\n /**\r\n * PATCH /events/:slug — admin only.\r\n * Updates an existing event by slug.\r\n */\r\n updateEvent(slug: string, data: Partial<CreateEventBody>): Promise<LeapEvent> {\r\n return patch<LeapEvent>(`/events/${encodeURIComponent(slug)}`, data);\r\n },\r\n\r\n // ── Themes ─────────────────────────────────────────────────────────────\r\n\r\n /**\r\n * GET /themes\r\n * Returns all themes.\r\n */\r\n getThemes(): Promise<Theme[]> {\r\n return get<Theme[]>(\"/themes\");\r\n },\r\n\r\n /**\r\n * POST /themes — admin only.\r\n */\r\n createTheme(data: Omit<Theme, \"id\" | \"createdAt\">): Promise<Theme> {\r\n return post<Theme>(\"/themes\", data);\r\n },\r\n\r\n /**\r\n * PATCH /themes/:id — admin only.\r\n */\r\n updateTheme(id: string, data: Partial<Omit<Theme, \"id\" | \"createdAt\">>): Promise<Theme> {\r\n return patch<Theme>(`/themes/${encodeURIComponent(id)}`, data);\r\n },\r\n\r\n /**\r\n * DELETE /themes/:id — admin only.\r\n */\r\n deleteTheme(id: string): Promise<void> {\r\n return del<void>(`/themes/${encodeURIComponent(id)}`);\r\n },\r\n\r\n // ── Users ──────────────────────────────────────────────────────────────\r\n\r\n /**\r\n * GET /users/me\r\n * Returns the authenticated user's profile, or null for guests.\r\n * Use `profile.role` to gate admin UI.\r\n */\r\n getMe(): Promise<UserProfile | null> {\r\n return get<UserProfile | null>(\"/users/me\");\r\n },\r\n\r\n // ── Bookmarks ──────────────────────────────────────────────────────────\r\n\r\n /**\r\n * GET /users/me/bookmarks\r\n * Returns the authenticated user's bookmarked events.\r\n * Returns an empty array for unauthenticated users.\r\n */\r\n getBookmarks(): Promise<BookmarkEntry[]> {\r\n return get<BookmarkEntry[]>(\"/users/me/bookmarks\");\r\n },\r\n\r\n /**\r\n * POST /users/me/bookmarks/:eventId\r\n * Toggles a bookmark on/off. Requires authentication.\r\n * Returns `{ bookmarked: true }` (201) on add, `{ bookmarked: false }` (200) on remove.\r\n */\r\n toggleBookmark(eventId: string): Promise<ToggleBookmarkResult> {\r\n return post<ToggleBookmarkResult>(\r\n `/users/me/bookmarks/${encodeURIComponent(eventId)}`,\r\n );\r\n },\r\n\r\n /**\r\n * DELETE /users/me/bookmarks/:eventId\r\n * Removes a bookmark. Requires authentication.\r\n */\r\n deleteBookmark(eventId: string): Promise<ToggleBookmarkResult> {\r\n return del<ToggleBookmarkResult>(\r\n `/users/me/bookmarks/${encodeURIComponent(eventId)}`,\r\n );\r\n },\r\n\r\n // ── FAQs ───────────────────────────────────────────────────────────────\r\n\r\n /**\r\n * GET /faqs\r\n * Returns all active FAQs. Cached in KV for 10 minutes.\r\n * The `answer` field is markdown — render with a markdown library.\r\n */\r\n getFaqs(): Promise<Faq[]> {\r\n return get<Faq[]>(\"/faqs\");\r\n },\r\n\r\n /**\r\n * POST /faqs — admin only.\r\n * Creates a new FAQ item.\r\n */\r\n createFaq(data: CreateFaqBody): Promise<Faq> {\r\n return post<Faq>(\"/faqs\", data);\r\n },\r\n\r\n /**\r\n * PATCH /faqs/:id — admin only.\r\n * Updates an existing FAQ item.\r\n */\r\n updateFaq(id: string, data: Partial<CreateFaqBody>): Promise<Faq> {\r\n return patch<Faq>(`/faqs/${encodeURIComponent(id)}`, data);\r\n },\r\n\r\n /**\r\n * DELETE /faqs/:id — admin only.\r\n * Soft-deletes a FAQ (sets isActive: false).\r\n */\r\n deleteFaq(id: string): Promise<{ deleted: boolean }> {\r\n return del<{ deleted: boolean }>(`/faqs/${encodeURIComponent(id)}`);\r\n },\r\n\r\n // ── Uploads ────────────────────────────────────────────────────────────\r\n\r\n /**\r\n * POST /uploads/images — admin only.\r\n * Uploads an image file to R2. Accepts multipart/form-data.\r\n * Returns the public URL, storage key, size, and content type.\r\n */\r\n uploadImage(file: File | Blob): Promise<{\r\n url: string;\r\n key: string;\r\n size: number;\r\n contentType: string;\r\n }> {\r\n const formData = new FormData();\r\n formData.append(\"file\", file);\r\n return postFormData(\"/uploads/images\", formData);\r\n },\r\n\r\n // ── Content Sync ───────────────────────────────────────────────────────\r\n\r\n /**\r\n * POST /config/sync-content — admin only.\r\n * Pushes all D1 content to Contentful. Auto-generates content types if missing.\r\n */\r\n syncContent(): Promise<SnapshotResult> {\r\n return post<SnapshotResult>(\"/config/sync-content\");\r\n },\r\n\r\n // ── Health ─────────────────────────────────────────────────────────────\r\n\r\n /**\r\n * GET /health\r\n * Public health check. Returns provider availability status.\r\n */\r\n healthCheck(): Promise<HealthResponse> {\r\n return get<HealthResponse>(\"/health\");\r\n },\r\n };\r\n}\r\n\r\nexport type LeapifyClient = ReturnType<typeof createLeapifyClient>;\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../../node_modules/better-auth/dist/client/broadcast-channel.mjs","../../node_modules/better-auth/dist/client/focus-manager.mjs","../../node_modules/better-auth/dist/client/online-manager.mjs","../../node_modules/better-auth/dist/client/parser.mjs","../../node_modules/nanostores/clean-stores/index.js","../../node_modules/nanostores/atom/index.js","../../node_modules/nanostores/lifecycle/index.js","../../node_modules/better-auth/dist/client/query.mjs","../../node_modules/better-auth/dist/client/session-refresh.mjs","../../node_modules/better-auth/dist/client/fetch-plugins.mjs","../../node_modules/better-auth/dist/client/session-atom.mjs","../../node_modules/better-auth/dist/client/config.mjs","../../node_modules/better-auth/dist/utils/is-atom.mjs","../../node_modules/better-auth/dist/client/proxy.mjs","../../node_modules/better-auth/dist/client/vanilla.mjs","../../src/client/auth.ts","../../src/client/pow.ts","../../src/client/session.ts","../../src/client/index.ts"],"names":["value","now","getClientConfig"],"mappings":"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","file":"index.js","sourcesContent":["//#region src/client/broadcast-channel.ts\nconst kBroadcastChannel = Symbol.for(\"better-auth:broadcast-channel\");\nconst now = () => Math.floor(Date.now() / 1e3);\nvar WindowBroadcastChannel = class {\n\tlisteners = /* @__PURE__ */ new Set();\n\tname;\n\tconstructor(name = \"better-auth.message\") {\n\t\tthis.name = name;\n\t}\n\tsubscribe(listener) {\n\t\tthis.listeners.add(listener);\n\t\treturn () => {\n\t\t\tthis.listeners.delete(listener);\n\t\t};\n\t}\n\tpost(message) {\n\t\tif (typeof window === \"undefined\") return;\n\t\ttry {\n\t\t\tlocalStorage.setItem(this.name, JSON.stringify({\n\t\t\t\t...message,\n\t\t\t\ttimestamp: now()\n\t\t\t}));\n\t\t} catch {}\n\t}\n\tsetup() {\n\t\tif (typeof window === \"undefined\" || typeof window.addEventListener === \"undefined\") return () => {};\n\t\tconst handler = (event) => {\n\t\t\tif (event.key !== this.name) return;\n\t\t\tconst message = JSON.parse(event.newValue ?? \"{}\");\n\t\t\tif (message?.event !== \"session\" || !message?.data) return;\n\t\t\tthis.listeners.forEach((listener) => listener(message));\n\t\t};\n\t\twindow.addEventListener(\"storage\", handler);\n\t\treturn () => {\n\t\t\twindow.removeEventListener(\"storage\", handler);\n\t\t};\n\t}\n};\nfunction getGlobalBroadcastChannel(name = \"better-auth.message\") {\n\tif (!globalThis[kBroadcastChannel]) globalThis[kBroadcastChannel] = new WindowBroadcastChannel(name);\n\treturn globalThis[kBroadcastChannel];\n}\n//#endregion\nexport { getGlobalBroadcastChannel, kBroadcastChannel };\n","//#region src/client/focus-manager.ts\nconst kFocusManager = Symbol.for(\"better-auth:focus-manager\");\nvar WindowFocusManager = class {\n\tlisteners = /* @__PURE__ */ new Set();\n\tsubscribe(listener) {\n\t\tthis.listeners.add(listener);\n\t\treturn () => {\n\t\t\tthis.listeners.delete(listener);\n\t\t};\n\t}\n\tsetFocused(focused) {\n\t\tthis.listeners.forEach((listener) => listener(focused));\n\t}\n\tsetup() {\n\t\tif (typeof window === \"undefined\" || typeof document === \"undefined\" || typeof window.addEventListener === \"undefined\") return () => {};\n\t\tconst visibilityHandler = () => {\n\t\t\tif (document.visibilityState === \"visible\") this.setFocused(true);\n\t\t};\n\t\tdocument.addEventListener(\"visibilitychange\", visibilityHandler, false);\n\t\treturn () => {\n\t\t\tdocument.removeEventListener(\"visibilitychange\", visibilityHandler, false);\n\t\t};\n\t}\n};\nfunction getGlobalFocusManager() {\n\tif (!globalThis[kFocusManager]) globalThis[kFocusManager] = new WindowFocusManager();\n\treturn globalThis[kFocusManager];\n}\n//#endregion\nexport { getGlobalFocusManager, kFocusManager };\n","//#region src/client/online-manager.ts\nconst kOnlineManager = Symbol.for(\"better-auth:online-manager\");\nvar WindowOnlineManager = class {\n\tlisteners = /* @__PURE__ */ new Set();\n\tisOnline = typeof navigator !== \"undefined\" ? navigator.onLine : true;\n\tsubscribe(listener) {\n\t\tthis.listeners.add(listener);\n\t\treturn () => {\n\t\t\tthis.listeners.delete(listener);\n\t\t};\n\t}\n\tsetOnline(online) {\n\t\tthis.isOnline = online;\n\t\tthis.listeners.forEach((listener) => listener(online));\n\t}\n\tsetup() {\n\t\tif (typeof window === \"undefined\" || typeof window.addEventListener === \"undefined\") return () => {};\n\t\tconst onOnline = () => this.setOnline(true);\n\t\tconst onOffline = () => this.setOnline(false);\n\t\twindow.addEventListener(\"online\", onOnline, false);\n\t\twindow.addEventListener(\"offline\", onOffline, false);\n\t\treturn () => {\n\t\t\twindow.removeEventListener(\"online\", onOnline, false);\n\t\t\twindow.removeEventListener(\"offline\", onOffline, false);\n\t\t};\n\t}\n};\nfunction getGlobalOnlineManager() {\n\tif (!globalThis[kOnlineManager]) globalThis[kOnlineManager] = new WindowOnlineManager();\n\treturn globalThis[kOnlineManager];\n}\n//#endregion\nexport { getGlobalOnlineManager, kOnlineManager };\n","//#region src/client/parser.ts\nconst PROTO_POLLUTION_PATTERNS = {\n\tproto: /\"(?:_|\\\\u0{2}5[Ff]){2}(?:p|\\\\u0{2}70)(?:r|\\\\u0{2}72)(?:o|\\\\u0{2}6[Ff])(?:t|\\\\u0{2}74)(?:o|\\\\u0{2}6[Ff])(?:_|\\\\u0{2}5[Ff]){2}\"\\s*:/,\n\tconstructor: /\"(?:c|\\\\u0063)(?:o|\\\\u006[Ff])(?:n|\\\\u006[Ee])(?:s|\\\\u0073)(?:t|\\\\u0074)(?:r|\\\\u0072)(?:u|\\\\u0075)(?:c|\\\\u0063)(?:t|\\\\u0074)(?:o|\\\\u006[Ff])(?:r|\\\\u0072)\"\\s*:/,\n\tprotoShort: /\"__proto__\"\\s*:/,\n\tconstructorShort: /\"constructor\"\\s*:/\n};\nconst JSON_SIGNATURE = /^\\s*[\"[{]|^\\s*-?\\d{1,16}(\\.\\d{1,17})?([Ee][+-]?\\d+)?\\s*$/;\nconst SPECIAL_VALUES = {\n\ttrue: true,\n\tfalse: false,\n\tnull: null,\n\tundefined: void 0,\n\tnan: NaN,\n\tinfinity: Number.POSITIVE_INFINITY,\n\t\"-infinity\": Number.NEGATIVE_INFINITY\n};\nconst ISO_DATE_REGEX = /^(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2})(?:\\.(\\d{1,7}))?(?:Z|([+-])(\\d{2}):(\\d{2}))$/;\nfunction isValidDate(date) {\n\treturn date instanceof Date && !isNaN(date.getTime());\n}\nfunction parseISODate(value) {\n\tconst match = ISO_DATE_REGEX.exec(value);\n\tif (!match) return null;\n\tconst [, year, month, day, hour, minute, second, ms, offsetSign, offsetHour, offsetMinute] = match;\n\tconst date = new Date(Date.UTC(parseInt(year, 10), parseInt(month, 10) - 1, parseInt(day, 10), parseInt(hour, 10), parseInt(minute, 10), parseInt(second, 10), ms ? parseInt(ms.padEnd(3, \"0\"), 10) : 0));\n\tif (offsetSign) {\n\t\tconst offset = (parseInt(offsetHour, 10) * 60 + parseInt(offsetMinute, 10)) * (offsetSign === \"+\" ? -1 : 1);\n\t\tdate.setUTCMinutes(date.getUTCMinutes() + offset);\n\t}\n\treturn isValidDate(date) ? date : null;\n}\nfunction betterJSONParse(value, options = {}) {\n\tconst { strict = false, warnings = false, reviver, parseDates = true } = options;\n\tif (typeof value !== \"string\") return value;\n\tconst trimmed = value.trim();\n\tif (trimmed.length > 0 && trimmed[0] === \"\\\"\" && trimmed.endsWith(\"\\\"\") && !trimmed.slice(1, -1).includes(\"\\\"\")) return trimmed.slice(1, -1);\n\tconst lowerValue = trimmed.toLowerCase();\n\tif (lowerValue.length <= 9 && lowerValue in SPECIAL_VALUES) return SPECIAL_VALUES[lowerValue];\n\tif (!JSON_SIGNATURE.test(trimmed)) {\n\t\tif (strict) throw new SyntaxError(\"[better-json] Invalid JSON\");\n\t\treturn value;\n\t}\n\tif (Object.entries(PROTO_POLLUTION_PATTERNS).some(([key, pattern]) => {\n\t\tconst matches = pattern.test(trimmed);\n\t\tif (matches && warnings) console.warn(`[better-json] Detected potential prototype pollution attempt using ${key} pattern`);\n\t\treturn matches;\n\t}) && strict) throw new Error(\"[better-json] Potential prototype pollution attempt detected\");\n\ttry {\n\t\tconst secureReviver = (key, value) => {\n\t\t\tif (key === \"__proto__\" || key === \"constructor\" && value && typeof value === \"object\" && \"prototype\" in value) {\n\t\t\t\tif (warnings) console.warn(`[better-json] Dropping \"${key}\" key to prevent prototype pollution`);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (parseDates && typeof value === \"string\") {\n\t\t\t\tconst date = parseISODate(value);\n\t\t\t\tif (date) return date;\n\t\t\t}\n\t\t\treturn reviver ? reviver(key, value) : value;\n\t\t};\n\t\treturn JSON.parse(trimmed, secureReviver);\n\t} catch (error) {\n\t\tif (strict) throw error;\n\t\treturn value;\n\t}\n}\nfunction parseJSON(value, options = { strict: true }) {\n\treturn betterJSONParse(value, options);\n}\n//#endregion\nexport { parseJSON };\n","import { cleanTasks } from '../task/index.js'\n\nexport const clean = Symbol('clean')\n\nexport const cleanStores = (...stores) => {\n if (process.env.NODE_ENV === 'production') {\n throw new Error(\n 'cleanStores() can be used only during development or tests'\n )\n }\n cleanTasks()\n for (let $store of stores) {\n if ($store) {\n if ($store.mocked) delete $store.mocked\n if ($store[clean]) $store[clean]()\n }\n }\n}\n","import { clean } from '../clean-stores/index.js'\n\nlet listenerQueue = []\nlet lqIndex = 0\nconst QUEUE_ITEMS_PER_LISTENER = 4\n// Use globalThis.nanostoresGlobal to store epoch so all module instances share\n// the same counter. This fixes issues when Nano Store is bundled separately\n// in different parts of an application (e.g., tree-shaking separates core\n// from React), causing each bundle to have its own epoch instance.\nexport const nanostoresGlobal = (globalThis.nanostoresGlobal ||= { epoch: 0 })\n\n/* @__NO_SIDE_EFFECTS__ */\nexport const atom = initialValue => {\n let listeners = []\n let $atom = {\n get() {\n if (!$atom.lc) {\n $atom.listen(() => {})()\n }\n return $atom.value\n },\n init: initialValue,\n lc: 0,\n listen(listener) {\n $atom.lc = listeners.push(listener)\n\n return () => {\n for (\n let i = lqIndex + QUEUE_ITEMS_PER_LISTENER;\n i < listenerQueue.length;\n ) {\n if (listenerQueue[i] === listener) {\n listenerQueue.splice(i, QUEUE_ITEMS_PER_LISTENER)\n } else {\n i += QUEUE_ITEMS_PER_LISTENER\n }\n }\n\n let index = listeners.indexOf(listener)\n if (~index) {\n listeners.splice(index, 1)\n if (!--$atom.lc) $atom.off()\n }\n }\n },\n notify(oldValue, changedKey) {\n nanostoresGlobal.epoch++\n let runListenerQueue = !listenerQueue.length\n for (let listener of listeners) {\n listenerQueue.push(listener, $atom.value, oldValue, changedKey)\n }\n\n if (runListenerQueue) {\n for (\n lqIndex = 0;\n lqIndex < listenerQueue.length;\n lqIndex += QUEUE_ITEMS_PER_LISTENER\n ) {\n listenerQueue[lqIndex](\n listenerQueue[lqIndex + 1],\n listenerQueue[lqIndex + 2],\n listenerQueue[lqIndex + 3]\n )\n }\n listenerQueue.length = 0\n }\n },\n /* It will be called on last listener unsubscribing.\n We will redefine it in onMount and onStop. */\n off() {},\n set(newValue) {\n let oldValue = $atom.value\n if (oldValue !== newValue) {\n $atom.value = newValue\n $atom.notify(oldValue)\n }\n },\n subscribe(listener) {\n let unbind = $atom.listen(listener)\n listener($atom.value)\n return unbind\n },\n value: initialValue\n }\n\n if (process.env.NODE_ENV !== 'production') {\n $atom[clean] = () => {\n listeners = []\n $atom.lc = 0\n $atom.off()\n }\n }\n\n return $atom\n}\n\nexport const readonlyType = store => store\n","import { clean } from '../clean-stores/index.js'\n\nconst START = 0\nconst STOP = 1\nconst SET = 2\nconst NOTIFY = 3\nconst MOUNT = 5\nconst UNMOUNT = 6\nconst REVERT_MUTATION = 10\n\nexport let on = (object, listener, eventKey, mutateStore) => {\n object.events = object.events || {}\n if (!object.events[eventKey + REVERT_MUTATION]) {\n object.events[eventKey + REVERT_MUTATION] = mutateStore(eventProps => {\n // eslint-disable-next-line no-sequences\n object.events[eventKey].reduceRight((event, l) => (l(event), event), {\n shared: {},\n ...eventProps\n })\n })\n }\n object.events[eventKey] = object.events[eventKey] || []\n object.events[eventKey].push(listener)\n return () => {\n let currentListeners = object.events[eventKey]\n let index = currentListeners.indexOf(listener)\n currentListeners.splice(index, 1)\n if (!currentListeners.length) {\n delete object.events[eventKey]\n object.events[eventKey + REVERT_MUTATION]()\n delete object.events[eventKey + REVERT_MUTATION]\n }\n }\n}\n\nexport let onStart = ($store, listener) =>\n on($store, listener, START, runListeners => {\n let originListen = $store.listen\n $store.listen = arg => {\n if (!$store.lc && !$store.starting) {\n $store.starting = true\n runListeners()\n delete $store.starting\n }\n return originListen(arg)\n }\n return () => {\n $store.listen = originListen\n }\n })\n\nexport let onStop = ($store, listener) =>\n on($store, listener, STOP, runListeners => {\n let originOff = $store.off\n $store.off = () => {\n runListeners()\n originOff()\n }\n return () => {\n $store.off = originOff\n }\n })\n\nexport let onSet = ($store, listener) =>\n on($store, listener, SET, runListeners => {\n let originSet = $store.set\n let originSetKey = $store.setKey\n if ($store.setKey) {\n $store.setKey = (changed, changedValue) => {\n let isAborted\n let abort = () => {\n isAborted = true\n }\n\n runListeners({\n abort,\n changed,\n newValue: { ...$store.value, [changed]: changedValue }\n })\n if (!isAborted) return originSetKey(changed, changedValue)\n }\n }\n $store.set = newValue => {\n let isAborted\n let abort = () => {\n isAborted = true\n }\n\n runListeners({ abort, newValue })\n if (!isAborted) return originSet(newValue)\n }\n return () => {\n $store.set = originSet\n $store.setKey = originSetKey\n }\n })\n\nexport let onNotify = ($store, listener) =>\n on($store, listener, NOTIFY, runListeners => {\n let originNotify = $store.notify\n $store.notify = (oldValue, changed) => {\n let isAborted\n let abort = () => {\n isAborted = true\n }\n\n runListeners({ abort, changed, oldValue })\n if (!isAborted) return originNotify(oldValue, changed)\n }\n return () => {\n $store.notify = originNotify\n }\n })\n\nexport const STORE_UNMOUNT_DELAY = 1000\n\nexport let onMount = ($store, initialize) => {\n let listener = payload => {\n let destroy = initialize(payload)\n if (destroy) $store.events[UNMOUNT].push(destroy)\n }\n return on($store, listener, MOUNT, runListeners => {\n let originListen = $store.listen\n $store.listen = (...args) => {\n if (!$store.lc && !$store.active) {\n $store.active = true\n runListeners()\n }\n return originListen(...args)\n }\n\n let originOff = $store.off\n $store.events[UNMOUNT] = []\n $store.off = () => {\n originOff()\n setTimeout(() => {\n if ($store.active && !$store.lc) {\n $store.active = false\n for (let destroy of $store.events[UNMOUNT]) destroy()\n $store.events[UNMOUNT] = []\n }\n }, STORE_UNMOUNT_DELAY)\n }\n\n if (process.env.NODE_ENV !== 'production') {\n let originClean = $store[clean]\n $store[clean] = () => {\n for (let destroy of $store.events[UNMOUNT]) destroy()\n $store.events[UNMOUNT] = []\n $store.active = false\n originClean()\n }\n }\n\n return () => {\n $store.listen = originListen\n $store.off = originOff\n }\n })\n}\n","import { atom, onMount } from \"nanostores\";\n//#region src/client/query.ts\nconst isServer = () => typeof window === \"undefined\";\nconst useAuthQuery = (initializedAtom, path, $fetch, options) => {\n\tconst value = atom({\n\t\tdata: null,\n\t\terror: null,\n\t\tisPending: true,\n\t\tisRefetching: false,\n\t\trefetch: (queryParams) => fn(queryParams)\n\t});\n\tconst fn = async (queryParams) => {\n\t\treturn new Promise((resolve) => {\n\t\t\tconst opts = typeof options === \"function\" ? options({\n\t\t\t\tdata: value.get().data,\n\t\t\t\terror: value.get().error,\n\t\t\t\tisPending: value.get().isPending\n\t\t\t}) : options;\n\t\t\t$fetch(path, {\n\t\t\t\t...opts,\n\t\t\t\tquery: {\n\t\t\t\t\t...opts?.query,\n\t\t\t\t\t...queryParams?.query\n\t\t\t\t},\n\t\t\t\tasync onSuccess(context) {\n\t\t\t\t\tvalue.set({\n\t\t\t\t\t\tdata: context.data,\n\t\t\t\t\t\terror: null,\n\t\t\t\t\t\tisPending: false,\n\t\t\t\t\t\tisRefetching: false,\n\t\t\t\t\t\trefetch: value.value.refetch\n\t\t\t\t\t});\n\t\t\t\t\tawait opts?.onSuccess?.(context);\n\t\t\t\t},\n\t\t\t\tasync onError(context) {\n\t\t\t\t\tconst { request } = context;\n\t\t\t\t\tconst retryAttempts = typeof request.retry === \"number\" ? request.retry : request.retry?.attempts;\n\t\t\t\t\tconst retryAttempt = request.retryAttempt || 0;\n\t\t\t\t\tif (retryAttempts && retryAttempt < retryAttempts) return;\n\t\t\t\t\tconst isUnauthorized = context.error.status === 401;\n\t\t\t\t\tvalue.set({\n\t\t\t\t\t\terror: context.error,\n\t\t\t\t\t\tdata: isUnauthorized ? null : value.get().data,\n\t\t\t\t\t\tisPending: false,\n\t\t\t\t\t\tisRefetching: false,\n\t\t\t\t\t\trefetch: value.value.refetch\n\t\t\t\t\t});\n\t\t\t\t\tawait opts?.onError?.(context);\n\t\t\t\t},\n\t\t\t\tasync onRequest(context) {\n\t\t\t\t\tconst currentValue = value.get();\n\t\t\t\t\tvalue.set({\n\t\t\t\t\t\tisPending: currentValue.data === null,\n\t\t\t\t\t\tdata: currentValue.data,\n\t\t\t\t\t\terror: null,\n\t\t\t\t\t\tisRefetching: true,\n\t\t\t\t\t\trefetch: value.value.refetch\n\t\t\t\t\t});\n\t\t\t\t\tawait opts?.onRequest?.(context);\n\t\t\t\t}\n\t\t\t}).catch((error) => {\n\t\t\t\tvalue.set({\n\t\t\t\t\terror,\n\t\t\t\t\tdata: value.get().data,\n\t\t\t\t\tisPending: false,\n\t\t\t\t\tisRefetching: false,\n\t\t\t\t\trefetch: value.value.refetch\n\t\t\t\t});\n\t\t\t}).finally(() => {\n\t\t\t\tresolve(void 0);\n\t\t\t});\n\t\t});\n\t};\n\tinitializedAtom = Array.isArray(initializedAtom) ? initializedAtom : [initializedAtom];\n\tlet isInitialized = false;\n\tfor (const initAtom of initializedAtom) initAtom.subscribe(async () => {\n\t\tif (isServer()) return;\n\t\tif (isInitialized) await fn();\n\t\telse onMount(value, () => {\n\t\t\tconst timeoutId = setTimeout(async () => {\n\t\t\t\tif (!isInitialized) {\n\t\t\t\t\tisInitialized = true;\n\t\t\t\t\tawait fn();\n\t\t\t\t}\n\t\t\t}, 0);\n\t\t\treturn () => {\n\t\t\t\tvalue.off();\n\t\t\t\tinitAtom.off();\n\t\t\t\tclearTimeout(timeoutId);\n\t\t\t};\n\t\t});\n\t});\n\treturn value;\n};\n//#endregion\nexport { useAuthQuery };\n","import { getGlobalBroadcastChannel } from \"./broadcast-channel.mjs\";\nimport { getGlobalFocusManager } from \"./focus-manager.mjs\";\nimport { getGlobalOnlineManager } from \"./online-manager.mjs\";\n//#region src/client/session-refresh.ts\nconst now = () => Math.floor(Date.now() / 1e3);\n/**\n* Normalize $fetch response: `throw: true` returns data directly, otherwise `{ data, error }`.\n*/\nfunction normalizeSessionResponse(res) {\n\tif (typeof res === \"object\" && res !== null && \"data\" in res && \"error\" in res) return res;\n\treturn {\n\t\tdata: res,\n\t\terror: null\n\t};\n}\n/**\n* Rate limit: don't refetch on focus if a session request was made within this many seconds\n*/\nconst FOCUS_REFETCH_RATE_LIMIT_SECONDS = 5;\nfunction createSessionRefreshManager(opts) {\n\tconst { sessionAtom, sessionSignal, $fetch, options = {} } = opts;\n\tconst refetchInterval = options.sessionOptions?.refetchInterval ?? 0;\n\tconst refetchOnWindowFocus = options.sessionOptions?.refetchOnWindowFocus ?? true;\n\tconst refetchWhenOffline = options.sessionOptions?.refetchWhenOffline ?? false;\n\tconst state = {\n\t\tlastSync: 0,\n\t\tlastSessionRequest: 0,\n\t\tcachedSession: void 0\n\t};\n\tconst shouldRefetch = () => {\n\t\treturn refetchWhenOffline || getGlobalOnlineManager().isOnline;\n\t};\n\tconst triggerRefetch = (event) => {\n\t\tif (!shouldRefetch()) return;\n\t\tif (event?.event === \"storage\") {\n\t\t\tstate.lastSync = now();\n\t\t\tsessionSignal.set(!sessionSignal.get());\n\t\t\treturn;\n\t\t}\n\t\tconst currentSession = sessionAtom.get();\n\t\tconst fetchSessionWithRefresh = () => {\n\t\t\tstate.lastSessionRequest = now();\n\t\t\t$fetch(\"/get-session\").then(async (res) => {\n\t\t\t\tlet { data, error } = normalizeSessionResponse(res);\n\t\t\t\tif (data?.needsRefresh) try {\n\t\t\t\t\tconst refreshRes = await $fetch(\"/get-session\", { method: \"POST\" });\n\t\t\t\t\t({data, error} = normalizeSessionResponse(refreshRes));\n\t\t\t\t} catch {}\n\t\t\t\tconst sessionData = data?.session && data?.user ? data : null;\n\t\t\t\tsessionAtom.set({\n\t\t\t\t\t...currentSession,\n\t\t\t\t\tdata: sessionData,\n\t\t\t\t\terror\n\t\t\t\t});\n\t\t\t\tstate.lastSync = now();\n\t\t\t\tsessionSignal.set(!sessionSignal.get());\n\t\t\t}).catch(() => {});\n\t\t};\n\t\tif (event?.event === \"poll\") {\n\t\t\tfetchSessionWithRefresh();\n\t\t\treturn;\n\t\t}\n\t\tif (event?.event === \"visibilitychange\") {\n\t\t\tif (now() - state.lastSessionRequest < FOCUS_REFETCH_RATE_LIMIT_SECONDS) return;\n\t\t\tstate.lastSessionRequest = now();\n\t\t}\n\t\tif (event?.event === \"visibilitychange\") {\n\t\t\tfetchSessionWithRefresh();\n\t\t\treturn;\n\t\t}\n\t\tif (currentSession?.data === null || currentSession?.data === void 0) {\n\t\t\tstate.lastSync = now();\n\t\t\tsessionSignal.set(!sessionSignal.get());\n\t\t}\n\t};\n\tconst broadcastSessionUpdate = (trigger) => {\n\t\tgetGlobalBroadcastChannel().post({\n\t\t\tevent: \"session\",\n\t\t\tdata: { trigger },\n\t\t\tclientId: Math.random().toString(36).substring(7)\n\t\t});\n\t};\n\tconst setupPolling = () => {\n\t\tif (refetchInterval && refetchInterval > 0) state.pollInterval = setInterval(() => {\n\t\t\tif (sessionAtom.get()?.data) triggerRefetch({ event: \"poll\" });\n\t\t}, refetchInterval * 1e3);\n\t};\n\tconst setupBroadcast = () => {\n\t\tstate.unsubscribeBroadcast = getGlobalBroadcastChannel().subscribe(() => {\n\t\t\ttriggerRefetch({ event: \"storage\" });\n\t\t});\n\t};\n\tconst setupFocusRefetch = () => {\n\t\tif (!refetchOnWindowFocus) return;\n\t\tstate.unsubscribeFocus = getGlobalFocusManager().subscribe(() => {\n\t\t\ttriggerRefetch({ event: \"visibilitychange\" });\n\t\t});\n\t};\n\tconst setupOnlineRefetch = () => {\n\t\tstate.unsubscribeOnline = getGlobalOnlineManager().subscribe((online) => {\n\t\t\tif (online) triggerRefetch({ event: \"visibilitychange\" });\n\t\t});\n\t};\n\tconst init = () => {\n\t\tsetupPolling();\n\t\tsetupBroadcast();\n\t\tsetupFocusRefetch();\n\t\tsetupOnlineRefetch();\n\t\tgetGlobalBroadcastChannel().setup();\n\t\tgetGlobalFocusManager().setup();\n\t\tgetGlobalOnlineManager().setup();\n\t};\n\tconst cleanup = () => {\n\t\tif (state.pollInterval) {\n\t\t\tclearInterval(state.pollInterval);\n\t\t\tstate.pollInterval = void 0;\n\t\t}\n\t\tif (state.unsubscribeBroadcast) {\n\t\t\tstate.unsubscribeBroadcast();\n\t\t\tstate.unsubscribeBroadcast = void 0;\n\t\t}\n\t\tif (state.unsubscribeFocus) {\n\t\t\tstate.unsubscribeFocus();\n\t\t\tstate.unsubscribeFocus = void 0;\n\t\t}\n\t\tif (state.unsubscribeOnline) {\n\t\t\tstate.unsubscribeOnline();\n\t\t\tstate.unsubscribeOnline = void 0;\n\t\t}\n\t\tstate.lastSync = 0;\n\t\tstate.lastSessionRequest = 0;\n\t\tstate.cachedSession = void 0;\n\t};\n\treturn {\n\t\tinit,\n\t\tcleanup,\n\t\ttriggerRefetch,\n\t\tbroadcastSessionUpdate\n\t};\n}\n//#endregion\nexport { createSessionRefreshManager };\n","//#region src/client/fetch-plugins.ts\nconst redirectPlugin = {\n\tid: \"redirect\",\n\tname: \"Redirect\",\n\thooks: { onSuccess(context) {\n\t\tif (context.data?.url && context.data?.redirect) {\n\t\t\tif (typeof window !== \"undefined\" && window.location) {\n\t\t\t\tif (window.location) try {\n\t\t\t\t\twindow.location.href = context.data.url;\n\t\t\t\t} catch {}\n\t\t\t}\n\t\t}\n\t} }\n};\n//#endregion\nexport { redirectPlugin };\n","import { useAuthQuery } from \"./query.mjs\";\nimport { createSessionRefreshManager } from \"./session-refresh.mjs\";\nimport { atom, onMount } from \"nanostores\";\n//#region src/client/session-atom.ts\nfunction getSessionAtom($fetch, options) {\n\tconst $signal = atom(false);\n\tconst session = useAuthQuery($signal, \"/get-session\", $fetch, { method: \"GET\" });\n\tlet broadcastSessionUpdate = () => {};\n\tonMount(session, () => {\n\t\tconst refreshManager = createSessionRefreshManager({\n\t\t\tsessionAtom: session,\n\t\t\tsessionSignal: $signal,\n\t\t\t$fetch,\n\t\t\toptions\n\t\t});\n\t\trefreshManager.init();\n\t\tbroadcastSessionUpdate = refreshManager.broadcastSessionUpdate;\n\t\treturn () => {\n\t\t\trefreshManager.cleanup();\n\t\t};\n\t});\n\treturn {\n\t\tsession,\n\t\t$sessionSignal: $signal,\n\t\tbroadcastSessionUpdate: (trigger) => broadcastSessionUpdate(trigger)\n\t};\n}\n//#endregion\nexport { getSessionAtom };\n","import { getBaseURL } from \"../utils/url.mjs\";\nimport { parseJSON } from \"./parser.mjs\";\nimport { redirectPlugin } from \"./fetch-plugins.mjs\";\nimport { getSessionAtom } from \"./session-atom.mjs\";\nimport { defu } from \"defu\";\nimport { createFetch } from \"@better-fetch/fetch\";\n//#region src/client/config.ts\nconst resolvePublicAuthUrl = (basePath) => {\n\tif (typeof process === \"undefined\") return void 0;\n\tconst path = basePath ?? \"/api/auth\";\n\tif (process.env.NEXT_PUBLIC_AUTH_URL) return process.env.NEXT_PUBLIC_AUTH_URL;\n\tif (typeof window === \"undefined\") {\n\t\tif (process.env.NEXTAUTH_URL) try {\n\t\t\treturn process.env.NEXTAUTH_URL;\n\t\t} catch {}\n\t\tif (process.env.VERCEL_URL) try {\n\t\t\tconst protocol = process.env.VERCEL_URL.startsWith(\"http\") ? \"\" : \"https://\";\n\t\t\treturn `${new URL(`${protocol}${process.env.VERCEL_URL}`).origin}${path}`;\n\t\t} catch {}\n\t}\n};\nconst getClientConfig = (options, loadEnv) => {\n\tconst isCredentialsSupported = \"credentials\" in Request.prototype;\n\tconst baseURL = getBaseURL(options?.baseURL, options?.basePath, void 0, loadEnv) ?? resolvePublicAuthUrl(options?.basePath) ?? \"/api/auth\";\n\tconst pluginsFetchPlugins = options?.plugins?.flatMap((plugin) => plugin.fetchPlugins).filter((pl) => pl !== void 0) || [];\n\tconst lifeCyclePlugin = {\n\t\tid: \"lifecycle-hooks\",\n\t\tname: \"lifecycle-hooks\",\n\t\thooks: {\n\t\t\tonSuccess: options?.fetchOptions?.onSuccess,\n\t\t\tonError: options?.fetchOptions?.onError,\n\t\t\tonRequest: options?.fetchOptions?.onRequest,\n\t\t\tonResponse: options?.fetchOptions?.onResponse\n\t\t}\n\t};\n\tconst { onSuccess: _onSuccess, onError: _onError, onRequest: _onRequest, onResponse: _onResponse, ...restOfFetchOptions } = options?.fetchOptions || {};\n\tconst $fetch = createFetch({\n\t\tbaseURL,\n\t\t...isCredentialsSupported ? { credentials: \"include\" } : {},\n\t\tmethod: \"GET\",\n\t\tjsonParser(text) {\n\t\t\tif (!text) return null;\n\t\t\treturn parseJSON(text, { strict: false });\n\t\t},\n\t\tcustomFetchImpl: fetch,\n\t\t...restOfFetchOptions,\n\t\tplugins: [\n\t\t\tlifeCyclePlugin,\n\t\t\t...restOfFetchOptions.plugins || [],\n\t\t\t...options?.disableDefaultFetchPlugins ? [] : [redirectPlugin],\n\t\t\t...pluginsFetchPlugins\n\t\t]\n\t});\n\tconst { $sessionSignal, session, broadcastSessionUpdate } = getSessionAtom($fetch, options);\n\tconst plugins = options?.plugins || [];\n\tlet pluginsActions = {};\n\tconst pluginsAtoms = {\n\t\t$sessionSignal,\n\t\tsession\n\t};\n\tconst pluginPathMethods = {\n\t\t\"/sign-out\": \"POST\",\n\t\t\"/revoke-sessions\": \"POST\",\n\t\t\"/revoke-other-sessions\": \"POST\",\n\t\t\"/delete-user\": \"POST\"\n\t};\n\tconst atomListeners = [{\n\t\tsignal: \"$sessionSignal\",\n\t\tmatcher(path) {\n\t\t\treturn path === \"/sign-out\" || path === \"/update-user\" || path === \"/update-session\" || path === \"/sign-up/email\" || path === \"/sign-in/email\" || path === \"/delete-user\" || path === \"/verify-email\" || path === \"/revoke-sessions\" || path === \"/revoke-session\" || path === \"/revoke-other-sessions\" || path === \"/change-email\" || path === \"/change-password\";\n\t\t},\n\t\tcallback(path) {\n\t\t\tif (path === \"/sign-out\") broadcastSessionUpdate(\"signout\");\n\t\t\telse if (path === \"/update-user\" || path === \"/update-session\") broadcastSessionUpdate(\"updateUser\");\n\t\t}\n\t}];\n\tfor (const plugin of plugins) {\n\t\tif (plugin.getAtoms) Object.assign(pluginsAtoms, plugin.getAtoms?.($fetch));\n\t\tif (plugin.pathMethods) Object.assign(pluginPathMethods, plugin.pathMethods);\n\t\tif (plugin.atomListeners) atomListeners.push(...plugin.atomListeners);\n\t}\n\tconst $store = {\n\t\tnotify: (signal) => {\n\t\t\tpluginsAtoms[signal].set(!pluginsAtoms[signal].get());\n\t\t},\n\t\tlisten: (signal, listener) => {\n\t\t\tpluginsAtoms[signal].subscribe(listener);\n\t\t},\n\t\tatoms: pluginsAtoms\n\t};\n\tfor (const plugin of plugins) if (plugin.getActions) pluginsActions = defu(plugin.getActions?.($fetch, $store, options) ?? {}, pluginsActions);\n\treturn {\n\t\tget baseURL() {\n\t\t\treturn baseURL;\n\t\t},\n\t\tpluginsActions,\n\t\tpluginsAtoms,\n\t\tpluginPathMethods,\n\t\tatomListeners,\n\t\t$fetch,\n\t\t$store\n\t};\n};\n//#endregion\nexport { getClientConfig };\n","//#region src/utils/is-atom.ts\nfunction isAtom(value) {\n\treturn typeof value === \"object\" && value !== null && \"get\" in value && typeof value.get === \"function\" && \"lc\" in value && typeof value.lc === \"number\";\n}\n//#endregion\nexport { isAtom };\n","import { isAtom } from \"../utils/is-atom.mjs\";\n//#region src/client/proxy.ts\nfunction getMethod(path, knownPathMethods, args) {\n\tconst method = knownPathMethods[path];\n\tconst { fetchOptions, query: _query, ...body } = args || {};\n\tif (method) return method;\n\tif (fetchOptions?.method) return fetchOptions.method;\n\tif (body && Object.keys(body).length > 0) return \"POST\";\n\treturn \"GET\";\n}\nfunction createDynamicPathProxy(routes, client, knownPathMethods, atoms, atomListeners) {\n\tfunction createProxy(path = []) {\n\t\treturn new Proxy(function() {}, {\n\t\t\tget(_, prop) {\n\t\t\t\tif (typeof prop !== \"string\") return;\n\t\t\t\tif (prop === \"then\" || prop === \"catch\" || prop === \"finally\") return;\n\t\t\t\tconst fullPath = [...path, prop];\n\t\t\t\tlet current = routes;\n\t\t\t\tfor (const segment of fullPath) if (current && typeof current === \"object\" && segment in current) current = current[segment];\n\t\t\t\telse {\n\t\t\t\t\tcurrent = void 0;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (typeof current === \"function\") return current;\n\t\t\t\tif (isAtom(current)) return current;\n\t\t\t\treturn createProxy(fullPath);\n\t\t\t},\n\t\t\tapply: async (_, __, args) => {\n\t\t\t\tconst routePath = \"/\" + path.map((segment) => segment.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`)).join(\"/\");\n\t\t\t\tconst arg = args[0] || {};\n\t\t\t\tconst fetchOptions = args[1] || {};\n\t\t\t\tconst { query, fetchOptions: argFetchOptions, ...body } = arg;\n\t\t\t\tconst options = {\n\t\t\t\t\t...fetchOptions,\n\t\t\t\t\t...argFetchOptions\n\t\t\t\t};\n\t\t\t\tconst method = getMethod(routePath, knownPathMethods, arg);\n\t\t\t\treturn await client(routePath, {\n\t\t\t\t\t...options,\n\t\t\t\t\tbody: method === \"GET\" ? void 0 : {\n\t\t\t\t\t\t...body,\n\t\t\t\t\t\t...options?.body || {}\n\t\t\t\t\t},\n\t\t\t\t\tquery: query || options?.query,\n\t\t\t\t\tmethod,\n\t\t\t\t\tasync onSuccess(context) {\n\t\t\t\t\t\tawait options?.onSuccess?.(context);\n\t\t\t\t\t\tif (!atomListeners || options.disableSignal) return;\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t* We trigger listeners\n\t\t\t\t\t\t*/\n\t\t\t\t\t\tconst matches = atomListeners.filter((s) => s.matcher(routePath));\n\t\t\t\t\t\tif (!matches.length) return;\n\t\t\t\t\t\tconst visited = /* @__PURE__ */ new Set();\n\t\t\t\t\t\tfor (const match of matches) {\n\t\t\t\t\t\t\tconst signal = atoms[match.signal];\n\t\t\t\t\t\t\tif (!signal) return;\n\t\t\t\t\t\t\tif (visited.has(match.signal)) continue;\n\t\t\t\t\t\t\tvisited.add(match.signal);\n\t\t\t\t\t\t\t/**\n\t\t\t\t\t\t\t* To avoid race conditions we set the signal in a setTimeout\n\t\t\t\t\t\t\t*/\n\t\t\t\t\t\t\tconst val = signal.get();\n\t\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\t\tsignal.set(!val);\n\t\t\t\t\t\t\t}, 10);\n\t\t\t\t\t\t\tmatch.callback?.(routePath);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\treturn createProxy();\n}\n//#endregion\nexport { createDynamicPathProxy };\n","import { getClientConfig } from \"./config.mjs\";\nimport { createDynamicPathProxy } from \"./proxy.mjs\";\nimport { capitalizeFirstLetter } from \"@better-auth/core/utils/string\";\n//#region src/client/vanilla.ts\nfunction createAuthClient(options) {\n\tconst { pluginPathMethods, pluginsActions, pluginsAtoms, $fetch, atomListeners, $store } = getClientConfig(options);\n\tconst resolvedHooks = {};\n\tfor (const [key, value] of Object.entries(pluginsAtoms)) resolvedHooks[`use${capitalizeFirstLetter(key)}`] = value;\n\treturn createDynamicPathProxy({\n\t\t...pluginsActions,\n\t\t...resolvedHooks,\n\t\t$fetch,\n\t\t$store\n\t}, $fetch, pluginPathMethods, pluginsAtoms, atomListeners);\n}\n//#endregion\nexport { createAuthClient };\n","/**\r\n * Better Auth client helper for Leapify API consumers.\r\n *\r\n * This module is **browser-safe** — no Cloudflare, Drizzle, or Hono deps.\r\n * It wraps Better Auth's client SDK with the bearer plugin so that tokens\r\n * can be stored and retrieved as plain strings (no cookie dependency on\r\n * the consumer's frontend).\r\n *\r\n * @example\r\n * // lib/auth.ts (frontend)\r\n * import { createLeapifyAuthClient, signInWithGoogleRedirect } from 'leapify/client'\r\n *\r\n * export const authClient = createLeapifyAuthClient(process.env.NEXT_PUBLIC_API_URL!)\r\n *\r\n * // Redirect-based Google sign-in:\r\n * await signInWithGoogleRedirect(authClient, '/dashboard')\r\n */\r\n\r\nimport { createAuthClient } from 'better-auth/client'\r\n\r\nconst AUTH_TOKEN_KEY = 'better-auth.session_token'\r\n\r\n/**\r\n * Create a Better Auth client bound to the Leapify Worker URL.\r\n *\r\n * It uses the 'Bearer' auth type to send the stored session token\r\n * in the Authorization header.\r\n */\r\nexport function createLeapifyAuthClient(baseUrl: string) {\r\n return createAuthClient({\r\n baseURL: baseUrl,\r\n fetchOptions: {\r\n auth: {\r\n type: 'Bearer',\r\n token: () => {\r\n if (typeof window !== 'undefined') {\r\n return localStorage.getItem(AUTH_TOKEN_KEY) || ''\r\n }\r\n return ''\r\n }\r\n }\r\n }\r\n })\r\n}\r\n\r\nexport type LeapifyAuthClient = ReturnType<typeof createLeapifyAuthClient>\r\n\r\n/**\r\n * Sign in with Google via OAuth redirect flow.\r\n *\r\n * Redirects the browser to Google's OAuth page. After authentication,\r\n * Google redirects back to the Better Auth callback endpoint, which\r\n * creates a session and redirects to `callbackURL`.\r\n *\r\n * Call `syncCookieSessionToStorage()` on app init to restore the\r\n * session from the cookie after a redirect-based sign-in.\r\n *\r\n * @param authClient - Client created by createLeapifyAuthClient\r\n * @param callbackURL - Path or URL to redirect to after successful auth (e.g. '/dashboard')\r\n *\r\n * @example\r\n * import { signInWithGoogleRedirect } from 'leapify/client'\r\n *\r\n * document.getElementById('google-btn').onclick = () => {\r\n * signInWithGoogleRedirect(authClient, '/dashboard')\r\n * }\r\n */\r\nexport async function signInWithGoogleRedirect(\r\n authClient: LeapifyAuthClient,\r\n callbackURL: string,\r\n): Promise<void> {\r\n await authClient.signIn.social({\r\n provider: 'google',\r\n callbackURL,\r\n })\r\n}\r\n\r\n/**\r\n * Sync a cookie-based Better Auth session into localStorage.\r\n *\r\n * After an OAuth redirect flow, Better Auth stores the session in an\r\n * HTTP-only cookie. This function reads that session via `getSession()`\r\n * and stores the token in localStorage so that subsequent API calls\r\n * using the Bearer token work correctly.\r\n *\r\n * Call this once on app initialization, before `initializeSession()`.\r\n *\r\n * @param authClient - Client created by createLeapifyAuthClient\r\n *\r\n * @example\r\n * import { syncCookieSessionToStorage, initializeSession } from 'leapify/client'\r\n *\r\n * // On app mount:\r\n * await syncCookieSessionToStorage(authClient)\r\n * const user = await initializeSession(API_URL, getToken)\r\n */\r\nexport async function syncCookieSessionToStorage(\r\n authClient: LeapifyAuthClient,\r\n): Promise<void> {\r\n try {\r\n const result = await authClient.getSession()\r\n const data = result?.data as { session?: { token?: string } } | undefined\r\n const token = data?.session?.token\r\n if (token) {\r\n localStorage.setItem(AUTH_TOKEN_KEY, token)\r\n }\r\n } catch {\r\n // No cookie session — user is a guest.\r\n }\r\n}\r\n\r\n/**\r\n * Get the current bearer token from storage, or null for guests.\r\n * Pass this to `createLeapifyClient` as the `getToken` option.\r\n *\r\n * @example\r\n * import { createLeapifyClient } from 'leapify/client'\r\n * import { createLeapifyAuthClient, getLeapifyToken } from 'leapify/client'\r\n *\r\n * const authClient = createLeapifyAuthClient(API_URL)\r\n * const api = createLeapifyClient(API_URL, () => getLeapifyToken(authClient))\r\n */\r\nexport async function getLeapifyToken(\r\n // @ts-ignore - Kept for backwards compatibility with previous signature\r\n authClient?: LeapifyAuthClient,\r\n): Promise<string | null> {\r\n if (typeof window !== 'undefined') {\r\n return localStorage.getItem(AUTH_TOKEN_KEY)\r\n }\r\n return null\r\n}\r\n\r\n/**\r\n * Sign out the current user.\r\n */\r\nexport async function signOut(authClient: LeapifyAuthClient) {\r\n const result = await authClient.signOut()\r\n if (typeof window !== 'undefined') {\r\n localStorage.removeItem(AUTH_TOKEN_KEY)\r\n }\r\n return result\r\n}\r\n","/**\r\n * Browser-safe Proof-of-Work challenge solver.\r\n *\r\n * Solves the SHA-256 PoW challenge served by the leapify backend middleware.\r\n * After solving, the server sets a signed cookie (1h TTL) so subsequent\r\n * requests bypass the challenge automatically.\r\n *\r\n * Import from 'leapify/client' — no Cloudflare, Drizzle, or Hono deps.\r\n *\r\n * @example\r\n * import { solvePowChallenge } from 'leapify/client'\r\n *\r\n * // Call once on app load before any API requests\r\n * await solvePowChallenge('https://api.leap.yourdomain.com')\r\n */\r\n\r\nconst POW_VERIFY_PATH = \"/.well-known/leapify/pow/verify\";\r\n\r\n/**\r\n * Solve the backend's Proof-of-Work challenge if one is active.\r\n *\r\n * Probes the given base URL for an HTML challenge page. If detected,\r\n * brute-forces a SHA-256 nonce (~100-500ms) and submits the solution.\r\n * The resulting cookie covers all API paths for 1 hour.\r\n *\r\n * @param baseUrl - The Leapify Worker URL (e.g. `https://api.leap.yourdomain.com`).\r\n * If omitted, uses the current page origin (same-origin requests).\r\n * @returns `true` if a challenge was solved, `false` if no challenge was needed.\r\n */\r\nexport async function solvePowChallenge(baseUrl?: string): Promise<boolean> {\r\n const base = baseUrl?.replace(/\\/$/, \"\") ?? \"\";\r\n\r\n let html: string;\r\n try {\r\n const res = await fetch(`${base}/api/events`, { credentials: \"include\" });\r\n const ct = res.headers.get(\"content-type\") || \"\";\r\n if (!ct.includes(\"text/html\")) {\r\n return false;\r\n }\r\n html = await res.text();\r\n } catch {\r\n return false;\r\n }\r\n\r\n const idMatch = html.match(/challengeId\\s*=\\s*\"([^\"]+)\"/);\r\n const diffMatch = html.match(/difficulty\\s*=\\s*(\\d+)/);\r\n if (!idMatch || !diffMatch) {\r\n return false;\r\n }\r\n\r\n const challengeId = idMatch[1];\r\n const difficulty = Number(diffMatch[1]);\r\n const prefix = \"0\".repeat(Math.ceil(difficulty / 4));\r\n\r\n let nonce = 0;\r\n while (true) {\r\n const input = new TextEncoder().encode(`${challengeId}:${nonce}`);\r\n const hash = await crypto.subtle.digest(\"SHA-256\", input);\r\n const hex = Array.from(new Uint8Array(hash))\r\n .map((b) => b.toString(16).padStart(2, \"0\"))\r\n .join(\"\");\r\n if (hex.startsWith(prefix)) {\r\n await fetch(`${base}${POW_VERIFY_PATH}`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify({ id: challengeId, nonce, elapsed: 0 }),\r\n credentials: \"include\",\r\n });\r\n return true;\r\n }\r\n nonce++;\r\n }\r\n}\r\n","/**\r\n * Browser-safe session initialization helper.\r\n *\r\n * Solves the PoW challenge (if active), checks for an existing session token,\r\n * and fetches the user profile. Returns the authenticated user or null.\r\n *\r\n * Import from 'leapify/client' — no Cloudflare, Drizzle, or Hono deps.\r\n *\r\n * @example\r\n * import { initializeSession, createLeapifyClient } from 'leapify/client'\r\n *\r\n * const user = await initializeSession(\r\n * 'https://api.leap.yourdomain.com',\r\n * () => getLeapifyToken(),\r\n * )\r\n * if (user) {\r\n * console.log(`Welcome ${user.name} (${user.role})`)\r\n * }\r\n */\r\n\r\nimport { solvePowChallenge } from \"./pow\";\r\nimport type { UserProfile } from \"./types\";\r\n\r\n/**\r\n * Initialize a browser session: solve PoW, restore existing token, fetch profile.\r\n *\r\n * @param baseUrl - The Leapify Worker URL.\r\n * @param getToken - Async function returning the current session token, or null.\r\n * @returns The authenticated user profile, or null if not signed in.\r\n */\r\nexport async function initializeSession(\r\n baseUrl: string,\r\n getToken: () => Promise<string | null>,\r\n): Promise<UserProfile | null> {\r\n await solvePowChallenge(baseUrl);\r\n\r\n const token = await getToken();\r\n if (!token) return null;\r\n\r\n const base = baseUrl.replace(/\\/$/, \"\");\r\n const res = await fetch(`${base}/api/users/me`, {\r\n headers: { Authorization: `Bearer ${token}` },\r\n });\r\n\r\n if (!res.ok) return null;\r\n\r\n const body = await res.json().catch(() => ({}));\r\n return (body as { data: UserProfile | null }).data ?? null;\r\n}\r\n","/**\r\n * Leapify browser-safe API client.\r\n *\r\n * Import from 'leapify/client' — no Cloudflare, Drizzle, or Hono dependencies.\r\n *\r\n * @example\r\n * import { createLeapifyClient, createLeapifyAuthClient, getLeapifyToken } from 'leapify/client'\r\n *\r\n * const authClient = createLeapifyAuthClient(process.env.NEXT_PUBLIC_API_URL!)\r\n * const api = createLeapifyClient(\r\n * process.env.NEXT_PUBLIC_API_URL!,\r\n * () => getLeapifyToken(authClient),\r\n * )\r\n *\r\n * const events = await api.getEvents()\r\n */\r\n\r\nexport type {\r\n LeapEvent,\r\n SlotInfo,\r\n UserProfile,\r\n BookmarkEntry,\r\n Faq,\r\n Theme,\r\n SiteConfig,\r\n ToggleBookmarkResult,\r\n LeapifyErrorBody,\r\n UserRole,\r\n EventStatus,\r\n CreateEventBody,\r\n CreateFaqBody,\r\n SnapshotResult,\r\n HealthResponse,\r\n RuntimeConfig,\r\n} from \"./types\";\r\n\r\nexport {\r\n createLeapifyAuthClient,\r\n signInWithGoogleRedirect,\r\n syncCookieSessionToStorage,\r\n getLeapifyToken,\r\n signOut,\r\n} from \"./auth\";\r\nexport type { LeapifyAuthClient } from \"./auth\";\r\n\r\nexport { solvePowChallenge } from \"./pow\";\r\nexport { initializeSession } from \"./session\";\r\n\r\n/**\r\n * Read the runtime config injected by the worker into HTML pages.\r\n * Returns null if not running in a browser or config not injected.\r\n */\r\nexport function getClientConfig(): RuntimeConfig | null {\r\n if (typeof window === \"undefined\") return null;\r\n const config = (window as unknown as Record<string, unknown>).__CONFIG__;\r\n if (!config || typeof config !== \"object\") return null;\r\n return config as RuntimeConfig;\r\n}\r\n\r\nimport type { RuntimeConfig } from \"./types\";\r\n\r\n/**\r\n * Structured error thrown by all client methods on non-2xx responses.\r\n *\r\n * @example\r\n * import { LeapifyApiError } from 'leapify/client'\r\n *\r\n * try {\r\n * await api.toggleBookmark(eventId)\r\n * } catch (err) {\r\n * if (err instanceof LeapifyApiError && err.code === 'UNAUTHORIZED') {\r\n * // redirect to sign-in\r\n * }\r\n * }\r\n */\r\nexport class LeapifyApiError extends Error {\r\n constructor(\r\n public readonly status: number,\r\n public readonly code: string,\r\n message: string,\r\n ) {\r\n super(message);\r\n this.name = \"LeapifyApiError\";\r\n }\r\n}\r\n\r\n// ─── Error code constants ───────────────────────────────────────────────────\r\n\r\nexport const LEAPIFY_ERROR_CODES = {\r\n UNAUTHORIZED: \"UNAUTHORIZED\",\r\n DOMAIN_RESTRICTED: \"DOMAIN_RESTRICTED\",\r\n FORBIDDEN: \"FORBIDDEN\",\r\n NOT_FOUND: \"NOT_FOUND\",\r\n CONFLICT: \"CONFLICT\",\r\n TOO_MANY_REQUESTS: \"TOO_MANY_REQUESTS\",\r\n SERVICE_UNAVAILABLE: \"SERVICE_UNAVAILABLE\",\r\n INTERNAL_ERROR: \"INTERNAL_ERROR\",\r\n} as const;\r\n\r\nexport type LeapifyErrorCode = keyof typeof LEAPIFY_ERROR_CODES;\r\n\r\n// ─── Client factory ─────────────────────────────────────────────────────────\r\n\r\nimport type {\r\n LeapEvent,\r\n SlotInfo,\r\n UserProfile,\r\n BookmarkEntry,\r\n Faq,\r\n Theme,\r\n SiteConfig,\r\n ToggleBookmarkResult,\r\n LeapifyErrorBody,\r\n CreateEventBody,\r\n CreateFaqBody,\r\n SnapshotResult,\r\n HealthResponse,\r\n} from \"./types\";\r\n\r\ntype GetTokenFn = () => Promise<string | null>;\r\n\r\nasync function buildHeaders(\r\n getToken: GetTokenFn | undefined,\r\n extra: Record<string, string> = {},\r\n): Promise<Record<string, string>> {\r\n const headers: Record<string, string> = {\r\n \"Content-Type\": \"application/json\",\r\n ...extra,\r\n };\r\n if (getToken) {\r\n const token = await getToken();\r\n if (token) headers[\"Authorization\"] = `Bearer ${token}`;\r\n }\r\n return headers;\r\n}\r\n\r\nasync function parseResponse<T>(res: Response): Promise<T> {\r\n if (res.status === 204) return undefined as T;\r\n\r\n const body = await res.json().catch(() => ({}));\r\n\r\n if (!res.ok) {\r\n const err = (body as LeapifyErrorBody)?.error;\r\n throw new LeapifyApiError(\r\n res.status,\r\n err?.code ?? \"UNKNOWN\",\r\n err?.message ?? res.statusText,\r\n );\r\n }\r\n\r\n return (body as { data: T }).data;\r\n}\r\n\r\n/**\r\n * Creates a typed Leapify API client bound to a base URL.\r\n *\r\n * @param baseUrl - The deployed Leapify Worker URL (e.g. `https://api.leap.yourdomain.com`).\r\n * @param getToken - Optional async function that returns a session token string,\r\n * or null for guest requests. Use `getLeapifyToken()` from this module.\r\n *\r\n * @example\r\n * // lib/api.ts\r\n * import { createLeapifyClient, getLeapifyToken } from 'leapify/client'\r\n *\r\n * export const api = createLeapifyClient(\r\n * process.env.NEXT_PUBLIC_API_URL!,\r\n * () => getLeapifyToken(),\r\n * )\r\n */\r\nexport function createLeapifyClient(baseUrl: string, getToken?: GetTokenFn) {\r\n const base = baseUrl.replace(/\\/$/, \"\");\r\n\r\n async function get<T>(path: string, init?: RequestInit): Promise<T> {\r\n const headers = await buildHeaders(getToken, init?.headers as Record<string, string>);\r\n const res = await fetch(`${base}${path}`, { ...init, method: \"GET\", headers });\r\n return parseResponse<T>(res);\r\n }\r\n\r\n async function post<T>(path: string, body?: unknown): Promise<T> {\r\n const headers = await buildHeaders(getToken);\r\n const res = await fetch(`${base}${path}`, {\r\n method: \"POST\",\r\n headers,\r\n ...(body !== undefined ? { body: JSON.stringify(body) } : {}),\r\n });\r\n return parseResponse<T>(res);\r\n }\r\n\r\n async function postFormData<T>(path: string, formData: FormData): Promise<T> {\r\n const headers: Record<string, string> = {};\r\n if (getToken) {\r\n const token = await getToken();\r\n if (token) headers[\"Authorization\"] = `Bearer ${token}`;\r\n }\r\n const res = await fetch(`${base}${path}`, {\r\n method: \"POST\",\r\n headers,\r\n body: formData,\r\n });\r\n return parseResponse<T>(res);\r\n }\r\n\r\n async function patch<T>(path: string, body: unknown): Promise<T> {\r\n const headers = await buildHeaders(getToken);\r\n const res = await fetch(`${base}${path}`, {\r\n method: \"PATCH\",\r\n headers,\r\n body: JSON.stringify(body),\r\n });\r\n return parseResponse<T>(res);\r\n }\r\n\r\n async function del<T>(path: string): Promise<T> {\r\n const headers = await buildHeaders(getToken);\r\n const res = await fetch(`${base}${path}`, { method: \"DELETE\", headers });\r\n return parseResponse<T>(res);\r\n }\r\n\r\n return {\r\n // ── Site Config ────────────────────────────────────────────────────────\r\n\r\n /**\r\n * GET /config\r\n * Returns site-wide configuration. Check `maintenanceMode` and\r\n * `comingSoonUntil` on app load to gate the UI appropriately.\r\n * Use `now` (server unix epoch) for timestamp comparisons.\r\n */\r\n getConfig(): Promise<SiteConfig> {\r\n return get<SiteConfig>(\"/api/config\");\r\n },\r\n\r\n /**\r\n * PATCH /api/config/:key — admin only.\r\n * Upserts a site config value. Requires admin or super_admin role.\r\n */\r\n updateConfig<K extends string>(key: K, value: unknown): Promise<{ key: K; value: unknown }> {\r\n return patch(`/api/config/${encodeURIComponent(key)}`, { value });\r\n },\r\n\r\n // ── Events ─────────────────────────────────────────────────────────────\r\n\r\n /**\r\n * GET /api/events\r\n * Returns all published events. Response is ETag-cached for 7 days.\r\n */\r\n getEvents(): Promise<LeapEvent[]> {\r\n return get<LeapEvent[]>(\"/api/events\");\r\n },\r\n\r\n /**\r\n * GET /api/events/:slug\r\n * Returns a single published event by slug.\r\n */\r\n getEvent(slug: string): Promise<LeapEvent> {\r\n return get<LeapEvent>(`/api/events/${encodeURIComponent(slug)}`);\r\n },\r\n\r\n /**\r\n * GET /api/events/:slug/slots\r\n * Returns real-time slot availability. CF edge caches this for 5 seconds.\r\n * Poll every 8–10 seconds on event detail pages.\r\n */\r\n getSlots(slug: string): Promise<SlotInfo> {\r\n return get<SlotInfo>(`/api/events/${encodeURIComponent(slug)}/slots`);\r\n },\r\n\r\n /**\r\n * POST /api/events — admin only.\r\n * Creates a new event. Auto-generates slug from title.\r\n */\r\n createEvent(data: CreateEventBody): Promise<LeapEvent> {\r\n return post<LeapEvent>(\"/api/events\", data);\r\n },\r\n\r\n /**\r\n * PATCH /api/events/:slug — admin only.\r\n * Updates an existing event by slug.\r\n */\r\n updateEvent(slug: string, data: Partial<CreateEventBody>): Promise<LeapEvent> {\r\n return patch<LeapEvent>(`/api/events/${encodeURIComponent(slug)}`, data);\r\n },\r\n\r\n // ── Themes ─────────────────────────────────────────────────────────────\r\n\r\n /**\r\n * GET /api/themes\r\n * Returns all themes.\r\n */\r\n getThemes(): Promise<Theme[]> {\r\n return get<Theme[]>(\"/api/themes\");\r\n },\r\n\r\n /**\r\n * POST /api/themes — admin only.\r\n */\r\n createTheme(data: Omit<Theme, \"id\" | \"createdAt\">): Promise<Theme> {\r\n return post<Theme>(\"/api/themes\", data);\r\n },\r\n\r\n /**\r\n * PATCH /api/themes/:id — admin only.\r\n */\r\n updateTheme(id: string, data: Partial<Omit<Theme, \"id\" | \"createdAt\">>): Promise<Theme> {\r\n return patch<Theme>(`/api/themes/${encodeURIComponent(id)}`, data);\r\n },\r\n\r\n /**\r\n * DELETE /api/themes/:id — admin only.\r\n */\r\n deleteTheme(id: string): Promise<void> {\r\n return del<void>(`/api/themes/${encodeURIComponent(id)}`);\r\n },\r\n\r\n // ── Users ──────────────────────────────────────────────────────────────\r\n\r\n /**\r\n * GET /api/users/me\r\n * Returns the authenticated user's profile, or null for guests.\r\n * Use `profile.role` to gate admin UI.\r\n */\r\n getMe(): Promise<UserProfile | null> {\r\n return get<UserProfile | null>(\"/api/users/me\");\r\n },\r\n\r\n // ── Bookmarks ──────────────────────────────────────────────────────────\r\n\r\n /**\r\n * GET /api/users/me/bookmarks\r\n * Returns the authenticated user's bookmarked events.\r\n * Returns an empty array for unauthenticated users.\r\n */\r\n getBookmarks(): Promise<BookmarkEntry[]> {\r\n return get<BookmarkEntry[]>(\"/api/users/me/bookmarks\");\r\n },\r\n\r\n /**\r\n * POST /api/users/me/bookmarks/:eventId\r\n * Toggles a bookmark on/off. Requires authentication.\r\n * Returns `{ bookmarked: true }` (201) on add, `{ bookmarked: false }` (200) on remove.\r\n */\r\n toggleBookmark(eventId: string): Promise<ToggleBookmarkResult> {\r\n return post<ToggleBookmarkResult>(\r\n `/api/users/me/bookmarks/${encodeURIComponent(eventId)}`,\r\n );\r\n },\r\n\r\n /**\r\n * DELETE /api/users/me/bookmarks/:eventId\r\n * Removes a bookmark. Requires authentication.\r\n */\r\n deleteBookmark(eventId: string): Promise<ToggleBookmarkResult> {\r\n return del<ToggleBookmarkResult>(\r\n `/api/users/me/bookmarks/${encodeURIComponent(eventId)}`,\r\n );\r\n },\r\n\r\n // ── FAQs ───────────────────────────────────────────────────────────────\r\n\r\n /**\r\n * GET /api/faqs\r\n * Returns all active FAQs. Cached in KV for 10 minutes.\r\n * The `answer` field is markdown — render with a markdown library.\r\n */\r\n getFaqs(): Promise<Faq[]> {\r\n return get<Faq[]>(\"/api/faqs\");\r\n },\r\n\r\n /**\r\n * POST /api/faqs — admin only.\r\n * Creates a new FAQ item.\r\n */\r\n createFaq(data: CreateFaqBody): Promise<Faq> {\r\n return post<Faq>(\"/api/faqs\", data);\r\n },\r\n\r\n /**\r\n * PATCH /api/faqs/:id — admin only.\r\n * Updates an existing FAQ item.\r\n */\r\n updateFaq(id: string, data: Partial<CreateFaqBody>): Promise<Faq> {\r\n return patch<Faq>(`/api/faqs/${encodeURIComponent(id)}`, data);\r\n },\r\n\r\n /**\r\n * DELETE /api/faqs/:id — admin only.\r\n * Soft-deletes a FAQ (sets isActive: false).\r\n */\r\n deleteFaq(id: string): Promise<{ deleted: boolean }> {\r\n return del<{ deleted: boolean }>(`/api/faqs/${encodeURIComponent(id)}`);\r\n },\r\n\r\n // ── Uploads ────────────────────────────────────────────────────────────\r\n\r\n /**\r\n * POST /api/uploads/images — admin only.\r\n * Uploads an image file to R2. Accepts multipart/form-data.\r\n * Returns the public URL, storage key, size, and content type.\r\n */\r\n uploadImage(file: File | Blob): Promise<{\r\n url: string;\r\n key: string;\r\n size: number;\r\n contentType: string;\r\n }> {\r\n const formData = new FormData();\r\n formData.append(\"file\", file);\r\n return postFormData(\"/api/uploads/images\", formData);\r\n },\r\n\r\n // ── Content Sync ───────────────────────────────────────────────────────\r\n\r\n /**\r\n * POST /api/config/sync-content — admin only.\r\n * Pushes all D1 content to Contentful. Auto-generates content types if missing.\r\n */\r\n syncContent(): Promise<SnapshotResult> {\r\n return post<SnapshotResult>(\"/api/config/sync-content\");\r\n },\r\n\r\n // ── Health ─────────────────────────────────────────────────────────────\r\n\r\n /**\r\n * GET /health\r\n * Public health check. Returns provider availability status.\r\n */\r\n healthCheck(): Promise<HealthResponse> {\r\n return get<HealthResponse>(\"/health\");\r\n },\r\n };\r\n}\r\n\r\nexport type LeapifyClient = ReturnType<typeof createLeapifyClient>;\r\n"]}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser-safe Proof-of-Work challenge solver.
|
|
3
|
+
*
|
|
4
|
+
* Solves the SHA-256 PoW challenge served by the leapify backend middleware.
|
|
5
|
+
* After solving, the server sets a signed cookie (1h TTL) so subsequent
|
|
6
|
+
* requests bypass the challenge automatically.
|
|
7
|
+
*
|
|
8
|
+
* Import from 'leapify/client' — no Cloudflare, Drizzle, or Hono deps.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* import { solvePowChallenge } from 'leapify/client'
|
|
12
|
+
*
|
|
13
|
+
* // Call once on app load before any API requests
|
|
14
|
+
* await solvePowChallenge('https://api.leap.yourdomain.com')
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* Solve the backend's Proof-of-Work challenge if one is active.
|
|
18
|
+
*
|
|
19
|
+
* Probes the given base URL for an HTML challenge page. If detected,
|
|
20
|
+
* brute-forces a SHA-256 nonce (~100-500ms) and submits the solution.
|
|
21
|
+
* The resulting cookie covers all API paths for 1 hour.
|
|
22
|
+
*
|
|
23
|
+
* @param baseUrl - The Leapify Worker URL (e.g. `https://api.leap.yourdomain.com`).
|
|
24
|
+
* If omitted, uses the current page origin (same-origin requests).
|
|
25
|
+
* @returns `true` if a challenge was solved, `false` if no challenge was needed.
|
|
26
|
+
*/
|
|
27
|
+
export declare function solvePowChallenge(baseUrl?: string): Promise<boolean>;
|
|
28
|
+
//# sourceMappingURL=pow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pow.d.ts","sourceRoot":"","sources":["../../src/client/pow.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH;;;;;;;;;;GAUG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CA2C1E"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser-safe session initialization helper.
|
|
3
|
+
*
|
|
4
|
+
* Solves the PoW challenge (if active), checks for an existing session token,
|
|
5
|
+
* and fetches the user profile. Returns the authenticated user or null.
|
|
6
|
+
*
|
|
7
|
+
* Import from 'leapify/client' — no Cloudflare, Drizzle, or Hono deps.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* import { initializeSession, createLeapifyClient } from 'leapify/client'
|
|
11
|
+
*
|
|
12
|
+
* const user = await initializeSession(
|
|
13
|
+
* 'https://api.leap.yourdomain.com',
|
|
14
|
+
* () => getLeapifyToken(),
|
|
15
|
+
* )
|
|
16
|
+
* if (user) {
|
|
17
|
+
* console.log(`Welcome ${user.name} (${user.role})`)
|
|
18
|
+
* }
|
|
19
|
+
*/
|
|
20
|
+
import type { UserProfile } from "./types";
|
|
21
|
+
/**
|
|
22
|
+
* Initialize a browser session: solve PoW, restore existing token, fetch profile.
|
|
23
|
+
*
|
|
24
|
+
* @param baseUrl - The Leapify Worker URL.
|
|
25
|
+
* @param getToken - Async function returning the current session token, or null.
|
|
26
|
+
* @returns The authenticated user profile, or null if not signed in.
|
|
27
|
+
*/
|
|
28
|
+
export declare function initializeSession(baseUrl: string, getToken: () => Promise<string | null>): Promise<UserProfile | null>;
|
|
29
|
+
//# sourceMappingURL=session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/client/session.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3C;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,GACrC,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAe7B"}
|
package/dist/client/types.d.ts
CHANGED
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
* Browser-safe TypeScript types for the Leapify API.
|
|
3
3
|
* Import from 'leapify/types' — no Cloudflare, Drizzle, or Hono dependencies.
|
|
4
4
|
*/
|
|
5
|
-
type EventStatus = "draft" | "queued" | "published" | "ended" | "cancelled";
|
|
6
|
-
type UserRole = "student" | "admin" | "super_admin";
|
|
5
|
+
export type EventStatus = "draft" | "queued" | "published" | "ended" | "cancelled";
|
|
6
|
+
export type UserRole = "student" | "admin" | "super_admin";
|
|
7
7
|
/**
|
|
8
8
|
* A theme categorization for events.
|
|
9
9
|
*/
|
|
10
|
-
interface Theme {
|
|
10
|
+
export interface Theme {
|
|
11
11
|
id: string;
|
|
12
12
|
name: string;
|
|
13
13
|
path: string;
|
|
@@ -21,7 +21,7 @@ interface Theme {
|
|
|
21
21
|
* are omitted. The detail endpoint (GET /events/:slug) returns the full shape.
|
|
22
22
|
* This type covers the union of both; extra fields are nullable/optional.
|
|
23
23
|
*/
|
|
24
|
-
interface LeapEvent {
|
|
24
|
+
export interface LeapEvent {
|
|
25
25
|
id: string;
|
|
26
26
|
slug: string;
|
|
27
27
|
themeId: string | null;
|
|
@@ -55,7 +55,7 @@ interface LeapEvent {
|
|
|
55
55
|
* Real-time slot availability from GET /events/:slug/slots.
|
|
56
56
|
* Refreshes every 5 seconds at the CF edge.
|
|
57
57
|
*/
|
|
58
|
-
interface SlotInfo {
|
|
58
|
+
export interface SlotInfo {
|
|
59
59
|
available: number;
|
|
60
60
|
total: number;
|
|
61
61
|
registered: number;
|
|
@@ -65,7 +65,7 @@ interface SlotInfo {
|
|
|
65
65
|
* Authenticated user profile from GET /users/me.
|
|
66
66
|
* Returns null if the request is unauthenticated.
|
|
67
67
|
*/
|
|
68
|
-
interface UserProfile {
|
|
68
|
+
export interface UserProfile {
|
|
69
69
|
id: string;
|
|
70
70
|
firebaseUid: string;
|
|
71
71
|
email: string;
|
|
@@ -76,7 +76,7 @@ interface UserProfile {
|
|
|
76
76
|
/**
|
|
77
77
|
* A single entry in the user's bookmark list from GET /users/me/bookmarks.
|
|
78
78
|
*/
|
|
79
|
-
interface BookmarkEntry {
|
|
79
|
+
export interface BookmarkEntry {
|
|
80
80
|
bookmarkedAt: number;
|
|
81
81
|
event: LeapEvent;
|
|
82
82
|
}
|
|
@@ -84,7 +84,7 @@ interface BookmarkEntry {
|
|
|
84
84
|
* A single FAQ item from GET /faqs.
|
|
85
85
|
* The `answer` field is markdown.
|
|
86
86
|
*/
|
|
87
|
-
interface Faq {
|
|
87
|
+
export interface Faq {
|
|
88
88
|
id: string;
|
|
89
89
|
question: string;
|
|
90
90
|
answer: string;
|
|
@@ -99,7 +99,7 @@ interface Faq {
|
|
|
99
99
|
* Use `now` (server unix epoch) for timestamp comparisons to avoid
|
|
100
100
|
* client clock drift.
|
|
101
101
|
*/
|
|
102
|
-
interface SiteConfig {
|
|
102
|
+
export interface SiteConfig {
|
|
103
103
|
comingSoonUntil: number | null;
|
|
104
104
|
siteEndsAt: number | null;
|
|
105
105
|
siteName: string | null;
|
|
@@ -111,14 +111,14 @@ interface SiteConfig {
|
|
|
111
111
|
* Result of POST /users/me/bookmarks/:eventId (toggle) and
|
|
112
112
|
* DELETE /users/me/bookmarks/:eventId.
|
|
113
113
|
*/
|
|
114
|
-
interface ToggleBookmarkResult {
|
|
114
|
+
export interface ToggleBookmarkResult {
|
|
115
115
|
bookmarked: boolean;
|
|
116
116
|
}
|
|
117
117
|
/**
|
|
118
118
|
* Standard error response shape from the Leapify API.
|
|
119
119
|
* Thrown as LeapifyApiError by the client.
|
|
120
120
|
*/
|
|
121
|
-
interface LeapifyErrorBody {
|
|
121
|
+
export interface LeapifyErrorBody {
|
|
122
122
|
error: {
|
|
123
123
|
code: string;
|
|
124
124
|
message: string;
|
|
@@ -127,7 +127,7 @@ interface LeapifyErrorBody {
|
|
|
127
127
|
/**
|
|
128
128
|
* Request body for POST /events (admin create event).
|
|
129
129
|
*/
|
|
130
|
-
interface CreateEventBody {
|
|
130
|
+
export interface CreateEventBody {
|
|
131
131
|
themeId: string;
|
|
132
132
|
title: string;
|
|
133
133
|
org?: string;
|
|
@@ -152,7 +152,7 @@ interface CreateEventBody {
|
|
|
152
152
|
/**
|
|
153
153
|
* Request body for POST /faqs (admin create FAQ).
|
|
154
154
|
*/
|
|
155
|
-
interface CreateFaqBody {
|
|
155
|
+
export interface CreateFaqBody {
|
|
156
156
|
question: string;
|
|
157
157
|
answer: string;
|
|
158
158
|
category?: string;
|
|
@@ -161,7 +161,7 @@ interface CreateFaqBody {
|
|
|
161
161
|
/**
|
|
162
162
|
* Response from POST /config/sync-content (admin content sync).
|
|
163
163
|
*/
|
|
164
|
-
interface SnapshotResult {
|
|
164
|
+
export interface SnapshotResult {
|
|
165
165
|
themesSynced: number;
|
|
166
166
|
eventsSynced: number;
|
|
167
167
|
faqsSynced: number;
|
|
@@ -172,21 +172,23 @@ interface SnapshotResult {
|
|
|
172
172
|
/**
|
|
173
173
|
* Response from GET /health.
|
|
174
174
|
*/
|
|
175
|
-
interface
|
|
176
|
-
|
|
175
|
+
export interface ServiceHealth {
|
|
176
|
+
configured: boolean;
|
|
177
|
+
ok: boolean;
|
|
178
|
+
latencyMs: number;
|
|
179
|
+
error?: string;
|
|
180
|
+
}
|
|
181
|
+
export interface HealthResponse {
|
|
182
|
+
status: 'OK' | 'DEGRADED';
|
|
177
183
|
timestamp: string;
|
|
178
|
-
|
|
179
|
-
ses: boolean;
|
|
180
|
-
resend: boolean;
|
|
181
|
-
};
|
|
184
|
+
services: Record<string, ServiceHealth>;
|
|
182
185
|
}
|
|
183
186
|
/**
|
|
184
187
|
* Runtime config injected into HTML pages via window.__CONFIG__.
|
|
185
188
|
* Browser-safe — no server dependencies.
|
|
186
189
|
*/
|
|
187
|
-
interface RuntimeConfig {
|
|
190
|
+
export interface RuntimeConfig {
|
|
188
191
|
production: boolean;
|
|
189
192
|
leapifyApiUrl: string;
|
|
190
193
|
}
|
|
191
|
-
|
|
192
|
-
export type { BookmarkEntry, CreateEventBody, CreateFaqBody, EventStatus, Faq, HealthResponse, LeapEvent, LeapifyErrorBody, RuntimeConfig, SiteConfig, SlotInfo, SnapshotResult, Theme, ToggleBookmarkResult, UserProfile, UserRole };
|
|
194
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/client/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { LeapifyBindings } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Cron: every 1 minute (`* * * * *`)
|
|
4
|
+
*
|
|
5
|
+
* Finds all events with status='queued' whose release_at has passed,
|
|
6
|
+
* publishes them atomically, and invalidates the events list KV cache.
|
|
7
|
+
*/
|
|
8
|
+
export declare function batchRelease(env: LeapifyBindings): Promise<void>;
|
|
9
|
+
//# sourceMappingURL=batch-release.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batch-release.d.ts","sourceRoot":"","sources":["../../src/cron/batch-release.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAK/C;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAoCtE"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { LeapifyBindings } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Cron: every hour (`0 * * * *`)
|
|
4
|
+
*
|
|
5
|
+
* Detects when siteEndsAt has passed and triggers the
|
|
6
|
+
* Contentful → D1 content snapshot. Retries automatically
|
|
7
|
+
* every hour until the snapshot succeeds.
|
|
8
|
+
*/
|
|
9
|
+
export declare function lifecycleCheck(env: LeapifyBindings, ctx: ExecutionContext): Promise<void>;
|
|
10
|
+
//# sourceMappingURL=lifecycle-check.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle-check.d.ts","sourceRoot":"","sources":["../../src/cron/lifecycle-check.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAG/C;;;;;;GAMG;AACH,wBAAsB,cAAc,CAClC,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,gBAAgB,GACpB,OAAO,CAAC,IAAI,CAAC,CA0Bf"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { LeapifyBindings } from "../types";
|
|
2
|
+
/**
|
|
3
|
+
* Cron: every 5 minutes (`*\/5 * * * *`)
|
|
4
|
+
*
|
|
5
|
+
* Compares D1 registered_slots against actual Google Forms response counts.
|
|
6
|
+
* Corrects any drift caused by missed webhook notifications.
|
|
7
|
+
* Uses a distributed lock (KV) to ensure only one instance runs.
|
|
8
|
+
*/
|
|
9
|
+
export declare function reconcileSlots(env: LeapifyBindings): Promise<void>;
|
|
10
|
+
//# sourceMappingURL=reconcile-slots.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reconcile-slots.d.ts","sourceRoot":"","sources":["../../src/cron/reconcile-slots.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAUhD;;;;;;GAMG;AACH,wBAAsB,cAAc,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAgDxE"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { LeapifyBindings } from "../types";
|
|
2
|
+
/**
|
|
3
|
+
* Cron: every hour (`0 * * * *`)
|
|
4
|
+
*
|
|
5
|
+
* Scans published events for those approaching their start time.
|
|
6
|
+
* Queues send_reminder_email jobs for events within the 24h and 1h windows.
|
|
7
|
+
*/
|
|
8
|
+
export declare function reminderEmails(env: LeapifyBindings): Promise<void>;
|
|
9
|
+
//# sourceMappingURL=reminder-emails.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reminder-emails.d.ts","sourceRoot":"","sources":["../../src/cron/reminder-emails.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAQhD;;;;;GAKG;AACH,wBAAsB,cAAc,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAkExE"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { LeapifyBindings } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Cron: daily at midnight (`0 0 * * *`)
|
|
4
|
+
*
|
|
5
|
+
* Finds Google Forms Watches expiring within 24 hours and renews them.
|
|
6
|
+
* Watches have a hard 7-day TTL; this cron keeps them alive indefinitely.
|
|
7
|
+
*/
|
|
8
|
+
export declare function renewWatches(env: LeapifyBindings): Promise<void>;
|
|
9
|
+
//# sourceMappingURL=renew-watches.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renew-watches.d.ts","sourceRoot":"","sources":["../../src/cron/renew-watches.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAO/C;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAoCtE"}
|