diff --git a/AGENTS.md b/AGENTS.md index ad9b32f..509286f 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -2,7 +2,7 @@ ## Current Release -**v0.9.27** — Open Product Family Branding Alignment + Vercel Deployment (2026-07-03) +**v1.0.0** — Web + PWA Stable Release (2026-07-07) ## Product Identity @@ -36,24 +36,25 @@ Sprout Individual product → apps/web/docs/BRANDING.md - **Frontend:** Next.js 15 (App Router) + Tailwind CSS v4 + TypeScript - **Backend:** Supabase (auth, PostgreSQL DB, file storage, edge functions) -- **Mobile:** Capacitor v8 Android (PWA for Windows/desktop) +- **Mobile:** PWA (Installable on all platforms; Android archive preserved at `archive/android/`) - **AI:** MCP server at `apps/mcp/` — 28 tools, 112 tests - **Auth:** Google OAuth (email/password disabled via Supabase) - **Design:** Sora variable font, warm paper light mode, deep botanical dark mode - **Hosting:** Vercel (web at sprout.kovina.org), Supabase (backend, shared project with OpenSend) -- **CI:** GitHub Actions — Java 21 for Android, Node 24 for web, caching via `setup-node` +- **CI:** GitHub Actions — Node 24 for web, caching via `setup-node` ## Repo Structure ``` opensprout/ ├── apps/ -│ ├── web/ # Next.js app + Capacitor Android +│ ├── web/ # Next.js app (App Router) + PWA │ │ ├── src/app/ # App Router pages + API routes │ │ ├── src/lib/ # Data layer, auth, supabase clients, context │ │ └── src/components/# UI components │ └── mcp/ # MCP server (28 tools, HTTP + stdio) │ └── src/tools/ # 7 tool modules (plants, care, journal, etc.) +├── archive/ # Archived platforms (Android/Capacitor) ├── docs/ # 35+ docs ├── scripts/ # build/release scripts ├── supabase/ @@ -346,6 +347,34 @@ The Supabase project `rbdyrymtgfqqkdemicdo` is shared between OpenSprout (plant - All MCP tool files, test mocks, sync cache mappings, and `db.ts` store names updated. - `delete_account()` RPC function replaced (table `RENAME` doesn't update hardcoded names in function bodies). +## Key Changes in v1.0.0 — Web + PWA Stable Release (2026-07-07) + +### Android/Capacitor Archived +- Full Android build preserved at `archive/android/` (120 MB, 2814 files). +- Capacitor config archived at `archive/capacitor.config.ts`. +- 8 `@capacitor/*` npm packages removed from both `package.json` files. +- All 18 Android/Cap scripts removed. Only `rc:web` remains. + +### Capacitor Code Cleaned (13 files touched) +- `platform.ts` — simplified to `resolveApiUrl()` and `PRODUCTION_ORIGIN` only. +- `haptics.ts` — Capacitor plugin removed, `navigator.vibrate` only. +- `reminders.ts` — Capacitor LocalNotifications path removed, web-only scheduling. +- `app-context.tsx` — Capacitor `appUrlOpen` listener removed. +- `auth-gate.tsx` — Capacitor native detection removed, always shows public page. +- `photo-picker.tsx` — Capacitor Camera plugin removed, `capture="environment"` only. +- `login/page.tsx` — Capacitor "native" auth branch removed. +- `debug-info.tsx` — Capacitor diagnostics removed. +- `oauth-deeplink-handler.tsx` — deleted (Capacitor-only). +- `capacitor-haptics.d.ts` — deleted. + +### Other Changes +- **GeneratedAssets committed** — 324 cross-platform brand icon files. +- **Footer redesigned** — OPEN/Sprout lockup with icon, KOVINA wordmark, no AGPLv3 legalese. +- **About page** — dual dark/light icons, PublicFooter restored. +- **Feature grid** — responsive 1→2→3 column layout. +- **Header** — "View on GitHub" button removed. +- **Version bumped** to 1.0.0. + ## Key Changes in v0.9.27 — Open Product Family Branding Alignment (2026-07-02) ### Header Lockup Standardization @@ -408,8 +437,6 @@ The Supabase project `rbdyrymtgfqqkdemicdo` is shared between OpenSprout (plant - No crash reporting / analytics (intentional privacy choice) - Vercel Hobby plan rate-limited for deployments (24h cooldown) - Supabase project shared with OpenSend (send.kovina.org) — all tables use `opensprout_` prefix -- Android OAuth requires `opensprout://auth/callback` and `https://sprout.kovina.org/auth/complete` added to Supabase Redirect URLs -- Android APK built in CI has placeholder web assets (no static export) — functional for development only ## Build Commands @@ -418,9 +445,7 @@ npm run dev # Dev server at localhost:9999 npm run build # Web production build npm run typecheck # TypeScript check (builds MCP first) npm run lint # ESLint -npm run android:debug # Debug APK -npm run android:release # Both signed AAB + APK -npm run -w @opensprout/mcp test # MCP tests +npm run -w @opensprout/mcp test # MCP tests (112) bash scripts/release.sh # Full release automation bash scripts/release.sh --check-only # Checks only, no build ``` diff --git a/CHANGELOG.md b/CHANGELOG.md index 7b75694..fcd9735 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,22 @@ All notable changes to OpenSprout will be documented here. The format follows [Keep a Changelog](https://keepachangelog.com/). OpenSprout uses [Semantic Versioning](https://semver.org/). +## 1.0.0 — 2026-07-07 + +### Changed +- **v1.0.0 stable release** — OpenSprout ships as a web + PWA application. +- **Android/Capacitor archived** — Android build removed from active tree for future revisiting (preserved in `archive/`). +- **Capacitor dependencies removed** — 8 @capacitor/* packages cleaned from both package.json files. Android scripts stripped. +- **Notification system simplified** — Capacitor LocalNotifications path removed; all reminders use Web Notification API (PWA). +- **Auth flow cleaned** — Capacitor native auth branch removed; web + PWA sign-in streamlined. +- **Haptics simplified** — Capacitor Haptics plugin path removed; falls back to navigator.vibrate. +- **Debug page cleaned** — Capacitor detection diagnostics removed. +- **Photo picker simplified** — Capacitor Camera plugin path removed; uses native `capture="environment"` input. +- **Platform utilities simplified** — Capacitor-specific routing removed. +- **GeneratedAssets committed to repo** (324 cross-platform brand icon files). +- **Branding updates** — About page icon fixed with dark/light variants. Footer features OPEN/Sprout lockup with icon, KOVINA wordmark, no AGPLv3 legalese. Landing page feature cards in responsive grid. +- **Header cleaned** — "View on GitHub" button removed. + ## 0.9.26 — 2026-06-28 ### Added diff --git a/CLAUDE.md b/CLAUDE.md index 6fb22d6..ad2fc63 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,6 +1,6 @@ -# OpenSprout v0.9.27 +# OpenSprout v1.0.0 -**Stack:** Next.js 15 (App Router) · Supabase · Capacitor v8 Android · Tailwind CSS v4 · Sora font +**Stack:** Next.js 15 (App Router) · Supabase · Tailwind CSS v4 · Sora font · PWA **Deploy:** https://sprout.kovina.org **Source:** github.com/sparshsam/opensprout **License:** AGPLv3 @@ -20,7 +20,7 @@ npm run android:release # Signed AAB + APK ## Project Layout ``` -apps/web/ # Next.js + Capacitor Android +apps/web/ # Next.js app + PWA ├── src/app/ │ ├── page.tsx # Public homepage │ ├── login/ # Google OAuth sign-in (platform-aware: web/PWA/Android) @@ -43,7 +43,6 @@ apps/web/ # Next.js + Capacitor Android │ ├── terms/ # Terms of service │ ├── mcp/ # AI Access guide │ └── globals.css # Design tokens, animations, a11y - ├── android/ # Capacitor Android project ├── public/ │ ├── sw.js # Service worker (v0.9.27) │ ├── manifest.webmanifest # PWA manifest @@ -85,10 +84,6 @@ supabase/migrations/ # Database migrations (shared project) | `npm run build` | Web production build | | `npm run typecheck` | TypeScript check (builds MCP first) | | `npm run lint` | ESLint | -| `npm run android:debug` | Debug APK | -| `npm run android:release:bundle` | Signed release AAB | -| `npm run android:release:apk` | Signed release APK | -| `npm run android:release` | Both AAB + APK | | `npm run -w @opensprout/mcp test` | MCP tests (112) | | `bash scripts/release.sh` | Full release automation (check → build → sign) | | `bash scripts/release.sh --check-only` | Run all checks without building | @@ -135,7 +130,7 @@ Sprout Individual product → apps/web/docs/BRANDING.md - **Callback:** `/auth/callback` exchanges code server-side via `createServerClient` + `exchangeCodeForSession()` (critical — without this the redirect drops the `code` param causing a sign-in loop) - **Session:** Auto-refreshed via `@supabase/ssr` - **CSP:** Security headers disabled in dev mode (Next.js HMR needs `'unsafe-eval'`); production Vercel builds get strict headers -- **Platform awareness:** `AuthGate` detects Capacitor native via `window.Capacitor.isNativePlatform()` — web shows public homepage, native redirects to login +- **Platform awareness:** Web + PWA only. Capacitor native (Android) archived at `archive/`. ## MCP Server @@ -155,6 +150,7 @@ Architecture follows the MCP Build Guide: SHA-256 token auth, centralized regist ## Release History +- **v1.0.0** (Jul 7) — **Stable release — Web + PWA.** Android/Capacitor archived, 8 Capacitor packages removed, 13 source files cleaned, footer redesigned, feature grid, KOVINA wordmark, GeneratedAssets committed. - **v0.9.27** (Jul 3) — Open Product Family branding alignment + Vercel deployment. Header lockups standardized to `[icon] OPEN / Sprout` stacked layout in all three header components (public-nav, shell/top-bar, app-shell). Icons generated from 1024x1024 light + dark masters via Lanczos resampling: 210 assets across Windows ICO, MSIX, Android mipmaps, iOS, macOS, Web/PWA favicons, social OG, GitHub, and header icons. 114 dark mode variant assets generated (including opensprout-icon-header-dark.png). All three header locations use dual-image wrap with `dark:opacity-0`/`dark:opacity-100` CSS transitions for dark/light theming. Generated PNG icons replace the lucide Sprout icon in public-nav.tsx and app-shell.tsx. Lockup styling aligned to OpenPalette canonical spec. Brand hierarchy documented in `apps/web/docs/BRANDING.md`. Build fixes: added eslint-disable comments for `` tags (blocking Vercel build), added missing `import Link from "next/link"` to app-shell.tsx, added root `public/` directory with hard copies for Vercel static file serving. Docs/BRANDING.md created. OpenPalette canonical spec alignment. Vercel deploy live at sprout.kovina.org. - **v0.9.26** (Jun 28) — CI stabilization + database namespacing. Android CI now builds with Java 21 (fixes AGP 8.13 compile error) and uses normal `next build` (not static export) — all `force-static`/`generateStaticParams` route hacks reverted. All 14 OpenSprout tables renamed to `opensprout_` prefix for shared Supabase project namespacing. Code references, type definitions, MCP tools, and tests updated. - **v0.9.26** (Jun 28) — Native Google Sign-In + Android Fixes. In-app Chrome Custom Tab for Android, browser-popup login for Windows/PWA, platform-aware sign-in dispatch, API routing for Capacitor static export, adaptive icon fix, white flash fix, debug diagnostics page. diff --git a/README.md b/README.md index 5a30243..2c30c1b 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@
[![Website](https://img.shields.io/badge/website-sprout.kovina.org-3ecf8e?style=for-the-badge&logo=vercel)](https://sprout.kovina.org) -[![Google Play](https://img.shields.io/badge/Get%20it%20on-Google%20Play-414141?style=for-the-badge&logo=googleplay&logoColor=white)](https://play.google.com/store/apps/details?id=org.kovina.opensprout) +[![PWA](https://img.shields.io/badge/PWA-Installable-5A0FC8?style=for-the-badge&logo=pwa)](https://sprout.kovina.org) [![Latest Release](https://img.shields.io/github/v/release/sparshsam/opensprout?sort=semver&style=for-the-badge&label=Release&color=2563eb)](https://github.com/sparshsam/opensprout/releases) [![Source Code](https://img.shields.io/badge/Source%20Code-GitHub-181717?style=for-the-badge&logo=github&logoColor=white)](https://github.com/sparshsam/opensprout) @@ -65,8 +65,8 @@ Most plant care apps eventually become a subscription, a closed data silo, or bo | **Plant CRUD** — Create, edit, delete, inspect plants | **Care Templates** — 30 built-in species templates with suggested care rhythms | | **Care Schedules** — Watering and fertilizing schedules from templates or custom inputs | **Care Logs** — Mark plants watered or fertilized and persist logs | | **Journal Entries** — Title, body, health score, tags, optional photo attachments | **Photo Uploads** — Capture from camera or gallery, stored in private Supabase Storage | -| **JSON Export** — Export your data anytime | **Android App** — Capacitor-based native Android experience | -| **AI Agent Integration (MCP)** — 25 tools for plant management via Claude, Hermes, Cursor | **PWA** — Installable as a standalone web app | +| **JSON Export** — Export your data anytime | **AI Agent Integration (MCP)** — 28 tools for plant management via Claude, Cursor, and any MCP client | +| **PWA** — Installable as a standalone web app on desktop and mobile | **Privacy-first** — No tracking, no ads, no data sales |
@@ -104,7 +104,7 @@ Every feature serves one purpose: helping you remember what your plants need. No TypeScript Tailwind CSS 4 Vercel - Capacitor + PWA MCP

@@ -116,6 +116,7 @@ Every feature serves one purpose: helping you remember what your plants need. No | Version | Date | Highlights | |---------|------|------------| +| **v1.0.0** | 2026-07 | **Stable release** — Web + PWA. Android archived. Capacitor removed. | | **v0.9.0** | 2026-06 | MCP server with 25 AI agent tools, photo uploads | | **v0.8.0** | 2026-05 | Android app (Capacitor), full Android project | | **v0.7.0** | 2026-05 | Journal entries, health scores, tag system | diff --git a/apps/web/package.json b/apps/web/package.json index 96ef2db..ce226a3 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -1,36 +1,17 @@ { "name": "@opensprout/web", - "version": "0.9.26", + "version": "1.0.0", "private": true, "license": "AGPL-3.0-or-later", "scripts": { "dev": "next dev -p 9999", "build": "next build", - "build:mobile": "CAPACITOR_BUILD=true next build && npx cap sync", "start": "next start", "lint": "eslint .", "typecheck": "tsc --noEmit", - "cap:sync": "npx cap sync", - "cap:copy": "npx cap copy", - "cap:open:android": "npx cap open android", - "cap:dev:android": "npx cap run android -l --host=0.0.0.0", - "android:sync": "npx cap sync", - "android:open": "npx cap open android", - "android:debug": "CAPACITOR_BUILD=true next build && npx cap copy android && cd android && ./gradlew assembleDebug", - "android:release:bundle": "CAPACITOR_BUILD=true next build && npx cap copy android && cd android && ./gradlew bundleRelease", - "android:release:apk": "CAPACITOR_BUILD=true next build && npx cap copy android && cd android && ./gradlew assembleRelease", - "android:release": "npm run android:release:bundle && npm run android:release:apk", - "rc:android": "npm run android:debug && echo '--- Release artifacts ---' && npm run android:release", "rc:web": "npm run build" }, "dependencies": { - "@capacitor/android": "^8.4.0", - "@capacitor/app": "^8.1.0", - "@capacitor/browser": "^8.0.3", - "@capacitor/camera": "^8.2.0", - "@capacitor/cli": "^8.4.0", - "@capacitor/core": "^8.4.0", - "@capacitor/local-notifications": "^8.2.0", "@supabase/ssr": "^0.10.3", "@supabase/supabase-js": "^2.107.0", "class-variance-authority": "^0.7.1", diff --git a/apps/web/public/kovina-wordmark-monochrome.svg b/apps/web/public/kovina-wordmark-monochrome.svg new file mode 100644 index 0000000..f7b4ebe --- /dev/null +++ b/apps/web/public/kovina-wordmark-monochrome.svg @@ -0,0 +1,10 @@ + + + + + + KOVINA + \ No newline at end of file diff --git a/apps/web/src/app/debug/debug-info.tsx b/apps/web/src/app/debug/debug-info.tsx index 341ef6e..ea6227e 100644 --- a/apps/web/src/app/debug/debug-info.tsx +++ b/apps/web/src/app/debug/debug-info.tsx @@ -2,7 +2,7 @@ import { useEffect, useState } from "react"; import { createClient } from "@/lib/supabase/browser"; -import { isCapacitorNative, resolveApiUrl, PRODUCTION_ORIGIN } from "@/lib/data/platform"; +import { resolveApiUrl } from "@/lib/data/platform"; type Diagnostic = { label: string; @@ -12,97 +12,27 @@ type Diagnostic = { export function DebugInfo() { const [diags, setDiags] = useState([]); - const [listeners, setListeners] = useState([]); const [sessionStatus, setSessionStatus] = useState("checking…"); useEffect(() => { const items: Diagnostic[] = []; // ── Environment ────────────────────────────────────────────────────── - items.push({ - label: "Origin", - value: window.location.origin, - }); - items.push({ - label: "Protocol", - value: window.location.protocol, - }); - items.push({ - label: "User Agent", - value: navigator.userAgent.slice(0, 120), - }); - - // ── Platform detection ─────────────────────────────────────────────── - const capacitorNative = isCapacitorNative(); - items.push({ - label: "Capacitor detected", - value: capacitorNative ? "Yes" : "No", - ok: capacitorNative, - }); + items.push({ label: "Origin", value: window.location.origin }); + items.push({ label: "Protocol", value: window.location.protocol }); + items.push({ label: "User Agent", value: navigator.userAgent.slice(0, 120) }); - // Check Capacitor global - const win = window as typeof window & { - Capacitor?: { isNativePlatform?: () => boolean }; - }; - items.push({ - label: "window.Capacitor", - value: win.Capacitor ? "Present" : "Undefined", - ok: !!win.Capacitor, - }); - items.push({ - label: "isNativePlatform()", - value: capacitorNative ? "true" : "false (or not available)", - ok: capacitorNative, - }); - - // Match media for PWA + // ── PWA detection ──────────────────────────────────────────────────── const standalone = window.matchMedia("(display-mode: standalone)").matches; items.push({ - label: "display-mode: standalone", - value: standalone ? "Yes" : "No", + label: "PWA mode", + value: standalone ? "Standalone" : "Browser tab", ok: standalone, }); // ── API routing ────────────────────────────────────────────────────── - items.push({ - label: "getApiOrigin()", - value: capacitorNative ? PRODUCTION_ORIGIN : "(empty)", - }); - items.push({ - label: "Resolved /api/identify", - value: resolveApiUrl("/api/identify"), - }); - items.push({ - label: "Resolved /api/log", - value: resolveApiUrl("/api/log"), - }); - - // ── Capacitor plugins ──────────────────────────────────────────────── - const cap = (window as typeof window & { - Capacitor?: { Plugins?: Record; isNativePlatform?: () => boolean }; - }).Capacitor; - const hasApp = !!(cap?.Plugins?.App); - const hasBrowser = !!(cap?.Plugins?.Browser); - items.push({ - label: "Capacitor Plugins — App", - value: hasApp ? "Registered" : "Not found", - ok: hasApp, - }); - items.push({ - label: "Capacitor Plugins — Browser", - value: hasBrowser ? "Registered" : "Not found", - ok: hasBrowser, - }); - - // ── Deep-link listeners ────────────────────────────────────────────── - const registered: string[] = []; - if (capacitorNative) { - registered.push("appUrlOpen — OAuthDeepLinkHandler (root layout)"); - registered.push("browserFinished — OAuthDeepLinkHandler (root layout)"); - } else { - registered.push("Not applicable (not Capacitor)"); - } - setListeners(registered); + items.push({ label: "Resolved /api/identify", value: resolveApiUrl("/api/identify") }); + items.push({ label: "Resolved /api/log", value: resolveApiUrl("/api/log") }); // ── Supabase session ───────────────────────────────────────────────── (async () => { @@ -154,38 +84,10 @@ export function DebugInfo() { {/* Session */}

- Supabase Session + Session

{sessionStatus}

- - {/* Deep-link listeners */} -
-

- Deep-Link Listeners -

-
    - {listeners.map((l, i) => ( -
  • - {l.startsWith("Not") ? ( - {l} - ) : ( - ✓ {l} - )} -
  • - ))} -
-
- - {/* Supabase config */} -
-

- Supabase Config -

-

- URL: {process.env.NEXT_PUBLIC_SUPABASE_URL ?? "not set"} -

-
); } diff --git a/apps/web/src/app/layout.tsx b/apps/web/src/app/layout.tsx index 5c567c1..1a0c27c 100644 --- a/apps/web/src/app/layout.tsx +++ b/apps/web/src/app/layout.tsx @@ -2,7 +2,6 @@ import type { Metadata, Viewport } from "next"; import { Sora } from "next/font/google"; import "./globals.css"; import { ThemeProvider } from "@/lib/context/theme-context"; -import { OAuthDeepLinkHandler } from "@/components/oauth-deeplink-handler"; const sora = Sora({ subsets: ["latin"], @@ -61,7 +60,6 @@ export default function RootLayout({ Skip to content - {children} diff --git a/apps/web/src/app/login/page.tsx b/apps/web/src/app/login/page.tsx index 2876cc1..610eaa8 100644 --- a/apps/web/src/app/login/page.tsx +++ b/apps/web/src/app/login/page.tsx @@ -7,15 +7,11 @@ import { PublicNav } from "@/components/public-nav"; import { PublicFooter } from "@/components/public-footer"; import Link from "next/link"; -type SignInPlatform = "web" | "native" | "pwa"; +type SignInPlatform = "web" | "pwa"; /** Detect the current runtime platform to choose the right sign-in flow. */ function detectPlatform(): SignInPlatform { if (typeof window === "undefined") return "web"; - const win = window as typeof window & { - Capacitor?: { isNativePlatform?: () => boolean }; - }; - if (win.Capacitor?.isNativePlatform?.()) return "native"; if ( window.matchMedia("(display-mode: standalone)").matches || (window.navigator as { standalone?: boolean }).standalone === true @@ -76,7 +72,7 @@ export default function LoginPage() { const platform = detectPlatform(); if (platform === "web") { - // ── Web: direct browser redirect (existing flow) ──────────────── + // ── Web: direct browser redirect ────────────────────────────── const { error: oauthError } = await supabase.auth.signInWithOAuth({ provider: "google", options: { @@ -84,25 +80,6 @@ export default function LoginPage() { }, }); if (oauthError) throw oauthError; - // Page navigates away — no need to reset busy state - } else if (platform === "native") { - // ── Capacitor native: in-app Chrome Custom Tab ────────────────── - const { data, error: oauthError } = - await supabase.auth.signInWithOAuth({ - provider: "google", - options: { - redirectTo: "opensprout://auth/callback", - skipBrowserRedirect: true, - }, - }); - if (oauthError) throw oauthError; - if (!data?.url) throw new Error("Failed to get sign-in URL."); - - // Open in in-app browser (Chrome Custom Tab on Android) - const { Browser } = await import("@capacitor/browser"); - await Browser.open({ url: data.url }); - - // Don't reset busy — user will return via deep link } else { // ── PWA: open system browser popup ────────────────────────────── const { data, error: oauthError } = @@ -161,7 +138,6 @@ export default function LoginPage() { /** Platform label shown beneath the button. */ const platformHint = useMemo(() => { const p = detectPlatform(); - if (p === "native") return "You'll be taken to Google to sign in securely."; if (p === "pwa") return "A browser window will open to sign you in."; return null; }, []); diff --git a/apps/web/src/components/auth-gate.tsx b/apps/web/src/components/auth-gate.tsx index 44c7979..86982fc 100644 --- a/apps/web/src/components/auth-gate.tsx +++ b/apps/web/src/components/auth-gate.tsx @@ -1,62 +1,21 @@ /** * AuthGate wraps the public homepage content. * - * - **Web browser:** Shows the public marketing page to everyone. - * Signed-in users use the "Sign in" button (smart-redirects to /today) - * to reach their dashboard. - * - * - **Native app (Capacitor):** Redirects to /login on mount — - * the native first screen is the auth flow, not the marketing page. + * Shows the public marketing page to everyone. + * Signed-in users use the "Sign in" button (smart-redirects to /today) + * to reach their dashboard. */ "use client"; import { useEffect, useState } from "react"; import { Sprout } from "lucide-react"; -import { createClient } from "@/lib/supabase/browser"; - -/** True when running inside a Capacitor native shell (Android / iOS). */ -function isNativeApp(): boolean { - if (typeof window === "undefined") return false; - const win = window as typeof window & { - Capacitor?: { isNativePlatform?: () => boolean }; - }; - return !!win.Capacitor?.isNativePlatform?.(); -} export function AuthGate({ children }: { children: React.ReactNode }) { - const [state, setState] = useState< - "loading" | "public" | "redirecting" - >("loading"); + const [state, setState] = useState<"loading" | "public">("loading"); useEffect(() => { - let cancelled = false; - - async function check() { - if (isNativeApp()) { - // Native app: check session, redirect to /login or /today - try { - const supabase = createClient(); - const { data } = await supabase.auth.getSession(); - if (cancelled) return; - window.location.href = data.session ? "/today" : "/login"; - if (!cancelled) setState("redirecting"); - } catch { - if (!cancelled) { - window.location.href = "/login"; - setState("redirecting"); - } - } - } else { - // Web browser: always show the public page - if (!cancelled) setState("public"); - } - } - - check(); - return () => { - cancelled = true; - }; + setState("public"); }, []); if (state === "loading") { @@ -70,6 +29,5 @@ export function AuthGate({ children }: { children: React.ReactNode }) { ); } - // web browser — render the public homepage return <>{children}; } diff --git a/apps/web/src/components/cards/photo-picker.tsx b/apps/web/src/components/cards/photo-picker.tsx index 3aa3e82..7781071 100644 --- a/apps/web/src/components/cards/photo-picker.tsx +++ b/apps/web/src/components/cards/photo-picker.tsx @@ -37,13 +37,6 @@ function generateId() { return `photo-${crypto.randomUUID().slice(0, 8)}`; } -function isCapacitorNative(): boolean { - try { - return typeof window !== "undefined" && "Capacitor" in window; - } catch { - return false; - } -} /** Check if we're on a mobile device likely to have a camera. */ function isMobileDevice(): boolean { @@ -97,57 +90,7 @@ export function PhotoPicker({ async function handleCameraCapture() { if (!canAdd) return; - if (isCapacitorNative()) { - // Capacitor native — use Camera plugin - setLoading(true); - try { - const { Camera, CameraResultType } = await import( - "@capacitor/camera" - ); - const image = await Camera.getPhoto({ - resultType: CameraResultType.Uri, - quality: 80, - width: 1920, - height: 1920, - saveToGallery: false, - }); - - if (!image.webPath) { - setLoading(false); - return; - } - - const response = await fetch(image.webPath); - const blob = await response.blob(); - const fileName = - image.path?.split("/").pop() ?? `camera-${Date.now()}.jpg`; - - const newPhoto: PickedPhoto = { - id: generateId(), - blob, - previewUrl: image.webPath, - name: fileName, - file: null, - }; - - onAdd([newPhoto]); - } catch { - // Fallback to file picker - galleryInputRef.current?.click(); - } finally { - setLoading(false); - } - return; - } - // Web / PWA — use capture="environment" to open the native camera - // This works on: - // - iOS Safari (opens Camera app) - // - Chrome iOS (opens Camera app) - // - Chrome Android (opens Camera app) - // - Samsung Internet - // - All modern mobile browsers - // On desktop, it falls back to the file picker. cameraInputRef.current?.click(); } @@ -212,11 +155,9 @@ export function PhotoPicker({ )} > - {isCapacitorNative() + {isMobileDevice() ? "Camera" - : isMobileDevice() - ? "Camera" - : "Take photo"} + : "Take photo"} {/* Hidden file input for gallery (standard image picker) */} diff --git a/apps/web/src/components/oauth-deeplink-handler.tsx b/apps/web/src/components/oauth-deeplink-handler.tsx deleted file mode 100644 index bcabb88..0000000 --- a/apps/web/src/components/oauth-deeplink-handler.tsx +++ /dev/null @@ -1,75 +0,0 @@ -"use client"; - -import { useEffect } from "react"; - -/** - * Global Capacitor deep-link listener for OAuth callbacks. - * - * When the user signs in with Google on Android via the in-app Chrome - * Custom Tab, Supabase redirects to `opensprout://auth/callback?code=...`. - * The Android intent system opens/resumes the app, and this component - * catches the `appUrlOpen` event to exchange the PKCE code client-side. - * - * Mounted once in the root layout — renders nothing. - */ -export function OAuthDeepLinkHandler() { - useEffect(() => { - // Guard: only run in Capacitor native - const win = window as typeof window & { - Capacitor?: { isNativePlatform?: () => boolean }; - }; - if (!win.Capacitor?.isNativePlatform?.()) return; - - let cleanup: (() => void) | undefined; - - (async () => { - const { App } = await import("@capacitor/app"); - const { Browser } = await import("@capacitor/browser"); - - // ── Handle OAuth redirect from Chrome Custom Tab ─────────────────── - App.addListener("appUrlOpen", async (event) => { - try { - const url = new URL(event.url); - - // Match opensprout://auth/callback or - // http(s)://localhost:9999/auth/callback (dev) or - // https://sprout.kovina.org/auth/callback (prod) - if (!url.pathname.startsWith("/auth/callback")) return; - - const code = url.searchParams.get("code"); - if (!code) return; - - const { createClient } = await import("@/lib/supabase/browser"); - const supabase = createClient(); - - const { error } = await supabase.auth.exchangeCodeForSession(code); - if (error) { - console.error("[OAuthDeepLink] exchangeCodeForSession failed:", error.message); - return; - } - - // Navigate to dashboard - window.location.href = "/today"; - } catch (err) { - console.error("[OAuthDeepLink] error handling appUrlOpen:", err); - } - }); - - // ── Fallback: user pressed back / browser closed ─────────────────── - Browser.addListener("browserFinished", async () => { - const { createClient } = await import("@/lib/supabase/browser"); - const supabase = createClient(); - const { data } = await supabase.auth.getSession(); - if (data.session) { - window.location.href = "/today"; - } - }); - })(); - - return () => { - cleanup?.(); - }; - }, []); - - return null; -} diff --git a/apps/web/src/components/public-footer.tsx b/apps/web/src/components/public-footer.tsx index f91af23..3834e77 100644 --- a/apps/web/src/components/public-footer.tsx +++ b/apps/web/src/components/public-footer.tsx @@ -59,10 +59,15 @@ export function PublicFooter() { href="https://kovina.org" target="_blank" rel="noopener noreferrer" - className="text-xs font-black tracking-[-0.03em] text-muted-foreground/40 hover:text-muted-foreground transition-colors no-underline" aria-label="KOVINA — Personal software. Forged to last." > - KOVINA + {/* eslint-disable-next-line @next/next/no-img-element */} + diff --git a/apps/web/src/lib/context/app-context.tsx b/apps/web/src/lib/context/app-context.tsx index 7df18ec..f9d05c8 100644 --- a/apps/web/src/lib/context/app-context.tsx +++ b/apps/web/src/lib/context/app-context.tsx @@ -222,22 +222,6 @@ export function AppProvider({ children }: { children: React.ReactNode }) { const params = new URLSearchParams(window.location.search); handleDeepLink(params.get("taskId"), params.get("plantId")); } - - // Capacitor appUrlOpen (app already running or cold start via URL scheme) - async function setupCapacitorListener() { - try { - const { App } = await import("@capacitor/app"); - await App.addListener("appUrlOpen", (data) => { - const url = new URL(data.url); - const taskId = url.searchParams.get("taskId"); - const plantId = url.searchParams.get("plantId"); - handleDeepLink(taskId, plantId); - }); - } catch { - // Not running in Capacitor — no-op on web - } - } - void setupCapacitorListener(); }, []); // Refresh dashboard data diff --git a/apps/web/src/lib/data/platform.ts b/apps/web/src/lib/data/platform.ts index 5d26984..449e635 100644 --- a/apps/web/src/lib/data/platform.ts +++ b/apps/web/src/lib/data/platform.ts @@ -1,58 +1,13 @@ /** - * Platform detection and API routing utilities for Capacitor/web. + * API routing utilities. * - * In Capacitor native mode, the app runs from an https://localhost WebView - * with static HTML. Next.js API routes are NOT available — absolute URLs - * to the production origin must be used instead. + * On the web, Next.js API routes are available at relative paths. */ -/** Runtime platform identifier. */ -export type RuntimePlatform = "web" | "capacitor"; - -/** Detect whether the code is running in Capacitor native. */ -export function isCapacitorNative(): boolean { - if (typeof window === "undefined") return false; - const win = window as typeof window & { - Capacitor?: { isNativePlatform?: () => boolean }; - }; - return !!win.Capacitor?.isNativePlatform?.(); -} - -/** Get the current runtime platform. */ -export function getPlatform(): RuntimePlatform { - return isCapacitorNative() ? "capacitor" : "web"; -} - -/** - * Resolve the correct origin for API calls. - * - * - Web (Next.js SSR): returns empty string so relative URLs like - * "/api/identify" resolve against the same origin. - * - Capacitor native: returns the production origin, because the - * app runs from https://localhost and API routes are not bundled - * in the static export. - */ -export function getApiOrigin(): string { - if (isCapacitorNative()) { - return "https://sprout.kovina.org"; - } - return ""; -} - -/** - * Resolve a relative API path to an absolute URL. - * - * Example: - * resolveApiUrl("/api/identify") - * → "/api/identify" on web - * → "https://sprout.kovina.org/api/identify" on Capacitor - */ +/** Resolve a relative API path to an absolute URL. */ export function resolveApiUrl(path: string): string { - const origin = getApiOrigin(); - return `${origin}${path}`; + return path; } -/** - * Production origin used for OAuth redirects and absolute URL construction. - */ +/** Production origin used for OAuth redirects and link construction. */ export const PRODUCTION_ORIGIN = "https://sprout.kovina.org"; diff --git a/apps/web/src/lib/data/reminders.ts b/apps/web/src/lib/data/reminders.ts index 1a0288e..7cc9987 100644 --- a/apps/web/src/lib/data/reminders.ts +++ b/apps/web/src/lib/data/reminders.ts @@ -48,20 +48,11 @@ export function saveReminderPrefs(prefs: ReminderPreferences): void { // ────────────────────────────────────────────── const NOTIF_PREFIX = "opensprout-task"; -const CHANNEL_ID = "opensprout-care-reminders"; export function taskNotifId(taskId: string): string { return `${NOTIF_PREFIX}-${taskId}`; } -function isCapacitorNative(): boolean { - try { - return typeof window !== "undefined" && "Capacitor" in window; - } catch { - return false; - } -} - // ────────────────────────────────────────────── // Web Notification API helpers (PWA + desktop) // Requires user interaction to grant permission. @@ -194,8 +185,7 @@ export function showDueSoonNotification( // ────────────────────────────────────────────── // Schedule a single task reminder -// Uses Capacitor Local Notifications on Android, -// Web Notification API on PWA/desktop +// Uses Web Notification API (PWA/desktop) // ────────────────────────────────────────────── export type TaskReminderInput = { @@ -241,12 +231,8 @@ export async function scheduleTaskReminder( minute: "2-digit", })}`; - if (isCapacitorNative()) { - await scheduleCapacitor(input.taskId, title, body, fireAt, input.plantId); - } else { - // Web: schedule via setTimeout (only lasts for the session) - scheduleWebNotification(input.taskId, title, body, fireAt - Date.now(), input); - } + // Schedule via setTimeout (session-scoped) + scheduleWebNotification(input.taskId, title, body, fireAt - Date.now(), input); } function applyQuietHours(fireAt: number, quietStart: string, quietEnd: string): number | null { @@ -288,40 +274,6 @@ function applyQuietHours(fireAt: number, quietStart: string, quietEnd: string): return fireAt; } -async function scheduleCapacitor( - taskId: string, - title: string, - body: string, - fireAt: number, - plantId: string, -) { - try { - const { LocalNotifications } = await import("@capacitor/local-notifications"); - - await LocalNotifications.cancel({ - notifications: [{ id: notifIdFromTask(taskId) }], - }); - - await LocalNotifications.schedule({ - notifications: [ - { - title, - body, - id: notifIdFromTask(taskId), - schedule: { at: new Date(fireAt), allowWhileIdle: true }, - extra: { taskId, plantId, screen: "plants" }, - channelId: CHANNEL_ID, - smallIcon: "ic_stat_sprout", - iconColor: "#16784f", - actionTypeId: "", - }, - ], - }); - } catch (err) { - console.warn("LocalNotifications not available:", err); - } -} - /** Web notification timers — keyed by taskId so we can cancel. */ const webTimers = new Map>(); @@ -364,17 +316,6 @@ export async function cancelTaskReminder(taskId: string): Promise { webTimers.delete(taskId); } dueSoonTags.delete(taskId); - - // Cancel capacitor notification - if (!isCapacitorNative()) return; - try { - const { LocalNotifications } = await import("@capacitor/local-notifications"); - await LocalNotifications.cancel({ - notifications: [{ id: notifIdFromTask(taskId) }], - }); - } catch { - // Silently fail - } } // ────────────────────────────────────────────── @@ -417,33 +358,10 @@ export async function rescheduleAllReminders( } // ────────────────────────────────────────────── -// Request notification permissions (unified) -// Works for both Capacitor native and Web +// Request notification permissions (web / PWA) // ────────────────────────────────────────────── export async function requestNotificationPermission(): Promise { - if (isCapacitorNative()) { - try { - const { LocalNotifications } = await import("@capacitor/local-notifications"); - const perm = await LocalNotifications.requestPermissions(); - return perm.display === "granted"; - } catch { - return false; - } - } return requestWebNotificationPermission(); } -// ────────────────────────────────────────────── -// Create a numeric notification ID from a UUID -// ────────────────────────────────────────────── - -function notifIdFromTask(taskId: string): number { - let hash = 0; - for (let i = 0; i < taskId.length; i++) { - const char = taskId.charCodeAt(i); - hash = (hash << 5) - hash + char; - hash |= 0; - } - return Math.abs(hash); -} diff --git a/apps/web/src/lib/haptics.ts b/apps/web/src/lib/haptics.ts index 05e3ea1..e21df1e 100644 --- a/apps/web/src/lib/haptics.ts +++ b/apps/web/src/lib/haptics.ts @@ -2,58 +2,29 @@ /** * Lightweight haptic feedback. - * On native (Capacitor), uses Haptics plugin. - * On web, falls back to navigator.vibrate. + * Falls back to navigator.vibrate on devices that support it. */ -let capacitorHaptics: typeof import("@capacitor/haptics") | null = null; - -async function ensureCapacitor() { - if (typeof window === "undefined") return false; - try { - capacitorHaptics = await import("@capacitor/haptics"); - return true; - } catch { - return false; - } +function canVibrate(): boolean { + return typeof navigator !== "undefined" && "vibrate" in navigator; } export async function hapticLight() { - if (await ensureCapacitor()) { - await capacitorHaptics!.Haptics.impact({ style: "light" }); - } else if (navigator.vibrate) { - navigator.vibrate(10); - } + if (canVibrate()) navigator.vibrate(10); } export async function hapticMedium() { - if (await ensureCapacitor()) { - await capacitorHaptics!.Haptics.impact({ style: "medium" }); - } else if (navigator.vibrate) { - navigator.vibrate(20); - } + if (canVibrate()) navigator.vibrate(20); } export async function hapticHeavy() { - if (await ensureCapacitor()) { - await capacitorHaptics!.Haptics.impact({ style: "heavy" }); - } else if (navigator.vibrate) { - navigator.vibrate(40); - } + if (canVibrate()) navigator.vibrate(40); } export async function hapticSuccess() { - if (await ensureCapacitor()) { - await capacitorHaptics!.Haptics.notification({ type: "success" }); - } else if (navigator.vibrate) { - navigator.vibrate([10, 50, 10]); - } + if (canVibrate()) navigator.vibrate([10, 50, 10]); } export async function hapticError() { - if (await ensureCapacitor()) { - await capacitorHaptics!.Haptics.notification({ type: "error" }); - } else if (navigator.vibrate) { - navigator.vibrate([20, 30, 20, 30, 20]); - } + if (canVibrate()) navigator.vibrate([20, 30, 20, 30, 20]); } diff --git a/apps/web/src/types/capacitor-haptics.d.ts b/apps/web/src/types/capacitor-haptics.d.ts deleted file mode 100644 index 40786fe..0000000 --- a/apps/web/src/types/capacitor-haptics.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -declare module "@capacitor/haptics" { - export const Haptics: { - impact: (options: { style: "light" | "medium" | "heavy" }) => Promise; - notification: (options: { type: "success" | "error" | "warning" }) => Promise; - }; -} diff --git a/apps/web/android/.gitignore b/archive/android/android/.gitignore similarity index 100% rename from apps/web/android/.gitignore rename to archive/android/android/.gitignore diff --git a/apps/web/android/app/.gitignore b/archive/android/android/app/.gitignore similarity index 100% rename from apps/web/android/app/.gitignore rename to archive/android/android/app/.gitignore diff --git a/apps/web/android/app/build.gradle b/archive/android/android/app/build.gradle similarity index 100% rename from apps/web/android/app/build.gradle rename to archive/android/android/app/build.gradle diff --git a/apps/web/android/app/capacitor.build.gradle b/archive/android/android/app/capacitor.build.gradle similarity index 100% rename from apps/web/android/app/capacitor.build.gradle rename to archive/android/android/app/capacitor.build.gradle diff --git a/apps/web/android/app/proguard-rules.pro b/archive/android/android/app/proguard-rules.pro similarity index 100% rename from apps/web/android/app/proguard-rules.pro rename to archive/android/android/app/proguard-rules.pro diff --git a/apps/web/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java b/archive/android/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java similarity index 100% rename from apps/web/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java rename to archive/android/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java diff --git a/apps/web/android/app/src/main/AndroidManifest.xml b/archive/android/android/app/src/main/AndroidManifest.xml similarity index 100% rename from apps/web/android/app/src/main/AndroidManifest.xml rename to archive/android/android/app/src/main/AndroidManifest.xml diff --git a/apps/web/android/app/src/main/java/com/sparshsam/opensprout/MainActivity.java b/archive/android/android/app/src/main/java/com/sparshsam/opensprout/MainActivity.java similarity index 100% rename from apps/web/android/app/src/main/java/com/sparshsam/opensprout/MainActivity.java rename to archive/android/android/app/src/main/java/com/sparshsam/opensprout/MainActivity.java diff --git a/apps/web/android/app/src/main/res/drawable-land-hdpi/splash.png b/archive/android/android/app/src/main/res/drawable-land-hdpi/splash.png similarity index 100% rename from apps/web/android/app/src/main/res/drawable-land-hdpi/splash.png rename to archive/android/android/app/src/main/res/drawable-land-hdpi/splash.png diff --git a/apps/web/android/app/src/main/res/drawable-land-mdpi/splash.png b/archive/android/android/app/src/main/res/drawable-land-mdpi/splash.png similarity index 100% rename from apps/web/android/app/src/main/res/drawable-land-mdpi/splash.png rename to archive/android/android/app/src/main/res/drawable-land-mdpi/splash.png diff --git a/apps/web/android/app/src/main/res/drawable-land-xhdpi/splash.png b/archive/android/android/app/src/main/res/drawable-land-xhdpi/splash.png similarity index 100% rename from apps/web/android/app/src/main/res/drawable-land-xhdpi/splash.png rename to archive/android/android/app/src/main/res/drawable-land-xhdpi/splash.png diff --git a/apps/web/android/app/src/main/res/drawable-land-xxhdpi/splash.png b/archive/android/android/app/src/main/res/drawable-land-xxhdpi/splash.png similarity index 100% rename from apps/web/android/app/src/main/res/drawable-land-xxhdpi/splash.png rename to archive/android/android/app/src/main/res/drawable-land-xxhdpi/splash.png diff --git a/apps/web/android/app/src/main/res/drawable-land-xxxhdpi/splash.png b/archive/android/android/app/src/main/res/drawable-land-xxxhdpi/splash.png similarity index 100% rename from apps/web/android/app/src/main/res/drawable-land-xxxhdpi/splash.png rename to archive/android/android/app/src/main/res/drawable-land-xxxhdpi/splash.png diff --git a/apps/web/android/app/src/main/res/drawable-port-hdpi/splash.png b/archive/android/android/app/src/main/res/drawable-port-hdpi/splash.png similarity index 100% rename from apps/web/android/app/src/main/res/drawable-port-hdpi/splash.png rename to archive/android/android/app/src/main/res/drawable-port-hdpi/splash.png diff --git a/apps/web/android/app/src/main/res/drawable-port-mdpi/splash.png b/archive/android/android/app/src/main/res/drawable-port-mdpi/splash.png similarity index 100% rename from apps/web/android/app/src/main/res/drawable-port-mdpi/splash.png rename to archive/android/android/app/src/main/res/drawable-port-mdpi/splash.png diff --git a/apps/web/android/app/src/main/res/drawable-port-xhdpi/splash.png b/archive/android/android/app/src/main/res/drawable-port-xhdpi/splash.png similarity index 100% rename from apps/web/android/app/src/main/res/drawable-port-xhdpi/splash.png rename to archive/android/android/app/src/main/res/drawable-port-xhdpi/splash.png diff --git a/apps/web/android/app/src/main/res/drawable-port-xxhdpi/splash.png b/archive/android/android/app/src/main/res/drawable-port-xxhdpi/splash.png similarity index 100% rename from apps/web/android/app/src/main/res/drawable-port-xxhdpi/splash.png rename to archive/android/android/app/src/main/res/drawable-port-xxhdpi/splash.png diff --git a/apps/web/android/app/src/main/res/drawable-port-xxxhdpi/splash.png b/archive/android/android/app/src/main/res/drawable-port-xxxhdpi/splash.png similarity index 100% rename from apps/web/android/app/src/main/res/drawable-port-xxxhdpi/splash.png rename to archive/android/android/app/src/main/res/drawable-port-xxxhdpi/splash.png diff --git a/apps/web/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/archive/android/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml similarity index 100% rename from apps/web/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml rename to archive/android/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml diff --git a/apps/web/android/app/src/main/res/drawable/ic_launcher_background.xml b/archive/android/android/app/src/main/res/drawable/ic_launcher_background.xml similarity index 100% rename from apps/web/android/app/src/main/res/drawable/ic_launcher_background.xml rename to archive/android/android/app/src/main/res/drawable/ic_launcher_background.xml diff --git a/apps/web/android/app/src/main/res/drawable/ic_stat_sprout.xml b/archive/android/android/app/src/main/res/drawable/ic_stat_sprout.xml similarity index 100% rename from apps/web/android/app/src/main/res/drawable/ic_stat_sprout.xml rename to archive/android/android/app/src/main/res/drawable/ic_stat_sprout.xml diff --git a/apps/web/android/app/src/main/res/drawable/splash.png b/archive/android/android/app/src/main/res/drawable/splash.png similarity index 100% rename from apps/web/android/app/src/main/res/drawable/splash.png rename to archive/android/android/app/src/main/res/drawable/splash.png diff --git a/apps/web/android/app/src/main/res/layout/activity_main.xml b/archive/android/android/app/src/main/res/layout/activity_main.xml similarity index 100% rename from apps/web/android/app/src/main/res/layout/activity_main.xml rename to archive/android/android/app/src/main/res/layout/activity_main.xml diff --git a/apps/web/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/archive/android/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml similarity index 100% rename from apps/web/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml rename to archive/android/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml diff --git a/apps/web/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/archive/android/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml similarity index 100% rename from apps/web/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml rename to archive/android/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml diff --git a/apps/web/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/archive/android/android/app/src/main/res/mipmap-hdpi/ic_launcher.png similarity index 100% rename from apps/web/android/app/src/main/res/mipmap-hdpi/ic_launcher.png rename to archive/android/android/app/src/main/res/mipmap-hdpi/ic_launcher.png diff --git a/apps/web/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/archive/android/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png similarity index 100% rename from apps/web/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png rename to archive/android/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png diff --git a/apps/web/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/archive/android/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png similarity index 100% rename from apps/web/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png rename to archive/android/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png diff --git a/apps/web/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/archive/android/android/app/src/main/res/mipmap-mdpi/ic_launcher.png similarity index 100% rename from apps/web/android/app/src/main/res/mipmap-mdpi/ic_launcher.png rename to archive/android/android/app/src/main/res/mipmap-mdpi/ic_launcher.png diff --git a/apps/web/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/archive/android/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png similarity index 100% rename from apps/web/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png rename to archive/android/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png diff --git a/apps/web/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/archive/android/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png similarity index 100% rename from apps/web/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png rename to archive/android/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png diff --git a/apps/web/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/archive/android/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png similarity index 100% rename from apps/web/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png rename to archive/android/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png diff --git a/apps/web/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/archive/android/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png similarity index 100% rename from apps/web/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png rename to archive/android/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png diff --git a/apps/web/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/archive/android/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png similarity index 100% rename from apps/web/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png rename to archive/android/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png diff --git a/apps/web/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/archive/android/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png similarity index 100% rename from apps/web/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png rename to archive/android/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png diff --git a/apps/web/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/archive/android/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png similarity index 100% rename from apps/web/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png rename to archive/android/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png diff --git a/apps/web/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/archive/android/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png similarity index 100% rename from apps/web/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png rename to archive/android/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png diff --git a/apps/web/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/archive/android/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png similarity index 100% rename from apps/web/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png rename to archive/android/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png diff --git a/apps/web/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/archive/android/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png similarity index 100% rename from apps/web/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png rename to archive/android/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png diff --git a/apps/web/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/archive/android/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png similarity index 100% rename from apps/web/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png rename to archive/android/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png diff --git a/apps/web/android/app/src/main/res/values/colors.xml b/archive/android/android/app/src/main/res/values/colors.xml similarity index 100% rename from apps/web/android/app/src/main/res/values/colors.xml rename to archive/android/android/app/src/main/res/values/colors.xml diff --git a/apps/web/android/app/src/main/res/values/ic_launcher_background.xml b/archive/android/android/app/src/main/res/values/ic_launcher_background.xml similarity index 100% rename from apps/web/android/app/src/main/res/values/ic_launcher_background.xml rename to archive/android/android/app/src/main/res/values/ic_launcher_background.xml diff --git a/apps/web/android/app/src/main/res/values/strings.xml b/archive/android/android/app/src/main/res/values/strings.xml similarity index 100% rename from apps/web/android/app/src/main/res/values/strings.xml rename to archive/android/android/app/src/main/res/values/strings.xml diff --git a/apps/web/android/app/src/main/res/values/styles.xml b/archive/android/android/app/src/main/res/values/styles.xml similarity index 100% rename from apps/web/android/app/src/main/res/values/styles.xml rename to archive/android/android/app/src/main/res/values/styles.xml diff --git a/apps/web/android/app/src/main/res/xml/file_paths.xml b/archive/android/android/app/src/main/res/xml/file_paths.xml similarity index 100% rename from apps/web/android/app/src/main/res/xml/file_paths.xml rename to archive/android/android/app/src/main/res/xml/file_paths.xml diff --git a/apps/web/android/app/src/test/java/com/getcapacitor/myapp/ExampleUnitTest.java b/archive/android/android/app/src/test/java/com/getcapacitor/myapp/ExampleUnitTest.java similarity index 100% rename from apps/web/android/app/src/test/java/com/getcapacitor/myapp/ExampleUnitTest.java rename to archive/android/android/app/src/test/java/com/getcapacitor/myapp/ExampleUnitTest.java diff --git a/apps/web/android/build.gradle b/archive/android/android/build.gradle similarity index 100% rename from apps/web/android/build.gradle rename to archive/android/android/build.gradle diff --git a/apps/web/android/capacitor.settings.gradle b/archive/android/android/capacitor.settings.gradle similarity index 100% rename from apps/web/android/capacitor.settings.gradle rename to archive/android/android/capacitor.settings.gradle diff --git a/apps/web/android/gradle.properties b/archive/android/android/gradle.properties similarity index 100% rename from apps/web/android/gradle.properties rename to archive/android/android/gradle.properties diff --git a/apps/web/android/gradle/wrapper/gradle-wrapper.jar b/archive/android/android/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from apps/web/android/gradle/wrapper/gradle-wrapper.jar rename to archive/android/android/gradle/wrapper/gradle-wrapper.jar diff --git a/apps/web/android/gradle/wrapper/gradle-wrapper.properties b/archive/android/android/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from apps/web/android/gradle/wrapper/gradle-wrapper.properties rename to archive/android/android/gradle/wrapper/gradle-wrapper.properties diff --git a/apps/web/android/gradlew b/archive/android/android/gradlew similarity index 100% rename from apps/web/android/gradlew rename to archive/android/android/gradlew diff --git a/apps/web/android/gradlew.bat b/archive/android/android/gradlew.bat similarity index 100% rename from apps/web/android/gradlew.bat rename to archive/android/android/gradlew.bat diff --git a/apps/web/android/settings.gradle b/archive/android/android/settings.gradle similarity index 100% rename from apps/web/android/settings.gradle rename to archive/android/android/settings.gradle diff --git a/apps/web/android/variables.gradle b/archive/android/android/variables.gradle similarity index 100% rename from apps/web/android/variables.gradle rename to archive/android/android/variables.gradle diff --git a/apps/web/capacitor.config.ts b/archive/capacitor.config.ts similarity index 100% rename from apps/web/capacitor.config.ts rename to archive/capacitor.config.ts diff --git a/package-lock.json b/package-lock.json index bbeb247..dc7792e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,9 +12,6 @@ "apps/*", "packages/*" ], - "dependencies": { - "@capacitor/browser": "^8.0.3" - }, "engines": { "node": ">=20.11.0" } @@ -52,13 +49,6 @@ "version": "0.9.26", "license": "AGPL-3.0-or-later", "dependencies": { - "@capacitor/android": "^8.4.0", - "@capacitor/app": "^8.1.0", - "@capacitor/browser": "^8.0.3", - "@capacitor/camera": "^8.2.0", - "@capacitor/cli": "^8.4.0", - "@capacitor/core": "^8.4.0", - "@capacitor/local-notifications": "^8.2.0", "@supabase/ssr": "^0.10.3", "@supabase/supabase-js": "^2.107.0", "class-variance-authority": "^0.7.1", @@ -97,92 +87,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@capacitor/android": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/@capacitor/android/-/android-8.4.0.tgz", - "integrity": "sha512-K1ZPkQzvRzPEALz9nBdLx5p5nAPzp5fsTYWk7LRiKZeH/NXqjDvqfTv7lrLgrziQNoDeaL6ijg64oBREzXiV+g==", - "license": "MIT", - "peerDependencies": { - "@capacitor/core": "^8.4.0" - } - }, - "node_modules/@capacitor/app": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@capacitor/app/-/app-8.1.0.tgz", - "integrity": "sha512-MlmttTOWHDedr/G4SrhNRxsXMqY+R75S4MM4eIgzsgCzOYhb/MpCkA5Q3nuOCfL1oHm26xjUzqZ5aupbOwdfYg==", - "license": "MIT", - "peerDependencies": { - "@capacitor/core": ">=8.0.0" - } - }, - "node_modules/@capacitor/browser": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/@capacitor/browser/-/browser-8.0.3.tgz", - "integrity": "sha512-WJWPHEPbweiFoHYmVlCbZf5yrqJ2Rchx2Xvbmd+3Lf+Zkpq3nXBThThY2CF69lYEg1NINGF9BcHThIOEU1gZlQ==", - "license": "MIT", - "peerDependencies": { - "@capacitor/core": ">=8.0.0" - } - }, - "node_modules/@capacitor/camera": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/@capacitor/camera/-/camera-8.2.0.tgz", - "integrity": "sha512-hYfrT6xpL936qoEkIpJzSnb0fQCaTkOux1cXzGBfH8QLOGqr6gSLiWZlZz/fqMPmMKJMNRBqlTQkj5fuMhVZog==", - "license": "MIT", - "peerDependencies": { - "@capacitor/core": ">=8.0.0" - } - }, - "node_modules/@capacitor/cli": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/@capacitor/cli/-/cli-8.4.0.tgz", - "integrity": "sha512-5Z9RKHxiqJYRTLrfMeZmzR4qrlg5B85MxsWZ5goyXsLkO3bgpW9a1qV/6fR1SX9s5gwLza5y7PZVwITl/hDJ7g==", - "license": "MIT", - "dependencies": { - "@ionic/cli-framework-output": "^2.2.8", - "@ionic/utils-subprocess": "^3.0.1", - "@ionic/utils-terminal": "^2.3.5", - "commander": "^12.1.0", - "debug": "^4.4.0", - "env-paths": "^2.2.0", - "fs-extra": "^11.2.0", - "kleur": "^4.1.5", - "native-run": "^2.0.3", - "open": "^8.4.0", - "plist": "^3.1.0", - "prompts": "^2.4.2", - "rimraf": "^6.0.1", - "semver": "^7.6.3", - "tar": "^7.5.3", - "tslib": "^2.8.1", - "xml2js": "^0.6.2" - }, - "bin": { - "cap": "bin/capacitor", - "capacitor": "bin/capacitor" - }, - "engines": { - "node": ">=22.0.0" - } - }, - "node_modules/@capacitor/core": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/@capacitor/core/-/core-8.4.0.tgz", - "integrity": "sha512-LrS1xPIrqLtJABBIPDGXxxKmI9OyesrzWw8DiHbxhSC9JoiLUleUAJlX1a0LWIVLRbuY4Szgf9huFeRqYH2SAQ==", - "license": "MIT", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/@capacitor/local-notifications": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/@capacitor/local-notifications/-/local-notifications-8.2.0.tgz", - "integrity": "sha512-fvLY0w2w4MiX+DD4+Wv4DOwOLdzKZsMDwAcRv/Juudd+QbKbn69s6cM3xVqPwAiDqfnqsY4/S8xtQD6M73wY2A==", - "license": "MIT", - "peerDependencies": { - "@capacitor/core": ">=8.0.0" - } - }, "node_modules/@emnapi/core": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", @@ -1334,157 +1238,6 @@ "url": "https://opencollective.com/libvips" } }, - "node_modules/@ionic/cli-framework-output": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/@ionic/cli-framework-output/-/cli-framework-output-2.2.8.tgz", - "integrity": "sha512-TshtaFQsovB4NWRBydbNFawql6yul7d5bMiW1WYYf17hd99V6xdDdk3vtF51bw6sLkxON3bDQpWsnUc9/hVo3g==", - "license": "MIT", - "dependencies": { - "@ionic/utils-terminal": "2.3.5", - "debug": "^4.0.0", - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@ionic/utils-array": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@ionic/utils-array/-/utils-array-2.1.6.tgz", - "integrity": "sha512-0JZ1Zkp3wURnv8oq6Qt7fMPo5MpjbLoUoa9Bu2Q4PJuSDWM8H8gwF3dQO7VTeUj3/0o1IB1wGkFWZZYgUXZMUg==", - "license": "MIT", - "dependencies": { - "debug": "^4.0.0", - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@ionic/utils-fs": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/@ionic/utils-fs/-/utils-fs-3.1.7.tgz", - "integrity": "sha512-2EknRvMVfhnyhL1VhFkSLa5gOcycK91VnjfrTB0kbqkTFCOXyXgVLI5whzq7SLrgD9t1aqos3lMMQyVzaQ5gVA==", - "license": "MIT", - "dependencies": { - "@types/fs-extra": "^8.0.0", - "debug": "^4.0.0", - "fs-extra": "^9.0.0", - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@ionic/utils-fs/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "license": "MIT", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@ionic/utils-object": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@ionic/utils-object/-/utils-object-2.1.6.tgz", - "integrity": "sha512-vCl7sl6JjBHFw99CuAqHljYJpcE88YaH2ZW4ELiC/Zwxl5tiwn4kbdP/gxi2OT3MQb1vOtgAmSNRtusvgxI8ww==", - "license": "MIT", - "dependencies": { - "debug": "^4.0.0", - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@ionic/utils-process": { - "version": "2.1.12", - "resolved": "https://registry.npmjs.org/@ionic/utils-process/-/utils-process-2.1.12.tgz", - "integrity": "sha512-Jqkgyq7zBs/v/J3YvKtQQiIcxfJyplPgECMWgdO0E1fKrrH8EF0QGHNJ9mJCn6PYe2UtHNS8JJf5G21e09DfYg==", - "license": "MIT", - "dependencies": { - "@ionic/utils-object": "2.1.6", - "@ionic/utils-terminal": "2.3.5", - "debug": "^4.0.0", - "signal-exit": "^3.0.3", - "tree-kill": "^1.2.2", - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@ionic/utils-stream": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/@ionic/utils-stream/-/utils-stream-3.1.7.tgz", - "integrity": "sha512-eSELBE7NWNFIHTbTC2jiMvh1ABKGIpGdUIvARsNPMNQhxJB3wpwdiVnoBoTYp+5a6UUIww4Kpg7v6S7iTctH1w==", - "license": "MIT", - "dependencies": { - "debug": "^4.0.0", - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@ionic/utils-subprocess": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@ionic/utils-subprocess/-/utils-subprocess-3.0.1.tgz", - "integrity": "sha512-cT4te3AQQPeIM9WCwIg8ohroJ8TjsYaMb2G4ZEgv9YzeDqHZ4JpeIKqG2SoaA3GmVQ3sOfhPM6Ox9sxphV/d1A==", - "license": "MIT", - "dependencies": { - "@ionic/utils-array": "2.1.6", - "@ionic/utils-fs": "3.1.7", - "@ionic/utils-process": "2.1.12", - "@ionic/utils-stream": "3.1.7", - "@ionic/utils-terminal": "2.3.5", - "cross-spawn": "^7.0.3", - "debug": "^4.0.0", - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@ionic/utils-terminal": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@ionic/utils-terminal/-/utils-terminal-2.3.5.tgz", - "integrity": "sha512-3cKScz9Jx2/Pr9ijj1OzGlBDfcmx7OMVBt4+P1uRR0SSW4cm1/y3Mo4OY3lfkuaYifMNBW8Wz6lQHbs1bihr7A==", - "license": "MIT", - "dependencies": { - "@types/slice-ansi": "^4.0.0", - "debug": "^4.0.0", - "signal-exit": "^3.0.3", - "slice-ansi": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "tslib": "^2.0.1", - "untildify": "^4.0.0", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@isaacs/fs-minipass": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", - "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", - "license": "ISC", - "dependencies": { - "minipass": "^7.0.4" - }, - "engines": { - "node": ">=18.0.0" - } - }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.13", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", @@ -2610,15 +2363,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/fs-extra": { - "version": "8.1.5", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.5.tgz", - "integrity": "sha512-0dzKcwO+S8s2kuF5Z9oUWatQJj5Uq/iqphEtE3GQJVRRYm/tD1LglU2UnXi2A8jLq5umkGouOXOR9y0n613ZwQ==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", @@ -2637,6 +2381,7 @@ "version": "22.19.19", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.19.tgz", "integrity": "sha512-dyh/xO2Fh5bYrfWaaqGrRQQGkNdmYw6AmaAUvYeUMNTWQtvb796ikLdmTchRmOlOiIJ1TDXfWgVx1QkUlQ6Hew==", + "dev": true, "license": "MIT", "dependencies": { "undici-types": "~6.21.0" @@ -2662,12 +2407,6 @@ "@types/react": "^19.2.0" } }, - "node_modules/@types/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-+OpjSaq85gvlZAYINyzKpLeiFkSC4EsC6IIiT6v6TLSU5k5U83fHGj9Lel8oKEXM0HqgrMVCjXPDPVICtxF7EQ==", - "license": "MIT" - }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "8.59.4", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.4.tgz", @@ -3378,15 +3117,6 @@ "url": "https://opencollective.com/vitest" } }, - "node_modules/@xmldom/xmldom": { - "version": "0.9.10", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.9.10.tgz", - "integrity": "sha512-A9gOqLdi6cV4ibazAjcQufGj0B1y/vDqYrcuP6d/6x8P27gRS8643Dj9o1dEKtB6O7fwxb2FgBmJS2mX7gpvdw==", - "license": "MIT", - "engines": { - "node": ">=14.6" - } - }, "node_modules/accepts": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", @@ -3439,19 +3169,11 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -3657,15 +3379,6 @@ "dev": true, "license": "MIT" }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/async-function": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", @@ -3676,15 +3389,6 @@ "node": ">= 0.4" } }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "license": "ISC", - "engines": { - "node": ">= 4.0.0" - } - }, "node_modules/available-typed-arrays": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", @@ -3728,35 +3432,6 @@ "dev": true, "license": "MIT" }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/big-integer": { - "version": "1.6.52", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", - "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", - "license": "Unlicense", - "engines": { - "node": ">=0.6" - } - }, "node_modules/body-parser": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.3.0.tgz", @@ -3794,18 +3469,6 @@ "url": "https://opencollective.com/express" } }, - "node_modules/bplist-parser": { - "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" - }, - "engines": { - "node": ">= 5.10.0" - } - }, "node_modules/brace-expansion": { "version": "1.1.14", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", @@ -3830,15 +3493,6 @@ "node": ">=8" } }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "license": "MIT", - "engines": { - "node": "*" - } - }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -3980,15 +3634,6 @@ "node": ">= 16" } }, - "node_modules/chownr": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", - "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, "node_modules/class-variance-authority": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", @@ -4020,6 +3665,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -4032,17 +3678,9 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, "license": "MIT" }, - "node_modules/commander": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -4245,15 +3883,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/define-properties": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", @@ -4324,18 +3953,6 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "license": "MIT" }, - "node_modules/elementtree": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/elementtree/-/elementtree-0.1.7.tgz", - "integrity": "sha512-wkgGT6kugeQk/P6VZ/f4T+4HB41BVgNBq5CDIZVbQ02nvTVqAiVTbskxxu3eA/X96lMlfYOwnLQpN2v5E1zDEg==", - "license": "Apache-2.0", - "dependencies": { - "sax": "1.1.4" - }, - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", @@ -4366,15 +3983,6 @@ "node": ">=10.13.0" } }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/es-abstract": { "version": "1.24.2", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.2.tgz", @@ -5200,15 +4808,6 @@ "reusify": "^1.0.4" } }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "license": "MIT", - "dependencies": { - "pend": "~1.2.0" - } - }, "node_modules/file-entry-cache": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", @@ -5328,20 +4927,6 @@ "node": ">= 0.8" } }, - "node_modules/fs-extra": { - "version": "11.3.5", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.5.tgz", - "integrity": "sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -5475,23 +5060,6 @@ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, - "node_modules/glob": { - "version": "13.0.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", - "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", - "license": "BlueOak-1.0.0", - "dependencies": { - "minimatch": "^10.2.2", - "minipass": "^7.1.3", - "path-scurry": "^2.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", @@ -5505,70 +5073,34 @@ "node": ">=10.13.0" } }, - "node_modules/glob/node_modules/balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, "license": "MIT", "engines": { - "node": "18 || 20 || >=22" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", - "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^4.0.2" + "define-properties": "^1.2.1", + "gopd": "^1.0.1" }, "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/glob/node_modules/minimatch": { - "version": "10.2.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", - "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", - "license": "BlueOak-1.0.0", - "dependencies": { - "brace-expansion": "^5.0.5" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globalthis": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/gopd": { @@ -5587,6 +5119,7 @@ "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, "license": "ISC" }, "node_modules/has-bigints": { @@ -5775,15 +5308,6 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "license": "ISC" }, - "node_modules/ini": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz", - "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==", - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, "node_modules/internal-slot": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", @@ -5953,21 +5477,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -5994,15 +5503,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/is-generator-function": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", @@ -6240,18 +5740,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "license": "MIT", - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/isarray": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", @@ -6346,18 +5834,6 @@ "json5": "lib/cli.js" } }, - "node_modules/jsonfile": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", - "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, "node_modules/jsx-ast-utils": { "version": "3.3.5", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", @@ -6384,15 +5860,6 @@ "json-buffer": "3.0.1" } }, - "node_modules/kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/language-subtag-registry": { "version": "0.3.23", "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", @@ -6743,15 +6210,6 @@ "dev": true, "license": "MIT" }, - "node_modules/lru-cache": { - "version": "11.5.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.1.tgz", - "integrity": "sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==", - "license": "BlueOak-1.0.0", - "engines": { - "node": "20 || >=22" - } - }, "node_modules/lucide-react": { "version": "1.17.0", "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-1.17.0.tgz", @@ -6873,27 +6331,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/minipass": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", - "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/minizlib": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", - "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", - "license": "MIT", - "dependencies": { - "minipass": "^7.1.2" - }, - "engines": { - "node": ">= 18" - } - }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -6934,31 +6371,6 @@ "url": "https://opencollective.com/napi-postinstall" } }, - "node_modules/native-run": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/native-run/-/native-run-2.0.3.tgz", - "integrity": "sha512-U1PllBuzW5d1gfan+88L+Hky2eZx+9gv3Pf6rNBxKbORxi7boHzqiA6QFGSnqMem4j0A9tZ08NMIs5+0m/VS1Q==", - "license": "MIT", - "dependencies": { - "@ionic/utils-fs": "^3.1.7", - "@ionic/utils-terminal": "^2.3.4", - "bplist-parser": "^0.3.2", - "debug": "^4.3.4", - "elementtree": "^0.1.7", - "ini": "^4.1.1", - "plist": "^3.1.0", - "split2": "^4.2.0", - "through2": "^4.0.2", - "tslib": "^2.6.2", - "yauzl": "^2.10.0" - }, - "bin": { - "native-run": "bin/native-run" - }, - "engines": { - "node": ">=16.0.0" - } - }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -7226,23 +6638,6 @@ "wrappy": "1" } }, - "node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", - "license": "MIT", - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -7311,12 +6706,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "license": "BlueOak-1.0.0" - }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -7365,22 +6754,6 @@ "dev": true, "license": "MIT" }, - "node_modules/path-scurry": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", - "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^11.0.0", - "minipass": "^7.1.2" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/path-to-regexp": { "version": "8.4.2", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.4.2.tgz", @@ -7408,12 +6781,6 @@ "node": ">= 14.16" } }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "license": "MIT" - }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -7442,20 +6809,6 @@ "node": ">=16.20.0" } }, - "node_modules/plist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.1.tgz", - "integrity": "sha512-ZIfcLJC+7E7FBFnDxm9MPmt7D+DidyQ26lewieO75AdhA2ayMtsJSES0iWzqJQbcVRSrTufQoy0DR94xHue0oA==", - "license": "MIT", - "dependencies": { - "@xmldom/xmldom": "^0.9.10", - "base64-js": "^1.5.1", - "xmlbuilder": "^15.1.1" - }, - "engines": { - "node": ">=10.4.0" - } - }, "node_modules/possible-typed-array-names": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", @@ -7505,28 +6858,6 @@ "node": ">= 0.8.0" } }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "license": "MIT", - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/prompts/node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", @@ -7649,20 +6980,6 @@ "dev": true, "license": "MIT" }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/reflect.getprototypeof": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", @@ -7762,25 +7079,6 @@ "node": ">=0.10.0" } }, - "node_modules/rimraf": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.1.3.tgz", - "integrity": "sha512-LKg+Cr2ZF61fkcaK1UdkH2yEBBKnYjTyWzTJT6KNPcSPaiT7HSdhtMXQuN5wkTX0Xu72KQ1l8S42rlmexS2hSA==", - "license": "BlueOak-1.0.0", - "dependencies": { - "glob": "^13.0.3", - "package-json-from-dist": "^1.0.1" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/rollup": { "version": "4.62.2", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.2.tgz", @@ -7886,26 +7184,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, "node_modules/safe-push-apply": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", @@ -7947,12 +7225,6 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "license": "MIT" }, - "node_modules/sax": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.1.4.tgz", - "integrity": "sha512-5f3k2PbGGp+YtKJjOItpg3P99IMD84E4HOvcfleTb5joCHNXYLsR9yWFPOYGgaeMPDubQILTCMdsFb2OMeOjtg==", - "license": "ISC" - }, "node_modules/scheduler": { "version": "0.27.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", @@ -7963,6 +7235,7 @@ "version": "7.8.1", "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz", "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==", + "devOptional": true, "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -8216,35 +7489,6 @@ "dev": true, "license": "ISC" }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC" - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "license": "MIT" - }, - "node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -8254,15 +7498,6 @@ "node": ">=0.10.0" } }, - "node_modules/split2": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", - "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", - "license": "ISC", - "engines": { - "node": ">= 10.x" - } - }, "node_modules/stable-hash": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz", @@ -8307,35 +7542,6 @@ "node": ">= 0.4" } }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, "node_modules/string.prototype.includes": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", @@ -8449,18 +7655,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -8584,31 +7778,6 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/tar": { - "version": "7.5.16", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.16.tgz", - "integrity": "sha512-56adEpPMouktRlBLXiaYFFzZ/3+JXa8P9n7WbR+ibIjtviN55mEaOkiysCnPnWm+7kkui1Dn8J9l+g6zV8731w==", - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/fs-minipass": "^4.0.0", - "chownr": "^3.0.0", - "minipass": "^7.1.2", - "minizlib": "^3.1.0", - "yallist": "^5.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", - "license": "MIT", - "dependencies": { - "readable-stream": "3" - } - }, "node_modules/tinybench": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", @@ -8723,15 +7892,6 @@ "node": ">=0.6" } }, - "node_modules/tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "license": "MIT", - "bin": { - "tree-kill": "cli.js" - } - }, "node_modules/ts-api-utils": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", @@ -8942,17 +8102,9 @@ "version": "6.21.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, "license": "MIT" }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -9000,15 +8152,6 @@ "@unrs/resolver-binding-win32-x64-msvc": "1.12.2" } }, - "node_modules/untildify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", - "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -9018,12 +8161,6 @@ "punycode": "^2.1.0" } }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" - }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -9863,79 +9000,12 @@ "node": ">=0.10.0" } }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "license": "ISC" }, - "node_modules/xml2js": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz", - "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", - "license": "MIT", - "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/xml2js/node_modules/xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "license": "MIT", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/xmlbuilder": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", - "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", - "license": "MIT", - "engines": { - "node": ">=8.0" - } - }, - "node_modules/yallist": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", - "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", - "license": "MIT", - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index acb4611..f1c20a1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "opensprout", - "version": "0.9.26", + "version": "1.0.0", "private": true, "license": "AGPL-3.0-or-later", "workspaces": [ @@ -10,20 +10,10 @@ "scripts": { "dev": "npm --workspace apps/web run dev", "build": "npm --workspace apps/web run build", - "build:mobile": "npm --workspace apps/web run build:mobile", "start": "npm --workspace apps/web run start", "lint": "npm --workspace apps/web run lint", "typecheck": "npm run -w @opensprout/mcp build && npm --workspace apps/web run typecheck", - "cap:dev:android": "npm --workspace apps/web run cap:dev:android", - "cap:open:android": "npm --workspace apps/web run cap:open:android", - "android:debug": "npm --workspace apps/web run android:debug", - "android:release:bundle": "npm --workspace apps/web run android:release:bundle", - "android:release:apk": "npm --workspace apps/web run android:release:apk", - "android:release": "npm --workspace apps/web run android:release", "version:bump": "node scripts/bump-version.mjs", - "android:sync": "npm --workspace apps/web run cap:sync", - "android:open": "npm --workspace apps/web run cap:open:android", - "rc:android": "npm run android:release:bundle && npm run android:release:apk", "rc:web": "npm run build" }, "engines": { @@ -39,8 +29,5 @@ "bugs": { "url": "https://github.com/sparshsam/opensprout/issues" }, - "keywords": [], - "dependencies": { - "@capacitor/browser": "^8.0.3" - } + "keywords": [] }