diff --git a/packages/svelte/playground/svelte-kit/.gitignore b/packages/svelte/playground/svelte-kit/.gitignore new file mode 100644 index 0000000..2d81abc --- /dev/null +++ b/packages/svelte/playground/svelte-kit/.gitignore @@ -0,0 +1,31 @@ +# Dependencies +node_modules + +# Build output +.output +.vercel +.netlify +.wrangler +.svelte-kit +build +dist + +# OS +.DS_Store +Thumbs.db + +# Environment +.env +.env.* +!.env.example +!.env.test + +# Vite +vite.config.js.timestamp-* +vite.config.ts.timestamp-* + +# Logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* diff --git a/packages/svelte/playground/svelte-kit/README.md b/packages/svelte/playground/svelte-kit/README.md new file mode 100644 index 0000000..307c44f --- /dev/null +++ b/packages/svelte/playground/svelte-kit/README.md @@ -0,0 +1,423 @@ +# Hawk.so SvelteKit Integration Playground + +A comprehensive testing playground for Hawk.so JavaScript SDK integration with SvelteKit. This project demonstrates all +error handling scenarios in SvelteKit and Svelte 5 to inform integration design and validate error tracking coverage. + +## Table of Contents + +- [Getting Started](#getting-started) +- [Architecture](#architecture) +- [Error Test Scenarios](#error-test-scenarios) +- [Error Detection System](#error-detection-system) +- [Project Structure](#project-structure) +- [Testing Guide](#testing-guide) +- [Key Findings](#key-findings) +- [Integration Notes](#integration-notes) + +## Getting Started + +### Prerequisites + +- Node.js 18+ and Yarn 1.x +- Basic understanding of SvelteKit and Svelte 5 + +### Installation + +```bash +# From repository root +cd /home/reversean/Dev/codex/hawk.javascript + +# Install all dependencies +yarn install + +# Navigate to playground +cd packages/svelte/playground/svelte-kit + +# Start development server +yarn dev +``` + +Visit `http://localhost:5173` to access the playground. + +### Available Scripts + +```bash +yarn dev # Start development server with HMR +yarn build # Build for production +yarn preview # Preview production build locally +``` + +## Architecture + +### Error Handling Layers + +The playground implements a multi-layer error handling approach to demonstrate SvelteKit's error handling hierarchy: + +1. **SvelteKit Hooks** (`hooks.server.ts`, `hooks.client.ts`) + - Server-side and client-side `handleError` hooks + - Catches expected errors from load functions and form actions + - Logs with ๐Ÿ”ด marker + +2. **Global Error Handlers** (`+layout.svelte`) + - `window.onerror` for synchronous runtime errors + - `window.onunhandledrejection` for promise rejections + - Logs with ๐ŸŸก marker + +3. **Error Boundaries** (``) + - Svelte 5.3.0+ feature for catching component rendering errors + - Logs with ๐ŸŸข marker + +### Key Files + +| File | Purpose | +|----------------------------------|------------------------------------| +| `src/hooks.server.ts` | Server-side error handling hook | +| `src/hooks.client.ts` | Client-side error handling hook | +| `src/routes/+layout.svelte` | Global error handlers setup | +| `src/routes/errors/+page.svelte` | Error test scenario index | +| `src/app.css` | Hawk.so dark theme styling | +| `src/lib/stores/errorStore.ts` | Test store for subscription errors | + +## Error Test Scenarios + +The playground includes 14 comprehensive error test scenarios: + +### 1. Load Function Errors + +**Load Expected** (`/errors/load-expected`) + +- Uses `error()` helper in `+page.ts` +- **Expected:** Caught by `handleError` ๐Ÿ”ด +- Tests proper error propagation from load functions + +**Load Unexpected** (`/errors/load-unexpected`) + +- Throws error directly in `+page.ts` +- **Expected:** Caught by `handleError` ๐Ÿ”ด +- Tests unexpected error handling + +**Server Load** (`/errors/load-server`) + +- Throws error in `+page.server.ts` +- **Expected:** Caught by server `handleError` ๐Ÿ”ด +- Tests SSR error handling + +### 2. Component Lifecycle Errors + +**onMount Error** (`/errors/lifecycle-onmount`) + +- Error thrown in `onMount()` lifecycle hook +- **Expected:** Caught by `window.onerror` ๐ŸŸก +- **Gap:** NOT caught by `handleError` + +**$effect Error** (`/errors/lifecycle-effect`) + +- Error in Svelte 5 `$effect` rune +- **Expected:** Can be caught by `` or `window.onerror` +- Tests reactive effect error handling + +### 3. Event Handler Errors + +**Click Handler** (`/errors/event-click`) + +- Error in `onclick` event handler +- **Expected:** Caught by `window.onerror` ๐ŸŸก +- **Gap:** NOT caught by `handleError` + +**Submit Handler** (`/errors/event-submit`) + +- Error in form `onsubmit` handler +- **Expected:** Caught by `window.onerror` ๐ŸŸก +- **Gap:** NOT caught by `handleError` + +### 4. Async Errors + +**setTimeout Error** (`/errors/async-timeout`) + +- Error thrown inside `setTimeout` +- **Expected:** Caught by `window.onerror` ๐ŸŸก +- **Gap:** NOT caught by `handleError` or `` + +**Promise Rejection** (`/errors/async-promise`) + +- Unhandled promise rejection +- **Expected:** Caught by `window.onunhandledrejection` ๐ŸŸก +- **Gap:** NOT caught by `handleError` or `` + +### 5. Form Action Errors + +**Form Validation** (`/errors/form-validation`) + +- Uses `fail()` helper for validation errors +- **Expected:** Returned to page, NOT sent to `handleError` +- Tests expected form validation flow + +**Form Unexpected** (`/errors/form-unexpected`) + +- Throws unexpected error in form action +- **Expected:** Caught by server `handleError` ๐Ÿ”ด +- Tests form action error handling + +### 6. Error Boundaries + +**Boundary Render** (`/errors/boundary-render`) + +- Error during component rendering +- **Expected:** Caught by `` ๐ŸŸข +- Demonstrates error boundary with reset functionality + +**Boundary Effect** (`/errors/boundary-effect`) + +- Error in `$effect` inside boundary +- **Expected:** Caught by `` ๐ŸŸข +- Tests boundary with reactive effects + +### 7. Store Errors + +**Store Subscription** (`/errors/store-subscription`) + +- Error in store subscription callback +- **Expected:** Behavior varies by implementation +- **Gap:** NOT consistently caught by any handler + +## Error Detection System + +### Emoji Markers + +Each error is logged with a colored emoji to indicate which handler caught it: + +| Marker | Handler | Scope | +|--------|---------------------|------------------------------------------------| +| ๐Ÿ”ด | `handleError` hook | Load functions, form actions, expected errors | +| ๐ŸŸก | Global handlers | Event handlers, async errors, lifecycle errors | +| ๐ŸŸข | `` | Component rendering, effects within boundary | + +### Console Output Format + +```javascript +// handleError example +๐Ÿ”ด [Server handleError] +Caught +error: { + error: Error, + status +: + 500, + message +: + "Error message", + route +: + "/errors/load-server" +} + +// Global handler example +๐ŸŸก [window.onerror] +Caught +error: { + message: "Error message", + filename +: + "file.js", + lineno +: + 42, + error +: + Error +} + +// Error boundary example +๐ŸŸข [] Caught rendering error: Error +``` + +## Project Structure + +``` +svelte-kit/ +โ”œโ”€โ”€ src/ +โ”‚ โ”œโ”€โ”€ app.css # Hawk.so dark theme +โ”‚ โ”œโ”€โ”€ app.d.ts # TypeScript declarations +โ”‚ โ”œโ”€โ”€ app.html # HTML template +โ”‚ โ”œโ”€โ”€ hooks.client.ts # Client handleError hook +โ”‚ โ”œโ”€โ”€ hooks.server.ts # Server handleError hook +โ”‚ โ”œโ”€โ”€ lib/ +โ”‚ โ”‚ โ”œโ”€โ”€ assets/ +โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ favicon.svg +โ”‚ โ”‚ โ””โ”€โ”€ stores/ +โ”‚ โ”‚ โ””โ”€โ”€ errorStore.ts # Test store +โ”‚ โ””โ”€โ”€ routes/ +โ”‚ โ”œโ”€โ”€ +layout.svelte # Global error handlers +โ”‚ โ”œโ”€โ”€ +page.svelte # Home page +โ”‚ โ””โ”€โ”€ errors/ +โ”‚ โ”œโ”€โ”€ +page.svelte # Test index +โ”‚ โ”œโ”€โ”€ async-promise/ +โ”‚ โ”œโ”€โ”€ async-timeout/ +โ”‚ โ”œโ”€โ”€ boundary-effect/ +โ”‚ โ”œโ”€โ”€ boundary-render/ +โ”‚ โ”œโ”€โ”€ event-click/ +โ”‚ โ”œโ”€โ”€ event-submit/ +โ”‚ โ”œโ”€โ”€ form-unexpected/ +โ”‚ โ”œโ”€โ”€ form-validation/ +โ”‚ โ”œโ”€โ”€ lifecycle-effect/ +โ”‚ โ”œโ”€โ”€ lifecycle-onmount/ +โ”‚ โ”œโ”€โ”€ load-expected/ +โ”‚ โ”œโ”€โ”€ load-server/ +โ”‚ โ”œโ”€โ”€ load-unexpected/ +โ”‚ โ””โ”€โ”€ store-subscription/ +โ”œโ”€โ”€ package.json +โ”œโ”€โ”€ svelte.config.js +โ”œโ”€โ”€ tsconfig.json +โ”œโ”€โ”€ vite.config.ts +โ””โ”€โ”€ README.md +``` + +## Testing Guide + +### Manual Testing + +1. **Start the development server** + ```bash + yarn dev + ``` + +2. **Open DevTools Console** + - Press F12 or right-click โ†’ Inspect + - Navigate to Console tab + +3. **Test each scenario** + - Visit `http://localhost:5173/errors` + - Click on each test card + - Trigger the error (button click, form submit, etc.) + - Observe console output + +4. **Verify error detection** + - Check for emoji marker (๐Ÿ”ด, ๐ŸŸก, or ๐ŸŸข) + - Confirm handler matches expected behavior + - Note any gaps or unexpected behavior + +### Expected Results + +| Scenario | Handler | Marker | Notes | +|------------------|---------------------|--------|------------------------------| +| Load functions | `handleError` | ๐Ÿ”ด | Both expected and unexpected | +| Server actions | `handleError` | ๐Ÿ”ด | Only unexpected errors | +| Event handlers | `window.onerror` | ๐ŸŸก | Gap: not in handleError | +| Lifecycle hooks | `window.onerror` | ๐ŸŸก | Gap: not in handleError | +| Async errors | Global handlers | ๐ŸŸก | Gap: not in handleError | +| Component render | `` | ๐ŸŸข | If wrapped in boundary | +| Store errors | Varies | โ€” | Gap: inconsistent handling | + +### Automated Testing + +Currently, this playground focuses on manual testing. Future enhancements could include: + +- E2E tests with Playwright +- Error tracking assertions +- Coverage reports + +## Key Findings + +### What `handleError` Catches + +โœ… **Caught by `handleError`:** + +- Errors from load functions (`+page.ts`, `+page.server.ts`) +- Unexpected errors from form actions (`+page.server.ts`) +- Errors thrown with `error()` helper + +โŒ **NOT caught by `handleError`:** + +- Event handler errors (click, submit, etc.) +- Lifecycle hook errors (`onMount`, `onDestroy`) +- Reactive statement errors (`$effect`, `$derived`) +- Async errors (`setTimeout`, `setInterval`) +- Unhandled promise rejections +- Store subscription errors + +### Integration Recommendations + +1. **Multi-layer approach required** + - Use `handleError` for load/action errors + - Add global handlers for event/lifecycle errors + - Consider error boundaries for component isolation + +2. **Server vs Client** + - Server errors: `hooks.server.ts` + - Client errors: `hooks.client.ts` + global handlers + +3. **Error boundary strategy** + - Wrap critical components in `` + - Provide fallback UI for graceful degradation + - Log boundary errors to tracking service + +## Integration Notes + +### Hawk.so SDK Integration Points + +Based on testing, the Hawk.so SDK should integrate at these points: + +1. **`hooks.server.ts` and `hooks.client.ts`** + ```typescript + export const handleError = ({ error, event, status }) => { + hawk.send(error, { context: 'sveltekit-hook', route: event.route.id }); + return { message: 'Error occurred' }; + }; + ``` + +2. **Global error handlers** (`+layout.svelte`) + ```typescript + window.addEventListener('error', (event) => { + hawk.send(event.error, { context: 'global-error' }); + }); + + window.addEventListener('unhandledrejection', (event) => { + hawk.send(event.reason, { context: 'unhandled-rejection' }); + }); + ``` + +3. **Error boundaries** (optional per-component) + ```svelte + hawk.send(error, { context: 'boundary' })}> + + + ``` + +### Dependencies + +The playground uses local Hawk.so JavaScript SDK: + +```json +{ + "dependencies": { + "@hawk.so/javascript": "file:../../.." + } +} +``` + +## Research Documentation + +For comprehensive research on Svelte/SvelteKit error handling mechanisms, see: +[`/packages/svelte/docs/error-handling-research.md`](../../docs/error-handling-research.md) + +This document covers: + +- Complete error handling hierarchy +- Detailed gap analysis +- Workarounds and best practices +- Integration architecture recommendations +- 15+ sources and references + +## Contributing + +This playground is part of the Hawk.so JavaScript SDK monorepo. To contribute: + +1. Follow the existing error test pattern +2. Add new scenarios to `/src/routes/errors/` +3. Update this README with scenario details +4. Ensure proper error detection logging +5. Test with `yarn build` before committing + +## License + +This playground is part of the [@hawk.so/javascript](../../../..) repository. diff --git a/packages/svelte/playground/svelte-kit/package.json b/packages/svelte/playground/svelte-kit/package.json new file mode 100644 index 0000000..3a24217 --- /dev/null +++ b/packages/svelte/playground/svelte-kit/package.json @@ -0,0 +1,23 @@ +{ + "name": "hawk-svelte-playground", + "private": true, + "version": "1.0.0", + "description": "SvelteKit playground for testing Hawk.so error handling integration", + "type": "module", + "scripts": { + "dev": "vite dev", + "build": "vite build", + "preview": "vite preview" + }, + "dependencies": { + "@hawk.so/javascript": "file:../../.." + }, + "devDependencies": { + "@sveltejs/adapter-auto": "^7.0.0", + "@sveltejs/kit": "^2.48.5", + "@sveltejs/vite-plugin-svelte": "^6.2.1", + "svelte": "^5.43.8", + "typescript": "^5.9.3", + "vite": "^7.2.2" + } +} diff --git a/packages/svelte/playground/svelte-kit/src/app.css b/packages/svelte/playground/svelte-kit/src/app.css new file mode 100644 index 0000000..1d2bf28 --- /dev/null +++ b/packages/svelte/playground/svelte-kit/src/app.css @@ -0,0 +1,377 @@ +/* Hawk.so Example Styles */ +@import url('https://fonts.googleapis.com/css?family=Roboto:400,500,700&display=swap'); + +:root { + --bg-primary: #2f3341; + --bg-secondary: #242732; + --bg-input: rgba(36, 39, 50, 0.68); + --text-primary: #dbe6ff; + --text-secondary: rgba(219, 230, 255, 0.6); + --border-color: rgba(219, 230, 255, 0.1); + --button-primary: #4979e4; + --button-primary-hover: #4869d2; + --border-input: rgba(0, 0, 0, 0.18); +} + +body { + font-family: Roboto, system-ui, sans-serif; + margin: 0; + padding: 0; + background: var(--bg-primary); + color: var(--text-primary); + font-size: 13px; +} + +header { + padding: 30px; + background: var(--bg-secondary); +} + +h1 { + font-weight: bold; + font-size: 20px; + margin: 0 0 15px; + color: var(--text-primary); +} + +h2 { + font-weight: 500; + margin: 0 0 10px; + font-size: 13px; + color: var(--text-secondary); + letter-spacing: 0.24px; + text-align: left; + text-transform: uppercase; +} + +h2 small { + text-transform: none; + font-size: 14px; + opacity: 0.6; + font-weight: normal; + margin-left: 15px; +} + +a { + color: inherit; + text-decoration: underline; +} + +a:hover { + color: var(--button-primary); +} + +section { + padding: 15px; + border: 1px solid var(--border-color); + border-radius: 4px; + margin: 15px; +} + +button { + display: inline-block; + padding: 8px 20px; + border: 0; + border-radius: 5px; + background: var(--button-primary); + color: var(--text-primary); + font-weight: 500; + font-size: 14px; + cursor: pointer; + font-family: inherit; +} + +button:hover { + background: var(--button-primary-hover); +} + +button:disabled { + opacity: 0.5; + cursor: not-allowed; +} + +label { + display: block; + margin-bottom: 10px; + font-size: 15px; +} + +input, +select, +textarea { + background: var(--bg-input); + border: 1px solid var(--border-input); + border-radius: 3px; + padding: 10px 15px; + font-size: 15px; + color: inherit; + font-family: inherit; +} + +input:focus, +select:focus, +textarea:focus { + outline: none; + border-color: var(--button-primary); +} + +code { + background: var(--bg-secondary); + padding: 2px 6px; + border-radius: 3px; + font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace; + font-size: 0.9em; +} + +pre { + background: var(--bg-secondary); + padding: 15px; + border-radius: 4px; + overflow-x: auto; +} + +pre code { + background: none; + padding: 0; +} + +/* Navigation styles */ +nav { + padding: 15px 30px; + background: var(--bg-secondary); + border-bottom: 1px solid var(--border-color); +} + +nav a { + margin-right: 20px; + text-decoration: none; + color: var(--text-primary); + font-weight: 500; +} + +nav a:hover { + color: var(--button-primary); +} + +/* Card/Grid styles for error tests */ +.test-card { + display: block; + padding: 20px; + border: 2px solid var(--border-color); + border-radius: 8px; + text-decoration: none; + color: inherit; + transition: all 0.2s ease; + background: var(--bg-secondary); +} + +.test-card:hover { + border-color: var(--button-primary); + transform: translateY(-2px); + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3); +} + +.test-card h3 { + margin: 0 0 10px 0; + color: var(--text-primary); + font-size: 16px; + font-weight: 500; +} + +.test-card p { + margin: 0; + color: var(--text-secondary); + font-size: 13px; + line-height: 1.5; +} + +/* Alert/Notice boxes */ +.alert { + padding: 15px; + border-left: 4px solid; + border-radius: 4px; + margin: 15px 0; +} + +.alert-info { + background: rgba(73, 121, 228, 0.15); + border-color: var(--button-primary); + color: var(--text-primary); +} + +.alert-warning { + background: rgba(255, 193, 7, 0.15); + border-color: #ffc107; + color: #ffd54f; +} + +.alert-error { + background: rgba(244, 67, 54, 0.15); + border-color: #f44336; + color: #ff8a80; +} + +.alert-success { + background: rgba(76, 175, 80, 0.15); + border-color: #4caf50; + color: #81c784; +} + +/* Container */ +.container { + max-width: 1200px; + margin: 0 auto; + padding: 20px; +} + +/* Grid system */ +.grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); + gap: 15px; +} + +/* Utility classes */ +.text-center { + text-align: center; +} + +.mt-1 { margin-top: 10px; } +.mt-2 { margin-top: 20px; } +.mb-1 { margin-bottom: 10px; } +.mb-2 { margin-bottom: 20px; } +.p-1 { padding: 10px; } +.p-2 { padding: 20px; } + +/* Error test page styles */ +.error-page { + padding: 2rem; +} + +.error-description { + margin: 1rem 0; +} + +.error-trigger { + margin: 2rem 0; +} + +.error-note { + margin: 2rem 0; + padding: 1rem; + background: rgba(73, 121, 228, 0.15); + border-left: 4px solid var(--button-primary); + border-radius: 4px; +} + +.error-boundary-container { + margin: 2rem 0; + padding: 1rem; + border: 2px solid var(--button-primary); + border-radius: 4px; +} + +.error-boundary-message { + padding: 1.5rem; + background: rgba(244, 67, 54, 0.15); + border-left: 4px solid #f44336; + border-radius: 4px; +} + +.error-boundary-message h3 { + margin: 0 0 0.5rem 0; + color: #ff8a80; +} + +.error-boundary-message p { + margin: 0.5rem 0; + color: var(--text-primary); +} + +.error-success-message { + padding: 1rem; + background: rgba(76, 175, 80, 0.15); + border-left: 4px solid #4caf50; + border-radius: 4px; + margin-top: 1rem; +} + +.error-success-message p { + margin: 0.5rem 0; + color: var(--text-primary); +} + +.error-success-message strong { + color: #81c784; +} + +.form-group { + margin-bottom: 1rem; +} + +.form-error { + padding: 1rem; + background: rgba(244, 67, 54, 0.15); + color: var(--text-primary); + border-left: 4px solid #f44336; + border-radius: 4px; + margin-bottom: 1rem; +} + +.form-error strong { + color: #ff8a80; +} + +.form-success { + padding: 1rem; + background: rgba(76, 175, 80, 0.15); + color: var(--text-primary); + border-left: 4px solid #4caf50; + border-radius: 4px; + margin-bottom: 1rem; +} + +.form-success strong { + color: #81c784; +} + +.form-input { + padding: 0.5rem; + font-size: 1rem; + width: 300px; + margin-right: 0.5rem; +} + +.form-input-error { + border-color: #f44336; +} + +.button-primary { + padding: 1rem 2rem; + font-size: 1.2rem; + background: #f44336; + color: white; + border: none; + border-radius: 4px; + cursor: pointer; +} + +.button-submit { + padding: 0.5rem 1rem; + font-size: 1rem; + background: #2196f3; + color: white; + border: none; + border-radius: 4px; + cursor: pointer; +} + +.button-reset { + margin-top: 1rem; + padding: 0.5rem 1rem; + background: #2196f3; + color: white; + border: none; + border-radius: 4px; + cursor: pointer; +} diff --git a/packages/svelte/playground/svelte-kit/src/app.d.ts b/packages/svelte/playground/svelte-kit/src/app.d.ts new file mode 100644 index 0000000..da08e6d --- /dev/null +++ b/packages/svelte/playground/svelte-kit/src/app.d.ts @@ -0,0 +1,13 @@ +// See https://svelte.dev/docs/kit/types#app.d.ts +// for information about these interfaces +declare global { + namespace App { + // interface Error {} + // interface Locals {} + // interface PageData {} + // interface PageState {} + // interface Platform {} + } +} + +export {}; diff --git a/packages/svelte/playground/svelte-kit/src/app.html b/packages/svelte/playground/svelte-kit/src/app.html new file mode 100644 index 0000000..f273cc5 --- /dev/null +++ b/packages/svelte/playground/svelte-kit/src/app.html @@ -0,0 +1,11 @@ + + + + + + %sveltekit.head% + + +
%sveltekit.body%
+ + diff --git a/packages/svelte/playground/svelte-kit/src/hooks.client.ts b/packages/svelte/playground/svelte-kit/src/hooks.client.ts new file mode 100644 index 0000000..bef718c --- /dev/null +++ b/packages/svelte/playground/svelte-kit/src/hooks.client.ts @@ -0,0 +1,17 @@ +import type { HandleClientError } from '@sveltejs/kit'; + +export const handleError: HandleClientError = async ({ error, event, status, message }) => { + console.error('๐Ÿ”ด [Client handleError] Caught error:', { + error, + status, + message, + route: event.route.id, + url: event.url.pathname + }); + + return { + message: message || 'An unexpected client error occurred', + code: (error as any)?.code ?? 'UNKNOWN_ERROR', + route: event.route.id + }; +}; \ No newline at end of file diff --git a/packages/svelte/playground/svelte-kit/src/hooks.server.ts b/packages/svelte/playground/svelte-kit/src/hooks.server.ts new file mode 100644 index 0000000..21dc066 --- /dev/null +++ b/packages/svelte/playground/svelte-kit/src/hooks.server.ts @@ -0,0 +1,18 @@ +import type { HandleServerError } from '@sveltejs/kit'; + +export const handleError: HandleServerError = async ({ error, event, status, message }) => { + console.error('๐Ÿ”ด [Server handleError] Caught error:', { + error, + status, + message, + route: event.route.id, + url: event.url.pathname + }); + + // Return sanitized error to client + return { + message: message || 'An unexpected server error occurred', + code: (error as any)?.code ?? 'UNKNOWN_ERROR', + route: event.route.id + }; +}; diff --git a/packages/svelte/playground/svelte-kit/src/lib/assets/favicon.svg b/packages/svelte/playground/svelte-kit/src/lib/assets/favicon.svg new file mode 100644 index 0000000..cc5dc66 --- /dev/null +++ b/packages/svelte/playground/svelte-kit/src/lib/assets/favicon.svg @@ -0,0 +1 @@ +svelte-logo \ No newline at end of file diff --git a/packages/svelte/playground/svelte-kit/src/lib/stores/errorStore.ts b/packages/svelte/playground/svelte-kit/src/lib/stores/errorStore.ts new file mode 100644 index 0000000..518dd1b --- /dev/null +++ b/packages/svelte/playground/svelte-kit/src/lib/stores/errorStore.ts @@ -0,0 +1,10 @@ +import { writable } from 'svelte/store'; + +export const errorStore = writable(0); + +// Store subscription that throws an error +errorStore.subscribe((value) => { + if (value > 0) { + throw new Error('Error in store subscription callback'); + } +}); diff --git a/packages/svelte/playground/svelte-kit/src/routes/+layout.svelte b/packages/svelte/playground/svelte-kit/src/routes/+layout.svelte new file mode 100644 index 0000000..4ac908b --- /dev/null +++ b/packages/svelte/playground/svelte-kit/src/routes/+layout.svelte @@ -0,0 +1,45 @@ + + + + + + + + +{@render children()} diff --git a/packages/svelte/playground/svelte-kit/src/routes/+page.svelte b/packages/svelte/playground/svelte-kit/src/routes/+page.svelte new file mode 100644 index 0000000..16b67a0 --- /dev/null +++ b/packages/svelte/playground/svelte-kit/src/routes/+page.svelte @@ -0,0 +1,66 @@ + + + + Hawk Javascript SvelteKit Integration Playground + + +
+
+

๐Ÿฆ… Hawk Javascript SvelteKit Integration Playground

+ + https://github.com/codex-team/hawk.javascript + +
+ +
+

Welcome

+

+ This playground demonstrates various error handling scenarios in SvelteKit + to help design and test the Hawk.so integration. +

+
+ +
+

๐Ÿงช Error Test Suite

+

+ We've created a comprehensive test suite to demonstrate all error handling + mechanisms in SvelteKit. +

+ + + +
+ +
+

๐Ÿ“š What You'll Find

+
    +
  • Load Function Errors - Expected and unexpected errors in load functions
  • +
  • Component Lifecycle Errors - Errors in onMount, effects, etc.
  • +
  • Event Handler Errors - Errors in click, submit handlers
  • +
  • Async Errors - setTimeout and promise rejection errors
  • +
  • Form Action Errors - Validation and unexpected form errors
  • +
  • Error Boundaries - Testing <svelte:boundary>
  • +
  • Store Errors - Store subscription error scenarios
  • +
+
+ +
+

๐Ÿ” Testing Setup

+

The playground includes:

+
    +
  • โœ… Server-side handleError hook (hooks.server.ts)
  • +
  • โœ… Client-side handleError hook (hooks.client.ts)
  • +
  • โœ… Global error handlers (window.onerror, unhandledrejection)
  • +
  • โœ… Error boundaries where applicable
  • +
+
+ Tip: Open your browser's DevTools Console before testing. +
+
+
diff --git a/packages/svelte/playground/svelte-kit/src/routes/errors/+page.svelte b/packages/svelte/playground/svelte-kit/src/routes/errors/+page.svelte new file mode 100644 index 0000000..8bb860c --- /dev/null +++ b/packages/svelte/playground/svelte-kit/src/routes/errors/+page.svelte @@ -0,0 +1,150 @@ + + + + Error Test Scenarios - Hawk.so SvelteKit Integration + + +
+
+

๐Ÿงช SvelteKit Error Handling Test Suite

+ โ† Back to Home +
+ +
+ โš ๏ธ Testing Instructions: +
    +
  • Open your browser's DevTools Console to see error logs
  • +
  • Look for colored emoji markers: +
      +
    • ๐Ÿ”ด = Caught by handleError hook
    • +
    • ๐ŸŸก = Caught by global window.onerror or unhandledrejection
    • +
    • ๐ŸŸข = Caught by <svelte:boundary>
    • +
    +
  • +
  • Each test demonstrates where errors are caught in the SvelteKit error handling hierarchy
  • +
+
+ + {#each categories as category} +
+

{category}

+
+ {#each errorTests.filter(t => t.category === category) as test} + +

{test.title}

+

{test.description}

+
+ {/each} +
+
+ {/each} +
diff --git a/packages/svelte/playground/svelte-kit/src/routes/errors/async-promise/+page.svelte b/packages/svelte/playground/svelte-kit/src/routes/errors/async-promise/+page.svelte new file mode 100644 index 0000000..c8f6d1c --- /dev/null +++ b/packages/svelte/playground/svelte-kit/src/routes/errors/async-promise/+page.svelte @@ -0,0 +1,40 @@ + + + + Promise Rejection Test + + +
+

Unhandled Promise Rejection Test

+ +

+ This page demonstrates an unhandled promise rejection. +

+

+ Expected: Error should be caught by window.onunhandledrejection (๐ŸŸก) +

+

+ Gap: NOT caught by handleError or <svelte:boundary> +

+ +
+

Note: The rejection was triggered automatically on mount.

+ +
+ +

Check the console to see where the rejection was caught.

+
diff --git a/packages/svelte/playground/svelte-kit/src/routes/errors/async-timeout/+page.svelte b/packages/svelte/playground/svelte-kit/src/routes/errors/async-timeout/+page.svelte new file mode 100644 index 0000000..dc6b831 --- /dev/null +++ b/packages/svelte/playground/svelte-kit/src/routes/errors/async-timeout/+page.svelte @@ -0,0 +1,42 @@ + + + + setTimeout Error Test + + +
+

setTimeout Error Test

+ +

+ This page demonstrates an error thrown inside setTimeout. +

+

+ Expected: Error should be caught by window.onerror (๐ŸŸก) +

+

+ Gap: NOT caught by handleError or <svelte:boundary> +

+ +
+

Note: The error was triggered automatically on mount.

+ +
+ +

Check the console to see where the error was caught.

+
diff --git a/packages/svelte/playground/svelte-kit/src/routes/errors/boundary-effect/+page.svelte b/packages/svelte/playground/svelte-kit/src/routes/errors/boundary-effect/+page.svelte new file mode 100644 index 0000000..08a64b5 --- /dev/null +++ b/packages/svelte/playground/svelte-kit/src/routes/errors/boundary-effect/+page.svelte @@ -0,0 +1,63 @@ + + + + Error Boundary - Effect Test + + +
+

Error Boundary - Effect Test

+ +

+ This page demonstrates <svelte:boundary> catching an error in $effect. +

+

+ Expected: Error should be caught by the error boundary (๐ŸŸข) +

+ +
+ + + {#snippet failed(error, reset)} +
+

Error Caught by Boundary!

+

Message: {error.message}

+ +
+ {/snippet} +
+
+ + {#if !errorCaught} + + {/if} + + {#if errorCaught} +
+

โœ… Success! The error was caught by the error boundary.

+

Error: {errorCaught.error.message}

+
+ {/if} + +

Check the console to see the boundary catch the error.

+
diff --git a/packages/svelte/playground/svelte-kit/src/routes/errors/boundary-effect/ErrorEffectComponent.svelte b/packages/svelte/playground/svelte-kit/src/routes/errors/boundary-effect/ErrorEffectComponent.svelte new file mode 100644 index 0000000..2af945c --- /dev/null +++ b/packages/svelte/playground/svelte-kit/src/routes/errors/boundary-effect/ErrorEffectComponent.svelte @@ -0,0 +1,14 @@ + + +
+

This component has an effect that can throw an error.

+

Trigger status: {triggerError ? 'Active (will throw error)' : 'Inactive'}

+
diff --git a/packages/svelte/playground/svelte-kit/src/routes/errors/boundary-render/+page.svelte b/packages/svelte/playground/svelte-kit/src/routes/errors/boundary-render/+page.svelte new file mode 100644 index 0000000..3aae148 --- /dev/null +++ b/packages/svelte/playground/svelte-kit/src/routes/errors/boundary-render/+page.svelte @@ -0,0 +1,49 @@ + + + + Error Boundary - Rendering Test + + +
+

Error Boundary - Rendering Test

+ +

+ This page demonstrates <svelte:boundary> catching a rendering error. +

+

+ Expected: Error should be caught by the error boundary (๐ŸŸข) +

+ +
+ + + {#snippet failed(error, reset)} +
+

Error Caught by Boundary!

+

Message: {error.message}

+ +
+ {/snippet} +
+
+ + {#if errorCaught} +
+

โœ… Success! The error was caught by the error boundary.

+

Error: {errorCaught.error.message}

+
+ {/if} + +

Check the console to see the boundary catch the error.

+
diff --git a/packages/svelte/playground/svelte-kit/src/routes/errors/boundary-render/BrokenComponent.svelte b/packages/svelte/playground/svelte-kit/src/routes/errors/boundary-render/BrokenComponent.svelte new file mode 100644 index 0000000..c352d2c --- /dev/null +++ b/packages/svelte/playground/svelte-kit/src/routes/errors/boundary-render/BrokenComponent.svelte @@ -0,0 +1,8 @@ + + +
+

This content will never render because the error is thrown first.

+
diff --git a/packages/svelte/playground/svelte-kit/src/routes/errors/event-click/+page.svelte b/packages/svelte/playground/svelte-kit/src/routes/errors/event-click/+page.svelte new file mode 100644 index 0000000..4b1f05c --- /dev/null +++ b/packages/svelte/playground/svelte-kit/src/routes/errors/event-click/+page.svelte @@ -0,0 +1,29 @@ + + + + Click Handler Error Test + + +
+

Click Handler Error Test

+ +

+ This page demonstrates an error thrown in an event handler. +

+

+ Expected: Error should be caught by window.onerror (๐ŸŸก), NOT by handleError +

+ +
+ +
+ +

Check the console to see where the error was caught.

+
diff --git a/packages/svelte/playground/svelte-kit/src/routes/errors/event-submit/+page.svelte b/packages/svelte/playground/svelte-kit/src/routes/errors/event-submit/+page.svelte new file mode 100644 index 0000000..ae38b1a --- /dev/null +++ b/packages/svelte/playground/svelte-kit/src/routes/errors/event-submit/+page.svelte @@ -0,0 +1,37 @@ + + + + Submit Handler Error Test + + +
+

Submit Handler Error Test

+ +

+ This page demonstrates an error thrown in a form submit handler. +

+

+ Expected: Error should be caught by window.onerror (๐ŸŸก), NOT by handleError +

+ +
+
+ + +
+
+ +

Check the console to see where the error was caught.

+
diff --git a/packages/svelte/playground/svelte-kit/src/routes/errors/form-unexpected/+page.server.ts b/packages/svelte/playground/svelte-kit/src/routes/errors/form-unexpected/+page.server.ts new file mode 100644 index 0000000..446b885 --- /dev/null +++ b/packages/svelte/playground/svelte-kit/src/routes/errors/form-unexpected/+page.server.ts @@ -0,0 +1,9 @@ +import type { Actions } from './$types'; + +export const actions = { + default: async () => { + // Simulate an unexpected error (e.g., database failure) + // This should be caught by server-side handleError + throw new Error('Unexpected error in form action - database connection failed'); + } +} satisfies Actions; diff --git a/packages/svelte/playground/svelte-kit/src/routes/errors/form-unexpected/+page.svelte b/packages/svelte/playground/svelte-kit/src/routes/errors/form-unexpected/+page.svelte new file mode 100644 index 0000000..130afe8 --- /dev/null +++ b/packages/svelte/playground/svelte-kit/src/routes/errors/form-unexpected/+page.svelte @@ -0,0 +1,23 @@ + + Form Unexpected Error Test + + +
+

Form Action Unexpected Error Test

+ +

+ This page demonstrates an unexpected error in a form action. +

+

+ Expected: Error should be caught by server-side handleError (๐Ÿ”ด) +

+ +
+ +
+ +

When you submit this form, the action will throw an unexpected error.

+

Check the console to see it caught by server-side handleError.

+
diff --git a/packages/svelte/playground/svelte-kit/src/routes/errors/form-validation/+page.server.ts b/packages/svelte/playground/svelte-kit/src/routes/errors/form-validation/+page.server.ts new file mode 100644 index 0000000..3ac54b7 --- /dev/null +++ b/packages/svelte/playground/svelte-kit/src/routes/errors/form-validation/+page.server.ts @@ -0,0 +1,22 @@ +import { fail } from '@sveltejs/kit'; +import type { Actions } from './$types'; + +export const actions = { + default: async ({ request }) => { + const data = await request.formData(); + const email = data.get('email'); + + // Validation error - expected error using fail() + if (!email || typeof email !== 'string' || !email.includes('@')) { + return fail(400, { + error: 'Please provide a valid email address', + email: email?.toString() ?? '' + }); + } + + return { + success: true, + message: 'Form submitted successfully!' + }; + } +} satisfies Actions; diff --git a/packages/svelte/playground/svelte-kit/src/routes/errors/form-validation/+page.svelte b/packages/svelte/playground/svelte-kit/src/routes/errors/form-validation/+page.svelte new file mode 100644 index 0000000..0becd02 --- /dev/null +++ b/packages/svelte/playground/svelte-kit/src/routes/errors/form-validation/+page.svelte @@ -0,0 +1,59 @@ + + + + Form Validation Error Test + + +
+

Form Validation Error Test

+ +

+ This page demonstrates using fail() for validation errors. +

+

+ Expected: Validation errors are returned to the page, NOT sent to handleError +

+ +
+
+ + +
+ + {#if form?.error} +
+ Validation Error: {form.error} +
+ {/if} + + {#if form?.success} +
+ Success: {form.message} +
+ {/if} + + +
+ +
+

Try:

+
    +
  • Submit with empty email โ†’ validation error
  • +
  • Submit with invalid email โ†’ validation error
  • +
  • Submit with valid email โ†’ success
  • +
+
+
diff --git a/packages/svelte/playground/svelte-kit/src/routes/errors/lifecycle-effect/+page.svelte b/packages/svelte/playground/svelte-kit/src/routes/errors/lifecycle-effect/+page.svelte new file mode 100644 index 0000000..2b5cb73 --- /dev/null +++ b/packages/svelte/playground/svelte-kit/src/routes/errors/lifecycle-effect/+page.svelte @@ -0,0 +1,33 @@ + + + + $effect Error Test + + +
+

$effect Error Test

+ +

+ This component will throw an error in $effect when you click the button. +

+

+ Expected: Error can be caught by <svelte:boundary> or window.onerror +

+ +
+ +
+ +

Click the button to increment the count and trigger the error.

+
diff --git a/packages/svelte/playground/svelte-kit/src/routes/errors/lifecycle-onmount/+page.svelte b/packages/svelte/playground/svelte-kit/src/routes/errors/lifecycle-onmount/+page.svelte new file mode 100644 index 0000000..4f55d1c --- /dev/null +++ b/packages/svelte/playground/svelte-kit/src/routes/errors/lifecycle-onmount/+page.svelte @@ -0,0 +1,25 @@ + + + + onMount Error Test + + +
+

onMount Error Test

+ +

+ This component throws an error in onMount(). +

+

+ Expected: Error should be caught by window.onerror (๐ŸŸก), NOT by handleError +

+ +

Check the console to see where it was caught.

+
diff --git a/packages/svelte/playground/svelte-kit/src/routes/errors/load-expected/+page.ts b/packages/svelte/playground/svelte-kit/src/routes/errors/load-expected/+page.ts new file mode 100644 index 0000000..0b91cd7 --- /dev/null +++ b/packages/svelte/playground/svelte-kit/src/routes/errors/load-expected/+page.ts @@ -0,0 +1,10 @@ +import { error } from '@sveltejs/kit'; +import type { PageLoad } from './$types'; + +export const load: PageLoad = async () => { + // This is an expected error - should be caught by handleError + error(404, { + message: 'This is an expected error from load function', + code: 'TEST_EXPECTED_ERROR' + }); +}; diff --git a/packages/svelte/playground/svelte-kit/src/routes/errors/load-server/+page.server.ts b/packages/svelte/playground/svelte-kit/src/routes/errors/load-server/+page.server.ts new file mode 100644 index 0000000..273c8dc --- /dev/null +++ b/packages/svelte/playground/svelte-kit/src/routes/errors/load-server/+page.server.ts @@ -0,0 +1,6 @@ +import type { PageServerLoad } from './$types'; + +export const load: PageServerLoad = async () => { + // This error should be caught by server-side handleError + throw new Error('Server-side load function error'); +}; diff --git a/packages/svelte/playground/svelte-kit/src/routes/errors/load-server/+page.svelte b/packages/svelte/playground/svelte-kit/src/routes/errors/load-server/+page.svelte new file mode 100644 index 0000000..5a08af8 --- /dev/null +++ b/packages/svelte/playground/svelte-kit/src/routes/errors/load-server/+page.svelte @@ -0,0 +1,2 @@ +

Server Load Error Test

+

This page should never render - error occurs in server load

diff --git a/packages/svelte/playground/svelte-kit/src/routes/errors/load-unexpected/+page.ts b/packages/svelte/playground/svelte-kit/src/routes/errors/load-unexpected/+page.ts new file mode 100644 index 0000000..4618bf2 --- /dev/null +++ b/packages/svelte/playground/svelte-kit/src/routes/errors/load-unexpected/+page.ts @@ -0,0 +1,6 @@ +import type { PageLoad } from './$types'; + +export const load: PageLoad = async () => { + // This is an unexpected error - should be caught by handleError + throw new Error('Unexpected error thrown in load function'); +}; diff --git a/packages/svelte/playground/svelte-kit/src/routes/errors/store-subscription/+page.svelte b/packages/svelte/playground/svelte-kit/src/routes/errors/store-subscription/+page.svelte new file mode 100644 index 0000000..be6dfed --- /dev/null +++ b/packages/svelte/playground/svelte-kit/src/routes/errors/store-subscription/+page.svelte @@ -0,0 +1,44 @@ + + + + Store Subscription Error Test + + +
+

Store Subscription Error Test

+ +

+ This page demonstrates an error thrown in a store subscription callback. +

+

+ Expected: Error behavior depends on Svelte version +

+

+ Gap: In Svelte 5, these errors may not be caught consistently +

+ +
+

Note: Store subscription errors are a known gap in error handling:

+
    +
  • NOT caught by handleError
  • +
  • NOT caught by <svelte:boundary>
  • +
  • May or may not be caught by window.onerror depending on implementation
  • +
+
+ +
+ +
+ +

Click the button to update the store and trigger the error in the subscription.

+

Check the console to see if/where the error was caught.

+
diff --git a/packages/svelte/playground/svelte-kit/svelte.config.js b/packages/svelte/playground/svelte-kit/svelte.config.js new file mode 100644 index 0000000..1295460 --- /dev/null +++ b/packages/svelte/playground/svelte-kit/svelte.config.js @@ -0,0 +1,18 @@ +import adapter from '@sveltejs/adapter-auto'; +import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'; + +/** @type {import('@sveltejs/kit').Config} */ +const config = { + // Consult https://svelte.dev/docs/kit/integrations + // for more information about preprocessors + preprocess: vitePreprocess(), + + kit: { + // adapter-auto only supports some environments, see https://svelte.dev/docs/kit/adapter-auto for a list. + // If your environment is not supported, or you settled on a specific environment, switch out the adapter. + // See https://svelte.dev/docs/kit/adapters for more information about adapters. + adapter: adapter() + } +}; + +export default config; diff --git a/packages/svelte/playground/svelte-kit/tsconfig.json b/packages/svelte/playground/svelte-kit/tsconfig.json new file mode 100644 index 0000000..2c2ed3c --- /dev/null +++ b/packages/svelte/playground/svelte-kit/tsconfig.json @@ -0,0 +1,20 @@ +{ + "extends": "./.svelte-kit/tsconfig.json", + "compilerOptions": { + "rewriteRelativeImportExtensions": true, + "allowJs": true, + "checkJs": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "sourceMap": true, + "strict": true, + "moduleResolution": "bundler" + } + // Path aliases are handled by https://svelte.dev/docs/kit/configuration#alias + // except $lib which is handled by https://svelte.dev/docs/kit/configuration#files + // + // To make changes to top-level options such as include and exclude, we recommend extending + // the generated config; see https://svelte.dev/docs/kit/configuration#typescript +} diff --git a/packages/svelte/playground/svelte-kit/vite.config.ts b/packages/svelte/playground/svelte-kit/vite.config.ts new file mode 100644 index 0000000..ca83c82 --- /dev/null +++ b/packages/svelte/playground/svelte-kit/vite.config.ts @@ -0,0 +1,9 @@ +import { sveltekit } from '@sveltejs/kit/vite'; +import { defineConfig } from 'vite'; + +export default defineConfig({ + plugins: [sveltekit()], + server: { + host: true, + }, +}); diff --git a/packages/svelte/playground/svelte-kit/yarn.lock b/packages/svelte/playground/svelte-kit/yarn.lock new file mode 100644 index 0000000..5f93832 --- /dev/null +++ b/packages/svelte/playground/svelte-kit/yarn.lock @@ -0,0 +1,626 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@esbuild/aix-ppc64@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz#80fcbe36130e58b7670511e888b8e88a259ed76c" + integrity sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA== + +"@esbuild/android-arm64@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz#8aa4965f8d0a7982dc21734bf6601323a66da752" + integrity sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg== + +"@esbuild/android-arm@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.25.12.tgz#300712101f7f50f1d2627a162e6e09b109b6767a" + integrity sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg== + +"@esbuild/android-x64@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.25.12.tgz#87dfb27161202bdc958ef48bb61b09c758faee16" + integrity sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg== + +"@esbuild/darwin-arm64@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz#79197898ec1ff745d21c071e1c7cc3c802f0c1fd" + integrity sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg== + +"@esbuild/darwin-x64@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz#146400a8562133f45c4d2eadcf37ddd09718079e" + integrity sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA== + +"@esbuild/freebsd-arm64@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz#1c5f9ba7206e158fd2b24c59fa2d2c8bb47ca0fe" + integrity sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg== + +"@esbuild/freebsd-x64@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz#ea631f4a36beaac4b9279fa0fcc6ca29eaeeb2b3" + integrity sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ== + +"@esbuild/linux-arm64@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz#e1066bce58394f1b1141deec8557a5f0a22f5977" + integrity sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ== + +"@esbuild/linux-arm@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz#452cd66b20932d08bdc53a8b61c0e30baf4348b9" + integrity sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw== + +"@esbuild/linux-ia32@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz#b24f8acc45bcf54192c7f2f3be1b53e6551eafe0" + integrity sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA== + +"@esbuild/linux-loong64@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz#f9cfffa7fc8322571fbc4c8b3268caf15bd81ad0" + integrity sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng== + +"@esbuild/linux-mips64el@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz#575a14bd74644ffab891adc7d7e60d275296f2cd" + integrity sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw== + +"@esbuild/linux-ppc64@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz#75b99c70a95fbd5f7739d7692befe60601591869" + integrity sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA== + +"@esbuild/linux-riscv64@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz#2e3259440321a44e79ddf7535c325057da875cd6" + integrity sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w== + +"@esbuild/linux-s390x@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz#17676cabbfe5928da5b2a0d6df5d58cd08db2663" + integrity sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg== + +"@esbuild/linux-x64@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz#0583775685ca82066d04c3507f09524d3cd7a306" + integrity sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw== + +"@esbuild/netbsd-arm64@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz#f04c4049cb2e252fe96b16fed90f70746b13f4a4" + integrity sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg== + +"@esbuild/netbsd-x64@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz#77da0d0a0d826d7c921eea3d40292548b258a076" + integrity sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ== + +"@esbuild/openbsd-arm64@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz#6296f5867aedef28a81b22ab2009c786a952dccd" + integrity sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A== + +"@esbuild/openbsd-x64@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz#f8d23303360e27b16cf065b23bbff43c14142679" + integrity sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw== + +"@esbuild/openharmony-arm64@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz#49e0b768744a3924be0d7fd97dd6ce9b2923d88d" + integrity sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg== + +"@esbuild/sunos-x64@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz#a6ed7d6778d67e528c81fb165b23f4911b9b13d6" + integrity sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w== + +"@esbuild/win32-arm64@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz#9ac14c378e1b653af17d08e7d3ce34caef587323" + integrity sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg== + +"@esbuild/win32-ia32@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz#918942dcbbb35cc14fca39afb91b5e6a3d127267" + integrity sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ== + +"@esbuild/win32-x64@0.25.12": + version "0.25.12" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz#9bdad8176be7811ad148d1f8772359041f46c6c5" + integrity sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA== + +"@hawk.so/javascript@file:../../..": + version "0.0.0" + +"@jridgewell/gen-mapping@^0.3.5": + version "0.3.13" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz#6342a19f44347518c93e43b1ac69deb3c4656a1f" + integrity sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA== + dependencies: + "@jridgewell/sourcemap-codec" "^1.5.0" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/remapping@^2.3.4": + version "2.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/remapping/-/remapping-2.3.5.tgz#375c476d1972947851ba1e15ae8f123047445aa1" + integrity sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ== + dependencies: + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + +"@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.4.15", "@jridgewell/sourcemap-codec@^1.5.0", "@jridgewell/sourcemap-codec@^1.5.5": + version "1.5.5" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz#6912b00d2c631c0d15ce1a7ab57cd657f2a8f8ba" + integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og== + +"@jridgewell/trace-mapping@^0.3.24": + version "0.3.31" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz#db15d6781c931f3a251a3dac39501c98a6082fd0" + integrity sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@polka/url@^1.0.0-next.24": + version "1.0.0-next.29" + resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.29.tgz#5a40109a1ab5f84d6fd8fc928b19f367cbe7e7b1" + integrity sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww== + +"@rollup/rollup-android-arm-eabi@4.53.3": + version "4.53.3" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.53.3.tgz#7e478b66180c5330429dd161bf84dad66b59c8eb" + integrity sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w== + +"@rollup/rollup-android-arm64@4.53.3": + version "4.53.3" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.53.3.tgz#2b025510c53a5e3962d3edade91fba9368c9d71c" + integrity sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w== + +"@rollup/rollup-darwin-arm64@4.53.3": + version "4.53.3" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.53.3.tgz#3577c38af68ccf34c03e84f476bfd526abca10a0" + integrity sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA== + +"@rollup/rollup-darwin-x64@4.53.3": + version "4.53.3" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.53.3.tgz#2bf5f2520a1f3b551723d274b9669ba5b75ed69c" + integrity sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ== + +"@rollup/rollup-freebsd-arm64@4.53.3": + version "4.53.3" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.53.3.tgz#4bb9cc80252564c158efc0710153c71633f1927c" + integrity sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w== + +"@rollup/rollup-freebsd-x64@4.53.3": + version "4.53.3" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.53.3.tgz#2301289094d49415a380cf942219ae9d8b127440" + integrity sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q== + +"@rollup/rollup-linux-arm-gnueabihf@4.53.3": + version "4.53.3" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.53.3.tgz#1d03d776f2065e09fc141df7d143476e94acca88" + integrity sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw== + +"@rollup/rollup-linux-arm-musleabihf@4.53.3": + version "4.53.3" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.53.3.tgz#8623de0e040b2fd52a541c602688228f51f96701" + integrity sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg== + +"@rollup/rollup-linux-arm64-gnu@4.53.3": + version "4.53.3" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.53.3.tgz#ce2d1999bc166277935dde0301cde3dd0417fb6e" + integrity sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w== + +"@rollup/rollup-linux-arm64-musl@4.53.3": + version "4.53.3" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.53.3.tgz#88c2523778444da952651a2219026416564a4899" + integrity sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A== + +"@rollup/rollup-linux-loong64-gnu@4.53.3": + version "4.53.3" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.53.3.tgz#578ca2220a200ac4226c536c10c8cc6e4f276714" + integrity sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g== + +"@rollup/rollup-linux-ppc64-gnu@4.53.3": + version "4.53.3" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.53.3.tgz#aa338d3effd4168a20a5023834a74ba2c3081293" + integrity sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw== + +"@rollup/rollup-linux-riscv64-gnu@4.53.3": + version "4.53.3" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.53.3.tgz#16ba582f9f6cff58119aa242782209b1557a1508" + integrity sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g== + +"@rollup/rollup-linux-riscv64-musl@4.53.3": + version "4.53.3" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.53.3.tgz#e404a77ebd6378483888b8064c703adb011340ab" + integrity sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A== + +"@rollup/rollup-linux-s390x-gnu@4.53.3": + version "4.53.3" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.53.3.tgz#92ad52d306227c56bec43d96ad2164495437ffe6" + integrity sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg== + +"@rollup/rollup-linux-x64-gnu@4.53.3": + version "4.53.3" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.53.3.tgz#fd0dea3bb9aa07e7083579f25e1c2285a46cb9fa" + integrity sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w== + +"@rollup/rollup-linux-x64-musl@4.53.3": + version "4.53.3" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.53.3.tgz#37a3efb09f18d555f8afc490e1f0444885de8951" + integrity sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q== + +"@rollup/rollup-openharmony-arm64@4.53.3": + version "4.53.3" + resolved "https://registry.yarnpkg.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.53.3.tgz#c489bec9f4f8320d42c9b324cca220c90091c1f7" + integrity sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw== + +"@rollup/rollup-win32-arm64-msvc@4.53.3": + version "4.53.3" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.53.3.tgz#152832b5f79dc22d1606fac3db946283601b7080" + integrity sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw== + +"@rollup/rollup-win32-ia32-msvc@4.53.3": + version "4.53.3" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.53.3.tgz#54d91b2bb3bf3e9f30d32b72065a4e52b3a172a5" + integrity sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA== + +"@rollup/rollup-win32-x64-gnu@4.53.3": + version "4.53.3" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.53.3.tgz#df9df03e61a003873efec8decd2034e7f135c71e" + integrity sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg== + +"@rollup/rollup-win32-x64-msvc@4.53.3": + version "4.53.3" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.53.3.tgz#38ae84f4c04226c1d56a3b17296ef1e0460ecdfe" + integrity sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ== + +"@standard-schema/spec@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@standard-schema/spec/-/spec-1.0.0.tgz#f193b73dc316c4170f2e82a881da0f550d551b9c" + integrity sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA== + +"@sveltejs/acorn-typescript@^1.0.5": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@sveltejs/acorn-typescript/-/acorn-typescript-1.0.8.tgz#69c746a7c232094c117c50dedbd1279fc64887b7" + integrity sha512-esgN+54+q0NjB0Y/4BomT9samII7jGwNy/2a3wNZbT2A2RpmXsXwUt24LvLhx6jUq2gVk4cWEvcRO6MFQbOfNA== + +"@sveltejs/adapter-auto@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@sveltejs/adapter-auto/-/adapter-auto-7.0.0.tgz#e3f257a0d1be3383f6cd0c146aed8d470b33a7fe" + integrity sha512-ImDWaErTOCkRS4Gt+5gZuymKFBobnhChXUZ9lhUZLahUgvA4OOvRzi3sahzYgbxGj5nkA6OV0GAW378+dl/gyw== + +"@sveltejs/kit@^2.48.5": + version "2.49.2" + resolved "https://registry.yarnpkg.com/@sveltejs/kit/-/kit-2.49.2.tgz#1c6f8991538760c3cdc6fa38feee013a78cbaf99" + integrity sha512-Vp3zX/qlwerQmHMP6x0Ry1oY7eKKRcOWGc2P59srOp4zcqyn+etJyQpELgOi4+ZSUgteX8Y387NuwruLgGXLUQ== + dependencies: + "@standard-schema/spec" "^1.0.0" + "@sveltejs/acorn-typescript" "^1.0.5" + "@types/cookie" "^0.6.0" + acorn "^8.14.1" + cookie "^0.6.0" + devalue "^5.3.2" + esm-env "^1.2.2" + kleur "^4.1.5" + magic-string "^0.30.5" + mrmime "^2.0.0" + sade "^1.8.1" + set-cookie-parser "^2.6.0" + sirv "^3.0.0" + +"@sveltejs/vite-plugin-svelte-inspector@^5.0.0": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-5.0.1.tgz#3d35254b76e07551ea8921029a96d99b94ffbc5c" + integrity sha512-ubWshlMk4bc8mkwWbg6vNvCeT7lGQojE3ijDh3QTR6Zr/R+GXxsGbyH4PExEPpiFmqPhYiVSVmHBjUcVc1JIrA== + dependencies: + debug "^4.4.1" + +"@sveltejs/vite-plugin-svelte@^6.2.1": + version "6.2.1" + resolved "https://registry.yarnpkg.com/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-6.2.1.tgz#3414c10aaacce8f23a8db2a37926da00ab7a78cb" + integrity sha512-YZs/OSKOQAQCnJvM/P+F1URotNnYNeU3P2s4oIpzm1uFaqUEqRxUB0g5ejMjEb5Gjb9/PiBI5Ktrq4rUUF8UVQ== + dependencies: + "@sveltejs/vite-plugin-svelte-inspector" "^5.0.0" + debug "^4.4.1" + deepmerge "^4.3.1" + magic-string "^0.30.17" + vitefu "^1.1.1" + +"@types/cookie@^0.6.0": + version "0.6.0" + resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.6.0.tgz#eac397f28bf1d6ae0ae081363eca2f425bedf0d5" + integrity sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA== + +"@types/estree@1.0.8", "@types/estree@^1.0.5", "@types/estree@^1.0.6": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.8.tgz#958b91c991b1867ced318bedea0e215ee050726e" + integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== + +acorn@^8.12.1, acorn@^8.14.1: + version "8.15.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.15.0.tgz#a360898bc415edaac46c8241f6383975b930b816" + integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg== + +aria-query@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.2.tgz#93f81a43480e33a338f19163a3d10a50c01dcd59" + integrity sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw== + +axobject-query@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-4.1.0.tgz#28768c76d0e3cff21bc62a9e2d0b6ac30042a1ee" + integrity sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ== + +clsx@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.1.1.tgz#eed397c9fd8bd882bfb18deab7102049a2f32999" + integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA== + +cookie@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051" + integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== + +debug@^4.4.1: + version "4.4.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" + integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== + dependencies: + ms "^2.1.3" + +deepmerge@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== + +devalue@^5.3.2, devalue@^5.5.0: + version "5.6.1" + resolved "https://registry.yarnpkg.com/devalue/-/devalue-5.6.1.tgz#f4c0a6e71d1a2bc50c02f9ca3c54ecafeb6a0445" + integrity sha512-jDwizj+IlEZBunHcOuuFVBnIMPAEHvTsJj0BcIp94xYguLRVBcXO853px/MyIJvbVzWdsGvrRweIUWJw8hBP7A== + +esbuild@^0.25.0: + version "0.25.12" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.25.12.tgz#97a1d041f4ab00c2fce2f838d2b9969a2d2a97a5" + integrity sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg== + optionalDependencies: + "@esbuild/aix-ppc64" "0.25.12" + "@esbuild/android-arm" "0.25.12" + "@esbuild/android-arm64" "0.25.12" + "@esbuild/android-x64" "0.25.12" + "@esbuild/darwin-arm64" "0.25.12" + "@esbuild/darwin-x64" "0.25.12" + "@esbuild/freebsd-arm64" "0.25.12" + "@esbuild/freebsd-x64" "0.25.12" + "@esbuild/linux-arm" "0.25.12" + "@esbuild/linux-arm64" "0.25.12" + "@esbuild/linux-ia32" "0.25.12" + "@esbuild/linux-loong64" "0.25.12" + "@esbuild/linux-mips64el" "0.25.12" + "@esbuild/linux-ppc64" "0.25.12" + "@esbuild/linux-riscv64" "0.25.12" + "@esbuild/linux-s390x" "0.25.12" + "@esbuild/linux-x64" "0.25.12" + "@esbuild/netbsd-arm64" "0.25.12" + "@esbuild/netbsd-x64" "0.25.12" + "@esbuild/openbsd-arm64" "0.25.12" + "@esbuild/openbsd-x64" "0.25.12" + "@esbuild/openharmony-arm64" "0.25.12" + "@esbuild/sunos-x64" "0.25.12" + "@esbuild/win32-arm64" "0.25.12" + "@esbuild/win32-ia32" "0.25.12" + "@esbuild/win32-x64" "0.25.12" + +esm-env@^1.2.1, esm-env@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/esm-env/-/esm-env-1.2.2.tgz#263c9455c55861f41618df31b20cb571fc20b75e" + integrity sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA== + +esrap@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/esrap/-/esrap-2.2.1.tgz#cbe28fe94cd7c75b158609d602f5e345bae21259" + integrity sha512-GiYWG34AN/4CUyaWAgunGt0Rxvr1PTMlGC0vvEov/uOQYWne2bpN03Um+k8jT+q3op33mKouP2zeJ6OlM+qeUg== + dependencies: + "@jridgewell/sourcemap-codec" "^1.4.15" + +fdir@^6.5.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.5.0.tgz#ed2ab967a331ade62f18d077dae192684d50d350" + integrity sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg== + +fsevents@~2.3.2, fsevents@~2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +is-reference@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-3.0.3.tgz#9ef7bf9029c70a67b2152da4adf57c23d718910f" + integrity sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw== + dependencies: + "@types/estree" "^1.0.6" + +kleur@^4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.5.tgz#95106101795f7050c6c650f350c683febddb1780" + integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== + +locate-character@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-character/-/locate-character-3.0.0.tgz#0305c5b8744f61028ef5d01f444009e00779f974" + integrity sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA== + +magic-string@^0.30.11, magic-string@^0.30.17, magic-string@^0.30.5: + version "0.30.21" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.21.tgz#56763ec09a0fa8091df27879fd94d19078c00d91" + integrity sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ== + dependencies: + "@jridgewell/sourcemap-codec" "^1.5.5" + +mri@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" + integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== + +mrmime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-2.0.1.tgz#bc3e87f7987853a54c9850eeb1f1078cd44adddc" + integrity sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ== + +ms@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +nanoid@^3.3.11: + version "3.3.11" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b" + integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== + +picocolors@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== + +picomatch@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.3.tgz#796c76136d1eead715db1e7bad785dedd695a042" + integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q== + +postcss@^8.5.6: + version "8.5.6" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.6.tgz#2825006615a619b4f62a9e7426cc120b349a8f3c" + integrity sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg== + dependencies: + nanoid "^3.3.11" + picocolors "^1.1.1" + source-map-js "^1.2.1" + +rollup@^4.43.0: + version "4.53.3" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.53.3.tgz#dbc8cd8743b38710019fb8297e8d7a76e3faa406" + integrity sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA== + dependencies: + "@types/estree" "1.0.8" + optionalDependencies: + "@rollup/rollup-android-arm-eabi" "4.53.3" + "@rollup/rollup-android-arm64" "4.53.3" + "@rollup/rollup-darwin-arm64" "4.53.3" + "@rollup/rollup-darwin-x64" "4.53.3" + "@rollup/rollup-freebsd-arm64" "4.53.3" + "@rollup/rollup-freebsd-x64" "4.53.3" + "@rollup/rollup-linux-arm-gnueabihf" "4.53.3" + "@rollup/rollup-linux-arm-musleabihf" "4.53.3" + "@rollup/rollup-linux-arm64-gnu" "4.53.3" + "@rollup/rollup-linux-arm64-musl" "4.53.3" + "@rollup/rollup-linux-loong64-gnu" "4.53.3" + "@rollup/rollup-linux-ppc64-gnu" "4.53.3" + "@rollup/rollup-linux-riscv64-gnu" "4.53.3" + "@rollup/rollup-linux-riscv64-musl" "4.53.3" + "@rollup/rollup-linux-s390x-gnu" "4.53.3" + "@rollup/rollup-linux-x64-gnu" "4.53.3" + "@rollup/rollup-linux-x64-musl" "4.53.3" + "@rollup/rollup-openharmony-arm64" "4.53.3" + "@rollup/rollup-win32-arm64-msvc" "4.53.3" + "@rollup/rollup-win32-ia32-msvc" "4.53.3" + "@rollup/rollup-win32-x64-gnu" "4.53.3" + "@rollup/rollup-win32-x64-msvc" "4.53.3" + fsevents "~2.3.2" + +sade@^1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/sade/-/sade-1.8.1.tgz#0a78e81d658d394887be57d2a409bf703a3b2701" + integrity sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A== + dependencies: + mri "^1.1.0" + +set-cookie-parser@^2.6.0: + version "2.7.2" + resolved "https://registry.yarnpkg.com/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz#ccd08673a9ae5d2e44ea2a2de25089e67c7edf68" + integrity sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw== + +sirv@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/sirv/-/sirv-3.0.2.tgz#f775fccf10e22a40832684848d636346f41cd970" + integrity sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g== + dependencies: + "@polka/url" "^1.0.0-next.24" + mrmime "^2.0.0" + totalist "^3.0.0" + +source-map-js@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" + integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== + +svelte@^5.43.8: + version "5.45.8" + resolved "https://registry.yarnpkg.com/svelte/-/svelte-5.45.8.tgz#37045a8acdd452e61b2f035c25c7ef33e24566a3" + integrity sha512-1Jh7FwVh/2Uxg0T7SeE1qFKMhwYH45b2v53bcZpW7qHa6O8iU1ByEj56PF0IQ6dU4HE5gRkic6h+vx+tclHeiw== + dependencies: + "@jridgewell/remapping" "^2.3.4" + "@jridgewell/sourcemap-codec" "^1.5.0" + "@sveltejs/acorn-typescript" "^1.0.5" + "@types/estree" "^1.0.5" + acorn "^8.12.1" + aria-query "^5.3.1" + axobject-query "^4.1.0" + clsx "^2.1.1" + devalue "^5.5.0" + esm-env "^1.2.1" + esrap "^2.2.1" + is-reference "^3.0.3" + locate-character "^3.0.0" + magic-string "^0.30.11" + zimmerframe "^1.1.2" + +tinyglobby@^0.2.15: + version "0.2.15" + resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.15.tgz#e228dd1e638cea993d2fdb4fcd2d4602a79951c2" + integrity sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ== + dependencies: + fdir "^6.5.0" + picomatch "^4.0.3" + +totalist@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/totalist/-/totalist-3.0.1.tgz#ba3a3d600c915b1a97872348f79c127475f6acf8" + integrity sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ== + +typescript@^5.9.3: + version "5.9.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.9.3.tgz#5b4f59e15310ab17a216f5d6cf53ee476ede670f" + integrity sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw== + +vite@^7.2.2: + version "7.2.7" + resolved "https://registry.yarnpkg.com/vite/-/vite-7.2.7.tgz#0789a4c3206081699f34a9ecca2dda594a07478e" + integrity sha512-ITcnkFeR3+fI8P1wMgItjGrR10170d8auB4EpMLPqmx6uxElH3a/hHGQabSHKdqd4FXWO1nFIp9rRn7JQ34ACQ== + dependencies: + esbuild "^0.25.0" + fdir "^6.5.0" + picomatch "^4.0.3" + postcss "^8.5.6" + rollup "^4.43.0" + tinyglobby "^0.2.15" + optionalDependencies: + fsevents "~2.3.3" + +vitefu@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/vitefu/-/vitefu-1.1.1.tgz#c39b7e4c91bf2f6c590fb96e0758f394dff5795b" + integrity sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ== + +zimmerframe@^1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/zimmerframe/-/zimmerframe-1.1.4.tgz#0352b5cafad3ad4526b0a526a9a52d9c040d865b" + integrity sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==