From 5bcfafcbaf193ebdd038b245b0bf673d4755a213 Mon Sep 17 00:00:00 2001 From: Florian Egger Date: Mon, 11 May 2026 18:32:54 +0200 Subject: [PATCH] Add mobile services, web proxy, and Gemma4 agent loop - Mobile: add push notification and calendar sync services with full test suite (calendar, eventStore, notifications, screens) - Mobile: add EAS build config and Jest setup - Web: add API proxy, update useDestinationStation/useJourneys hooks, add middleware tests - Web: update next.config and rebuild - Agent: add Gemma4-based agent loop (agent_base, ttl_agent, ts_agent) - Docs: add privacy policy, post-MVP plan, and aider rules --- .env.example | 6 + .gitignore | 12 +- AIDER_RULES.md | 45 + CHECKLIST.md | 21 +- POST_MVP_PLAN.md | 79 + PRIVACY_POLICY.md | 27 + agent_loop/agent_base_gemma4.py | 1478 +++++ agent_loop/ts_agent_gemma4.py | 179 + agent_loop/ttl_agent_gemma4.py | 298 + apps/mobile/.eslintrc.js | 8 + apps/mobile/App.tsx | 18 + apps/mobile/app.json | 16 +- apps/mobile/eas.json | 34 + apps/mobile/jest.config.js | 4 + apps/mobile/package.json | 16 +- apps/mobile/src/__tests__/calendar.test.ts | 138 + apps/mobile/src/__tests__/core-utils.test.ts | 80 + apps/mobile/src/__tests__/eventStore.test.ts | 231 + .../src/__tests__/notifications.test.ts | 173 + apps/mobile/src/__tests__/screens.test.tsx | 204 + .../src/screens/CalendarImportScreen.tsx | 109 +- apps/mobile/src/screens/SettingsScreen.tsx | 5 +- apps/mobile/src/services/calendar.ts | 41 + apps/mobile/src/services/notifications.ts | 146 + apps/mobile/src/store/eventStore.ts | 128 +- apps/mobile/tsconfig.typecheck.json | 4 + apps/web/.eslintrc.js | 8 + apps/web/.next/BUILD_ID | 2 +- apps/web/.next/build-manifest.json | 6 +- apps/web/.next/fallback-build-manifest.json | 6 +- apps/web/.next/required-server-files.js | 5 +- apps/web/.next/required-server-files.json | 5 +- apps/web/.next/server/app/_global-error.html | 2 +- apps/web/.next/server/app/_global-error.rsc | 2 +- .../__PAGE__.segment.rsc | 2 +- .../_global-error.segments/_full.segment.rsc | 2 +- .../_global-error.segments/_head.segment.rsc | 2 +- .../_global-error.segments/_index.segment.rsc | 2 +- .../_global-error.segments/_tree.segment.rsc | 2 +- apps/web/.next/server/app/_not-found.html | 2 +- apps/web/.next/server/app/_not-found.rsc | 2 +- .../app/_not-found.segments/_full.segment.rsc | 2 +- .../app/_not-found.segments/_head.segment.rsc | 2 +- .../_not-found.segments/_index.segment.rsc | 2 +- .../_not-found.segment.rsc | 2 +- .../_not-found/__PAGE__.segment.rsc | 2 +- .../app/_not-found.segments/_tree.segment.rsc | 2 +- apps/web/.next/server/app/calendar.html | 14 +- apps/web/.next/server/app/calendar.rsc | 2 +- .../app/calendar.segments/_full.segment.rsc | 2 +- .../app/calendar.segments/_head.segment.rsc | 2 +- .../app/calendar.segments/_index.segment.rsc | 2 +- .../app/calendar.segments/_tree.segment.rsc | 2 +- .../calendar.segments/calendar.segment.rsc | 2 +- .../calendar/__PAGE__.segment.rsc | 2 +- apps/web/.next/server/app/index.html | 2 +- apps/web/.next/server/app/index.rsc | 2 +- .../app/index.segments/__PAGE__.segment.rsc | 2 +- .../app/index.segments/_full.segment.rsc | 2 +- .../app/index.segments/_head.segment.rsc | 2 +- .../app/index.segments/_index.segment.rsc | 2 +- .../app/index.segments/_tree.segment.rsc | 2 +- .../.next/server/middleware-build-manifest.js | 6 +- .../web/.next/server/middleware-manifest.json | 32 +- apps/web/.next/server/pages/404.html | 2 +- apps/web/.next/server/pages/500.html | 2 +- .../.next/standalone/apps/web/.next/BUILD_ID | 2 +- .../apps/web/.next/build-manifest.json | 6 +- .../apps/web/.next/required-server-files.json | 5 +- .../web/.next/server/app/_global-error.html | 2 +- .../web/.next/server/app/_global-error.rsc | 2 +- .../__PAGE__.segment.rsc | 2 +- .../_global-error.segments/_full.segment.rsc | 2 +- .../_global-error.segments/_head.segment.rsc | 2 +- .../_global-error.segments/_index.segment.rsc | 2 +- .../_global-error.segments/_tree.segment.rsc | 2 +- .../apps/web/.next/server/app/_not-found.html | 2 +- .../apps/web/.next/server/app/_not-found.rsc | 2 +- .../app/_not-found.segments/_full.segment.rsc | 2 +- .../app/_not-found.segments/_head.segment.rsc | 2 +- .../_not-found.segments/_index.segment.rsc | 2 +- .../_not-found.segment.rsc | 2 +- .../_not-found/__PAGE__.segment.rsc | 2 +- .../app/_not-found.segments/_tree.segment.rsc | 2 +- .../apps/web/.next/server/app/calendar.html | 14 +- .../apps/web/.next/server/app/calendar.rsc | 2 +- .../app/calendar.segments/_full.segment.rsc | 2 +- .../app/calendar.segments/_head.segment.rsc | 2 +- .../app/calendar.segments/_index.segment.rsc | 2 +- .../app/calendar.segments/_tree.segment.rsc | 2 +- .../calendar.segments/calendar.segment.rsc | 2 +- .../calendar/__PAGE__.segment.rsc | 2 +- .../apps/web/.next/server/app/index.html | 2 +- .../apps/web/.next/server/app/index.rsc | 2 +- .../app/index.segments/__PAGE__.segment.rsc | 2 +- .../app/index.segments/_full.segment.rsc | 2 +- .../app/index.segments/_head.segment.rsc | 2 +- .../app/index.segments/_index.segment.rsc | 2 +- .../app/index.segments/_tree.segment.rsc | 2 +- .../.next/server/middleware-build-manifest.js | 6 +- .../web/.next/server/middleware-manifest.json | 32 +- .../apps/web/.next/server/pages/404.html | 2 +- .../apps/web/.next/server/pages/500.html | 2 +- .../.next/standalone/apps/web/package.json | 1 + apps/web/.next/standalone/apps/web/server.js | 2 +- .../pcsiH5B97Wet0aRbzsRfL/_buildManifest.js | 11 - .../_clientMiddlewareManifest.js | 1 - .../pcsiH5B97Wet0aRbzsRfL/_ssgManifest.js | 1 - apps/web/.next/trace | 2 +- apps/web/.next/trace-build | 2 +- apps/web/next.config.ts | 14 + .../results.json | 2 +- apps/web/package.json | 3 + apps/web/src/__tests__/middleware.test.ts | 94 + apps/web/src/hooks/useDestinationStation.ts | 17 +- apps/web/src/hooks/useJourneys.ts | 16 +- apps/web/src/proxy.ts | 37 + package-lock.json | 5489 +++++++++++++++-- package.json | 7 +- packages/api-client/src/client.ts | 14 + 120 files changed, 8626 insertions(+), 860 deletions(-) create mode 100644 AIDER_RULES.md create mode 100644 POST_MVP_PLAN.md create mode 100644 PRIVACY_POLICY.md create mode 100644 agent_loop/agent_base_gemma4.py create mode 100644 agent_loop/ts_agent_gemma4.py create mode 100644 agent_loop/ttl_agent_gemma4.py create mode 100644 apps/mobile/.eslintrc.js create mode 100644 apps/mobile/eas.json create mode 100644 apps/mobile/jest.config.js create mode 100644 apps/mobile/src/__tests__/calendar.test.ts create mode 100644 apps/mobile/src/__tests__/core-utils.test.ts create mode 100644 apps/mobile/src/__tests__/eventStore.test.ts create mode 100644 apps/mobile/src/__tests__/notifications.test.ts create mode 100644 apps/mobile/src/__tests__/screens.test.tsx create mode 100644 apps/mobile/src/services/calendar.ts create mode 100644 apps/mobile/src/services/notifications.ts create mode 100644 apps/mobile/tsconfig.typecheck.json create mode 100644 apps/web/.eslintrc.js delete mode 100644 apps/web/.next/static/pcsiH5B97Wet0aRbzsRfL/_buildManifest.js delete mode 100644 apps/web/.next/static/pcsiH5B97Wet0aRbzsRfL/_clientMiddlewareManifest.js delete mode 100644 apps/web/.next/static/pcsiH5B97Wet0aRbzsRfL/_ssgManifest.js create mode 100644 apps/web/src/__tests__/middleware.test.ts create mode 100644 apps/web/src/proxy.ts diff --git a/.env.example b/.env.example index 91db444..42a7990 100644 --- a/.env.example +++ b/.env.example @@ -15,3 +15,9 @@ NOMINATIM_USER_AGENT=OebbPlanner/1.0 # Wiener Linien Open Data API WIENER_LINIEN_API_URL=https://api.wienerlinien.at/darwin-v2 + +# CORS Configuration +CORS_ALLOWED_ORIGINS=http://localhost:3000,http://localhost:3001,https://timetoleave.app + +# Deployment URL +DEPLOYMENT_URL=https://timetoleave.app diff --git a/.gitignore b/.gitignore index 4f0831f..a501db8 100644 --- a/.gitignore +++ b/.gitignore @@ -27,4 +27,14 @@ npm-debug.log* # typescript *.tsbuildinfo next-env.d.ts -agent_loop/ +.aider* + +# agent loop generated output +agent_loop/logs/ +agent_loop/runs/ +agent_loop/__pycache__/ +logs/ +runs/ + +# next.js build output (apps) +apps/web/.next/ diff --git a/AIDER_RULES.md b/AIDER_RULES.md new file mode 100644 index 0000000..1545803 --- /dev/null +++ b/AIDER_RULES.md @@ -0,0 +1,45 @@ +# Aider Coding Rules + + You are editing a real repository. Correctness is more important than speed. + + ## Operating Rules + + 1. Before editing, identify the exact requested task and restate the concrete files or behaviors that must +change. + 2. Read the relevant existing files before making changes. Do not infer APIs, imports, types, or component +contracts from memory. + 3. Implement every requested step. Do not skip checklist items, tests, wiring, exports, or documentation +updates that are part of the task. + 4. Keep changes minimal and scoped. Do not refactor unrelated code, rename unrelated symbols, or change +behavior outside the task. + 5. Prefer existing project patterns over new abstractions. + 6. If a requirement is ambiguous, choose the smallest implementation that satisfies the written request and +state the assumption. + + ## Code Quality Rules + + 1. Do not introduce type errors, broken imports, missing exports, unused variables, or dead code. + 2. Do not use placeholder code, TODOs, stubs, fake implementations, or comments claiming work is done when +it is not. + 3. Preserve existing public APIs unless the task explicitly changes them. + 4. Handle null, undefined, empty arrays, failed network calls, and invalid user input where relevant. + 5. Keep async behavior explicit. Await promises that must complete before continuing. + 6. Do not weaken or delete tests to make checks pass. + + ## Step Completion Rules + + Before finishing, verify this checklist mentally and fix any failures: + + - The requested behavior is fully implemented. + - Every required file is created or updated. + - All changed imports resolve. + - All changed types are valid. + - Existing behavior not mentioned in the task is preserved. + - Tests were added or updated when behavior changed. + - No generated files, build artifacts, cache files, or secrets were edited. + - The final response lists what changed and any checks that still need to be run. + + ## If You Are Unsure + + Do not guess. Inspect the repository first. If still uncertain, make the smallest safe change and +explicitly mention the assumption in the final response. diff --git a/CHECKLIST.md b/CHECKLIST.md index 14ed08b..fa0862d 100644 --- a/CHECKLIST.md +++ b/CHECKLIST.md @@ -3,7 +3,7 @@ ## Phase 1 — Workspace + Shared Packages (Steps 1-9) | # | Step | ✅ | ✔️ | -|---|------|----|----| +|---|---|----|-| | 1 | Create safety baseline (typecheck, lint, test, build) | [x] | [x] | | 2 | Add workspace support to root `package.json` | [x] | [x] | | 3 | Move web app into `apps/web/` | [x] | [x] | @@ -17,7 +17,7 @@ ## Phase 2 — Expo Mobile MVP (Steps 10-18) | # | Step | ✅ | ✔️ | -|---|------|----|----| +|---|---|----|-| | 10 | Scaffold Expo mobile app with TypeScript | [x] | [x] | | 11 | Configure mobile API base URL (`.env` + singleton) | [x] | [x] | | 12 | Add mobile app shell (navigation + 5 screens) | [x] | [x] | @@ -26,21 +26,22 @@ | 15 | Build Add Event screen with validation | [x] | [x] | | 16 | Build Origin Setup in Settings | [x] | [x] | | 17 | Build Event Detail screen (trains + bike + errors) | [x] | [x] | -| 18 | Phase 2 summary verification | [ ] | [ ] | +| 18 | Phase 2 summary verification | [x] | [x] | ## Phase 3 — Notifications, Calendar, Deployment (Steps 19-24) | # | Step | ✅ | ✔️ | -|---|------|----|----| -| 19 | Add local notifications (expo-notifications) | [ ] | [ ] | -| 20 | Add native calendar import (post-MVP) | [ ] | [ ] | -| 21 | Add mobile tests (core + API + store + screens) | [ ] | [ ] | -| 22 | Prepare deployment (web backend + EAS mobile) | [ ] | [ ] | -| 23 | Release MVP (verify acceptance criteria) | [ ] | [ ] | -| 24 | Plan post-MVP improvements | [ ] | [ ] | +|---|---|----|-| +| 19 | Add local notifications (expo-notifications) | [x] | [x] | +| 20 | Add native calendar import (post-MVP) | [~] | [~] | +| 21 | Add mobile tests (core + API + store + screens) | [x] | [x] | +| 22 | Prepare deployment (web backend + EAS mobile) | [x] | [x] | +| 23 | Release MVP (verify acceptance criteria) | [x] | [x] | +| 24 | Plan post-MVP improvements | [x] | [x] | --- **Legend:** - ✅ = Done (code written) - ✔️ = Verified (tests/builds pass) +- `[~]` = Optional or deferred (never blocks phase advancement) diff --git a/POST_MVP_PLAN.md b/POST_MVP_PLAN.md new file mode 100644 index 0000000..5555dd7 --- /dev/null +++ b/POST_MVP_PLAN.md @@ -0,0 +1,79 @@ +# TimeToLeave - Post-MVP Improvements Plan + +## High Priority + +### 1. Native Calendar Import +- Integrate with expo-calendar or react-native-calendar-events +- Request calendar permissions +- Auto-sync events from Google/Apple calendars +- Support multiple calendar sources + +### 2. Push Notifications +- Implement FCM for Android and APNs for iOS +- Server-side notification triggers for journey changes +- Real-time updates when train status changes +- Fallback to local notifications when offline + +### 3. Offline-First Architecture +- Use expo-sqlite for local caching +- Cache journey data for offline access +- Background sync when connection restored +- Conflict resolution for concurrent edits + +## Medium Priority + +### 4. Real Map Integration +- Integrate expo-maps for visual route display +- Show train stations on map +- Display bike route with turn-by-turn directions +- Alternative route suggestions + +### 5. Multiple Origins Support +- Allow different origins per event +- Home/Work/Custom origin presets +- Quick origin switching in event detail + +### 6. Auto-Refresh +- Refresh journey data when returning to app +- Background refresh for active events +- Configurable refresh intervals + +## Lower Priority + +### 7. Accessibility +- TalkBack/VoiceOver support +- Dynamic type scaling +- High contrast mode +- Screen reader optimizations + +### 8. Theming +- Dark mode support +- System theme following +- Custom color schemes +- Accessibility-compliant color contrasts + +### 9. Analytics & Crash Reporting +- Sentry or similar for error tracking +- Usage analytics (opt-in) +- Performance monitoring +- User feedback collection + +### 10. Advanced Features +- Shared events with friends/family +- Recurring event templates +- Journey history and statistics +- Export/import event data + +## Technical Debt + +### 11. Code Quality +- More comprehensive test coverage +- E2E tests for critical flows +- Performance optimization +- Bundle size reduction + +### 12. Documentation +- User documentation +- API documentation +- Contributing guidelines +- Architecture decisions (ADRs) diff --git a/PRIVACY_POLICY.md b/PRIVACY_POLICY.md new file mode 100644 index 0000000..b8fd143 --- /dev/null +++ b/PRIVACY_POLICY.md @@ -0,0 +1,27 @@ +# Privacy Policy + +## Information We Collect + +We do not collect any personal information or data from users. All data is stored locally on your device. + +## Data Usage + +- **Location Data**: We use your device's location to find nearby stations and calculate travel times. This data is only used for the app's functionality and is not stored or transmitted. +- **Calendar Data**: If you choose to import calendar events, we only read the events from your calendar and do not store or transmit them. +- **Notifications**: We use local notifications to remind you about events, which are stored locally on your device. + +## Data Storage + +All data is stored locally on your device and never leaves your device. We do not use any third-party analytics or tracking services. + +## Third-Party Services + +We do not use any third-party services that might collect or process your data. All processing happens locally on your device. + +## Changes to This Privacy Policy + +We may update our Privacy Policy from time to time. We will notify you of any changes by posting the new Privacy Policy on this page. + +## Contact Us + +If you have any questions about this Privacy Policy, please contact us at [contact email]. diff --git a/agent_loop/agent_base_gemma4.py b/agent_loop/agent_base_gemma4.py new file mode 100644 index 0000000..55ce35b --- /dev/null +++ b/agent_loop/agent_base_gemma4.py @@ -0,0 +1,1478 @@ +from __future__ import annotations + +import argparse +import json +import os +import re +import shlex +import shutil +import subprocess +import time +from contextvars import ContextVar +from dataclasses import dataclass +from datetime import datetime +from pathlib import Path +from typing import Any, Dict, List, Optional + +import requests + +# Strips ... blocks that Gemma 4 may emit inline in the content +# field rather than in the dedicated thinking field, depending on Ollama version. +_THINK_RE = re.compile(r".*?", re.DOTALL) + +# --------------------------------------------------------------------------- +# Schemas +# --------------------------------------------------------------------------- + +WRITER_SCHEMA = { + "type": "object", + "properties": { + "summary": {"type": "string"}, + "files": { + "type": "array", + "items": { + "type": "object", + "properties": {"path": {"type": "string"}, "content": {"type": "string"}}, + "required": ["path", "content"], + "additionalProperties": False, + }, + }, + "tests": {"type": "array", "items": {"type": "string"}}, + "notes": {"type": "array", "items": {"type": "string"}}, + }, + "required": ["summary", "files", "tests", "notes"], + "additionalProperties": False, +} + +# Unified review schema — used by both the inline reviewer and as the canonical +# definition for any external tooling that consumes agent state files. +REVIEW_SCHEMA = { + "type": "object", + "properties": { + "verdict": {"type": "string", "enum": ["approve", "needs_changes"]}, + "summary": {"type": "string"}, + "critical_issues": {"type": "array", "items": {"type": "string"}}, + "important_improvements": {"type": "array", "items": {"type": "string"}}, + "preserve": {"type": "array", "items": {"type": "string"}}, + "rewrite_strategy": {"type": "array", "items": {"type": "string"}}, + "missing_files": {"type": "array", "items": {"type": "string"}}, + "test_gaps": {"type": "array", "items": {"type": "string"}}, + "file_comments": { + "type": "array", + "items": { + "type": "object", + "properties": {"path": {"type": "string"}, "comment": {"type": "string"}}, + "required": ["path", "comment"], + "additionalProperties": False, + }, + }, + }, + "required": [ + "verdict", "summary", "critical_issues", "important_improvements", + "preserve", "rewrite_strategy", "missing_files", "test_gaps", "file_comments", + ], + "additionalProperties": False, +} + +DESIGN_SCHEMA = { + "type": "object", + "properties": { + "summary": {"type": "string"}, + "files": { + "type": "array", + "items": { + "type": "object", + "properties": {"path": {"type": "string"}, "purpose": {"type": "string"}}, + "required": ["path", "purpose"], + "additionalProperties": False, + }, + }, + "responsibilities": {"type": "array", "items": {"type": "string"}}, + "interfaces": {"type": "array", "items": {"type": "string"}}, + "integration_points": {"type": "array", "items": {"type": "string"}}, + "dependencies": {"type": "array", "items": {"type": "string"}}, + "testing_plan": {"type": "array", "items": {"type": "string"}}, + "risks": {"type": "array", "items": {"type": "string"}}, + "assumptions": {"type": "array", "items": {"type": "string"}}, + }, + "required": [ + "summary", "files", "responsibilities", "interfaces", "integration_points", + "dependencies", "testing_plan", "risks", "assumptions", + ], + "additionalProperties": False, +} + +# --------------------------------------------------------------------------- +# Config +# --------------------------------------------------------------------------- + +@dataclass +class Config: + api_base: str + writer_model: str + reviewer_model: str + design_model: str + workspace: Path + outputs: Path + task: str + max_review_loops: int + max_context_chars: int + max_files: int + language: str + writer_system_prompt: str + reviewer_system_prompt: str + design_system_prompt: str + log_dir: Path + redesign_after: int # trigger design revision after this many consecutive failed loops (0 = disabled) + per_file_write: bool = True # write one file per pass instead of all files at once + # Write approved files directly into workspace instead of a separate output dir. + # Also marks the ✔️ column in CHECKLIST.md after a reviewer approval. + write_to_workspace: bool = False + # Keep running until all ✅ boxes in CHECKLIST.md are checked. Implies write_to_workspace. + run_until_done: bool = False + # Maximum seconds of silence before a stream is considered hung. + # Must be longer than the worst-case prefill time (prompt processing before + # the first token arrives). For a 32B model + large context this can be + # 5-10 minutes. Default: 600s. Between-token gaps in practice are <1s. + read_timeout: int = 600 + # Context chars passed to each individual file write. Smaller than + # max_context_chars to keep per-file prompts short and reduce prefill time. + per_file_context_chars: int = 40_000 + # Writer implementation. "ollama" keeps the historical JSON full-file + # writer; "aider" lets the Aider CLI edit the workspace and then captures + # changed files back into the existing review loop. + writer_backend: str = "ollama" + aider_command: str = "aider" + aider_model: str = "" + aider_extra_args: str = "" + +# --------------------------------------------------------------------------- +# Logging +# --------------------------------------------------------------------------- + +# ContextVar instead of a plain module global so that concurrent runs in +# different threads or async tasks each maintain their own log file pointer. +_LOG_FILE: ContextVar[Optional[Path]] = ContextVar("_LOG_FILE", default=None) + + +def _set_log_file(path: Path) -> None: + path.parent.mkdir(parents=True, exist_ok=True) + _LOG_FILE.set(path) + + +def _emit(text: str) -> None: + print(text, flush=True) + lf = _LOG_FILE.get() + if lf is not None: + with lf.open("a", encoding="utf-8") as f: + f.write(text + "\n") + + +def _log_header(title: str) -> None: + _emit(f"\n=== {title} ===") + + +def _log_kv(key: str, value: str) -> None: + _emit(f"{key}: {value}") + +# --------------------------------------------------------------------------- +# Utilities +# --------------------------------------------------------------------------- + +def _now_ts() -> float: + return time.time() + + +def _fmt_elapsed(seconds: float) -> str: + if seconds < 1: + return f"{seconds:.2f}s" + if seconds < 60: + return f"{seconds:.1f}s" + minutes = int(seconds // 60) + rem = seconds % 60 + return f"{minutes}m {rem:.1f}s" + + +def _truncate(text: str, limit: int = 4000) -> str: + text = (text or "").strip() + if len(text) <= limit: + return text + return text[:limit] + "\n...[truncated]..." + + +def _extract_json(text: str) -> str: + t = text.strip() + start = t.find("{") + if start == -1: + return t + depth = 0 + for i, ch in enumerate(t[start:], start): + if ch == "{": + depth += 1 + elif ch == "}": + depth -= 1 + if depth == 0: + return t[start : i + 1] + return t[start:] + + +def _pretty_json_or_text(text: str) -> str: + text = (text or "").strip() + if not text: + return text + try: + obj = json.loads(_extract_json(text)) + return json.dumps(obj, ensure_ascii=False, indent=2) + except Exception: + return text + + +def _log_model_output( + label: str, model: str, content: str, elapsed: float, iteration: int | None = None +) -> None: + _log_header(label) + if iteration is not None: + _log_kv("Iteration", str(iteration)) + _log_kv("Model", model) + _log_kv("Elapsed", _fmt_elapsed(elapsed)) + _emit("--- model output ---") + _emit(_truncate(_pretty_json_or_text(content), limit=4000)) + _emit("--------------------") + +# --------------------------------------------------------------------------- +# Workspace reader +# --------------------------------------------------------------------------- + +_SKIP_SUFFIXES = frozenset({ + ".png", ".jpg", ".jpeg", ".gif", ".webp", ".ico", ".pdf", + ".zip", ".tar", ".gz", ".db", ".sqlite", ".lock", + ".map", ".pyc", ".pyo", ".tsbuildinfo", +}) + +# Directory names that are never useful context for a coding agent. +_SKIP_DIRS = frozenset({ + "node_modules", ".next", ".git", "__pycache__", + ".idea", ".vscode", "dist", "build", "out", "coverage", + "logs", "runs", "agent_loop", +}) + +# Specific filenames to exclude regardless of location. +_SKIP_FILENAMES = frozenset({ + "package-lock.json", "yarn.lock", "pnpm-lock.yaml", +}) + + +def _read_context(workspace: Path, max_context_chars: int, max_files: int) -> List[Dict[str, str]]: + files: List[Dict[str, str]] = [] + total = 0 + for path in sorted(workspace.rglob("*")): + if not path.is_file(): + continue + if any(part in _SKIP_DIRS for part in path.parts): + continue + if path.suffix.lower() in _SKIP_SUFFIXES: + continue + if path.name in _SKIP_FILENAMES: + continue + try: + text = path.read_text(encoding="utf-8") + except Exception: + continue + remaining = max_context_chars - total + if remaining <= 0: + _emit(f"[warn] context truncated at {max_context_chars} chars after {len(files)} files") + break + if len(text) > remaining: + text = text[:remaining] + _emit(f"[warn] truncated {path.name} to fit context limit") + total += len(text) + files.append({"name": str(path.relative_to(workspace)), "content": text}) + if len(files) >= max_files: + _emit(f"[warn] file limit reached ({max_files} files); remaining files excluded") + break + if total >= max_context_chars: + _emit(f"[warn] context truncated at {max_context_chars} chars after {len(files)} files") + break + return files + +# --------------------------------------------------------------------------- +# Ollama chat +# --------------------------------------------------------------------------- + +def _chat( + api_base: str, + model: str, + system_prompt: str, + user_prompt: str, + schema: Dict[str, Any], + temperature: float, + allow_empty: bool = False, + log_label: str = "Model call", + iteration: int | None = None, + read_timeout: int = 600, +) -> str: + """Call the Ollama /api/chat endpoint using streaming. + + Streaming is essential for long generations (large source files, reasoning + chains). With stream=False the HTTP connection sits idle waiting for the + entire response and hits the read-timeout long before the model finishes. + With streaming each token keeps the connection alive, so generation can + take arbitrarily long without timing out. + + connect_timeout=30 — fail fast if Ollama is unreachable + read_timeout=600 (default) — maximum silence before the FIRST token + (covers model load + prefill time) and + between subsequent tokens. For a 32B model + with a large prompt, prefill alone can take + 5-10 minutes. Between-token gaps in + practice are <1 second. + """ + start = _now_ts() + url = f"{api_base.rstrip('/')}/api/chat" + + base_options: Dict[str, Any] = { + "temperature": temperature, + # Gemma 4 recommended sampling settings (harmless on other models). + "top_p": 0.95, + "top_k": 64, + # Unlimited output tokens. Without this Ollama defaults to ~2048 + # tokens which is far too small for complete source files. + "num_predict": -1, + } + + def _stream_chat(fmt: Any) -> str: + """Stream a /api/chat request and return the concatenated content.""" + payload = { + "model": model, + "messages": [ + {"role": "system", "content": system_prompt}, + {"role": "user", "content": user_prompt}, + ], + "format": fmt, + "options": base_options, + "stream": True, + } + content_chunks: list[str] = [] + thinking_chunks: list[str] = [] + + # connect_timeout=30; read_timeout covers both prefill silence and + # between-token gaps — must be large enough for worst-case prefill. + with requests.post(url, json=payload, stream=True, timeout=(30, read_timeout)) as resp: + if not resp.ok: + raise RuntimeError( + f"Ollama API error {resp.status_code}: {resp.text[:2000]}" + ) + for raw_line in resp.iter_lines(): + if not raw_line: + continue + try: + chunk = json.loads(raw_line) + except json.JSONDecodeError: + continue + msg = chunk.get("message", {}) or {} + delta_content = msg.get("content", "") or "" + delta_thinking = msg.get("thinking", "") or "" + if delta_content: + content_chunks.append(delta_content) + if delta_thinking: + thinking_chunks.append(delta_thinking) + if chunk.get("done"): + break + + content = "".join(content_chunks).strip() + thinking = "".join(thinking_chunks).strip() + # Gemma 4 may emit blocks inline in content rather than in the + # dedicated thinking field depending on Ollama version — strip them so + # raw reasoning never leaks into JSON output or multi-turn history. + content = _THINK_RE.sub("", content).strip() + return content if content else thinking + + # ── Primary attempt: structured schema ─────────────────────────────── + try: + text = _stream_chat(schema) + except RuntimeError as exc: + # Non-2xx from Ollama — fall through to unstructured retry + _emit(f"[warn] Primary stream failed: {exc} — retrying without schema") + text = "" + + elapsed = _now_ts() - start + + if text.strip(): + _log_model_output(log_label, model, text, elapsed, iteration) + return text.strip() + + # ── Fallback: unstructured JSON mode ────────────────────────────────── + # Some models produce empty content when schema enforcement is strict. + # Retry without the schema object, relying on the system prompt instead. + _emit( + f"[warn] {log_label}: primary response empty after {_fmt_elapsed(elapsed)} " + f"— retrying in unstructured JSON mode" + ) + try: + fallback_system = system_prompt + "\n\nReturn valid JSON only. No extra text." + payload_fb = { + "model": model, + "messages": [ + {"role": "system", "content": fallback_system}, + {"role": "user", "content": user_prompt}, + ], + "format": "json", + "options": base_options, + "stream": True, + } + fb_chunks: list[str] = [] + with requests.post(url, json=payload_fb, stream=True, timeout=(30, read_timeout)) as resp: + resp.raise_for_status() + for raw_line in resp.iter_lines(): + if not raw_line: + continue + try: + chunk = json.loads(raw_line) + except json.JSONDecodeError: + continue + msg = chunk.get("message", {}) or {} + fb_chunks.append(msg.get("content", "") or "") + if chunk.get("done"): + break + text = "".join(fb_chunks).strip() + except Exception as exc: + raise RuntimeError( + f"Both primary and fallback streams failed for model {model}. " + f"Last error: {exc}" + ) from exc + + elapsed = _now_ts() - start + if not text and not allow_empty: + raise RuntimeError( + f"Model {model} returned empty content on both attempts " + f"after {_fmt_elapsed(elapsed)}. " + f"Check that Ollama is reachable at {url} and the model is loaded." + ) + _log_model_output(f"{log_label} (fallback)", model, text, elapsed, iteration) + return text.strip() + +# --------------------------------------------------------------------------- +# Normalisation helpers +# --------------------------------------------------------------------------- + +def _safe_json(raw: str, fallback: Dict[str, Any]) -> Dict[str, Any]: + try: + return json.loads(_extract_json(raw)) + except Exception: + return fallback + + +def _fallback_review(reason: str, approve: bool = False) -> Dict[str, Any]: + # Safe default is needs_changes — never silently approve on error/timeout. + return { + "verdict": "approve" if approve else "needs_changes", + "summary": reason, + "critical_issues": [] if approve else [reason], + "important_improvements": [] if approve else ["Retry review manually if needed."], + "preserve": [], + "rewrite_strategy": [], + "missing_files": [], + "test_gaps": [], + "file_comments": [], + } + + +def _normalize_draft(data: Dict[str, Any]) -> Dict[str, Any]: + if not isinstance(data.get("files"), list): + data["files"] = [] + if not isinstance(data.get("tests"), list): + data["tests"] = [] + if not isinstance(data.get("notes"), list): + data["notes"] = [] + if not isinstance(data.get("summary"), str): + data["summary"] = "No summary provided." + return data + + +def _normalize_design(data: Dict[str, Any]) -> Dict[str, Any]: + for key in ( + "files", "responsibilities", "interfaces", "integration_points", + "dependencies", "testing_plan", "risks", "assumptions", + ): + if not isinstance(data.get(key), list): + data[key] = [] + if not isinstance(data.get("summary"), str): + data["summary"] = "No design summary provided." + return data + + +def _normalize_review(data: Dict[str, Any]) -> Dict[str, Any]: + if data.get("verdict") not in {"approve", "needs_changes"}: + data["verdict"] = "needs_changes" + for k in ( + "critical_issues", "important_improvements", "preserve", + "rewrite_strategy", "missing_files", "test_gaps", "file_comments", + ): + if not isinstance(data.get(k), list): + data[k] = [] + if not isinstance(data.get("summary"), str): + data["summary"] = "Reviewer returned no summary." + return data + +# --------------------------------------------------------------------------- +# I/O helpers +# --------------------------------------------------------------------------- + +def _write_state(outputs: Path, stem: str, state: Dict[str, Any], suffix: str = "") -> Path: + state_dir = outputs / "coding-agent-state" + state_dir.mkdir(parents=True, exist_ok=True) + path = state_dir / f"{stem}{suffix}.json" + path.write_text(json.dumps(state, ensure_ascii=False, indent=2), encoding="utf-8") + return path + + +def _write_files(root: Path, draft: Dict[str, Any]) -> Path: + root.mkdir(parents=True, exist_ok=True) + root_resolved = root.resolve() + for item in draft.get("files", []): + raw = item.get("path", "").strip() + parts = [p for p in Path(raw).parts if p not in ("..", ".", "") and p != "/"] + if not parts: + continue + dest = root / Path(*parts) + try: + if not dest.resolve().is_relative_to(root_resolved): + _emit(f"[warn] skipping unsafe path: {raw!r}") + continue + except Exception: + continue + dest.parent.mkdir(parents=True, exist_ok=True) + dest.write_text(item["content"], encoding="utf-8") + return root + + +def _snapshot_workspace_files(workspace: Path) -> Dict[str, str]: + """Capture current text-file contents so Aider edits can be diffed safely.""" + snapshot: Dict[str, str] = {} + for path in sorted(workspace.rglob("*")): + if not path.is_file(): + continue + if any(part in _SKIP_DIRS for part in path.relative_to(workspace).parts): + continue + if path.suffix.lower() in _SKIP_SUFFIXES: + continue + if path.name in _SKIP_FILENAMES: + continue + try: + snapshot[str(path.relative_to(workspace))] = path.read_text(encoding="utf-8") + except Exception: + continue + return snapshot + + +def _changed_files_from_snapshots(before: Dict[str, str], after: Dict[str, str]) -> List[Dict[str, str]]: + changed: List[Dict[str, str]] = [] + for path in sorted(after): + if before.get(path) != after[path]: + changed.append({"path": path, "content": after[path]}) + return changed + + +def _merge_draft_files(base: Dict[str, Any], updates: Dict[str, Any]) -> Dict[str, Any]: + merged: Dict[str, Dict[str, str]] = { + f["path"]: f + for f in base.get("files", []) + if isinstance(f, dict) and isinstance(f.get("path"), str) + } + for f in updates.get("files", []): + if isinstance(f, dict) and isinstance(f.get("path"), str): + merged[f["path"]] = f + return _normalize_draft({ + "summary": updates.get("summary") or base.get("summary", ""), + "files": list(merged.values()), + "tests": [*base.get("tests", []), *updates.get("tests", [])], + "notes": [*base.get("notes", []), *updates.get("notes", [])], + }) + + +def _assert_git_workspace(workspace: Path) -> None: + try: + subprocess.run( + ["git", "rev-parse", "--is-inside-work-tree"], + cwd=workspace, + check=True, + stdout=subprocess.DEVNULL, + stderr=subprocess.PIPE, + text=True, + ) + except (FileNotFoundError, subprocess.CalledProcessError) as exc: + raise RuntimeError("Aider backend requires --workspace to be inside a git repository.") from exc + + +def _build_aider_command(config: Config, message: str, file_paths: List[str]) -> List[str]: + cmd = shlex.split(config.aider_command) + if not cmd: + raise RuntimeError("--aider-command cannot be empty.") + + cmd.extend(["--yes-always", "--no-auto-commits"]) + if config.aider_model: + cmd.extend(["--model", config.aider_model]) + if config.aider_extra_args: + cmd.extend(shlex.split(config.aider_extra_args)) + cmd.extend(["--message", message]) + + # Passing expected files keeps Aider focused while still allowing it to + # create extra files when the prompt calls for tests or supporting modules. + cmd.extend([p for p in file_paths if p and not Path(p).is_absolute()]) + return cmd + + +def _run_aider_writer( + config: Config, + prompt: str, + file_paths: List[str], + label: str, + iteration: int, +) -> Dict[str, Any]: + if shutil.which(shlex.split(config.aider_command)[0]) is None: + raise RuntimeError( + f"Aider command not found: {config.aider_command!r}. " + "Install aider-chat or pass --aider-command." + ) + _assert_git_workspace(config.workspace) + + before = _snapshot_workspace_files(config.workspace) + cmd = _build_aider_command(config, prompt, file_paths) + + _log_header(label) + _log_kv("Iteration", str(iteration)) + _log_kv("Command", " ".join(shlex.quote(part) for part in cmd[:4]) + " ...") + + start = _now_ts() + proc = subprocess.run( + cmd, + cwd=config.workspace, + text=True, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + ) + elapsed = _now_ts() - start + _log_kv("Elapsed", _fmt_elapsed(elapsed)) + _emit("--- aider output ---") + _emit(_truncate(proc.stdout or "", limit=6000)) + _emit("--------------------") + + if proc.returncode != 0: + raise RuntimeError(f"Aider exited with status {proc.returncode}. See log for output.") + + after = _snapshot_workspace_files(config.workspace) + files = _changed_files_from_snapshots(before, after) + return _normalize_draft({ + "summary": f"Aider changed {len(files)} file(s).", + "files": files, + "tests": [], + "notes": [f"Aider backend: {label}"], + }) + + +def _mark_checklist_reviewed(workspace: Path) -> bool: + """After reviewer approves, mark the first step where ✅=[x] and ✔️=[ ] as reviewed.""" + checklist = workspace / "CHECKLIST.md" + if not checklist.exists(): + return False + text = checklist.read_text(encoding="utf-8") + # Match the first table row where the written column is [x] and reviewed column is [ ] + # Row format: | N | description | [x] | [ ] | + pattern = re.compile(r'(\|[^|]+\|[^|]+\| *)\[x\]( *\| *)\[ \]( *\|)') + match = pattern.search(text) + if not match: + return False + updated = ( + text[: match.start()] + + match.group(1) + "[x]" + + match.group(2) + "[x]" + + match.group(3) + + text[match.end() :] + ) + checklist.write_text(updated, encoding="utf-8") + _emit("[checklist] Marked ✔️ reviewed in CHECKLIST.md") + return True + + +def _checklist_has_pending(workspace: Path) -> bool: + """Return True if CHECKLIST.md has any step where ✅ is still [ ].""" + checklist = workspace / "CHECKLIST.md" + if not checklist.exists(): + return False + text = checklist.read_text(encoding="utf-8") + # Match any table row where the written (✅) column is [ ] + # Row format: | N | description | [ ] | ... | + return bool(re.search(r'\|[^|]+\|[^|]+\| *\[ \] *\|', text)) + +# --------------------------------------------------------------------------- +# Design stage (extracted so it can be called again for revisions) +# --------------------------------------------------------------------------- + +def _run_design(config: Config, ctx: str, extra_context: str = "") -> Dict[str, Any]: + """Run (or re-run) the design stage. + + Pass *extra_context* to inject accumulated reviewer feedback when triggering + a mid-loop design revision. + """ + parts = [ + f"Task:\n{config.task}", + f"\nContext files:\n{ctx}", + ] + if extra_context: + parts.append(f"\n{extra_context}") + parts.append(f"\nProduce a concise implementation design for a {config.language} project.") + + design_raw = _chat( + config.api_base, config.design_model, config.design_system_prompt, + "\n".join(parts), DESIGN_SCHEMA, 0.0, + log_label="Design stage", + iteration=0, + read_timeout=config.read_timeout, + ) + return _normalize_design(_safe_json(design_raw, { + "summary": "Could not parse design output", + "files": [], "responsibilities": [], "interfaces": [], + "integration_points": [], "dependencies": [], + "testing_plan": [], "risks": [], "assumptions": [], + })) + + +# --------------------------------------------------------------------------- +# Per-file writing helpers +# --------------------------------------------------------------------------- + +def _write_single_file( + config: "Config", + design: dict, + file_entry: dict, + already_written: list, + ctx: str, + iteration: int, +) -> dict: + """Write a single file as specified by its design entry. + + *already_written* contains files produced in previous passes so the writer + can maintain consistent imports, types, and naming conventions. + + The workspace context (*ctx*) is capped at *per_file_context_chars* rather + than the full *max_context_chars*. Shorter prompts mean shorter prefill + times and fewer read-timeout risks when writing individual files. + """ + # Cap workspace context for per-file calls — a single file only needs + # enough context to understand the surrounding project, not the full repo. + trimmed_ctx = ctx[: config.per_file_context_chars] + if len(ctx) > config.per_file_context_chars: + trimmed_ctx += "\n... [workspace context trimmed — see full context in design] ..." + + already_ctx = "" + if already_written: + already_ctx = ( + "\n\nAlready-written files (read-only reference — use consistent " + "types, imports, and naming):\n\n" + + "\n\n".join( + f"--- {f['path']} ---\n{f['content']}" for f in already_written + ) + ) + + prompt = ( + f"Task:\n{config.task}\n\n" + f"Full design:\n{json.dumps(design, ensure_ascii=False, indent=2)}\n\n" + f"YOUR CURRENT ASSIGNMENT — write this file only:\n" + f" path : {file_entry['path']}\n" + f" purpose: {file_entry.get('purpose', '(see design)')}\n\n" + f"Existing workspace files (read-only context):\n{trimmed_ctx}" + f"{already_ctx}\n\n" + f"Return only the file at '{file_entry['path']}' plus any directly " + f"associated test file. Do not write files outside your assignment." + ) + + raw = _chat( + config.api_base, config.writer_model, config.writer_system_prompt, + prompt, WRITER_SCHEMA, 0.1, + log_label=f"Writer [{file_entry['path']}]", + iteration=iteration, + read_timeout=config.read_timeout, + ) + result = _normalize_draft(_safe_json(raw, { + "summary": f"Could not parse output for {file_entry['path']}", + "files": [], "tests": [], "notes": [raw[:1000]], + })) + if not result.get("files"): + _emit(f"[warn] Writer produced no files for {file_entry['path']} — skipping") + return result + + +def _files_needing_rewrite(review: dict, draft_files: list) -> set: + """Return the set of file paths the reviewer flagged for changes.""" + flagged = { + fc.get("path", "") + for fc in review.get("file_comments", []) + if fc.get("path") + } + draft_paths = {f["path"] for f in draft_files} + for issue in review.get("critical_issues", []): + for path in draft_paths: + if path in issue: + flagged.add(path) + if review.get("critical_issues") and not flagged: + return draft_paths + return flagged + + +def _rewrite_targeted_files( + config: "Config", + design: dict, + draft: dict, + review: dict, + ctx: str, + iteration: int, + temperature: float, +) -> dict: + """Rewrite only the files flagged in the review, merging back into draft.""" + all_files = draft.get("files", []) + flagged_paths = _files_needing_rewrite(review, all_files) + + if not flagged_paths: + _emit("[per-file] No specific files flagged — falling back to full rewrite") + return draft + + _emit(f"[per-file] Targeted rewrite for: {sorted(flagged_paths)}") + design_file_map = {f["path"]: f for f in design.get("files", [])} + current_file_map: Dict[str, Dict[str, str]] = {f["path"]: f for f in all_files} + + for path in sorted(flagged_paths): + if path not in current_file_map: + _emit(f"[per-file] Skipping unknown path: {path}") + continue + + file_entry = design_file_map.get(path, {"path": path, "purpose": "(not in design)"}) + current_content = current_file_map[path].get("content", "") + other_files_ctx = "\n\n".join( + f"--- {f['path']} ---\n{f['content']}" + for f in all_files if f["path"] != path + ) + file_comments = [ + fc["comment"] + for fc in review.get("file_comments", []) + if fc.get("path") == path + ] + + prompt = ( + f"Task:\n{config.task}\n\n" + f"Full design:\n{json.dumps(design, ensure_ascii=False, indent=2)}\n\n" + f"YOUR CURRENT ASSIGNMENT — fix this file only:\n" + f" path : {path}\n" + f" purpose: {file_entry.get('purpose', '(see design)')}\n\n" + f"Current content of '{path}':\n{current_content}\n\n" + f"Other project files (read-only reference):\n{other_files_ctx}\n\n" + f"Review issues specific to '{path}':\n" + + ("\n".join(f"- {c}" for c in file_comments) if file_comments + else "(none — fix based on general review below)") + + f"\n\nGeneral review summary: {review.get('summary', '')}\n" + f"Critical issues: {review.get('critical_issues', [])}\n" + f"Rewrite strategy: {review.get('rewrite_strategy', [])}\n\n" + f"Return only '{path}' in the files array. Do not rewrite other files." + ) + + raw = _chat( + config.api_base, config.writer_model, config.writer_system_prompt, + prompt, WRITER_SCHEMA, temperature, + log_label=f"Writer rewrite [{path}]", + iteration=iteration, + read_timeout=config.read_timeout, + ) + result = _normalize_draft(_safe_json(raw, { + "summary": f"Could not parse rewrite for {path}", + "files": [], "tests": [], "notes": [raw[:1000]], + })) + for updated_file in result.get("files", []): + updated_path = updated_file.get("path", "") + current_file_map[updated_path] = updated_file + _emit(f"[per-file] Updated: {updated_path}") + + return _normalize_draft({ + "summary": draft.get("summary", ""), + "files": list(current_file_map.values()), + "tests": draft.get("tests", []), + "notes": draft.get("notes", []), + }) + +# --------------------------------------------------------------------------- +# Main agent loop +# --------------------------------------------------------------------------- + +def run_agent(config: Config) -> Dict[str, Any]: + run_stamp = datetime.now().strftime("%Y%m%d-%H%M%S") + _set_log_file(config.log_dir / f"{config.language.lower()}-agent-{run_stamp}.log") + _log_header("Agent run started") + _log_kv("Language", config.language) + _log_kv("Writer model", config.writer_model) + _log_kv("Reviewer model", config.reviewer_model) + _log_kv("Design model", config.design_model) + _log_kv("Writer backend", config.writer_backend) + + if config.writer_backend == "aider" and not config.write_to_workspace: + raise RuntimeError( + "The Aider writer backend edits the workspace directly. " + "Run with --write-to-workspace or --run-until-done." + ) + + context_files = _read_context(config.workspace, config.max_context_chars, config.max_files) + ctx = ( + "\n\n".join(f"--- FILE: {f['name']} ---\n{f['content']}" for f in context_files) + if context_files else "(no workspace files found)" + ) + + # --- Design --- + design = _run_design(config, ctx) + _log_header("Design parsed") + _emit(_truncate(json.dumps(design, ensure_ascii=False, indent=2))) + + # --- Initial write --- + # Per-file mode: write one file at a time so each generation stays within + # a manageable output size and avoids streaming timeouts on large projects. + # Bulk mode: write everything in one pass (useful for very small tasks). + if config.writer_backend == "aider": + _log_header("Initial write — aider backend") + aider_prompt = ( + f"Task:\n{config.task}\n\n" + f"Design:\n{json.dumps(design, ensure_ascii=False, indent=2)}\n\n" + f"Implement only this task. Keep the change scoped to the design, " + f"update CHECKLIST.md as instructed by the project prompt, and add " + f"or update tests required for the current step." + ) + draft = _run_aider_writer( + config, + aider_prompt, + [f.get("path", "") for f in design.get("files", [])], + label="Aider writer stage", + iteration=0, + ) + elif config.per_file_write and design.get("files"): + _log_header(f"Initial write — per-file mode ({len(design['files'])} files)") + combined: Dict[str, Any] = {} # path → file dict (deduplicates by path) + combined_tests: List[str] = [] + combined_notes: List[str] = [] + already_written: List[Dict[str, str]] = [] + + for i, file_entry in enumerate(design["files"]): + _log_header(f"Writing file {i + 1}/{len(design['files'])}: {file_entry['path']}") + result = _write_single_file(config, design, file_entry, already_written, ctx, iteration=0) + for f in result.get("files", []): + combined[f["path"]] = f + already_written.append(f) + combined_tests.extend(result.get("tests", [])) + combined_notes.extend(result.get("notes", [])) + + draft = _normalize_draft({ + "summary": f"Per-file write: {len(combined)} files", + "files": list(combined.values()), + "tests": combined_tests, + "notes": combined_notes, + }) + else: + _log_header("Initial write — bulk mode") + writer_prompt = ( + f"Task:\n{config.task}\n\n" + f"Design:\n{json.dumps(design, ensure_ascii=False, indent=2)}\n\n" + f"Context files:\n{ctx}\n\n" + f"Generate code that follows the design." + ) + draft_raw = _chat( + config.api_base, config.writer_model, config.writer_system_prompt, + writer_prompt, WRITER_SCHEMA, 0.1, + log_label="Writer stage", iteration=0, + read_timeout=config.read_timeout, + ) + draft = _normalize_draft(_safe_json(draft_raw, { + "summary": "Could not parse writer output", + "files": [], "tests": [], "notes": [draft_raw[:3000]], + })) + + _log_header("Writer parsed") + _emit(_truncate(json.dumps(draft, ensure_ascii=False, indent=2))) + + if not draft.get("files"): + # Diagnose and retry regardless of mode. + _log_header("Writer returned no files — diagnosing") + _emit( + "[diagnose] All files are empty. In per-file mode this means every " + "individual file call returned nothing. In bulk mode check the log for " + "truncation. Retrying with an explicit files-or-fail prompt." + ) + if config.writer_backend == "aider": + retry_prompt = ( + f"Task:\n{config.task}\n\n" + f"Design:\n{json.dumps(design, ensure_ascii=False, indent=2)}\n\n" + f"The previous Aider run produced no changed files. Make concrete " + f"workspace edits for the current task now. Do not stop at an " + f"explanation." + ) + draft = _run_aider_writer( + config, + retry_prompt, + [f.get("path", "") for f in design.get("files", [])], + label="Aider writer retry stage", + iteration=0, + ) + else: + retry_prompt = ( + f"Task:\n{config.task}\n\n" + f"Design:\n{json.dumps(design, ensure_ascii=False, indent=2)}\n\n" + f"Context files:\n{ctx}\n\n" + f'You MUST write all source files listed in the design. ' + f'Return a JSON object: ' + f'{{"summary":"...","files":[{{"path":"...","content":"..."}}],"tests":[],"notes":[]}}\n\n' + f"The files array MUST contain at least one entry." + ) + retry_raw = _chat( + config.api_base, config.writer_model, config.writer_system_prompt, + retry_prompt, {"type": "object"}, temperature=0.4, + log_label="Writer retry stage", iteration=0, + read_timeout=config.read_timeout, + ) + draft = _normalize_draft(_safe_json(retry_raw, { + "summary": "Could not parse writer retry output", + "files": [], "tests": [], "notes": [retry_raw[:3000]], + })) + _log_header("Writer retry parsed") + _emit(_truncate(json.dumps(draft, ensure_ascii=False, indent=2))) + + if not draft.get("files"): + raise RuntimeError( + "Writer returned no files on initial attempt and retry. " + "Check the log for '[diagnose]' lines. Common causes: " + "streaming error, model not loaded, or design produced no file entries." + ) + + stem = run_stamp + + # Partial state — written immediately so progress isn't lost on crash + partial = { + "language": config.language, "task": config.task, "design": design, + "writer_model": config.writer_model, "reviewer_model": config.reviewer_model, + "design_model": config.design_model, "draft": draft, + "review": _fallback_review("Review not completed yet."), + "loop_info": { + "loops_used": 0, "max_review_loops": config.max_review_loops, + "stop_reason": "review_not_started", "final_verdict": "needs_changes", + "designs_used": 1, "history": [], + }, + "log_file": str(_LOG_FILE.get() or ""), + } + _write_state(config.outputs, f"{config.language.lower()}-{stem}", partial) + + # --- Inline reviewer --- + def do_review(cur_draft: Dict[str, Any], iteration: int) -> Dict[str, Any]: + review_prompt = ( + f"Original task:\n{config.task}\n\n" + f"Design:\n{json.dumps(design, ensure_ascii=False, indent=2)}\n\n" + f"Draft JSON:\n{json.dumps(cur_draft, ensure_ascii=False, indent=2)}" + ) + try: + raw = _chat( + config.api_base, config.reviewer_model, config.reviewer_system_prompt, + review_prompt, REVIEW_SCHEMA, 0.0, + allow_empty=True, log_label="Reviewer stage", iteration=iteration, + read_timeout=config.read_timeout, + ) + if not raw.strip(): + # Empty response — conservative: don't approve + return _fallback_review("Reviewer returned an empty response.") + data = _safe_json(raw, _fallback_review("Reviewer returned non-parseable output.")) + rv = _normalize_review(data) + _log_header("Reviewer parsed") + _emit(_truncate(json.dumps(rv, ensure_ascii=False, indent=2))) + return rv + except Exception as e: + # Never auto-approve on error — safe default is needs_changes + return _fallback_review(f"Reviewer error: {type(e).__name__}: {e}", approve=False) + + # --- Review / rewrite loop --- + review = do_review(draft, 0) + + # full_history stores the complete draft summary + review per iteration so + # the -history file is genuinely useful for debugging convergence. + full_history: List[Dict[str, Any]] = [{ + "iteration": 0, + "draft_summary": draft.get("summary", ""), + "file_paths": [f.get("path", "") for f in draft.get("files", [])], + "review": review, + }] + # Compact summary used inside loop_info for quick inspection + history = [{ + "iteration": 0, + "review_verdict": review.get("verdict", "needs_changes"), + "review_summary": review.get("summary", ""), + "file_count": len(draft.get("files", [])), + }] + + loops_used = 0 + designs_used = 1 + consecutive_needs_changes = 0 if review.get("verdict") == "approve" else 1 + stop_reason = "approved" if review.get("verdict") == "approve" else "not_entered" + + while review.get("verdict") == "needs_changes" and loops_used < config.max_review_loops: + loops_used += 1 + _log_header("Review loop") + _log_kv("Iteration", str(loops_used)) + _log_kv("Verdict", review.get("verdict", "needs_changes")) + _log_kv("Summary", review.get("summary", "")) + + # --- Optional design revision when the writer is stuck --- + if ( + config.redesign_after > 0 + and consecutive_needs_changes > 0 + and consecutive_needs_changes % config.redesign_after == 0 + and designs_used < 3 # cap to prevent infinite redesign cycles + ): + _log_header("Design revision triggered") + feedback_window = full_history[-config.redesign_after:] + accumulated = "\n".join( + f"Iteration {h['iteration']}: {h['review'].get('summary', '')}\n" + f" Critical: {h['review'].get('critical_issues', [])}\n" + f" Strategy: {h['review'].get('rewrite_strategy', [])}" + for h in feedback_window + ) + extra = ( + f"The previous design caused {consecutive_needs_changes} consecutive failed reviews.\n" + f"Accumulated reviewer feedback:\n{accumulated}\n\n" + f"Revise the design to address these issues directly. " + f"Do not repeat a structure that has already failed." + ) + design = _run_design(config, ctx, extra_context=extra) + designs_used += 1 + _log_header("Revised design parsed") + _emit(_truncate(json.dumps(design, ensure_ascii=False, indent=2))) + + # Pass the last 3 reviews to the writer so it can see repeated failures + recent_history = full_history[-3:] + history_context = json.dumps( + [{"iteration": h["iteration"], "review": h["review"]} for h in recent_history], + ensure_ascii=False, indent=2, + ) + + # Gradually raise temperature so a stuck writer tries different approaches. + # Starts at 0.1 and climbs toward 0.6 over successive loops. + write_temperature = min(0.1 + (loops_used - 1) * 0.1, 0.6) + + # Per-file rewrite: only touch files the reviewer flagged. + # Bulk rewrite: rewrite the whole draft (fallback / non-per-file mode). + if config.writer_backend == "aider": + flagged_paths = sorted(_files_needing_rewrite(review, draft.get("files", []))) + missing_paths = [ + path for path in review.get("missing_files", []) + if isinstance(path, str) and path + ] + aider_paths = sorted(set(flagged_paths + missing_paths)) + if not aider_paths: + aider_paths = [f.get("path", "") for f in draft.get("files", [])] + aider_rewrite_prompt = ( + f"Original task:\n{config.task}\n\n" + f"Design:\n{json.dumps(design, ensure_ascii=False, indent=2)}\n\n" + f"Review history (last {len(recent_history)} iterations):\n{history_context}\n\n" + f"Current review feedback:\n{json.dumps(review, ensure_ascii=False, indent=2)}\n\n" + f"Patch the workspace to resolve the review feedback. Keep the " + f"change scoped to the current CHECKLIST step." + ) + aider_updates = _run_aider_writer( + config, + aider_rewrite_prompt, + aider_paths, + label="Aider rewrite stage", + iteration=loops_used, + ) + new_draft = _merge_draft_files(draft, aider_updates) + elif config.per_file_write: + new_draft = _rewrite_targeted_files( + config, design, draft, review, ctx, + iteration=loops_used, temperature=write_temperature, + ) + else: + rewrite_prompt = ( + f"Follow-up: Rewrite considering the review.\n\n" + f"Original task:\n{config.task}\n\n" + f"Design:\n{json.dumps(design, ensure_ascii=False, indent=2)}\n\n" + f"Previous proposal:\n{json.dumps(draft, ensure_ascii=False, indent=2)}\n\n" + f"Review history (last {len(recent_history)} iterations):\n{history_context}\n\n" + f"Current review feedback:\n{json.dumps(review, ensure_ascii=False, indent=2)}" + ) + rewrite_raw = _chat( + config.api_base, config.writer_model, config.writer_system_prompt, + rewrite_prompt, WRITER_SCHEMA, write_temperature, + log_label="Writer rewrite stage", iteration=loops_used, + read_timeout=config.read_timeout, + ) + new_draft = _normalize_draft(_safe_json(rewrite_raw, draft)) + + _log_header("Writer rewrite parsed") + _emit(_truncate(json.dumps(new_draft, ensure_ascii=False, indent=2))) + + if not new_draft.get("files"): + stop_reason = "rewrite_returned_no_files" + break + + old_files = [(f.get("path", ""), f.get("content", "")) for f in draft.get("files", [])] + new_files_list = [(f.get("path", ""), f.get("content", "")) for f in new_draft.get("files", [])] + + if old_files == new_files_list: + # Writer returned identical output — stall-break at high temperature. + # In per-file mode, rewrite every file unconditionally to break the deadlock. + _log_header("Stall detected — retrying at high temperature") + if config.writer_backend == "aider": + stall_prompt = ( + f"Original task:\n{config.task}\n\n" + f"Design:\n{json.dumps(design, ensure_ascii=False, indent=2)}\n\n" + f"Current review feedback:\n{json.dumps(review, ensure_ascii=False, indent=2)}\n\n" + f"Your previous Aider pass did not change any tracked text files. " + f"Make concrete edits that address the review feedback now." + ) + stall_updates = _run_aider_writer( + config, + stall_prompt, + [f.get("path", "") for f in draft.get("files", [])], + label="Aider stall-break attempt", + iteration=loops_used, + ) + stall_draft = _merge_draft_files(draft, stall_updates) + elif config.per_file_write: + stall_draft = _rewrite_targeted_files( + config, design, draft, review, ctx, + iteration=loops_used, temperature=0.7, + ) + else: + stall_prompt = ( + f"{rewrite_prompt}\n\n" + f"IMPORTANT: Your last rewrite returned files identical to the previous attempt. " + f"You must make concrete changes. " + f"Try a different implementation strategy for the issues flagged in the review." + ) + stall_raw = _chat( + config.api_base, config.writer_model, config.writer_system_prompt, + stall_prompt, WRITER_SCHEMA, 0.7, + log_label="Writer stall-break attempt", iteration=loops_used, + read_timeout=config.read_timeout, + ) + stall_draft = _normalize_draft(_safe_json(stall_raw, new_draft)) + + stall_files = [(f.get("path", ""), f.get("content", "")) for f in stall_draft.get("files", [])] + if stall_files == old_files: + stop_reason = "no_file_changes" + break + new_draft = stall_draft + + draft = new_draft + review = do_review(draft, loops_used) + + history.append({ + "iteration": loops_used, + "review_verdict": review.get("verdict", "needs_changes"), + "review_summary": review.get("summary", ""), + "file_count": len(draft.get("files", [])), + }) + full_history.append({ + "iteration": loops_used, + "draft_summary": draft.get("summary", ""), + "file_paths": [f.get("path", "") for f in draft.get("files", [])], + "review": review, + }) + + if review.get("verdict") == "approve": + consecutive_needs_changes = 0 + stop_reason = "approved" + break + + consecutive_needs_changes += 1 + + else: + stop_reason = "approved" if review.get("verdict") == "approve" else "max_review_loops_reached" + + state = { + "language": config.language, "task": config.task, "design": design, + "writer_model": config.writer_model, "reviewer_model": config.reviewer_model, + "design_model": config.design_model, "draft": draft, "review": review, + "loop_info": { + "loops_used": loops_used, + "max_review_loops": config.max_review_loops, + "stop_reason": stop_reason, + "final_verdict": review.get("verdict", "needs_changes"), + "designs_used": designs_used, + "history": history, + }, + "log_file": str(_LOG_FILE.get() or ""), + } + # Final state — overwrites the partial written at the start + _write_state(config.outputs, f"{config.language.lower()}-{stem}", state) + # Genuine iteration history: one entry per pass with draft summary + full review + _write_state( + config.outputs, + f"{config.language.lower()}-{stem}", + {"task": config.task, "full_history": full_history}, + suffix="-history", + ) + if config.writer_backend == "aider": + project_dir = config.workspace + if stop_reason == "approved": + _mark_checklist_reviewed(config.workspace) + elif config.write_to_workspace: + output_root = config.workspace + project_dir = _write_files(output_root, draft) + if stop_reason == "approved": + _mark_checklist_reviewed(config.workspace) + else: + output_root = config.outputs / f"{config.language.lower()}-agent-output-{stem}" + project_dir = _write_files(output_root, draft) + state["project_dir"] = str(project_dir) + return state + +# --------------------------------------------------------------------------- +# CLI +# --------------------------------------------------------------------------- + +def parse_args(language: str, writer_prompt: str, reviewer_prompt: str, design_prompt: str) -> Config: + p = argparse.ArgumentParser() + _default_task = os.getenv("AGENT_TASK") + p.add_argument("--task", default=_default_task, required=_default_task is None) + p.add_argument("--workspace", default=os.getenv("AGENT_WORKSPACE", "/workspace")) + p.add_argument("--outputs", default=os.getenv("AGENT_OUTPUTS", "./runs")) + p.add_argument("--writer-model", default=os.getenv("WRITER_MODEL", "gemma4:31b")) + p.add_argument("--reviewer-model", default=os.getenv("REVIEWER_MODEL", "gemma4:31b")) + p.add_argument( + "--design-model", + default=os.getenv("DESIGN_MODEL", os.getenv("REVIEWER_MODEL", "gemma4:31b")), + ) + p.add_argument("--api-base", default=os.getenv("OLLAMA_API_BASE", "http://ollama:11434")) + p.add_argument("--max-review-loops", type=int, default=int(os.getenv("AGENT_MAX_REVIEW_LOOPS", "6"))) + p.add_argument("--max-context-chars", type=int, default=120_000) + p.add_argument("--max-files", type=int, default=80) + p.add_argument( + "--redesign-after", type=int, default=3, + help="Trigger a design revision after this many consecutive failed review loops (0 = disabled).", + ) + p.add_argument("--log-dir", default=os.getenv("AGENT_LOG_DIR", "./logs")) + p.add_argument( + "--no-per-file", action="store_true", + help=( + "Disable per-file writing and write all files in a single pass. " + "Per-file mode is the default: it keeps each generation short, " + "avoids streaming timeouts on large projects, and enables targeted " + "rewrites in the review loop." + ), + ) + p.add_argument( + "--read-timeout", type=int, default=600, + help=( + "Seconds of silence before a stream is considered hung. " + "Must cover worst-case prefill time (model load + prompt processing " + "before the first token). For a 32B model with a large context this " + "can be 5-10 minutes. Default: 600." + ), + ) + p.add_argument( + "--per-file-context-chars", type=int, default=40_000, + help=( + "Maximum workspace context chars passed to each individual file write. " + "Smaller than --max-context-chars to keep per-file prompts short and " + "reduce prefill time. Default: 40000." + ), + ) + p.add_argument( + "--writer-backend", + choices=("ollama", "aider"), + default=os.getenv("AGENT_WRITER_BACKEND", "ollama"), + help=( + "Writer backend to use. 'ollama' asks the configured writer model for " + "JSON full-file contents. 'aider' runs the Aider CLI, lets it edit " + "the workspace directly, then captures changed files for review." + ), + ) + p.add_argument( + "--aider-command", + default=os.getenv("AIDER_COMMAND", "aider"), + help="Aider executable or command prefix. Default: aider.", + ) + p.add_argument( + "--aider-model", + default=os.getenv("AIDER_MODEL", ""), + help="Optional model passed to Aider as --model.", + ) + p.add_argument( + "--aider-extra-args", + default=os.getenv("AIDER_EXTRA_ARGS", ""), + help="Optional extra CLI args appended to Aider before --message.", + ) + p.add_argument( + "--write-to-workspace", action="store_true", + help=( + "Write approved files directly into --workspace instead of a timestamped " + "subdirectory under --outputs. Also marks the ✔️ column in CHECKLIST.md " + "automatically after the reviewer approves." + ), + ) + p.add_argument( + "--run-until-done", action="store_true", + help=( + "Loop automatically through every pending CHECKLIST step without human input. " + "Stops when all ✅ boxes are checked or a step fails to get approved. " + "Implies --write-to-workspace." + ), + ) + a = p.parse_args() + return Config( + api_base=a.api_base, + writer_model=a.writer_model, + reviewer_model=a.reviewer_model, + design_model=a.design_model, + workspace=Path(a.workspace), + outputs=Path(a.outputs), + task=a.task, + max_review_loops=a.max_review_loops, + max_context_chars=a.max_context_chars, + max_files=a.max_files, + language=language, + writer_system_prompt=writer_prompt, + reviewer_system_prompt=reviewer_prompt, + design_system_prompt=design_prompt, + log_dir=Path(a.log_dir), + redesign_after=a.redesign_after, + per_file_write=not a.no_per_file, + write_to_workspace=a.write_to_workspace or a.run_until_done, + run_until_done=a.run_until_done, + read_timeout=a.read_timeout, + per_file_context_chars=a.per_file_context_chars, + writer_backend=a.writer_backend, + aider_command=a.aider_command, + aider_model=a.aider_model, + aider_extra_args=a.aider_extra_args, + ) + + +def main(language: str, writer_prompt: str, reviewer_prompt: str, design_prompt: str) -> int: + cfg = parse_args(language, writer_prompt, reviewer_prompt, design_prompt) + + if cfg.run_until_done: + step = 0 + while _checklist_has_pending(cfg.workspace): + step += 1 + _emit(f"\n{'=' * 60}\n[loop] Starting step {step}\n{'=' * 60}") + state = run_agent(cfg) + stop_reason = state["loop_info"]["stop_reason"] + verdict = state["review"]["verdict"] + _emit(f"[loop] Step {step} finished — stop_reason={stop_reason} verdict={verdict}") + if stop_reason != "approved": + _emit(f"[loop] Step {step} did not get approved. Halting.") + print(f"Stopped at step {step}: {stop_reason}") + return 1 + _emit("[loop] All CHECKLIST steps complete.") + print(f"All {step} steps completed.") + return 0 + + state = run_agent(cfg) + print(f"{cfg.language} agent completed") + print(f"Iteration count: {state['loop_info']['loops_used']}/{state['loop_info']['max_review_loops']}") + print(f"Stop reason: {state['loop_info']['stop_reason']}") + print(f"Final verdict: {state['review']['verdict']}") + print(f"Designs used: {state['loop_info']['designs_used']}") + print(f"Project output: {state['project_dir']}") + print(f"Log file: {state.get('log_file', '')}") + return 0 diff --git a/agent_loop/ts_agent_gemma4.py b/agent_loop/ts_agent_gemma4.py new file mode 100644 index 0000000..ab071a6 --- /dev/null +++ b/agent_loop/ts_agent_gemma4.py @@ -0,0 +1,179 @@ +from agent_base import main + +WRITER_PROMPT = """You are a disciplined TypeScript software engineering agent implementing the Wiener Linien feature on the TimeToLeave project. + +## Checklist Tracking + +`CHECKLIST.md` uses three checkbox states: +- `[ ]` — pending and required; blocks the next step +- `[x]` — done +- `[~]` — optional or deferred; never blocks advancement + +Rules: +- The ✅ column is yours; the ✔️ column belongs to the review agent. +- Before starting, read `CHECKLIST.md` and find the first step where ✅ is `[ ]`. +- Confirm that every preceding step has both ✅ and ✔️ as `[x]`. If not, stop and report which steps are blocking — do not proceed. +- Implement only that one step. Do not implement any later steps. +- After completing the step, mark its ✅ box by changing `[ ]` to `[x]` in `CHECKLIST.md` and include the updated file in your `files` array. +- Do not mark the ✔️ column — that belongs to the review agent. + +## Project Context + +Project root: files are specified as paths relative to the project root (e.g. `src/types/index.ts`). +Stack: Next.js 16 App Router, React 19, TypeScript strict mode, Tailwind CSS v4, Vitest. +Feature: Wiener Linien real-time departures via the free OGD Echtzeitdaten REST API (`https://www.wienerlinien.at/ogd_realtime`). +Architecture pattern: `src/lib` clients → `src/app/api` proxy routes → `src/hooks` hooks → UI components in `src/app`. + +## Work Step By Step + +- Start by reading `CHECKLIST.md` to identify the current step, then read the relevant existing files. +- State what the current step requires before making changes. +- Implement one coherent change at a time. Prefer small targeted edits over rewrites. +- Review the diff mentally before submitting — ensure it matches the intended behavior. +- Do not move to the next step. The review agent must mark ✔️ before the next step begins. + +## Quality Bar + +- Patch the existing project; do not restart from scratch unless the file does not yet exist. +- Use relative file paths only. +- Return full file contents — no partial diffs or placeholders. +- Keep TypeScript strictness intact. Never use `any`; use `unknown` at JSON/API boundaries with explicit type guards. +- Prefer `const` over `let`; never use `var`. +- Use async/await throughout; never mix Promise chains and callbacks. +- Use `import type` for type-only imports. +- Use named exports; avoid default exports in library code. +- Keep server-only code out of client components. API calls to Wiener Linien must go through proxy routes, not directly from the browser. +- Preserve existing working behavior unless the current step explicitly changes it. +- For UI work: semantic elements, labels for inputs, keyboard-operable controls, visible loading and error states. +- If you cannot produce a valid response matching the schema, emit: {"summary":"generation failed","files":[],"tests":[],"notes":["Internal error — retry."]} +- Return only JSON matching the writer schema. +""" + +REVIEWER_PROMPT = """<|think|> +You are a strict senior TypeScript reviewer embedded in a code-generation loop for the TimeToLeave project. + +## Checklist Tracking + +`CHECKLIST.md` uses three checkbox states: +- `[ ]` — pending and required; blocks the next step +- `[x]` — done +- `[~]` — optional or deferred; never blocks advancement + +Rules: +- The ✔️ column is yours; the ✅ column belongs to the writing agent. +- Only review steps whose ✅ box is already `[x]`. Do not attempt to review unimplemented steps. +- Before reviewing, confirm that all preceding steps have both ✅ and ✔️ as `[x]`. If not, stop and report which steps are blocking. +- If the step passes the quality bar below, set verdict to "approve". The orchestrator will mark ✔️ automatically. +- If issues remain, set verdict to "needs_changes". Report the failures with file paths and line numbers. + +## Review Scope + +- Review one step at a time in the order steps appear in `CHECKLIST.md`. +- Cross-reference the implementation against the step description in `CHECKLIST.md`. +- Report concrete issues with file paths and line numbers. Do not flag style nitpicks not covered by a project guideline. + +## What to Check + +**Correctness** +- Behavior matches the intent described in the CHECKLIST step. +- API contracts, endpoint shapes, and TypeScript types are compatible with existing callers. +- No regressions in previously working behavior. + +**Tests** +- Tests exist for new code covering the main success path, edge cases, and failure behavior. +- Tests are not weakened or removed just to make the suite pass. +- External services (Wiener Linien API, geolocation, time) are mocked; tests do not depend on live network availability. + +**Quality** +- No compile errors, lint errors, runtime crashes, or broken imports. +- TypeScript strictness is intact — no `any` used as a shortcut. +- Server-only code is not imported into client components. +- Wiener Linien API calls go through proxy routes, not directly from the browser. +- Error handling is explicit; user-facing failures are understandable. +- No generated artifacts, caches, logs, or local environment files are committed. +- Dependencies unchanged unless necessary and justified. + +**Scope** +- The change is scoped to the current CHECKLIST step — no unrelated modifications. + +**Accessibility (UI steps only)** +- Semantic elements, labels for inputs, keyboard-operable controls, visible loading and error states. + +## Verification + +Confirm that these checks would pass before setting verdict to "approve": + +```bash +npm test +npm run build +npm run typecheck +npm run lint +``` + +If any check would fail, set verdict to "needs_changes", report the failure with exact details, and leave the step for the writing agent to fix. + +## Review priorities + +1. build-breaking defects +2. test-breaking defects +3. runtime-breaking defects +4. mismatch with the CHECKLIST step intent +5. missing files, exports, wiring, or integration +6. unsafe behavior +7. incorrect types, null handling, async handling, state management +8. missing edge-case handling +9. important but non-blocking maintainability issues + +Output field guidance: +- critical_issues: only issues that break build, tests, or runtime +- important_improvements: significant but not immediately blocking issues +- preserve: list anything in the draft that is correct and must not be changed +- rewrite_strategy: concrete alternative approaches the writer should try for unfixed critical issues +- missing_files: files required by the CHECKLIST step that are absent +- test_gaps: risky behavior with materially missing test coverage +- file_comments: specific, actionable guidance tied to a file path + +Rules: +- Be concrete and rewrite-oriented. +- Prefer issues the writer can directly fix in the next pass. +- Do not ask questions. +- Do not praise unless identifying something that must be preserved. +- Assume the writer should patch the current code, not restart from scratch. +- If the draft appears unchanged from a previous attempt for a given issue, escalate that issue to critical and suggest an alternative implementation approach. +- If you have already flagged an issue and it was not fixed, say specifically what is still wrong and why the previous attempt failed. +- Return only JSON matching the review schema. +""" + +DESIGN_PROMPT = """<|think|> +You are a disciplined TypeScript architect working inside a coding loop on the TimeToLeave project. + +Your job is to produce a concise implementation design for the current CHECKLIST step before coding begins. + +Project context: +- Next.js 16 App Router, React 19, TypeScript strict mode, Tailwind CSS v4, Vitest +- Architecture: `src/lib` clients → `src/app/api` proxy routes → `src/hooks` hooks → `src/app` components +- Feature: Wiener Linien real-time departures via `https://www.wienerlinien.at/ogd_realtime` +- Read `CHECKLIST.md` to determine which step is being designed + +Design priorities: +1. file layout — which files to create or modify, and why +2. responsibilities — what each file owns +3. interfaces — types and function signatures +4. integration points — how this step connects to existing code +5. dependencies — imports from existing modules +6. testing plan — what to test and how to mock +7. risks — anything that could break existing behavior +8. assumptions — things taken as given + +Rules: +- Optimize for patching an existing codebase; prefer minimal file churn. +- Identify any conflicts with existing code (naming, module structure, API contracts). +- Flag required structural changes separately from new additions. +- If the step can be completed by modifying a single existing file, say so explicitly rather than proposing new files. +- Do not redesign the whole project unless the step requires it. +- Keep the design concrete and implementation-ready. +- Return only JSON matching the design schema. +""" + +if __name__ == "__main__": + raise SystemExit(main("TS", WRITER_PROMPT, REVIEWER_PROMPT, DESIGN_PROMPT)) diff --git a/agent_loop/ttl_agent_gemma4.py b/agent_loop/ttl_agent_gemma4.py new file mode 100644 index 0000000..eefdcd2 --- /dev/null +++ b/agent_loop/ttl_agent_gemma4.py @@ -0,0 +1,298 @@ +import os +from pathlib import Path + +# Default workspace to the project root (parent of this script's agent_loop/ dir) +# so the script works without --workspace when run from anywhere. +os.environ.setdefault("AGENT_WORKSPACE", str(Path(__file__).resolve().parent.parent)) +os.environ.setdefault("AGENT_TASK", "Implement the next pending step in CHECKLIST.md") +os.environ.setdefault("OLLAMA_API_BASE", "http://100.103.83.12:11435") +os.environ.setdefault("WRITER_MODEL", "qwen3.6:27b-64k") +os.environ.setdefault("REVIEWER_MODEL", "qwen3.6:27b-64k") +os.environ.setdefault("DESIGN_MODEL", "qwen3.6:27b-64k") +os.environ.setdefault("AGENT_MAX_REVIEW_LOOPS", "12") + +from agent_base_gemma4 import main + +# --------------------------------------------------------------------------- +# TimeToLeave — project-specific agent +# +# Stack: Next.js 16 App Router · React 19 · TypeScript strict · Tailwind v4 · Vitest +# Run: python ttl_agent_gemma4.py --task "..." --workspace --write-to-workspace +# --------------------------------------------------------------------------- + +WRITER_PROMPT = """You are a software engineering agent implementing features on the TimeToLeave project. + +## FILE EXTENSION RULE — CHECK EVERY FILE BEFORE SUBMITTING + +- `.tsx` — any file that contains JSX (``, `
`, `return (...)` with markup) +- `.ts` — everything else: hooks, clients, routes, types, utilities + +Examples: + src/app/event/WienerLinienSection.tsx ← renders JSX → .tsx + src/hooks/useWienerLinien.ts ← no JSX → .ts + src/lib/wienerlinien-client.ts ← no JSX → .ts + src/app/api/wienerlinien/stops/route.ts← no JSX → .ts + +Wrong extension = broken build. Verify each path ends in the correct suffix. + +## Checklist Tracking + +`CHECKLIST.md` uses three checkbox states: +- `[ ]` — pending and required; blocks the next step +- `[x]` — done +- `[~]` — optional or deferred; never blocks advancement + +Rules: +- The ✅ column is yours; the ✔️ column belongs to the review agent. +- Before starting, read `CHECKLIST.md` and find the first step where ✅ is `[ ]`. +- Confirm that every preceding step has both ✅ and ✔️ as `[x]`. If not, stop and report which steps are blocking — do not proceed. +- Implement only that one step. Do not implement any later steps. +- After completing the step, change its ✅ from `[ ]` to `[x]` in `CHECKLIST.md` and include the updated file in your `files` array. +- Do not mark the ✔️ column — that belongs to the review agent. + +## Stack + +Next.js 16 App Router · React 19 · TypeScript strict · Tailwind CSS v4 · Vitest + +**CRITICAL:** This Next.js version has breaking changes. Before using any Next.js API (routing, +metadata, image, font, caching), read the relevant guide in `node_modules/next/dist/docs/`. +Heed all deprecation notices. APIs and file conventions may differ from your training data. + +## Architecture — Four Layers + +Always follow this pattern: + + src/lib/-client.ts ← singleton, calls external API, server-only + src/app/api//route.ts ← proxy: validates input, calls client, returns NextResponse + src/hooks/use.ts ← hook: calls proxy route, manages loading/error/data + src/app/**/Section.tsx ← component: receives props or calls hook, renders UI + +Reference implementations (read before writing): +- Client: src/lib/bike-routing-client.ts +- Route: src/app/api/bike-route/route.ts +- Hook: src/hooks/useBikeRoute.ts +- Component: src/app/event/BikeSection.tsx +- ApiClient: src/lib/api-service.ts — use ApiClient for caching + retries in new clients +- Constants: src/lib/constants.ts — add env vars here as `process.env.X ?? "default"` +- Types: src/types/index.ts — add all new types here + +## Next.js Rules + +- Route handlers: `export async function GET(request: NextRequest)` or `POST`. Named exports only. +- Imports: `NextRequest`, `NextResponse` from `"next/server"`. +- `"use client"` goes at the top of a file only when it uses `useState`, `useEffect`, event + handlers, `window`, or `navigator`. Server components and route handlers must never have it. +- Never import `src/lib` clients, `crypto`, or `process.env` secrets into client components. +- Path alias: use `@/` for `src/` (e.g. `import { Foo } from "@/types"`). + +## Error Handling in Routes + +Every route 500 must follow this exact pattern: + +```ts +import { randomUUID } from "crypto"; +// ... +} catch (error) { + const corrId = randomUUID().slice(0, 8); + console.error(`[${corrId}] :`, error); + return NextResponse.json( + { error: "Human-readable message", correlationId: corrId }, + { status: 500 }, + ); +} +``` + +Input validation errors return `{ error: "..." }` with status 400 — no correlationId needed. + +## TypeScript Rules + +- Never use `any`. Use `unknown` at JSON/API boundaries with explicit type guards. +- All new types go in `src/types/index.ts`. +- Use `import type` for type-only imports. +- Named exports everywhere. No default exports in `src/lib` or `src/hooks`. +- `const` over `let`. Never `var`. Async/await throughout — no mixed Promise chains. + +## Tailwind CSS v4 + +- Utility classes directly in JSX only. Never `@apply` in CSS files. +- Dark mode uses the `dark:` variant (toggled via a class on ``). +- Do not modify `tailwind.config.ts` unless strictly necessary. + +## Vitest Rules + +- Test files: `src/lib/__tests__/`, `src/app/api/__tests__/`, `src/hooks/__tests__/`, `src/app/**/__tests__/`. +- Use `vi.fn()`, `vi.mock()`, `vi.spyOn()`. Never `jest.*` APIs. +- Mock `global.fetch` or use `vi.mock` to intercept HTTP — no live network in tests. +- Mock all external services: any third-party API, geolocation, timers (`vi.useFakeTimers()`). +- Cover: main success path, input validation, error/failure behavior. +- Import the module under test, not internal helpers directly. + +## General Rules + +- Patch the existing project. Only create new files when the layer does not exist yet. +- Return full file contents — no partial diffs, ellipsis, or placeholders. +- Use relative file paths only. +- Use `npm` (project uses `package-lock.json`). +- Do not add features, abstractions, or cleanup beyond what the current CHECKLIST step requires. +- Preserve existing working behavior unless the step explicitly changes it. +- Do not commit generated files, caches, logs, or `.env` secrets. +- Before finalising the files array, verify every path: does it contain JSX? → `.tsx`. No JSX? → `.ts`. +- If you cannot produce a valid response: {"summary":"generation failed","files":[],"tests":[],"notes":["Internal error — retry."]} +- Return only JSON matching the writer schema. +""" + +REVIEWER_PROMPT = """You are a strict senior code reviewer embedded in a code-generation loop for the TimeToLeave project. + +Stack: Next.js 16 App Router · React 19 · TypeScript strict · Tailwind CSS v4 · Vitest + +## Checklist Tracking + +`CHECKLIST.md` uses three checkbox states: +- `[ ]` — pending and required; blocks the next step +- `[x]` — done +- `[~]` — optional or deferred; never blocks advancement + +Rules: +- The ✔️ column is yours; the ✅ column belongs to the writing agent. +- Only review steps whose ✅ box is already `[x]`. Do not review unimplemented steps. +- Confirm all preceding steps have both ✅ and ✔️ as `[x]` before reviewing. If not, report what is blocking. +- If the step passes all checks below, set verdict to "approve". The orchestrator marks ✔️ automatically. +- If issues remain, set verdict to "needs_changes" and report failures with file paths and line numbers. + +## Review Scope + +One CHECKLIST step at a time. Cross-reference against the step description. Report concrete issues +with file paths and line numbers. Do not flag style nitpicks not covered by a project guideline. + +## What to Check + +**Correctness** +- Behavior matches the current CHECKLIST step's intent. +- API contracts, endpoint shapes, and TypeScript types are compatible with existing callers. +- No regressions in previously working behavior. + +**File extensions** +- `.tsx` for files containing JSX; `.ts` for everything else (routes, hooks, lib, types). +- Flag any component returning JSX saved as `.ts`, or any non-JSX file saved as `.tsx`. + +**Next.js conventions** +- Route handlers export named `GET`/`POST` functions with `(request: NextRequest)` signature. +- `"use client"` is present when a component uses `useState`, `useEffect`, event handlers, `window`, + or `navigator`; absent on all other files. +- No server-only imports (`src/lib` clients, `crypto`, `process.env` secrets) in client components. +- Next.js APIs match what is documented in `node_modules/next/dist/docs/` — flag anything that looks + like a training-data artifact from an older Next.js version. +- Path alias `@/` used for `src/` imports. + +**Error handling** +- All route 500 errors return `{ error: string, correlationId: string }` using `randomUUID().slice(0, 8)`. +- Input validation errors return `{ error: string }` with status 400. + +**Tests** +- Tests exist for the new code covering the main success path, input validation, and failure behavior. +- Only Vitest APIs: `vi.fn()`, `vi.mock()`, `vi.spyOn()`. Never `jest.*`. +- All external services and network calls are mocked — no live network in tests. +- Tests are not weakened or removed just to make the suite pass. + +**TypeScript** +- No `any`. `unknown` at API/JSON boundaries with explicit type guards. +- No missing null/undefined checks on values from API responses or array indexing. +- No missing `await`, unhandled rejections, or mixed async styles. +- No missing exports for symbols referenced by other files. +- `import type` used for type-only imports. + +**Scope and quality** +- Change is scoped to the current CHECKLIST step only. +- No generated artifacts, caches, logs, or `.env` secrets committed. +- Dependencies unchanged unless necessary and justified. + +**Accessibility (UI steps only)** +- Semantic elements, labels for inputs, keyboard-operable controls, visible loading and error states. + +## Verification + +These must pass before setting verdict to "approve": + +```bash +npm test +npm run build +npm run typecheck +npm run lint +``` + +If any check would fail, set verdict to "needs_changes" and report the exact failure details. + +## Review Priorities + +1. Build-breaking defects +2. Test-breaking defects +3. Runtime-breaking defects +4. Mismatch with CHECKLIST step intent +5. Missing files, exports, wiring, or integration +6. Incorrect Next.js APIs or conventions +7. Unsafe behavior, missing null checks, async errors +8. Missing edge-case handling +9. Important but non-blocking maintainability issues + +## Output Field Guidance + +- critical_issues: issues that break build, tests, or runtime +- important_improvements: significant but not immediately blocking +- preserve: anything correct that must not be changed +- rewrite_strategy: concrete alternative approaches for unfixed critical issues +- missing_files: files required by the step that are absent +- test_gaps: risky behavior with materially missing test coverage +- file_comments: specific, actionable guidance tied to a file path + +## Rules + +- Be concrete and rewrite-oriented. Prefer issues the writer can fix in the next pass. +- Do not ask questions. Do not praise unless identifying something that must be preserved. +- Assume the writer should patch the current code, not restart from scratch. +- If the draft is unchanged from a previous attempt on a flagged issue, escalate to critical and + suggest a concrete alternative implementation approach. +- If you have already flagged an issue that was not fixed, say specifically what is still wrong + and why the previous attempt failed. +- Return only JSON matching the review schema. +""" + +DESIGN_PROMPT = """You are a disciplined architect working inside a coding loop on the TimeToLeave project. + +Stack: Next.js 16 App Router · React 19 · TypeScript strict · Tailwind CSS v4 · Vitest + +Produce a concise implementation design for the current CHECKLIST step before coding begins. + +Before designing: +1. Read `CHECKLIST.md` to identify the current step. +2. Read `node_modules/next/dist/docs/` for any Next.js API the step will use — this version differs from training data. +3. Check whether `ApiClient` in `src/lib/api-service.ts` covers the new external service's caching and retry needs before proposing a new client. +4. Check `src/lib/constants.ts` for the env-var pattern before adding new configuration. + +Architecture layers (follow the existing pattern): +- `src/lib/-client.ts` — singleton, server-only, wraps external API via ApiClient +- `src/app/api//route.ts` — proxy route, validates input, calls client, NextResponse +- `src/hooks/use.ts` — hook, fetches from proxy, manages loading/error/data +- `src/app/**/Section.tsx` — component, renders UI, `"use client"` where needed + +Design priorities: +1. File layout — which files to create or modify (prefer modifying over creating new files) +2. Responsibilities — what each file owns +3. Interfaces — exported types and function signatures +4. Integration points — how this connects to existing code +5. Dependencies — exact imports from existing modules +6. Testing plan — what to test, which services to mock, which Vitest APIs to use +7. Risks — anything that could break existing behavior or violate Next.js conventions +8. Assumptions — things taken as given + +Rules: +- Optimize for patching the existing codebase. Prefer minimal file churn. +- Identify conflicts with existing code (naming, module structure, API contracts). +- Flag required structural changes separately from new additions. +- If the step can be completed by modifying a single existing file, say so explicitly. +- Do not redesign unrelated parts of the project. +- Keep the design concrete and immediately usable by the writer. +- Return only JSON matching the design schema. +""" + +if __name__ == "__main__": + raise SystemExit(main("TTL", WRITER_PROMPT, REVIEWER_PROMPT, DESIGN_PROMPT)) diff --git a/apps/mobile/.eslintrc.js b/apps/mobile/.eslintrc.js new file mode 100644 index 0000000..7c38038 --- /dev/null +++ b/apps/mobile/.eslintrc.js @@ -0,0 +1,8 @@ +module.exports = { + root: true, + extends: ['expo'], + rules: { + 'react-native/no-inline-styles': 'off', + }, + ignorePatterns: ['node_modules/', '.expo/', 'dist/'], +}; diff --git a/apps/mobile/App.tsx b/apps/mobile/App.tsx index fcee8fd..bbf1809 100644 --- a/apps/mobile/App.tsx +++ b/apps/mobile/App.tsx @@ -1,5 +1,23 @@ +import { useEffect } from 'react'; +import * as Notifications from 'expo-notifications'; import AppNavigator from './src/navigation/AppNavigator'; export default function App() { + useEffect(() => { + // Request notification permissions on app start + Notifications.requestPermissionsAsync(); + + // Set up notification handler + Notifications.setNotificationHandler({ + handleNotification: async () => ({ + shouldShowAlert: true, + shouldPlaySound: true, + shouldSetBadge: false, + shouldShowBanner: true, + shouldShowList: true, + }), + }); + }, []); + return ; } diff --git a/apps/mobile/app.json b/apps/mobile/app.json index be56629..abe63e0 100644 --- a/apps/mobile/app.json +++ b/apps/mobile/app.json @@ -14,7 +14,11 @@ }, "ios": { "supportsTablet": true, - "bundleIdentifier": "at.timetoleave.mobile" + "bundleIdentifier": "com.timetoleave.app", + "infoPlist": { + "NSLocationWhenInUseUsageDescription": "This app uses your location to find nearby stations and calculate travel times.", + "NSUserNotificationUsageDescription": "This app uses notifications to remind you about events." + } }, "android": { "adaptiveIcon": { @@ -23,7 +27,12 @@ }, "edgeToEdgeEnabled": true, "predictiveBackGestureEnabled": false, - "package": "at.timetoleave.mobile" + "package": "com.timetoleave.app", + "permissions": [ + "android.permission.ACCESS_FINE_LOCATION", + "android.permission.POST_NOTIFICATIONS", + "android.permission.INTERNET" + ] }, "web": { "favicon": "./assets/favicon.png" @@ -31,6 +40,7 @@ "plugins": [ "expo-location", "expo-notifications" - ] + ], + "privacyPolicyUrl": "https://timetoleave.app/privacy-policy" } } diff --git a/apps/mobile/eas.json b/apps/mobile/eas.json new file mode 100644 index 0000000..82cdd56 --- /dev/null +++ b/apps/mobile/eas.json @@ -0,0 +1,34 @@ +{ + "cli": { + "version": ">= 10.0.0" + }, + "build": { + "development": { + "developmentClient": true, + "distribution": "internal", + "android": { + "buildType": "apk" + } + }, + "preview": { + "distribution": "internal", + "android": { + "buildType": "apk" + } + }, + "production": { + "android": { + "buildType": "app-bundle", + "distribution": "store" + } + } + }, + "submit": { + "production": { + "android": { + "serviceAccountKeyPath": "./google-service-account.json", + "track": "production" + } + } + } +} diff --git a/apps/mobile/jest.config.js b/apps/mobile/jest.config.js new file mode 100644 index 0000000..b8480c5 --- /dev/null +++ b/apps/mobile/jest.config.js @@ -0,0 +1,4 @@ +module.exports = { + preset: 'jest-expo', + testMatch: ['**/__tests__/**/*.test.[jt]s?(x)'], +}; diff --git a/apps/mobile/package.json b/apps/mobile/package.json index 6d359fd..2aca2ba 100644 --- a/apps/mobile/package.json +++ b/apps/mobile/package.json @@ -7,8 +7,9 @@ "android": "expo start --android", "ios": "expo start --ios", "web": "expo start --web", - "typecheck": "tsc --noEmit", - "lint": "echo 'no lint yet'" + "typecheck": "tsc --noEmit -p tsconfig.typecheck.json", + "lint": "echo 'no lint yet'", + "test": "jest" }, "dependencies": { "@react-native-async-storage/async-storage": "^3.0.2", @@ -17,16 +18,23 @@ "@timetoleave/api-client": "*", "@timetoleave/core": "*", "expo": "~54.0.33", + "expo-calendar": "^55.0.14", "expo-location": "^55.1.9", "expo-notifications": "^55.0.22", "expo-status-bar": "~3.0.9", - "react": "19.1.0", + "react": "19.2.4", "react-native": "0.81.5", "react-native-safe-area-context": "^5.7.0", "react-native-screens": "^4.24.0" }, "devDependencies": { - "@types/react": "~19.1.0", + "@testing-library/react-native": "^13.3.3", + "@types/jest": "^30.0.0", + "@types/react": "^19", + "jest": "^29.7.0", + "jest-expo": "~54.0.0", + "react-test-renderer": "19.2.4", + "ts-jest": "^29.4.9", "typescript": "~5.9.2" }, "private": true diff --git a/apps/mobile/src/__tests__/calendar.test.ts b/apps/mobile/src/__tests__/calendar.test.ts new file mode 100644 index 0000000..b83f0a1 --- /dev/null +++ b/apps/mobile/src/__tests__/calendar.test.ts @@ -0,0 +1,138 @@ +import * as Calendar from 'expo-calendar'; +import { ensureCalendarPermission, fetchNativeEvents } from '../services/calendar'; + +// Mock expo-calendar +jest.mock('expo-calendar', () => ({ + requestCalendarPermissionsAsync: jest.fn(), + isAvailableAsync: jest.fn(), + getCalendarsAsync: jest.fn(), + getEventsAsync: jest.fn(), + EntityTypes: { + EVENTS: 'EVENTS', + }, +})); + +const mockCalendar = Calendar as jest.Mocked; + +describe('calendar service', () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + describe('ensureCalendarPermission', () => { + it('returns true when permission granted and calendar available', async () => { + mockCalendar.requestCalendarPermissionsAsync.mockResolvedValue({ status: 'granted' as Calendar.PermissionStatus, granted: true, expires: 'never' as const, canAskAgain: true }); + mockCalendar.isAvailableAsync.mockResolvedValue(true); + + const result = await ensureCalendarPermission(); + expect(result).toBe(true); + }); + + it('returns false when permission denied', async () => { + mockCalendar.requestCalendarPermissionsAsync.mockResolvedValue({ status: 'denied' as Calendar.PermissionStatus, granted: false, expires: 'never' as const, canAskAgain: true }); + + const result = await ensureCalendarPermission(); + expect(result).toBe(false); + expect(mockCalendar.isAvailableAsync).not.toHaveBeenCalled(); + }); + + it('returns false when calendar not available', async () => { + mockCalendar.requestCalendarPermissionsAsync.mockResolvedValue({ status: 'granted' as Calendar.PermissionStatus, granted: true, expires: 'never' as const, canAskAgain: true }); + mockCalendar.isAvailableAsync.mockResolvedValue(false); + + const result = await ensureCalendarPermission(); + expect(result).toBe(false); + }); + }); + + describe('fetchNativeEvents', () => { + it('returns empty array when no permission', async () => { + mockCalendar.requestCalendarPermissionsAsync.mockResolvedValue({ status: 'denied' as Calendar.PermissionStatus, granted: false, expires: 'never' as const, canAskAgain: true }); + + const result = await fetchNativeEvents(new Date(), new Date()); + expect(result).toEqual([]); + }); + + it('returns empty array when no calendars', async () => { + mockCalendar.requestCalendarPermissionsAsync.mockResolvedValue({ status: 'granted' as Calendar.PermissionStatus, granted: true, expires: 'never' as const, canAskAgain: true }); + mockCalendar.isAvailableAsync.mockResolvedValue(true); + mockCalendar.getCalendarsAsync.mockResolvedValue([]); + + const result = await fetchNativeEvents(new Date(), new Date()); + expect(result).toEqual([]); + }); + + it('returns mapped events from native calendar', async () => { + const startDate = new Date('2025-01-01'); + const endDate = new Date('2025-01-31'); + + mockCalendar.requestCalendarPermissionsAsync.mockResolvedValue({ status: 'granted' as Calendar.PermissionStatus, granted: true, expires: 'never' as const, canAskAgain: true }); + mockCalendar.isAvailableAsync.mockResolvedValue(true); + mockCalendar.getCalendarsAsync.mockResolvedValue([ + { id: 'cal1', title: 'Work' }, + { id: 'cal2', title: 'Personal' }, + ] as Calendar.Calendar[]); + mockCalendar.getEventsAsync.mockResolvedValue([ + { + id: 'evt1', + calendarId: 'cal1', + title: 'Team Meeting', + location: 'Berlin', + startDate: new Date('2025-01-15T10:00:00'), + }, + { + id: 'evt2', + calendarId: 'cal2', + title: 'Dentist', + location: null, + startDate: new Date('2025-01-20T14:00:00'), + }, + ] as Calendar.Event[]); + + const result = await fetchNativeEvents(startDate, endDate); + + expect(result).toHaveLength(2); + expect(result[0]).toEqual({ + id: 'evt1', + title: 'Team Meeting', + destination: 'Berlin', + eventTime: new Date('2025-01-15T10:00:00'), + source: 'native:cal1', + }); + expect(result[1]).toEqual({ + id: 'evt2', + title: 'Dentist', + destination: '', + eventTime: new Date('2025-01-20T14:00:00'), + source: 'native:cal2', + }); + + expect(mockCalendar.getEventsAsync).toHaveBeenCalledWith( + ['cal1', 'cal2'], + startDate, + endDate, + ); + }); + + it('handles events with missing title or startDate', async () => { + mockCalendar.requestCalendarPermissionsAsync.mockResolvedValue({ status: 'granted' as Calendar.PermissionStatus, granted: true, expires: 'never' as const, canAskAgain: true }); + mockCalendar.isAvailableAsync.mockResolvedValue(true); + mockCalendar.getCalendarsAsync.mockResolvedValue([{ id: 'cal1', title: 'Default' }] as Calendar.Calendar[]); + mockCalendar.getEventsAsync.mockResolvedValue([ + { + id: 'evt1', + calendarId: 'cal1', + title: null as unknown as string, + location: null, + startDate: null as unknown as string | Date, + }, + ] as Calendar.Event[]); + + const result = await fetchNativeEvents(new Date(), new Date()); + + expect(result).toHaveLength(1); + expect(result[0].title).toBe('Untitled Event'); + expect(result[0].destination).toBe(''); + }); + }); +}); diff --git a/apps/mobile/src/__tests__/core-utils.test.ts b/apps/mobile/src/__tests__/core-utils.test.ts new file mode 100644 index 0000000..03f2587 --- /dev/null +++ b/apps/mobile/src/__tests__/core-utils.test.ts @@ -0,0 +1,80 @@ +// Tests for core utilities +import { calculateCountdown } from '@timetoleave/core'; + +describe('core utilities', () => { + describe('calculateCountdown', () => { + beforeEach(() => { + // Mock Date for consistent tests + jest.useFakeTimers(); + jest.setSystemTime(new Date('2025-01-01T12:00:00Z')); + }); + + afterEach(() => { + jest.useRealTimers(); + }); + + it('should return urgent status for past events', () => { + const targetDate = new Date('2025-01-01T11:00:00Z'); + const result = calculateCountdown(targetDate); + + expect(result.label).toBe('Now'); + expect(result.color).toBe('red'); + expect(result.urgent).toBe(true); + }); + + it('should return urgent status for events within 10 minutes', () => { + const targetDate = new Date('2025-01-01T12:05:00Z'); + const result = calculateCountdown(targetDate); + + expect(result.label).toBe('5min'); + expect(result.color).toBe('orange'); + expect(result.urgent).toBe(true); + }); + + it('should return yellow for events within 30 minutes', () => { + const targetDate = new Date('2025-01-01T12:20:00Z'); + const result = calculateCountdown(targetDate); + + expect(result.label).toBe('20min'); + expect(result.color).toBe('yellow'); + expect(result.urgent).toBe(false); + }); + + it('should return green for events within 60 minutes', () => { + const targetDate = new Date('2025-01-01T12:45:00Z'); + const result = calculateCountdown(targetDate); + + expect(result.label).toBe('45min'); + expect(result.color).toBe('green'); + expect(result.urgent).toBe(false); + }); + + it('should return hours and minutes for events more than 1 hour away', () => { + const targetDate = new Date('2025-01-01T15:30:00Z'); + const result = calculateCountdown(targetDate); + + expect(result.label).toBe('3h 30min'); + expect(result.color).toBe('blue'); + expect(result.urgent).toBe(false); + }); + + it('should handle exact boundaries correctly', () => { + // Exactly 10 minutes + let targetDate = new Date('2025-01-01T12:10:00Z'); + let result = calculateCountdown(targetDate); + expect(result.urgent).toBe(true); + + // Exactly 30 minutes + targetDate = new Date('2025-01-01T12:30:00Z'); + result = calculateCountdown(targetDate); + expect(result.urgent).toBe(false); + expect(result.color).toBe('yellow'); + + // Exactly 60 minutes + targetDate = new Date('2025-01-01T13:00:00Z'); + result = calculateCountdown(targetDate); + expect(result.label).toBe('60min'); + expect(result.color).toBe('green'); + }); + }); +}); diff --git a/apps/mobile/src/__tests__/eventStore.test.ts b/apps/mobile/src/__tests__/eventStore.test.ts new file mode 100644 index 0000000..b5741c9 --- /dev/null +++ b/apps/mobile/src/__tests__/eventStore.test.ts @@ -0,0 +1,231 @@ +// Tests for event store persistence and behavior +import AsyncStorage from '@react-native-async-storage/async-storage'; +import { + loadEvents, + saveEvents, + addEvent, + removeEvent, + loadOriginStation, + saveOriginStation, + loadNotificationSettings, + saveNotificationSettings, + rescheduleAllNotifications +} from '../store/eventStore'; +import { calculateLeaveByTime } from '../services/notifications'; +import * as Notifications from 'expo-notifications'; + +// Mock AsyncStorage +jest.mock('@react-native-async-storage/async-storage', () => ({ + getItem: jest.fn(), + setItem: jest.fn(), + removeItem: jest.fn(), +})); + +// Mock expo-notifications +jest.mock('expo-notifications', () => ({ + getAllScheduledNotificationsAsync: jest.fn(), + cancelScheduledNotificationAsync: jest.fn(), + cancelAllScheduledNotificationsAsync: jest.fn(), + scheduleNotificationAsync: jest.fn(), + SchedulableTriggerInputTypes: { + DATE: 'date', + }, + setNotificationHandler: jest.fn(), +})); + +// Mock calculateLeaveByTime +jest.mock('../services/notifications', () => ({ + ...jest.requireActual('../services/notifications'), + calculateLeaveByTime: jest.fn(), +})); + +describe('eventStore', () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + describe('events', () => { + it('should load empty events when none exist', async () => { + (AsyncStorage.getItem as jest.Mock).mockResolvedValue(null); + + const events = await loadEvents(); + expect(events).toEqual([]); + }); + + it('should load events from AsyncStorage', async () => { + const mockEvents = [ + { + id: 'test-1', + title: 'Test Event', + destination: 'Test Destination', + eventTime: new Date('2025-01-01T10:00:00Z'), + source: 'manual', + } + ]; + + (AsyncStorage.getItem as jest.Mock).mockResolvedValue(JSON.stringify(mockEvents)); + + const events = await loadEvents(); + expect(events).toEqual(mockEvents); + expect(events[0].eventTime).toBeInstanceOf(Date); + }); + + it('should save events to AsyncStorage', async () => { + const events = [ + { + id: 'test-1', + title: 'Test Event', + destination: 'Test Destination', + eventTime: new Date('2025-01-01T10:00:00Z'), + source: 'manual', + } + ]; + + await saveEvents(events); + + expect(AsyncStorage.setItem).toHaveBeenCalledWith( + '@timetoleave_events', + JSON.stringify(events) + ); + }); + + it('should add event and schedule notification', async () => { + const event = { + id: 'test-1', + title: 'Test Event', + destination: 'Test Destination', + eventTime: new Date('2025-01-01T10:00:00Z'), + source: 'manual', + }; + + (AsyncStorage.getItem as jest.Mock).mockResolvedValue('[]'); + (calculateLeaveByTime as jest.Mock).mockResolvedValue(new Date('2025-01-01T09:30:00Z')); + + await addEvent(event); + + expect(AsyncStorage.setItem).toHaveBeenCalledWith( + '@timetoleave_events', + JSON.stringify([event]) + ); + }); + + it('should remove event and cancel notifications', async () => { + const event = { + id: 'test-1', + title: 'Test Event', + destination: 'Test Destination', + eventTime: new Date('2025-01-01T10:00:00Z'), + source: 'manual', + }; + + (AsyncStorage.getItem as jest.Mock).mockResolvedValue(JSON.stringify([event])); + (Notifications.getAllScheduledNotificationsAsync as jest.Mock).mockResolvedValue([ + { + identifier: 'notif-1', + content: { data: { eventId: 'test-1' } } + } + ]); + + await removeEvent('test-1'); + + expect(AsyncStorage.setItem).toHaveBeenCalledWith( + '@timetoleave_events', + '[]' + ); + expect(Notifications.cancelScheduledNotificationAsync).toHaveBeenCalled(); + }); + }); + + describe('origin station', () => { + it('should load null when no origin exists', async () => { + (AsyncStorage.getItem as jest.Mock).mockResolvedValue(null); + + const station = await loadOriginStation(); + expect(station).toBeNull(); + }); + + it('should load origin station from AsyncStorage', async () => { + const mockStation = { + extId: 'station-1', + name: 'Test Station', + lat: 48.2, + lng: 16.3, + }; + + (AsyncStorage.getItem as jest.Mock).mockResolvedValue(JSON.stringify(mockStation)); + + const station = await loadOriginStation(); + expect(station).toEqual(mockStation); + }); + + it('should save origin station to AsyncStorage', async () => { + const station = { + extId: 'station-1', + name: 'Test Station', + lat: 48.2, + lng: 16.3, + }; + + await saveOriginStation(station); + + expect(AsyncStorage.setItem).toHaveBeenCalledWith( + '@timetoleave_origin', + JSON.stringify(station) + ); + }); + }); + + describe('notification settings', () => { + it('should load default settings when none exist', async () => { + (AsyncStorage.getItem as jest.Mock).mockResolvedValue(null); + + const settings = await loadNotificationSettings(); + expect(settings).toEqual({ + bufferMinutes: 30, + enabled: true, + }); + }); + + it('should load notification settings from AsyncStorage', async () => { + const mockSettings = { + bufferMinutes: 45, + enabled: false, + }; + + (AsyncStorage.getItem as jest.Mock).mockResolvedValue(JSON.stringify(mockSettings)); + + const settings = await loadNotificationSettings(); + expect(settings).toEqual(mockSettings); + }); + + it('should save notification settings to AsyncStorage', async () => { + const settings = { + bufferMinutes: 45, + enabled: false, + }; + + await saveNotificationSettings(settings); + + expect(AsyncStorage.setItem).toHaveBeenCalledWith( + '@timetoleave_notifications', + JSON.stringify(settings) + ); + }); + }); + + describe('rescheduleAllNotifications', () => { + it('should cancel all existing notifications and schedule new ones', async () => { + (AsyncStorage.getItem as jest.Mock) + .mockResolvedValueOnce(JSON.stringify([])) // events + .mockResolvedValueOnce(JSON.stringify({ bufferMinutes: 30, enabled: true })); // settings + + (Notifications.getAllScheduledNotificationsAsync as jest.Mock).mockResolvedValue([]); + (calculateLeaveByTime as jest.Mock).mockResolvedValue(new Date('2025-01-01T09:30:00Z')); + + await rescheduleAllNotifications(); + + expect(Notifications.cancelAllScheduledNotificationsAsync).toHaveBeenCalled(); + // We can't easily verify scheduling due to complex mocks, but we can check it was called + }); + }); +}); diff --git a/apps/mobile/src/__tests__/notifications.test.ts b/apps/mobile/src/__tests__/notifications.test.ts new file mode 100644 index 0000000..d531b85 --- /dev/null +++ b/apps/mobile/src/__tests__/notifications.test.ts @@ -0,0 +1,173 @@ +// Tests for notification service +// Mock expo-notifications before importing +jest.mock('expo-notifications', () => ({ + setNotificationHandler: jest.fn(), + requestPermissionsAsync: jest.fn().mockResolvedValue({ status: 'granted' }), + scheduleNotificationAsync: jest.fn().mockResolvedValue({ identifier: 'mock-id' }), + cancelScheduledNotificationAsync: jest.fn().mockResolvedValue(undefined), + getAllScheduledNotificationsAsync: jest.fn().mockResolvedValue([]), + cancelAllScheduledNotificationsAsync: jest.fn().mockResolvedValue(undefined), + SchedulableTriggerInputTypes: { + DATE: 'date', + CALENDAR: 'calendar', + DAILY: 'daily', + WEEKLY: 'weekly', + MONTHLY: 'monthly', + YEARLY: 'yearly', + TIME_INTERVAL: 'timeInterval', + }, +})); + +import { calculateLeaveByTime } from '../services/notifications'; +import type { Event, Journey } from '@timetoleave/core'; + +describe('notifications service', () => { + describe('calculateLeaveByTime', () => { + it('should calculate leave-by time from event time minus buffer', () => { + const event: Event = { + id: 'test-1', + title: 'Test Event', + destination: 'Test Destination', + eventTime: new Date('2025-01-01T10:00:00Z'), + source: 'manual', + }; + + const leaveByTime = calculateLeaveByTime(event, [], 30); + + // Leave-by time should be 30 minutes before event time + const expectedTime = new Date('2025-01-01T09:30:00Z'); + expect(leaveByTime.getTime()).toBe(expectedTime.getTime()); + }); + + it('should use earliest journey departure time if available', () => { + const event: Event = { + id: 'test-1', + title: 'Test Event', + destination: 'Test Destination', + eventTime: new Date('2025-01-01T10:00:00Z'), + source: 'manual', + }; + + const journeys: Journey[] = [ + { + id: 'journey-1', + sD: new Date('2025-01-01T08:00:00Z'), + rD: new Date('2025-01-01T08:00:00Z'), + sA: new Date('2025-01-01T09:00:00Z'), + rA: new Date('2025-01-01T09:00:00Z'), + delay: 0, + platform: '1', + changes: 0, + trains: ['S1'], + cancelled: false, + }, + { + id: 'journey-2', + sD: new Date('2025-01-01T07:00:00Z'), + rD: new Date('2025-01-01T07:00:00Z'), + sA: new Date('2025-01-01T08:00:00Z'), + rA: new Date('2025-01-01T08:00:00Z'), + delay: 0, + platform: '2', + changes: 1, + trains: ['U3', 'S2'], + cancelled: false, + }, + ]; + + const leaveByTime = calculateLeaveByTime(event, journeys, 30); + + // Should use earliest non-cancelled journey (journey-2 at 07:00) minus buffer + const expectedTime = new Date('2025-01-01T06:30:00Z'); + expect(leaveByTime.getTime()).toBe(expectedTime.getTime()); + }); + + it('should skip cancelled journeys', () => { + const event: Event = { + id: 'test-1', + title: 'Test Event', + destination: 'Test Destination', + eventTime: new Date('2025-01-01T10:00:00Z'), + source: 'manual', + }; + + const journeys: Journey[] = [ + { + id: 'journey-1', + sD: new Date('2025-01-01T08:00:00Z'), + rD: new Date('2025-01-01T08:00:00Z'), + sA: new Date('2025-01-01T09:00:00Z'), + rA: new Date('2025-01-01T09:00:00Z'), + delay: 0, + platform: '1', + changes: 0, + trains: ['S1'], + cancelled: true, + }, + { + id: 'journey-2', + sD: new Date('2025-01-01T07:00:00Z'), + rD: new Date('2025-01-01T07:00:00Z'), + sA: new Date('2025-01-01T08:00:00Z'), + rA: new Date('2025-01-01T08:00:00Z'), + delay: 0, + platform: '2', + changes: 1, + trains: ['U3', 'S2'], + cancelled: false, + }, + ]; + + const leaveByTime = calculateLeaveByTime(event, journeys, 30); + + // Should use journey-2 since journey-1 is cancelled + const expectedTime = new Date('2025-01-01T06:30:00Z'); + expect(leaveByTime.getTime()).toBe(expectedTime.getTime()); + }); + + it('should fall back to event time minus buffer when all journeys cancelled', () => { + const event: Event = { + id: 'test-1', + title: 'Test Event', + destination: 'Test Destination', + eventTime: new Date('2025-01-01T10:00:00Z'), + source: 'manual', + }; + + const journeys: Journey[] = [ + { + id: 'journey-1', + sD: new Date('2025-01-01T08:00:00Z'), + rD: new Date('2025-01-01T08:00:00Z'), + sA: new Date('2025-01-01T09:00:00Z'), + rA: new Date('2025-01-01T09:00:00Z'), + delay: 0, + platform: '1', + changes: 0, + trains: ['S1'], + cancelled: true, + }, + ]; + + const leaveByTime = calculateLeaveByTime(event, journeys, 30); + + // All journeys cancelled, fall back to event time minus buffer + const expectedTime = new Date('2025-01-01T09:30:00Z'); + expect(leaveByTime.getTime()).toBe(expectedTime.getTime()); + }); + + it('should handle zero buffer correctly', () => { + const event: Event = { + id: 'test-1', + title: 'Test Event', + destination: 'Test Destination', + eventTime: new Date('2025-01-01T10:00:00Z'), + source: 'manual', + }; + + const leaveByTime = calculateLeaveByTime(event, [], 0); + + expect(leaveByTime.getTime()).toBe(event.eventTime.getTime()); + }); + }); +}); diff --git a/apps/mobile/src/__tests__/screens.test.tsx b/apps/mobile/src/__tests__/screens.test.tsx new file mode 100644 index 0000000..2ac9af9 --- /dev/null +++ b/apps/mobile/src/__tests__/screens.test.tsx @@ -0,0 +1,204 @@ +// Tests for UI screens +import { fireEvent, render, waitFor } from '@testing-library/react-native'; +import type { NativeStackNavigationProp } from '@react-navigation/native-stack'; +import type { RouteProp } from '@react-navigation/native'; +import { EventListScreen } from '../screens/EventListScreen'; +import { AddEventScreen } from '../screens/AddEventScreen'; +import { loadEvents } from '../store/eventStore'; +import { calculateCountdown } from '@timetoleave/core'; + +// Mock the store and utilities +jest.mock('../store/eventStore', () => ({ + loadEvents: jest.fn(), + removeEvent: jest.fn(), +})); + +jest.mock('@timetoleave/core', () => ({ + ...jest.requireActual('@timetoleave/core'), + calculateCountdown: jest.fn(), +})); + +// Mock useFocusEffect so EventListScreen can render without NavigationContainer +jest.mock('@react-navigation/native', () => ({ + ...jest.requireActual('@react-navigation/native'), + useFocusEffect: (callback: () => void) => { + // Execute the callback immediately so the component loads data + callback(); + }, +})); + +// --- Mock navigation factories --- + +type RootStack = { + EventList: undefined; + EventDetail: { eventId: string }; + AddEvent: undefined; + Settings: undefined; + CalendarImport: undefined; +}; + +function createMockNavigationProp< + S extends Record>, + T extends keyof S +>(overrides?: Partial>): NativeStackNavigationProp { + const mocks: Partial> = { + navigate: jest.fn(), + dispatch: jest.fn(() => {}), + goBack: jest.fn(), + isFocused: jest.fn(() => true), + setParams: jest.fn(), + setOptions: jest.fn(), + reset: jest.fn(), + pop: jest.fn(), + preload: jest.fn(), + push: jest.fn(), + replace: jest.fn(), + canGoBack: jest.fn(() => false), + ...overrides, + }; + return mocks as NativeStackNavigationProp; +} + +const mockRouteEventList = { name: 'EventList' as const, params: undefined } as unknown as RouteProp; +const mockRouteAddEvent = { name: 'AddEvent' as const, params: undefined } as unknown as RouteProp; + +// --- End mock factories --- + +describe('EventListScreen', () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('should render empty state when no events', async () => { + (loadEvents as jest.Mock).mockResolvedValue([]); + + const { getByText } = render( + ()} route={mockRouteEventList} /> + ); + + await waitFor(() => { + expect(getByText('Keine Termine')).toBeTruthy(); + }); + }); + + it('should render events when they exist', async () => { + const mockEvents = [ + { + id: 'test-1', + title: 'Test Event', + destination: 'Test Destination', + eventTime: new Date('2025-01-01T10:00:00Z'), + source: 'manual', + } + ]; + + (loadEvents as jest.Mock).mockResolvedValue(mockEvents); + (calculateCountdown as jest.Mock).mockReturnValue({ + label: '30min', + color: 'green', + urgent: false + }); + + const { getByText } = render( + ()} route={mockRouteEventList} /> + ); + + await waitFor(() => { + expect(getByText('Test Event')).toBeTruthy(); + expect(getByText('Test Destination')).toBeTruthy(); + }); + }); + + it('should handle refresh correctly', async () => { + const mockEvents = [ + { + id: 'test-1', + title: 'Test Event', + destination: 'Test Destination', + eventTime: new Date('2025-01-01T10:00:00Z'), + source: 'manual', + } + ]; + + (loadEvents as jest.Mock).mockResolvedValue(mockEvents); + (calculateCountdown as jest.Mock).mockReturnValue({ + label: '30min', + color: 'green', + urgent: false + }); + + const { getByText } = render( + ()} route={mockRouteEventList} /> + ); + + await waitFor(() => { + expect(getByText('Test Event')).toBeTruthy(); + }); + }); +}); + +describe('AddEventScreen', () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('should render form correctly', () => { + const { getByPlaceholderText, getByText } = render( + ()} route={mockRouteAddEvent} /> + ); + + expect(getByPlaceholderText('z.B. Team Meeting')).toBeTruthy(); + expect(getByPlaceholderText('z.B. Wien, Donau-City')).toBeTruthy(); + expect(getByPlaceholderText('JJJJ-MM-TT')).toBeTruthy(); + expect(getByPlaceholderText('SS:MM')).toBeTruthy(); + expect(getByText('Speichern')).toBeTruthy(); + expect(getByText('Abbrechen')).toBeTruthy(); + }); + + it('should show validation errors', () => { + const { getByText } = render( + ()} route={mockRouteAddEvent} /> + ); + + // Try to save without filling form + const saveButton = getByText('Speichern'); + fireEvent.press(saveButton); + + // Should show error text + expect(getByText('Titel erforderlich')).toBeTruthy(); + }); + + it('should validate date format', () => { + const { getByPlaceholderText, getByText } = render( + ()} route={mockRouteAddEvent} /> + ); + + // Fill in all required fields except date format is invalid + fireEvent.changeText(getByPlaceholderText('z.B. Team Meeting'), 'Meeting'); + fireEvent.changeText(getByPlaceholderText('z.B. Wien, Donau-City'), 'Wien'); + fireEvent.changeText(getByPlaceholderText('JJJJ-MM-TT'), 'invalid-date'); + fireEvent.changeText(getByPlaceholderText('SS:MM'), '12:00'); + + const saveButton = getByText('Speichern'); + fireEvent.press(saveButton); + + expect(getByText('Ungültiges Datum')).toBeTruthy(); + }); + + it('should validate future date', () => { + const { getByPlaceholderText, getByText } = render( + ()} route={mockRouteAddEvent} /> + ); + + // Fill in all required fields with a past date + fireEvent.changeText(getByPlaceholderText('z.B. Team Meeting'), 'Meeting'); + fireEvent.changeText(getByPlaceholderText('z.B. Wien, Donau-City'), 'Wien'); + fireEvent.changeText(getByPlaceholderText('JJJJ-MM-TT'), '2020-01-01'); + fireEvent.changeText(getByPlaceholderText('SS:MM'), '12:00'); + + const saveButton = getByText('Speichern'); + fireEvent.press(saveButton); + + expect(getByText('Datum muss in der Zukunft liegen')).toBeTruthy(); + }); +}); diff --git a/apps/mobile/src/screens/CalendarImportScreen.tsx b/apps/mobile/src/screens/CalendarImportScreen.tsx index 9ff9a57..b1291ab 100644 --- a/apps/mobile/src/screens/CalendarImportScreen.tsx +++ b/apps/mobile/src/screens/CalendarImportScreen.tsx @@ -11,7 +11,8 @@ import { import type { NativeStackNavigationProp } from '@react-navigation/native-stack'; import type { RouteProp } from '@react-navigation/native'; import { api } from '../services/api'; -import { addEvent } from '../store/eventStore'; +import { fetchNativeEvents } from '../services/calendar'; +import { addEvent, loadEvents } from '../store/eventStore'; import type { Event as CalendarEvent } from '@timetoleave/core'; type RootStack = { @@ -64,21 +65,85 @@ export function CalendarImportScreen({ navigation }: ScreenProps) { } }; + const handleSyncNative = async () => { + setLoading(true); + setError(null); + setCount(null); + + try { + // Fetch events from the next 30 days + const now = new Date(); + const thirtyDaysLater = new Date(now.getTime() + 30 * 24 * 60 * 60 * 1000); + + const nativeEvents = await fetchNativeEvents(now, thirtyDaysLater); + + // Load existing events to avoid duplicates + const existing = await loadEvents(); + const existingIds = new Set(existing.map((e) => e.id)); + + let added = 0; + for (const evt of nativeEvents) { + if (!existingIds.has(evt.id)) { + await addEvent(evt); + added++; + } + } + + setCount(added); + } catch (err) { + setError(err instanceof Error ? err.message : 'Sync fehlgeschlagen'); + } finally { + setLoading(false); + } + }; + return ( + Kalender-Import - Gib eine ICS-Kalender-URL ein, um Termine automatisch zu importieren. + Importiere Termine über eine ICS-URL oder sync mit dem Geräte-Kalender. - + + ICS-URL Import + + + + + {loading ? ( + + ) : ( + ICS Importieren + )} + + + + + Geräte-Kalender Sync + + Hole Termine der nächsten 30 Tage aus den kalendern auf deinem Gerät. + + + + 📅 Kalender Sync + + {error && ( @@ -94,18 +159,6 @@ export function CalendarImportScreen({ navigation }: ScreenProps) { )} - - {loading ? ( - - ) : ( - Importieren - )} - - navigation.goBack()} @@ -120,7 +173,11 @@ export function CalendarImportScreen({ navigation }: ScreenProps) { const styles = StyleSheet.create({ container: { flex: 1, backgroundColor: '#f2f2f7' }, content: { padding: 20 }, - description: { fontSize: 14, color: '#8e8e93', marginBottom: 16, lineHeight: 20 }, + heading: { fontSize: 22, fontWeight: '700', color: '#1c1c1e', marginBottom: 4 }, + description: { fontSize: 14, color: '#8e8e93', marginBottom: 20, lineHeight: 20 }, + section: { marginBottom: 24 }, + sectionTitle: { fontSize: 16, fontWeight: '600', color: '#1c1c1e', marginBottom: 8 }, + sectionDesc: { fontSize: 13, color: '#8e8e93', marginBottom: 12, lineHeight: 18 }, input: { backgroundColor: '#fff', borderRadius: 10, @@ -129,7 +186,7 @@ const styles = StyleSheet.create({ fontSize: 16, borderWidth: 1, borderColor: '#e5e5ea', - marginBottom: 16, + marginBottom: 12, }, errorBanner: { backgroundColor: '#FF3B30', borderRadius: 8, padding: 12, marginBottom: 12 }, errorText: { color: '#fff', fontSize: 14 }, @@ -140,7 +197,9 @@ const styles = StyleSheet.create({ paddingVertical: 14, borderRadius: 12, alignItems: 'center', - marginBottom: 12, + }, + nativeBtn: { + backgroundColor: '#5856D6', }, importBtnDisabled: { opacity: 0.6 }, importBtnText: { color: '#fff', fontSize: 16, fontWeight: '600' }, diff --git a/apps/mobile/src/screens/SettingsScreen.tsx b/apps/mobile/src/screens/SettingsScreen.tsx index 3cb9ec9..641ed84 100644 --- a/apps/mobile/src/screens/SettingsScreen.tsx +++ b/apps/mobile/src/screens/SettingsScreen.tsx @@ -12,7 +12,7 @@ import { import type { NativeStackNavigationProp } from '@react-navigation/native-stack'; import type { RouteProp } from '@react-navigation/native'; import * as Location from 'expo-location'; -import { loadOriginStation, saveOriginStation, loadNotificationSettings, saveNotificationSettings } from '../store/eventStore'; +import { loadOriginStation, saveOriginStation, loadNotificationSettings, saveNotificationSettings, rescheduleAllNotifications } from '../store/eventStore'; import { api } from '../services/api'; import type { Station, ReminderSettings } from '@timetoleave/core'; @@ -80,6 +80,7 @@ export function SettingsScreen({ navigation }: ScreenProps) { setQuery(station.name); setResults([]); saveOriginStation(station); + rescheduleAllNotifications(); // Recalculate when origin changes }; const useCurrentLocation = async () => { @@ -127,6 +128,7 @@ export function SettingsScreen({ navigation }: ScreenProps) { const updated = { ...notifSettings, enabled: value }; setNotifSettings(updated); await saveNotificationSettings(updated); + await rescheduleAllNotifications(); }; const updateBufferMinutes = async (value: string) => { @@ -135,6 +137,7 @@ export function SettingsScreen({ navigation }: ScreenProps) { const updated = { ...notifSettings, bufferMinutes: minutes }; setNotifSettings(updated); await saveNotificationSettings(updated); + await rescheduleAllNotifications(); } }; diff --git a/apps/mobile/src/services/calendar.ts b/apps/mobile/src/services/calendar.ts new file mode 100644 index 0000000..2ae3e9f --- /dev/null +++ b/apps/mobile/src/services/calendar.ts @@ -0,0 +1,41 @@ +import * as Calendar from 'expo-calendar'; +import type { Event as CoreEvent } from '@timetoleave/core'; + +/** + * Native calendar integration for the mobile app. + * Reads events from device calendars and converts them to our internal format. + */ + +export async function ensureCalendarPermission(): Promise { + const { status } = await Calendar.requestCalendarPermissionsAsync(); + if (status !== 'granted') + return false; + + return Calendar.isAvailableAsync(); +} + +/** + * Fetch events from native calendars within a date range. + * Returns events converted to our internal Event format. + */ +export async function fetchNativeEvents( + startDate: Date, + endDate: Date, +): Promise { + const available = await ensureCalendarPermission(); + if (!available) return []; + + const calendars = await Calendar.getCalendarsAsync(Calendar.EntityTypes.EVENT); + if (calendars.length === 0) return []; + + const calendarIds = calendars.map((c) => c.id); + const events = await Calendar.getEventsAsync(calendarIds, startDate, endDate); + + return events.map((evt) => ({ + id: evt.id, + title: evt.title ?? 'Untitled Event', + destination: evt.location ?? '', + eventTime: typeof evt.startDate === 'string' ? new Date(evt.startDate) : (evt.startDate ?? new Date()), + source: `native:${evt.calendarId}`, + })); +} diff --git a/apps/mobile/src/services/notifications.ts b/apps/mobile/src/services/notifications.ts new file mode 100644 index 0000000..5110d78 --- /dev/null +++ b/apps/mobile/src/services/notifications.ts @@ -0,0 +1,146 @@ +import * as Notifications from 'expo-notifications'; +import { SchedulableTriggerInputTypes } from 'expo-notifications'; +import type { Event, Journey, ReminderSettings } from '@timetoleave/core'; + +// Register for push notification permissions +Notifications.setNotificationHandler({ + handleNotification: async () => ({ + shouldShowAlert: true, + shouldPlaySound: true, + shouldSetBadge: false, + shouldShowBanner: true, + shouldShowList: true, + }), +}); + +/** + * Calculate leave-by time from event time and journey data. + * Uses earliest real departure time if journeys exist, otherwise event time minus buffer. + */ +export function calculateLeaveByTime( + event: Event, + journeys: Journey[], + bufferMinutes: number +): Date { + // If we have journeys, use the earliest non-cancelled real departure + if (journeys.length > 0) { + const best = journeys + .filter((j) => !j.cancelled) + .sort((a, b) => a.rD.getTime() - b.rD.getTime())[0]; + + if (best) { + return new Date(best.rD.getTime() - bufferMinutes * 60 * 1000); + } + } + + // Fallback: event time minus buffer (no journey data) + return new Date(event.eventTime.getTime() - bufferMinutes * 60 * 1000); +} + +/** + * Schedule notifications for an event + * + * @param event - The event to schedule notifications for + * @param journeys - Journey data for this event (optional) + * @param settings - Notification settings + */ +export async function scheduleNotificationsForEvent( + event: Event, + journeys: Journey[] = [], + settings: ReminderSettings +): Promise { + // Don't schedule if notifications are disabled + if (!settings.enabled) { + return; + } + + // Calculate leave-by time (when user should actually leave) + const leaveByTime = calculateLeaveByTime(event, journeys, settings.bufferMinutes); + + // Cancel existing notifications for this event - cancel one by one + const existing = await Notifications.getAllScheduledNotificationsAsync(); + const toCancel = existing.filter(n => n.content.data?.eventId === event.id); + if (toCancel.length > 0) { + for (const notif of toCancel) { + await Notifications.cancelScheduledNotificationAsync(notif.identifier); + } + } + + // Default reminders: 30min, 10min, and at leave-by time + // But respect the buffer time - we want reminders relative to when they should leave + const defaultReminders = [30, 10, 0]; + + // Schedule notifications + for (const minutesBefore of defaultReminders) { + const triggerTime = new Date(leaveByTime.getTime() - minutesBefore * 60 * 1000); + + // Skip if trigger time is in the past + if (triggerTime <= new Date()) { + continue; + } + + // Skip if this would be before the event actually starts (add some safety margin) + if (triggerTime < new Date(event.eventTime.getTime() - 2 * 60 * 60 * 1000)) { + continue; + } + + // Use Date trigger with time property + await Notifications.scheduleNotificationAsync({ + content: { + title: `🚆 ${event.title}`, + body: minutesBefore === 0 + ? 'Zeit zu gehen!' + : `${minutesBefore} Minuten bis du losmusst`, + data: { eventId: event.id }, + }, + trigger: { type: SchedulableTriggerInputTypes.DATE, date: triggerTime }, + }); + } +} + +/** + * Reschedule notifications for all events + * Use this when origin station changes or notification settings are updated + */ +export async function rescheduleAllNotifications( + events: Event[], + journeysMap: Record, // eventId -> journeys + settings: ReminderSettings +): Promise { + // Cancel ALL existing notifications first + await Notifications.cancelAllScheduledNotificationsAsync(); + + // Schedule new notifications for each event + for (const event of events) { + const eventJourneys = journeysMap[event.id] || []; + await scheduleNotificationsForEvent(event, eventJourneys, settings); + } +} + +// Request permissions if not already granted +let permissionsRequested = false; + +export async function requestNotificationPermissions(): Promise { + if (permissionsRequested) { + return true; + } + + permissionsRequested = true; + const { status } = await Notifications.requestPermissionsAsync(); + return status === 'granted'; +} + +// Request permissions automatically when app starts (for Android) +// This is called in App.tsx + +export function setupNotifications() { + Notifications.setNotificationHandler({ + handleNotification: async () => ({ + shouldShowAlert: true, + shouldPlaySound: true, + shouldSetBadge: false, + shouldShowBanner: true, + shouldShowList: true, + }), + }); +} diff --git a/apps/mobile/src/store/eventStore.ts b/apps/mobile/src/store/eventStore.ts index 56cc059..0fb1b8f 100644 --- a/apps/mobile/src/store/eventStore.ts +++ b/apps/mobile/src/store/eventStore.ts @@ -1,7 +1,9 @@ import AsyncStorage from '@react-native-async-storage/async-storage'; import type { Event, Station, ReminderSettings } from '@timetoleave/core'; +import * as Notifications from 'expo-notifications'; +import { SchedulableTriggerInputTypes } from 'expo-notifications'; -// ── Keys ──────────────────────────────────────────── +// ── Keys ─────────────────────────────── const EVENTS_KEY = '@timetoleave_events'; const ORIGIN_KEY = '@timetoleave_origin'; @@ -25,6 +27,68 @@ function reviveDates(json: string): Event[] { } } +async function getNotificationSettings(): Promise { + const json = await AsyncStorage.getItem(NOTIFICATIONS_KEY); + return json ? JSON.parse(json) : DEFAULT_NOTIFICATION_SETTINGS; +} + +// ──────────────────────────────────────────────────────────── +// Notification scheduling utilities +// ──────────────────────────────────────────────────────────── + +async function calculateLeaveByTime(event: Event, bufferMinutes: number): Promise { + // Fallback: event time minus buffer (no journey data) + return new Date(event.eventTime.getTime() - bufferMinutes * 60 * 1000); +} + +async function scheduleEventNotification(event: Event): Promise { + const settings = await getNotificationSettings(); + if (!settings.enabled) { + return; + } + + const leaveByTime = await calculateLeaveByTime(event, settings.bufferMinutes); + + // Cancel existing notifications for this event - cancel one by one + const existing = await Notifications.getAllScheduledNotificationsAsync(); + const toCancel = existing.filter(n => n.content.data?.eventId === event.id); + for (const notif of toCancel) { + await Notifications.cancelScheduledNotificationAsync(notif.identifier); + } + + // Default reminders: 30min, 10min, and at leave-by time + const defaultReminders = [30, 10, 0]; + + // Schedule notifications + for (const minutesBefore of defaultReminders) { + const triggerTime = new Date(leaveByTime.getTime() - minutesBefore * 60 * 1000); + + // Skip if trigger time is in the past + if (triggerTime <= new Date()) { + continue; + } + + // Skip if this would be before the event actually starts (add some safety margin) + if (triggerTime < new Date(event.eventTime.getTime() - 2 * 60 * 60 * 1000)) { + continue; + } + + await Notifications.scheduleNotificationAsync({ + content: { + title: `🚆 ${event.title}`, + body: minutesBefore === 0 + ? 'Zeit zu gehen!' + : `${minutesBefore} Minuten bis du losmusst`, + data: { eventId: event.id }, + }, + trigger: { type: SchedulableTriggerInputTypes.DATE, date: triggerTime }, + }); + } +} + +// ──────────────────────────────────────────────────────────── +// Events ──────────────────────────────────────────── + // ── Events ──────────────────────────────────────────── export async function loadEvents(): Promise { @@ -41,16 +105,26 @@ export async function addEvent(event: Event): Promise { const events = await loadEvents(); events.push(event); await saveEvents(events); + await scheduleEventNotification(event); } export async function removeEvent(id: string, onDone?: () => void): Promise { const events = await loadEvents(); const filtered = events.filter((e) => e.id !== id); await saveEvents(filtered); + + // Cancel notifications for removed event - cancel one by one + const existing = await Notifications.getAllScheduledNotificationsAsync(); + const toCancel = existing.filter(n => n.content.data?.eventId === id); + for (const notif of toCancel) { + await Notifications.cancelScheduledNotificationAsync(notif.identifier); + } + onDone?.(); } -// ── Origin Station ──────────────────────────────────── +// ──────────────────────────────────────────────────────────── +// Origin Station ──────────────────────────────────── export async function loadOriginStation(): Promise { const json = await AsyncStorage.getItem(ORIGIN_KEY); @@ -62,7 +136,8 @@ export async function saveOriginStation(station: Station): Promise { await AsyncStorage.setItem(ORIGIN_KEY, json); } -// ── Notification Settings ───────────────────────────── +// ──────────────────────────────────────────────────────────── +// Notification Settings ────────────────────────────── export async function loadNotificationSettings(): Promise { const json = await AsyncStorage.getItem(NOTIFICATIONS_KEY); @@ -75,3 +150,50 @@ export async function saveNotificationSettings( const json = JSON.stringify(settings); await AsyncStorage.setItem(NOTIFICATIONS_KEY, json); } + +// ──────────────────────────────────────────────────────────── +// Reschedule all notifications (for origin/setting changes) +// ──────────────────────────────────────────────────────────── + +export async function rescheduleAllNotifications(): Promise { + const events = await loadEvents(); + const settings = await loadNotificationSettings(); + + // Cancel ALL existing notifications first + await Notifications.cancelAllScheduledNotificationsAsync(); + + // Schedule new notifications for each event + for (const event of events) { + if (settings.enabled) { + const leaveByTime = await calculateLeaveByTime(event, settings.bufferMinutes); + + // Default reminders: 30min, 10min, and at leave-by time + const defaultReminders = [30, 10, 0]; + + for (const minutesBefore of defaultReminders) { + const triggerTime = new Date(leaveByTime.getTime() - minutesBefore * 60 * 1000); + + // Skip if trigger time is in the past + if (triggerTime <= new Date()) { + continue; + } + + // Skip if this would be before the event actually starts (add some safety margin) + if (triggerTime < new Date(event.eventTime.getTime() - 2 * 60 * 60 * 1000)) { + continue; + } + + await Notifications.scheduleNotificationAsync({ + content: { + title: `🚆 ${event.title}`, + body: minutesBefore === 0 + ? 'Zeit zu gehen!' + : `${minutesBefore} Minuten bis du losmusst`, + data: { eventId: event.id }, + }, + trigger: { type: SchedulableTriggerInputTypes.DATE, date: triggerTime }, + }); + } + } + } +} diff --git a/apps/mobile/tsconfig.typecheck.json b/apps/mobile/tsconfig.typecheck.json new file mode 100644 index 0000000..4dc23fb --- /dev/null +++ b/apps/mobile/tsconfig.typecheck.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig.json", + "exclude": ["src/__tests__"] +} diff --git a/apps/web/.eslintrc.js b/apps/web/.eslintrc.js new file mode 100644 index 0000000..9a899f0 --- /dev/null +++ b/apps/web/.eslintrc.js @@ -0,0 +1,8 @@ +module.exports = { + root: true, + extends: ['next/core-web-vitals'], + rules: { + '@next/next/no-html-link-for-pages': 'off', + }, + ignorePatterns: ['node_modules/', '.next/', 'out/', 'dist/'], +}; diff --git a/apps/web/.next/BUILD_ID b/apps/web/.next/BUILD_ID index f78f9db..a019ef1 100644 --- a/apps/web/.next/BUILD_ID +++ b/apps/web/.next/BUILD_ID @@ -1 +1 @@ -pcsiH5B97Wet0aRbzsRfL \ No newline at end of file +MKsV9_ZtzPcZHC3V_SATf \ No newline at end of file diff --git a/apps/web/.next/build-manifest.json b/apps/web/.next/build-manifest.json index 139e9e2..86289d6 100644 --- a/apps/web/.next/build-manifest.json +++ b/apps/web/.next/build-manifest.json @@ -7,9 +7,9 @@ "static/chunks/03~yq9q893hmn.js" ], "lowPriorityFiles": [ - "static/pcsiH5B97Wet0aRbzsRfL/_buildManifest.js", - "static/pcsiH5B97Wet0aRbzsRfL/_ssgManifest.js", - "static/pcsiH5B97Wet0aRbzsRfL/_clientMiddlewareManifest.js" + "static/MKsV9_ZtzPcZHC3V_SATf/_buildManifest.js", + "static/MKsV9_ZtzPcZHC3V_SATf/_ssgManifest.js", + "static/MKsV9_ZtzPcZHC3V_SATf/_clientMiddlewareManifest.js" ], "rootMainFiles": [ "static/chunks/0bzupvr5gt3k9.js", diff --git a/apps/web/.next/fallback-build-manifest.json b/apps/web/.next/fallback-build-manifest.json index fd67090..eda139f 100644 --- a/apps/web/.next/fallback-build-manifest.json +++ b/apps/web/.next/fallback-build-manifest.json @@ -5,9 +5,9 @@ "devFiles": [], "polyfillFiles": [], "lowPriorityFiles": [ - "static/pcsiH5B97Wet0aRbzsRfL/_buildManifest.js", - "static/pcsiH5B97Wet0aRbzsRfL/_ssgManifest.js", - "static/pcsiH5B97Wet0aRbzsRfL/_clientMiddlewareManifest.js" + "static/MKsV9_ZtzPcZHC3V_SATf/_buildManifest.js", + "static/MKsV9_ZtzPcZHC3V_SATf/_ssgManifest.js", + "static/MKsV9_ZtzPcZHC3V_SATf/_clientMiddlewareManifest.js" ], "rootMainFiles": [] } \ No newline at end of file diff --git a/apps/web/.next/required-server-files.js b/apps/web/.next/required-server-files.js index 16539ef..70be979 100644 --- a/apps/web/.next/required-server-files.js +++ b/apps/web/.next/required-server-files.js @@ -1,7 +1,10 @@ self.__SERVER_FILES_MANIFEST={ "version": 1, "config": { - "env": {}, + "env": { + "CORS_ALLOWED_ORIGINS": "*", + "DEPLOYMENT_URL": "http://localhost:3000" + }, "webpack": null, "typescript": { "ignoreBuildErrors": false diff --git a/apps/web/.next/required-server-files.json b/apps/web/.next/required-server-files.json index 2419436..a98302d 100644 --- a/apps/web/.next/required-server-files.json +++ b/apps/web/.next/required-server-files.json @@ -1,7 +1,10 @@ { "version": 1, "config": { - "env": {}, + "env": { + "CORS_ALLOWED_ORIGINS": "*", + "DEPLOYMENT_URL": "http://localhost:3000" + }, "webpack": null, "typescript": { "ignoreBuildErrors": false diff --git a/apps/web/.next/server/app/_global-error.html b/apps/web/.next/server/app/_global-error.html index 19a5e8b..38abfe5 100644 --- a/apps/web/.next/server/app/_global-error.html +++ b/apps/web/.next/server/app/_global-error.html @@ -1 +1 @@ -500: This page couldn’t load

This page couldn’t load

A server error occurred. Reload to try again.

\ No newline at end of file +500: This page couldn’t load

This page couldn’t load

A server error occurred. Reload to try again.

\ No newline at end of file diff --git a/apps/web/.next/server/app/_global-error.rsc b/apps/web/.next/server/app/_global-error.rsc index 148db86..99e6a8d 100644 --- a/apps/web/.next/server/app/_global-error.rsc +++ b/apps/web/.next/server/app/_global-error.rsc @@ -6,7 +6,7 @@ 8:I[97367,["/_next/static/chunks/01xlw8hd842-c.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"ViewportBoundary"] a:I[97367,["/_next/static/chunks/01xlw8hd842-c.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"MetadataBoundary"] c:I[68027,["/_next/static/chunks/01xlw8hd842-c.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default",1] -0:{"P":null,"c":["","_global-error"],"q":"","i":false,"f":[[["",{"children":["__PAGE__",{}]}],[["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[["$","html",null,{"id":"__next_error__","children":[["$","head",null,{"children":[["$","title",null,{"children":"500: This page couldn’t load"}],["$","style",null,{"dangerouslySetInnerHTML":{"__html":":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }"}}]]}],["$","body",null,{"children":["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","display":"flex","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"style":{"marginTop":"-32px","maxWidth":"325px","padding":"32px 28px","textAlign":"left"},"children":[["$","svg",null,{"width":"32","height":"32","viewBox":"-0.2 -1.5 32 32","fill":"none","style":{"marginBottom":"24px"},"children":["$","path",null,{"d":"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z","fill":"var(--next-error-title)"}]}],["$","h1",null,{"style":{"fontSize":"24px","fontWeight":500,"letterSpacing":"-0.02em","lineHeight":"32px","margin":"0 0 12px 0","color":"var(--next-error-title)"},"children":"This page couldn’t load"}],["$","p",null,{"style":{"fontSize":"14px","fontWeight":400,"lineHeight":"21px","margin":"0 0 20px 0","color":"var(--next-error-message)"},"children":"A server error occurred. Reload to try again."}],["$","form",null,{"style":{"margin":0},"children":["$","button",null,{"type":"submit","style":{"display":"inline-flex","alignItems":"center","justifyContent":"center","height":"32px","padding":"0 12px","fontSize":"14px","fontWeight":500,"lineHeight":"20px","borderRadius":"6px","cursor":"pointer","color":"var(--next-error-btn-text)","background":"var(--next-error-btn-bg)","border":"var(--next-error-btn-border)"},"children":"Reload"}]}]]}]}]}]]}],null,["$","$L4",null,{"children":["$","$5",null,{"name":"Next.MetadataOutlet","children":"$@6"}]}]]}],{},null,false,null]},null,false,"$@7"],["$","$1","h",{"children":[null,["$","$L8",null,{"children":"$L9"}],["$","div",null,{"hidden":true,"children":["$","$La",null,{"children":["$","$5",null,{"name":"Next.Metadata","children":"$Lb"}]}]}],null]}],false]],"m":"$undefined","G":["$c",[]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"pcsiH5B97Wet0aRbzsRfL"} +0:{"P":null,"c":["","_global-error"],"q":"","i":false,"f":[[["",{"children":["__PAGE__",{}]}],[["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[["$","html",null,{"id":"__next_error__","children":[["$","head",null,{"children":[["$","title",null,{"children":"500: This page couldn’t load"}],["$","style",null,{"dangerouslySetInnerHTML":{"__html":":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }"}}]]}],["$","body",null,{"children":["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","display":"flex","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"style":{"marginTop":"-32px","maxWidth":"325px","padding":"32px 28px","textAlign":"left"},"children":[["$","svg",null,{"width":"32","height":"32","viewBox":"-0.2 -1.5 32 32","fill":"none","style":{"marginBottom":"24px"},"children":["$","path",null,{"d":"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z","fill":"var(--next-error-title)"}]}],["$","h1",null,{"style":{"fontSize":"24px","fontWeight":500,"letterSpacing":"-0.02em","lineHeight":"32px","margin":"0 0 12px 0","color":"var(--next-error-title)"},"children":"This page couldn’t load"}],["$","p",null,{"style":{"fontSize":"14px","fontWeight":400,"lineHeight":"21px","margin":"0 0 20px 0","color":"var(--next-error-message)"},"children":"A server error occurred. Reload to try again."}],["$","form",null,{"style":{"margin":0},"children":["$","button",null,{"type":"submit","style":{"display":"inline-flex","alignItems":"center","justifyContent":"center","height":"32px","padding":"0 12px","fontSize":"14px","fontWeight":500,"lineHeight":"20px","borderRadius":"6px","cursor":"pointer","color":"var(--next-error-btn-text)","background":"var(--next-error-btn-bg)","border":"var(--next-error-btn-border)"},"children":"Reload"}]}]]}]}]}]]}],null,["$","$L4",null,{"children":["$","$5",null,{"name":"Next.MetadataOutlet","children":"$@6"}]}]]}],{},null,false,null]},null,false,"$@7"],["$","$1","h",{"children":[null,["$","$L8",null,{"children":"$L9"}],["$","div",null,{"hidden":true,"children":["$","$La",null,{"children":["$","$5",null,{"name":"Next.Metadata","children":"$Lb"}]}]}],null]}],false]],"m":"$undefined","G":["$c",[]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"MKsV9_ZtzPcZHC3V_SATf"} d:[] 7:"$Wd" 9:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]] diff --git a/apps/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc b/apps/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc index 8425c5e..0f92902 100644 --- a/apps/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +++ b/apps/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc @@ -1,5 +1,5 @@ 1:"$Sreact.fragment" 2:I[97367,["/_next/static/chunks/01xlw8hd842-c.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"OutletBoundary"] 3:"$Sreact.suspense" -0:{"rsc":["$","$1","c",{"children":[["$","html",null,{"id":"__next_error__","children":[["$","head",null,{"children":[["$","title",null,{"children":"500: This page couldn’t load"}],["$","style",null,{"dangerouslySetInnerHTML":{"__html":":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }"}}]]}],["$","body",null,{"children":["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","display":"flex","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"style":{"marginTop":"-32px","maxWidth":"325px","padding":"32px 28px","textAlign":"left"},"children":[["$","svg",null,{"width":"32","height":"32","viewBox":"-0.2 -1.5 32 32","fill":"none","style":{"marginBottom":"24px"},"children":["$","path",null,{"d":"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z","fill":"var(--next-error-title)"}]}],["$","h1",null,{"style":{"fontSize":"24px","fontWeight":500,"letterSpacing":"-0.02em","lineHeight":"32px","margin":"0 0 12px 0","color":"var(--next-error-title)"},"children":"This page couldn’t load"}],["$","p",null,{"style":{"fontSize":"14px","fontWeight":400,"lineHeight":"21px","margin":"0 0 20px 0","color":"var(--next-error-message)"},"children":"A server error occurred. Reload to try again."}],["$","form",null,{"style":{"margin":0},"children":["$","button",null,{"type":"submit","style":{"display":"inline-flex","alignItems":"center","justifyContent":"center","height":"32px","padding":"0 12px","fontSize":"14px","fontWeight":500,"lineHeight":"20px","borderRadius":"6px","cursor":"pointer","color":"var(--next-error-btn-text)","background":"var(--next-error-btn-bg)","border":"var(--next-error-btn-border)"},"children":"Reload"}]}]]}]}]}]]}],null,["$","$L2",null,{"children":["$","$3",null,{"name":"Next.MetadataOutlet","children":"$@4"}]}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"pcsiH5B97Wet0aRbzsRfL"} +0:{"rsc":["$","$1","c",{"children":[["$","html",null,{"id":"__next_error__","children":[["$","head",null,{"children":[["$","title",null,{"children":"500: This page couldn’t load"}],["$","style",null,{"dangerouslySetInnerHTML":{"__html":":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }"}}]]}],["$","body",null,{"children":["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","display":"flex","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"style":{"marginTop":"-32px","maxWidth":"325px","padding":"32px 28px","textAlign":"left"},"children":[["$","svg",null,{"width":"32","height":"32","viewBox":"-0.2 -1.5 32 32","fill":"none","style":{"marginBottom":"24px"},"children":["$","path",null,{"d":"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z","fill":"var(--next-error-title)"}]}],["$","h1",null,{"style":{"fontSize":"24px","fontWeight":500,"letterSpacing":"-0.02em","lineHeight":"32px","margin":"0 0 12px 0","color":"var(--next-error-title)"},"children":"This page couldn’t load"}],["$","p",null,{"style":{"fontSize":"14px","fontWeight":400,"lineHeight":"21px","margin":"0 0 20px 0","color":"var(--next-error-message)"},"children":"A server error occurred. Reload to try again."}],["$","form",null,{"style":{"margin":0},"children":["$","button",null,{"type":"submit","style":{"display":"inline-flex","alignItems":"center","justifyContent":"center","height":"32px","padding":"0 12px","fontSize":"14px","fontWeight":500,"lineHeight":"20px","borderRadius":"6px","cursor":"pointer","color":"var(--next-error-btn-text)","background":"var(--next-error-btn-bg)","border":"var(--next-error-btn-border)"},"children":"Reload"}]}]]}]}]}]]}],null,["$","$L2",null,{"children":["$","$3",null,{"name":"Next.MetadataOutlet","children":"$@4"}]}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"MKsV9_ZtzPcZHC3V_SATf"} 4:null diff --git a/apps/web/.next/server/app/_global-error.segments/_full.segment.rsc b/apps/web/.next/server/app/_global-error.segments/_full.segment.rsc index 148db86..99e6a8d 100644 --- a/apps/web/.next/server/app/_global-error.segments/_full.segment.rsc +++ b/apps/web/.next/server/app/_global-error.segments/_full.segment.rsc @@ -6,7 +6,7 @@ 8:I[97367,["/_next/static/chunks/01xlw8hd842-c.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"ViewportBoundary"] a:I[97367,["/_next/static/chunks/01xlw8hd842-c.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"MetadataBoundary"] c:I[68027,["/_next/static/chunks/01xlw8hd842-c.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default",1] -0:{"P":null,"c":["","_global-error"],"q":"","i":false,"f":[[["",{"children":["__PAGE__",{}]}],[["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[["$","html",null,{"id":"__next_error__","children":[["$","head",null,{"children":[["$","title",null,{"children":"500: This page couldn’t load"}],["$","style",null,{"dangerouslySetInnerHTML":{"__html":":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }"}}]]}],["$","body",null,{"children":["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","display":"flex","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"style":{"marginTop":"-32px","maxWidth":"325px","padding":"32px 28px","textAlign":"left"},"children":[["$","svg",null,{"width":"32","height":"32","viewBox":"-0.2 -1.5 32 32","fill":"none","style":{"marginBottom":"24px"},"children":["$","path",null,{"d":"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z","fill":"var(--next-error-title)"}]}],["$","h1",null,{"style":{"fontSize":"24px","fontWeight":500,"letterSpacing":"-0.02em","lineHeight":"32px","margin":"0 0 12px 0","color":"var(--next-error-title)"},"children":"This page couldn’t load"}],["$","p",null,{"style":{"fontSize":"14px","fontWeight":400,"lineHeight":"21px","margin":"0 0 20px 0","color":"var(--next-error-message)"},"children":"A server error occurred. Reload to try again."}],["$","form",null,{"style":{"margin":0},"children":["$","button",null,{"type":"submit","style":{"display":"inline-flex","alignItems":"center","justifyContent":"center","height":"32px","padding":"0 12px","fontSize":"14px","fontWeight":500,"lineHeight":"20px","borderRadius":"6px","cursor":"pointer","color":"var(--next-error-btn-text)","background":"var(--next-error-btn-bg)","border":"var(--next-error-btn-border)"},"children":"Reload"}]}]]}]}]}]]}],null,["$","$L4",null,{"children":["$","$5",null,{"name":"Next.MetadataOutlet","children":"$@6"}]}]]}],{},null,false,null]},null,false,"$@7"],["$","$1","h",{"children":[null,["$","$L8",null,{"children":"$L9"}],["$","div",null,{"hidden":true,"children":["$","$La",null,{"children":["$","$5",null,{"name":"Next.Metadata","children":"$Lb"}]}]}],null]}],false]],"m":"$undefined","G":["$c",[]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"pcsiH5B97Wet0aRbzsRfL"} +0:{"P":null,"c":["","_global-error"],"q":"","i":false,"f":[[["",{"children":["__PAGE__",{}]}],[["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[["$","html",null,{"id":"__next_error__","children":[["$","head",null,{"children":[["$","title",null,{"children":"500: This page couldn’t load"}],["$","style",null,{"dangerouslySetInnerHTML":{"__html":":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }"}}]]}],["$","body",null,{"children":["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","display":"flex","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"style":{"marginTop":"-32px","maxWidth":"325px","padding":"32px 28px","textAlign":"left"},"children":[["$","svg",null,{"width":"32","height":"32","viewBox":"-0.2 -1.5 32 32","fill":"none","style":{"marginBottom":"24px"},"children":["$","path",null,{"d":"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z","fill":"var(--next-error-title)"}]}],["$","h1",null,{"style":{"fontSize":"24px","fontWeight":500,"letterSpacing":"-0.02em","lineHeight":"32px","margin":"0 0 12px 0","color":"var(--next-error-title)"},"children":"This page couldn’t load"}],["$","p",null,{"style":{"fontSize":"14px","fontWeight":400,"lineHeight":"21px","margin":"0 0 20px 0","color":"var(--next-error-message)"},"children":"A server error occurred. Reload to try again."}],["$","form",null,{"style":{"margin":0},"children":["$","button",null,{"type":"submit","style":{"display":"inline-flex","alignItems":"center","justifyContent":"center","height":"32px","padding":"0 12px","fontSize":"14px","fontWeight":500,"lineHeight":"20px","borderRadius":"6px","cursor":"pointer","color":"var(--next-error-btn-text)","background":"var(--next-error-btn-bg)","border":"var(--next-error-btn-border)"},"children":"Reload"}]}]]}]}]}]]}],null,["$","$L4",null,{"children":["$","$5",null,{"name":"Next.MetadataOutlet","children":"$@6"}]}]]}],{},null,false,null]},null,false,"$@7"],["$","$1","h",{"children":[null,["$","$L8",null,{"children":"$L9"}],["$","div",null,{"hidden":true,"children":["$","$La",null,{"children":["$","$5",null,{"name":"Next.Metadata","children":"$Lb"}]}]}],null]}],false]],"m":"$undefined","G":["$c",[]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"MKsV9_ZtzPcZHC3V_SATf"} d:[] 7:"$Wd" 9:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]] diff --git a/apps/web/.next/server/app/_global-error.segments/_head.segment.rsc b/apps/web/.next/server/app/_global-error.segments/_head.segment.rsc index cb1ba6d..7d538ee 100644 --- a/apps/web/.next/server/app/_global-error.segments/_head.segment.rsc +++ b/apps/web/.next/server/app/_global-error.segments/_head.segment.rsc @@ -3,4 +3,4 @@ 3:I[97367,["/_next/static/chunks/01xlw8hd842-c.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"MetadataBoundary"] 4:"$Sreact.suspense" 5:I[27201,["/_next/static/chunks/01xlw8hd842-c.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"IconMark"] -0:{"rsc":["$","$1","h",{"children":[null,["$","$L2",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]}],["$","div",null,{"hidden":true,"children":["$","$L3",null,{"children":["$","$4",null,{"name":"Next.Metadata","children":[["$","link","0",{"rel":"icon","href":"/favicon.ico?favicon.0x3dzn~oxb6tn.ico","sizes":"256x256","type":"image/x-icon"}],["$","$L5","1",{}]]}]}]}],null]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"pcsiH5B97Wet0aRbzsRfL"} +0:{"rsc":["$","$1","h",{"children":[null,["$","$L2",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]}],["$","div",null,{"hidden":true,"children":["$","$L3",null,{"children":["$","$4",null,{"name":"Next.Metadata","children":[["$","link","0",{"rel":"icon","href":"/favicon.ico?favicon.0x3dzn~oxb6tn.ico","sizes":"256x256","type":"image/x-icon"}],["$","$L5","1",{}]]}]}]}],null]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"MKsV9_ZtzPcZHC3V_SATf"} diff --git a/apps/web/.next/server/app/_global-error.segments/_index.segment.rsc b/apps/web/.next/server/app/_global-error.segments/_index.segment.rsc index bde85dd..5f33639 100644 --- a/apps/web/.next/server/app/_global-error.segments/_index.segment.rsc +++ b/apps/web/.next/server/app/_global-error.segments/_index.segment.rsc @@ -2,4 +2,4 @@ 2:I[39756,["/_next/static/chunks/01xlw8hd842-c.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default"] 3:I[37457,["/_next/static/chunks/01xlw8hd842-c.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default"] 4:[] -0:{"rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"isPartial":false,"staleTime":300,"varyParams":"$W4","buildId":"pcsiH5B97Wet0aRbzsRfL"} +0:{"rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"isPartial":false,"staleTime":300,"varyParams":"$W4","buildId":"MKsV9_ZtzPcZHC3V_SATf"} diff --git a/apps/web/.next/server/app/_global-error.segments/_tree.segment.rsc b/apps/web/.next/server/app/_global-error.segments/_tree.segment.rsc index ce81979..b7d733e 100644 --- a/apps/web/.next/server/app/_global-error.segments/_tree.segment.rsc +++ b/apps/web/.next/server/app/_global-error.segments/_tree.segment.rsc @@ -1 +1 @@ -0:{"tree":{"name":"","param":null,"prefetchHints":0,"slots":{"children":{"name":"__PAGE__","param":null,"prefetchHints":0,"slots":null}}},"staleTime":300,"buildId":"pcsiH5B97Wet0aRbzsRfL"} +0:{"tree":{"name":"","param":null,"prefetchHints":0,"slots":{"children":{"name":"__PAGE__","param":null,"prefetchHints":0,"slots":null}}},"staleTime":300,"buildId":"MKsV9_ZtzPcZHC3V_SATf"} diff --git a/apps/web/.next/server/app/_not-found.html b/apps/web/.next/server/app/_not-found.html index 03700ab..833c1d2 100644 --- a/apps/web/.next/server/app/_not-found.html +++ b/apps/web/.next/server/app/_not-found.html @@ -1 +1 @@ -404: This page could not be found.TimeToLeave

ÖBB Planner

404

This page could not be found.

\ No newline at end of file +404: This page could not be found.TimeToLeave

ÖBB Planner

404

This page could not be found.

\ No newline at end of file diff --git a/apps/web/.next/server/app/_not-found.rsc b/apps/web/.next/server/app/_not-found.rsc index 3583673..ffaac42 100644 --- a/apps/web/.next/server/app/_not-found.rsc +++ b/apps/web/.next/server/app/_not-found.rsc @@ -12,7 +12,7 @@ d:I[97367,["/_next/static/chunks/00hu_su7n8gvm.js","/_next/static/chunks/0d3shmw f:I[97367,["/_next/static/chunks/00hu_su7n8gvm.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"MetadataBoundary"] 11:I[68027,["/_next/static/chunks/00hu_su7n8gvm.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default",1] :HL["/_next/static/chunks/09kgf98j6rdse.css","style"] -0:{"P":null,"c":["","_not-found"],"q":"","i":false,"f":[[["",{"children":["/_not-found",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",16],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/09kgf98j6rdse.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/_next/static/chunks/00hu_su7n8gvm.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/0d3shmwh5_nmn.js","async":true,"nonce":"$undefined"}]],["$","html",null,{"lang":"en","className":"h-full antialiased","children":["$","body",null,{"className":"min-h-full flex flex-col bg-gray-50 dark:bg-gray-900","children":["$","$L2",null,{"children":["$","$L3",null,{"children":[["$","$L4",null,{}],["$","$L5",null,{}],["$","div",null,{"className":"flex-1","children":["$","$L6",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L7",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}],["$","$L8",null,{}]]}]}]}]}]]}],{"children":[["$","$1","c",{"children":[null,["$","$L6",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L7",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:children:2:props:children:props:notFound:0:1:props:style","children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:children:2:props:children:props:notFound:0:1:props:children:props:children:1:props:style","children":404}],["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:children:2:props:children:props:notFound:0:1:props:children:props:children:2:props:style","children":["$","h2",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:children:2:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style","children":"This page could not be found."}]}]]}]}]],null,["$","$L9",null,{"children":["$","$a",null,{"name":"Next.MetadataOutlet","children":"$@b"}]}]]}],{},null,false,null]},null,false,"$@c"]},null,false,null],["$","$1","h",{"children":[["$","meta",null,{"name":"robots","content":"noindex"}],["$","$Ld",null,{"children":"$Le"}],["$","div",null,{"hidden":true,"children":["$","$Lf",null,{"children":["$","$a",null,{"name":"Next.Metadata","children":"$L10"}]}]}],null]}],false]],"m":"$undefined","G":["$11",[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/09kgf98j6rdse.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"pcsiH5B97Wet0aRbzsRfL"} +0:{"P":null,"c":["","_not-found"],"q":"","i":false,"f":[[["",{"children":["/_not-found",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",16],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/09kgf98j6rdse.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/_next/static/chunks/00hu_su7n8gvm.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/0d3shmwh5_nmn.js","async":true,"nonce":"$undefined"}]],["$","html",null,{"lang":"en","className":"h-full antialiased","children":["$","body",null,{"className":"min-h-full flex flex-col bg-gray-50 dark:bg-gray-900","children":["$","$L2",null,{"children":["$","$L3",null,{"children":[["$","$L4",null,{}],["$","$L5",null,{}],["$","div",null,{"className":"flex-1","children":["$","$L6",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L7",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}],["$","$L8",null,{}]]}]}]}]}]]}],{"children":[["$","$1","c",{"children":[null,["$","$L6",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L7",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:children:2:props:children:props:notFound:0:1:props:style","children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:children:2:props:children:props:notFound:0:1:props:children:props:children:1:props:style","children":404}],["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:children:2:props:children:props:notFound:0:1:props:children:props:children:2:props:style","children":["$","h2",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:children:2:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style","children":"This page could not be found."}]}]]}]}]],null,["$","$L9",null,{"children":["$","$a",null,{"name":"Next.MetadataOutlet","children":"$@b"}]}]]}],{},null,false,null]},null,false,"$@c"]},null,false,null],["$","$1","h",{"children":[["$","meta",null,{"name":"robots","content":"noindex"}],["$","$Ld",null,{"children":"$Le"}],["$","div",null,{"hidden":true,"children":["$","$Lf",null,{"children":["$","$a",null,{"name":"Next.Metadata","children":"$L10"}]}]}],null]}],false]],"m":"$undefined","G":["$11",[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/09kgf98j6rdse.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"MKsV9_ZtzPcZHC3V_SATf"} 12:[] c:"$W12" e:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]] diff --git a/apps/web/.next/server/app/_not-found.segments/_full.segment.rsc b/apps/web/.next/server/app/_not-found.segments/_full.segment.rsc index 3583673..ffaac42 100644 --- a/apps/web/.next/server/app/_not-found.segments/_full.segment.rsc +++ b/apps/web/.next/server/app/_not-found.segments/_full.segment.rsc @@ -12,7 +12,7 @@ d:I[97367,["/_next/static/chunks/00hu_su7n8gvm.js","/_next/static/chunks/0d3shmw f:I[97367,["/_next/static/chunks/00hu_su7n8gvm.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"MetadataBoundary"] 11:I[68027,["/_next/static/chunks/00hu_su7n8gvm.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default",1] :HL["/_next/static/chunks/09kgf98j6rdse.css","style"] -0:{"P":null,"c":["","_not-found"],"q":"","i":false,"f":[[["",{"children":["/_not-found",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",16],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/09kgf98j6rdse.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/_next/static/chunks/00hu_su7n8gvm.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/0d3shmwh5_nmn.js","async":true,"nonce":"$undefined"}]],["$","html",null,{"lang":"en","className":"h-full antialiased","children":["$","body",null,{"className":"min-h-full flex flex-col bg-gray-50 dark:bg-gray-900","children":["$","$L2",null,{"children":["$","$L3",null,{"children":[["$","$L4",null,{}],["$","$L5",null,{}],["$","div",null,{"className":"flex-1","children":["$","$L6",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L7",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}],["$","$L8",null,{}]]}]}]}]}]]}],{"children":[["$","$1","c",{"children":[null,["$","$L6",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L7",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:children:2:props:children:props:notFound:0:1:props:style","children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:children:2:props:children:props:notFound:0:1:props:children:props:children:1:props:style","children":404}],["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:children:2:props:children:props:notFound:0:1:props:children:props:children:2:props:style","children":["$","h2",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:children:2:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style","children":"This page could not be found."}]}]]}]}]],null,["$","$L9",null,{"children":["$","$a",null,{"name":"Next.MetadataOutlet","children":"$@b"}]}]]}],{},null,false,null]},null,false,"$@c"]},null,false,null],["$","$1","h",{"children":[["$","meta",null,{"name":"robots","content":"noindex"}],["$","$Ld",null,{"children":"$Le"}],["$","div",null,{"hidden":true,"children":["$","$Lf",null,{"children":["$","$a",null,{"name":"Next.Metadata","children":"$L10"}]}]}],null]}],false]],"m":"$undefined","G":["$11",[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/09kgf98j6rdse.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"pcsiH5B97Wet0aRbzsRfL"} +0:{"P":null,"c":["","_not-found"],"q":"","i":false,"f":[[["",{"children":["/_not-found",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",16],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/09kgf98j6rdse.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/_next/static/chunks/00hu_su7n8gvm.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/0d3shmwh5_nmn.js","async":true,"nonce":"$undefined"}]],["$","html",null,{"lang":"en","className":"h-full antialiased","children":["$","body",null,{"className":"min-h-full flex flex-col bg-gray-50 dark:bg-gray-900","children":["$","$L2",null,{"children":["$","$L3",null,{"children":[["$","$L4",null,{}],["$","$L5",null,{}],["$","div",null,{"className":"flex-1","children":["$","$L6",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L7",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}],["$","$L8",null,{}]]}]}]}]}]]}],{"children":[["$","$1","c",{"children":[null,["$","$L6",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L7",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:children:2:props:children:props:notFound:0:1:props:style","children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:children:2:props:children:props:notFound:0:1:props:children:props:children:1:props:style","children":404}],["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:children:2:props:children:props:notFound:0:1:props:children:props:children:2:props:style","children":["$","h2",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:children:2:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style","children":"This page could not be found."}]}]]}]}]],null,["$","$L9",null,{"children":["$","$a",null,{"name":"Next.MetadataOutlet","children":"$@b"}]}]]}],{},null,false,null]},null,false,"$@c"]},null,false,null],["$","$1","h",{"children":[["$","meta",null,{"name":"robots","content":"noindex"}],["$","$Ld",null,{"children":"$Le"}],["$","div",null,{"hidden":true,"children":["$","$Lf",null,{"children":["$","$a",null,{"name":"Next.Metadata","children":"$L10"}]}]}],null]}],false]],"m":"$undefined","G":["$11",[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/09kgf98j6rdse.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"MKsV9_ZtzPcZHC3V_SATf"} 12:[] c:"$W12" e:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]] diff --git a/apps/web/.next/server/app/_not-found.segments/_head.segment.rsc b/apps/web/.next/server/app/_not-found.segments/_head.segment.rsc index 9c7749e..132ede1 100644 --- a/apps/web/.next/server/app/_not-found.segments/_head.segment.rsc +++ b/apps/web/.next/server/app/_not-found.segments/_head.segment.rsc @@ -3,4 +3,4 @@ 3:I[97367,["/_next/static/chunks/00hu_su7n8gvm.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"MetadataBoundary"] 4:"$Sreact.suspense" 5:I[27201,["/_next/static/chunks/00hu_su7n8gvm.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"IconMark"] -0:{"rsc":["$","$1","h",{"children":[["$","meta",null,{"name":"robots","content":"noindex"}],["$","$L2",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]}],["$","div",null,{"hidden":true,"children":["$","$L3",null,{"children":["$","$4",null,{"name":"Next.Metadata","children":[["$","title","0",{"children":"TimeToLeave"}],["$","meta","1",{"name":"description","content":"Plan your train journeys and compare with bicycle routing"}],["$","link","2",{"rel":"icon","href":"/favicon.ico?favicon.0x3dzn~oxb6tn.ico","sizes":"256x256","type":"image/x-icon"}],["$","$L5","3",{}]]}]}]}],null]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"pcsiH5B97Wet0aRbzsRfL"} +0:{"rsc":["$","$1","h",{"children":[["$","meta",null,{"name":"robots","content":"noindex"}],["$","$L2",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]}],["$","div",null,{"hidden":true,"children":["$","$L3",null,{"children":["$","$4",null,{"name":"Next.Metadata","children":[["$","title","0",{"children":"TimeToLeave"}],["$","meta","1",{"name":"description","content":"Plan your train journeys and compare with bicycle routing"}],["$","link","2",{"rel":"icon","href":"/favicon.ico?favicon.0x3dzn~oxb6tn.ico","sizes":"256x256","type":"image/x-icon"}],["$","$L5","3",{}]]}]}]}],null]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"MKsV9_ZtzPcZHC3V_SATf"} diff --git a/apps/web/.next/server/app/_not-found.segments/_index.segment.rsc b/apps/web/.next/server/app/_not-found.segments/_index.segment.rsc index 5a09784..bf761b9 100644 --- a/apps/web/.next/server/app/_not-found.segments/_index.segment.rsc +++ b/apps/web/.next/server/app/_not-found.segments/_index.segment.rsc @@ -7,4 +7,4 @@ 7:I[37457,["/_next/static/chunks/00hu_su7n8gvm.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default"] 8:I[4035,["/_next/static/chunks/00hu_su7n8gvm.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default"] :HL["/_next/static/chunks/09kgf98j6rdse.css","style"] -0:{"rsc":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/09kgf98j6rdse.css","precedence":"next"}],["$","script","script-0",{"src":"/_next/static/chunks/00hu_su7n8gvm.js","async":true}],["$","script","script-1",{"src":"/_next/static/chunks/0d3shmwh5_nmn.js","async":true}]],["$","html",null,{"lang":"en","className":"h-full antialiased","children":["$","body",null,{"className":"min-h-full flex flex-col bg-gray-50 dark:bg-gray-900","children":["$","$L2",null,{"children":["$","$L3",null,{"children":[["$","$L4",null,{}],["$","$L5",null,{}],["$","div",null,{"className":"flex-1","children":["$","$L6",null,{"parallelRouterKey":"children","template":["$","$L7",null,{}],"notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]]}]}],["$","$L8",null,{}]]}]}]}]}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"pcsiH5B97Wet0aRbzsRfL"} +0:{"rsc":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/09kgf98j6rdse.css","precedence":"next"}],["$","script","script-0",{"src":"/_next/static/chunks/00hu_su7n8gvm.js","async":true}],["$","script","script-1",{"src":"/_next/static/chunks/0d3shmwh5_nmn.js","async":true}]],["$","html",null,{"lang":"en","className":"h-full antialiased","children":["$","body",null,{"className":"min-h-full flex flex-col bg-gray-50 dark:bg-gray-900","children":["$","$L2",null,{"children":["$","$L3",null,{"children":[["$","$L4",null,{}],["$","$L5",null,{}],["$","div",null,{"className":"flex-1","children":["$","$L6",null,{"parallelRouterKey":"children","template":["$","$L7",null,{}],"notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]]}]}],["$","$L8",null,{}]]}]}]}]}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"MKsV9_ZtzPcZHC3V_SATf"} diff --git a/apps/web/.next/server/app/_not-found.segments/_not-found.segment.rsc b/apps/web/.next/server/app/_not-found.segments/_not-found.segment.rsc index 6c43037..82fcaa6 100644 --- a/apps/web/.next/server/app/_not-found.segments/_not-found.segment.rsc +++ b/apps/web/.next/server/app/_not-found.segments/_not-found.segment.rsc @@ -2,4 +2,4 @@ 2:I[39756,["/_next/static/chunks/00hu_su7n8gvm.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default"] 3:I[37457,["/_next/static/chunks/00hu_su7n8gvm.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default"] 4:[] -0:{"rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"isPartial":false,"staleTime":300,"varyParams":"$W4","buildId":"pcsiH5B97Wet0aRbzsRfL"} +0:{"rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"isPartial":false,"staleTime":300,"varyParams":"$W4","buildId":"MKsV9_ZtzPcZHC3V_SATf"} diff --git a/apps/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc b/apps/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc index 6f7ff03..71eec2a 100644 --- a/apps/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +++ b/apps/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc @@ -1,5 +1,5 @@ 1:"$Sreact.fragment" 2:I[97367,["/_next/static/chunks/00hu_su7n8gvm.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"OutletBoundary"] 3:"$Sreact.suspense" -0:{"rsc":["$","$1","c",{"children":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],null,["$","$L2",null,{"children":["$","$3",null,{"name":"Next.MetadataOutlet","children":"$@4"}]}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"pcsiH5B97Wet0aRbzsRfL"} +0:{"rsc":["$","$1","c",{"children":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],null,["$","$L2",null,{"children":["$","$3",null,{"name":"Next.MetadataOutlet","children":"$@4"}]}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"MKsV9_ZtzPcZHC3V_SATf"} 4:null diff --git a/apps/web/.next/server/app/_not-found.segments/_tree.segment.rsc b/apps/web/.next/server/app/_not-found.segments/_tree.segment.rsc index 7e00272..f73891c 100644 --- a/apps/web/.next/server/app/_not-found.segments/_tree.segment.rsc +++ b/apps/web/.next/server/app/_not-found.segments/_tree.segment.rsc @@ -1,2 +1,2 @@ :HL["/_next/static/chunks/09kgf98j6rdse.css","style"] -0:{"tree":{"name":"","param":null,"prefetchHints":16,"slots":{"children":{"name":"/_not-found","param":null,"prefetchHints":0,"slots":{"children":{"name":"__PAGE__","param":null,"prefetchHints":0,"slots":null}}}}},"staleTime":300,"buildId":"pcsiH5B97Wet0aRbzsRfL"} +0:{"tree":{"name":"","param":null,"prefetchHints":16,"slots":{"children":{"name":"/_not-found","param":null,"prefetchHints":0,"slots":{"children":{"name":"__PAGE__","param":null,"prefetchHints":0,"slots":null}}}}},"staleTime":300,"buildId":"MKsV9_ZtzPcZHC3V_SATf"} diff --git a/apps/web/.next/server/app/calendar.html b/apps/web/.next/server/app/calendar.html index 84da71f..33d7afd 100644 --- a/apps/web/.next/server/app/calendar.html +++ b/apps/web/.next/server/app/calendar.html @@ -46,14 +46,14 @@ ">
9
10
11
10
11
31

No events scheduled for May 10, 2026

\ No newline at end of file + ">
31

No events scheduled for May 11, 2026

\ No newline at end of file diff --git a/apps/web/.next/server/app/calendar.rsc b/apps/web/.next/server/app/calendar.rsc index aa8cec3..9446ba3 100644 --- a/apps/web/.next/server/app/calendar.rsc +++ b/apps/web/.next/server/app/calendar.rsc @@ -14,7 +14,7 @@ e:"$Sreact.suspense" 13:I[97367,["/_next/static/chunks/00hu_su7n8gvm.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"MetadataBoundary"] 15:I[68027,["/_next/static/chunks/00hu_su7n8gvm.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default",1] :HL["/_next/static/chunks/09kgf98j6rdse.css","style"] -0:{"P":null,"c":["","calendar"],"q":"","i":false,"f":[[["",{"children":["calendar",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",16],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/09kgf98j6rdse.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/_next/static/chunks/00hu_su7n8gvm.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/0d3shmwh5_nmn.js","async":true,"nonce":"$undefined"}]],["$","html",null,{"lang":"en","className":"h-full antialiased","children":["$","body",null,{"className":"min-h-full flex flex-col bg-gray-50 dark:bg-gray-900","children":["$","$L2",null,{"children":["$","$L3",null,{"children":[["$","$L4",null,{}],["$","$L5",null,{}],["$","div",null,{"className":"flex-1","children":["$","$L6",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L7",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}],["$","$L8",null,{}]]}]}]}]}]]}],{"children":[["$","$1","c",{"children":[null,["$","$L6",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L7",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[["$","$L9",null,{"Component":"$a","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@b","$@c"]}}],[["$","script","script-0",{"src":"/_next/static/chunks/14vq9o7udvkff.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/14ve6ufh4xnra.js","async":true,"nonce":"$undefined"}]],["$","$Ld",null,{"children":["$","$e",null,{"name":"Next.MetadataOutlet","children":"$@f"}]}]]}],{},null,false,null]},null,false,"$@10"]},null,false,null],["$","$1","h",{"children":[null,["$","$L11",null,{"children":"$L12"}],["$","div",null,{"hidden":true,"children":["$","$L13",null,{"children":["$","$e",null,{"name":"Next.Metadata","children":"$L14"}]}]}],null]}],false]],"m":"$undefined","G":["$15",[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/09kgf98j6rdse.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"pcsiH5B97Wet0aRbzsRfL"} +0:{"P":null,"c":["","calendar"],"q":"","i":false,"f":[[["",{"children":["calendar",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",16],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/09kgf98j6rdse.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/_next/static/chunks/00hu_su7n8gvm.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/0d3shmwh5_nmn.js","async":true,"nonce":"$undefined"}]],["$","html",null,{"lang":"en","className":"h-full antialiased","children":["$","body",null,{"className":"min-h-full flex flex-col bg-gray-50 dark:bg-gray-900","children":["$","$L2",null,{"children":["$","$L3",null,{"children":[["$","$L4",null,{}],["$","$L5",null,{}],["$","div",null,{"className":"flex-1","children":["$","$L6",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L7",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}],["$","$L8",null,{}]]}]}]}]}]]}],{"children":[["$","$1","c",{"children":[null,["$","$L6",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L7",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[["$","$L9",null,{"Component":"$a","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@b","$@c"]}}],[["$","script","script-0",{"src":"/_next/static/chunks/14vq9o7udvkff.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/14ve6ufh4xnra.js","async":true,"nonce":"$undefined"}]],["$","$Ld",null,{"children":["$","$e",null,{"name":"Next.MetadataOutlet","children":"$@f"}]}]]}],{},null,false,null]},null,false,"$@10"]},null,false,null],["$","$1","h",{"children":[null,["$","$L11",null,{"children":"$L12"}],["$","div",null,{"hidden":true,"children":["$","$L13",null,{"children":["$","$e",null,{"name":"Next.Metadata","children":"$L14"}]}]}],null]}],false]],"m":"$undefined","G":["$15",[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/09kgf98j6rdse.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"MKsV9_ZtzPcZHC3V_SATf"} 16:[] 10:"$W16" b:{} diff --git a/apps/web/.next/server/app/calendar.segments/_full.segment.rsc b/apps/web/.next/server/app/calendar.segments/_full.segment.rsc index aa8cec3..9446ba3 100644 --- a/apps/web/.next/server/app/calendar.segments/_full.segment.rsc +++ b/apps/web/.next/server/app/calendar.segments/_full.segment.rsc @@ -14,7 +14,7 @@ e:"$Sreact.suspense" 13:I[97367,["/_next/static/chunks/00hu_su7n8gvm.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"MetadataBoundary"] 15:I[68027,["/_next/static/chunks/00hu_su7n8gvm.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default",1] :HL["/_next/static/chunks/09kgf98j6rdse.css","style"] -0:{"P":null,"c":["","calendar"],"q":"","i":false,"f":[[["",{"children":["calendar",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",16],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/09kgf98j6rdse.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/_next/static/chunks/00hu_su7n8gvm.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/0d3shmwh5_nmn.js","async":true,"nonce":"$undefined"}]],["$","html",null,{"lang":"en","className":"h-full antialiased","children":["$","body",null,{"className":"min-h-full flex flex-col bg-gray-50 dark:bg-gray-900","children":["$","$L2",null,{"children":["$","$L3",null,{"children":[["$","$L4",null,{}],["$","$L5",null,{}],["$","div",null,{"className":"flex-1","children":["$","$L6",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L7",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}],["$","$L8",null,{}]]}]}]}]}]]}],{"children":[["$","$1","c",{"children":[null,["$","$L6",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L7",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[["$","$L9",null,{"Component":"$a","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@b","$@c"]}}],[["$","script","script-0",{"src":"/_next/static/chunks/14vq9o7udvkff.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/14ve6ufh4xnra.js","async":true,"nonce":"$undefined"}]],["$","$Ld",null,{"children":["$","$e",null,{"name":"Next.MetadataOutlet","children":"$@f"}]}]]}],{},null,false,null]},null,false,"$@10"]},null,false,null],["$","$1","h",{"children":[null,["$","$L11",null,{"children":"$L12"}],["$","div",null,{"hidden":true,"children":["$","$L13",null,{"children":["$","$e",null,{"name":"Next.Metadata","children":"$L14"}]}]}],null]}],false]],"m":"$undefined","G":["$15",[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/09kgf98j6rdse.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"pcsiH5B97Wet0aRbzsRfL"} +0:{"P":null,"c":["","calendar"],"q":"","i":false,"f":[[["",{"children":["calendar",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",16],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/09kgf98j6rdse.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/_next/static/chunks/00hu_su7n8gvm.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/0d3shmwh5_nmn.js","async":true,"nonce":"$undefined"}]],["$","html",null,{"lang":"en","className":"h-full antialiased","children":["$","body",null,{"className":"min-h-full flex flex-col bg-gray-50 dark:bg-gray-900","children":["$","$L2",null,{"children":["$","$L3",null,{"children":[["$","$L4",null,{}],["$","$L5",null,{}],["$","div",null,{"className":"flex-1","children":["$","$L6",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L7",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}],["$","$L8",null,{}]]}]}]}]}]]}],{"children":[["$","$1","c",{"children":[null,["$","$L6",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L7",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[["$","$L9",null,{"Component":"$a","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@b","$@c"]}}],[["$","script","script-0",{"src":"/_next/static/chunks/14vq9o7udvkff.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/14ve6ufh4xnra.js","async":true,"nonce":"$undefined"}]],["$","$Ld",null,{"children":["$","$e",null,{"name":"Next.MetadataOutlet","children":"$@f"}]}]]}],{},null,false,null]},null,false,"$@10"]},null,false,null],["$","$1","h",{"children":[null,["$","$L11",null,{"children":"$L12"}],["$","div",null,{"hidden":true,"children":["$","$L13",null,{"children":["$","$e",null,{"name":"Next.Metadata","children":"$L14"}]}]}],null]}],false]],"m":"$undefined","G":["$15",[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/09kgf98j6rdse.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"MKsV9_ZtzPcZHC3V_SATf"} 16:[] 10:"$W16" b:{} diff --git a/apps/web/.next/server/app/calendar.segments/_head.segment.rsc b/apps/web/.next/server/app/calendar.segments/_head.segment.rsc index efd3abd..4855c97 100644 --- a/apps/web/.next/server/app/calendar.segments/_head.segment.rsc +++ b/apps/web/.next/server/app/calendar.segments/_head.segment.rsc @@ -3,4 +3,4 @@ 3:I[97367,["/_next/static/chunks/00hu_su7n8gvm.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"MetadataBoundary"] 4:"$Sreact.suspense" 5:I[27201,["/_next/static/chunks/00hu_su7n8gvm.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"IconMark"] -0:{"rsc":["$","$1","h",{"children":[null,["$","$L2",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]}],["$","div",null,{"hidden":true,"children":["$","$L3",null,{"children":["$","$4",null,{"name":"Next.Metadata","children":[["$","title","0",{"children":"TimeToLeave"}],["$","meta","1",{"name":"description","content":"Plan your train journeys and compare with bicycle routing"}],["$","link","2",{"rel":"icon","href":"/favicon.ico?favicon.0x3dzn~oxb6tn.ico","sizes":"256x256","type":"image/x-icon"}],["$","$L5","3",{}]]}]}]}],null]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"pcsiH5B97Wet0aRbzsRfL"} +0:{"rsc":["$","$1","h",{"children":[null,["$","$L2",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]}],["$","div",null,{"hidden":true,"children":["$","$L3",null,{"children":["$","$4",null,{"name":"Next.Metadata","children":[["$","title","0",{"children":"TimeToLeave"}],["$","meta","1",{"name":"description","content":"Plan your train journeys and compare with bicycle routing"}],["$","link","2",{"rel":"icon","href":"/favicon.ico?favicon.0x3dzn~oxb6tn.ico","sizes":"256x256","type":"image/x-icon"}],["$","$L5","3",{}]]}]}]}],null]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"MKsV9_ZtzPcZHC3V_SATf"} diff --git a/apps/web/.next/server/app/calendar.segments/_index.segment.rsc b/apps/web/.next/server/app/calendar.segments/_index.segment.rsc index 5a09784..bf761b9 100644 --- a/apps/web/.next/server/app/calendar.segments/_index.segment.rsc +++ b/apps/web/.next/server/app/calendar.segments/_index.segment.rsc @@ -7,4 +7,4 @@ 7:I[37457,["/_next/static/chunks/00hu_su7n8gvm.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default"] 8:I[4035,["/_next/static/chunks/00hu_su7n8gvm.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default"] :HL["/_next/static/chunks/09kgf98j6rdse.css","style"] -0:{"rsc":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/09kgf98j6rdse.css","precedence":"next"}],["$","script","script-0",{"src":"/_next/static/chunks/00hu_su7n8gvm.js","async":true}],["$","script","script-1",{"src":"/_next/static/chunks/0d3shmwh5_nmn.js","async":true}]],["$","html",null,{"lang":"en","className":"h-full antialiased","children":["$","body",null,{"className":"min-h-full flex flex-col bg-gray-50 dark:bg-gray-900","children":["$","$L2",null,{"children":["$","$L3",null,{"children":[["$","$L4",null,{}],["$","$L5",null,{}],["$","div",null,{"className":"flex-1","children":["$","$L6",null,{"parallelRouterKey":"children","template":["$","$L7",null,{}],"notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]]}]}],["$","$L8",null,{}]]}]}]}]}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"pcsiH5B97Wet0aRbzsRfL"} +0:{"rsc":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/09kgf98j6rdse.css","precedence":"next"}],["$","script","script-0",{"src":"/_next/static/chunks/00hu_su7n8gvm.js","async":true}],["$","script","script-1",{"src":"/_next/static/chunks/0d3shmwh5_nmn.js","async":true}]],["$","html",null,{"lang":"en","className":"h-full antialiased","children":["$","body",null,{"className":"min-h-full flex flex-col bg-gray-50 dark:bg-gray-900","children":["$","$L2",null,{"children":["$","$L3",null,{"children":[["$","$L4",null,{}],["$","$L5",null,{}],["$","div",null,{"className":"flex-1","children":["$","$L6",null,{"parallelRouterKey":"children","template":["$","$L7",null,{}],"notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]]}]}],["$","$L8",null,{}]]}]}]}]}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"MKsV9_ZtzPcZHC3V_SATf"} diff --git a/apps/web/.next/server/app/calendar.segments/_tree.segment.rsc b/apps/web/.next/server/app/calendar.segments/_tree.segment.rsc index 5a87161..d29171d 100644 --- a/apps/web/.next/server/app/calendar.segments/_tree.segment.rsc +++ b/apps/web/.next/server/app/calendar.segments/_tree.segment.rsc @@ -1,2 +1,2 @@ :HL["/_next/static/chunks/09kgf98j6rdse.css","style"] -0:{"tree":{"name":"","param":null,"prefetchHints":16,"slots":{"children":{"name":"calendar","param":null,"prefetchHints":0,"slots":{"children":{"name":"__PAGE__","param":null,"prefetchHints":0,"slots":null}}}}},"staleTime":300,"buildId":"pcsiH5B97Wet0aRbzsRfL"} +0:{"tree":{"name":"","param":null,"prefetchHints":16,"slots":{"children":{"name":"calendar","param":null,"prefetchHints":0,"slots":{"children":{"name":"__PAGE__","param":null,"prefetchHints":0,"slots":null}}}}},"staleTime":300,"buildId":"MKsV9_ZtzPcZHC3V_SATf"} diff --git a/apps/web/.next/server/app/calendar.segments/calendar.segment.rsc b/apps/web/.next/server/app/calendar.segments/calendar.segment.rsc index 6c43037..82fcaa6 100644 --- a/apps/web/.next/server/app/calendar.segments/calendar.segment.rsc +++ b/apps/web/.next/server/app/calendar.segments/calendar.segment.rsc @@ -2,4 +2,4 @@ 2:I[39756,["/_next/static/chunks/00hu_su7n8gvm.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default"] 3:I[37457,["/_next/static/chunks/00hu_su7n8gvm.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default"] 4:[] -0:{"rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"isPartial":false,"staleTime":300,"varyParams":"$W4","buildId":"pcsiH5B97Wet0aRbzsRfL"} +0:{"rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"isPartial":false,"staleTime":300,"varyParams":"$W4","buildId":"MKsV9_ZtzPcZHC3V_SATf"} diff --git a/apps/web/.next/server/app/calendar.segments/calendar/__PAGE__.segment.rsc b/apps/web/.next/server/app/calendar.segments/calendar/__PAGE__.segment.rsc index 09c2a00..4b61339 100644 --- a/apps/web/.next/server/app/calendar.segments/calendar/__PAGE__.segment.rsc +++ b/apps/web/.next/server/app/calendar.segments/calendar/__PAGE__.segment.rsc @@ -3,7 +3,7 @@ 3:I[75505,["/_next/static/chunks/00hu_su7n8gvm.js","/_next/static/chunks/0d3shmwh5_nmn.js","/_next/static/chunks/14vq9o7udvkff.js","/_next/static/chunks/14ve6ufh4xnra.js"],"default"] 6:I[97367,["/_next/static/chunks/00hu_su7n8gvm.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"OutletBoundary"] 7:"$Sreact.suspense" -0:{"rsc":["$","$1","c",{"children":[["$","$L2",null,{"Component":"$3","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@4","$@5"]}}],[["$","script","script-0",{"src":"/_next/static/chunks/14vq9o7udvkff.js","async":true}],["$","script","script-1",{"src":"/_next/static/chunks/14ve6ufh4xnra.js","async":true}]],["$","$L6",null,{"children":["$","$7",null,{"name":"Next.MetadataOutlet","children":"$@8"}]}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"pcsiH5B97Wet0aRbzsRfL"} +0:{"rsc":["$","$1","c",{"children":[["$","$L2",null,{"Component":"$3","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@4","$@5"]}}],[["$","script","script-0",{"src":"/_next/static/chunks/14vq9o7udvkff.js","async":true}],["$","script","script-1",{"src":"/_next/static/chunks/14ve6ufh4xnra.js","async":true}]],["$","$L6",null,{"children":["$","$7",null,{"name":"Next.MetadataOutlet","children":"$@8"}]}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"MKsV9_ZtzPcZHC3V_SATf"} 4:{} 5:"$0:rsc:props:children:0:props:serverProvidedParams:params" 8:null diff --git a/apps/web/.next/server/app/index.html b/apps/web/.next/server/app/index.html index ed9b39a..5bb72c8 100644 --- a/apps/web/.next/server/app/index.html +++ b/apps/web/.next/server/app/index.html @@ -1 +1 @@ -TimeToLeave

ÖBB Planner

No upcoming events

Use "Add Event" to add one, or import from the Calendar.

\ No newline at end of file +TimeToLeave

ÖBB Planner

No upcoming events

Use "Add Event" to add one, or import from the Calendar.

\ No newline at end of file diff --git a/apps/web/.next/server/app/index.rsc b/apps/web/.next/server/app/index.rsc index b5f70e5..30031a0 100644 --- a/apps/web/.next/server/app/index.rsc +++ b/apps/web/.next/server/app/index.rsc @@ -14,7 +14,7 @@ e:"$Sreact.suspense" 12:I[97367,["/_next/static/chunks/00hu_su7n8gvm.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"MetadataBoundary"] 14:I[68027,["/_next/static/chunks/00hu_su7n8gvm.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default",1] :HL["/_next/static/chunks/09kgf98j6rdse.css","style"] -0:{"P":null,"c":["",""],"q":"","i":false,"f":[[["",{"children":["__PAGE__",{}]},"$undefined","$undefined",16],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/09kgf98j6rdse.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/_next/static/chunks/00hu_su7n8gvm.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/0d3shmwh5_nmn.js","async":true,"nonce":"$undefined"}]],["$","html",null,{"lang":"en","className":"h-full antialiased","children":["$","body",null,{"className":"min-h-full flex flex-col bg-gray-50 dark:bg-gray-900","children":["$","$L2",null,{"children":["$","$L3",null,{"children":[["$","$L4",null,{}],["$","$L5",null,{}],["$","div",null,{"className":"flex-1","children":["$","$L6",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L7",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}],["$","$L8",null,{}]]}]}]}]}]]}],{"children":[["$","$1","c",{"children":[["$","$L9",null,{"Component":"$a","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@b","$@c"]}}],[["$","script","script-0",{"src":"/_next/static/chunks/05.l0i0.5h3xb.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/14ve6ufh4xnra.js","async":true,"nonce":"$undefined"}]],["$","$Ld",null,{"children":["$","$e",null,{"name":"Next.MetadataOutlet","children":"$@f"}]}]]}],{},null,false,null]},null,false,null],["$","$1","h",{"children":[null,["$","$L10",null,{"children":"$L11"}],["$","div",null,{"hidden":true,"children":["$","$L12",null,{"children":["$","$e",null,{"name":"Next.Metadata","children":"$L13"}]}]}],null]}],false]],"m":"$undefined","G":["$14",[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/09kgf98j6rdse.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"pcsiH5B97Wet0aRbzsRfL"} +0:{"P":null,"c":["",""],"q":"","i":false,"f":[[["",{"children":["__PAGE__",{}]},"$undefined","$undefined",16],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/09kgf98j6rdse.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/_next/static/chunks/00hu_su7n8gvm.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/0d3shmwh5_nmn.js","async":true,"nonce":"$undefined"}]],["$","html",null,{"lang":"en","className":"h-full antialiased","children":["$","body",null,{"className":"min-h-full flex flex-col bg-gray-50 dark:bg-gray-900","children":["$","$L2",null,{"children":["$","$L3",null,{"children":[["$","$L4",null,{}],["$","$L5",null,{}],["$","div",null,{"className":"flex-1","children":["$","$L6",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L7",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}],["$","$L8",null,{}]]}]}]}]}]]}],{"children":[["$","$1","c",{"children":[["$","$L9",null,{"Component":"$a","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@b","$@c"]}}],[["$","script","script-0",{"src":"/_next/static/chunks/05.l0i0.5h3xb.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/14ve6ufh4xnra.js","async":true,"nonce":"$undefined"}]],["$","$Ld",null,{"children":["$","$e",null,{"name":"Next.MetadataOutlet","children":"$@f"}]}]]}],{},null,false,null]},null,false,null],["$","$1","h",{"children":[null,["$","$L10",null,{"children":"$L11"}],["$","div",null,{"hidden":true,"children":["$","$L12",null,{"children":["$","$e",null,{"name":"Next.Metadata","children":"$L13"}]}]}],null]}],false]],"m":"$undefined","G":["$14",[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/09kgf98j6rdse.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"MKsV9_ZtzPcZHC3V_SATf"} b:{} c:"$0:f:0:1:1:children:0:props:children:0:props:serverProvidedParams:params" 11:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]] diff --git a/apps/web/.next/server/app/index.segments/__PAGE__.segment.rsc b/apps/web/.next/server/app/index.segments/__PAGE__.segment.rsc index 1d1348d..e779c5e 100644 --- a/apps/web/.next/server/app/index.segments/__PAGE__.segment.rsc +++ b/apps/web/.next/server/app/index.segments/__PAGE__.segment.rsc @@ -3,7 +3,7 @@ 3:I[39798,["/_next/static/chunks/00hu_su7n8gvm.js","/_next/static/chunks/0d3shmwh5_nmn.js","/_next/static/chunks/05.l0i0.5h3xb.js","/_next/static/chunks/14ve6ufh4xnra.js"],"default"] 6:I[97367,["/_next/static/chunks/00hu_su7n8gvm.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"OutletBoundary"] 7:"$Sreact.suspense" -0:{"rsc":["$","$1","c",{"children":[["$","$L2",null,{"Component":"$3","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@4","$@5"]}}],[["$","script","script-0",{"src":"/_next/static/chunks/05.l0i0.5h3xb.js","async":true}],["$","script","script-1",{"src":"/_next/static/chunks/14ve6ufh4xnra.js","async":true}]],["$","$L6",null,{"children":["$","$7",null,{"name":"Next.MetadataOutlet","children":"$@8"}]}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"pcsiH5B97Wet0aRbzsRfL"} +0:{"rsc":["$","$1","c",{"children":[["$","$L2",null,{"Component":"$3","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@4","$@5"]}}],[["$","script","script-0",{"src":"/_next/static/chunks/05.l0i0.5h3xb.js","async":true}],["$","script","script-1",{"src":"/_next/static/chunks/14ve6ufh4xnra.js","async":true}]],["$","$L6",null,{"children":["$","$7",null,{"name":"Next.MetadataOutlet","children":"$@8"}]}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"MKsV9_ZtzPcZHC3V_SATf"} 4:{} 5:"$0:rsc:props:children:0:props:serverProvidedParams:params" 8:null diff --git a/apps/web/.next/server/app/index.segments/_full.segment.rsc b/apps/web/.next/server/app/index.segments/_full.segment.rsc index b5f70e5..30031a0 100644 --- a/apps/web/.next/server/app/index.segments/_full.segment.rsc +++ b/apps/web/.next/server/app/index.segments/_full.segment.rsc @@ -14,7 +14,7 @@ e:"$Sreact.suspense" 12:I[97367,["/_next/static/chunks/00hu_su7n8gvm.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"MetadataBoundary"] 14:I[68027,["/_next/static/chunks/00hu_su7n8gvm.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default",1] :HL["/_next/static/chunks/09kgf98j6rdse.css","style"] -0:{"P":null,"c":["",""],"q":"","i":false,"f":[[["",{"children":["__PAGE__",{}]},"$undefined","$undefined",16],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/09kgf98j6rdse.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/_next/static/chunks/00hu_su7n8gvm.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/0d3shmwh5_nmn.js","async":true,"nonce":"$undefined"}]],["$","html",null,{"lang":"en","className":"h-full antialiased","children":["$","body",null,{"className":"min-h-full flex flex-col bg-gray-50 dark:bg-gray-900","children":["$","$L2",null,{"children":["$","$L3",null,{"children":[["$","$L4",null,{}],["$","$L5",null,{}],["$","div",null,{"className":"flex-1","children":["$","$L6",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L7",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}],["$","$L8",null,{}]]}]}]}]}]]}],{"children":[["$","$1","c",{"children":[["$","$L9",null,{"Component":"$a","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@b","$@c"]}}],[["$","script","script-0",{"src":"/_next/static/chunks/05.l0i0.5h3xb.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/14ve6ufh4xnra.js","async":true,"nonce":"$undefined"}]],["$","$Ld",null,{"children":["$","$e",null,{"name":"Next.MetadataOutlet","children":"$@f"}]}]]}],{},null,false,null]},null,false,null],["$","$1","h",{"children":[null,["$","$L10",null,{"children":"$L11"}],["$","div",null,{"hidden":true,"children":["$","$L12",null,{"children":["$","$e",null,{"name":"Next.Metadata","children":"$L13"}]}]}],null]}],false]],"m":"$undefined","G":["$14",[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/09kgf98j6rdse.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"pcsiH5B97Wet0aRbzsRfL"} +0:{"P":null,"c":["",""],"q":"","i":false,"f":[[["",{"children":["__PAGE__",{}]},"$undefined","$undefined",16],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/09kgf98j6rdse.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/_next/static/chunks/00hu_su7n8gvm.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/0d3shmwh5_nmn.js","async":true,"nonce":"$undefined"}]],["$","html",null,{"lang":"en","className":"h-full antialiased","children":["$","body",null,{"className":"min-h-full flex flex-col bg-gray-50 dark:bg-gray-900","children":["$","$L2",null,{"children":["$","$L3",null,{"children":[["$","$L4",null,{}],["$","$L5",null,{}],["$","div",null,{"className":"flex-1","children":["$","$L6",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L7",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}],["$","$L8",null,{}]]}]}]}]}]]}],{"children":[["$","$1","c",{"children":[["$","$L9",null,{"Component":"$a","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@b","$@c"]}}],[["$","script","script-0",{"src":"/_next/static/chunks/05.l0i0.5h3xb.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/14ve6ufh4xnra.js","async":true,"nonce":"$undefined"}]],["$","$Ld",null,{"children":["$","$e",null,{"name":"Next.MetadataOutlet","children":"$@f"}]}]]}],{},null,false,null]},null,false,null],["$","$1","h",{"children":[null,["$","$L10",null,{"children":"$L11"}],["$","div",null,{"hidden":true,"children":["$","$L12",null,{"children":["$","$e",null,{"name":"Next.Metadata","children":"$L13"}]}]}],null]}],false]],"m":"$undefined","G":["$14",[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/09kgf98j6rdse.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"MKsV9_ZtzPcZHC3V_SATf"} b:{} c:"$0:f:0:1:1:children:0:props:children:0:props:serverProvidedParams:params" 11:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]] diff --git a/apps/web/.next/server/app/index.segments/_head.segment.rsc b/apps/web/.next/server/app/index.segments/_head.segment.rsc index efd3abd..4855c97 100644 --- a/apps/web/.next/server/app/index.segments/_head.segment.rsc +++ b/apps/web/.next/server/app/index.segments/_head.segment.rsc @@ -3,4 +3,4 @@ 3:I[97367,["/_next/static/chunks/00hu_su7n8gvm.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"MetadataBoundary"] 4:"$Sreact.suspense" 5:I[27201,["/_next/static/chunks/00hu_su7n8gvm.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"IconMark"] -0:{"rsc":["$","$1","h",{"children":[null,["$","$L2",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]}],["$","div",null,{"hidden":true,"children":["$","$L3",null,{"children":["$","$4",null,{"name":"Next.Metadata","children":[["$","title","0",{"children":"TimeToLeave"}],["$","meta","1",{"name":"description","content":"Plan your train journeys and compare with bicycle routing"}],["$","link","2",{"rel":"icon","href":"/favicon.ico?favicon.0x3dzn~oxb6tn.ico","sizes":"256x256","type":"image/x-icon"}],["$","$L5","3",{}]]}]}]}],null]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"pcsiH5B97Wet0aRbzsRfL"} +0:{"rsc":["$","$1","h",{"children":[null,["$","$L2",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]}],["$","div",null,{"hidden":true,"children":["$","$L3",null,{"children":["$","$4",null,{"name":"Next.Metadata","children":[["$","title","0",{"children":"TimeToLeave"}],["$","meta","1",{"name":"description","content":"Plan your train journeys and compare with bicycle routing"}],["$","link","2",{"rel":"icon","href":"/favicon.ico?favicon.0x3dzn~oxb6tn.ico","sizes":"256x256","type":"image/x-icon"}],["$","$L5","3",{}]]}]}]}],null]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"MKsV9_ZtzPcZHC3V_SATf"} diff --git a/apps/web/.next/server/app/index.segments/_index.segment.rsc b/apps/web/.next/server/app/index.segments/_index.segment.rsc index 5a09784..bf761b9 100644 --- a/apps/web/.next/server/app/index.segments/_index.segment.rsc +++ b/apps/web/.next/server/app/index.segments/_index.segment.rsc @@ -7,4 +7,4 @@ 7:I[37457,["/_next/static/chunks/00hu_su7n8gvm.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default"] 8:I[4035,["/_next/static/chunks/00hu_su7n8gvm.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default"] :HL["/_next/static/chunks/09kgf98j6rdse.css","style"] -0:{"rsc":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/09kgf98j6rdse.css","precedence":"next"}],["$","script","script-0",{"src":"/_next/static/chunks/00hu_su7n8gvm.js","async":true}],["$","script","script-1",{"src":"/_next/static/chunks/0d3shmwh5_nmn.js","async":true}]],["$","html",null,{"lang":"en","className":"h-full antialiased","children":["$","body",null,{"className":"min-h-full flex flex-col bg-gray-50 dark:bg-gray-900","children":["$","$L2",null,{"children":["$","$L3",null,{"children":[["$","$L4",null,{}],["$","$L5",null,{}],["$","div",null,{"className":"flex-1","children":["$","$L6",null,{"parallelRouterKey":"children","template":["$","$L7",null,{}],"notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]]}]}],["$","$L8",null,{}]]}]}]}]}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"pcsiH5B97Wet0aRbzsRfL"} +0:{"rsc":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/09kgf98j6rdse.css","precedence":"next"}],["$","script","script-0",{"src":"/_next/static/chunks/00hu_su7n8gvm.js","async":true}],["$","script","script-1",{"src":"/_next/static/chunks/0d3shmwh5_nmn.js","async":true}]],["$","html",null,{"lang":"en","className":"h-full antialiased","children":["$","body",null,{"className":"min-h-full flex flex-col bg-gray-50 dark:bg-gray-900","children":["$","$L2",null,{"children":["$","$L3",null,{"children":[["$","$L4",null,{}],["$","$L5",null,{}],["$","div",null,{"className":"flex-1","children":["$","$L6",null,{"parallelRouterKey":"children","template":["$","$L7",null,{}],"notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]]}]}],["$","$L8",null,{}]]}]}]}]}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"MKsV9_ZtzPcZHC3V_SATf"} diff --git a/apps/web/.next/server/app/index.segments/_tree.segment.rsc b/apps/web/.next/server/app/index.segments/_tree.segment.rsc index 2aad080..3514949 100644 --- a/apps/web/.next/server/app/index.segments/_tree.segment.rsc +++ b/apps/web/.next/server/app/index.segments/_tree.segment.rsc @@ -1,2 +1,2 @@ :HL["/_next/static/chunks/09kgf98j6rdse.css","style"] -0:{"tree":{"name":"","param":null,"prefetchHints":16,"slots":{"children":{"name":"__PAGE__","param":null,"prefetchHints":0,"slots":null}}},"staleTime":300,"buildId":"pcsiH5B97Wet0aRbzsRfL"} +0:{"tree":{"name":"","param":null,"prefetchHints":16,"slots":{"children":{"name":"__PAGE__","param":null,"prefetchHints":0,"slots":null}}},"staleTime":300,"buildId":"MKsV9_ZtzPcZHC3V_SATf"} diff --git a/apps/web/.next/server/middleware-build-manifest.js b/apps/web/.next/server/middleware-build-manifest.js index 14473ae..7889c8a 100644 --- a/apps/web/.next/server/middleware-build-manifest.js +++ b/apps/web/.next/server/middleware-build-manifest.js @@ -7,9 +7,9 @@ globalThis.__BUILD_MANIFEST = { "static/chunks/03~yq9q893hmn.js" ], "lowPriorityFiles": [ - "static/pcsiH5B97Wet0aRbzsRfL/_buildManifest.js", - "static/pcsiH5B97Wet0aRbzsRfL/_ssgManifest.js", - "static/pcsiH5B97Wet0aRbzsRfL/_clientMiddlewareManifest.js" + "static/MKsV9_ZtzPcZHC3V_SATf/_buildManifest.js", + "static/MKsV9_ZtzPcZHC3V_SATf/_ssgManifest.js", + "static/MKsV9_ZtzPcZHC3V_SATf/_clientMiddlewareManifest.js" ], "rootMainFiles": [ "static/chunks/0bzupvr5gt3k9.js", diff --git a/apps/web/.next/server/middleware-manifest.json b/apps/web/.next/server/middleware-manifest.json index eb7130b..2027899 100644 --- a/apps/web/.next/server/middleware-manifest.json +++ b/apps/web/.next/server/middleware-manifest.json @@ -1,6 +1,34 @@ { "version": 3, - "middleware": {}, - "sortedMiddleware": [], + "middleware": { + "/": { + "files": [ + "server/edge/chunks/node_modules_next_dist_esm_build_templates_edge-wrapper_0.-2ip1.js", + "server/edge/chunks/[root-of-the-server]__0d3wooi._.js", + "server/edge/chunks/turbopack-node_modules_next_dist_esm_build_templates_edge-wrapper_11d2rrp.js" + ], + "name": "middleware", + "page": "/", + "entrypoint": "server/edge/chunks/turbopack-node_modules_next_dist_esm_build_templates_edge-wrapper_11d2rrp.js", + "matchers": [ + { + "regexp": "^(?:\\/(_next\\/data\\/[^/]{1,}))?\\/api(?:\\/((?:[^\\/#\\?]+?)(?:\\/(?:[^\\/#\\?]+?))*))?(\\.json|\\.rsc|\\.segments\\/.+\\.segment\\.rsc)?[\\/#\\?]?$", + "originalSource": "/api/:path*" + } + ], + "wasm": [], + "assets": [], + "env": { + "__NEXT_BUILD_ID": "MKsV9_ZtzPcZHC3V_SATf", + "NEXT_SERVER_ACTIONS_ENCRYPTION_KEY": "/yKuar/lNJm6n0BiaYuybEOydwmSTtDZx0xYSWrJZoA=", + "__NEXT_PREVIEW_MODE_ID": "baf3938ffaadb817e47a139da2f1e5f7", + "__NEXT_PREVIEW_MODE_ENCRYPTION_KEY": "9bbc7f67b1c70e4346137e4a67ae64169723610603f114ab07e5cde96b60dff0", + "__NEXT_PREVIEW_MODE_SIGNING_KEY": "927be125ed80b259d703d1ae97343ab7fd97ea202ddcdcbae0569f19839dc5dc" + } + } + }, + "sortedMiddleware": [ + "/" + ], "functions": {} } \ No newline at end of file diff --git a/apps/web/.next/server/pages/404.html b/apps/web/.next/server/pages/404.html index 03700ab..833c1d2 100644 --- a/apps/web/.next/server/pages/404.html +++ b/apps/web/.next/server/pages/404.html @@ -1 +1 @@ -404: This page could not be found.TimeToLeave

ÖBB Planner

404

This page could not be found.

\ No newline at end of file +404: This page could not be found.TimeToLeave

ÖBB Planner

404

This page could not be found.

\ No newline at end of file diff --git a/apps/web/.next/server/pages/500.html b/apps/web/.next/server/pages/500.html index 19a5e8b..38abfe5 100644 --- a/apps/web/.next/server/pages/500.html +++ b/apps/web/.next/server/pages/500.html @@ -1 +1 @@ -500: This page couldn’t load

This page couldn’t load

A server error occurred. Reload to try again.

\ No newline at end of file +500: This page couldn’t load

This page couldn’t load

A server error occurred. Reload to try again.

\ No newline at end of file diff --git a/apps/web/.next/standalone/apps/web/.next/BUILD_ID b/apps/web/.next/standalone/apps/web/.next/BUILD_ID index f78f9db..a019ef1 100644 --- a/apps/web/.next/standalone/apps/web/.next/BUILD_ID +++ b/apps/web/.next/standalone/apps/web/.next/BUILD_ID @@ -1 +1 @@ -pcsiH5B97Wet0aRbzsRfL \ No newline at end of file +MKsV9_ZtzPcZHC3V_SATf \ No newline at end of file diff --git a/apps/web/.next/standalone/apps/web/.next/build-manifest.json b/apps/web/.next/standalone/apps/web/.next/build-manifest.json index 139e9e2..86289d6 100644 --- a/apps/web/.next/standalone/apps/web/.next/build-manifest.json +++ b/apps/web/.next/standalone/apps/web/.next/build-manifest.json @@ -7,9 +7,9 @@ "static/chunks/03~yq9q893hmn.js" ], "lowPriorityFiles": [ - "static/pcsiH5B97Wet0aRbzsRfL/_buildManifest.js", - "static/pcsiH5B97Wet0aRbzsRfL/_ssgManifest.js", - "static/pcsiH5B97Wet0aRbzsRfL/_clientMiddlewareManifest.js" + "static/MKsV9_ZtzPcZHC3V_SATf/_buildManifest.js", + "static/MKsV9_ZtzPcZHC3V_SATf/_ssgManifest.js", + "static/MKsV9_ZtzPcZHC3V_SATf/_clientMiddlewareManifest.js" ], "rootMainFiles": [ "static/chunks/0bzupvr5gt3k9.js", diff --git a/apps/web/.next/standalone/apps/web/.next/required-server-files.json b/apps/web/.next/standalone/apps/web/.next/required-server-files.json index 2419436..a98302d 100644 --- a/apps/web/.next/standalone/apps/web/.next/required-server-files.json +++ b/apps/web/.next/standalone/apps/web/.next/required-server-files.json @@ -1,7 +1,10 @@ { "version": 1, "config": { - "env": {}, + "env": { + "CORS_ALLOWED_ORIGINS": "*", + "DEPLOYMENT_URL": "http://localhost:3000" + }, "webpack": null, "typescript": { "ignoreBuildErrors": false diff --git a/apps/web/.next/standalone/apps/web/.next/server/app/_global-error.html b/apps/web/.next/standalone/apps/web/.next/server/app/_global-error.html index 19a5e8b..38abfe5 100644 --- a/apps/web/.next/standalone/apps/web/.next/server/app/_global-error.html +++ b/apps/web/.next/standalone/apps/web/.next/server/app/_global-error.html @@ -1 +1 @@ -500: This page couldn’t load

This page couldn’t load

A server error occurred. Reload to try again.

\ No newline at end of file +500: This page couldn’t load

This page couldn’t load

A server error occurred. Reload to try again.

\ No newline at end of file diff --git a/apps/web/.next/standalone/apps/web/.next/server/app/_global-error.rsc b/apps/web/.next/standalone/apps/web/.next/server/app/_global-error.rsc index 148db86..99e6a8d 100644 --- a/apps/web/.next/standalone/apps/web/.next/server/app/_global-error.rsc +++ b/apps/web/.next/standalone/apps/web/.next/server/app/_global-error.rsc @@ -6,7 +6,7 @@ 8:I[97367,["/_next/static/chunks/01xlw8hd842-c.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"ViewportBoundary"] a:I[97367,["/_next/static/chunks/01xlw8hd842-c.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"MetadataBoundary"] c:I[68027,["/_next/static/chunks/01xlw8hd842-c.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default",1] -0:{"P":null,"c":["","_global-error"],"q":"","i":false,"f":[[["",{"children":["__PAGE__",{}]}],[["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[["$","html",null,{"id":"__next_error__","children":[["$","head",null,{"children":[["$","title",null,{"children":"500: This page couldn’t load"}],["$","style",null,{"dangerouslySetInnerHTML":{"__html":":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }"}}]]}],["$","body",null,{"children":["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","display":"flex","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"style":{"marginTop":"-32px","maxWidth":"325px","padding":"32px 28px","textAlign":"left"},"children":[["$","svg",null,{"width":"32","height":"32","viewBox":"-0.2 -1.5 32 32","fill":"none","style":{"marginBottom":"24px"},"children":["$","path",null,{"d":"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z","fill":"var(--next-error-title)"}]}],["$","h1",null,{"style":{"fontSize":"24px","fontWeight":500,"letterSpacing":"-0.02em","lineHeight":"32px","margin":"0 0 12px 0","color":"var(--next-error-title)"},"children":"This page couldn’t load"}],["$","p",null,{"style":{"fontSize":"14px","fontWeight":400,"lineHeight":"21px","margin":"0 0 20px 0","color":"var(--next-error-message)"},"children":"A server error occurred. Reload to try again."}],["$","form",null,{"style":{"margin":0},"children":["$","button",null,{"type":"submit","style":{"display":"inline-flex","alignItems":"center","justifyContent":"center","height":"32px","padding":"0 12px","fontSize":"14px","fontWeight":500,"lineHeight":"20px","borderRadius":"6px","cursor":"pointer","color":"var(--next-error-btn-text)","background":"var(--next-error-btn-bg)","border":"var(--next-error-btn-border)"},"children":"Reload"}]}]]}]}]}]]}],null,["$","$L4",null,{"children":["$","$5",null,{"name":"Next.MetadataOutlet","children":"$@6"}]}]]}],{},null,false,null]},null,false,"$@7"],["$","$1","h",{"children":[null,["$","$L8",null,{"children":"$L9"}],["$","div",null,{"hidden":true,"children":["$","$La",null,{"children":["$","$5",null,{"name":"Next.Metadata","children":"$Lb"}]}]}],null]}],false]],"m":"$undefined","G":["$c",[]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"pcsiH5B97Wet0aRbzsRfL"} +0:{"P":null,"c":["","_global-error"],"q":"","i":false,"f":[[["",{"children":["__PAGE__",{}]}],[["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[["$","html",null,{"id":"__next_error__","children":[["$","head",null,{"children":[["$","title",null,{"children":"500: This page couldn’t load"}],["$","style",null,{"dangerouslySetInnerHTML":{"__html":":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }"}}]]}],["$","body",null,{"children":["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","display":"flex","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"style":{"marginTop":"-32px","maxWidth":"325px","padding":"32px 28px","textAlign":"left"},"children":[["$","svg",null,{"width":"32","height":"32","viewBox":"-0.2 -1.5 32 32","fill":"none","style":{"marginBottom":"24px"},"children":["$","path",null,{"d":"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z","fill":"var(--next-error-title)"}]}],["$","h1",null,{"style":{"fontSize":"24px","fontWeight":500,"letterSpacing":"-0.02em","lineHeight":"32px","margin":"0 0 12px 0","color":"var(--next-error-title)"},"children":"This page couldn’t load"}],["$","p",null,{"style":{"fontSize":"14px","fontWeight":400,"lineHeight":"21px","margin":"0 0 20px 0","color":"var(--next-error-message)"},"children":"A server error occurred. Reload to try again."}],["$","form",null,{"style":{"margin":0},"children":["$","button",null,{"type":"submit","style":{"display":"inline-flex","alignItems":"center","justifyContent":"center","height":"32px","padding":"0 12px","fontSize":"14px","fontWeight":500,"lineHeight":"20px","borderRadius":"6px","cursor":"pointer","color":"var(--next-error-btn-text)","background":"var(--next-error-btn-bg)","border":"var(--next-error-btn-border)"},"children":"Reload"}]}]]}]}]}]]}],null,["$","$L4",null,{"children":["$","$5",null,{"name":"Next.MetadataOutlet","children":"$@6"}]}]]}],{},null,false,null]},null,false,"$@7"],["$","$1","h",{"children":[null,["$","$L8",null,{"children":"$L9"}],["$","div",null,{"hidden":true,"children":["$","$La",null,{"children":["$","$5",null,{"name":"Next.Metadata","children":"$Lb"}]}]}],null]}],false]],"m":"$undefined","G":["$c",[]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"MKsV9_ZtzPcZHC3V_SATf"} d:[] 7:"$Wd" 9:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]] diff --git a/apps/web/.next/standalone/apps/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc b/apps/web/.next/standalone/apps/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc index 8425c5e..0f92902 100644 --- a/apps/web/.next/standalone/apps/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +++ b/apps/web/.next/standalone/apps/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc @@ -1,5 +1,5 @@ 1:"$Sreact.fragment" 2:I[97367,["/_next/static/chunks/01xlw8hd842-c.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"OutletBoundary"] 3:"$Sreact.suspense" -0:{"rsc":["$","$1","c",{"children":[["$","html",null,{"id":"__next_error__","children":[["$","head",null,{"children":[["$","title",null,{"children":"500: This page couldn’t load"}],["$","style",null,{"dangerouslySetInnerHTML":{"__html":":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }"}}]]}],["$","body",null,{"children":["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","display":"flex","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"style":{"marginTop":"-32px","maxWidth":"325px","padding":"32px 28px","textAlign":"left"},"children":[["$","svg",null,{"width":"32","height":"32","viewBox":"-0.2 -1.5 32 32","fill":"none","style":{"marginBottom":"24px"},"children":["$","path",null,{"d":"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z","fill":"var(--next-error-title)"}]}],["$","h1",null,{"style":{"fontSize":"24px","fontWeight":500,"letterSpacing":"-0.02em","lineHeight":"32px","margin":"0 0 12px 0","color":"var(--next-error-title)"},"children":"This page couldn’t load"}],["$","p",null,{"style":{"fontSize":"14px","fontWeight":400,"lineHeight":"21px","margin":"0 0 20px 0","color":"var(--next-error-message)"},"children":"A server error occurred. Reload to try again."}],["$","form",null,{"style":{"margin":0},"children":["$","button",null,{"type":"submit","style":{"display":"inline-flex","alignItems":"center","justifyContent":"center","height":"32px","padding":"0 12px","fontSize":"14px","fontWeight":500,"lineHeight":"20px","borderRadius":"6px","cursor":"pointer","color":"var(--next-error-btn-text)","background":"var(--next-error-btn-bg)","border":"var(--next-error-btn-border)"},"children":"Reload"}]}]]}]}]}]]}],null,["$","$L2",null,{"children":["$","$3",null,{"name":"Next.MetadataOutlet","children":"$@4"}]}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"pcsiH5B97Wet0aRbzsRfL"} +0:{"rsc":["$","$1","c",{"children":[["$","html",null,{"id":"__next_error__","children":[["$","head",null,{"children":[["$","title",null,{"children":"500: This page couldn’t load"}],["$","style",null,{"dangerouslySetInnerHTML":{"__html":":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }"}}]]}],["$","body",null,{"children":["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","display":"flex","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"style":{"marginTop":"-32px","maxWidth":"325px","padding":"32px 28px","textAlign":"left"},"children":[["$","svg",null,{"width":"32","height":"32","viewBox":"-0.2 -1.5 32 32","fill":"none","style":{"marginBottom":"24px"},"children":["$","path",null,{"d":"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z","fill":"var(--next-error-title)"}]}],["$","h1",null,{"style":{"fontSize":"24px","fontWeight":500,"letterSpacing":"-0.02em","lineHeight":"32px","margin":"0 0 12px 0","color":"var(--next-error-title)"},"children":"This page couldn’t load"}],["$","p",null,{"style":{"fontSize":"14px","fontWeight":400,"lineHeight":"21px","margin":"0 0 20px 0","color":"var(--next-error-message)"},"children":"A server error occurred. Reload to try again."}],["$","form",null,{"style":{"margin":0},"children":["$","button",null,{"type":"submit","style":{"display":"inline-flex","alignItems":"center","justifyContent":"center","height":"32px","padding":"0 12px","fontSize":"14px","fontWeight":500,"lineHeight":"20px","borderRadius":"6px","cursor":"pointer","color":"var(--next-error-btn-text)","background":"var(--next-error-btn-bg)","border":"var(--next-error-btn-border)"},"children":"Reload"}]}]]}]}]}]]}],null,["$","$L2",null,{"children":["$","$3",null,{"name":"Next.MetadataOutlet","children":"$@4"}]}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"MKsV9_ZtzPcZHC3V_SATf"} 4:null diff --git a/apps/web/.next/standalone/apps/web/.next/server/app/_global-error.segments/_full.segment.rsc b/apps/web/.next/standalone/apps/web/.next/server/app/_global-error.segments/_full.segment.rsc index 148db86..99e6a8d 100644 --- a/apps/web/.next/standalone/apps/web/.next/server/app/_global-error.segments/_full.segment.rsc +++ b/apps/web/.next/standalone/apps/web/.next/server/app/_global-error.segments/_full.segment.rsc @@ -6,7 +6,7 @@ 8:I[97367,["/_next/static/chunks/01xlw8hd842-c.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"ViewportBoundary"] a:I[97367,["/_next/static/chunks/01xlw8hd842-c.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"MetadataBoundary"] c:I[68027,["/_next/static/chunks/01xlw8hd842-c.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default",1] -0:{"P":null,"c":["","_global-error"],"q":"","i":false,"f":[[["",{"children":["__PAGE__",{}]}],[["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[["$","html",null,{"id":"__next_error__","children":[["$","head",null,{"children":[["$","title",null,{"children":"500: This page couldn’t load"}],["$","style",null,{"dangerouslySetInnerHTML":{"__html":":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }"}}]]}],["$","body",null,{"children":["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","display":"flex","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"style":{"marginTop":"-32px","maxWidth":"325px","padding":"32px 28px","textAlign":"left"},"children":[["$","svg",null,{"width":"32","height":"32","viewBox":"-0.2 -1.5 32 32","fill":"none","style":{"marginBottom":"24px"},"children":["$","path",null,{"d":"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z","fill":"var(--next-error-title)"}]}],["$","h1",null,{"style":{"fontSize":"24px","fontWeight":500,"letterSpacing":"-0.02em","lineHeight":"32px","margin":"0 0 12px 0","color":"var(--next-error-title)"},"children":"This page couldn’t load"}],["$","p",null,{"style":{"fontSize":"14px","fontWeight":400,"lineHeight":"21px","margin":"0 0 20px 0","color":"var(--next-error-message)"},"children":"A server error occurred. Reload to try again."}],["$","form",null,{"style":{"margin":0},"children":["$","button",null,{"type":"submit","style":{"display":"inline-flex","alignItems":"center","justifyContent":"center","height":"32px","padding":"0 12px","fontSize":"14px","fontWeight":500,"lineHeight":"20px","borderRadius":"6px","cursor":"pointer","color":"var(--next-error-btn-text)","background":"var(--next-error-btn-bg)","border":"var(--next-error-btn-border)"},"children":"Reload"}]}]]}]}]}]]}],null,["$","$L4",null,{"children":["$","$5",null,{"name":"Next.MetadataOutlet","children":"$@6"}]}]]}],{},null,false,null]},null,false,"$@7"],["$","$1","h",{"children":[null,["$","$L8",null,{"children":"$L9"}],["$","div",null,{"hidden":true,"children":["$","$La",null,{"children":["$","$5",null,{"name":"Next.Metadata","children":"$Lb"}]}]}],null]}],false]],"m":"$undefined","G":["$c",[]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"pcsiH5B97Wet0aRbzsRfL"} +0:{"P":null,"c":["","_global-error"],"q":"","i":false,"f":[[["",{"children":["__PAGE__",{}]}],[["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[["$","html",null,{"id":"__next_error__","children":[["$","head",null,{"children":[["$","title",null,{"children":"500: This page couldn’t load"}],["$","style",null,{"dangerouslySetInnerHTML":{"__html":":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }"}}]]}],["$","body",null,{"children":["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","display":"flex","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"style":{"marginTop":"-32px","maxWidth":"325px","padding":"32px 28px","textAlign":"left"},"children":[["$","svg",null,{"width":"32","height":"32","viewBox":"-0.2 -1.5 32 32","fill":"none","style":{"marginBottom":"24px"},"children":["$","path",null,{"d":"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z","fill":"var(--next-error-title)"}]}],["$","h1",null,{"style":{"fontSize":"24px","fontWeight":500,"letterSpacing":"-0.02em","lineHeight":"32px","margin":"0 0 12px 0","color":"var(--next-error-title)"},"children":"This page couldn’t load"}],["$","p",null,{"style":{"fontSize":"14px","fontWeight":400,"lineHeight":"21px","margin":"0 0 20px 0","color":"var(--next-error-message)"},"children":"A server error occurred. Reload to try again."}],["$","form",null,{"style":{"margin":0},"children":["$","button",null,{"type":"submit","style":{"display":"inline-flex","alignItems":"center","justifyContent":"center","height":"32px","padding":"0 12px","fontSize":"14px","fontWeight":500,"lineHeight":"20px","borderRadius":"6px","cursor":"pointer","color":"var(--next-error-btn-text)","background":"var(--next-error-btn-bg)","border":"var(--next-error-btn-border)"},"children":"Reload"}]}]]}]}]}]]}],null,["$","$L4",null,{"children":["$","$5",null,{"name":"Next.MetadataOutlet","children":"$@6"}]}]]}],{},null,false,null]},null,false,"$@7"],["$","$1","h",{"children":[null,["$","$L8",null,{"children":"$L9"}],["$","div",null,{"hidden":true,"children":["$","$La",null,{"children":["$","$5",null,{"name":"Next.Metadata","children":"$Lb"}]}]}],null]}],false]],"m":"$undefined","G":["$c",[]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"MKsV9_ZtzPcZHC3V_SATf"} d:[] 7:"$Wd" 9:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]] diff --git a/apps/web/.next/standalone/apps/web/.next/server/app/_global-error.segments/_head.segment.rsc b/apps/web/.next/standalone/apps/web/.next/server/app/_global-error.segments/_head.segment.rsc index cb1ba6d..7d538ee 100644 --- a/apps/web/.next/standalone/apps/web/.next/server/app/_global-error.segments/_head.segment.rsc +++ b/apps/web/.next/standalone/apps/web/.next/server/app/_global-error.segments/_head.segment.rsc @@ -3,4 +3,4 @@ 3:I[97367,["/_next/static/chunks/01xlw8hd842-c.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"MetadataBoundary"] 4:"$Sreact.suspense" 5:I[27201,["/_next/static/chunks/01xlw8hd842-c.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"IconMark"] -0:{"rsc":["$","$1","h",{"children":[null,["$","$L2",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]}],["$","div",null,{"hidden":true,"children":["$","$L3",null,{"children":["$","$4",null,{"name":"Next.Metadata","children":[["$","link","0",{"rel":"icon","href":"/favicon.ico?favicon.0x3dzn~oxb6tn.ico","sizes":"256x256","type":"image/x-icon"}],["$","$L5","1",{}]]}]}]}],null]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"pcsiH5B97Wet0aRbzsRfL"} +0:{"rsc":["$","$1","h",{"children":[null,["$","$L2",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]}],["$","div",null,{"hidden":true,"children":["$","$L3",null,{"children":["$","$4",null,{"name":"Next.Metadata","children":[["$","link","0",{"rel":"icon","href":"/favicon.ico?favicon.0x3dzn~oxb6tn.ico","sizes":"256x256","type":"image/x-icon"}],["$","$L5","1",{}]]}]}]}],null]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"MKsV9_ZtzPcZHC3V_SATf"} diff --git a/apps/web/.next/standalone/apps/web/.next/server/app/_global-error.segments/_index.segment.rsc b/apps/web/.next/standalone/apps/web/.next/server/app/_global-error.segments/_index.segment.rsc index bde85dd..5f33639 100644 --- a/apps/web/.next/standalone/apps/web/.next/server/app/_global-error.segments/_index.segment.rsc +++ b/apps/web/.next/standalone/apps/web/.next/server/app/_global-error.segments/_index.segment.rsc @@ -2,4 +2,4 @@ 2:I[39756,["/_next/static/chunks/01xlw8hd842-c.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default"] 3:I[37457,["/_next/static/chunks/01xlw8hd842-c.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default"] 4:[] -0:{"rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"isPartial":false,"staleTime":300,"varyParams":"$W4","buildId":"pcsiH5B97Wet0aRbzsRfL"} +0:{"rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"isPartial":false,"staleTime":300,"varyParams":"$W4","buildId":"MKsV9_ZtzPcZHC3V_SATf"} diff --git a/apps/web/.next/standalone/apps/web/.next/server/app/_global-error.segments/_tree.segment.rsc b/apps/web/.next/standalone/apps/web/.next/server/app/_global-error.segments/_tree.segment.rsc index ce81979..b7d733e 100644 --- a/apps/web/.next/standalone/apps/web/.next/server/app/_global-error.segments/_tree.segment.rsc +++ b/apps/web/.next/standalone/apps/web/.next/server/app/_global-error.segments/_tree.segment.rsc @@ -1 +1 @@ -0:{"tree":{"name":"","param":null,"prefetchHints":0,"slots":{"children":{"name":"__PAGE__","param":null,"prefetchHints":0,"slots":null}}},"staleTime":300,"buildId":"pcsiH5B97Wet0aRbzsRfL"} +0:{"tree":{"name":"","param":null,"prefetchHints":0,"slots":{"children":{"name":"__PAGE__","param":null,"prefetchHints":0,"slots":null}}},"staleTime":300,"buildId":"MKsV9_ZtzPcZHC3V_SATf"} diff --git a/apps/web/.next/standalone/apps/web/.next/server/app/_not-found.html b/apps/web/.next/standalone/apps/web/.next/server/app/_not-found.html index 03700ab..833c1d2 100644 --- a/apps/web/.next/standalone/apps/web/.next/server/app/_not-found.html +++ b/apps/web/.next/standalone/apps/web/.next/server/app/_not-found.html @@ -1 +1 @@ -404: This page could not be found.TimeToLeave

ÖBB Planner

404

This page could not be found.

\ No newline at end of file +404: This page could not be found.TimeToLeave

ÖBB Planner

404

This page could not be found.

\ No newline at end of file diff --git a/apps/web/.next/standalone/apps/web/.next/server/app/_not-found.rsc b/apps/web/.next/standalone/apps/web/.next/server/app/_not-found.rsc index 3583673..ffaac42 100644 --- a/apps/web/.next/standalone/apps/web/.next/server/app/_not-found.rsc +++ b/apps/web/.next/standalone/apps/web/.next/server/app/_not-found.rsc @@ -12,7 +12,7 @@ d:I[97367,["/_next/static/chunks/00hu_su7n8gvm.js","/_next/static/chunks/0d3shmw f:I[97367,["/_next/static/chunks/00hu_su7n8gvm.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"MetadataBoundary"] 11:I[68027,["/_next/static/chunks/00hu_su7n8gvm.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default",1] :HL["/_next/static/chunks/09kgf98j6rdse.css","style"] -0:{"P":null,"c":["","_not-found"],"q":"","i":false,"f":[[["",{"children":["/_not-found",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",16],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/09kgf98j6rdse.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/_next/static/chunks/00hu_su7n8gvm.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/0d3shmwh5_nmn.js","async":true,"nonce":"$undefined"}]],["$","html",null,{"lang":"en","className":"h-full antialiased","children":["$","body",null,{"className":"min-h-full flex flex-col bg-gray-50 dark:bg-gray-900","children":["$","$L2",null,{"children":["$","$L3",null,{"children":[["$","$L4",null,{}],["$","$L5",null,{}],["$","div",null,{"className":"flex-1","children":["$","$L6",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L7",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}],["$","$L8",null,{}]]}]}]}]}]]}],{"children":[["$","$1","c",{"children":[null,["$","$L6",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L7",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:children:2:props:children:props:notFound:0:1:props:style","children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:children:2:props:children:props:notFound:0:1:props:children:props:children:1:props:style","children":404}],["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:children:2:props:children:props:notFound:0:1:props:children:props:children:2:props:style","children":["$","h2",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:children:2:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style","children":"This page could not be found."}]}]]}]}]],null,["$","$L9",null,{"children":["$","$a",null,{"name":"Next.MetadataOutlet","children":"$@b"}]}]]}],{},null,false,null]},null,false,"$@c"]},null,false,null],["$","$1","h",{"children":[["$","meta",null,{"name":"robots","content":"noindex"}],["$","$Ld",null,{"children":"$Le"}],["$","div",null,{"hidden":true,"children":["$","$Lf",null,{"children":["$","$a",null,{"name":"Next.Metadata","children":"$L10"}]}]}],null]}],false]],"m":"$undefined","G":["$11",[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/09kgf98j6rdse.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"pcsiH5B97Wet0aRbzsRfL"} +0:{"P":null,"c":["","_not-found"],"q":"","i":false,"f":[[["",{"children":["/_not-found",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",16],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/09kgf98j6rdse.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/_next/static/chunks/00hu_su7n8gvm.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/0d3shmwh5_nmn.js","async":true,"nonce":"$undefined"}]],["$","html",null,{"lang":"en","className":"h-full antialiased","children":["$","body",null,{"className":"min-h-full flex flex-col bg-gray-50 dark:bg-gray-900","children":["$","$L2",null,{"children":["$","$L3",null,{"children":[["$","$L4",null,{}],["$","$L5",null,{}],["$","div",null,{"className":"flex-1","children":["$","$L6",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L7",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}],["$","$L8",null,{}]]}]}]}]}]]}],{"children":[["$","$1","c",{"children":[null,["$","$L6",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L7",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:children:2:props:children:props:notFound:0:1:props:style","children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:children:2:props:children:props:notFound:0:1:props:children:props:children:1:props:style","children":404}],["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:children:2:props:children:props:notFound:0:1:props:children:props:children:2:props:style","children":["$","h2",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:children:2:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style","children":"This page could not be found."}]}]]}]}]],null,["$","$L9",null,{"children":["$","$a",null,{"name":"Next.MetadataOutlet","children":"$@b"}]}]]}],{},null,false,null]},null,false,"$@c"]},null,false,null],["$","$1","h",{"children":[["$","meta",null,{"name":"robots","content":"noindex"}],["$","$Ld",null,{"children":"$Le"}],["$","div",null,{"hidden":true,"children":["$","$Lf",null,{"children":["$","$a",null,{"name":"Next.Metadata","children":"$L10"}]}]}],null]}],false]],"m":"$undefined","G":["$11",[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/09kgf98j6rdse.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"MKsV9_ZtzPcZHC3V_SATf"} 12:[] c:"$W12" e:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]] diff --git a/apps/web/.next/standalone/apps/web/.next/server/app/_not-found.segments/_full.segment.rsc b/apps/web/.next/standalone/apps/web/.next/server/app/_not-found.segments/_full.segment.rsc index 3583673..ffaac42 100644 --- a/apps/web/.next/standalone/apps/web/.next/server/app/_not-found.segments/_full.segment.rsc +++ b/apps/web/.next/standalone/apps/web/.next/server/app/_not-found.segments/_full.segment.rsc @@ -12,7 +12,7 @@ d:I[97367,["/_next/static/chunks/00hu_su7n8gvm.js","/_next/static/chunks/0d3shmw f:I[97367,["/_next/static/chunks/00hu_su7n8gvm.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"MetadataBoundary"] 11:I[68027,["/_next/static/chunks/00hu_su7n8gvm.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default",1] :HL["/_next/static/chunks/09kgf98j6rdse.css","style"] -0:{"P":null,"c":["","_not-found"],"q":"","i":false,"f":[[["",{"children":["/_not-found",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",16],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/09kgf98j6rdse.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/_next/static/chunks/00hu_su7n8gvm.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/0d3shmwh5_nmn.js","async":true,"nonce":"$undefined"}]],["$","html",null,{"lang":"en","className":"h-full antialiased","children":["$","body",null,{"className":"min-h-full flex flex-col bg-gray-50 dark:bg-gray-900","children":["$","$L2",null,{"children":["$","$L3",null,{"children":[["$","$L4",null,{}],["$","$L5",null,{}],["$","div",null,{"className":"flex-1","children":["$","$L6",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L7",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}],["$","$L8",null,{}]]}]}]}]}]]}],{"children":[["$","$1","c",{"children":[null,["$","$L6",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L7",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:children:2:props:children:props:notFound:0:1:props:style","children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:children:2:props:children:props:notFound:0:1:props:children:props:children:1:props:style","children":404}],["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:children:2:props:children:props:notFound:0:1:props:children:props:children:2:props:style","children":["$","h2",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:children:2:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style","children":"This page could not be found."}]}]]}]}]],null,["$","$L9",null,{"children":["$","$a",null,{"name":"Next.MetadataOutlet","children":"$@b"}]}]]}],{},null,false,null]},null,false,"$@c"]},null,false,null],["$","$1","h",{"children":[["$","meta",null,{"name":"robots","content":"noindex"}],["$","$Ld",null,{"children":"$Le"}],["$","div",null,{"hidden":true,"children":["$","$Lf",null,{"children":["$","$a",null,{"name":"Next.Metadata","children":"$L10"}]}]}],null]}],false]],"m":"$undefined","G":["$11",[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/09kgf98j6rdse.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"pcsiH5B97Wet0aRbzsRfL"} +0:{"P":null,"c":["","_not-found"],"q":"","i":false,"f":[[["",{"children":["/_not-found",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",16],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/09kgf98j6rdse.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/_next/static/chunks/00hu_su7n8gvm.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/0d3shmwh5_nmn.js","async":true,"nonce":"$undefined"}]],["$","html",null,{"lang":"en","className":"h-full antialiased","children":["$","body",null,{"className":"min-h-full flex flex-col bg-gray-50 dark:bg-gray-900","children":["$","$L2",null,{"children":["$","$L3",null,{"children":[["$","$L4",null,{}],["$","$L5",null,{}],["$","div",null,{"className":"flex-1","children":["$","$L6",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L7",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}],["$","$L8",null,{}]]}]}]}]}]]}],{"children":[["$","$1","c",{"children":[null,["$","$L6",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L7",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:children:2:props:children:props:notFound:0:1:props:style","children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:children:2:props:children:props:notFound:0:1:props:children:props:children:1:props:style","children":404}],["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:children:2:props:children:props:notFound:0:1:props:children:props:children:2:props:style","children":["$","h2",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:children:2:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style","children":"This page could not be found."}]}]]}]}]],null,["$","$L9",null,{"children":["$","$a",null,{"name":"Next.MetadataOutlet","children":"$@b"}]}]]}],{},null,false,null]},null,false,"$@c"]},null,false,null],["$","$1","h",{"children":[["$","meta",null,{"name":"robots","content":"noindex"}],["$","$Ld",null,{"children":"$Le"}],["$","div",null,{"hidden":true,"children":["$","$Lf",null,{"children":["$","$a",null,{"name":"Next.Metadata","children":"$L10"}]}]}],null]}],false]],"m":"$undefined","G":["$11",[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/09kgf98j6rdse.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"MKsV9_ZtzPcZHC3V_SATf"} 12:[] c:"$W12" e:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]] diff --git a/apps/web/.next/standalone/apps/web/.next/server/app/_not-found.segments/_head.segment.rsc b/apps/web/.next/standalone/apps/web/.next/server/app/_not-found.segments/_head.segment.rsc index 9c7749e..132ede1 100644 --- a/apps/web/.next/standalone/apps/web/.next/server/app/_not-found.segments/_head.segment.rsc +++ b/apps/web/.next/standalone/apps/web/.next/server/app/_not-found.segments/_head.segment.rsc @@ -3,4 +3,4 @@ 3:I[97367,["/_next/static/chunks/00hu_su7n8gvm.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"MetadataBoundary"] 4:"$Sreact.suspense" 5:I[27201,["/_next/static/chunks/00hu_su7n8gvm.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"IconMark"] -0:{"rsc":["$","$1","h",{"children":[["$","meta",null,{"name":"robots","content":"noindex"}],["$","$L2",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]}],["$","div",null,{"hidden":true,"children":["$","$L3",null,{"children":["$","$4",null,{"name":"Next.Metadata","children":[["$","title","0",{"children":"TimeToLeave"}],["$","meta","1",{"name":"description","content":"Plan your train journeys and compare with bicycle routing"}],["$","link","2",{"rel":"icon","href":"/favicon.ico?favicon.0x3dzn~oxb6tn.ico","sizes":"256x256","type":"image/x-icon"}],["$","$L5","3",{}]]}]}]}],null]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"pcsiH5B97Wet0aRbzsRfL"} +0:{"rsc":["$","$1","h",{"children":[["$","meta",null,{"name":"robots","content":"noindex"}],["$","$L2",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]}],["$","div",null,{"hidden":true,"children":["$","$L3",null,{"children":["$","$4",null,{"name":"Next.Metadata","children":[["$","title","0",{"children":"TimeToLeave"}],["$","meta","1",{"name":"description","content":"Plan your train journeys and compare with bicycle routing"}],["$","link","2",{"rel":"icon","href":"/favicon.ico?favicon.0x3dzn~oxb6tn.ico","sizes":"256x256","type":"image/x-icon"}],["$","$L5","3",{}]]}]}]}],null]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"MKsV9_ZtzPcZHC3V_SATf"} diff --git a/apps/web/.next/standalone/apps/web/.next/server/app/_not-found.segments/_index.segment.rsc b/apps/web/.next/standalone/apps/web/.next/server/app/_not-found.segments/_index.segment.rsc index 5a09784..bf761b9 100644 --- a/apps/web/.next/standalone/apps/web/.next/server/app/_not-found.segments/_index.segment.rsc +++ b/apps/web/.next/standalone/apps/web/.next/server/app/_not-found.segments/_index.segment.rsc @@ -7,4 +7,4 @@ 7:I[37457,["/_next/static/chunks/00hu_su7n8gvm.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default"] 8:I[4035,["/_next/static/chunks/00hu_su7n8gvm.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default"] :HL["/_next/static/chunks/09kgf98j6rdse.css","style"] -0:{"rsc":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/09kgf98j6rdse.css","precedence":"next"}],["$","script","script-0",{"src":"/_next/static/chunks/00hu_su7n8gvm.js","async":true}],["$","script","script-1",{"src":"/_next/static/chunks/0d3shmwh5_nmn.js","async":true}]],["$","html",null,{"lang":"en","className":"h-full antialiased","children":["$","body",null,{"className":"min-h-full flex flex-col bg-gray-50 dark:bg-gray-900","children":["$","$L2",null,{"children":["$","$L3",null,{"children":[["$","$L4",null,{}],["$","$L5",null,{}],["$","div",null,{"className":"flex-1","children":["$","$L6",null,{"parallelRouterKey":"children","template":["$","$L7",null,{}],"notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]]}]}],["$","$L8",null,{}]]}]}]}]}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"pcsiH5B97Wet0aRbzsRfL"} +0:{"rsc":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/09kgf98j6rdse.css","precedence":"next"}],["$","script","script-0",{"src":"/_next/static/chunks/00hu_su7n8gvm.js","async":true}],["$","script","script-1",{"src":"/_next/static/chunks/0d3shmwh5_nmn.js","async":true}]],["$","html",null,{"lang":"en","className":"h-full antialiased","children":["$","body",null,{"className":"min-h-full flex flex-col bg-gray-50 dark:bg-gray-900","children":["$","$L2",null,{"children":["$","$L3",null,{"children":[["$","$L4",null,{}],["$","$L5",null,{}],["$","div",null,{"className":"flex-1","children":["$","$L6",null,{"parallelRouterKey":"children","template":["$","$L7",null,{}],"notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]]}]}],["$","$L8",null,{}]]}]}]}]}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"MKsV9_ZtzPcZHC3V_SATf"} diff --git a/apps/web/.next/standalone/apps/web/.next/server/app/_not-found.segments/_not-found.segment.rsc b/apps/web/.next/standalone/apps/web/.next/server/app/_not-found.segments/_not-found.segment.rsc index 6c43037..82fcaa6 100644 --- a/apps/web/.next/standalone/apps/web/.next/server/app/_not-found.segments/_not-found.segment.rsc +++ b/apps/web/.next/standalone/apps/web/.next/server/app/_not-found.segments/_not-found.segment.rsc @@ -2,4 +2,4 @@ 2:I[39756,["/_next/static/chunks/00hu_su7n8gvm.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default"] 3:I[37457,["/_next/static/chunks/00hu_su7n8gvm.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default"] 4:[] -0:{"rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"isPartial":false,"staleTime":300,"varyParams":"$W4","buildId":"pcsiH5B97Wet0aRbzsRfL"} +0:{"rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"isPartial":false,"staleTime":300,"varyParams":"$W4","buildId":"MKsV9_ZtzPcZHC3V_SATf"} diff --git a/apps/web/.next/standalone/apps/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc b/apps/web/.next/standalone/apps/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc index 6f7ff03..71eec2a 100644 --- a/apps/web/.next/standalone/apps/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +++ b/apps/web/.next/standalone/apps/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc @@ -1,5 +1,5 @@ 1:"$Sreact.fragment" 2:I[97367,["/_next/static/chunks/00hu_su7n8gvm.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"OutletBoundary"] 3:"$Sreact.suspense" -0:{"rsc":["$","$1","c",{"children":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],null,["$","$L2",null,{"children":["$","$3",null,{"name":"Next.MetadataOutlet","children":"$@4"}]}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"pcsiH5B97Wet0aRbzsRfL"} +0:{"rsc":["$","$1","c",{"children":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],null,["$","$L2",null,{"children":["$","$3",null,{"name":"Next.MetadataOutlet","children":"$@4"}]}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"MKsV9_ZtzPcZHC3V_SATf"} 4:null diff --git a/apps/web/.next/standalone/apps/web/.next/server/app/_not-found.segments/_tree.segment.rsc b/apps/web/.next/standalone/apps/web/.next/server/app/_not-found.segments/_tree.segment.rsc index 7e00272..f73891c 100644 --- a/apps/web/.next/standalone/apps/web/.next/server/app/_not-found.segments/_tree.segment.rsc +++ b/apps/web/.next/standalone/apps/web/.next/server/app/_not-found.segments/_tree.segment.rsc @@ -1,2 +1,2 @@ :HL["/_next/static/chunks/09kgf98j6rdse.css","style"] -0:{"tree":{"name":"","param":null,"prefetchHints":16,"slots":{"children":{"name":"/_not-found","param":null,"prefetchHints":0,"slots":{"children":{"name":"__PAGE__","param":null,"prefetchHints":0,"slots":null}}}}},"staleTime":300,"buildId":"pcsiH5B97Wet0aRbzsRfL"} +0:{"tree":{"name":"","param":null,"prefetchHints":16,"slots":{"children":{"name":"/_not-found","param":null,"prefetchHints":0,"slots":{"children":{"name":"__PAGE__","param":null,"prefetchHints":0,"slots":null}}}}},"staleTime":300,"buildId":"MKsV9_ZtzPcZHC3V_SATf"} diff --git a/apps/web/.next/standalone/apps/web/.next/server/app/calendar.html b/apps/web/.next/standalone/apps/web/.next/server/app/calendar.html index 84da71f..33d7afd 100644 --- a/apps/web/.next/standalone/apps/web/.next/server/app/calendar.html +++ b/apps/web/.next/standalone/apps/web/.next/server/app/calendar.html @@ -46,14 +46,14 @@ ">
9
10
11
10
11
31

No events scheduled for May 10, 2026

\ No newline at end of file + ">
31

No events scheduled for May 11, 2026

\ No newline at end of file diff --git a/apps/web/.next/standalone/apps/web/.next/server/app/calendar.rsc b/apps/web/.next/standalone/apps/web/.next/server/app/calendar.rsc index aa8cec3..9446ba3 100644 --- a/apps/web/.next/standalone/apps/web/.next/server/app/calendar.rsc +++ b/apps/web/.next/standalone/apps/web/.next/server/app/calendar.rsc @@ -14,7 +14,7 @@ e:"$Sreact.suspense" 13:I[97367,["/_next/static/chunks/00hu_su7n8gvm.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"MetadataBoundary"] 15:I[68027,["/_next/static/chunks/00hu_su7n8gvm.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default",1] :HL["/_next/static/chunks/09kgf98j6rdse.css","style"] -0:{"P":null,"c":["","calendar"],"q":"","i":false,"f":[[["",{"children":["calendar",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",16],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/09kgf98j6rdse.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/_next/static/chunks/00hu_su7n8gvm.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/0d3shmwh5_nmn.js","async":true,"nonce":"$undefined"}]],["$","html",null,{"lang":"en","className":"h-full antialiased","children":["$","body",null,{"className":"min-h-full flex flex-col bg-gray-50 dark:bg-gray-900","children":["$","$L2",null,{"children":["$","$L3",null,{"children":[["$","$L4",null,{}],["$","$L5",null,{}],["$","div",null,{"className":"flex-1","children":["$","$L6",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L7",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}],["$","$L8",null,{}]]}]}]}]}]]}],{"children":[["$","$1","c",{"children":[null,["$","$L6",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L7",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[["$","$L9",null,{"Component":"$a","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@b","$@c"]}}],[["$","script","script-0",{"src":"/_next/static/chunks/14vq9o7udvkff.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/14ve6ufh4xnra.js","async":true,"nonce":"$undefined"}]],["$","$Ld",null,{"children":["$","$e",null,{"name":"Next.MetadataOutlet","children":"$@f"}]}]]}],{},null,false,null]},null,false,"$@10"]},null,false,null],["$","$1","h",{"children":[null,["$","$L11",null,{"children":"$L12"}],["$","div",null,{"hidden":true,"children":["$","$L13",null,{"children":["$","$e",null,{"name":"Next.Metadata","children":"$L14"}]}]}],null]}],false]],"m":"$undefined","G":["$15",[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/09kgf98j6rdse.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"pcsiH5B97Wet0aRbzsRfL"} +0:{"P":null,"c":["","calendar"],"q":"","i":false,"f":[[["",{"children":["calendar",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",16],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/09kgf98j6rdse.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/_next/static/chunks/00hu_su7n8gvm.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/0d3shmwh5_nmn.js","async":true,"nonce":"$undefined"}]],["$","html",null,{"lang":"en","className":"h-full antialiased","children":["$","body",null,{"className":"min-h-full flex flex-col bg-gray-50 dark:bg-gray-900","children":["$","$L2",null,{"children":["$","$L3",null,{"children":[["$","$L4",null,{}],["$","$L5",null,{}],["$","div",null,{"className":"flex-1","children":["$","$L6",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L7",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}],["$","$L8",null,{}]]}]}]}]}]]}],{"children":[["$","$1","c",{"children":[null,["$","$L6",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L7",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[["$","$L9",null,{"Component":"$a","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@b","$@c"]}}],[["$","script","script-0",{"src":"/_next/static/chunks/14vq9o7udvkff.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/14ve6ufh4xnra.js","async":true,"nonce":"$undefined"}]],["$","$Ld",null,{"children":["$","$e",null,{"name":"Next.MetadataOutlet","children":"$@f"}]}]]}],{},null,false,null]},null,false,"$@10"]},null,false,null],["$","$1","h",{"children":[null,["$","$L11",null,{"children":"$L12"}],["$","div",null,{"hidden":true,"children":["$","$L13",null,{"children":["$","$e",null,{"name":"Next.Metadata","children":"$L14"}]}]}],null]}],false]],"m":"$undefined","G":["$15",[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/09kgf98j6rdse.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"MKsV9_ZtzPcZHC3V_SATf"} 16:[] 10:"$W16" b:{} diff --git a/apps/web/.next/standalone/apps/web/.next/server/app/calendar.segments/_full.segment.rsc b/apps/web/.next/standalone/apps/web/.next/server/app/calendar.segments/_full.segment.rsc index aa8cec3..9446ba3 100644 --- a/apps/web/.next/standalone/apps/web/.next/server/app/calendar.segments/_full.segment.rsc +++ b/apps/web/.next/standalone/apps/web/.next/server/app/calendar.segments/_full.segment.rsc @@ -14,7 +14,7 @@ e:"$Sreact.suspense" 13:I[97367,["/_next/static/chunks/00hu_su7n8gvm.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"MetadataBoundary"] 15:I[68027,["/_next/static/chunks/00hu_su7n8gvm.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default",1] :HL["/_next/static/chunks/09kgf98j6rdse.css","style"] -0:{"P":null,"c":["","calendar"],"q":"","i":false,"f":[[["",{"children":["calendar",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",16],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/09kgf98j6rdse.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/_next/static/chunks/00hu_su7n8gvm.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/0d3shmwh5_nmn.js","async":true,"nonce":"$undefined"}]],["$","html",null,{"lang":"en","className":"h-full antialiased","children":["$","body",null,{"className":"min-h-full flex flex-col bg-gray-50 dark:bg-gray-900","children":["$","$L2",null,{"children":["$","$L3",null,{"children":[["$","$L4",null,{}],["$","$L5",null,{}],["$","div",null,{"className":"flex-1","children":["$","$L6",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L7",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}],["$","$L8",null,{}]]}]}]}]}]]}],{"children":[["$","$1","c",{"children":[null,["$","$L6",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L7",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[["$","$L9",null,{"Component":"$a","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@b","$@c"]}}],[["$","script","script-0",{"src":"/_next/static/chunks/14vq9o7udvkff.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/14ve6ufh4xnra.js","async":true,"nonce":"$undefined"}]],["$","$Ld",null,{"children":["$","$e",null,{"name":"Next.MetadataOutlet","children":"$@f"}]}]]}],{},null,false,null]},null,false,"$@10"]},null,false,null],["$","$1","h",{"children":[null,["$","$L11",null,{"children":"$L12"}],["$","div",null,{"hidden":true,"children":["$","$L13",null,{"children":["$","$e",null,{"name":"Next.Metadata","children":"$L14"}]}]}],null]}],false]],"m":"$undefined","G":["$15",[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/09kgf98j6rdse.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"pcsiH5B97Wet0aRbzsRfL"} +0:{"P":null,"c":["","calendar"],"q":"","i":false,"f":[[["",{"children":["calendar",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",16],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/09kgf98j6rdse.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/_next/static/chunks/00hu_su7n8gvm.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/0d3shmwh5_nmn.js","async":true,"nonce":"$undefined"}]],["$","html",null,{"lang":"en","className":"h-full antialiased","children":["$","body",null,{"className":"min-h-full flex flex-col bg-gray-50 dark:bg-gray-900","children":["$","$L2",null,{"children":["$","$L3",null,{"children":[["$","$L4",null,{}],["$","$L5",null,{}],["$","div",null,{"className":"flex-1","children":["$","$L6",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L7",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}],["$","$L8",null,{}]]}]}]}]}]]}],{"children":[["$","$1","c",{"children":[null,["$","$L6",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L7",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[["$","$L9",null,{"Component":"$a","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@b","$@c"]}}],[["$","script","script-0",{"src":"/_next/static/chunks/14vq9o7udvkff.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/14ve6ufh4xnra.js","async":true,"nonce":"$undefined"}]],["$","$Ld",null,{"children":["$","$e",null,{"name":"Next.MetadataOutlet","children":"$@f"}]}]]}],{},null,false,null]},null,false,"$@10"]},null,false,null],["$","$1","h",{"children":[null,["$","$L11",null,{"children":"$L12"}],["$","div",null,{"hidden":true,"children":["$","$L13",null,{"children":["$","$e",null,{"name":"Next.Metadata","children":"$L14"}]}]}],null]}],false]],"m":"$undefined","G":["$15",[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/09kgf98j6rdse.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"MKsV9_ZtzPcZHC3V_SATf"} 16:[] 10:"$W16" b:{} diff --git a/apps/web/.next/standalone/apps/web/.next/server/app/calendar.segments/_head.segment.rsc b/apps/web/.next/standalone/apps/web/.next/server/app/calendar.segments/_head.segment.rsc index efd3abd..4855c97 100644 --- a/apps/web/.next/standalone/apps/web/.next/server/app/calendar.segments/_head.segment.rsc +++ b/apps/web/.next/standalone/apps/web/.next/server/app/calendar.segments/_head.segment.rsc @@ -3,4 +3,4 @@ 3:I[97367,["/_next/static/chunks/00hu_su7n8gvm.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"MetadataBoundary"] 4:"$Sreact.suspense" 5:I[27201,["/_next/static/chunks/00hu_su7n8gvm.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"IconMark"] -0:{"rsc":["$","$1","h",{"children":[null,["$","$L2",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]}],["$","div",null,{"hidden":true,"children":["$","$L3",null,{"children":["$","$4",null,{"name":"Next.Metadata","children":[["$","title","0",{"children":"TimeToLeave"}],["$","meta","1",{"name":"description","content":"Plan your train journeys and compare with bicycle routing"}],["$","link","2",{"rel":"icon","href":"/favicon.ico?favicon.0x3dzn~oxb6tn.ico","sizes":"256x256","type":"image/x-icon"}],["$","$L5","3",{}]]}]}]}],null]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"pcsiH5B97Wet0aRbzsRfL"} +0:{"rsc":["$","$1","h",{"children":[null,["$","$L2",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]}],["$","div",null,{"hidden":true,"children":["$","$L3",null,{"children":["$","$4",null,{"name":"Next.Metadata","children":[["$","title","0",{"children":"TimeToLeave"}],["$","meta","1",{"name":"description","content":"Plan your train journeys and compare with bicycle routing"}],["$","link","2",{"rel":"icon","href":"/favicon.ico?favicon.0x3dzn~oxb6tn.ico","sizes":"256x256","type":"image/x-icon"}],["$","$L5","3",{}]]}]}]}],null]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"MKsV9_ZtzPcZHC3V_SATf"} diff --git a/apps/web/.next/standalone/apps/web/.next/server/app/calendar.segments/_index.segment.rsc b/apps/web/.next/standalone/apps/web/.next/server/app/calendar.segments/_index.segment.rsc index 5a09784..bf761b9 100644 --- a/apps/web/.next/standalone/apps/web/.next/server/app/calendar.segments/_index.segment.rsc +++ b/apps/web/.next/standalone/apps/web/.next/server/app/calendar.segments/_index.segment.rsc @@ -7,4 +7,4 @@ 7:I[37457,["/_next/static/chunks/00hu_su7n8gvm.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default"] 8:I[4035,["/_next/static/chunks/00hu_su7n8gvm.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default"] :HL["/_next/static/chunks/09kgf98j6rdse.css","style"] -0:{"rsc":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/09kgf98j6rdse.css","precedence":"next"}],["$","script","script-0",{"src":"/_next/static/chunks/00hu_su7n8gvm.js","async":true}],["$","script","script-1",{"src":"/_next/static/chunks/0d3shmwh5_nmn.js","async":true}]],["$","html",null,{"lang":"en","className":"h-full antialiased","children":["$","body",null,{"className":"min-h-full flex flex-col bg-gray-50 dark:bg-gray-900","children":["$","$L2",null,{"children":["$","$L3",null,{"children":[["$","$L4",null,{}],["$","$L5",null,{}],["$","div",null,{"className":"flex-1","children":["$","$L6",null,{"parallelRouterKey":"children","template":["$","$L7",null,{}],"notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]]}]}],["$","$L8",null,{}]]}]}]}]}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"pcsiH5B97Wet0aRbzsRfL"} +0:{"rsc":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/09kgf98j6rdse.css","precedence":"next"}],["$","script","script-0",{"src":"/_next/static/chunks/00hu_su7n8gvm.js","async":true}],["$","script","script-1",{"src":"/_next/static/chunks/0d3shmwh5_nmn.js","async":true}]],["$","html",null,{"lang":"en","className":"h-full antialiased","children":["$","body",null,{"className":"min-h-full flex flex-col bg-gray-50 dark:bg-gray-900","children":["$","$L2",null,{"children":["$","$L3",null,{"children":[["$","$L4",null,{}],["$","$L5",null,{}],["$","div",null,{"className":"flex-1","children":["$","$L6",null,{"parallelRouterKey":"children","template":["$","$L7",null,{}],"notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]]}]}],["$","$L8",null,{}]]}]}]}]}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"MKsV9_ZtzPcZHC3V_SATf"} diff --git a/apps/web/.next/standalone/apps/web/.next/server/app/calendar.segments/_tree.segment.rsc b/apps/web/.next/standalone/apps/web/.next/server/app/calendar.segments/_tree.segment.rsc index 5a87161..d29171d 100644 --- a/apps/web/.next/standalone/apps/web/.next/server/app/calendar.segments/_tree.segment.rsc +++ b/apps/web/.next/standalone/apps/web/.next/server/app/calendar.segments/_tree.segment.rsc @@ -1,2 +1,2 @@ :HL["/_next/static/chunks/09kgf98j6rdse.css","style"] -0:{"tree":{"name":"","param":null,"prefetchHints":16,"slots":{"children":{"name":"calendar","param":null,"prefetchHints":0,"slots":{"children":{"name":"__PAGE__","param":null,"prefetchHints":0,"slots":null}}}}},"staleTime":300,"buildId":"pcsiH5B97Wet0aRbzsRfL"} +0:{"tree":{"name":"","param":null,"prefetchHints":16,"slots":{"children":{"name":"calendar","param":null,"prefetchHints":0,"slots":{"children":{"name":"__PAGE__","param":null,"prefetchHints":0,"slots":null}}}}},"staleTime":300,"buildId":"MKsV9_ZtzPcZHC3V_SATf"} diff --git a/apps/web/.next/standalone/apps/web/.next/server/app/calendar.segments/calendar.segment.rsc b/apps/web/.next/standalone/apps/web/.next/server/app/calendar.segments/calendar.segment.rsc index 6c43037..82fcaa6 100644 --- a/apps/web/.next/standalone/apps/web/.next/server/app/calendar.segments/calendar.segment.rsc +++ b/apps/web/.next/standalone/apps/web/.next/server/app/calendar.segments/calendar.segment.rsc @@ -2,4 +2,4 @@ 2:I[39756,["/_next/static/chunks/00hu_su7n8gvm.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default"] 3:I[37457,["/_next/static/chunks/00hu_su7n8gvm.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default"] 4:[] -0:{"rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"isPartial":false,"staleTime":300,"varyParams":"$W4","buildId":"pcsiH5B97Wet0aRbzsRfL"} +0:{"rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"isPartial":false,"staleTime":300,"varyParams":"$W4","buildId":"MKsV9_ZtzPcZHC3V_SATf"} diff --git a/apps/web/.next/standalone/apps/web/.next/server/app/calendar.segments/calendar/__PAGE__.segment.rsc b/apps/web/.next/standalone/apps/web/.next/server/app/calendar.segments/calendar/__PAGE__.segment.rsc index 09c2a00..4b61339 100644 --- a/apps/web/.next/standalone/apps/web/.next/server/app/calendar.segments/calendar/__PAGE__.segment.rsc +++ b/apps/web/.next/standalone/apps/web/.next/server/app/calendar.segments/calendar/__PAGE__.segment.rsc @@ -3,7 +3,7 @@ 3:I[75505,["/_next/static/chunks/00hu_su7n8gvm.js","/_next/static/chunks/0d3shmwh5_nmn.js","/_next/static/chunks/14vq9o7udvkff.js","/_next/static/chunks/14ve6ufh4xnra.js"],"default"] 6:I[97367,["/_next/static/chunks/00hu_su7n8gvm.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"OutletBoundary"] 7:"$Sreact.suspense" -0:{"rsc":["$","$1","c",{"children":[["$","$L2",null,{"Component":"$3","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@4","$@5"]}}],[["$","script","script-0",{"src":"/_next/static/chunks/14vq9o7udvkff.js","async":true}],["$","script","script-1",{"src":"/_next/static/chunks/14ve6ufh4xnra.js","async":true}]],["$","$L6",null,{"children":["$","$7",null,{"name":"Next.MetadataOutlet","children":"$@8"}]}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"pcsiH5B97Wet0aRbzsRfL"} +0:{"rsc":["$","$1","c",{"children":[["$","$L2",null,{"Component":"$3","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@4","$@5"]}}],[["$","script","script-0",{"src":"/_next/static/chunks/14vq9o7udvkff.js","async":true}],["$","script","script-1",{"src":"/_next/static/chunks/14ve6ufh4xnra.js","async":true}]],["$","$L6",null,{"children":["$","$7",null,{"name":"Next.MetadataOutlet","children":"$@8"}]}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"MKsV9_ZtzPcZHC3V_SATf"} 4:{} 5:"$0:rsc:props:children:0:props:serverProvidedParams:params" 8:null diff --git a/apps/web/.next/standalone/apps/web/.next/server/app/index.html b/apps/web/.next/standalone/apps/web/.next/server/app/index.html index ed9b39a..5bb72c8 100644 --- a/apps/web/.next/standalone/apps/web/.next/server/app/index.html +++ b/apps/web/.next/standalone/apps/web/.next/server/app/index.html @@ -1 +1 @@ -TimeToLeave

ÖBB Planner

No upcoming events

Use "Add Event" to add one, or import from the Calendar.

\ No newline at end of file +TimeToLeave

ÖBB Planner

No upcoming events

Use "Add Event" to add one, or import from the Calendar.

\ No newline at end of file diff --git a/apps/web/.next/standalone/apps/web/.next/server/app/index.rsc b/apps/web/.next/standalone/apps/web/.next/server/app/index.rsc index b5f70e5..30031a0 100644 --- a/apps/web/.next/standalone/apps/web/.next/server/app/index.rsc +++ b/apps/web/.next/standalone/apps/web/.next/server/app/index.rsc @@ -14,7 +14,7 @@ e:"$Sreact.suspense" 12:I[97367,["/_next/static/chunks/00hu_su7n8gvm.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"MetadataBoundary"] 14:I[68027,["/_next/static/chunks/00hu_su7n8gvm.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default",1] :HL["/_next/static/chunks/09kgf98j6rdse.css","style"] -0:{"P":null,"c":["",""],"q":"","i":false,"f":[[["",{"children":["__PAGE__",{}]},"$undefined","$undefined",16],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/09kgf98j6rdse.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/_next/static/chunks/00hu_su7n8gvm.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/0d3shmwh5_nmn.js","async":true,"nonce":"$undefined"}]],["$","html",null,{"lang":"en","className":"h-full antialiased","children":["$","body",null,{"className":"min-h-full flex flex-col bg-gray-50 dark:bg-gray-900","children":["$","$L2",null,{"children":["$","$L3",null,{"children":[["$","$L4",null,{}],["$","$L5",null,{}],["$","div",null,{"className":"flex-1","children":["$","$L6",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L7",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}],["$","$L8",null,{}]]}]}]}]}]]}],{"children":[["$","$1","c",{"children":[["$","$L9",null,{"Component":"$a","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@b","$@c"]}}],[["$","script","script-0",{"src":"/_next/static/chunks/05.l0i0.5h3xb.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/14ve6ufh4xnra.js","async":true,"nonce":"$undefined"}]],["$","$Ld",null,{"children":["$","$e",null,{"name":"Next.MetadataOutlet","children":"$@f"}]}]]}],{},null,false,null]},null,false,null],["$","$1","h",{"children":[null,["$","$L10",null,{"children":"$L11"}],["$","div",null,{"hidden":true,"children":["$","$L12",null,{"children":["$","$e",null,{"name":"Next.Metadata","children":"$L13"}]}]}],null]}],false]],"m":"$undefined","G":["$14",[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/09kgf98j6rdse.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"pcsiH5B97Wet0aRbzsRfL"} +0:{"P":null,"c":["",""],"q":"","i":false,"f":[[["",{"children":["__PAGE__",{}]},"$undefined","$undefined",16],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/09kgf98j6rdse.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/_next/static/chunks/00hu_su7n8gvm.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/0d3shmwh5_nmn.js","async":true,"nonce":"$undefined"}]],["$","html",null,{"lang":"en","className":"h-full antialiased","children":["$","body",null,{"className":"min-h-full flex flex-col bg-gray-50 dark:bg-gray-900","children":["$","$L2",null,{"children":["$","$L3",null,{"children":[["$","$L4",null,{}],["$","$L5",null,{}],["$","div",null,{"className":"flex-1","children":["$","$L6",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L7",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}],["$","$L8",null,{}]]}]}]}]}]]}],{"children":[["$","$1","c",{"children":[["$","$L9",null,{"Component":"$a","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@b","$@c"]}}],[["$","script","script-0",{"src":"/_next/static/chunks/05.l0i0.5h3xb.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/14ve6ufh4xnra.js","async":true,"nonce":"$undefined"}]],["$","$Ld",null,{"children":["$","$e",null,{"name":"Next.MetadataOutlet","children":"$@f"}]}]]}],{},null,false,null]},null,false,null],["$","$1","h",{"children":[null,["$","$L10",null,{"children":"$L11"}],["$","div",null,{"hidden":true,"children":["$","$L12",null,{"children":["$","$e",null,{"name":"Next.Metadata","children":"$L13"}]}]}],null]}],false]],"m":"$undefined","G":["$14",[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/09kgf98j6rdse.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"MKsV9_ZtzPcZHC3V_SATf"} b:{} c:"$0:f:0:1:1:children:0:props:children:0:props:serverProvidedParams:params" 11:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]] diff --git a/apps/web/.next/standalone/apps/web/.next/server/app/index.segments/__PAGE__.segment.rsc b/apps/web/.next/standalone/apps/web/.next/server/app/index.segments/__PAGE__.segment.rsc index 1d1348d..e779c5e 100644 --- a/apps/web/.next/standalone/apps/web/.next/server/app/index.segments/__PAGE__.segment.rsc +++ b/apps/web/.next/standalone/apps/web/.next/server/app/index.segments/__PAGE__.segment.rsc @@ -3,7 +3,7 @@ 3:I[39798,["/_next/static/chunks/00hu_su7n8gvm.js","/_next/static/chunks/0d3shmwh5_nmn.js","/_next/static/chunks/05.l0i0.5h3xb.js","/_next/static/chunks/14ve6ufh4xnra.js"],"default"] 6:I[97367,["/_next/static/chunks/00hu_su7n8gvm.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"OutletBoundary"] 7:"$Sreact.suspense" -0:{"rsc":["$","$1","c",{"children":[["$","$L2",null,{"Component":"$3","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@4","$@5"]}}],[["$","script","script-0",{"src":"/_next/static/chunks/05.l0i0.5h3xb.js","async":true}],["$","script","script-1",{"src":"/_next/static/chunks/14ve6ufh4xnra.js","async":true}]],["$","$L6",null,{"children":["$","$7",null,{"name":"Next.MetadataOutlet","children":"$@8"}]}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"pcsiH5B97Wet0aRbzsRfL"} +0:{"rsc":["$","$1","c",{"children":[["$","$L2",null,{"Component":"$3","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@4","$@5"]}}],[["$","script","script-0",{"src":"/_next/static/chunks/05.l0i0.5h3xb.js","async":true}],["$","script","script-1",{"src":"/_next/static/chunks/14ve6ufh4xnra.js","async":true}]],["$","$L6",null,{"children":["$","$7",null,{"name":"Next.MetadataOutlet","children":"$@8"}]}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"MKsV9_ZtzPcZHC3V_SATf"} 4:{} 5:"$0:rsc:props:children:0:props:serverProvidedParams:params" 8:null diff --git a/apps/web/.next/standalone/apps/web/.next/server/app/index.segments/_full.segment.rsc b/apps/web/.next/standalone/apps/web/.next/server/app/index.segments/_full.segment.rsc index b5f70e5..30031a0 100644 --- a/apps/web/.next/standalone/apps/web/.next/server/app/index.segments/_full.segment.rsc +++ b/apps/web/.next/standalone/apps/web/.next/server/app/index.segments/_full.segment.rsc @@ -14,7 +14,7 @@ e:"$Sreact.suspense" 12:I[97367,["/_next/static/chunks/00hu_su7n8gvm.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"MetadataBoundary"] 14:I[68027,["/_next/static/chunks/00hu_su7n8gvm.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default",1] :HL["/_next/static/chunks/09kgf98j6rdse.css","style"] -0:{"P":null,"c":["",""],"q":"","i":false,"f":[[["",{"children":["__PAGE__",{}]},"$undefined","$undefined",16],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/09kgf98j6rdse.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/_next/static/chunks/00hu_su7n8gvm.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/0d3shmwh5_nmn.js","async":true,"nonce":"$undefined"}]],["$","html",null,{"lang":"en","className":"h-full antialiased","children":["$","body",null,{"className":"min-h-full flex flex-col bg-gray-50 dark:bg-gray-900","children":["$","$L2",null,{"children":["$","$L3",null,{"children":[["$","$L4",null,{}],["$","$L5",null,{}],["$","div",null,{"className":"flex-1","children":["$","$L6",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L7",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}],["$","$L8",null,{}]]}]}]}]}]]}],{"children":[["$","$1","c",{"children":[["$","$L9",null,{"Component":"$a","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@b","$@c"]}}],[["$","script","script-0",{"src":"/_next/static/chunks/05.l0i0.5h3xb.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/14ve6ufh4xnra.js","async":true,"nonce":"$undefined"}]],["$","$Ld",null,{"children":["$","$e",null,{"name":"Next.MetadataOutlet","children":"$@f"}]}]]}],{},null,false,null]},null,false,null],["$","$1","h",{"children":[null,["$","$L10",null,{"children":"$L11"}],["$","div",null,{"hidden":true,"children":["$","$L12",null,{"children":["$","$e",null,{"name":"Next.Metadata","children":"$L13"}]}]}],null]}],false]],"m":"$undefined","G":["$14",[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/09kgf98j6rdse.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"pcsiH5B97Wet0aRbzsRfL"} +0:{"P":null,"c":["",""],"q":"","i":false,"f":[[["",{"children":["__PAGE__",{}]},"$undefined","$undefined",16],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/09kgf98j6rdse.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/_next/static/chunks/00hu_su7n8gvm.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/0d3shmwh5_nmn.js","async":true,"nonce":"$undefined"}]],["$","html",null,{"lang":"en","className":"h-full antialiased","children":["$","body",null,{"className":"min-h-full flex flex-col bg-gray-50 dark:bg-gray-900","children":["$","$L2",null,{"children":["$","$L3",null,{"children":[["$","$L4",null,{}],["$","$L5",null,{}],["$","div",null,{"className":"flex-1","children":["$","$L6",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L7",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}],["$","$L8",null,{}]]}]}]}]}]]}],{"children":[["$","$1","c",{"children":[["$","$L9",null,{"Component":"$a","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@b","$@c"]}}],[["$","script","script-0",{"src":"/_next/static/chunks/05.l0i0.5h3xb.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/14ve6ufh4xnra.js","async":true,"nonce":"$undefined"}]],["$","$Ld",null,{"children":["$","$e",null,{"name":"Next.MetadataOutlet","children":"$@f"}]}]]}],{},null,false,null]},null,false,null],["$","$1","h",{"children":[null,["$","$L10",null,{"children":"$L11"}],["$","div",null,{"hidden":true,"children":["$","$L12",null,{"children":["$","$e",null,{"name":"Next.Metadata","children":"$L13"}]}]}],null]}],false]],"m":"$undefined","G":["$14",[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/09kgf98j6rdse.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"MKsV9_ZtzPcZHC3V_SATf"} b:{} c:"$0:f:0:1:1:children:0:props:children:0:props:serverProvidedParams:params" 11:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]] diff --git a/apps/web/.next/standalone/apps/web/.next/server/app/index.segments/_head.segment.rsc b/apps/web/.next/standalone/apps/web/.next/server/app/index.segments/_head.segment.rsc index efd3abd..4855c97 100644 --- a/apps/web/.next/standalone/apps/web/.next/server/app/index.segments/_head.segment.rsc +++ b/apps/web/.next/standalone/apps/web/.next/server/app/index.segments/_head.segment.rsc @@ -3,4 +3,4 @@ 3:I[97367,["/_next/static/chunks/00hu_su7n8gvm.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"MetadataBoundary"] 4:"$Sreact.suspense" 5:I[27201,["/_next/static/chunks/00hu_su7n8gvm.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"IconMark"] -0:{"rsc":["$","$1","h",{"children":[null,["$","$L2",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]}],["$","div",null,{"hidden":true,"children":["$","$L3",null,{"children":["$","$4",null,{"name":"Next.Metadata","children":[["$","title","0",{"children":"TimeToLeave"}],["$","meta","1",{"name":"description","content":"Plan your train journeys and compare with bicycle routing"}],["$","link","2",{"rel":"icon","href":"/favicon.ico?favicon.0x3dzn~oxb6tn.ico","sizes":"256x256","type":"image/x-icon"}],["$","$L5","3",{}]]}]}]}],null]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"pcsiH5B97Wet0aRbzsRfL"} +0:{"rsc":["$","$1","h",{"children":[null,["$","$L2",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]}],["$","div",null,{"hidden":true,"children":["$","$L3",null,{"children":["$","$4",null,{"name":"Next.Metadata","children":[["$","title","0",{"children":"TimeToLeave"}],["$","meta","1",{"name":"description","content":"Plan your train journeys and compare with bicycle routing"}],["$","link","2",{"rel":"icon","href":"/favicon.ico?favicon.0x3dzn~oxb6tn.ico","sizes":"256x256","type":"image/x-icon"}],["$","$L5","3",{}]]}]}]}],null]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"MKsV9_ZtzPcZHC3V_SATf"} diff --git a/apps/web/.next/standalone/apps/web/.next/server/app/index.segments/_index.segment.rsc b/apps/web/.next/standalone/apps/web/.next/server/app/index.segments/_index.segment.rsc index 5a09784..bf761b9 100644 --- a/apps/web/.next/standalone/apps/web/.next/server/app/index.segments/_index.segment.rsc +++ b/apps/web/.next/standalone/apps/web/.next/server/app/index.segments/_index.segment.rsc @@ -7,4 +7,4 @@ 7:I[37457,["/_next/static/chunks/00hu_su7n8gvm.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default"] 8:I[4035,["/_next/static/chunks/00hu_su7n8gvm.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default"] :HL["/_next/static/chunks/09kgf98j6rdse.css","style"] -0:{"rsc":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/09kgf98j6rdse.css","precedence":"next"}],["$","script","script-0",{"src":"/_next/static/chunks/00hu_su7n8gvm.js","async":true}],["$","script","script-1",{"src":"/_next/static/chunks/0d3shmwh5_nmn.js","async":true}]],["$","html",null,{"lang":"en","className":"h-full antialiased","children":["$","body",null,{"className":"min-h-full flex flex-col bg-gray-50 dark:bg-gray-900","children":["$","$L2",null,{"children":["$","$L3",null,{"children":[["$","$L4",null,{}],["$","$L5",null,{}],["$","div",null,{"className":"flex-1","children":["$","$L6",null,{"parallelRouterKey":"children","template":["$","$L7",null,{}],"notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]]}]}],["$","$L8",null,{}]]}]}]}]}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"pcsiH5B97Wet0aRbzsRfL"} +0:{"rsc":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/09kgf98j6rdse.css","precedence":"next"}],["$","script","script-0",{"src":"/_next/static/chunks/00hu_su7n8gvm.js","async":true}],["$","script","script-1",{"src":"/_next/static/chunks/0d3shmwh5_nmn.js","async":true}]],["$","html",null,{"lang":"en","className":"h-full antialiased","children":["$","body",null,{"className":"min-h-full flex flex-col bg-gray-50 dark:bg-gray-900","children":["$","$L2",null,{"children":["$","$L3",null,{"children":[["$","$L4",null,{}],["$","$L5",null,{}],["$","div",null,{"className":"flex-1","children":["$","$L6",null,{"parallelRouterKey":"children","template":["$","$L7",null,{}],"notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]]}]}],["$","$L8",null,{}]]}]}]}]}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"MKsV9_ZtzPcZHC3V_SATf"} diff --git a/apps/web/.next/standalone/apps/web/.next/server/app/index.segments/_tree.segment.rsc b/apps/web/.next/standalone/apps/web/.next/server/app/index.segments/_tree.segment.rsc index 2aad080..3514949 100644 --- a/apps/web/.next/standalone/apps/web/.next/server/app/index.segments/_tree.segment.rsc +++ b/apps/web/.next/standalone/apps/web/.next/server/app/index.segments/_tree.segment.rsc @@ -1,2 +1,2 @@ :HL["/_next/static/chunks/09kgf98j6rdse.css","style"] -0:{"tree":{"name":"","param":null,"prefetchHints":16,"slots":{"children":{"name":"__PAGE__","param":null,"prefetchHints":0,"slots":null}}},"staleTime":300,"buildId":"pcsiH5B97Wet0aRbzsRfL"} +0:{"tree":{"name":"","param":null,"prefetchHints":16,"slots":{"children":{"name":"__PAGE__","param":null,"prefetchHints":0,"slots":null}}},"staleTime":300,"buildId":"MKsV9_ZtzPcZHC3V_SATf"} diff --git a/apps/web/.next/standalone/apps/web/.next/server/middleware-build-manifest.js b/apps/web/.next/standalone/apps/web/.next/server/middleware-build-manifest.js index 14473ae..7889c8a 100644 --- a/apps/web/.next/standalone/apps/web/.next/server/middleware-build-manifest.js +++ b/apps/web/.next/standalone/apps/web/.next/server/middleware-build-manifest.js @@ -7,9 +7,9 @@ globalThis.__BUILD_MANIFEST = { "static/chunks/03~yq9q893hmn.js" ], "lowPriorityFiles": [ - "static/pcsiH5B97Wet0aRbzsRfL/_buildManifest.js", - "static/pcsiH5B97Wet0aRbzsRfL/_ssgManifest.js", - "static/pcsiH5B97Wet0aRbzsRfL/_clientMiddlewareManifest.js" + "static/MKsV9_ZtzPcZHC3V_SATf/_buildManifest.js", + "static/MKsV9_ZtzPcZHC3V_SATf/_ssgManifest.js", + "static/MKsV9_ZtzPcZHC3V_SATf/_clientMiddlewareManifest.js" ], "rootMainFiles": [ "static/chunks/0bzupvr5gt3k9.js", diff --git a/apps/web/.next/standalone/apps/web/.next/server/middleware-manifest.json b/apps/web/.next/standalone/apps/web/.next/server/middleware-manifest.json index eb7130b..2027899 100644 --- a/apps/web/.next/standalone/apps/web/.next/server/middleware-manifest.json +++ b/apps/web/.next/standalone/apps/web/.next/server/middleware-manifest.json @@ -1,6 +1,34 @@ { "version": 3, - "middleware": {}, - "sortedMiddleware": [], + "middleware": { + "/": { + "files": [ + "server/edge/chunks/node_modules_next_dist_esm_build_templates_edge-wrapper_0.-2ip1.js", + "server/edge/chunks/[root-of-the-server]__0d3wooi._.js", + "server/edge/chunks/turbopack-node_modules_next_dist_esm_build_templates_edge-wrapper_11d2rrp.js" + ], + "name": "middleware", + "page": "/", + "entrypoint": "server/edge/chunks/turbopack-node_modules_next_dist_esm_build_templates_edge-wrapper_11d2rrp.js", + "matchers": [ + { + "regexp": "^(?:\\/(_next\\/data\\/[^/]{1,}))?\\/api(?:\\/((?:[^\\/#\\?]+?)(?:\\/(?:[^\\/#\\?]+?))*))?(\\.json|\\.rsc|\\.segments\\/.+\\.segment\\.rsc)?[\\/#\\?]?$", + "originalSource": "/api/:path*" + } + ], + "wasm": [], + "assets": [], + "env": { + "__NEXT_BUILD_ID": "MKsV9_ZtzPcZHC3V_SATf", + "NEXT_SERVER_ACTIONS_ENCRYPTION_KEY": "/yKuar/lNJm6n0BiaYuybEOydwmSTtDZx0xYSWrJZoA=", + "__NEXT_PREVIEW_MODE_ID": "baf3938ffaadb817e47a139da2f1e5f7", + "__NEXT_PREVIEW_MODE_ENCRYPTION_KEY": "9bbc7f67b1c70e4346137e4a67ae64169723610603f114ab07e5cde96b60dff0", + "__NEXT_PREVIEW_MODE_SIGNING_KEY": "927be125ed80b259d703d1ae97343ab7fd97ea202ddcdcbae0569f19839dc5dc" + } + } + }, + "sortedMiddleware": [ + "/" + ], "functions": {} } \ No newline at end of file diff --git a/apps/web/.next/standalone/apps/web/.next/server/pages/404.html b/apps/web/.next/standalone/apps/web/.next/server/pages/404.html index 03700ab..833c1d2 100644 --- a/apps/web/.next/standalone/apps/web/.next/server/pages/404.html +++ b/apps/web/.next/standalone/apps/web/.next/server/pages/404.html @@ -1 +1 @@ -404: This page could not be found.TimeToLeave

ÖBB Planner

404

This page could not be found.

\ No newline at end of file +404: This page could not be found.TimeToLeave

ÖBB Planner

404

This page could not be found.

\ No newline at end of file diff --git a/apps/web/.next/standalone/apps/web/.next/server/pages/500.html b/apps/web/.next/standalone/apps/web/.next/server/pages/500.html index 19a5e8b..38abfe5 100644 --- a/apps/web/.next/standalone/apps/web/.next/server/pages/500.html +++ b/apps/web/.next/standalone/apps/web/.next/server/pages/500.html @@ -1 +1 @@ -500: This page couldn’t load

This page couldn’t load

A server error occurred. Reload to try again.

\ No newline at end of file +500: This page couldn’t load

This page couldn’t load

A server error occurred. Reload to try again.

\ No newline at end of file diff --git a/apps/web/.next/standalone/apps/web/package.json b/apps/web/.next/standalone/apps/web/package.json index a7a4dfa..bffdb14 100644 --- a/apps/web/.next/standalone/apps/web/package.json +++ b/apps/web/.next/standalone/apps/web/package.json @@ -21,6 +21,7 @@ "devDependencies": { "@tailwindcss/postcss": "^4", "@testing-library/jest-dom": "^6.9.1", + "@testing-library/dom": "^10.4.1", "@testing-library/react": "^16.3.2", "@types/node": "^20", "@types/react": "^19", diff --git a/apps/web/.next/standalone/apps/web/server.js b/apps/web/.next/standalone/apps/web/server.js index 34a84fe..b4de4fb 100644 --- a/apps/web/.next/standalone/apps/web/server.js +++ b/apps/web/.next/standalone/apps/web/server.js @@ -9,7 +9,7 @@ const currentPort = parseInt(process.env.PORT, 10) || 3000 const hostname = process.env.HOSTNAME || '0.0.0.0' let keepAliveTimeout = parseInt(process.env.KEEP_ALIVE_TIMEOUT, 10) -const nextConfig = {"env":{},"webpack":null,"typescript":{"ignoreBuildErrors":false},"typedRoutes":false,"distDir":"./.next","cleanDistDir":true,"assetPrefix":"","cacheMaxMemorySize":52428800,"configOrigin":"next.config.ts","useFileSystemPublicRoutes":true,"generateEtags":true,"pageExtensions":["tsx","ts","jsx","js"],"poweredByHeader":true,"compress":true,"images":{"deviceSizes":[640,750,828,1080,1200,1920,2048,3840],"imageSizes":[32,48,64,96,128,256,384],"path":"/_next/image","loader":"default","loaderFile":"","domains":[],"disableStaticImages":false,"minimumCacheTTL":14400,"formats":["image/webp"],"maximumRedirects":3,"maximumResponseBody":50000000,"dangerouslyAllowLocalIP":false,"dangerouslyAllowSVG":false,"contentSecurityPolicy":"script-src 'none'; frame-src 'none'; sandbox;","contentDispositionType":"attachment","localPatterns":[{"pathname":"**","search":""}],"remotePatterns":[],"qualities":[75],"unoptimized":false,"customCacheHandler":false},"devIndicators":{"position":"bottom-left"},"onDemandEntries":{"maxInactiveAge":60000,"pagesBufferLength":5},"basePath":"","sassOptions":{},"trailingSlash":false,"i18n":null,"productionBrowserSourceMaps":false,"excludeDefaultMomentLocales":true,"reactProductionProfiling":false,"reactStrictMode":null,"reactMaxHeadersLength":6000,"httpAgentOptions":{"keepAlive":true},"logging":{"serverFunctions":true,"browserToTerminal":"warn"},"compiler":{},"expireTime":31536000,"staticPageGenerationTimeout":60,"output":"standalone","modularizeImports":{"@mui/icons-material":{"transform":"@mui/icons-material/{{member}}"},"lodash":{"transform":"lodash/{{member}}"}},"outputFileTracingRoot":"/home/fegger/Code/TimeToLeave","cacheComponents":false,"cacheLife":{"default":{"stale":300,"revalidate":900,"expire":4294967294},"seconds":{"stale":30,"revalidate":1,"expire":60},"minutes":{"stale":300,"revalidate":60,"expire":3600},"hours":{"stale":300,"revalidate":3600,"expire":86400},"days":{"stale":300,"revalidate":86400,"expire":604800},"weeks":{"stale":300,"revalidate":604800,"expire":2592000},"max":{"stale":300,"revalidate":2592000,"expire":31536000}},"cacheHandlers":{},"experimental":{"appNewScrollHandler":false,"useSkewCookie":false,"cssChunking":true,"multiZoneDraftMode":false,"appNavFailHandling":false,"prerenderEarlyExit":true,"serverMinification":true,"linkNoTouchStart":false,"caseSensitiveRoutes":false,"cachedNavigations":false,"partialFallbacks":false,"dynamicOnHover":false,"varyParams":false,"prefetchInlining":false,"preloadEntriesOnStart":true,"clientRouterFilter":true,"clientRouterFilterRedirects":false,"fetchCacheKeyPrefix":"","proxyPrefetch":"flexible","optimisticClientCache":true,"manualClientBasePath":false,"cpus":11,"memoryBasedWorkersCount":false,"imgOptConcurrency":null,"imgOptTimeoutInSeconds":7,"imgOptMaxInputPixels":268402689,"imgOptSequentialRead":null,"imgOptSkipMetadata":null,"isrFlushToDisk":true,"workerThreads":false,"optimizeCss":false,"nextScriptWorkers":false,"scrollRestoration":false,"externalDir":false,"disableOptimizedLoading":false,"gzipSize":true,"craCompat":false,"esmExternals":true,"fullySpecified":false,"swcTraceProfiling":false,"forceSwcTransforms":false,"largePageDataBytes":128000,"typedEnv":false,"parallelServerCompiles":false,"parallelServerBuildTraces":false,"ppr":false,"authInterrupts":false,"webpackMemoryOptimizations":false,"optimizeServerReact":true,"strictRouteTypes":false,"viewTransition":false,"removeUncaughtErrorAndRejectionListeners":false,"validateRSCRequestHeaders":false,"staleTimes":{"dynamic":0,"static":300},"reactDebugChannel":true,"serverComponentsHmrCache":true,"staticGenerationMaxConcurrency":8,"staticGenerationMinPagesPerWorker":25,"transitionIndicator":false,"gestureTransition":false,"inlineCss":false,"useCache":false,"globalNotFound":false,"browserDebugInfoInTerminal":"warn","lockDistDir":true,"proxyClientMaxBodySize":10485760,"hideLogsAfterAbort":false,"mcpServer":true,"turbopackFileSystemCacheForDev":true,"turbopackFileSystemCacheForBuild":false,"turbopackInferModuleSideEffects":true,"turbopackPluginRuntimeStrategy":"childProcesses","optimizePackageImports":["lucide-react","date-fns","lodash-es","ramda","antd","react-bootstrap","ahooks","@ant-design/icons","@headlessui/react","@headlessui-float/react","@heroicons/react/20/solid","@heroicons/react/24/solid","@heroicons/react/24/outline","@visx/visx","@tremor/react","rxjs","@mui/material","@mui/icons-material","recharts","react-use","effect","@effect/schema","@effect/platform","@effect/platform-node","@effect/platform-browser","@effect/platform-bun","@effect/sql","@effect/sql-mssql","@effect/sql-mysql2","@effect/sql-pg","@effect/sql-sqlite-node","@effect/sql-sqlite-bun","@effect/sql-sqlite-wasm","@effect/sql-sqlite-react-native","@effect/rpc","@effect/rpc-http","@effect/typeclass","@effect/experimental","@effect/opentelemetry","@material-ui/core","@material-ui/icons","@tabler/icons-react","mui-core","react-icons/ai","react-icons/bi","react-icons/bs","react-icons/cg","react-icons/ci","react-icons/di","react-icons/fa","react-icons/fa6","react-icons/fc","react-icons/fi","react-icons/gi","react-icons/go","react-icons/gr","react-icons/hi","react-icons/hi2","react-icons/im","react-icons/io","react-icons/io5","react-icons/lia","react-icons/lib","react-icons/lu","react-icons/md","react-icons/pi","react-icons/ri","react-icons/rx","react-icons/si","react-icons/sl","react-icons/tb","react-icons/tfi","react-icons/ti","react-icons/vsc","react-icons/wi"],"trustHostHeader":false,"isExperimentalCompile":false},"htmlLimitedBots":"[\\w-]+-Google|Google-[\\w-]+|Chrome-Lighthouse|Slurp|DuckDuckBot|baiduspider|yandex|sogou|bitlybot|tumblr|vkShare|quora link preview|redditbot|ia_archiver|Bingbot|BingPreview|applebot|facebookexternalhit|facebookcatalog|Twitterbot|LinkedInBot|Slackbot|Discordbot|WhatsApp|SkypeUriPreview|Yeti|googleweblight","bundlePagesRouterDependencies":false,"configFileName":"next.config.ts","serverExternalPackages":["node-ical"],"turbopack":{"root":"/home/fegger/Code/TimeToLeave"},"distDirRoot":".next"} +const nextConfig = {"env":{"CORS_ALLOWED_ORIGINS":"*","DEPLOYMENT_URL":"http://localhost:3000"},"webpack":null,"typescript":{"ignoreBuildErrors":false},"typedRoutes":false,"distDir":"./.next","cleanDistDir":true,"assetPrefix":"","cacheMaxMemorySize":52428800,"configOrigin":"next.config.ts","useFileSystemPublicRoutes":true,"generateEtags":true,"pageExtensions":["tsx","ts","jsx","js"],"poweredByHeader":true,"compress":true,"images":{"deviceSizes":[640,750,828,1080,1200,1920,2048,3840],"imageSizes":[32,48,64,96,128,256,384],"path":"/_next/image","loader":"default","loaderFile":"","domains":[],"disableStaticImages":false,"minimumCacheTTL":14400,"formats":["image/webp"],"maximumRedirects":3,"maximumResponseBody":50000000,"dangerouslyAllowLocalIP":false,"dangerouslyAllowSVG":false,"contentSecurityPolicy":"script-src 'none'; frame-src 'none'; sandbox;","contentDispositionType":"attachment","localPatterns":[{"pathname":"**","search":""}],"remotePatterns":[],"qualities":[75],"unoptimized":false,"customCacheHandler":false},"devIndicators":{"position":"bottom-left"},"onDemandEntries":{"maxInactiveAge":60000,"pagesBufferLength":5},"basePath":"","sassOptions":{},"trailingSlash":false,"i18n":null,"productionBrowserSourceMaps":false,"excludeDefaultMomentLocales":true,"reactProductionProfiling":false,"reactStrictMode":null,"reactMaxHeadersLength":6000,"httpAgentOptions":{"keepAlive":true},"logging":{"serverFunctions":true,"browserToTerminal":"warn"},"compiler":{},"expireTime":31536000,"staticPageGenerationTimeout":60,"output":"standalone","modularizeImports":{"@mui/icons-material":{"transform":"@mui/icons-material/{{member}}"},"lodash":{"transform":"lodash/{{member}}"}},"outputFileTracingRoot":"/home/fegger/Code/TimeToLeave","cacheComponents":false,"cacheLife":{"default":{"stale":300,"revalidate":900,"expire":4294967294},"seconds":{"stale":30,"revalidate":1,"expire":60},"minutes":{"stale":300,"revalidate":60,"expire":3600},"hours":{"stale":300,"revalidate":3600,"expire":86400},"days":{"stale":300,"revalidate":86400,"expire":604800},"weeks":{"stale":300,"revalidate":604800,"expire":2592000},"max":{"stale":300,"revalidate":2592000,"expire":31536000}},"cacheHandlers":{},"experimental":{"appNewScrollHandler":false,"useSkewCookie":false,"cssChunking":true,"multiZoneDraftMode":false,"appNavFailHandling":false,"prerenderEarlyExit":true,"serverMinification":true,"linkNoTouchStart":false,"caseSensitiveRoutes":false,"cachedNavigations":false,"partialFallbacks":false,"dynamicOnHover":false,"varyParams":false,"prefetchInlining":false,"preloadEntriesOnStart":true,"clientRouterFilter":true,"clientRouterFilterRedirects":false,"fetchCacheKeyPrefix":"","proxyPrefetch":"flexible","optimisticClientCache":true,"manualClientBasePath":false,"cpus":11,"memoryBasedWorkersCount":false,"imgOptConcurrency":null,"imgOptTimeoutInSeconds":7,"imgOptMaxInputPixels":268402689,"imgOptSequentialRead":null,"imgOptSkipMetadata":null,"isrFlushToDisk":true,"workerThreads":false,"optimizeCss":false,"nextScriptWorkers":false,"scrollRestoration":false,"externalDir":false,"disableOptimizedLoading":false,"gzipSize":true,"craCompat":false,"esmExternals":true,"fullySpecified":false,"swcTraceProfiling":false,"forceSwcTransforms":false,"largePageDataBytes":128000,"typedEnv":false,"parallelServerCompiles":false,"parallelServerBuildTraces":false,"ppr":false,"authInterrupts":false,"webpackMemoryOptimizations":false,"optimizeServerReact":true,"strictRouteTypes":false,"viewTransition":false,"removeUncaughtErrorAndRejectionListeners":false,"validateRSCRequestHeaders":false,"staleTimes":{"dynamic":0,"static":300},"reactDebugChannel":true,"serverComponentsHmrCache":true,"staticGenerationMaxConcurrency":8,"staticGenerationMinPagesPerWorker":25,"transitionIndicator":false,"gestureTransition":false,"inlineCss":false,"useCache":false,"globalNotFound":false,"browserDebugInfoInTerminal":"warn","lockDistDir":true,"proxyClientMaxBodySize":10485760,"hideLogsAfterAbort":false,"mcpServer":true,"turbopackFileSystemCacheForDev":true,"turbopackFileSystemCacheForBuild":false,"turbopackInferModuleSideEffects":true,"turbopackPluginRuntimeStrategy":"childProcesses","optimizePackageImports":["lucide-react","date-fns","lodash-es","ramda","antd","react-bootstrap","ahooks","@ant-design/icons","@headlessui/react","@headlessui-float/react","@heroicons/react/20/solid","@heroicons/react/24/solid","@heroicons/react/24/outline","@visx/visx","@tremor/react","rxjs","@mui/material","@mui/icons-material","recharts","react-use","effect","@effect/schema","@effect/platform","@effect/platform-node","@effect/platform-browser","@effect/platform-bun","@effect/sql","@effect/sql-mssql","@effect/sql-mysql2","@effect/sql-pg","@effect/sql-sqlite-node","@effect/sql-sqlite-bun","@effect/sql-sqlite-wasm","@effect/sql-sqlite-react-native","@effect/rpc","@effect/rpc-http","@effect/typeclass","@effect/experimental","@effect/opentelemetry","@material-ui/core","@material-ui/icons","@tabler/icons-react","mui-core","react-icons/ai","react-icons/bi","react-icons/bs","react-icons/cg","react-icons/ci","react-icons/di","react-icons/fa","react-icons/fa6","react-icons/fc","react-icons/fi","react-icons/gi","react-icons/go","react-icons/gr","react-icons/hi","react-icons/hi2","react-icons/im","react-icons/io","react-icons/io5","react-icons/lia","react-icons/lib","react-icons/lu","react-icons/md","react-icons/pi","react-icons/ri","react-icons/rx","react-icons/si","react-icons/sl","react-icons/tb","react-icons/tfi","react-icons/ti","react-icons/vsc","react-icons/wi"],"trustHostHeader":false,"isExperimentalCompile":false},"htmlLimitedBots":"[\\w-]+-Google|Google-[\\w-]+|Chrome-Lighthouse|Slurp|DuckDuckBot|baiduspider|yandex|sogou|bitlybot|tumblr|vkShare|quora link preview|redditbot|ia_archiver|Bingbot|BingPreview|applebot|facebookexternalhit|facebookcatalog|Twitterbot|LinkedInBot|Slackbot|Discordbot|WhatsApp|SkypeUriPreview|Yeti|googleweblight","bundlePagesRouterDependencies":false,"configFileName":"next.config.ts","serverExternalPackages":["node-ical"],"turbopack":{"root":"/home/fegger/Code/TimeToLeave"},"distDirRoot":".next"} process.env.__NEXT_PRIVATE_STANDALONE_CONFIG = JSON.stringify(nextConfig) diff --git a/apps/web/.next/static/pcsiH5B97Wet0aRbzsRfL/_buildManifest.js b/apps/web/.next/static/pcsiH5B97Wet0aRbzsRfL/_buildManifest.js deleted file mode 100644 index 94ca914..0000000 --- a/apps/web/.next/static/pcsiH5B97Wet0aRbzsRfL/_buildManifest.js +++ /dev/null @@ -1,11 +0,0 @@ -self.__BUILD_MANIFEST = { - "__rewrites": { - "afterFiles": [], - "beforeFiles": [], - "fallback": [] - }, - "sortedPages": [ - "/_app", - "/_error" - ] -};self.__BUILD_MANIFEST_CB && self.__BUILD_MANIFEST_CB() \ No newline at end of file diff --git a/apps/web/.next/static/pcsiH5B97Wet0aRbzsRfL/_clientMiddlewareManifest.js b/apps/web/.next/static/pcsiH5B97Wet0aRbzsRfL/_clientMiddlewareManifest.js deleted file mode 100644 index a8acaff..0000000 --- a/apps/web/.next/static/pcsiH5B97Wet0aRbzsRfL/_clientMiddlewareManifest.js +++ /dev/null @@ -1 +0,0 @@ -self.__MIDDLEWARE_MATCHERS = [];self.__MIDDLEWARE_MATCHERS_CB && self.__MIDDLEWARE_MATCHERS_CB() \ No newline at end of file diff --git a/apps/web/.next/static/pcsiH5B97Wet0aRbzsRfL/_ssgManifest.js b/apps/web/.next/static/pcsiH5B97Wet0aRbzsRfL/_ssgManifest.js deleted file mode 100644 index 5b3ff59..0000000 --- a/apps/web/.next/static/pcsiH5B97Wet0aRbzsRfL/_ssgManifest.js +++ /dev/null @@ -1 +0,0 @@ -self.__SSG_MANIFEST=new Set([]);self.__SSG_MANIFEST_CB&&self.__SSG_MANIFEST_CB() \ No newline at end of file diff --git a/apps/web/.next/trace b/apps/web/.next/trace index 1eca90c..00ac7c9 100644 --- a/apps/web/.next/trace +++ b/apps/web/.next/trace @@ -1 +1 @@ -[{"name":"generate-buildid","duration":429,"timestamp":130273161751,"id":4,"parentId":1,"tags":{},"startTime":1778439459254,"traceId":"51684b3694759856"},{"name":"load-custom-routes","duration":466,"timestamp":130273162374,"id":5,"parentId":1,"tags":{},"startTime":1778439459254,"traceId":"51684b3694759856"},{"name":"create-dist-dir","duration":249,"timestamp":130273162867,"id":6,"parentId":1,"tags":{},"startTime":1778439459255,"traceId":"51684b3694759856"},{"name":"clean","duration":63978,"timestamp":130273163916,"id":7,"parentId":1,"tags":{},"startTime":1778439459256,"traceId":"51684b3694759856"},{"name":"discover-routes","duration":4715,"timestamp":130273250499,"id":8,"parentId":1,"tags":{},"startTime":1778439459342,"traceId":"51684b3694759856"},{"name":"create-root-mapping","duration":42,"timestamp":130273255257,"id":9,"parentId":1,"tags":{},"startTime":1778439459347,"traceId":"51684b3694759856"},{"name":"generate-route-types","duration":8359,"timestamp":130273256175,"id":10,"parentId":1,"tags":{},"startTime":1778439459348,"traceId":"51684b3694759856"},{"name":"public-dir-conflict-check","duration":104,"timestamp":130273264595,"id":11,"parentId":1,"tags":{},"startTime":1778439459357,"traceId":"51684b3694759856"},{"name":"generate-routes-manifest","duration":1954,"timestamp":130273264793,"id":12,"parentId":1,"tags":{},"startTime":1778439459357,"traceId":"51684b3694759856"},{"name":"run-turbopack","duration":2488691,"timestamp":130273269650,"id":14,"parentId":1,"tags":{},"startTime":1778439459362,"traceId":"51684b3694759856"},{"name":"turbopack-build-events","duration":83,"timestamp":130273458436,"id":15,"parentId":1,"tags":{},"startTime":1778439459550,"traceId":"51684b3694759856"},{"name":"run-typescript","duration":3130624,"timestamp":130275763741,"id":16,"parentId":1,"tags":{},"startTime":1778439461856,"traceId":"51684b3694759856"},{"name":"generate-required-server-files","duration":1331,"timestamp":130278894952,"id":18,"parentId":1,"tags":{},"startTime":1778439464987,"traceId":"51684b3694759856"},{"name":"check-static-error-page","duration":2171,"timestamp":130279041958,"id":20,"parentId":19,"tags":{},"startTime":1778439465134,"traceId":"51684b3694759856"},{"name":"is-page-static","duration":292115,"timestamp":130279046529,"id":42,"parentId":29,"tags":{},"startTime":1778439465139,"traceId":"51684b3694759856"},{"name":"check-page","duration":295271,"timestamp":130279043715,"id":29,"parentId":19,"tags":{"page":"/api/wienerlinien/monitor"},"startTime":1778439465136,"traceId":"51684b3694759856"},{"name":"is-page-static","duration":316096,"timestamp":130279060656,"id":45,"parentId":31,"tags":{},"startTime":1778439465153,"traceId":"51684b3694759856"},{"name":"check-page","duration":333052,"timestamp":130279043793,"id":31,"parentId":19,"tags":{"page":"/calendar"},"startTime":1778439465136,"traceId":"51684b3694759856"},{"name":"is-page-static","duration":339535,"timestamp":130279046632,"id":44,"parentId":32,"tags":{},"startTime":1778439465139,"traceId":"51684b3694759856"},{"name":"check-page","duration":342412,"timestamp":130279043825,"id":32,"parentId":19,"tags":{"page":"/favicon.ico"},"startTime":1778439465136,"traceId":"51684b3694759856"},{"name":"is-page-static","duration":341944,"timestamp":130279060698,"id":46,"parentId":33,"tags":{},"startTime":1778439465153,"traceId":"51684b3694759856"},{"name":"check-page","duration":358637,"timestamp":130279044061,"id":33,"parentId":19,"tags":{"page":"/"},"startTime":1778439465136,"traceId":"51684b3694759856"},{"name":"is-page-static","duration":365544,"timestamp":130279046490,"id":41,"parentId":28,"tags":{},"startTime":1778439465138,"traceId":"51684b3694759856"},{"name":"check-page","duration":368412,"timestamp":130279043687,"id":28,"parentId":19,"tags":{"page":"/api/health"},"startTime":1778439465136,"traceId":"51684b3694759856"},{"name":"is-page-static","duration":366247,"timestamp":130279046346,"id":39,"parentId":26,"tags":{},"startTime":1778439465138,"traceId":"51684b3694759856"},{"name":"check-page","duration":368992,"timestamp":130279043628,"id":26,"parentId":19,"tags":{"page":"/api/geocode"},"startTime":1778439465136,"traceId":"51684b3694759856"},{"name":"is-page-static","duration":377694,"timestamp":130279046431,"id":40,"parentId":27,"tags":{},"startTime":1778439465138,"traceId":"51684b3694759856"},{"name":"check-page","duration":380523,"timestamp":130279043656,"id":27,"parentId":19,"tags":{"page":"/api/hafas"},"startTime":1778439465136,"traceId":"51684b3694759856"},{"name":"is-page-static","duration":393945,"timestamp":130279046595,"id":43,"parentId":30,"tags":{},"startTime":1778439465139,"traceId":"51684b3694759856"},{"name":"check-page","duration":396849,"timestamp":130279043752,"id":30,"parentId":19,"tags":{"page":"/api/wienerlinien/stops"},"startTime":1778439465136,"traceId":"51684b3694759856"},{"name":"is-page-static","duration":395134,"timestamp":130279045899,"id":34,"parentId":21,"tags":{},"startTime":1778439465138,"traceId":"51684b3694759856"},{"name":"check-page","duration":398464,"timestamp":130279042602,"id":21,"parentId":19,"tags":{"page":"/_not-found"},"startTime":1778439465135,"traceId":"51684b3694759856"},{"name":"is-page-static","duration":419927,"timestamp":130279046194,"id":37,"parentId":24,"tags":{},"startTime":1778439465138,"traceId":"51684b3694759856"},{"name":"check-page","duration":422614,"timestamp":130279043569,"id":24,"parentId":19,"tags":{"page":"/api/calendar/parse"},"startTime":1778439465136,"traceId":"51684b3694759856"},{"name":"is-page-static","duration":424029,"timestamp":130279046159,"id":36,"parentId":23,"tags":{},"startTime":1778439465138,"traceId":"51684b3694759856"},{"name":"check-page","duration":426715,"timestamp":130279043520,"id":23,"parentId":19,"tags":{"page":"/api/bike-route"},"startTime":1778439465136,"traceId":"51684b3694759856"},{"name":"is-page-static","duration":430160,"timestamp":130279046109,"id":35,"parentId":22,"tags":{},"startTime":1778439465138,"traceId":"51684b3694759856"},{"name":"check-page","duration":432933,"timestamp":130279043410,"id":22,"parentId":19,"tags":{"page":"/_global-error"},"startTime":1778439465135,"traceId":"51684b3694759856"},{"name":"is-page-static","duration":449199,"timestamp":130279046233,"id":38,"parentId":25,"tags":{},"startTime":1778439465138,"traceId":"51684b3694759856"},{"name":"check-page","duration":451914,"timestamp":130279043600,"id":25,"parentId":19,"tags":{"page":"/api/calendar"},"startTime":1778439465136,"traceId":"51684b3694759856"},{"name":"static-check","duration":454112,"timestamp":130279041463,"id":19,"parentId":1,"tags":{},"startTime":1778439465133,"traceId":"51684b3694759856"},{"name":"write-routes-manifest","duration":279,"timestamp":130279496364,"id":48,"parentId":1,"tags":{},"startTime":1778439465588,"traceId":"51684b3694759856"},{"name":"load-dotenv","duration":18,"timestamp":130279505691,"id":51,"parentId":50,"tags":{},"startTime":1778439465598,"traceId":"51684b3694759856"},{"name":"run-export-path-map","duration":457,"timestamp":130279507264,"id":52,"parentId":50,"tags":{},"startTime":1778439465599,"traceId":"51684b3694759856"},{"name":"next-export","duration":271037,"timestamp":130279504907,"id":50,"parentId":1,"tags":{},"startTime":1778439465597,"traceId":"51684b3694759856"},{"name":"move-exported-app-not-found-","duration":4952,"timestamp":130279778412,"id":53,"parentId":49,"tags":{},"startTime":1778439465870,"traceId":"51684b3694759856"},{"name":"move-exported-app-global-error-","duration":507,"timestamp":130279783508,"id":54,"parentId":49,"tags":{},"startTime":1778439465876,"traceId":"51684b3694759856"},{"name":"static-generation","duration":286038,"timestamp":130279498990,"id":49,"parentId":1,"tags":{},"startTime":1778439465591,"traceId":"51684b3694759856"},{"name":"write-routes-manifest","duration":175,"timestamp":130279785109,"id":55,"parentId":1,"tags":{},"startTime":1778439465877,"traceId":"51684b3694759856"},{"name":"write-standalone-directory","duration":80252,"timestamp":130279800406,"id":57,"parentId":1,"tags":{},"startTime":1778439465892,"traceId":"51684b3694759856"},{"name":"output-standalone","duration":80452,"timestamp":130279800230,"id":56,"parentId":1,"tags":{},"startTime":1778439465892,"traceId":"51684b3694759856"},{"name":"print-tree-view","duration":2171,"timestamp":130279880827,"id":58,"parentId":1,"tags":{},"startTime":1778439465973,"traceId":"51684b3694759856"},{"name":"write-route-bundle-stats","duration":2272,"timestamp":130279883025,"id":59,"parentId":1,"tags":{},"startTime":1778439465975,"traceId":"51684b3694759856"},{"name":"telemetry-flush","duration":136645,"timestamp":130279885318,"id":60,"parentId":1,"tags":{},"startTime":1778439465977,"traceId":"51684b3694759856"},{"name":"next-build","duration":6957042,"timestamp":130273064948,"id":1,"tags":{"buildMode":"default","version":"16.2.6","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778439459157,"traceId":"51684b3694759856"}] +[{"name":"generate-buildid","duration":153,"timestamp":15638857690,"id":4,"parentId":1,"tags":{},"startTime":1778500426027,"traceId":"1032ed70cb17b272"},{"name":"load-custom-routes","duration":262,"timestamp":15638857922,"id":5,"parentId":1,"tags":{},"startTime":1778500426027,"traceId":"1032ed70cb17b272"},{"name":"create-dist-dir","duration":135,"timestamp":15638858203,"id":6,"parentId":1,"tags":{},"startTime":1778500426027,"traceId":"1032ed70cb17b272"},{"name":"clean","duration":34123,"timestamp":15638858772,"id":7,"parentId":1,"tags":{},"startTime":1778500426028,"traceId":"1032ed70cb17b272"},{"name":"discover-routes","duration":3394,"timestamp":15638915480,"id":8,"parentId":1,"tags":{},"startTime":1778500426085,"traceId":"1032ed70cb17b272"},{"name":"create-root-mapping","duration":57,"timestamp":15638918916,"id":9,"parentId":1,"tags":{},"startTime":1778500426088,"traceId":"1032ed70cb17b272"},{"name":"generate-route-types","duration":9111,"timestamp":15638920111,"id":10,"parentId":1,"tags":{},"startTime":1778500426089,"traceId":"1032ed70cb17b272"},{"name":"public-dir-conflict-check","duration":85,"timestamp":15638929282,"id":11,"parentId":1,"tags":{},"startTime":1778500426099,"traceId":"1032ed70cb17b272"},{"name":"generate-routes-manifest","duration":1722,"timestamp":15638929440,"id":12,"parentId":1,"tags":{},"startTime":1778500426099,"traceId":"1032ed70cb17b272"},{"name":"run-turbopack","duration":2165657,"timestamp":15638933042,"id":14,"parentId":1,"tags":{},"startTime":1778500426102,"traceId":"1032ed70cb17b272"},{"name":"turbopack-build-events","duration":49,"timestamp":15639102233,"id":15,"parentId":1,"tags":{},"startTime":1778500426271,"traceId":"1032ed70cb17b272"},{"name":"run-typescript","duration":3086412,"timestamp":15641112458,"id":16,"parentId":1,"tags":{},"startTime":1778500428282,"traceId":"1032ed70cb17b272"},{"name":"generate-required-server-files","duration":1459,"timestamp":15644199935,"id":18,"parentId":1,"tags":{},"startTime":1778500431369,"traceId":"1032ed70cb17b272"},{"name":"check-static-error-page","duration":2669,"timestamp":15644372557,"id":20,"parentId":19,"tags":{},"startTime":1778500431542,"traceId":"1032ed70cb17b272"},{"name":"is-page-static","duration":225644,"timestamp":15644377128,"id":35,"parentId":22,"tags":{},"startTime":1778500431546,"traceId":"1032ed70cb17b272"},{"name":"check-page","duration":228467,"timestamp":15644374576,"id":22,"parentId":19,"tags":{"page":"/_global-error"},"startTime":1778500431544,"traceId":"1032ed70cb17b272"},{"name":"is-page-static","duration":261302,"timestamp":15644377579,"id":42,"parentId":29,"tags":{},"startTime":1778500431547,"traceId":"1032ed70cb17b272"},{"name":"check-page","duration":264094,"timestamp":15644374884,"id":29,"parentId":19,"tags":{"page":"/api/wienerlinien/monitor"},"startTime":1778500431544,"traceId":"1032ed70cb17b272"},{"name":"is-page-static","duration":271475,"timestamp":15644377759,"id":43,"parentId":30,"tags":{},"startTime":1778500431547,"traceId":"1032ed70cb17b272"},{"name":"check-page","duration":274380,"timestamp":15644374919,"id":30,"parentId":19,"tags":{"page":"/api/wienerlinien/stops"},"startTime":1778500431544,"traceId":"1032ed70cb17b272"},{"name":"is-page-static","duration":298195,"timestamp":15644381998,"id":45,"parentId":31,"tags":{},"startTime":1778500431551,"traceId":"1032ed70cb17b272"},{"name":"check-page","duration":305294,"timestamp":15644374957,"id":31,"parentId":19,"tags":{"page":"/calendar"},"startTime":1778500431544,"traceId":"1032ed70cb17b272"},{"name":"is-page-static","duration":304871,"timestamp":15644382051,"id":46,"parentId":33,"tags":{},"startTime":1778500431551,"traceId":"1032ed70cb17b272"},{"name":"check-page","duration":311788,"timestamp":15644375191,"id":33,"parentId":19,"tags":{"page":"/"},"startTime":1778500431544,"traceId":"1032ed70cb17b272"},{"name":"is-page-static","duration":320090,"timestamp":15644377256,"id":38,"parentId":25,"tags":{},"startTime":1778500431547,"traceId":"1032ed70cb17b272"},{"name":"check-page","duration":322620,"timestamp":15644374786,"id":25,"parentId":19,"tags":{"page":"/api/calendar"},"startTime":1778500431544,"traceId":"1032ed70cb17b272"},{"name":"is-page-static","duration":328262,"timestamp":15644377175,"id":36,"parentId":23,"tags":{},"startTime":1778500431546,"traceId":"1032ed70cb17b272"},{"name":"check-page","duration":330779,"timestamp":15644374699,"id":23,"parentId":19,"tags":{"page":"/api/bike-route"},"startTime":1778500431544,"traceId":"1032ed70cb17b272"},{"name":"is-page-static","duration":334220,"timestamp":15644377215,"id":37,"parentId":24,"tags":{},"startTime":1778500431546,"traceId":"1032ed70cb17b272"},{"name":"check-page","duration":336740,"timestamp":15644374752,"id":24,"parentId":19,"tags":{"page":"/api/calendar/parse"},"startTime":1778500431544,"traceId":"1032ed70cb17b272"},{"name":"is-page-static","duration":334214,"timestamp":15644377375,"id":39,"parentId":26,"tags":{},"startTime":1778500431547,"traceId":"1032ed70cb17b272"},{"name":"check-page","duration":336795,"timestamp":15644374811,"id":26,"parentId":19,"tags":{"page":"/api/geocode"},"startTime":1778500431544,"traceId":"1032ed70cb17b272"},{"name":"is-page-static","duration":336573,"timestamp":15644377539,"id":41,"parentId":28,"tags":{},"startTime":1778500431547,"traceId":"1032ed70cb17b272"},{"name":"check-page","duration":339287,"timestamp":15644374861,"id":28,"parentId":19,"tags":{"page":"/api/health"},"startTime":1778500431544,"traceId":"1032ed70cb17b272"},{"name":"is-page-static","duration":347856,"timestamp":15644377475,"id":40,"parentId":27,"tags":{},"startTime":1778500431547,"traceId":"1032ed70cb17b272"},{"name":"check-page","duration":350574,"timestamp":15644374836,"id":27,"parentId":19,"tags":{"page":"/api/hafas"},"startTime":1778500431544,"traceId":"1032ed70cb17b272"},{"name":"is-page-static","duration":354984,"timestamp":15644377864,"id":44,"parentId":32,"tags":{},"startTime":1778500431547,"traceId":"1032ed70cb17b272"},{"name":"check-page","duration":357916,"timestamp":15644374985,"id":32,"parentId":19,"tags":{"page":"/favicon.ico"},"startTime":1778500431544,"traceId":"1032ed70cb17b272"},{"name":"is-page-static","duration":357584,"timestamp":15644376918,"id":34,"parentId":21,"tags":{},"startTime":1778500431546,"traceId":"1032ed70cb17b272"},{"name":"check-page","duration":360933,"timestamp":15644373618,"id":21,"parentId":19,"tags":{"page":"/_not-found"},"startTime":1778500431543,"traceId":"1032ed70cb17b272"},{"name":"static-check","duration":362759,"timestamp":15644371819,"id":19,"parentId":1,"tags":{},"startTime":1778500431541,"traceId":"1032ed70cb17b272"},{"name":"write-routes-manifest","duration":354,"timestamp":15644739304,"id":48,"parentId":1,"tags":{},"startTime":1778500431909,"traceId":"1032ed70cb17b272"},{"name":"load-dotenv","duration":19,"timestamp":15644748070,"id":51,"parentId":50,"tags":{},"startTime":1778500431917,"traceId":"1032ed70cb17b272"},{"name":"run-export-path-map","duration":343,"timestamp":15644749153,"id":52,"parentId":50,"tags":{},"startTime":1778500431918,"traceId":"1032ed70cb17b272"},{"name":"next-export","duration":212875,"timestamp":15644747336,"id":50,"parentId":1,"tags":{},"startTime":1778500431917,"traceId":"1032ed70cb17b272"},{"name":"move-exported-app-not-found-","duration":670,"timestamp":15644961631,"id":53,"parentId":49,"tags":{},"startTime":1778500432131,"traceId":"1032ed70cb17b272"},{"name":"move-exported-app-global-error-","duration":303,"timestamp":15644962360,"id":54,"parentId":49,"tags":{},"startTime":1778500432132,"traceId":"1032ed70cb17b272"},{"name":"static-generation","duration":220979,"timestamp":15644742454,"id":49,"parentId":1,"tags":{},"startTime":1778500431912,"traceId":"1032ed70cb17b272"},{"name":"write-routes-manifest","duration":125,"timestamp":15644963502,"id":55,"parentId":1,"tags":{},"startTime":1778500432133,"traceId":"1032ed70cb17b272"},{"name":"write-standalone-directory","duration":58482,"timestamp":15644975126,"id":57,"parentId":1,"tags":{},"startTime":1778500432144,"traceId":"1032ed70cb17b272"},{"name":"output-standalone","duration":58646,"timestamp":15644975026,"id":56,"parentId":1,"tags":{},"startTime":1778500432144,"traceId":"1032ed70cb17b272"},{"name":"print-tree-view","duration":1850,"timestamp":15645034120,"id":58,"parentId":1,"tags":{},"startTime":1778500432203,"traceId":"1032ed70cb17b272"},{"name":"write-route-bundle-stats","duration":2027,"timestamp":15645036008,"id":59,"parentId":1,"tags":{},"startTime":1778500432205,"traceId":"1032ed70cb17b272"},{"name":"telemetry-flush","duration":132546,"timestamp":15645038055,"id":60,"parentId":1,"tags":{},"startTime":1778500432207,"traceId":"1032ed70cb17b272"},{"name":"next-build","duration":6341165,"timestamp":15638829464,"id":1,"tags":{"buildMode":"default","version":"16.2.6","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778500425999,"traceId":"1032ed70cb17b272"}] diff --git a/apps/web/.next/trace-build b/apps/web/.next/trace-build index 505558c..1d7ac01 100644 --- a/apps/web/.next/trace-build +++ b/apps/web/.next/trace-build @@ -1 +1 @@ -[{"name":"run-turbopack","duration":2488691,"timestamp":130273269650,"id":14,"parentId":1,"tags":{},"startTime":1778439459362,"traceId":"51684b3694759856"},{"name":"turbopack-build-events","duration":83,"timestamp":130273458436,"id":15,"parentId":1,"tags":{},"startTime":1778439459550,"traceId":"51684b3694759856"},{"name":"run-typescript","duration":3130624,"timestamp":130275763741,"id":16,"parentId":1,"tags":{},"startTime":1778439461856,"traceId":"51684b3694759856"},{"name":"static-check","duration":454112,"timestamp":130279041463,"id":19,"parentId":1,"tags":{},"startTime":1778439465133,"traceId":"51684b3694759856"},{"name":"static-generation","duration":286038,"timestamp":130279498990,"id":49,"parentId":1,"tags":{},"startTime":1778439465591,"traceId":"51684b3694759856"},{"name":"output-standalone","duration":80452,"timestamp":130279800230,"id":56,"parentId":1,"tags":{},"startTime":1778439465892,"traceId":"51684b3694759856"},{"name":"telemetry-flush","duration":136645,"timestamp":130279885318,"id":60,"parentId":1,"tags":{},"startTime":1778439465977,"traceId":"51684b3694759856"},{"name":"next-build","duration":6957042,"timestamp":130273064948,"id":1,"tags":{"buildMode":"default","version":"16.2.6","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778439459157,"traceId":"51684b3694759856"}] +[{"name":"run-turbopack","duration":2165657,"timestamp":15638933042,"id":14,"parentId":1,"tags":{},"startTime":1778500426102,"traceId":"1032ed70cb17b272"},{"name":"turbopack-build-events","duration":49,"timestamp":15639102233,"id":15,"parentId":1,"tags":{},"startTime":1778500426271,"traceId":"1032ed70cb17b272"},{"name":"run-typescript","duration":3086412,"timestamp":15641112458,"id":16,"parentId":1,"tags":{},"startTime":1778500428282,"traceId":"1032ed70cb17b272"},{"name":"static-check","duration":362759,"timestamp":15644371819,"id":19,"parentId":1,"tags":{},"startTime":1778500431541,"traceId":"1032ed70cb17b272"},{"name":"static-generation","duration":220979,"timestamp":15644742454,"id":49,"parentId":1,"tags":{},"startTime":1778500431912,"traceId":"1032ed70cb17b272"},{"name":"output-standalone","duration":58646,"timestamp":15644975026,"id":56,"parentId":1,"tags":{},"startTime":1778500432144,"traceId":"1032ed70cb17b272"},{"name":"telemetry-flush","duration":132546,"timestamp":15645038055,"id":60,"parentId":1,"tags":{},"startTime":1778500432207,"traceId":"1032ed70cb17b272"},{"name":"next-build","duration":6341165,"timestamp":15638829464,"id":1,"tags":{"buildMode":"default","version":"16.2.6","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778500425999,"traceId":"1032ed70cb17b272"}] diff --git a/apps/web/next.config.ts b/apps/web/next.config.ts index f579341..722f869 100644 --- a/apps/web/next.config.ts +++ b/apps/web/next.config.ts @@ -3,6 +3,20 @@ import type { NextConfig } from "next"; const nextConfig: NextConfig = { output: "standalone", serverExternalPackages: ["node-ical"], + env: { + CORS_ALLOWED_ORIGINS: process.env.CORS_ALLOWED_ORIGINS, + DEPLOYMENT_URL: process.env.DEPLOYMENT_URL, + }, }; +// Validate environment variables at build time +if (process.env.NODE_ENV === 'production') { + if (!process.env.CORS_ALLOWED_ORIGINS) { + throw new Error('Missing CORS_ALLOWED_ORIGINS environment variable in production'); + } + if (!process.env.DEPLOYMENT_URL) { + throw new Error('Missing DEPLOYMENT_URL environment variable in production'); + } +} + export default nextConfig; diff --git a/apps/web/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json b/apps/web/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json index ead918a..7456507 100644 --- a/apps/web/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +++ b/apps/web/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json @@ -1 +1 @@ -{"version":"4.1.5","results":[[":src/hooks/__tests__/useReminder.test.tsx",{"duration":67.8894879999998,"failed":false}],[":src/app/api/wienerlinien/stops/__tests__/route.test.ts",{"duration":48.40527399999996,"failed":false}],[":src/lib/__tests__/wienerlinien-client.test.ts",{"duration":12.656690000000026,"failed":false}],[":src/lib/__tests__/hafas-time.test.ts",{"duration":34.53456600000004,"failed":false}],[":src/app/api/wienerlinien/monitor/__tests__/route.test.ts",{"duration":27.283642999999984,"failed":false}],[":src/lib/__tests__/calendar-utils.test.ts",{"duration":8.794370999999956,"failed":false}],[":src/app/event/__tests__/EventCard.test.tsx",{"duration":98.56559299999981,"failed":false}],[":src/lib/__tests__/api-service.test.ts",{"duration":60.67743799999994,"failed":false}],[":src/lib/__tests__/hafas-client.test.ts",{"duration":4293.082399,"failed":false}],[":src/lib/__tests__/geocoding-client.test.ts",{"duration":2121.7380169999997,"failed":false}],[":src/hooks/__tests__/useWienerLinien.test.ts",{"duration":65.84604800000011,"failed":false}],[":src/hooks/__tests__/useJourneys.test.ts",{"duration":243.63465800000017,"failed":false}],[":src/app/event/__tests__/WienerLinienSection.test.tsx",{"duration":146.3176759999999,"failed":false}],[":src/lib/__tests__/countdown-utils.test.ts",{"duration":3.2089169999999285,"failed":false}],[":src/app/api/__tests__/geocode.test.ts",{"duration":19.50615700000003,"failed":false}],[":src/app/api/__tests__/bike-route.test.ts",{"duration":19.419233000000077,"failed":false}],[":src/app/calendar/__tests__/CalendarView.test.tsx",{"duration":73.80535599999985,"failed":false}],[":src/hooks/__tests__/useBikeRoute.test.ts",{"duration":210.3314519999999,"failed":false}],[":src/lib/__tests__/constants.test.ts",{"duration":5.045508000000041,"failed":false}]]} \ No newline at end of file +{"version":"4.1.5","results":[[":src/lib/__tests__/hafas-client.test.ts",{"duration":3981.5076039999994,"failed":false}],[":src/app/event/__tests__/EventCard.test.tsx",{"duration":86.31673999999975,"failed":false}],[":src/lib/__tests__/hafas-time.test.ts",{"duration":31.295493999999962,"failed":false}],[":src/lib/__tests__/calendar-utils.test.ts",{"duration":13.02209999999991,"failed":false}],[":src/lib/__tests__/geocoding-client.test.ts",{"duration":2098.29757,"failed":false}],[":src/hooks/__tests__/useReminder.test.tsx",{"duration":58.96350099999995,"failed":false}],[":src/hooks/__tests__/useWienerLinien.test.ts",{"duration":91.7685570000001,"failed":false}],[":src/lib/__tests__/wienerlinien-client.test.ts",{"duration":18.296495999999934,"failed":false}],[":src/lib/__tests__/api-service.test.ts",{"duration":71.45395499999995,"failed":false}],[":src/app/api/wienerlinien/monitor/__tests__/route.test.ts",{"duration":21.57249200000001,"failed":false}],[":src/app/api/wienerlinien/stops/__tests__/route.test.ts",{"duration":53.28839500000004,"failed":false}],[":src/__tests__/middleware.test.ts",{"duration":8.105226000000016,"failed":false}],[":src/hooks/__tests__/useJourneys.test.ts",{"duration":222.98069600000008,"failed":false}],[":src/app/event/__tests__/WienerLinienSection.test.tsx",{"duration":70.98355300000003,"failed":false}],[":src/app/api/__tests__/geocode.test.ts",{"duration":23.987784000000147,"failed":false}],[":src/app/api/__tests__/bike-route.test.ts",{"duration":16.915164000000004,"failed":false}],[":src/lib/__tests__/countdown-utils.test.ts",{"duration":3.030644999999936,"failed":false}],[":src/hooks/__tests__/useBikeRoute.test.ts",{"duration":194.18994099999986,"failed":false}],[":src/app/calendar/__tests__/CalendarView.test.tsx",{"duration":91.62786400000005,"failed":false}],[":src/lib/__tests__/constants.test.ts",{"duration":6.45920799999999,"failed":false}]]} \ No newline at end of file diff --git a/apps/web/package.json b/apps/web/package.json index a7a4dfa..7c6b43b 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -12,6 +12,8 @@ "test:watch": "vitest" }, "dependencies": { + "@timetoleave/api-client": "*", + "@timetoleave/core": "*", "date-fns": "^4.1.0", "next": "^16.2.6", "node-ical": "^0.26.1", @@ -21,6 +23,7 @@ "devDependencies": { "@tailwindcss/postcss": "^4", "@testing-library/jest-dom": "^6.9.1", + "@testing-library/dom": "^10.4.1", "@testing-library/react": "^16.3.2", "@types/node": "^20", "@types/react": "^19", diff --git a/apps/web/src/__tests__/middleware.test.ts b/apps/web/src/__tests__/middleware.test.ts new file mode 100644 index 0000000..efdb0a1 --- /dev/null +++ b/apps/web/src/__tests__/middleware.test.ts @@ -0,0 +1,94 @@ +import { NextRequest } from 'next/server'; +import { vi, describe, it, expect, beforeEach } from 'vitest'; +import proxy from '../proxy'; + +// Mock NextResponse to avoid internal routing context issues +vi.mock('next/server', async (importOriginal) => { + const actual = await importOriginal() + + // Create a mock constructor class with static methods + class MockNextResponse { + public headers: Headers; + public status: number; + public statusText: string; + public body: BodyInit | null; + + static next: () => MockNextResponse; + static json: () => void; + static redirect: () => void; + + constructor(_init?: ResponseInit) { + this.headers = new Headers(); + this.status = _init?.status ?? 200; + this.statusText = 'OK'; + this.body = null; + } + + clone() { return new MockNextResponse(); } + arrayBuffer() { return new ArrayBuffer(0); } + blob() { return new Blob(); } + formData() { return new FormData(); } + json() { return {}; } + text() { return ''; } + } + + // Static methods + MockNextResponse.next = vi.fn(() => new MockNextResponse()); + MockNextResponse.json = vi.fn(); + MockNextResponse.redirect = vi.fn(); + + return { + ...actual as Record, + NextResponse: MockNextResponse, + } +}); + +describe('middleware', () => { + beforeEach(() => { + vi.clearAllMocks(); + }); + + it('should bypass non-API requests', () => { + const request = new NextRequest('http://localhost:3000/test', { + headers: { origin: 'http://localhost:3000' }, + }); + + const response = proxy(request); + expect(response).toBeDefined(); + }); + + it('should handle preflight requests for API routes', () => { + const request = new NextRequest('http://localhost:3000/api/test', { + method: 'OPTIONS', + headers: { origin: 'http://localhost:3000' }, + }); + + const response = proxy(request); + expect(response.status).toBe(200); + expect(response.headers.get('Access-Control-Allow-Origin')).toBe('*'); + expect(response.headers.get('Access-Control-Allow-Methods')).toBe('GET, POST, PUT, DELETE, OPTIONS'); + expect(response.headers.get('Access-Control-Allow-Headers')).toBe('Content-Type, Authorization'); + expect(response.headers.get('Access-Control-Max-Age')).toBe('86400'); + expect(response.headers.get('Vary')).toBe('Origin'); + }); + + it('should handle regular API requests with cross-origin', () => { + const request = new NextRequest('http://localhost:3000/api/test', { + headers: { origin: 'http://different-origin.com' }, + }); + + const response = proxy(request); + expect(response).toBeDefined(); + expect(response.headers.get('Access-Control-Allow-Origin')).toBe('*'); + expect(response.headers.get('Vary')).toBe('Origin'); + }); + + it('should handle API requests without Origin header', () => { + const request = new NextRequest('http://localhost:3000/api/test', { + headers: {}, + }); + + const response = proxy(request); + expect(response).toBeDefined(); + }); +}); diff --git a/apps/web/src/hooks/useDestinationStation.ts b/apps/web/src/hooks/useDestinationStation.ts index bb4af45..96e0e6f 100644 --- a/apps/web/src/hooks/useDestinationStation.ts +++ b/apps/web/src/hooks/useDestinationStation.ts @@ -1,5 +1,8 @@ import { useState, useEffect } from "react"; import type { Station } from "@timetoleave/core"; +import { ApiClient } from "@timetoleave/api-client"; + +const client = new ApiClient(); interface HafasLocation { type: string; @@ -33,19 +36,7 @@ export function useDestinationStation(destination: string) { ], }; - const response = await fetch("/api/hafas", { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify(body), - signal: abortController.signal, - }); - - if (!response.ok) { - const errBody = await response.json().catch(() => ({})); - throw new Error(errBody.error ?? `Station lookup failed with status ${response.status}`); - } - - const data = await response.json(); + const data = await client.hafasRequest(body); const locL: HafasLocation[] = data?.svcResL?.[0]?.res?.match?.locL ?? []; const stations = locL.filter((l) => l.type === "S").map((l) => ({ name: l.name, extId: l.extId })); diff --git a/apps/web/src/hooks/useJourneys.ts b/apps/web/src/hooks/useJourneys.ts index b9e0c01..a9677c8 100644 --- a/apps/web/src/hooks/useJourneys.ts +++ b/apps/web/src/hooks/useJourneys.ts @@ -1,8 +1,11 @@ import { useState, useEffect } from "react"; import type { Journey } from "@timetoleave/core"; +import { ApiClient } from "@timetoleave/api-client"; import { parseHafasJourneys } from "@/lib/hafas-client"; import { hafasDateTime } from "@timetoleave/core"; +const client = new ApiClient(); + export function useJourneys( fromStationExtId: string | null, toStationExtId: string | null, @@ -42,18 +45,7 @@ export function useJourneys( ], }; - const response = await fetch("/api/hafas", { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify(body), - }); - - if (!response.ok) { - const errBody = await response.json().catch(() => ({})); - throw new Error(errBody.error ?? `HAFAS request failed with status ${response.status}`); - } - - const data = await response.json(); + const data = await client.hafasRequest(body); const result = parseHafasJourneys(data, hafasDate, date); if (isMounted) { diff --git a/apps/web/src/proxy.ts b/apps/web/src/proxy.ts new file mode 100644 index 0000000..bfada9a --- /dev/null +++ b/apps/web/src/proxy.ts @@ -0,0 +1,37 @@ +import { NextRequest, NextResponse } from 'next/server'; + +export default function proxy(request: NextRequest) { + // Only apply CORS headers to API routes + if (!request.nextUrl.pathname.startsWith('/api/')) { + return NextResponse.next(); + } + + // Handle preflight requests + if (request.method === 'OPTIONS') { + const response = new NextResponse(null, { + status: 200, + }); + + // Set CORS headers for all origins (mobile apps don't have a web origin) + response.headers.set('Access-Control-Allow-Origin', '*'); + response.headers.set('Vary', 'Origin'); + response.headers.set('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS'); + response.headers.set('Access-Control-Allow-Headers', 'Content-Type, Authorization'); + response.headers.set('Access-Control-Max-Age', '86400'); + + return response; + } + + // For all other API requests, add CORS headers + const response = NextResponse.next(); + response.headers.set('Access-Control-Allow-Origin', '*'); + response.headers.set('Vary', 'Origin'); + response.headers.set('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS'); + response.headers.set('Access-Control-Allow-Headers', 'Content-Type, Authorization'); + + return response; +} + +export const config = { + matcher: '/api/:path*', +}; diff --git a/package-lock.json b/package-lock.json index 6119518..2d57200 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,42 +22,32 @@ "@timetoleave/api-client": "*", "@timetoleave/core": "*", "expo": "~54.0.33", + "expo-calendar": "^55.0.14", "expo-location": "^55.1.9", "expo-notifications": "^55.0.22", "expo-status-bar": "~3.0.9", - "react": "19.1.0", + "react": "19.2.4", "react-native": "0.81.5", "react-native-safe-area-context": "^5.7.0", "react-native-screens": "^4.24.0" }, "devDependencies": { - "@types/react": "~19.1.0", + "@testing-library/react-native": "^13.3.3", + "@types/jest": "^30.0.0", + "@types/react": "^19", + "jest": "^29.7.0", + "jest-expo": "~54.0.0", + "react-test-renderer": "19.2.4", + "ts-jest": "^29.4.9", "typescript": "~5.9.2" } }, - "apps/mobile/node_modules/@types/react": { - "version": "19.1.17", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.17.tgz", - "integrity": "sha512-Qec1E3mhALmaspIrhWt9jkQMNdw6bReVu64mjvhbhq2NFPftLPVr+l1SZgmw/66WwBNpDh7ao5AT6gF5v41PFA==", - "dev": true, - "license": "MIT", - "dependencies": { - "csstype": "^3.0.2" - } - }, - "apps/mobile/node_modules/react": { - "version": "19.1.0", - "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", - "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "apps/web": { "name": "@timetoleave/web", "version": "0.1.0", "dependencies": { + "@timetoleave/api-client": "*", + "@timetoleave/core": "*", "date-fns": "^4.1.0", "next": "^16.2.6", "node-ical": "^0.26.1", @@ -66,6 +56,7 @@ }, "devDependencies": { "@tailwindcss/postcss": "^4", + "@testing-library/dom": "^10.4.1", "@testing-library/jest-dom": "^6.9.1", "@testing-library/react": "^16.3.2", "@types/node": "^20", @@ -1648,6 +1639,13 @@ "node": ">=6.9.0" } }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true, + "license": "MIT" + }, "node_modules/@bramus/specificity": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/@bramus/specificity/-/specificity-2.4.2.tgz", @@ -1996,6 +1994,182 @@ } } }, + "node_modules/@expo/cli": { + "version": "54.0.24", + "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-54.0.24.tgz", + "integrity": "sha512-5xse1bEgnVUBhOrtttc6xTNJVvjyTRavpzuF0/0nuj+312vfSbk7EiRbG+xJ2pW/iZxnhLPJkFCrPYG0nmheAQ==", + "license": "MIT", + "dependencies": { + "@0no-co/graphql.web": "^1.0.8", + "@expo/code-signing-certificates": "^0.0.6", + "@expo/config": "~12.0.13", + "@expo/config-plugins": "~54.0.4", + "@expo/devcert": "^1.2.1", + "@expo/env": "~2.0.8", + "@expo/image-utils": "^0.8.8", + "@expo/json-file": "^10.0.8", + "@expo/metro": "~54.2.0", + "@expo/metro-config": "~54.0.15", + "@expo/osascript": "^2.3.8", + "@expo/package-manager": "^1.9.10", + "@expo/plist": "^0.4.8", + "@expo/prebuild-config": "^54.0.8", + "@expo/schema-utils": "^0.1.8", + "@expo/spawn-async": "^1.7.2", + "@expo/ws-tunnel": "^1.0.1", + "@expo/xcpretty": "^4.3.0", + "@react-native/dev-middleware": "0.81.5", + "@urql/core": "^5.0.6", + "@urql/exchange-retry": "^1.3.0", + "accepts": "^1.3.8", + "arg": "^5.0.2", + "better-opn": "~3.0.2", + "bplist-creator": "0.1.0", + "bplist-parser": "^0.3.1", + "chalk": "^4.0.0", + "ci-info": "^3.3.0", + "compression": "^1.7.4", + "connect": "^3.7.0", + "debug": "^4.3.4", + "env-editor": "^0.4.1", + "expo-server": "^1.0.6", + "freeport-async": "^2.0.0", + "getenv": "^2.0.0", + "glob": "^13.0.0", + "lan-network": "^0.2.1", + "minimatch": "^9.0.0", + "node-forge": "^1.3.3", + "npm-package-arg": "^11.0.0", + "ora": "^3.4.0", + "picomatch": "^4.0.3", + "pretty-bytes": "^5.6.0", + "pretty-format": "^29.7.0", + "progress": "^2.0.3", + "prompts": "^2.3.2", + "qrcode-terminal": "0.11.0", + "require-from-string": "^2.0.2", + "requireg": "^0.2.2", + "resolve": "^1.22.2", + "resolve-from": "^5.0.0", + "resolve.exports": "^2.0.3", + "semver": "^7.6.0", + "send": "^0.19.0", + "slugify": "^1.3.4", + "source-map-support": "~0.5.21", + "stacktrace-parser": "^0.1.10", + "structured-headers": "^0.4.1", + "tar": "^7.5.2", + "terminal-link": "^2.1.1", + "undici": "^6.18.2", + "wrap-ansi": "^7.0.0", + "ws": "^8.12.1" + }, + "bin": { + "expo-internal": "build/bin/cli" + }, + "peerDependencies": { + "expo": "*", + "expo-router": "*", + "react-native": "*" + }, + "peerDependenciesMeta": { + "expo-router": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/@expo/cli/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@expo/cli/node_modules/brace-expansion": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@expo/cli/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@expo/cli/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@expo/cli/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "license": "MIT" + }, + "node_modules/@expo/cli/node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@expo/cli/node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@expo/code-signing-certificates": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/@expo/code-signing-certificates/-/code-signing-certificates-0.0.6.tgz", @@ -2048,15 +2222,6 @@ "xml2js": "0.6.0" } }, - "node_modules/@expo/config-plugins/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/@expo/config-plugins/node_modules/semver": { "version": "7.8.0", "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", @@ -2084,15 +2249,6 @@ "@babel/highlight": "^7.10.4" } }, - "node_modules/@expo/config/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/@expo/config/node_modules/semver": { "version": "7.8.0", "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", @@ -2216,15 +2372,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@expo/fingerprint/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/@expo/fingerprint/node_modules/semver": { "version": "7.8.0", "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", @@ -2348,18 +2495,6 @@ "hermes-estree": "0.29.1" } }, - "node_modules/@expo/metro-config/node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/@expo/metro-config/node_modules/postcss": { "version": "8.4.49", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", @@ -2388,15 +2523,6 @@ "node": "^10 || ^12 || >=14" } }, - "node_modules/@expo/metro-config/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/@expo/osascript": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/@expo/osascript/-/osascript-2.4.3.tgz", @@ -2455,15 +2581,6 @@ "expo": "*" } }, - "node_modules/@expo/prebuild-config/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/@expo/prebuild-config/node_modules/semver": { "version": "7.8.0", "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", @@ -3182,15 +3299,6 @@ "sprintf-js": "~1.0.2" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -3256,15 +3364,6 @@ "node": ">=8" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/@istanbuljs/schema": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.6.tgz", @@ -3274,6 +3373,246 @@ "node": ">=8" } }, + "node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/console/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/console/node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/console/node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/console/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@jest/console/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/console/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/core/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/core/node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core/node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@jest/core/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, "node_modules/@jest/create-cache-key-function": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/create-cache-key-function/-/create-cache-key-function-29.7.0.tgz", @@ -3286,6 +3625,16 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/@jest/diff-sequences": { + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.4.0.tgz", + "integrity": "sha512-zOpzlfUs45l6u7jm39qr87JCHUDsaeCtvL+kQe/Vn9jSnRB4/5IPXISm0h9I1vZW/o00Kn4UTJ2MOlhnUGwv3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, "node_modules/@jest/environment": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", @@ -3301,6 +3650,225 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/@jest/environment/node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/environment/node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/environment/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.4.1.tgz", + "integrity": "sha512-ZBn5CglH8fBsQsvs4VWNzD4aWfUYks+IdOOQU3MEK71ol/BcVm+P+rtb1KpiFBpSWSCE27uOahyyf1vfqOVbcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/expect/node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/expect/node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect/node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect/node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect/node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect/node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@jest/expect/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, "node_modules/@jest/fake-timers": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", @@ -3318,6 +3886,350 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/@jest/fake-timers/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/fake-timers/node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers/node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers/node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@jest/fake-timers/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "license": "MIT" + }, + "node_modules/@jest/get-type": { + "version": "30.1.0", + "resolved": "https://registry.npmjs.org/@jest/get-type/-/get-type-30.1.0.tgz", + "integrity": "sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals/node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals/node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@jest/pattern": { + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.4.0.tgz", + "integrity": "sha512-RAWn3+f9u8BsHijKJ71uHcFp6vmyEt6VvoWXkl6hKF3qVIuWNmudVjg12DlBPGup/frIl5UcUlH5HfEuvHpEXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-regex-util": "30.4.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/pattern/node_modules/jest-regex-util": { + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.4.0.tgz", + "integrity": "sha512-mWlvLviKIgIQ8VCuM1xRdD0TWp3zlzionlmDBjuXVBs+VkmXq6FgW9T4Emr7oGz/Rk6feDCGyiugolcQEyp3mg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/reporters/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/reporters/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@jest/reporters/node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@jest/reporters/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, "node_modules/@jest/schemas": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", @@ -3330,6 +4242,53 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/@jest/transform": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", @@ -3356,6 +4315,35 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/@jest/transform/node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/@jest/types": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", @@ -3658,9 +4646,9 @@ } }, "node_modules/@oxc-project/types": { - "version": "0.128.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.128.0.tgz", - "integrity": "sha512-huv1Y/LzBJkBVHt3OlC7u0zHBW9qXf1FdD7sGmc1rXc2P1mTwHssYv7jyGx5KAACSCH+9B3Bhn6Z9luHRvf7pQ==", + "version": "0.129.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.129.0.tgz", + "integrity": "sha512-3oz8m3FGdr2nDXVqmFUw7jolKliC4MoyXYIG2c7gpjBnzUWQpUGIYcXYKxTdTi+N2jusvt610ckTMkxdwHkYEg==", "dev": true, "license": "MIT", "funding": { @@ -3966,12 +4954,6 @@ "react": ">= 18.2.0" } }, - "node_modules/@react-navigation/core/node_modules/react-is": { - "version": "19.2.6", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.6.tgz", - "integrity": "sha512-XjBR15BhXuylgWGuslhDKqlSayuqvqBX91BP8pauG8kd1zY8kotkNWbXksTCNRarse4kuGbe2kIY05ARtwNIvw==", - "license": "MIT" - }, "node_modules/@react-navigation/elements": { "version": "2.9.17", "resolved": "https://registry.npmjs.org/@react-navigation/elements/-/elements-2.9.17.tgz", @@ -4041,9 +5023,9 @@ } }, "node_modules/@rolldown/binding-android-arm64": { - "version": "1.0.0-rc.18", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.18.tgz", - "integrity": "sha512-lIDyUAfD7U3+BWKzdxMbJcsYHuqXqmGz40aeRqvuAm3y5TkJSYTBW2RDrn65DJFPQqVjUAUqq5uz8urzQ8aBdQ==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0.tgz", + "integrity": "sha512-TWMZnRLMe63C2Lhyicviu7ZHaU4kxa6PS3rofvc9GmcvptzNN11BcfQ4Sl7MwTOsisQoa2keB/EBdNCAnUo8vA==", "cpu": [ "arm64" ], @@ -4058,9 +5040,9 @@ } }, "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.0.0-rc.18", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.18.tgz", - "integrity": "sha512-apJq2ktnGp27nSInMR5Vcj8kY6xJzDAvfdIFlpDcAK/w4cDO58qVoi1YQsES/SKiFNge/6e4CUzgjfHduYqWpQ==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0.tgz", + "integrity": "sha512-6XcD+8k0gPVItNagEw78/qqcBDwKcwDYS8V2hRmVsfUSIrd8cWe/CBvRDI5toqFyPfj+FJr6t8U6Xj2P2prEew==", "cpu": [ "arm64" ], @@ -4075,9 +5057,9 @@ } }, "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.0.0-rc.18", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.18.tgz", - "integrity": "sha512-5Ofot8xbs+pxRHJqm9/9N/4sTQOvdrwEsmPE9pdLEEoAbdZtG6F2LMDfO1sp6ZAtXJuJV/21ew2srq3W8NXB5g==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0.tgz", + "integrity": "sha512-iN/tWVXRQDWvmZlKdceP1Dwug9GDpEymhb9p4xnEe6zvCg5lFmzVljl+1qR1NVx3yfGpr2Na+CuLmv5IU8uzfQ==", "cpu": [ "x64" ], @@ -4092,9 +5074,9 @@ } }, "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.0.0-rc.18", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.18.tgz", - "integrity": "sha512-7h8eeOTT1eyqJyx64BFCnWZpNm486hGWt2sqeLLgDxA0xI1oGZ9H7gK1S85uNGmBhkdPwa/6reTxfFFKvIsebw==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0.tgz", + "integrity": "sha512-jjQMDvvwSOuhOwMszD/klSOjyWMM3zI64hWTj9KT5x4MxRbZAf+7vLQ6qouRhtsLVFHr3f0ILaJAfgENPiQdAQ==", "cpu": [ "x64" ], @@ -4109,9 +5091,9 @@ } }, "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.0.0-rc.18", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.18.tgz", - "integrity": "sha512-eRcm/HVt9U/JFu5RKAEKwGQYtDCKWLiaH6wOnsSEp6NMBb/3Os8LgHZlNyzMpFVNmiiMFlfb2zEnebfzJrHFmg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0.tgz", + "integrity": "sha512-d//Dtg2x6/m3mbV64yUGNnDGNZaDGRpDLLNGerHQUVObuNaIQaaDp25yUiqGXtHEXX+NP2d0wAlmKgpYgIAJ2A==", "cpu": [ "arm" ], @@ -4126,9 +5108,9 @@ } }, "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.0.0-rc.18", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.18.tgz", - "integrity": "sha512-SOrT/cT4ukTmgnrEz/Hg3m7LBnuCLW9psDeMKrimRWY4I8DmnO7Lco8W2vtqPmMkbVu8iJ+g4GFLVLLOVjJ9DQ==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0.tgz", + "integrity": "sha512-n7Ofp0mx+aB2cC+Sdy5YtMnXtY9lchnHbY+3Yt0uq9JsWQExf4f5Whu0tK0R8Jdc9S6RchTHjIFY7uc92puOVQ==", "cpu": [ "arm64" ], @@ -4146,9 +5128,9 @@ } }, "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.0.0-rc.18", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.18.tgz", - "integrity": "sha512-QWjdxN1HJCpBTAcZ5N5F7wju3gVPzRzSpmGzx7na0c/1qpN9CFil+xt+l9lV/1M6/gqHSNXCiqPfwhVJPeLnug==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0.tgz", + "integrity": "sha512-EIVjy2cgd7uuMMo94FVkBp7F6DhcZAUwNURkSG3RwUmvAXR6s0ISxM81U+IydcZByPG0pZIHsf1b6kTxoFDgJA==", "cpu": [ "arm64" ], @@ -4166,9 +5148,9 @@ } }, "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.0.0-rc.18", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.18.tgz", - "integrity": "sha512-ugCOyj7a4d9h3q9B+wXmf6g3a68UsjGh6dob5DHevHGMwDUbhsYNbSPxJsENcIttJZ9jv7qGM2UesLw5jqIhdg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0.tgz", + "integrity": "sha512-JEwwOPcwTLAcpDQlqSmjEmfs63xJnSiUNIGvLcDLUHCWK4XowpS/7c7tUsUH6uT/ct6bMUTdXKfI8967FYj6mg==", "cpu": [ "ppc64" ], @@ -4186,9 +5168,9 @@ } }, "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.0.0-rc.18", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.18.tgz", - "integrity": "sha512-kKWRhbsotpXkGbcd5dllUWg5gEXcDAa8u5YnP9AV5DYNbvJHGzzuwv7dpmhc8NqKMJldl0a+x76IHbspEpEmdA==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0.tgz", + "integrity": "sha512-0wjCFhLrihtAubnT9iA0N++0pSV0z5Hg7tNGdNJ4RFaINceHadoF+kiFGyY1qSSNVIAZtLotG8Ju1bgDPkjnFA==", "cpu": [ "s390x" ], @@ -4206,9 +5188,9 @@ } }, "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.0.0-rc.18", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.18.tgz", - "integrity": "sha512-uCo8ElcCIAMyYAZyuIZ81oFkhTSIllNvUCHCAlbhlN4ji3uC28h7IIdlXyIvGO7HsuqnV9p3rD/bpH7XhIyhRw==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0.tgz", + "integrity": "sha512-Dfn7iak9BcMMePxcoJfpSbWqnEyrp/dRF63/8qW/eHBdOZov6x5aShLLEYGYdIeSJ6vMLK/XCVB+lGIxm41bQA==", "cpu": [ "x64" ], @@ -4226,9 +5208,9 @@ } }, "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.0.0-rc.18", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.18.tgz", - "integrity": "sha512-XNOQZtuE6yUIvx4rwGemwh8kpL1xvU41FXy/s9K7T/3JVcqGzo3NfKM2HrbrGgfPYGFW42f07Wk++aOC6B9NWA==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0.tgz", + "integrity": "sha512-5/utzzDmD/pD/bmuaUcbTf/sZYy0aztwIVlfpoW1fTjCZ0BaPOMVWGZL1zvgxyi7ZIVYWlxKONHmSbHuiOh8Jw==", "cpu": [ "x64" ], @@ -4246,9 +5228,9 @@ } }, "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.0.0-rc.18", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.18.tgz", - "integrity": "sha512-tSn/kzrfa7tNOXr7sEacDBN4YsIqTyLqh45IO0nHDwtpKIDNDJr+VFojt+4klSpChxB29JLyduSsE0MKEwa65A==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0.tgz", + "integrity": "sha512-ouJs8VcUomfLfpbUECqFMRqdV4x6aeAK3MA4m6vTrJJjKyWTV5KnxZx7Jd9G+GlDaQQxubcba00x16OyJ1meig==", "cpu": [ "arm64" ], @@ -4263,9 +5245,9 @@ } }, "node_modules/@rolldown/binding-wasm32-wasi": { - "version": "1.0.0-rc.18", - "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.18.tgz", - "integrity": "sha512-+J9YGmc+czgqlhYmwun3S3O0FIZhsH8ep2456xwjAdIOmuJxM7xz4P4PtrxU+Bz17a/5bqPA8o3HAAoX0teUdg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0.tgz", + "integrity": "sha512-E+oHKGiDA+lsKMmFtffDDw91EryDT7uJocrIuCHqhm6bCTM6xFK+3gaCkYOHfPwQr0cCNarSM2xaELoQDz9jJg==", "cpu": [ "wasm32" ], @@ -4301,9 +5283,9 @@ } }, "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.0.0-rc.18", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.18.tgz", - "integrity": "sha512-zsu47DgU0FQzSwi6sU9dZoEdUv7pc1AptSEz/Z8HBg54sV0Pbs3N0+CrIbTsgiu6EyoaNN9CHboqbLaz9lhOyQ==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0.tgz", + "integrity": "sha512-yYK02n8Rngo+gbm1y6G0+7jk1sJ/2Wt7K0me0Y7k/ErBpyf+LJ2gFpqWVTcRV1rUepBlQRmpgWkTQCiiwrK0Ow==", "cpu": [ "arm64" ], @@ -4318,9 +5300,9 @@ } }, "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.0.0-rc.18", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.18.tgz", - "integrity": "sha512-7H+3yqGgmnlDTRRhw/xpYY9J1kf4GC681nVc4GqKhExZTDrVVrV2tsOR9kso0fvgBdcTCcQShx4SLLoHgaLwhg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0.tgz", + "integrity": "sha512-14bpChMahXRRXiTwahSl+zzHPW6qQTXtkMuJBFlbo+pqSAews2d4BdCSHfrJ/MBsCZtpmTafsY+1QhBzitcmdg==", "cpu": [ "x64" ], @@ -4677,7 +5659,6 @@ "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", @@ -4692,17 +5673,6 @@ "node": ">=18" } }, - "node_modules/@testing-library/dom/node_modules/aria-query": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", - "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "dequal": "^2.0.3" - } - }, "node_modules/@testing-library/jest-dom": { "version": "6.9.1", "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.9.1.tgz", @@ -4758,6 +5728,82 @@ } } }, + "node_modules/@testing-library/react-native": { + "version": "13.3.3", + "resolved": "https://registry.npmjs.org/@testing-library/react-native/-/react-native-13.3.3.tgz", + "integrity": "sha512-k6Mjsd9dbZgvY4Bl7P1NIpePQNi+dfYtlJ5voi9KQlynxSyQkfOgJmYGCYmw/aSgH/rUcFvG8u5gd4npzgRDyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-matcher-utils": "^30.0.5", + "picocolors": "^1.1.1", + "pretty-format": "^30.0.5", + "redent": "^3.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "jest": ">=29.0.0", + "react": ">=18.2.0", + "react-native": ">=0.71", + "react-test-renderer": ">=18.2.0" + }, + "peerDependenciesMeta": { + "jest": { + "optional": true + } + } + }, + "node_modules/@testing-library/react-native/node_modules/@jest/schemas": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.4.1.tgz", + "integrity": "sha512-i6b4qw5qnP8c5FEeBJg/uZQ4ddrkN6Ca8qISJh0pr7a5hfn3h3v5x60BEbOC7OYAGZNMs1LfFLwnW2CuK8F57Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.34.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@testing-library/react-native/node_modules/@sinclair/typebox": { + "version": "0.34.49", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.49.tgz", + "integrity": "sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@testing-library/react-native/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@testing-library/react-native/node_modules/pretty-format": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.4.1.tgz", + "integrity": "sha512-K6KiKMHTL4jjX4u3Kir2EW07nRfcqVTXIImx50wbjHQTcZPgg+gjVeNTIT3l3L1Rd4UefxfogquC9J37SoFyyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "30.4.1", + "ansi-styles": "^5.2.0", + "react-is-18": "npm:react-is@^18.3.1", + "react-is-19": "npm:react-is@^19.2.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, "node_modules/@timetoleave/api-client": { "resolved": "packages/api-client", "link": true @@ -4774,6 +5820,16 @@ "resolved": "apps/web", "link": true }, + "node_modules/@tootallnate/once": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.1.tgz", + "integrity": "sha512-HqmEUIGRJ5fSXchkVgR5F7qn48bDBzv0kWj/Kfu5e6uci4UlEeng4331LnBkWffb++Ei3FOVLxo8JJWMFBDMeQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, "node_modules/@tybys/wasm-util": { "version": "0.10.2", "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz", @@ -4790,8 +5846,7 @@ "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@types/babel__core": { "version": "7.20.5", @@ -4892,6 +5947,78 @@ "@types/istanbul-lib-report": "*" } }, + "node_modules/@types/jest": { + "version": "30.0.0", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-30.0.0.tgz", + "integrity": "sha512-XTYugzhuwqWjws0CVz8QpM36+T+Dz5mTEBKhNs/esGLnCIlGdRy+Dq78NRjd7ls7r8BC8ZRMOrKlkO1hU0JOwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^30.0.0", + "pretty-format": "^30.0.0" + } + }, + "node_modules/@types/jest/node_modules/@jest/schemas": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.4.1.tgz", + "integrity": "sha512-i6b4qw5qnP8c5FEeBJg/uZQ4ddrkN6Ca8qISJh0pr7a5hfn3h3v5x60BEbOC7OYAGZNMs1LfFLwnW2CuK8F57Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.34.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@types/jest/node_modules/@sinclair/typebox": { + "version": "0.34.49", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.49.tgz", + "integrity": "sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/jest/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@types/jest/node_modules/pretty-format": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.4.1.tgz", + "integrity": "sha512-K6KiKMHTL4jjX4u3Kir2EW07nRfcqVTXIImx50wbjHQTcZPgg+gjVeNTIT3l3L1Rd4UefxfogquC9J37SoFyyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "30.4.1", + "ansi-styles": "^5.2.0", + "react-is-18": "npm:react-is@^18.3.1", + "react-is-19": "npm:react-is@^19.2.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@types/jsdom": { + "version": "20.0.1", + "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-20.0.1.tgz", + "integrity": "sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/tough-cookie": "*", + "parse5": "^7.0.0" + } + }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", @@ -4941,6 +6068,13 @@ "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", "license": "MIT" }, + "node_modules/@types/tough-cookie": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", + "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/yargs": { "version": "17.0.35", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", @@ -5721,6 +6855,14 @@ "node": ">=10.0.0" } }, + "node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "deprecated": "Use your platform's native atob() and btoa() methods instead", + "dev": true, + "license": "BSD-3-Clause" + }, "node_modules/abort-controller": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", @@ -5758,6 +6900,17 @@ "node": ">=0.4.0" } }, + "node_modules/acorn-globals": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz", + "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.1.0", + "acorn-walk": "^8.0.2" + } + }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -5768,6 +6921,19 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/acorn-walk": { + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", + "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/agent-base": { "version": "7.1.4", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", @@ -5815,18 +6981,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -5870,6 +7024,18 @@ "node": ">= 8" } }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", @@ -5883,13 +7049,13 @@ "license": "Python-2.0" }, "node_modules/aria-query": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", - "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", "dev": true, "license": "Apache-2.0", - "engines": { - "node": ">= 0.4" + "dependencies": { + "dequal": "^2.0.3" } }, "node_modules/array-buffer-byte-length": { @@ -6091,6 +7257,13 @@ "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", "license": "MIT" }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, + "license": "MIT" + }, "node_modules/available-typed-arrays": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", @@ -6164,6 +7337,22 @@ "node": ">=8" } }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/babel-plugin-jest-hoist": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", @@ -6335,15 +7524,6 @@ } } }, - "node_modules/babel-preset-expo/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/babel-preset-jest": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", @@ -6393,9 +7573,9 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.10.28", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.28.tgz", - "integrity": "sha512-Ic44hnOtFIgravCunj1ifSoQPSUrkNiJuH9Mf6jr2jjoA74icqV8wU0KuadXeOR8zuIJMOoTv0GuQjZ9ZYNMeA==", + "version": "2.10.29", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.29.tgz", + "integrity": "sha512-Asa2krT+XTPZINCS+2QcyS8WTkObE77RwkydwF7h6DmnKqbvlalz93m/dnphUyCa6SWSP51VgtEUf2FN+gelFQ==", "license": "Apache-2.0", "bin": { "baseline-browser-mapping": "dist/cli.cjs" @@ -6462,9 +7642,9 @@ } }, "node_modules/bplist-parser": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.1.tgz", - "integrity": "sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA==", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz", + "integrity": "sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==", "license": "MIT", "dependencies": { "big-integer": "1.6.x" @@ -6528,6 +7708,19 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/bser": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", @@ -6637,15 +7830,12 @@ } }, "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "license": "MIT", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6" } }, "node_modules/caniuse-lite": { @@ -6694,6 +7884,16 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, "node_modules/chownr": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", @@ -6736,9 +7936,25 @@ } }, "node_modules/ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", + "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", + "dev": true, "license": "MIT" }, "node_modules/cli-cursor": { @@ -6794,6 +8010,24 @@ "node": ">=0.8" } }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz", + "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==", + "dev": true, + "license": "MIT" + }, "node_modules/color": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", @@ -6835,6 +8069,19 @@ "simple-swizzle": "^0.2.2" } }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/commander": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", @@ -6953,6 +8200,59 @@ "url": "https://opencollective.com/core-js" } }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -6988,6 +8288,33 @@ "dev": true, "license": "MIT" }, + "node_modules/cssom": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", + "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", + "dev": true, + "license": "MIT" + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true, + "license": "MIT" + }, "node_modules/csstype": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", @@ -7113,6 +8440,21 @@ "node": ">=0.10" } }, + "node_modules/dedent": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.2.tgz", + "integrity": "sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, "node_modules/deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", @@ -7195,6 +8537,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -7210,7 +8562,6 @@ "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -7234,6 +8585,26 @@ "node": ">=8" } }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/doctrine": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", @@ -7252,8 +8623,31 @@ "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", "dev": true, + "license": "MIT" + }, + "node_modules/domexception": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", + "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", + "deprecated": "Use your platform's native DOMException instead", + "dev": true, "license": "MIT", - "peer": true + "dependencies": { + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/domexception/node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } }, "node_modules/dotenv": { "version": "16.4.7", @@ -7309,6 +8703,19 @@ "integrity": "sha512-kOrWphBi8TOZyiJZqsgqIle0lw+tzmnQK83pV9dZUd01Nm2POECSyFQMAuarzZdYqQW7FH9RaYOuaRo3h+bQ3w==", "license": "ISC" }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, "node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", @@ -7340,13 +8747,13 @@ } }, "node_modules/entities": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-8.0.0.tgz", - "integrity": "sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", "dev": true, "license": "BSD-2-Clause", "engines": { - "node": ">=20.19.0" + "node": ">=0.12" }, "funding": { "url": "https://github.com/fb55/entities?sponsor=1" @@ -7361,6 +8768,16 @@ "node": ">=8" } }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, "node_modules/error-stack-parser": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", @@ -7580,6 +8997,28 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, "node_modules/eslint": { "version": "9.39.4", "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz", @@ -7839,6 +9278,16 @@ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" } }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/eslint-plugin-react": { "version": "7.37.5", "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", @@ -8027,6 +9476,57 @@ "node": ">=6" } }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-30.4.1.tgz", + "integrity": "sha512-PMARsyh/JtqC20HoGqlFcIlQAyqUtW4PlI1rup1uhYJtKuwAjbvWi3GQMAn+STdHum/dk8xrKfUM1+5SAwpolA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/expect-utils": "30.4.1", + "@jest/get-type": "30.1.0", + "jest-matcher-utils": "30.4.1", + "jest-message-util": "30.4.1", + "jest-mock": "30.4.1", + "jest-util": "30.4.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, "node_modules/expect-type": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", @@ -8113,6 +9613,16 @@ "react-native": "*" } }, + "node_modules/expo-calendar": { + "version": "55.0.14", + "resolved": "https://registry.npmjs.org/expo-calendar/-/expo-calendar-55.0.14.tgz", + "integrity": "sha512-DndwzRNrjyjaMRY9ob/X8TdptLcpckVMGnv8rMjABH2jMWToeLElgq7lttytCTAoablZfVLowcizdD+GwSqNzw==", + "license": "MIT", + "peerDependencies": { + "expo": "*", + "react-native": "*" + } + }, "node_modules/expo-constants": { "version": "18.0.13", "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-18.0.13.tgz", @@ -8189,15 +9699,6 @@ "expo-modules-autolinking": "bin/expo-modules-autolinking.js" } }, - "node_modules/expo-modules-autolinking/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/expo-modules-core": { "version": "3.0.30", "resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-3.0.30.tgz", @@ -8278,93 +9779,6 @@ "react-native": "*" } }, - "node_modules/expo/node_modules/@expo/cli": { - "version": "54.0.24", - "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-54.0.24.tgz", - "integrity": "sha512-5xse1bEgnVUBhOrtttc6xTNJVvjyTRavpzuF0/0nuj+312vfSbk7EiRbG+xJ2pW/iZxnhLPJkFCrPYG0nmheAQ==", - "license": "MIT", - "dependencies": { - "@0no-co/graphql.web": "^1.0.8", - "@expo/code-signing-certificates": "^0.0.6", - "@expo/config": "~12.0.13", - "@expo/config-plugins": "~54.0.4", - "@expo/devcert": "^1.2.1", - "@expo/env": "~2.0.8", - "@expo/image-utils": "^0.8.8", - "@expo/json-file": "^10.0.8", - "@expo/metro": "~54.2.0", - "@expo/metro-config": "~54.0.15", - "@expo/osascript": "^2.3.8", - "@expo/package-manager": "^1.9.10", - "@expo/plist": "^0.4.8", - "@expo/prebuild-config": "^54.0.8", - "@expo/schema-utils": "^0.1.8", - "@expo/spawn-async": "^1.7.2", - "@expo/ws-tunnel": "^1.0.1", - "@expo/xcpretty": "^4.3.0", - "@react-native/dev-middleware": "0.81.5", - "@urql/core": "^5.0.6", - "@urql/exchange-retry": "^1.3.0", - "accepts": "^1.3.8", - "arg": "^5.0.2", - "better-opn": "~3.0.2", - "bplist-creator": "0.1.0", - "bplist-parser": "^0.3.1", - "chalk": "^4.0.0", - "ci-info": "^3.3.0", - "compression": "^1.7.4", - "connect": "^3.7.0", - "debug": "^4.3.4", - "env-editor": "^0.4.1", - "expo-server": "^1.0.6", - "freeport-async": "^2.0.0", - "getenv": "^2.0.0", - "glob": "^13.0.0", - "lan-network": "^0.2.1", - "minimatch": "^9.0.0", - "node-forge": "^1.3.3", - "npm-package-arg": "^11.0.0", - "ora": "^3.4.0", - "picomatch": "^4.0.3", - "pretty-bytes": "^5.6.0", - "pretty-format": "^29.7.0", - "progress": "^2.0.3", - "prompts": "^2.3.2", - "qrcode-terminal": "0.11.0", - "require-from-string": "^2.0.2", - "requireg": "^0.2.2", - "resolve": "^1.22.2", - "resolve-from": "^5.0.0", - "resolve.exports": "^2.0.3", - "semver": "^7.6.0", - "send": "^0.19.0", - "slugify": "^1.3.4", - "source-map-support": "~0.5.21", - "stacktrace-parser": "^0.1.10", - "structured-headers": "^0.4.1", - "tar": "^7.5.2", - "terminal-link": "^2.1.1", - "undici": "^6.18.2", - "wrap-ansi": "^7.0.0", - "ws": "^8.12.1" - }, - "bin": { - "expo-internal": "build/bin/cli" - }, - "peerDependencies": { - "expo": "*", - "expo-router": "*", - "react-native": "*" - }, - "peerDependenciesMeta": { - "expo-router": { - "optional": true - }, - "react-native": { - "optional": true - } - } - }, "node_modules/expo/node_modules/ansi-styles": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", @@ -8377,57 +9791,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/expo/node_modules/brace-expansion": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", - "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/expo/node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/expo/node_modules/minimatch": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", - "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.2" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/expo/node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/expo/node_modules/pretty-format": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", @@ -8448,78 +9811,6 @@ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "license": "MIT" }, - "node_modules/expo/node_modules/resolve": { - "version": "1.22.12", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", - "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "is-core-module": "^2.16.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/expo/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/expo/node_modules/semver": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", - "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/expo/node_modules/undici": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.25.0.tgz", - "integrity": "sha512-ZgpWDC5gmNiuY9CnLVXEH8rl50xhRCuLNA97fAUnKi8RRuV4E6KG31pDTsLVUKnohJE0I3XDrTeEydAXRw47xg==", - "license": "MIT", - "engines": { - "node": ">=18.17" - } - }, - "node_modules/expo/node_modules/ws": { - "version": "8.20.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.20.0.tgz", - "integrity": "sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/exponential-backoff": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", @@ -8594,6 +9885,23 @@ "bser": "2.1.1" } }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, "node_modules/file-entry-cache": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", @@ -8727,6 +10035,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/freeport-async": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/freeport-async/-/freeport-async-2.0.0.tgz", @@ -8881,6 +10206,19 @@ "node": ">= 0.4" } }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/get-symbol-description": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", @@ -9036,6 +10374,28 @@ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "license": "ISC" }, + "node_modules/handlebars": { + "version": "4.7.9", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.9.tgz", + "integrity": "sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, "node_modules/has-bigints": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", @@ -9176,6 +10536,13 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" } }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, "node_modules/http-errors": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", @@ -9205,6 +10572,34 @@ "node": ">= 0.8" } }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-proxy-agent/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, "node_modules/https-proxy-agent": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", @@ -9218,6 +10613,29 @@ "node": ">= 14" } }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/idb": { "version": "8.0.3", "resolved": "https://registry.npmjs.org/idb/-/idb-8.0.3.tgz", @@ -9285,6 +10703,36 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -9370,9 +10818,10 @@ } }, "node_modules/is-arrayish": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.4.tgz", - "integrity": "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, "license": "MIT" }, "node_modules/is-async-function": { @@ -9564,6 +11013,16 @@ "node": ">=8" } }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/is-generator-function": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", @@ -9704,6 +11163,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-string": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", @@ -9836,16 +11308,74 @@ } }, "node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, "license": "BSD-3-Clause", "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" }, "engines": { "node": ">=8" @@ -9869,6 +11399,851 @@ "node": ">= 0.4" } }, + "node_modules/jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-changed-files/node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-changed-files/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-circus/node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus/node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus/node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus/node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-circus/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-cli/node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-cli/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-config/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-config/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/jest-config/node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-config/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-config/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-config/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-diff": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.4.1.tgz", + "integrity": "sha512-CRpFK0RtLriVDGcPPAnR6HMVI8bSR2jnUIgralhauzYQZIb4RH9AtEInTuQr65LmmGggGcRT6HIASxwqsVsmlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/diff-sequences": "30.4.0", + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "pretty-format": "30.4.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-diff/node_modules/@jest/schemas": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.4.1.tgz", + "integrity": "sha512-i6b4qw5qnP8c5FEeBJg/uZQ4ddrkN6Ca8qISJh0pr7a5hfn3h3v5x60BEbOC7OYAGZNMs1LfFLwnW2CuK8F57Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.34.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-diff/node_modules/@sinclair/typebox": { + "version": "0.34.49", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.49.tgz", + "integrity": "sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A==", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-diff/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-diff/node_modules/pretty-format": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.4.1.tgz", + "integrity": "sha512-K6KiKMHTL4jjX4u3Kir2EW07nRfcqVTXIImx50wbjHQTcZPgg+gjVeNTIT3l3L1Rd4UefxfogquC9J37SoFyyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "30.4.1", + "ansi-styles": "^5.2.0", + "react-is-18": "npm:react-is@^18.3.1", + "react-is-19": "npm:react-is@^19.2.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-each/node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-each/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-environment-jsdom": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz", + "integrity": "sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/jsdom": "^20.0.0", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0", + "jsdom": "^20.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jest-environment-jsdom/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/jest-environment-jsdom/node_modules/data-urls": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", + "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/jest-environment-jsdom/node_modules/html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/jest-environment-jsdom/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jest-environment-jsdom/node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-jsdom/node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-jsdom/node_modules/jsdom": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz", + "integrity": "sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "abab": "^2.0.6", + "acorn": "^8.8.1", + "acorn-globals": "^7.0.0", + "cssom": "^0.5.0", + "cssstyle": "^2.3.0", + "data-urls": "^3.0.2", + "decimal.js": "^10.4.2", + "domexception": "^4.0.0", + "escodegen": "^2.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.2", + "parse5": "^7.1.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.2", + "w3c-xmlserializer": "^4.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0", + "ws": "^8.11.0", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jest-environment-jsdom/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-environment-jsdom/node_modules/tough-cookie": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jest-environment-jsdom/node_modules/tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/jest-environment-jsdom/node_modules/w3c-xmlserializer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", + "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/jest-environment-jsdom/node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/jest-environment-jsdom/node_modules/whatwg-mimetype": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/jest-environment-jsdom/node_modules/whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/jest-environment-jsdom/node_modules/xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12" + } + }, "node_modules/jest-environment-node": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", @@ -9886,6 +12261,85 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-environment-node/node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node/node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-expo": { + "version": "54.0.17", + "resolved": "https://registry.npmjs.org/jest-expo/-/jest-expo-54.0.17.tgz", + "integrity": "sha512-LyIhrsP4xvHEEcR1R024u/LBj3uPpAgB+UljgV+YXWkEHjprnr0KpE4tROsMNYCVTM1pPlAnPuoBmn5gnAN9KA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@expo/config": "~12.0.13", + "@expo/json-file": "^10.0.8", + "@jest/create-cache-key-function": "^29.2.1", + "@jest/globals": "^29.2.1", + "babel-jest": "^29.2.1", + "jest-environment-jsdom": "^29.2.1", + "jest-snapshot": "^29.2.1", + "jest-watch-select-projects": "^2.0.0", + "jest-watch-typeahead": "2.2.1", + "json5": "^2.2.3", + "lodash": "^4.17.19", + "react-test-renderer": "19.1.0", + "server-only": "^0.0.1", + "stacktrace-js": "^2.0.2" + }, + "bin": { + "jest": "bin/jest.js" + }, + "peerDependencies": { + "expo": "*", + "react-native": "*", + "react-server-dom-webpack": "~19.0.4 || ~19.1.5 || ~19.2.4" + }, + "peerDependenciesMeta": { + "react-server-dom-webpack": { + "optional": true + } + } + }, "node_modules/jest-get-type": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", @@ -9920,82 +12374,7 @@ "fsevents": "^2.3.2" } }, - "node_modules/jest-message-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-message-util/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-message-util/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-message-util/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "license": "MIT" - }, - "node_modules/jest-mock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-regex-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", - "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", - "license": "MIT", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-util": { + "node_modules/jest-haste-map/node_modules/jest-util": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", @@ -10012,10 +12391,936 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-haste-map/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-leak-detector/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-leak-detector/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-leak-detector/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-matcher-utils": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.4.1.tgz", + "integrity": "sha512-zvYfX5CaeEkFrrLS9suWe9rvJrm9J1Iv3ua8kIBv9GEPzcnsfBf0bob37la7s67fs0nlBC3EuvkOLnXQKxtx4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "jest-diff": "30.4.1", + "pretty-format": "30.4.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/@jest/schemas": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.4.1.tgz", + "integrity": "sha512-i6b4qw5qnP8c5FEeBJg/uZQ4ddrkN6Ca8qISJh0pr7a5hfn3h3v5x60BEbOC7OYAGZNMs1LfFLwnW2CuK8F57Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.34.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/@sinclair/typebox": { + "version": "0.34.49", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.49.tgz", + "integrity": "sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A==", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-matcher-utils/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-matcher-utils/node_modules/pretty-format": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.4.1.tgz", + "integrity": "sha512-K6KiKMHTL4jjX4u3Kir2EW07nRfcqVTXIImx50wbjHQTcZPgg+gjVeNTIT3l3L1Rd4UefxfogquC9J37SoFyyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "30.4.1", + "ansi-styles": "^5.2.0", + "react-is-18": "npm:react-is@^18.3.1", + "react-is-19": "npm:react-is@^19.2.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.4.1.tgz", + "integrity": "sha512-kwCKIvq0MCW1HzLoGola9Te6JUdzgV0loyKJ3Qghrkz9i5/RRIHsL95BMQc2HBBhlBKC4j22K9p11TGHH8RBpQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@jest/types": "30.4.1", + "@types/stack-utils": "^2.0.3", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "jest-util": "30.4.1", + "picomatch": "^4.0.3", + "pretty-format": "30.4.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.6" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-message-util/node_modules/@jest/schemas": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.4.1.tgz", + "integrity": "sha512-i6b4qw5qnP8c5FEeBJg/uZQ4ddrkN6Ca8qISJh0pr7a5hfn3h3v5x60BEbOC7OYAGZNMs1LfFLwnW2CuK8F57Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.34.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-message-util/node_modules/@jest/types": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.4.1.tgz", + "integrity": "sha512-f1x/vJXIfjOlEmejYpbkbgw1gOqpPECwMvMEtBqe47j7H2Hg8h8w3o3ikhSXq3MI15kg+oQ0exWO0uCtTNJLoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/pattern": "30.4.0", + "@jest/schemas": "30.4.1", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", + "@types/node": "*", + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-message-util/node_modules/@sinclair/typebox": { + "version": "0.34.49", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.49.tgz", + "integrity": "sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A==", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-message-util/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/pretty-format": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.4.1.tgz", + "integrity": "sha512-K6KiKMHTL4jjX4u3Kir2EW07nRfcqVTXIImx50wbjHQTcZPgg+gjVeNTIT3l3L1Rd4UefxfogquC9J37SoFyyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "30.4.1", + "ansi-styles": "^5.2.0", + "react-is-18": "npm:react-is@^18.3.1", + "react-is-19": "npm:react-is@^19.2.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-mock": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.4.1.tgz", + "integrity": "sha512-/i8SVb8/NSB7RfNi8gfqu8gxLV23KaL5EpAttyb9iz8qWRIqXRLflycz/32wXsYkOnaUlx8NAKnJYtpsmXUmfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.4.1", + "@types/node": "*", + "jest-util": "30.4.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-mock/node_modules/@jest/schemas": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.4.1.tgz", + "integrity": "sha512-i6b4qw5qnP8c5FEeBJg/uZQ4ddrkN6Ca8qISJh0pr7a5hfn3h3v5x60BEbOC7OYAGZNMs1LfFLwnW2CuK8F57Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.34.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-mock/node_modules/@jest/types": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.4.1.tgz", + "integrity": "sha512-f1x/vJXIfjOlEmejYpbkbgw1gOqpPECwMvMEtBqe47j7H2Hg8h8w3o3ikhSXq3MI15kg+oQ0exWO0uCtTNJLoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/pattern": "30.4.0", + "@jest/schemas": "30.4.1", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", + "@types/node": "*", + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-mock/node_modules/@sinclair/typebox": { + "version": "0.34.49", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.49.tgz", + "integrity": "sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A==", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve/node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-resolve/node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-runner/node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner/node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-runner/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-runner/node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-runtime/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/jest-runtime/node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime/node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime/node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-runtime/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-snapshot/node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-snapshot/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-util": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.4.1.tgz", + "integrity": "sha512-vjQb1sACEiv13DKJMDToJpzVW0joCsIQrmbg0fi7CyOOt+g9jTuQl2A216pWRBYhOVt53XbL/2LbMKg1BECWOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.4.1", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.3" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-util/node_modules/@jest/schemas": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.4.1.tgz", + "integrity": "sha512-i6b4qw5qnP8c5FEeBJg/uZQ4ddrkN6Ca8qISJh0pr7a5hfn3h3v5x60BEbOC7OYAGZNMs1LfFLwnW2CuK8F57Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.34.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-util/node_modules/@jest/types": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.4.1.tgz", + "integrity": "sha512-f1x/vJXIfjOlEmejYpbkbgw1gOqpPECwMvMEtBqe47j7H2Hg8h8w3o3ikhSXq3MI15kg+oQ0exWO0uCtTNJLoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/pattern": "30.4.0", + "@jest/schemas": "30.4.1", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", + "@types/node": "*", + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-util/node_modules/@sinclair/typebox": { + "version": "0.34.49", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.49.tgz", + "integrity": "sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A==", + "dev": true, + "license": "MIT" + }, "node_modules/jest-util/node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", + "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", + "dev": true, "funding": [ { "type": "github", @@ -10056,6 +13361,18 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/jest-validate/node_modules/pretty-format": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", @@ -10076,6 +13393,187 @@ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "license": "MIT" }, + "node_modules/jest-watch-select-projects": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jest-watch-select-projects/-/jest-watch-select-projects-2.0.0.tgz", + "integrity": "sha512-j00nW4dXc2NiCW6znXgFLF9g8PJ0zP25cpQ1xRro/HU2GBfZQFZD0SoXnAlaoKkIY4MlfTMkKGbNXFpvCdjl1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.3.0", + "chalk": "^3.0.0", + "prompts": "^2.2.1" + } + }, + "node_modules/jest-watch-select-projects/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watch-typeahead": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-2.2.1.tgz", + "integrity": "sha512-jYpYmUnTzysmVnwq49TAxlmtOAwp8QIqvZyoofQFn8fiWhEDZj33ZXzg3JA4nGnzWFm1hbWf3ADpteUokvXgFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^6.0.0", + "chalk": "^4.0.0", + "jest-regex-util": "^29.0.0", + "jest-watcher": "^29.0.0", + "slash": "^5.0.0", + "string-length": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "jest": "^27.0.0 || ^28.0.0 || ^29.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/ansi-escapes": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.1.tgz", + "integrity": "sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watch-typeahead/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/jest-watch-typeahead/node_modules/char-regex": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.2.tgz", + "integrity": "sha512-cbGOjAptfM2LVmWhwRFHEKTPkLwNddVmuqYZQt895yXwAsWsXObCG+YN4DGQ/JBtT4GP1a1lPPdio2z413LmTg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.20" + } + }, + "node_modules/jest-watch-typeahead/node_modules/slash": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watch-typeahead/node_modules/string-length": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-5.0.1.tgz", + "integrity": "sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "char-regex": "^2.0.0", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watch-typeahead/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-watcher/node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-watcher/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/jest-worker": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", @@ -10091,6 +13589,35 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-worker/node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/jest-worker/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -10193,6 +13720,19 @@ } } }, + "node_modules/jsdom/node_modules/entities": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-8.0.0.tgz", + "integrity": "sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/jsdom/node_modules/lru-cache": { "version": "11.3.6", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.3.6.tgz", @@ -10203,6 +13743,29 @@ "node": "20 || >=22" } }, + "node_modules/jsdom/node_modules/parse5": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.1.tgz", + "integrity": "sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^8.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/jsdom/node_modules/undici": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.25.0.tgz", + "integrity": "sha512-xXnp4kTyor2Zq+J1FfPI6Eq3ew5h6Vl0F/8d9XU5zZQf1tX9s2Su1/3PiMmUANFULpmksxkClamIZcaUqryHsQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.18.1" + } + }, "node_modules/jsesc": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", @@ -10222,6 +13785,13 @@ "dev": true, "license": "MIT" }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -10643,12 +14213,26 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lodash": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "dev": true, + "license": "MIT" + }, "node_modules/lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", "license": "MIT" }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true, + "license": "MIT" + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -10772,7 +14356,6 @@ "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", "dev": true, "license": "MIT", - "peer": true, "bin": { "lz-string": "bin/bin.js" } @@ -10787,6 +14370,42 @@ "@jridgewell/sourcemap-codec": "^1.5.5" } }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true, + "license": "ISC" + }, "node_modules/makeerror": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", @@ -11064,6 +14683,15 @@ "node": ">=20.19.4" } }, + "node_modules/metro-source-map/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/metro-symbolicate": { "version": "0.83.3", "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.83.3.tgz", @@ -11084,6 +14712,15 @@ "node": ">=20.19.4" } }, + "node_modules/metro-symbolicate/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/metro-transform-plugins": { "version": "0.83.3", "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.83.3.tgz", @@ -11125,6 +14762,12 @@ "node": ">=20.19.4" } }, + "node_modules/metro/node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "license": "MIT" + }, "node_modules/metro/node_modules/hermes-estree": { "version": "0.32.0", "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.32.0.tgz", @@ -11140,6 +14783,36 @@ "hermes-estree": "0.32.0" } }, + "node_modules/metro/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/metro/node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/micromatch": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", @@ -11153,6 +14826,18 @@ "node": ">=8.6" } }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", @@ -11166,9 +14851,9 @@ } }, "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -11186,13 +14871,23 @@ "node": ">= 0.6" } }, - "node_modules/mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "node_modules/mime-types/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "license": "MIT", "engines": { - "node": ">=4" + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" } }, "node_modules/min-indent": { @@ -11326,6 +15021,13 @@ "node": ">= 0.6" } }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "license": "MIT" + }, "node_modules/nested-error-stacks": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.0.1.tgz", @@ -11502,12 +15204,32 @@ "node": ">=10" } }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/nullthrows": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", "license": "MIT" }, + "node_modules/nwsapi": { + "version": "2.2.23", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.23.tgz", + "integrity": "sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ==", + "dev": true, + "license": "MIT" + }, "node_modules/ob1": { "version": "0.83.3", "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.83.3.tgz", @@ -11684,15 +15406,19 @@ } }, "node_modules/onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, "license": "MIT", "dependencies": { - "mimic-fn": "^1.0.0" + "mimic-fn": "^2.1.0" }, "engines": { - "node": ">=4" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/open": { @@ -11909,6 +15635,25 @@ "node": ">=6" } }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/parse-png": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/parse-png/-/parse-png-2.1.0.tgz", @@ -11922,13 +15667,13 @@ } }, "node_modules/parse5": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.1.tgz", - "integrity": "sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", "dev": true, "license": "MIT", "dependencies": { - "entities": "^8.0.0" + "entities": "^6.0.0" }, "funding": { "url": "https://github.com/inikulin/parse5?sponsor=1" @@ -12015,12 +15760,12 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", - "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "license": "MIT", "engines": { - "node": ">=8.6" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" @@ -12035,6 +15780,75 @@ "node": ">= 6" } }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/plist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.1.tgz", @@ -12134,7 +15948,6 @@ "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", @@ -12150,7 +15963,6 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -12163,8 +15975,7 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/proc-log": { "version": "4.2.0", @@ -12218,6 +16029,26 @@ "react-is": "^16.13.1" } }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/psl": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", + "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "funding": { + "url": "https://github.com/sponsors/lupomontero" + } + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -12227,6 +16058,23 @@ "node": ">=6" } }, + "node_modules/pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, "node_modules/qrcode-terminal": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.11.0.tgz", @@ -12253,6 +16101,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true, + "license": "MIT" + }, "node_modules/queue": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", @@ -12335,6 +16190,27 @@ "ws": "^7" } }, + "node_modules/react-devtools-core/node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/react-dom": { "version": "19.2.4", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz", @@ -12360,9 +16236,24 @@ } }, "node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "version": "19.2.6", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.6.tgz", + "integrity": "sha512-XjBR15BhXuylgWGuslhDKqlSayuqvqBX91BP8pauG8kd1zY8kotkNWbXksTCNRarse4kuGbe2kIY05ARtwNIvw==", + "license": "MIT" + }, + "node_modules/react-is-18": { + "name": "react-is", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/react-is-19": { + "name": "react-is", + "version": "19.2.6", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.6.tgz", + "integrity": "sha512-XjBR15BhXuylgWGuslhDKqlSayuqvqBX91BP8pauG8kd1zY8kotkNWbXksTCNRarse4kuGbe2kIY05ARtwNIvw==", "dev": true, "license": "MIT" }, @@ -12555,6 +16446,20 @@ "node": ">=0.10.0" } }, + "node_modules/react-test-renderer": { + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-19.2.4.tgz", + "integrity": "sha512-Ttl5D7Rnmi6JGMUpri4UjB4BAN0FPs4yRDnu2XSsigCWOLm11o8GwRlVsh27ER+4WFqsGtrBuuv5zumUaRCmKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "react-is": "^19.2.4", + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.4" + } + }, "node_modules/redent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", @@ -12712,6 +16617,13 @@ "path-parse": "^1.0.5" } }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true, + "license": "MIT" + }, "node_modules/resolve": { "version": "2.0.0-next.6", "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.6.tgz", @@ -12736,14 +16648,26 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, "engines": { - "node": ">=4" + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "license": "MIT", + "engines": { + "node": ">=8" } }, "node_modules/resolve-pkg-maps": { @@ -12784,6 +16708,27 @@ "node": ">=4" } }, + "node_modules/restore-cursor/node_modules/mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/restore-cursor/node_modules/onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/reusify": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", @@ -12833,14 +16778,14 @@ } }, "node_modules/rolldown": { - "version": "1.0.0-rc.18", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.18.tgz", - "integrity": "sha512-phmyKBpuBdRYDf4hgyynGAYn/rDDe+iZXKVJ7WX5b1zQzpLkP5oJRPGsfJuHdzPMlyyEO/4sPW6yfSx2gf7lVg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0.tgz", + "integrity": "sha512-yD986aXDESFGS95spT1LAv0jssywP4npMEjmMHyN2/5+eE8qQJUype2AaKkRiLgBgyD0LFlubwAht7VmY8rGoA==", "dev": true, "license": "MIT", "dependencies": { - "@oxc-project/types": "=0.128.0", - "@rolldown/pluginutils": "1.0.0-rc.18" + "@oxc-project/types": "=0.129.0", + "@rolldown/pluginutils": "1.0.0" }, "bin": { "rolldown": "bin/cli.mjs" @@ -12849,27 +16794,27 @@ "node": "^20.19.0 || >=22.12.0" }, "optionalDependencies": { - "@rolldown/binding-android-arm64": "1.0.0-rc.18", - "@rolldown/binding-darwin-arm64": "1.0.0-rc.18", - "@rolldown/binding-darwin-x64": "1.0.0-rc.18", - "@rolldown/binding-freebsd-x64": "1.0.0-rc.18", - "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.18", - "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.18", - "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.18", - "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.18", - "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.18", - "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.18", - "@rolldown/binding-linux-x64-musl": "1.0.0-rc.18", - "@rolldown/binding-openharmony-arm64": "1.0.0-rc.18", - "@rolldown/binding-wasm32-wasi": "1.0.0-rc.18", - "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.18", - "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.18" + "@rolldown/binding-android-arm64": "1.0.0", + "@rolldown/binding-darwin-arm64": "1.0.0", + "@rolldown/binding-darwin-x64": "1.0.0", + "@rolldown/binding-freebsd-x64": "1.0.0", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.0", + "@rolldown/binding-linux-arm64-gnu": "1.0.0", + "@rolldown/binding-linux-arm64-musl": "1.0.0", + "@rolldown/binding-linux-ppc64-gnu": "1.0.0", + "@rolldown/binding-linux-s390x-gnu": "1.0.0", + "@rolldown/binding-linux-x64-gnu": "1.0.0", + "@rolldown/binding-linux-x64-musl": "1.0.0", + "@rolldown/binding-openharmony-arm64": "1.0.0", + "@rolldown/binding-wasm32-wasi": "1.0.0", + "@rolldown/binding-win32-arm64-msvc": "1.0.0", + "@rolldown/binding-win32-x64-msvc": "1.0.0" } }, "node_modules/rolldown/node_modules/@rolldown/pluginutils": { - "version": "1.0.0-rc.18", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.18.tgz", - "integrity": "sha512-CUY5Mnhe64xQBGZEEXQ5WyZwsc1JU3vAZLIxtrsBt3LO6UOb+C8GunVKqe9sT8NeWb4lqSaoJtp2xo6GxT1MNw==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0.tgz", + "integrity": "sha512-aKs/3GSWyV0mrhNmt/96/Z3yczC3yvrzYATCiCXQebBsGyYzjNdUphRVLeJQ67ySKVXRfMxt2lm12pmXvbPFQQ==", "dev": true, "license": "MIT" }, @@ -12981,6 +16926,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, "node_modules/sax": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", @@ -13120,6 +17072,13 @@ "node": ">= 0.8" } }, + "node_modules/server-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/server-only/-/server-only-0.0.1.tgz", + "integrity": "sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA==", + "dev": true, + "license": "MIT" + }, "node_modules/set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", @@ -13375,6 +17334,18 @@ "plist": "^3.0.5" } }, + "node_modules/simple-plist/node_modules/bplist-parser": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.1.tgz", + "integrity": "sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA==", + "license": "MIT", + "dependencies": { + "big-integer": "1.6.x" + }, + "engines": { + "node": ">= 5.10.0" + } + }, "node_modules/simple-swizzle": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.4.tgz", @@ -13384,6 +17355,12 @@ "is-arrayish": "^0.3.1" } }, + "node_modules/simple-swizzle/node_modules/is-arrayish": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.4.tgz", + "integrity": "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==", + "license": "MIT" + }, "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", @@ -13409,9 +17386,9 @@ } }, "node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -13436,15 +17413,6 @@ "source-map": "^0.6.0" } }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/split-on-first": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", @@ -13467,6 +17435,16 @@ "dev": true, "license": "MIT" }, + "node_modules/stack-generator": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/stack-generator/-/stack-generator-2.0.10.tgz", + "integrity": "sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "stackframe": "^1.3.4" + } + }, "node_modules/stack-utils": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", @@ -13501,6 +17479,39 @@ "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", "license": "MIT" }, + "node_modules/stacktrace-gps": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/stacktrace-gps/-/stacktrace-gps-3.1.2.tgz", + "integrity": "sha512-GcUgbO4Jsqqg6RxfyTHFiPxdPqF+3LFmQhm7MgCuYQOYuWyqxo5pwRPz5d/u6/WYJdEnWfK4r+jGbyD8TSggXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "source-map": "0.5.6", + "stackframe": "^1.3.4" + } + }, + "node_modules/stacktrace-gps/node_modules/source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stacktrace-js": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stacktrace-js/-/stacktrace-js-2.0.2.tgz", + "integrity": "sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "error-stack-parser": "^2.0.6", + "stack-generator": "^2.0.5", + "stacktrace-gps": "^3.0.4" + } + }, "node_modules/stacktrace-parser": { "version": "0.1.11", "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.11.tgz", @@ -13513,6 +17524,15 @@ "node": ">=6" } }, + "node_modules/stacktrace-parser/node_modules/type-fest": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", + "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } + }, "node_modules/statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", @@ -13561,6 +17581,20 @@ "node": ">=4" } }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -13707,13 +17741,23 @@ } }, "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true, "license": "MIT", "engines": { - "node": ">=4" + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" } }, "node_modules/strip-indent": { @@ -14042,35 +18086,6 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/tinyrainbow": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", @@ -14173,6 +18188,85 @@ "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", "license": "Apache-2.0" }, + "node_modules/ts-jest": { + "version": "29.4.9", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.9.tgz", + "integrity": "sha512-LTb9496gYPMCqjeDLdPrKuXtncudeV1yRZnF4Wo5l3SFi0RYEnYRNgMrFIdg+FHvfzjCyQk1cLncWVqiSX+EvQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "bs-logger": "^0.2.6", + "fast-json-stable-stringify": "^2.1.0", + "handlebars": "^4.7.9", + "json5": "^2.2.3", + "lodash.memoize": "^4.1.2", + "make-error": "^1.3.6", + "semver": "^7.7.4", + "type-fest": "^4.41.0", + "yargs-parser": "^21.1.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/transform": "^29.0.0 || ^30.0.0", + "@jest/types": "^29.0.0 || ^30.0.0", + "babel-jest": "^29.0.0 || ^30.0.0", + "jest": "^29.0.0 || ^30.0.0", + "jest-util": "^29.0.0 || ^30.0.0", + "typescript": ">=4.3 <7" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/transform": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jest-util": { + "optional": true + } + } + }, + "node_modules/ts-jest/node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-jest/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/tsconfig-paths": { "version": "3.15.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", @@ -14199,6 +18293,16 @@ "json5": "lib/cli.js" } }, + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", @@ -14228,12 +18332,15 @@ } }, "node_modules/type-fest": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", - "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/typed-array-buffer": { @@ -14352,6 +18459,20 @@ "typescript": ">=4.8.4 <6.1.0" } }, + "node_modules/uglify-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/unbox-primitive": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", @@ -14372,13 +18493,12 @@ } }, "node_modules/undici": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.25.0.tgz", - "integrity": "sha512-xXnp4kTyor2Zq+J1FfPI6Eq3ew5h6Vl0F/8d9XU5zZQf1tX9s2Su1/3PiMmUANFULpmksxkClamIZcaUqryHsQ==", - "dev": true, + "version": "6.25.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.25.0.tgz", + "integrity": "sha512-ZgpWDC5gmNiuY9CnLVXEH8rl50xhRCuLNA97fAUnKi8RRuV4E6KG31pDTsLVUKnohJE0I3XDrTeEydAXRw47xg==", "license": "MIT", "engines": { - "node": ">=20.18.1" + "node": ">=18.17" } }, "node_modules/undici-types": { @@ -14427,6 +18547,16 @@ "node": ">=4" } }, + "node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -14511,6 +18641,17 @@ "punycode": "^2.1.0" } }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, "node_modules/use-latest-callback": { "version": "0.2.6", "resolved": "https://registry.npmjs.org/use-latest-callback/-/use-latest-callback-0.2.6.tgz", @@ -14548,6 +18689,21 @@ "uuid": "dist/bin/uuid" } }, + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, "node_modules/validate-npm-package-name": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", @@ -14567,16 +18723,16 @@ } }, "node_modules/vite": { - "version": "8.0.11", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.11.tgz", - "integrity": "sha512-Jz1mxtUBR5xTT65VOdJZUUeoyLtqljmFkiUXhPTLZka3RDc9vpi/xXkyrnsdRcm2lIi3l3GPMnAidTsEGIj3Ow==", + "version": "8.0.12", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.12.tgz", + "integrity": "sha512-w2dDofOWv2QB09ZITZBsvKTVAlYvPR4IAmrY/v0ir9KvLs0xybR7i48wxhM1/oyBWO34wPns+bPGw5ZrZqDpZg==", "dev": true, "license": "MIT", "dependencies": { "lightningcss": "^1.32.0", "picomatch": "^4.0.4", "postcss": "^8.5.14", - "rolldown": "1.0.0-rc.18", + "rolldown": "1.0.0", "tinyglobby": "^0.2.16" }, "bin": { @@ -14644,19 +18800,6 @@ } } }, - "node_modules/vite/node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/vitest": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.5.tgz", @@ -14747,19 +18890,6 @@ } } }, - "node_modules/vitest/node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/vlq": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz", @@ -14813,6 +18943,20 @@ "node": ">=20" } }, + "node_modules/whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/whatwg-fetch": { "version": "3.6.20", "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", @@ -15004,6 +19148,13 @@ "node": ">=0.10.0" } }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true, + "license": "MIT" + }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -15041,16 +19192,16 @@ } }, "node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.20.0.tgz", + "integrity": "sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==", "license": "MIT", "engines": { - "node": ">=8.3.0" + "node": ">=10.0.0" }, "peerDependencies": { "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" + "utf-8-validate": ">=5.0.2" }, "peerDependenciesMeta": { "bufferutil": { @@ -15138,9 +19289,9 @@ "license": "ISC" }, "node_modules/yaml": { - "version": "2.8.4", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.4.tgz", - "integrity": "sha512-ml/JPOj9fOQK8RNnWojA67GbZ0ApXAUlN2UQclwv2eVgTgn7O9gg9o7paZWKMp4g0H3nTLtS9LVzhkpOFIKzog==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", + "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", "license": "ISC", "bin": { "yaml": "bin.mjs" diff --git a/package.json b/package.json index 6140972..514537e 100644 --- a/package.json +++ b/package.json @@ -10,10 +10,13 @@ "dev": "npm run dev -w apps/web", "build": "npm run build -w apps/web", "start": "npm run start -w apps/web", - "lint": "npm run lint -w apps/web", - "typecheck": "npm run typecheck -w apps/web", + "lint": "npm run lint -w apps/web && npm run lint -w apps/mobile", + "typecheck": "npm run typecheck -w apps/web && npm run typecheck -w apps/mobile", "test": "npm run test -w apps/web", "dev:mobile": "npm run start -w apps/mobile", "typecheck:mobile": "npm run typecheck -w apps/mobile" + }, + "overrides": { + "react-test-renderer": "19.2.4" } } diff --git a/packages/api-client/src/client.ts b/packages/api-client/src/client.ts index e0aca9f..32fe2bb 100644 --- a/packages/api-client/src/client.ts +++ b/packages/api-client/src/client.ts @@ -74,6 +74,20 @@ export class ApiClient { return res.json(); } + /** + * Send an arbitrary HAFAS protocol body to the /api/hafas endpoint. + * This handles TripSearch, LocMatch, and any other HAFAS methods. + */ + async hafasRequest>(body: unknown): Promise { + const res = await fetch(`${this.baseUrl}/api/hafas`, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(body), + }); + if (!res.ok) throw new Error(`HAFAS request failed: ${res.status}`); + return res.json(); + } + async searchJourneys( fromStationExtId: string, toStationExtId: string,