From cc834ef20af26de05f0fb7351f00f3978def5a43 Mon Sep 17 00:00:00 2001 From: kjxcodez Date: Mon, 17 Aug 2026 09:35:35 +0530 Subject: [PATCH 1/6] feat: implement full repository restructuring with new test suites, documentation, and automated environment lifecycle workflows. --- .dockerignore | 4 + .gitignore | 69 +- .npmrc | 1 + README.md | 167 +- apps/app/.dockerignore | 10 + apps/app/.gitignore | 46 + Dockerfile => apps/app/Dockerfile | 19 +- apps/app/README.md | 36 + components.json => apps/app/components.json | 0 .../content}/docs/api-reference/api-keys.mdx | 0 .../docs/api-reference/authentication.mdx | 0 .../docs/api-reference/content-types.mdx | 0 .../content}/docs/api-reference/entries.mdx | 0 .../content}/docs/api-reference/errors.mdx | 0 .../app/content}/docs/api-reference/meta.json | 0 .../docs/api-reference/pagination.mdx | 0 .../content}/docs/api-reference/preview.mdx | 0 .../docs/api-reference/rate-limits.mdx | 0 .../app/content}/docs/changelog.mdx | 0 .../docs/contributing/architecture.mdx | 0 .../docs/contributing/coding-standards.mdx | 0 .../docs/contributing/local-development.mdx | 0 .../app/content}/docs/contributing/meta.json | 0 .../content}/docs/contributing/overview.mdx | 0 .../docs/core-concepts/collections.mdx | 0 .../docs/core-concepts/content-modeling.mdx | 0 .../content}/docs/core-concepts/entries.mdx | 0 .../docs/core-concepts/environments.mdx | 0 .../app/content}/docs/core-concepts/meta.json | 0 .../docs/core-concepts/publishing.mdx | 0 .../docs/core-concepts/workspaces.mdx | 0 .../app/content}/docs/features/audit-logs.mdx | 0 .../content}/docs/features/invitations.mdx | 0 .../content}/docs/features/media-library.mdx | 0 .../app/content}/docs/features/meta.json | 0 .../docs/features/team-management.mdx | 0 .../app/content}/docs/features/webhooks.mdx | 0 .../docs/getting-started/concepts.mdx | 0 .../docs/getting-started/introduction.mdx | 0 .../content}/docs/getting-started/meta.json | 0 .../docs/getting-started/quick-start.mdx | 0 .../app/content}/docs/guides/build-a-blog.mdx | 0 .../app/content}/docs/guides/meta.json | 0 .../docs/guides/nextjs-integration.mdx | 0 .../app/content}/docs/guides/preview-mode.mdx | 0 .../content}/docs/guides/webhooks-guide.mdx | 0 {content => apps/app/content}/docs/meta.json | 0 .../content}/docs/self-hosting/backups.mdx | 0 .../content}/docs/self-hosting/deployment.mdx | 0 .../app/content}/docs/self-hosting/docker.mdx | 0 .../self-hosting/environment-variables.mdx | 3 - .../app/content}/docs/self-hosting/meta.json | 0 .../content}/docs/self-hosting/upgrades.mdx | 0 .../app/eslint.config.mjs | 1 + apps/app/next.config.ts | 8 + apps/app/package.json | 91 + .../app/postcss.config.mjs | 0 prisma.config.ts => apps/app/prisma.config.ts | 0 .../20260508075620_init/migration.sql | 0 .../migration.sql | 0 .../migration.sql | 0 .../migration.sql | 0 .../20260509204648_add_waitlist/migration.sql | 0 .../migration.sql | 0 .../migration.sql | 0 .../migration.sql | 0 .../migration.sql | 0 .../migration.sql | 0 .../migration.sql | 0 .../migration.sql | 0 .../migration.sql | 0 .../migration.sql | 0 .../migration.sql | 0 .../migration.sql | 0 .../migration.sql | 0 .../migration.sql | 0 .../migration.sql | 0 .../migration.sql | 0 .../prisma}/migrations/migration_lock.toml | 0 {prisma => apps/app/prisma}/schema.prisma | 39 + {public => apps/app/public}/file.svg | 0 {public => apps/app/public}/full-logo.png | Bin {public => apps/app/public}/globe.svg | 0 {public => apps/app/public}/logo.png | Bin {public => apps/app/public}/next.svg | 0 {public => apps/app/public}/robots.txt | 0 {public => apps/app/public}/vercel.svg | 0 {public => apps/app/public}/window.svg | 0 source.config.ts => apps/app/source.config.ts | 0 .../src}/app/(admin)/admin/billing/page.tsx | 0 .../app/src}/app/(admin)/admin/layout.tsx | 0 .../app/src}/app/(admin)/admin/logs/page.tsx | 0 .../app/(admin)/admin/operations/actions.ts | 0 .../app/(admin)/admin/operations/page.tsx | 0 .../(admin)/admin/operations/sync-button.tsx | 0 .../app/src}/app/(admin)/admin/users/page.tsx | 0 .../app/(auth)/auth/forgot-password/page.tsx | 0 .../app/src}/app/(auth)/auth/layout.tsx | 0 .../app/src}/app/(auth)/auth/login/page.tsx | 0 .../src}/app/(auth)/auth/register/page.tsx | 0 .../app/(auth)/auth/reset-password/page.tsx | 0 .../reset-password/reset-password-form.tsx | 0 .../app/(auth)/auth/verify-email/page.tsx | 0 .../dashboard/api-explorer/page.tsx | 0 .../(dashboard)/dashboard/api-keys/page.tsx | 0 .../(dashboard)/dashboard/audit-logs/page.tsx | 0 .../(dashboard)/dashboard/billing/page.tsx | 0 .../[id]/entries/[entryId]/page.tsx | 0 .../collections/[id]/entries/new/page.tsx | 0 .../collections/[id]/entries/page.tsx | 0 .../dashboard/collections/[id]/page.tsx | 0 .../dashboard/collections/new/page.tsx | 0 .../dashboard/collections/page.tsx | 0 .../dashboard/environments/page.tsx | 0 .../app/(dashboard)/dashboard/media/page.tsx | 0 .../src}/app/(dashboard)/dashboard/page.tsx | 0 .../preview/[collectionId]/[entryId]/page.tsx | 0 .../(dashboard)/dashboard/settings/page.tsx | 0 .../app/(dashboard)/dashboard/team/page.tsx | 0 .../app/(dashboard)/dashboard/usage/page.tsx | 0 .../dashboard/webhooks/[id]/page.tsx | 0 .../(dashboard)/dashboard/webhooks/page.tsx | 0 .../app/src}/app/(dashboard)/layout.tsx | 0 .../app/src}/app/api/auth/[...all]/route.ts | 0 .../src}/app/api/auth/invite/[token]/route.ts | 0 .../app/api/auth/register-workspace/route.ts | 0 .../src}/app/api/billing/checkout/route.ts | 0 .../app/src}/app/api/billing/webhook/route.ts | 0 .../src}/app/api/dashboard/analytics/route.ts | 0 .../app/src}/app/api/dashboard/stats/route.ts | 0 {src => apps/app/src}/app/api/health/route.ts | 0 .../app/api/internal/admin/stats/route.ts | 0 .../app/src}/app/api/internal/ai/seo/route.ts | 0 .../api/internal/api-explorer/run/route.ts | 0 .../src}/app/api/internal/api-keys/route.ts | 0 .../audit-logs/[workspaceId]/route.ts | 0 .../api/internal/collections/[id]/route.ts | 0 .../collections/apply-template/route.ts | 0 .../app/api/internal/collections/route.ts | 6 +- .../internal/entries/[id]/publish/route.ts | 0 .../app/api/internal/entries/[id]/route.ts | 0 .../src}/app/api/internal/entries/route.ts | 0 .../internal/environments/[envId]/route.ts | 0 .../app/api/internal/environments/route.ts | 0 .../src}/app/api/internal/media/[id]/route.ts | 0 .../api/internal/media/[id]/usage/route.ts | 0 .../src}/app/api/internal/media/bulk/route.ts | 0 .../api/internal/media/folders/[id]/route.ts | 0 .../app/api/internal/media/folders/route.ts | 0 .../app/src}/app/api/internal/media/route.ts | 0 .../api/internal/members/[userId]/route.ts | 0 .../api/internal/onboarding/complete/route.ts | 0 .../usage/[workspaceId]/requests/route.ts | 0 .../api/internal/usage/[workspaceId]/route.ts | 0 .../app/src}/app/api/internal/usage/route.ts | 0 .../webhooks/deliveries/[id]/replay/route.ts | 0 .../webhooks/qstash-callback/route.ts | 0 .../src}/app/api/internal/webhooks/route.ts | 0 .../workspace/invitations/[id]/route.ts | 0 .../internal/workspace/invitations/route.ts | 0 .../src}/app/api/internal/workspace/route.ts | 0 .../src}/app/api/maintenance/notify/route.ts | 0 .../app/api/v1/collections/[slug]/route.ts | 0 .../app/src}/app/api/v1/collections/route.ts | 0 .../[collectionSlug]/[entrySlug]/route.ts | 0 .../api/v1/entries/[collectionSlug]/route.ts | 0 .../app/src}/app/api/v1/media/route.ts | 0 .../app/src}/app/api/v1/workspace/route.ts | 0 {src => apps/app/src}/app/auth/error/page.tsx | 0 .../app/src}/app/docs/[[...slug]]/page.tsx | 0 {src => apps/app/src}/app/docs/layout.tsx | 0 {src => apps/app/src}/app/docs/not-found.tsx | 0 {src => apps/app/src}/app/error.tsx | 0 {src => apps/app/src}/app/favicon.ico | Bin {src => apps/app/src}/app/global-error.tsx | 5 +- {src => apps/app/src}/app/globals.css | 0 {src => apps/app/src}/app/landing-client.tsx | 0 {src => apps/app/src}/app/layout.tsx | 0 .../app/src}/app/maintainance/page.tsx | 0 .../app/src}/app/maintenance/page.tsx | 0 {src => apps/app/src}/app/not-found.tsx | 0 .../app/src}/app/onboarding/layout.tsx | 0 {src => apps/app/src}/app/onboarding/page.tsx | 0 {src => apps/app/src}/app/page.tsx | 0 {src => apps/app/src}/app/sitemap.ts | 0 .../src}/components/admin/AdminSidebar.tsx | 0 .../components/admin/operations-tools.tsx | 0 .../components/auth/resend-verification.tsx | 0 .../app/src}/components/auth/social-auth.tsx | 0 .../components/content-types/FieldBuilder.tsx | 0 .../dashboard/analytics/ApiUsageChart.tsx | 0 .../analytics/PublishingStatusChart.tsx | 0 .../analytics/WorkspaceGrowthChart.tsx | 0 .../components/dashboard/command-palette.tsx | 0 .../dashboard/entries/media-picker-modal.tsx | 0 .../dashboard/entries/reference-picker.tsx | 0 .../dashboard/entries/sandbox-preview.tsx | 0 .../onboarding/DeveloperQuickActions.tsx | 0 .../onboarding/FirstApiCallWidget.tsx | 0 .../onboarding/OnboardingChecklist.tsx | 0 .../dashboard/onboarding/QuickstartGuide.tsx | 0 .../onboarding/RecentActivityFeed.tsx | 0 .../dashboard/onboarding/WelcomeCard.tsx | 0 .../dashboard/settings/billing-plans.tsx | 0 .../dashboard/settings/team-management.tsx | 0 .../app/src}/components/dashboard/sidebar.tsx | 0 .../templates/page-template-browser.tsx | 0 .../dashboard/templates/template-browser.tsx | 0 .../app/src}/components/dashboard/topbar.tsx | 0 .../dashboard/webhooks/deliveries-list.tsx | 0 .../src}/components/editor/BlockEditor.tsx | 0 .../app/src}/components/editor/blocks.tsx | 0 .../emails/api-key-notification.tsx | 0 .../components/emails/content-published.tsx | 0 .../src}/components/emails/email-layout.tsx | 0 .../app/src}/components/emails/index.ts | 0 .../components/emails/marketing-update.tsx | 0 .../components/emails/onboarding-sequence.tsx | 0 .../src}/components/emails/password-reset.tsx | 0 .../components/emails/plan-notification.tsx | 0 .../src}/components/emails/re-engagement.tsx | 0 .../components/emails/team-member-joined.tsx | 0 .../src}/components/emails/usage-alert.tsx | 0 .../components/emails/verification-email.tsx | 0 .../emails/workspace-export-ready.tsx | 0 .../components/emails/workspace-invite.tsx | 0 .../app/src}/components/icons/index.tsx | 0 .../src}/components/landing/Comparison.tsx | 0 .../app/src}/components/landing/FAQ.tsx | 0 .../src}/components/landing/LandingIcons.tsx | 0 .../app/src}/components/landing/LiveDemo.tsx | 0 .../app/src}/components/landing/MobileNav.tsx | 0 .../app/src}/components/landing/NavCTA.tsx | 0 .../app/src}/components/landing/NavLinks.tsx | 0 .../app/src}/components/landing/Navbar.tsx | 0 .../src}/components/landing/ThemeSwitcher.tsx | 0 .../app/src}/components/landing/Ticker.tsx | 0 .../app/src}/components/landing/UseCases.tsx | 0 .../app/src}/components/landing/footer.tsx | 0 .../onboarding/steps/deployment-step.tsx | 0 .../onboarding/steps/tutorial-step.tsx | 0 .../onboarding/steps/welcome-step.tsx | 0 .../onboarding/steps/workspace-step.tsx | 0 .../src}/components/preview/BlockRenderer.tsx | 0 .../app/src}/components/theme-provider.tsx | 0 .../app/src}/components/ui/accordion.tsx | 0 .../app/src}/components/ui/alert-dialog.tsx | 0 {src => apps/app/src}/components/ui/alert.tsx | 0 .../app/src}/components/ui/aspect-ratio.tsx | 0 .../app/src}/components/ui/avatar.tsx | 0 {src => apps/app/src}/components/ui/badge.tsx | 0 .../app/src}/components/ui/breadcrumb.tsx | 0 .../app/src}/components/ui/button-group.tsx | 0 .../app/src}/components/ui/button.tsx | 0 .../app/src}/components/ui/calendar.tsx | 0 {src => apps/app/src}/components/ui/card.tsx | 0 .../app/src}/components/ui/carousel.tsx | 0 {src => apps/app/src}/components/ui/chart.tsx | 0 .../app/src}/components/ui/checkbox.tsx | 0 .../app/src}/components/ui/collapsible.tsx | 0 .../app/src}/components/ui/combobox.tsx | 0 .../app/src}/components/ui/command.tsx | 0 .../app/src}/components/ui/context-menu.tsx | 0 .../app/src}/components/ui/dialog.tsx | 0 .../app/src}/components/ui/direction.tsx | 0 .../app/src}/components/ui/drawer.tsx | 0 .../app/src}/components/ui/dropdown-menu.tsx | 0 {src => apps/app/src}/components/ui/empty.tsx | 0 {src => apps/app/src}/components/ui/field.tsx | 0 .../app/src}/components/ui/hover-card.tsx | 0 .../app/src}/components/ui/input-group.tsx | 0 .../app/src}/components/ui/input-otp.tsx | 0 {src => apps/app/src}/components/ui/input.tsx | 0 {src => apps/app/src}/components/ui/item.tsx | 0 {src => apps/app/src}/components/ui/kbd.tsx | 0 {src => apps/app/src}/components/ui/label.tsx | 0 .../app/src}/components/ui/menubar.tsx | 0 .../app/src}/components/ui/native-select.tsx | 0 .../src}/components/ui/navigation-menu.tsx | 0 .../app/src}/components/ui/pagination.tsx | 0 .../app/src}/components/ui/popover.tsx | 0 .../app/src}/components/ui/progress.tsx | 0 .../app/src}/components/ui/radio-group.tsx | 0 .../app/src}/components/ui/resizable.tsx | 0 .../app/src}/components/ui/scroll-area.tsx | 0 .../app/src}/components/ui/select.tsx | 0 .../app/src}/components/ui/separator.tsx | 0 {src => apps/app/src}/components/ui/sheet.tsx | 0 .../app/src}/components/ui/sidebar.tsx | 0 .../app/src}/components/ui/skeleton.tsx | 0 .../app/src}/components/ui/slider.tsx | 0 .../app/src}/components/ui/sonner.tsx | 0 .../app/src}/components/ui/spinner.tsx | 0 .../app/src}/components/ui/switch.tsx | 0 {src => apps/app/src}/components/ui/table.tsx | 0 {src => apps/app/src}/components/ui/tabs.tsx | 0 .../app/src}/components/ui/textarea.tsx | 0 .../app/src}/components/ui/toggle-group.tsx | 0 .../app/src}/components/ui/toggle.tsx | 0 .../app/src}/components/ui/tooltip.tsx | 0 {src => apps/app/src}/config/app.ts | 0 .../app/src}/config/templates/collections.ts | 0 .../app/src}/config/templates/pages.ts | 0 {src => apps/app/src}/hooks/use-api-keys.ts | 0 {src => apps/app/src}/hooks/use-audit-logs.ts | 0 .../app/src}/hooks/use-collections.ts | 0 .../app/src}/hooks/use-dashboard-analytics.ts | 0 .../app/src}/hooks/use-dashboard-stats.ts | 0 {src => apps/app/src}/hooks/use-entries.ts | 0 .../app/src}/hooks/use-environments.ts | 0 {src => apps/app/src}/hooks/use-media.ts | 0 {src => apps/app/src}/hooks/use-mobile.ts | 0 {src => apps/app/src}/hooks/use-usage.ts | 0 {src => apps/app/src}/hooks/use-webhooks.ts | 0 {src => apps/app/src}/hooks/use-workspace.ts | 0 {src => apps/app/src}/lib/admin.ts | 0 {src => apps/app/src}/lib/ai.ts | 0 {src => apps/app/src}/lib/api-key.ts | 0 {src => apps/app/src}/lib/audit.ts | 0 {src => apps/app/src}/lib/auth-client.ts | 0 {src => apps/app/src}/lib/auth.ts | 0 {src => apps/app/src}/lib/cache-control.ts | 0 {src => apps/app/src}/lib/cache.ts | 0 {src => apps/app/src}/lib/cloudflare.ts | 0 {src => apps/app/src}/lib/email/index.ts | 0 .../src/lib/errors/capture-critical-error.ts | 157 + {src => apps/app/src}/lib/launch.ts | 0 {src => apps/app/src}/lib/logger.ts | 27 +- {src => apps/app/src}/lib/plans.ts | 0 {src => apps/app/src}/lib/preview.ts | 0 {src => apps/app/src}/lib/prisma.ts | 0 {src => apps/app/src}/lib/qstash.ts | 0 {src => apps/app/src}/lib/rate-limit.ts | 0 {src => apps/app/src}/lib/razorpay.ts | 0 {src => apps/app/src}/lib/routes.ts | 0 {src => apps/app/src}/lib/security/tokens.ts | 0 {src => apps/app/src}/lib/session.ts | 0 {src => apps/app/src}/lib/source.ts | 0 {src => apps/app/src}/lib/storage/index.ts | 0 .../app/src}/lib/storage/providers/local.ts | 0 .../src}/lib/storage/providers/supabase.ts | 0 {src => apps/app/src}/lib/storage/types.ts | 0 {src => apps/app/src}/lib/supabase.ts | 0 {src => apps/app/src}/lib/usage.ts | 0 {src => apps/app/src}/lib/utils.ts | 0 .../app/src}/lib/validations/api-key.ts | 0 {src => apps/app/src}/lib/validations/auth.ts | 0 .../app/src}/lib/validations/collection.ts | 0 .../app/src}/lib/validations/common.ts | 0 .../app/src}/lib/validations/entry.ts | 0 {src => apps/app/src}/lib/validations/page.ts | 0 .../app/src}/lib/validations/webhook.ts | 0 .../app/src}/lib/validations/workspace.ts | 0 {src => apps/app/src}/lib/webhooks.ts | 0 {src => apps/app/src}/middleware.ts | 15 - .../app/src}/middleware/with-api-auth.ts | 0 .../app/src}/middleware/with-request-id.ts | 0 .../app/src}/providers/query-provider.tsx | 0 .../app/src}/server/events/emitter.ts | 0 .../src}/server/jobs/reconcileStorageUsage.ts | 0 .../src}/server/services/api-key.service.ts | 0 .../app/src}/server/services/media.service.ts | 0 .../src}/server/services/webhook.service.ts | 0 .../src}/server/services/workspace.service.ts | 0 {src => apps/app/src}/types/api.ts | 0 {src => apps/app/src}/types/cms.ts | 0 {src => apps/app/src}/types/prisma-helpers.ts | 0 tsconfig.json => apps/app/tsconfig.json | 0 apps/docs/README.md | 3 + apps/docs/package.json | 14 + apps/docs/src/index.ts | 5 + apps/docs/tsconfig.json | 18 + docker-compose.yml | 2 +- docs/DESIGN.md | 628 ++ docs/internal-guides/admin-operator-guide.md | 30 + docs/internal-guides/aha-moment-definition.md | 44 + docs/internal-guides/content-types-guide.md | 69 + docs/internal-guides/entries-guide.md | 60 + .../existing-vs-planned-features.md | 63 + docs/internal-guides/friction-points.md | 43 + docs/internal-guides/how-to-use-flowcms.md | 67 + docs/internal-guides/onboarding-flow.md | 48 + docs/internal-guides/pages-guide.md | 69 + docs/internal-guides/real-user-workflows.md | 61 + docs/internal-guides/should-pages-exist.md | 47 + docs/internal-guides/testing-playbook.md | 42 + docs/internal-guides/ux-confusion-audit.md | 31 + .../what-needs-to-be-simplified.md | 41 + .../archive/FlowCMS_Waitlist_Admin_Plan.docx | Bin 0 -> 32424 bytes .../plans/archive/auth_implementation_plan.md | 128 + docs/plans/archive/caching_plan.md | 174 + docs/plans/archive/caching_plan_2.md | 52 + docs/plans/archive/cloudflare_setup.md | 97 + docs/plans/archive/decisions.md | 631 ++ .../master_implementation_blueprint.md | 181 + docs/plans/archive/plan.md | 296 + docs/plans/archive/planned_features_list.md | 651 ++ docs/plans/archive/product_guide.md | 1349 +++ docs/plans/archive/product_guide_v2.md | 490 ++ docs/plans/archive/waitlist_plan.md | 868 ++ docs/plans/v1/audit_16.06.md | 777 ++ docs/plans/v1/forensic_audit_14.06.md | 501 ++ next.config.ts | 48 - package.json | 97 +- pnpm-lock.yaml | 7546 +++++++++-------- pnpm-workspace.yaml | 3 + .../api-explorer-environment.test.ts | 8 +- scripts/__tests__/api-key-limit.test.ts | 4 +- scripts/__tests__/audit-persistence.test.ts | 6 +- scripts/__tests__/entry-environment.test.ts | 6 +- scripts/__tests__/logger-hardening.test.ts | 16 +- scripts/__tests__/storage-display.test.ts | 4 +- scripts/__tests__/storage-limit.test.ts | 4 +- scripts/__tests__/tokens-crypto.test.ts | 2 +- scripts/__tests__/webhook-limit.test.ts | 4 +- scripts/run-api-key-lifecycle-tests.ts | 8 +- scripts/run-api-key-tests.ts | 16 +- scripts/run-critical-error-tests.ts | 153 + scripts/run-environment-isolation-tests.ts | 12 +- scripts/run-environment-lifecycle-tests.ts | 8 +- scripts/run-plan-tests.ts | 4 +- scripts/run-rbac-tests.ts | 6 +- scripts/test-invite.ts | 6 +- scripts/test-preview.ts | 4 +- scripts/test-relation-expansion.ts | 8 +- scripts/test-slug-uniqueness.ts | 10 +- scripts/tests/rbac/collections.test.ts | 8 +- scripts/tests/rbac/entries.test.ts | 8 +- scripts/tests/rbac/media.test.ts | 14 +- scripts/tests/rbac/webhooks.test.ts | 8 +- scripts/tests/rbac/workspace.test.ts | 14 +- src/instrumentation-client.ts | 23 - src/instrumentation.ts | 13 - src/sentry.edge.config.ts | 10 - src/sentry.server.config.ts | 13 - turbo.json | 21 + 436 files changed, 12247 insertions(+), 4152 deletions(-) create mode 100644 .npmrc create mode 100644 apps/app/.dockerignore create mode 100644 apps/app/.gitignore rename Dockerfile => apps/app/Dockerfile (71%) create mode 100644 apps/app/README.md rename components.json => apps/app/components.json (100%) rename {content => apps/app/content}/docs/api-reference/api-keys.mdx (100%) rename {content => apps/app/content}/docs/api-reference/authentication.mdx (100%) rename {content => apps/app/content}/docs/api-reference/content-types.mdx (100%) rename {content => apps/app/content}/docs/api-reference/entries.mdx (100%) rename {content => apps/app/content}/docs/api-reference/errors.mdx (100%) rename {content => apps/app/content}/docs/api-reference/meta.json (100%) rename {content => apps/app/content}/docs/api-reference/pagination.mdx (100%) rename {content => apps/app/content}/docs/api-reference/preview.mdx (100%) rename {content => apps/app/content}/docs/api-reference/rate-limits.mdx (100%) rename {content => apps/app/content}/docs/changelog.mdx (100%) rename {content => apps/app/content}/docs/contributing/architecture.mdx (100%) rename {content => apps/app/content}/docs/contributing/coding-standards.mdx (100%) rename {content => apps/app/content}/docs/contributing/local-development.mdx (100%) rename {content => apps/app/content}/docs/contributing/meta.json (100%) rename {content => apps/app/content}/docs/contributing/overview.mdx (100%) rename {content => apps/app/content}/docs/core-concepts/collections.mdx (100%) rename {content => apps/app/content}/docs/core-concepts/content-modeling.mdx (100%) rename {content => apps/app/content}/docs/core-concepts/entries.mdx (100%) rename {content => apps/app/content}/docs/core-concepts/environments.mdx (100%) rename {content => apps/app/content}/docs/core-concepts/meta.json (100%) rename {content => apps/app/content}/docs/core-concepts/publishing.mdx (100%) rename {content => apps/app/content}/docs/core-concepts/workspaces.mdx (100%) rename {content => apps/app/content}/docs/features/audit-logs.mdx (100%) rename {content => apps/app/content}/docs/features/invitations.mdx (100%) rename {content => apps/app/content}/docs/features/media-library.mdx (100%) rename {content => apps/app/content}/docs/features/meta.json (100%) rename {content => apps/app/content}/docs/features/team-management.mdx (100%) rename {content => apps/app/content}/docs/features/webhooks.mdx (100%) rename {content => apps/app/content}/docs/getting-started/concepts.mdx (100%) rename {content => apps/app/content}/docs/getting-started/introduction.mdx (100%) rename {content => apps/app/content}/docs/getting-started/meta.json (100%) rename {content => apps/app/content}/docs/getting-started/quick-start.mdx (100%) rename {content => apps/app/content}/docs/guides/build-a-blog.mdx (100%) rename {content => apps/app/content}/docs/guides/meta.json (100%) rename {content => apps/app/content}/docs/guides/nextjs-integration.mdx (100%) rename {content => apps/app/content}/docs/guides/preview-mode.mdx (100%) rename {content => apps/app/content}/docs/guides/webhooks-guide.mdx (100%) rename {content => apps/app/content}/docs/meta.json (100%) rename {content => apps/app/content}/docs/self-hosting/backups.mdx (100%) rename {content => apps/app/content}/docs/self-hosting/deployment.mdx (100%) rename {content => apps/app/content}/docs/self-hosting/docker.mdx (100%) rename {content => apps/app/content}/docs/self-hosting/environment-variables.mdx (96%) rename {content => apps/app/content}/docs/self-hosting/meta.json (100%) rename {content => apps/app/content}/docs/self-hosting/upgrades.mdx (100%) rename eslint.config.mjs => apps/app/eslint.config.mjs (96%) create mode 100644 apps/app/next.config.ts create mode 100644 apps/app/package.json rename postcss.config.mjs => apps/app/postcss.config.mjs (100%) rename prisma.config.ts => apps/app/prisma.config.ts (100%) rename {prisma => apps/app/prisma}/migrations/20260508075620_init/migration.sql (100%) rename {prisma => apps/app/prisma}/migrations/20260508131010_update_all_schemas/migration.sql (100%) rename {prisma => apps/app/prisma}/migrations/20260508131127_add_onboarded_flag/migration.sql (100%) rename {prisma => apps/app/prisma}/migrations/20260509202105_production_foundation_upgrade/migration.sql (100%) rename {prisma => apps/app/prisma}/migrations/20260509204648_add_waitlist/migration.sql (100%) rename {prisma => apps/app/prisma}/migrations/20260509221740_add_invite_token_and_last_razorpay_event_date/migration.sql (100%) rename {prisma => apps/app/prisma}/migrations/20260510131925_add_email_logs/migration.sql (100%) rename {prisma => apps/app/prisma}/migrations/20260510200409_add_waitlist_audit_logging/migration.sql (100%) rename {prisma => apps/app/prisma}/migrations/20260510223515_update_waitlist_roles/migration.sql (100%) rename {prisma => apps/app/prisma}/migrations/20260510225121_add_referredby_index/migration.sql (100%) rename {prisma => apps/app/prisma}/migrations/20260515185357_add_notification_relations_and_collections_renaming/migration.sql (100%) rename {prisma => apps/app/prisma}/migrations/20260522163821_remove_waitlist_system/migration.sql (100%) rename {prisma => apps/app/prisma}/migrations/20260528234616_media_v2_refactor_phase1/migration.sql (100%) rename {prisma => apps/app/prisma}/migrations/20260528235348_media_v2_refactor_phase2/migration.sql (100%) rename {prisma => apps/app/prisma}/migrations/20260529130136_add_webhook_observability_fields/migration.sql (100%) rename {prisma => apps/app/prisma}/migrations/20260529164758_add_webhook_events/migration.sql (100%) rename {prisma => apps/app/prisma}/migrations/20260614091639_add_draft_token_security/migration.sql (100%) rename {prisma => apps/app/prisma}/migrations/20260614102451_add_invitation_security_actions/migration.sql (100%) rename {prisma => apps/app/prisma}/migrations/20260616055410_add_environment_isolation/migration.sql (100%) rename {prisma => apps/app/prisma}/migrations/20260619164500_entry_slug_uniqueness/migration.sql (100%) rename {prisma => apps/app/prisma}/migrations/migration_lock.toml (100%) rename {prisma => apps/app/prisma}/schema.prisma (93%) rename {public => apps/app/public}/file.svg (100%) rename {public => apps/app/public}/full-logo.png (100%) rename {public => apps/app/public}/globe.svg (100%) rename {public => apps/app/public}/logo.png (100%) rename {public => apps/app/public}/next.svg (100%) rename {public => apps/app/public}/robots.txt (100%) rename {public => apps/app/public}/vercel.svg (100%) rename {public => apps/app/public}/window.svg (100%) rename source.config.ts => apps/app/source.config.ts (100%) rename {src => apps/app/src}/app/(admin)/admin/billing/page.tsx (100%) rename {src => apps/app/src}/app/(admin)/admin/layout.tsx (100%) rename {src => apps/app/src}/app/(admin)/admin/logs/page.tsx (100%) rename {src => apps/app/src}/app/(admin)/admin/operations/actions.ts (100%) rename {src => apps/app/src}/app/(admin)/admin/operations/page.tsx (100%) rename {src => apps/app/src}/app/(admin)/admin/operations/sync-button.tsx (100%) rename {src => apps/app/src}/app/(admin)/admin/users/page.tsx (100%) rename {src => apps/app/src}/app/(auth)/auth/forgot-password/page.tsx (100%) rename {src => apps/app/src}/app/(auth)/auth/layout.tsx (100%) rename {src => apps/app/src}/app/(auth)/auth/login/page.tsx (100%) rename {src => apps/app/src}/app/(auth)/auth/register/page.tsx (100%) rename {src => apps/app/src}/app/(auth)/auth/reset-password/page.tsx (100%) rename {src => apps/app/src}/app/(auth)/auth/reset-password/reset-password-form.tsx (100%) rename {src => apps/app/src}/app/(auth)/auth/verify-email/page.tsx (100%) rename {src => apps/app/src}/app/(dashboard)/dashboard/api-explorer/page.tsx (100%) rename {src => apps/app/src}/app/(dashboard)/dashboard/api-keys/page.tsx (100%) rename {src => apps/app/src}/app/(dashboard)/dashboard/audit-logs/page.tsx (100%) rename {src => apps/app/src}/app/(dashboard)/dashboard/billing/page.tsx (100%) rename {src => apps/app/src}/app/(dashboard)/dashboard/collections/[id]/entries/[entryId]/page.tsx (100%) rename {src => apps/app/src}/app/(dashboard)/dashboard/collections/[id]/entries/new/page.tsx (100%) rename {src => apps/app/src}/app/(dashboard)/dashboard/collections/[id]/entries/page.tsx (100%) rename {src => apps/app/src}/app/(dashboard)/dashboard/collections/[id]/page.tsx (100%) rename {src => apps/app/src}/app/(dashboard)/dashboard/collections/new/page.tsx (100%) rename {src => apps/app/src}/app/(dashboard)/dashboard/collections/page.tsx (100%) rename {src => apps/app/src}/app/(dashboard)/dashboard/environments/page.tsx (100%) rename {src => apps/app/src}/app/(dashboard)/dashboard/media/page.tsx (100%) rename {src => apps/app/src}/app/(dashboard)/dashboard/page.tsx (100%) rename {src => apps/app/src}/app/(dashboard)/dashboard/preview/[collectionId]/[entryId]/page.tsx (100%) rename {src => apps/app/src}/app/(dashboard)/dashboard/settings/page.tsx (100%) rename {src => apps/app/src}/app/(dashboard)/dashboard/team/page.tsx (100%) rename {src => apps/app/src}/app/(dashboard)/dashboard/usage/page.tsx (100%) rename {src => apps/app/src}/app/(dashboard)/dashboard/webhooks/[id]/page.tsx (100%) rename {src => apps/app/src}/app/(dashboard)/dashboard/webhooks/page.tsx (100%) rename {src => apps/app/src}/app/(dashboard)/layout.tsx (100%) rename {src => apps/app/src}/app/api/auth/[...all]/route.ts (100%) rename {src => apps/app/src}/app/api/auth/invite/[token]/route.ts (100%) rename {src => apps/app/src}/app/api/auth/register-workspace/route.ts (100%) rename {src => apps/app/src}/app/api/billing/checkout/route.ts (100%) rename {src => apps/app/src}/app/api/billing/webhook/route.ts (100%) rename {src => apps/app/src}/app/api/dashboard/analytics/route.ts (100%) rename {src => apps/app/src}/app/api/dashboard/stats/route.ts (100%) rename {src => apps/app/src}/app/api/health/route.ts (100%) rename {src => apps/app/src}/app/api/internal/admin/stats/route.ts (100%) rename {src => apps/app/src}/app/api/internal/ai/seo/route.ts (100%) rename {src => apps/app/src}/app/api/internal/api-explorer/run/route.ts (100%) rename {src => apps/app/src}/app/api/internal/api-keys/route.ts (100%) rename {src => apps/app/src}/app/api/internal/audit-logs/[workspaceId]/route.ts (100%) rename {src => apps/app/src}/app/api/internal/collections/[id]/route.ts (100%) rename {src => apps/app/src}/app/api/internal/collections/apply-template/route.ts (100%) rename {src => apps/app/src}/app/api/internal/collections/route.ts (95%) rename {src => apps/app/src}/app/api/internal/entries/[id]/publish/route.ts (100%) rename {src => apps/app/src}/app/api/internal/entries/[id]/route.ts (100%) rename {src => apps/app/src}/app/api/internal/entries/route.ts (100%) rename {src => apps/app/src}/app/api/internal/environments/[envId]/route.ts (100%) rename {src => apps/app/src}/app/api/internal/environments/route.ts (100%) rename {src => apps/app/src}/app/api/internal/media/[id]/route.ts (100%) rename {src => apps/app/src}/app/api/internal/media/[id]/usage/route.ts (100%) rename {src => apps/app/src}/app/api/internal/media/bulk/route.ts (100%) rename {src => apps/app/src}/app/api/internal/media/folders/[id]/route.ts (100%) rename {src => apps/app/src}/app/api/internal/media/folders/route.ts (100%) rename {src => apps/app/src}/app/api/internal/media/route.ts (100%) rename {src => apps/app/src}/app/api/internal/members/[userId]/route.ts (100%) rename {src => apps/app/src}/app/api/internal/onboarding/complete/route.ts (100%) rename {src => apps/app/src}/app/api/internal/usage/[workspaceId]/requests/route.ts (100%) rename {src => apps/app/src}/app/api/internal/usage/[workspaceId]/route.ts (100%) rename {src => apps/app/src}/app/api/internal/usage/route.ts (100%) rename {src => apps/app/src}/app/api/internal/webhooks/deliveries/[id]/replay/route.ts (100%) rename {src => apps/app/src}/app/api/internal/webhooks/qstash-callback/route.ts (100%) rename {src => apps/app/src}/app/api/internal/webhooks/route.ts (100%) rename {src => apps/app/src}/app/api/internal/workspace/invitations/[id]/route.ts (100%) rename {src => apps/app/src}/app/api/internal/workspace/invitations/route.ts (100%) rename {src => apps/app/src}/app/api/internal/workspace/route.ts (100%) rename {src => apps/app/src}/app/api/maintenance/notify/route.ts (100%) rename {src => apps/app/src}/app/api/v1/collections/[slug]/route.ts (100%) rename {src => apps/app/src}/app/api/v1/collections/route.ts (100%) rename {src => apps/app/src}/app/api/v1/entries/[collectionSlug]/[entrySlug]/route.ts (100%) rename {src => apps/app/src}/app/api/v1/entries/[collectionSlug]/route.ts (100%) rename {src => apps/app/src}/app/api/v1/media/route.ts (100%) rename {src => apps/app/src}/app/api/v1/workspace/route.ts (100%) rename {src => apps/app/src}/app/auth/error/page.tsx (100%) rename {src => apps/app/src}/app/docs/[[...slug]]/page.tsx (100%) rename {src => apps/app/src}/app/docs/layout.tsx (100%) rename {src => apps/app/src}/app/docs/not-found.tsx (100%) rename {src => apps/app/src}/app/error.tsx (100%) rename {src => apps/app/src}/app/favicon.ico (100%) rename {src => apps/app/src}/app/global-error.tsx (90%) rename {src => apps/app/src}/app/globals.css (100%) rename {src => apps/app/src}/app/landing-client.tsx (100%) rename {src => apps/app/src}/app/layout.tsx (100%) rename {src => apps/app/src}/app/maintainance/page.tsx (100%) rename {src => apps/app/src}/app/maintenance/page.tsx (100%) rename {src => apps/app/src}/app/not-found.tsx (100%) rename {src => apps/app/src}/app/onboarding/layout.tsx (100%) rename {src => apps/app/src}/app/onboarding/page.tsx (100%) rename {src => apps/app/src}/app/page.tsx (100%) rename {src => apps/app/src}/app/sitemap.ts (100%) rename {src => apps/app/src}/components/admin/AdminSidebar.tsx (100%) rename {src => apps/app/src}/components/admin/operations-tools.tsx (100%) rename {src => apps/app/src}/components/auth/resend-verification.tsx (100%) rename {src => apps/app/src}/components/auth/social-auth.tsx (100%) rename {src => apps/app/src}/components/content-types/FieldBuilder.tsx (100%) rename {src => apps/app/src}/components/dashboard/analytics/ApiUsageChart.tsx (100%) rename {src => apps/app/src}/components/dashboard/analytics/PublishingStatusChart.tsx (100%) rename {src => apps/app/src}/components/dashboard/analytics/WorkspaceGrowthChart.tsx (100%) rename {src => apps/app/src}/components/dashboard/command-palette.tsx (100%) rename {src => apps/app/src}/components/dashboard/entries/media-picker-modal.tsx (100%) rename {src => apps/app/src}/components/dashboard/entries/reference-picker.tsx (100%) rename {src => apps/app/src}/components/dashboard/entries/sandbox-preview.tsx (100%) rename {src => apps/app/src}/components/dashboard/onboarding/DeveloperQuickActions.tsx (100%) rename {src => apps/app/src}/components/dashboard/onboarding/FirstApiCallWidget.tsx (100%) rename {src => apps/app/src}/components/dashboard/onboarding/OnboardingChecklist.tsx (100%) rename {src => apps/app/src}/components/dashboard/onboarding/QuickstartGuide.tsx (100%) rename {src => apps/app/src}/components/dashboard/onboarding/RecentActivityFeed.tsx (100%) rename {src => apps/app/src}/components/dashboard/onboarding/WelcomeCard.tsx (100%) rename {src => apps/app/src}/components/dashboard/settings/billing-plans.tsx (100%) rename {src => apps/app/src}/components/dashboard/settings/team-management.tsx (100%) rename {src => apps/app/src}/components/dashboard/sidebar.tsx (100%) rename {src => apps/app/src}/components/dashboard/templates/page-template-browser.tsx (100%) rename {src => apps/app/src}/components/dashboard/templates/template-browser.tsx (100%) rename {src => apps/app/src}/components/dashboard/topbar.tsx (100%) rename {src => apps/app/src}/components/dashboard/webhooks/deliveries-list.tsx (100%) rename {src => apps/app/src}/components/editor/BlockEditor.tsx (100%) rename {src => apps/app/src}/components/editor/blocks.tsx (100%) rename {src => apps/app/src}/components/emails/api-key-notification.tsx (100%) rename {src => apps/app/src}/components/emails/content-published.tsx (100%) rename {src => apps/app/src}/components/emails/email-layout.tsx (100%) rename {src => apps/app/src}/components/emails/index.ts (100%) rename {src => apps/app/src}/components/emails/marketing-update.tsx (100%) rename {src => apps/app/src}/components/emails/onboarding-sequence.tsx (100%) rename {src => apps/app/src}/components/emails/password-reset.tsx (100%) rename {src => apps/app/src}/components/emails/plan-notification.tsx (100%) rename {src => apps/app/src}/components/emails/re-engagement.tsx (100%) rename {src => apps/app/src}/components/emails/team-member-joined.tsx (100%) rename {src => apps/app/src}/components/emails/usage-alert.tsx (100%) rename {src => apps/app/src}/components/emails/verification-email.tsx (100%) rename {src => apps/app/src}/components/emails/workspace-export-ready.tsx (100%) rename {src => apps/app/src}/components/emails/workspace-invite.tsx (100%) rename {src => apps/app/src}/components/icons/index.tsx (100%) rename {src => apps/app/src}/components/landing/Comparison.tsx (100%) rename {src => apps/app/src}/components/landing/FAQ.tsx (100%) rename {src => apps/app/src}/components/landing/LandingIcons.tsx (100%) rename {src => apps/app/src}/components/landing/LiveDemo.tsx (100%) rename {src => apps/app/src}/components/landing/MobileNav.tsx (100%) rename {src => apps/app/src}/components/landing/NavCTA.tsx (100%) rename {src => apps/app/src}/components/landing/NavLinks.tsx (100%) rename {src => apps/app/src}/components/landing/Navbar.tsx (100%) rename {src => apps/app/src}/components/landing/ThemeSwitcher.tsx (100%) rename {src => apps/app/src}/components/landing/Ticker.tsx (100%) rename {src => apps/app/src}/components/landing/UseCases.tsx (100%) rename {src => apps/app/src}/components/landing/footer.tsx (100%) rename {src => apps/app/src}/components/onboarding/steps/deployment-step.tsx (100%) rename {src => apps/app/src}/components/onboarding/steps/tutorial-step.tsx (100%) rename {src => apps/app/src}/components/onboarding/steps/welcome-step.tsx (100%) rename {src => apps/app/src}/components/onboarding/steps/workspace-step.tsx (100%) rename {src => apps/app/src}/components/preview/BlockRenderer.tsx (100%) rename {src => apps/app/src}/components/theme-provider.tsx (100%) rename {src => apps/app/src}/components/ui/accordion.tsx (100%) rename {src => apps/app/src}/components/ui/alert-dialog.tsx (100%) rename {src => apps/app/src}/components/ui/alert.tsx (100%) rename {src => apps/app/src}/components/ui/aspect-ratio.tsx (100%) rename {src => apps/app/src}/components/ui/avatar.tsx (100%) rename {src => apps/app/src}/components/ui/badge.tsx (100%) rename {src => apps/app/src}/components/ui/breadcrumb.tsx (100%) rename {src => apps/app/src}/components/ui/button-group.tsx (100%) rename {src => apps/app/src}/components/ui/button.tsx (100%) rename {src => apps/app/src}/components/ui/calendar.tsx (100%) rename {src => apps/app/src}/components/ui/card.tsx (100%) rename {src => apps/app/src}/components/ui/carousel.tsx (100%) rename {src => apps/app/src}/components/ui/chart.tsx (100%) rename {src => apps/app/src}/components/ui/checkbox.tsx (100%) rename {src => apps/app/src}/components/ui/collapsible.tsx (100%) rename {src => apps/app/src}/components/ui/combobox.tsx (100%) rename {src => apps/app/src}/components/ui/command.tsx (100%) rename {src => apps/app/src}/components/ui/context-menu.tsx (100%) rename {src => apps/app/src}/components/ui/dialog.tsx (100%) rename {src => apps/app/src}/components/ui/direction.tsx (100%) rename {src => apps/app/src}/components/ui/drawer.tsx (100%) rename {src => apps/app/src}/components/ui/dropdown-menu.tsx (100%) rename {src => apps/app/src}/components/ui/empty.tsx (100%) rename {src => apps/app/src}/components/ui/field.tsx (100%) rename {src => apps/app/src}/components/ui/hover-card.tsx (100%) rename {src => apps/app/src}/components/ui/input-group.tsx (100%) rename {src => apps/app/src}/components/ui/input-otp.tsx (100%) rename {src => apps/app/src}/components/ui/input.tsx (100%) rename {src => apps/app/src}/components/ui/item.tsx (100%) rename {src => apps/app/src}/components/ui/kbd.tsx (100%) rename {src => apps/app/src}/components/ui/label.tsx (100%) rename {src => apps/app/src}/components/ui/menubar.tsx (100%) rename {src => apps/app/src}/components/ui/native-select.tsx (100%) rename {src => apps/app/src}/components/ui/navigation-menu.tsx (100%) rename {src => apps/app/src}/components/ui/pagination.tsx (100%) rename {src => apps/app/src}/components/ui/popover.tsx (100%) rename {src => apps/app/src}/components/ui/progress.tsx (100%) rename {src => apps/app/src}/components/ui/radio-group.tsx (100%) rename {src => apps/app/src}/components/ui/resizable.tsx (100%) rename {src => apps/app/src}/components/ui/scroll-area.tsx (100%) rename {src => apps/app/src}/components/ui/select.tsx (100%) rename {src => apps/app/src}/components/ui/separator.tsx (100%) rename {src => apps/app/src}/components/ui/sheet.tsx (100%) rename {src => apps/app/src}/components/ui/sidebar.tsx (100%) rename {src => apps/app/src}/components/ui/skeleton.tsx (100%) rename {src => apps/app/src}/components/ui/slider.tsx (100%) rename {src => apps/app/src}/components/ui/sonner.tsx (100%) rename {src => apps/app/src}/components/ui/spinner.tsx (100%) rename {src => apps/app/src}/components/ui/switch.tsx (100%) rename {src => apps/app/src}/components/ui/table.tsx (100%) rename {src => apps/app/src}/components/ui/tabs.tsx (100%) rename {src => apps/app/src}/components/ui/textarea.tsx (100%) rename {src => apps/app/src}/components/ui/toggle-group.tsx (100%) rename {src => apps/app/src}/components/ui/toggle.tsx (100%) rename {src => apps/app/src}/components/ui/tooltip.tsx (100%) rename {src => apps/app/src}/config/app.ts (100%) rename {src => apps/app/src}/config/templates/collections.ts (100%) rename {src => apps/app/src}/config/templates/pages.ts (100%) rename {src => apps/app/src}/hooks/use-api-keys.ts (100%) rename {src => apps/app/src}/hooks/use-audit-logs.ts (100%) rename {src => apps/app/src}/hooks/use-collections.ts (100%) rename {src => apps/app/src}/hooks/use-dashboard-analytics.ts (100%) rename {src => apps/app/src}/hooks/use-dashboard-stats.ts (100%) rename {src => apps/app/src}/hooks/use-entries.ts (100%) rename {src => apps/app/src}/hooks/use-environments.ts (100%) rename {src => apps/app/src}/hooks/use-media.ts (100%) rename {src => apps/app/src}/hooks/use-mobile.ts (100%) rename {src => apps/app/src}/hooks/use-usage.ts (100%) rename {src => apps/app/src}/hooks/use-webhooks.ts (100%) rename {src => apps/app/src}/hooks/use-workspace.ts (100%) rename {src => apps/app/src}/lib/admin.ts (100%) rename {src => apps/app/src}/lib/ai.ts (100%) rename {src => apps/app/src}/lib/api-key.ts (100%) rename {src => apps/app/src}/lib/audit.ts (100%) rename {src => apps/app/src}/lib/auth-client.ts (100%) rename {src => apps/app/src}/lib/auth.ts (100%) rename {src => apps/app/src}/lib/cache-control.ts (100%) rename {src => apps/app/src}/lib/cache.ts (100%) rename {src => apps/app/src}/lib/cloudflare.ts (100%) rename {src => apps/app/src}/lib/email/index.ts (100%) create mode 100644 apps/app/src/lib/errors/capture-critical-error.ts rename {src => apps/app/src}/lib/launch.ts (100%) rename {src => apps/app/src}/lib/logger.ts (60%) rename {src => apps/app/src}/lib/plans.ts (100%) rename {src => apps/app/src}/lib/preview.ts (100%) rename {src => apps/app/src}/lib/prisma.ts (100%) rename {src => apps/app/src}/lib/qstash.ts (100%) rename {src => apps/app/src}/lib/rate-limit.ts (100%) rename {src => apps/app/src}/lib/razorpay.ts (100%) rename {src => apps/app/src}/lib/routes.ts (100%) rename {src => apps/app/src}/lib/security/tokens.ts (100%) rename {src => apps/app/src}/lib/session.ts (100%) rename {src => apps/app/src}/lib/source.ts (100%) rename {src => apps/app/src}/lib/storage/index.ts (100%) rename {src => apps/app/src}/lib/storage/providers/local.ts (100%) rename {src => apps/app/src}/lib/storage/providers/supabase.ts (100%) rename {src => apps/app/src}/lib/storage/types.ts (100%) rename {src => apps/app/src}/lib/supabase.ts (100%) rename {src => apps/app/src}/lib/usage.ts (100%) rename {src => apps/app/src}/lib/utils.ts (100%) rename {src => apps/app/src}/lib/validations/api-key.ts (100%) rename {src => apps/app/src}/lib/validations/auth.ts (100%) rename {src => apps/app/src}/lib/validations/collection.ts (100%) rename {src => apps/app/src}/lib/validations/common.ts (100%) rename {src => apps/app/src}/lib/validations/entry.ts (100%) rename {src => apps/app/src}/lib/validations/page.ts (100%) rename {src => apps/app/src}/lib/validations/webhook.ts (100%) rename {src => apps/app/src}/lib/validations/workspace.ts (100%) rename {src => apps/app/src}/lib/webhooks.ts (100%) rename {src => apps/app/src}/middleware.ts (76%) rename {src => apps/app/src}/middleware/with-api-auth.ts (100%) rename {src => apps/app/src}/middleware/with-request-id.ts (100%) rename {src => apps/app/src}/providers/query-provider.tsx (100%) rename {src => apps/app/src}/server/events/emitter.ts (100%) rename {src => apps/app/src}/server/jobs/reconcileStorageUsage.ts (100%) rename {src => apps/app/src}/server/services/api-key.service.ts (100%) rename {src => apps/app/src}/server/services/media.service.ts (100%) rename {src => apps/app/src}/server/services/webhook.service.ts (100%) rename {src => apps/app/src}/server/services/workspace.service.ts (100%) rename {src => apps/app/src}/types/api.ts (100%) rename {src => apps/app/src}/types/cms.ts (100%) rename {src => apps/app/src}/types/prisma-helpers.ts (100%) rename tsconfig.json => apps/app/tsconfig.json (100%) create mode 100644 apps/docs/README.md create mode 100644 apps/docs/package.json create mode 100644 apps/docs/src/index.ts create mode 100644 apps/docs/tsconfig.json create mode 100644 docs/DESIGN.md create mode 100644 docs/internal-guides/admin-operator-guide.md create mode 100644 docs/internal-guides/aha-moment-definition.md create mode 100644 docs/internal-guides/content-types-guide.md create mode 100644 docs/internal-guides/entries-guide.md create mode 100644 docs/internal-guides/existing-vs-planned-features.md create mode 100644 docs/internal-guides/friction-points.md create mode 100644 docs/internal-guides/how-to-use-flowcms.md create mode 100644 docs/internal-guides/onboarding-flow.md create mode 100644 docs/internal-guides/pages-guide.md create mode 100644 docs/internal-guides/real-user-workflows.md create mode 100644 docs/internal-guides/should-pages-exist.md create mode 100644 docs/internal-guides/testing-playbook.md create mode 100644 docs/internal-guides/ux-confusion-audit.md create mode 100644 docs/internal-guides/what-needs-to-be-simplified.md create mode 100644 docs/plans/archive/FlowCMS_Waitlist_Admin_Plan.docx create mode 100644 docs/plans/archive/auth_implementation_plan.md create mode 100644 docs/plans/archive/caching_plan.md create mode 100644 docs/plans/archive/caching_plan_2.md create mode 100644 docs/plans/archive/cloudflare_setup.md create mode 100644 docs/plans/archive/decisions.md create mode 100644 docs/plans/archive/master_implementation_blueprint.md create mode 100644 docs/plans/archive/plan.md create mode 100644 docs/plans/archive/planned_features_list.md create mode 100644 docs/plans/archive/product_guide.md create mode 100644 docs/plans/archive/product_guide_v2.md create mode 100644 docs/plans/archive/waitlist_plan.md create mode 100644 docs/plans/v1/audit_16.06.md create mode 100644 docs/plans/v1/forensic_audit_14.06.md delete mode 100644 next.config.ts create mode 100644 pnpm-workspace.yaml create mode 100644 scripts/run-critical-error-tests.ts delete mode 100644 src/instrumentation-client.ts delete mode 100644 src/instrumentation.ts delete mode 100644 src/sentry.edge.config.ts delete mode 100644 src/sentry.server.config.ts create mode 100644 turbo.json diff --git a/.dockerignore b/.dockerignore index 7af4f95..0f07e2d 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,10 +1,14 @@ Dockerfile .dockerignore node_modules +**/node_modules npm-debug.log README.md .next +**/.next .git .env .env.local .env.*.local +/docs +scratch diff --git a/.gitignore b/.gitignore index ff2a2af..96fab4f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,49 +1,38 @@ # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. -# dependencies -/node_modules -/.pnp -.pnp.* -.yarn/* -!.yarn/patches -!.yarn/plugins -!.yarn/releases -!.yarn/versions - -# testing -/coverage - -# next.js -/.next/ -/out/ - -# production -/build - -# misc -.DS_Store -*.pem +# Dependencies +node_modules +.pnp +.pnp.js -# debug -npm-debug.log* -yarn-debug.log* -yarn-error.log* -.pnpm-debug.log* +# Local env files +.env +.env.local +.env.development.local +.env.test.local +.env.production.local + +# Testing +coverage -# env files (can opt-in for committing if needed) -.env* +# Turbo +.turbo -# vercel +# Vercel .vercel -# typescript -*.tsbuildinfo -next-env.d.ts +# Build Outputs +.next/ +out/ +build +dist -/src/generated/prisma -DESIGN.md -/plans -/internal-guides -.source -send-founder-email.js \ No newline at end of file +# Debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Misc +.DS_Store +*.pem diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..3e775ef --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +auto-install-peers=true diff --git a/README.md b/README.md index e215bc4..2132f71 100644 --- a/README.md +++ b/README.md @@ -1,36 +1,159 @@ -This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app). +# Turborepo starter -## Getting Started +This Turborepo starter is maintained by the Turborepo core team. -First, run the development server: +## Using this example -```bash -npm run dev -# or -yarn dev -# or -pnpm dev -# or -bun dev +Run the following command: + +```sh +npx create-turbo@latest +``` + +## What's inside? + +This Turborepo includes the following packages/apps: + +### Apps and Packages + +- `docs`: a [Next.js](https://nextjs.org/) app +- `web`: another [Next.js](https://nextjs.org/) app +- `@repo/ui`: a stub React component library shared by both `web` and `docs` applications +- `@repo/eslint-config`: `eslint` configurations (includes `eslint-config-next` and `eslint-config-prettier`) +- `@repo/typescript-config`: `tsconfig.json`s used throughout the monorepo + +Each package/app is 100% [TypeScript](https://www.typescriptlang.org/). + +### Utilities + +This Turborepo has some additional tools already setup for you: + +- [TypeScript](https://www.typescriptlang.org/) for static type checking +- [ESLint](https://eslint.org/) for code linting +- [Prettier](https://prettier.io) for code formatting + +### Build + +To build all apps and packages, run the following command: + +With [global `turbo`](https://turborepo.dev/docs/getting-started/installation#global-installation) installed (recommended): + +```sh +cd my-turborepo +turbo build +``` + +Without global `turbo`, use your package manager: + +```sh +cd my-turborepo +npx turbo build +pnpm dlx turbo build +pnpm exec turbo build +``` + +You can build a specific package by using a [filter](https://turborepo.dev/docs/crafting-your-repository/running-tasks#using-filters): + +With [global `turbo`](https://turborepo.dev/docs/getting-started/installation#global-installation) installed: + +```sh +turbo build --filter=docs +``` + +Without global `turbo`: + +```sh +npx turbo build --filter=docs +pnpm exec turbo build --filter=docs +pnpm exec turbo build --filter=docs +``` + +### Develop + +To develop all apps and packages, run the following command: + +With [global `turbo`](https://turborepo.dev/docs/getting-started/installation#global-installation) installed (recommended): + +```sh +cd my-turborepo +turbo dev +``` + +Without global `turbo`, use your package manager: + +```sh +cd my-turborepo +npx turbo dev +pnpm exec turbo dev +pnpm exec turbo dev ``` -Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. +You can develop a specific package by using a [filter](https://turborepo.dev/docs/crafting-your-repository/running-tasks#using-filters): + +With [global `turbo`](https://turborepo.dev/docs/getting-started/installation#global-installation) installed: + +```sh +turbo dev --filter=web +``` + +Without global `turbo`: + +```sh +npx turbo dev --filter=web +pnpm exec turbo dev --filter=web +pnpm exec turbo dev --filter=web +``` -You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. +### Remote Caching -This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel. +> [!TIP] +> Vercel Remote Cache is free for all plans. Get started today at [vercel.com](https://vercel.com/signup?utm_source=remote-cache-sdk&utm_campaign=free_remote_cache). -## Learn More +Turborepo can use a technique known as [Remote Caching](https://turborepo.dev/docs/core-concepts/remote-caching) to share cache artifacts across machines, enabling you to share build caches with your team and CI/CD pipelines. -To learn more about Next.js, take a look at the following resources: +By default, Turborepo will cache locally. To enable Remote Caching you will need an account with Vercel. If you don't have an account you can [create one](https://vercel.com/signup?utm_source=turborepo-examples), then enter the following commands: -- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. -- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. +With [global `turbo`](https://turborepo.dev/docs/getting-started/installation#global-installation) installed (recommended): -You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome! +```sh +cd my-turborepo +turbo login +``` + +Without global `turbo`, use your package manager: + +```sh +cd my-turborepo +npx turbo login +pnpm exec turbo login +pnpm exec turbo login +``` + +This will authenticate the Turborepo CLI with your [Vercel account](https://vercel.com/docs/concepts/personal-accounts/overview). + +Next, you can link your Turborepo to your Remote Cache by running the following command from the root of your Turborepo: + +With [global `turbo`](https://turborepo.dev/docs/getting-started/installation#global-installation) installed: + +```sh +turbo link +``` + +Without global `turbo`: + +```sh +npx turbo link +pnpm exec turbo link +pnpm exec turbo link +``` -## Deploy on Vercel +## Useful Links -The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. +Learn more about the power of Turborepo: -Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details. +- [Tasks](https://turborepo.dev/docs/crafting-your-repository/running-tasks) +- [Caching](https://turborepo.dev/docs/crafting-your-repository/caching) +- [Remote Caching](https://turborepo.dev/docs/core-concepts/remote-caching) +- [Filtering](https://turborepo.dev/docs/crafting-your-repository/running-tasks#using-filters) +- [Configuration Options](https://turborepo.dev/docs/reference/configuration) +- [CLI Usage](https://turborepo.dev/docs/reference/command-line-reference) diff --git a/apps/app/.dockerignore b/apps/app/.dockerignore new file mode 100644 index 0000000..7af4f95 --- /dev/null +++ b/apps/app/.dockerignore @@ -0,0 +1,10 @@ +Dockerfile +.dockerignore +node_modules +npm-debug.log +README.md +.next +.git +.env +.env.local +.env.*.local diff --git a/apps/app/.gitignore b/apps/app/.gitignore new file mode 100644 index 0000000..0fe7c28 --- /dev/null +++ b/apps/app/.gitignore @@ -0,0 +1,46 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.* +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/versions + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# env files (can opt-in for committing if needed) +.env* + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts + +/src/generated/prisma +.source + +send-founder-email.js \ No newline at end of file diff --git a/Dockerfile b/apps/app/Dockerfile similarity index 71% rename from Dockerfile rename to apps/app/Dockerfile index 06b8c91..3a1871f 100644 --- a/Dockerfile +++ b/apps/app/Dockerfile @@ -3,12 +3,13 @@ FROM node:20-alpine AS base # Install dependencies only when needed FROM base AS deps -# Check https://github.com/nodejs/docker-node/tree/b4117f9333da4138b03a546ec926ef50a31506c3#nodealpine to understand why libc6-compat might be needed. RUN apk add --no-cache libc6-compat WORKDIR /app -# Install dependencies based on the preferred package manager -COPY package.json pnpm-lock.yaml* ./ +# Install monorepo dependencies +COPY package.json pnpm-lock.yaml* pnpm-workspace.yaml* ./ +COPY apps/app/package.json ./apps/app/ +COPY apps/docs/package.json ./apps/docs/ RUN corepack enable pnpm && pnpm i --frozen-lockfile # Rebuild the source code only when needed @@ -17,6 +18,8 @@ WORKDIR /app COPY --from=deps /app/node_modules ./node_modules COPY . . +WORKDIR /app/apps/app + # Generate prisma client RUN npx prisma generate @@ -37,12 +40,12 @@ RUN addgroup --system --gid 1001 nodejs RUN adduser --system --uid 1001 nextjs # Copy prisma schema and migrations -COPY --from=builder /app/prisma ./prisma +COPY --from=builder /app/apps/app/prisma ./prisma COPY --from=builder /app/node_modules/@prisma ./node_modules/@prisma COPY --from=builder /app/node_modules/.prisma ./node_modules/.prisma -COPY --from=builder /app/src/generated/prisma ./src/generated/prisma +COPY --from=builder /app/apps/app/src/generated/prisma ./src/generated/prisma -COPY --from=builder /app/public ./public +COPY --from=builder /app/apps/app/public ./public # Set the correct permission for prerender cache RUN mkdir .next @@ -50,8 +53,8 @@ RUN chown nextjs:nodejs .next # Automatically leverage output traces to reduce image size # https://nextjs.org/docs/advanced-features/output-file-tracing -COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./ -COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static +COPY --from=builder --chown=nextjs:nodejs /app/apps/app/.next/standalone ./ +COPY --from=builder --chown=nextjs:nodejs /app/apps/app/.next/static ./.next/static USER nextjs diff --git a/apps/app/README.md b/apps/app/README.md new file mode 100644 index 0000000..e215bc4 --- /dev/null +++ b/apps/app/README.md @@ -0,0 +1,36 @@ +This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app). + +## Getting Started + +First, run the development server: + +```bash +npm run dev +# or +yarn dev +# or +pnpm dev +# or +bun dev +``` + +Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. + +You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. + +This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel. + +## Learn More + +To learn more about Next.js, take a look at the following resources: + +- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. +- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. + +You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome! + +## Deploy on Vercel + +The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. + +Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details. diff --git a/components.json b/apps/app/components.json similarity index 100% rename from components.json rename to apps/app/components.json diff --git a/content/docs/api-reference/api-keys.mdx b/apps/app/content/docs/api-reference/api-keys.mdx similarity index 100% rename from content/docs/api-reference/api-keys.mdx rename to apps/app/content/docs/api-reference/api-keys.mdx diff --git a/content/docs/api-reference/authentication.mdx b/apps/app/content/docs/api-reference/authentication.mdx similarity index 100% rename from content/docs/api-reference/authentication.mdx rename to apps/app/content/docs/api-reference/authentication.mdx diff --git a/content/docs/api-reference/content-types.mdx b/apps/app/content/docs/api-reference/content-types.mdx similarity index 100% rename from content/docs/api-reference/content-types.mdx rename to apps/app/content/docs/api-reference/content-types.mdx diff --git a/content/docs/api-reference/entries.mdx b/apps/app/content/docs/api-reference/entries.mdx similarity index 100% rename from content/docs/api-reference/entries.mdx rename to apps/app/content/docs/api-reference/entries.mdx diff --git a/content/docs/api-reference/errors.mdx b/apps/app/content/docs/api-reference/errors.mdx similarity index 100% rename from content/docs/api-reference/errors.mdx rename to apps/app/content/docs/api-reference/errors.mdx diff --git a/content/docs/api-reference/meta.json b/apps/app/content/docs/api-reference/meta.json similarity index 100% rename from content/docs/api-reference/meta.json rename to apps/app/content/docs/api-reference/meta.json diff --git a/content/docs/api-reference/pagination.mdx b/apps/app/content/docs/api-reference/pagination.mdx similarity index 100% rename from content/docs/api-reference/pagination.mdx rename to apps/app/content/docs/api-reference/pagination.mdx diff --git a/content/docs/api-reference/preview.mdx b/apps/app/content/docs/api-reference/preview.mdx similarity index 100% rename from content/docs/api-reference/preview.mdx rename to apps/app/content/docs/api-reference/preview.mdx diff --git a/content/docs/api-reference/rate-limits.mdx b/apps/app/content/docs/api-reference/rate-limits.mdx similarity index 100% rename from content/docs/api-reference/rate-limits.mdx rename to apps/app/content/docs/api-reference/rate-limits.mdx diff --git a/content/docs/changelog.mdx b/apps/app/content/docs/changelog.mdx similarity index 100% rename from content/docs/changelog.mdx rename to apps/app/content/docs/changelog.mdx diff --git a/content/docs/contributing/architecture.mdx b/apps/app/content/docs/contributing/architecture.mdx similarity index 100% rename from content/docs/contributing/architecture.mdx rename to apps/app/content/docs/contributing/architecture.mdx diff --git a/content/docs/contributing/coding-standards.mdx b/apps/app/content/docs/contributing/coding-standards.mdx similarity index 100% rename from content/docs/contributing/coding-standards.mdx rename to apps/app/content/docs/contributing/coding-standards.mdx diff --git a/content/docs/contributing/local-development.mdx b/apps/app/content/docs/contributing/local-development.mdx similarity index 100% rename from content/docs/contributing/local-development.mdx rename to apps/app/content/docs/contributing/local-development.mdx diff --git a/content/docs/contributing/meta.json b/apps/app/content/docs/contributing/meta.json similarity index 100% rename from content/docs/contributing/meta.json rename to apps/app/content/docs/contributing/meta.json diff --git a/content/docs/contributing/overview.mdx b/apps/app/content/docs/contributing/overview.mdx similarity index 100% rename from content/docs/contributing/overview.mdx rename to apps/app/content/docs/contributing/overview.mdx diff --git a/content/docs/core-concepts/collections.mdx b/apps/app/content/docs/core-concepts/collections.mdx similarity index 100% rename from content/docs/core-concepts/collections.mdx rename to apps/app/content/docs/core-concepts/collections.mdx diff --git a/content/docs/core-concepts/content-modeling.mdx b/apps/app/content/docs/core-concepts/content-modeling.mdx similarity index 100% rename from content/docs/core-concepts/content-modeling.mdx rename to apps/app/content/docs/core-concepts/content-modeling.mdx diff --git a/content/docs/core-concepts/entries.mdx b/apps/app/content/docs/core-concepts/entries.mdx similarity index 100% rename from content/docs/core-concepts/entries.mdx rename to apps/app/content/docs/core-concepts/entries.mdx diff --git a/content/docs/core-concepts/environments.mdx b/apps/app/content/docs/core-concepts/environments.mdx similarity index 100% rename from content/docs/core-concepts/environments.mdx rename to apps/app/content/docs/core-concepts/environments.mdx diff --git a/content/docs/core-concepts/meta.json b/apps/app/content/docs/core-concepts/meta.json similarity index 100% rename from content/docs/core-concepts/meta.json rename to apps/app/content/docs/core-concepts/meta.json diff --git a/content/docs/core-concepts/publishing.mdx b/apps/app/content/docs/core-concepts/publishing.mdx similarity index 100% rename from content/docs/core-concepts/publishing.mdx rename to apps/app/content/docs/core-concepts/publishing.mdx diff --git a/content/docs/core-concepts/workspaces.mdx b/apps/app/content/docs/core-concepts/workspaces.mdx similarity index 100% rename from content/docs/core-concepts/workspaces.mdx rename to apps/app/content/docs/core-concepts/workspaces.mdx diff --git a/content/docs/features/audit-logs.mdx b/apps/app/content/docs/features/audit-logs.mdx similarity index 100% rename from content/docs/features/audit-logs.mdx rename to apps/app/content/docs/features/audit-logs.mdx diff --git a/content/docs/features/invitations.mdx b/apps/app/content/docs/features/invitations.mdx similarity index 100% rename from content/docs/features/invitations.mdx rename to apps/app/content/docs/features/invitations.mdx diff --git a/content/docs/features/media-library.mdx b/apps/app/content/docs/features/media-library.mdx similarity index 100% rename from content/docs/features/media-library.mdx rename to apps/app/content/docs/features/media-library.mdx diff --git a/content/docs/features/meta.json b/apps/app/content/docs/features/meta.json similarity index 100% rename from content/docs/features/meta.json rename to apps/app/content/docs/features/meta.json diff --git a/content/docs/features/team-management.mdx b/apps/app/content/docs/features/team-management.mdx similarity index 100% rename from content/docs/features/team-management.mdx rename to apps/app/content/docs/features/team-management.mdx diff --git a/content/docs/features/webhooks.mdx b/apps/app/content/docs/features/webhooks.mdx similarity index 100% rename from content/docs/features/webhooks.mdx rename to apps/app/content/docs/features/webhooks.mdx diff --git a/content/docs/getting-started/concepts.mdx b/apps/app/content/docs/getting-started/concepts.mdx similarity index 100% rename from content/docs/getting-started/concepts.mdx rename to apps/app/content/docs/getting-started/concepts.mdx diff --git a/content/docs/getting-started/introduction.mdx b/apps/app/content/docs/getting-started/introduction.mdx similarity index 100% rename from content/docs/getting-started/introduction.mdx rename to apps/app/content/docs/getting-started/introduction.mdx diff --git a/content/docs/getting-started/meta.json b/apps/app/content/docs/getting-started/meta.json similarity index 100% rename from content/docs/getting-started/meta.json rename to apps/app/content/docs/getting-started/meta.json diff --git a/content/docs/getting-started/quick-start.mdx b/apps/app/content/docs/getting-started/quick-start.mdx similarity index 100% rename from content/docs/getting-started/quick-start.mdx rename to apps/app/content/docs/getting-started/quick-start.mdx diff --git a/content/docs/guides/build-a-blog.mdx b/apps/app/content/docs/guides/build-a-blog.mdx similarity index 100% rename from content/docs/guides/build-a-blog.mdx rename to apps/app/content/docs/guides/build-a-blog.mdx diff --git a/content/docs/guides/meta.json b/apps/app/content/docs/guides/meta.json similarity index 100% rename from content/docs/guides/meta.json rename to apps/app/content/docs/guides/meta.json diff --git a/content/docs/guides/nextjs-integration.mdx b/apps/app/content/docs/guides/nextjs-integration.mdx similarity index 100% rename from content/docs/guides/nextjs-integration.mdx rename to apps/app/content/docs/guides/nextjs-integration.mdx diff --git a/content/docs/guides/preview-mode.mdx b/apps/app/content/docs/guides/preview-mode.mdx similarity index 100% rename from content/docs/guides/preview-mode.mdx rename to apps/app/content/docs/guides/preview-mode.mdx diff --git a/content/docs/guides/webhooks-guide.mdx b/apps/app/content/docs/guides/webhooks-guide.mdx similarity index 100% rename from content/docs/guides/webhooks-guide.mdx rename to apps/app/content/docs/guides/webhooks-guide.mdx diff --git a/content/docs/meta.json b/apps/app/content/docs/meta.json similarity index 100% rename from content/docs/meta.json rename to apps/app/content/docs/meta.json diff --git a/content/docs/self-hosting/backups.mdx b/apps/app/content/docs/self-hosting/backups.mdx similarity index 100% rename from content/docs/self-hosting/backups.mdx rename to apps/app/content/docs/self-hosting/backups.mdx diff --git a/content/docs/self-hosting/deployment.mdx b/apps/app/content/docs/self-hosting/deployment.mdx similarity index 100% rename from content/docs/self-hosting/deployment.mdx rename to apps/app/content/docs/self-hosting/deployment.mdx diff --git a/content/docs/self-hosting/docker.mdx b/apps/app/content/docs/self-hosting/docker.mdx similarity index 100% rename from content/docs/self-hosting/docker.mdx rename to apps/app/content/docs/self-hosting/docker.mdx diff --git a/content/docs/self-hosting/environment-variables.mdx b/apps/app/content/docs/self-hosting/environment-variables.mdx similarity index 96% rename from content/docs/self-hosting/environment-variables.mdx rename to apps/app/content/docs/self-hosting/environment-variables.mdx index 7bf1cda..0c0887a 100644 --- a/content/docs/self-hosting/environment-variables.mdx +++ b/apps/app/content/docs/self-hosting/environment-variables.mdx @@ -70,9 +70,6 @@ Required if you are offering paid plans (Pro, Agency) via Razorpay. ### AI Integration - `GEMINI_API_KEY` — Google Gemini API key used to power AI assistance in content modeling or block generation. -### Observability & Error Tracking -- `SENTRY_DSN` / `NEXT_PUBLIC_SENTRY_DSN` — DSN endpoints for Sentry error tracking on server-side and client-side respectively. - --- ## Example `.env` File diff --git a/content/docs/self-hosting/meta.json b/apps/app/content/docs/self-hosting/meta.json similarity index 100% rename from content/docs/self-hosting/meta.json rename to apps/app/content/docs/self-hosting/meta.json diff --git a/content/docs/self-hosting/upgrades.mdx b/apps/app/content/docs/self-hosting/upgrades.mdx similarity index 100% rename from content/docs/self-hosting/upgrades.mdx rename to apps/app/content/docs/self-hosting/upgrades.mdx diff --git a/eslint.config.mjs b/apps/app/eslint.config.mjs similarity index 96% rename from eslint.config.mjs rename to apps/app/eslint.config.mjs index 45c97f9..ca27223 100644 --- a/eslint.config.mjs +++ b/apps/app/eslint.config.mjs @@ -15,6 +15,7 @@ const eslintConfig = [ ignores: [ "node_modules/**", ".next/**", + ".source/**", "out/**", "build/**", "next-env.d.ts", diff --git a/apps/app/next.config.ts b/apps/app/next.config.ts new file mode 100644 index 0000000..269d479 --- /dev/null +++ b/apps/app/next.config.ts @@ -0,0 +1,8 @@ +import { createMDX } from "fumadocs-mdx/next"; +import type { NextConfig } from "next"; + +const withMDX = createMDX(); + +const nextConfig: NextConfig = {}; + +export default withMDX(nextConfig); diff --git a/apps/app/package.json b/apps/app/package.json new file mode 100644 index 0000000..bc68b57 --- /dev/null +++ b/apps/app/package.json @@ -0,0 +1,91 @@ +{ + "name": "@flowcms/app", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev --turbopack", + "build": "next build --turbopack", + "start": "next start", + "lint": "eslint", + "check-types": "tsc --noEmit" + }, + "dependencies": { + "@base-ui/react": "^1.4.1", + "@dnd-kit/core": "^6.3.1", + "@dnd-kit/sortable": "^10.0.0", + "@dnd-kit/utilities": "^3.2.2", + "@google/generative-ai": "^0.24.1", + "@hookform/resolvers": "^5.2.2", + "@prisma/adapter-pg": "^7.8.0", + "@prisma/client": "^7.8.0", + "@prisma/client-runtime-utils": "^7.8.0", + "@supabase/supabase-js": "^2.105.3", + "@tanstack/react-query": "^5.100.9", + "@tanstack/react-query-devtools": "^5.100.9", + "@tiptap/extension-image": "^3.22.5", + "@tiptap/pm": "^3.22.5", + "@tiptap/react": "^3.22.5", + "@tiptap/starter-kit": "^3.22.5", + "@types/mdx": "^2.0.13", + "@types/pg": "^8.20.0", + "@upstash/qstash": "^2.10.1", + "@upstash/ratelimit": "^2.0.8", + "@upstash/redis": "^1.38.0", + "@vercel/analytics": "^2.0.1", + "bcryptjs": "^3.0.3", + "better-auth": "^1.6.9", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "cmdk": "^1.1.1", + "date-fns": "^4.1.0", + "docx": "^9.6.1", + "embla-carousel-react": "^8.6.0", + "fumadocs-core": "15.8.5", + "fumadocs-mdx": "^13.0.8", + "fumadocs-mermaid": "^1.3.1", + "fumadocs-ui": "15.8.5", + "import-in-the-middle": "^3.0.1", + "input-otp": "^1.4.2", + "lucide-react": "^1.14.0", + "mermaid": "^11.15.0", + "motion": "^12.38.0", + "nanoid": "^5.1.11", + "next": "15.5.18", + "next-themes": "^0.4.6", + "pg": "^8.20.0", + "prisma": "^7.8.0", + "radix-ui": "^1.4.3", + "razorpay": "^2.9.6", + "react": "19.1.0", + "react-day-picker": "^10.0.0", + "react-dom": "19.1.0", + "react-hook-form": "^7.75.0", + "react-icons": "^5.6.0", + "react-resizable-panels": "^4.11.0", + "recharts": "3.8.0", + "require-in-the-middle": "^8.0.1", + "resend": "^6.12.3", + "shadcn": "^4.7.0", + "sonner": "^2.0.7", + "tailwind-merge": "^3.5.0", + "tw-animate-css": "^1.4.0", + "vaul": "^1.1.2", + "zod": "^4.4.3" + }, + "devDependencies": { + "@eslint/eslintrc": "^3", + "@react-email/components": "^1.0.12", + "@tailwindcss/postcss": "^4", + "@types/bcryptjs": "^3.0.0", + "@types/node": "^20", + "@types/react": "^19", + "@types/react-dom": "^19", + "dotenv": "^17.4.2", + "eslint": "^9", + "eslint-config-next": "15.5.18", + "prettier": "^3.8.3", + "react-email": "^6.1.1", + "tailwindcss": "^4", + "typescript": "^5" + } +} diff --git a/postcss.config.mjs b/apps/app/postcss.config.mjs similarity index 100% rename from postcss.config.mjs rename to apps/app/postcss.config.mjs diff --git a/prisma.config.ts b/apps/app/prisma.config.ts similarity index 100% rename from prisma.config.ts rename to apps/app/prisma.config.ts diff --git a/prisma/migrations/20260508075620_init/migration.sql b/apps/app/prisma/migrations/20260508075620_init/migration.sql similarity index 100% rename from prisma/migrations/20260508075620_init/migration.sql rename to apps/app/prisma/migrations/20260508075620_init/migration.sql diff --git a/prisma/migrations/20260508131010_update_all_schemas/migration.sql b/apps/app/prisma/migrations/20260508131010_update_all_schemas/migration.sql similarity index 100% rename from prisma/migrations/20260508131010_update_all_schemas/migration.sql rename to apps/app/prisma/migrations/20260508131010_update_all_schemas/migration.sql diff --git a/prisma/migrations/20260508131127_add_onboarded_flag/migration.sql b/apps/app/prisma/migrations/20260508131127_add_onboarded_flag/migration.sql similarity index 100% rename from prisma/migrations/20260508131127_add_onboarded_flag/migration.sql rename to apps/app/prisma/migrations/20260508131127_add_onboarded_flag/migration.sql diff --git a/prisma/migrations/20260509202105_production_foundation_upgrade/migration.sql b/apps/app/prisma/migrations/20260509202105_production_foundation_upgrade/migration.sql similarity index 100% rename from prisma/migrations/20260509202105_production_foundation_upgrade/migration.sql rename to apps/app/prisma/migrations/20260509202105_production_foundation_upgrade/migration.sql diff --git a/prisma/migrations/20260509204648_add_waitlist/migration.sql b/apps/app/prisma/migrations/20260509204648_add_waitlist/migration.sql similarity index 100% rename from prisma/migrations/20260509204648_add_waitlist/migration.sql rename to apps/app/prisma/migrations/20260509204648_add_waitlist/migration.sql diff --git a/prisma/migrations/20260509221740_add_invite_token_and_last_razorpay_event_date/migration.sql b/apps/app/prisma/migrations/20260509221740_add_invite_token_and_last_razorpay_event_date/migration.sql similarity index 100% rename from prisma/migrations/20260509221740_add_invite_token_and_last_razorpay_event_date/migration.sql rename to apps/app/prisma/migrations/20260509221740_add_invite_token_and_last_razorpay_event_date/migration.sql diff --git a/prisma/migrations/20260510131925_add_email_logs/migration.sql b/apps/app/prisma/migrations/20260510131925_add_email_logs/migration.sql similarity index 100% rename from prisma/migrations/20260510131925_add_email_logs/migration.sql rename to apps/app/prisma/migrations/20260510131925_add_email_logs/migration.sql diff --git a/prisma/migrations/20260510200409_add_waitlist_audit_logging/migration.sql b/apps/app/prisma/migrations/20260510200409_add_waitlist_audit_logging/migration.sql similarity index 100% rename from prisma/migrations/20260510200409_add_waitlist_audit_logging/migration.sql rename to apps/app/prisma/migrations/20260510200409_add_waitlist_audit_logging/migration.sql diff --git a/prisma/migrations/20260510223515_update_waitlist_roles/migration.sql b/apps/app/prisma/migrations/20260510223515_update_waitlist_roles/migration.sql similarity index 100% rename from prisma/migrations/20260510223515_update_waitlist_roles/migration.sql rename to apps/app/prisma/migrations/20260510223515_update_waitlist_roles/migration.sql diff --git a/prisma/migrations/20260510225121_add_referredby_index/migration.sql b/apps/app/prisma/migrations/20260510225121_add_referredby_index/migration.sql similarity index 100% rename from prisma/migrations/20260510225121_add_referredby_index/migration.sql rename to apps/app/prisma/migrations/20260510225121_add_referredby_index/migration.sql diff --git a/prisma/migrations/20260515185357_add_notification_relations_and_collections_renaming/migration.sql b/apps/app/prisma/migrations/20260515185357_add_notification_relations_and_collections_renaming/migration.sql similarity index 100% rename from prisma/migrations/20260515185357_add_notification_relations_and_collections_renaming/migration.sql rename to apps/app/prisma/migrations/20260515185357_add_notification_relations_and_collections_renaming/migration.sql diff --git a/prisma/migrations/20260522163821_remove_waitlist_system/migration.sql b/apps/app/prisma/migrations/20260522163821_remove_waitlist_system/migration.sql similarity index 100% rename from prisma/migrations/20260522163821_remove_waitlist_system/migration.sql rename to apps/app/prisma/migrations/20260522163821_remove_waitlist_system/migration.sql diff --git a/prisma/migrations/20260528234616_media_v2_refactor_phase1/migration.sql b/apps/app/prisma/migrations/20260528234616_media_v2_refactor_phase1/migration.sql similarity index 100% rename from prisma/migrations/20260528234616_media_v2_refactor_phase1/migration.sql rename to apps/app/prisma/migrations/20260528234616_media_v2_refactor_phase1/migration.sql diff --git a/prisma/migrations/20260528235348_media_v2_refactor_phase2/migration.sql b/apps/app/prisma/migrations/20260528235348_media_v2_refactor_phase2/migration.sql similarity index 100% rename from prisma/migrations/20260528235348_media_v2_refactor_phase2/migration.sql rename to apps/app/prisma/migrations/20260528235348_media_v2_refactor_phase2/migration.sql diff --git a/prisma/migrations/20260529130136_add_webhook_observability_fields/migration.sql b/apps/app/prisma/migrations/20260529130136_add_webhook_observability_fields/migration.sql similarity index 100% rename from prisma/migrations/20260529130136_add_webhook_observability_fields/migration.sql rename to apps/app/prisma/migrations/20260529130136_add_webhook_observability_fields/migration.sql diff --git a/prisma/migrations/20260529164758_add_webhook_events/migration.sql b/apps/app/prisma/migrations/20260529164758_add_webhook_events/migration.sql similarity index 100% rename from prisma/migrations/20260529164758_add_webhook_events/migration.sql rename to apps/app/prisma/migrations/20260529164758_add_webhook_events/migration.sql diff --git a/prisma/migrations/20260614091639_add_draft_token_security/migration.sql b/apps/app/prisma/migrations/20260614091639_add_draft_token_security/migration.sql similarity index 100% rename from prisma/migrations/20260614091639_add_draft_token_security/migration.sql rename to apps/app/prisma/migrations/20260614091639_add_draft_token_security/migration.sql diff --git a/prisma/migrations/20260614102451_add_invitation_security_actions/migration.sql b/apps/app/prisma/migrations/20260614102451_add_invitation_security_actions/migration.sql similarity index 100% rename from prisma/migrations/20260614102451_add_invitation_security_actions/migration.sql rename to apps/app/prisma/migrations/20260614102451_add_invitation_security_actions/migration.sql diff --git a/prisma/migrations/20260616055410_add_environment_isolation/migration.sql b/apps/app/prisma/migrations/20260616055410_add_environment_isolation/migration.sql similarity index 100% rename from prisma/migrations/20260616055410_add_environment_isolation/migration.sql rename to apps/app/prisma/migrations/20260616055410_add_environment_isolation/migration.sql diff --git a/prisma/migrations/20260619164500_entry_slug_uniqueness/migration.sql b/apps/app/prisma/migrations/20260619164500_entry_slug_uniqueness/migration.sql similarity index 100% rename from prisma/migrations/20260619164500_entry_slug_uniqueness/migration.sql rename to apps/app/prisma/migrations/20260619164500_entry_slug_uniqueness/migration.sql diff --git a/prisma/migrations/migration_lock.toml b/apps/app/prisma/migrations/migration_lock.toml similarity index 100% rename from prisma/migrations/migration_lock.toml rename to apps/app/prisma/migrations/migration_lock.toml diff --git a/prisma/schema.prisma b/apps/app/prisma/schema.prisma similarity index 93% rename from prisma/schema.prisma rename to apps/app/prisma/schema.prisma index 6695c64..f7a57a6 100644 --- a/prisma/schema.prisma +++ b/apps/app/prisma/schema.prisma @@ -90,6 +90,7 @@ model Workspace { customDomains CustomDomain[] razorpayCustomer RazorpayCustomer? notifications Notification[] + criticalErrors CriticalError[] } model WorkspaceMember { @@ -523,3 +524,41 @@ model Notification { @@index([workspaceId, read]) } + +// ── Error Tracking ────────────────────────────────────────────────── +enum ErrorStatus { + OPEN + INVESTIGATING + RESOLVED + IGNORED +} + +model CriticalError { + id String @id @default(cuid()) + fingerprint String @unique + errorName String? + message String @db.Text + route String? + method String? + environment String? + deploymentId String? + requestId String? + operation String? + userId String? + workspaceId String? + occurrenceCount Int @default(1) + firstSeenAt DateTime @default(now()) + lastSeenAt DateTime @default(now()) + status ErrorStatus @default(OPEN) + stack String? @db.Text + metadata Json? + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + workspace Workspace? @relation(fields: [workspaceId], references: [id], onDelete: Cascade) + + @@index([lastSeenAt]) + @@index([status]) + @@index([workspaceId]) +} + diff --git a/public/file.svg b/apps/app/public/file.svg similarity index 100% rename from public/file.svg rename to apps/app/public/file.svg diff --git a/public/full-logo.png b/apps/app/public/full-logo.png similarity index 100% rename from public/full-logo.png rename to apps/app/public/full-logo.png diff --git a/public/globe.svg b/apps/app/public/globe.svg similarity index 100% rename from public/globe.svg rename to apps/app/public/globe.svg diff --git a/public/logo.png b/apps/app/public/logo.png similarity index 100% rename from public/logo.png rename to apps/app/public/logo.png diff --git a/public/next.svg b/apps/app/public/next.svg similarity index 100% rename from public/next.svg rename to apps/app/public/next.svg diff --git a/public/robots.txt b/apps/app/public/robots.txt similarity index 100% rename from public/robots.txt rename to apps/app/public/robots.txt diff --git a/public/vercel.svg b/apps/app/public/vercel.svg similarity index 100% rename from public/vercel.svg rename to apps/app/public/vercel.svg diff --git a/public/window.svg b/apps/app/public/window.svg similarity index 100% rename from public/window.svg rename to apps/app/public/window.svg diff --git a/source.config.ts b/apps/app/source.config.ts similarity index 100% rename from source.config.ts rename to apps/app/source.config.ts diff --git a/src/app/(admin)/admin/billing/page.tsx b/apps/app/src/app/(admin)/admin/billing/page.tsx similarity index 100% rename from src/app/(admin)/admin/billing/page.tsx rename to apps/app/src/app/(admin)/admin/billing/page.tsx diff --git a/src/app/(admin)/admin/layout.tsx b/apps/app/src/app/(admin)/admin/layout.tsx similarity index 100% rename from src/app/(admin)/admin/layout.tsx rename to apps/app/src/app/(admin)/admin/layout.tsx diff --git a/src/app/(admin)/admin/logs/page.tsx b/apps/app/src/app/(admin)/admin/logs/page.tsx similarity index 100% rename from src/app/(admin)/admin/logs/page.tsx rename to apps/app/src/app/(admin)/admin/logs/page.tsx diff --git a/src/app/(admin)/admin/operations/actions.ts b/apps/app/src/app/(admin)/admin/operations/actions.ts similarity index 100% rename from src/app/(admin)/admin/operations/actions.ts rename to apps/app/src/app/(admin)/admin/operations/actions.ts diff --git a/src/app/(admin)/admin/operations/page.tsx b/apps/app/src/app/(admin)/admin/operations/page.tsx similarity index 100% rename from src/app/(admin)/admin/operations/page.tsx rename to apps/app/src/app/(admin)/admin/operations/page.tsx diff --git a/src/app/(admin)/admin/operations/sync-button.tsx b/apps/app/src/app/(admin)/admin/operations/sync-button.tsx similarity index 100% rename from src/app/(admin)/admin/operations/sync-button.tsx rename to apps/app/src/app/(admin)/admin/operations/sync-button.tsx diff --git a/src/app/(admin)/admin/users/page.tsx b/apps/app/src/app/(admin)/admin/users/page.tsx similarity index 100% rename from src/app/(admin)/admin/users/page.tsx rename to apps/app/src/app/(admin)/admin/users/page.tsx diff --git a/src/app/(auth)/auth/forgot-password/page.tsx b/apps/app/src/app/(auth)/auth/forgot-password/page.tsx similarity index 100% rename from src/app/(auth)/auth/forgot-password/page.tsx rename to apps/app/src/app/(auth)/auth/forgot-password/page.tsx diff --git a/src/app/(auth)/auth/layout.tsx b/apps/app/src/app/(auth)/auth/layout.tsx similarity index 100% rename from src/app/(auth)/auth/layout.tsx rename to apps/app/src/app/(auth)/auth/layout.tsx diff --git a/src/app/(auth)/auth/login/page.tsx b/apps/app/src/app/(auth)/auth/login/page.tsx similarity index 100% rename from src/app/(auth)/auth/login/page.tsx rename to apps/app/src/app/(auth)/auth/login/page.tsx diff --git a/src/app/(auth)/auth/register/page.tsx b/apps/app/src/app/(auth)/auth/register/page.tsx similarity index 100% rename from src/app/(auth)/auth/register/page.tsx rename to apps/app/src/app/(auth)/auth/register/page.tsx diff --git a/src/app/(auth)/auth/reset-password/page.tsx b/apps/app/src/app/(auth)/auth/reset-password/page.tsx similarity index 100% rename from src/app/(auth)/auth/reset-password/page.tsx rename to apps/app/src/app/(auth)/auth/reset-password/page.tsx diff --git a/src/app/(auth)/auth/reset-password/reset-password-form.tsx b/apps/app/src/app/(auth)/auth/reset-password/reset-password-form.tsx similarity index 100% rename from src/app/(auth)/auth/reset-password/reset-password-form.tsx rename to apps/app/src/app/(auth)/auth/reset-password/reset-password-form.tsx diff --git a/src/app/(auth)/auth/verify-email/page.tsx b/apps/app/src/app/(auth)/auth/verify-email/page.tsx similarity index 100% rename from src/app/(auth)/auth/verify-email/page.tsx rename to apps/app/src/app/(auth)/auth/verify-email/page.tsx diff --git a/src/app/(dashboard)/dashboard/api-explorer/page.tsx b/apps/app/src/app/(dashboard)/dashboard/api-explorer/page.tsx similarity index 100% rename from src/app/(dashboard)/dashboard/api-explorer/page.tsx rename to apps/app/src/app/(dashboard)/dashboard/api-explorer/page.tsx diff --git a/src/app/(dashboard)/dashboard/api-keys/page.tsx b/apps/app/src/app/(dashboard)/dashboard/api-keys/page.tsx similarity index 100% rename from src/app/(dashboard)/dashboard/api-keys/page.tsx rename to apps/app/src/app/(dashboard)/dashboard/api-keys/page.tsx diff --git a/src/app/(dashboard)/dashboard/audit-logs/page.tsx b/apps/app/src/app/(dashboard)/dashboard/audit-logs/page.tsx similarity index 100% rename from src/app/(dashboard)/dashboard/audit-logs/page.tsx rename to apps/app/src/app/(dashboard)/dashboard/audit-logs/page.tsx diff --git a/src/app/(dashboard)/dashboard/billing/page.tsx b/apps/app/src/app/(dashboard)/dashboard/billing/page.tsx similarity index 100% rename from src/app/(dashboard)/dashboard/billing/page.tsx rename to apps/app/src/app/(dashboard)/dashboard/billing/page.tsx diff --git a/src/app/(dashboard)/dashboard/collections/[id]/entries/[entryId]/page.tsx b/apps/app/src/app/(dashboard)/dashboard/collections/[id]/entries/[entryId]/page.tsx similarity index 100% rename from src/app/(dashboard)/dashboard/collections/[id]/entries/[entryId]/page.tsx rename to apps/app/src/app/(dashboard)/dashboard/collections/[id]/entries/[entryId]/page.tsx diff --git a/src/app/(dashboard)/dashboard/collections/[id]/entries/new/page.tsx b/apps/app/src/app/(dashboard)/dashboard/collections/[id]/entries/new/page.tsx similarity index 100% rename from src/app/(dashboard)/dashboard/collections/[id]/entries/new/page.tsx rename to apps/app/src/app/(dashboard)/dashboard/collections/[id]/entries/new/page.tsx diff --git a/src/app/(dashboard)/dashboard/collections/[id]/entries/page.tsx b/apps/app/src/app/(dashboard)/dashboard/collections/[id]/entries/page.tsx similarity index 100% rename from src/app/(dashboard)/dashboard/collections/[id]/entries/page.tsx rename to apps/app/src/app/(dashboard)/dashboard/collections/[id]/entries/page.tsx diff --git a/src/app/(dashboard)/dashboard/collections/[id]/page.tsx b/apps/app/src/app/(dashboard)/dashboard/collections/[id]/page.tsx similarity index 100% rename from src/app/(dashboard)/dashboard/collections/[id]/page.tsx rename to apps/app/src/app/(dashboard)/dashboard/collections/[id]/page.tsx diff --git a/src/app/(dashboard)/dashboard/collections/new/page.tsx b/apps/app/src/app/(dashboard)/dashboard/collections/new/page.tsx similarity index 100% rename from src/app/(dashboard)/dashboard/collections/new/page.tsx rename to apps/app/src/app/(dashboard)/dashboard/collections/new/page.tsx diff --git a/src/app/(dashboard)/dashboard/collections/page.tsx b/apps/app/src/app/(dashboard)/dashboard/collections/page.tsx similarity index 100% rename from src/app/(dashboard)/dashboard/collections/page.tsx rename to apps/app/src/app/(dashboard)/dashboard/collections/page.tsx diff --git a/src/app/(dashboard)/dashboard/environments/page.tsx b/apps/app/src/app/(dashboard)/dashboard/environments/page.tsx similarity index 100% rename from src/app/(dashboard)/dashboard/environments/page.tsx rename to apps/app/src/app/(dashboard)/dashboard/environments/page.tsx diff --git a/src/app/(dashboard)/dashboard/media/page.tsx b/apps/app/src/app/(dashboard)/dashboard/media/page.tsx similarity index 100% rename from src/app/(dashboard)/dashboard/media/page.tsx rename to apps/app/src/app/(dashboard)/dashboard/media/page.tsx diff --git a/src/app/(dashboard)/dashboard/page.tsx b/apps/app/src/app/(dashboard)/dashboard/page.tsx similarity index 100% rename from src/app/(dashboard)/dashboard/page.tsx rename to apps/app/src/app/(dashboard)/dashboard/page.tsx diff --git a/src/app/(dashboard)/dashboard/preview/[collectionId]/[entryId]/page.tsx b/apps/app/src/app/(dashboard)/dashboard/preview/[collectionId]/[entryId]/page.tsx similarity index 100% rename from src/app/(dashboard)/dashboard/preview/[collectionId]/[entryId]/page.tsx rename to apps/app/src/app/(dashboard)/dashboard/preview/[collectionId]/[entryId]/page.tsx diff --git a/src/app/(dashboard)/dashboard/settings/page.tsx b/apps/app/src/app/(dashboard)/dashboard/settings/page.tsx similarity index 100% rename from src/app/(dashboard)/dashboard/settings/page.tsx rename to apps/app/src/app/(dashboard)/dashboard/settings/page.tsx diff --git a/src/app/(dashboard)/dashboard/team/page.tsx b/apps/app/src/app/(dashboard)/dashboard/team/page.tsx similarity index 100% rename from src/app/(dashboard)/dashboard/team/page.tsx rename to apps/app/src/app/(dashboard)/dashboard/team/page.tsx diff --git a/src/app/(dashboard)/dashboard/usage/page.tsx b/apps/app/src/app/(dashboard)/dashboard/usage/page.tsx similarity index 100% rename from src/app/(dashboard)/dashboard/usage/page.tsx rename to apps/app/src/app/(dashboard)/dashboard/usage/page.tsx diff --git a/src/app/(dashboard)/dashboard/webhooks/[id]/page.tsx b/apps/app/src/app/(dashboard)/dashboard/webhooks/[id]/page.tsx similarity index 100% rename from src/app/(dashboard)/dashboard/webhooks/[id]/page.tsx rename to apps/app/src/app/(dashboard)/dashboard/webhooks/[id]/page.tsx diff --git a/src/app/(dashboard)/dashboard/webhooks/page.tsx b/apps/app/src/app/(dashboard)/dashboard/webhooks/page.tsx similarity index 100% rename from src/app/(dashboard)/dashboard/webhooks/page.tsx rename to apps/app/src/app/(dashboard)/dashboard/webhooks/page.tsx diff --git a/src/app/(dashboard)/layout.tsx b/apps/app/src/app/(dashboard)/layout.tsx similarity index 100% rename from src/app/(dashboard)/layout.tsx rename to apps/app/src/app/(dashboard)/layout.tsx diff --git a/src/app/api/auth/[...all]/route.ts b/apps/app/src/app/api/auth/[...all]/route.ts similarity index 100% rename from src/app/api/auth/[...all]/route.ts rename to apps/app/src/app/api/auth/[...all]/route.ts diff --git a/src/app/api/auth/invite/[token]/route.ts b/apps/app/src/app/api/auth/invite/[token]/route.ts similarity index 100% rename from src/app/api/auth/invite/[token]/route.ts rename to apps/app/src/app/api/auth/invite/[token]/route.ts diff --git a/src/app/api/auth/register-workspace/route.ts b/apps/app/src/app/api/auth/register-workspace/route.ts similarity index 100% rename from src/app/api/auth/register-workspace/route.ts rename to apps/app/src/app/api/auth/register-workspace/route.ts diff --git a/src/app/api/billing/checkout/route.ts b/apps/app/src/app/api/billing/checkout/route.ts similarity index 100% rename from src/app/api/billing/checkout/route.ts rename to apps/app/src/app/api/billing/checkout/route.ts diff --git a/src/app/api/billing/webhook/route.ts b/apps/app/src/app/api/billing/webhook/route.ts similarity index 100% rename from src/app/api/billing/webhook/route.ts rename to apps/app/src/app/api/billing/webhook/route.ts diff --git a/src/app/api/dashboard/analytics/route.ts b/apps/app/src/app/api/dashboard/analytics/route.ts similarity index 100% rename from src/app/api/dashboard/analytics/route.ts rename to apps/app/src/app/api/dashboard/analytics/route.ts diff --git a/src/app/api/dashboard/stats/route.ts b/apps/app/src/app/api/dashboard/stats/route.ts similarity index 100% rename from src/app/api/dashboard/stats/route.ts rename to apps/app/src/app/api/dashboard/stats/route.ts diff --git a/src/app/api/health/route.ts b/apps/app/src/app/api/health/route.ts similarity index 100% rename from src/app/api/health/route.ts rename to apps/app/src/app/api/health/route.ts diff --git a/src/app/api/internal/admin/stats/route.ts b/apps/app/src/app/api/internal/admin/stats/route.ts similarity index 100% rename from src/app/api/internal/admin/stats/route.ts rename to apps/app/src/app/api/internal/admin/stats/route.ts diff --git a/src/app/api/internal/ai/seo/route.ts b/apps/app/src/app/api/internal/ai/seo/route.ts similarity index 100% rename from src/app/api/internal/ai/seo/route.ts rename to apps/app/src/app/api/internal/ai/seo/route.ts diff --git a/src/app/api/internal/api-explorer/run/route.ts b/apps/app/src/app/api/internal/api-explorer/run/route.ts similarity index 100% rename from src/app/api/internal/api-explorer/run/route.ts rename to apps/app/src/app/api/internal/api-explorer/run/route.ts diff --git a/src/app/api/internal/api-keys/route.ts b/apps/app/src/app/api/internal/api-keys/route.ts similarity index 100% rename from src/app/api/internal/api-keys/route.ts rename to apps/app/src/app/api/internal/api-keys/route.ts diff --git a/src/app/api/internal/audit-logs/[workspaceId]/route.ts b/apps/app/src/app/api/internal/audit-logs/[workspaceId]/route.ts similarity index 100% rename from src/app/api/internal/audit-logs/[workspaceId]/route.ts rename to apps/app/src/app/api/internal/audit-logs/[workspaceId]/route.ts diff --git a/src/app/api/internal/collections/[id]/route.ts b/apps/app/src/app/api/internal/collections/[id]/route.ts similarity index 100% rename from src/app/api/internal/collections/[id]/route.ts rename to apps/app/src/app/api/internal/collections/[id]/route.ts diff --git a/src/app/api/internal/collections/apply-template/route.ts b/apps/app/src/app/api/internal/collections/apply-template/route.ts similarity index 100% rename from src/app/api/internal/collections/apply-template/route.ts rename to apps/app/src/app/api/internal/collections/apply-template/route.ts diff --git a/src/app/api/internal/collections/route.ts b/apps/app/src/app/api/internal/collections/route.ts similarity index 95% rename from src/app/api/internal/collections/route.ts rename to apps/app/src/app/api/internal/collections/route.ts index 4d4e9f3..997fe6f 100644 --- a/src/app/api/internal/collections/route.ts +++ b/apps/app/src/app/api/internal/collections/route.ts @@ -10,8 +10,6 @@ import { isAdminEmail } from "@/lib/admin"; import { dispatchWebhooks } from "@/lib/webhooks"; -import * as Sentry from "@sentry/nextjs"; - export const runtime = "nodejs"; export async function GET() { @@ -24,7 +22,7 @@ export async function GET() { }); return apiSuccess(collections); } catch (error) { - Sentry.captureException(error); + logger.error("Failed to fetch collections", { error }); return apiError("INTERNAL_ERROR", "Failed to fetch collections"); } } @@ -84,7 +82,7 @@ export async function POST(req: NextRequest) { if (error instanceof ForbiddenError) { return apiError("FORBIDDEN", error.message); } - Sentry.captureException(error); + logger.error("Failed to create collection", { error }); return apiError("INTERNAL_ERROR", "Failed to create collection"); } } diff --git a/src/app/api/internal/entries/[id]/publish/route.ts b/apps/app/src/app/api/internal/entries/[id]/publish/route.ts similarity index 100% rename from src/app/api/internal/entries/[id]/publish/route.ts rename to apps/app/src/app/api/internal/entries/[id]/publish/route.ts diff --git a/src/app/api/internal/entries/[id]/route.ts b/apps/app/src/app/api/internal/entries/[id]/route.ts similarity index 100% rename from src/app/api/internal/entries/[id]/route.ts rename to apps/app/src/app/api/internal/entries/[id]/route.ts diff --git a/src/app/api/internal/entries/route.ts b/apps/app/src/app/api/internal/entries/route.ts similarity index 100% rename from src/app/api/internal/entries/route.ts rename to apps/app/src/app/api/internal/entries/route.ts diff --git a/src/app/api/internal/environments/[envId]/route.ts b/apps/app/src/app/api/internal/environments/[envId]/route.ts similarity index 100% rename from src/app/api/internal/environments/[envId]/route.ts rename to apps/app/src/app/api/internal/environments/[envId]/route.ts diff --git a/src/app/api/internal/environments/route.ts b/apps/app/src/app/api/internal/environments/route.ts similarity index 100% rename from src/app/api/internal/environments/route.ts rename to apps/app/src/app/api/internal/environments/route.ts diff --git a/src/app/api/internal/media/[id]/route.ts b/apps/app/src/app/api/internal/media/[id]/route.ts similarity index 100% rename from src/app/api/internal/media/[id]/route.ts rename to apps/app/src/app/api/internal/media/[id]/route.ts diff --git a/src/app/api/internal/media/[id]/usage/route.ts b/apps/app/src/app/api/internal/media/[id]/usage/route.ts similarity index 100% rename from src/app/api/internal/media/[id]/usage/route.ts rename to apps/app/src/app/api/internal/media/[id]/usage/route.ts diff --git a/src/app/api/internal/media/bulk/route.ts b/apps/app/src/app/api/internal/media/bulk/route.ts similarity index 100% rename from src/app/api/internal/media/bulk/route.ts rename to apps/app/src/app/api/internal/media/bulk/route.ts diff --git a/src/app/api/internal/media/folders/[id]/route.ts b/apps/app/src/app/api/internal/media/folders/[id]/route.ts similarity index 100% rename from src/app/api/internal/media/folders/[id]/route.ts rename to apps/app/src/app/api/internal/media/folders/[id]/route.ts diff --git a/src/app/api/internal/media/folders/route.ts b/apps/app/src/app/api/internal/media/folders/route.ts similarity index 100% rename from src/app/api/internal/media/folders/route.ts rename to apps/app/src/app/api/internal/media/folders/route.ts diff --git a/src/app/api/internal/media/route.ts b/apps/app/src/app/api/internal/media/route.ts similarity index 100% rename from src/app/api/internal/media/route.ts rename to apps/app/src/app/api/internal/media/route.ts diff --git a/src/app/api/internal/members/[userId]/route.ts b/apps/app/src/app/api/internal/members/[userId]/route.ts similarity index 100% rename from src/app/api/internal/members/[userId]/route.ts rename to apps/app/src/app/api/internal/members/[userId]/route.ts diff --git a/src/app/api/internal/onboarding/complete/route.ts b/apps/app/src/app/api/internal/onboarding/complete/route.ts similarity index 100% rename from src/app/api/internal/onboarding/complete/route.ts rename to apps/app/src/app/api/internal/onboarding/complete/route.ts diff --git a/src/app/api/internal/usage/[workspaceId]/requests/route.ts b/apps/app/src/app/api/internal/usage/[workspaceId]/requests/route.ts similarity index 100% rename from src/app/api/internal/usage/[workspaceId]/requests/route.ts rename to apps/app/src/app/api/internal/usage/[workspaceId]/requests/route.ts diff --git a/src/app/api/internal/usage/[workspaceId]/route.ts b/apps/app/src/app/api/internal/usage/[workspaceId]/route.ts similarity index 100% rename from src/app/api/internal/usage/[workspaceId]/route.ts rename to apps/app/src/app/api/internal/usage/[workspaceId]/route.ts diff --git a/src/app/api/internal/usage/route.ts b/apps/app/src/app/api/internal/usage/route.ts similarity index 100% rename from src/app/api/internal/usage/route.ts rename to apps/app/src/app/api/internal/usage/route.ts diff --git a/src/app/api/internal/webhooks/deliveries/[id]/replay/route.ts b/apps/app/src/app/api/internal/webhooks/deliveries/[id]/replay/route.ts similarity index 100% rename from src/app/api/internal/webhooks/deliveries/[id]/replay/route.ts rename to apps/app/src/app/api/internal/webhooks/deliveries/[id]/replay/route.ts diff --git a/src/app/api/internal/webhooks/qstash-callback/route.ts b/apps/app/src/app/api/internal/webhooks/qstash-callback/route.ts similarity index 100% rename from src/app/api/internal/webhooks/qstash-callback/route.ts rename to apps/app/src/app/api/internal/webhooks/qstash-callback/route.ts diff --git a/src/app/api/internal/webhooks/route.ts b/apps/app/src/app/api/internal/webhooks/route.ts similarity index 100% rename from src/app/api/internal/webhooks/route.ts rename to apps/app/src/app/api/internal/webhooks/route.ts diff --git a/src/app/api/internal/workspace/invitations/[id]/route.ts b/apps/app/src/app/api/internal/workspace/invitations/[id]/route.ts similarity index 100% rename from src/app/api/internal/workspace/invitations/[id]/route.ts rename to apps/app/src/app/api/internal/workspace/invitations/[id]/route.ts diff --git a/src/app/api/internal/workspace/invitations/route.ts b/apps/app/src/app/api/internal/workspace/invitations/route.ts similarity index 100% rename from src/app/api/internal/workspace/invitations/route.ts rename to apps/app/src/app/api/internal/workspace/invitations/route.ts diff --git a/src/app/api/internal/workspace/route.ts b/apps/app/src/app/api/internal/workspace/route.ts similarity index 100% rename from src/app/api/internal/workspace/route.ts rename to apps/app/src/app/api/internal/workspace/route.ts diff --git a/src/app/api/maintenance/notify/route.ts b/apps/app/src/app/api/maintenance/notify/route.ts similarity index 100% rename from src/app/api/maintenance/notify/route.ts rename to apps/app/src/app/api/maintenance/notify/route.ts diff --git a/src/app/api/v1/collections/[slug]/route.ts b/apps/app/src/app/api/v1/collections/[slug]/route.ts similarity index 100% rename from src/app/api/v1/collections/[slug]/route.ts rename to apps/app/src/app/api/v1/collections/[slug]/route.ts diff --git a/src/app/api/v1/collections/route.ts b/apps/app/src/app/api/v1/collections/route.ts similarity index 100% rename from src/app/api/v1/collections/route.ts rename to apps/app/src/app/api/v1/collections/route.ts diff --git a/src/app/api/v1/entries/[collectionSlug]/[entrySlug]/route.ts b/apps/app/src/app/api/v1/entries/[collectionSlug]/[entrySlug]/route.ts similarity index 100% rename from src/app/api/v1/entries/[collectionSlug]/[entrySlug]/route.ts rename to apps/app/src/app/api/v1/entries/[collectionSlug]/[entrySlug]/route.ts diff --git a/src/app/api/v1/entries/[collectionSlug]/route.ts b/apps/app/src/app/api/v1/entries/[collectionSlug]/route.ts similarity index 100% rename from src/app/api/v1/entries/[collectionSlug]/route.ts rename to apps/app/src/app/api/v1/entries/[collectionSlug]/route.ts diff --git a/src/app/api/v1/media/route.ts b/apps/app/src/app/api/v1/media/route.ts similarity index 100% rename from src/app/api/v1/media/route.ts rename to apps/app/src/app/api/v1/media/route.ts diff --git a/src/app/api/v1/workspace/route.ts b/apps/app/src/app/api/v1/workspace/route.ts similarity index 100% rename from src/app/api/v1/workspace/route.ts rename to apps/app/src/app/api/v1/workspace/route.ts diff --git a/src/app/auth/error/page.tsx b/apps/app/src/app/auth/error/page.tsx similarity index 100% rename from src/app/auth/error/page.tsx rename to apps/app/src/app/auth/error/page.tsx diff --git a/src/app/docs/[[...slug]]/page.tsx b/apps/app/src/app/docs/[[...slug]]/page.tsx similarity index 100% rename from src/app/docs/[[...slug]]/page.tsx rename to apps/app/src/app/docs/[[...slug]]/page.tsx diff --git a/src/app/docs/layout.tsx b/apps/app/src/app/docs/layout.tsx similarity index 100% rename from src/app/docs/layout.tsx rename to apps/app/src/app/docs/layout.tsx diff --git a/src/app/docs/not-found.tsx b/apps/app/src/app/docs/not-found.tsx similarity index 100% rename from src/app/docs/not-found.tsx rename to apps/app/src/app/docs/not-found.tsx diff --git a/src/app/error.tsx b/apps/app/src/app/error.tsx similarity index 100% rename from src/app/error.tsx rename to apps/app/src/app/error.tsx diff --git a/src/app/favicon.ico b/apps/app/src/app/favicon.ico similarity index 100% rename from src/app/favicon.ico rename to apps/app/src/app/favicon.ico diff --git a/src/app/global-error.tsx b/apps/app/src/app/global-error.tsx similarity index 90% rename from src/app/global-error.tsx rename to apps/app/src/app/global-error.tsx index 5f2036f..8b60e2c 100644 --- a/src/app/global-error.tsx +++ b/apps/app/src/app/global-error.tsx @@ -1,6 +1,5 @@ "use client"; -import * as Sentry from "@sentry/nextjs"; import { useEffect } from "react"; import { APP_CONFIG } from "@/config/app"; import { Button } from "@/components/ui/button"; @@ -14,7 +13,7 @@ export default function GlobalError({ reset: () => void; }) { useEffect(() => { - Sentry.captureException(error); + console.error("[GlobalError] Uncaught error boundary exception:", error); }, [error]); return ( @@ -26,7 +25,7 @@ export default function GlobalError({ System Error

- An unexpected infrastructure failure has occurred. Our engineering team has been notified via Sentry. + An unexpected application error has occurred.

diff --git a/src/app/globals.css b/apps/app/src/app/globals.css similarity index 100% rename from src/app/globals.css rename to apps/app/src/app/globals.css diff --git a/src/app/landing-client.tsx b/apps/app/src/app/landing-client.tsx similarity index 100% rename from src/app/landing-client.tsx rename to apps/app/src/app/landing-client.tsx diff --git a/src/app/layout.tsx b/apps/app/src/app/layout.tsx similarity index 100% rename from src/app/layout.tsx rename to apps/app/src/app/layout.tsx diff --git a/src/app/maintainance/page.tsx b/apps/app/src/app/maintainance/page.tsx similarity index 100% rename from src/app/maintainance/page.tsx rename to apps/app/src/app/maintainance/page.tsx diff --git a/src/app/maintenance/page.tsx b/apps/app/src/app/maintenance/page.tsx similarity index 100% rename from src/app/maintenance/page.tsx rename to apps/app/src/app/maintenance/page.tsx diff --git a/src/app/not-found.tsx b/apps/app/src/app/not-found.tsx similarity index 100% rename from src/app/not-found.tsx rename to apps/app/src/app/not-found.tsx diff --git a/src/app/onboarding/layout.tsx b/apps/app/src/app/onboarding/layout.tsx similarity index 100% rename from src/app/onboarding/layout.tsx rename to apps/app/src/app/onboarding/layout.tsx diff --git a/src/app/onboarding/page.tsx b/apps/app/src/app/onboarding/page.tsx similarity index 100% rename from src/app/onboarding/page.tsx rename to apps/app/src/app/onboarding/page.tsx diff --git a/src/app/page.tsx b/apps/app/src/app/page.tsx similarity index 100% rename from src/app/page.tsx rename to apps/app/src/app/page.tsx diff --git a/src/app/sitemap.ts b/apps/app/src/app/sitemap.ts similarity index 100% rename from src/app/sitemap.ts rename to apps/app/src/app/sitemap.ts diff --git a/src/components/admin/AdminSidebar.tsx b/apps/app/src/components/admin/AdminSidebar.tsx similarity index 100% rename from src/components/admin/AdminSidebar.tsx rename to apps/app/src/components/admin/AdminSidebar.tsx diff --git a/src/components/admin/operations-tools.tsx b/apps/app/src/components/admin/operations-tools.tsx similarity index 100% rename from src/components/admin/operations-tools.tsx rename to apps/app/src/components/admin/operations-tools.tsx diff --git a/src/components/auth/resend-verification.tsx b/apps/app/src/components/auth/resend-verification.tsx similarity index 100% rename from src/components/auth/resend-verification.tsx rename to apps/app/src/components/auth/resend-verification.tsx diff --git a/src/components/auth/social-auth.tsx b/apps/app/src/components/auth/social-auth.tsx similarity index 100% rename from src/components/auth/social-auth.tsx rename to apps/app/src/components/auth/social-auth.tsx diff --git a/src/components/content-types/FieldBuilder.tsx b/apps/app/src/components/content-types/FieldBuilder.tsx similarity index 100% rename from src/components/content-types/FieldBuilder.tsx rename to apps/app/src/components/content-types/FieldBuilder.tsx diff --git a/src/components/dashboard/analytics/ApiUsageChart.tsx b/apps/app/src/components/dashboard/analytics/ApiUsageChart.tsx similarity index 100% rename from src/components/dashboard/analytics/ApiUsageChart.tsx rename to apps/app/src/components/dashboard/analytics/ApiUsageChart.tsx diff --git a/src/components/dashboard/analytics/PublishingStatusChart.tsx b/apps/app/src/components/dashboard/analytics/PublishingStatusChart.tsx similarity index 100% rename from src/components/dashboard/analytics/PublishingStatusChart.tsx rename to apps/app/src/components/dashboard/analytics/PublishingStatusChart.tsx diff --git a/src/components/dashboard/analytics/WorkspaceGrowthChart.tsx b/apps/app/src/components/dashboard/analytics/WorkspaceGrowthChart.tsx similarity index 100% rename from src/components/dashboard/analytics/WorkspaceGrowthChart.tsx rename to apps/app/src/components/dashboard/analytics/WorkspaceGrowthChart.tsx diff --git a/src/components/dashboard/command-palette.tsx b/apps/app/src/components/dashboard/command-palette.tsx similarity index 100% rename from src/components/dashboard/command-palette.tsx rename to apps/app/src/components/dashboard/command-palette.tsx diff --git a/src/components/dashboard/entries/media-picker-modal.tsx b/apps/app/src/components/dashboard/entries/media-picker-modal.tsx similarity index 100% rename from src/components/dashboard/entries/media-picker-modal.tsx rename to apps/app/src/components/dashboard/entries/media-picker-modal.tsx diff --git a/src/components/dashboard/entries/reference-picker.tsx b/apps/app/src/components/dashboard/entries/reference-picker.tsx similarity index 100% rename from src/components/dashboard/entries/reference-picker.tsx rename to apps/app/src/components/dashboard/entries/reference-picker.tsx diff --git a/src/components/dashboard/entries/sandbox-preview.tsx b/apps/app/src/components/dashboard/entries/sandbox-preview.tsx similarity index 100% rename from src/components/dashboard/entries/sandbox-preview.tsx rename to apps/app/src/components/dashboard/entries/sandbox-preview.tsx diff --git a/src/components/dashboard/onboarding/DeveloperQuickActions.tsx b/apps/app/src/components/dashboard/onboarding/DeveloperQuickActions.tsx similarity index 100% rename from src/components/dashboard/onboarding/DeveloperQuickActions.tsx rename to apps/app/src/components/dashboard/onboarding/DeveloperQuickActions.tsx diff --git a/src/components/dashboard/onboarding/FirstApiCallWidget.tsx b/apps/app/src/components/dashboard/onboarding/FirstApiCallWidget.tsx similarity index 100% rename from src/components/dashboard/onboarding/FirstApiCallWidget.tsx rename to apps/app/src/components/dashboard/onboarding/FirstApiCallWidget.tsx diff --git a/src/components/dashboard/onboarding/OnboardingChecklist.tsx b/apps/app/src/components/dashboard/onboarding/OnboardingChecklist.tsx similarity index 100% rename from src/components/dashboard/onboarding/OnboardingChecklist.tsx rename to apps/app/src/components/dashboard/onboarding/OnboardingChecklist.tsx diff --git a/src/components/dashboard/onboarding/QuickstartGuide.tsx b/apps/app/src/components/dashboard/onboarding/QuickstartGuide.tsx similarity index 100% rename from src/components/dashboard/onboarding/QuickstartGuide.tsx rename to apps/app/src/components/dashboard/onboarding/QuickstartGuide.tsx diff --git a/src/components/dashboard/onboarding/RecentActivityFeed.tsx b/apps/app/src/components/dashboard/onboarding/RecentActivityFeed.tsx similarity index 100% rename from src/components/dashboard/onboarding/RecentActivityFeed.tsx rename to apps/app/src/components/dashboard/onboarding/RecentActivityFeed.tsx diff --git a/src/components/dashboard/onboarding/WelcomeCard.tsx b/apps/app/src/components/dashboard/onboarding/WelcomeCard.tsx similarity index 100% rename from src/components/dashboard/onboarding/WelcomeCard.tsx rename to apps/app/src/components/dashboard/onboarding/WelcomeCard.tsx diff --git a/src/components/dashboard/settings/billing-plans.tsx b/apps/app/src/components/dashboard/settings/billing-plans.tsx similarity index 100% rename from src/components/dashboard/settings/billing-plans.tsx rename to apps/app/src/components/dashboard/settings/billing-plans.tsx diff --git a/src/components/dashboard/settings/team-management.tsx b/apps/app/src/components/dashboard/settings/team-management.tsx similarity index 100% rename from src/components/dashboard/settings/team-management.tsx rename to apps/app/src/components/dashboard/settings/team-management.tsx diff --git a/src/components/dashboard/sidebar.tsx b/apps/app/src/components/dashboard/sidebar.tsx similarity index 100% rename from src/components/dashboard/sidebar.tsx rename to apps/app/src/components/dashboard/sidebar.tsx diff --git a/src/components/dashboard/templates/page-template-browser.tsx b/apps/app/src/components/dashboard/templates/page-template-browser.tsx similarity index 100% rename from src/components/dashboard/templates/page-template-browser.tsx rename to apps/app/src/components/dashboard/templates/page-template-browser.tsx diff --git a/src/components/dashboard/templates/template-browser.tsx b/apps/app/src/components/dashboard/templates/template-browser.tsx similarity index 100% rename from src/components/dashboard/templates/template-browser.tsx rename to apps/app/src/components/dashboard/templates/template-browser.tsx diff --git a/src/components/dashboard/topbar.tsx b/apps/app/src/components/dashboard/topbar.tsx similarity index 100% rename from src/components/dashboard/topbar.tsx rename to apps/app/src/components/dashboard/topbar.tsx diff --git a/src/components/dashboard/webhooks/deliveries-list.tsx b/apps/app/src/components/dashboard/webhooks/deliveries-list.tsx similarity index 100% rename from src/components/dashboard/webhooks/deliveries-list.tsx rename to apps/app/src/components/dashboard/webhooks/deliveries-list.tsx diff --git a/src/components/editor/BlockEditor.tsx b/apps/app/src/components/editor/BlockEditor.tsx similarity index 100% rename from src/components/editor/BlockEditor.tsx rename to apps/app/src/components/editor/BlockEditor.tsx diff --git a/src/components/editor/blocks.tsx b/apps/app/src/components/editor/blocks.tsx similarity index 100% rename from src/components/editor/blocks.tsx rename to apps/app/src/components/editor/blocks.tsx diff --git a/src/components/emails/api-key-notification.tsx b/apps/app/src/components/emails/api-key-notification.tsx similarity index 100% rename from src/components/emails/api-key-notification.tsx rename to apps/app/src/components/emails/api-key-notification.tsx diff --git a/src/components/emails/content-published.tsx b/apps/app/src/components/emails/content-published.tsx similarity index 100% rename from src/components/emails/content-published.tsx rename to apps/app/src/components/emails/content-published.tsx diff --git a/src/components/emails/email-layout.tsx b/apps/app/src/components/emails/email-layout.tsx similarity index 100% rename from src/components/emails/email-layout.tsx rename to apps/app/src/components/emails/email-layout.tsx diff --git a/src/components/emails/index.ts b/apps/app/src/components/emails/index.ts similarity index 100% rename from src/components/emails/index.ts rename to apps/app/src/components/emails/index.ts diff --git a/src/components/emails/marketing-update.tsx b/apps/app/src/components/emails/marketing-update.tsx similarity index 100% rename from src/components/emails/marketing-update.tsx rename to apps/app/src/components/emails/marketing-update.tsx diff --git a/src/components/emails/onboarding-sequence.tsx b/apps/app/src/components/emails/onboarding-sequence.tsx similarity index 100% rename from src/components/emails/onboarding-sequence.tsx rename to apps/app/src/components/emails/onboarding-sequence.tsx diff --git a/src/components/emails/password-reset.tsx b/apps/app/src/components/emails/password-reset.tsx similarity index 100% rename from src/components/emails/password-reset.tsx rename to apps/app/src/components/emails/password-reset.tsx diff --git a/src/components/emails/plan-notification.tsx b/apps/app/src/components/emails/plan-notification.tsx similarity index 100% rename from src/components/emails/plan-notification.tsx rename to apps/app/src/components/emails/plan-notification.tsx diff --git a/src/components/emails/re-engagement.tsx b/apps/app/src/components/emails/re-engagement.tsx similarity index 100% rename from src/components/emails/re-engagement.tsx rename to apps/app/src/components/emails/re-engagement.tsx diff --git a/src/components/emails/team-member-joined.tsx b/apps/app/src/components/emails/team-member-joined.tsx similarity index 100% rename from src/components/emails/team-member-joined.tsx rename to apps/app/src/components/emails/team-member-joined.tsx diff --git a/src/components/emails/usage-alert.tsx b/apps/app/src/components/emails/usage-alert.tsx similarity index 100% rename from src/components/emails/usage-alert.tsx rename to apps/app/src/components/emails/usage-alert.tsx diff --git a/src/components/emails/verification-email.tsx b/apps/app/src/components/emails/verification-email.tsx similarity index 100% rename from src/components/emails/verification-email.tsx rename to apps/app/src/components/emails/verification-email.tsx diff --git a/src/components/emails/workspace-export-ready.tsx b/apps/app/src/components/emails/workspace-export-ready.tsx similarity index 100% rename from src/components/emails/workspace-export-ready.tsx rename to apps/app/src/components/emails/workspace-export-ready.tsx diff --git a/src/components/emails/workspace-invite.tsx b/apps/app/src/components/emails/workspace-invite.tsx similarity index 100% rename from src/components/emails/workspace-invite.tsx rename to apps/app/src/components/emails/workspace-invite.tsx diff --git a/src/components/icons/index.tsx b/apps/app/src/components/icons/index.tsx similarity index 100% rename from src/components/icons/index.tsx rename to apps/app/src/components/icons/index.tsx diff --git a/src/components/landing/Comparison.tsx b/apps/app/src/components/landing/Comparison.tsx similarity index 100% rename from src/components/landing/Comparison.tsx rename to apps/app/src/components/landing/Comparison.tsx diff --git a/src/components/landing/FAQ.tsx b/apps/app/src/components/landing/FAQ.tsx similarity index 100% rename from src/components/landing/FAQ.tsx rename to apps/app/src/components/landing/FAQ.tsx diff --git a/src/components/landing/LandingIcons.tsx b/apps/app/src/components/landing/LandingIcons.tsx similarity index 100% rename from src/components/landing/LandingIcons.tsx rename to apps/app/src/components/landing/LandingIcons.tsx diff --git a/src/components/landing/LiveDemo.tsx b/apps/app/src/components/landing/LiveDemo.tsx similarity index 100% rename from src/components/landing/LiveDemo.tsx rename to apps/app/src/components/landing/LiveDemo.tsx diff --git a/src/components/landing/MobileNav.tsx b/apps/app/src/components/landing/MobileNav.tsx similarity index 100% rename from src/components/landing/MobileNav.tsx rename to apps/app/src/components/landing/MobileNav.tsx diff --git a/src/components/landing/NavCTA.tsx b/apps/app/src/components/landing/NavCTA.tsx similarity index 100% rename from src/components/landing/NavCTA.tsx rename to apps/app/src/components/landing/NavCTA.tsx diff --git a/src/components/landing/NavLinks.tsx b/apps/app/src/components/landing/NavLinks.tsx similarity index 100% rename from src/components/landing/NavLinks.tsx rename to apps/app/src/components/landing/NavLinks.tsx diff --git a/src/components/landing/Navbar.tsx b/apps/app/src/components/landing/Navbar.tsx similarity index 100% rename from src/components/landing/Navbar.tsx rename to apps/app/src/components/landing/Navbar.tsx diff --git a/src/components/landing/ThemeSwitcher.tsx b/apps/app/src/components/landing/ThemeSwitcher.tsx similarity index 100% rename from src/components/landing/ThemeSwitcher.tsx rename to apps/app/src/components/landing/ThemeSwitcher.tsx diff --git a/src/components/landing/Ticker.tsx b/apps/app/src/components/landing/Ticker.tsx similarity index 100% rename from src/components/landing/Ticker.tsx rename to apps/app/src/components/landing/Ticker.tsx diff --git a/src/components/landing/UseCases.tsx b/apps/app/src/components/landing/UseCases.tsx similarity index 100% rename from src/components/landing/UseCases.tsx rename to apps/app/src/components/landing/UseCases.tsx diff --git a/src/components/landing/footer.tsx b/apps/app/src/components/landing/footer.tsx similarity index 100% rename from src/components/landing/footer.tsx rename to apps/app/src/components/landing/footer.tsx diff --git a/src/components/onboarding/steps/deployment-step.tsx b/apps/app/src/components/onboarding/steps/deployment-step.tsx similarity index 100% rename from src/components/onboarding/steps/deployment-step.tsx rename to apps/app/src/components/onboarding/steps/deployment-step.tsx diff --git a/src/components/onboarding/steps/tutorial-step.tsx b/apps/app/src/components/onboarding/steps/tutorial-step.tsx similarity index 100% rename from src/components/onboarding/steps/tutorial-step.tsx rename to apps/app/src/components/onboarding/steps/tutorial-step.tsx diff --git a/src/components/onboarding/steps/welcome-step.tsx b/apps/app/src/components/onboarding/steps/welcome-step.tsx similarity index 100% rename from src/components/onboarding/steps/welcome-step.tsx rename to apps/app/src/components/onboarding/steps/welcome-step.tsx diff --git a/src/components/onboarding/steps/workspace-step.tsx b/apps/app/src/components/onboarding/steps/workspace-step.tsx similarity index 100% rename from src/components/onboarding/steps/workspace-step.tsx rename to apps/app/src/components/onboarding/steps/workspace-step.tsx diff --git a/src/components/preview/BlockRenderer.tsx b/apps/app/src/components/preview/BlockRenderer.tsx similarity index 100% rename from src/components/preview/BlockRenderer.tsx rename to apps/app/src/components/preview/BlockRenderer.tsx diff --git a/src/components/theme-provider.tsx b/apps/app/src/components/theme-provider.tsx similarity index 100% rename from src/components/theme-provider.tsx rename to apps/app/src/components/theme-provider.tsx diff --git a/src/components/ui/accordion.tsx b/apps/app/src/components/ui/accordion.tsx similarity index 100% rename from src/components/ui/accordion.tsx rename to apps/app/src/components/ui/accordion.tsx diff --git a/src/components/ui/alert-dialog.tsx b/apps/app/src/components/ui/alert-dialog.tsx similarity index 100% rename from src/components/ui/alert-dialog.tsx rename to apps/app/src/components/ui/alert-dialog.tsx diff --git a/src/components/ui/alert.tsx b/apps/app/src/components/ui/alert.tsx similarity index 100% rename from src/components/ui/alert.tsx rename to apps/app/src/components/ui/alert.tsx diff --git a/src/components/ui/aspect-ratio.tsx b/apps/app/src/components/ui/aspect-ratio.tsx similarity index 100% rename from src/components/ui/aspect-ratio.tsx rename to apps/app/src/components/ui/aspect-ratio.tsx diff --git a/src/components/ui/avatar.tsx b/apps/app/src/components/ui/avatar.tsx similarity index 100% rename from src/components/ui/avatar.tsx rename to apps/app/src/components/ui/avatar.tsx diff --git a/src/components/ui/badge.tsx b/apps/app/src/components/ui/badge.tsx similarity index 100% rename from src/components/ui/badge.tsx rename to apps/app/src/components/ui/badge.tsx diff --git a/src/components/ui/breadcrumb.tsx b/apps/app/src/components/ui/breadcrumb.tsx similarity index 100% rename from src/components/ui/breadcrumb.tsx rename to apps/app/src/components/ui/breadcrumb.tsx diff --git a/src/components/ui/button-group.tsx b/apps/app/src/components/ui/button-group.tsx similarity index 100% rename from src/components/ui/button-group.tsx rename to apps/app/src/components/ui/button-group.tsx diff --git a/src/components/ui/button.tsx b/apps/app/src/components/ui/button.tsx similarity index 100% rename from src/components/ui/button.tsx rename to apps/app/src/components/ui/button.tsx diff --git a/src/components/ui/calendar.tsx b/apps/app/src/components/ui/calendar.tsx similarity index 100% rename from src/components/ui/calendar.tsx rename to apps/app/src/components/ui/calendar.tsx diff --git a/src/components/ui/card.tsx b/apps/app/src/components/ui/card.tsx similarity index 100% rename from src/components/ui/card.tsx rename to apps/app/src/components/ui/card.tsx diff --git a/src/components/ui/carousel.tsx b/apps/app/src/components/ui/carousel.tsx similarity index 100% rename from src/components/ui/carousel.tsx rename to apps/app/src/components/ui/carousel.tsx diff --git a/src/components/ui/chart.tsx b/apps/app/src/components/ui/chart.tsx similarity index 100% rename from src/components/ui/chart.tsx rename to apps/app/src/components/ui/chart.tsx diff --git a/src/components/ui/checkbox.tsx b/apps/app/src/components/ui/checkbox.tsx similarity index 100% rename from src/components/ui/checkbox.tsx rename to apps/app/src/components/ui/checkbox.tsx diff --git a/src/components/ui/collapsible.tsx b/apps/app/src/components/ui/collapsible.tsx similarity index 100% rename from src/components/ui/collapsible.tsx rename to apps/app/src/components/ui/collapsible.tsx diff --git a/src/components/ui/combobox.tsx b/apps/app/src/components/ui/combobox.tsx similarity index 100% rename from src/components/ui/combobox.tsx rename to apps/app/src/components/ui/combobox.tsx diff --git a/src/components/ui/command.tsx b/apps/app/src/components/ui/command.tsx similarity index 100% rename from src/components/ui/command.tsx rename to apps/app/src/components/ui/command.tsx diff --git a/src/components/ui/context-menu.tsx b/apps/app/src/components/ui/context-menu.tsx similarity index 100% rename from src/components/ui/context-menu.tsx rename to apps/app/src/components/ui/context-menu.tsx diff --git a/src/components/ui/dialog.tsx b/apps/app/src/components/ui/dialog.tsx similarity index 100% rename from src/components/ui/dialog.tsx rename to apps/app/src/components/ui/dialog.tsx diff --git a/src/components/ui/direction.tsx b/apps/app/src/components/ui/direction.tsx similarity index 100% rename from src/components/ui/direction.tsx rename to apps/app/src/components/ui/direction.tsx diff --git a/src/components/ui/drawer.tsx b/apps/app/src/components/ui/drawer.tsx similarity index 100% rename from src/components/ui/drawer.tsx rename to apps/app/src/components/ui/drawer.tsx diff --git a/src/components/ui/dropdown-menu.tsx b/apps/app/src/components/ui/dropdown-menu.tsx similarity index 100% rename from src/components/ui/dropdown-menu.tsx rename to apps/app/src/components/ui/dropdown-menu.tsx diff --git a/src/components/ui/empty.tsx b/apps/app/src/components/ui/empty.tsx similarity index 100% rename from src/components/ui/empty.tsx rename to apps/app/src/components/ui/empty.tsx diff --git a/src/components/ui/field.tsx b/apps/app/src/components/ui/field.tsx similarity index 100% rename from src/components/ui/field.tsx rename to apps/app/src/components/ui/field.tsx diff --git a/src/components/ui/hover-card.tsx b/apps/app/src/components/ui/hover-card.tsx similarity index 100% rename from src/components/ui/hover-card.tsx rename to apps/app/src/components/ui/hover-card.tsx diff --git a/src/components/ui/input-group.tsx b/apps/app/src/components/ui/input-group.tsx similarity index 100% rename from src/components/ui/input-group.tsx rename to apps/app/src/components/ui/input-group.tsx diff --git a/src/components/ui/input-otp.tsx b/apps/app/src/components/ui/input-otp.tsx similarity index 100% rename from src/components/ui/input-otp.tsx rename to apps/app/src/components/ui/input-otp.tsx diff --git a/src/components/ui/input.tsx b/apps/app/src/components/ui/input.tsx similarity index 100% rename from src/components/ui/input.tsx rename to apps/app/src/components/ui/input.tsx diff --git a/src/components/ui/item.tsx b/apps/app/src/components/ui/item.tsx similarity index 100% rename from src/components/ui/item.tsx rename to apps/app/src/components/ui/item.tsx diff --git a/src/components/ui/kbd.tsx b/apps/app/src/components/ui/kbd.tsx similarity index 100% rename from src/components/ui/kbd.tsx rename to apps/app/src/components/ui/kbd.tsx diff --git a/src/components/ui/label.tsx b/apps/app/src/components/ui/label.tsx similarity index 100% rename from src/components/ui/label.tsx rename to apps/app/src/components/ui/label.tsx diff --git a/src/components/ui/menubar.tsx b/apps/app/src/components/ui/menubar.tsx similarity index 100% rename from src/components/ui/menubar.tsx rename to apps/app/src/components/ui/menubar.tsx diff --git a/src/components/ui/native-select.tsx b/apps/app/src/components/ui/native-select.tsx similarity index 100% rename from src/components/ui/native-select.tsx rename to apps/app/src/components/ui/native-select.tsx diff --git a/src/components/ui/navigation-menu.tsx b/apps/app/src/components/ui/navigation-menu.tsx similarity index 100% rename from src/components/ui/navigation-menu.tsx rename to apps/app/src/components/ui/navigation-menu.tsx diff --git a/src/components/ui/pagination.tsx b/apps/app/src/components/ui/pagination.tsx similarity index 100% rename from src/components/ui/pagination.tsx rename to apps/app/src/components/ui/pagination.tsx diff --git a/src/components/ui/popover.tsx b/apps/app/src/components/ui/popover.tsx similarity index 100% rename from src/components/ui/popover.tsx rename to apps/app/src/components/ui/popover.tsx diff --git a/src/components/ui/progress.tsx b/apps/app/src/components/ui/progress.tsx similarity index 100% rename from src/components/ui/progress.tsx rename to apps/app/src/components/ui/progress.tsx diff --git a/src/components/ui/radio-group.tsx b/apps/app/src/components/ui/radio-group.tsx similarity index 100% rename from src/components/ui/radio-group.tsx rename to apps/app/src/components/ui/radio-group.tsx diff --git a/src/components/ui/resizable.tsx b/apps/app/src/components/ui/resizable.tsx similarity index 100% rename from src/components/ui/resizable.tsx rename to apps/app/src/components/ui/resizable.tsx diff --git a/src/components/ui/scroll-area.tsx b/apps/app/src/components/ui/scroll-area.tsx similarity index 100% rename from src/components/ui/scroll-area.tsx rename to apps/app/src/components/ui/scroll-area.tsx diff --git a/src/components/ui/select.tsx b/apps/app/src/components/ui/select.tsx similarity index 100% rename from src/components/ui/select.tsx rename to apps/app/src/components/ui/select.tsx diff --git a/src/components/ui/separator.tsx b/apps/app/src/components/ui/separator.tsx similarity index 100% rename from src/components/ui/separator.tsx rename to apps/app/src/components/ui/separator.tsx diff --git a/src/components/ui/sheet.tsx b/apps/app/src/components/ui/sheet.tsx similarity index 100% rename from src/components/ui/sheet.tsx rename to apps/app/src/components/ui/sheet.tsx diff --git a/src/components/ui/sidebar.tsx b/apps/app/src/components/ui/sidebar.tsx similarity index 100% rename from src/components/ui/sidebar.tsx rename to apps/app/src/components/ui/sidebar.tsx diff --git a/src/components/ui/skeleton.tsx b/apps/app/src/components/ui/skeleton.tsx similarity index 100% rename from src/components/ui/skeleton.tsx rename to apps/app/src/components/ui/skeleton.tsx diff --git a/src/components/ui/slider.tsx b/apps/app/src/components/ui/slider.tsx similarity index 100% rename from src/components/ui/slider.tsx rename to apps/app/src/components/ui/slider.tsx diff --git a/src/components/ui/sonner.tsx b/apps/app/src/components/ui/sonner.tsx similarity index 100% rename from src/components/ui/sonner.tsx rename to apps/app/src/components/ui/sonner.tsx diff --git a/src/components/ui/spinner.tsx b/apps/app/src/components/ui/spinner.tsx similarity index 100% rename from src/components/ui/spinner.tsx rename to apps/app/src/components/ui/spinner.tsx diff --git a/src/components/ui/switch.tsx b/apps/app/src/components/ui/switch.tsx similarity index 100% rename from src/components/ui/switch.tsx rename to apps/app/src/components/ui/switch.tsx diff --git a/src/components/ui/table.tsx b/apps/app/src/components/ui/table.tsx similarity index 100% rename from src/components/ui/table.tsx rename to apps/app/src/components/ui/table.tsx diff --git a/src/components/ui/tabs.tsx b/apps/app/src/components/ui/tabs.tsx similarity index 100% rename from src/components/ui/tabs.tsx rename to apps/app/src/components/ui/tabs.tsx diff --git a/src/components/ui/textarea.tsx b/apps/app/src/components/ui/textarea.tsx similarity index 100% rename from src/components/ui/textarea.tsx rename to apps/app/src/components/ui/textarea.tsx diff --git a/src/components/ui/toggle-group.tsx b/apps/app/src/components/ui/toggle-group.tsx similarity index 100% rename from src/components/ui/toggle-group.tsx rename to apps/app/src/components/ui/toggle-group.tsx diff --git a/src/components/ui/toggle.tsx b/apps/app/src/components/ui/toggle.tsx similarity index 100% rename from src/components/ui/toggle.tsx rename to apps/app/src/components/ui/toggle.tsx diff --git a/src/components/ui/tooltip.tsx b/apps/app/src/components/ui/tooltip.tsx similarity index 100% rename from src/components/ui/tooltip.tsx rename to apps/app/src/components/ui/tooltip.tsx diff --git a/src/config/app.ts b/apps/app/src/config/app.ts similarity index 100% rename from src/config/app.ts rename to apps/app/src/config/app.ts diff --git a/src/config/templates/collections.ts b/apps/app/src/config/templates/collections.ts similarity index 100% rename from src/config/templates/collections.ts rename to apps/app/src/config/templates/collections.ts diff --git a/src/config/templates/pages.ts b/apps/app/src/config/templates/pages.ts similarity index 100% rename from src/config/templates/pages.ts rename to apps/app/src/config/templates/pages.ts diff --git a/src/hooks/use-api-keys.ts b/apps/app/src/hooks/use-api-keys.ts similarity index 100% rename from src/hooks/use-api-keys.ts rename to apps/app/src/hooks/use-api-keys.ts diff --git a/src/hooks/use-audit-logs.ts b/apps/app/src/hooks/use-audit-logs.ts similarity index 100% rename from src/hooks/use-audit-logs.ts rename to apps/app/src/hooks/use-audit-logs.ts diff --git a/src/hooks/use-collections.ts b/apps/app/src/hooks/use-collections.ts similarity index 100% rename from src/hooks/use-collections.ts rename to apps/app/src/hooks/use-collections.ts diff --git a/src/hooks/use-dashboard-analytics.ts b/apps/app/src/hooks/use-dashboard-analytics.ts similarity index 100% rename from src/hooks/use-dashboard-analytics.ts rename to apps/app/src/hooks/use-dashboard-analytics.ts diff --git a/src/hooks/use-dashboard-stats.ts b/apps/app/src/hooks/use-dashboard-stats.ts similarity index 100% rename from src/hooks/use-dashboard-stats.ts rename to apps/app/src/hooks/use-dashboard-stats.ts diff --git a/src/hooks/use-entries.ts b/apps/app/src/hooks/use-entries.ts similarity index 100% rename from src/hooks/use-entries.ts rename to apps/app/src/hooks/use-entries.ts diff --git a/src/hooks/use-environments.ts b/apps/app/src/hooks/use-environments.ts similarity index 100% rename from src/hooks/use-environments.ts rename to apps/app/src/hooks/use-environments.ts diff --git a/src/hooks/use-media.ts b/apps/app/src/hooks/use-media.ts similarity index 100% rename from src/hooks/use-media.ts rename to apps/app/src/hooks/use-media.ts diff --git a/src/hooks/use-mobile.ts b/apps/app/src/hooks/use-mobile.ts similarity index 100% rename from src/hooks/use-mobile.ts rename to apps/app/src/hooks/use-mobile.ts diff --git a/src/hooks/use-usage.ts b/apps/app/src/hooks/use-usage.ts similarity index 100% rename from src/hooks/use-usage.ts rename to apps/app/src/hooks/use-usage.ts diff --git a/src/hooks/use-webhooks.ts b/apps/app/src/hooks/use-webhooks.ts similarity index 100% rename from src/hooks/use-webhooks.ts rename to apps/app/src/hooks/use-webhooks.ts diff --git a/src/hooks/use-workspace.ts b/apps/app/src/hooks/use-workspace.ts similarity index 100% rename from src/hooks/use-workspace.ts rename to apps/app/src/hooks/use-workspace.ts diff --git a/src/lib/admin.ts b/apps/app/src/lib/admin.ts similarity index 100% rename from src/lib/admin.ts rename to apps/app/src/lib/admin.ts diff --git a/src/lib/ai.ts b/apps/app/src/lib/ai.ts similarity index 100% rename from src/lib/ai.ts rename to apps/app/src/lib/ai.ts diff --git a/src/lib/api-key.ts b/apps/app/src/lib/api-key.ts similarity index 100% rename from src/lib/api-key.ts rename to apps/app/src/lib/api-key.ts diff --git a/src/lib/audit.ts b/apps/app/src/lib/audit.ts similarity index 100% rename from src/lib/audit.ts rename to apps/app/src/lib/audit.ts diff --git a/src/lib/auth-client.ts b/apps/app/src/lib/auth-client.ts similarity index 100% rename from src/lib/auth-client.ts rename to apps/app/src/lib/auth-client.ts diff --git a/src/lib/auth.ts b/apps/app/src/lib/auth.ts similarity index 100% rename from src/lib/auth.ts rename to apps/app/src/lib/auth.ts diff --git a/src/lib/cache-control.ts b/apps/app/src/lib/cache-control.ts similarity index 100% rename from src/lib/cache-control.ts rename to apps/app/src/lib/cache-control.ts diff --git a/src/lib/cache.ts b/apps/app/src/lib/cache.ts similarity index 100% rename from src/lib/cache.ts rename to apps/app/src/lib/cache.ts diff --git a/src/lib/cloudflare.ts b/apps/app/src/lib/cloudflare.ts similarity index 100% rename from src/lib/cloudflare.ts rename to apps/app/src/lib/cloudflare.ts diff --git a/src/lib/email/index.ts b/apps/app/src/lib/email/index.ts similarity index 100% rename from src/lib/email/index.ts rename to apps/app/src/lib/email/index.ts diff --git a/apps/app/src/lib/errors/capture-critical-error.ts b/apps/app/src/lib/errors/capture-critical-error.ts new file mode 100644 index 0000000..19eece6 --- /dev/null +++ b/apps/app/src/lib/errors/capture-critical-error.ts @@ -0,0 +1,157 @@ +import crypto from "crypto"; +import { prisma } from "../prisma"; + +export interface CriticalErrorContext { + route?: string; + method?: string; + operation?: string; + requestId?: string; + userId?: string; + workspaceId?: string; + deploymentId?: string; + metadata?: Record; +} + +const SENSITIVE_KEY_PATTERN = /(password|token|secret|authorization|auth|cookie|key|credential|bearer|cvv|card)/i; + +const THROTTLE_WINDOW_MS = 5000; +const recentFingerprints = new Map(); + +function sanitizeValue(key: string, value: unknown): unknown { + if (SENSITIVE_KEY_PATTERN.test(key)) { + return "[REDACTED]"; + } + if (typeof value === "object" && value !== null && !Array.isArray(value)) { + const sanitizedObj: Record = {}; + for (const [k, v] of Object.entries(value)) { + sanitizedObj[k] = sanitizeValue(k, v); + } + return sanitizedObj; + } + return value; +} + +function sanitizeMetadata(metadata?: Record): Record | undefined { + if (!metadata) return undefined; + const result: Record = {}; + for (const [k, v] of Object.entries(metadata)) { + result[k] = sanitizeValue(k, v); + } + return result; +} + +export function normalizeErrorMessage(msg: string): string { + if (!msg) return ""; + return msg + .replace(/[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}/g, "{uuid}") + .replace(/\bc[a-z0-9]{24}\b/g, "{cuid}") + .replace(/\b[0-9a-fA-F]{24,64}\b/g, "{hash}") + .replace(/\b\d+\b/g, "{num}") + .trim(); +} + +export function generateErrorFingerprint( + errorName: string, + normalizedMessage: string, + route = "", + operation = "" +): string { + const payload = `${errorName.trim()}:${normalizedMessage.trim()}:${route.trim()}:${operation.trim()}`; + return crypto.createHash("sha256").update(payload).digest("hex").substring(0, 32); +} + +export async function captureCriticalError( + error: unknown, + context: CriticalErrorContext = {} +): Promise { + try { + const errObj = error instanceof Error ? error : new Error(typeof error === "string" ? error : String(error)); + const errorName = errObj.name || "Error"; + const rawMessage = errObj.message || "Unknown error"; + const normalizedMessage = normalizeErrorMessage(rawMessage); + const stackTrace = errObj.stack ? errObj.stack.substring(0, 4000) : null; + const boundedMessage = rawMessage.substring(0, 2000); + + const route = context.route || null; + const method = context.method || null; + const operation = context.operation || null; + const requestId = context.requestId || null; + const userId = context.userId || null; + const workspaceId = context.workspaceId || null; + const deploymentId = context.deploymentId || process.env.VERCEL_DEPLOYMENT_ID || null; + const environment = process.env.NODE_ENV || "development"; + + const sanitizedMeta = sanitizeMetadata(context.metadata); + + const fingerprint = generateErrorFingerprint(errorName, normalizedMessage, route || "", operation || ""); + + // 1. Structured log output for runtime environment (Vercel / Cloudwatch) + console.error( + JSON.stringify({ + level: "critical", + event: "critical_error", + fingerprint, + errorName, + message: boundedMessage, + normalizedMessage, + route, + method, + operation, + requestId, + environment, + timestamp: new Date().toISOString(), + }) + ); + + // 2. In-Memory Burst Throttling Check + const now = Date.now(); + const existing = recentFingerprints.get(fingerprint); + if (existing && now - existing.lastSaved < THROTTLE_WINDOW_MS) { + existing.pendingCount += 1; + return; + } + + const addedCount = existing ? existing.pendingCount + 1 : 1; + recentFingerprints.set(fingerprint, { lastSaved: now, pendingCount: 0 }); + + // Prune old entries from throttle cache to prevent memory leaks + if (recentFingerprints.size > 1000) { + for (const [fp, data] of recentFingerprints.entries()) { + if (now - data.lastSaved > THROTTLE_WINDOW_MS * 2) { + recentFingerprints.delete(fp); + } + } + } + + // 3. Database Upsert Aggregation + await prisma.criticalError.upsert({ + where: { fingerprint }, + update: { + occurrenceCount: { increment: addedCount }, + lastSeenAt: new Date(), + }, + create: { + fingerprint, + errorName, + message: boundedMessage, + route, + method, + environment, + deploymentId, + requestId, + operation, + userId, + workspaceId, + occurrenceCount: addedCount, + firstSeenAt: new Date(), + lastSeenAt: new Date(), + status: "OPEN", + stack: stackTrace, + metadata: sanitizedMeta ? (sanitizedMeta as any) : undefined, + }, + }); + } catch (err) { + // Fail-safe: error tracking failure must NEVER throw outward + console.error("[captureCriticalError] Failure in tracking pipeline:", err); + } +} diff --git a/src/lib/launch.ts b/apps/app/src/lib/launch.ts similarity index 100% rename from src/lib/launch.ts rename to apps/app/src/lib/launch.ts diff --git a/src/lib/logger.ts b/apps/app/src/lib/logger.ts similarity index 60% rename from src/lib/logger.ts rename to apps/app/src/lib/logger.ts index 351664f..998c8fd 100644 --- a/src/lib/logger.ts +++ b/apps/app/src/lib/logger.ts @@ -1,4 +1,4 @@ -import * as Sentry from "@sentry/nextjs"; +import { captureCriticalError } from "./errors/capture-critical-error"; type LogLevel = "debug" | "info" | "warn" | "error"; @@ -34,19 +34,20 @@ function log( console[method](`${prefix} ${message}${ctx}`); } - // 2. Sentry Integration + // 2. Lightweight Critical Error Tracking if (level === "error") { - Sentry.captureException(context.error || new Error(message), { - extra: context, - tags: { - workspaceId: context.workspaceId as string, - subscriptionId: context.subscriptionId as string - } - }); - } else if (level === "warn") { - Sentry.captureMessage(message, { - level: "warning", - extra: context, + const err = (context.error as Error) || new Error(message); + const { route, method, operation, requestId, userId, workspaceId, ...meta } = context; + captureCriticalError(err, { + route: typeof route === "string" ? route : undefined, + method: typeof method === "string" ? method : undefined, + operation: typeof operation === "string" ? operation : undefined, + requestId: typeof requestId === "string" ? requestId : undefined, + userId: typeof userId === "string" ? userId : undefined, + workspaceId: typeof workspaceId === "string" ? workspaceId : undefined, + metadata: meta, + }).catch((e) => { + console.error("[logger] captureCriticalError failed:", e); }); } } diff --git a/src/lib/plans.ts b/apps/app/src/lib/plans.ts similarity index 100% rename from src/lib/plans.ts rename to apps/app/src/lib/plans.ts diff --git a/src/lib/preview.ts b/apps/app/src/lib/preview.ts similarity index 100% rename from src/lib/preview.ts rename to apps/app/src/lib/preview.ts diff --git a/src/lib/prisma.ts b/apps/app/src/lib/prisma.ts similarity index 100% rename from src/lib/prisma.ts rename to apps/app/src/lib/prisma.ts diff --git a/src/lib/qstash.ts b/apps/app/src/lib/qstash.ts similarity index 100% rename from src/lib/qstash.ts rename to apps/app/src/lib/qstash.ts diff --git a/src/lib/rate-limit.ts b/apps/app/src/lib/rate-limit.ts similarity index 100% rename from src/lib/rate-limit.ts rename to apps/app/src/lib/rate-limit.ts diff --git a/src/lib/razorpay.ts b/apps/app/src/lib/razorpay.ts similarity index 100% rename from src/lib/razorpay.ts rename to apps/app/src/lib/razorpay.ts diff --git a/src/lib/routes.ts b/apps/app/src/lib/routes.ts similarity index 100% rename from src/lib/routes.ts rename to apps/app/src/lib/routes.ts diff --git a/src/lib/security/tokens.ts b/apps/app/src/lib/security/tokens.ts similarity index 100% rename from src/lib/security/tokens.ts rename to apps/app/src/lib/security/tokens.ts diff --git a/src/lib/session.ts b/apps/app/src/lib/session.ts similarity index 100% rename from src/lib/session.ts rename to apps/app/src/lib/session.ts diff --git a/src/lib/source.ts b/apps/app/src/lib/source.ts similarity index 100% rename from src/lib/source.ts rename to apps/app/src/lib/source.ts diff --git a/src/lib/storage/index.ts b/apps/app/src/lib/storage/index.ts similarity index 100% rename from src/lib/storage/index.ts rename to apps/app/src/lib/storage/index.ts diff --git a/src/lib/storage/providers/local.ts b/apps/app/src/lib/storage/providers/local.ts similarity index 100% rename from src/lib/storage/providers/local.ts rename to apps/app/src/lib/storage/providers/local.ts diff --git a/src/lib/storage/providers/supabase.ts b/apps/app/src/lib/storage/providers/supabase.ts similarity index 100% rename from src/lib/storage/providers/supabase.ts rename to apps/app/src/lib/storage/providers/supabase.ts diff --git a/src/lib/storage/types.ts b/apps/app/src/lib/storage/types.ts similarity index 100% rename from src/lib/storage/types.ts rename to apps/app/src/lib/storage/types.ts diff --git a/src/lib/supabase.ts b/apps/app/src/lib/supabase.ts similarity index 100% rename from src/lib/supabase.ts rename to apps/app/src/lib/supabase.ts diff --git a/src/lib/usage.ts b/apps/app/src/lib/usage.ts similarity index 100% rename from src/lib/usage.ts rename to apps/app/src/lib/usage.ts diff --git a/src/lib/utils.ts b/apps/app/src/lib/utils.ts similarity index 100% rename from src/lib/utils.ts rename to apps/app/src/lib/utils.ts diff --git a/src/lib/validations/api-key.ts b/apps/app/src/lib/validations/api-key.ts similarity index 100% rename from src/lib/validations/api-key.ts rename to apps/app/src/lib/validations/api-key.ts diff --git a/src/lib/validations/auth.ts b/apps/app/src/lib/validations/auth.ts similarity index 100% rename from src/lib/validations/auth.ts rename to apps/app/src/lib/validations/auth.ts diff --git a/src/lib/validations/collection.ts b/apps/app/src/lib/validations/collection.ts similarity index 100% rename from src/lib/validations/collection.ts rename to apps/app/src/lib/validations/collection.ts diff --git a/src/lib/validations/common.ts b/apps/app/src/lib/validations/common.ts similarity index 100% rename from src/lib/validations/common.ts rename to apps/app/src/lib/validations/common.ts diff --git a/src/lib/validations/entry.ts b/apps/app/src/lib/validations/entry.ts similarity index 100% rename from src/lib/validations/entry.ts rename to apps/app/src/lib/validations/entry.ts diff --git a/src/lib/validations/page.ts b/apps/app/src/lib/validations/page.ts similarity index 100% rename from src/lib/validations/page.ts rename to apps/app/src/lib/validations/page.ts diff --git a/src/lib/validations/webhook.ts b/apps/app/src/lib/validations/webhook.ts similarity index 100% rename from src/lib/validations/webhook.ts rename to apps/app/src/lib/validations/webhook.ts diff --git a/src/lib/validations/workspace.ts b/apps/app/src/lib/validations/workspace.ts similarity index 100% rename from src/lib/validations/workspace.ts rename to apps/app/src/lib/validations/workspace.ts diff --git a/src/lib/webhooks.ts b/apps/app/src/lib/webhooks.ts similarity index 100% rename from src/lib/webhooks.ts rename to apps/app/src/lib/webhooks.ts diff --git a/src/middleware.ts b/apps/app/src/middleware.ts similarity index 76% rename from src/middleware.ts rename to apps/app/src/middleware.ts index 5ad9029..d59501f 100644 --- a/src/middleware.ts +++ b/apps/app/src/middleware.ts @@ -10,21 +10,6 @@ import { export async function middleware(request: NextRequest) { const { pathname } = request.nextUrl; - // Maintenance mode flag (can be toggled via NEXT_PUBLIC_MAINTENANCE_MODE env var, defaults to true) - const isMaintenanceActive = process.env.NEXT_PUBLIC_MAINTENANCE_MODE !== "false"; - - const isMaintenancePage = - pathname.startsWith("/maintenance") || - pathname.startsWith("/maintainance") || - pathname.startsWith("/api/maintenance/notify"); - - if (isMaintenanceActive) { - if (!isMaintenancePage) { - return NextResponse.redirect(new URL("/maintenance", request.url)); - } - return NextResponse.next(); - } - const sessionToken = request.cookies.get("better-auth.session_token")?.value || request.cookies.get("__Secure-better-auth.session_token")?.value; diff --git a/src/middleware/with-api-auth.ts b/apps/app/src/middleware/with-api-auth.ts similarity index 100% rename from src/middleware/with-api-auth.ts rename to apps/app/src/middleware/with-api-auth.ts diff --git a/src/middleware/with-request-id.ts b/apps/app/src/middleware/with-request-id.ts similarity index 100% rename from src/middleware/with-request-id.ts rename to apps/app/src/middleware/with-request-id.ts diff --git a/src/providers/query-provider.tsx b/apps/app/src/providers/query-provider.tsx similarity index 100% rename from src/providers/query-provider.tsx rename to apps/app/src/providers/query-provider.tsx diff --git a/src/server/events/emitter.ts b/apps/app/src/server/events/emitter.ts similarity index 100% rename from src/server/events/emitter.ts rename to apps/app/src/server/events/emitter.ts diff --git a/src/server/jobs/reconcileStorageUsage.ts b/apps/app/src/server/jobs/reconcileStorageUsage.ts similarity index 100% rename from src/server/jobs/reconcileStorageUsage.ts rename to apps/app/src/server/jobs/reconcileStorageUsage.ts diff --git a/src/server/services/api-key.service.ts b/apps/app/src/server/services/api-key.service.ts similarity index 100% rename from src/server/services/api-key.service.ts rename to apps/app/src/server/services/api-key.service.ts diff --git a/src/server/services/media.service.ts b/apps/app/src/server/services/media.service.ts similarity index 100% rename from src/server/services/media.service.ts rename to apps/app/src/server/services/media.service.ts diff --git a/src/server/services/webhook.service.ts b/apps/app/src/server/services/webhook.service.ts similarity index 100% rename from src/server/services/webhook.service.ts rename to apps/app/src/server/services/webhook.service.ts diff --git a/src/server/services/workspace.service.ts b/apps/app/src/server/services/workspace.service.ts similarity index 100% rename from src/server/services/workspace.service.ts rename to apps/app/src/server/services/workspace.service.ts diff --git a/src/types/api.ts b/apps/app/src/types/api.ts similarity index 100% rename from src/types/api.ts rename to apps/app/src/types/api.ts diff --git a/src/types/cms.ts b/apps/app/src/types/cms.ts similarity index 100% rename from src/types/cms.ts rename to apps/app/src/types/cms.ts diff --git a/src/types/prisma-helpers.ts b/apps/app/src/types/prisma-helpers.ts similarity index 100% rename from src/types/prisma-helpers.ts rename to apps/app/src/types/prisma-helpers.ts diff --git a/tsconfig.json b/apps/app/tsconfig.json similarity index 100% rename from tsconfig.json rename to apps/app/tsconfig.json diff --git a/apps/docs/README.md b/apps/docs/README.md new file mode 100644 index 0000000..ca07bd0 --- /dev/null +++ b/apps/docs/README.md @@ -0,0 +1,3 @@ +# FlowCMS Docs Application (`apps/docs`) + +This is the standalone documentation application workspace for FlowCMS. diff --git a/apps/docs/package.json b/apps/docs/package.json new file mode 100644 index 0000000..4d87b4c --- /dev/null +++ b/apps/docs/package.json @@ -0,0 +1,14 @@ +{ + "name": "@flowcms/docs", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "echo \"apps/docs dev script placeholder\"", + "build": "echo \"apps/docs build script placeholder\"", + "lint": "echo \"apps/docs lint script placeholder\"", + "check-types": "tsc --noEmit" + }, + "devDependencies": { + "typescript": "^5" + } +} diff --git a/apps/docs/src/index.ts b/apps/docs/src/index.ts new file mode 100644 index 0000000..3d35071 --- /dev/null +++ b/apps/docs/src/index.ts @@ -0,0 +1,5 @@ +// FlowCMS Documentation Application Entry +export const docsInfo = { + name: "@flowcms/docs", + version: "0.1.0", +}; diff --git a/apps/docs/tsconfig.json b/apps/docs/tsconfig.json new file mode 100644 index 0000000..9abb4b3 --- /dev/null +++ b/apps/docs/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "target": "ES2017", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve" + }, + "include": ["**/*.ts", "**/*.tsx"], + "exclude": ["node_modules"] +} diff --git a/docker-compose.yml b/docker-compose.yml index 6cfb9f2..98a42fb 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -21,7 +21,7 @@ services: app: build: context: . - dockerfile: Dockerfile + dockerfile: apps/app/Dockerfile restart: always ports: - "3000:3000" diff --git a/docs/DESIGN.md b/docs/DESIGN.md new file mode 100644 index 0000000..9018f13 --- /dev/null +++ b/docs/DESIGN.md @@ -0,0 +1,628 @@ +# Meridian CMS — Design System & Theme Guide + +> A headless CMS built for editors who care about craft. The design reflects that. + +--- + +## Concept & Aesthetic Direction + +**Theme Name:** *Meridian* — the line where two worlds meet (editor's world / developer's world). + +**Aesthetic:** Editorial-Industrial. Think the backstage of a print magazine that got wired up with developer tooling. Raw grid lines, ink-on-paper typographic hierarchy, warm off-white surfaces with cold steel accents — but punctuated by one electric color that signals "this is alive." + +**What makes it unforgettable:** +- Ruled-line textures on backgrounds (like graph paper, but subtle) — a nod to the "content" world +- Monospaced font used deliberately for IDs, API slugs, and code — never for body copy +- A single accent color that is genuinely unusual: a muted **sap green** (`#4E7C59`) with a bright **electric lime** (`#CAFF4D`) for interactive/active states +- Sidebar uses a dark "printing press" tone while the canvas is warm ivory +- No rounded corners except on pills/tags — everything else is sharp-edged or uses 2px max border-radius + +--- + +## Color Palette + +``` +/* ── Base Surfaces ───────────────────────────── */ +--color-canvas: #F5F2EC; /* warm ivory — editor canvas, page backgrounds */ +--color-paper: #FDFBF7; /* near-white — cards, panels, input fields */ +--color-sidebar: #1A1D16; /* near-black with green undertone — main nav */ +--color-sidebar-mid: #252920; /* slightly lighter — sidebar hover states */ + +/* ── Text ────────────────────────────────────── */ +--color-ink: #18180F; /* primary text — almost black, warm */ +--color-ink-muted: #6B6A5E; /* secondary text, labels, placeholders */ +--color-ink-faint: #BFBCB0; /* disabled, ghost, timestamps */ +--color-ink-inverse: #E8E5DB; /* text on dark sidebar */ + +/* ── Accent ──────────────────────────────────── */ +--color-accent: #4E7C59; /* sap green — links, focus rings, icons */ +--color-accent-bright: #CAFF4D; /* electric lime — active states, badges, CTAs */ +--color-accent-dim: #2E4A35; /* deep forest — pressed/active accent backgrounds */ + +/* ── Functional ──────────────────────────────── */ +--color-border: #DDD9CF; /* all borders on light surfaces */ +--color-border-strong: #B0AC9F; /* emphasized borders, dividers */ +--color-sidebar-border:#2F3328; /* sidebar internal dividers */ +--color-destructive: #C94040; /* delete, error states */ +--color-warning: #D4820A; /* warnings, draft indicator */ +--color-success: #3A7D44; /* published, saved, success toasts */ + +/* ── Overlays ────────────────────────────────── */ +--color-overlay: rgba(24, 24, 15, 0.5); /* modal backdrops */ +--color-highlight: rgba(202, 255, 77, 0.15); /* selection highlight in editor */ +``` + +--- + +## Typography + +### Font Stack + +| Role | Font | Source | +|---|---|---| +| **Display / Headings** | `"Playfair Display"` | Google Fonts | +| **UI / Body** | `"DM Sans"` | Google Fonts | +| **Monospace** | `"DM Mono"` | Google Fonts | + +```css +@import url('https://fonts.googleapis.com/css2?family=Playfair+Display:wght@400;600;700&family=DM+Sans:wght@300;400;500;600&family=DM+Mono:wght@400;500&display=swap'); + +--font-display: 'Playfair Display', Georgia, serif; +--font-ui: 'DM Sans', sans-serif; +--font-mono: 'DM Mono', 'Courier New', monospace; +``` + +### Type Scale + +```css +--text-xs: 0.6875rem; /* 11px — API slugs, timestamps, meta */ +--text-sm: 0.8125rem; /* 13px — sidebar labels, table rows */ +--text-base: 0.9375rem; /* 15px — body copy, form inputs */ +--text-md: 1.0625rem; /* 17px — panel headings */ +--text-lg: 1.25rem; /* 20px — section headings */ +--text-xl: 1.5rem; /* 24px — page titles */ +--text-2xl: 2rem; /* 32px — dashboard hero text */ +--text-3xl: 2.75rem; /* 44px — landing page headers */ +--text-hero: 4rem; /* 64px — landing hero */ + +--leading-tight: 1.15; +--leading-normal: 1.5; +--leading-loose: 1.75; + +--tracking-tight: -0.02em; +--tracking-normal: 0; +--tracking-wide: 0.04em; +--tracking-widest: 0.12em; /* ALL CAPS labels, column headers */ +``` + +### Usage Rules + +- **Headings**: Playfair Display, `font-weight: 600`, `letter-spacing: -0.02em` +- **UI labels (ALL CAPS)**: DM Sans, `font-weight: 500`, `font-size: var(--text-xs)`, `letter-spacing: var(--tracking-widest)`, `text-transform: uppercase` — used for column headers, nav section labels, form field labels +- **Body**: DM Sans, `font-weight: 400`, `line-height: var(--leading-loose)` +- **Slugs / IDs / Code**: DM Mono everywhere — field slugs, API paths, IDs in tables, JSON preview +- **Numbers in stats**: Playfair Display numerals look gorgeous for big stat figures + +--- + +## Spacing & Layout + +```css +--space-1: 0.25rem; /* 4px */ +--space-2: 0.5rem; /* 8px */ +--space-3: 0.75rem; /* 12px */ +--space-4: 1rem; /* 16px */ +--space-5: 1.25rem; /* 20px */ +--space-6: 1.5rem; /* 24px */ +--space-8: 2rem; /* 32px */ +--space-10: 2.5rem; /* 40px */ +--space-12: 3rem; /* 48px */ +--space-16: 4rem; /* 64px */ +--space-24: 6rem; /* 96px */ + +/* Layout */ +--sidebar-width: 240px; +--sidebar-collapsed: 64px; +--panel-width: 320px; /* right-side block editor panel */ +--topbar-height: 56px; +--content-max-width: 960px; +--landing-max-width: 1200px; +``` + +### Grid + +- Dashboard uses a fixed sidebar + fluid main area layout +- Content tables use a 12-column CSS grid internally +- Block editor canvas: centered, max-width 720px, with the properties panel docked right +- Landing page: `display: grid; grid-template-columns: repeat(12, 1fr); gap: var(--space-6);` + +--- + +## Border Radius & Borders + +```css +--radius-none: 0; +--radius-sm: 2px; /* inputs, buttons — barely rounded */ +--radius-md: 4px; /* cards, dropdowns */ +--radius-pill: 100px; /* status badges, tags ONLY */ + +--border-width: 1px; +--border-width-thick: 2px; + +/* Focus ring — used on all interactive elements */ +--focus-ring: 0 0 0 3px rgba(202, 255, 77, 0.4); +``` + +**Rule:** This design is intentionally angular. Only use `--radius-pill` for tags and status indicators. Cards and modals use `--radius-md`. Inputs use `--radius-sm`. + +--- + +## Shadows & Depth + +```css +--shadow-sm: 0 1px 2px rgba(24, 24, 15, 0.08); +--shadow-md: 0 4px 12px rgba(24, 24, 15, 0.10); +--shadow-lg: 0 12px 32px rgba(24, 24, 15, 0.14); +--shadow-xl: 0 24px 48px rgba(24, 24, 15, 0.18); + +/* Sidebar inner shadow — subtle separation */ +--shadow-sidebar: inset -1px 0 0 var(--color-sidebar-border); + +/* Floating panel (block props) */ +--shadow-panel: -4px 0 24px rgba(24, 24, 15, 0.10); +``` + +--- + +## Background Texture + +The "ruled paper" texture is a defining detail. Apply to canvas-level surfaces: + +```css +/* Subtle horizontal ruled lines — like a notebook */ +.ruled-bg { + background-color: var(--color-canvas); + background-image: repeating-linear-gradient( + transparent, + transparent 27px, + var(--color-border) 27px, + var(--color-border) 28px + ); +} + +/* Graph paper variant — for empty states / block canvas */ +.graph-bg { + background-color: var(--color-canvas); + background-image: + linear-gradient(var(--color-border) 1px, transparent 1px), + linear-gradient(90deg, var(--color-border) 1px, transparent 1px); + background-size: 24px 24px; +} +``` + +Use `ruled-bg` on the main content area background. Use `graph-bg` on the empty state of the block editor canvas. + +--- + +## Component Patterns + +### Buttons + +``` +Primary CTA: + background: var(--color-accent-bright) + color: var(--color-ink) + font: DM Sans 500, 13px, letter-spacing: 0.04em, uppercase + padding: 8px 20px + border: none + border-radius: var(--radius-sm) + box-shadow: none + hover: background: #D6FF6A (slightly lighter) + active: background: var(--color-accent-dim), color: white + +Secondary: + background: transparent + border: 1px solid var(--color-border-strong) + color: var(--color-ink) + hover: border-color: var(--color-accent), color: var(--color-accent) + +Ghost / Sidebar item: + background: transparent + color: var(--color-ink-inverse) at 60% opacity + hover: background: var(--color-sidebar-mid), color: var(--color-ink-inverse) at 100% + active: background: var(--color-accent-dim), left-border: 2px solid var(--color-accent-bright) + +Destructive: + background: transparent + color: var(--color-destructive) + border: 1px solid currentColor + hover: background: rgba(201, 64, 64, 0.08) +``` + +### Inputs & Forms + +``` +Input field: + background: var(--color-paper) + border: 1px solid var(--color-border) + border-radius: var(--radius-sm) + padding: 9px 12px + font: DM Sans 400, 15px + color: var(--color-ink) + placeholder: var(--color-ink-faint) + focus: border-color: var(--color-accent), box-shadow: var(--focus-ring) + +Slug/API name field: + font: DM Mono 400, 13px + background: rgba(78, 124, 89, 0.06) + border-color: rgba(78, 124, 89, 0.3) + prefix label: "/" in var(--color-accent) + +Label (above input): + DM Sans 500, 11px, uppercase, letter-spacing: 0.12em + color: var(--color-ink-muted) + margin-bottom: 6px +``` + +### Status Badges / Tags + +``` +Published: + background: rgba(58, 125, 68, 0.12) + color: var(--color-success) + border: 1px solid rgba(58, 125, 68, 0.25) + border-radius: var(--radius-pill) + font: DM Sans 500, 11px, uppercase, letter-spacing: 0.08em + padding: 2px 10px + +Draft: + background: rgba(212, 130, 10, 0.10) + color: var(--color-warning) + border: 1px solid rgba(212, 130, 10, 0.25) + +Archived: + background: transparent + color: var(--color-ink-faint) + border: 1px solid var(--color-border) + +API / Type badge (on content types): + background: var(--color-sidebar) + color: var(--color-accent-bright) + font: DM Mono 500, 11px + border-radius: var(--radius-sm) + padding: 2px 8px +``` + +### Tables (Content Entry List) + +``` +Header row: + background: var(--color-canvas) + border-bottom: 2px solid var(--color-border-strong) + font: DM Sans 500, 11px, uppercase, letter-spacing: 0.12em + color: var(--color-ink-muted) + padding: 10px 16px + +Data row: + background: var(--color-paper) + border-bottom: 1px solid var(--color-border) + padding: 14px 16px + hover: background: rgba(78, 124, 89, 0.04) + +Selected row: + background: rgba(202, 255, 77, 0.08) + border-left: 2px solid var(--color-accent-bright) + +ID column: + font: DM Mono 400, 12px + color: var(--color-ink-muted) +``` + +### Sidebar Navigation + +``` +Sidebar: + width: var(--sidebar-width) + background: var(--color-sidebar) + border-right: var(--shadow-sidebar) + padding-top: var(--space-6) + +Logo area: + padding: 0 var(--space-5) var(--space-6) + font: Playfair Display 600, 20px + color: white + sub-label: DM Mono 11px, var(--color-accent-bright) — "DASHBOARD v1" + +Section label (e.g. "CONTENT", "SETTINGS"): + DM Sans 500, 10px, uppercase, letter-spacing: 0.14em + color: var(--color-sidebar-border) [intentionally dim] + padding: var(--space-6) var(--space-5) var(--space-2) + margin-top: var(--space-4) + +Nav item: + display: flex, align-items: center, gap: var(--space-3) + padding: 9px var(--space-5) + color: rgba(232, 229, 219, 0.65) + font: DM Sans 400, 14px + icon: 16px, stroke-width: 1.5 + hover: color: white, background: var(--color-sidebar-mid) + active: color: white, background: var(--color-accent-dim) + left-border: 2px solid var(--color-accent-bright) + font-weight: 500 +``` + +### Cards + +``` +Content Type card: + background: var(--color-paper) + border: 1px solid var(--color-border) + border-radius: var(--radius-md) + padding: var(--space-5) + box-shadow: var(--shadow-sm) + hover: box-shadow: var(--shadow-md), border-color: var(--color-accent) + + Top: type name in Playfair Display 600, 16px + Sub: entry count in DM Sans 400, 13px, muted + Bottom: API slug in DM Mono, var(--color-accent), with "/" prefix +``` + +--- + +## Page-by-Page Design Notes + +### Landing Page + +**Layout:** Full-bleed, dark top section (`var(--color-sidebar)`) transitioning to warm ivory canvas below. + +**Hero section:** +- Background: `var(--color-sidebar)` with a faint graph-paper overlay at 4% opacity +- Headline: Playfair Display 700, 64px, white, `letter-spacing: -0.03em`, two lines — e.g. *"Content,* + *structured for builders."* +- Sub-headline: DM Sans 300, 18px, `var(--color-ink-inverse)` at 70% opacity +- CTA button: `--color-accent-bright` background, `--color-ink` text — primary; secondary ghost button +- Decorative: a faint ruled-line grid bleeds into the dark background +- Right side: a live screenshot of the dashboard (or illustrated mockup) with a lime-green glow + +**Feature grid (3 columns):** +- On warm canvas background +- Each card: left-bordered with 2px `var(--color-accent)`, icon in accent green, headline in Playfair, body in DM Sans +- Numbers ("01", "02", "03") in Playfair Display, 48px, 8% opacity — decorative background numerals + +**API preview section:** +- Dark card showing a code block (`DM Mono`) with the JSON response +- Syntax: keys in `var(--color-accent-bright)`, strings in white, punctuation in muted +- Side: headline "Fetch it anywhere" in Playfair Display + +**Footer:** Dark background. Logo left, nav links center, API status indicator right (green dot + "Operational"). + +--- + +### Auth Pages (Login / Sign Up) + +**Layout:** Split screen — left 45% dark (`var(--color-sidebar)`), right 55% ivory canvas. + +**Left panel (dark):** +- Large Playfair Display quote or product name, 40px, white +- Faint ruled-line texture +- Small testimonial or feature list at bottom + +**Right panel (form):** +- Centered form, max-width 380px +- Field labels in ALL CAPS DM Sans +- "Sign in" headline in Playfair Display 600, 28px +- Primary button: full-width, `--color-accent-bright` +- OAuth buttons (GitHub): white background, dark border, 1px — matches the sharp aesthetic +- No card container around the form — the form *is* the panel +- Footer: "Don't have an account? →" in DM Sans, link in `var(--color-accent)` + +--- + +### Dashboard — Home / Overview + +**Top bar:** +- Height: 56px, background: `var(--color-paper)`, border-bottom: 1px `var(--color-border)` +- Left: breadcrumb in DM Sans 400, 14px. Active segment: DM Sans 500, ink +- Right: search bar (ghost), notification bell, avatar circle (initials, dark background) + +**Stats row (4 cards):** +- Background: `var(--color-paper)`, 1px border, `var(--radius-md)` +- Big number: Playfair Display, 32px, `var(--color-ink)` +- Label: DM Sans 500, 11px, ALL CAPS, muted +- Trend: tiny +12% in success green or −3% in destructive red + +**Recent Entries table:** +- Full width, no card wrapper — the table IS the content +- Hover row highlighting in faint lime + +**Quick Actions sidebar strip (right):** +- 280px panel, border-left: 1px `var(--color-border)` +- "New entry", "New content type", "View API" buttons stacked +- API base URL in DM Mono, copyable + +--- + +### Content Types — List & Builder + +**List view:** +- Card grid, 3 columns +- Each card shows: type name, icon, entry count, API slug, "Manage" link +- "New Content Type" button top-right: `--color-accent-bright`, uppercase label + +**Field Builder (type editor):** +- Left: field list (draggable, dnd-kit handles shown as `⠿` in DM Mono, muted) +- Right: field config panel — white background, 1px left border +- Field type selector: horizontal pill-button row — Text, Number, Boolean, Media, etc. + - Active pill: `--color-accent-bright` background, dark text + - Inactive: border only + +--- + +### Block Editor (Visual Page Editor) + +**Layout:** Three zones: +1. **Left mini-panel (180px):** Block palette — draggable block types as compact cards +2. **Center canvas (fluid):** The page being built, with graph-paper empty state +3. **Right panel (320px):** Block properties, slides in when a block is selected + +**Block cards (on canvas):** +- White background, 1px `var(--color-border)`, `--radius-sm` +- Selected: `border: 2px solid var(--color-accent)`, `box-shadow: 0 0 0 4px rgba(202,255,77,0.15)` +- Drag handle: `⠿` in left gutter, shows on hover +- Block type tag top-right: DM Mono, small, `--color-accent-bright` on dark pill + +**Empty canvas:** +- Graph paper background +- Centered message: Playfair Display italic, 20px, muted — *"Your canvas is empty."* +- Sub-text: DM Sans 13px — "Drag a block from the left panel to begin." + +--- + +### API Explorer (Developer View) + +**Split layout:** +- Left: endpoint list (sidebar-style, dark background) +- Right: request/response pane + +**Endpoint items:** +``` +Method badge: GET — DM Mono, 11px + background: rgba(202, 255, 77, 0.12) + color: var(--color-accent-bright) + border-radius: var(--radius-sm) + padding: 2px 6px + +Path: DM Mono, 13px, white +Description: DM Sans, 12px, muted +``` + +**Response pane:** +- Dark `#0F1109` background (darker than sidebar) +- JSON with syntax highlighting using the accent palette +- Copy button top-right: ghost, icon only + +--- + +## Animation & Motion + +```css +/* Standard easing */ +--ease-out: cubic-bezier(0.16, 1, 0.3, 1); /* snap-out — panels, modals */ +--ease-in-out: cubic-bezier(0.45, 0, 0.55, 1); /* balanced — accordion, tabs */ +--ease-spring: cubic-bezier(0.34, 1.56, 0.64, 1); /* slight overshoot — badges, toasts */ + +/* Durations */ +--duration-fast: 100ms; /* hover color changes */ +--duration-normal: 200ms; /* panel slides, dropdowns */ +--duration-slow: 350ms; /* page transitions, modals */ +``` + +**Key moments to animate:** +- Sidebar nav item hover: `color` + left-border fade, `200ms` +- Right panel slide-in (block selected): `transform: translateX(0)` from `translateX(100%)`, `350ms --ease-out` +- Toast notifications: slide in from bottom-right + fade, spring easing +- Status badge on publish: brief scale `1 → 1.1 → 1` with color change, `300ms --ease-spring` +- Table row on create: fade + slide down from top, staggered if multiple + +**Avoid:** +- Page-level skeleton loaders on every navigation (use instant transitions where possible) +- Bouncy animations on utility elements (only spring on celebratory moments) +- Spinning loaders — use a thin top-bar progress line instead (`var(--color-accent-bright)`) + +--- + +## Iconography + +Use **Lucide Icons** (`lucide-react`) throughout. +- Default size: 16px in UI, 20px in empty states +- Stroke width: `1.5` everywhere (lighter, more editorial than the default 2) +- Color: inherits from parent — never hardcoded + +**Key icons by context:** +| Context | Icon | +|---|---| +| Content Types | `Layers` | +| Entries | `FileText` | +| Block Editor | `LayoutTemplate` | +| API Explorer | `Braces` | +| Published | `CheckCircle` | +| Draft | `Circle` | +| Drag handle | `GripVertical` | +| Settings | `SlidersHorizontal` | +| New / Add | `Plus` | +| Delete | `Trash2` | + +--- + +## Responsive Notes + +This is a tool for desktop-first workflows (CMS = power user tool). Mobile is read-only / preview only. + +- **≥ 1280px:** Full three-column block editor layout +- **1024–1279px:** Block editor collapses right panel to overlay +- **768–1023px:** Sidebar collapses to icon-only mode (`--sidebar-collapsed: 64px`) +- **< 768px:** Dashboard renders a "mobile not supported" message with a redirect to view-only mode + +--- + +## CSS Custom Property Summary + +```css +:root { + /* Colors */ + --color-canvas: #F5F2EC; + --color-paper: #FDFBF7; + --color-sidebar: #1A1D16; + --color-sidebar-mid: #252920; + --color-ink: #18180F; + --color-ink-muted: #6B6A5E; + --color-ink-faint: #BFBCB0; + --color-ink-inverse: #E8E5DB; + --color-accent: #4E7C59; + --color-accent-bright: #CAFF4D; + --color-accent-dim: #2E4A35; + --color-border: #DDD9CF; + --color-border-strong: #B0AC9F; + --color-sidebar-border: #2F3328; + --color-destructive: #C94040; + --color-warning: #D4820A; + --color-success: #3A7D44; + + /* Typography */ + --font-display: 'Playfair Display', Georgia, serif; + --font-ui: 'DM Sans', sans-serif; + --font-mono: 'DM Mono', 'Courier New', monospace; + + /* Spacing */ + --space-1: 0.25rem; --space-2: 0.5rem; --space-3: 0.75rem; + --space-4: 1rem; --space-5: 1.25rem; --space-6: 1.5rem; + --space-8: 2rem; --space-10: 2.5rem; --space-12: 3rem; + --space-16: 4rem; --space-24: 6rem; + + /* Layout */ + --sidebar-width: 240px; + --sidebar-collapsed: 64px; + --panel-width: 320px; + --topbar-height: 56px; + + /* Borders & Radius */ + --radius-none: 0; --radius-sm: 2px; --radius-md: 4px; --radius-pill: 100px; + --border-width: 1px; --border-width-thick: 2px; + + /* Shadows */ + --shadow-sm: 0 1px 2px rgba(24, 24, 15, 0.08); + --shadow-md: 0 4px 12px rgba(24, 24, 15, 0.10); + --shadow-lg: 0 12px 32px rgba(24, 24, 15, 0.14); + --shadow-xl: 0 24px 48px rgba(24, 24, 15, 0.18); + --shadow-panel: -4px 0 24px rgba(24, 24, 15, 0.10); + --focus-ring: 0 0 0 3px rgba(202, 255, 77, 0.4); + + /* Animation */ + --ease-out: cubic-bezier(0.16, 1, 0.3, 1); + --ease-in-out: cubic-bezier(0.45, 0, 0.55, 1); + --ease-spring: cubic-bezier(0.34, 1.56, 0.64, 1); + --duration-fast: 100ms; + --duration-normal: 200ms; + --duration-slow: 350ms; +} +``` \ No newline at end of file diff --git a/docs/internal-guides/admin-operator-guide.md b/docs/internal-guides/admin-operator-guide.md new file mode 100644 index 0000000..a7235db --- /dev/null +++ b/docs/internal-guides/admin-operator-guide.md @@ -0,0 +1,30 @@ +# Internal Guide: Admin Operator Instructions + +## 1. What This Feature Is Supposed To Do +This guide is for **us** (the operators) to manage the platform. +- **Why it exists**: To handle support requests, fix stuck accounts, and manage the waitlist. +- **When to use it**: When a user says "I can't log in" or "My plan didn't upgrade". + +## 2. Managing the Waitlist +- **Workflow**: + 1. Check `prisma.waitlistEntry` for new signups. + 2. Approve entries by setting `status = APPROVED`. + 3. This triggers the invitation email. +- **Troubleshooting**: If an invite isn't used, check `inviteExpiresAt`. + +## 3. Handling Billing Issues +- **Workflow**: + 1. Check the **Razorpay Dashboard** for the `subscriptionId`. + 2. Cross-reference with `prisma.workspace.plan`. + 3. If a user paid but the plan is `HOBBY`, manually update the `plan` field in the database and trigger a cache clear. + +## 4. Operational "Truths" +- **API Limits**: Hardcoded in the middleware. If a user hits a limit, they get a `429`. We must manually override this in the `Workspace` model if they are a "VVIP" user. +- **Media Storage**: Currently stored in S3/R2. If an image won't load, check the CORS settings on the bucket. + +## 5. What Should Be Simplified (Internal Tools) +- **The "Admin Panel"**: We don't have one. We are running Prisma Studio for everything. We need a `/admin` dashboard to: + - Approve users. + - See global usage. + - Impersonate a workspace to debug their schema. +- **Log Visibility**: We have to check Vercel/Sentry logs. We need a "Global Audit Log" in the dashboard. diff --git a/docs/internal-guides/aha-moment-definition.md b/docs/internal-guides/aha-moment-definition.md new file mode 100644 index 0000000..d4850dd --- /dev/null +++ b/docs/internal-guides/aha-moment-definition.md @@ -0,0 +1,44 @@ +# Internal Audit: Defining the "Aha" Moment + +## 1. The False "Aha" (Developer Trap) +Our current onboarding assumes the user is a backend developer who loves JSON. +- **Current Flow**: Setup -> Publish -> Success -> (Implicit: Go fetch with cURL). +- **The Result**: The user sees a JSON blob. They say, "Cool, it works." This is not an "Aha." It's a "Verification." + +## 2. The Real "Aha" (User Truth) +The real "Aha" moment for a CMS user is: +# "I changed content and my website updated." + +That moment is about **The Loop of Power**. The realization that I am in control of the pixels on my site without touching code. + +## 3. How we are missing it +Right now, to get to the "Aha" moment, a user has to: +1. Build a frontend (External to FlowCMS). +2. Install a fetching library. +3. Handle authentication headers. +4. Render the JSON. +5. Deploy. + +**Total time to real "Aha"**: 2 hours (minimum). +**Probability of abandonment**: 90%. + +## 4. The "Instant Reward" Strategy +To win, we must move the "Aha" moment from **2 hours** to **2 minutes**. + +### The Fix: The Internal "Sandbox Site" +Every new workspace should come with a **Sandbox URL** (e.g., `sandbox.flowcms.com/your-workspace`). +- This site is pre-configured to render whatever is in the "Blog" or "Home" entry. +- During onboarding, we show the dashboard on the left and the **Sandbox Site** on the right (or in a separate tab). + +**The Workflow**: +1. User types "Hello World" in the entry editor. +2. User hits "Publish." +3. We say: "Look at your site!" +4. User switches to the Sandbox tab and sees **"Hello World"** rendered in a beautiful layout. + +**THAT is the Aha moment.** Everything after that (API, JSON, Auth) is just implementation details. + +## 5. Brutal Honest Take +If the user's first interaction with the product is a `401 Unauthorized` in their terminal because they didn't set up a `Bearer` token, we have failed. + +We must prioritize the **Visual Reward** over the **API Response**. diff --git a/docs/internal-guides/content-types-guide.md b/docs/internal-guides/content-types-guide.md new file mode 100644 index 0000000..459017a --- /dev/null +++ b/docs/internal-guides/content-types-guide.md @@ -0,0 +1,69 @@ +# Internal Guide: Content Types & Schema Design + +## 1. What This Feature Is Supposed To Do + +Content Types are the **blueprints** of your data. +- **Why it exists**: Computers (and APIs) need structure. If you tell FlowCMS "I'm writing a Blog Post", it needs to know what fields a blog post contains so it can validate the data. +- **When to use it**: Every time you have a repeatable data structure. +- **Why not use Pages?**: Content Types are for **Structured Data** (lists of things like team members, products, posts). Pages are for **Layouts** (specific one-off pages like "About Us"). + +## 2. Exact Real Workflow + +1. **Ideation**: Decide what fields you need. +2. **Schema Creation**: Dashboard -> Content Types -> New. +3. **Field Mapping**: Use the `FieldBuilder` to add: + - `Title` (Short Text, Required) + - `Body` (Rich Text) + - `Author` (Reference or Short Text) + - `Thumbnail` (Media) +4. **Validation**: Set which fields are required. +## Reality Check: Schema Restrictions +- **Actually implemented now**: Vertical field lists, field renaming, and slug editing. +- **Partially implemented**: Reference field type (UI exists, logic is missing). +- **Planned but missing**: **Drag and Drop** for reordering fields. Repeater fields for lists of objects. + +## 3. Step-by-Step Operator Instructions + +1. Go to **Dashboard -> Content Types**. +2. Click **"Create New Type"**. +3. Under **"Display Name"**, type "Team Member". +4. Notice the **"API Slug"** auto-fills to `team-member`. Keep it. +5. Click **"Add Field"**. +6. Select **"Short Text"**. Name it "Full Name". Toggle "Required". +7. Select **"Media"**. Name it "Avatar". +8. Select **"Long Text"**. Name it "Bio". +9. Click **"Save Schema"** at the top right. + +## 4. Real Example Content: Product Catalog + +**Fields Needed**: +- `name` (Short Text) +- `sku` (Short Text, Unique-intent) +- `price` (Number) +- `description` (Rich Text) +- `images` (Media List) +- `inStock` (Boolean) + +**Example Data**: +- *Name*: "FlowStream Pro Controller" +- *SKU*: "FL-PRO-01" +- *Price*: 299 +- *In Stock*: True + +## 5. Founder Confusion Audit + +- **Slug vs Name**: We often confused the Display Name with the API Slug. Changing the Name doesn't change the API endpoint, which is good for stability but confusing if you want them to match later. +- **Field Deletion**: Deleting a field from a schema effectively "hides" that data from the API for existing entries, but doesn't delete it from the DB. This was unclear. +- **Required Fields**: If you make a field "Required" *after* entries already exist, it can cause validation errors when trying to update those old entries. + +## 6. UX Friction Notes + +- **Field Sorting**: Reordering fields in the builder is a bit clunky. It should be a simple drag-handle. +- **Advanced Field Types**: Things like "JSON" or "Repeater" are powerful but have zero guidance. Users don't know what to put in them. +- **Slug Constraints**: There's no real-time validation if a slug is already taken until you hit "Save". + +## 7. What Should Be Simplified + +- **The "Blueprint" Gallery**: Provide a library of 10-15 standard schemas (Product, Event, Person, Review) so users don't have to build from scratch every time. +- **Field Grouping**: Ability to group fields into sections (e.g., "SEO Metadata", "Main Content"). +- **Visual Preview**: A "Mock Entry" preview that shows how the data entry form will look as you build the schema. diff --git a/docs/internal-guides/entries-guide.md b/docs/internal-guides/entries-guide.md new file mode 100644 index 0000000..9180e50 --- /dev/null +++ b/docs/internal-guides/entries-guide.md @@ -0,0 +1,60 @@ +# Internal Guide: Entries & Content Management + +## 1. What This Feature Is Supposed To Do + +Entries are the **actual data** inside your Content Types. +- **Why it exists**: Once you have a "Blog Post" structure, you need to write the actual posts. +- **When to use it**: Every time you want to add, edit, or delete a specific piece of content. +- **Goal**: To provide a clean, "Writer-Friendly" interface that abstracts away the database. + +## 2. Exact Real Workflow + +1. **Select Type**: Navigate to the specific Content Type (e.g., "Blog Posts"). +2. **Create Entry**: Click "New Entry". +3. **Data Entry**: Fill in the fields defined in the schema. +4. **Drafting**: Save frequently. Status remains "Draft". +5. **Review**: Check for typos. +## Reality Check: Entry Limitations +- **Actually implemented now**: Text, number, date, and boolean editing. **AI Assist** for text fields. +- **Partially implemented**: **Media Picker**. You can see the UI, but it doesn't link to the media library correctly yet. +- **Planned but missing**: **Autosave**. Rich Text formatting (currently just a plain textarea). + +## 3. Step-by-Step Operator Instructions + +1. Go to **Dashboard -> Content Types**. +2. Find the card for **"Blog Post"**. +3. Click the bright **"View Entries"** button. +4. Click **"New Entry"**. +5. Fill in the Title, Content, and select an Image from the Media library. +6. Click **"Save"**. +7. Look at the top right toggle. It says **"Draft"**. +8. Click it to switch to **"Published"**. +9. Your content is now live. + +## 4. Real Example Content: Blog Post + +**Data**: +- *Title*: "10 Reasons to use FlowCMS for your Next.js project" +- *Slug*: `10-reasons-flowcms` +- *Author*: "Jane Doe" +- *Content*: "Headless CMSs are taking over... [Long Rich Text Content]" +- *Category*: "Tutorial" + +## 5. Founder Confusion Audit + +- **The "Version" Mystery**: We have a `version` field in the DB but no way to see history in the UI. We found ourselves looking for "Undo" but it doesn't exist yet. +- **Bulk Actions**: We tried to publish 5 entries at once. You can't. You have to open each one. This is a massive friction point for real users. +- **Search vs Filter**: Searching for an entry only searches titles. If we need to find something by "Author", the search fails us. + +## 6. UX Friction Notes + +- **Autosave**: There is no autosave. If the browser crashes or the user navigates away, the content is gone. This is the #1 "Abandonment" trigger. +- **Rich Text Editor**: The editor is basic. It lacks things like "Embed YouTube" or "Upload Image Inline" (you have to use the media field). +- **Status Toggle**: The toggle at the top right is a bit hidden. Users look for a "Publish" button at the bottom of the form. + +## 7. What Should Be Simplified + +- **The "Save & Publish" Button**: Combine these into one primary action with a dropdown for "Save as Draft". +- **Inline Media Upload**: Allow users to drag images directly into the text area. +- **Global Search**: A search bar at the top of the dashboard that finds entries across *all* content types. +- **Bulk Publishing**: A checkbox system in the entry list to publish/delete multiple items. diff --git a/docs/internal-guides/existing-vs-planned-features.md b/docs/internal-guides/existing-vs-planned-features.md new file mode 100644 index 0000000..8ed730f --- /dev/null +++ b/docs/internal-guides/existing-vs-planned-features.md @@ -0,0 +1,63 @@ +# Internal Audit: Existing vs. Planned Features + +This is the most important file in this audit. It separates **implemented reality** from **aspirational fiction**. + +## 1. The Core Infrastructure + +### Actually implemented now: +- **Workspace/Auth**: Full user lifecycle, registration, and invitation system. +- **REST API v1**: Functional endpoints for `entries`, `pages`, and `media`. +- **Environment Isolation**: The DB structure supports it; the UI supports listing. +- **AI Assist**: Real integration with AI to generate SEO titles and content descriptions. + +### Partially implemented: +- **Media Library**: You can upload and list files, but the "Picker" inside the entry editor is a UI placeholder. +- **Reference Fields**: The field type exists in the database, but the UI for selecting other entries is a dummy dropdown. +- **Onboarding**: It creates a workspace and schema, but leaves the user with an empty dashboard (no sample entries or keys). + +### Planned but missing: +- **Webhooks**: Code exists for delivery, but the dashboard UI for managing them is incomplete. +- **Audit Logs**: The table is there, but the dashboard page is a mix of mock and real data. +- **Environments Creation**: Locked behind a "Pro" wall, but even for Pro, the "Promotion Flow" is just a "Coming Soon" label. + +--- + +## 2. The Editors (Content Types & Entries) + +### Actually implemented now: +- **Schema Builder**: Adding/Removing fields works. Editing slugs works. +- **Field Form**: Renders text, richtext, number, boolean, and date correctly. +- **Publishing Toggle**: Updates the `EntryStatus` correctly in the DB. + +### Partially implemented: +- **Reference Selector**: Shows the field, but can't actually link to real entries yet. +- **Rich Text Editor**: A basic `textarea`. It lacks formatting (Bold, Italic, Links) or inline image support. + +### Planned but missing: +- **Drag & Drop for Fields**: You cannot reorder fields once added. You have to delete and recreate. +- **Repeater / Group Fields**: Currently, you can only have flat field lists. +- **JSON Fields**: No UI for raw JSON editing in the form. + +--- + +## 3. The Page Builder (Block Editor) + +### Actually implemented now: +- **Drag & Drop**: Fully functional using `@dnd-kit`. +- **Block Types**: 9 real blocks (Heading, Text, Image, CTA, Divider, Quote, Code, Callout, Accordion). +- **Page Templates**: A browser that allows picking a "blueprint" to start with. + +### Planned but missing: +- **Global Blocks**: No way to reuse a block across pages. +- **Live Preview**: The "Preview" button is a UI placeholder that doesn't show a rendered site. +- **Real-time Collaboration**: Mentioned in early docs; zero implementation. + +--- + +## 4. Brutal Verdict +We are currently 60% of the way to a "Headless CMS" and 20% of the way to a "Product." The engine is running, but the steering wheel is missing handles. + +**Immediate Priority**: +1. Fix the **Media Picker** in the entry form. +2. Fix the **Reference Field** (this is the "headless" killer feature). +3. Add **Sample Entries** to onboarding so the dashboard isn't empty. diff --git a/docs/internal-guides/friction-points.md b/docs/internal-guides/friction-points.md new file mode 100644 index 0000000..4801485 --- /dev/null +++ b/docs/internal-guides/friction-points.md @@ -0,0 +1,43 @@ +# Internal Audit: UX Friction Points + +## 1. The "Dead-End" Dashboard +- **Location**: Home Page after login. +- **Issue**: It shows "Usage" and "Recent Activity". If you have zero usage, it's a graveyard. +- **Friction**: The user says "Now what?". +- **Fix**: Add a "Getting Started" stepper. + +## 2. The "Hidden" Required Fields +- **Location**: Content Type Editor. +- **Issue**: You can create a schema, but if you don't add at least one field, you can't create an entry. +- **Friction**: The user creates a "Category" type, goes to add an entry, and sees an empty screen with a "Save" button. They don't realize they *must* go back and add fields. +- **Fix**: Warning if a Content Type has zero fields. + +## 3. The "Unclear" Success State +- **Location**: All "Save" actions. +- **Issue**: Clicking "Save" shows a tiny toast or just stops the loading spinner. +- **Friction**: Users aren't sure if it's saved. They click it 3-4 times. +- **Fix**: Confetti? Or a clearer "Saved at 2:00 PM" label. + +## 4. The "Slug" Anxiety +- **Location**: Creating Pages or Content Types. +- **Issue**: If I name my page "About", the slug becomes "about". If I change the title to "Our Story", the slug stays "about". +- **Friction**: Users get confused why the URL doesn't match the title. +- **Fix**: A "Sync Slug" button. + +## 5. The "API Key" Barrier +- **Location**: Settings -> API Keys. +- **Issue**: To see content, you *need* a key. Keys are hidden in settings. +- **Friction**: First-time users try to hit the URL in the browser and get a `401 Unauthorized`. They assume the product is broken. +- **Fix**: Provide a "Public (Read-Only)" key by default for every new workspace. + +## 6. The "Draft" Trap +- **Location**: Entry Editor. +- **Issue**: Content is "Draft" by default. +- **Friction**: Users save content and it doesn't appear on their site. They don't notice the small toggle at the top. +- **Fix**: A big "Publish" button. + +## 7. The "Media" Disconnect +- **Location**: Media Library. +- **Issue**: You can upload images, but you can't easily "Copy URL" to use them elsewhere. +- **Friction**: You have to go into an entry to actually "use" an image. +- **Fix**: Add a "Copy Public URL" button to every image in the gallery. diff --git a/docs/internal-guides/how-to-use-flowcms.md b/docs/internal-guides/how-to-use-flowcms.md new file mode 100644 index 0000000..9677081 --- /dev/null +++ b/docs/internal-guides/how-to-use-flowcms.md @@ -0,0 +1,67 @@ +# Internal Guide: How to Use FlowCMS + +## 1. What This Product Is Supposed To Do + +FlowCMS is a **Headless CMS** designed for speed and developer flexibility. +- **Why it exists**: To decouple content from code. It allows non-technical authors to update content without a developer pushing code. +- **When to use it**: When you need a central repository for content that can be consumed by multiple platforms (Web, Mobile, etc.) via an API. +- **The Value**: It solves the "Edit Request" bottleneck. Developers build the structure once; content editors manage the data forever. + +## 2. Exact Real Workflow (The "Happy Path") + +1. **Model**: Define the shape of your data in **Content Types**. +2. **Author**: Create instances of that model in **Entries**. +3. **Publish**: Switch the entry from "Draft" to "Published". +4. **Fetch**: Use an **API Key** to request the JSON data. + +## Reality Check: The Implementation Gap +- **Actually implemented now**: Schema creation, basic entry creation, and API delivery. +- **Partially implemented**: Media selection and cross-entry references. +- **Planned but missing**: Real-time frontend preview. Currently, you only see JSON. + +## 3. Step-by-Step Operator Instructions + +### Creating your first content workflow +1. **Login** to the FlowCMS Dashboard. +2. **Navigate to Content Types** in the sidebar. +3. **Click "Create New Type"**. +4. **Define the Schema**: Give it a name (e.g., `Product`) and a slug (`product`). +5. **Add Fields**: Drag and drop fields like "Short Text" for Name and "Number" for Price. +6. **Save Schema**: This creates the "Template". +7. **Navigate to Entries** (via the "View Entries" button on the Content Type card). +8. **Click "New Entry"**: Fill in the real data. +9. **Toggle to "Published"**: Click the status button. +10. **Fetch**: Go to **API Keys**, copy your token, and hit `GET /v1/entries/product`. + +## 4. Real Example Content: SaaS Landing Page + +**Structure**: +- **Hero Title**: Short Text +- **Hero Subtitle**: Long Text +- **CTA Text**: Short Text +- **Feature List**: (Repeater or JSON Block) +- **Pricing Plans**: (Connected Entries or JSON) + +**Example Data**: +- *Title*: "Ship faster with FlowCMS" +- *Subtitle*: "The industrial-grade headless CMS for modern teams." +- *CTA*: "Start for Free" + +## 5. Founder Confusion Audit + +- **The "Environment" Trap**: We found ourselves creating content in "Production" but trying to fetch it without specifying the environment, or being confused why it doesn't show up in a different environment. +- **Slug Collisions**: It wasn't immediately obvious that slugs must be unique per workspace, not just per content type. +- **Draft vs Published**: Sometimes we'd save an entry and forget to publish, then spend 10 minutes wondering why the API returned an empty array. + +## 6. UX Friction Notes + +- **Labels**: "Content Types" is a technical term. First-time users often look for "Schemas" or "Tables". +- **Missing Feedback**: When saving a schema, the "Success" state is a bit too subtle. Users often click "Save" twice. +- **API URL Discovery**: Finding the exact endpoint URL to fetch a specific content type is buried. It should be on the Content Type detail page. +- **Empty States**: The dashboard feels "cold" for a new user. There's no "Create your first post" guidance. + +## 7. What Should Be Simplified + +- **Auto-Publishing**: Option to publish immediately upon creation for simple workflows. +- **Quick-Start Templates**: Instead of a blank canvas, offer "Blog", "Documentation", or "Portfolio" presets that create both the Content Type and a sample Entry. +- **In-Editor API Preview**: A small drawer that shows the exact JSON you'll get for the entry you're currently editing. diff --git a/docs/internal-guides/onboarding-flow.md b/docs/internal-guides/onboarding-flow.md new file mode 100644 index 0000000..fc77e6e --- /dev/null +++ b/docs/internal-guides/onboarding-flow.md @@ -0,0 +1,48 @@ +# Internal Audit: Onboarding Flow + +## 1. The "Zero-Knowledge" Test + +If a user signs up today with zero knowledge of FlowCMS, here is what happens: + +1. **Email/Social Signup**: Smooth. +2. **"Welcome to FlowCMS"**: A nice animation, but no context on what to do next. +3. **Workspace Creation**: Asks for a name. Simple. +4. **The Tutorial**: Asks you to "Select a blueprint". This is the first decision. + - **Friction**: The user doesn't know what a "blueprint" is yet. + - **Fear**: "If I pick the wrong one, can I change it later?" +5. **Dashboard Drop**: The user is dropped into the main dashboard. + - **The Problem**: It's empty. Zero guidance on the next click. + +## 2. Exact Real Workflow (Current) + +## Reality Check: The Onboarding Theater +- **Actually implemented now**: Real workspace and schema creation in the database. +- **Partially implemented**: The "Blueprint" selection. It only supports two hardcoded options (Blog and a Default). +- **Planned but missing**: **Sample Entries**. The user is left with a schema but an empty dashboard. **Automated API Keys**. + +## 3. First User Experience Audit (The "Time to Value") + +- **Time to first schema**: 2 minutes. +- **Time to first entry**: 5 minutes. +- **Time to first API fetch**: 10 minutes (if they find the API Keys section). +- **The "Aha!" Moment**: When they see the JSON response in the browser. +- **The "Ugh" Moment**: When they realize they have to set up an API Key and use Header Auth to see their own content. + +## 4. Founder Confusion Audit + +- **Waitlist Gating**: We were confused if the waitlist was active or not during our own testing. +- **Verification Email**: If it doesn't arrive, the user is stuck on a blank screen with no "Resend" button. +- **Default Environment**: We didn't know which environment was "Active" by default. + +## 5. UX Friction Notes + +- **The "Empty Dashboard" Syndrome**: When there are no Content Types, the dashboard is just a sidebar. It should be a checklist: "1. Create Schema, 2. Add Content, 3. Connect API". +- **Terminology**: We use "Schema", "Content Type", and "Blueprint" interchangeably in the onboarding. We need to pick one and stick to it. +- **Missing Success Path**: After creating a workspace, we should show a "Copy this cURL command to see your data" snippet immediately. + +## 6. What Should Be Simplified + +- **The "Skip" Option**: Let users skip the onboarding if they are returning users. +- **Interactive Tour**: A simple "Pulsing Dot" that says "Click here to add your first post". +- **Instant Preview**: Instead of just saving, show a "Live API View" side-by-side during the onboarding. +- **Auto-Generated API Key**: Create a "Development" key automatically so the user doesn't have to navigate to settings. diff --git a/docs/internal-guides/pages-guide.md b/docs/internal-guides/pages-guide.md new file mode 100644 index 0000000..b8dccb2 --- /dev/null +++ b/docs/internal-guides/pages-guide.md @@ -0,0 +1,69 @@ +# Internal Guide: Pages & Block Builder + +## 1. What This Feature Is Supposed To Do + +Pages are **one-off site layouts**. +- **Why it exists**: Sometimes content doesn't fit into a "list". You need a "Home" page with a hero, some features, and a pricing table. +- **When to use it**: Landing pages, "About" pages, "Contact" pages. +- **Why it matters**: It gives marketing teams the power to build unique layouts without asking developers for new "schemas". + +## 2. Pages vs Entries: The Deciding Factor + +| Feature | Entries | Pages | +|---------|---------|-------| +| **Structure** | Schema-First (Rigid) | Layout-First (Flexible) | +| **Quantity** | High (Hundreds/Thousands) | Low (Tens) | +| **Use Case** | Blog, Product, Team | Home, Landing, Docs | +| **Building Block** | Fields | Blocks | + +**User Confusion Rule**: If you are making a list of things, use **Entries**. If you are making a specific URL on your site, use **Pages**. + +## 3. Exact Real Workflow + +1. **New Page**: Dashboard -> Pages -> New Page. +2. **Setup**: Give it a Title ("Home") and Slug ("home"). +3. **Canvas**: Start with a "Blank Canvas". +## Reality Check: The Block Canvas +- **Actually implemented now**: **Drag and Drop** block reordering. 9 block types. +- **Partially implemented**: Block customization. Some blocks have more settings than others. +- **Planned but missing**: **Global Blocks**. **Live Preview** (the button is currently a placeholder). + +## 4. Step-by-Step Operator Instructions + +1. Go to **Dashboard -> Pages**. +2. Click **"Create New Page"**. +3. Title: "Summer Sale Landing". +4. Click the **"Blocks"** tab. +5. Drag a **"Hero"** block to the top. +6. Edit the heading to "50% Off Everything". +7. Drag a **"Pricing"** block below it. +8. Click **"Save Page"**. +9. Visit the API link provided on the card to see the JSON representation of these blocks. + +## 5. Real Example Content: Pricing Page + +**Blocks**: +1. **Hero**: "Simple, Transparent Pricing" +2. **Pricing Grid**: + - Plan 1: "Hobby" ($0) + - Plan 2: "Pro" ($19) +3. **FAQ**: "Can I cancel anytime?" +4. **CTA**: "Get Started Now" + +## 6. Founder Confusion Audit + +- **"Where do I edit the text?"**: We found that clicking a block doesn't always open the editor sidebar immediately. It feels unresponsive. +- **Block Reuse**: We wanted to use a block from one page on another. You can't. You have to rebuild it. This is frustrating. +- **API Shape**: The JSON returned for Pages is an array of objects with `type` and `data`. Developers have to write a "Block Renderer" on the frontend, which is more work than a standard flat Entry. + +## 7. UX Friction Notes + +- **Preview**: The "Preview" button doesn't actually show a live site (unless you've configured a preview URL). It just shows a skeleton. This is misleading. +- **Reordering**: Dragging blocks to reorder them is difficult to trigger. +- **Required Fields**: There's no way to mark a block field as "Required". A user can save a Hero block without a title, which breaks the frontend. + +## 8. What Should Be Simplified + +- **Global Blocks**: Allow saving a "Footer" or "CTA" as a global block that updates everywhere. +- **Direct Text Editing**: Stop using sidebars for everything. Let users click the text on the canvas and type directly. +- **Pre-Built Layouts**: Provide 5 full-page blueprints (SaaS Home, Ecommerce Product, Blog Hub) so users just "swap text". diff --git a/docs/internal-guides/real-user-workflows.md b/docs/internal-guides/real-user-workflows.md new file mode 100644 index 0000000..92fccbe --- /dev/null +++ b/docs/internal-guides/real-user-workflows.md @@ -0,0 +1,61 @@ +# Internal Guide: Real User Workflows + +## 1. Scenario: Building a "Docs" Hub +**User Goal**: Create a structured documentation site. + +**Workflow**: +1. **Create Content Type**: "Docs Page". +2. **Add Fields**: + - `Section` (Select: Setup, API, Deployment) + - `Title` (Short Text) + - `Content` (Markdown/Rich Text) + - `Order` (Number) +3. **Create Entries**: One for every doc page. +4. **Fetch**: Frontend requests `GET /v1/entries/docs-page?sort=order:asc`. + +**Why this is good**: Centralized control. If you change a "Setup" step, it updates everywhere. + +--- + +## 2. Scenario: SaaS Marketing Landing +**User Goal**: Quickly spin up a "Summer Sale" page. + +**Workflow**: +1. **Create Page**: "Summer Sale". +2. **Slug**: `/sale`. +3. **Use Template**: Pick "High Conversion Landing". +4. **Customize**: Change the pricing from $99 to $49. +5. **Publish**: Toggle live. + +**Why this is good**: Speed. No developer needed for the sale. + +--- + +## 3. Scenario: Multi-Brand Product Feed +**User Goal**: Manage product data for two different websites from one CMS. + +**Workflow**: +1. **Create Content Type**: "Product". +2. **Add Field**: `Brand` (Select: Brand A, Brand B). +3. **Fetch (Brand A)**: `GET /v1/entries/product?filter=brand:BrandA`. +4. **Fetch (Brand B)**: `GET /v1/entries/product?filter=brand:BrandB`. + +**Why this is good**: One source of truth for inventory. + +--- + +## 4. Scenario: Internal Company Handbook +**User Goal**: Private content for employees only. + +**Workflow**: +1. **Create Content Type**: "Policy". +2. **Create API Key**: Scope it to `read:entries`. +3. **Secure**: Frontend checks employee login before using the key to fetch data. + +--- + +## 5. What Should Be Simplified + +- **The "Slug" Mental Model**: Users struggle with why `/docs` and `docs-page` are different. We should suggest common patterns. +- **Relational Content**: If a "Blog Post" needs an "Author", creating that relationship is currently 4-5 clicks deep. It should be possible to "Create New Author" from inside the Blog Post editor. +- **Image Optimization**: Users upload 5MB PNGs. We should auto-convert to WebP and provide different sizes via the API. diff --git a/docs/internal-guides/should-pages-exist.md b/docs/internal-guides/should-pages-exist.md new file mode 100644 index 0000000..6ac8aa5 --- /dev/null +++ b/docs/internal-guides/should-pages-exist.md @@ -0,0 +1,47 @@ +# Internal Audit: Should "Pages" Exist? + +## 1. The Core Tension +FlowCMS currently has two parallel systems for content: +1. **Entries**: Rigid, schema-driven JSON data (stored in **Collections**). +2. **Pages**: Flexible, block-driven JSON layout. + +From a user's perspective, both represent "content." The distinction is purely an architectural choice we made early on. + +## 2. Is "Pages" a Design Illusion? +Right now, `Page` is a standalone Prisma model. But architectural truth suggests that a "Page" is simply an entry that uses a **Block System** instead of a **Field System**. + +### Why they are different (Today): +- **Entries** require you to define a **Collection** (Schema) before you can type anything. +- **Pages** let you jump straight into a canvas and add blocks. + +### Why they are the same (In Reality): +- Both are stored as JSON in the database. +- Both are delivered via a REST API. +- Both have slugs, titles, and publishing statuses. + +## 3. The Merger Argument: Everything is an Entry +If we kill the "Pages" module and merge it into "Entries," what changes? + +### The "Universal Entry" Model: +A **Collection** could have two modes: +1. **Structured Mode**: Standard fields (Title, Price, Date). +2. **Layout Mode**: A single `blocks` field that uses the Block Editor. + +**Pros of Merging**: +- **One System to Explain**: "Everything in FlowCMS is an Entry." +- **Developer Simplicity**: One API endpoint for everything. No more `/v1/pages` vs `/v1/entries`. +- **Powerful Hybrids**: Imagine a "Blog Post" Collection that has structured metadata (Title, Author, Tags) but uses the **Block Editor** for the actual post content. This is currently impossible. + +**Cons of Merging**: +- **Discovery**: Landing pages are often managed by different people than blog posts. Having them in separate buckets is a "perceived" organization benefit. + +## 4. Brutal Recommendation: KILL PAGES +We should stop treating "Pages" as a separate system. It is a technical silo that creates massive UX friction. + +**The Fix**: +- Deprecate the `Page` model. +- Add a `mode` field to **Collection** (`STRUCTURED` vs `VISUAL`). +- If `mode === VISUAL`, the entry editor becomes the **Block Editor**. +- If `mode === STRUCTURED`, it remains the **Field Form**. + +**Result**: We solve the "Pages vs. Entries" confusion by deleting the confusion. diff --git a/docs/internal-guides/testing-playbook.md b/docs/internal-guides/testing-playbook.md new file mode 100644 index 0000000..4797de1 --- /dev/null +++ b/docs/internal-guides/testing-playbook.md @@ -0,0 +1,42 @@ +# Internal Guide: Testing Playbook + +## 1. The "First-Time User" Smoke Test +**Goal**: Verify the core value loop works. + +1. **Clean Slate**: Create a new account with a dummy email. +2. **Onboarding**: Complete workspace creation. +3. **Schema**: Create a "Test Type" with one text field. +4. **Entry**: Add one entry. Publish it. +5. **API**: Create an API key. +6. **Fetch**: Run `curl -H "Authorization: Bearer " /v1/entries/test-type`. +7. **Verify**: If JSON returns the entry, test PASSED. + +## 2. The "Block Builder" Stress Test +**Goal**: Ensure complex layouts don't break the DB. + +1. Create a new **Page**. +2. Add **10+ blocks** of different types. +3. Reorder them. +4. Save. +5. Refresh the page. +6. **Verify**: Are the blocks in the same order? (This is a frequent bug). + +## 3. The "Media" Loop +1. Upload a 2MB JPEG. +2. Add it to an entry. +3. Delete the entry. +4. **Verify**: Does the image still exist in the media library? (It should). +5. Delete the image from the media library. +6. **Verify**: Check the URL. It should return a `404`. + +## 4. The "Billing" Gate +1. Create a "Hobby" workspace. +2. Try to create 10 Content Types (Limit is 5). +3. **Verify**: Does it block you? +4. Upgrade to "Pro". +5. **Verify**: Can you now create the 6th Content Type? + +## 5. What Should Be Simplified (Testing) +- **Automated E2E**: We need Playwright tests for the "Happy Path". +- **Seed Data**: A script to populate a workspace with 100 entries to test pagination. +- **API Sandbox**: An in-browser tool (like Swagger or Postman) inside the dashboard to test endpoints without leaving the site. diff --git a/docs/internal-guides/ux-confusion-audit.md b/docs/internal-guides/ux-confusion-audit.md new file mode 100644 index 0000000..aa440bb --- /dev/null +++ b/docs/internal-guides/ux-confusion-audit.md @@ -0,0 +1,31 @@ +# Internal Audit: UX Confusion (The Truth) + +## 1. Why do Pages and Entries both exist? +**The Confusion**: Even we (the founders) found ourselves asking: "Wait, should I make this a Page or a Content Type called 'Page'?" +**The Reality**: Currently, "Pages" are just a special Content Type that we hardcoded. This is confusing because it implies "Pages" are special, but they are just block-based entries. +**Honest Take**: We should probably merge them and just have "Block-based" vs "Field-based" entry modes. + +## 2. Why is schema setup harder than expected? +**The Confusion**: Dragging fields into a builder feels like "Work". Users want to "Write". +**The Reality**: The product forces you to be a "Database Architect" before you can be an "Author". +**Honest Take**: We should let users "Write first, structure later". A "Freeform" mode that extracts fields automatically would be the killer feature. + +## 3. Why is the publishing flow not obvious? +**The Confusion**: We kept forgetting to publish. +**The Reality**: "Save" and "Publish" are two separate concepts in our heads, but for a solo developer, they are the same thing. +**Honest Take**: We are over-engineering for "Enterprise Workflows" when our current users just want to see their text on a screen. + +## 4. Why is onboarding unclear? +**The Confusion**: We built the onboarding to look pretty, not to teach. +**The Reality**: The "Blueprint" selection feels like a final choice, when it's actually just a starter. +**Honest Take**: The onboarding should end with the user making a real API call. Currently, it ends with a "Success" screen and no clear next step. + +## 5. Why is "Environment" management hidden? +**The Confusion**: We have "Development" and "Production" in the DB, but the UI barely mentions them. +**The Reality**: We are scared to confuse users with "Environments", so we hide them. But then users get confused why their API calls fail or return old data. +**Honest Take**: We should lean into it. Make the environment clear in the top bar at all times. + +## 6. What feels "Broken" even if it works? +- **The Loader**: It's too fast. Sometimes you aren't sure if the page refreshed or if it just didn't do anything. +- **The Sidebar**: It takes up too much space on smaller screens. +- **The "Settings"**: They are scattered. Billing is one place, API Keys another, Team another. It should be one "Workspace Settings" hub. diff --git a/docs/internal-guides/what-needs-to-be-simplified.md b/docs/internal-guides/what-needs-to-be-simplified.md new file mode 100644 index 0000000..e674fa2 --- /dev/null +++ b/docs/internal-guides/what-needs-to-be-simplified.md @@ -0,0 +1,41 @@ +# Internal Audit: What MUST Be Simplified + +## 1. The Core Thesis +Why would users struggle using FlowCMS today? +**Answer**: Because we force them to understand "Headless Architecture" before they can see a single word of their content. + +## 2. Strategic Simplifications (Pre-Launch) + +### A. Kill the "Empty Dashboard" +- **Problem**: When a user logs in for the first time, they see an empty graph. It feels like they have to "Build a machine" rather than "Write content". +- **Fix**: The dashboard should be the **Content Editor** by default if you have a schema, or a **Template Picker** if you don't. Stop showing usage stats to people with zero usage. + +### B. Merge "Pages" and "Entries" (Conceptually) +- **Problem**: Explaining the difference between Pages and Entries takes too much documentation. +- **Fix**: Everything is an "Entry". Some entries use **Fields** (Structured), some use **Blocks** (Layout). Let the user decide the "Mode" when creating the Content Type. + +### C. Zero-Config API +- **Problem**: Setting up an API Key and header auth is a barrier for a 5-minute trial. +- **Fix**: Provide a "Public Access" toggle for Content Types. Let users hit a URL and see their JSON immediately without a Bearer token. + +### D. Inline "Quick-Edit" +- **Problem**: To change one word, you have to: 1. Login, 2. Find Type, 3. Find Entry, 4. Click Edit, 5. Save, 6. Publish. +- **Fix**: A "Global Search" (CMD+K) that lets you search for a phrase and takes you directly to the editor for that entry. + +### E. One-Click Blueprint Deployment +- **Problem**: Blueprints currently just set the schema. You still have to add content. +- **Fix**: Blueprints should include **Sample Content**. If I pick "Blog", give me a "Hello World" post already published. Let me see the value loop working in 10 seconds. + +## 3. Why users will leave today +1. **"Too much setup"**: They want to see how it looks on their site, but they have to spend 20 minutes building a schema. +2. **"Confusing Labels"**: They don't know if they need a "Page" or an "Entry". +3. **"Where's my data?"**: They published it, but the API returned `[]` because they didn't know about the `?status=all` flag or they used the wrong environment. + +## 4. Final Verdict +FlowCMS is a powerful engine, but it's currently built for the person who **built it**, not for the person who **needs it**. + +We need to shift from: +> "Define your infrastructure, then add data." + +To: +> "Write your content, we'll handle the infrastructure." diff --git a/docs/plans/archive/FlowCMS_Waitlist_Admin_Plan.docx b/docs/plans/archive/FlowCMS_Waitlist_Admin_Plan.docx new file mode 100644 index 0000000000000000000000000000000000000000..f69143e7a4143e7b7633ee21094f080d91e18dcd GIT binary patch literal 32424 zcmZ^~V{~Rg*DV^`HlNt&*tR=H$F^_z>-34G2P8|ZdH%E zH28$Z8@BGf_q~zu%;m%r%ylcAiy}t6&#TYw75$R4hnsg^boe*Moflc5sf1}7cQI)| zfo;#NkyyZ~`6AzJz9HCKi3|yjW2>SNJA&*baaaRtWHfI)O8nsRNn+Z?SH|1QI0Da)7z9N3%{VCsv&VEn4`h($*$GcU5nMMJP89XV8-Zj(5qz73 znh#0ervpT;Q~IXX*1~k1>-6`V)3#?gp1(Vix)ZWPsqypTV4$ty`guXiRDM%;VTZDll9GNMJf^w; z;Zp++_MV*xpg7~1_BwBiI6kk6tzCU8GQ)aqaWre}5 zZ7a9o+K5j4eR?|D5w@02W}{VCdLX^;6>OYIZQtKhl;%{+0bLl@s2Wx*@^)jm6{r7P z!r5^q3ybM7eae+|={9;u`go~}eG>3dT*72*SGwKV3FZ`f)^-bIlYFQ$irJ7c?Hdbj z2#|-SHF{O#cRD)bw?k}w2_x-j+J>aQ{U^z^uKg4A&d^C_PTHkiP@OI*Qo!IJSZ)=X z)mdL~7Pe)3)}(Cbv7gDfuKqBBRbDhi_tg;Td|KKK@WkG9M6UaL-u-jcraQqxc8vT& zcPG$)U|FCrN5w$kbE7s3>DBS}X~9*g*&(u+X5+90k1g!mTD5Ym48{EP#Ln&+=t>YI z__AwYYMV^zVqRq(k}WI9pf7wX`YIbv^4^j(t!PHzAVB zW(a~yY~AuJ`{uS_@t6;O8DiMZd7zMUiFB!HN<>3?d-px$a;Nz&SJOj{bw9C;0=`(SG_eR<`(6e-v7`g!tZ^os-II5jG)6cVCc zt0=$h7&=4jjHTQ~cA@^JHJlEEj@?QN($y*LkR#YI|(^5+HuG}h3?z4J4 zT59Z_B=NO==18IAFQ`- zDA?PD>WWLw%BJ~U?%5n>^22Bh9>L$#N8Jd-P z^^Ml>U~V?#$k?EAKS}WK6JOya+Xkch*4JBitifAZ$ne zh9Gmp&!M;D%nKmZWm}Nb7+Ekoad{|^3QETNjXDeIDPkB2DBsTu-#lVB+y__|@PIH@ zD#{wYk^GeavEBk1nI-qQ4=KJ6o|iI0nMab(y)R6I?v|2Dh84E)>#;{@+eYI#REGBm z@v{}iEQ&k~@xXznXMpNvXVUlP7vJkTuyt8SmhW`(yxuv28q~7Y)){FUfpTtl$2%F} zot_d-a5ZbhvsRziy{Yo|_MSgz=U-hpAVSX0_IURfcV?dAcwFjd=z?#_8_GHPxU5uy zr_Gs%-^-_n1Y+)-kiI8V*Z1od5&af1do!H|0YFB&EV^LK^i(?Ux_^%@T5xHxUV1K%;YfTKwGo=(j`NOx7N)){PeB=QR?hMhwtAp>puLGRJP^d5 zUNP(8%n})KqoNaGzGNzeQYMiR9*A#c!qP` zwK@ZIXwA}w0{VR(Kli3PCF-bMozW-*0k5z}rU8>NHv`Sl^WL})>w zK}N!eP_z|i?1+l^IC$0Zn(WL`<7G1$VZXKj2tk98;J!8BgyD!VZ$eOSkYXJfXCfJU zPH@k!DE9d&O}CJkz5NKvt@FXC{^0YW7f~Y%dhlxqFrV76ynpf09)gh`p5I!uL+CLv zpLjoAX(g3W2{RXJsN#?&#m57c{lJwXaF7KN!%SV`$+HM?fNw~y1p9I=`^47+1G=2=~3uc&aZ?jPKUH|=p7W2B6<+PK#1xqT--Qf8f|65M;S`;B@ zo*#0)mNPC79%CBsP}>M4DB%kX;2j&u)>+FCc$o7gk+?8`D?Bzu5G(w-MUg;wKatEh zs<&+Psb87F6U>EHnaM6bji1>mc4l$iXHgGV;sJ>lN1!sE4F7zt;>&S)Hn-3Y-NdjM zY5Q+;4Dns@q@b35c&BuRi35E?g=d->onZt$XLPSrSMEWX7%`O4gK_9rtWGzluKP40 zel3q$RMg5L?C@)8IXm_<{wy6r#b3TL!N(iB%+QJ|`LlciHR4h&Hf+Yl5#fmN=zDJBdjvxfDH8y=l}J0(o~!~ze*i86m6w1tGdt$cgtyDb zZeS!x#NoLF8H~*}tkEsjqTHf6Jqy zfd>Tle0}baHxGe5CjCPvJCrD+aIB`Vy-bw^=@I3qj|=Y1M4u3i36jKdtbm9?S8O2N zOU%S4l^5#M1L~7^pGV^LNU@oCPK;AbEmv(995Hd&AX4hhd?P{usKm9Y#wp{ZC0!x} zJ61ro-atfiK=n5M70C!{2p&>|5RZu3B;^(I*8}n=1PhC(Gqvh25gWV1X5mzf$h3$y zB%c@!P(VBuK#V!K_j5P*$&>d$b&r+i$p~9|q_4tO-y#D=N?ai@y;~nJo!N1_?8EWa z1?BV@GO1yj_(=L!m|{Q10jjaFu^|BJz5~I`-R1I@beXLVl^8*Xu83w7IpSYS5gFI? zq8X&;mIY9EY^8gE(n+kFT`)cOgh>W7hKq3_u@Gj_aK))}+}(>Cq9;%9d4eup^Wq=9 z(hc!dV#+}0a|ixI4co(189ah_vjMC{rwU{tj0?&KIEYN&KBdJpWUFse+uBI)*N|Ix zXl~~m(~{f#PhH%R666^-%IjeN)|Crc%36i_NzA z1s}nBi3WNd4+O(^HR~rn9B1s@*#>LoTK_1I&@`~lKh1~V(LpFhV1NwfnUA$)D?{C4R}yQ9r@#|#9fVl?NdRp!vCpul`4V_ z{;5KXp$P35(BkUg#Aq<7$qMx%UlP!|k|LVxf;8SC;I7Uqp|P1WY{*$+V-87vb8%ZTK~FBRI9dvOWKf{jHJ@Qh2!X?6%#tjk&no!Z^71y`3lNPj z3EXEcrm(=ucJ0kDEv=0Ei5|xUj7%-F*J^}B*0n-KM%MX7*2M;UB}owlt64nbD=X>? zc){sTqxThmbuyd>jfaIM^e4m0ayej}yGlJd?IG+ISup2`Ilh;1%|z$z%RB${Oet~tI+Xn)=ce^x!6SwB{V zpwX8WLb)XdpK9ELl54O;k&4jr8wASjhvD489%Aan>!tCsUhUPruHOBDI)cjP;Hts* z;o{o-1|JjI)}V-|v%Hv_-J$ChG=Q_+L~od;CUIdOOgl3sNC2`I#tC7)^smd;vkH+R zMc`doZpp3uEs>zz5^`^nvWqf@XWD~@*%1_0rYf;c?rF&_i%FlsQ}|3GU@U5!t<*UQ z)4tU`35dg$J|iCyR+LvHoc8Q}a6Q^Wg3}tXyHr=#5H?ITvzl8TO(aaWKv!ZjAd*+o zPibVUR1adzDm4GqQ5O^u9l_gWkeji^MSw(Aes1Y1!rW0w;;_O)pGe<8Sx(={n?a(S z)F}%acEEuLOtSh_U#<(^I`Q<>%=dDV8)uA5>c*C#-VmhRSPxX_nRXc@zJ%pX_qHDT zuZghovElRWEPX0w`!5~O0v@U1MbtaITk0FsAt2iM>}X>R7oSm^aqi4SqqWi2invHe z`6-Vvqjx=)Vvs~#NSK3Qk0uE6b8yk8K$Umx`$*Z@wA95T;{~Qxv@3G%fjt@mPKcpI zo^^Wd`kceYCRq4{Y0kaKai=|bxMeVG=gH0>Kl4R5cQsn(U^Y-DXl+U+L_lmVD@=nr zYg%Yq9h6F{`d0TM4Qf7Ri2OJ7h`q}%CLqc*R6(|a*X$uIV`fNg*Mp7Pg|$hS1vB3H zn==7%7(QeY*Jbc#P|OO#N-9OqwUK7L9MegyAFNDXo`{OEOPQY8qb2`|c5@Vi z_MOtcVZ-V1L%1Pj+7|>Kx>D~d94H)^NEW;DsD4}3l^oYe{2j(AXH(RTjG%k@rLP#= ze{sXt7Ldh8cqjiH&?K4owMK+r5>Izd=*u?g`n^D~(gSxcJ=DX{*6|TiZgxP6m-0f0 z(@mkg?~DJ3;t#6|P3dImpNmMTy#QiiEZOJB_3 zzJTwQn%;nKb_h7wFT=j?(gE6pfNx-KhBmnj^;`b$B>h&Td$vi18tl?%j=*dky!4MW ziDcu9x1Fc5uzT_*){!W+rC}?f3n<4<6$%1OolT2ltgtt?xJc?K3~(duJXv=uhp& zbPp@7E^kL0mvLQ31UkxLlxt|E{tJU!%iRjCVgnc_LXH z58hAlz!A2MbNSthU~cshQatH)!{eEO6uVYl17QW22p>f)$+VB3B}{q)i2uD`>1SjD zdm>Yv>}C$dnjK1Jr3?W?Isa^--322DTrz~Juw!+kC!m$k^IVw*q4wFw)}h9fVg-Ti zK@IlvqIx&FVprmbQL<4mIPWV{_ep|Na~St590aDsDbZ6DL?OTp^Nqx)Wt6?-1b0Mx z{nDTXD#;;=V4n@4g%W(~qcRjGrzqys{|1hN|Kj^#X*Q1@YE`AT74qGC|n>Klp6l>`X~RiX8~O*kP#3GW)%g70N(2@ z8uxs&7~~|JwlAv@zj>=Eh_V5Z-A+Pzf;7#)&td44uG?wALmZ($*-a#aM zx+06HES-T}mgcITE-(b^=|nlU)pqpcn;e7E>--fwy@uOTpv7XE2w!8A7MmUR59#%1S(%Hs z=%P%?tx^Y3==1kbpJgApzaH=6<>l~HI3UkI?!}sIlvqoyB`R23FqT?IaZK=9)^~r) z--iOK{R%s52k_y;S3&r+$MP~XPvr!1=#W5uV<~)=PR1GJh?hmtlxxXtDh#u2Ecj>X zl}B_jG@!e#3r@vd6fT}vUM%M$kEgANA3Xg|eWA(s0T~zvGHzoz2rGKvROj=mBi`HP zq$}tkW2&C;e5BauqO}AYWa2fpv>DQ)=67w*QixggnI8B_$qc%IEBpSRm_MA0@icX` zThYJ+4rS^HkBX_nIt{-=Wj5+i31~8oghn*Es)F9CY4U5*rOHOcOHCC>kZFqHqBaRdaiFf2Qo8l>Pn9Rxawb7cbaU*ql^dtdkR*6-*WY_qY zzY_>2d}I1ws5pR>XdKgioNJ5lkMUA1 zUih?SUB?Sc!rYHCW!7JOeZYtA*ZfLu5j)g`eZYZv&>3H`S4MG%ttkvM*^@KzXRG>+ zC1wxB(-5>;E21Bvz|sG@?qm}b1~o6{W*ho!0gcVUe0!!8ul;UD;+YQ_&Ed3mO#Y#V z^l*=nH9NzUYysVnIK08mp2&IPBR^vp7S3ql`PB9jdYIqrlrt7aiI(zb!$~-}|7Z!N z!iqqk>5Togdt(f*o>DT9Akz>W^p^n#f$*|lzbit2K@@MSRCojrFpKbS6UuZ+Z&lR%4a{Kblp!PN_MHh&+RWLs=^Kl75>=56n*lZm1O_(JNQd zbv9oTgM;$X3nS`1)z!$YJ&4*N2-wf(=9*FyiY*LuC+Us8Js5GV@S%==Yi(4&?Eppu z5GROJxDqtt%hoL6i3CpX^)Cz0Ea&@4lkI*Kp1|KK(kc_!#xd(Drw8EE*Q6thfs%e8 zY3>UcnjK>Tf;k#g{T$fCi^fFioV_?sAzSD2ExH{aL~ft!C^~~o>@jCD)HDpt8m%Qm zCQRY5dU0XkG>U9L;12RIOa!B=Fc1M8B+}8Lo1|$eqF}*s}o>tbSrH> zo}RciSJs(En%#%|OIj!9p5Zu?NN9!#v7N&8&IjaR=jg zXn_{i^Az@XOF;4UwdLVVUgmaK=JflC9XXmugsQRim!3FH~<*3xUk)&V~8hpM*zC`|OHGQ+T`jt;`V+M)E} zeeGYcgwk;PpGj5&c6?i-z}VL{i}Xv~)Za(eN)MiGpDws_D@I0gw{tJ`k}qop2xQ(Vm82yL(qlt6cA zQwpk|R&XW=DC|EA$S)5sJBoCMc1kA5KZyn!+hJuYrDW${kq@hxQQvdgW+ljA3Jgn* z=^#sA?#(p6;_Rp3wm5OMEU`z{Msf^gaxGW^k;pyRr9-B=69_^%Io*F#*(xvnB}#Wn zs@c_NalH9<+0!NvSoq}<2$n#ex%{V} z`P)_9AGP`{DuhVqyXG4hE{QZ6G{pbLwq+J&4xyD*dyt#Tbn1m0gR^OEaOP zu-S-UB(X%JQ-ixvs$I&-I(RaP!}*6$z=BSd`CxzLv&T@*%d4SV$-|vc^n3 z5;U@<1~l^Ey;+f}cH_vgXlE)b^cR51WvDON7~K1=ddP=S9^@YIQ!vW!*K?F_+yTUB z2}-0ld3A(HsolhTaHcaQN(83m8$HV_B}#;7WprT36^O2Kad2hwT2tFl$rX6|!C86l#W{xq5(=Ar}pex+AAwUJ@J)aZp4`n=@(q|}TN{p#$w zgf_imbOmvwm?hwYuu9+(vFX}5H@T87`mLsl{vokGNAnJ9!%3`A8oHrq zD=3fBZ8;wZune&W(<#xE+*EcjW7$D8OND{~K)I=b42+i;Dt0+b`PW6eqMapOJSQX$ zI!!+g6ekbUaNjqjLpB$*mM^}46?G46;Fw;;CQ3H&>O)UN$_IJwZ=wU^K@xFo+rMmb zwybVnZt}!U#79abmgKSuU@js5h0?pJaWQnPTVCui<98FLeieed4$8%6FC}>cVZ{5a50P~g zl;FkQyBJk;sS`(sgGySyEvm=}tT1_+05F`p)-@3L$ZFCQu?ZpzWZ4tbhqq_0l2&dL zw7SQAYCuMtMH8#_E93z0citc4z@`lk6EQS+tBn|b4%h}NhJ=_ANv_6Jss9it{~X{j zkw3L?tn*1Y8F;e-E8zH?_gv;>WHs1ESW@^1+mh?8UZsBy1|fUq+WF`v}eGZ5U*zD5l6-FynZg~$(c zuP?~Qzp5s)vxQkRv02~!2ZWM?M>M<|C(T*x|3hYRrIliSxwxl4O}4j>XDsBCrilrv zKIhzYiGaIr!u+Lh!|eisdG&&IH@K7S_Kbu8{w~jtb+guZFh3b78Q07Z&5SKFlUv%8 z30y1!nc^FN)t-3$H+R<5Z(75`@<_G{&t22ZhU0rE6j_L7%Q;pt7?eU7?Bx^0qtWe3 zh1&~&k^*sqkX>ey#BI!Gb&>Ay+VHVOOh{zGLYEmIOHVpLVV-W=VM(@3a+%k1owQn8 zso7TfYXO7OwCNaRzmYu_AQzXTcHN`){EnE;WB46_n`XYYw-R~Q!Z#$BRS5mHz} z+Be4k?7e!%Uvi3kq?NSb>w7SnZNyat`A1k?g0qb$E{D$lskfGt03PzEnsB2? zxi>u?L=Y$Kv^e+J>Sf6f%5+K`lj^HsOqw@#XZbE?ueEK3H*8ts?Qpo0Vpb^;fS;`j zH9b|tc&fWBLbfr?n;_E9YjYMQ=2srHRCm?+F4YMf%*<1|;fO;a+Ge>ZGS&gl5w|g+ zD%6!xV@huFr2T#5X=7Xk(LD25K0>pXvFGpI0`W>Z}_f8?Mr1SYS#;M$rM+Z zLmQ_mT#i$}TQ4)z&^C2BXJV0+U>I634dXCPImFDluxl$9A zDbc9GQ8oBp9k<6P<}ljk=ys*&+mq6A`fziNwT%h>P;Ud~U?VkEc#6N4{F%JJFWcOX zZgN-CLQ=Rz&rjZCzIghq&xDOTTXHvFJk{C|gn&kPBt6vdzRvJ|&M3{Yc&<>G*V&L% z5J^BuA-G@+w0eJOM9HU>W(qDO-0l7Skp(mRJGqdonZW4t0+$>Po6Vo&i6Au)icFXVf#AFUhTVV?O8!s zG!;ir^hTKq(KV1NKusD8vKSJwZlE>>ZZ~UA;po;m_VpY)d$>4@p`-a7^4k<)CJjW1 zb3KXq^9gPgfRT^l#~jV<%~+_)ZO9`Wg0(iu-!;P(x%_k9lhkVwBb%H!Y}Ok zF)VC==ssg;`>D*8)r6I(t8YqLFM>A%^jxPadi3R%SFmb522RZoy$ITAX~63jvt;Qg zxMO)x0`h1|{5e^{TqV_oGZXS=i-^%h&g#j?_vD(jGvr)65K8{=rl3_lvVvRkR#QVk zHYe@AL&5Mcm)8R99(CV~!58+A=a)R2xH0#kQ0p0yVJR%ql9J|9vv`F3yu!Rpe*JL=7%MZ0^&beJ3y5(+x^ z)$l8;dKFh9b zneM_aly+L**~`AGMgtuiOnKVGPUN+B!bxW8>a5Xsk{_E|_2zlrnEmdHbCvbHj&q59 z$8WFaT3#8;`hf(S`zJ&5QqQt!sOC~r7l&GrW9c#_r|4v5>X*WPWPM@l`me`-$E z=~cd7s+EH&xfT0mr&irlr@wjYMMzDbI$s-{=i-@F;oIl$GXMHeqwiU-r_+yZ>oKJ> zX@jD~$zD?Mkx{L)%tz@`6!DD!OSD$H11ZU-A>l^W7(8~d;vtX%my^`rC{hJzYKMWb z7l%duFk12!r9UW<{L;Z&>37BF-4;p&Zp4Pl>MXsD z1m@MC7)EuXxH1<8dtImJMf)+iliAJT>F$F5W1fp~L%a=tsf$AOjb8d;(M~Gz?LR-7 zZt&?h4NlQc@?A2Wz7vvjRs$E7vNuXe$zmLN8o?V}iSeiVI0 zRAD64DO8~4gg#}tOD^#yhaxkIQOeb6zo+(P_NQu?EJvyDgjN^^`Gay^72(`l>cD1p z!9TW=PCvP=k`@Rnj~v|1v8Bj9OU?>o)MH0*y1*SaJ$2hDqc<{5ZCz{#MvrR5izFB1 zaq=QJ#4wyUBt{4JLJ1aa82>-~zm#Efq>PT9)4WUk_}k=$DD_3)$T#(dXt#y;+!=ct zK5G7M+t!eJ)8j#`qy%9J*`NuAhbuH?Ub(i4vim{(P8Gi%O^*yA&kRDx91WXew8n91 z6k$`8^l-XN^`xzZZ3$z#di&m!&h8kNHhaRt4M^?!QYal|8wT#Mx>x|sIo0`qJ7Pr# zJ(U~P^EJvA46hK2Vg8)3lz21|&Cv&OdJw*bWTxB?kY- zxuN^GRdqA8RUh{L#ov+E`&u-Iy{IqDd< zJCnIvx`)3|I@cL$1WD%8P1c>!OxCpD4W}s3Z!GH}f!g4z@N}Z}6n{+AqbJdK6Y6-~ zH_pI3AgJ#P(*MP_djjw~x5o$j#8WQM8whNb?XyH?ay(xrX~0YRrXczrb%@($DB7i< z9ho#^iV5uJ+v)e&Wwwv11HDloPKyP`LwkG0@F-#%J;PMGMYRy_j~mGs-%#OaQ~G(* zhVi!LH1R5>mWa!-GA|F_Sk9_1Bf}^5FW2^859}IKPaW9l0X49u|K3~urx1>JB^&a5 zX5DY{m6b0xB|h)+tysE(yb;5=q;-NDYn#<*-a%3vax9EK0DX}C`=(7dd>ibsG!)fi zxot#T8Af7BwS1yU@?=+}$)CMDOSMU9!Ig0n6Ty`x%ye)a8bqzxroXLVU=ts_UCh3a z&6^8VRi1ekln;~-vAU<_PZS)zHX~-pUKRiqK`)QeR}gs-iu ziTAp*rym&3Hl-OVkP?`{C!Ub=H!JqWg5uY$Qs0g$Ne-te$`y~)cVWsGs>S$Alk6wo z{`*@UUMhE>3}pIOr+F_Eyeu;elm!Z7+;v{-OjD~~A-57T`oz`2`ku|_E!{kR(pOu` zm!2DK!rS02XUPE+p98+p`#t&B5+zD!px}?piWBp}Dn*%>kB{?BVM8<{aG!r=-&ZJn z2Xx3k7{4U$kZ44YXs=c)T|6exfp5nlXUhIOl^r>yi3%a&H7nAcZRqv2%qI*EGT3)JI5!lZ`ax#dE(^MA`Nwo1m;Ke%9xpMj zd`Tb!T}yCyh&lc~Z*|6hmD>fBOoD{-)>WM@HU8@7R@3TAG1WOB0lgAHw$@lMulMl_ zg%I!+SqRg_fQ*{)#Qi(1E$N7ag&^sfg6Kx$LQR2pQx>haJg|!Tg-M}y_x99K|2Svj z6jXtNph+%k7F|-9FfqxVyw0pZ&w76LV(lE(KIjs1$h&*!a~&sj7kI0t`$wPg5deS` z^{o;8&K@=s)k9LA1wA}?!%+GFPxxZFPTYs$0=e;m?ml|y_N#2d6-#<0(&hY4Dvi`} zA~46qr^|ufExdAIV@9myo3W~C$k>WFN%7pd*i(8Ie0%-R>f8*v+1<^HxnC|36F0l_dy;Uu(1NXF+1N24#9Ii)0yfV?+$O# zi#iJwHA@t)N9oUx5fxcq-Zg5iFnb~}TPQM%-y=x!-=P&F0+IeM1pQH7Jr=|YG2~S< zw3$pG9l-j7`uyQzz>qLgxINLljh`h7{7*Oe@YG!9$}2~@ zD+!~xHio3$o7=iR5zi+AzepJ)h51~+BG2-o0nQVTFgtNnsSht{o&;>88(6a2=Y=V^ z_;k34S5%~XpZbM>JYdBt;g;Qz878&bd>&K4dKPkP{k}ef!wEg8Ec;+BD%jy40Yiw#}EP!6l{qy$o z3!&PL;qJEIDJjq#c+aMztj~9vT6WuxL*W9xDdoSxz;kmfr*6x7;4F_Ev`mKX>?p78 zDP5vbpitPFy3Rw@aRXYUBjg7OI9FN@v~BlyL2P0p^Aa{IyI>~qvdnfA&D3k8KgnJ$ zcD}Rc>EfQ?0IEAS06EzKR}-pQYi|)0k|@%U9NG%?)3tW#m(%9ff6UXb!V*1{u6UPHep`u?hF4*l zw4JkmrYwN#xlaRKAax*dnJ*ammr1o@lTV|wPyWzMjI53SRhqUjZp(3Z`!v?8CMfVf z+||dh*+a#R-w{Ct6Y1|4#z{?L##rT=Q2XKd-eKZg(<@@ z+P6SNkYl*}LILZ^6ZRbd?L`#HEebFHmZ9qQ#z8ifHGyu*+bdz=t@eYd;3HF;0ca~2=>%?P;3EAr**~_0PGAoOT z1>Nzj-0_8x;4kw9Ff#!t>lAhZUY{5dy#|s}QUp2VXA$YsJx^~WWIxPg0*wKp9I@~tLR1y z#cOc?33WQN@#jBHL&{c!Kc|FHfc|aJvf}QX{oVT7)^`~izr2nxHgUx=;^F{KQ?6$8 zM%W8tD?b91*V!3XMVI{VU)vsK9nq&c(T9E>Y@7(0eq|QZIT20AY^*Mu>9G(N< z&d5*S2&nGr?6vH*W!SWCn%U7c91nkcVJn-FkahwGktZQU9DB2O5-cVfs5f_5xzm$0 zsV1;gsQoJ<5G2D<)`>4X7C|}<8rm+QQ3Z-pREpTp^=`d@M(-?HmWJjan$?gvm%Y!i zZpCQ>T9BlA9uD&Kth|4?5RI!v6}vd;Z7iER(zkEF(vJVZFBBsHPXpKOdh{b40I``8 zbt?C7Fl>9#be>^D{c9xe-{)EuSsj47ZDf|oC=U+{i)$pP=(p~#lE?2~`)td=6Rf-U zlO3ub^2E(aMP@3>XOUEH5d~i=2vY8?{{xH`IV6;8`So80WZ>4#^})g%n<*%U%Lylkt!TBrp;nt)|dHBNK!_iTbtHRR~C9Bqk+tDPVuqk%<8Y5V}@f}|HXR|_?_e&R0E;emvT0nDB+_naeD{YZgPc% zj_z?!$G$u7(MINjgrg$2MtIKB<|&PKl6zvBg1}bzJJs2keEdvRH+4{$9SxRdCregM zDEj%wYvG!_zJpmpU9?n5y`0B8E-6ETLAu=`BbMQ(Cl`KD zf1Z-tV$HKDie?mVSV54yle98xLjpQ!7Th#$#ioV|)czD6@%y5JLb)wF4`|83P2)<6 z|CG6xWL=J%Pg4h_NS-KD8%B-sUNsRu|2cBFqD=3UWcTR9%z^DTy2aB0yb}Ke=(7h1 z{X(uz+UL^K;QvtImoCK&)0NZUUUK}Ec#S_#e~H832OaO8U+Ep5=3@xPdtZokXQL0D z(+B&)t+ML zs*I986@XU&O%52aO6(7M&9~?RiM#W_f)t1Rs2=E^5xK#q^r!=dIrc1UvSBbUTGPg4 zGFPCq9m!FAMV3};-R%gqL{tY){+4iDGDc}kY1|;G(N9NiYH8?R&RzBRoQ&}gCl<5! zBEM(=z{#}NWv)qLzyUqL+9vW1*AlhC*p@|AcD-ARF!eucFzdhTS3XyG_}5GF2yd3V z8ilvG%UVN6zaEAWuc9CQITS!`y=dJsB{czpc2dbOWqJZwBU%GNvuGOt>eg^;;;1|4WfUga+K{}%JWNDY0LhaFFySH$fQYI?5Oyv|jddc!OK9fvs7h(DU+D7{B z0P9Am2sZDPQ4%9T94J7BCL6gI;LUv08@38ISYzjSsUDOqmpx{Cv~DGZ zHp9TBoi#%fK?y=-uk>Qw?=^xbS)xpd0EW-32%b*^{TK3-j$`A;O-z6KBk_UasQ6Y} z9n-(;bD%C8jT#{d@8HbYw~4_7;w~l3GjXJ5`8QyV*BTAlVh?0<;6@u`^1+6XiXX$x z5r@gwOCH$rYtzur6HbAG>D|+Y2;U;z6B;>n601EbrnS|H4MPkLAx|T7uFCyyp)5{w zLhhfMd0yb~avaI;pOpufLmu1dbs`?;Uf(Izh-B(*d|)ZtC65QOwF0pOqlZ)IfA%_= z^Kfy#-75s2??ja7I_n>L%dDiajt?2wb5LZE!-ACIquPPy4J}3%#>s+RxR%E9YtI{$ zSwnXEWHS;z-;aO3;m1!ByEG@_kR*dr<$KRMD+=%4sW%U*k^ZP!9HdX6eiH=Cv}S+3 zC=eTPBHb%(!$Yu}lZRZKO(_SNR#)RNUO<}JCpzi*99vDK!?(`zxv$nAmId5&+h zKLxT1@-;axL?yi#iiv*&lVo%*5@IDFPN`#NfaP}Z9@OHn6^n}&J;6Zm#X-5|t&TJ5 z&2hxkz-UXgA-*px>2y}0)gt*xBs+pB=)}Q=o0yjbW_jZ<3%+Oz=*M3j)Ff z2>cH@pQ(H6_%{?Z zc8ao}4MShMCmvsgge3zsMlEJIG%jUobx&Sjj{@FMa&;fMKc z*;dGckt}z?OEUd_nF`n9P3#esK%Ux-`muApGjeNUZ~r*XLZ8&2cS%E=R!s33 z!)DsTeo#%tTXRS$h5x`SXZ%lYc<01RzWC)B_=YF(lLvUN+pPQ9IkRt*p#-tAM{rDz zQb#0-9!W10ME|e~#TE6C6vf4UzUG9452Y}bj((Aub&|l%@R&l${r;j-jkWi4HP(^; ziTxDj#pLr<^Yuu_>gW_bvu&96UU@iHbC?XZfba*&o>kqhtd<$xZLiMi{yXZch_hxv z1h350k268CIA1K2yo@iY8S_f-shB&LUjVtD1>+O*h8g zOI;X@ea*+Qhhunl>z!Q7a>XQ@y_7omKPWYr(U)N)rItAYUe|7p#O&-NKKZQk1<*=VNlA|;Q2wjv)zMfl8I zW2hQTKy+jXzYEB|Ak!(x+cj~guM}U`jvJfG|6k30WmKL`uP*NH?(XjH?(R_BU5mT6 zxVyVcai_Gn7cUft;$Gl9yw<+m-#%-fU;E5j_W~9qWM(qCGgtB?lKE>ED)^|vS658d zA4XueTX++}vx)d?SN&_h-{$grT|I+yN|q=*O61+%VvHeKSJ8S*?*;T~P zO+7?)wsI8Q{3J`y$?_5*l#6B^r)UVdeFT{Y<{%1_=@f*I;CgfQ+~f&7k*`fG5|BE# zEyZ^xMTY%V*Kxs2#{ct-pdM|btJ2jp#{Q+I-g(Lj%aD`OcPAxxfVQ5d+$48*%CYx% zJGp@au293R;yfk3*%X)pgJH4=wm8f6waiM=aZIy~_k$Zgoz;peDPzoLB@gu_?!=l? zd2=BFj8sULFzf2o0B?c8R<-|I(^pj!E0Mls_H(1%nxK!50I;$eG|O4hp9>Fm0#^yP z>_CelUufdP5xP|{pVSWmE&NA*ovtGYH79WpJ1*bl>C2jrY|!L^Qw=MP^djs`-{mS> zmGSnu)2A-iTbo&_;vMuRNN{v~P4at$?C4|ImuJAw%2ikqGw4Jf5B zQDO06N4!Y2g_Fz{<;m6+dtE7CdW-aW`n~Q zg5G@=!sgF!5sVrwug4zoFUzgwS2@=qS0_JFoo-2_OSUVUS7&u8o3A2Ff8qS}3RLz# zw^?l-*x^V~fU`2XulcU9$?(fOwI)1NL`PZP=1k<}WuL5!^#&2y+JVFfa1tTlfmNeVGhe9@4}Gohm@gAZHd1Cg6dV zL(#ztbrjg7S0|F!OMFt#|SK`hIaL!V~6(fivco_?) zK#!E6LRCr1*%T&{x16SH&&L$jY37P@rb~N@i*V}s~?BNT`PC1?y0=pZ1H36V^%1;d01bV_F{Ip3+{ z(yVBKb@RA*0g#d^{+p!c@KXb%3&*>B$lX4^-(TUL@2@hu!8?Zf)fXtW+n(|5S)G!v zspVHALVcbX9eF3%jA)@-80=`@u?=pNHo5hM0^pAVbfYT2i zb9+xL4>0zl)Dr?r9ZL=}MEKo(cQa93(&nw<^JW&&&ZnKvn0O80_$;Ne4=}s8Zq)M` zx$h3coArI90NJK1PqCt-NOxS`Ct=o)$NN3j;erY7SD$D$+)wg!UNVLpF`SnWUO#eg zQ?c=$h)J9$QF(fn4EV=i7K+hxZ~x=D^wsXGTOnPkh%Y6RX`m?J#!Qq_Fn4FpuyQ#9K z=&r{XkJm(tOQ1@U%1qYUs49EE9rbts9#pb+LVQwUe!QF?$lP%wVKNi;Zk^3+r)wTF z`Or#|v7Ep{;2fjnl3jtZ=k;2Bn$9GKyOW?IvfYjK<9WCjZOXWA}4BX#Amrso<^t*l>Zz-oQvUyJGv_s^sfY;m=6m#ZF*!Q1) znIIBa04>FUTeCqJFvGLmZCB9|S!Sg@m6@~)MI)y z0mrp1d@s3Xu8LxG^kJVg-qh%cUtRSqKUouNxy3}6)OkUU{$uA;Nog5fm3m54RPM6) zO;BMv{R6o^JQM5pShq7B9Q#SKu>IQvbT7Q7aQr6K;+|+kv5XHuu=0Bvjhr^O@Mvky zUGd~do5cFcRr2z3mg)`Yu_MB?RahwLGYL);{Nlzf4;H%-oDiwwWE zSb$1=Vu^}*W}f))d6br4>QwQjxN>)`h(gXGvl;_pWhY{4B-^LKfkJXPCes&(ZZQNG ztxgX$#m0MXCxe52+EX%EYNh`+3S6#!4EpkxnclxG7ygV7#2FKdE0yN&4e2LlXvG)~wK zEhF1~Oj`XXI|r+@{+fWc2Kmrp*Hm2dkr+c1bhROp&P$eI+CQliM8@>oOTug4rjPHc(k}DKYftGAAFb+_BU&;V-%t*JsK_(WQs2*go=OUjV zVM4u!ok?8bZB<9H|H5i26u;6*1zKT3}V?XD3gT+Cy z%5RI*VWPI>G6v>$9kLcB=3edvXZnT+7xYU&;PJ?oa~Q}Mjz`GtC9kce)SA_`c}KEG zO2`6%oH{qr(C;exn8sZpDZ8j8hLcbY#7_k>qr6vEST9dADfVs<<7l(_USB(Q;FJl`{`l`;-l+%I1~dp6inY)J9VX-LzZ6uH}DM zfTOKQ+0^fN^BD3;s**)s#Q0RSuwSpvUq$ewz~js5XuW}fc=pg*k>w1*R1rDGI1Zb| z{%j5TA-qU?q?)~h{bjb2qo}7$&}M;cafMzB!i^9Z!{;)KS!}NmxnhAwg->K;hFs(>$U0nug^M`V}LB zD{1rS-VHG#D7DD$3F2Jd4s3skHQHawc7P3f?(;JR0YAR0zkOfr!E{8CY`zuEcC|{@ z1nQcDRTTChFn(7X9OKv1-JYW4%XtSb+J5b6*CkU%P(XA59qg&In0p(5{f8pAKH zXlfVkwHq_fnrIERG}q~O6Pm0-ed8ipOQ_KH_p;EGGG3{Y#!TE%X)MYJS(qWm=};FK z*ORavF}5K&68)GF@o?(E2EX8+3AZb3~a4p2pxN<4jiVfz}mRHf*DFqpxiFO%=^aSrYgA6RQlV(1W}L_!AhB zXc*tgBp*e^^u*;Dlrm^{TsAGs6~|0HZBiHdCnM>=UW|jODfC8lM}_iHkEU6B+k-^W z0o4F`3&|4T+@*q>fDnG$8`em^l2|{a(sM51TpHd7y+2@A-bj<^_mTVDyy;1?99`B7 z`Q`gcpEHWhpvD3PB>Mr!Sb5%Hp9;=9k`$Q0+f~VH#VfnW(=k;_GflTpcAS^kmaMrW z6EARrvbz*Vh_a(E;y4azJXW`zK3_<25F0rIDWDe{c0#KJoj@}69k>IlbTk>1Lb(d? zH7wMMXQiv%uCi@nnb0^JXp6sXh30Ve!!>Z%L2}SlH_b%4S|`u zPYdw#@Rmz#k3-7)!@xd!SGqo|w%UPK*-H%|x*B|kDd>!Lo<-|%Aj=C^VozMCYr%X{>=syf;z zU|e7Gwc#GHPIb{f(N9n}uV;IIJ&GbY#hT=qbSKGpZXsp>NU$hJ6pojS_Xi>IN2{dL zK;4t}fX1g|8pjsHQvxOM=HWrD4^%HBAnFhn&b1L1Y_Uq3GM8U`o*f<)K%i6?$$VrB zun-z(<1hJ4>rAK?!L1ar#%XjTXp;@4MOg`p+>m2s>hE@Xzb>2fB+2lYa*aoN1mNT# zyiwaNxaxI#uxZ&^QvU9>WE0pt-bfP?loXzKb-^=9*rltG3cBP+A0_f#9r6lgFyLE; zV-lL8l?u9hNdWd6Fr*A78bpKj0N~~!EGWRk52}k&<#1xh%)8GrAM_Ibn0Gq-78Ao8 zg2c)NF2^0(>hevBwl-8c^5N)@eQ6wc_EC!yzh)K`BKrROzAekZLUAly5#d}HVZnU! zH@VRdmdmP*zD64Po9BS+ixuab;%8iRsy6;D**r^LmO&O) z)r`g&L_~!B+I?FeyT6LsU{L_Lc?kRKc3_axxao}_1lh!UWMd*v7RKvHA0mEhHIfO5%i6FfUdZ zyY)(l6`Sq>vk+y0(Y?Rog$O|=e$B;lm2`x#nv1g3J)J4LW;%4BPnBvLz$M=o{25|AhyyA3njK3lDfdByU za)J;HdbXBB=9-8Wki;j#p=l1Gj>dTqZ6g2FjOg1QEO&%EQ1-Y@w*u7nngrR+?mi?tquY7-wfWcstKldJrw#JmcB1 z#rHnU0+2I_k~&HRQ>bW-`4!W*T~fr-Il}ga;(cG?(kw2WX#>0KWJHMCky$i2+UrNe z$O7B285(0d8`|w-o4;dVA5%pRWAnWELHR+ZX&GmsIGN!_UPogUfhCl^Ftf57utO(<%RmGLB)c7 zUbbYuKZ}T=4O^K<4?iAe+JVu+xT=;d&o_N4DnQm5iV9xR^@o(}{4j|XLBF^U-pMsM zZJH%yCy+FJIB6*oQhrMKyE^!B{dtgmj@daD!Dei_4W$F${YAf%u#(92c!5|O7x2GE z3eAbRw4dyl@{>sxO2={{dV1NQ(Kn%~dgU{U!m0OtozZdZmBl!p^k((aGev-f7`gJDS1uxq(5v5WsjaFo}vp z`h%eOCla4Wgnf)rBE?WAwYBp{5jR5Xv!7$h)Vfe(Os80MxXGqXJNDo;s@yRF-;8|< z8>-^!35l2HDBOV_x;EwE|N%IxFE%+iOIf$ReK701`wjTJ@oUorT031 zMGMWg>#gUmbnzr`E82AqR9;#V9UB=NQf-~E*ixJ_@dBXwc+$a19Rt2Q1z2<9JPP&p z!>%lfi3qDa(IzyB+CyB61(r3n*Hm*@+`?+B_nqI#aE#4AB+{=Z z8%5nS)2wNE>OmcrH-Qi#d>ladSWdqEBp%xYpNO|?fCw(X4R)&Zn!;q)p|LEeH^AaC zW^dByPmqfj$b$H;20?-aNKE&;;oBgFagD&e47|s%x7t#tw5=vIQFR zF@uV5yYCjv&UoeF*wiRs!&~GNl2auF8A3kfoA7v1wM=ND>ho{c;XxJNLW5n=r+q2Q zO#c!9>i7=SF`>ovqNz#N5|G2wp;XWnh1H1}?*6XDO`MAiu?n^1BCaSW&%L%Yr(|iG z>2aR_GR6H4*&=^t`!f87WyZZCPldbRJVUdt3e5^`gRkIh9H%!&Udu}~X)(z3%Y_>D znvFSlA)(9wO>~)Y2cAfcNN|Fio3KpLmyQo3K+sTKf-vu zksi|!*;>%y%JSCjWcqAR}!2A>wKrd z{LdlS^1FOn>jF0XM+5D;{+`q^IUMzBZ_(o|zFRD)ng3B!v&$SE?6p#-^|(rVN*$bi z^4@FlnLYy*hPRAF@?0m<;ww|y^b<4>iZGk=F(0<9yFY9JA6QN5e*wA^e8DxMyk2Y@uU(66v~2X#jedEiYZQXtq_y!hK+#&&kW>7R4n)n7buvN$Yv)DtlyH z4d&$1yl0T=wwmK(-&o(>RLgR1y4slJT-#XgIbh81DRuW0iI(@C2Ciqn^emdx_bAob z;P5<%ncZw2#mDJ%Hne?w#N3g;oZ)wWF=N$;BqAsDz-pbmx~;2y`#qh8XE$YegMgKv zzExX)l&W|$d5rXq|1rFq%>L-~JoiQL-(`EDTE!pJL4klwF@b;(|1R6>;_78<=JHzi zct=ZLb&Cn@i8i~twm4thR4g1EJKM<}U(+I2G(%*VG&6a6`l;EWYboTuR8;=&&e}e9O+Mma@ZL z5v(DhO6gF+bOun+^!-Z;#x#p*fR5>9NvFsG(g}tDS6o`T-T3 z4=rSm9W9?(jM?(ZvA`s0oW@v@Rys6cGM*+M%9(4ANry~GWigqP?KA?;Q6{S&Y46B< z0c`>f=GeFN!=7$I@vy>qVpZcyMoEya4YuyItB-m{x?QX}jDsdjDi(#lnWmOyxN++! zSbe~`NN)6-y-Hn;2Hir_)~av1R6!C^o4shlu~B*O=pC_W9j6l0IXsEmexU`bqSID^ z1+!AqR*59ikfwB1m~3l_Q7ckI{6fOtp}QBMx;+9^d}!|o6Igj_g%)=)oF*Hzte!g2 zkJ*tgO3sp)DGlE2tcUrA)?-8HlsQV7bW^uooCi#WS8Ror+Pih7V<08k31(s?;woTi zLRP%}J{oy51%7@u30`tbqw$8=b=AP5inD}^lR~n%tS_a4jf^W{G3m&)l>vOdWVYW(u5tE78`7fEaCA=V&Yjr-HX*J-Ln;4R|WNh zFaNPtvF{6?*n=9Ha8jqkobZgMOhtv%ep#_o!#rB>3fBjaUM-evyeH2cTW}tBU5(OM zZPfVfKr_Sq22QVG3s#!L;cT3qJV4Md^37*y{WMq;6Bu64Fbq z)%z%S4{-rXlh{R^uX{{WFdwgnVd+m%g*_b%0zG9+EFEz;=IOc=Vi}3TZL&oH3n;<4 zy~%3JBN^WC?r}gV?8y&Z`;l_!mxs{>y|1W1qjP+5qG}WWf@CUtquy>xTr{vK<)L~u8GWczQ$twSGwTBf7qI3VRyBrgLhMtC=~@cj6|jPu4O#hQ zMUYXrV*GiCa|3t+D%}J=P?mtpKD7QMcE2F0Ky#T;(;bAGDJicH?A>Hw>( z4=9C>^0!&Fce67wbGEX#cwOpwtx@|GCZs3yK%uyLF>M1PG3aFoYCTub3_l?HX%1rs z5NYZ2>RSSDn_6+ir#e4r=`RVX=Jh)`N(yY;tf&0WT%vuLnjSGc+$m8|1i(w@0f4ML zl>SoWySF|r0$_175tI=yain#y+jnRd|MBtKdtRP$#ABE6}CUQlO%|X+>gj@)1c^MD=`Aw=QT7Q|Hx{^h+RwI#b6 zvNPej*~jJx*02u@*!q#>(?o3<@vdF5C6>cnl|mOI9PzB}3czr2pZl7{La`SD9zQCk z2*)ra3&ufp@w1o^A4d3+*}7=RV3E9)U){IlK)}2~06p^no;h$D^`aL~shR%hWJxMe zTW>o}7|<+pvAZzmWFj!G6cuR4ZCTYMR_~X~Y+=J8BX-$ zdZEtbh;5Ov4PS{lf?ce&7}0uH!|`-~UTxrys#%GqsPX+k(h9O4^-bevWUM<4X)e*X zIvfY~8;#xHKYgLEcOM#}dLCi9z;CL^I-Fj41M#L($Ky!+?Zt#mW(@!sDE8tWNLD6^VR=r0r@vRLMatu|vbgOdqgqBFb|B`BN$x)!D|p9gesZv zb<^oTciujC`d!)!tg@jyIcCveVHoB}2L+G#^6DAs@8X`$h37M?vy&pbA^Fs5ie1OE z9;nfLCaRrbxn|bwm3fvAJU2bTUU`Asya4?lOKI-l;QIfGlt`4WmFWPr5(P8`LHc_w ze_6%(lyN{MXrz%zUs#FooD3rBxb3of);LuU=Y2Wz8HGtK<7j9@&?On?L(wbfM>25f zj|y|6A8*Pr=|OH}>xh??sE3uEaU=tv=v-(tw)aPF??Mg6%aVLEy9|B8J*<*@LY_q1OXJ#IDvXHWUABlr^ zI#Wc_56@7%`>|cKD+upkq?yObHIzViuIHct{3QsW6PHQnUQFQU)#^i0P#P3hqRKJ8VLqlaFJi^1&F!lBAyjuagF? ze{R|!zxyDm&N~4VgAq6xt^yO>yS(Br+NJBB-Ssj}|=^kK5Z%_K)NEpyPWQ8MOtI;sFLY2HOx&AgLF6(m7V3#{g3{AFeNAAyxx^gwEz*zS z8Z2X9d{@Gs+K+Q;#pIUTR9+IH-akG8D?F?KFV3q!q?YC`a8*V#pXbHZh81If2z-g+ zov6H@p1$Z?r*8UW5IV1%fmOgsmNAx2XR$%hn`_w9rzl2WIP3>9o23dYKvE+R%q{F* z4V}i?1cEp@jAB5q0{`NG`oiSWN-IGJ?6LkpE8{i^d-Y)r3$5pjDygOw~Z7{0$H$ZIi+G11*L{{aa z72*5PJ_!iq$|<@;j$7)SI8j;mySdo>yB>lv$m(NSHKt(+PBA1D<;yN!AE#~|R;KCO zb;pj_JSadkt!8y*;m{`z(B8aZ{xX$(-t=D|sKk5Fd(7+zGJ zHxUBmBE8OGTDV_tI>U}#Zw$glWd&QKXx5nu5iTB}R*SBj4025>RkAp4^hOGP7pzn4 zxf`BFyz+;e35p>T^1FRfhIq#uRw`=f)Y8FI>+!q~qvI<;i9Ns%j%$wHSZ;HaI6ZOh zjJe(^rVb`eEjL~Xs%7SZ&DsJi$yeTW0%k$!R;_A|G zhP)v^rf95dY}xZ^)BN_MNyMYcI3*n>qg#Vz&*$z;sC)l*(r_BoD~@6+x&)bivxols zfJT}3(;3#9Y+5eaRu$DMpF`VyEdBF8UjLtO6jdcn)Ea<0&joP#Q2|y^SJc7Y70|HA zP|eHH%tin8b<(WS2hbq6C-i|uVvY6zB{*sCrG@Qf(OcjsG2Uf5<@ftdPme0@CcXMu z<~DAu_jh+WVlZciyQ3{b1R`wv3p?t~bg+&v%}(R(Kdv1++87)-D#I-h>o-*}7kA=5 z`lFLn;A>&iUTtEPGiyoXg-LjpKYxT6+}pW`R@#Tcqo=y2;;cMX`dm}IwenuEda<~^ ze7&QD&X3Q@yDrhhDdl`+AZdp3IsFpD%;qU1e(N%3cn(z}YLa!U`+o42%h<_2g}lol zHeoQ-eFPULChT^f&tysL;3!hlobUBuO@2%nu% z?>f1^9#|+a2Hi37d+z)Zh*RuX5_G?Bf$EshCuTFg2a-{u%M|brBwqH}ZZkEFx==rS zy_ZO{=EY*A5UlLCCAcb~b4IZdCD~3JK}nu7d^{o9D#1fJfLSr(EO+fTC7f6KS2^%D zt0>%w*h6L!AdYDs6Vql1>y!rg(>-J_( z2*dOqqu-B0%(4 zH}KWK{WAq)N5_B5A98G00UJNlgzI!t(2h9T1kc7wj4JEnLmC9>cz^eGyZH$Nqh7>B zv23Tlq8O;@8=r!XK-kJx5^#&)3A&KH9R#|^nl8$y_YII3;6e+|6Wkm!_1VN&H8R60 z5;A??SZ0eX@w!53zi0xD9jYx_fa^lIZX%pReyUxnx;LDQfBLb#S2wa%{{6QJWJQj~ zPXLZsHNZmubB}wq(Dndd=nsT!9?%qQn+a(I&=jo8O$As-T%J2XXccMA7igO+HuR+4 zmNMU=Cvi}|ovs3g-zl=k-0w0sed%b$qdGx@i?I)lOt*v#IZTv#yoSi%Pmsu2@u;wB8OIELF^TzWYy5*11`YoKi#t39@E*@1xvAS*@kX>0Kk3{%b2 z>&^9ggm7%nxF620GuCQ;8EM59u0@h^1bb3K7k*9N|-gfOF%v~7)cZrt$S>iet9jt@}ZUtIQo>A?TC(=I3z7uyHW(gc8({?mKS%--}L zB^^&%vEL>_3Nswq66lL-pZ^p!8%?0mRhh8{nTIt})=SiTvwPz47HXnJJ&A*}i@7x2 z;W?eT%Hi2MxvAd^x`gNp3wb0Ho{W_{`2FRh@p>JQjnqb*XQV;%R-i*J^rE0(!B8RjGFS`jR zIhVrx02}`Rd3qZU`elTVYFaLX`z%$)MQ!zXWDlsa6{w@5in|Ao&Anvwv*o*8_J)`{ zG#l#+C+lYx=9LWX&cKYlcf6o+T~ulz^s;q_(l5G+g_x8F7j><`;noV51porD?=P5F{^Xhrvx z>AKP`T$?P3w?Z0`f59M84kBCmyz(w?yG>9io=r1B_?%a=Xy|Cgf5Eg1Mwz!ttA0Ye zM2V}szIjS~3GL-^RW>TPG=d%J6JDKipd{G+O5jK_L zj??p2^jSMKHO)$I9fdEVJ3o5x5@sneqwMnUX-Nws;K zBGKm_c15UP&>DuXqx6=$7V;JtLI-1$`DQ1{bo|?oHzx6f)A7hoAGwD6ZN|Sug2zUm zmC9Tev<>Z81w^+3ZDcKGg>UloOkH_3Nv`5)ZFdL+HalE=t{l1?<7?hL0M}6#;MfP@ z!*v#;|6F$Xs%B18BjLxl?FxlmLY0htT&M8?aD-QUzMI*fa82(X{SP`~Ww z8wb1BCYgWk=iHj}77-T2rmhp0W`dR~=WG*Y_Q{p!3T$3LKidzuyy*@@6>{m+Y=t1n zL$Zy;)WzO`S!uRtQuY*D?cle`f#Atn$PBmap8k(rt3jb|QYdp&(l(AI7<~K!P3RgT zN(aaNpfehGYM{GWHAGEm%7Mo+jUGK*Bo>WKM+j9VhSmzaPMtR zLH+ye;LxF!a{5T#m0#Odgy>g5waW&*t&mzSl77+FOQ%4ucg>}!eq)tMAzqup`%IsWN z+WLE`Pj4~1+Q$q9`$N(jo<_o+^{>XmS-xXPYKpO0Sxm3EkESCU$;EI&lW(h? zzaKoAp%HEGZm4xwrjo0^#uqTG!0V+xuYHQ%P55EKJW26`6n|P#F7oUtojCH$;p-Wo zqmRVSE-K=CAT(qp6Q1*4#NiujA-?0OiLa=w5{{qNznXq43dIIa;p#W17T-sAZ~RCc zMu!{iYEULWnLSiS+SOx6+KJ^h6+G-PYY_gXI{6YKE%~LT=ETnUnW>06;GIA4|Jc<0 zy7T|rrsmCw!2&)&HAMlT%wPO8dsj7M6Wc#R8`;xq_JGg^7((gS&AC>>>K2==*fn&dibv;!*fH;X4ZyY&B64t6X7cn6rWvqYah0$O=9t?$AZH%p zwY&I*jnswuc^Fh#-$i-T3~6fngWf_`?E&ATDp9#)Ti6nWNsX4jx#lay!mp&9c!^2} zDk`)$r@m*>1QbL|iY+py$?y`dmi!K}79*6LEBQ{CKrdltL0bp!$k;ts&!g^mkPi-)Hq`#0gA zx9#6M1^-0}_#*djLck^G-+hCB=k$B4+@GA10V@252*2|9o&5KZ{ZDc^?Z3!>2Jn9p z|5xDtHB$KJc%43q{xA2lpJabd{`bh?--JLw+`p3j9Y_3~{P%F!Px3;8zeN65aO@}j zf0Y{GVUjHjl|8umM{7XZA0i6FI z8R@fdkhKdEhOf0_M1SEb+Sf7OQ9 zJK)b@W&d9`@gFY#aT|ZXru}4v?C=+>U)}frn|w|~v!S0?{)9>2f!e+q)?{ud{603`a4 m5Ac7J_{>9}lQNaH&L^wb=Kv972pgdpy`TqfJt?ixw literal 0 HcmV?d00001 diff --git a/docs/plans/archive/auth_implementation_plan.md b/docs/plans/archive/auth_implementation_plan.md new file mode 100644 index 0000000..eedda49 --- /dev/null +++ b/docs/plans/archive/auth_implementation_plan.md @@ -0,0 +1,128 @@ +# FLOWCMS AUTH SYSTEM — FINAL IMPLEMENTATION PLAN (SOURCE VERIFIED) + +This document outlines the source-verified architecture for FlowCMS authentication, moving away from fragile hook-only validation to a robust **Three-Layer Auth Protection Model**. + +## PART 1 — SOURCE-VERIFIED ARCHITECTURAL DIAGNOSIS + +The current implementation in `src/lib/auth.ts` uses `throw new Error()` inside `databaseHooks.user.create.before`. This is fundamentally incompatible with custom error handling in Better Auth v1.6.10 because: + +1. **Internal Catching**: Better Auth catches any error thrown inside `createWithHooks()` and converts it to a generic `unable_to_create_user` error. +2. **Forced Redirect**: This failure path always redirects to `/api/auth/error`, bypassing custom logic. +3. **UX Decay**: Landing on `/api/auth/error` destroys the premium Meridian experience and leaves users stranded. +4. **Hook Limitations**: Relying solely on hooks for UX redirection is "too late" in the lifecycle for proper failure handling. + +The **Three-Layer Model** fixes this by preventing Better Auth from owning the failure experience while maintaining hard security at the database level. + +--- + +## PART 2 — STEP 0 (GLOBAL SAFETY NET) + +Implement the global redirect override to ensure that even unhandled Better Auth failures (like OAuth provider errors) land on our branded page. + +### [MODIFY] [auth.ts](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/lib/auth.ts) + +```ts +export const auth = betterAuth({ + // ... other config + onAPIError: { + errorURL: "/auth/error", + }, + // ... +}); +``` + +- **Why**: This makes `/api/auth/error` redirect to `/auth/error`. +- **Mandatory**: This is the baseline safety net. + +--- + +## PART 3 — CHECKPOINT 1 (PRE-AUTH ROUTES) + +Create secure entry points that validate the environment *before* Better Auth starts its flow. This is the **UX Layer**. + +### [NEW] [/register/google/route.ts](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/app/register/google/route.ts) +### [NEW] [/register/email/route.ts](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/app/register/email/route.ts) + +**Logic Flow:** +1. **Invite Lookup**: Extract `token` and `email` from query params. +2. **Validation**: + - Verify token exists in `WaitlistEntry`. + - Verify token is not expired (`inviteExpiresAt`). + - Verify token is not already used (`status !== "JOINED"`). +3. **Failure**: If any check fails, redirect immediately to `/auth/error?code=INVITE_INVALID`. +4. **Secure Handoff**: + - Set `pending_invite` cookie: `HttpOnly: true, Secure: true, SameSite: Lax, Path: /, MaxAge: 600`. + - **Crucial**: Do NOT use `SameSite: Strict` as it breaks OAuth callbacks. +5. **Redirect**: Hand off to Better Auth social sign-in or credentials sign-up. + +--- + +## PART 4 — CHECKPOINT 2 (DATABASE HOOKS) + +Implement hard security enforcement at the database level using Better Auth hooks. This is the **Security Layer**. + +### [MODIFY] [auth.ts](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/lib/auth.ts) + +**Implementation for `databaseHooks.user.create.before`:** +- **Context Access**: Use the second argument `ctx` to read `ctx.getCookie("pending_invite")`. +- **Atomic Consumption**: + - Perform a transaction to find the invite and mark it as `JOINED` atomically. + - **Replay Prevention**: Ensure the same token cannot be used twice in a race condition. +- **Email Validation**: For Social Auth, verify that the email provided by the provider matches the invite email. +- **Security Logic**: If validation fails, `return false` or `throw` — Layer 1 will catch this and send the user to `/auth/error`. + +--- + +## PART 5 — LOGIN FLOW ENFORCEMENT + +Protect against bypasses from suspended or revoked users across all login methods. + +### [MODIFY] [auth.ts](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/lib/auth.ts) +**Implementation for `databaseHooks.session.create.before`:** +- Check user status (e.g., `suspended`, `revoked`). +- Block session creation if user is not authorized. + +### [MODIFY] [middleware.ts](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/middleware.ts) +- Implement real-time session validation. +- Forced logout flow if user status changes (e.g., subscription revoked). + +--- + +## PART 6 — CUSTOM AUTH ERROR SYSTEM + +A premium, Meridian-themed error handler that provides clarity and recovery paths. + +### [NEW] [/auth/error/page.tsx](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/app/auth/error/page.tsx) + +- **Input**: Handles `?code=` (our custom codes) and `?error=` (Better Auth codes). +- **Design**: Industrial-editorial style, consistent with the landing page. +- **Recovery**: "Back to Waitlist", "Contact Support", "Try different email". +- **Logging**: Automatically log the error to Sentry with the provided code. + +--- + +## PART 7 — SECURITY + FAILURE PROTECTION + +- **Replay Prevention**: Atomic invite usage in `databaseHooks`. +- **Invite Abuse**: Rate limiting on `/register/*` routes. +- **Direct API Protection**: Even if a user hits `/api/auth/sign-up` directly, Checkpoint 2 (Hooks) will block them because they won't have the `pending_invite` cookie. +- **Founder Debugging**: Log detailed failure reasons to the console/Sentry (e.g., "Invite mismatch: expected {{exp}}, got {{got}}"). + +--- + +## PART 8 — VALIDATION CHECKLIST + +### Automated/Manual Tests +- [ ] **Valid Invite**: Credential signup works, cookie set/read correctly. +- [ ] **Expired Invite**: Redirects to `/auth/error?code=INVITE_EXPIRED` at Checkpoint 1. +- [ ] **Used Invite**: Redirects to `/auth/error?code=INVITE_USED` at Checkpoint 1. +- [ ] **OAuth Failure**: Google signup with wrong email triggers redirect to `/auth/error` via Layer 1. +- [ ] **Bypass Attempt**: Direct POST to `/api/auth/sign-up` without cookie fails at Checkpoint 2. +- [ ] **Race Condition**: Multiple simultaneous requests with same token only result in one user. +- [ ] **Suspended Login**: Suspended user cannot create a session via `databaseHooks.session.create.before`. +- [ ] **Cookie Rules**: Verify `pending_invite` cookie has `SameSite=Lax`. + +### Success Criteria +- [ ] No user ever lands on `/api/auth/error`. +- [ ] All auth failures result in the Meridian `/auth/error` page. +- [ ] Database state is always atomic and consistent. diff --git a/docs/plans/archive/caching_plan.md b/docs/plans/archive/caching_plan.md new file mode 100644 index 0000000..fc8d99b --- /dev/null +++ b/docs/plans/archive/caching_plan.md @@ -0,0 +1,174 @@ +Good — I have a complete picture now. Let me build the full caching guide with all layers explained clearly.Here's the full caching picture. Let me first diagram the entire request flow so the layers are visually clear, then explain exactly what to implement.There are four distinct cache layers. Here's exactly what to do at each one. + +--- + +## Layer 1 — Cloudflare (most important, free) + +This is your biggest win. A Cloudflare cache hit never touches Vercel at all. But there's a critical problem you need to know about first. + +**The Authorization header problem:** If the request to your origin includes an Authorization header, in some cases the response will be BYPASS. Your API uses `Authorization: Bearer flw_...` — so Cloudflare will bypass the cache by default for every single API request. This kills Layer 1 entirely unless you work around it. + +The fix is a Cloudflare Cache Rule that strips the Authorization header from the cache key and caches based on URL + workspace only. In your Cloudflare dashboard, go to **Caching → Cache Rules → Create rule**: + +``` +Rule name: FlowCMS API cache + +When: URI Path matches /api/v1/* + +Then: + Cache eligibility: Eligible for cache + Edge Cache TTL: Ignore cache-control header, use TTL: 60 seconds + Browser TTL: Bypass cache (never cache in browser — API responses only) + Cache Key: Custom + → Remove: Authorization header from cache key + → Include: URI path + query string +``` + +Then in your API route handlers, add the correct headers so Cloudflare knows what to cache: + +```typescript +// src/app/api/v1/entries/[slug]/route.ts +export const GET = withApiAuth(async (req, { workspaceId }) => { + // ... fetch logic ... + + return Response.json(data, { + headers: { + // s-maxage = Cloudflare/Vercel CDN TTL + // stale-while-revalidate = serve stale while revalidating in background + 'Cache-Control': 'public, s-maxage=60, stale-while-revalidate=300', + // Tag this response so we can purge it surgically on publish + 'Cache-Tag': `workspace-${workspaceId},entries-${slug}`, + } + }); +}); +``` + +Cache Response Rules now let you modify Cache-Control directives, manage cache tags, and strip headers like Set-Cookie from origin responses before they reach Cloudflare's cache. This is available on the free plan. + +**Cache purge on publish** — add this to your publish handler: + +```typescript +// src/lib/cache.ts +export async function purgeCloudflareCache(tags: string[]) { + if (!process.env.CF_ZONE_ID || !process.env.CF_API_TOKEN) return; + + await fetch( + `https://api.cloudflare.com/client/v4/zones/${process.env.CF_ZONE_ID}/purge_cache`, + { + method: 'POST', + headers: { + 'Authorization': `Bearer ${process.env.CF_API_TOKEN}`, + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ tags }), // cache tag purge — free plan supports this + } + ); +} + +// Called when an entry is published +await purgeCloudflareCache([`workspace-${workspaceId}`, `entries-${contentTypeSlug}`]); +``` + +--- + +## Layer 2 — Vercel CDN (automatic, free) + +Vercel's CDN caches your content in data centers around the world. CDN caching is available for all deployments and domains on your account, regardless of the pricing plan. For server responses to be successfully cached, the request must use GET or HEAD method, must not contain an Authorization header, and the response must not contain the set-cookie header. + +The same `Cache-Control: public, s-maxage=60, stale-while-revalidate=300` header you set above handles this automatically. When Cloudflare misses, Vercel's CDN catches it before the serverless function even wakes up. + +--- + +## Layer 3 — Next.js data cache (`unstable_cache`) + +This is for your database queries inside route handlers. When Layers 1 and 2 both miss (first request ever, or after a purge), the serverless function runs. You want the DB query itself cached so repeated cold-path requests within the same function instance don't re-query: + +```typescript +// src/lib/queries.ts +import { unstable_cache } from 'next/cache'; +import { prisma } from './prisma'; + +export const getPublishedEntries = unstable_cache( + async (workspaceId: string, slug: string) => { + return prisma.entry.findMany({ + where: { + workspaceId, + contentType: { slug }, + status: 'PUBLISHED', + }, + orderBy: { updatedAt: 'desc' }, + }); + }, + ['entries'], // base cache key + { + tags: ['entries'], // used by revalidateTag + revalidate: 60, // fallback TTL in seconds + } +); +``` + +Next.js 15 ships `revalidateTag` — tag your fetches with `next.tags` to enable on-demand cache invalidation. When your CMS publishes content, call `revalidateTag('entries')` and the edge instantly evicts that single item with no global purge and no downtime. + +Add `revalidateTag` to your publish route handler: + +```typescript +// src/app/api/internal/entries/[id]/route.ts +import { revalidateTag } from 'next/cache'; + +// When status changes to PUBLISHED: +revalidateTag(`entries-${workspaceId}`); +revalidateTag('entries'); + +// Also purge Cloudflare +await purgeCloudflareCache([`workspace-${workspaceId}`, `entries-${slug}`]); +``` + +--- + +## What TTL values to use + +| Content type | Cloudflare TTL | Vercel TTL | Notes | +|---|---|---|---| +| Published entries | 60s | 60s | Short enough that a publish feels instant | +| Published pages | 60s | 60s | Same | +| Media metadata | 3600s | 3600s | Rarely changes | +| Content types schema | 300s | 300s | Schema changes are infrequent | +| Draft content (`?_token=`) | 0 — bypass cache | 0 | Never cache draft tokens | +| Internal dashboard API | bypass | bypass | Session-gated, never cache | + +`stale-while-revalidate=300` on all of them means users always get an instant response even during the 60-second revalidation window. The 300-second stale window is the actual user-visible "freshness" — in practice a publish will purge both caches immediately anyway, so the TTL is just a safety net. + +--- + +## What not to cache (just as important) + +```typescript +// Internal dashboard routes — session-gated, never cache +return Response.json(data, { + headers: { 'Cache-Control': 'private, no-store' } +}); + +// Draft preview endpoints +if (req.nextUrl.searchParams.has('_token')) { + return Response.json(data, { + headers: { 'Cache-Control': 'private, no-store, no-cache' } + }); +} +``` + +Any route under `/api/internal/*` should never be cached — they're behind session auth and return user-specific data. Same for any request with a `_token` draft parameter. + +--- + +## Realistic latency with all layers active + +Once everything is warm, here's what your users actually experience: + +| Scenario | Latency | How often | +|---|---|---| +| Cloudflare HIT (content unchanged, repeat request) | 8–20ms | ~90% of traffic after warmup | +| Vercel CDN HIT (Cloudflare miss, first request to that PoP) | 30–60ms | ~8% | +| Next.js cache HIT (both CDNs miss, warm function) | 50–80ms | ~1.5% | +| Full DB query (cold start + cache miss) | 300–800ms | ~0.5% | + +The goal is to make that 0.5% DB-query scenario happen only on first-ever requests and immediately after a publish. Every subsequent request for that content hits Cloudflare at sub-20ms. \ No newline at end of file diff --git a/docs/plans/archive/caching_plan_2.md b/docs/plans/archive/caching_plan_2.md new file mode 100644 index 0000000..445ab88 --- /dev/null +++ b/docs/plans/archive/caching_plan_2.md @@ -0,0 +1,52 @@ +Every time the v1 APIs are hit. Here's the exact reasoning: + +**Monthly API request count = every v1 API call, cached or not.** + +The customer is paying for "5,000 API requests/month" — that means every time *their frontend/app* calls your API, it counts. Whether your system served it from cache in 8ms or hit the DB in 400ms is your internal infrastructure detail, not theirs. Contentful, Sanity, and every other CMS counts it this way. + +So the flow is: + +``` +Request arrives → Cloudflare Worker runs → + 1. Check rate limit (Redis) ← per-minute burst protection + 2. Increment monthly counter ← always, before cache + 3. Check monthly limit ← block if over 5,000/250,000/etc. + 4. Request proceeds to cache → Vercel → DB +``` + +--- + +**The write-time limits are completely separate things:** + +| Counter | When incremented | What it protects | +|---|---|---| +| `apiRequests` (monthly) | Every v1 API hit, in the Worker | The "5,000/month" plan limit | +| `contentTypes` count | When user creates a content type | The "3 content types" plan limit | +| `webhooks` count | When user adds a webhook endpoint | The "5 webhooks" plan limit | +| `workspaces` count | When user creates a workspace | The "1/5 workspaces" plan limit | + +They're not the same thing at all. Content type limits are about what you've *built*. API request limits are about how much *traffic* you're generating. + +--- + +**One practical nuance — what counts as a "request"?** + +You need to decide this explicitly and document it, because edge cases will cause support tickets: + +``` +✅ Counts: GET /v1/entries/blog-post (fetching content) +✅ Counts: GET /v1/entries/blog-post/clx123 (single entry) +✅ Counts: GET /v1/pages/home (fetching a page) +✅ Counts: GET /v1/media (fetching media list) + +❌ No count: Dashboard API calls (/api/internal/*) (that's you using your own product) +❌ No count: Webhook delivery attempts (you firing to their server) +❌ No count: Failed auth (401) — debatable, but most CMSes don't count these +``` + +The simplest rule: **if it hits `/api/v1/*` with a valid API key, it counts.** Put that in your docs and support tickets disappear. + + + + + diff --git a/docs/plans/archive/cloudflare_setup.md b/docs/plans/archive/cloudflare_setup.md new file mode 100644 index 0000000..179f250 --- /dev/null +++ b/docs/plans/archive/cloudflare_setup.md @@ -0,0 +1,97 @@ +# Cloudflare Production Setup Guide + +To achieve the performance and security targets defined in the Master Implementation Blueprint, follow these configuration steps in your Cloudflare Dashboard. + +## 1. Cache Rule: Ignore Authorization Header +By default, Cloudflare may vary the cache based on the `Authorization` header, or refuse to cache requests that contain it. We want to cache public API responses (like `/entries`) regardless of the API key used, provided the content is the same. + +**Instructions:** +1. Go to **Caching** > **Cache Rules**. +2. Click **Create rule**. +3. **Rule Name:** `Ignore Authorization for API V1`. +4. **When incoming requests match:** + - Field: `URI Path` + - Operator: `starts with` + - Value: `/api/v1/` +5. **Then:** + - **Cache Eligibility:** `Eligible for cache` + - **Edge TTL:** `Override origin` -> `2 hours` (or as preferred) + - **Browser TTL:** `Override origin` -> `1 hour` + - **Cache Key (Critical):** + - Click **Advanced**. + - Under **Headers**, ensure "Include all headers" is **NOT** checked. + - Specifically ensure `Authorization` is **NOT** part of the cache key. +6. Click **Deploy**. + +--- + +## 2. Edge Enforcement Layer (Cloudflare Worker) +This worker sits in front of your cache. It validates API keys and checks rate limits via Upstash Redis before Cloudflare serves a cached response. + +### Deployment Instructions: +1. Create a new Worker in Cloudflare. +2. Paste the following code: + +```typescript +// cloudflare-worker.ts +export default { + async fetch(request, env, ctx) { + const url = new URL(request.url); + + // Only protect V1 API routes + if (!url.pathname.startsWith("/api/v1/")) { + return fetch(request); + } + + const authHeader = request.headers.get("Authorization"); + if (!authHeader || !authHeader.startsWith("Bearer ")) { + return new Response(JSON.stringify({ error: "Missing API Key", code: "UNAUTHORIZED" }), { + status: 401, + headers: { "Content-Type": "application/json" } + }); + } + + const apiKey = authHeader.split(" ")[1]; + + // --- 1. Rate Limiting via Upstash --- + // Note: We use the Upstash REST API for Edge compatibility + const UPSTASH_URL = env.UPSTASH_REDIS_REST_URL; + const UPSTASH_TOKEN = env.UPSTASH_REDIS_REST_TOKEN; + + const rateLimitKey = `rl:${apiKey}`; + const rateLimitRes = await fetch(`${UPSTASH_URL}/incr/${rateLimitKey}`, { + headers: { Authorization: `Bearer ${UPSTASH_TOKEN}` } + }); + + const count = (await rateLimitRes.json()).result; + + // Set expiry on first request (simple window) + if (count === 1) { + await fetch(`${UPSTASH_URL}/expire/${rateLimitKey}/60`, { + headers: { Authorization: `Bearer ${UPSTASH_TOKEN}` } + }); + } + + if (count > 100) { // Default limit, can be fetched from Redis per-key + return new Response(JSON.stringify({ error: "Rate limit exceeded", code: "RATE_LIMITED" }), { + status: 429, + headers: { "Content-Type": "application/json" } + }); + } + + // --- 2. Proceed to Origin/Cache --- + // The actual API key validation still happens at the Origin in Sprint 1. + // In Sprint 2, we will move Key Validation to the Edge by syncing hashes to Redis. + return fetch(request); + } +} +``` + +3. Configure Environment Variables in the Worker settings: + - `UPSTASH_REDIS_REST_URL` + - `UPSTASH_REDIS_REST_TOKEN` + +--- + +## 3. SSL/TLS Settings +Ensure your SSL/TLS encryption mode is set to **Full (Strict)** to protect the API keys in transit between Cloudflare and Vercel/Supabase. diff --git a/docs/plans/archive/decisions.md b/docs/plans/archive/decisions.md new file mode 100644 index 0000000..1190be2 --- /dev/null +++ b/docs/plans/archive/decisions.md @@ -0,0 +1,631 @@ +# FlowCMS — Payments, Infrastructure, Admin & Docs Guide + +--- + +## 1. Payment Gateway Decision + +### The honest situation with Stripe from India + +Stripe is available by invite only in India. Indian businesses cannot sign up directly and must request an invite, which isn't guaranteed. Beyond access, Stripe India only allows businesses to receive international payments via cards, limiting flexibility. It does not provide FIRA (Foreign Inward Remittance Advice), which is mandatory for Indian businesses receiving foreign payments. + +Even if you get access, Stripe all-in runs near 6.3% for Indian businesses processing international payments. That's ₹1,890 lost on a ₹30,000 invoice. + +**Verdict: Do not use Stripe as your primary gateway from India.** + +--- + +### Use Razorpay — here's exactly why + +You already know Razorpay. That matters more than people admit. Here's why it's the right call for every scenario you'll face: + +**For Indian customers (your primary market initially):** +- UPI drives 60%+ of India's payments and Razorpay delivers 90%+ success rates. UPI Autopay, tokenized cards, and e-mandates are unified in one integration with built-in compliance. +- UPI Autopay handles recurring subscriptions — the default maximum amount per UPI mandate is ₹5,000 and for Netbanking mandate ₹1,000,000. Your Pro plan at ₹2,000/month fits comfortably within UPI AutoPay limits. + +**For international customers:** +- Razorpay secured the PA-CB (Payment Aggregator: Cross Border) license from the RBI in December 2025, placing it among a select cohort of fintechs authorized for both inward and outward cross-border payments. Razorpay now holds all three RBI payment licenses: PA-O, PA-P, and PA-CB. +- This means Razorpay can legally accept international card payments and settle them into your Indian bank account. No invite process. No compliance gaps. + +**For UPI mandate (recurring subscriptions):** +- RBI requires two compliance steps before any recurring charge: advance notification (72 hours before each renewal) and initial mandate authentication via OTP or UPI PIN. Razorpay handles mandate registration, card tokenization, and pre-debit notification workflows as built-in components. +- You don't have to build any of this yourself. Razorpay's Subscriptions product handles the full lifecycle. + +--- + +### Razorpay Subscription Integration Plan + +```typescript +// src/lib/razorpay.ts +import Razorpay from "razorpay"; + +export const razorpay = new Razorpay({ + key_id: process.env.RAZORPAY_KEY_ID!, + key_secret: process.env.RAZORPAY_KEY_SECRET!, +}); + +// Plan IDs — create these once in Razorpay dashboard +export const RAZORPAY_PLANS = { + PRO_MONTHLY: process.env.RAZORPAY_PRO_MONTHLY_PLAN_ID!, + PRO_ANNUAL: process.env.RAZORPAY_PRO_ANNUAL_PLAN_ID!, + AGENCY_MONTHLY: process.env.RAZORPAY_AGENCY_MONTHLY_PLAN_ID!, + AGENCY_ANNUAL: process.env.RAZORPAY_AGENCY_ANNUAL_PLAN_ID!, +} as const; +``` + +```typescript +// src/app/api/billing/subscribe/route.ts +export async function POST(req: NextRequest) { + const { workspace, session } = await requireWorkspace(); + const { planKey } = await req.json(); + + const planId = RAZORPAY_PLANS[planKey as keyof typeof RAZORPAY_PLANS]; + if (!planId) return apiError("INVALID_INPUT", "Invalid plan."); + + // Create subscription in Razorpay + const subscription = await razorpay.subscriptions.create({ + plan_id: planId, + total_count: planKey.includes("ANNUAL") ? 1 : 12, + quantity: 1, + customer_notify: 1, + notes: { + workspaceId: workspace.id, + workspaceName: workspace.name, + userEmail: session.user.email, + }, + }); + + // Store pending subscription reference + await prisma.razorpayCustomer.upsert({ + where: { workspaceId: workspace.id }, + update: { subscriptionId: subscription.id, subscriptionStatus: "created" }, + create: { + workspaceId: workspace.id, + subscriptionId: subscription.id, + subscriptionStatus: "created", + }, + }); + + return apiSuccess({ + subscriptionId: subscription.id, + keyId: process.env.RAZORPAY_KEY_ID, + }); +} +``` + +```typescript +// src/app/api/billing/webhook/route.ts +// Verify Razorpay webhook signature and update workspace plan +import crypto from "crypto"; + +export async function POST(req: NextRequest) { + const body = await req.text(); + const signature = req.headers.get("x-razorpay-signature"); + + const expectedSig = crypto + .createHmac("sha256", process.env.RAZORPAY_WEBHOOK_SECRET!) + .update(body) + .digest("hex"); + + if (signature !== expectedSig) { + return new Response("Invalid signature", { status: 401 }); + } + + const event = JSON.parse(body); + + switch (event.event) { + case "subscription.activated": + await handleSubscriptionActivated(event.payload.subscription.entity); + break; + case "subscription.charged": + await handleSubscriptionCharged(event.payload.subscription.entity); + break; + case "subscription.cancelled": + case "subscription.expired": + await handleSubscriptionEnded(event.payload.subscription.entity); + break; + case "payment.failed": + await handlePaymentFailed(event.payload.payment.entity); + break; + } + + return new Response("ok"); +} + +async function handleSubscriptionActivated(sub: RazorpaySubscription) { + const { workspaceId } = sub.notes; + const plan = getPlanFromPlanId(sub.plan_id); // map Razorpay plan ID to your Plan enum + + await prisma.$transaction([ + prisma.workspace.update({ + where: { id: workspaceId }, + data: { plan }, + }), + prisma.razorpayCustomer.update({ + where: { workspaceId }, + data: { + subscriptionId: sub.id, + subscriptionStatus: "active", + currentPeriodEnd: new Date(sub.current_end * 1000), + }, + }), + ]); +} +``` + +**Install:** `pnpm add razorpay` + +--- + +### Schema update — replace StripeCustomer with RazorpayCustomer + +```prisma +model RazorpayCustomer { + id String @id @default(cuid()) + workspaceId String @unique + razorpayCustomerId String? + subscriptionId String? @unique + planId String? + subscriptionStatus String? // "created" | "authenticated" | "active" | "paused" | "cancelled" | "expired" + currentPeriodEnd DateTime? + cancelAtPeriodEnd Boolean @default(false) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade) +} +``` + +--- + +### Pricing in INR vs USD + +Price in INR for Indian customers, USD for international. Razorpay handles the conversion automatically. + +``` +HOBBY: Free +PRO: ₹1,999/month (~$24) or ₹19,999/year (~$240, 17% off) +AGENCY: ₹6,499/month (~$79) or ₹62,999/year (~$765, 20% off) +``` + +Show INR to Indian users (detect via browser locale or IP), USD on the public landing page. Razorpay's checkout supports multi-currency display natively. + +--- + +## 2. Upstash — Is It Good Enough at Zero Cost? + +**Yes. Definitively.** + +### Redis (Rate Limiting) + +Upstash's free tier offers Serverless Redis — 500K commands/month with 256MB data storage. Pricing is stable with no recorded changes. + +Let's do the actual math for FlowCMS: + +``` +Each rate limit check = 2 Redis commands (GET + SET with sliding window) +500,000 commands/month ÷ 2 = 250,000 rate limit checks per month +250,000 ÷ 30 days = 8,333 API requests per day + +For context: +- 100 Hobby users × 5 API calls/day = 500 checks/day +- 50 Pro users × 50 API calls/day = 2,500 checks/day +- Total at early stage: ~3,000 checks/day = well within free tier +``` + +You won't hit the free tier limit until you have significant traffic. By then you're generating revenue. The @upstash/ratelimit SDK is completely free — you only pay for the underlying database commands. Redis free tier allows up to 10,000 requests per day free, and beyond that just $0.20 per 100,000 requests. + +**Verdict: Free tier is genuinely enough for the first 6–12 months.** + +### QStash (Background Jobs) + +QStash free tier: 1,000 messages/day. + +Math for webhooks + usage increments: +``` +Webhook fires: ~5 events per active user per day +50 active Pro users × 5 = 250 webhook messages/day +Usage increments: batched, not per-request (fire once per minute) +Total: ~300 messages/day +``` + +Well within the 1,000/day free limit. When you need to scale, QStash costs $1 per 100K messages. For an app handling 50K background jobs per month, that's $0.50. + +**Verdict: Free tier covers you until you have a substantial paying user base.** + +### What to do when you exceed free tier + +``` +Redis 500K/month exceeded: + → Pay-as-you-go: $0.20 per 100K extra commands + → At 1M commands/month (heavy usage): $1/month extra + → Not a concern until you're generating real revenue + +QStash 1,000/day exceeded: + → $1 per 100K messages + → 30,000 messages/month = $0.30 + → Not a concern until you have hundreds of active users +``` + +--- + +## 3. Admin Panel + +### Decision: Fixed superadmin user, not a role + +A role-based admin (`role: SUPERADMIN`) leaks admin logic into every permission check across the app. A fixed user ID checked at the middleware level is simpler, faster, and has zero attack surface from the user-facing codebase. + +### Architecture + +```typescript +// src/lib/admin.ts +export const ADMIN_EMAIL = process.env.ADMIN_EMAIL!; // your email, set in .env + +export function isAdmin(email: string): boolean { + return email === ADMIN_EMAIL; +} + +// src/middleware/with-admin.ts +import { requireSession } from "@/lib/session"; +import { isAdmin } from "@/lib/admin"; +import { redirect } from "next/navigation"; + +export async function requireAdmin() { + const session = await requireSession(); + if (!isAdmin(session.user.email)) { + redirect("/dashboard"); // silently redirect, don't reveal admin exists + } + return session; +} +``` + +```env +# .env +ADMIN_EMAIL="kapil@yourdomain.com" +``` + +### Admin panel routes + +``` +/admin → overview: total users, workspaces, revenue MRR +/admin/workspaces → all workspaces, plan, usage, last active +/admin/workspaces/[id] → workspace detail, force plan change, impersonate +/admin/users → all users, registration date, workspace +/admin/usage → global API request volume chart +/admin/webhooks → all webhook delivery logs (system-wide) +/admin/plans → manual plan override for any workspace +/admin/announcements → write a banner that appears in all dashboards +``` + +### Middleware guard + +```typescript +// src/app/admin/layout.tsx +import { requireAdmin } from "@/middleware/with-admin"; + +export default async function AdminLayout({ children }: { children: React.ReactNode }) { + await requireAdmin(); // redirects non-admins silently + return ( +
+ +
{children}
+
+ ); +} +``` + +### Admin-only features worth building + +| Feature | Why it matters | +|---|---| +| Impersonate workspace | Debug user-reported issues without them sharing credentials | +| Force plan override | Manually grant Pro to a beta tester or influencer | +| Global usage chart | See if the system is being abused | +| System announcement | Push a banner to all dashboards ("Maintenance Saturday 2am") | +| Workspace deletion | Hard delete when a user can't log in but wants data removed (GDPR) | +| API request log viewer | See what endpoints are being hammered | + +### Security notes + +- The `/admin/*` routes should never appear in the landing page nav or any public link +- Add an extra layer: IP allowlist via Cloudflare (your home/office IP only) for `/admin/*` +- Never add an "Admin" option to the user menu — admin access is direct URL only +- Rotate `ADMIN_EMAIL` to a dedicated admin-only email, not your personal account + +--- + +## 4. Documentation Plan + +### Tech stack for docs + +**Use [Fumadocs](https://fumadocs.vercel.app/) or [Nextra](https://nextra.site/).** Both are Next.js-native MDX documentation frameworks. Since your app is already on Next.js, you can host docs in the same repo at `/docs` or as a sub-path. + +**Recommended: Fumadocs** +- Built for Next.js App Router (same as your app) +- MDX with syntax highlighting, callouts, tabs, code blocks out of the box +- Search with Orama (free, runs in-browser, no Algolia account needed) +- Can be mounted at `/docs` inside your existing Next.js app + +```bash +pnpm add fumadocs-ui fumadocs-core fumadocs-mdx +``` + +Mount at `flowcms.kapiljangid.pro/docs` by adding: +``` +src/app/docs/ + layout.tsx ← Fumadocs layout + page.tsx ← redirect to /docs/introduction + [[...slug]]/ + page.tsx ← dynamic MDX rendering +content/docs/ ← all .mdx files live here +``` + +--- + +### Complete Documentation Structure + +``` +/docs +├── Getting Started +│ ├── Introduction +│ ├── Quick Start (5-minute guide) +│ ├── Core Concepts +│ └── FAQ +│ +├── Content Modeling +│ ├── Content Types +│ ├── Field Types Reference +│ ├── Content Type Templates +│ └── Validations +│ +├── Content Management +│ ├── Creating Entries +│ ├── Publishing Workflow (Draft → Published → Archived) +│ ├── Filtering & Searching +│ └── Bulk Actions +│ +├── Page Builder +│ ├── Overview +│ ├── Block Reference +│ │ ├── Text Blocks (Heading, Text, Quote, Code, Callout) +│ │ ├── Media Blocks (Image, Video, Gallery, Embed) +│ │ ├── Layout Blocks (Columns, Spacer, Divider) +│ │ └── Interactive Blocks (CTA, Form, Accordion, Table) +│ ├── Page Templates +│ └── SEO Fields +│ +├── REST API +│ ├── Authentication (API Keys) +│ ├── Endpoints Reference +│ │ ├── GET /v1/entries/{slug} +│ │ ├── GET /v1/entries/{slug}/{id} +│ │ ├── GET /v1/pages/{slug} +│ │ └── GET /v1/media +│ ├── Filtering & Pagination +│ ├── Response Format +│ ├── Error Codes +│ └── Rate Limits +│ +├── Integrations +│ ├── Next.js (with code examples) +│ ├── React +│ ├── Plain JavaScript / fetch +│ ├── Draft Preview Setup +│ └── Webhooks +│ +├── Media Library +│ ├── Uploading Files +│ ├── Supported Formats +│ └── Using Media in Content +│ +├── Team & Workspace +│ ├── Inviting Members +│ ├── Roles & Permissions +│ └── Managing Your Workspace +│ +├── Billing +│ ├── Plans & Limits +│ ├── Upgrading & Downgrading +│ └── FAQs +│ +└── Self-Hosting (future) + ├── Requirements + ├── Environment Variables + └── Deployment Guide +``` + +--- + +### Priority pages to write first + +Write these 6 pages before launching. Everything else can be added post-launch. + +#### 1. Quick Start (most important page in any doc site) + +```mdx +--- +title: Quick Start +description: Get your first content type and API response in 5 minutes +--- + +## 1. Create a content type + +After signing up, click **New Content Type** in the sidebar. +Name it "Blog Post" and add these fields: + +| Field | Type | Required | +|-------|------|----------| +| title | Text | Yes | +| slug | Text | Yes | +| body | Rich Text | No | + +Click **Save**. + +## 2. Create an entry + +Go to **Blog Post → Entries → New Entry**. +Fill in the title and slug, then click **Publish**. + +## 3. Get your API key + +Go to **Settings → API Keys → New Key**. +Copy the key — it starts with `flw_`. + +## 4. Fetch your content + +\`\`\`bash +curl https://flowcms.kapiljangid.pro/api/v1/entries/blog-post \ + -H "Authorization: Bearer flw_your_key_here" +\`\`\` + +Response: +\`\`\`json +{ + "data": [ + { + "id": "clx...", + "data": { "title": "Hello World", "slug": "hello-world" }, + "status": "PUBLISHED", + "publishedAt": "2024-01-15T10:00:00Z" + } + ], + "meta": { "total": 1, "page": 1, "perPage": 20 } +} +\`\`\` + +That's it. Your content is live. +``` + +#### 2. Next.js Integration + +```mdx +--- +title: Next.js Integration +description: Fetch FlowCMS content in your Next.js app +--- + +## Installation + +No SDK needed — FlowCMS uses standard HTTP. Use fetch directly. + +\`\`\`typescript +// lib/cms.ts +const CMS_URL = process.env.NEXT_PUBLIC_CMS_URL ?? "https://flowcms.kapiljangid.pro"; +const CMS_KEY = process.env.CMS_API_KEY!; + +export async function getEntries(contentType: string) { + const res = await fetch(`${CMS_URL}/api/v1/entries/${contentType}`, { + headers: { Authorization: `Bearer ${CMS_KEY}` }, + next: { revalidate: 60 }, // ISR — revalidate every 60 seconds + }); + if (!res.ok) throw new Error(`CMS error: ${res.status}`); + return res.json(); +} +\`\`\` + +## Fetch on the server (recommended) + +\`\`\`typescript +// app/blog/page.tsx +import { getEntries } from "@/lib/cms"; + +export default async function BlogPage() { + const { data: posts } = await getEntries("blog-post"); + return ( +
    + {posts.map(post => ( +
  • {post.data.title}
  • + ))} +
+ ); +} +\`\`\` + +## Draft preview + +Add a draft token in your CMS dashboard (**Settings → Draft Tokens**), +then pass it as a query param: + +\`\`\`typescript +const isDraft = process.env.NODE_ENV === "development"; +const url = `${CMS_URL}/api/v1/entries/blog-post${isDraft ? `?_token=${process.env.CMS_DRAFT_TOKEN}` : ""}`; +\`\`\` +``` + +#### 3. API Reference (single-page, all endpoints) + +Describe every endpoint with request/response examples and error codes. +Use `` for code examples in multiple languages (curl, fetch, axios). + +#### 4. Webhooks + +Explain: how to configure, the event list, how to verify the HMAC signature, and how to handle delivery failures. + +#### 5. Field Types Reference + +A table describing every field type, its JSON representation in the API response, and validation options. + +#### 6. Rate Limits + +Explain per-plan limits, the response headers (`X-RateLimit-Limit`, etc.), and what the 429 response looks like. + +--- + +### Doc site configuration + +```typescript +// src/app/docs/layout.tsx +import { DocsLayout } from "fumadocs-ui/layout"; +import { APP_CONFIG } from "@/config/app.config"; + +export default function Layout({ children }: { children: React.ReactNode }) { + return ( + + {children} + + ); +} +``` + +### SEO for docs + +Each MDX file should have frontmatter: +```mdx +--- +title: Getting Started with FlowCMS +description: Learn how to set up FlowCMS and make your first API call in under 5 minutes +--- +``` + +The page title becomes `Getting Started with FlowCMS | FlowCMS Docs` automatically. +Good doc SEO is how developers discover you via "how to fetch CMS content in Next.js" searches. + +--- + +## 5. Summary — Decision Table + +| Question | Decision | Reason | +|---|---|---| +| Payment gateway | **Razorpay** | You know it, India-first, UPI AutoPay, international via PA-CB license, no invite process | +| Pricing currency | **INR for Indian users, USD for international** | Razorpay handles conversion | +| UPI subscriptions | **Razorpay Subscriptions** | Built-in mandate, 90%+ success rate, RBI compliant | +| Rate limiting | **Upstash Redis free tier** | 500K commands/month free, HTTP-compatible with Vercel edge | +| Background jobs | **Upstash QStash free tier** | 1,000 messages/day free, covers webhooks + usage tracking at early stage | +| Cost at launch | **$0/month** | Both Upstash products free until meaningful scale | +| Admin panel access | **Fixed email env var, not a role** | Simpler, more secure, no attack surface | +| Admin URL | **/admin, guarded by middleware + Cloudflare IP rule** | Never linked publicly | +| Docs framework | **Fumadocs in same Next.js repo** | No extra deploy, same domain, App Router native | +| Docs URL | **flowcms.kapiljangid.pro/docs** | Works with CNAME setup, no extra cost | +| First docs to write | **Quick Start, Next.js guide, API reference, Webhooks, Field Types, Rate Limits** | These answer the questions every new user has | + +--- + +*Decision Guide v1.0 — FlowCMS* \ No newline at end of file diff --git a/docs/plans/archive/master_implementation_blueprint.md b/docs/plans/archive/master_implementation_blueprint.md new file mode 100644 index 0000000..f0c99c6 --- /dev/null +++ b/docs/plans/archive/master_implementation_blueprint.md @@ -0,0 +1,181 @@ +# FLOWCMS MASTER IMPLEMENTATION BLUEPRINT + +## PART 1 — PRODUCT TRUTH + +* **What it is:** The headless CMS for developers who want Sanity-quality DX at Strapi-level pricing, with zero infrastructure to manage. +* **Who it is for:** Indie developers building client sites, solo founders who outgrew Notion/Contentful, and small dev agencies managing multiple client sites. +* **Problem it solves:** Removes the choice between "expensive enterprise SaaS" (Contentful) and "complex self-hosted VPS" (Strapi). +* **Market Positioning:** "Industrial-Editorial" craft. High design fidelity, developer-first simplicity, and aggressive Indian-market pricing (Razorpay/UPI). +* **What we are NOT building:** Enterprise workflow engines, complex multi-region data residency, or a generic "Wordpress clone." +* **Anti-Bloat Rules:** + * No feature added without a clear PRO/AGENCY plan gate. + * No UI component introduced that deviates from Meridian’s angular/industrial aesthetic. + * No infrastructure that exceeds the ₹0/month launch budget. +* **Execution Philosophy:** Infrastructure stability first, UI polish second. A "Glass House" (beautiful UI, weak backend) is the primary risk. + +--- + +## PART 2 — FINAL SYSTEM ARCHITECTURE + +* **Core:** Next.js 15 (App Router), TypeScript, Tailwind CSS 4. +* **Database:** PostgreSQL on Supabase (using Transaction Pooler on port 6543). +* **Auth:** Better Auth (Google + Email/Password). +* **Billing:** Razorpay Subscriptions (UPI Autopay focus for India, PA-CB for International). +* **Caching:** 4-Layer stack: + 1. Cloudflare Edge (Cache Rules: Strip `Authorization` header). + 2. Vercel CDN (Cache-Control: `public, s-maxage=60, stale-while-revalidate=300`). + 3. Next.js `unstable_cache` with `revalidateTag`. + 4. Supabase PgBouncer for DB connection efficiency. +* **Queue/Async:** Upstash QStash for webhooks and usage increments. +* **Rate Limiting:** Upstash Redis (Serverless) using sliding window algorithm. +* **Cloudflare Worker (Edge enforcement layer):** + * Runs BEFORE cache on every `/api/v1/*` request. + * Responsibilities: API key validation, rate limit check (Upstash), monthly counter increment, plan feature gating. + * KV Store: Cloudflare KV for key lookup cache (60s TTL) to avoid DB hits on every request. +* **AI Engine:** Gemini 2.0 Flash (Free Tier) via direct REST API. +* **Monitoring:** Sentry for error tracking, custom `UsageLog` for internal analytics. +* **Deployment:** Vercel (Production) + Cloudflare (DNS/WAF/Edge). + +--- + +## PART 3 — DATABASE IMPLEMENTATION PLAN + +### Migration Dependency Order +1. **Billing Layer:** Replace `StripeCustomer` placeholder with `RazorpayCustomer`. +2. **Infrastructure Layer:** Add `Environment` (Staging/Prod) and `AuditLog`. +3. **Team Layer:** Add `Invitation` model to unlock multi-user workspaces. +4. **Feature Layer:** Add `DraftToken`, `ContentTypeTemplate`, and `PageTemplate`. + +### Exact Model Extensions +* **Entry:** Add `environmentId` (nullable), `version` (Int), `localeCode` (String). +* **Page:** Add `environmentId`, `seoTitle`, `seoDesc`, `ogImage`, `canonicalUrl`, `noIndex`. +* **ApiKey:** Add `environmentId`, `scopes` (String[]). +* **Workspace:** Add relations to all new models. + +--- + +## PART 4 — FEATURE IMPLEMENTATION ORDER + +### Sprint 1 — The Stability Foundation +1. **PgBouncer:** Switch `.env` to port 6543. (Fixes DB crashes). +2. **Upstash Redis RL:** Move from in-memory Map to `@upstash/ratelimit`. +3. **Razorpay Integration:** Checkout sessions + Webhook lifecycle (activated/charged/cancelled). +4. **Billing UI:** Finalize `/settings/billing` with working upgrade paths. +5. **Workspace Management:** Rename/Delete/Danger Zone in settings. + +### Sprint 2 — Production Reliability +1. **Team Invites:** `Invitation` model + Resend email flow (3,000 emails/mo free). +2. **Real Analytics:** Connect `UsageLog` data to dashboard charts. +3. **QStash Integration:** Move webhooks and usage increments to async jobs. +4. **Draft Preview:** Implement `?_token=` param in API v1. +5. **Audit Logs:** Implement backend tracking for all state-changing actions. + +### Sprint 3 — Content Velocity +1. **CT Templates:** 12 pre-built schemas (Blog, Product, Case Study, etc.). +2. **Page Templates:** 6 block-editor layouts (Landing, Docs, Contact, etc.). +3. **New Blocks:** Quote, Code, Callout, Accordion (Industrial-Editorial style). + +### Sprint 4 — The Launchpad +1. **Environments:** Logic to split Staging and Production content/keys. +2. **AI SEO Gen:** Gemini 2.0 Flash integration for one-click metadata. +3. **Fumadocs:** 6 essential doc pages (QuickStart, Next.js, API Ref). +4. **Launch Assets:** Loom demo, PH kit, Pricing-finalized landing page. + +--- + +## PART 5 — BILLING + MONETIZATION EXECUTION + +* **Gateway:** Razorpay (India-first, UPI Autopay). +* **Plans:** + * **Hobby:** Free (5k requests/mo, 3 CTs, 3 AI generations/day). + * **Pro (₹1,999/mo):** 250k requests/mo, Unlimited CTs, 20 AI generations/day, Draft Preview. + * **Agency (₹6,499/mo):** 1M requests/mo, 5 Workspaces, 50 AI generations/day, Custom Domain. +* **Usage Counting:** Increment on every v1 API request (cached or not). +* **Enforcement:** Middleware checks `MonthlyUsage` vs Plan Limit. Fail with 403 on limit exceeded. +* **Overage:** $0.002 per request (Post-launch month 2). + +--- + +## PART 6 — CACHING + PERFORMANCE EXECUTION + +### Edge Enforcement Layer (Cloudflare Worker) +The Worker sits in front of the Cloudflare cache to ensure every request—even cache hits—is authenticated and metered. + +**Request Path:** +`Caller` → `CF Worker (auth + rate limit + count)` → `CF Cache` → `Vercel` → `DB` + +### Caching Strategy +* **Cloudflare Fix:** Create Cache Rule to **ignore** `Authorization` header in cache key. This is non-negotiable for Layer 1. +* **Purge Strategy:** Surgical invalidation using `purge_cache` by `tags` on publish. +* **Next.js Cache:** Use `unstable_cache` with `revalidateTag` for all DB reads. +* **Non-cacheables:** Any request with `_token`, `/api/internal/*`, and all POST/PUT/DELETE calls. + +--- + +## PART 7 — ADMIN + INTERNAL OPERATIONS + +* **Security:** Fixed `ADMIN_EMAIL` in `.env`. Checked in `requireAdmin()` middleware. +* **Operational Tooling:** + * **Impersonation:** View a user's dashboard as they see it. + * **Force Plan Change:** Manual override for beta testers. + * **Abuse Monitor:** High-volume request tracking. + * **Announcements:** Global dashboard banners. + +--- + +## PART 8 — DOCUMENTATION EXECUTION + +* **Stack:** Fumadocs (Next.js native). +* **Structure:** Introduction -> Quick Start (5m) -> Next.js Integration -> API Reference -> Webhooks -> Field Types. +* **Growth Loop:** High-intent SEO keywords (e.g., "headless cms nextjs razorpay"). + +--- + +## PART 9 — AI FEATURES EXECUTION + +### Provider Strategy +* **Phase 1:** Gemini 2.0 Flash (Free Tier). +* **Quota:** 1,500 requests/day. +* **Implementation:** REST-based (direct `fetch` to Gemini API) to minimize dependencies. + +### Rate Limiting Architecture +To prevent free tier exhaustion and abuse, a dual-layer Upstash Redis rate limit is mandatory: +1. **Global Daily Cap:** Set at 1,200 requests/day (80% of Gemini's limit) to provide a safety buffer. +2. **Per-Workspace Plan Limit:** + * **HOBBY:** 3 gens/day + * **PRO:** 20 gens/day + * **AGENCY:** 50 gens/day + +### UI / UX Flow +* Display remaining daily count next to AI action buttons (e.g., "14 remaining today"). +* On exhaustion, provide a clear upgrade path to PRO or a notice regarding midnight resets. +* AI features focused purely on utility: **AI SEO Generator** and **AI Content Type Schema Generator**. + +### Scaling / Migration Path +Use a provider-agnostic abstraction (`lib/ai/index.ts`) to allow instant switching between Gemini, Groq (Llama 3.1), or Claude (paid tier) via environment variables. + +--- + +## PART 10 — LAUNCH EXECUTION + +* **Blockers:** No Stripe (Razorpay only), no Redis RL, no real usage tracking. +* **Strategy:** Founder-led (Twitter/LinkedIn) -> Agency Outreach (White-label pitch) -> Product Hunt. +* **KPIs:** Active Workspaces, Paid Conversions, API Uptime. + +--- + +## PART 11 — FOUNDER OPERATING RULES + +1. **Sentry-First:** Fix errors before writing features. +2. **Friday Ships:** Visible progress every week. +3. **No Bloat:** If it's not a PRO/AGENCY gate, it's a distraction. +4. **Localhost Trap:** If it works on dev but not Vercel, it doesn't work. Fix the infra. + +--- + +## DESIGN SYSTEM + FRONTEND IMPLEMENTATION RULE (MANDATORY) + +* **Constraint:** All UI must adhere to **Meridian**. +* **Visual Pillars:** Sharp edges, ruled/graph paper textures, Playfair Display headers, Sap Green/Electric Lime accents. +* **No Softness:** Reject rounded, "soft" startup UI trends. +* **Motion:** High-end, subtle Framer Motion transitions only. diff --git a/docs/plans/archive/plan.md b/docs/plans/archive/plan.md new file mode 100644 index 0000000..35c872b --- /dev/null +++ b/docs/plans/archive/plan.md @@ -0,0 +1,296 @@ +FlowCMS +Solo Founder Complete Implementation Plan +Zero development cost · Production-ready stack · Single developer execution +Current State +85% MVP · 40% Production-ready Target (4 Sprints) +100% sellable SaaS product Infra Cost at Launch +₹0/month until real revenue + +Version 1.0 · May 2026 · FlowCMS / Meridian +  +1. Honest Product Snapshot +You have built a "Glass House" — world-class UI on a localhost-grade backend. This plan fixes the foundation before you add any more rooms. + +1.1 What Actually Works +• Multi-tenant architecture via Prisma + Supabase Postgres +• Better Auth with Google + Email/Password, full onboarding pipeline +• Dynamic content modeling — ContentType system with JSON schema stored in Postgres +• Content Entry CRUD with Draft / Published / Archived status +• Visual block editor (dnd-kit) — Heading, Text, Image, CTA, Divider +• Public REST API v1 with pagination, filtering, status checks +• API key lifecycle — creation, hashing, last-used tracking +• Webhook engine — HMAC SHA256 signed POST, delivery logs +• Real-time usage tracking middleware — latency, status codes, monthly limits +• Meridian design system — Tailwind 4, Playfair Display, DM Sans, matches DESIGN.md + +1.2 What Is Broken / Missing +Gap Impact Fix Sprint +In-memory rate limiter Resets on every Vercel cold start — NOT production-ready Sprint 1 Day 1 +Blocking webhook execution Slow user webhook = CMS timeout Sprint 2 +No DB connection pooler First 10 concurrent users crash Postgres Sprint 1 Day 1 +Zero Stripe/Razorpay integration Cannot charge anyone Sprint 1 +Workspace settings = placeholder Users cannot rename or delete workspace Sprint 1 +No member management CMS schema supports teams, UI does not Sprint 2 +Usage dashboard uses hardcoded data Purely decorative feature Sprint 2 +No Sentry / observability Silent failures in webhooks and usage tracker Sprint 2 +No audit logs UI Schema exists, no interface Sprint 2 +  +2. The Zero-Cost Production Stack +Every tool below has a free tier that is genuinely sufficient until you have meaningful paying customers. Total infrastructure cost at launch: ₹0/month. + +Layer Tool Free Tier When You Pay +Hosting / Deploy Vercel (Hobby) Unlimited deploys, 100GB bandwidth When you need team access or SLA +Database Supabase (Free) 500MB DB, 1GB storage, 2M rows When DB > 500MB +Connection Pooler Supabase PgBouncer Free — built in, just switch port –– Always free +Rate Limiting Upstash Redis 500K commands/month free $0.20 per 100K extra +Background Jobs Upstash QStash 1,000 messages/day free $1 per 100K messages +Error Tracking Sentry (Free) 5,000 errors/month free Almost never at early stage +Email (transactional) Resend (Free) 3,000 emails/month free $20 for 50K emails/mo +CDN / Edge Cache Cloudflare (Free) 200 PoPs, cache rules, cache tags Never for our use case +Payments (India) Razorpay No monthly fee 2% per transaction +Docs Fumadocs in same Next.js repo Free — same deployment –– Always free +Admin panel Custom /admin route Free — in your codebase –– Always free + +Math check: 100 Hobby users × 5 API calls/day = 500 Redis checks/day. Free tier is 8,333/day. You have 16× headroom before paying a rupee on infra. +  +3. Payment Gateway — Razorpay (Not Stripe) +3.1 Why Not Stripe +• Stripe India is invite-only — no guaranteed access +• ~6.3% effective fee for Indian businesses on international payments +• No FIRA (Foreign Inward Remittance Advice) — mandatory for Indian businesses receiving foreign payments +• Cannot use UPI AutoPay for subscriptions — misses 60%+ of Indian payment volume + +3.2 Why Razorpay +• You already know the integration — that knowledge has real value +• Razorpay secured PA-CB (Payment Aggregator: Cross Border) RBI license in December 2025 — legally accepts international cards into your Indian bank account +• UPI AutoPay handles recurring subscriptions natively — ₹2,000/month Pro plan fits comfortably within UPI mandate limits +• Built-in RBI compliance: 72-hour advance notification + OTP/PIN mandate authentication — you do not build this yourself +• No invite process. No compliance gaps. 2% transaction fee only. + +3.3 Pricing in INR +Plan Monthly Annual Annual Saving +HOBBY Free forever Free forever – +PRO ₹1,999/month ₹19,999/year ~17% off (~$24 USD) +AGENCY ₹6,499/month ₹62,999/year ~19% off (~$79 USD) + +Show INR to Indian users (detect via browser locale or IP), USD on the public landing page. Razorpay checkout handles multi-currency display. +  +4. Caching Architecture — 4 Layers +Goal: 95%+ of API traffic never reaches your database. The cache diagram in your docs shows this clearly. + +Layer Tool Hit Latency Key Action Required +Layer 1 Cloudflare edge cache 8–20ms Cache Rule: strip Authorization from cache key +Layer 2 Vercel CDN 30–60ms Cache-Control: public, s-maxage=60, stale-while-revalidate=300 +Layer 3 Next.js unstable_cache 50–80ms Tag fetches with next.tags; call revalidateTag on publish +DB (miss) Supabase + PgBouncer 200–600ms Switch to pooled connection string (port 6543) + +The Authorization header problem: Cloudflare bypasses cache for requests with Authorization headers by default. You MUST create a Cache Rule that strips Authorization from the cache key and caches based on URL + workspace only. Without this, Layer 1 does nothing. + +4.1 TTL Reference +Content Type Cloudflare TTL Vercel TTL Notes +Published entries 60s 60s Purge on publish via Cloudflare API + revalidateTag +Published pages 60s 60s Same as entries +Media metadata 3600s 3600s Rarely changes +Content type schema 300s 300s Schema changes are infrequent +Draft content (?_token=) BYPASS — never cache BYPASS Never cache draft tokens +Internal dashboard API BYPASS — private, no-store BYPASS Session-gated, always bypass +  +5. The 4-Sprint Execution Plan +Rule for a solo founder: never work on UI polish until the infrastructure is stable and billing is connected. A beautiful product that crashes under 10 users is not a product. + +Sprint 1 — Week 1: Ship Before Anyone Gets Hurt +These are the changes you make before a single person pays you. Every one of these is a production incident waiting to happen. + +# Task What You're Fixing Est. Time Cost +1 Switch to Supabase PgBouncer (port 6543) DB crashes under 10 concurrent users 10 minutes ₹0 +2 Upstash Redis rate limiter (@upstash/ratelimit) In-memory rate limiter resets on cold start 2–3 hours ₹0 +3 Razorpay subscription checkout session Cannot charge anyone 1 day ₹0 +4 Razorpay webhook handler (subscription lifecycle) Plan not updated after payment 1 day ₹0 +5 Billing UI — /settings/billing, working upgrade buttons "Upgrade" buttons are dead links 1 day ₹0 +6 Workspace settings — rename, delete, danger zone Users are locked out of managing their account 1 day ₹0 +7 Cloudflare Cache Rule (strip Authorization header) Layer 1 cache is completely inoperative 1 hour ₹0 + +Sprint 1 total: ~5 days. After Sprint 1, you can charge money and your system will not fall over on the first paying user. + +Sprint 2 — Week 2: Make It Reliable + +# Task Why It Matters Est. Time Cost +1 Team member invitations (Invitation model + email) CMS without a team is just a blog 2 days ₹0 +2 Real usage analytics — connect UsageLog to dashboard "Usage" page is currently fake/decorative 1 day ₹0 +3 Sentry integration (5 min setup) Silent failures in webhooks, fire-and-forget handlers 2 hours ₹0 +4 QStash background jobs — move webhooks out of request cycle Slow user webhook = CMS timeout 1 day ₹0 +5 Draft tokens + working Preview button Preview button is a placeholder — highest dev satisfaction feature 1 day ₹0 +6 Audit logs — schema migration + basic UI Required for any team plan credibility 1 day ₹0 + +Sprint 2 total: ~5 days. After Sprint 2, the product is reliable enough for early Beta testers. Error rate drops from "unknown" to "visible and manageable." +  +Sprint 3 — Week 3: Make It Useful + +# Task Why It Matters Est. Time Cost +1 12 Content Type Templates (Blog, Product, FAQ, etc.) New users skip blank-slate anxiety, onboarding conversion up 2 days ₹0 +2 6 Page Templates (Landing, Blog, Contact, About, Docs, Product) Block editor adoption increases dramatically 2 days ₹0 +3 4 new blocks: Quote, Code, Callout, Accordion Editor completeness for developer-focused content 1 day ₹0 + +Sprint 3 total: ~5 days. After Sprint 3, the product feels complete for the target audience. A developer can sign up and publish content in under 10 minutes. + +Sprint 4 — Week 4: Make It Launchable + +# Task Why It Matters Est. Time Cost +1 Environments (staging/prod split) Unlocks Agency plan value — devs need staging 2 days ₹0 +2 AI SEO generator (Claude Haiku, ~₹0.08/call) PRO plan differentiation. <₹0.001 per generation = 98% margin 1 day ~₹0 +3 Documentation site via Fumadocs 6 essential pages: QuickStart, Next.js, API ref, Webhooks, Fields, Rate limits 1 day ₹0 +4 Launch prep: Loom demo, landing page copy, Product Hunt draft You cannot sell without a demo. This IS the product at launch. 1 day ₹0 + +Sprint 4 total: ~5 days. After Sprint 4: the product is genuinely sellable. Before Sprint 4: it is a demo. Do not launch before Sprint 4. +  +6. Database Schema — What to Add +Your current schema is solid. These additions unlock the features planned above. Add them in this exact order to avoid migration conflicts. + +New Model Purpose Sprint Replaces +RazorpayCustomer Billing — subscription ID, status, period end 1 StripeCustomer in guide +Environment Staging / Production split per workspace 4 –– New +Invitation Email invite tokens for workspace members 2 –– New +AuditLog "Who changed what and when" — compliance + debug 2 –– New +DraftToken Live preview tokens (?_token=) for draft content 2 –– New +ContentTypeTemplate Pre-built schemas (Blog Post, Product, FAQ...) 3 –– New +PageTemplate Pre-built block arrangements (Landing, About...) 3 –– New +CustomDomain (future) api.yourclient.com → FlowCMS API routing Month 3 –– New + +6.1 Existing Models to Update +• Entry: add environmentId (nullable), version (default 1), localeCode (default "en") +• Page: add environmentId (nullable), ogImage, canonicalUrl, noIndex, localeCode +• ApiKey: add environmentId (nullable), scopes String[] (for future fine-grained permissions) +• Workspace: add RazorpayCustomer relation, all new model relations +  +7. Admin Panel Architecture +Use a fixed admin email in .env — not a SUPERADMIN role. A role leaks admin logic into every permission check. A fixed email checked at middleware level is simpler, faster, and has zero attack surface. + +7.1 Access Pattern +• Set ADMIN_EMAIL="your@email.com" in .env +• requireAdmin() middleware redirects non-admins to /dashboard silently — never reveal that /admin exists +• Add Cloudflare IP allowlist for /admin/* to your home/office IP as an extra layer +• Never link to /admin from any public page, nav, or user menu + +7.2 Admin Routes to Build +Route What It Shows +/admin Overview: total users, workspaces, MRR, system health +/admin/workspaces All workspaces: plan, usage, last active, search +/admin/workspaces/[id] Workspace detail, force plan change, impersonate user +/admin/users All users: registration date, workspace, plan +/admin/usage Global API request volume chart — abuse detection +/admin/webhooks All webhook delivery logs system-wide +/admin/plans Manual plan override for beta testers / influencers +/admin/announcements Write a banner that appears in all dashboards +  +8. Documentation — Fumadocs Setup +Mount Fumadocs at /docs in your existing Next.js repo. Same deployment, same domain, zero extra cost. No Algolia account needed — Orama search runs in-browser. + +8.1 Install +• pnpm add fumadocs-ui fumadocs-core fumadocs-mdx +• Add src/app/docs/ with DocsLayout and [[...slug]]/page.tsx +• Write MDX files in content/docs/ +• Search works via Orama — free, in-browser, no external service + +8.2 The 6 Pages You Must Write Before Launch +Everything else can be added post-launch. These 6 pages answer every question a new user will have. + +Page Why It's Essential Time to Write +Quick Start (5 min guide) Most important page. Shows the full loop: create type → entry → API call. First thing every user reads. 2–3 hours +Next.js Integration Your primary customer's primary question. Include fetch snippet, ISR config, draft preview setup. 1–2 hours +API Reference Every endpoint, request/response examples, multi-language snippets (curl, fetch, axios). 3–4 hours +Webhooks How to configure, event list, HMAC signature verification, handling delivery failures. 1–2 hours +Field Types Reference Table: every field type, its JSON shape in API response, validation options. 1 hour +Rate Limits Per-plan limits, response headers (X-RateLimit-*), what the 429 looks like. 30 min +  +9. AI Features — Utility, Not Theater +AI is table stakes in 2026 for developer tools. But build it as genuine utility. Two features ship in Sprint 4; everything else is post-launch. + +9.1 AI SEO Generator (Ship in Sprint 4) +• On the entry edit page, "Generate with AI" button next to SEO Title and SEO Description +• Uses Claude Haiku — cheap ($0.00025/1K input tokens), fast, accurate enough for SEO +• Typical generation cost: < ₹0.08 — sell as AI credits at ₹800/100 credits → ~98% margin +• Endpoint: POST /api/internal/ai/seo — accepts title + content preview, returns JSON with seoTitle + seoDescription + +9.2 Content Type Generator (Ship in Sprint 4) +• User types "I'm building an e-commerce site for handmade pottery" → AI generates full ContentType schema +• Most powerful onboarding feature. Removes the blank-slate problem on first login. +• Prompt: describe the use case, output valid JSON matching FieldDefinition[] shape +• Gate behind PRO plan to drive upgrades + +9.3 Content Suggestions (Post-launch, Month 2) +• "Complete this sentence", "Make more concise", "Translate to [language]", "3 alternative headlines" +• This is Notion AI scoped to structured CMS fields. Gate behind PRO plan. +• Only build after Sprint 4 — do not get distracted by AI before the foundation is stable +  +10. What to Build After Launch (Months 2–6) + +Month Feature Effort Revenue Impact +Month 2 Overage billing ($0.002/request beyond limit) 1 day Converts heavy Hobby users to PRO +Month 2 Custom API domain (api.yourclient.com) 2 days Agency plan key differentiator +Month 2 Additional blocks: Video, Gallery, Columns, Table 3 days Editor completeness +Month 3 GraphQL endpoint 5 days Opens enterprise/agency market +Month 3 White-label dashboard (logo + domain) 3 days Agency plan lock-in feature +Month 4 i18n / locale support 5 days European market + multilingual clients +Month 4 Image transformations (width, format, quality) 2 days Removes Cloudinary dependency for users +Month 5 SSO (SAML/OIDC) 5 days Enterprise gate — unlocks $300+/month +Month 6 Block marketplace (community plugins) 2 weeks Ecosystem flywheel — Year 2 moat +  +11. Solo Founder Operating System +You are the PM, dev, designer, support, and marketer. These rules keep you from burning out and shipping the wrong things. + +11.1 Daily Rules +1. Start every day by reading Sentry. Fix errors before writing new code. +2. One sprint goal per week. Write it on a sticky note. Do not add scope mid-sprint. +3. Ship something visible every Friday. Even if small. Momentum is a solo founder's only asset. +4. Do not reply to feature requests until Sprint 4 is done. Write them in a list. Prioritize post-launch. +5. Test every feature on mobile before calling it done. Your users are not all on desktop. + +11.2 Weekly Review (Friday, 30 minutes) +• Did I ship the sprint goal? If not, why? +• What broke this week that I didn't catch immediately? +• Did any user email/DM me? What did they say? +• What is the one thing that, if done next week, moves the needle most? + +11.3 What NOT to Do Before Sprint 4 is Done +• Do not add new blocks or UI polish — the infrastructure is broken +• Do not start a social media presence you cannot maintain +• Do not pitch to enterprise customers without SSO and audit logs +• Do not refactor the codebase — ship, then refactor once you have users to tell you what actually matters +• Do not build mobile SDKs — zero demand signal yet + +The single most important metric for the next 4 weeks: number of workspaces with a connected paid subscription. Everything else is vanity. +  +12. Launch Readiness Checklist +Do not announce or launch until every item in Sprint 1 and 2 is checked. The Sprint 3 and 4 items are strongly recommended. + +Sprint 1 — Must Complete Before Taking Money +• Supabase PgBouncer connection string active (port 6543) +• Upstash Redis rate limiter deployed and tested +• Razorpay checkout session creation working +• Razorpay webhook handler processing subscription.activated events +• /settings/billing page shows current plan and working upgrade button +• Workspace rename and delete working +• Cloudflare Cache Rule created (Authorization header stripped from cache key) + +Sprint 2 — Must Complete Before Beta +• Sentry installed and receiving errors from API routes +• QStash processing webhook delivery and usage increment jobs +• Team invitation email sending via Resend +• Usage dashboard chart connected to real UsageLog data +• Draft tokens created and ?_token= preview working in API +• Audit log entries being written on publish/delete/key events + +Sprint 3 & 4 — Strongly Recommended for Launch +• At least 6 content type templates available in "New Content Type" modal +• At least 3 page templates available in block editor +• Quote and Code blocks working in the editor +• Environments (staging/prod) available for PRO/AGENCY plans +• Quick Start documentation page live at /docs +• Next.js integration guide live at /docs/integrations/nextjs +• Loom demo video recorded (max 5 minutes, show the full create → API loop) +• Landing page upgrade buttons are all connected to Razorpay checkout + + + +FlowCMS — Solo Founder Implementation Plan v1.0 +May 2026 · Confidential · Single developer execution path for z diff --git a/docs/plans/archive/planned_features_list.md b/docs/plans/archive/planned_features_list.md new file mode 100644 index 0000000..1347d81 --- /dev/null +++ b/docs/plans/archive/planned_features_list.md @@ -0,0 +1,651 @@ +Here's everything — complete feature list first, then FAQ gaps, then the full analysis. + +--- + +## Complete FlowCMS Feature List + +### TIER 1 — Must have before charging anyone + +--- + +**1. CLI Tool (`flowcms` npm package)** + +**Why:** Every serious developer tool has a CLI. Without it, FlowCMS feels incomplete. Your FAQ already promises `flowcms import --from sanity` — this is currently a lie. + +**Pain point it solves:** Developers hate clicking through UIs to do things that should be scriptable. Seeding data, importing from another CMS, generating TypeScript types — these belong in a terminal. + +**How to build:** Publish `@flowcms/cli` to npm. Start with four commands: +``` +flowcms init — scaffold a new project, generate .env template +flowcms import — import from Sanity, Contentful, Strapi, or JSON +flowcms export — export all content as JSON or CSV +flowcms types — generate TypeScript types from your schema +``` + +**Benefits:** Massive DX improvement. Developers will mention it in tweets. "It just generates types from your schema" is a shareable moment. + +**When:** Sprint 3. The `import` command is the most urgent because the FAQ already promises it. + +--- + +**2. TypeScript SDK (`@flowcms/client`)** + +**Why:** "Framework-agnostic REST API" is true but cold. Developers working in TypeScript want a typed client, not raw `fetch` calls. This is the difference between FlowCMS feeling like a tool vs a service. + +**Pain point it solves:** Writing `fetch('/api/v1/entries/blog-post')` and manually typing the response is friction. Every developer does this once, sighs, and wishes there was an SDK. + +**How to build:** +```typescript +import { createClient } from '@flowcms/client'; + +const cms = createClient({ + workspace: 'my-workspace', + apiKey: process.env.FLOWCMS_API_KEY, +}); + +// Fully typed based on your schema +const posts = await cms.entries('blog-post').published().locale('en').fetch(); +const page = await cms.pages('home').fetch(); +``` + +**Benefits:** Auto-complete in IDE, compile-time errors for wrong field names, zero need to read docs for basic operations. + +**When:** Sprint 4. Pair it with the type generator in the CLI. + +--- + +**3. Next.js Integration Package (`@flowcms/next`)** + +**Why:** Your primary audience is Next.js developers. Give them first-class primitives. + +**Pain point it solves:** Setting up ISR, draft mode, and image optimization with a headless CMS requires boilerplate that every developer writes from scratch. + +**How to build:** +```typescript +// app/blog/[slug]/page.tsx +import { getEntry, generateStaticParams } from '@flowcms/next'; + +export { generateStaticParams }; // auto-generates paths from all published entries + +export default async function BlogPost({ params }) { + const post = await getEntry('blog-post', params.slug); + return
{/* render post */}
; +} +``` + +Also include: +- `` — wrapper around `next/image` pre-configured with Supabase Storage domain +- `useDraftMode()` hook for preview mode integration +- `revalidateFlowCMS()` — webhook handler for on-demand ISR + +**Benefits:** A developer can go from zero to a working Next.js blog in 15 minutes. That 15-minute demo is your best marketing asset. + +**When:** Sprint 4. + +--- + +**4. Content Export & Portability** + +**Why:** Your FAQ promises it. "You can export everything at any time via our CLI or REST API." Neither currently exists in full. + +**Pain point it solves:** Vendor lock-in fear is the number one reason developers choose self-hosted tools. Proving you can leave is what makes people stay. + +**How to build:** +- `GET /api/internal/workspaces/[id]/export` — returns ZIP with all content types, entries, pages, and media metadata as JSON +- CLI: `flowcms export --format json --output ./backup` +- Schedule: allow automated daily exports to S3/Cloudflare R2 + +**Benefits:** Trust signal. Every competitor buries this. FlowCMS should advertise it prominently. + +**When:** Sprint 2 (basic JSON export). Full CLI export in Sprint 3. + +--- + +**5. Content Import & Migration** + +**Why:** The FAQ specifically promises `flowcms import --from sanity`. This is your acquisition strategy — every developer frustrated with Sanity's pricing is a target. + +**Pain point it solves:** Migrating CMS is painful. Schema differences, field type mismatches, media re-uploading. Developers avoid migrating even when they hate their current tool because the migration cost is too high. + +**How to build (phased):** + +Phase 1 — JSON import (Sprint 3): +``` +flowcms import --file ./export.json --type entries +``` + +Phase 2 — Sanity migration (Sprint 4): +``` +flowcms import --from sanity --project-id abc123 --dataset production +``` +Use Sanity's export API to pull NDJSON, map their schema types to FlowCMS field types, handle references and asset uploads. + +Phase 3 — Contentful, Strapi (Post-launch): +Each has its own export format. Contentful is the most valuable target. + +**Field type mapping for Sanity:** +``` +sanity: string → flowcms: text +sanity: text → flowcms: textarea +sanity: blockContent → flowcms: richtext +sanity: image → flowcms: media +sanity: reference → flowcms: reference +sanity: array → flowcms: multiple +``` + +**When:** Phase 1 Sprint 3, Phase 2 Sprint 4. + +--- + +### TIER 2 — Core product completeness + +--- + +**6. Full HTML Page Builder with Fetch** + +**Why:** This is the feature you specifically called out. Agencies and marketers want to build complete HTML pages visually, not just supply JSON to a developer's frontend. This closes the gap between "headless CMS" and "complete website builder." + +**Pain point it solves:** Many clients do not have a frontend developer. They need a CMS that can also serve the page, not just the data. + +**How to build:** + +The Page model already stores blocks as JSON. The new addition is: + +- A `GET /api/v1/pages/[slug]/html` endpoint that renders the blocks server-side into a complete HTML document using a template +- Custom CSS field per page for styling overrides +- A `` section editor for meta tags, scripts, and stylesheets +- An iframe preview in the editor that calls this endpoint live + +```typescript +// GET /api/v1/pages/[slug]/html +// Returns a complete HTML document, not JSON +export async function GET(req, { params }) { + const page = await getPublishedPage(params.slug); + const html = renderPageToHTML(page); // server-side block rendering + return new Response(html, { + headers: { 'Content-Type': 'text/html', 'Cache-Control': 'public, s-maxage=60' } + }); +} +``` + +**Benefits:** Agencies can host client landing pages entirely on FlowCMS with zero frontend infrastructure. A client gets a URL, not an API endpoint. + +**Plan gate:** Pro and above. + +**When:** Sprint 5. This is a significant feature — block renderer, HTML template engine, CSS isolation. + +--- + +**7. Media Management (Digital Asset Manager)** + +**Why:** The Media model exists but there is no proper DAM UI. Developers need to browse, organize, search, and reference media across entries. + +**Pain point it solves:** Every CMS without a proper media library forces developers to use Cloudinary or S3 separately, adding cost and complexity. + +**How to build:** +- Folder tree navigation (already have `folder` field on Media) +- Drag-and-drop upload with progress +- Image preview with dimensions and file size +- Bulk operations: delete, move to folder, download +- Search by filename and alt text +- Image transformation URL params: `?w=800&h=600&fit=cover&format=webp` +- Usage tracking: show which entries reference each media item + +**Benefits:** Eliminates Cloudinary dependency for most users. Image transformation alone justifies Pro plan. + +**When:** Sprint 3 (basic DAM). Image transformations Sprint 5. + +--- + +**8. Scheduled Publishing** + +**Why:** This is table stakes for any publishing workflow. Contentful has had it since day one. + +**Pain point it solves:** Editors write content in advance but cannot schedule it to go live at a specific time without developer involvement. This creates a bottleneck where editors ping developers every time they need to publish outside business hours. + +**How to build:** +- Add `scheduledAt DateTime?` to `Entry` and `Page` models +- QStash delayed message: when saving with `scheduledAt`, enqueue a job with delay +- The job changes `status` to `PUBLISHED` and fires webhooks +- Show scheduled entries in a dedicated "Scheduled" filter in the dashboard +- Calendar view showing upcoming scheduled publishes + +```typescript +// When editor sets scheduledAt: +await qstash.publishJSON({ + url: `${APP_URL}/api/jobs/publish`, + body: { entryId: entry.id }, + delay: Math.floor((scheduledAt.getTime() - Date.now()) / 1000), +}); +``` + +**Benefits:** Removes developers from the publishing loop entirely. This is what editorial teams actually care about. + +**Plan gate:** Pro and above. + +**When:** Sprint 4. + +--- + +**9. Content Versioning & History** + +**Why:** The `version` field exists on `Entry` but there is no version history UI or rollback. This is dangerous — an editor who overwrites content has no recovery path. + +**Pain point it solves:** "I accidentally deleted a paragraph and saved" is a support ticket that happens weekly at every company using a CMS. + +**How to build:** +- `EntryVersion` model storing snapshots: `{ entryId, version, data, savedBy, savedAt }` +- Every save increments `version` and creates an `EntryVersion` record +- Version history panel in the editor showing timeline of changes +- Diff view: highlight what changed between versions +- One-click restore to any previous version + +**Plan gate:** Hobby gets last 3 versions. Pro gets 30 days of history. Agency gets unlimited. + +**When:** Sprint 5. + +--- + +**10. Webhook System (complete)** + +**Why:** The schema has webhooks but the delivery system needs to be production-grade. + +**Pain point it solves:** Developers building JAMstack sites need reliable webhook delivery to trigger rebuilds. A missed webhook means stale content that nobody notices for days. + +**How to build (additions to current):** +- Delivery logs UI showing last 50 deliveries per webhook with status codes and response times +- Manual retry button for failed deliveries +- Automatic retry with exponential backoff (already in QStash) +- Webhook secret verification guide in docs +- Test payload button — send a sample payload without publishing + +**Benefits:** Developers trust the system when they can see delivery logs. This is a reliability signal. + +**When:** Sprint 3. + +--- + +**11. Reference Fields (Content Relationships)** + +**Why:** Almost every real content model needs references. Blog posts reference authors. Products reference categories. Without this, FlowCMS cannot model real-world content. + +**Pain point it solves:** Currently there is no way to link one entry to another. Every developer trying to model "Author" as a separate content type and reference it from "Blog Post" hits a wall. + +**How to build:** +- New field type: `reference` — selects an entry from a specified content type +- API response includes the referenced entry inline (with depth limit) or as an ID +- `populate` query param: `?populate=author,category` to inline references +- Circular reference detection in the schema editor + +**When:** Sprint 4. This is a significant schema and API change. + +--- + +**12. Localization (i18n)** + +**Why:** The `localeCode` field already exists. This needs a full implementation. + +**Pain point it solves:** Any developer building for a non-English audience needs localization. The current half-implementation creates false expectations. + +**How to build:** +- Workspace-level locale configuration: define supported locales and a default +- Per-entry locale variants: same content type, different locale, linked together +- API: `GET /v1/entries/blog-post?locale=fr` with EN fallback +- Translation completeness indicator in the dashboard +- "Copy from [default locale]" button to pre-fill translations + +**Plan gate:** Hobby gets 1 locale (EN). Pro gets 5 locales. Agency gets unlimited. + +**When:** Sprint 6. Do not ship partial — either it works end-to-end or do not ship. + +--- + +### TIER 3 — Developer experience differentiators + +--- + +**13. GraphQL API** + +**Why:** REST is fine but GraphQL lets developers fetch exactly what they need with one request. Over-fetching is a real problem for complex pages with many content types. + +**Pain point it solves:** A page that needs 5 different content types requires 5 REST calls. GraphQL collapses this to one. + +**How to build:** +- Auto-generate GraphQL schema from content type definitions +- Single endpoint: `POST /api/v1/graphql` +- Support for nested reference resolution +- GraphQL Playground available at `/docs/graphql` + +**Plan gate:** Pro and above. + +**When:** Sprint 7. This is 5+ days of work done right. + +--- + +**14. Live Preview (real-time)** + +**Why:** Draft tokens exist but the preview is a separate browser tab. Real-time preview means the editor sees changes as they type, in context. + +**Pain point it solves:** The editing loop is: type → save → switch tab → refresh → switch back. This is slow and breaks focus. + +**How to build:** +- Preview panel inside the editor (resizable iframe) +- Postmessage API between editor and preview iframe +- Developer adds `` wrapper to their frontend +- Changes stream in real-time without saving + +**When:** Sprint 5. + +--- + +**15. AI Content Generation (complete suite)** + +**Why:** AI is expected in every content tool in 2025. It needs to go beyond SEO metadata. + +**Features to build:** + +| Feature | Trigger | Model | Plan gate | +|---|---|---|---| +| SEO metadata generator | Button next to SEO fields | Gemini Flash | Pro | +| Schema generator | "Describe what you're building" in onboarding | Gemini Flash | All | +| Content completion | Tab key in text fields | Gemini Flash | Pro | +| Headline variants | Right-click menu on heading | Gemini Flash | Pro | +| Translation | "Translate to [locale]" button | Gemini Flash | Pro | +| Content summary | Auto-generate excerpt from body | Gemini Flash | All | +| Alt text generator | Auto-suggest when uploading image | Gemini Flash | All | +| Tone rewriter | "Make formal / casual / concise" | Gemini Flash | Pro | + +**When:** SEO generator and schema generator Sprint 4. Others Sprint 6. + +--- + +**16. API Playground (in-dashboard)** + +**Why:** Developers need to test API calls without leaving the dashboard. Currently they have to use Postman or curl. + +**Pain point it solves:** Every time a developer wants to test a query they have to copy their API key, open another tool, and construct the request manually. + +**How to build:** +- Interactive UI at `/dashboard/api-explorer` +- Pre-populated with workspace API key +- Shows all available content types as endpoints +- Query param builder (status, locale, limit, offset) +- Response viewer with syntax highlighting +- "Copy as curl" and "Copy as fetch" buttons +- Shows response time and cache status + +**When:** Sprint 4. This is a high-visibility DX win that developers will screenshot and share. + +--- + +**17. Webhooks Outgoing + Incoming (Event Triggers)** + +**Why:** Beyond outgoing webhooks for publish events, developers need incoming webhooks to trigger content actions from external systems. + +**Pain point it solves:** A developer running a CI/CD pipeline cannot trigger a content publish from their deployment script. + +**How to build:** +- Incoming webhook URL: `POST /api/v1/triggers/[workspace]/[secret]` +- Configurable actions: publish entry, invalidate cache, run export +- Signed with HMAC to prevent abuse + +**When:** Sprint 6. + +--- + +**18. Environments with Promotion Flow** + +**Why:** The environment model exists but there is no "promote from staging to production" workflow. + +**Pain point it solves:** Developers manually copy content between environments. This is error-prone and time-consuming. + +**How to build:** +- "Promote to production" button on any entry in staging +- Diff view showing what will change before promotion +- Bulk promotion: promote all approved entries at once +- Promotion audit log: who promoted what and when + +**When:** Sprint 5. + +--- + +### TIER 4 — Agency and team features + +--- + +**19. White-label Dashboard** + +**Why:** Agencies resell CMS access to clients. They need their logo, their domain, not FlowCMS branding. + +**Pain point it solves:** An agency cannot charge ₹5,000/month for "FlowCMS access." They can charge for "our proprietary CMS platform." + +**How to build:** +- Custom logo upload in workspace settings +- Custom primary color for dashboard UI +- Custom domain mapping: `cms.yourclient.com` → FlowCMS dashboard +- Remove all FlowCMS branding from dashboard and emails + +**Plan gate:** Agency only. + +**When:** Sprint 7. + +--- + +**20. Content Approval Workflow** + +**Why:** Teams need editorial review before publishing. An editor submits, a senior editor approves, then it publishes. + +**Pain point it solves:** Without this, any editor can publish anything immediately. Enterprise and agency customers require review workflows. + +**How to build:** +- New entry status: `IN_REVIEW` +- "Submit for review" button for Editor role +- Review queue for Admin/Owner role +- Comments on entries: reviewers leave feedback inline +- Approval triggers publish or returns to draft with comments + +**Plan gate:** Agency and Enterprise. + +**When:** Sprint 8. + +--- + +**21. Multi-workspace Management** + +**Why:** Agencies managing 5+ client sites need a bird's-eye view, not 5 separate logins. + +**Pain point it solves:** Switching between client workspaces is friction. Agencies want one dashboard showing all clients. + +**How to build:** +- Workspace switcher in the sidebar (already has UI scaffolding) +- Workspace overview page: content counts, last activity, plan status per workspace +- Cross-workspace search (Agency plan) +- Bulk operations across workspaces + +**When:** Sprint 5. + +--- + +**22. Custom Roles and Permissions** + +**Why:** The current roles (OWNER/ADMIN/EDITOR/VIEWER) are too coarse for real teams. + +**Pain point it solves:** A client should be able to edit blog posts but not touch the product pages. There is no way to scope editor permissions by content type. + +**How to build:** +- Role editor: define which content types each role can read/write/publish +- Per-content-type permissions matrix +- API key scopes: limit a key to specific content types + +**Plan gate:** Enterprise. + +**When:** Sprint 9. + +--- + +### TIER 5 — Infrastructure and platform + +--- + +**23. Edge Caching with Automatic Invalidation** + +**Why:** The caching layer is implemented but invalidation on publish is manual. Developers should never have to think about cache. + +**How it should work:** Publish an entry → Cloudflare cache purged → Next.js data cache revalidated → webhooks fired → all automatically, with no developer intervention. + +**Status:** Partially implemented. The `purgeCacheTags` function exists but `revalidateTag` was missing (flagged in audit). This is being fixed. + +**When:** Current sprint (part of blocker fixes). + +--- + +**24. Image Transformation Pipeline** + +**Why:** Serving raw uploaded images is wasteful. A 4MB DSLR photo should not be served to a mobile browser. + +**Pain point it solves:** Developers write custom image resizing logic or pay for Cloudinary. Both add complexity and cost. + +**How to build:** +- URL-based transformations: `?w=800&h=600&fit=cover&format=webp&q=80` +- Lazy processing: transform on first request, cache the result in Supabase Storage +- Automatic WebP/AVIF serving based on Accept header +- Blur hash generation on upload for low-quality placeholders + +**Plan gate:** All plans (basic). Advanced transformations Pro+. + +**When:** Sprint 6. + +--- + +**25. Full-text Search API** + +**Why:** Every content-heavy site needs search. Currently there is no way to search across entries via the API. + +**Pain point it solves:** Developers implement their own search by fetching all entries and filtering client-side, which is slow and exposes all content. + +**How to build:** +- `GET /api/v1/search?q=nextjs&types=blog-post,doc-page&locale=en` +- PostgreSQL full-text search using `tsvector` and `tsquery` (no additional infrastructure) +- Relevance scoring and result snippets +- Search within specific fields only + +**Plan gate:** All plans. Advanced (fuzzy, faceted) Pro+. + +**When:** Sprint 6. + +--- + +**26. Status Page and Uptime Monitoring** + +**Why:** Developers want to know if the CMS is down before their clients tell them. + +**How to build:** +- Public status page at `status.getflowcms.com` +- Health checks every minute on API, database, and email +- Incident history +- Subscribe to incidents via email + +**When:** Sprint 7. Use Betteruptime or build minimal custom version. + +--- + +## FAQ Gaps — Features Promised But Not Built + +Here are every promise in the current FAQs and their build status: + +--- + +**FAQ: "flowcms import --from sanity"** + +Not built. This is the most dangerous FAQ answer because it implies a working CLI. Remove the specific command from the FAQ until Sprint 4 when it exists. Replace with: *"Migration tooling is in active development. Early access members can request manual migration assistance."* + +--- + +**FAQ: "Export via CLI or REST API"** + +The REST export does not exist. The CLI does not exist. Change the answer to: *"Export via REST API is available. CLI export is on the roadmap for Q3 2026."* + +--- + +**FAQ: "EU data residency"** + +Currently you have one Supabase region. EU data residency requires a separate Supabase project in the EU region and routing logic to direct EU users to it. This is a significant infrastructure change. Remove this from the FAQ or qualify it as Enterprise-only and not yet available. + +--- + +**FAQ: "Referral codes move you up the queue significantly"** + +This is cosmetic right now (flagged in the referral audit). Change "significantly" to "your position is noted and considered during approval." + +--- + +**Updated FAQ answers:** + +```typescript +export const FAQS = [ + { + question: "What makes FlowCMS different from Sanity or Strapi?", + answer: "Unlike Sanity, FlowCMS is fully self-hostable and MIT-licensed with no vendor lock-in. Unlike Strapi, setup takes minutes not hours — no manual plugin configuration, no migrations to write. The block editor maps 1:1 to predictable JSON, so your frontend always knows the exact data shape." + }, + { + question: "How do I get early access?", + answer: "Join the waitlist on the home page. We are inviting developers in small batches based on use case fit. Sharing your referral link moves your position up in the queue." + }, + { + question: "What does it cost?", + answer: "FlowCMS core is MIT-licensed and free to self-host forever. Our managed cloud starts with a generous free Hobby tier. Pro is ₹1,999/month. The first 30 developers on the waitlist get one month of Pro free." + }, + { + question: "Who owns my content data?", + answer: "You do, always. Export everything at any time as standard JSON via the REST API. Self-hosted users have complete control over their infrastructure and data location." + }, + { + question: "Can I self-host FlowCMS?", + answer: "Yes. We provide an official Docker image. Run it with docker-compose up and it handles database migrations automatically. Full instructions are in our documentation." + }, + { + question: "Can I migrate from Sanity or Contentful?", + answer: "JSON import is available now. A CLI migration tool for Sanity and Contentful is in development and will be available to early access members first." + }, + { + question: "Is FlowCMS GDPR compliant?", + answer: "Yes. Self-hosted users control their own data location entirely. For cloud users, data is stored in secure infrastructure. Enterprise customers can request custom data residency arrangements." + }, + { + question: "What are the API rate limits?", + answer: "Self-hosted: no limits beyond your hardware. Cloud Hobby: 5,000 requests/month. Pro: 250,000/month. Agency: 1,000,000/month pooled across workspaces." + }, + { + question: "Which frameworks work with FlowCMS?", + answer: "Any framework that can make an HTTP request. We have first-class support for Next.js with a dedicated integration package. REST API works equally well with Remix, Astro, Vue, SvelteKit, React Native, Swift, and Kotlin." + }, + { + question: "How does the block editor map to the API?", + answer: "Every block is a typed JSON object with a predictable shape. Publish a page and the API returns an array of blocks your frontend renders. No custom parsers, no Portable Text, no GROQ — just JSON you already know how to use." + } +]; +``` + +--- + +## Feature Priority Matrix + +| Feature | Effort | Revenue impact | DX impact | When | +|---|---|---|---|---| +| CLI tool (init + types) | Medium | High | Very high | Sprint 3 | +| TypeScript SDK | Medium | High | Very high | Sprint 4 | +| Content export | Low | Medium | High | Sprint 2 | +| Sanity import | High | Very high | High | Sprint 4 | +| Scheduled publishing | Medium | High | High | Sprint 4 | +| Reference fields | High | Very high | Very high | Sprint 4 | +| Full-text search | Medium | High | High | Sprint 6 | +| HTML page fetch | Medium | High | High | Sprint 5 | +| API Playground | Low | Medium | Very high | Sprint 4 | +| Image transforms | Medium | Medium | High | Sprint 6 | +| Content versioning | Medium | Medium | High | Sprint 5 | +| Localization | High | Very high | High | Sprint 6 | +| GraphQL | Very high | High | Medium | Sprint 7 | +| Live preview | Medium | Medium | Very high | Sprint 5 | +| White-label | Medium | Very high | Low | Sprint 7 | +| Approval workflow | High | High | Medium | Sprint 8 | +| Custom roles | Very high | High | Medium | Sprint 9 | \ No newline at end of file diff --git a/docs/plans/archive/product_guide.md b/docs/plans/archive/product_guide.md new file mode 100644 index 0000000..0c3e0f8 --- /dev/null +++ b/docs/plans/archive/product_guide.md @@ -0,0 +1,1349 @@ +# FlowCMS — Complete Product Guide +## Features, Schema Extensions, Business Model & Infrastructure Roadmap + +> Based on the full audit report, competitive research, and current schema. +> This document is the single source of truth for what to build, why to build it, and how to charge for it. + +--- + +## Part 1 — Market Position & Honest Assessment + +### Where FlowCMS Sits + +The headless CMS market has split into two camps: + +**Camp A — Developer Frameworks** (Strapi, Payload CMS) +- Open source, self-hosted, free software + paid cloud +- Own your data, own the stack +- Developer is the primary user + +**Camp B — Enterprise Orchestrators** (Contentful, Sanity, Hygraph) +- Proprietary SaaS, usage-based pricing, $300–$1,500/mo at scale +- Marketing teams are the primary user +- AI features, real-time collab, global CDN + +**FlowCMS's gap:** Neither camp serves the *indie developer building a SaaS* or *small agency managing 10 client sites* well. Strapi requires a $20/month VPS and DevOps knowledge. Contentful charges $300/month before you have real traffic. Sanity is excellent but GROQ is a proprietary query language with a learning curve. + +**FlowCMS's actual positioning:** +> The headless CMS for developers who want Sanity-quality DX at Strapi-level pricing, with zero infrastructure to manage. + +Your differentiator is not features — it is **simplicity + price + a beautiful editor**. You're targeting: +1. Indie developers building client sites (they need a white-label CMS to hand off) +2. Solo founders with a blog/marketing site who outgrew Notion but can't afford Contentful +3. Small dev agencies managing multiple client workspaces under one account + +--- + +## Part 2 — Business Model + +### Pricing Architecture + +The audit correctly identifies that the current $0 / $19 / $79 structure is reasonable but needs tuning. Here's the revised model based on market research: + +``` +HOBBY — Free forever + 3 content types + 5,000 API requests/month + 1 workspace + 1 environment (no staging) + Community support + FlowCMS branding on API responses (X-Powered-By header) + No webhooks + No custom domains for API + +PRO — $24/month (or $19/month billed annually = 20% discount) + Unlimited content types + 250,000 API requests/month + 1 workspace + 3 environments (prod + staging + dev) + Webhooks (up to 5 endpoints) + Custom domain for API (api.yourdomain.com) + Remove FlowCMS branding + Email support (48hr SLA) + Draft preview tokens + 7-day usage history + +AGENCY — $79/month (or $65/month billed annually) + Everything in Pro + 5 workspaces (manage client sites separately) + 1,000,000 API requests/month (pooled across workspaces) + 10 webhook endpoints + Team members (up to 5 seats) + White-label dashboard (your logo, your domain) + Priority support (12hr SLA) + 30-day usage history + Audit logs + +ENTERPRISE — Custom pricing (minimum ~$300/month) + Unlimited workspaces + Unlimited API requests + SSO (SAML/OIDC) + Custom roles & permissions + SLA (99.9% uptime) + GDPR data processing agreement + SOC2 report (when achieved) + Dedicated Slack channel + Quarterly review calls +``` + +### Why This Pricing Works + +- **Hobby is genuinely usable** — 5,000 requests/month is enough for a real blog with moderate traffic. This drives word-of-mouth. +- **Pro at $24 is an easy yes** — it's below the "is this worth thinking about" threshold for any employed developer. +- **Agency at $79 unlocks the real revenue** — agencies with 5 client sites pay $79 instead of $79×5 = $395 across separate tools. This feels like a steal for them. +- **Annual discount drives cash flow** — 20% off locks in 12 months of runway. +- **White-label is an agency's dream** — they resell access to clients at $50+/month per site and pocket the margin. + +### Revenue Model Beyond Subscriptions + +| Revenue Stream | Description | When to Launch | +|---|---|---| +| Overage billing | $0.002 per API request beyond plan limit | Month 3 | +| Seat expansion | $12/seat beyond plan limit | Month 4 | +| Priority support addon | $49/month for guaranteed 4hr response | Month 6 | +| AI credits | $10 for 100 AI content generations | Month 8 | +| Starter templates | Free with attribution, $9 premium templates | Month 6 | +| Marketplace revenue share | 30% of revenue from community block plugins | Year 2 | + +--- + +## Part 3 — Schema Extensions + +### New Models to Add + +#### 3.1 — `Environment` model + +Currently there is no concept of environments. This is table stakes for any serious CMS use case. + +```prisma +model Environment { + id String @id @default(cuid()) + workspaceId String + name String // "Production", "Staging", "Development" + slug String // "production", "staging", "dev" + isDefault Boolean @default(false) + createdAt DateTime @default(now()) + + workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade) + apiKeys ApiKey[] // Keys scoped to specific environments + entries Entry[] + pages Page[] + + @@unique([workspaceId, slug]) +} +``` + +Update `Entry`, `Page`, `ApiKey` to add: +```prisma +environmentId String? +environment Environment? @relation(...) +``` + +#### 3.2 — `AuditLog` model + +Critical for compliance and debugging. "Who changed what and when." + +```prisma +model AuditLog { + id String @id @default(cuid()) + workspaceId String + userId String? + apiKeyId String? + action AuditAction + resourceType String // "ContentType", "Entry", "Page", "ApiKey", "Webhook" + resourceId String + resourceName String? // human-readable name for display + before Json? // snapshot before change + after Json? // snapshot after change + ip String? + userAgent String? + createdAt DateTime @default(now()) + + workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade) + + @@index([workspaceId, createdAt]) + @@index([workspaceId, resourceType, resourceId]) +} + +enum AuditAction { + CREATE + UPDATE + DELETE + PUBLISH + UNPUBLISH + ARCHIVE + API_KEY_CREATED + API_KEY_REVOKED + WEBHOOK_FIRED + MEMBER_INVITED + MEMBER_REMOVED + PLAN_CHANGED +} +``` + +#### 3.3 — `Invitation` model + +Without this, the WorkspaceMember table is useless. You cannot invite team members without email invitations. + +```prisma +model Invitation { + id String @id @default(cuid()) + workspaceId String + email String + role MemberRole @default(EDITOR) + token String @unique // secure random token for the invite link + status InvitationStatus @default(PENDING) + invitedById String + expiresAt DateTime // 7 days from creation + acceptedAt DateTime? + createdAt DateTime @default(now()) + + workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade) + + @@unique([workspaceId, email]) + @@index([token]) +} + +enum InvitationStatus { + PENDING + ACCEPTED + EXPIRED + REVOKED +} +``` + +#### 3.4 — `ContentTypeTemplate` model + +Pre-built schemas users can clone into their workspace. Key for onboarding conversion. + +```prisma +model ContentTypeTemplate { + id String @id @default(cuid()) + name String // "Blog Post", "Product", "FAQ", "Event" + slug String @unique + description String + category String // "Blog", "E-commerce", "Marketing", "Documentation" + fields Json // Same FieldDefinition[] shape as ContentType.fields + previewData Json? // Sample entry data to show in onboarding + isPremium Boolean @default(false) + usageCount Int @default(0) + createdAt DateTime @default(now()) +} +``` + +#### 3.5 — `PageTemplate` model + +Pre-built block arrangements. Editors can start from a template instead of an empty canvas. + +```prisma +model PageTemplate { + id String @id @default(cuid()) + name String // "Landing Page", "About Us", "Blog Post Layout" + slug String @unique + description String + category String + blocks Json // Array of Block objects with default props + thumbnail String? // URL to preview image + isPremium Boolean @default(false) + usageCount Int @default(0) + createdAt DateTime @default(now()) +} +``` + +#### 3.6 — `StripeCustomer` model + +Required for billing. Do not add Stripe customer IDs to the Workspace model directly — keep billing concerns isolated. + +```prisma +model StripeCustomer { + id String @id @default(cuid()) + workspaceId String @unique + stripeCustomerId String @unique + stripeSubscriptionId String? + stripePriceId String? + subscriptionStatus String? // "active", "canceled", "past_due", "trialing" + currentPeriodEnd DateTime? + cancelAtPeriodEnd Boolean @default(false) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade) +} +``` + +#### 3.7 — `DraftToken` model + +Live preview tokens. Developers add `?_token=abc123` to their Next.js app to preview unpublished content. This is one of the highest-conversion features you can ship. + +```prisma +model DraftToken { + id String @id @default(cuid()) + workspaceId String + name String // "Next.js Preview Mode", "Staging Site" + token String @unique + expiresAt DateTime? // null = never expires + lastUsedAt DateTime? + createdAt DateTime @default(now()) + + workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade) +} +``` + +#### 3.8 — `CustomDomain` model + +API custom domains (api.yourclient.com → flowcms API). Agency plan feature. + +```prisma +model CustomDomain { + id String @id @default(cuid()) + workspaceId String + domain String @unique // e.g. "api.yourclient.com" + verified Boolean @default(false) + verifyToken String // TXT record value for DNS verification + createdAt DateTime @default(now()) + + workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade) +} +``` + +#### 3.9 — Update `Workspace` with billing fields + +```prisma +model Workspace { + // ... existing fields ... + + // Add these: + stripeCustomer StripeCustomer? + environments Environment[] + auditLogs AuditLog[] + invitations Invitation[] + draftTokens DraftToken[] + customDomains CustomDomain[] + + // Billing convenience fields (mirror from Stripe, updated via webhook) + planExpiresAt DateTime? + trialEndsAt DateTime? +} +``` + +#### 3.10 — Update Existing Models + +**`Entry` — add environment and version support:** +```prisma +model Entry { + // ... existing fields ... + environmentId String? + environment Environment? @relation(...) + version Int @default(1) // incremented on each save + localeCode String? @default("en") // for future i18n +} +``` + +**`Page` — add environment and SEO fields:** +```prisma +model Page { + // ... existing fields ... + environmentId String? + environment Environment? @relation(...) + ogImage String? // Open Graph image URL + canonicalUrl String? + noIndex Boolean @default(false) + localeCode String? @default("en") +} +``` + +**`ApiKey` — scope to environment:** +```prisma +model ApiKey { + // ... existing fields ... + environmentId String? + environment Environment? @relation(...) + scopes String[] // ["read:entries", "read:pages", "read:media"] — for future fine-grained permissions +} +``` + +--- + +## Part 4 — New Blocks to Implement + +### Current blocks: Heading, Text, Image, CTA, Divider +### Add these 12 blocks: + +| Block | Props | Use case | +|---|---|---| +| `quote` | `text`, `author`, `role`, `avatar` | Testimonials, pull quotes | +| `code` | `language`, `code`, `filename`, `showLineNumbers` | Developer documentation | +| `video` | `url`, `provider` (youtube/vimeo/upload), `autoplay`, `caption` | Product demos | +| `gallery` | `images[]` (url, alt, caption), `layout` (grid/masonry/carousel) | Portfolio, product images | +| `embed` | `url`, `type` (tweet/codepen/figma/youtube), `height` | Social embeds | +| `form` | `formId`, `fields[]`, `submitLabel`, `successMessage` | Contact, newsletter signup | +| `columns` | `columnCount` (2/3), `gap`, `blocks[][]` | Multi-column layouts | +| `accordion` | `items[]` (question, answer), `allowMultiple` | FAQ sections | +| `table` | `headers[]`, `rows[][]`, `caption`, `striped` | Comparison tables, data | +| `callout` | `type` (info/warning/danger/success), `title`, `body` | Docs alerts, notices | +| `spacer` | `height` (sm/md/lg/xl) | Vertical breathing room | +| `html` | `content` (raw HTML string) | Advanced escape hatch | + +### Block taxonomy + +Group blocks in the palette into categories: + +``` +Text — Heading, Text, Quote, Code, Callout, HTML +Media — Image, Video, Gallery, Embed +Layout — Columns, Spacer, Divider +Interactive — CTA, Form, Accordion, Table +``` + +--- + +## Part 5 — Content Type Templates + +Ship these 12 templates on day one. They appear in the "New Content Type" modal. + +### Category: Blog & Publishing +```json +{ + "name": "Blog Post", + "slug": "blog-post", + "fields": [ + { "name": "Title", "slug": "title", "type": "text", "required": true }, + { "name": "Slug", "slug": "slug", "type": "text", "required": true }, + { "name": "Author", "slug": "author", "type": "text", "required": true }, + { "name": "Cover Image", "slug": "cover_image", "type": "media", "required": false }, + { "name": "Excerpt", "slug": "excerpt", "type": "textarea", "required": false }, + { "name": "Body", "slug": "body", "type": "richtext", "required": true }, + { "name": "Tags", "slug": "tags", "type": "text", "multiple": true }, + { "name": "SEO Title", "slug": "seo_title", "type": "text", "required": false }, + { "name": "SEO Description", "slug": "seo_description", "type": "textarea", "required": false } + ] +} +``` + +```json +{ "name": "Author", "slug": "author", + "fields": ["name", "bio (textarea)", "avatar (media)", "twitter", "website"] } +``` + +### Category: E-commerce +```json +{ "name": "Product", "slug": "product", + "fields": ["name", "slug", "description (richtext)", "price (number)", "comparePrice (number)", + "images (media, multiple)", "sku", "inStock (boolean)", "category", "tags (multiple)"] } +``` + +```json +{ "name": "Product Category", "slug": "product-category", + "fields": ["name", "slug", "description", "image (media)", "parentCategory (reference)"] } +``` + +### Category: Marketing +```json +{ "name": "Landing Page Section", "slug": "landing-section", + "fields": ["heading", "subheading", "body (richtext)", "ctaLabel", "ctaUrl", + "image (media)", "imagePosition (text)", "backgroundColor"] } +``` + +```json +{ "name": "Testimonial", "slug": "testimonial", + "fields": ["quote (textarea)", "author", "role", "company", "avatar (media)", "rating (number)"] } +``` + +```json +{ "name": "FAQ", "slug": "faq", + "fields": ["question", "answer (richtext)", "category", "order (number)"] } +``` + +### Category: Documentation +```json +{ "name": "Doc Page", "slug": "doc-page", + "fields": ["title", "slug", "body (richtext)", "category", "order (number)", + "lastUpdated (date)", "contributors (text, multiple)"] } +``` + +### Category: Team / Company +```json +{ "name": "Team Member", "slug": "team-member", + "fields": ["name", "role", "bio (textarea)", "photo (media)", "email", + "linkedin", "github", "order (number)"] } +``` + +```json +{ "name": "Job Opening", "slug": "job-opening", + "fields": ["title", "department", "location", "type (text)", "description (richtext)", + "requirements (richtext)", "salary", "applyUrl", "closingDate (date)"] } +``` + +```json +{ "name": "Case Study", "slug": "case-study", + "fields": ["title", "client", "industry", "challenge (richtext)", "solution (richtext)", + "results (richtext)", "coverImage (media)", "images (media, multiple)", "publishedDate (date)"] } +``` + +```json +{ "name": "Event", "slug": "event", + "fields": ["title", "slug", "description (richtext)", "startDate (date)", "endDate (date)", + "location", "isOnline (boolean)", "registrationUrl", "coverImage (media)", "capacity (number)"] } +``` + +--- + +## Part 6 — Page Templates + +Ship these 6 page templates in the block editor: + +### 1. Blog Post Layout +``` +[Heading — H1 — "Post Title"] +[Text — "Author • Date • Reading time"] +[Image — cover image, full width] +[Text — "Post body goes here..."] +[Divider] +[Heading — H2 — "Related Posts"] +``` + +### 2. Landing Page +``` +[Heading — H1 — "Your headline"] +[Text — "Supporting subheadline"] +[CTA — "Get started" / "Learn more"] +[Divider] +[Columns — 3 cols] + [Heading H3 + Text] [Heading H3 + Text] [Heading H3 + Text] +[Image — product screenshot] +[Quote — testimonial] +[CTA — "Start free trial"] +``` + +### 3. About Page +``` +[Heading — H1 — "About Us"] +[Text — company story] +[Image — team photo] +[Heading — H2 — "Our Mission"] +[Text — mission statement] +[Heading — H2 — "The Team"] +[Gallery — team photos] +``` + +### 4. Contact Page +``` +[Heading — H1 — "Get in Touch"] +[Columns — 2 cols] + [Text — contact info, address, email] + [Form — name, email, message, submit] +``` + +### 5. Documentation Article +``` +[Heading — H1 — "Article Title"] +[Callout — type: info — "Quick summary"] +[Text — introduction] +[Heading — H2 — "Section"] +[Text — section body] +[Code — language: typescript] +[Callout — type: warning — "Note"] +``` + +### 6. Product Page +``` +[Columns — 2 cols] + [Gallery — product images] + [Heading H1 + Text (price) + Text (description) + CTA] +[Divider] +[Accordion — FAQ items] +[Heading — H2 — "Related Products"] +``` + +--- + +## Part 7 — Infrastructure Hardening Roadmap + +The audit is correct: the current stack will break under real traffic. Here's the exact fix order. + +### Week 1 — Critical (Do Before Any Marketing) + +#### 7.1 — Upstash Redis Rate Limiter + +Replace the in-memory Map with Upstash Redis. Free tier covers 10,000 commands/day, which is plenty for early users. + +```typescript +// src/lib/rate-limit.ts — replace entirely +import { Redis } from "@upstash/redis"; +import { Ratelimit } from "@upstash/ratelimit"; + +const redis = new Redis({ + url: process.env.UPSTASH_REDIS_REST_URL!, + token: process.env.UPSTASH_REDIS_REST_TOKEN!, +}); + +// Sliding window — fairer than fixed window +export const rateLimiters = { + HOBBY: new Ratelimit({ redis, limiter: Ratelimit.slidingWindow(30, "1 m"), prefix: "rl:hobby" }), + PRO: new Ratelimit({ redis, limiter: Ratelimit.slidingWindow(300, "1 m"), prefix: "rl:pro" }), + TEAM: new Ratelimit({ redis, limiter: Ratelimit.slidingWindow(1000, "1 m"), prefix: "rl:team" }), +}; + +export async function checkRateLimit(workspaceId: string, plan: string) { + const limiter = rateLimiters[plan as keyof typeof rateLimiters] ?? rateLimiters.HOBBY; + const { success, limit, remaining, reset } = await limiter.limit(workspaceId); + return { allowed: success, limit, remaining, resetAt: reset }; +} +``` + +Install: `pnpm add @upstash/redis @upstash/ratelimit` + +Cost: $0 until 10K commands/day. Well within Hobby usage. + +#### 7.2 — Supabase Connection Pooler + +In your `.env`, switch to the pooled connection string: + +```env +# Change from direct (port 5432) to Transaction Pooler (port 6543) +DATABASE_URL="postgresql://postgres.[ref]:[password]@aws-0-[region].pooler.supabase.com:6543/postgres?pgbouncer=true&connection_limit=1" +``` + +This single change prevents the "too many connections" crash under concurrent load. Takes 2 minutes. + +#### 7.3 — Stripe Integration (Revenue Switch) + +``` +pnpm add stripe @stripe/stripe-js +``` + +New files needed: +- `src/lib/stripe.ts` — Stripe client singleton +- `src/app/api/stripe/checkout/route.ts` — create checkout session +- `src/app/api/stripe/portal/route.ts` — customer portal (manage subscription) +- `src/app/api/stripe/webhook/route.ts` — handle subscription events +- `src/app/(dashboard)/dashboard/settings/billing/page.tsx` — billing UI + +Stripe webhook events to handle: +``` +checkout.session.completed → set workspace.plan, create StripeCustomer record +customer.subscription.updated → update plan if user upgrades/downgrades +customer.subscription.deleted → downgrade to HOBBY +invoice.payment_failed → email user, set warning in dashboard +``` + +### Week 2 — Stability + +#### 7.4 — Upstash QStash for Background Jobs + +Move webhooks and usage increment out of the request cycle: + +```typescript +// src/lib/queue.ts +import { Client } from "@upstash/qstash"; + +export const qstash = new Client({ token: process.env.QSTASH_TOKEN! }); + +export async function enqueueWebhook(payload: { + workspaceId: string; + event: string; + data: Record; +}) { + await qstash.publishJSON({ + url: `${process.env.NEXT_PUBLIC_APP_URL}/api/jobs/webhook`, + body: payload, + retries: 3, + }); +} + +export async function enqueueUsageIncrement(workspaceId: string) { + await qstash.publishJSON({ + url: `${process.env.NEXT_PUBLIC_APP_URL}/api/jobs/usage`, + body: { workspaceId }, + retries: 2, + }); +} +``` + +Job handlers at `src/app/api/jobs/webhook/route.ts` and `src/app/api/jobs/usage/route.ts`: +- Verify QStash signature with `@upstash/qstash` receiver +- Execute the actual DB work +- Return 200 on success, non-2xx to trigger retry + +Cost: Free tier 500 messages/day. Paid $1/100K messages. Webhooks for 100 Pro customers firing 5 events/day = 500 messages/day = within free tier. + +#### 7.5 — Sentry Error Tracking + +``` +pnpm add @sentry/nextjs +``` + +5 minutes of setup. Catches every silent error in fire-and-forget handlers. This alone is worth a Sprint. Free tier is 5,000 errors/month — more than enough. + +```typescript +// Wrap all internal route handlers +import * as Sentry from "@sentry/nextjs"; + +export async function GET() { + try { + // ... handler logic + } catch (error) { + Sentry.captureException(error, { extra: { workspaceId, endpoint } }); + return apiError("INTERNAL_ERROR", "Something went wrong."); + } +} +``` + +### Week 3-4 — Product Completeness + +#### 7.6 — Workspace Settings Page + +Complete the "Coming Soon" placeholder with: +- Rename workspace +- Change plan (links to Stripe customer portal) +- Danger zone: delete workspace (with confirmation + `DELETE /me/data` endpoint for GDPR) +- Team members list + invite form +- Webhook configuration (already in schema, needs UI) + +#### 7.7 — Real Usage Analytics + +Connect `UsageLog` to the dashboard UI: + +```sql +-- Query for usage chart (last 30 days, grouped by day) +SELECT + DATE_TRUNC('day', "createdAt") as date, + COUNT(*) as requests, + AVG(duration) as avg_latency, + COUNT(*) FILTER (WHERE "statusCode" >= 400) as errors +FROM "UsageLog" +WHERE "workspaceId" = $1 + AND "createdAt" > NOW() - INTERVAL '30 days' +GROUP BY 1 +ORDER BY 1 +``` + +Use Recharts (already available in React) to render a simple line chart. This transforms the "decorative" usage page into a genuine product feature users care about. + +#### 7.8 — Live Preview via Draft Tokens + +The single highest-impact feature for developer adoption. When a developer adds `?_token=abc123` to their Next.js fetch call, your API returns draft content instead of only published content. + +```typescript +// In GET /api/v1/entries/[slug]/route.ts +// Add after API key verification: + +const draftToken = req.nextUrl.searchParams.get("_token"); +if (draftToken) { + const token = await prisma.draftToken.findUnique({ + where: { token: draftToken, workspaceId }, + }); + if (token && (!token.expiresAt || token.expiresAt > new Date())) { + // Return draft content + where.status = undefined; // remove published-only filter + } +} +``` + +This enables the "Preview" button in the editor to actually work. Without it, the preview button is the single biggest feature gap between you and Sanity/Contentful. + +--- + +## Part 8 — Features Priority Matrix + +### Must ship before charging anyone (MVP gate): + +| Feature | Effort | Impact | +|---|---|---| +| Stripe + billing | 3 days | Revenue on/off switch | +| Upstash Redis rate limiter | 2 hours | Prevents production crash | +| Connection pooler | 10 minutes | Prevents DB crash | +| Workspace settings page | 2 days | Users can't manage their account | +| Real usage analytics | 1 day | "Usage" page currently fake | + +### Ship in first paid month: + +| Feature | Effort | Impact | +|---|---|---| +| Team member invitations | 2 days | CMS without a team is a blog | +| Live preview + draft tokens | 1 day | Highest dev-satisfaction feature | +| Environments (staging/prod) | 3 days | Unlocks Agency plan value prop | +| Audit logs | 1 day | Required for any team plan | +| QStash background jobs | 1 day | Webhook reliability | +| Sentry | 2 hours | Stop flying blind | + +### Ship in months 2-3: + +| Feature | Effort | Impact | +|---|---|---| +| Content type templates | 2 days | Dramatically improves onboarding | +| Page templates | 2 days | Block editor adoption | +| New blocks (12 listed above) | 3 days | Editor completeness | +| AI SEO assist | 3 days | PRO plan differentiation | +| Custom domain for API | 2 days | Agency plan key feature | +| GraphQL endpoint | 5 days | Opens enterprise market | + +### Ship in months 4-6: + +| Feature | Effort | Impact | +|---|---|---| +| White-label dashboard | 3 days | Agency plan lock-in | +| i18n / locale support | 5 days | European market | +| Image transformations | 2 days | Removes Cloudinary dependency | +| SSO (SAML) | 5 days | Enterprise gate | +| Block marketplace | 2 weeks | Ecosystem flywheel | + +--- + +## Part 9 — AI Features Roadmap + +AI is table stakes in 2025 for any developer tool. But build it as utility, not theater. + +### AI Feature 1 — SEO Metadata Generator (Ship first) + +On the entry edit page, add a "Generate with AI" button next to SEO Title and SEO Description fields. + +```typescript +// src/app/api/internal/ai/seo/route.ts +import Anthropic from "@anthropic-ai/sdk"; + +export async function POST(req: NextRequest) { + const { title, content, contentType } = await req.json(); + const client = new Anthropic(); + + const message = await client.messages.create({ + model: "claude-haiku-4-5", // haiku = cheap, fast, good enough for this + max_tokens: 256, + messages: [{ + role: "user", + content: `Generate SEO metadata for this ${contentType} content. +Title: ${title} +Content preview: ${content.slice(0, 500)} + +Respond with JSON only: +{ "seoTitle": "...", "seoDescription": "..." } + +Rules: seoTitle max 60 chars, seoDescription max 155 chars, include primary keyword naturally.` + }] + }); + + return apiSuccess(JSON.parse(message.content[0].text)); +} +``` + +**Pricing:** Haiku costs $0.00025/1K input tokens. A typical generation costs < $0.001. Charge 1 AI credit per generation. Sell 100 credits for $10. Margin: ~98%. + +### AI Feature 2 — Content Type Generator + +Most powerful onboarding feature. User types "I'm building an e-commerce site that sells handmade pottery" → AI generates the full content type schema. + +```typescript +// Prompt: +`You are a CMS schema designer. Based on the user's description, generate a JSON content type schema. + +User description: "${userDescription}" + +Output ONLY valid JSON matching this TypeScript type: +{ name: string, slug: string, description: string, fields: FieldDefinition[] } + +Rules: +- slug is kebab-case, no spaces +- Include 5-10 fields appropriate for this content type +- Always include: title/name (text, required), slug (text, required) +- Use richtext only for long body content +- Use media type for image fields +- Include SEO fields (seoTitle, seoDescription) if appropriate` +``` + +### AI Feature 3 — Content Suggestions (Ship later) + +On the entry editor, while the user is typing, offer: +- "Complete this sentence" +- "Make this more concise" +- "Translate to [language]" +- "Generate 3 alternative headlines" + +This is Notion AI, but scoped to structured CMS content. Gate it behind Pro plan. + +--- + +## Part 10 — Full Revised Schema (Final) + +Here is the complete `schema.prisma` with all additions: + +```prisma +generator client { + provider = "prisma-client-js" + previewFeatures = ["driverAdapters"] + output = "../src/generated/prisma" +} + +datasource db { + provider = "postgresql" +} + +// ── Auth ─────────────────────────────────────────────────────────── +model User { + id String @id @default(cuid()) + email String @unique + name String? + emailVerified Boolean @default(false) + onboarded Boolean @default(false) + image String? + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + sessions Session[] + accounts Account[] + workspaceMembers WorkspaceMember[] +} + +model Session { + id String @id @default(cuid()) + userId String + token String @unique + expiresAt DateTime + ipAddress String? + userAgent String? + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + user User @relation(fields: [userId], references: [id], onDelete: Cascade) +} + +model Account { + id String @id @default(cuid()) + userId String + accountId String + providerId String + accessToken String? + refreshToken String? + idToken String? + accessTokenExpiresAt DateTime? + refreshTokenExpiresAt DateTime? + scope String? + password String? + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + user User @relation(fields: [userId], references: [id], onDelete: Cascade) +} + +model Verification { + id String @id @default(cuid()) + identifier String + value String + expiresAt DateTime + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt +} + +// ── Workspace ────────────────────────────────────────────────────── +model Workspace { + id String @id @default(cuid()) + name String + slug String @unique + plan Plan @default(HOBBY) + planExpiresAt DateTime? + trialEndsAt DateTime? + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + members WorkspaceMember[] + environments Environment[] + contentTypes ContentType[] + pages Page[] + media Media[] + apiKeys ApiKey[] + webhooks Webhook[] + usageLogs UsageLog[] + monthlyUsage MonthlyUsage[] + auditLogs AuditLog[] + invitations Invitation[] + draftTokens DraftToken[] + customDomains CustomDomain[] + stripeCustomer StripeCustomer? +} + +model WorkspaceMember { + id String @id @default(cuid()) + workspaceId String + userId String + role MemberRole @default(EDITOR) + createdAt DateTime @default(now()) + + workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade) + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + + @@unique([workspaceId, userId]) +} + +// ── Environments ─────────────────────────────────────────────────── +model Environment { + id String @id @default(cuid()) + workspaceId String + name String + slug String + isDefault Boolean @default(false) + createdAt DateTime @default(now()) + + workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade) + apiKeys ApiKey[] + entries Entry[] + pages Page[] + + @@unique([workspaceId, slug]) +} + +// ── Content ──────────────────────────────────────────────────────── +model ContentType { + id String @id @default(cuid()) + workspaceId String + name String + slug String + description String? + fields Json + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade) + entries Entry[] + + @@unique([workspaceId, slug]) +} + +model Entry { + id String @id @default(cuid()) + contentTypeId String + workspaceId String + environmentId String? + data Json + status EntryStatus @default(DRAFT) + version Int @default(1) + localeCode String? @default("en") + publishedAt DateTime? + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + contentType ContentType @relation(fields: [contentTypeId], references: [id], onDelete: Cascade) + environment Environment? @relation(fields: [environmentId], references: [id]) + + @@index([workspaceId, status]) + @@index([contentTypeId, status]) +} + +model Page { + id String @id @default(cuid()) + workspaceId String + environmentId String? + title String + slug String + blocks Json + status EntryStatus @default(DRAFT) + publishedAt DateTime? + seoTitle String? + seoDesc String? + ogImage String? + canonicalUrl String? + noIndex Boolean @default(false) + localeCode String? @default("en") + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade) + environment Environment? @relation(fields: [environmentId], references: [id]) + + @@unique([workspaceId, slug]) +} + +// ── Media ────────────────────────────────────────────────────────── +model Media { + id String @id @default(cuid()) + workspaceId String + filename String + url String + mimeType String + size Int + alt String? + width Int? + height Int? + folder String? @default("/") + createdAt DateTime @default(now()) + + workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade) + + @@index([workspaceId, folder]) +} + +// ── API Keys ─────────────────────────────────────────────────────── +model ApiKey { + id String @id @default(cuid()) + workspaceId String + environmentId String? + name String + keyHash String @unique + keyPrefix String + scopes String[] @default(["read:entries", "read:pages", "read:media"]) + lastUsedAt DateTime? + expiresAt DateTime? + createdAt DateTime @default(now()) + + workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade) + environment Environment? @relation(fields: [environmentId], references: [id]) +} + +// ── Webhooks ─────────────────────────────────────────────────────── +model Webhook { + id String @id @default(cuid()) + workspaceId String + url String + events WebhookEvent[] + secret String + enabled Boolean @default(true) + createdAt DateTime @default(now()) + + workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade) + deliveries WebhookDelivery[] +} + +model WebhookDelivery { + id String @id @default(cuid()) + webhookId String + event String + payload Json + statusCode Int? + success Boolean + duration Int? + createdAt DateTime @default(now()) + + webhook Webhook @relation(fields: [webhookId], references: [id], onDelete: Cascade) +} + +// ── Observability ────────────────────────────────────────────────── +model UsageLog { + id String @id @default(cuid()) + workspaceId String + apiKeyId String? + endpoint String + method String + statusCode Int + duration Int + ip String? + userAgent String? + cacheHit Boolean @default(false) + createdAt DateTime @default(now()) + + workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade) + + @@index([workspaceId, createdAt]) + @@index([workspaceId, apiKeyId]) +} + +model MonthlyUsage { + id String @id @default(cuid()) + workspaceId String + year Int + month Int + apiRequests Int @default(0) + storageBytes Int @default(0) + contentTypes Int @default(0) + updatedAt DateTime @updatedAt + + workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade) + + @@unique([workspaceId, year, month]) +} + +model AuditLog { + id String @id @default(cuid()) + workspaceId String + userId String? + apiKeyId String? + action AuditAction + resourceType String + resourceId String + resourceName String? + before Json? + after Json? + ip String? + userAgent String? + createdAt DateTime @default(now()) + + workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade) + + @@index([workspaceId, createdAt]) + @@index([workspaceId, resourceType, resourceId]) +} + +// ── Billing ──────────────────────────────────────────────────────── +model StripeCustomer { + id String @id @default(cuid()) + workspaceId String @unique + stripeCustomerId String @unique + stripeSubscriptionId String? + stripePriceId String? + subscriptionStatus String? + currentPeriodEnd DateTime? + cancelAtPeriodEnd Boolean @default(false) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade) +} + +// ── Team ─────────────────────────────────────────────────────────── +model Invitation { + id String @id @default(cuid()) + workspaceId String + email String + role MemberRole @default(EDITOR) + token String @unique + status InvitationStatus @default(PENDING) + invitedById String + expiresAt DateTime + acceptedAt DateTime? + createdAt DateTime @default(now()) + + workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade) + + @@unique([workspaceId, email]) +} + +// ── Preview & Domains ────────────────────────────────────────────── +model DraftToken { + id String @id @default(cuid()) + workspaceId String + name String + token String @unique + expiresAt DateTime? + lastUsedAt DateTime? + createdAt DateTime @default(now()) + + workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade) +} + +model CustomDomain { + id String @id @default(cuid()) + workspaceId String + domain String @unique + verified Boolean @default(false) + verifyToken String + createdAt DateTime @default(now()) + + workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade) +} + +// ── Templates ───────────────────────────────────────────────────── +model ContentTypeTemplate { + id String @id @default(cuid()) + name String + slug String @unique + description String + category String + fields Json + previewData Json? + isPremium Boolean @default(false) + usageCount Int @default(0) + createdAt DateTime @default(now()) +} + +model PageTemplate { + id String @id @default(cuid()) + name String + slug String @unique + description String + category String + blocks Json + thumbnail String? + isPremium Boolean @default(false) + usageCount Int @default(0) + createdAt DateTime @default(now()) +} + +// ── Enums ────────────────────────────────────────────────────────── +enum Plan { + HOBBY + PRO + AGENCY + ENTERPRISE +} + +enum MemberRole { + OWNER + ADMIN + EDITOR + VIEWER +} + +enum EntryStatus { + DRAFT + PUBLISHED + ARCHIVED +} + +enum WebhookEvent { + ENTRY_CREATED + ENTRY_UPDATED + ENTRY_PUBLISHED + ENTRY_DELETED + PAGE_CREATED + PAGE_UPDATED + PAGE_PUBLISHED + PAGE_DELETED +} + +enum AuditAction { + CREATE + UPDATE + DELETE + PUBLISH + UNPUBLISH + ARCHIVE + API_KEY_CREATED + API_KEY_REVOKED + WEBHOOK_FIRED + MEMBER_INVITED + MEMBER_REMOVED + PLAN_CHANGED +} + +enum InvitationStatus { + PENDING + ACCEPTED + EXPIRED + REVOKED +} +``` + +--- + +## Part 11 — The Brutal Execution Priority + +The audit says: "0% time on UI polish, 100% on infrastructure + commercial rails." + +This is exactly right. Here is the exact sequence: + +``` +Sprint 1 (this week): + Day 1: Upstash Redis rate limiter (2 hours) + Connection pooler (10 min) + Day 2: Stripe integration — checkout sessions + Day 3: Stripe webhook handler — subscription lifecycle + Day 4: Billing UI — settings/billing page, upgrade buttons that work + Day 5: Workspace settings — rename, delete, member list + +Sprint 2 (next week): + Day 1: Team invitations — send email, accept flow + Day 2: Real usage analytics — connect UsageLog to dashboard chart + Day 3: Sentry integration + QStash for webhooks + Day 4: Draft tokens + preview button that works + Day 5: Audit logs — schema migration + basic UI + +Sprint 3 (week 3): + Day 1-2: Content type templates (12 listed above) + Day 3-4: Page templates (6 listed above) + Day 5: New blocks — Quote, Code, Callout, Accordion + +Sprint 4 (week 4): + Day 1-2: Environments (staging/prod split) + Day 3: AI SEO generator + Day 4-5: Launch prep — Loom demo, landing page copy, Product Hunt draft +``` + +After Sprint 4, the product is genuinely sellable. Before Sprint 4, it is a demo. + +--- + +*FlowCMS Product Guide v2.0 — Written May 2026* \ No newline at end of file diff --git a/docs/plans/archive/product_guide_v2.md b/docs/plans/archive/product_guide_v2.md new file mode 100644 index 0000000..e9bed6e --- /dev/null +++ b/docs/plans/archive/product_guide_v2.md @@ -0,0 +1,490 @@ +# FlowCMS — Final Product Guide +## The complete reference for what we are building, why, and in what order + +> Version 1.0 — May 2026 +> Status: Waitlist launch imminent. Dashboard in controlled development. + +--- + +## Part 1 — What FlowCMS Actually Is + +**The one-line version:** +The headless CMS for developers who want Sanity-quality DX at Strapi-level pricing, with zero infrastructure to manage. + +**The honest version:** +FlowCMS sits in the gap between "expensive enterprise SaaS" (Contentful at $300/month) and "complex self-hosted VPS" (Strapi requiring DevOps knowledge). It is built for three specific audiences: + +1. **Indie developers** building client sites who need a CMS they can hand off to non-technical editors +2. **Solo founders** who outgrew Notion but cannot justify Contentful pricing +3. **Small dev agencies** managing multiple client workspaces under one account + +**What we are NOT building:** +- Enterprise workflow engines with complex approval chains +- A WordPress clone with plugins and themes +- A generic database GUI +- Anything that requires a developer to configure before an editor can use it + +**The differentiator is not features. It is simplicity + price + a beautiful editor.** + +--- + +## Part 2 — Current System Architecture + +| Layer | Technology | Purpose | +|---|---|---| +| Framework | Next.js 15 (App Router) | Full-stack, SSR, API routes | +| Language | TypeScript | Type safety throughout | +| Database | PostgreSQL on Supabase (port 6543) | Primary data store | +| Auth | Better Auth | Sessions, Google OAuth, email/password | +| Billing | Razorpay | Subscriptions, UPI Autopay | +| Email | Resend | Transactional emails, idempotency via EmailLog | +| Rate Limiting | Upstash Redis (sliding window) | Per-workspace API protection | +| Background Jobs | Upstash QStash | Webhooks, usage increments | +| Error Tracking | Sentry | Production error visibility | +| CDN Layer 1 | Cloudflare | DNS, WAF, cache (Authorization header stripped from cache key) | +| CDN Layer 2 | Vercel | Global CDN, serverless functions | +| Cache Layer 3 | Next.js unstable_cache | DB query caching with revalidateTag | +| Storage | Supabase Storage | Media uploads | +| Docs | Fumadocs | /docs, MDX-based | +| Styling | Tailwind CSS 4 + Meridian design system | Sharp, industrial UI | + +### Caching request path +``` +API call → Cloudflare Worker (auth + rate limit + monthly count) + → Cloudflare Cache (60s TTL, URL-keyed, no Authorization in key) + → Vercel CDN (60s TTL) + → Next.js cache (unstable_cache, revalidateTag on publish) + → Supabase PostgreSQL +``` + +### Target latency with all layers warm +| Scenario | Latency | Frequency | +|---|---|---| +| Cloudflare cache hit | 8–20ms | ~90% of traffic | +| Vercel CDN hit | 30–60ms | ~8% | +| Next.js cache hit | 50–80ms | ~1.5% | +| Full DB query | 300–800ms | ~0.5% | + +--- + +## Part 3 — Pricing + +### Plan Structure + +**HOBBY — Free forever** +- 3 content types +- 5,000 API requests/month +- 1 workspace, 1 environment +- Community support +- No webhooks +- No custom API domain +- FlowCMS branding on API responses (`X-Powered-By` header) + +**PRO — ₹1,999/month** +- Unlimited content types +- 250,000 API requests/month +- 1 workspace, 3 environments (prod + staging + dev) +- Webhooks (up to 5 endpoints) +- Custom API domain (api.yourdomain.com) +- Remove FlowCMS branding +- Draft preview tokens +- Email support (48hr SLA) +- 7-day usage history +- 20 AI generations/day + +**AGENCY — ₹6,499/month** +- Everything in Pro +- 5 workspaces +- 1,000,000 API requests/month (pooled) +- 10 webhook endpoints +- Team members (up to 5 seats) +- White-label dashboard +- Priority support (12hr SLA) +- 30-day usage history +- Audit logs +- 50 AI generations/day + +**ENTERPRISE — Custom pricing (~₹25,000+/month)** +- Unlimited workspaces and requests +- SSO (SAML/OIDC) +- Custom roles and permissions +- 99.9% uptime SLA +- GDPR DPA +- Dedicated Slack channel + +### What counts as an API request +Every hit to `/api/v1/*` with a valid API key, cached or not. Specifically: + +``` +✅ Counts: GET /v1/entries/blog-post +✅ Counts: GET /v1/pages/home +✅ Counts: GET /v1/media +❌ No count: Dashboard API calls (/api/internal/*) +❌ No count: Webhook delivery attempts +❌ No count: Failed auth (401 responses) +``` + +### Revenue streams beyond subscriptions + +| Stream | Description | Launch timing | +|---|---|---| +| Overage billing | ₹0.15 per 1,000 requests over plan limit | Month 3 | +| Seat expansion | ₹999/seat beyond plan limit | Month 4 | +| AI credits | ₹750 for 100 AI generations | Month 6 | +| Priority support addon | ₹3,999/month, 4hr response guarantee | Month 6 | +| Premium templates | ₹750 per template pack | Month 6 | + +### Waitlist offer +**First 30 developers get 1 month of Pro free.** +This is the final, confirmed offer. Do not change it. 30 users × 1 month = controlled, measurable cost. + +--- + +## Part 4 — Feature Flags & Launch Gating + +The `lib/launch.ts` file controls what is available at any given launch phase. + +```typescript +export const LAUNCH_MODE: "waitlist" | "early_access" | "open" = "waitlist"; + +export const isWaitlistMode = LAUNCH_MODE === "waitlist"; + +export const FEATURES = { + enableBilling: true, // Razorpay is implemented + enableWebhooks: true, // Behind Pro gate + enableCustomDomains: false, // Not yet implemented + enableTeamInvites: true, // Invitation model exists + enableApiKeyGeneration: true, // Core feature + enableEnvironments: true, // Environments model exists + enableAiFeatures: true, // Gemini integration exists + enableAuditLogs: true, // AuditLog model exists + enableWhiteLabel: false, // Agency feature, not yet built +}; +``` + +Any feature with `false` must return `403` from its API route, not just be hidden in UI. + +--- + +## Part 5 — Database Schema Summary + +### Core models and their purpose + +| Model | Purpose | Key fields | +|---|---|---| +| User | Auth identity | email, emailVerified, onboarded | +| Workspace | Tenant container | plan, slug, planExpiresAt | +| WorkspaceMember | User↔Workspace join | role (OWNER/ADMIN/EDITOR/VIEWER) | +| Environment | Staging/Production split | slug, isDefault | +| ContentType | Schema definition | fields (JSON), slug | +| Entry | Content instance | data (JSON), status, version, localeCode | +| Page | Block-based page | blocks (JSON), status, SEO fields | +| Media | Uploaded files | url, mimeType, size, folder | +| ApiKey | v1 API authentication | keyHash (never plaintext), scopes, environmentId | +| Webhook | Event delivery config | url, events[], secret | +| WebhookDelivery | Delivery log | statusCode, success, duration | +| UsageLog | Per-request observability | endpoint, duration, cacheHit | +| MonthlyUsage | Plan limit tracking | apiRequests, unique per workspace+month | +| AuditLog | Admin/team audit trail | action, before, after, userId | +| RazorpayCustomer | Billing state | subscriptionId, subscriptionStatus | +| Invitation | Team invite flow | token, expiresAt, status | +| DraftToken | Preview token | token, expiresAt, lastUsedAt | +| CustomDomain | Agency API domains | domain, verified, verifyToken | +| WaitlistEntry | Pre-launch signups | position, priority, referralCode, status | +| EmailLog | Email idempotency | idempotencyKey, status, attempts | +| ContentTypeTemplate | Pre-built schemas | fields (JSON), category, isPremium | +| PageTemplate | Pre-built block layouts | blocks (JSON), category, isPremium | + +### WaitlistEntry status flow +``` +PENDING → CONFIRMED → APPROVED → INVITED → JOINED + ↘ REJECTED +INVITED → EXPIRED (if inviteExpiresAt passes) +JOINED → SUSPENDED / REVOKED (admin action) +``` + +--- + +## Part 6 — API Architecture + +### Versioning +All public content APIs are under `/api/v1/`. Internal dashboard APIs are under `/api/internal/`. Admin APIs are under `/api/admin/`. + +Every v1 response includes: +``` +X-API-Version: 1 +X-RateLimit-Limit: [limit] +X-RateLimit-Remaining: [remaining] +X-RateLimit-Reset: [unix timestamp] +Cache-Control: public, s-maxage=60, stale-while-revalidate=300 +Cache-Tag: workspace-[id],entries-[slug] +``` + +Dashboard and internal routes include: +``` +Cache-Control: private, no-store +``` + +Draft preview requests include: +``` +Cache-Control: private, no-store, no-cache +``` + +### Adding v2 in the future +When v2 routes are needed: +1. Create `/api/v2/` directory +2. v1 routes remain unchanged +3. v2 routes may use different response shapes but must be documented in `VERSIONING.md` +4. Deprecation notice is added to v1 response headers: `Deprecation: true, Sunset: [date]` +5. v1 is supported for minimum 12 months after v2 launch + +--- + +## Part 7 — Content Type Templates (12 to ship on launch) + +### Blog & Publishing +- **Blog Post** — title, slug, author, coverImage, excerpt, body (richtext), tags, seoTitle, seoDescription +- **Author** — name, bio, avatar, twitter, website + +### E-commerce +- **Product** — name, slug, description, price, comparePrice, images, sku, inStock, category, tags +- **Product Category** — name, slug, description, image, parentCategory + +### Marketing +- **Landing Page Section** — heading, subheading, body, ctaLabel, ctaUrl, image, imagePosition, backgroundColor +- **Testimonial** — quote, author, role, company, avatar, rating +- **FAQ** — question, answer, category, order + +### Documentation +- **Doc Page** — title, slug, body, category, order, lastUpdated, contributors + +### Team & Company +- **Team Member** — name, role, bio, photo, email, linkedin, github, order +- **Job Opening** — title, department, location, type, description, requirements, salary, applyUrl, closingDate +- **Case Study** — title, client, industry, challenge, solution, results, coverImage, publishedDate +- **Event** — title, slug, description, startDate, endDate, location, isOnline, registrationUrl, coverImage + +--- + +## Part 8 — Block Types + +### Currently implemented +Heading, Rich Text, Image, CTA, Divider + +### To implement in Sprint 3 + +| Block | Category | Key props | +|---|---|---| +| Quote | Text | text, author, role, avatar | +| Code | Text | language, code, filename, showLineNumbers | +| Callout | Text | type (info/warning/danger/success), title, body | +| HTML | Text | content (raw HTML escape hatch) | +| Video | Media | url, provider, autoplay, caption | +| Gallery | Media | images[], layout (grid/masonry/carousel) | +| Embed | Media | url, type (tweet/codepen/figma) | +| Columns | Layout | columnCount, gap, blocks[][] | +| Spacer | Layout | height (sm/md/lg/xl) | +| Accordion | Interactive | items[] (question, answer), allowMultiple | +| Table | Interactive | headers[], rows[][], striped | +| Form | Interactive | formId, fields[], submitLabel | + +### Block categories in the editor palette +``` +Text — Heading, Rich Text, Quote, Code, Callout, HTML +Media — Image, Video, Gallery, Embed +Layout — Columns, Spacer, Divider +Interactive — CTA, Form, Accordion, Table +``` + +--- + +## Part 9 — AI Features + +### Provider strategy +- **Phase 1:** Gemini 2.0 Flash via direct REST API (free tier, 1,500 requests/day) +- **Safety buffer:** Global cap at 1,200 requests/day (80% of limit) +- **Migration path:** Provider-agnostic abstraction in `lib/ai/index.ts` to swap to Claude or Groq via env var + +### Per-workspace limits +| Plan | AI generations/day | +|---|---| +| HOBBY | 3 | +| PRO | 20 | +| AGENCY | 50 | + +### Features to build + +**AI SEO Generator (Sprint 4)** +One-click generation of seoTitle and seoDescription from entry content. Uses Gemini Haiku-equivalent. Gate behind Pro plan. + +**AI Content Type Generator (Sprint 4)** +User describes their use case in plain English → AI generates the full field schema. Most powerful onboarding feature. + +**AI Content Suggestions (Post-launch)** +Inline suggestions while editing: complete sentence, make concise, translate, generate headlines. Gate behind Pro plan. + +--- + +## Part 10 — Execution Roadmap + +### Sprint 1 — Stability Foundation (this week) +``` +Day 1: PgBouncer connection string (10 min) + Upstash Redis rate limiter (2 hours) +Day 2: Razorpay checkout session implementation +Day 3: Razorpay webhook handler (subscription lifecycle) +Day 4: Billing UI — /settings/billing with working upgrade buttons +Day 5: Workspace settings — rename, delete, danger zone +``` + +### Sprint 2 — Production Reliability (next week) +``` +Day 1: Team invitations — Invitation model + Resend email flow +Day 2: Real usage analytics — connect UsageLog to dashboard chart (Recharts) +Day 3: QStash integration — move webhooks + usage to async jobs +Day 4: Draft preview tokens — ?_token= param in v1 API +Day 5: Audit log UI — basic table in admin + dashboard +``` + +### Sprint 3 — Content Velocity (week 3) +``` +Day 1-2: 12 content type templates +Day 3-4: 6 page templates +Day 5: New blocks — Quote, Code, Callout, Accordion +``` + +### Sprint 4 — Launch Preparation (week 4) +``` +Day 1-2: Environments — staging/production content split +Day 3: AI SEO generator (Gemini integration) +Day 4-5: Launch assets — Loom demo, Product Hunt draft, landing page final copy +``` + +**After Sprint 4, the product is genuinely sellable. Before Sprint 4, it is a demo.** + +--- + +## Part 11 — Open Source Strategy + +### Repository structure +``` +flowcms/ + src/ Application source + prisma/ Schema and migrations + content/docs/ Fumadocs MDX content + Dockerfile Multi-stage build + docker-compose.yml Local development + self-hosting + .dockerignore + SELF_HOSTING.md Self-hosting instructions + VERSIONING.md API versioning contract + CONTRIBUTING.md How to contribute + LICENSE MIT + README.md Project overview +``` + +### README must include +1. What FlowCMS is (1 paragraph) +2. Live URL (getflowcms.com) +3. Tech stack (one line each) +4. Local setup (5 commands max) +5. Link to full docs +6. Contributing guide link +7. MIT license badge + +### .gitignore must exclude +``` +.env +.env.local +.env.production +.env*.local +node_modules/ +.next/ +.source/ +*.log +``` + +### Open source rules +- No personal email addresses in code (only .env) +- No internal URLs hardcoded (only .env) +- No API keys or tokens in any committed file +- All TODO comments must reference a GitHub issue number + +--- + +## Part 12 — X (Twitter) Build-in-Public Strategy + +### Three post types, rotating weekly + +**1. Shipping posts (every Friday)** +One screenshot or short video showing exactly what shipped. No threads. No vision statements. +Example: *"Shipped: live preview tokens for FlowCMS. Add `?_token=abc` to any fetch and get draft content. Ships in v0.3.0."* + +**2. Problem posts (once per week)** +One specific technical problem encountered and how it was solved. Developers share these. +Example: *"Spent 3 hours debugging Cloudflare cache bypass. The Authorization header was the culprit. Stripping it from the cache key fixed everything. Here's exactly how."* + +**3. Milestone posts (event-driven)** +Waitlist live, first 10 signups, first approval, first real user, first paying customer. Include a real screenshot. + +### Rules +- Tag @nextjs, @vercel, @supabase, @upstash only when content is directly about their product +- No marketing copy +- No generic "I'm building a CMS" posts +- No threads explaining the vision +- Only specific, technical, real content + +### KPIs to share publicly +- Waitlist signup count (weekly) +- GitHub stars (weekly) +- First paying customer (milestone post) +- API request count for beta users (after first approvals) + +--- + +## Part 13 — Founder Operating Rules + +1. **Sentry-first.** Fix errors before writing features. An error in production is a user losing trust. +2. **Friday ships.** Visible progress every week. Even a small UI improvement counts. +3. **No bloat.** If a feature is not gated behind Pro or Agency, it is a distraction. +4. **Localhost trap.** If it works on dev but not Vercel, it does not work. Fix the infrastructure. +5. **Docs before demos.** If you cannot explain how a feature works in one doc page, it is not ready to ship. +6. **Revenue rails before feature rails.** Billing must work before any new content features are added. + +--- + +## Part 14 — Launch Checklist + +### Before waitlist goes live +- [ ] Docker setup complete (Dockerfile + docker-compose.yml + SELF_HOSTING.md) +- [ ] Waitlist copy reads "First 30 developers get 1 month of Pro free" everywhere +- [ ] ref param captured in WaitlistForm and sent to API +- [ ] referralCode stored lowercase, self-referral guard in place +- [ ] X-API-Version header on all v1 responses +- [ ] Upstash Redis rate limiter (not in-memory Map) +- [ ] Supabase connection string on port 6543 +- [ ] Sentry initialized (server + client) +- [ ] ADMIN_EMAIL set in .env (not hardcoded) +- [ ] All planned features marked as "Coming Soon" on landing page +- [ ] OG image, meta title, meta description set in app/layout.tsx +- [ ] robots.txt in /public +- [ ] MIT LICENSE file committed +- [ ] README.md complete +- [ ] .gitignore excludes .env, .source/, .next/ +- [ ] No API keys or secrets in any committed file + +### Before first user approvals (week 3) +- [ ] Audit logging for admin actions +- [ ] Invite email sends correctly via Resend with working token link +- [ ] Invite token consumption (inviteUsedAt set after registration) +- [ ] Expired token rejection +- [ ] Admin cannot approve/revoke themselves accidentally + +### Before charging anyone +- [ ] Razorpay webhook handler live +- [ ] Plan limits enforced at API level (not just UI) +- [ ] Billing settings page shows current plan and upgrade path +- [ ] Downgrade logic works (subscription.cancelled → HOBBY at period end) + +--- + +*FlowCMS Product Guide v1.0 — May 2026* +*Single source of truth. Update this document when any architectural decision changes.* \ No newline at end of file diff --git a/docs/plans/archive/waitlist_plan.md b/docs/plans/archive/waitlist_plan.md new file mode 100644 index 0000000..d8f8246 --- /dev/null +++ b/docs/plans/archive/waitlist_plan.md @@ -0,0 +1,868 @@ + +FlowCMS +Waitlist · Admin Panel · Feature Flag System +Complete implementation plan — from landing page to launch flip +Component Status Scope +Waitlist system To build DB schema, API route, email confirm, position tracking +Feature flag (LAUNCH_MODE) To build Middleware, env var, all route protection +Admin panel — waitlist To build View, approve, export, bulk invite +Admin panel — core To build Users, workspaces, usage, plan override +Early access invite flow To build One-time token, approval email, onboarding gate +Waitlist landing page section To refine Form UI, social proof, position counter + +Version 1.0 · May 2026 · Solo Founder Execution +  +Part 1 — Feature Flag System + +One environment variable controls the entire application mode. No code changes needed to launch — flip the variable in Vercel, redeploy in 30 seconds. + +1.1 The Three Modes +LAUNCH_MODE value What users can access When to use +"waitlist" Landing page (/) + waitlist API only. Everything else → redirect to / Before launch. Right now. +"early_access" Landing + waitlist + approved users with invite token can log in Selective beta before full open +"open" Everything. Full app accessible to all. Public launch day + +Current state should be "waitlist". You flip to "early_access" when you start approving beta users. You flip to "open" on launch day. Three states, one variable, zero code changes. + +1.2 Environment Variables +# .env.local (development) +NEXT_PUBLIC_LAUNCH_MODE="waitlist" + +# Vercel → Settings → Environment Variables +NEXT_PUBLIC_LAUNCH_MODE="waitlist" # right now +NEXT_PUBLIC_LAUNCH_MODE="early_access" # when inviting beta users +NEXT_PUBLIC_LAUNCH_MODE="open" # launch day + +# Admin access (separate from launch mode) +ADMIN_EMAIL="your@email.com" + +# Email (Resend) +RESEND_API_KEY="re_..." +RESEND_FROM_EMAIL="hello@flowcms.dev" +RESEND_FROM_NAME="FlowCMS" + +# App URL (used in email links) +NEXT_PUBLIC_APP_URL="https://flowcms.dev" + +1.3 Middleware Implementation +This is the single most important file. It enforces mode at the edge — no request slips through. + +// src/middleware.ts +import { NextResponse } from "next/server"; +import type { NextRequest } from "next/server"; + +type LaunchMode = "waitlist" | "early_access" | "open"; + +const MODE = (process.env.NEXT_PUBLIC_LAUNCH_MODE ?? "waitlist") as LaunchMode; + +// Always accessible regardless of mode +const ALWAYS_PUBLIC = [ + "/", + "/api/waitlist", + "/api/health", + "/docs", // keep docs public even in waitlist mode +]; + +// Only accessible with a valid invite token (early_access mode) +const INVITE_GATE = [ + "/login", + "/signup", + "/onboarding", +]; + +// Only accessible when mode = "open" +const OPEN_ONLY = [ + "/dashboard", + "/api/auth", + "/api/v1", + "/api/internal", +]; + +export function middleware(request: NextRequest) { + const { pathname } = request.nextUrl; + + // Admin is always accessible (protected by its own auth) + if (pathname.startsWith("/admin")) return NextResponse.next(); + + // Static assets always pass + const isAlwaysPublic = ALWAYS_PUBLIC.some( + p => pathname === p || pathname.startsWith(p + "/"), + ); + if (isAlwaysPublic) return NextResponse.next(); + + // WAITLIST MODE: only public paths allowed + if (MODE === "waitlist") { + return NextResponse.redirect(new URL("/", request.url)); + } + + // EARLY_ACCESS MODE: check invite token for protected pages + if (MODE === "early_access") { + const isInviteGated = INVITE_GATE.some(p => pathname.startsWith(p)); + if (isInviteGated) { + const token = request.nextUrl.searchParams.get("invite"); + if (!token) { + return NextResponse.redirect(new URL("/?waitlist=gated", request.url)); + } + // Token validation happens in the page/route handler + return NextResponse.next(); + } + // Non-invite-gated protected paths → redirect + const isOpenOnly = OPEN_ONLY.some(p => pathname.startsWith(p)); + if (isOpenOnly) { + return NextResponse.redirect(new URL("/", request.url)); + } + } + + return NextResponse.next(); +} + +export const config = { + matcher: ["/((?!_next/static|_next/image|favicon.ico|fonts|images|icons).*)"], +}; + +1.4 Client-Side Mode Awareness +Use the env variable on the client to conditionally render nav items, CTAs, and banners — no extra API calls. + +// src/lib/launch.ts +export const LAUNCH_MODE = process.env.NEXT_PUBLIC_LAUNCH_MODE ?? "waitlist"; + +export const isWaitlistMode = LAUNCH_MODE === "waitlist"; +export const isEarlyAccessMode = LAUNCH_MODE === "early_access"; +export const isOpenMode = LAUNCH_MODE === "open"; + +// Usage in components: +// import { isOpenMode } from "@/lib/launch"; +// {isOpenMode && Sign in} +// {isWaitlistMode && } +  +Part 2 — Database Schema + +2.1 WaitlistEntry Model +model WaitlistEntry { + id String @id @default(cuid()) + email String @unique + name String? + + // Segmentation — helps you prioritise who to invite first + role WaitlistRole? // indie_dev | agency | founder | other + useCase String? // free text: "building a blog", "agency with 5 clients" + source String? // "twitter" | "product_hunt" | "google" | "friend" | "other" + referredBy String? // email of referrer (for referral tracking) + + // Position & priority + position Int // set on create via COUNT()+1 + priority WaitlistPriority @default(NORMAL) + + // Approval flow + status WaitlistStatus @default(PENDING) + inviteToken String? @unique // set when approved + inviteSentAt DateTime? + inviteUsedAt DateTime? + inviteExpiresAt DateTime? // 7 days from sent + + // Confirmation + confirmed Boolean @default(false) + confirmedAt DateTime? + + // Referral + referralCode String? @unique // their personal referral link code + referralCount Int @default(0) + + joinedAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + @@index([status, joinedAt]) + @@index([priority, joinedAt]) + @@index([inviteToken]) + @@index([referralCode]) +} + +enum WaitlistRole { + INDIE_DEV + AGENCY + FOUNDER + OTHER +} + +enum WaitlistStatus { + PENDING // just joined, no action taken + CONFIRMED // verified their email + APPROVED // admin approved, invite not yet sent + INVITED // invite email sent + JOINED // used the invite, created account + REJECTED // will not be invited (spam, etc.) +} + +enum WaitlistPriority { + LOW + NORMAL + HIGH // set by admin for VIP/agency users + IMMEDIATE // invite next batch +} +  +Part 3 — API Routes + +3.1 POST /api/waitlist — Join the waitlist +// src/app/api/waitlist/route.ts +import { prisma } from "@/lib/prisma"; +import { z } from "zod"; +import { sendWaitlistConfirmation } from "@/lib/email"; +import { generateReferralCode } from "@/lib/tokens"; + +const schema = z.object({ + email: z.string().email().toLowerCase().trim(), + name: z.string().min(1).max(100).optional(), + role: z.enum(["INDIE_DEV","AGENCY","FOUNDER","OTHER"]).optional(), + useCase: z.string().max(300).optional(), + source: z.string().max(100).optional(), + ref: z.string().optional(), // referral code from ?ref= param +}); + +export async function POST(req: Request) { + const body = await req.json().catch(() => ({})); + const parsed = schema.safeParse(body); + if (!parsed.success) { + return Response.json({ error: "Invalid email address." }, { status: 400 }); + } + + const { email, name, role, useCase, source, ref } = parsed.data; + + // Check referrer + const referrer = ref + ? await prisma.waitlistEntry.findUnique({ where: { referralCode: ref } }) + : null; + + try { + const position = await prisma.waitlistEntry.count() + 1; + + const entry = await prisma.waitlistEntry.create({ + data: { + email, name, role, useCase, source, + position, + referredBy: referrer?.email ?? null, + referralCode: generateReferralCode(), // e.g. "kapil-x7k2" + // Agency users get HIGH priority automatically + priority: role === "AGENCY" ? "HIGH" : "NORMAL", + }, + }); + + // Increment referrer count + if (referrer) { + await prisma.waitlistEntry.update({ + where: { id: referrer.id }, + data: { referralCount: { increment: 1 } }, + }); + } + + // Send confirmation email (async, dont block response) + sendWaitlistConfirmation(entry).catch(console.error); + + return Response.json({ + success: true, + position, + referralCode: entry.referralCode, + referralUrl: `${process.env.NEXT_PUBLIC_APP_URL}/?ref=${entry.referralCode}`, + }); + + } catch (e: any) { + if (e.code === "P2002") { // unique constraint — already on waitlist + const existing = await prisma.waitlistEntry.findUnique({ where: { email } }); + return Response.json({ + success: true, + alreadyJoined: true, + position: existing?.position, + referralCode: existing?.referralCode, + }); + } + return Response.json({ error: "Something went wrong." }, { status: 500 }); + } +} + +3.2 GET /api/waitlist/verify — Email confirmation +// src/app/api/waitlist/verify/route.ts +// Called when user clicks the confirmation link in their email + +export async function GET(req: Request) { + const token = new URL(req.url).searchParams.get("token"); + if (!token) return Response.redirect(new URL("/?verified=false", process.env.NEXT_PUBLIC_APP_URL!)); + + const entry = await prisma.waitlistEntry.findFirst({ + where: { inviteToken: token, status: "PENDING" }, + }); + + if (!entry) { + return Response.redirect(new URL("/?verified=invalid", process.env.NEXT_PUBLIC_APP_URL!)); + } + + await prisma.waitlistEntry.update({ + where: { id: entry.id }, + data: { confirmed: true, confirmedAt: new Date(), status: "CONFIRMED" }, + }); + + return Response.redirect(new URL("/?verified=true", process.env.NEXT_PUBLIC_APP_URL!)); +} + +3.3 /register/[provider] — Three-Layer Auth Entry Point +// src/app/register/[provider]/route.ts +// Secure entry point for both social and credential registration + +export async function GET(req: Request, { params }: { params: { provider: string } }) { + const { searchParams } = new URL(req.url); + const token = searchParams.get("invite"); + const email = searchParams.get("email"); + + if (!token || !email) { + return Response.redirect(new URL("/auth/error?code=INVITE_MISSING", process.env.NEXT_PUBLIC_APP_URL!)); + } + + const entry = await prisma.waitlistEntry.findUnique({ + where: { inviteToken: token }, + }); + + if (!entry || entry.email !== email || entry.status === "JOINED") { + return Response.redirect(new URL("/auth/error?code=INVITE_INVALID", process.env.NEXT_PUBLIC_APP_URL!)); + } + + if (entry.inviteExpiresAt && entry.inviteExpiresAt < new Date()) { + return Response.redirect(new URL("/auth/error?code=INVITE_EXPIRED", process.env.NEXT_PUBLIC_APP_URL!)); + } + + // Set secure handoff cookie (Checkpoint 1) + // MaxAge 600 (10 mins) is enough for the auth flow + const cookieValue = Buffer.from(JSON.stringify({ token, email })).toString("base64"); + + const headers = new Headers(); + headers.append("Set-Cookie", `pending_invite=${cookieValue}; HttpOnly; Secure; SameSite=Lax; Path=/; MaxAge=600`); + + // Redirect to Better Auth sign-in + const authUrl = params.provider === "google" + ? "/api/auth/login/social/google" + : `/signup?email=${encodeURIComponent(email)}`; + + headers.append("Location", new URL(authUrl, process.env.NEXT_PUBLIC_APP_URL!).toString()); + + return new Response(null, { status: 302, headers }); +} +  +Part 4 — Email Sequences + +All emails sent via Resend. Free tier: 3,000 emails/month. More than enough for the waitlist phase. + +4.1 Email 1 — Waitlist Confirmation (sent immediately on join) +Field Value +Subject You're on the FlowCMS waitlist (#{{position}}) +From FlowCMS +Trigger POST /api/waitlist succeeds (new entry) +Goal Confirm email is real + give them their referral link + +Email body content: +• Opening: "You're #{{position}} on the waitlist. We're building something worth waiting for." +• One sentence on what FlowCMS is: "The headless CMS for developers who want Sanity-quality DX at Strapi-level pricing." +• Referral section: "Jump the queue — share your link and move up for every person who joins." + their unique URL +• Confirmation link: "Confirm your email to lock in your spot" — clicking sets status to CONFIRMED +• No hype, no fake urgency. Honest and direct — matches the Meridian industrial tone. + +4.2 Email 2 — You're Approved (sent when admin approves + invites) +Field Value +Subject Your FlowCMS early access is ready +From FlowCMS +Trigger Admin clicks "Send Invite" in admin panel +Goal Get them to create their account + +• Opening: "We've saved you a spot. You're in." +• Single prominent CTA button: "Create my account →" — links to /api/waitlist/accept-invite?token={{inviteToken}} +• Token expires in 7 days — mention this once, without panic +• What to expect: "You'll have full access to the PRO plan free for 30 days. No credit card needed." +• PS: "Reply to this email if you hit any issues — I'm the founder and I read every message." + +4.3 Email 3 — Invite Expiry Reminder (sent 24h before token expires) +Field Value +Subject Your FlowCMS invite expires tomorrow +From FlowCMS +Trigger Cron job — 24h before inviteExpiresAt +Goal Recover people who missed the first email + +• Short: "Your invite expires in 24 hours. Same link still works: [CTA]" +• If they don't use it, admin can re-send from the admin panel (generates a fresh token) + +4.4 Email 4 — You Moved Up (optional — sent when referrals move them up) +Field Value +Subject Good news — you moved up the FlowCMS waitlist +From FlowCMS +Trigger When referralCount crosses 3, 5, 10 +Goal Reward referrers + drive more sharing + +• "{{name}} joined using your link. You're now #{{newPosition}}." +• Skip this email if it feels noisy — it is optional. The referral link still works without it. + +4.5 Resend Implementation +// src/lib/email/index.ts +import { Resend } from "resend"; +import type { WaitlistEntry } from "@prisma/client"; + +const resend = new Resend(process.env.RESEND_API_KEY!); + +export async function sendWaitlistConfirmation(entry: WaitlistEntry) { + const confirmUrl = `${process.env.NEXT_PUBLIC_APP_URL}/api/waitlist/verify?token=${entry.inviteToken}`; + const referralUrl = `${process.env.NEXT_PUBLIC_APP_URL}/?ref=${entry.referralCode}`; + + await resend.emails.send({ + from: `${process.env.RESEND_FROM_NAME} <${process.env.RESEND_FROM_EMAIL}>`, + to: entry.email, + subject: `You're #${entry.position} on the FlowCMS waitlist`, + html: waitlistConfirmationHtml({ entry, confirmUrl, referralUrl }), + }); +} + +export async function sendInviteEmail(entry: WaitlistEntry) { + const acceptUrl = `${process.env.NEXT_PUBLIC_APP_URL}/api/waitlist/accept-invite?token=${entry.inviteToken}`; + + await resend.emails.send({ + from: `${process.env.RESEND_FROM_NAME} <${process.env.RESEND_FROM_EMAIL}>`, + to: entry.email, + subject: "Your FlowCMS early access is ready", + html: inviteEmailHtml({ entry, acceptUrl }), + }); + + await prisma.waitlistEntry.update({ + where: { id: entry.id }, + data: { + status: "INVITED", + inviteSentAt: new Date(), + inviteExpiresAt: new Date(Date.now() + 7 * 24 * 60 * 60 * 1000), // 7 days + }, + }); +} +  +Part 5 — Admin Panel + +Access: /admin — protected by ADMIN_EMAIL env check in middleware. Never linked publicly. Add Cloudflare IP allowlist for extra protection. + +5.1 Admin Panel Route Map +Route Purpose Priority +/admin Overview dashboard — key metrics at a glance Build first +/admin/waitlist Full waitlist table with filters, bulk actions Build first +/admin/waitlist/[id] Individual entry detail + manual actions Build first +/admin/users All signed-up users (post-launch) Build later +/admin/workspaces All workspaces, plan, usage Build later +/admin/usage Global API request volume chart Build later +/admin/plans Manual plan override Build later +/admin/announcements Dashboard-wide banner messages Build later + +5.2 /admin — Overview Dashboard +What you see the moment you open /admin. All numbers, no charts needed at this stage. + +Metric Query Why it matters +Total waitlist COUNT(*) from WaitlistEntry Raw sign-up volume +Confirmed COUNT(*) WHERE confirmed=true Real email addresses +Pending review COUNT(*) WHERE status=PENDING Your action queue +Approved COUNT(*) WHERE status=APPROVED Ready to invite +Invited COUNT(*) WHERE status=INVITED Waiting to click +Joined COUNT(*) WHERE status=JOINED Converted to users +Invite conversion rate JOINED / INVITED * 100 Is your invite email working? +Expired invites WHERE status=INVITED AND inviteExpiresAt < NOW() Re-send queue +Agency signups COUNT(*) WHERE role=AGENCY High-value leads +Today's signups COUNT(*) WHERE joinedAt > TODAY Growth velocity + +5.3 /admin/waitlist — The Main Waitlist Table +Columns to show +Column Data Sortable? +# position Yes +Name + Email name, email — +Role role badge (AGENCY = highlighted) Yes +Priority priority badge Yes +Status status badge with colour Yes +Referrals referralCount Yes +Confirmed confirmed boolean Yes +Joined joinedAt (relative: "3 days ago") Yes +Actions Approve / Invite / Reject / View — + +Filters +• Status: All | Pending | Confirmed | Approved | Invited | Joined | Rejected +• Role: All | Indie Dev | Agency | Founder | Other +• Priority: All | Immediate | High | Normal | Low +• Search: by email or name (debounced, 300ms) +• Date range: joinedAt from/to + +Bulk Actions +• Select all (filtered) → Approve selected +• Select all (filtered) → Send invites to approved +• Select all (filtered) → Export to CSV +• Select all (filtered) → Reject selected + +Sort defaults +• Default: priority DESC, joinedAt ASC (highest priority + earliest first) +• This gives you the natural "who to invite next" order without thinking + +5.4 Individual Entry Actions +Action When available What it does +Approve Status: PENDING or CONFIRMED Sets status → APPROVED, sets priority if not already HIGH +Send Invite Status: APPROVED Generates inviteToken, sends email, sets status → INVITED, sets inviteExpiresAt to +7d +Approve + Invite Status: PENDING or CONFIRMED Does both in one click — the button you'll use 90% of the time +Re-send Invite Status: INVITED Generates NEW token (invalidates old one), re-sends email, resets expiry +Reject Any non-JOINED status Sets status → REJECTED (reversible) +Un-reject Status: REJECTED Sets status → PENDING +Set Priority Any status Dropdown: IMMEDIATE / HIGH / NORMAL / LOW +Add Note Any status Internal admin note, not visible to user +View Referrals Any status Shows list of people they referred + +5.5 Admin Waitlist Implementation +// src/app/api/admin/waitlist/route.ts +// GET — list with filters + +export async function GET(req: Request) { + await requireAdmin(); + + const { searchParams } = new URL(req.url); + const status = searchParams.get("status") ?? undefined; + const role = searchParams.get("role") ?? undefined; + const priority = searchParams.get("priority") ?? undefined; + const search = searchParams.get("search") ?? undefined; + const page = parseInt(searchParams.get("page") ?? "1"); + const perPage = 50; + + const where = { + ...(status && { status }), + ...(role && { role }), + ...(priority && { priority }), + ...(search && { + OR: [ + { email: { contains: search, mode: "insensitive" } }, + { name: { contains: search, mode: "insensitive" } }, + ] + }), + }; + + const [entries, total] = await prisma.$transaction([ + prisma.waitlistEntry.findMany({ + where, + orderBy: [{ priority: "desc" }, { joinedAt: "asc" }], + skip: (page - 1) * perPage, + take: perPage, + }), + prisma.waitlistEntry.count({ where }), + ]); + + return Response.json({ entries, total, page, perPage }); +} + +// src/app/api/admin/waitlist/[id]/invite/route.ts +// POST — approve + send invite in one action + +import { generateSecureToken } from "@/lib/tokens"; +import { sendInviteEmail } from "@/lib/email"; + +export async function POST(req: Request, { params }: { params: { id: string } }) { + await requireAdmin(); + + const entry = await prisma.waitlistEntry.findUnique({ + where: { id: params.id } + }); + + if (!entry) return Response.json({ error: "Not found" }, { status: 404 }); + if (entry.status === "JOINED") { + return Response.json({ error: "Already joined" }, { status: 400 }); + } + + const inviteToken = generateSecureToken(); // crypto.randomBytes(32).toString("hex") + + const updated = await prisma.waitlistEntry.update({ + where: { id: params.id }, + data: { + inviteToken, + status: "INVITED", + inviteSentAt: new Date(), + inviteExpiresAt: new Date(Date.now() + 7 * 24 * 60 * 60 * 1000), + }, + }); + + await sendInviteEmail(updated); + + return Response.json({ success: true }); +} + +5.6 Bulk Invite Route +// src/app/api/admin/waitlist/bulk-invite/route.ts +// POST — invite all APPROVED entries, or a specific set of IDs + +export async function POST(req: Request) { + await requireAdmin(); + + const { ids, inviteAll } = await req.json(); + + const entries = await prisma.waitlistEntry.findMany({ + where: inviteAll + ? { status: "APPROVED" } + : { id: { in: ids }, status: { in: ["PENDING","CONFIRMED","APPROVED"] } }, + }); + + const results = await Promise.allSettled( + entries.map(async (entry) => { + const inviteToken = generateSecureToken(); + const updated = await prisma.waitlistEntry.update({ + where: { id: entry.id }, + data: { + inviteToken, + status: "INVITED", + inviteSentAt: new Date(), + inviteExpiresAt: new Date(Date.now() + 7 * 24 * 60 * 60 * 1000), + }, + }); + await sendInviteEmail(updated); + return entry.id; + }) + ); + + const succeeded = results.filter(r => r.status === "fulfilled").length; + const failed = results.filter(r => r.status === "rejected").length; + + return Response.json({ succeeded, failed }); +} + +5.7 CSV Export +// src/app/api/admin/waitlist/export/route.ts + +export async function GET(req: Request) { + await requireAdmin(); + + const entries = await prisma.waitlistEntry.findMany({ + orderBy: { position: "asc" }, + }); + + const csv = [ + ["Position","Name","Email","Role","Priority","Status","Referrals","Confirmed","Joined"].join(","), + ...entries.map(e => [ + e.position, + `"${e.name ?? ""}"`, + e.email, + e.role ?? "", + e.priority, + e.status, + e.referralCount, + e.confirmed ? "Yes" : "No", + e.joinedAt.toISOString().split("T")[0], + ].join(",")) + ].join("\n"); + + return new Response(csv, { + headers: { + "Content-Type": "text/csv", + "Content-Disposition": `attachment; filename="waitlist-${Date.now()}.csv"`, + }, + }); +} +  +Part 6 — Landing Page Waitlist Section + +The only thing users can do in waitlist mode. It needs to do three jobs: collect the email, communicate value, and give them a reason to share. + +6.1 Form Fields +Field Type Required? Notes +Email email input Yes Primary field — autofocused on load +Name text input No Optional — only show if email is filled +I am a... pill selector No Indie dev / Agency / Founder / Other +How did you hear? text input No Optional — short, free text + +Keep the form short. Email is the only required field. Every extra required field reduces conversion. Collect the rest after they confirm. + +6.2 Post-Submit States +State What user sees +Success (new) Position number + referral link + "Check your email to confirm your spot" +Success (existing) Their position + referral link (no error shown — handle gracefully) +Loading Button shows spinner, form disabled +Error Inline error message below email field — no toast + +6.3 Referral Section (shown after submit) +• "You're #{{position}}. Share your link to move up." +• One-click copy button for the referral URL +• Optional: Twitter/X share button with pre-filled text +• Counter: "{{referralCount}} people have joined using your link" +• Keep this section compact — it should not feel like a growth-hack. It should feel like a useful tool. + +6.4 Social Proof Elements (above the form) +• Waitlist counter: "{{total}} developers already waiting" — pull from GET /api/waitlist/count (cached 60s) +• Do not fake this number. Start at 0 and let it grow. Real numbers build trust. +• Optional: 3 avatar placeholders with "Indie devs from Bangalore, Berlin, Toronto" — no real photos until you have real users + +6.5 What to Hide in Waitlist Mode +Element Action in waitlist mode +"Sign in" / "Login" link in nav Hidden — remove from nav entirely +"Get started" / "Start free" CTA buttons Replace with "Join waitlist" that scrolls to form +Pricing page link Hidden — pricing shown on landing page only, no separate /pricing route +Dashboard link Does not exist in nav +Any "Try for free" buttons All point to waitlist form +  +Part 7 — Early Access Invite Flow + +When LAUNCH_MODE is "early_access", approved users can sign up. Everyone else still sees the waitlist. This is your selective beta phase. + +7.1 The Full Journey (Three-Layer Model) +1. User joins waitlist → confirmation email sent +2. User confirms email → status: CONFIRMED +3. Admin approves in /admin/waitlist → status: APPROVED +4. Admin clicks "Send Invite" → inviteToken generated → invite email sent → status: INVITED +5. User clicks "Create my account" → /register/google?token=xxx&email=xxx (Checkpoint 1) +6. Checkpoint 1 validates token → Sets `pending_invite` cookie (Lax) → Redirects to Better Auth +7. Better Auth flow starts → Social or Credentials +8. Checkpoint 2 (Hooks) triggered → `databaseHooks.user.create.before` reads cookie via `ctx.getCookie()` +9. Hook performs ATOMIC consumption of invite → Marks status: JOINED +10. Account creation completes → User is logged in +11. If any layer fails → Redirected to /auth/error with specific code + +7.2 Granting the PRO Trial on Signup +// src/app/(auth)/signup/page.tsx or the auth callback +// After successful account creation: + +async function handlePostSignup(userId: string, email: string) { + // Check if this user came from waitlist invite + const waitlistEntry = await prisma.waitlistEntry.findUnique({ + where: { email }, + }); + + if (waitlistEntry?.status === "JOINED") { + // Get their workspace (created during onboarding) + const workspace = await prisma.workspace.findFirst({ + where: { members: { some: { userId } } } + }); + + if (workspace) { + // Grant 30-day PRO trial — no credit card needed + await prisma.workspace.update({ + where: { id: workspace.id }, + data: { + plan: "PRO", + trialEndsAt: new Date(Date.now() + 30 * 24 * 60 * 60 * 1000), + }, + }); + } + } +} + +7.3 Token Security Rules +• Token is crypto.randomBytes(32).toString("hex") — 64 character hex string +• Stored as plaintext in DB (it's a one-time use access token, not a password) +• Expires 7 days after invite sent — checked on use +• Single use — inviteUsedAt is set on first use, subsequent uses are rejected +• Old token is invalidated when admin re-sends invite (new token generated) +• Token is never logged, never in URLs that get cached (redirect target, not cache target) +  +Part 8 — Helper Utilities + +8.1 Token Generation +// src/lib/tokens.ts +import crypto from "crypto"; + +export function generateSecureToken(): string { + return crypto.randomBytes(32).toString("hex"); // 64 chars +} + +export function generateReferralCode(name?: string): string { + const prefix = name + ? name.toLowerCase().replace(/[^a-z]/g, "").slice(0, 8) + : "user"; + const suffix = crypto.randomBytes(3).toString("hex"); // 6 chars + return `${prefix}-${suffix}`; // e.g. "kapil-a3f9c2" +} + +8.2 requireAdmin Utility +// src/lib/admin.ts +import { auth } from "@/lib/auth"; // Better Auth +import { headers } from "next/headers"; + +export async function requireAdmin() { + const session = await auth.api.getSession({ headers: await headers() }); + + if (!session?.user?.email) { + throw new Response("Unauthorized", { status: 401 }); + } + + if (session.user.email !== process.env.ADMIN_EMAIL) { + // Silent redirect — do not reveal admin exists + throw Response.redirect(new URL("/dashboard", process.env.NEXT_PUBLIC_APP_URL!)); + } + + return session; +} + +8.3 Cron Job — Expire Invite Reminder (Vercel Cron) +// src/app/api/cron/invite-reminder/route.ts +// Vercel cron: runs daily at 9am — add to vercel.json: +// { "crons": [{ "path": "/api/cron/invite-reminder", "schedule": "0 9 * * *" }] } + +export async function GET(req: Request) { + // Verify this is actually from Vercel Cron + const authHeader = req.headers.get("authorization"); + if (authHeader !== `Bearer ${process.env.CRON_SECRET}`) { + return Response.json({ error: "Unauthorized" }, { status: 401 }); + } + + const tomorrow = new Date(Date.now() + 24 * 60 * 60 * 1000); + const yesterday = new Date(Date.now() - 24 * 60 * 60 * 1000); + + // Find invites expiring in the next 24 hours that haven't been reminded + const expiringEntries = await prisma.waitlistEntry.findMany({ + where: { + status: "INVITED", + inviteExpiresAt: { gte: new Date(), lte: tomorrow }, + // Only remind once — check that invite was sent more than 6 days ago + inviteSentAt: { lte: new Date(Date.now() - 6 * 24 * 60 * 60 * 1000) }, + }, + }); + + await Promise.allSettled( + expiringEntries.map(entry => sendInviteExpiryReminder(entry)) + ); + + return Response.json({ reminded: expiringEntries.length }); +} +  +Part 9 — Implementation Order + +Everything in this document, sequenced for a solo developer. Estimated total: 4–5 focused days. + +Day Task Output +Day 1 AM Prisma migration — WaitlistEntry model + enums DB schema live +Day 1 PM LAUNCH_MODE middleware + lib/launch.ts + env setup App locked to waitlist mode +Day 2 AM POST /api/waitlist route with Zod validation + referral code generation Waitlist form functional +Day 2 PM Resend setup + Email 1 (confirmation) + Email 2 (invite) templates in HTML Emails sending +Day 3 AM GET /api/waitlist/verify (email confirmation) + accept-invite route Full join flow working +Day 3 PM Landing page form component + post-submit states + referral display Public-facing UI done +Day 4 AM /admin layout + requireAdmin() + /admin overview dashboard Admin accessible +Day 4 PM /admin/waitlist table with filters, pagination, and single-entry actions Core admin done +Day 5 AM Bulk invite + CSV export + re-send invite routes Admin feature complete +Day 5 PM Cron job for expiry reminder + testing full flow end to end Everything wired up + +After Day 3: your waitlist is live and collecting emails. Days 4–5 give you the admin tools to manage and invite them. You can go public after Day 3 and finish the admin panel while signups are coming in. +  +Part 10 — Launch Sequence + +10.1 The Three Flips +When Action Effect +Now (today) LAUNCH_MODE="waitlist" in Vercel env Only landing page + waitlist form visible +When ready to invite first users LAUNCH_MODE="early_access" in Vercel + redeploy Invite token holders can create accounts +Public launch day LAUNCH_MODE="open" in Vercel + redeploy Full app open to everyone + +10.2 Before You Go Public (Checklist) +10. Waitlist form submits successfully and confirmation email arrives +11. Email confirmation link works (sets confirmed=true) +12. Admin panel accessible at /admin with your email +13. Waitlist table shows entries with correct filters +14. Single invite flow works end to end (approve → send → accept → signup → PRO trial) +15. Middleware correctly blocks /login, /dashboard, /api/auth in waitlist mode +16. Middleware allows /admin regardless of mode +17. CSV export downloads a valid file +18. Referral codes generate and referral counting works +19. Cron secret is set and the cron endpoint rejects requests without it + +10.3 First Batch Invite Strategy +• Do not invite everyone at once. Invite 10–20 users first. +• Prioritise: AGENCY role + HIGH priority + most referrals + confirmed email +• Wait 48 hours, monitor for issues, fix anything that breaks +• Then invite the next 20–30. Repeat until confident. +• Use the admin panel's natural sort (priority DESC, joinedAt ASC) — it gives you the right order automatically +• Your goal is a stable product for 50 users before you invite 500 + + + +FlowCMS — Waitlist, Admin & Feature Flag System v1.0 +May 2026 · Confidential · Solo founder execution diff --git a/docs/plans/v1/audit_16.06.md b/docs/plans/v1/audit_16.06.md new file mode 100644 index 0000000..99117f3 --- /dev/null +++ b/docs/plans/v1/audit_16.06.md @@ -0,0 +1,777 @@ +# FLOWCMS FORENSIC AUDIT v2 — POST-REMEDIATION DEEP SYSTEM AUDIT + +**Audit Date**: 2026-06-16 +**Auditor Role**: Principal Staff Engineer / Security Engineer / CTO +**Baseline**: Previous Forensic Audit (Conversation `ba8a97bc`) +**Repository**: `kjxcodez/FlowCMS` +**Stack**: Next.js 15.5 + Prisma 7.8 + PostgreSQL (Supabase) + Upstash Redis + QStash + Razorpay + Sentry + Cloudflare + +--- + +## PART 1 — EXECUTIVE SUMMARY + +### Product Overview + +FlowCMS is a headless CMS SaaS product targeting developers and content teams. It provides collection-based structured content modeling, a visual block editor, multi-environment content isolation, API-key authenticated REST delivery, webhook automation, and a Razorpay-based billing system. + +### Maturity Scores + +| Area | Score | Rationale | +|---|---|---| +| **Product Maturity** | 5/10 | Core CMS CRUD works. Visual editor, page builder, and advanced features are partial/stub. Content delivery API is functional but read-only. | +| **Launch Readiness** | 4/10 | Critical features (team invites, custom domains) are feature-flagged OFF. Billing is gated behind a feature flag. No write APIs exist for external consumers. | +| **Production Readiness** | 5/10 | Auth, RBAC, rate limiting, usage tracking, and audit logging are implemented. But team invites disabled, no CSRF protection on internal APIs, storage defaults to local filesystem. | +| **Security Posture** | 6/10 | Significant improvements since last audit. Preview tokens, API scopes, RBAC, and environment isolation are now enforced. Remaining issues: timing-safe comparison bypass on `verifyPayload`, API key caching leaks, CSRF on mutating internal routes. | +| **Monetization Readiness** | 4/10 | Razorpay integration is structurally complete (checkout, webhook, plan mapping) but billing is behind a feature flag (`enableBilling: true` — BUT team invites and custom domains are OFF). No downgrade flow UI. Contact Sales badge is non-functional. | +| **Infrastructure Readiness** | 6/10 | Redis (Upstash), QStash, Sentry, Cloudflare cache purging are integrated. PgBouncer via Prisma driver adapter. But Cloudflare credentials are optional/missing in .env.example, storage defaults to local disk, no CDN for media. | + +--- + +## PART 2 — PREVIOUS AUDIT FINDINGS VERIFICATION + +### 1. Preview Token Bypass + +| Field | Detail | +|---|---| +| **Original Finding** | Preview tokens were not validated; any `?preview=true` request could access draft content | +| **Current State** | **FIXED** | +| **Evidence** | [preview.ts](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/lib/preview.ts) implements comprehensive `verifyDraftPreview()` with 6 validation layers: active status, workspace isolation, environment isolation, expiration, collection permission, and entry permission. Full audit trail via `DRAFT_TOKEN_USED` / `DRAFT_TOKEN_FAILED` actions. | +| **Risk Level** | LOW | + +### 2. Invite Hijacking + +| Field | Detail | +|---|---| +| **Original Finding** | Anyone with a valid invite token could accept invitations regardless of email match | +| **Current State** | **FIXED (but feature is OFF)** | +| **Evidence** | Invitation system exists with `InvitationStatus` enum and workspace-scoped invite records. Invitations API at [invitations/route.ts](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/app/api/internal/workspace/invitations/route.ts) checks `canAccessFeature("enableTeamInvites")`. The `INVITE_MISMATCH` audit action exists in the schema. However, `enableTeamInvites: false` in [launch.ts](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/lib/launch.ts) means this is not active for non-admin users. | +| **Risk Level** | LOW (not exploitable since feature is disabled) | + +### 3. Missing RBAC Enforcement + +| Field | Detail | +|---|---| +| **Original Finding** | No role checks on destructive operations | +| **Current State** | **FIXED** | +| **Evidence** | `requireRole()` is called on **every** internal API route. Grep confirms 40+ enforcements across collections (ADMIN), entries (EDITOR/ADMIN), media (EDITOR/ADMIN), webhooks (ADMIN), workspace (ADMIN/OWNER), members (OWNER), environments (ADMIN/OWNER), and API keys (ADMIN). Role hierarchy is properly defined in [session.ts L99-104](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/lib/session.ts#L99-L104): OWNER(4) > ADMIN(3) > EDITOR(2) > VIEWER(1). | +| **Risk Level** | LOW | + +### 4. Missing API Key Scope Enforcement + +| Field | Detail | +|---|---| +| **Original Finding** | API keys had no scope restrictions | +| **Current State** | **FIXED** | +| **Evidence** | [with-api-auth.ts](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/middleware/with-api-auth.ts) implements `requireScope()` and `hasScope()` functions. All V1 API routes use `requireScope()`: entries require `read:entries`, collections require `read:collections`, media requires `read:media`, workspace requires `admin:workspace`. Schema stores scopes as `String[]` with defaults `["read:entries", "read:media"]`. `admin:workspace` scope bypasses all checks. | +| **Risk Level** | LOW | + +### 5. Environment Isolation Bypass + +| Field | Detail | +|---|---| +| **Original Finding** | API keys could access content across environments | +| **Current State** | **FIXED** | +| **Evidence** | [with-api-auth.ts L70-73](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/middleware/with-api-auth.ts#L70-L73) rejects API keys without an `environmentId`. Entry listing filters by `environmentId` at [entries/route.ts L37-38](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/app/api/v1/entries/%5BcollectionSlug%5D/route.ts#L37-L38). Single entry route verifies `entry.environmentId !== environmentId` at [entrySlug/route.ts L36-38](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/app/api/v1/entries/%5BcollectionSlug%5D/%5BentrySlug%5D/route.ts#L36-L38). Cache-Tag includes environment ID to prevent cross-environment cache poisoning. | +| **Risk Level** | LOW | + +### 6. Billing UI Placeholders + +| Field | Detail | +|---|---| +| **Original Finding** | Billing page showed fake plans with no checkout | +| **Current State** | **PARTIALLY FIXED** | +| **Evidence** | Billing page at [billing/page.tsx](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/app/%28dashboard%29/dashboard/billing/page.tsx) shows real plan data, subscription status, usage bars, and includes a `BillingPlans` component. Checkout API at [checkout/route.ts](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/app/api/billing/checkout/route.ts) integrates with real Razorpay subscription API. Webhook handler at [webhook/route.ts](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/app/api/billing/webhook/route.ts) processes Razorpay events with idempotency and event sequencing. **However**: "Contact Sales" badge (L159) has no `onClick` handler — it's non-functional. No downgrade flow UI exists. | +| **Risk Level** | MEDIUM | + +### 7. Rate Limiting + +| Field | Detail | +|---|---| +| **Original Finding** | No rate limiting on API endpoints | +| **Current State** | **FIXED** | +| **Evidence** | [rate-limit.ts](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/lib/rate-limit.ts) implements Upstash sliding window rate limiting with plan-based tiers: HOBBY(30/min), PRO(300/min), TEAM(1000/min), PUBLIC(10/min). Applied in `withApiAuth` middleware. Proper `X-RateLimit-*` headers returned. | +| **Risk Level** | LOW | + +> [!WARNING] +> **Rate limit tier mismatch**: `TEAM` tier is defined in rate-limit.ts but does not exist in the `Plan` enum (`HOBBY | PRO | AGENCY | ENTERPRISE`). `AGENCY` plan falls through to `HOBBY` limits (30/min), which is 33x too restrictive for paying customers. + +### 8. Usage Tracking + +| Field | Detail | +|---|---| +| **Original Finding** | Usage tracking was not implemented | +| **Current State** | **FIXED** | +| **Evidence** | [usage.ts](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/lib/usage.ts) implements dual Redis+Postgres usage tracking with `incrementUsage()`, `checkUsageLimit()`, `incrementStorageUsage()`, `decrementStorageUsage()`, and `checkCollectionLimit()`. Monthly usage records stored in `MonthlyUsage` table. Applied in `withApiAuth` middleware. | +| **Risk Level** | LOW | + +### 9. Audit Logging + +| Field | Detail | +|---|---| +| **Original Finding** | No audit trail for administrative actions | +| **Current State** | **FIXED** | +| **Evidence** | [audit.ts](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/lib/audit.ts) provides `logAction()`. `AuditLog` model with 18 action types tracks workspace, user, API key, resource changes with before/after snapshots. Audit logs UI at [audit-logs/page.tsx](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/app/%28dashboard%29/dashboard/audit-logs/page.tsx) with search, date filtering, diff viewer, and JSON export. **Gated to Agency+ plans.** | +| **Risk Level** | LOW | + +### 10. Webhook Reliability + +| Field | Detail | +|---|---| +| **Original Finding** | Webhooks were fire-and-forget with no delivery tracking | +| **Current State** | **FIXED** | +| **Evidence** | [qstash.ts](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/lib/qstash.ts) sends webhooks through QStash with HMAC-SHA256 signing, 3 retries, and callback URL for delivery tracking. `WebhookDelivery` model stores delivery results including status code, duration, retry count, and failure reason. QStash callback endpoint exists at `/api/internal/webhooks/qstash-callback`. | +| **Risk Level** | LOW | + +--- + +## PART 3 — FEATURE INVENTORY + +| Feature | Category | Status | Plan Gate | Dependencies | Tech Debt | Risk | +|---|---|---|---|---|---|---| +| Email/Password Auth | Auth | ✅ Complete | All | Better Auth, Prisma | None | LOW | +| Google OAuth | Auth | ✅ Complete | All | Google API | None | LOW | +| Email Verification | Auth | ✅ Complete | All | Resend | Dev bypass in dev mode | LOW | +| Password Reset | Auth | ✅ Complete | All | Resend | None | LOW | +| Suspended User Blocking | Auth | ✅ Complete | All | Better Auth hooks | Admin bypass | LOW | +| Workspace Provisioning | Core | ✅ Complete | All | Prisma TX | None | LOW | +| Onboarding Flow | Core | ✅ Complete | All | None | None | LOW | +| Structured Collections | Content | ✅ Complete | All | Prisma | None | LOW | +| Visual Collections | Content | ⚠️ Partial | All | Block editor | Block types limited | MEDIUM | +| Entry CRUD | Content | ✅ Complete | All | Prisma | No versioning history | LOW | +| Entry Publishing | Content | ✅ Complete | All | Prisma, Webhooks | No scheduled publishing | LOW | +| Rich Text Editor | Content | ✅ Complete | All | TipTap | None | LOW | +| Media Upload | Media | ✅ Complete | All | Supabase/Local | Local storage default | MEDIUM | +| Media Folders | Media | ✅ Complete | All | Prisma | None | LOW | +| Bulk Media Delete | Media | ✅ Complete | All | Prisma | None | LOW | +| API Key Management | API | ✅ Complete | All | SHA-256 hashing | Duplicate code in service + lib | LOW | +| API Key Scopes | API | ✅ Complete | All | Middleware | None | LOW | +| Environment Management | Infra | ⚠️ Partial | Pro+ | Prisma | "Set Default" / "Settings" buttons have no handlers | MEDIUM | +| Preview/Draft Tokens | API | ✅ Complete | All | Prisma | None | LOW | +| Webhook Management | Automation | ✅ Complete | All | QStash, Prisma | Hobby gets 1 webhook | LOW | +| Webhook Deliveries | Automation | ✅ Complete | All | QStash callback | None | LOW | +| Rate Limiting | Infra | ✅ Complete | All | Upstash Redis | AGENCY plan uses HOBBY limits (bug) | HIGH | +| Usage Tracking | Infra | ✅ Complete | All | Redis + Postgres | None | LOW | +| Audit Logging | Security | ✅ Complete | Agency+ | Prisma | Plan-gated in UI only, not API | MEDIUM | +| RBAC | Security | ✅ Complete | All | Session middleware | None | LOW | +| Billing/Checkout | Billing | ✅ Complete | All | Razorpay | No downgrade UI | MEDIUM | +| Billing Webhooks | Billing | ✅ Complete | All | Razorpay | `revalidatePath` import at bottom of file | LOW | +| Team Invitations | Collaboration | ⛔ Disabled | N/A | Feature flag OFF | `enableTeamInvites: false` | HIGH | +| Custom Domains | Infra | ⛔ Disabled | N/A | Feature flag OFF | `enableCustomDomains: false` | LOW | +| Admin Panel | Operations | ✅ Complete | Internal | Admin email check | No impersonation | MEDIUM | +| Dashboard Analytics | Dashboard | ✅ Complete | All | API + Recharts | Real data from DB | LOW | +| Content Templates | Content | ✅ Complete | All | Prisma | Premium templates not enforced | LOW | +| Notifications | Platform | ⚠️ Partial | All | Prisma model exists | No notification delivery UI | MEDIUM | +| API Explorer | Dev Tools | ✅ Complete | All | Client-side fetch | console.log present | LOW | +| Sentry Integration | Observability | ✅ Complete | All | @sentry/nextjs | None | LOW | +| Cloudflare Cache Purge | Infra | ⚠️ Partial | All | CF API | Optional, gracefully degrades | LOW | +| Documentation (Fumadocs) | Docs | ⚠️ Partial | All | fumadocs-mdx | Extent unknown | MEDIUM | + +--- + +## PART 4 — MOCK / PLACEHOLDER / FAKE FUNCTIONALITY AUDIT + +> [!CAUTION] +> Every item below is a UI element that **appears functional** but **does nothing or has incomplete behavior**. + +### Critical Fake/Placeholder UI Elements + +| Location | UI Element | Expected Behavior | Actual Behavior | Backend Connected? | Risk | +|---|---|---|---|---|---| +| [environments/page.tsx L86-88](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/app/%28dashboard%29/dashboard/environments/page.tsx#L86-L88) | "Set Default" Button | Changes default environment | **No click handler. Button does nothing.** | No | HIGH | +| [environments/page.tsx L90-92](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/app/%28dashboard%29/dashboard/environments/page.tsx#L90-L92) | "Settings" Button | Opens environment settings | **No click handler. Button does nothing.** | No | HIGH | +| [environments/page.tsx L96-103](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/app/%28dashboard%29/dashboard/environments/page.tsx#L96-L103) | "Promotion Flow: Coming Soon" Banner | Content promotion between environments | **Static label, no functionality** | No | MEDIUM | +| [environments/page.tsx L45-51](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/app/%28dashboard%29/dashboard/environments/page.tsx#L45-L51) | "New Environment" Button | Creates new environment | **Disabled for Hobby but no handler for Pro+ either** | No | HIGH | +| [billing/page.tsx L159-161](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/app/%28dashboard%29/dashboard/billing/page.tsx#L159-L161) | "Contact Sales" Badge | Opens contact/sales flow | **No onClick, href, or link. Static badge.** | No | MEDIUM | +| [environments/page.tsx L132-133](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/app/%28dashboard%29/dashboard/environments/page.tsx#L132-L133) | "Upgrade Plan" Button (env page) | Navigates to billing | **No href or onClick handler** | No | MEDIUM | +| [audit-logs/page.tsx L101-104](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/app/%28dashboard%29/dashboard/audit-logs/page.tsx#L101-L104) | "Filters" Button | Opens filter dialog | **No click handler. Button does nothing.** | No | LOW | +| [audit-logs/page.tsx L122-124](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/app/%28dashboard%29/dashboard/audit-logs/page.tsx#L122-L124) | "Upgrade to Agency" Button | Navigates to billing | **No href or onClick. Dead button.** | No | MEDIUM | +| [audit-logs/page.tsx L125-127](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/app/%28dashboard%29/dashboard/audit-logs/page.tsx#L125-L127) | "Compare Plans" Button | Shows plan comparison | **No href or onClick. Dead button.** | No | LOW | +| [webhooks/page.tsx L351-352](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/app/%28dashboard%29/dashboard/webhooks/page.tsx#L351-L352) | Deliveries Count | Shows delivery count | **Hardcoded "No fires logged" text, not connected to WebhookDelivery data** | No | MEDIUM | +| [webhooks/page.tsx L355-356](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/app/%28dashboard%29/dashboard/webhooks/page.tsx#L355-L356) | Latency Display | Shows average latency | **Hardcoded "—" dash, not connected to delivery data** | No | MEDIUM | + +### API Key Page Specific Findings + +| Item | Finding | +|---|---| +| **Copy button behavior** | The copy button on existing keys copies only the `keyPrefix` (first 8 chars), NOT the full key. This is correct security behavior — raw keys are one-way hashed and never stored. Toast correctly says "API key identifier prefix copied!" | +| **Key visibility** | Keys display as `flw_xxxx••••••••••••••••••••••••` (prefix + masked). Raw key is only shown once in the reveal dialog after creation. This is correct. | +| **One-time reveal** | The `generatedKey` state holds the raw key temporarily in client memory. After dialog close, it's gone. **Correct security pattern.** | + +### Seed Data Placeholders + +| Location | Item | +|---|---| +| [workspace.service.ts L221](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/server/services/workspace.service.ts#L221) | Avatar URL: `/placeholders/avatar.png` — file may not exist | +| [workspace.service.ts L269](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/server/services/workspace.service.ts#L269) | Cover image: `/placeholders/cover.png` — file may not exist | + +--- + +## PART 5 — UX FORENSIC AUDIT + +### Navigation & Dashboard +- ✅ Dashboard has welcome cards, onboarding checklist, stat cards, analytics charts, quick actions — all connected to real data +- ✅ Sidebar navigation appears functional with proper routing +- ⚠️ "Reset Guides" button in dashboard uses localStorage — not persisted across devices + +### Environments Page +- 🔴 **Dead end**: "Settings" button does nothing. User clicks it expecting to configure environment settings +- 🔴 **Dead end**: "Set Default" button does nothing. User cannot change default environment +- 🔴 **Dead end**: "New Environment" button has no handler even for Pro+ plans +- ⚠️ "Upgrade Plan" button in upsell card has no navigation + +### Webhooks Page +- ✅ Create webhook dialog works correctly with event selection +- ✅ Delete webhook works with confirmation +- ⚠️ Webhook secret is displayed in plaintext on the card — should be masked by default +- 🔴 Delivery stats are hardcoded ("No fires logged", "—") — backend data exists but UI doesn't fetch it +- ✅ Plan limit enforcement works (Hobby limited to 1) + +### Billing Page +- ✅ Current subscription card shows real plan and status +- ✅ Usage overview shows real API request consumption +- ✅ Cancellation notice shows correctly +- 🔴 "Contact Sales" is a dead badge +- ⚠️ No mechanism for downgrade or cancellation from the UI + +### Audit Logs Page +- ✅ Table view with action badges, timestamps, resource info +- ✅ Diff viewer dialog for before/after snapshots +- ✅ JSON export works +- 🔴 "Filters" button is non-functional +- ⚠️ Plan gating is UI-only — the API still returns data for Hobby/Pro + +### Settings Page +- ✅ Workspace name update works +- ✅ Workspace deletion with confirmation dialog works +- ✅ Redirects to onboarding after deletion + +### Team Page +- ✅ Displays current members and pending invites (server-rendered) +- ⚠️ Team invite functionality is feature-flagged OFF (`enableTeamInvites: false`) + +### API Keys Page +- ✅ Create dialog with scope selection and environment binding +- ✅ One-time key reveal with copy functionality +- ✅ Delete/revoke with confirmation +- ✅ Integration guide with code snippets (curl, fetch, axios) + +### Severity Summary + +| Severity | Count | Impact | +|---|---|---| +| 🔴 Critical UX | 5 | Users encounter non-functional buttons on paid-tier features | +| ⚠️ Warning | 6 | Minor inconsistencies or missing polish | +| ✅ Working | 15+ | Core workflows function correctly | + +--- + +## PART 6 — SECURITY AUDIT + +### CRITICAL + +**C1. API Key Verification Caching Leak** +- **Location**: [api-key.ts L32](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/lib/api-key.ts#L32) +- **Issue**: API key verification results are cached in Redis for 300 seconds. If an API key is revoked, it remains valid for up to 5 minutes. A revoked key can continue making authenticated requests. +- **Exploit**: Revoke a compromised key → attacker has 5 more minutes of access. +- **Fix**: Invalidate the cache key on API key deletion. + +**C2. Webhook Secret Exposed in API Response & UI** +- **Location**: [webhooks/route.ts L82](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/app/api/internal/webhooks/route.ts#L82) and [webhooks/page.tsx L328](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/app/%28dashboard%29/dashboard/webhooks/page.tsx#L328) +- **Issue**: The webhook `secret` field is returned in the API response and displayed (partially masked) in the UI. The full secret is accessible via the copy button. This means any workspace member with ADMIN access can see all webhook signing secrets. +- **Risk**: If the admin panel is compromised, all webhook secrets are exposed. + +### HIGH + +**H1. No CSRF Protection on Internal Mutating APIs** +- **Location**: All `/api/internal/*` routes +- **Issue**: Internal APIs use session cookies for auth but have no CSRF token validation. An attacker could craft a page that submits POST/DELETE requests to these endpoints while the user is authenticated. +- **Exploit**: Attacker creates malicious page → user visits while logged in → workspace data is modified/deleted. + +**H2. Rate Limit Plan Mismatch — AGENCY Gets HOBBY Limits** +- **Location**: [rate-limit.ts L12-33](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/lib/rate-limit.ts#L12-L33) +- **Issue**: Rate limiter defines tiers for `HOBBY`, `PRO`, `TEAM`, `PUBLIC`. The `Plan` enum uses `AGENCY`. Since `AGENCY` is not in the limiters map, it falls through to `limiters.HOBBY` (30 req/min). An AGENCY customer paying for 1M req/month gets throttled at 30/min. +- **Impact**: Paying customers get restrictively rate-limited. Service degradation for highest-paying tier. + +**H3. Timing-Unsafe Signature Verification** +- **Location**: [security/tokens.ts L30](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/lib/security/tokens.ts#L30) +- **Issue**: `verifyPayload()` uses `===` for HMAC comparison instead of `crypto.timingSafeEqual()`. This enables timing attacks against signed payloads (invite tokens, etc.). + +**H4. `requireVerifiedSession` Bypassed in Development** +- **Location**: [session.ts L134-137](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/lib/session.ts#L134-L137) +- **Issue**: In development mode OR if `RESEND_API_KEY` is not set, email verification is completely bypassed. If a production deployment accidentally omits `RESEND_API_KEY`, all email verification is disabled. + +### MEDIUM + +**M1. V1 Media API Ignores Environment Isolation** +- **Location**: [v1/media/route.ts](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/app/api/v1/media/route.ts) +- **Issue**: Media listing filters only by `workspaceId`, not by `environmentId`. API keys bound to a staging environment can see all media across all environments. + +**M2. V1 Collections API Ignores Environment Isolation** +- **Location**: [v1/collections/route.ts](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/app/api/v1/collections/route.ts) +- **Issue**: Collections listing filters only by `workspaceId`. Collections are workspace-scoped (not environment-scoped by schema design), but this could be confusing since API keys are environment-bound. + +**M3. Audit Log Fire-and-Forget Can Silently Fail** +- **Location**: [audit.ts L31](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/lib/audit.ts#L31) +- **Issue**: Audit log creation is fire-and-forget (no `await`). If the database is under load, audit entries can be silently dropped. For compliance, audit logs should be guaranteed. + +**M4. Admin Identification via Environment Variable Only** +- **Location**: [admin.ts](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/lib/admin.ts) +- **Issue**: Platform admin status is determined solely by the `ADMIN_EMAILS` environment variable. No database-backed admin role. If the env var is misconfigured, admin access is lost or wrongly granted. + +### LOW + +**L1. `revalidatePath` imported at bottom of file** — [webhook/route.ts L147](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/app/api/billing/webhook/route.ts#L147) +**L2. Expired API keys are not checked** — No `expiresAt` validation in `verifyApiKey()` +**L3. No Content-Security-Policy headers** — Missing CSP, X-Frame-Options on dashboard + +--- + +## PART 7 — API AUDIT + +### Public V1 API Routes (API Key Auth) + +| Method | Route | Auth | Rate Limited | Scope | Env Isolated | Cached | Prod Ready | +|---|---|---|---|---|---|---|---| +| GET | `/api/v1/entries/[collectionSlug]` | API Key | ✅ | `read:entries` | ✅ | ✅ CDN headers | ✅ | +| GET | `/api/v1/entries/[collectionSlug]/[entrySlug]` | API Key | ✅ | `read:entries` | ✅ | ✅ CDN headers | ✅ | +| GET | `/api/v1/collections` | API Key | ✅ | `read:collections` | ❌ | ✅ | ⚠️ No env filter | +| GET | `/api/v1/collections/[slug]` | API Key | ✅ | `read:collections` | ❌ | ✅ | ⚠️ No env filter | +| GET | `/api/v1/media` | API Key | ✅ | `read:media` | ❌ | ✅ | ⚠️ No env filter | +| GET | `/api/v1/workspace` | API Key | ✅ | `admin:workspace` | N/A | ✅ | ✅ | + +> [!IMPORTANT] +> **V1 API is READ-ONLY.** There are no write endpoints (POST/PUT/DELETE) for entries, collections, or media via API keys. External consumers cannot create or modify content via the REST API. This is a significant gap for a headless CMS. + +### Internal API Routes (Session Auth) + +All internal routes use `requireWorkspace()` + `requireRole()`. Coverage: + +| Area | GET | POST | PATCH/PUT | DELETE | +|---|---|---|---|---| +| Collections | ✅ | ✅ (ADMIN) | ✅ (ADMIN) | ✅ (ADMIN) | +| Entries | ✅ | ✅ (EDITOR) | ✅ (EDITOR) | ✅ (ADMIN) | +| Entry Publish | N/A | ✅ (ADMIN) | N/A | N/A | +| Media | ✅ | ✅ (EDITOR) | ✅ (EDITOR) | ✅ (ADMIN) | +| Media Bulk | N/A | N/A | N/A | ✅ (ADMIN) | +| Media Folders | ✅ | ✅ (ADMIN) | ✅ (ADMIN) | ✅ (ADMIN) | +| Webhooks | ✅ (ADMIN) | ✅ (ADMIN) | N/A | ✅ (ADMIN) | +| API Keys | ✅ (ADMIN) | ✅ (ADMIN) | N/A | ✅ (ADMIN) | +| Environments | ✅ | ✅ (ADMIN) | N/A | ✅ (OWNER) | +| Members | N/A | N/A | N/A | ✅ (OWNER) | +| Workspace | ✅ | N/A | ✅ (ADMIN) | ✅ (OWNER) | +| Invitations | ✅ (ADMIN) | ✅ (ADMIN) | N/A | ✅ (ADMIN) | + +--- + +## PART 8 — DATABASE AUDIT + +### Schema Summary (26 models) + +| Model | Purpose | Indexes | Constraints | Scalability Concern | +|---|---|---|---|---| +| User | Auth records | `@unique(email)` | Cascade to sessions/accounts | None | +| Session | Auth sessions | `@unique(token)` | Cascade from User | No session cleanup job | +| Account | OAuth accounts | None | Cascade from User | None | +| Verification | Email verification | None | None | No cleanup for expired | +| Workspace | Tenant root | `@unique(slug)` | None | None | +| WorkspaceMember | RBAC membership | `@@unique(workspaceId,userId)` | Cascade | None | +| Environment | Content isolation | `@@unique(workspaceId,slug)` | Cascade | None | +| Collection | Content schemas | `@@unique(workspaceId,slug)` | Cascade | None | +| Entry | Content records | 5 composite indexes | Cascade from Collection | ⚠️ JSON `data` field not indexable | +| Media | Asset catalog | `@@index(workspaceId,folderId)` | Cascade | None | +| MediaFolder | Folder hierarchy | 2 indexes | Self-referential | None | +| ApiKey | API authentication | `@unique(keyHash)`, composite index | Cascade | None | +| Webhook | Event destinations | Composite index | Cascade | None | +| WebhookDelivery | Delivery logs | None | Cascade from Webhook | ⚠️ No TTL/cleanup — will grow unbounded | +| UsageLog | Request logging | 2 composite indexes | Cascade | ⚠️ No TTL — grows unbounded | +| MonthlyUsage | Aggregated usage | `@@unique(workspaceId,year,month)` | Cascade | None | +| AuditLog | Security trail | 2 composite indexes | Cascade | ⚠️ No TTL — grows unbounded | +| RazorpayCustomer | Billing state | `@unique(workspaceId)`, `@unique(subscriptionId)` | Cascade | None | +| Invitation | Team invites | `@@unique(workspaceId,email)`, `@unique(token)` | Cascade | None | +| DraftToken | Preview access | `@unique(token)` | Cascade | None | +| CustomDomain | Custom domains | `@unique(domain)` | Cascade | Feature disabled | +| CollectionTemplate | Content templates | `@unique(slug)` | None | None | +| PageTemplate | Page templates | `@unique(slug)` | None | None | +| EmailLog | Email tracking | 2 indexes | None | None | +| Notification | In-app alerts | `@@index(workspaceId,read)` | Cascade | None | + +### Critical Issues + +1. **No data retention/cleanup**: `UsageLog`, `WebhookDelivery`, and `AuditLog` tables have no TTL or archival strategy. At scale, these tables will become the primary performance bottleneck. +2. **Entry data stored as JSON**: The `Entry.data` field is an opaque `Json` blob. No full-text search, no field-level indexing, no validation at the database level. +3. **No database-level RLS**: Row-level security is implemented in application code only. A direct database connection bypass would expose all tenant data. +4. **Missing index on DraftToken**: No index on `workspaceId` for draft tokens — list queries for a workspace will be slow. + +--- + +## PART 9 — PERFORMANCE AUDIT (Top 20 Bottlenecks) + +| # | Issue | Severity | Location | +|---|---|---|---| +| 1 | **UsageLog table growth** — Every API request creates a row. At 250K req/month (PRO), that's 3M rows/year per workspace | CRITICAL | [with-api-auth.ts L126-137](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/middleware/with-api-auth.ts#L126-L137) | +| 2 | **WebhookDelivery unbounded growth** — No cleanup, no pagination on admin view | HIGH | Schema + webhook service | +| 3 | **AuditLog unbounded growth** — Fire-and-forget writes with no archival | HIGH | [audit.ts](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/lib/audit.ts) | +| 4 | **Media usage scan** — `getMediaUsage()` loads ALL entries for a workspace and does JSON.stringify scanning | HIGH | [media.service.ts L200-224](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/server/services/media.service.ts#L200-L224) | +| 5 | **API key verification iterates candidates** — For each request, loads all keys with matching prefix, then checks hashes sequentially | MEDIUM | [api-key.ts L33-58](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/lib/api-key.ts#L33-L58) | +| 6 | **Workspace provisioning** — Single large transaction creates workspace, environment, API key, 4 collections, 5 entries | MEDIUM | [workspace.service.ts L29-306](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/server/services/workspace.service.ts#L29-L306) | +| 7 | **No connection pooling in Prisma** — Uses `driverAdapters` preview feature with pg adapter but no explicit pool configuration | MEDIUM | [prisma.ts](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/lib/prisma.ts) | +| 8 | **bcrypt fallback** — Legacy bcrypt key comparison is synchronous and CPU-intensive | MEDIUM | [api-key.ts L58](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/lib/api-key.ts#L58) | +| 9 | **Dashboard analytics query** — `useDashboardAnalytics` fetches chart data, counts, growth data, and audit logs in a single request | MEDIUM | Dashboard page | +| 10 | **Redis used for three separate concerns** — Rate limiting, caching, and usage tracking share the same Redis instance | LOW | Multiple files | + +--- + +## PART 10 — INFRASTRUCTURE AUDIT + +| Service | Status | Evidence | +|---|---|---| +| **Cloudflare** (CDN/Cache) | ⚠️ Partial | Cache-Tag headers set. Purge function exists. But CF credentials are optional — system works without them. No zone configured in .env.example. | +| **Vercel** (Hosting) | ✅ Implemented | Next.js 15.5 with `runtime = "nodejs"` on API routes. Turbopack enabled. Vercel Analytics included. | +| **Supabase** (Database + Storage) | ✅ Implemented | PostgreSQL via `@prisma/adapter-pg`. Supabase storage provider exists but defaults to local. | +| **PgBouncer** | ✅ Implemented | Prisma `driverAdapters` preview feature with `@prisma/adapter-pg`. Direct URL for migrations. | +| **Redis (Upstash)** | ✅ Implemented | Rate limiting, caching, usage tracking all use Upstash Redis REST API. | +| **QStash (Upstash)** | ✅ Implemented | Webhook delivery queuing with retries, signing keys, callback URL. | +| **Sentry** | ✅ Implemented | `@sentry/nextjs` with server, edge, and client configs. Logger sends errors/warnings to Sentry. | +| **Razorpay** | ✅ Implemented | Subscription management, checkout, webhook handling with signature verification. Plan IDs from env vars. | +| **Gemini AI** | ⚠️ Partial | `@google/generative-ai` in dependencies. [ai.ts](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/lib/ai.ts) exists. Extent of AI features unknown. | +| **Resend** (Email) | ✅ Implemented | Email verification, password reset, invite emails via Resend. Email templates and logging. | + +--- + +## PART 11 — BILLING AUDIT + +| Question | Answer | Evidence | +|---|---|---| +| **Can a customer pay today?** | ✅ Yes (if billing flag is on) | `enableBilling: true` in launch.ts. Checkout API creates Razorpay subscription. | +| **Can a customer upgrade?** | ✅ Yes | BillingPlans component renders plan cards with checkout buttons. API validates against existing subscription. | +| **Can a customer downgrade?** | ❌ No | No downgrade UI or API endpoint. Webhook handler only handles Razorpay-initiated downgrades (cancellation → HOBBY). | +| **Can a customer cancel?** | ⚠️ Partially | `cancelAtPeriodEnd` field exists. Cancellation notice renders. But no "Cancel Subscription" button found in UI. | +| **Can the platform enforce limits?** | ✅ Yes | `checkUsageLimit()` enforces monthly API requests. `checkCollectionLimit()` enforces collection count. Rate limiter enforces per-minute limits. | +| **Are limits correct?** | ❌ No | AGENCY plan gets HOBBY rate limits (30/min vs expected 1000/min) due to plan name mismatch in rate-limit.ts. | + +--- + +## PART 12 — ADMIN OPERATIONS AUDIT + +### Implemented + +| Feature | Location | Status | +|---|---|---| +| Admin layout with sidebar | [admin/layout.tsx](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/app/%28admin%29/admin/layout.tsx) | ✅ Works — `requireAdmin()` guards access | +| Admin stats API | `/api/internal/admin/stats` | ✅ Exists | +| Admin user management | `admin/users` page | ✅ Exists | +| Admin billing overview | `admin/billing` page | ✅ Exists | +| Admin operations | `admin/operations` page | ✅ Exists | +| Admin logs | `admin/logs` page | ✅ Exists | + +### Missing + +| Feature | Risk | +|---|---| +| **User impersonation** | Cannot act as a user to debug issues | MEDIUM | +| **Plan override** | No direct way to manually set a user's plan | MEDIUM | +| **Abuse monitoring** | No automated detection of API abuse | LOW | +| **Support tooling** | No ticket system or user communication | LOW | + +--- + +## PART 13 — CODE QUALITY AUDIT + +### Duplicated Code + +| Issue | Files | Cleanup Value | +|---|---|---| +| **API key generation/hashing duplicated** | [lib/api-key.ts](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/lib/api-key.ts) AND [server/services/api-key.service.ts](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/server/services/api-key.service.ts) — identical `generateApiKey()`, `hashApiKey()`, `verifyApiKey()` implementations | HIGH | +| **Redis client instantiated 3 times** | [cache.ts](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/lib/cache.ts), [rate-limit.ts](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/lib/rate-limit.ts), [usage.ts](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/lib/usage.ts) — each creates its own `new Redis()` instance | MEDIUM | + +### Dead Code & Unused + +| Item | Location | Evidence | +|---|---|---| +| `CustomDomain` model | Schema | Feature flagged OFF, no active usage | +| `PageTemplate` model | Schema | No references found in active code | +| `CollectionTemplate` model | Schema | Template apply endpoint exists but no UI to create templates | +| `Notification` model | Schema | Model exists, no delivery mechanism or UI | +| `scripts/` directory | Root | Empty directory | +| `console.log` statements | 12 files | See grep results — present in production code | + +### TODOs/FIXMEs + +| Count | Pattern | Location | +|---|---|---| +| 0 | `TODO` | None found in application code | +| 0 | `FIXME` | None found | + +> [!NOTE] +> The codebase is clean of TODO/FIXME markers. Incomplete features are behind feature flags rather than marked as TODOs. + +--- + +## PART 14 — DOCUMENTATION AUDIT + +| Document | Exists | Matches Code | Issues | +|---|---|---|---| +| README.md | ✅ | ⚠️ Basic | Only 1450 bytes — minimal setup instructions | +| DESIGN.md | ✅ | ⚠️ Partial | 22KB design document — may be outdated | +| .env.example | ✅ | ⚠️ Incomplete | Missing: `STORAGE_PROVIDER`, `QSTASH_TOKEN`, `QSTASH_CURRENT_SIGNING_KEY`, `QSTASH_NEXT_SIGNING_KEY`, `RAZORPAY_PRO_MONTHLY_PLAN_ID`, `RAZORPAY_PRO_ANNUAL_PLAN_ID`, `RAZORPAY_AGENCY_MONTHLY_PLAN_ID`, `RAZORPAY_AGENCY_ANNUAL_PLAN_ID`, `RAZORPAY_WEBHOOK_SECRET` | +| API Docs (Fumadocs) | ⚠️ Exists | Unknown | `fumadocs-core` and `fumadocs-mdx` in deps, `content/` and `docs/` dirs exist | +| `internal-guides/` | ✅ | Unknown | Internal documentation directory exists | + +--- + +## PART 15 — PRODUCT AUDIT + +### What FlowCMS Actually Is Today + +A **functional but incomplete headless CMS** with: +- ✅ Multi-tenant workspace isolation +- ✅ Structured content modeling with 7 field types +- ✅ Visual block editor (basic) +- ✅ API-key authenticated, scope-enforced, environment-isolated read API +- ✅ Webhook automation with reliable delivery +- ✅ RBAC with 4 role levels +- ✅ Razorpay billing integration +- ✅ Audit logging +- ✅ Media management with folder hierarchy + +### What It Is NOT + +- ❌ Not a platform with team collaboration (invites disabled) +- ❌ Not a platform with write APIs (no external content mutation) +- ❌ Not a platform with custom domains +- ❌ Not a platform with content versioning/history +- ❌ Not a platform with scheduled publishing +- ❌ Not a platform with i18n (locale field exists but not used) +- ❌ Not a platform with content workflow/approval + +### What Should Be Removed +- `CustomDomain` model and related code (feature disabled, no timeline) +- `PageTemplate` model (unused) +- `Notification` model (no delivery mechanism) + +### What Should Be Delayed +- Custom domains (enterprise feature) +- SSO/custom roles (enterprise feature) +- AI content generation (nice-to-have) + +### What Should Be Accelerated +1. Write APIs for V1 (POST/PUT/DELETE entries, media) +2. Team invitations (unblock collaboration) +3. Fix environment page buttons +4. Fix AGENCY rate limit bug +5. API key cache invalidation on revocation + +--- + +## PART 16 — COMPETITIVE AUDIT + +| Feature | FlowCMS | Sanity | Strapi | Payload | Contentful | +|---|---|---|---|---|---| +| **Content Modeling** | 7 field types | 20+ types | 15+ types | 30+ types | 20+ types | +| **REST API** | Read-only | Full CRUD | Full CRUD | Full CRUD | Full CRUD | +| **GraphQL** | ❌ | ✅ | ✅ (plugin) | ✅ | ✅ | +| **Write API** | ❌ | ✅ | ✅ | ✅ | ✅ | +| **Webhooks** | ✅ (QStash) | ✅ | ✅ | ✅ | ✅ | +| **RBAC** | ✅ (4 roles) | ✅ | ✅ | ✅ | ✅ | +| **i18n** | ❌ | ✅ | ✅ | ✅ | ✅ | +| **Content Preview** | ✅ (tokens) | ✅ | ✅ | ✅ | ✅ | +| **Versioning** | ❌ | ✅ | ✅ (draft/publish) | ✅ | ✅ | +| **Media** | ✅ (basic) | ✅ (DAM) | ✅ | ✅ | ✅ (DAM) | +| **Self-Hosted** | ✅ (Docker) | ❌ | ✅ | ✅ | ❌ | +| **Open Source** | ✅ | ❌ | ✅ | ✅ | ❌ | + +### Advantages +- Self-hostable with Docker +- Clean, modern UI design (Meridian design system) +- Integrated billing (Razorpay for India market) +- QStash-backed reliable webhooks + +### Disadvantages +- No write API (fundamental CMS requirement) +- No content versioning +- No i18n +- Limited field types +- No GraphQL +- No content references UI (reference fields exist but picker UX unknown) + +### Missing Essentials +1. **Write API** — Without this, FlowCMS cannot be used as a true headless CMS +2. **Content versioning** — No history, no rollback +3. **Internationalization** — `localeCode` field exists but nothing uses it + +--- + +## PART 17 — LAUNCH READINESS + +| Area | Score | Rationale | +|---|---|---| +| Engineering | 6/10 | Core CRUD works, RBAC enforced, but no write API, dead UI buttons, duplicate code | +| Security | 6/10 | Major improvements. Remaining: CSRF, cache invalidation, timing attack on signed tokens | +| Billing | 5/10 | Checkout works, but no downgrade/cancel UI, AGENCY rate limit bug, Contact Sales dead | +| Documentation | 3/10 | Minimal README, incomplete .env.example, API docs status unknown | +| Operations | 5/10 | Admin panel exists but no impersonation, no plan override, no data retention | +| Product | 4/10 | Team invites OFF, no write API, environment controls dead, limited field types | + +### Overall Launch Readiness: **~48%** + +> [!CAUTION] +> FlowCMS is NOT ready for a public launch. It can be used as an internal tool or for a limited private beta with informed users. + +--- + +## PART 18 — SCALING READINESS + +| Scale | Status | Failure Points | +|---|---|---| +| **100 users** | ✅ Likely fine | Redis handles rate limiting/caching well. Database load minimal. | +| **1,000 users** | ⚠️ Concerns | UsageLog table: ~1M rows/month. No cleanup. AuditLog growth. Media usage scan becomes expensive. | +| **10,000 users** | 🔴 Will fail | UsageLog: ~100M rows/month. No database sharding. Single Redis instance. API key verification scans all keys with matching prefix. `getMediaUsage()` loads all workspace entries into memory. | +| **100,000 users** | 🔴 Cannot sustain | Complete database saturation. No horizontal scaling strategy. No read replicas configured. No queue-based write decoupling. | + +### Key Failure Points +1. **UsageLog table** becomes the single largest table by orders of magnitude +2. **getMediaUsage()** does full-table scan with JSON.stringify +3. **API key verification** scales linearly with number of keys sharing a prefix +4. **No read replica** configuration for analytics/reporting queries +5. **Single Redis instance** for all concerns + +--- + +## PART 19 — PRIORITIZED FIX LIST + +### P0 — Launch Blockers + +| # | Issue | Impact | Complexity | Fix | +|---|---|---|---|---| +| 1 | **AGENCY plan gets HOBBY rate limits** | Paying customers throttled at 30 req/min instead of 1000 | Low | Add `AGENCY` and `ENTERPRISE` to rate limiter map | +| 2 | **No write API** | External consumers cannot create/update content | High | Add POST/PUT/DELETE endpoints with `write:entries` scope enforcement | +| 3 | **Team invites disabled** | Users cannot collaborate | Medium | Set `enableTeamInvites: true` and test invite flow | +| 4 | **Environment page buttons dead** | Users on Pro+ plan encounter non-functional UI | Medium | Wire up Set Default, Settings, New Environment handlers | +| 5 | **API key cache not invalidated on revoke** | Revoked keys valid for 5 minutes | Low | Call `invalidateCache()` in `revokeApiKey()` | + +### P1 — Critical + +| # | Issue | Impact | Complexity | Fix | +|---|---|---|---|---| +| 6 | **No CSRF protection on internal APIs** | Session hijacking risk | Medium | Add CSRF token validation middleware | +| 7 | **Timing-unsafe HMAC comparison** | Invite token forgery risk | Low | Use `crypto.timingSafeEqual()` in `verifyPayload()` | +| 8 | **.env.example missing 9 variables** | Deployment failures for new devs | Low | Add all required env vars | +| 9 | **API key expired check missing** | Expired keys still work | Low | Add `expiresAt` check in `verifyApiKey()` | +| 10 | **Webhook delivery stats hardcoded** | UI shows "No fires logged" even when deliveries exist | Low | Fetch `WebhookDelivery` data in webhook list | + +### P2 — Important + +| # | Issue | Impact | Complexity | Fix | +|---|---|---|---|---| +| 11 | **Deduplicate API key code** | Maintenance burden, drift risk | Low | Delete `lib/api-key.ts`, use `ApiKeyService` everywhere | +| 12 | **UsageLog data retention** | Unbounded table growth | Medium | Add retention policy (90-day TTL or archival) | +| 13 | **WebhookDelivery cleanup** | Unbounded growth | Low | Add cleanup job for deliveries older than 30 days | +| 14 | **AuditLog archival** | Unbounded growth | Medium | Add archival strategy | +| 15 | **Deduplicate Redis instances** | 3 separate instances for same server | Low | Create shared Redis singleton | +| 16 | **Cancel subscription UI** | Users cannot cancel from dashboard | Medium | Add cancel button with Razorpay API call | +| 17 | **Email verification bypass when RESEND_API_KEY missing** | Security bypass in misconfigured production | Low | Check `NODE_ENV === "production"` separately | +| 18 | **Audit log plan gating is UI-only** | Hobby users can call audit API directly | Low | Add plan check in API route | + +### P3 — Nice To Have + +| # | Issue | Impact | Complexity | Fix | +|---|---|---|---|---| +| 19 | Contact Sales badge non-functional | UX gap | Low | Add mailto or contact form link | +| 20 | Upgrade Plan buttons on env/audit pages dead | UX gap | Low | Add href="/dashboard/billing" | +| 21 | Filters button on audit logs page dead | UX gap | Medium | Implement filter dialog | +| 22 | Remove console.log from production code | Clean logs | Low | Replace with logger | +| 23 | Add CSP headers | Security hardening | Medium | Add to middleware | +| 24 | Placeholder images may not exist | Broken seed data images | Low | Add actual placeholder files or use data URIs | + +--- + +## PART 20 — CTO VERDICT + +### 1. What is FlowCMS today? + +A **well-architected but incomplete headless CMS** with solid security foundations, a modern UI, and real infrastructure integrations. It is a **read-only content delivery platform** with a dashboard for content management. The gap between UI polish and backend completeness is the primary risk. + +### 2. What is launch-ready? + +- Content modeling and management (CRUD via dashboard) +- API-key authenticated, scope-enforced content delivery (read-only) +- Media management +- Webhook automation +- Basic billing checkout +- Auth with email verification +- RBAC-enforced operations +- Audit logging (for Agency+ plans) + +### 3. What is NOT launch-ready? + +- Write API endpoints (no POST/PUT/DELETE for external consumers) +- Team collaboration (invites disabled) +- Environment management UI (dead buttons) +- Subscription management (no downgrade/cancel from UI) +- AGENCY rate limiting (wrong tier applied) +- API key expiration enforcement + +### 4. What fake functionality still exists? + +- 5 dead buttons on the environments page +- 3 dead buttons on audit logs page +- 1 dead badge (Contact Sales) on billing page +- Hardcoded webhook delivery stats ("No fires logged") +- Promotion Flow banner ("Coming Soon" with no timeline) + +### 5. What technical debt is most dangerous? + +1. **AGENCY rate limit bug** — Paying customers get Hobby-tier throttling +2. **API key cache invalidation** — Revoked keys remain valid for 5 minutes +3. **Duplicated API key code** — Two identical implementations will drift +4. **Unbounded log tables** — UsageLog, AuditLog, WebhookDelivery will cause DB performance degradation +5. **No CSRF protection** — All internal mutating APIs are vulnerable + +### 6. What should be fixed next? + +In priority order: +1. Fix AGENCY rate limit mapping (30-minute fix) +2. Add API key cache invalidation on revoke (1-hour fix) +3. Fix timing-unsafe HMAC comparison (15-minute fix) +4. Add `expiresAt` check to API key verification (30-minute fix) +5. Wire up environment page buttons (half-day) +6. Enable team invites (1-hour if already tested) +7. Connect webhook delivery stats to real data (2-hour) + +### 7. What would I do as CTO over the next 30 days? + +**Week 1 — Security & Stability (Bug Fixes)** +- Fix all P0 items (rate limit, cache invalidation, expired key check) +- Fix CSRF vulnerability +- Fix timing-unsafe HMAC +- Deduplicate API key code +- Complete .env.example +- Remove console.log from production + +**Week 2 — Core Product Gaps** +- Implement write APIs (POST/PUT/DELETE entries via API keys) +- Enable team invitations +- Wire up environment page buttons +- Add cancel subscription UI +- Connect webhook delivery stats + +**Week 3 — Operational Readiness** +- Implement data retention for UsageLog, AuditLog, WebhookDelivery +- Add admin impersonation +- Add admin plan override +- Implement proper monitoring/alerting +- Deploy staging environment + +**Week 4 — Launch Preparation** +- Full API documentation +- Update README with architecture +- Security penetration test +- Load test at 1,000 concurrent users +- Private beta rollout with 10-20 selected users +- Collect feedback and iterate + +**Post 30-day target**: Private beta with limited users, full write API, team collaboration enabled, billing functional end-to-end. + +--- + +*End of Forensic Audit v2* diff --git a/docs/plans/v1/forensic_audit_14.06.md b/docs/plans/v1/forensic_audit_14.06.md new file mode 100644 index 0000000..1723239 --- /dev/null +++ b/docs/plans/v1/forensic_audit_14.06.md @@ -0,0 +1,501 @@ +# FLOWCMS COMPLETE FORENSIC AUDIT REPORT + +This document is a comprehensive, evidence-based forensic audit of the FlowCMS codebase. The source of truth for this audit is the actual project files located in the repository. All architectural claims, strengths, risks, security findings, and roadmap analyses are derived directly from code verification. + +--- + +## PART 1 — EXECUTIVE SUMMARY + +### Product Overview +FlowCMS is designed as an open-source, edge-native headless CMS geared towards developers and small agencies who want the premium developer experience (DX) of Sanity combined with predictable, Strapi-level pricing, without managing self-hosted VPS servers. + +* **Intended Target Audience:** Indie developers building client sites, solo founders who outgrew Notion/Contentful, and small dev agencies. +* **Actual Target Audience:** Small-scale Next.js developers and indie developers looking for a fast, structured, local-development-friendly CMS with a visual editor. +* **Core Value Proposition:** A visual block-editor that maps 1:1 to structured JSON, edge-native API endpoints, and zero-configuration workspace provisioning. +* **Maturity Stage:** **Beta (Unstable)**. + * *Why:* While the core CMS (Collections, Entries, Media folders, and visual drag-and-drop Block Editor) is functional, the billing layer is a mock frontend wrapper, critical background jobs are unawaited (creating race conditions and telemetry loss in serverless), the API is missing draft/preview token verification, and key security vulnerabilities exist in the workspace invitation and environment gating layers. It cannot be classified as "Production Ready" or "Scale Ready" in its current state. + +--- + +### Overall Health Score + +| Dimension | Score (1-10) | Reasoning | +| :--- | :---: | :--- | +| **Product Vision** | 8.5/10 | The product positioning is strong: "Sanity-quality DX at Strapi-level pricing" with an angular, industrial-editorial aesthetic. It targets a clear developer pain point. | +| **Engineering** | 5.5/10 | The code is generally clean but plagued by critical serverless anti-patterns (unawaited database writes) and incomplete features wired up as placeholders. | +| **Architecture** | 6.0/10 | The integration of Next.js 15, Prisma, Better Auth, and Upstash Redis/QStash is modern. However, environment routing is completely bypassed in public APIs, and rate limit mappings have severe mismatches. | +| **Security** | 4.0/10 | Several critical vulnerabilities exist: preview token bypass, invite hijacking, total lack of RBAC role checks on entry updates and collection deletions, and lack of AI API rate-limiting/usage gates. | +| **Scalability** | 5.0/10 | Upstash Redis is used for caching and rate-limiting, but the database queries lack critical environment-level compound indexes, and N+1 query patterns will emerge as relational depths grow. | +| **Performance** | 6.5/10 | Next.js 15 Server Actions and edge caching parameters (`s-maxage=60`) are configured, but the lack of an edge worker makes CDN-level authentication slow down cache hits. | +| **Developer Experience** | 7.0/10 | Standard workspace provisioning is quick and automates starter collections/seed data. The interactive API Explorer widget is a major DX win. | +| **Documentation** | 5.0/10 | The Fumadocs content is set up but missing key pages. Important setup instructions (like Cloudflare Zone/Token config) are in planning folders but missing in main guides. | +| **Monetization Readiness** | 3.0/10 | While the backend Razorpay integration is partially implemented, the frontend billing UI is a static "Early Access Beta" banner. No one can actually pay. | +| **Launch Readiness** | 4.5/10 | Multiple critical security, billing, and serverless bugs must be resolved before this can launch safely. | + +**Composite Health Score: 5.45 / 10** + +--- + +### Biggest Strengths +1. **Consolidated Workspace Provisioning:** The transaction orchestrator in [workspace.service.ts](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/server/services/workspace.service.ts#L23-L320) seeds a workspace with Default Keys, Production environments, and starter collections (Authors, Categories, Blog, Pages) seamlessly in a single step. +2. **Drag-and-Drop Block Editor:** A highly polished client-side visual canvas built with `@dnd-kit/core` and `@dnd-kit/sortable` in [BlockEditor.tsx](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/components/editor/BlockEditor.tsx) that maps blocks to structured JSON. +3. **Modern Auth Foundation:** Utilizing `better-auth` adapter with Prisma in [auth.ts](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/lib/auth.ts) ensures secure passwords, session management, and social provider capabilities out of the box. +4. **Durable Webhooks Queue:** HMAC-signed outbound webhooks are enqueued via Upstash QStash, offering automatic retry policies and full delivery tracing back to a callback route in [qstash-callback](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/app/api/internal/webhooks/qstash-callback/route.ts). +5. **Timing-Safe API Key Checks:** API keys are hashed with SHA-256 and compared using `crypto.timingSafeEqual` in [api-key.ts](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/lib/api-key.ts#L45-L53). +6. **Interactive API Explorer Widget:** The dashboard features a working API playground in [api-explorer/page.tsx](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/app/(dashboard)/dashboard/api-explorer/page.tsx) that lets developers run and test queries in real-time. +7. **Surgical CDN Cache Purges:** Cloudflare Zone cache purges are structured to invalidate by tag in [cloudflare.ts](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/lib/cloudflare.ts#L13-L53) upon content updates. +8. **Modern Styling System:** Tailwind CSS v4 styling creates a premium, high-contrast, industrial-editorial aesthetic ("Meridian"). +9. **Fumadocs Integration:** Clean, Next.js-native documentation rendering using MDX files in [content/docs](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/content/docs). +10. **Replay Protection on Billing Webhooks:** Razorpay webhooks use Redis idempotency locks (`webhook:razorpay:${eventId}`) in [webhook/route.ts](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/app/api/billing/webhook/route.ts#L49-L55) to prevent replay attacks. +11. **Event-Driven Audit Logging:** Key system state changes emit platform events in [emitter.ts](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/server/events/emitter.ts). +12. **Relation Expansion on Queries:** Public API routes support batch fetching of referenced entries to eliminate client-side joining in [collection/route.ts](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/app/api/v1/entries/%5BcollectionSlug%5D/route.ts#L47-L86). +13. **Swappable Storage Providers:** System features a swappable interface in [storage/index.ts](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/lib/storage/index.ts) allowing instant switches between Supabase bucket storage and local disk. +14. **Error Boundaries & Monitoring:** Full Sentry Next.js wrapping in [next.config.ts](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/next.config.ts#L10) and client-side error capturing in [instrumentation-client.ts](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/instrumentation-client.ts). +15. **User Suspension Guards:** User suspend state checks are intercepting session creation inside auth hooks in [auth.ts](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/lib/auth.ts#L57-L77). +16. **Detailed Internal Usage Logging:** Workspace requests are categorized and tracked inside `UsageLog` for live telemetry. +17. **Optimized DB Connection Pools:** Switchable pooling is supported via Transaction Pooler port config. +18. **SEO Metadata Generation Prompt:** Gemini-powered strategist prompt in [seo/route.ts](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/app/api/internal/ai/seo/route.ts#L17-L32) generates high-CTR meta tags. +19. **Secure invite handling:** Invitations are processed through one-time tokens in [invite/[token]/route.ts](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/app/api/auth/invite/%5Btoken%5D/route.ts). +20. **Visual Dashboards:** Beautiful Recharts integration showing daily request statistics. + +--- + +### Biggest Risks +1. **Serverless Telemetry Loss (Critical):** Usage counting (`incrementUsage`) and audit logging (`logAction`) are executed via unawaited promises inside API routes. In serverless environments, these processes will freeze or terminate prematurely, resulting in lost billing telemetry and inaccurate usage logs. +2. **Preview Security Bypass (Critical):** The individual entry GET endpoint in [[entrySlug]/route.ts](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/app/api/v1/entries/%5BcollectionSlug%5D/%5BentrySlug%5D/route.ts#L35-L39) exposes unpublished drafts to *anyone* appending `?preview=true` to the URL. No DraftToken or verification check is performed. +3. **Invite Hijacking (Critical):** The workspace join endpoint in [[token]/route.ts](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/app/api/auth/invite/%5Btoken%5D/route.ts#L36-L64) does not verify if the logged-in user's email matches the email of the invitation, allowing unauthorized users to hijack invites. +4. **Complete Lack of RBAC Checks (Critical):** Dashboard entries routes (`GET`, `PATCH`, `DELETE`) only check if the user belongs to the workspace, meaning any user (including a `VIEWER`) can edit or delete entries and collections. +5. **Environment Gating Bypass (High):** Public API v1 endpoints do not check the environment constraints of the API Key or filter query results by `environmentId`. A Staging key can fetch Production data, and staging entries leak into production outputs. +6. **Rate Limiting Plan Mismatch (High):** In [rate-limit.ts](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/lib/rate-limit.ts#L12-L33), the Upstash limiters map utilizes `TEAM` instead of the database enums `AGENCY` or `ENTERPRISE`. Consequently, upgraded agency users fall back to HOBBY limits (30 req/min). +7. **Broken Billing UI (High):** The frontend has no payment buttons, plan cards, or checkout logic; it merely shows a static "Early Access Beta" card. +8. **Complete Absence of Waitlist (High):** Although `waitlist_plan.md` outlines an extensive confirmation, priority, and invite system, absolutely none of it is written in code. Registration is fully open. +9. **No AI Usage Rate Limits (Medium):** The AI SEO endpoint in [seo/route.ts](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/app/api/internal/ai/seo/route.ts) lacks daily workspace quota verification. Users can spam Gemini requests and exhaust the system API keys. +10. **Dead Tables in Schema (Medium):** `CollectionTemplate` and `PageTemplate` tables exist in [schema.prisma](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/prisma/schema.prisma#L376) but are never queried, wasting database schemas. +11. **Static Admin Actions (Medium):** The "Suspend User" button on the admin users page has no click handler and no backend API endpoint. It is purely cosmetic. +12. **Static Team Management Actions (Medium):** The "Remove from Workspace" action on the team members row in [team-management.tsx](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/components/dashboard/settings/team-management.tsx#L154) has no click handler, meaning owners cannot remove members. +13. **Prisma Update Webhook Crash (Medium):** In [webhook/route.ts](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/app/api/billing/webhook/route.ts#L96), the webhook updates `razorpayCustomer` based on `subscriptionId`. If the local record was not created during checkout, this throws a `P2025` crash. +14. **Lack of Cron Scheduler (Medium):** The storage usage reconciliation job exists but has no `vercel.json` crons config, preventing it from executing in the cloud. +15. **Unverified API Key Scopes (Medium):** API keys contain `scopes` (like `read:entries`), but no route handler actually validates these scopes. Any valid key can perform any action. +16. **Code Duplication (Low):** API key verification logic is duplicated between [api-key.ts](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/lib/api-key.ts) and [api-key.service.ts](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/server/services/api-key.service.ts). +17. **Missing CLI & SDK (Low):** The advertised `@flowcms/cli` and `@flowcms/client` packages are completely missing. +18. **Unimplemented Custom Domains:** Custom domains are in the schema but feature-flagged off and have no verification routing. +19. **Orphaned Page Template Browser:** The page template browser component is written but never imported or used. +20. **Under-engineered session cookies:** The Better Auth session rehydration lacks caching controls, which could result in high database load. + +--- + +## PART 2 — SYSTEM ARCHITECTURE AUDIT + +FlowCMS uses a hybrid serverless model deployed on Vercel, using Supabase PostgreSQL for persistent relational storage, Upstash Redis for rate-limiting/caching, and Upstash QStash as a serverless queue worker. + +```mermaid +graph TD + User("User / Client Browser") + CF{"Cloudflare (DNS & WAF)"} + Vercel["Vercel (Next.js 15 Serverless)"] + Middleware["auth/rate-limit middleware"] + REST["REST API /v1"] + Dashboard["Dashboard UI"] + DB[("Supabase PostgreSQL")] + Redis[("Upstash Redis Cache")] + QStash{"Upstash QStash Queue"} + Gemini["Gemini AI API"] + Razorpay["Razorpay Gateway"] + + User -->|HTTPS| CF + CF -->|Proxy / Edge Cache| Vercel + Vercel --> Middleware + Middleware -->|1. Rate Limit Check| Redis + Middleware -->|2. Route to| REST + Middleware -->|3. Route to| Dashboard + REST -->|Fetch Content| DB + REST -->|Background Tracking| Redis + Dashboard -->|Trigger Webhook| QStash + Dashboard -->|Generate Meta| Gemini + Dashboard -->|Subscription| Razorpay + QStash -->|Callback Logs| DB + Razorpay -->|Webhook Webhook| Vercel +``` + +* **Frontend Layer:** Built with Next.js 15 (App Router), TypeScript, and Tailwind CSS v4. Design parameters are constrained to Meridian (industrial-editorial, Sap Green and Electric Lime, Sap/Canvas contrast). +* **Authentication Layer:** Powered by Better Auth with a Prisma adapter. Database hooks validate suspended statuses. Session cookies manage client-state rehydration. +* **Billing Layer:** Razorpay Subscription API handles checkout generation on the backend. Statuses are mapped via outbound webhooks. +* **Caching Layer:** Cloudflare CDN sits in front of Vercel. Cache rules strip the `Authorization` header from the cache key to allow global caches of `/api/v1/entries` while verifying authentication. +* **Queue Layer:** Upstash QStash processes asynchronous outbound webhooks to prevent slow API response times. + +--- + +## PART 3 — DATABASE AUDIT + +FlowCMS uses PostgreSQL managed via Prisma. Here is an audit of the schema: + +### Model Telemetry + +```mermaid +erDiagram + User ||--o{ Session : has + User ||--o{ Account : has + User ||--o{ WorkspaceMember : belongs + User ||--o{ AuditLog : performs + Workspace ||--o{ WorkspaceMember : contains + Workspace ||--o{ Environment : provisions + Workspace ||--o{ Collection : defines + Workspace ||--o{ Media : hosts + Workspace ||--o{ ApiKey : credentials + Workspace ||--o{ Webhook : dispatches + Workspace ||--o{ UsageLog : meters + Workspace ||--o{ MonthlyUsage : aggregates + Workspace ||--o{ AuditLog : audits + Workspace ||--o{ Invitation : invites + Workspace ||--o{ DraftToken : previews + Workspace ||--o{ CustomDomain : registers + Workspace ||--oY RazorpayCustomer : billable + Workspace ||--o{ Notification : alerts + Collection ||--o{ Entry : holds + Environment ||--o{ Entry : filters + Environment ||--o{ ApiKey : restricts + MediaFolder ||--o{ Media : folders + MediaFolder ||--o{ MediaFolder : hierarchy + Webhook ||--o{ WebhookDelivery : records +``` + +### Table-by-Table Analysis + +* **`User`**: Holds core user identity. + * *Relationships:* One-to-many with sessions, accounts, workspace memberships, and audit logs. + * *Risks:* No index on `onboarded` or `isSuspended` columns. +* **`Workspace`**: The central multi-tenant boundary. + * *Relationships:* One-to-many with environments, collections, keys, usage metrics, webhooks, and billing records. + * *Scaling Issues:* Tenant isolation is managed purely at the application query layer (`where: { workspaceId }`). A developer bug could leak tenant data. +* **`WorkspaceMember`**: Junction table for workspace access controls. + * *Constraint:* Unique constraint `@@unique([workspaceId, userId])` is present, which is correct. +* **`Environment`**: Manages environment scoping (Production, Staging). + * *Risks:* Missing index on `isDefault`. +* **`Collection`**: Schema definitions, storing fields as a JSON blob. + * *Data Flow:* Fields are parsed via Zod schema definitions on create/update. + * *Risks:* JSON storage makes querying nested field definitions at the database level extremely slow. +* **`Entry`**: Relational content entries. + * *Risks:* Unique constraint `@@unique([collectionId, slug])` is present. However, there is no index on `environmentId`. Queries filtering by environment will require a full table scan as content volume grows. +* **`ApiKey`**: Developer access credentials. + * *Data Flow:* Generated as `flw_...`, hashed as `sha256:...`, prefix stored in `keyPrefix`. + * *Risks:* The prefix lookup table requires timing-safe scans. +* **`Webhook` & `WebhookDelivery`**: Outbound event streams. + * *Risks:* Delivery log payloads store raw JSON. Massive webhooks could exhaust disk storage on Vercel Supabase databases. + +### Schema Scores +* **Schema Quality Score:** **8/10** (Well-structured schemas, good enums and relational cascades). +* **Data Integrity Score:** **7.5/10** (Solid unique constraints, but soft-deletion is missing for critical media/entries). +* **Scalability Score:** **5.5/10** (Lack of environment-scoped indexes and compound indexes on key queries will create performance bottlenecks). + +--- + +## PART 4 — AUTHENTICATION AUDIT + +FlowCMS implements Better Auth 1.6.9. + +### Core Architecture +* Authentication endpoints are mounted as a catch-all route at `/api/auth/[...all]`. +* Credential login and Google OAuth are enabled. +* Session tokens are retrieved from cookies (`better-auth.session_token`). + +### Vulnerabilities Identified +1. **Workspace Invitation Hijacking (Critical):** + In [route.ts](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/app/api/auth/invite/%5Btoken%5D/route.ts#L36-L55), the token accept handler verifies the invitation token exists and is pending. However, it pulls the logged-in user session (`auth.api.getSession`) and immediately links that user to the workspace WITHOUT verifying that `session.user.email === invitation.email`. + *Exploitation Scenario:* An attacker intercepts an invite link sent to `victim@company.com`. The attacker clicks the link while logged in as `attacker@gmail.com`. The attacker is successfully added to the victim's workspace, and the victim is locked out. +2. **Total Lack of RBAC Checks (Critical):** + While enums for roles exist (`OWNER`, `ADMIN`, `EDITOR`, `VIEWER`), routes like `entries/[id]` `PATCH`/`DELETE` and `collections/[id]` `PATCH`/`DELETE` only verify workspace membership: + `const { workspace } = await requireWorkspace();` + No role check is performed. A user with a `VIEWER` role can delete collections and edit entries. + +--- + +## PART 5 — BILLING AUDIT + +The monetization pipeline uses Razorpay subscriptions. + +### Razorpay Webhook Mapping +Outbound billing webhooks are processed at `/api/billing/webhook`. Events are mapped as follows: + +| Razorpay Event | Local Status | Plan Action | +| :--- | :--- | :--- | +| `subscription.activated` | `active` | Upgraded to `PRO` or `AGENCY` | +| `subscription.charged` | `active` | Maintained on active plan | +| `subscription.cancelled` | `cancelled` | Downgraded to `HOBBY` | +| `subscription.expired` | `expired` | Downgraded to `HOBBY` | +| `subscription.paused` | `paused` | Downgraded to `HOBBY` | + +### Vulnerabilities & Gaps +1. **Mock Pricing Interface:** + The file [billing-plans.tsx](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/components/dashboard/settings/billing-plans.tsx#L8-L33) does not render pricing tables, plan comparisons, or a checkout button. It is a static banner declaring the "Early Access Beta" is active and billing is disabled. The checkout flow cannot be triggered by users. +2. **Prisma Webhook Crash (Medium):** + If a webhook event occurs for a subscription that does not have a pre-existing local database record, `tx.razorpayCustomer.update` will throw a `P2025` Record Not Found error and crash, returning 500. + +--- + +## PART 6 — CMS CORE AUDIT + +| Feature | Status | Evidence | +| :--- | :---: | :--- | +| **Content Types** | **Implemented** | Standard collection creation, field configuration, and validation are fully functional. | +| **Entries** | **Implemented** | Supported via collections. Fields are stored as JSON data. | +| **Pages** | **Partial** | Handled as entries within a visual mode collection, rather than a dedicated schema. | +| **Media Library** | **Partial** | File uploads work (local/Supabase), folders are supported. However, image transformation parameters are missing. | +| **Publishing** | **Implemented** | Entries can transition from `DRAFT` to `PUBLISHED` status. | +| **Draft Preview** | **Broken** | The endpoint resolves preview requests with `?preview=true` without token validation. | +| **Versioning** | **Missing** | The `version` field increments on publish, but no historical snapshot table or rollback UI exists. | +| **Localization** | **Missing** | The `localeCode` field is present in the database but ignored in the UI. | +| **References** | **Implemented** | Reference fields are supported, and relation expansion is handled in the API. | +| **Templates** | **Partial** | Collection templates are hardcoded on the backend. Page templates are defined in config but not used in the UI. | + +--- + +## PART 7 — API AUDIT + +### Documented Endpoints + +| Route | Method | Purpose | Auth | Rate Limited | Cached | Status | +| :--- | :---: | :--- | :---: | :---: | :---: | :---: | +| `/api/v1/entries/[collectionSlug]` | `GET` | List published entries | API Key | Yes | Yes | **Implemented** | +| `/api/v1/entries/[collectionSlug]/[entrySlug]` | `GET` | Retrieve single entry | API Key | Yes | Yes | **Security Bypass** | +| `/api/v1/media` | `GET` | List media (Disabled) | API Key | Yes | No | **Forbidden** | +| `/api/health` | `GET` | Platform health | Public | No | No | **Implemented** | + +### Critical Gaps +* **Preview Token Bypass:** The endpoint `entries/[collectionSlug]/[entrySlug]` allows fetching unpublished draft content simply by setting `?preview=true`. +* **Environment Leakage:** The API key verification logic extracts `workspaceId` but fails to filter by the key's `environmentId`, returning content from all environments. + +--- + +## PART 8 — DASHBOARD AUDIT + +| Page | Purpose | Status | Dependencies | Known Issues | +| :--- | :---: | :---: | :--- | :--- | +| **Home (`/dashboard`)** | Overview metrics & analytics | **Implemented** | `useDashboardStats`, `useDashboardAnalytics` | No issues. | +| **Collections (`/dashboard/collections`)** | Model schemas & entries list | **Implemented** | `useCollections`, `useEntries` | No role verification. | +| **Media (`/dashboard/media`)** | Manage media assets | **Implemented** | `useMedia` | Lacks crop/resizing tools. | +| **Billing (`/dashboard/billing`)** | Manage payments | **Broken** | `BillingPlans` | Shows static Beta card instead of checkout. | +| **Team (`/dashboard/team`)** | Manage members | **Partial** | `TeamManagement` | "Remove Member" button is not wired up. | +| **Webhooks (`/dashboard/webhooks`)** | Configure event logs | **Implemented** | `useWebhooks` | No issues. | + +--- + +## PART 9 — INFRASTRUCTURE AUDIT + +| Component | Status | Operational Risk | +| :--- | :---: | :--- | +| **Supabase (PostgreSQL)** | **Implemented** | Primary database. Operational risks include missing compound indexes. | +| **PgBouncer** | **Implemented** | Pooled connections configured via port `6543`. | +| **Cloudflare** | **Partial** | Purging is configured in code, but DNS setup is manual, and the Edge Worker is missing. | +| **Upstash Redis** | **Implemented** | Handles rate-limiting and cache invalidation. | +| **Upstash QStash** | **Implemented** | Webhook message broker is configured. | +| **Vercel** | **Implemented** | App hosting platform. | +| **Sentry** | **Implemented** | Error tracking is initialized on the client and server. | + +--- + +## PART 10 — PERFORMANCE AUDIT + +### Top 25 Bottlenecks (Ranked by Severity) + +1. **Unawaited Serverless Promises (Critical):** `incrementUsage` and `prisma.usageLog.create` inside [with-api-auth.ts](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/middleware/with-api-auth.ts#L93-L114) are unawaited. Vercel functions terminate execution immediately upon returning the response, leading to lost billing logs. +2. **No Session Caching (High):** Cookie session caching is disabled in Better Auth config. Every dashboard render queries the database to fetch user profiles, causing database load. +3. **Missing Environment Compound Index (High):** `Entry` table queries filter by `collectionId` and `status` but lack an index on `environmentId`, causing full table scans. +4. **No Edge Worker (High):** Cloudflare Worker code is in a text guide and not deployed. API key checks must resolve at the Vercel Origin, increasing latency. +5. **Prisma Client Initialization Overhead (High):** Database connection pooling is initialized per request in serverless functions, increasing connection overhead. +6. **Missing JSON Indexes (Medium):** Collections schema fields are stored as JSON blobs, preventing indexing. +7. **Outbound Webhook Dispatch (Medium):** Outbound webhook queries inside [webhooks.ts](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/lib/webhooks.ts#L33) are unawaited, risking failed deliveries. +8. **Reconcile Job Memory Usage (Medium):** The storage usage reconciliation job loads all workspaces into memory, which will cause out-of-memory crashes at scale. +9. **Fumadocs Re-compilation (Medium):** Documentation MDX compilation runs on-demand in development, slowing down preview rendering. +10. **Duplicate Key Verification (Medium):** Timing-safe hashing runs twice per request. +11. **Heavy Recharts Bundles (Low):** Recharts components load on the client, increasing bundle size. +12. **Lucide Icons Imports (Low):** Standard imports instead of tree-shaked imports increase client-side javascript size. +13. **Unoptimized Alt Placeholders (Low):** Static placeholders are loaded from local folders instead of being optimized. +14. **Lack of Dynamic Image Resizing (Low):** Public URLs serve unoptimized files directly, wasting bandwidth. +15. **Unbatched Audit Log Writing (Low):** Audit logs are written one by one. +16. **No API Rate Limit Cache (Low):** Rate limits are checked via Redis on every request. +17. **No DB Query Timeout (Low):** Queries lack timeouts. +18. **Unindexed Audit Logs (Low):** Audit log queries filter by resource type without indexes. +19. **Next.js Hydration Mismatches (Low):** Dashboard welcome cards rely on localStorage check without proper client rendering checks. +20. **Large Tailwind CSS Bundles (Low):** Unused utility classes are bundled. +21. **No Edge Cache for Static Files (Low):** Local uploads are served directly from Node.js rather than a CDN. +22. **Uncompressed API Responses (Low):** V1 API outputs lack gzip compression headers. +23. **Prisma Schema Drift (Low):** Discrepancies exist between DB migrations and schemas. +24. **No DB Query Caching (Low):** All queries hit Postgres directly. +25. **Unused Dependencies (Low):** Packages like `docx` and `recharts` are loaded but barely used. + +--- + +## PART 11 — SECURITY AUDIT + +### Vulnerability Classification + +#### CRITICAL SEVERITY +1. **Draft Content Leak via Preview Bypass:** + *Location:* [route.ts](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/app/api/v1/entries/%5BcollectionSlug%5D/%5BentrySlug%5D/route.ts#L35-L39) + *Exploitation:* Append `?preview=true` to any public endpoint. The code returns draft entries without verifying a token, leaking embargoed or draft content. +2. **Invite Token Hijacking Vulnerability:** + *Location:* [route.ts](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/app/api/auth/invite/%5Btoken%5D/route.ts#L36-L55) + *Exploitation:* Any authenticated user who accesses an invite link will be added to the workspace. The invite token does not verify user identity. +3. **Missing RBAC Checks on Collections and Entries:** + *Location:* [collections/[id]/route.ts](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/app/api/internal/collections/%5Bid%5D/route.ts) and [entries/[id]/route.ts](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/app/api/internal/entries/%5Bid%5D/route.ts) + *Exploitation:* A user with a `VIEWER` role can send DELETE requests to delete collections or PATCH requests to modify content. + +#### HIGH SEVERITY +4. **Environment Gating Bypass:** + *Location:* [entries/[collectionSlug]/route.ts](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/app/api/v1/entries/%5BcollectionSlug%5D/route.ts) + *Exploitation:* API keys are not restricted to their assigned environment. A staging API key can fetch production entries, leaking staging test content to production. +5. **Rate Limiting Plan Bypass / Mismatch:** + *Location:* [rate-limit.ts](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/lib/rate-limit.ts#L12-L33) + *Exploitation:* Upgraded `AGENCY` plan users fall back to Hobby limits (30 req/min) because the key is not mapped, leading to service disruption. + +#### MEDIUM SEVERITY +6. **AI API Quota Exhaustion:** + *Location:* [seo/route.ts](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/app/api/internal/ai/seo/route.ts) + *Exploitation:* No workspace limit check exists on the AI SEO endpoint. A user can script requests to spam the Gemini API and exhaust the global API key. +7. **Unenforced API Scopes:** + *Location:* [with-api-auth.ts](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/middleware/with-api-auth.ts) + *Exploitation:* Keys with `read:entries` scope can read collections and media because scope verification is missing in the middleware. + +--- + +## PART 12 — FEATURE INVENTORY + +| Feature | Category | Status | Plan Gate | Dependencies | Technical Debt | +| :--- | :--- | :---: | :---: | :--- | :--- | +| **Collections CRUD** | CMS Core | **Implemented** | HOBBY+ | Prisma | No RBAC check | +| **Block Editor** | CMS Core | **Implemented** | HOBBY+ | `@dnd-kit` | None | +| **Image Upload** | DAM | **Implemented** | HOBBY+ | Supabase | No resizing | +| **Folders** | DAM | **Implemented** | HOBBY+ | Prisma | None | +| **API Key Generation** | Developer | **Implemented** | HOBBY+ | SHA-256 | Duplicated code | +| **Webhooks Queue** | Developer | **Implemented** | PRO+ | QStash | Unawaited promises | +| **Replay Delivery** | Developer | **Implemented** | PRO+ | QStash | None | +| **Workspace Provisioning** | Onboarding | **Implemented** | HOBBY+ | Prisma | None | +| **Razorpay Payments** | Billing | **Broken** | HOBBY+ | Razorpay | Mocked frontend | +| **Team Invites** | Collaboration | **Partial** | PRO+ | Resend | Hijack vulnerability | +| **User Suspension** | Security | **Broken** | Platform | Better Auth | Mocked admin button | +| **Audit logs** | Telemetry | **Implemented** | PRO+ | Prisma | Unawaited promises | +| **AI SEO Generator** | AI Engine | **Implemented** | PRO+ | Gemini | No quota check | +| **Environments Scoping** | Content | **Broken** | PRO+ | Prisma | No API gating | +| **Draft Preview** | Content | **Broken** | PRO+ | Prisma | No token check | +| **Self-hosting Setup** | Platform | **Implemented** | Open | Docker | No auto-migrations | +| **CLI Tool** | Developer | **Missing** | Open | Node | None | +| **TypeScript SDK** | Developer | **Missing** | Open | Node | None | +| **Custom Domains** | Developer | **Missing** | AGENCY+ | Vercel | Hardcoded to false | +| **Content Versioning** | CMS Core | **Missing** | PRO+ | Prisma | None | + +--- + +## PART 13 — TECHNICAL DEBT AUDIT + +### Debt Classification + +* **CRITICAL DEBT:** + * *Unawaited Serverless Promises:* Asynchronous database writes and API calls are unawaited, causing data loss in serverless environments. +* **HIGH DEBT:** + * *Duplicate Key Verification:* Verifying keys is duplicated in [api-key.ts](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/lib/api-key.ts) and [api-key.service.ts](file:///c:/Users/91637/Desktop/Business%20Project/flowcms/src/server/services/api-key.service.ts). + * *Unused DB models:* `CollectionTemplate` and `PageTemplate` exist in `schema.prisma` but are unused. +* **MEDIUM DEBT:** + * *Unused UI Components:* The page template browser component is imported but never rendered. + * *Lack of DB Indexes:* Environment IDs on Entry and Workspace IDs on AuditLog are unindexed. +* **LOW DEBT:** + * *Eslint Warnings:* Multiple type casting overrides (`as any`) are used throughout the codebase. + +--- + +## PART 14 — DOCUMENTATION AUDIT + +FlowCMS uses Fumadocs to manage documentation, with content stored in `content/docs`. + +### Missing Documentation +1. **Production Deployment Steps:** No production setup instructions exist for Cloudflare Zone configuration or SSL settings. +2. **API Key Scopes Guide:** There is no documentation explaining scopes (like `read:entries`), which is problematic since they are not enforced. +3. **Local storage configuration:** No setup instructions exist for local uploads directory permissions. +4. **CLI & SDK docs:** The documentation references non-existent CLI and SDK tools. + +**Onboarding Feasibility:** A new engineer can onboard and run the project locally using the README, but they will face issues when configuring production webhooks, deployments, and edge caches due to missing environment variables. + +--- + +## PART 15 — PRODUCT AUDIT + +* **Current State:** FlowCMS is a headless CMS for Next.js developers. Its visual block editor maps blocks to JSON, which is a strong feature. +* **Roadmap Gaps:** The product roadmap prioritizes features like AI SEO generation and visual editors, while core requirements like security, RBAC checks, and billing are incomplete. +* **Recommendations:** + * *Accelerate:* Fix draft preview token checks, add RBAC permissions, and resolve serverless database write bugs. + * *Remove/Delay:* Postpone custom domain routing until multi-tenant security is resolved. + +--- + +## PART 16 — COMPETITIVE POSITIONING + +| Dimension | FlowCMS | Sanity | Strapi | Payload | +| :--- | :--- | :--- | :--- | :--- | +| **Parity** | Basic collections and entries | Advanced fields, GROQ queries | Complete RBAC, plugins | Local development, TypeScript | +| **Differentiator** | Visual Block Editor to JSON | Rich Portable Text editor | Complete SQL backend | Code-first schemas | +| **Weakness** | Security, incomplete billing | High pricing, complexity | High setup overhead | Complex hosting requirements | + +--- + +## PART 17 — LAUNCH READINESS AUDIT + +FlowCMS is **NOT** ready to launch. + +* **Engineering:** **50%** (Core engine is built, but serverless bugs and unawaited database writes will cause telemetry issues). +* **Security:** **20%** (Major vulnerabilities: preview bypass, invite hijacking, lack of RBAC checks). +* **Billing:** **15%** (Checkout API exists, but the frontend interface is mocked). +* **Documentation:** **45%** (Fumadocs structure exists, but production setup instructions are missing). +* **Overall Launch Readiness:** **32.5%** + +--- + +## PART 18 — SCALING AUDIT + +### Scale Benchmarks + +* **100 Users:** Handled easily by Vercel serverless and Supabase Postgres. +* **1,000 Users:** Database connection limits will be reached if PgBouncer is not used. Unawaited writes will start causing silent data loss. +* **10,000 Users:** High database load due to uncached Better Auth sessions and lack of environment indexes. +* **100,000 Users:** Unusable. Full database scans will fail on entries queries. The lack of an edge worker will cause performance issues. + +--- + +## PART 19 — ROADMAP RECONSTRUCTION + +Reconstructed plan focusing on stability: + +### Phase 1: Security & Stability (High ROI) +* **Task 1:** Await all `incrementUsage` and `prisma.usageLog` calls in API routes. +* **Task 2:** Add draft token validation to the preview API. +* **Task 3:** Add email validation checks to invitation accept routes. +* **Task 4:** Restrict entry and collection mutations to workspace Owners/Admins. +* **Task 5:** Add indexes for `environmentId` in PostgreSQL. + +### Phase 2: Billing & Monetization +* **Task 1:** Replace the beta banner with actual pricing cards. +* **Task 2:** Integrate the Razorpay script and wire up checkout actions. +* **Task 3:** Fix the `rate-limit.ts` plan mappings. + +--- + +## PART 20 — FINAL CTO VERDICT + +### 1. What is FlowCMS today? +FlowCMS is a beta-grade Next.js headless CMS with a functional visual block editor and webhook queue, but it lacks core security, billing, and serverless reliability features. + +### 2. What is missing before launch? +Draft preview validation, workspace invitation checks, RBAC controls, working billing checkout, correct rate limit mapping, and awaited database writes. + +### 3. What should be deleted? +Unused database models (`CollectionTemplate`, `PageTemplate`) and the orphaned `PageTemplateBrowser` component. + +### 4. What should be prioritized? +Fixing unawaited serverless promises to prevent data loss, and securing the draft preview API. + +### 5. What is the biggest engineering risk? +Unawaited database writes and Redis updates in Vercel functions, which will cause billing data loss under load. + +### 6. What is the biggest product risk? +Launching with security bypasses, allowing users to access draft content and hijack invites, damaging product trust. + +### 7. What would you do if you became CTO tomorrow? +I would pause feature development, implement async await patterns across the codebase, secure the draft and invite endpoints, add PostgreSQL indexes, and wire up the Razorpay billing interface. diff --git a/next.config.ts b/next.config.ts deleted file mode 100644 index 9debdf9..0000000 --- a/next.config.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { createMDX } from "fumadocs-mdx/next"; -import type { NextConfig } from "next"; -import { withSentryConfig } from "@sentry/nextjs"; - -const withMDX = createMDX(); - - -const nextConfig: NextConfig = {}; - -export default withSentryConfig(withMDX(nextConfig), { - // For all available options, see: - // https://github.com/getsentry/sentry-webpack-plugin#options - - org: "flowcms", - project: "flowcms-nextjs", - - // Only print logs for uploading source maps in CI - silent: !process.env.CI, - - // For all available options, see: - // https://docs.sentry.io/platforms/javascript/guides/nextjs/manual-setup/ - - // Upload a larger set of source maps for prettier stack traces (increases build time) - widenClientFileUpload: true, - - // Automatically annotate React components to show their full name in breadcrumbs and session replay - reactComponentAnnotation: { - enabled: true, - }, - - // Route browser requests to Sentry through a Next.js rewrite to circumvent ad-blockers. - // This can increase your server load as well as your Sentry bill. - tunnelRoute: "/monitoring", - - // Hides source maps from visitors - // Note: hideSourceMaps is handled via separate build flags or different config structure in latest SDK - - - // Automatically tree-shake Sentry logger statements to reduce bundle size - disableLogger: true, - - // Enables automatic instrumentation of Vercel Cron Monitors. (Does not yet work with `appDir`, see docs) - // See the following for more information: - // https://docs.sentry.io/product/crons/ - // https://vercel.com/docs/cron-jobs - automaticVercelMonitors: true, -}); - diff --git a/package.json b/package.json index 857d130..3277cff 100644 --- a/package.json +++ b/package.json @@ -1,92 +1,21 @@ { - "name": "flowcms", - "version": "0.1.0", + "name": "flowcms-monorepo", "private": true, "scripts": { - "dev": "next dev --turbopack", - "build": "next build --turbopack", - "start": "next start", - "lint": "eslint" - }, - "dependencies": { - "@base-ui/react": "^1.4.1", - "@dnd-kit/core": "^6.3.1", - "@dnd-kit/sortable": "^10.0.0", - "@dnd-kit/utilities": "^3.2.2", - "@google/generative-ai": "^0.24.1", - "@hookform/resolvers": "^5.2.2", - "@prisma/adapter-pg": "^7.8.0", - "@prisma/client": "^7.8.0", - "@prisma/client-runtime-utils": "^7.8.0", - "@sentry/nextjs": "^10.52.0", - "@supabase/supabase-js": "^2.105.3", - "@tanstack/react-query": "^5.100.9", - "@tanstack/react-query-devtools": "^5.100.9", - "@tiptap/extension-image": "^3.22.5", - "@tiptap/pm": "^3.22.5", - "@tiptap/react": "^3.22.5", - "@tiptap/starter-kit": "^3.22.5", - "@types/mdx": "^2.0.13", - "@types/pg": "^8.20.0", - "@upstash/qstash": "^2.10.1", - "@upstash/ratelimit": "^2.0.8", - "@upstash/redis": "^1.38.0", - "@vercel/analytics": "^2.0.1", - "bcryptjs": "^3.0.3", - "better-auth": "^1.6.9", - "class-variance-authority": "^0.7.1", - "clsx": "^2.1.1", - "cmdk": "^1.1.1", - "date-fns": "^4.1.0", - "docx": "^9.6.1", - "embla-carousel-react": "^8.6.0", - "fumadocs-core": "15.8.5", - "fumadocs-mdx": "^13.0.8", - "fumadocs-mermaid": "^1.3.1", - "fumadocs-ui": "15.8.5", - "import-in-the-middle": "^3.0.1", - "input-otp": "^1.4.2", - "lucide-react": "^1.14.0", - "mermaid": "^11.15.0", - "motion": "^12.38.0", - "nanoid": "^5.1.11", - "next": "15.5.18", - "next-themes": "^0.4.6", - "pg": "^8.20.0", - "prisma": "^7.8.0", - "radix-ui": "^1.4.3", - "razorpay": "^2.9.6", - "react": "19.1.0", - "react-day-picker": "^10.0.0", - "react-dom": "19.1.0", - "react-hook-form": "^7.75.0", - "react-icons": "^5.6.0", - "react-resizable-panels": "^4.11.0", - "recharts": "3.8.0", - "require-in-the-middle": "^8.0.1", - "resend": "^6.12.3", - "shadcn": "^4.7.0", - "sonner": "^2.0.7", - "tailwind-merge": "^3.5.0", - "tw-animate-css": "^1.4.0", - "vaul": "^1.1.2", - "zod": "^4.4.3" + "build": "turbo run build", + "dev": "turbo run dev", + "lint": "turbo run lint", + "format": "prettier --write \"**/*.{ts,tsx,md}\"", + "check-types": "turbo run check-types" }, "devDependencies": { - "@eslint/eslintrc": "^3", - "@react-email/components": "^1.0.12", - "@tailwindcss/postcss": "^4", - "@types/bcryptjs": "^3.0.0", - "@types/node": "^20", - "@types/react": "^19", - "@types/react-dom": "^19", - "dotenv": "^17.4.2", - "eslint": "^9", - "eslint-config-next": "15.5.18", - "prettier": "^3.8.3", - "react-email": "^6.1.1", - "tailwindcss": "^4", - "typescript": "^5" + "prettier": "^3.7.4", + "turbo": "^2.10.10", + "typescript": "5.9.2" + }, + "packageManager": "pnpm@9.0.0", + "engines": { + "node": ">=18" }, "pnpm": { "overrides": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 15de2bc..ec6ad0b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,10 +10,22 @@ overrides: importers: .: + devDependencies: + prettier: + specifier: ^3.7.4 + version: 3.7.4 + turbo: + specifier: ^2.10.10 + version: 2.10.10 + typescript: + specifier: 5.9.2 + version: 5.9.2 + + apps/app: dependencies: '@base-ui/react': specifier: ^1.4.1 - version: 1.5.0(@date-fns/tz@1.5.0)(@types/react@19.2.15)(date-fns@4.3.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + version: 1.7.0(@date-fns/tz@1.5.0)(@types/react@19.2.2)(date-fns@4.4.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@dnd-kit/core': specifier: ^6.3.1 version: 6.3.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -28,64 +40,64 @@ importers: version: 0.24.1 '@hookform/resolvers': specifier: ^5.2.2 - version: 5.4.0(react-hook-form@7.76.1(react@19.1.0)) + version: 5.9.0(@standard-schema/spec@1.1.0)(ajv-formats@3.0.1(ajv@8.20.0))(ajv@8.20.0)(effect@3.20.0)(react-hook-form@7.85.0(react@19.1.0))(valibot@1.4.2(typescript@5.9.2))(zod@4.4.3) '@prisma/adapter-pg': specifier: ^7.8.0 - version: 7.8.0 + version: 7.9.1 '@prisma/client': specifier: ^7.8.0 - version: 7.8.0(prisma@7.8.0(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.9.3))(typescript@5.9.3) + version: 7.9.1(prisma@7.9.1(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.9.2))(typescript@5.9.2) '@prisma/client-runtime-utils': specifier: ^7.8.0 - version: 7.8.0 + version: 7.9.1 '@sentry/nextjs': specifier: ^10.52.0 - version: 10.53.1(@opentelemetry/core@2.7.1(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.7.1(@opentelemetry/api@1.9.1))(next@15.5.18(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0)(webpack@5.107.1) + version: 10.70.0(@opentelemetry/core@2.10.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(next@15.5.18(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0)(webpack@5.109.2) '@supabase/supabase-js': specifier: ^2.105.3 - version: 2.106.1 + version: 2.112.3(@opentelemetry/api@1.9.1) '@tanstack/react-query': specifier: ^5.100.9 - version: 5.100.13(react@19.1.0) + version: 5.101.4(react@19.1.0) '@tanstack/react-query-devtools': specifier: ^5.100.9 - version: 5.100.13(@tanstack/react-query@5.100.13(react@19.1.0))(react@19.1.0) + version: 5.101.4(@tanstack/react-query@5.101.4(react@19.1.0))(react@19.1.0) '@tiptap/extension-image': specifier: ^3.22.5 - version: 3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6)) + version: 3.30.1(@tiptap/core@3.30.1(@tiptap/pm@3.30.1)) '@tiptap/pm': specifier: ^3.22.5 - version: 3.23.6 + version: 3.30.1 '@tiptap/react': specifier: ^3.22.5 - version: 3.23.6(@floating-ui/dom@1.7.6)(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6)(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + version: 3.30.1(@floating-ui/dom@1.8.0)(@tiptap/core@3.30.1(@tiptap/pm@3.30.1))(@tiptap/pm@3.30.1)(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@tiptap/starter-kit': specifier: ^3.22.5 - version: 3.23.6 + version: 3.30.1 '@types/mdx': specifier: ^2.0.13 - version: 2.0.13 + version: 2.0.14 '@types/pg': specifier: ^8.20.0 - version: 8.20.0 + version: 8.21.0 '@upstash/qstash': specifier: ^2.10.1 - version: 2.11.0 + version: 2.11.3 '@upstash/ratelimit': specifier: ^2.0.8 - version: 2.0.8(@upstash/redis@1.38.0) + version: 2.0.8(@upstash/redis@1.38.2) '@upstash/redis': specifier: ^1.38.0 - version: 1.38.0 + version: 1.38.2 '@vercel/analytics': specifier: ^2.0.1 - version: 2.0.1(next@15.5.18(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0) + version: 2.0.1(next@15.5.18(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0) bcryptjs: specifier: ^3.0.3 version: 3.0.3 better-auth: specifier: ^1.6.9 - version: 1.6.11(@opentelemetry/api@1.9.1)(@prisma/client@7.8.0(prisma@7.8.0(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.9.3))(typescript@5.9.3))(mysql2@3.15.3)(next@15.5.18(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(pg@8.21.0)(prisma@7.8.0(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.9.3))(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + version: 1.6.29(@opentelemetry/api@1.9.1)(@prisma/client@7.9.1(prisma@7.9.1(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.9.2))(typescript@5.9.2))(mysql2@3.15.3)(next@15.5.18(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(pg@8.23.0)(prisma@7.9.1(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.9.2))(react-dom@19.1.0(react@19.1.0))(react@19.1.0) class-variance-authority: specifier: ^0.7.1 version: 0.7.1 @@ -94,28 +106,28 @@ importers: version: 2.1.1 cmdk: specifier: ^1.1.1 - version: 1.1.1(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + version: 1.1.1(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) date-fns: specifier: ^4.1.0 - version: 4.3.0 + version: 4.4.0 docx: specifier: ^9.6.1 - version: 9.6.1 + version: 9.7.1 embla-carousel-react: specifier: ^8.6.0 version: 8.6.0(react@19.1.0) fumadocs-core: specifier: 15.8.5 - version: 15.8.5(@types/react@19.2.15)(lucide-react@1.16.0(react@19.1.0))(next@15.5.18(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + version: 15.8.5(@types/react@19.2.2)(lucide-react@1.31.0(react@19.1.0))(next@15.5.18(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0) fumadocs-mdx: specifier: ^13.0.8 - version: 13.0.8(fumadocs-core@15.8.5(@types/react@19.2.15)(lucide-react@1.16.0(react@19.1.0))(next@15.5.18(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(next@15.5.18(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0) + version: 13.0.8(fumadocs-core@15.8.5(@types/react@19.2.2)(lucide-react@1.31.0(react@19.1.0))(next@15.5.18(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(next@15.5.18(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0) fumadocs-mermaid: specifier: ^1.3.1 - version: 1.3.1(fumadocs-ui@15.8.5(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(lucide-react@1.16.0(react@19.1.0))(next@15.5.18(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(tailwindcss@4.3.0))(lucide-react@1.16.0(react@19.1.0))(mermaid@11.15.0)(next-themes@0.4.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0) + version: 1.3.1(fumadocs-ui@15.8.5(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(lucide-react@1.31.0(react@19.1.0))(next@15.5.18(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(tailwindcss@4.3.3))(lucide-react@1.31.0(react@19.1.0))(mermaid@11.16.1)(next-themes@0.4.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0) fumadocs-ui: specifier: 15.8.5 - version: 15.8.5(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(lucide-react@1.16.0(react@19.1.0))(next@15.5.18(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(tailwindcss@4.3.0) + version: 15.8.5(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(lucide-react@1.31.0(react@19.1.0))(next@15.5.18(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(tailwindcss@4.3.3) import-in-the-middle: specifier: 3.0.1 version: 3.0.1 @@ -124,67 +136,67 @@ importers: version: 1.4.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) lucide-react: specifier: ^1.14.0 - version: 1.16.0(react@19.1.0) + version: 1.31.0(react@19.1.0) mermaid: specifier: ^11.15.0 - version: 11.15.0 + version: 11.16.1 motion: specifier: ^12.38.0 - version: 12.40.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + version: 12.43.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) nanoid: specifier: ^5.1.11 - version: 5.1.11 + version: 5.1.16 next: specifier: 15.5.18 - version: 15.5.18(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + version: 15.5.18(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) next-themes: specifier: ^0.4.6 version: 0.4.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0) pg: specifier: ^8.20.0 - version: 8.21.0 + version: 8.23.0 prisma: specifier: ^7.8.0 - version: 7.8.0(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.9.3) + version: 7.9.1(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.9.2) radix-ui: specifier: ^1.4.3 - version: 1.4.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + version: 1.6.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) razorpay: specifier: ^2.9.6 - version: 2.9.6 + version: 2.9.8 react: specifier: 19.1.0 version: 19.1.0 react-day-picker: specifier: ^10.0.0 - version: 10.0.1(@types/react@19.2.15)(react@19.1.0) + version: 10.0.1(@types/react@19.2.2)(react@19.1.0) react-dom: specifier: 19.1.0 version: 19.1.0(react@19.1.0) react-hook-form: specifier: ^7.75.0 - version: 7.76.1(react@19.1.0) + version: 7.85.0(react@19.1.0) react-icons: specifier: ^5.6.0 - version: 5.6.0(react@19.1.0) + version: 5.7.0(react@19.1.0) react-resizable-panels: specifier: ^4.11.0 - version: 4.11.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + version: 4.12.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0) recharts: specifier: 3.8.0 - version: 3.8.0(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react-is@16.13.1)(react@19.1.0)(redux@5.0.1) + version: 3.8.0(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react-is@16.13.1)(react@19.1.0)(redux@5.0.1) require-in-the-middle: specifier: ^8.0.1 version: 8.0.1 resend: specifier: ^6.12.3 - version: 6.12.3(@react-email/render@2.0.8(react-dom@19.1.0(react@19.1.0))(react@19.1.0)) + version: 6.20.0(@react-email/render@2.1.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)) shadcn: specifier: ^4.7.0 - version: 4.8.0(@types/node@20.19.41)(typescript@5.9.3) + version: 4.18.0(typescript@5.9.2) sonner: specifier: ^2.0.7 - version: 2.0.7(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + version: 2.0.8(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) tailwind-merge: specifier: ^3.5.0 version: 3.6.0 @@ -193,53 +205,59 @@ importers: version: 1.4.0 vaul: specifier: ^1.1.2 - version: 1.1.2(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + version: 1.1.2(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) zod: specifier: ^4.4.3 version: 4.4.3 devDependencies: '@eslint/eslintrc': specifier: ^3 - version: 3.3.5 + version: 3.3.1 '@react-email/components': specifier: ^1.0.12 version: 1.0.12(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@tailwindcss/postcss': specifier: ^4 - version: 4.3.0 + version: 4.3.3 '@types/bcryptjs': specifier: ^3.0.0 version: 3.0.0 '@types/node': specifier: ^20 - version: 20.19.41 + version: 20.19.43 '@types/react': specifier: ^19 - version: 19.2.15 + version: 19.2.2 '@types/react-dom': specifier: ^19 - version: 19.2.3(@types/react@19.2.15) + version: 19.2.2(@types/react@19.2.2) dotenv: specifier: ^17.4.2 version: 17.4.2 eslint: specifier: ^9 - version: 9.39.4(jiti@2.7.0) + version: 9.39.1(jiti@2.7.0) eslint-config-next: specifier: 15.5.18 - version: 15.5.18(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) + version: 15.5.18(eslint@9.39.1(jiti@2.7.0))(typescript@5.9.2) prettier: specifier: ^3.8.3 - version: 3.8.3 + version: 3.9.6 react-email: specifier: ^6.1.1 - version: 6.3.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + version: 6.9.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) tailwindcss: specifier: ^4 - version: 4.3.0 + version: 4.3.3 + typescript: + specifier: ^5 + version: 5.9.2 + + apps/docs: + devDependencies: typescript: specifier: ^5 - version: 5.9.3 + version: 5.9.2 packages: @@ -250,150 +268,161 @@ packages: '@antfu/install-pkg@1.1.0': resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==} - '@babel/code-frame@7.29.0': - resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} + '@apm-js-collab/code-transformer-bundler-plugins@0.7.4': + resolution: {integrity: sha512-nAfOeZPSUAQvJa1iFT/5oCrTm5YQhMMrfCNthNnaXHZiOQhu1KGuLoIx7HtbAi3wfwaBYLaICPIeenIaEwcXIg==} + engines: {node: '>=18.0.0'} + + '@apm-js-collab/code-transformer@0.18.1': + resolution: {integrity: sha512-u1Hb6bHjWtkSpiprwVP6YaHC1DTN4RAU3zYkUDUe7WMnJwdyU1pwTL9dFKiSJB9IiLue/EQovmyx6xhU7FFtAQ==} + hasBin: true + + '@apm-js-collab/tracing-hooks@0.13.0': + resolution: {integrity: sha512-mTvWz9rnQwx1U3h0XPTHaX7bgfkpipLLTQyjlC2cdhQpQEuoLT0AGzoydeoq2NxfEVv6fWOOETcSbb2nptleyw==} + + '@babel/code-frame@7.29.7': + resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.29.3': - resolution: {integrity: sha512-LIVqM46zQWZhj17qA8wb4nW/ixr2y1Nw+r1etiAWgRM6U1IqP+LNhL1yg440jYZR72jCWcWbLWzIosH+uP1fqg==} + '@babel/compat-data@7.29.7': + resolution: {integrity: sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==} engines: {node: '>=6.9.0'} - '@babel/core@7.29.0': - resolution: {integrity: sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==} + '@babel/core@7.29.7': + resolution: {integrity: sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==} engines: {node: '>=6.9.0'} - '@babel/generator@7.29.1': - resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==} + '@babel/generator@7.29.8': + resolution: {integrity: sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==} engines: {node: '>=6.9.0'} - '@babel/helper-annotate-as-pure@7.27.3': - resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} + '@babel/helper-annotate-as-pure@7.29.7': + resolution: {integrity: sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.28.6': - resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==} + '@babel/helper-compilation-targets@7.29.7': + resolution: {integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==} engines: {node: '>=6.9.0'} - '@babel/helper-create-class-features-plugin@7.29.3': - resolution: {integrity: sha512-RpLYy2sb51oNLjuu1iD3bwBqCBWUzjO0ocp+iaCP/lJtb2CPLcnC2Fftw+4sAzaMELGeWTgExSKADbdo0GFVzA==} + '@babel/helper-create-class-features-plugin@7.29.7': + resolution: {integrity: sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-globals@7.28.0': - resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + '@babel/helper-globals@7.29.7': + resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==} engines: {node: '>=6.9.0'} - '@babel/helper-member-expression-to-functions@7.28.5': - resolution: {integrity: sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==} + '@babel/helper-member-expression-to-functions@7.29.7': + resolution: {integrity: sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg==} engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.28.6': - resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} + '@babel/helper-module-imports@7.29.7': + resolution: {integrity: sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.28.6': - resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==} + '@babel/helper-module-transforms@7.29.7': + resolution: {integrity: sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-optimise-call-expression@7.27.1': - resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} + '@babel/helper-optimise-call-expression@7.29.7': + resolution: {integrity: sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong==} engines: {node: '>=6.9.0'} - '@babel/helper-plugin-utils@7.28.6': - resolution: {integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==} + '@babel/helper-plugin-utils@7.29.7': + resolution: {integrity: sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==} engines: {node: '>=6.9.0'} - '@babel/helper-replace-supers@7.28.6': - resolution: {integrity: sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==} + '@babel/helper-replace-supers@7.29.7': + resolution: {integrity: sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-skip-transparent-expression-wrappers@7.27.1': - resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} + '@babel/helper-skip-transparent-expression-wrappers@7.29.7': + resolution: {integrity: sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.27.1': - resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + '@babel/helper-string-parser@7.29.7': + resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.28.5': - resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.27.1': - resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + '@babel/helper-validator-option@7.29.7': + resolution: {integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.29.2': - resolution: {integrity: sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==} + '@babel/helpers@7.29.7': + resolution: {integrity: sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==} engines: {node: '>=6.9.0'} - '@babel/parser@7.27.0': - resolution: {integrity: sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==} + '@babel/parser@7.29.2': + resolution: {integrity: sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/parser@7.29.3': - resolution: {integrity: sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==} + '@babel/parser@7.29.8': + resolution: {integrity: sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/plugin-syntax-jsx@7.28.6': - resolution: {integrity: sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==} + '@babel/plugin-syntax-jsx@7.29.7': + resolution: {integrity: sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-typescript@7.28.6': - resolution: {integrity: sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==} + '@babel/plugin-syntax-typescript@7.29.7': + resolution: {integrity: sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-commonjs@7.28.6': - resolution: {integrity: sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==} + '@babel/plugin-transform-modules-commonjs@7.29.7': + resolution: {integrity: sha512-j0vCldybPC5b5dwCQOJ21uKtHzt7hxLygJTg9eF1ScfaikEDNfzn94XoW5Fi+seBR0nCyL23xaBFFkq7dTM8XQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-typescript@7.28.6': - resolution: {integrity: sha512-0YWL2RFxOqEm9Efk5PvreamxPME8OyY0wM5wh5lHjF+VtVhdneCWGzZeSqzOfiobVqQaNCd2z0tQvnI9DaPWPw==} + '@babel/plugin-transform-typescript@7.29.7': + resolution: {integrity: sha512-jK52h8LaLc7JarhQV2ofeFMts4H7vnOXnqZNA6fYglBTZewRBE51KWt3BUltW1P+KoPsYkHoJeXePuz4zo2LMw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/preset-typescript@7.28.5': - resolution: {integrity: sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g==} + '@babel/preset-typescript@7.29.7': + resolution: {integrity: sha512-/Foi8vKY2EVbed/1eZx0gJEEwHAIxogrySI7rULcRIvhZzbvoE/b5qG5Ghc0WKAFKOHA9SD1x7RsFlOYdutIiQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/runtime@7.29.2': - resolution: {integrity: sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==} - engines: {node: '>=6.9.0'} - - '@babel/template@7.28.6': - resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} + '@babel/runtime@7.29.7': + resolution: {integrity: sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.27.0': - resolution: {integrity: sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==} + '@babel/template@7.29.7': + resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==} engines: {node: '>=6.9.0'} '@babel/traverse@7.29.0': resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} engines: {node: '>=6.9.0'} - '@babel/types@7.29.0': - resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} + '@babel/traverse@7.29.8': + resolution: {integrity: sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.29.8': + resolution: {integrity: sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==} engines: {node: '>=6.9.0'} - '@base-ui/react@1.5.0': - resolution: {integrity: sha512-z1gSAlced1yY+iM+mHDEtIkD8UI3Ebs52MuBPxvV6f5hRutk+xvCH/wuB7hDqDzK9JG5FoMz5nhrqtSs1wjt1A==} + '@base-ui/react@1.7.0': + resolution: {integrity: sha512-j+8QjX44C32jrXD/qyEAGpFr70FRpGL2CY61mQd9nBPWN737CK0xxD1ceJ055rW4RtdvFDT1e7otzdlfxvsYug==} engines: {node: '>=14.0.0'} peerDependencies: '@date-fns/tz': ^1.2.0 @@ -409,8 +438,8 @@ packages: date-fns: optional: true - '@base-ui/utils@0.2.9': - resolution: {integrity: sha512-x/PDDCYzoqPpjrdyb3VcyylTI2IjUXEtYDGi5foh7KsnmNJIIaVwA2GLgDH1dps1GgXiJbA60hM+AyuTfQzIvw==} + '@base-ui/utils@0.3.2': + resolution: {integrity: sha512-oWy1aq/I2GmYjpl4PhEAhzflF8VPGKgZeq0xAWTbfD5KBWyxcN0ZP2+WHSUm/5Z6lVMBDLReLcoXwSYoRc/zNQ==} peerDependencies: '@types/react': ^17 || ^18 || ^19 react: ^17 || ^18 || ^19 @@ -419,16 +448,16 @@ packages: '@types/react': optional: true - '@better-auth/core@1.6.11': - resolution: {integrity: sha512-LrwidLCV8azdMGjvtwp30nj9tIv1BwI3VhtC0UaGSjQkAVWw4bN42I8qwbxRziPeSQoj+zUVkOpxZzAWBDARtQ==} + '@better-auth/core@1.6.29': + resolution: {integrity: sha512-hkUxePo548G0Y247had36TcfsH7E+cofcTc2UivMAbjkdLPKn1ZUk6Pjkc/kvk9xTbWYCUDX6JA9emJc0Gnufg==} peerDependencies: - '@better-auth/utils': 0.4.0 - '@better-fetch/fetch': 1.1.21 + '@better-auth/utils': 0.4.2 + '@better-fetch/fetch': 1.3.1 '@cloudflare/workers-types': '>=4' '@opentelemetry/api': ^1.9.0 - better-call: 1.3.5 + better-call: 1.4.0 jose: ^6.1.0 - kysely: ^0.28.5 + kysely: ^0.28.5 || ^0.29.0 nanostores: ^1.0.1 peerDependenciesMeta: '@cloudflare/workers-types': @@ -436,47 +465,47 @@ packages: '@opentelemetry/api': optional: true - '@better-auth/drizzle-adapter@1.6.11': - resolution: {integrity: sha512-4jpkETIGZOHCf7BK4jnu22fdN6jjomH0/HhEzkaWy3+Eppi5PYlHTF/460jrTmA3Xc+Vqwp9t282ymHiEPypGw==} + '@better-auth/drizzle-adapter@1.6.29': + resolution: {integrity: sha512-IdvrqHnnRNKqz6KOSII3rZNiTzv1pmVmx5xGRGZdVm8W3OYi98an5kIovao/b3GZh2nHGTzdeTfMSSZNCyGXBg==} peerDependencies: - '@better-auth/core': ^1.6.11 - '@better-auth/utils': 0.4.0 + '@better-auth/core': ^1.6.29 + '@better-auth/utils': 0.4.2 drizzle-orm: ^0.45.2 peerDependenciesMeta: drizzle-orm: optional: true - '@better-auth/kysely-adapter@1.6.11': - resolution: {integrity: sha512-/g8M9RfIjdcZDnbstSUvQiINkvdNlCeZr248zwqx2/PVksQI1MhQofbzUn3RnQnbPKp0EPwpX/dR3oudRFenUg==} + '@better-auth/kysely-adapter@1.6.29': + resolution: {integrity: sha512-n87hHC/miSaUaKdnQygz+2wlj2KI2rsGazDPaKF0wbH8i87um9HPDWyz3VdbkqPN79e0qbVfMR9pY7GZQm/X8w==} peerDependencies: - '@better-auth/core': ^1.6.11 - '@better-auth/utils': 0.4.0 - kysely: ^0.28.17 + '@better-auth/core': ^1.6.29 + '@better-auth/utils': 0.4.2 + kysely: ^0.28.17 || ^0.29.0 peerDependenciesMeta: kysely: optional: true - '@better-auth/memory-adapter@1.6.11': - resolution: {integrity: sha512-hpdfw0BBf8MuzLkIdmbcUZICbY9r/bhLO2RxSnkzT5+/O+0I0u2I8+m0YUP7vNllP/ZCKASHOYgXPLO75Z0f9Q==} + '@better-auth/memory-adapter@1.6.29': + resolution: {integrity: sha512-F1yLUbNTc/pikEaTlgWOgYlT2RDSi2dV1ysWxacRmQhYtLGYAun1JgU7TDdcEjts+wrLcm+JzRzt5F+ZgNfz9A==} peerDependencies: - '@better-auth/core': ^1.6.11 - '@better-auth/utils': 0.4.0 + '@better-auth/core': ^1.6.29 + '@better-auth/utils': 0.4.2 - '@better-auth/mongo-adapter@1.6.11': - resolution: {integrity: sha512-3Tor8rSv8vSEIMEaV2PFpPEuVhqc1gNoZ6eGvoh3LwExXXuj8madew6ob+H1pH7Aphn3Ar5PQ08AguT8TbwFAA==} + '@better-auth/mongo-adapter@1.6.29': + resolution: {integrity: sha512-gyOpfBBCpe2wDnv9CY2T0jirC4oTqk3i5svWYBGkGTAFrKsfJA516NMOs001PiHsEDf/JttZapQv5dkoPD0x2w==} peerDependencies: - '@better-auth/core': ^1.6.11 - '@better-auth/utils': 0.4.0 + '@better-auth/core': ^1.6.29 + '@better-auth/utils': 0.4.2 mongodb: ^6.0.0 || ^7.0.0 peerDependenciesMeta: mongodb: optional: true - '@better-auth/prisma-adapter@1.6.11': - resolution: {integrity: sha512-Pw+7q7zTp+VSci1V+CYMvuxIbAeVMZLe4lRo46LJoAKMHfjFl5T/ycsyFvWs/DkWC7n9gZZzRDEbHp0I5FiKKw==} + '@better-auth/prisma-adapter@1.6.29': + resolution: {integrity: sha512-W5lr8AYXwa68qhS7PEpEsisF7ASs9rWJyczoZr8+vYypPBmGMq1Yf8bYJ9ig95zj1wdaQGim2ZSYs8hxZeaKVQ==} peerDependencies: - '@better-auth/core': ^1.6.11 - '@better-auth/utils': 0.4.0 + '@better-auth/core': ^1.6.29 + '@better-auth/utils': 0.4.2 '@prisma/client': ^5.0.0 || ^6.0.0 || ^7.0.0 prisma: ^5.0.0 || ^6.0.0 || ^7.0.0 peerDependenciesMeta: @@ -485,18 +514,21 @@ packages: prisma: optional: true - '@better-auth/telemetry@1.6.11': - resolution: {integrity: sha512-hsjDHc8MZbm6/AHeNdtywrWedXevnBjmdvnHTcZub+rTVjOv+Td0roI8USKuC6uUibmrl//2rJfVCsGbopihNA==} + '@better-auth/telemetry@1.6.29': + resolution: {integrity: sha512-zW1GRIBR/sn83siG+xK4ll/gzfTRxVh6rcpzzjYkR2W9/DkDMwEotl/Mz8OW0Gr2KpuhEkfwiVGH9zp/cyK4Pg==} peerDependencies: - '@better-auth/core': ^1.6.11 - '@better-auth/utils': 0.4.0 - '@better-fetch/fetch': 1.1.21 + '@better-auth/core': ^1.6.29 + '@better-auth/utils': 0.4.2 + '@better-fetch/fetch': 1.3.1 + + '@better-auth/utils@0.4.2': + resolution: {integrity: sha512-AUxrvu+HaaODsUyzDxFgwd/8RZ1yZaYo42LXKSrU2oGgR38pS1ij8nqQKNgtTWoYGpNevNXtCfgTy6loHveW9A==} - '@better-auth/utils@0.4.0': - resolution: {integrity: sha512-RpMtLUIQAEWMgdPLNVbIF5ON2mm+CH0U3rCdUCU1VyeAUui4m38DyK7/aXMLZov2YDjG684pS1D0MBllrmgjQA==} + '@better-auth/utils@0.5.0': + resolution: {integrity: sha512-BL8W4EfIZFwlu0r54m3v1ztjDhu6dDe/amLTm0xybmbZaNgYUqhD3SjpAsnq0q8YD6/ki4iwIgxJNLP/N3TxiA==} - '@better-fetch/fetch@1.1.21': - resolution: {integrity: sha512-/ImESw0sskqlVR94jB+5+Pxjf+xBwDZF/N5+y2/q4EqD7IARUTSpPfIo8uf39SYpCxyOCtbyYpUrZ3F/k0zT4A==} + '@better-fetch/fetch@1.3.1': + resolution: {integrity: sha512-ABkD1WhyfPZprKRQI3bhATjeiFuNWC9PXhfGWqL+sg/gKrM977oFrYkdb4msM3hgUGonr7KlOsOFT5TU2rht9g==} '@braintree/sanitize-url@7.1.2': resolution: {integrity: sha512-jigsZK+sMF/cuiB7sERuo9V7N9jx+dhmHHnQyDSVdpZwVutaBu7WvNYqMDLSgFgfB30n452TP3vjDAvFC973mA==} @@ -529,29 +561,26 @@ packages: peerDependencies: react: '>=16.8.0' - '@dotenvx/dotenvx@1.67.0': - resolution: {integrity: sha512-KBfIx5OrAG6giqSkHCkQWynZmT47XkSTuuYIcvjHxlKoVRlYbxNrJmyIPaefnszU8MCvMwrrB+viJQzPqzgpcg==} + '@dotenvx/dotenvx@1.75.1': + resolution: {integrity: sha512-/BITOC9dmS/edY2zQwZNicQ059O6RKabtQfyEafV0nGtfYRNHYy1DIPiYVcov40+tob9hfmBnbR963dS+EQ1DQ==} hasBin: true - '@ecies/ciphers@0.2.6': - resolution: {integrity: sha512-patgsRPKGkhhoBjETV4XxD0En4ui5fbX0hzayqI3M8tvNMGUoUvmyYAIWwlxBc1KX5cturfqByYdj5bYGRpN9g==} - engines: {bun: '>=1', deno: '>=2.7.10', node: '>=16'} - peerDependencies: - '@noble/ciphers': ^1.0.0 + '@dotenvx/primitives@0.8.0': + resolution: {integrity: sha512-VYJy0uhFm9zTJ1TxBaW/pA8bjbOM/OttaNMwZ1RHG4JKyRG7DhSdiqD1ipQoAyoD22olUtxbP78W9xY3Wd11bg==} - '@electric-sql/pglite-socket@0.1.1': - resolution: {integrity: sha512-p2hoXw3Z3LQHwTeikdZNsFBOvXGqKY2hk51BBw+8NKND8eoH+8LFOtW9Z8CQKmTJ2qqGYu82ipqiyFZOTTXNfw==} + '@electric-sql/pglite-socket@0.1.3': + resolution: {integrity: sha512-LAciWM0M1dCL8hlsxu2venbVZcdxema0BtDfpWYVqr+Y468UADw0pFWidhKw1M8sfJ8rdLT71tjMmnirf/IZRQ==} hasBin: true peerDependencies: - '@electric-sql/pglite': 0.4.1 + '@electric-sql/pglite': 0.4.3 - '@electric-sql/pglite-tools@0.3.1': - resolution: {integrity: sha512-C+T3oivmy9bpQvSxVqXA1UDY8cB9Eb9vZHL9zxWwEUfDixbXv4G3r2LjoTdR33LD8aomR3O9ZXEO3XEwr/cUCA==} + '@electric-sql/pglite-tools@0.3.3': + resolution: {integrity: sha512-AlzLJTRJ8+UFgK8CmxIpyIpJ0+YaFw02IiOSdYrqxwPXdSyeIShz8aa9Tq+tYFXdPwcaMp/Fc80mQZ1dkOQ/wg==} peerDependencies: - '@electric-sql/pglite': 0.4.1 + '@electric-sql/pglite': 0.4.3 - '@electric-sql/pglite@0.4.1': - resolution: {integrity: sha512-mZ9NzzUSYPOCnxHH1oAHPRzoMFJHY472raDKwXl/+6oPbpdJ7g8LsCN4FSaIIfkiCKHhb3iF/Zqo3NYxaIhU7Q==} + '@electric-sql/pglite@0.4.3': + resolution: {integrity: sha512-ichuWTgtd4mOM1G4SpyGJa5trT03lWbMypDV0fUXUCXg5hiHqVAz/bZyV68NqmkLB7WcYmj1RMJVSp8HV/v/ZQ==} '@emnapi/core@1.10.0': resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} @@ -559,6 +588,9 @@ packages: '@emnapi/runtime@1.10.0': resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} + '@emnapi/runtime@1.11.3': + resolution: {integrity: sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==} + '@emnapi/wasi-threads@1.2.1': resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} @@ -568,8 +600,8 @@ packages: cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.28.0': - resolution: {integrity: sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA==} + '@esbuild/aix-ppc64@0.28.2': + resolution: {integrity: sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] @@ -580,8 +612,8 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.28.0': - resolution: {integrity: sha512-+WzIXQOSaGs33tLEgYPYe/yQHf0WTU0X42Jca3y8NWMbUVhp7rUnw+vAsRC/QiDrdD31IszMrZy+qwPOPjd+rw==} + '@esbuild/android-arm64@0.28.2': + resolution: {integrity: sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==} engines: {node: '>=18'} cpu: [arm64] os: [android] @@ -592,8 +624,8 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-arm@0.28.0': - resolution: {integrity: sha512-wqh0ByljabXLKHeWXYLqoJ5jKC4XBaw6Hk08OfMrCRd2nP2ZQ5eleDZC41XHyCNgktBGYMbqnrJKq/K/lzPMSQ==} + '@esbuild/android-arm@0.28.2': + resolution: {integrity: sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==} engines: {node: '>=18'} cpu: [arm] os: [android] @@ -604,8 +636,8 @@ packages: cpu: [x64] os: [android] - '@esbuild/android-x64@0.28.0': - resolution: {integrity: sha512-+VJggoaKhk2VNNqVL7f6S189UzShHC/mR9EE8rDdSkdpN0KflSwWY/gWjDrNxxisg8Fp1ZCD9jLMo4m0OUfeUA==} + '@esbuild/android-x64@0.28.2': + resolution: {integrity: sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==} engines: {node: '>=18'} cpu: [x64] os: [android] @@ -616,8 +648,8 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.28.0': - resolution: {integrity: sha512-0T+A9WZm+bZ84nZBtk1ckYsOvyA3x7e2Acj1KdVfV4/2tdG4fzUp91YHx+GArWLtwqp77pBXVCPn2We7Letr0Q==} + '@esbuild/darwin-arm64@0.28.2': + resolution: {integrity: sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] @@ -628,8 +660,8 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.28.0': - resolution: {integrity: sha512-fyzLm/DLDl/84OCfp2f/XQ4flmORsjU7VKt8HLjvIXChJoFFOIL6pLJPH4Yhd1n1gGFF9mPwtlN5Wf82DZs+LQ==} + '@esbuild/darwin-x64@0.28.2': + resolution: {integrity: sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==} engines: {node: '>=18'} cpu: [x64] os: [darwin] @@ -640,8 +672,8 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.28.0': - resolution: {integrity: sha512-l9GeW5UZBT9k9brBYI+0WDffcRxgHQD8ShN2Ur4xWq/NFzUKm3k5lsH4PdaRgb2w7mI9u61nr2gI2mLI27Nh3Q==} + '@esbuild/freebsd-arm64@0.28.2': + resolution: {integrity: sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] @@ -652,8 +684,8 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.28.0': - resolution: {integrity: sha512-BXoQai/A0wPO6Es3yFJ7APCiKGc1tdAEOgeTNy3SsB491S3aHn4S4r3e976eUnPdU+NbdtmBuLncYir2tMU9Nw==} + '@esbuild/freebsd-x64@0.28.2': + resolution: {integrity: sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] @@ -664,8 +696,8 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.28.0': - resolution: {integrity: sha512-RVyzfb3FWsGA55n6WY0MEIEPURL1FcbhFE6BffZEMEekfCzCIMtB5yyDcFnVbTnwk+CLAgTujmV/Lgvih56W+A==} + '@esbuild/linux-arm64@0.28.2': + resolution: {integrity: sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==} engines: {node: '>=18'} cpu: [arm64] os: [linux] @@ -676,8 +708,8 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.28.0': - resolution: {integrity: sha512-CjaaREJagqJp7iTaNQjjidaNbCKYcd4IDkzbwwxtSvjI7NZm79qiHc8HqciMddQ6CKvJT6aBd8lO9kN/ZudLlw==} + '@esbuild/linux-arm@0.28.2': + resolution: {integrity: sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==} engines: {node: '>=18'} cpu: [arm] os: [linux] @@ -688,8 +720,8 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.28.0': - resolution: {integrity: sha512-KBnSTt1kxl9x70q+ydterVdl+Cn0H18ngRMRCEQfrbqdUuntQQ0LoMZv47uB97NljZFzY6HcfqEZ2SAyIUTQBQ==} + '@esbuild/linux-ia32@0.28.2': + resolution: {integrity: sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==} engines: {node: '>=18'} cpu: [ia32] os: [linux] @@ -700,8 +732,8 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.28.0': - resolution: {integrity: sha512-zpSlUce1mnxzgBADvxKXX5sl8aYQHo2ezvMNI8I0lbblJtp8V4odlm3Yzlj7gPyt3T8ReksE6bK+pT3WD+aJRg==} + '@esbuild/linux-loong64@0.28.2': + resolution: {integrity: sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==} engines: {node: '>=18'} cpu: [loong64] os: [linux] @@ -712,8 +744,8 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.28.0': - resolution: {integrity: sha512-2jIfP6mmjkdmeTlsX/9vmdmhBmKADrWqN7zcdtHIeNSCH1SqIoNI63cYsjQR8J+wGa4Y5izRcSHSm8K3QWmk3w==} + '@esbuild/linux-mips64el@0.28.2': + resolution: {integrity: sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] @@ -724,8 +756,8 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.28.0': - resolution: {integrity: sha512-bc0FE9wWeC0WBm49IQMPSPILRocGTQt3j5KPCA8os6VprfuJ7KD+5PzESSrJ6GmPIPJK965ZJHTUlSA6GNYEhg==} + '@esbuild/linux-ppc64@0.28.2': + resolution: {integrity: sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] @@ -736,8 +768,8 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.28.0': - resolution: {integrity: sha512-SQPZOwoTTT/HXFXQJG/vBX8sOFagGqvZyXcgLA3NhIqcBv1BJU1d46c0rGcrij2B56Z2rNiSLaZOYW5cUk7yLQ==} + '@esbuild/linux-riscv64@0.28.2': + resolution: {integrity: sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] @@ -748,8 +780,8 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.28.0': - resolution: {integrity: sha512-SCfR0HN8CEEjnYnySJTd2cw0k9OHB/YFzt5zgJEwa+wL/T/raGWYMBqwDNAC6dqFKmJYZoQBRfHjgwLHGSrn3Q==} + '@esbuild/linux-s390x@0.28.2': + resolution: {integrity: sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==} engines: {node: '>=18'} cpu: [s390x] os: [linux] @@ -760,8 +792,8 @@ packages: cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.28.0': - resolution: {integrity: sha512-us0dSb9iFxIi8srnpl931Nvs65it/Jd2a2K3qs7fz2WfGPHqzfzZTfec7oxZJRNPXPnNYZtanmRc4AL/JwVzHQ==} + '@esbuild/linux-x64@0.28.2': + resolution: {integrity: sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==} engines: {node: '>=18'} cpu: [x64] os: [linux] @@ -772,8 +804,8 @@ packages: cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-arm64@0.28.0': - resolution: {integrity: sha512-CR/RYotgtCKwtftMwJlUU7xCVNg3lMYZ0RzTmAHSfLCXw3NtZtNpswLEj/Kkf6kEL3Gw+BpOekRX0BYCtklhUw==} + '@esbuild/netbsd-arm64@0.28.2': + resolution: {integrity: sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] @@ -784,8 +816,8 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.28.0': - resolution: {integrity: sha512-nU1yhmYutL+fQ71Kxnhg8uEOdC0pwEW9entHykTgEbna2pw2dkbFSMeqjjyHZoCmt8SBkOSvV+yNmm94aUrrqw==} + '@esbuild/netbsd-x64@0.28.2': + resolution: {integrity: sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] @@ -796,8 +828,8 @@ packages: cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-arm64@0.28.0': - resolution: {integrity: sha512-cXb5vApOsRsxsEl4mcZ1XY3D4DzcoMxR/nnc4IyqYs0rTI8ZKmW6kyyg+11Z8yvgMfAEldKzP7AdP64HnSC/6g==} + '@esbuild/openbsd-arm64@0.28.2': + resolution: {integrity: sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] @@ -808,8 +840,8 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.28.0': - resolution: {integrity: sha512-8wZM2qqtv9UP3mzy7HiGYNH/zjTA355mpeuA+859TyR+e+Tc08IHYpLJuMsfpDJwoLo1ikIJI8jC3GFjnRClzA==} + '@esbuild/openbsd-x64@0.28.2': + resolution: {integrity: sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] @@ -820,8 +852,8 @@ packages: cpu: [arm64] os: [openharmony] - '@esbuild/openharmony-arm64@0.28.0': - resolution: {integrity: sha512-FLGfyizszcef5C3YtoyQDACyg95+dndv79i2EekILBofh5wpCa1KuBqOWKrEHZg3zrL3t5ouE5jgr94vA+Wb2w==} + '@esbuild/openharmony-arm64@0.28.2': + resolution: {integrity: sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] @@ -832,8 +864,8 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.28.0': - resolution: {integrity: sha512-1ZgjUoEdHZZl/YlV76TSCz9Hqj9h9YmMGAgAPYd+q4SicWNX3G5GCyx9uhQWSLcbvPW8Ni7lj4gDa1T40akdlw==} + '@esbuild/sunos-x64@0.28.2': + resolution: {integrity: sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==} engines: {node: '>=18'} cpu: [x64] os: [sunos] @@ -844,8 +876,8 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.28.0': - resolution: {integrity: sha512-Q9StnDmQ/enxnpxCCLSg0oo4+34B9TdXpuyPeTedN/6+iXBJ4J+zwfQI28u/Jl40nOYAxGoNi7mFP40RUtkmUA==} + '@esbuild/win32-arm64@0.28.2': + resolution: {integrity: sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==} engines: {node: '>=18'} cpu: [arm64] os: [win32] @@ -856,8 +888,8 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.28.0': - resolution: {integrity: sha512-zF3ag/gfiCe6U2iczcRzSYJKH1DCI+ByzSENHlM2FcDbEeo5Zd2C86Aq0tKUYAJJ1obRP84ymxIAksZUcdztHA==} + '@esbuild/win32-ia32@0.28.2': + resolution: {integrity: sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==} engines: {node: '>=18'} cpu: [ia32] os: [win32] @@ -868,8 +900,8 @@ packages: cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.28.0': - resolution: {integrity: sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw==} + '@esbuild/win32-x64@0.28.2': + resolution: {integrity: sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -884,8 +916,8 @@ packages: resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/config-array@0.21.2': - resolution: {integrity: sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==} + '@eslint/config-array@0.21.1': + resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/config-helpers@0.4.2': @@ -896,12 +928,12 @@ packages: resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/eslintrc@3.3.5': - resolution: {integrity: sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==} + '@eslint/eslintrc@3.3.1': + resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.39.4': - resolution: {integrity: sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==} + '@eslint/js@9.39.1': + resolution: {integrity: sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.7': @@ -912,25 +944,20 @@ packages: resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@fastify/otel@0.18.0': - resolution: {integrity: sha512-3TASCATfw+ctICSb4ymrv7iCm0qJ0N9CarB+CZ7zIJ7KqNbwI5JjyDL1/sxoC0ccTO1Zyd1iQ+oqncPg5FJXaA==} - peerDependencies: - '@opentelemetry/api': ^1.9.0 - - '@floating-ui/core@1.7.5': - resolution: {integrity: sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==} + '@floating-ui/core@1.8.0': + resolution: {integrity: sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==} - '@floating-ui/dom@1.7.6': - resolution: {integrity: sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==} + '@floating-ui/dom@1.8.0': + resolution: {integrity: sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==} - '@floating-ui/react-dom@2.1.8': - resolution: {integrity: sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A==} + '@floating-ui/react-dom@2.1.9': + resolution: {integrity: sha512-JDjEFGCpImxDCA7JJKviA0M9+RtmJdj0m/NVU5IMgBK+AmZouAQQ7/+2GLH0GXXY0YMw9oXPB8hKdbPYg5QLYg==} peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' - '@floating-ui/utils@0.2.11': - resolution: {integrity: sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==} + '@floating-ui/utils@0.2.12': + resolution: {integrity: sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==} '@formatjs/intl-localematcher@0.6.2': resolution: {integrity: sha512-XOMO2Hupl0wdd172Y06h6kLpBz6Dv+J4okPLl4LPtzbr8f66WbIoy4ev98EBuZ6ZK4h5ydTN6XneT4QVpD7cdA==} @@ -939,33 +966,96 @@ packages: resolution: {integrity: sha512-MqO+MLfM6kjxcKoy0p1wRzG3b4ZZXtPI+z2IE26UogS2Cm/XHO+7gGRBh6gcJsOiIVoH93UwKvW4HdgiOZCy9Q==} engines: {node: '>=18.0.0'} - '@hono/node-server@1.19.11': - resolution: {integrity: sha512-dr8/3zEaB+p0D2n/IUrlPF1HZm586qgJNXK1a9fhg/PzdtkK7Ksd5l312tJX2yBuALqDYBlG20QEbayqPyxn+g==} - engines: {node: '>=18.14.1'} - peerDependencies: - hono: ^4 - - '@hono/node-server@1.19.14': - resolution: {integrity: sha512-GwtvgtXxnWsucXvbQXkRgqksiH2Qed37H9xHZocE5sA3N8O8O8/8FA3uclQXxXVzc9XBZuEOMK7+r02FmSpHtw==} - engines: {node: '>=18.14.1'} + '@hono/node-server@2.1.1': + resolution: {integrity: sha512-ELuehkj5VCBdgEw9zs+ivkKwyzzUCSQuE96YmiPvn1ECBoZCczbFXJLeEGMTYjphP6gydh4pHMqEYPVMYUVgQg==} + engines: {node: '>=20'} peerDependencies: hono: ^4 - '@hookform/resolvers@5.4.0': - resolution: {integrity: sha512-EIsqr/t/qbinPIhGjMdtvutIN1Kk4uwbROE9/UQ93CAVGR7GkA7Y92+fX80OzXi/OB67jVFYwKGO1WzkxmkFZw==} - peerDependencies: + '@hookform/resolvers@5.9.0': + resolution: {integrity: sha512-8sNo1IklGaONrsKzXjwZJNsPbccAXLXGX//G+VFEcQOviMtbvR8/fM6HWyA0qrjgpOYauwoodda53CQIWOZ7Ag==} + peerDependencies: + '@sinclair/typebox': '>=0.25.24' + '@standard-schema/spec': ^1.0.0 + '@typeschema/main': '>=0.13.7' + '@vinejs/vine': ^2.0.0 || ^3.0.0 || ^4.0.0 + ajv: ^8.12.0 + ajv-errors: ^3.0.0 + ajv-formats: ^2.1.1 + arktype: ^2.0.0 + ata-validator: ^1.2.0 + class-transformer: '>=0.4.0' + class-validator: '>=0.12.0' + computed-types: ^1.0.0 + effect: ^3.10.3 + fluentvalidation-ts: ^3.0.0 + fp-ts: ^2.7.0 + io-ts: ^2.0.0 + joi: ^17.0.0 || ^18.0.0 + nope-validator: '>=0.12.0' react-hook-form: ^7.55.0 + superstruct: '>=0.12.0' + typanion: ^3.3.2 + valibot: '>=0.31.0 || ^1.0.0-beta.4 || ^1.0.0-rc' + vest: '>=6.0.0' + yup: ^1.0.0 + zod: ^3.25.0 || ^4.0.0 + peerDependenciesMeta: + '@sinclair/typebox': + optional: true + '@standard-schema/spec': + optional: true + '@typeschema/main': + optional: true + '@vinejs/vine': + optional: true + ajv: + optional: true + ajv-errors: + optional: true + ajv-formats: + optional: true + arktype: + optional: true + ata-validator: + optional: true + class-transformer: + optional: true + class-validator: + optional: true + computed-types: + optional: true + effect: + optional: true + fluentvalidation-ts: + optional: true + fp-ts: + optional: true + io-ts: + optional: true + joi: + optional: true + nope-validator: + optional: true + superstruct: + optional: true + typanion: + optional: true + valibot: + optional: true + vest: + optional: true + yup: + optional: true + zod: + optional: true - '@humanfs/core@0.19.2': - resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==} - engines: {node: '>=18.18.0'} - - '@humanfs/node@0.16.8': - resolution: {integrity: sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==} + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} engines: {node: '>=18.18.0'} - '@humanfs/types@0.15.0': - resolution: {integrity: sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==} + '@humanfs/node@0.16.7': + resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} engines: {node: '>=18.18.0'} '@humanwhocodes/module-importer@1.0.1': @@ -979,8 +1069,8 @@ packages: '@iconify/types@2.0.0': resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} - '@iconify/utils@3.1.3': - resolution: {integrity: sha512-LPKOXPn/zV+zis1oOfGWogaXVpqUybF3ZS6SCZIsz8vg0ivVp9+fVqyYB7xq0aiST/VhUQYGO1qo6uoYSiEJqw==} + '@iconify/utils@3.1.4': + resolution: {integrity: sha512-b1S7B1k9ohZ+iNTi2ATxbRYG9fTrJmUT0rc46bvVnNxqNRGW7dyo/vRREwyniI5IRN2RSJHDcm+s3BjWrSAjHw==} '@img/colour@1.1.0': resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==} @@ -1119,41 +1209,6 @@ packages: cpu: [x64] os: [win32] - '@inquirer/ansi@2.0.5': - resolution: {integrity: sha512-doc2sWgJpbFQ64UflSVd17ibMGDuxO1yKgOgLMwavzESnXjFWJqUeG8saYosqKpHp4kWiM5x1nXvEjbpx90gzw==} - engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} - - '@inquirer/confirm@6.0.13': - resolution: {integrity: sha512-wkGPC7yJ5WJk1DJ5SX7fzk+gfj4BM8cf5dDDi71B/551xHrdsZVRJOC0WyikXd0pEsb/9cLniuE4atbsMqmFkw==} - engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} - peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true - - '@inquirer/core@11.1.10': - resolution: {integrity: sha512-a4Q5BXHQAHa9eO202sTaFCHFYVB3x5fauDuThEAdZ9gfn76pSxiKU7wWcEH0N1O0XmQvNfQNU6QXpiRxmYQx+A==} - engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} - peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true - - '@inquirer/figures@2.0.5': - resolution: {integrity: sha512-NsSs4kzfm12lNetHwAn3GEuH317IzpwrMCbOuMIVytpjnJ90YYHNwdRgYGuKmVxwuIqSgqk3M5qqQt1cDk0tGQ==} - engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} - - '@inquirer/type@4.0.5': - resolution: {integrity: sha512-aetVUNeKNc/VriqXlw1NRSW0zhMBB0W4bNbWRJgzRl/3d0QNDQFfk0GO5SDdtjMZVg6o8ZKEiadd7SCCzoOn5Q==} - engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} - peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true - '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} @@ -1173,17 +1228,14 @@ packages: '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} - '@kurkle/color@0.3.4': - resolution: {integrity: sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==} - '@mdx-js/mdx@3.1.1': resolution: {integrity: sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==} - '@mermaid-js/parser@1.1.1': - resolution: {integrity: sha512-VuHdsYMK1bT6X2JbcAaWAhugTRvRBRyuZgd+c22swUeI9g/ntaxF7CY7dYarhZovofCbUNO0G7JesfmNtjYOCw==} + '@mermaid-js/parser@1.2.0': + resolution: {integrity: sha512-oYPyv8A4As1yH5Bx+04iQEQxXuIQDe0GKCNSRgao6z8AM9jixXIfP0vsppRLvGf+nKIOb9/LdpWA4YuJiVvESA==} - '@modelcontextprotocol/sdk@1.29.0': - resolution: {integrity: sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ==} + '@modelcontextprotocol/sdk@1.30.0': + resolution: {integrity: sha512-xKd8OIzlqNzcqcNumGAa6g+PW2kjD5vrpcKOnfldAUPP3j7lnqMPwlTXQm8gF+UwH72z0lqaRbjr9hqGz0eITA==} engines: {node: '>=18'} peerDependencies: '@cfworker/json-schema': ^4.1.1 @@ -1192,15 +1244,18 @@ packages: '@cfworker/json-schema': optional: true - '@mswjs/interceptors@0.41.9': - resolution: {integrity: sha512-VVPPgHyQ6ShqnrmDWuxjmUIsO9gWyOZFmuOfLd9LfBGQJwZfy0gvv9pbHSJuoFNIYC7ZDX9aoFwowjcdSC4E8w==} - engines: {node: '>=18'} + '@napi-rs/lzma-linux-x64-gnu@1.5.1': + resolution: {integrity: sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==} + engines: {node: ^22.20 || ^24.12 || >=25} + cpu: [x64] + os: [linux] - '@napi-rs/wasm-runtime@1.1.4': - resolution: {integrity: sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==} + '@napi-rs/wasm-runtime@1.2.3': + resolution: {integrity: sha512-UMduMbqO5s5zF2NkNacMT/yK5Y5QiKvWr2+50bzIIxFDwVJ2h49b+oyjaCGPhJxd2/gC2x39EHv/gHVuu36x2Q==} + engines: {node: ^20.19.0 || ^22.13.0 || >=23.5.0} peerDependencies: - '@emnapi/core': ^1.7.1 - '@emnapi/runtime': ^1.7.1 + '@emnapi/core': ^1.7.1 || ^2.0.0-alpha.4 + '@emnapi/runtime': ^1.7.1 || ^2.0.0-alpha.4 '@next/env@15.5.18': resolution: {integrity: sha512-hAV85Ckd9QR6RvH04MEKwsfLTksvFpO47j9xwtoIuvuPnlwecpSi+uZTtm8HirVbtlI2Fnz//xpcSTjFdyJk+g==} @@ -1256,24 +1311,12 @@ packages: cpu: [x64] os: [win32] - '@noble/ciphers@1.3.0': - resolution: {integrity: sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==} - engines: {node: ^14.21.3 || >=16} - - '@noble/ciphers@2.2.0': - resolution: {integrity: sha512-Z6pjIZ/8IJcCGzb2S/0Px5J81yij85xASuk1teLNeg75bfT07MV3a/O2Mtn1I2se43k3lkVEcFaR10N4cgQcZA==} + '@noble/ciphers@2.3.0': + resolution: {integrity: sha512-Clu/xdfgVTf9o7ngLOURaxePwR0j8sjclKEtVij10/jGulwFsPWCvvRgG/XjUVf8Nei+jLG6uwyXzUTGY1DQrw==} engines: {node: '>= 20.19.0'} - '@noble/curves@1.9.7': - resolution: {integrity: sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==} - engines: {node: ^14.21.3 || >=16} - - '@noble/hashes@1.8.0': - resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} - engines: {node: ^14.21.3 || >=16} - - '@noble/hashes@2.2.0': - resolution: {integrity: sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg==} + '@noble/hashes@2.3.0': + resolution: {integrity: sha512-oN+QwyX7VSHotibwubG3kpzbwKrfnyR6OOO+3Nk/53ADL7FmgHHz4TgrbaYKvvOw09u6QTx0oiH1cNCIOuN0CQ==} engines: {node: '>= 20.19.0'} '@nodelib/fs.scandir@2.1.5': @@ -1292,206 +1335,60 @@ packages: resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} engines: {node: '>=12.4.0'} - '@open-draft/deferred-promise@2.2.0': - resolution: {integrity: sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==} - - '@open-draft/deferred-promise@3.0.0': - resolution: {integrity: sha512-XW375UK8/9SqUVNVa6M0yEy8+iTi4QN5VZ7aZuRFQmy76LRwI9wy5F4YIBU6T+eTe2/DNDo8tqu8RHlwLHM6RA==} - - '@open-draft/logger@0.3.0': - resolution: {integrity: sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==} - - '@open-draft/until@2.1.0': - resolution: {integrity: sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==} - - '@opentelemetry/api-logs@0.207.0': - resolution: {integrity: sha512-lAb0jQRVyleQQGiuuvCOTDVspc14nx6XJjP4FspJ1sNARo3Regq4ZZbrc3rN4b1TYSuUCvgH+UXUPug4SLOqEQ==} - engines: {node: '>=8.0.0'} - - '@opentelemetry/api-logs@0.212.0': - resolution: {integrity: sha512-TEEVrLbNROUkYY51sBJGk7lO/OLjuepch8+hmpM6ffMJQ2z/KVCjdHuCFX6fJj8OkJP2zckPjrJzQtXU3IAsFg==} - engines: {node: '>=8.0.0'} - - '@opentelemetry/api-logs@0.214.0': - resolution: {integrity: sha512-40lSJeqYO8Uz2Yj7u94/SJWE/wONa7rmMKjI1ZcIjgf3MHNHv1OZUCrCETGuaRF62d5pQD1wKIW+L4lmSMTzZA==} + '@opentelemetry/api-logs@0.220.0': + resolution: {integrity: sha512-CmVa4ImJ+ynfrPMNaAXHET6Bhb44SwzmfyVJFq9ni2jgXJR/l7C6gfVFddNmHP+ZOkP9cf4f9DBe68qVLTHc9w==} engines: {node: '>=8.0.0'} '@opentelemetry/api@1.9.1': resolution: {integrity: sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q==} engines: {node: '>=8.0.0'} - '@opentelemetry/core@2.6.1': - resolution: {integrity: sha512-8xHSGWpJP9wBxgBpnqGL0R3PbdWQndL1Qp50qrg71+B28zK5OQmUgcDKLJgzyAAV38t4tOyLMGDD60LneR5W8g==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.10.0' - - '@opentelemetry/core@2.7.1': - resolution: {integrity: sha512-QAqIj32AtK6+pEVNG7EOVxHdE06RP+FM5qpiEJ4RtDcFIqKUZHYhl7/7UY5efhwmwNAg7j8QbJVBLxMerc0+gw==} + '@opentelemetry/core@2.10.0': + resolution: {integrity: sha512-/wNZ8twnEQQA4HoHu22+vcsdru6pWPWxW+7w+FlxT6Id7PE/WIbZmVKkte+PF72e0F2dnImFeHD2syyE1Mw6MQ==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/instrumentation-amqplib@0.61.0': - resolution: {integrity: sha512-mCKoyTGfRNisge4br0NpOFSy2Z1NnEW8hbCJdUDdJFHrPqVzc4IIBPA/vX0U+LUcQqrQvJX+HMIU0dbDRe0i0Q==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-connect@0.57.0': - resolution: {integrity: sha512-FMEBChnI4FLN5TE9DHwfH7QpNir1JzXno1uz/TAucVdLCyrG0jTrKIcNHt/i30A0M2AunNBCkcd8Ei26dIPKdg==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-dataloader@0.31.0': - resolution: {integrity: sha512-f654tZFQXS5YeLDNb9KySrwtg7SnqZN119FauD7acBoTzuLduaiGTNz88ixcVSOOMGZ+EjJu/RFtx5klObC95g==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-fs@0.33.0': - resolution: {integrity: sha512-sCZWXGalQ01wr3tAhSR9ucqFJ0phidpAle6/17HVjD6gN8FLmZMK/8sKxdXYHy3PbnlV1P4zeiSVFNKpbFMNLA==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-generic-pool@0.57.0': - resolution: {integrity: sha512-orhmlaK+ZIW9hKU+nHTbXrCSXZcH83AescTqmpamHRobRmYSQwRbD0a1odc0yAzuzOtxYiHiXAnpnIpaSSY7Ow==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-graphql@0.62.0': - resolution: {integrity: sha512-3YNuLVPUxafXkH1jBAbGsKNsP3XVzcFDhCDCE3OqBwCwShlqQbLMRMFh1T/d5jaVZiGVmSsfof+ICKD2iOV8xg==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-hapi@0.60.0': - resolution: {integrity: sha512-aNljZKYrEa7obLAxd1bCEDxF7kzCLGXTuTJZ8lMR9rIVEjmuKBXN1gfqpm/OB//Zc2zP4iIve1jBp7sr3mQV6w==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-http@0.214.0': - resolution: {integrity: sha512-FlkDhZDRjDJDcO2LcSCtjRpkal1NJ8y0fBqBhTvfAR3JSYY2jAIj1kSS5IjmEBt4c3aWv+u/lqLuoCDrrKCSKg==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-kafkajs@0.23.0': - resolution: {integrity: sha512-4K+nVo+zI+aDz0Z85SObwbdixIbzS9moIuKJaYsdlzcHYnKOPtB7ya8r8Ezivy/GVIBHiKJVq4tv+BEkgOMLaQ==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-knex@0.58.0': - resolution: {integrity: sha512-Hc/o8fSsaWxZ8r1Yw4rNDLwTpUopTf4X32y4W6UhlHmW8Wizz8wfhgOKIelSeqFVTKBBPIDUOsQWuIMxBmu8Bw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-koa@0.62.0': - resolution: {integrity: sha512-uVip0VuGUQXZ+vFxkKxAUNq8qNl+VFlyHDh/U6IQ8COOEDfbEchdaHnpFrMYF3psZRUuoSIgb7xOeXj00RdwDA==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.9.0 - - '@opentelemetry/instrumentation-lru-memoizer@0.58.0': - resolution: {integrity: sha512-6grM3TdMyHzlGY1cUA+mwoPueB1F3dYKgKtZIH6jOFXqfHAByyLTc+6PFjGM9tKh52CFBJaDwodNlL/Td39z7Q==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-mongodb@0.67.0': - resolution: {integrity: sha512-1WJp5N1lYfHq2IhECOTewFs5Tf2NfUOwQRqs/rZdXKTezArMlucxgzAaqcgp3A3YREXopXTpXHsxZTGHjNhMdQ==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-mongoose@0.60.0': - resolution: {integrity: sha512-8BahAZpKsOoc+lrZGb7Ofn4g3z8qtp5IxDfvAVpKXsEheQN7ONMH5djT5ihy6yf8yyeQJGS0gXFfpEAEeEHqQg==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-mysql2@0.60.0': - resolution: {integrity: sha512-m/5d3bxQALllCzezYDk/6vajh0tj5OijMMvOZGr+qN1NMXm1dzMNwyJ0gNZW7Fo3YFRyj/jJMxIw+W7d525dlw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-mysql@0.60.0': - resolution: {integrity: sha512-08pO8GFPEIz2zquKDGteBZDNmwketdgH8hTe9rVYgW9kCJXq1Psj3wPQGx+VaX4ZJKCfPeoLMYup9+cxHvZyVQ==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-pg@0.66.0': - resolution: {integrity: sha512-KxfLGXBb7k2ueaPJfq2GXBDXBly8P+SpR/4Mj410hhNgmQF3sCqwXvUBQxZQkDAmsdBAoenM+yV1LhtsMRamcA==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-tedious@0.33.0': - resolution: {integrity: sha512-Q6WQwAD01MMTub31GlejoiFACYNw26J426wyjvU7by7fDIr2nZXNW4vhTGs7i7F0TnXBO3xN688g1tdUgYwJ5w==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation@0.207.0': - resolution: {integrity: sha512-y6eeli9+TLKnznrR8AZlQMSJT7wILpXH+6EYq5Vf/4Ao+huI7EedxQHwRgVUOMLFbe7VFDvHJrX9/f4lcwnJsA==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation@0.212.0': - resolution: {integrity: sha512-IyXmpNnifNouMOe0I/gX7ENfv2ZCNdYTF0FpCsoBcpbIHzk81Ww9rQTYTnvghszCg7qGrIhNvWC8dhEifgX9Jg==} + '@opentelemetry/instrumentation@0.220.0': + resolution: {integrity: sha512-xQx3E2WxP1mDvKzxLxX+CTCtNLa560YJZ3087qYHerl2YmiKpv7AH+dAy7vmx+eVrZ5BwhfWUAVoKOoxCNHcpw==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation@0.214.0': - resolution: {integrity: sha512-MHqEX5Dk59cqVah5LiARMACku7jXSVk9iVDWOea4x3cr7VfdByeDCURK6o1lntT1JS/Tsovw01UJrBhN3/uC5w==} + '@opentelemetry/resources@2.10.0': + resolution: {integrity: sha512-q6MMm2zhggzsHVNbabYwut+a6nbuQQe3URUoxaojM/8K1IBfwwPzvxIjNi2/lI1TFe+fMHMW9MWhrtDLEXEnkA==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: - '@opentelemetry/api': ^1.3.0 + '@opentelemetry/api': '>=1.3.0 <1.10.0' - '@opentelemetry/resources@2.7.1': - resolution: {integrity: sha512-DeT6KKolmC4e/dRQvMQ/RwlnzhaqeiFOXY5ngoOPJ07GgVVKxZOg9EcrNZb5aTzUn+iCrJldAgOfQm1O/QfPAQ==} + '@opentelemetry/sdk-trace-base@2.10.0': + resolution: {integrity: sha512-GuYQQT7QD2EeO8lcZLRQzcbOyhqAzL+6WWTKTU9mSUBYBazkEDl+VrQcXQhbB08OWM9anD1aHleVadzulpOaUQ==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': '>=1.3.0 <1.10.0' - '@opentelemetry/sdk-trace-base@2.7.1': - resolution: {integrity: sha512-NAYIlsF8MPUsKqJMiDQJTMPOmlbawC1Iz/omMLygZ1C9am8fTKYjTaI+OZM+WTY3t3Glo0wnOg/6/pac6RGPPw==} + '@opentelemetry/sdk-trace@2.10.0': + resolution: {integrity: sha512-MfQGq3GRmTh5fM/y+OjaO0vj6+luCB1XO2gfXCalKCfgKw0eHL++sm75DNweC6ohlp+aFvACqeE0fYayqdRaoQ==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': '>=1.3.0 <1.10.0' - '@opentelemetry/semantic-conventions@1.41.1': - resolution: {integrity: sha512-/UhIkaZgPutTFmQ7RnIJGgDXZmtEJ7Dvi86xNTFWcnRxVRNk/aotsqDJYeEvDP+FSMB2SdW+pQzNMcWP0rwuNA==} + '@opentelemetry/semantic-conventions@1.43.0': + resolution: {integrity: sha512-eSYWTm620tTk45EKSedaUL8MFYI8hW164hIXsgIHyxu3VobUB3fFCu5t0hQby6OoWRPsG1KkKUG2M5UadiLiVg==} engines: {node: '>=14'} - '@opentelemetry/sql-common@0.41.2': - resolution: {integrity: sha512-4mhWm3Z8z+i508zQJ7r6Xi7y4mmoJpdvH0fZPFRkWrdp5fq7hhZ2HhYokEOLkfqSMgPR4Z9EyB3DBkbKGOqZiQ==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.1.0 - '@orama/orama@3.1.18': resolution: {integrity: sha512-a61ljmRVVyG5MC/698C8/FfFDw5a8LOIvyOLW5fztgUXqUpc1jOfQzOitSCbge657OgXXThmY3Tk8fpiDb4UcA==} engines: {node: '>= 20.0.0'} - '@prisma/adapter-pg@7.8.0': - resolution: {integrity: sha512-ygb3UkerK3v8MDpXVgCISdRNDozpxh6+JVJgiIGbSr5KBgz10LLf5ejUskPGoXlsIjxsOu6nuy1JVQr2EKGSlg==} + '@prisma/adapter-pg@7.9.1': + resolution: {integrity: sha512-Ho2RK1KanQxLNSC0sR5bpiiVep10sWPLXCcxK+KXfI/Q69TMRbiafSvLPv3V9snimX72rMCqGlyJ4sBO4lKTAw==} - '@prisma/client-runtime-utils@7.8.0': - resolution: {integrity: sha512-5NQZztQ0oY/ADFkmd9gPuweH5A1/CCY8YQPorLLO0Mu6a87mY5gsnDkzmFmIHs9NFaLnZojzgddFVN4RpKYrdw==} + '@prisma/client-runtime-utils@7.9.1': + resolution: {integrity: sha512-mVIBGYdO5CFmK0HvjxrtfIyQQcPdb88pSCeVQriVQPVZyDovIWblpHfOgcS8QO187j3QF0ePArH8qPhp0AU2vg==} - '@prisma/client@7.8.0': - resolution: {integrity: sha512-HFp3Dawv/3sU3JtlPha90IB+48lS7zHiH4LKZPjmcE8YH5P9DOXGPvo8dqOtO7MqLDd1p2hOWMcFlRT1DMblHw==} + '@prisma/client@7.9.1': + resolution: {integrity: sha512-+xgrh2EhJVF79wC0yX5G4PI1Rdcm7Qn/nekNQ+t/O153wtNggruHal+fXHSa0QE+Tp/Cw5wvxeCEhZZ59xGm8Q==} engines: {node: ^20.19 || ^22.12 || >=24.0} peerDependencies: prisma: '*' @@ -1502,64 +1399,62 @@ packages: typescript: optional: true - '@prisma/config@7.8.0': - resolution: {integrity: sha512-HFESzd9rx2ZQxlK+TL7tu1HPvCqrHiL6LCxYykI2c34mvaUuIVVl3lYuicJD/MNnzgPnyeBEMlK4WTomJCV5jw==} + '@prisma/config@7.9.1': + resolution: {integrity: sha512-4znKhxTmXmuPye9Z6pbIyYb5VZlkZ05qG1L6Dr4g+7oTwc6V50Bs9XirFBDdjWt+H/AabMn9aUnxBcvj8z05aA==} '@prisma/debug@7.2.0': resolution: {integrity: sha512-YSGTiSlBAVJPzX4ONZmMotL+ozJwQjRmZweQNIq/ER0tQJKJynNkRB3kyvt37eOfsbMCXk3gnLF6J9OJ4QWftw==} - '@prisma/debug@7.8.0': - resolution: {integrity: sha512-p+QZReysDUqXC+mk17q9a+Y/qzh4c2KYliDK30buYUyfrGeTGSyfmc0AIrJRhZJrLHhRiJa9Au/J72h3C+szvA==} + '@prisma/debug@7.9.1': + resolution: {integrity: sha512-/cpVZ4itxtcgB8GHBvZtcmuEjq+lWsLrRJxFMbwZrT1RIdtuKmUm7PPGo/wzfbYpBrk+9WmmBE8CHJw2rybKDQ==} - '@prisma/dev@0.24.3': - resolution: {integrity: sha512-ffHlQuKXZiaDt9Go0OnCTdJZrHxK0k7omJKNV86/VjpsXu5EIHZLK0T7JSWgvNlJwh56kW9JFu9v0qJciFzepg==} + '@prisma/dev@0.24.17': + resolution: {integrity: sha512-UvdZzmpFwknnfreh6Jije84ekkYGPYEJhXG1tFzCsCfQyzJifrOo38eZc0qajzvaC6OLUOrN9ML5XfCnEZL9DA==} - '@prisma/driver-adapter-utils@7.8.0': - resolution: {integrity: sha512-/Q13o0ZT0rjc1Xk0Q9KhZYwuq2EW/vSbWUBKfgEKkaCuB/Sg6bqnjmTZqC5cD4d6y1vfFAEwBRzfzoSMIVJ55A==} + '@prisma/driver-adapter-utils@7.9.1': + resolution: {integrity: sha512-vmHehG7nn/heW32DXXpp13DxxAxVVe6n250oEt3dOL2E/4bt3olktKZN0mzSuxMMronyMSkbeW2uCOn3F4g8RQ==} - '@prisma/engines-version@7.8.0-6.3c6e192761c0362d496ed980de936e2f3cebcd3a': - resolution: {integrity: sha512-fJPQxCkLgA5EayWaW8eArgCvjJ+N+Kz3VyeNKMEeYiQC4alNkxRKFVAGxv/ZUzuJISKqdw+zGeDbS6mn6RCPOA==} + '@prisma/engines-version@7.9.0-1.e922089b7d7502aff4249d5da3420f6fa55fc6ad': + resolution: {integrity: sha512-2BsPPFksz3CQUXG6af3rVCtJKg6+JJGJTtfgu2fU8DdXhOfkBjulCq8mwybCd6ge0/jhZq2kOtLAbmUDMyI1nA==} - '@prisma/engines@7.8.0': - resolution: {integrity: sha512-jx3rCnNNrt5uzbkKlegtQ2GZHxSlihMCzutgT/BP6UIDF1r9tDI39hV/0T/cHZgzJ3ELbuQPXlVZy+Y1n0pcgw==} + '@prisma/engines@7.9.1': + resolution: {integrity: sha512-UprXSMNXx2NF5ow4pqaQtE8OuBz6K78B0wc0tn2L28G5r933iWp1DR9Do2qWrsNvvFIP3x6mpEWnQtckMO0Uhg==} - '@prisma/fetch-engine@7.8.0': - resolution: {integrity: sha512-gwB0Euiz/DDRyxFRpLXYlK3RfaZUj1c5dAYMuhZYfApg7arknJlcb9bIsOHDppJmbqYaVA+yBIiFMDBfprsNPQ==} + '@prisma/fetch-engine@7.9.1': + resolution: {integrity: sha512-9DwxrNTeT25Orbu9CWh0CZvVlyY1lmscpbaeLZcOnuR7zcuFrt91YSmmOfIm7zJ08YOZ6mVzURKwLoMwEBcK8w==} '@prisma/get-platform@7.2.0': resolution: {integrity: sha512-k1V0l0Td1732EHpAfi2eySTezyllok9dXb6UQanajkJQzPUGi3vO2z7jdkz67SypFTdmbnyGYxvEvYZdZsMAVA==} - '@prisma/get-platform@7.8.0': - resolution: {integrity: sha512-WlxgRGnolL8VH2EmkH1R/DkKNr/mVdS3G2h42IZFFZ3eUrH9OT6t73kIOSlkkrv50wG123Iq8d96ufv5LlZktw==} - - '@prisma/instrumentation@7.6.0': - resolution: {integrity: sha512-ZPW2gRiwpPzEfgeZgaekhqXrbW+Y2RJKHVqUmlhZhKzRNCcvR6DykzylDrynpArKKRQtLxoZy36fK7U0p3pdgQ==} - peerDependencies: - '@opentelemetry/api': ^1.8 + '@prisma/get-platform@7.9.1': + resolution: {integrity: sha512-PK8R60YZRQvYxBrGG9i7l2/rFyzy+2MuI1dKtmtrCqPH8YpiJx/MfiC7LRzX5786rZDEv7BngcjfIJW4/9ADuw==} '@prisma/query-plan-executor@7.2.0': resolution: {integrity: sha512-EOZmNzcV8uJ0mae3DhTsiHgoNCuu1J9mULQpGCh62zN3PxPTd+qI9tJvk5jOst8WHKQNwJWR3b39t0XvfBB0WQ==} - '@prisma/streams-local@0.1.2': - resolution: {integrity: sha512-l49yTxKKF2odFxaAXTmwmkBKL3+bVQ1tFOooGifu4xkdb9NMNLxHj27XAhTylWZod8I+ISGM5erU1xcl/oBCtg==} - engines: {bun: '>=1.3.6', node: '>=22.0.0'} + '@prisma/streams-local@0.1.11': + resolution: {integrity: sha512-0TcebL559MByKqTJ+SsrFIEg228iw8UCVRFckzgfRSiJqczhs+MuAgWOF9lnOIV/IVqvu+KMnFTH0eDeTQMpUg==} + engines: {bun: '>=1.2.0', node: '>=22.0.0'} - '@prisma/studio-core@0.27.3': - resolution: {integrity: sha512-AADjNFPdsrglxHQVTmHFqv6DuKQZ5WY4p5/gVFY017twvNrSwpLJ9lqUbYYxEu2W7nbvVxTZA8deJ8LseNALsw==} + '@prisma/studio-core@0.33.0': + resolution: {integrity: sha512-V2fX/nKEymNTrHXwfP26PGjoLStO35Ogu+ex7CFJbLrMYEcZxxZpiSNOs7px23Hk5mzLWvM5RsqG6Ka+rha+wg==} engines: {node: ^20.19 || ^22.12 || >=24.0, pnpm: '8'} peerDependencies: '@types/react': ^18.0.0 || ^19.0.0 react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - '@radix-ui/number@1.1.1': - resolution: {integrity: sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==} + '@radix-ui/number@1.1.3': + resolution: {integrity: sha512-Road2bidD0uu/1BGDOWNdPI06g0lIRy6IF9GZcIrDK2KGItfor8IQwQa+yM2ERgHM1MmHxaxpTzk0/Jp42lNfA==} '@radix-ui/primitive@1.1.3': resolution: {integrity: sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==} - '@radix-ui/react-accessible-icon@1.1.7': - resolution: {integrity: sha512-XM+E4WXl0OqUJFovy6GjmxxFyx9opfCAIUku4dlKRd5YEPqt4kALOkQOp0Of6reHuUkJuiPBEc5k0o4z4lTC8A==} + '@radix-ui/primitive@1.1.7': + resolution: {integrity: sha512-rqWnm76nYT8HoNNqEjpgJ7Pw/DrBj5iBTrmEPo6HTX5+VJyBNOqTdv4g89G63HuR5g0AaENoAcH7Is5fF2kZ8Q==} + + '@radix-ui/react-accessible-icon@1.1.15': + resolution: {integrity: sha512-WTQwcAvQf5sOcuUyi90lKPbhwcvQ+j55cjrSmeaN+L2vKU3DooOvlKw2MDeiJ5IkV5N905KW0/fGojKOBhD11A==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1571,8 +1466,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-accordion@1.2.12': - resolution: {integrity: sha512-T4nygeh9YE9dLRPhAHSeOZi7HBXo+0kYIPJXayZfvWOWA0+n3dESrZbjfDPUABkUNym6Hd+f2IR113To8D2GPA==} + '@radix-ui/react-accordion@1.2.20': + resolution: {integrity: sha512-jDhG9FvAEnlhnjrsINbNXcUa4G+L1KqSkJSunkbKEzFRcAb52jvM0PjPxPRvhe1HNc5F5yc0yzzWeeqlH4yBIg==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1584,8 +1479,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-alert-dialog@1.1.15': - resolution: {integrity: sha512-oTVLkEw5GpdRe29BqJ0LSDFWI3qu0vR1M0mUkOQWDIUnY/QIkLpgDMWuKxP94c2NAC2LGcgVhG1ImF3jkZ5wXw==} + '@radix-ui/react-alert-dialog@1.1.23': + resolution: {integrity: sha512-VAYOiQRqj3GPpYJE0I9J+X8Ip05cyVlNdKOFeiGS2Ou1HHGfpl0BxOyZm6nmVDyU+W+NF3/XLzmjHmVGydhwgA==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1597,8 +1492,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-arrow@1.1.7': - resolution: {integrity: sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==} + '@radix-ui/react-arrow@1.1.15': + resolution: {integrity: sha512-v4zggRcjadnI+ClKDuijlQEW4tw3NoaeHc/PwpKnLoLLKNUG4InLegkstooLcRIUWCs+8L22dGURCVuFfOKfnA==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1610,8 +1505,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-aspect-ratio@1.1.7': - resolution: {integrity: sha512-Yq6lvO9HQyPwev1onK1daHCHqXVLzPhSVjmsNjCa2Zcxy2f7uJD2itDtxknv6FzAKCwD1qQkeVDmX/cev13n/g==} + '@radix-ui/react-aspect-ratio@1.1.15': + resolution: {integrity: sha512-fy+dyVR+90nelK8rqIznFlxzx7uPcGbhxH8Nfr2bHb4UfSe+e3hklOC0luK0hDwVwnRX7xTRySpsrQVeW+/oNQ==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1623,8 +1518,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-avatar@1.1.10': - resolution: {integrity: sha512-V8piFfWapM5OmNCXTzVQY+E1rDa53zY+MQ4Y7356v4fFz6vqCyUtIz2rUD44ZEdwg78/jKmMJHj07+C/Z/rcog==} + '@radix-ui/react-avatar@1.2.6': + resolution: {integrity: sha512-4ULOTJ/mqy2hT9GlWa/MFHxHSvH3nJzHnZM1waNsc5Bonv7i70aNenghXmD97S6OJ81ekXONGGt4nT1r0PfEdA==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1636,8 +1531,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-checkbox@1.3.3': - resolution: {integrity: sha512-wBbpv+NQftHDdG86Qc0pIyXk5IR3tM8Vd0nWLKDcX8nNn4nXFOFwsKuqw2okA/1D/mpaAkmuyndrPJTYDNZtFw==} + '@radix-ui/react-checkbox@1.3.11': + resolution: {integrity: sha512-Gnptr9pDDQxD3hgq2dtPbtrp/c2qH1mBwIzw3X/ivrMb2e1t0jMTi606fVEqFPaQR1ggXIVQWKj3P2WW9v7zGQ==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1649,8 +1544,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-collapsible@1.1.12': - resolution: {integrity: sha512-Uu+mSh4agx2ib1uIGPP4/CKNULyajb3p92LsVXmH2EHVMTfZWpll88XJ0j4W0z3f8NK1eYl1+Mf/szHPmcHzyA==} + '@radix-ui/react-collapsible@1.1.20': + resolution: {integrity: sha512-mcGesGplBnzN2sbvJETzpCNfSMyPnb29q1GRLU+Ib7bJrpIG2ywmRoh2V5VbA2uNvKikKUlVbAPks7JDjz4A8Q==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1662,8 +1557,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-collection@1.1.7': - resolution: {integrity: sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==} + '@radix-ui/react-collection@1.1.15': + resolution: {integrity: sha512-9W+B9NPF0NaaPh/1NJd3+KqsnlLqU9H7T2rvww+fp+T/evVXdNAyYcnfRQZFOjkR1ajQp3yORlqnI8soawLvNA==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1684,8 +1579,17 @@ packages: '@types/react': optional: true - '@radix-ui/react-context-menu@2.2.16': - resolution: {integrity: sha512-O8morBEW+HsVG28gYDZPTrT9UUovQUlJue5YO836tiTJhuIWBm/zQHc7j388sHWtdH/xUZurK9olD2+pcqx5ww==} + '@radix-ui/react-compose-refs@1.1.5': + resolution: {integrity: sha512-+48PbAAbq3didjJxa+OaWY2ZwgAKsNiRGyeHKszblZMQ+kcpd9pAaT11cMkGEie0vsOi3QdeTE6d5Fe3Gn61kA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-context-menu@2.3.7': + resolution: {integrity: sha512-CtXP35dxaB5T3zXSd+E3uHe/QpXcpYnZmxp6OaIbfthtfW4wyb77M23BG+bwIJDtsMwEP/YssdsmNyZu7jhWew==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1697,8 +1601,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-context@1.1.2': - resolution: {integrity: sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==} + '@radix-ui/react-context@1.2.2': + resolution: {integrity: sha512-RHCUGwKHDr0hDGg4X7ma4JG4/+12qxw8rkh5QKdDldlCvtja6nUx1Ef/8HVrJze81lEsgLQlqjzjGNHantgnQA==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -1706,8 +1610,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-dialog@1.1.15': - resolution: {integrity: sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==} + '@radix-ui/react-dialog@1.1.23': + resolution: {integrity: sha512-Ksw4WeROkO4rC9k/onilX/Ao2Cr1ku1unMNH+XSCcP4jSXYu7HDsg9n4ojMjVb22XpYjAQ9qfrFlVbru1vXDUA==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1719,8 +1623,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-direction@1.1.1': - resolution: {integrity: sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==} + '@radix-ui/react-direction@1.1.4': + resolution: {integrity: sha512-5pzg4FGQNpExhnhT2zlrP1wZFaYCd1K0nYWoFAdcYoYK868IEigqMX3B3f8yIoRlAhAeDWciLI6ZdCKHF9P4Vg==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -1728,8 +1632,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-dismissable-layer@1.1.11': - resolution: {integrity: sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==} + '@radix-ui/react-dismissable-layer@1.1.19': + resolution: {integrity: sha512-8g4pfOL9HoKKLWGiypT+dphVqjFfmcXO5GBnhsG6zI+lxAx/8feQpr+1LSN8Re3hiZ+XkLNS4O9ztK11/LzQ6w==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1741,8 +1645,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-dropdown-menu@2.1.16': - resolution: {integrity: sha512-1PLGQEynI/3OX/ftV54COn+3Sud/Mn8vALg2rWnBLnRaGtJDduNW/22XjlGgPdpcIbiQxjKtb7BkcjP00nqfJw==} + '@radix-ui/react-dropdown-menu@2.1.24': + resolution: {integrity: sha512-geq8l2rJkxvkXsT9RMgtUE3P8pITFpTsvYpbySi1IH4fZEABD/Gp85myayFgxk0ktljGMJnCbeFkyTusvSvv7g==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1754,8 +1658,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-focus-guards@1.1.3': - resolution: {integrity: sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==} + '@radix-ui/react-focus-guards@1.1.6': + resolution: {integrity: sha512-RNOJjfZMTyBM6xYmV3IVGXkPjIhcBAuv48POevAXwrGJhkWZ9p1rFoIS1JFooPuT193AZmRsCPhpoVJxx6OPoQ==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -1763,8 +1667,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-focus-scope@1.1.7': - resolution: {integrity: sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==} + '@radix-ui/react-focus-scope@1.1.16': + resolution: {integrity: sha512-wmRZ2WWLvmt6KHy2rNPOdPUjwq5xOHY02+m+udwJTn0aNIox/rkskAvJTyTLGhPK6KgrUjlJUJpgmx/+wFiFIQ==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1776,8 +1680,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-form@0.1.8': - resolution: {integrity: sha512-QM70k4Zwjttifr5a4sZFts9fn8FzHYvQ5PiB19O2HsYibaHSVt9fH9rzB0XZo/YcM+b7t/p7lYCT/F5eOeF5yQ==} + '@radix-ui/react-form@0.1.16': + resolution: {integrity: sha512-Q4TLEn2A7TAypxwmd6R9EwrlXDvkfYSDMrq9/887AXAGh+G1rH+kYJKSTv+Si9Y0JPKTwKYv6PviAJosysNimA==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1789,8 +1693,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-hover-card@1.1.15': - resolution: {integrity: sha512-qgTkjNT1CfKMoP0rcasmlH2r1DAiYicWsDsufxl940sT2wHNEWWv6FMWIQXWhVdmC1d/HYfbhQx60KYyAtKxjg==} + '@radix-ui/react-hover-card@1.1.23': + resolution: {integrity: sha512-H8qONfZd3ltrU3+jHCIgITbWo6e1iTKvP9DHdrvYbX48ooRM5FjEDTn16AMwdfuOGkWdZEhpl3PLL/Wk/AnHDQ==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1802,8 +1706,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-id@1.1.1': - resolution: {integrity: sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==} + '@radix-ui/react-id@1.1.4': + resolution: {integrity: sha512-TMQp2llA+RYn7JcjnrMnz7wN4pcVttPZnRZo52PLQsoLVKzNlVwUeHmfePgTgRluXFvlD3GD5g5MOVVTJCO0qA==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -1811,8 +1715,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-label@2.1.7': - resolution: {integrity: sha512-YT1GqPSL8kJn20djelMX7/cTRp/Y9w5IZHvfxQTVHrOqa2yMl7i/UfMqKRU5V7mEyKTrUVgJXhNQPVCG8PBLoQ==} + '@radix-ui/react-label@2.1.15': + resolution: {integrity: sha512-o/rdYEwZTTo5tjknnPeyQFU45kUC4i/XyeDPP+HGyi6XqpOP6Zf5Ya5vh/Yfe9Id5JiuWnnAx2XqIeD3UYZt0g==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1824,8 +1728,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-menu@2.1.16': - resolution: {integrity: sha512-72F2T+PLlphrqLcAotYPp0uJMr5SjP5SL01wfEspJbru5Zs5vQaSHb4VB3ZMJPimgHHCHG7gMOeOB9H3Hdmtxg==} + '@radix-ui/react-menu@2.1.24': + resolution: {integrity: sha512-uW7RVuU6Lp/ZtfeY4b3kL32zccgEWvPv1+cf17ubYzHa9cL8AHokmk36cG/XEiH/smbQvumnieXX9j/e9RqJWA==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1837,8 +1741,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-menubar@1.1.16': - resolution: {integrity: sha512-EB1FktTz5xRRi2Er974AUQZWg2yVBb1yjip38/lgwtCVRd3a+maUoGHN/xs9Yv8SY8QwbSEb+YrxGadVWbEutA==} + '@radix-ui/react-menubar@1.1.24': + resolution: {integrity: sha512-eeVs0vf7cuqXaM0qLQCPcufImiJNVBXdJDLu7ZGYl2732UH23Qat/foNGrr6vYV3/DdTsBqASoggUFgH14OcZA==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1850,8 +1754,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-navigation-menu@1.2.14': - resolution: {integrity: sha512-YB9mTFQvCOAQMHU+C/jVl96WmuWeltyUEpRJJky51huhds5W2FQr1J8D/16sQlf0ozxkPK8uF3niQMdUwZPv5w==} + '@radix-ui/react-navigation-menu@1.2.22': + resolution: {integrity: sha512-ou7iLEJ+yrhQndkkA4U21XIdS/CS45F4iXIkTZcb6/Ne9EMsOuDudVmCwmDnfFZZ+y1FZqXRNSIgBy+YMvZVZg==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1863,8 +1767,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-one-time-password-field@0.1.8': - resolution: {integrity: sha512-ycS4rbwURavDPVjCb5iS3aG4lURFDILi6sKI/WITUMZ13gMmn/xGjpLoqBAalhJaDk8I3UbCM5GzKHrnzwHbvg==} + '@radix-ui/react-one-time-password-field@0.1.16': + resolution: {integrity: sha512-Tj9P6ntAJEw52oq/F0AGknXR4XncxEt7XU47O3xJQOiWfLzEy3d9gtgKfvjSzGxzHkfL+VzvxGu2KTFsloJqXw==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1876,8 +1780,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-password-toggle-field@0.1.3': - resolution: {integrity: sha512-/UuCrDBWravcaMix4TdT+qlNdVwOM1Nck9kWx/vafXsdfj1ChfhOdfi3cy9SGBpWgTXwYCuboT/oYpJy3clqfw==} + '@radix-ui/react-password-toggle-field@0.1.11': + resolution: {integrity: sha512-4gvFnmDXu3dgj21CqsufzIameRvlRd4SBqaWhcrlrNhRo0Y5i/49AmRJYe1fdAM3G2VNBbmin4b0D6cdQocwgw==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1889,8 +1793,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-popover@1.1.15': - resolution: {integrity: sha512-kr0X2+6Yy/vJzLYJUPCZEc8SfQcf+1COFoAqauJm74umQhta9M7lNJHP7QQS3vkvcGLQUbWpMzwrXYwrYztHKA==} + '@radix-ui/react-popover@1.1.23': + resolution: {integrity: sha512-mw58MrBlyHWFisTOYignD0vf/3gdcgAR+9of1s9G/38CbFiUwH1nCDkc0AUM9IrXFgN5Ue8n45j9WCgyM1sbiQ==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1902,8 +1806,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-popper@1.2.8': - resolution: {integrity: sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==} + '@radix-ui/react-popper@1.3.7': + resolution: {integrity: sha512-UsJrrd7w4wuKKTdvd/DNERVlwSlUcyXzjhyDwBk+3aPOsCjOY6ZSbxuw8E6lZTjjfP8Cpd0J8VVkrYUWyGYXyg==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1915,8 +1819,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-portal@1.1.9': - resolution: {integrity: sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==} + '@radix-ui/react-portal@1.1.17': + resolution: {integrity: sha512-vKQLcWypUnwZVvfV7UkGahH2g6ySe8M8R+zYBwPrv5byZ9QAW6cQVvNKo7GgmD+p8aYb6D9JBuvy8/WhOno2wQ==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1928,8 +1832,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-presence@1.1.5': - resolution: {integrity: sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==} + '@radix-ui/react-presence@1.1.10': + resolution: {integrity: sha512-3wyzCQ6+ubRA+D4uv9m95JYLXxmOHp05qjrkjeA7uKHHtjpPggQzc6DAb0URl7j67oR0K2foO4ip27TiX037Bw==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1941,8 +1845,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-primitive@2.1.3': - resolution: {integrity: sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==} + '@radix-ui/react-primitive@2.1.10': + resolution: {integrity: sha512-MucOnzh6hR5mid6VpkbglRAMYMjKLqRnGBbjXkzjK52fuQDd1qbkx78a5P40mkcnVXJdEVxm26E9OPAiUq7nBg==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1954,8 +1858,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-primitive@2.1.4': - resolution: {integrity: sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==} + '@radix-ui/react-primitive@2.1.3': + resolution: {integrity: sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1967,8 +1871,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-progress@1.1.7': - resolution: {integrity: sha512-vPdg/tF6YC/ynuBIJlk1mm7Le0VgW6ub6J2UWnTQ7/D23KXcPI1qy+0vBkgKgd38RCMJavBXpB83HPNFMTb0Fg==} + '@radix-ui/react-progress@1.1.16': + resolution: {integrity: sha512-5XnomAsoZZCY+KNTxbIghpGqPruZvKFNlvcAljVAOdDRDsH4/OZQxhtwo5wdtoDM5R6MhJBb2sPnDuRFep3lzg==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1980,8 +1884,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-radio-group@1.3.8': - resolution: {integrity: sha512-VBKYIYImA5zsxACdisNQ3BjCBfmbGH3kQlnFVqlWU4tXwjy7cGX8ta80BcrO+WJXIn5iBylEH3K6ZTlee//lgQ==} + '@radix-ui/react-radio-group@1.4.7': + resolution: {integrity: sha512-cgYFEkntCxppHZgtSZ+7vh0wbZQ+IC7PPMw8DSnRG27B6kDd32/Zw0OJt7dGDigCoprMuWHjg2PvUn3PYvPFoQ==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1993,8 +1897,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-roving-focus@1.1.11': - resolution: {integrity: sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==} + '@radix-ui/react-roving-focus@1.1.19': + resolution: {integrity: sha512-V9jI6hDjT7l3jsCQD9bLNvDLM3tH/gdbOTp7Tefp3hbbgCGQoK7tUvrWiRlcoBHIZ809ElXwNQwVo0B98LuTXQ==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -2006,8 +1910,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-scroll-area@1.2.10': - resolution: {integrity: sha512-tAXIa1g3sM5CGpVT0uIbUx/U3Gs5N8T52IICuCtObaos1S8fzsrPXG5WObkQN3S6NVl6wKgPhAIiBGbWnvc97A==} + '@radix-ui/react-scroll-area@1.2.18': + resolution: {integrity: sha512-Zn5Cd171wxsO3Dfg8HaW6RifTb9CYTKQJHs/G4+LN1GfmJpaQMZQyQxMprVPHpaz7QY4l9BxK2JwQuzHsXC8nA==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -2019,8 +1923,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-select@2.2.6': - resolution: {integrity: sha512-I30RydO+bnn2PQztvo25tswPH+wFBjehVGtmagkU78yMdwTwVf12wnAOF+AeP8S2N8xD+5UPbGhkUfPyvT+mwQ==} + '@radix-ui/react-select@2.3.7': + resolution: {integrity: sha512-WFGImkmbzcfxeIwq/+4HvRN0pizBwbwQUED4I13ezQsDdfl38ZntN6TmR8XaSzPBqoCToe8rF75j6NPNDSzhbg==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -2032,8 +1936,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-separator@1.1.7': - resolution: {integrity: sha512-0HEb8R9E8A+jZjvmFCy/J4xhbXy3TV+9XSnGJ3KvTtjlIUy/YQ/p6UYZvi7YbeoeXdyU9+Y3scizK6hkY37baA==} + '@radix-ui/react-separator@1.1.15': + resolution: {integrity: sha512-jOLO4lssEzWpoDu7G+Ze4VjwMRUBt291pnZD0gmalREZipnTX3wadQo7Fy48GCTfe14/YRN6rw/rOJqrE85Wxw==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -2045,8 +1949,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-slider@1.3.6': - resolution: {integrity: sha512-JPYb1GuM1bxfjMRlNLE+BcmBC8onfCi60Blk7OBqi2MLTFdS+8401U4uFjnwkOr49BLmXxLC6JHkvAsx5OJvHw==} + '@radix-ui/react-slider@1.4.7': + resolution: {integrity: sha512-mTSLf1GC/C0moWjTbvCM6Qn/gBjvlFt1azuWF2v7MN5C3Zq2U2J2lN3ZEYkpujuOU5Ro7A28wkviSxaKnG0BYg==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -2067,8 +1971,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-slot@1.2.4': - resolution: {integrity: sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==} + '@radix-ui/react-slot@1.3.3': + resolution: {integrity: sha512-qx7oqnYbxnK9kYI9m317qmFmEgo6ywqWvbTogdj7cL9p3/yx4M48p7Rnw5z3H890cL/ow/EeWJsuTykeZVXP5Q==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -2076,8 +1980,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-switch@1.2.6': - resolution: {integrity: sha512-bByzr1+ep1zk4VubeEVViV592vu2lHE2BZY5OnzehZqOOgogN80+mNtCqPkhn2gklJqOpxWgPoYTSnhBCqpOXQ==} + '@radix-ui/react-switch@1.3.7': + resolution: {integrity: sha512-48tB/4dn2UVLBCYhTu9AuR63IHl73l/qLbLgxd86noTUor4/K4LFDAcYjK+isP5313qxaFpjPVogE7+Y0/V3Kw==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -2089,8 +1993,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-tabs@1.1.13': - resolution: {integrity: sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A==} + '@radix-ui/react-tabs@1.1.21': + resolution: {integrity: sha512-UKxJlZid7FVtsk/WTxj4i4uSEgj2Au+KBbS7SQyTlzMhhn+86Cz3tISZdTa87bfEfcuvZezf2ZsxD4xuEKtkog==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -2102,8 +2006,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-toast@1.2.15': - resolution: {integrity: sha512-3OSz3TacUWy4WtOXV38DggwxoqJK4+eDkNMl5Z/MJZaoUPaP4/9lf81xXMe1I2ReTAptverZUpbPY4wWwWyL5g==} + '@radix-ui/react-toast@1.2.23': + resolution: {integrity: sha512-ofhyAsYaocRGOs/n0XWdUOSVzEAG6BfrMVM8z0c0kLEWY38w/0WuMFPTJP/HVaZPYkMvHZoKIIhNcjbTCBILPg==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -2115,8 +2019,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-toggle-group@1.1.11': - resolution: {integrity: sha512-5umnS0T8JQzQT6HbPyO7Hh9dgd82NmS36DQr+X/YJ9ctFNCiiQd6IJAYYZ33LUwm8M+taCz5t2ui29fHZc4Y6Q==} + '@radix-ui/react-toggle-group@1.1.19': + resolution: {integrity: sha512-OtnwuSVjd1Ofi+AdnvhsjQdyuhCDwYs1w9RyB5BN/OavXOVQo42SYqQjwUnbPnaiPFBpQ9aX70dWeee+v2oBLA==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -2141,8 +2045,21 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-toolbar@1.1.11': - resolution: {integrity: sha512-4ol06/1bLoFu1nwUqzdD4Y5RZ9oDdKeiHIsntug54Hcr1pgaHiPqHFEaXI1IFP/EsOfROQZ8Mig9VTIRza6Tjg==} + '@radix-ui/react-toggle@1.1.18': + resolution: {integrity: sha512-7lonPlKfSacd20GlOBx2ltuVKz9oqWYZz+oMQyOltw6t1y2nyftj2ZmwwUHYn49kqfDWcp8dNZm5NgV+5Z+mug==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-toolbar@1.1.19': + resolution: {integrity: sha512-Ph0IvtYw4VB12ZnZg+YtrGs8yJQsnizwo/zu0R4Y/nWugtJzA7Pg1eWeuDR9+LSqn+xjamss+UOSOJJJ4gx8jw==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -2154,8 +2071,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-tooltip@1.2.8': - resolution: {integrity: sha512-tY7sVt1yL9ozIxvmbtN5qtmH2krXcBCfjEiCgKGLqunJHvgvZG2Pcl2oQ3kbcZARb1BGEHdkLzcYGO8ynVlieg==} + '@radix-ui/react-tooltip@1.2.16': + resolution: {integrity: sha512-6EamKFRRnlpdadndbZ6LMwycfwkwPte1B42hs6QA0gYhjaOKqW4PZ4pjaW9UrlDX5eVt/OjncE7BFTPL5nmZhg==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -2167,8 +2084,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-use-callback-ref@1.1.1': - resolution: {integrity: sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==} + '@radix-ui/react-use-callback-ref@1.1.4': + resolution: {integrity: sha512-R6OUY2e2fA6Yn6s+VSx5KBV6Nx8LQEhu+cz7LCej18rQ1HLyg9PSC9jP/ZNx0o6FAIK9c0F1kHylzSxKsdlkrQ==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -2185,6 +2102,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-use-controllable-state@1.2.6': + resolution: {integrity: sha512-uEQJGT97ZA/TgP/Hydw47lHu+/vQj6z/0jA+WeTbK1o9Rx45GImjpD0tc3W5ad3D6XTSR6e1yEO0FvGq6WQfVQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-use-effect-event@0.0.2': resolution: {integrity: sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==} peerDependencies: @@ -2194,8 +2120,17 @@ packages: '@types/react': optional: true - '@radix-ui/react-use-escape-keydown@1.1.1': - resolution: {integrity: sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==} + '@radix-ui/react-use-effect-event@0.0.5': + resolution: {integrity: sha512-7cshFL8HGS/7HEiHH+9kL9HBwp2sa9yX18Knwek6KYWmXwM7pegMgta2AXMQKI+rq3JnfSj9x8wYqFMTdG1Jgg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-escape-keydown@1.1.5': + resolution: {integrity: sha512-ge3ipobwSXTj4JyVtswQ7qZj0ZHdtbGuOno/LrgAAeSxtsJ6Vs4Gz5IkPH2bmqpjcLUFoqGhA/mueuIf63UXlA==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -2203,8 +2138,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-use-is-hydrated@0.1.0': - resolution: {integrity: sha512-U+UORVEq+cTnRIaostJv9AGdV3G6Y+zbVd+12e18jQ5A3c0xL03IhnHuiU4UV69wolOQp5GfR58NW/EgdQhwOA==} + '@radix-ui/react-use-is-hydrated@0.1.3': + resolution: {integrity: sha512-umO/aJ+82CpOnhDZUTbILCQf7kU/g0iv+oGs/Q8jw7IkhWBzaEP4sA268PhFAJTFetbwp3ICc6ktpI4TqtxcIw==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -2221,8 +2156,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-use-previous@1.1.1': - resolution: {integrity: sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==} + '@radix-ui/react-use-layout-effect@1.1.4': + resolution: {integrity: sha512-K20DkRkUwDnxEYMBPcg3Y6voLkEy5p5QQmszZgLngKKiC7dzBR/aEuK3w1qlx2JWDUNH6FluahYdgR3BP+QbYw==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -2230,8 +2165,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-use-rect@1.1.1': - resolution: {integrity: sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==} + '@radix-ui/react-use-previous@1.1.4': + resolution: {integrity: sha512-XoSLhbRbqxFtgJoi2fNHA3C6pDlY34x508vUpUGoFZfvePfHXHbE1lC4FYFMnJWgiCRroSTw6fOsXQoVS9RwZg==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -2239,8 +2174,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-use-size@1.1.1': - resolution: {integrity: sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==} + '@radix-ui/react-use-rect@1.1.4': + resolution: {integrity: sha512-cSOCh6JlkmfjLyNcLiu2nB4v+nm+dkZ+Q5KHWk/soo4U7ZLiEQFKHK9/YmtBHjfCEaU43IBKQOc4/uJmCaiCTQ==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -2248,8 +2183,17 @@ packages: '@types/react': optional: true - '@radix-ui/react-visually-hidden@1.2.3': - resolution: {integrity: sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==} + '@radix-ui/react-use-size@1.1.4': + resolution: {integrity: sha512-D3anSY15EJoxrihpsXI6SMrmmonnQtR2ni7arO+Lfdg3O95b9hNXxONk8jA5C8ANdF/h5HMAxejgs8PWJ6rlhw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-visually-hidden@1.2.11': + resolution: {integrity: sha512-NFS86RYYZb4/exihaESBGOpMJFz8MGLAfu3mOBSGByVnVPC9JPASfYubxd/8KbkQK0sYAv8lVQDEQukDX/qXvQ==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -2261,8 +2205,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/rect@1.1.1': - resolution: {integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==} + '@radix-ui/rect@1.1.3': + resolution: {integrity: sha512-JtyZR+mqgBibTo8xea3B6ZRmzZiM/YeVBtUkas6zMuXjAlfIFIW2FgqeM9eLyvEaYX66vr6DJMK+4U6LV0KhNw==} '@react-email/body@0.3.0': resolution: {integrity: sha512-uGo0BOOzjbMUo3lu+BIDWayvn5o6Xyfmnlla5VGf05n8gHMvO1ll7U4FtzWe3hxMLwt53pmc4iE0M+B5slG+Ug==} @@ -2383,8 +2327,8 @@ packages: react: ^18.0 || ^19.0 || ^19.0.0-rc react-dom: ^18.0 || ^19.0 || ^19.0.0-rc - '@react-email/render@2.0.8': - resolution: {integrity: sha512-5udvVr3U/WuGJZfLdLBOhkzrqRWd2Q5ZYmF7ppcy7FzWcwgshdqLMNqJOXcVzAXJXg/2bm7D+WGJzTtZOZMQnQ==} + '@react-email/render@2.1.0': + resolution: {integrity: sha512-F+zE3O6d6sW6Aj2UjvZAA17R7tJKM7kcq2mgV6k4HCT8jeLLFaVP2txMtH1lgqYFRMZ0Gxsd37q2PRyiXLXXxA==} engines: {node: '>=20.0.0'} peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc @@ -2470,8 +2414,8 @@ packages: rollup: optional: true - '@rollup/pluginutils@5.3.0': - resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} + '@rollup/pluginutils@5.4.0': + resolution: {integrity: sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg==} engines: {node: '>=14.0.0'} peerDependencies: rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 @@ -2479,128 +2423,128 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.60.4': - resolution: {integrity: sha512-F5QXMSiFebS9hKZj02XhWLLnRpJ3B3AROP0tWbFBSj+6kCbg5m9j5JoHKd4mmSVy5mS/IMQloYgYxCuJC0fxEQ==} + '@rollup/rollup-android-arm-eabi@4.62.4': + resolution: {integrity: sha512-RrPokAb7dmbxFoeO3TloqHyOjgye8RkBhSqmp4aJMIex4c9r46ZstPnleDQOq1t46VOVjwIuwNogIqbodV1Vvg==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.60.4': - resolution: {integrity: sha512-GxxTKApUpzRhof7poWvCJHRF51C67u1R7D6DiluBE8wKU1u5GWE8t+v81JvJYtbawoBFX1hLv5Ei4eVjkWokaw==} + '@rollup/rollup-android-arm64@4.62.4': + resolution: {integrity: sha512-JKuJc+pnpks2pjy7L/N3v/cAkZxYlnmuZoD840ldbMI5KDbC4iO9NKwPKYdjYFCMAIIlBzYSFHxIJVYzRo2/8A==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.60.4': - resolution: {integrity: sha512-tua0TaJxMOB1R0V0RS1jFZ/RpURFDJIOR2A6jWwQeawuFyS4gBW+rntLRaQd0EQ4bd6Vp44Z2rXW+YYDBsj6IA==} + '@rollup/rollup-darwin-arm64@4.62.4': + resolution: {integrity: sha512-krw5uS2STmvJ02x0uTXHbqQNuz+9eZ1iw+qXk9dmW2gvV4jV7O2hEoOnuhFrpOPiel1mBFtqbxYZZtC46hXLOw==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.60.4': - resolution: {integrity: sha512-CSKq7MsP+5PFIcydhAiR1K0UhEI1A2jWXVKHPCBZ151yOutENwvnPocgVHkivu2kviURtCEB6zUQw0vs8RrhMg==} + '@rollup/rollup-darwin-x64@4.62.4': + resolution: {integrity: sha512-wsTxtgApb4PrOsNJIm0FZ1h3WvCC+k9uxLJ4ad75hgoS4NiRes2SoJFlDAyMwiUY8IssDqGcHbXuN0sx1tfF1A==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.60.4': - resolution: {integrity: sha512-+O8OkVdyvXMtJEciu2wS/pzm1IxntEEQx3z5TAVy4l32G0etZn+RsA48ARRrFm6Ri8fvqPQfgrvNxSjKAbnd3g==} + '@rollup/rollup-freebsd-arm64@4.62.4': + resolution: {integrity: sha512-GUOnQlyZe3yAXhWOtOMsn5Qkrv5E5mZXa0thbARWi5Ei2szlVXJFQhddZ4HbAzh8q92w5twp+CQvs/eFanz9YQ==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.60.4': - resolution: {integrity: sha512-Iw3oMskH3AfNuhU0MSN7vNbdi4me/NiYo2azqPz/Le16zHSa+3RRmliCMWWQmh4lcndccU40xcJuTYJZxNo/lw==} + '@rollup/rollup-freebsd-x64@4.62.4': + resolution: {integrity: sha512-/Y7f3QuxjzPKsjA/rfEDa3+0vXqyjmJ50Ln8dPpCmWkKTrUoWHG1cWhTqaAMLob2m2nESWuC7yGrREz019Ztqg==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.60.4': - resolution: {integrity: sha512-EIPRXTVQpHyF8WOo219AD2yEltPehLTcTMz2fn6JsatLYSzQf00hj3rulF+yauOlF9/FtM2WpkT/hJh/KJFGhA==} + '@rollup/rollup-linux-arm-gnueabihf@4.62.4': + resolution: {integrity: sha512-81wiiX3v7aqy+T+bT61TJ78yJjRquqFFTTbAPt08imfQQzkPIW8t6aJbkTagtCCrXMNc9D66+geqlK7ydLPNqA==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.60.4': - resolution: {integrity: sha512-J3Yh9PzzF1Ovah2At+lHiGQdsYgArxBbXv/zHfSyaiFQEqvNv7DcW98pCrmdjCZBrqBiKrKKe2V+aaSGWuBe/w==} + '@rollup/rollup-linux-arm-musleabihf@4.62.4': + resolution: {integrity: sha512-9kmDIvNZqdoHOBZgNtpTBeLWYO/LVipM3H/j62P8848/l/VPEQL6N3uxU9pvP1oZAsXyC2MEnFP3ovRjo7WYNQ==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.60.4': - resolution: {integrity: sha512-BFDEZMYfUvLn37ONE1yMBojPxnMlTFsdyNoqncT0qFq1mAfllL+ATMMJd8TeuVMiX84s1KbcxcZbXInmcO2mRg==} + '@rollup/rollup-linux-arm64-gnu@4.62.4': + resolution: {integrity: sha512-CcnXHWnXg69g+DX5VWL3FHts3qMRN2uVEHX+BZvGLdd07/gXkn3ePjYtO1LDJvxkGKVHMclKBRa1QUTH+6toYQ==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.60.4': - resolution: {integrity: sha512-pc9EYOSlOgdQ2uPl1o9PF6/kLSgaUosia7gOuS8mB69IxJvlclko1MECXysjs5ryez1/5zjYqx3+xYU0TU6R1A==} + '@rollup/rollup-linux-arm64-musl@4.62.4': + resolution: {integrity: sha512-iFOibiHnTRuhrWLlRsOQFdZJJIa7S8OwkneJr4ocALP16u5yk6lWLINFwhHaEqBFMsKDUZofLkGos7+CPzGB3g==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loong64-gnu@4.60.4': - resolution: {integrity: sha512-NxnomyxYerDh5n4iLrNa+sH+Z+U4BMEE46V2PgQ/hoB909i8gV1M5wPojWg9fk1jWpO3IQnOs20K4wyZuFLEFQ==} + '@rollup/rollup-linux-loong64-gnu@4.62.4': + resolution: {integrity: sha512-XnWYMI7euHlb5a871xPja+Gm7DRCFU+FGRrtS2sMq9N8FvqtpagUy6gD4YOemC5MRk9xbh8+jYMEJbigFQwsgA==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-loong64-musl@4.60.4': - resolution: {integrity: sha512-nbJnQ8a3z1mtmrwImCYhc6BGpThAyYVRQxw9uKSKG4wR6aAYno9sVjJ0zaZcW9BPJX1GbrDPf+SvdWjgTuDmnw==} + '@rollup/rollup-linux-loong64-musl@4.62.4': + resolution: {integrity: sha512-qGDAlO0U8xedCcsdRm9oaoQY8DAx/QT7uIxJWhCdx0ceIWX783UC9QSYkdpzAe29wNiVfp24+bZdQmn49o45SQ==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-ppc64-gnu@4.60.4': - resolution: {integrity: sha512-2EU6acNrQLd8tYvo/LXW535wupT3m6fo7HKo6lr7ktQoItxTyOL1ZCR/GfGCuXl2vR+zmfI6eRXkSemafv+iVg==} + '@rollup/rollup-linux-ppc64-gnu@4.62.4': + resolution: {integrity: sha512-ru4H6ezD7ysA5EiEK6qkkaEb4modH8CTej6kUy/gQi20u3kB3G7Zn8snXXkeJSCOFKG/rbPPtM/+9Wgas1961w==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-ppc64-musl@4.60.4': - resolution: {integrity: sha512-WeBtoMuaMxiiIrO2IYP3xs6GMWkJP2C0EoT8beTLkUPmzV1i/UcOSVw1d5r9KBODtHKilG5yFxsGRnBbK3wJ4A==} + '@rollup/rollup-linux-ppc64-musl@4.62.4': + resolution: {integrity: sha512-2W4MO5WQVJnbJaZdvDb9rhBDuFU1nKIepPFpJUBsTh2k1YY2g+ODViaWuyOAjQ5cOP7NvrvLzt3wvHOoiAvc7w==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.60.4': - resolution: {integrity: sha512-FJHFfqpKUI3A10WrWKiFbBZ7yVbGT4q4B5o1qKFFojqpaYoh9LrQgqWCmmcxQzVSXYtyB5bzkXrYzlHTs21MYA==} + '@rollup/rollup-linux-riscv64-gnu@4.62.4': + resolution: {integrity: sha512-+fxjfuoAmVMCYV5QyjoIpu0cp5DOiOTeqYFk1AVaxGr+/ravWLX89XfQmptsoWcaVy/TGf2hexzbUOrCQIL1CQ==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.60.4': - resolution: {integrity: sha512-mcEl6CUT5IAUmQf1m9FYSmVqCJlpQ8r8eyftFUHG8i9OhY7BkBXSUdnLH5DOf0wCOjcP9v/QO93zpmF1SptCCw==} + '@rollup/rollup-linux-riscv64-musl@4.62.4': + resolution: {integrity: sha512-jTn8JfHGL4djjFxPuM06LmNUJDsst2jeVlsd9OmIH6zc5sC9K6rIuO4YajXatLUpBmBKl6b35ro1QZocLi+tcA==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.60.4': - resolution: {integrity: sha512-ynt3JxVd2w2buzoKDWIyiV1pJW93xlQic1THVLXilz429oijRpSHivZAgp65KBu+cMcgf1eVVjdnTLvPxgCuoQ==} + '@rollup/rollup-linux-s390x-gnu@4.62.4': + resolution: {integrity: sha512-oCJCJL4pXsoDcP2QZ+JVlPTIRc6266zsIaeJJsWImmF7HO0W8nb6HuSgZlMWxJwaPf8ehbSw8yo0EUw925hKsA==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.60.4': - resolution: {integrity: sha512-Boiz5+MsaROEWDf+GGEwF8VMHGhlUoQMtIPjOgA5fv4osupqTVnJteQNKJwUcnUog2G55jYXH7KZFFiJe0TEzQ==} + '@rollup/rollup-linux-x64-gnu@4.62.4': + resolution: {integrity: sha512-W69hukhZ3KKNRCaMIEzKvcFye42hh0FE1+YoYaf5+Ikacuftoco6yO/xouz0hc5d5W/s3yBro5jRiuEE/Q5vUw==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.60.4': - resolution: {integrity: sha512-+qfSY27qIrFfI/Hom04KYFw3GKZSGU4lXus51wsb5EuySfFlWRwjkKWoE9emgRw/ukoT4Udsj4W/+xxG8VbPKg==} + '@rollup/rollup-linux-x64-musl@4.62.4': + resolution: {integrity: sha512-qiXbGG2jkjXhzXpsFZSR2Xpb8DN/UaxYsbb/STbuR/6fpaDgRmmaq1B/LmtF2wQFOFOSsK2jdE0RZ3a0zHn4QA==} cpu: [x64] os: [linux] - '@rollup/rollup-openbsd-x64@4.60.4': - resolution: {integrity: sha512-VpTfOPHgVXEBeeR8hZ2O0F3aSso+JDWqTWmTmzcQKted54IAdUVbxE+j/MVxUsKa8L20HJhv3vUezVPoquqWjA==} + '@rollup/rollup-openbsd-x64@4.62.4': + resolution: {integrity: sha512-nWeM//hxv8mIo6jD7Hu4o48DVmV9pbV6gsKaWU+4NFyqHoPKwrkRiZGLKUhOBk8qNmDmpwFtPKg80Bo/Tn4xiQ==} cpu: [x64] os: [openbsd] - '@rollup/rollup-openharmony-arm64@4.60.4': - resolution: {integrity: sha512-IPOsh5aRYuLv/nkU51X10Bf75Bsf6+gZdx1X+QP5QM6lIJFHHqbHLG0uJn/hWthzo13UAc2umiUorqZy3axoZg==} + '@rollup/rollup-openharmony-arm64@4.62.4': + resolution: {integrity: sha512-s62SQ/vgsRSvMwDkOEfTqfgASF0f26ZNaQuTA6Aok5lrikf89yI2W0gFHvZb2Jpgc6N8JnOKZgCK2iciO3CsxQ==} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.60.4': - resolution: {integrity: sha512-4QzE9E81OohJ/HKzHhsqU+zcYYojVOXlFMs1DdyMT6qXl/niOH7AVElmmEdUNHHS/oRkc++d5k6Vy85zFs0DEw==} + '@rollup/rollup-win32-arm64-msvc@4.62.4': + resolution: {integrity: sha512-J6wGf8TVGbXJq+HH+ttTvrcfNKPbuZecV6KT1B8I18BC5IURUh5kl4Yl5OEP5eFIUoI5BWxCsyYMhFsDx8kekw==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.60.4': - resolution: {integrity: sha512-zTPgT1YuHHcd+Tmx7h8aml0FWFVelV5N54oHow9SLj+GfoDy/huQ+UV396N/C7KpMDMiPspRktzM1/0r1usYEA==} + '@rollup/rollup-win32-ia32-msvc@4.62.4': + resolution: {integrity: sha512-zmfrQd/0wu6oJs8Vq8KwY/YtsKSsLtKe/HwAP4Wqy8LhWjeT55fHRAkOhYQ12wI3ayS4Tt12d5CDRD7N96SAYQ==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.60.4': - resolution: {integrity: sha512-DRS4G7mi9lJxqEDezIkKCaUIKCrLUUDCUaCsTPCi/rtqaC6D/jjwslMQyiDU50Ka0JKpeXeRBFBAXwArY52vBw==} + '@rollup/rollup-win32-x64-gnu@4.62.4': + resolution: {integrity: sha512-qPzHqdj9rfUD+w79dtE07zi/kFwKyCJqplp5K5ygeLTp7jLpAoc16OAH39HSmRC9UpozaecsleI8uAdEj6v2yw==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.60.4': - resolution: {integrity: sha512-QVTUovf40zgTqlFVrKA1uXMVvU2QWEFWfAH8Wdc48IxLvrJMQVMBRjuQyUpzZCDkakImib9eVazbWlC6ksWtJw==} + '@rollup/rollup-win32-x64-msvc@4.62.4': + resolution: {integrity: sha512-zD6NdeWEByGE9QF9vCrlJ5YQB4oq9q91kPZS37Jwj5hOkvR1lTBSpsKhKDw4IJtbQ35LsTS1HD9DZYGKIshU1Q==} cpu: [x64] os: [win32] @@ -2616,34 +2560,34 @@ packages: '@selderee/plugin-htmlparser2@0.11.0': resolution: {integrity: sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==} - '@sentry-internal/browser-utils@10.53.1': - resolution: {integrity: sha512-X4d6y8sBMjmNhcDW4eMBU3ASsNIMz8dqaFkhyIMN/dkYr/yZKnbRZPaVuVUGvHKjnlficPpIH0/HK9KBjrYxPw==} - engines: {node: '>=18'} - - '@sentry-internal/feedback@10.53.1': - resolution: {integrity: sha512-vVpTI/aEYN5d9IgZeYJWMqVaN0+iFgidSrYNAsZTh1US5sJUzF/wrl+68KdpmCtFROrN3jiAn1oPSwL5CKvEJA==} - engines: {node: '>=18'} - - '@sentry-internal/replay-canvas@10.53.1': - resolution: {integrity: sha512-aueLaf/2prExwA76BGU5/bOXCKWqtt6jQXWA6WJQNrmKpPEtZJB4ypnpsou0McXQCF8tur2Y8U0TEkwQP13yJQ==} - engines: {node: '>=18'} - - '@sentry-internal/replay@10.53.1': - resolution: {integrity: sha512-wZNzTBYkgGUPWMuUQv7L64+OJmoCnz7GQNiTrTFK6EVAjJXFBCSsPp/nhif0bLhbk8+0g4xz633uOhpXuQbFdw==} - engines: {node: '>=18'} - '@sentry/babel-plugin-component-annotate@5.3.0': resolution: {integrity: sha512-p4q8gn8wcFqZGP/s2MnJCAAd8fTikaU6A0mM97RDHQgStcrYiaS0Sc5zUNfb1V+UOLPuvdEdL6MwyxfzjYJQTA==} engines: {node: '>= 18'} - '@sentry/browser@10.53.1': - resolution: {integrity: sha512-zXF373hzUOGzUOrqd8xb1U3LQi5uYC3mwv+z5OMKUUinQlu30tTWBs7ypy6YTchtix9QlYaHWlayUF8vBZ5UjA==} + '@sentry/browser-utils@10.70.0': + resolution: {integrity: sha512-IvjhafF5NFXrPCg5EHbAPGDwIhHxgUcLlHTklZ3DAdA6ky88BJYMfevbcnOEmgavf4nylhCaquRUFNB5+szj+A==} + engines: {node: '>=18'} + + '@sentry/browser@10.70.0': + resolution: {integrity: sha512-IK6+J+8H06tZe+A8L37TT5ZxxwNtyQatW8zl5RYYJ/e9CsjrM8fPi8I1OT7uquTw8UtjqFHt7bEef/Vy63ksPg==} engines: {node: '>=18'} '@sentry/bundler-plugin-core@5.3.0': resolution: {integrity: sha512-L5T60sWdAI3qWwdg3Ptwek/0TY59PERrxyqp4XMUkroayQvGd9r5dIW9Q1kSeXX9iJ442nXbFZKAOyCKV4Z13Q==} engines: {node: '>= 18'} + '@sentry/bundler-plugins@10.70.0': + resolution: {integrity: sha512-M+a32VOZVeTUxF+QecQ+OHYj8hb5FeppKwwWpTQ9cfS6ixgoNUK7/B7NhB2XbfxE3F1BcGvOxyS+AB+fvPfSRQ==} + engines: {node: '>= 18'} + peerDependencies: + rollup: '>=3.2.0' + webpack: '>=5.0.0' + peerDependenciesMeta: + rollup: + optional: true + webpack: + optional: true + '@sentry/cli-darwin@2.58.6': resolution: {integrity: sha512-udAVvcyfNa0R+95GvPz/+43/N3TC0TYKdkQ7D7jhPSzbcMc7l2fxRNN5yB3UpCA5fWFnW4toeaqwDBhb/Wh3LA==} engines: {node: '>=10'} @@ -2696,18 +2640,26 @@ packages: engines: {node: '>= 10'} hasBin: true - '@sentry/core@10.53.1': - resolution: {integrity: sha512-XG4ezlkyuAPjBC5+9kXC94rXXuqYTw9NRhfaDHssbTFaGnqBR8vQX2UUgZfY7ucbeelRDGfBu1sywoU+mB04uA==} + '@sentry/conventions@0.16.0': + resolution: {integrity: sha512-fO9PLmHdVURcSPUpWCItWAtgKiMwGdJHbovoSEyLplX5sxs2ugvI4CBPTrkkgqhObnZOD0CnWBKDzSVQYBKEyQ==} + engines: {node: '>=14'} + + '@sentry/core@10.70.0': + resolution: {integrity: sha512-ozhCTDqg89oB4XmWfAwuHshABpvT7AkRpaPnogopPfMAaI61G1t8EKCJ4W7aum8JSBonlfyjPCyW5oYZFm0KvA==} + engines: {node: '>=18'} + + '@sentry/feedback@10.70.0': + resolution: {integrity: sha512-6VQn2ETJjHkk4QQDdx/587/JDfXsk3yBTLZ3UZOMtBVrkmwgk+1FJZ8ULJ3ud1xZcuh2icunIkc7tGVv2axdnw==} engines: {node: '>=18'} - '@sentry/nextjs@10.53.1': - resolution: {integrity: sha512-pkwqrpAG//LtW5W1Odud0PLLT+rnjDjodUEbScULHVaZE6/Gt+WGBMZmtzpNM+UwhsN19/4PyO7ocLTx/IFrkQ==} + '@sentry/nextjs@10.70.0': + resolution: {integrity: sha512-HL6hoEARpdL/NH3uIQ/O9BczP5P3QLSWerQgv8C4/vZl3JPQOWmFsJEN0F8/dU4+OFqlPz3P52InZjaYO3MA+w==} engines: {node: '>=18'} peerDependencies: next: ^13.2.0 || ^14.0 || ^15.0.0-rc.0 || ^16.0.0-0 - '@sentry/node-core@10.53.1': - resolution: {integrity: sha512-iH7SMcM/7jPbN+t7+7ussQOiIqI4BMOGt4VYWlV71/z7k0pY+YPaSvlfVkNXfISiDzFAKv0ecCY3BmsLMu1xDQ==} + '@sentry/node-core@10.70.0': + resolution: {integrity: sha512-oPOEVVNxv5WHtckx2i06Wi9FLWyvOg/1DUeX732jZ4iqT2nupINaMH4nF4f4kSvUThFnxkFSRQxwqOxgzMKhKA==} engines: {node: '>=18'} peerDependencies: '@opentelemetry/api': ^1.9.0 @@ -2715,7 +2667,6 @@ packages: '@opentelemetry/exporter-trace-otlp-http': '>=0.57.0 <1' '@opentelemetry/instrumentation': '>=0.57.1 <1' '@opentelemetry/sdk-trace-base': ^1.30.1 || ^2.1.0 - '@opentelemetry/semantic-conventions': ^1.39.0 peerDependenciesMeta: '@opentelemetry/api': optional: true @@ -2727,34 +2678,43 @@ packages: optional: true '@opentelemetry/sdk-trace-base': optional: true - '@opentelemetry/semantic-conventions': - optional: true - '@sentry/node@10.53.1': - resolution: {integrity: sha512-rxHVil0tJAmz+keFcZCj1LaUdgdkK66E/l0gqh2p1209PNCGoD3lnClFr6vusy1aF3zF8O9JPtuMEJzXOKhs+w==} + '@sentry/node@10.70.0': + resolution: {integrity: sha512-SPOOVxmKTVIEtqvOKkQT163e/pOwucjS7OPsCHyRs8sFR4nfBNu0EThplyqnvqd5BWBMTPH6WTBQfo+QWHV+HA==} engines: {node: '>=18'} - '@sentry/opentelemetry@10.53.1': - resolution: {integrity: sha512-Zok6UXla0mFOjd1YnVb1TZtQNOry9v93fXUqx8jmDaygwWM2BwvP8rBQabLz0/OZXo8+35oge+Vmw+QY5aesnA==} + '@sentry/opentelemetry@10.70.0': + resolution: {integrity: sha512-UNV/2tqypcUK6FDzerAsFJn1Km/c4VZCYkUZDNbnV5S0cwAq2BYKMo4M5vovaLDBQlxA+Wk9ovbxi5wYjjl9fw==} engines: {node: '>=18'} peerDependencies: '@opentelemetry/api': ^1.9.0 '@opentelemetry/core': ^1.30.1 || ^2.1.0 '@opentelemetry/sdk-trace-base': ^1.30.1 || ^2.1.0 - '@opentelemetry/semantic-conventions': ^1.39.0 - '@sentry/react@10.53.1': - resolution: {integrity: sha512-lrwNq5T/zW84l60894TpKHPcvFuc1I/Hnohecc0TfYVpIcYYuw2orCHoU4v4wgkFaJUpegVetbgdOphViyLVjA==} + '@sentry/react@10.70.0': + resolution: {integrity: sha512-j1d/4hvoaUVKs5GRrfmwUCkiEmkfaeHsk+xgausZlzg5YvmwpF+gyevBLNP26GFEH7nyHXW4l8dbbo0eNieJmw==} engines: {node: '>=18'} peerDependencies: react: ^16.14.0 || 17.x || 18.x || 19.x - '@sentry/vercel-edge@10.53.1': - resolution: {integrity: sha512-waIOoLfhi1V3xEBJ1s1hpmvvgvcorYfsfm7fQGye0PgVjcBsZUqz32N5iEwkZ2Gz3n4ZOQYibDUqARJi9tOBcw==} + '@sentry/replay-canvas@10.70.0': + resolution: {integrity: sha512-irzpw22bK5CF3jbecDa0gBUcfjv7tgeUoLAvtIfeHOP5ajmf3o4Cp99a9RQqkfgvkcMeRZBUwE91SQhp6Ank+w==} + engines: {node: '>=18'} + + '@sentry/replay@10.70.0': + resolution: {integrity: sha512-xMnSGzJn9Xd29rYd32lkx/gFW+5mtgqADJ2FiZvis0MBGZuDlNRwPn0/Cs1xA3JNXKV3NGfhdmmvs90w4dHSmw==} engines: {node: '>=18'} - '@sentry/webpack-plugin@5.3.0': - resolution: {integrity: sha512-i3OQUrS0FZlXLgq57RIKDp+vHHzuvYKPCKewAPXULWKMsBXFGhP6veGRQ+6To/pmZkkXjEX5ofVNDy9C3jEPKQ==} + '@sentry/server-utils@10.70.0': + resolution: {integrity: sha512-rzegZjMFFgCp3o+N8+XU13rfSvz4B+f8rU0ijBGrQcHdMNyfsFDTu1UTm262JofmrV2u+s+D0u0vFTnqtOGkbA==} + engines: {node: '>=18'} + + '@sentry/vercel-edge@10.70.0': + resolution: {integrity: sha512-RJgatvWPLq7fm8tTiwH8oQ0TyHPzn4kr9kXFjqTsUsbnVyfZm4/jZ88V0vP05y/GHh/WjLQAGNqOajR9scduZA==} + engines: {node: '>=18'} + + '@sentry/webpack-plugin@5.4.0': + resolution: {integrity: sha512-J3a0BvUZ75Qxy+v/Ap3Hx4ZEcSjlPHZ/jDtxdRhXQCyNeEb8xq0uUBTI9VLtGk2eNeNucOxOEJ5ngqdNjnEH/A==} engines: {node: '>= 18'} peerDependencies: webpack: '>=5.0.0' @@ -2802,95 +2762,100 @@ packages: '@standard-schema/utils@0.3.0': resolution: {integrity: sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==} - '@supabase/auth-js@2.106.1': - resolution: {integrity: sha512-7eyheXfAGwkB9bZewJPs+N3UYt6kra2JG6mIxNEgbkvcO15PLD1e75PTIUEYYl3zrifm3GrpShVl7QZxKrXO/w==} - engines: {node: '>=20.0.0'} + '@supabase/auth-js@2.112.3': + resolution: {integrity: sha512-NA0rsgAlWZPvbhw8aUdmgfpHVgUAcd8zK5ov43l++o1bLIPXZhRiAlRobhwF5AatQuovpqxsMH50F4oyyV4XZw==} + engines: {node: '>=22.0.0'} - '@supabase/functions-js@2.106.1': - resolution: {integrity: sha512-XbOPnR2mW7jp/EcW447xmGwCa+/Wc00Hkw8t4tUIJjRsHQ4xAESsLKcyLRhRJjJoUnJVXUlC+w0wUxUCM7CG2A==} - engines: {node: '>=20.0.0'} + '@supabase/functions-js@2.112.3': + resolution: {integrity: sha512-gfv481mTOVWtZIJgXupxZpni2V2UWPf6jeF/jOK7HdMHdH+mt6sU0sHHwf0POsPip8ltlulu9OUHgwVzl5ddRw==} + engines: {node: '>=22.0.0'} - '@supabase/phoenix@0.4.2': - resolution: {integrity: sha512-YSAGnmDAfuleFCVt3CeurQZAhxRfXWeZIIkwp7NhYzQ1UwW6ePSnzsFAiUm/mbCkfoCf70QQHKW/K6RKh52a4A==} + '@supabase/phoenix@0.4.5': + resolution: {integrity: sha512-aAn9H9ovVyeApKy11OWOrrOGq8DV68yWeH4ud2lN9fzn4aO8Zb5GLL9m1pUg9nLqIcT+ZDfAcsZe0E/nqdv2lw==} - '@supabase/postgrest-js@2.106.1': - resolution: {integrity: sha512-Qbn6d2lqiqeaBX1Uko0e/hL90dtQGRN6CG2wMVQtJpRFstlVW45qmUTyTOsiB8dYUWu1fWYo4YzJuDbokGv3tQ==} - engines: {node: '>=20.0.0'} + '@supabase/postgrest-js@2.112.3': + resolution: {integrity: sha512-+Mf6uCpzr00bqxwX8hTK2X2L9eAL/1vuOjdEjx6upz9ulb0RmQT16XeU/JkMUlVHw/B46ZnPa2busY4Kd9YCzw==} + engines: {node: '>=22.0.0'} - '@supabase/realtime-js@2.106.1': - resolution: {integrity: sha512-eQCYri5E8KsjpDgC7g28cOOS2britjUWdNSJluFMainqrMRepzjOnaxqXc3RoAz7H0dxmBrfLUNF6NGP8C+YaA==} - engines: {node: '>=20.0.0'} + '@supabase/realtime-js@2.112.3': + resolution: {integrity: sha512-E6wljXWs7DUOloyIB69i3YFInWE6IyCvgTAbQ0KYxOHv26FdA1KzEXTuzxrYEdf70t406Z9BRwUlGyclGF2FXA==} + engines: {node: '>=22.0.0'} - '@supabase/storage-js@2.106.1': - resolution: {integrity: sha512-HWcLIhqinhWKpOQ3WzglR2unjW0eh9J7yOu3IZrZNIEkraK4La/HDvTqndljGsNw0itPtyHhuKBxRoPG1VUARw==} - engines: {node: '>=20.0.0'} + '@supabase/storage-js@2.112.3': + resolution: {integrity: sha512-oSK61tzlUvg+BWPqpKQCu9qqonsO26btaoAR9D6Gest2aj7xUqToj9rKyaoYOJczkhg9BjqA1REbYy9tPI4bDA==} + engines: {node: '>=22.0.0'} - '@supabase/supabase-js@2.106.1': - resolution: {integrity: sha512-gP4HurGkGu7Z3xoOCjtAI17BKKp7jpsmwY0Ssbsks9XQRzJ7ZhK7LxfLdBSYgUdgZCQgjRK+Mr7+cl4Gxrk0Rw==} - engines: {node: '>=20.0.0'} + '@supabase/supabase-js@2.112.3': + resolution: {integrity: sha512-Jv1bxVQmEJNkjvPEhFaKjPzsh+Ozyew6lWGD+SoYcsclDEP1z7yEvKvfUQfzy0DkxRIQnZNxmmWtAzw5XLTQoA==} + engines: {node: '>=22.0.0'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0' + peerDependenciesMeta: + '@opentelemetry/api': + optional: true '@swc/helpers@0.5.15': resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} - '@tailwindcss/node@4.3.0': - resolution: {integrity: sha512-aFb4gUhFOgdh9AXo4IzBEOzBkkAxm9VigwDJnMIYv3lcfXCJVesNfbEaBl4BNgVRyid92AmdviqwBUBRKSeY3g==} + '@tailwindcss/node@4.3.3': + resolution: {integrity: sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg==} - '@tailwindcss/oxide-android-arm64@4.3.0': - resolution: {integrity: sha512-TJPiq67tKlLuObP6RkwvVGDoxCMBVtDgKkLfa/uyj7/FyxvQwHS+UOnVrXXgbEsfUaMgiVvC4KbJnRr26ho4Ng==} + '@tailwindcss/oxide-android-arm64@4.3.3': + resolution: {integrity: sha512-Y85A2gmPSkl5Ve5qR86GL4HT509cFqQh1aes9p3sSkyTPwt0Pppf3GkwGe4JPACcRYjgJIEhQgM6dBClnr0NYw==} engines: {node: '>= 20'} cpu: [arm64] os: [android] - '@tailwindcss/oxide-darwin-arm64@4.3.0': - resolution: {integrity: sha512-oMN/WZRb+SO37BmUElEgeEWuU8E/HXRkiODxJxLe1UTHVXLrdVSgfaJV7pSlhRGMSOiXLuxTIjfsF3wYvz8cgQ==} + '@tailwindcss/oxide-darwin-arm64@4.3.3': + resolution: {integrity: sha512-BiaWatpBcERQFDlOjRDpIVXuFK5PJez5SA4JMg6VYZdBYU+qKfV/vqjcIs+IYmtitf1xYQZTwXvU/8y4lfZUGw==} engines: {node: '>= 20'} cpu: [arm64] os: [darwin] - '@tailwindcss/oxide-darwin-x64@4.3.0': - resolution: {integrity: sha512-N6CUmu4a6bKVADfw77p+iw6Yd9Q3OBhe0veaDX+QazfuVYlQsHfDgxBrsjQ/IW+zywL8mTrNd0SdJT/zgtvMdA==} + '@tailwindcss/oxide-darwin-x64@4.3.3': + resolution: {integrity: sha512-fAeUqfV5ndhxRwai8cXGzdLvul9utWOmeTkv69unv4ZXixjn61Z+p9lCWdwOwA3TYboG3BwdVuN/RDjhBRl0mw==} engines: {node: '>= 20'} cpu: [x64] os: [darwin] - '@tailwindcss/oxide-freebsd-x64@4.3.0': - resolution: {integrity: sha512-zDL5hBkQdH5C6MpqbK3gQAgP80tsMwSI26vjOzjJtNCMUo0lFgOItzHKBIupOZNQxt3ouPH7RPhvNhiTfCe5CQ==} + '@tailwindcss/oxide-freebsd-x64@4.3.3': + resolution: {integrity: sha512-iyf5bV6+wnAlflVeEy7R25dupxTNECZN5QMI0qNT6eT+EgaGdZcKhGkr5SdoaWiLJ3spLqIY9VCeSGrwmtg4kw==} engines: {node: '>= 20'} cpu: [x64] os: [freebsd] - '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.0': - resolution: {integrity: sha512-R06HdNi7A7OEoMsf6d4tjZ71RCWnZQPHj2mnotSFURjNLdBC+cIgXQ7l81CqeoiQftjf6OOblxXMInMgN2VzMA==} + '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.3': + resolution: {integrity: sha512-aAYUprJAJQWWbRrPvtjdroZ56Md+JM8pMiopS6xGEwDfLhqj+2ver2p4nU4Mb3CRqcMmNBjo8KkUgcxhkzVQGQ==} engines: {node: '>= 20'} cpu: [arm] os: [linux] - '@tailwindcss/oxide-linux-arm64-gnu@4.3.0': - resolution: {integrity: sha512-qTJHELX8jetjhRQHCLilkVLmybpzNQAtaI/gaoVoidn/ufbNDbAo8KlK2J+yPoc8wQxvDxCmh/5lr8nC1+lTbg==} + '@tailwindcss/oxide-linux-arm64-gnu@4.3.3': + resolution: {integrity: sha512-nDxldcEENOxZRzC2uu9jrutZdAAQtb+8WWDCSnWL1zvBk1+FN+x6MtDViPB5AJMfttVCUhehGWus3XBPgatM/w==} engines: {node: '>= 20'} cpu: [arm64] os: [linux] - '@tailwindcss/oxide-linux-arm64-musl@4.3.0': - resolution: {integrity: sha512-Z6sukiQsngnWO+l39X4pPbiWT81IC+PLKF+PHxIlyZbGNb9MODfYlXEVlFvej5BOZInWX01kVyzeLvHsXhfczQ==} + '@tailwindcss/oxide-linux-arm64-musl@4.3.3': + resolution: {integrity: sha512-Md44bD6veX/PC5iyF8cDVnw4HBIANZepRZZ7a8DQOvkfo5WUBwcp6iAuCUz23u+4SUkhJlD3eL7hNdW8ezd/kA==} engines: {node: '>= 20'} cpu: [arm64] os: [linux] - '@tailwindcss/oxide-linux-x64-gnu@4.3.0': - resolution: {integrity: sha512-DRNdQRpSGzRGfARVuVkxvM8Q12nh19l4BF/G7zGA1oe+9wcC6saFBHTISrpIcKzhiXtSrlSrluCfvMuledoCTQ==} + '@tailwindcss/oxide-linux-x64-gnu@4.3.3': + resolution: {integrity: sha512-tx7us1muwOKAKWao2v/GaafFeQboE6aj88vC6ziN2NCGcRm8gWUhwjzg+YdVB1e4boAtdtma4L43onunI6NS4w==} engines: {node: '>= 20'} cpu: [x64] os: [linux] - '@tailwindcss/oxide-linux-x64-musl@4.3.0': - resolution: {integrity: sha512-Z0IADbDo8bh6I7h2IQMx601AdXBLfFpEdUotft86evd/8ZPflZe9COPO8Q1vw+pfLWIUo9zN/JGZvwuAJqduqg==} + '@tailwindcss/oxide-linux-x64-musl@4.3.3': + resolution: {integrity: sha512-SJxX60smvHgasZoBy11dX6YRjXJFovwWBoedhbQPOBzgFWBHGB+TVPWB9BxzR7TTxU8FQZAI2AyiNCMzFm8Img==} engines: {node: '>= 20'} cpu: [x64] os: [linux] - '@tailwindcss/oxide-wasm32-wasi@4.3.0': - resolution: {integrity: sha512-HNZGOUxEmElksYR7S6sC5jTeNGpobAsy9u7Gu0AskJ8/20FR9GqebUyB+HBcU/ax6BHuiuJi+Oda4B+YX6H1yA==} + '@tailwindcss/oxide-wasm32-wasi@4.3.3': + resolution: {integrity: sha512-jx1+rPhY/5Ympkktd656HBWEBLxP7dH06losBLjjf5vgCODXvi9KhtftWcMIwTFIDqBr7cRnQkdLnAG+IOlGvQ==} engines: {node: '>=14.0.0'} cpu: [wasm32] bundledDependencies: @@ -2901,212 +2866,243 @@ packages: - '@emnapi/wasi-threads' - tslib - '@tailwindcss/oxide-win32-arm64-msvc@4.3.0': - resolution: {integrity: sha512-Pe+RPVTi1T+qymuuRpcdvwSVZjnll/f7n8gBxMMh3xLTctMDKqpdfGimbMyioqtLhUYZxdJ9wGNhV7MKHvgZsQ==} + '@tailwindcss/oxide-win32-arm64-msvc@4.3.3': + resolution: {integrity: sha512-3rc292Ca2ceK6Ulcc/bAVnTs/3nDtoPhyEKlgPv+yQJQi/JS/AMJlqzxvlDacL1nekbrcf6bTqp/jV4qgnPxNQ==} engines: {node: '>= 20'} cpu: [arm64] os: [win32] - '@tailwindcss/oxide-win32-x64-msvc@4.3.0': - resolution: {integrity: sha512-Mvrf2kXW/yeW/OTezZlCGOirXRcUuLIBx/5Y12BaPM7wJoryG6dfS/NJL8aBPqtTEx/Vm4T4vKzFUcKDT+TKUA==} + '@tailwindcss/oxide-win32-x64-msvc@4.3.3': + resolution: {integrity: sha512-yJ0pwIVc/nYeGoV02WtsN8KYyLQv7kyI2wDnkezyJlGGjkd4QLwDGAwl47YpPJeuI0M0ObaXGSPjvWDPeTPggw==} engines: {node: '>= 20'} cpu: [x64] os: [win32] - '@tailwindcss/oxide@4.3.0': - resolution: {integrity: sha512-F7HZGBeN9I0/AuuJS5PwcD8xayx5ri5GhjYUDBEVYUkexyA/giwbDNjRVrxSezE3T250OU2K/wp/ltWx3UOefg==} + '@tailwindcss/oxide@4.3.3': + resolution: {integrity: sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA==} engines: {node: '>= 20'} - '@tailwindcss/postcss@4.3.0': - resolution: {integrity: sha512-Jm05Tjx+9yCLGv5qw1c+84Psds8MnyrEQYCB+FFk2lgGiUjlRqdxke4mVTuYrj2xnVZqKim2Apr5ySuQRYAw/w==} + '@tailwindcss/postcss@4.3.3': + resolution: {integrity: sha512-JTSZZGQi1AyKirbLN3azmjVzef92tcX7h+iSqPdaeStyFpGpDlKvvpxeOE8njhbUanbRwr3z8DyzhICWnMtQeg==} - '@tanstack/query-core@5.100.13': - resolution: {integrity: sha512-mlKVKMTzZWGTKAC1CKOgt7axAjJ921emkEvYIp27I/PdP1yEYL/BteLY8iK35gn8hoYeKB4mgJ/ve3lrDI6/Fw==} + '@tanstack/query-core@5.101.4': + resolution: {integrity: sha512-gNwcvOJcRbLWPOLG/2OBm+zM+Yv+MKsXKEOWC57USuZDEsI71hEErQsiEGx5wX9rzWWkfwM0fVSPoiIFSsxfiw==} - '@tanstack/query-devtools@5.100.13': - resolution: {integrity: sha512-mxAw1auaysPQK6EoMHs9hMuyJ1IMAE/ZmGGs9i5YveGg2RUnOGdJfefQJwWYSf2KcIu/XiPXIjuFu9Yr/tSAwA==} + '@tanstack/query-devtools@5.101.4': + resolution: {integrity: sha512-z5IPHnDX3aUWeTWlRKLyooBQekaCAw4xRpZqPQ390RiWTDBcTynjpPT221BArw0u2+pnQMdGvPQI9YNNubBcmA==} - '@tanstack/react-query-devtools@5.100.13': - resolution: {integrity: sha512-+haoLtUQvQ40pWtY5NbQ+iVvoptGXb6F7j9NFPaSo1jqhpzZQIKuBuwkbFd6xWLCocyvVIvWkt3mkNvCGcd/og==} + '@tanstack/react-query-devtools@5.101.4': + resolution: {integrity: sha512-VeK2gtmfj7kvRBjtxS7TKxt/6qKhn8VzabY4UiYMr7NV9CddjSRYRgeYyld+NpjAkgMV9dd+2Qdr8ah5I03NeA==} peerDependencies: - '@tanstack/react-query': ^5.100.13 + '@tanstack/react-query': ^5.101.4 react: ^18 || ^19 - '@tanstack/react-query@5.100.13': - resolution: {integrity: sha512-HSBr8CycQEAoXsJR7KNDawBnINJEJ96Eme8oE0hCXjyodE2I97vg3IDzDJBDu18LsbzpVVJcKo80eqLfVCykxw==} + '@tanstack/react-query@5.101.4': + resolution: {integrity: sha512-yRg2pfOCxIs4ZJW3XYYHU/WgtD04FHSnfHlpRT7h7pR77hwkdRG4wxbKe4aq6P0RvXUTBSQpQeadS1SUYUe+KA==} peerDependencies: react: ^18 || ^19 - '@tiptap/core@3.23.6': - resolution: {integrity: sha512-MRB3pHz4Oxqmcawh0cQ5iOGdY5xtNYp/1CoK7hdTLzw5K0C6/gTC2VvanB1R4INaB6EpBkxG/GiWkVirDRnuXw==} + '@tiptap/core@3.30.1': + resolution: {integrity: sha512-HWEO6Qi8fI8Zt8X4atVV6GxthJx7Vrjr6L5YFq4OkjYJ7HG2/bFw6IKsDA3jOYgY4DM9lv8IadaiWUQ2JJRIBA==} peerDependencies: - '@tiptap/pm': 3.23.6 + '@tiptap/pm': 3.30.1 - '@tiptap/extension-blockquote@3.23.6': - resolution: {integrity: sha512-2RmnqNqTltZ2k1F7IfjoDNs935Uq4rRDR7d98mqkg3OlDktcQIyBpv0t9dTay6H5bkQeZUuS8ogK2S1E8Edjug==} + '@tiptap/extension-blockquote@3.30.1': + resolution: {integrity: sha512-nUBIPmf9fKfBzeMpQsexsHw3/ICzDfBK8DN9uLf5wO3I/gWycAByynvfNIqfHyl6Q77QgTIHrdjihEXUSYzeJg==} peerDependencies: - '@tiptap/core': 3.23.6 + '@tiptap/core': 3.30.1 + '@tiptap/pm': 3.30.1 - '@tiptap/extension-bold@3.23.6': - resolution: {integrity: sha512-1LMhjnytdbbhWHSoOwnLxZAOQZWPkKyXVCNmaIk0Mhi4tLPUXptG4qKS5sVYTCveE5H6IBPFrbgBFi5dMI6krA==} + '@tiptap/extension-bold@3.30.1': + resolution: {integrity: sha512-xnEGv7evFQquT0r/byjBt5iqDYQi6bF/W7DPO2rAG0z33mShDEUHhE407jakMiOSYNUilFjuQj1naLvwpQC3Bw==} peerDependencies: - '@tiptap/core': 3.23.6 + '@tiptap/core': 3.30.1 - '@tiptap/extension-bubble-menu@3.23.6': - resolution: {integrity: sha512-Mwkyp9LkDHFbqmWRIkp63FinRxFu3ajC4qSb9t4mnHsb4kAdbNLLsGtbFg+le0SWk4CxGwAOwM7SzeJ+6UGqCA==} + '@tiptap/extension-bubble-menu@3.30.1': + resolution: {integrity: sha512-6asFH7ZW0gTh0aX7qrABYRVqiU/IOSjk4PKt6qdZM5YS455bjVLZDM0PcIccMDaYiomuCNjfuCSj5dxmPDoWiQ==} peerDependencies: - '@tiptap/core': 3.23.6 - '@tiptap/pm': 3.23.6 + '@tiptap/core': 3.30.1 + '@tiptap/pm': 3.30.1 - '@tiptap/extension-bullet-list@3.23.6': - resolution: {integrity: sha512-RMRgfXZykr/13X8UBOwvpgysVOo9KchwqMoEbvqQSj4YFfU56iIn59C8sbxiQ1sKfeltUf0wH4fPc0I4iwKqAA==} + '@tiptap/extension-bullet-list@3.30.1': + resolution: {integrity: sha512-9bf4VgIxaOe+c7W20WZGUU5d2SFNGSpVwDGU/7jGlnjobzR7ZhDK/THk9JQr8OpvZrVN8Nmf84ZD3axjt+h/hQ==} peerDependencies: - '@tiptap/extension-list': 3.23.6 + '@tiptap/extension-list': 3.30.1 - '@tiptap/extension-code-block@3.23.6': - resolution: {integrity: sha512-4kccgcn5yHThxrzsIhJny3EwfEZYIk+BjUCL4uIuzOyWvExtGhZ6JMHVCZeMhI8D1/bX1LNkkAKN5DXPzH4lXQ==} + '@tiptap/extension-code-block@3.30.1': + resolution: {integrity: sha512-j19Ml9BpvHgTMSN4SfkJ26B5xSuHaxPXvMoXyAX1iOoSc4J92sCqShLGgpmtce42sIroYFRs4sBv0ndBRDcxtA==} peerDependencies: - '@tiptap/core': 3.23.6 - '@tiptap/pm': 3.23.6 + '@tiptap/core': 3.30.1 + '@tiptap/pm': 3.30.1 - '@tiptap/extension-code@3.23.6': - resolution: {integrity: sha512-KG8KXFYyLrtYvT7AZ1WGV61ofx8pDe5g9pH658MERxqQGii+Pyfc6xkz04l7XeBts/7+571UQp/0O7i/z560TA==} + '@tiptap/extension-code@3.30.1': + resolution: {integrity: sha512-oqLEOLZel3lrLhACP4vMhH5RNbV9yxFsJYiOmQjjEFEoCEWWxVfJuhZ+8NFS3mUCdgy77G62XimjEvqC3+7V7Q==} peerDependencies: - '@tiptap/core': 3.23.6 + '@tiptap/core': 3.30.1 - '@tiptap/extension-document@3.23.6': - resolution: {integrity: sha512-XDAIgG9KcKumFM9KJWUEUhXPbFIhhl47bfy5GknareWTRKke85rcoj/oxKKO9ihLZr8JfpbXjqnS4SCm5yhYPw==} + '@tiptap/extension-document@3.30.1': + resolution: {integrity: sha512-aeMhO7EDoJyl5AGkF9hDQ9e52s18L8oYdbYjzcmXeo0YuXeaxbZCuUueVH4DnTfV7/vSkDRpDkk4TFF5LfKQpg==} peerDependencies: - '@tiptap/core': 3.23.6 + '@tiptap/core': 3.30.1 - '@tiptap/extension-dropcursor@3.23.6': - resolution: {integrity: sha512-+XWEoRKf3lXxi7Le1aOM2xU1XHwxICGpXjT3m4QaYqUgIpsq8gQEuso6kVg8DnTD7biKQs6+oIQ0o2b/gTW9WA==} + '@tiptap/extension-dropcursor@3.30.1': + resolution: {integrity: sha512-N3R5rA01WX/brGm1Qcnf2KLu0xkyGbRPMsHzzl1YG2sOLQM9t+FQi1T8WvSJiOpfYBVaWQkILUoCymADSpgUAg==} peerDependencies: - '@tiptap/extensions': 3.23.6 + '@tiptap/extensions': 3.30.1 - '@tiptap/extension-floating-menu@3.23.6': - resolution: {integrity: sha512-2kjuDcEq69lEcECl75xqY5MyzUSh2zcC5aLrpwP1WwhJz5bxsIFHiaps5AP6h9R4A+ZBj5b2haay2Y1wDUU3VA==} + '@tiptap/extension-floating-menu@3.30.1': + resolution: {integrity: sha512-/Rlqsn7OXThZNzD0Qq/Ru4rZCFj3YnxL8Vf01cez+pvcyxgbwf4b9Wir+1JWJmaEMYsmWprSgEBW0l9ctbq97w==} peerDependencies: '@floating-ui/dom': ^1.0.0 - '@tiptap/core': 3.23.6 - '@tiptap/pm': 3.23.6 + '@tiptap/core': 3.30.1 + '@tiptap/pm': 3.30.1 - '@tiptap/extension-gapcursor@3.23.6': - resolution: {integrity: sha512-wbKmxXsszxWacEkrHucRpSQbiKjz4fmOebD6OVyL9AcrmlbxNk8vcM3iyh/8cVeRy09XY+morM165t/u7/z4IQ==} + '@tiptap/extension-gapcursor@3.30.1': + resolution: {integrity: sha512-dp13WaPNj32SkDN9tun0OtwtfdO/y52BJWigwXPgpUFLEyr8hQ84TxXL3rDshGHE4Eyjdd+erdBHisjBEV9vwQ==} peerDependencies: - '@tiptap/extensions': 3.23.6 + '@tiptap/extensions': 3.30.1 - '@tiptap/extension-hard-break@3.23.6': - resolution: {integrity: sha512-KeUm+tkUfIVSX9QM9XOIhaay0Fn36sLKUo5NVYjN3uJaxFvaZXZmTlxdO85OTdgF2P5sqh9LomrIgliaFRGk4w==} + '@tiptap/extension-hard-break@3.30.1': + resolution: {integrity: sha512-2emcEkSSj+Y3dXXEugKQZDNeWCum0LBuKFmun7SiJyLOdxNuRnxwm2l4/LLiEHGDJBchDti4Oo8jZGLTRt4uog==} peerDependencies: - '@tiptap/core': 3.23.6 + '@tiptap/core': 3.30.1 - '@tiptap/extension-heading@3.23.6': - resolution: {integrity: sha512-A/0jPhxnUh9THSZymlu0OGPZe1wdFdwHAXnRCmqvYUCwJjrG7LCC/ahzmcj1tcNzI9hgHyuYPSfev8RXYrNu/w==} + '@tiptap/extension-heading@3.30.1': + resolution: {integrity: sha512-TGM1ZNeH/D8HQK59vFMZql2gesMoHy+6nLq3mFsYpiRT2TShMGoq+K7SC+ty6N5a/k4M82ZQrDq8t4zjiiS5xA==} peerDependencies: - '@tiptap/core': 3.23.6 + '@tiptap/core': 3.30.1 - '@tiptap/extension-horizontal-rule@3.23.6': - resolution: {integrity: sha512-hEUlz4H+I64r+TH6LCuNCRgO7JTHncXGmx9+WbU69EOfY8O0ZurcgeJc8HeiAKL+r9YuC1e5YHfFxgCaaC0jlg==} + '@tiptap/extension-horizontal-rule@3.30.1': + resolution: {integrity: sha512-fTaSDapNV3cRgsek94z/Z4+Fyr0UpkE8/9PdSvt9MHYo/2yx3mmuamEJwUhUCpe7gDfzGdrMMsRpDOcd0b1ZEQ==} peerDependencies: - '@tiptap/core': 3.23.6 - '@tiptap/pm': 3.23.6 + '@tiptap/core': 3.30.1 + '@tiptap/pm': 3.30.1 - '@tiptap/extension-image@3.23.6': - resolution: {integrity: sha512-vvNGxArvD2dW+XvV0KdYovRVUzCy8QVNulc2r5pV7umnG1E6cCmMkiHiif8J2ePJu2KtysAvJQe0iF+UqueGMw==} + '@tiptap/extension-image@3.30.1': + resolution: {integrity: sha512-LChYqHC0u7dq9/zj9R+SYgT04tuT549tzFeu8Ymo1TJ46Y9Iy3BfwlETZRvyV8NkC/eoGqUevJeD3HtG/vMaog==} peerDependencies: - '@tiptap/core': 3.23.6 + '@tiptap/core': 3.30.1 - '@tiptap/extension-italic@3.23.6': - resolution: {integrity: sha512-wol5KdwCPAvpiYhH9PLlvO8ZnJHwZtIboVevrfOGgBcKlXRA3dedR4OAMXHnUtkkzu9KtliLg1+TYzEx4JZG9Q==} + '@tiptap/extension-italic@3.30.1': + resolution: {integrity: sha512-KldMtozKk8OBHexo6akCQpJCWMgJ5OwPYuEOJO+vFjgw6VS+9N16peIo5dY+vXAiVIZL+swEsBp4barwz7NiLw==} peerDependencies: - '@tiptap/core': 3.23.6 + '@tiptap/core': 3.30.1 - '@tiptap/extension-link@3.23.6': - resolution: {integrity: sha512-KNZz7z7P2/qbQsx5bPAbSPjrKDg1VHsedGlLHJCr8U2VRD5VgmDLkMpkouP1CsDg15qgyUKv/nDib5KgPpLNWA==} + '@tiptap/extension-link@3.30.1': + resolution: {integrity: sha512-krq5yHDT4K+u2r7rS0CGk/yafyAKY1gbxexfbMmq+jyHtUUrr0UuCT1nOTa61bV3zX1nrObM1lKSpZ5FgbfdhQ==} peerDependencies: - '@tiptap/core': 3.23.6 - '@tiptap/pm': 3.23.6 + '@tiptap/core': 3.30.1 + '@tiptap/pm': 3.30.1 - '@tiptap/extension-list-item@3.23.6': - resolution: {integrity: sha512-3zzyhdkUWcHVpXuvy6KiIwjh29rbH6gEDEqPQqHLrl1XGnO9pnShC7pSHctlCDjmcx3O4n9cd4QMtVBlUerbiA==} + '@tiptap/extension-list-item@3.30.1': + resolution: {integrity: sha512-8QqIKvEqXKlT4Cv3ZySHAq1jzKimT/UnFxNBCnkBg+aZBgImvPlRFdN5nFs0elxiSQ7Jtt6k29aOyrkjxgyeew==} peerDependencies: - '@tiptap/extension-list': 3.23.6 + '@tiptap/extension-list': 3.30.1 - '@tiptap/extension-list-keymap@3.23.6': - resolution: {integrity: sha512-x8bPcLViGzg/RAmQM/XtmfqIwQ/Pv9Q8mkd+OgfUiTqjeJqKwVQmiqbLFNa7zw81+H61M+HDU+qGAaQ3vRIMjw==} + '@tiptap/extension-list-keymap@3.30.1': + resolution: {integrity: sha512-ju39AnbRyWr1vG4GnMM7BritV/9heGMeH103wccXgJU9hOEqzwmN9zpf5CZqeRnXOjzwQiojrEL+nwm5MnuboA==} peerDependencies: - '@tiptap/extension-list': 3.23.6 + '@tiptap/extension-list': 3.30.1 - '@tiptap/extension-list@3.23.6': - resolution: {integrity: sha512-z6vj9+Qht2sjdQkyyHcUpsC/yCIZqTrQiyHDhs/HGKrfvoANyAZGpqdNeKf1wSyjIso+27tQuIH5NDfk8ygyNw==} + '@tiptap/extension-list@3.30.1': + resolution: {integrity: sha512-LizBu3fWrjifsL7QxKt+NhnHJDVGW/WWL+5asfqyznMqCZTy6tvPJ2W39pUHH2dBaVtzRIkAlsgWjDcNX/ep/Q==} peerDependencies: - '@tiptap/core': 3.23.6 - '@tiptap/pm': 3.23.6 + '@tiptap/core': 3.30.1 + '@tiptap/pm': 3.30.1 - '@tiptap/extension-ordered-list@3.23.6': - resolution: {integrity: sha512-1m/wWB/ZtXcmG2vNdiUkCqsOgqv5vBjCv/mVaHhF9OvV+zQS8YDjoWE7zEuT/GgELdT77Xq8lHrn4nCDudB3/A==} + '@tiptap/extension-ordered-list@3.30.1': + resolution: {integrity: sha512-kJ4+4I1n4b5jV8OpWH+dbKOlIWTWVPv/fxDQKZuAT/a0DRoowpRoAuGJ0Nk9/Azeqel6c8Ocb4n1J7xLR6Xl2Q==} peerDependencies: - '@tiptap/extension-list': 3.23.6 + '@tiptap/extension-list': 3.30.1 - '@tiptap/extension-paragraph@3.23.6': - resolution: {integrity: sha512-+7m58LUSncodjrIyXks4RZ3tLNYrvgT77wRR4l3HnM5OABY3GDsDTqi7c1t1yI29NVOSk/DUacqy6UwYAj1DGg==} + '@tiptap/extension-paragraph@3.30.1': + resolution: {integrity: sha512-1kAYoyIF88l2qPgHi9ZeS5D5N7TzdJg3FvVCOJvUplQtBIwrsNAx6zaH/16NKN7kRiW7zETMKXMKkhL6MIvnDg==} peerDependencies: - '@tiptap/core': 3.23.6 + '@tiptap/core': 3.30.1 - '@tiptap/extension-strike@3.23.6': - resolution: {integrity: sha512-oF7FEZ37f15aCe5kPgzGDYf/m+hr7VdQ/Ko/Hds/UM9pX7AG1fdtmRrl6wqkRqDM/incZaC/AQR2/Dpo2VCNGQ==} + '@tiptap/extension-strike@3.30.1': + resolution: {integrity: sha512-vyF8TPTARaN5coGrFwqVREPXDONE4SXJMIxo9qMaBJWl7723m+Enpy7qmFscnwifW5XTpOA8jKl/QJ7qud/ljw==} peerDependencies: - '@tiptap/core': 3.23.6 + '@tiptap/core': 3.30.1 - '@tiptap/extension-text@3.23.6': - resolution: {integrity: sha512-ipoC2TkIAIOTiF5ByiGgvQB1DqDyfP90wrUB3mohBcgvp7lQnwHszCDGv8dNnmcUek8uXV/uoLu2VXeVQlxjPA==} + '@tiptap/extension-text@3.30.1': + resolution: {integrity: sha512-Zt3Ik95ZKJx5YNzC6TUXWTNBHUfRH/qVENmqfPjA7x7q4cqNdOEU+tX9DrlFjgxu/x0k48dlQS0Kaop24/vihA==} peerDependencies: - '@tiptap/core': 3.23.6 + '@tiptap/core': 3.30.1 - '@tiptap/extension-underline@3.23.6': - resolution: {integrity: sha512-P55wGIZGYTVH92Fq0cgI4/O9AhLCaJC3hhxg15RSERP5/YegM9eJHDK/GQ1EE/DvYA+xpYGOV6agKwAUqfA/Iw==} + '@tiptap/extension-underline@3.30.1': + resolution: {integrity: sha512-Xro/EzEgWW+46ztrw5f4epDWQvcGpD+HUykzigj30bpIS8Vv4XDXFt+89dAcyDC7zRUMQULlWZV0UCyRLFEKBw==} peerDependencies: - '@tiptap/core': 3.23.6 + '@tiptap/core': 3.30.1 - '@tiptap/extensions@3.23.6': - resolution: {integrity: sha512-X09/Db1teB+ifXzDGVVFmOeQRx7wTAayE9/280spxpsHkHZvJ5bHRvWIzUzviMIjbBz+NPDIKYPK7gMfh9iaig==} + '@tiptap/extensions@3.30.1': + resolution: {integrity: sha512-prNrvF1oMj+tngCLmZgXzQfuUuvYMbCe2sEPXXKJPqJNNffHd2wAuUZ0h6UQS5aRILaxB2kN1/yfwpxnhRpwYA==} peerDependencies: - '@tiptap/core': 3.23.6 - '@tiptap/pm': 3.23.6 + '@tiptap/core': 3.30.1 + '@tiptap/pm': 3.30.1 - '@tiptap/pm@3.23.6': - resolution: {integrity: sha512-in5CaMaWlJcH2A1q6GJKFtrodE8WLS3M9tIi/f89jPmIVHJShpodC0KZDNyJkrVBQomYk0DEh86Utm6ASXzQww==} + '@tiptap/pm@3.30.1': + resolution: {integrity: sha512-2bHY+ihexKpfBURbAD+ahY0+lWle0TueTK80GAGYqZ/G7ErAPOmzN5RVAGMyZJI4wDkcFycRNLi3k0/3VT9a1A==} - '@tiptap/react@3.23.6': - resolution: {integrity: sha512-Tw9KZkYqFMk3vaJAEQKqEYIO/iq3cSJe7OUEGBul4k4GaMQeLItLf5EYhUd0GIPXci1WVVPNntKJsHfX25M37w==} + '@tiptap/react@3.30.1': + resolution: {integrity: sha512-SZvUkUlRpZxzNHcQsBeiExWG6vEAdk2y/YeiwHaVmTJAiFaA5+IhKW/MuN1qJEvYS5LXE0uFy/VJaZtfKV5uWw==} peerDependencies: - '@tiptap/core': 3.23.6 - '@tiptap/pm': 3.23.6 + '@tiptap/core': 3.30.1 + '@tiptap/pm': 3.30.1 '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 '@types/react-dom': ^17.0.0 || ^18.0.0 || ^19.0.0 react: ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0 - '@tiptap/starter-kit@3.23.6': - resolution: {integrity: sha512-gykwtGWrnWCmtql1hid3opac/KV8zQvOAnu3bTqIqcHrn1FusbUwKmNzavSbfGvcktHM3hFjb35W48JyVLyu/A==} + '@tiptap/starter-kit@3.30.1': + resolution: {integrity: sha512-6P2WEp2ZHsx8LV6hQ3K/MB3n39oiVhKESlzh0v+KhK8RR/iKSKGxvTFbi1D/1fo4j3fZf+43PGHjyKXskn9ZmQ==} '@ts-morph/common@0.27.0': resolution: {integrity: sha512-Wf29UqxWDpc+i61k3oIOzcUfQt79PIT9y/MWfAGlrkjg6lBC1hwDECLXPVJAhWjiGbfBCxZd65F/LIZF3+jeJQ==} - '@tybys/wasm-util@0.10.2': - resolution: {integrity: sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==} + '@turbo/darwin-64@2.10.10': + resolution: {integrity: sha512-gFDD+wRP5hWxBRghGyEbjpbLOY7aIU/wvsnKdMM7odQcp/wHMrnI83p0FyxxMRZnFH9ZD+S59MvcpOC5b+nrCA==} + cpu: [x64] + os: [darwin] + + '@turbo/darwin-arm64@2.10.10': + resolution: {integrity: sha512-VZYsxZ6yjyDosUqtiroAVSXPLmx/qBxdHJgIxdMH9RyNmLdOLOWtJnYMnI4qckwCgQMK85G3fu94/xk5+iBCgw==} + cpu: [arm64] + os: [darwin] + + '@turbo/linux-64@2.10.10': + resolution: {integrity: sha512-lAvW+yEnmsCKMEIwNugjozawvYytHKPhU0kfLBizu83MIs8OUb9KobYvkZ56L5akSM6K7+gBFLEIfQkaceh90g==} + cpu: [x64] + os: [android, linux] + + '@turbo/linux-arm64@2.10.10': + resolution: {integrity: sha512-MSJ+NkRTd79Z9+YEZpUV9VOWVOOigFhE+v/ETNYJEuTJp3r00y9YgFvDXrmM+DP8Kal6tk3U6xSugD2/Ojh+Jg==} + cpu: [arm64] + os: [android, linux] + + '@turbo/windows-64@2.10.10': + resolution: {integrity: sha512-ycWpXDkUfnDFDY9d+4Qna/UZotDB0wj+s9agrlmNt0Q7a3XHORhK8GPKJdzgzeutXu9EW5P/jyabTEHlohuDXw==} + cpu: [x64] + os: [win32] + + '@turbo/windows-arm64@2.10.10': + resolution: {integrity: sha512-PMk6zQN0csUFklLe+1hz/5G9uU1YmV0cEIey2R/bSeA6o69qcBTlN4A3jOqkgenOO5dOpMHmq2sEUZo8r1+Ssg==} + cpu: [arm64] + os: [win32] + + '@tybys/wasm-util@0.10.3': + resolution: {integrity: sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==} '@types/bcryptjs@3.0.0': resolution: {integrity: sha512-WRZOuCuaz8UcZZE4R5HXTco2goQSI2XxjGY3hbM/xDvwmqFWd4ivooImsMx65OKM6CtNKbnZ5YL+YwAwK7c1dg==} deprecated: This is a stub types definition. bcryptjs provides its own type definitions, so you do not need this installed. - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - '@types/cors@2.8.19': resolution: {integrity: sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==} + '@types/d3-array@3.0.3': + resolution: {integrity: sha512-Reoy+pKnvsksN0lQUlcH6dOGjRZ/3WRwXR//m+/8lt1BXeI4xyaUZoqULNjyXXRuh0Mj4LNpkCvhUpQlY3X5xQ==} + '@types/d3-array@3.2.2': resolution: {integrity: sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==} @@ -3119,12 +3115,18 @@ packages: '@types/d3-chord@3.0.6': resolution: {integrity: sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==} + '@types/d3-color@3.1.0': + resolution: {integrity: sha512-HKuicPHJuvPgCD+np6Se9MQvS6OCbJmOjGvylzMJRlDwUXjKTTXs6Pwgk79O09Vj/ho3u1ofXnhFOaEWWPrlwA==} + '@types/d3-color@3.1.3': resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==} '@types/d3-contour@3.0.6': resolution: {integrity: sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==} + '@types/d3-delaunay@6.0.1': + resolution: {integrity: sha512-tLxQ2sfT0p6sxdG75c6f/ekqxjyYR0+LwPrsO1mbC9YDBzPJhs2HbJJRrn8Ez1DBoHRo2yx7YEATI+8V1nGMnQ==} + '@types/d3-delaunay@6.0.4': resolution: {integrity: sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==} @@ -3146,15 +3148,24 @@ packages: '@types/d3-force@3.0.10': resolution: {integrity: sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==} + '@types/d3-format@3.0.1': + resolution: {integrity: sha512-5KY70ifCCzorkLuIkDe0Z9YTf9RR2CjBX1iaJG+rgM/cPP+sO+q9YdQ9WdhQcgPj1EQiJ2/0+yUkkziTG6Lubg==} + '@types/d3-format@3.0.4': resolution: {integrity: sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==} '@types/d3-geo@3.1.0': resolution: {integrity: sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==} + '@types/d3-geo@3.1.1': + resolution: {integrity: sha512-65Emv9fQiQQqphLlRkuQ5ypPsOmWPhtBGCMv61JDPEPMvsx+gzhGf74yw1a78xFKPj6zw4AgQICJoQv0vK9M2w==} + '@types/d3-hierarchy@3.1.7': resolution: {integrity: sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==} + '@types/d3-interpolate@3.0.1': + resolution: {integrity: sha512-jx5leotSeac3jr0RePOH1KdR9rISG91QIE4Q2PYTu4OymLTZfA3SrnURSLzKH48HmXVUru50b8nje4E79oQSQw==} + '@types/d3-interpolate@3.0.4': resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==} @@ -3167,24 +3178,36 @@ packages: '@types/d3-quadtree@3.0.6': resolution: {integrity: sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==} - '@types/d3-random@3.0.3': - resolution: {integrity: sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==} + '@types/d3-random@3.0.4': + resolution: {integrity: sha512-UHYId5WTCx4L4YNel7NU00XUXXgvgpgZOvp10PuvsQENjMDXhh2RyFc0KBjO7B45ne4Ha1yVH7ii0vnzKkuzWA==} '@types/d3-scale-chromatic@3.1.0': resolution: {integrity: sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==} + '@types/d3-scale@4.0.2': + resolution: {integrity: sha512-Yk4htunhPAwN0XGlIwArRomOjdoBFXC3+kCxK2Ubg7I9shQlVSJy/pG/Ht5ASN+gdMIalpk8TJ5xV74jFsetLA==} + '@types/d3-scale@4.0.9': resolution: {integrity: sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==} '@types/d3-selection@3.0.11': resolution: {integrity: sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==} + '@types/d3-shape@3.1.7': + resolution: {integrity: sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==} + '@types/d3-shape@3.1.8': resolution: {integrity: sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==} + '@types/d3-time-format@2.1.0': + resolution: {integrity: sha512-/myT3I7EwlukNOX2xVdMzb8FRgNzRMpsZddwst9Ld/VFe6LyJyRp0s32l/V9XoUzk+Gqu56F/oGk6507+8BxrA==} + '@types/d3-time-format@4.0.3': resolution: {integrity: sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==} + '@types/d3-time@3.0.0': + resolution: {integrity: sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg==} + '@types/d3-time@3.0.4': resolution: {integrity: sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==} @@ -3215,8 +3238,8 @@ packages: '@types/geojson@7946.0.16': resolution: {integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==} - '@types/hast@3.0.4': - resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + '@types/hast@3.0.5': + resolution: {integrity: sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==} '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} @@ -3224,49 +3247,34 @@ packages: '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + '@types/lodash@4.17.25': + resolution: {integrity: sha512-+K1NIO8I+F9/wNulfVvu23QYd0Pe9/OCqRrim4NoYIf1VoEDL90Ve4ClzpyqBLc7NpGGWRvYNCKZ1BE/Jpf8dQ==} + '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} - '@types/mdx@2.0.13': - resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} + '@types/mdx@2.0.14': + resolution: {integrity: sha512-T48PeuJtvLosNTPVhfnIp3i/n3a4g4Bad7YCq5k64D4u7NwDrAotikQ+5+sjtUvBmxCMlbo3dVL+C2dP0rWHzg==} '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - '@types/mysql@2.15.27': - resolution: {integrity: sha512-YfWiV16IY0OeBfBCk8+hXKmdTKrKlwKN1MNKAPBu5JYxLwBEZl7QzeEpGnlZb3VMGJrrGmB84gXiH+ofs/TezA==} - - '@types/node@20.19.41': - resolution: {integrity: sha512-ECymXOukMnOoVkC2bb1Vc/w/836DXncOg5m8Xj1RH7xSHZJWNYY6Zh7EH477vcnD5egKNNfy2RpNOmuChhFPgQ==} - - '@types/node@25.9.1': - resolution: {integrity: sha512-xfrlY7UD5rMJk3ZVJP8BNzS28J36YJg+xp+LPXV1TdWxr8uMH5A860QNxYDGQe/ylDSgjxE52Q9VnO7p75tJxg==} + '@types/node@20.19.43': + resolution: {integrity: sha512-6oYBAi5ikg4Pl+kGsoYtawUMBT2zZMCvPNF7pVLnHZfd1zf38DRiWn/gT01RYCdUqkv7Fhr+C9ot4/tb+2sVvA==} - '@types/pg-pool@2.0.7': - resolution: {integrity: sha512-U4CwmGVQcbEuqpyju8/ptOKg6gEC+Tqsvj2xS9o1g71bUh8twxnC6ZL5rZKCsGN0iyH0CwgUyc9VR5owNQF9Ng==} + '@types/node@25.9.5': + resolution: {integrity: sha512-OScDchr2fwuUmWdf4kZ9h7PcJiYDVInhJizG/biAq3cAvqwYktuy/TYGGdZNMtNTFUP7rnb0NU4TUdm82kt4Rg==} - '@types/pg@8.15.6': - resolution: {integrity: sha512-NoaMtzhxOrubeL/7UZuNTrejB4MPAJ0RpxZqXQf2qXuVlTPuG6Y8p4u9dKRaue4yjmC7ZhzVO2/Yyyn25znrPQ==} + '@types/pg@8.21.0': + resolution: {integrity: sha512-AYdtudzabjLZgVgRZmAnU8bAnVUXzuJX2IYHeSIiIHm68olD+LgQYCGWdtcNYnP0uq9c4S4NibVG3Ni7VbKW7Q==} - '@types/pg@8.20.0': - resolution: {integrity: sha512-bEPFOaMAHTEP1EzpvHTbmwR8UsFyHSKsRisLIHVMXnpNefSbGA1bD6CVy+qKjGSqmZqNqBDV2azOBo8TgkcVow==} - - '@types/react-dom@19.2.3': - resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} + '@types/react-dom@19.2.2': + resolution: {integrity: sha512-9KQPoO6mZCi7jcIStSnlOWn2nEF3mNmyr3rIAsGnAbQKYbRLyqmeSc39EVgtxXVia+LMT8j3knZLAZAh+xLmrw==} peerDependencies: '@types/react': ^19.2.0 - '@types/react@19.2.15': - resolution: {integrity: sha512-eRwcGNHve+E8qtEQSSRl6urh+rFop4v8gm6O8rGv25CodbvFdLjA1vVQ1KkiFE0w0UPOnb8tDiFKL5lp0rtY5Q==} - - '@types/set-cookie-parser@2.4.10': - resolution: {integrity: sha512-GGmQVGpQWUe5qglJozEjZV/5dyxbOOZ0LHe/lqyWssB88Y4svNfst0uqBVscdDeIKl5Jy5+aPSvy7mI9tYRguw==} - - '@types/statuses@2.0.6': - resolution: {integrity: sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA==} - - '@types/tedious@4.0.14': - resolution: {integrity: sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw==} + '@types/react@19.2.2': + resolution: {integrity: sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA==} '@types/trusted-types@2.0.7': resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} @@ -3286,67 +3294,67 @@ packages: '@types/ws@8.18.1': resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - '@typescript-eslint/eslint-plugin@8.59.4': - resolution: {integrity: sha512-PegsU+XfyJJNjd4+u/k6f9yTyp0lEXXiPopUNobZcIAUJFGICFLN+sP0Rb3JehVmiij1Ph0dFGYqODoRo/2+6A==} + '@typescript-eslint/eslint-plugin@8.50.0': + resolution: {integrity: sha512-O7QnmOXYKVtPrfYzMolrCTfkezCJS9+ljLdKW/+DCvRsc3UAz+sbH6Xcsv7p30+0OwUbeWfUDAQE0vpabZ3QLg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.59.4 - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.1.0' + '@typescript-eslint/parser': ^8.50.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/parser@8.59.4': - resolution: {integrity: sha512-zORHqO/tuhxY1zWuTvMUqddRxpiFJ72xVfcNoWpqdLjs6lfPbuQBJuW4pk+49/uBMy7Ssr4bzgjiKmmDB1UbZQ==} + '@typescript-eslint/parser@8.50.0': + resolution: {integrity: sha512-6/cmF2piao+f6wSxUsJLZjck7OQsYyRtcOZS02k7XINSNlz93v6emM8WutDQSXnroG2xwYlEVHJI+cPA7CPM3Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.1.0' + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/project-service@8.59.4': - resolution: {integrity: sha512-Ly00Vu4oAacfDeHp2Zg85ioNG6l8HG+tN1D7J+xTHSxu9y0awYKJ2zH1rFBn8ZSfuGK+7FxK3Cgl3uAz0aZZLg==} + '@typescript-eslint/project-service@8.50.0': + resolution: {integrity: sha512-Cg/nQcL1BcoTijEWyx4mkVC56r8dj44bFDvBdygifuS20f3OZCHmFbjF34DPSi07kwlFvqfv/xOLnJ5DquxSGQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '>=4.8.4 <6.1.0' + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/scope-manager@8.59.4': - resolution: {integrity: sha512-mUeR/3H1WrTAddJrwut8OoPjfauaztMQmRwV5fQTUyNVJCLiUXXe4lGEyYIL2oFDpP7UtgbGJXCt72wT0z2S3Q==} + '@typescript-eslint/scope-manager@8.50.0': + resolution: {integrity: sha512-xCwfuCZjhIqy7+HKxBLrDVT5q/iq7XBVBXLn57RTIIpelLtEIZHXAF/Upa3+gaCpeV1NNS5Z9A+ID6jn50VD4A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.59.4': - resolution: {integrity: sha512-DLCpnKgD4alVxTBSKulK+gU1KCqOgUXfDRDXh2mZgzokQKa/70ax93I2uVO3m/LLvIAtWZIFoiifudmIqAxpMA==} + '@typescript-eslint/tsconfig-utils@8.50.0': + resolution: {integrity: sha512-vxd3G/ybKTSlm31MOA96gqvrRGv9RJ7LGtZCn2Vrc5htA0zCDvcMqUkifcjrWNNKXHUU3WCkYOzzVSFBd0wa2w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '>=4.8.4 <6.1.0' + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/type-utils@8.59.4': - resolution: {integrity: sha512-uonTuPAAKr9XaBGqJ3LjYTh72zy5DyGesljO9gtmk/eFW0W1fRHjnwVYKB35Lm8d5Q5CluEW3gPHjTvZTmgrfA==} + '@typescript-eslint/type-utils@8.50.0': + resolution: {integrity: sha512-7OciHT2lKCewR0mFoBrvZJ4AXTMe/sYOe87289WAViOocEmDjjv8MvIOT2XESuKj9jp8u3SZYUSh89QA4S1kQw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.1.0' + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/types@8.59.4': - resolution: {integrity: sha512-F1o7WJcCq+bc8dwcO/YsSEOudAH8RDtaOhM6wcAQhcUsFhnWQl81JKy48q1hoxAU0qrzM89+31GYh1515Zde3Q==} + '@typescript-eslint/types@8.50.0': + resolution: {integrity: sha512-iX1mgmGrXdANhhITbpp2QQM2fGehBse9LbTf0sidWK6yg/NE+uhV5dfU1g6EYPlcReYmkE9QLPq/2irKAmtS9w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.59.4': - resolution: {integrity: sha512-F+RuOmcDXo4+TPdfd/TCLS3m2nw8gE9XXyZLrA3JBfaA5tz9TtdkyD3YJFmPxulyc2cKbEok/CvFE3MgSLWnag==} + '@typescript-eslint/typescript-estree@8.50.0': + resolution: {integrity: sha512-W7SVAGBR/IX7zm1t70Yujpbk+zdPq/u4soeFSknWFdXIFuWsBGBOUu/Tn/I6KHSKvSh91OiMuaSnYp3mtPt5IQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '>=4.8.4 <6.1.0' + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/utils@8.59.4': - resolution: {integrity: sha512-cYXeNAUsG4lJo5dbc1FcKm+JwIWrj1/UpTORsC6tGMjEZ81DYcvIr9/ueikhMa/Y/gDQYGp+YX9/xQrXje5BJw==} + '@typescript-eslint/utils@8.50.0': + resolution: {integrity: sha512-87KgUXET09CRjGCi2Ejxy3PULXna63/bMYv72tCAlDJC3Yqwln0HiFJ3VJMst2+mEtNtZu5oFvX4qJGjKsnAgg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.1.0' + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/visitor-keys@8.59.4': - resolution: {integrity: sha512-U3gxVaDVnuZKhSspW/MzMxE1kq7zOdc072FcSNoqA1I9p8HyKbBFfEHoWckBAMgNMph4MamwS5iTVzFmrnt8TQ==} + '@typescript-eslint/visitor-keys@8.50.0': + resolution: {integrity: sha512-Xzmnb58+Db78gT/CCj/PVCvK+zxbnsw6F+O1oheYszJbBSdEjVhQi3C/Xttzxgi/GLmpvOggRs1RFpiJ8+c34Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@ungap/structured-clone@1.3.1': - resolution: {integrity: sha512-mUFwbeTqrVgDQxFveS+df2yfap6iuP20NAKAsBt5jDEoOTDew+zwLAOilHCeQJOVSvmgCX4ogqIrA0mnyr08yQ==} + '@ungap/structured-clone@1.3.3': + resolution: {integrity: sha512-60YRaenCQcVjYEKOcG824+DRGGIQ3VKErcBoAEDJZz5bKIs2ZG+X/H9Nk+Q6EVkwJk5QNApxbrc5QtBSwtrXAg==} '@unrs/resolver-binding-android-arm-eabi@1.12.2': resolution: {integrity: sha512-g5T90pqg1bo/7mytQx6F4iBNC0Wsh9cu+z9veDbFjc7HjpesJFWD7QMS0NGStXM075+7dJPPVvBbpZlnrdpi/w==} @@ -3465,16 +3473,16 @@ packages: resolution: {integrity: sha512-7qJHGxpQgQr9/vmeS1PktEwvNAF7TI4iJDi8Pu2CFZ9YUGHZH4fOP5TfYlZ4aVxfopnELiE4BS4FBjyK7V1/xQ==} engines: {node: '>=16.0.0'} - '@upstash/qstash@2.11.0': - resolution: {integrity: sha512-AfPPxsUeOJCrxMQ9dkh1RZL40wgxCsUNFkxrbBSomC3U4j4qKFRawU8sDK+dqqH+sZFUS1biVM4GK46d5Tg2Vg==} + '@upstash/qstash@2.11.3': + resolution: {integrity: sha512-d5saGTDlkbKDFSANENtyf+zqkJen9ho17S24x9lXo+DwWjZ9IDM5WKUzUsshUv8ufZsSpxJWyrZ8jZ6r8dBuhg==} '@upstash/ratelimit@2.0.8': resolution: {integrity: sha512-YSTMBJ1YIxsoPkUMX/P4DDks/xV5YYCswWMamU8ZIfK9ly6ppjRnVOyBhMDXBmzjODm4UQKcxsJPvaeFAijp5w==} peerDependencies: '@upstash/redis': ^1.34.3 - '@upstash/redis@1.38.0': - resolution: {integrity: sha512-wu+dZBptlLy0+MCUEoHmzrY/TnmgDey3+c7EbIGwrLqAvkP8yi5MWZHYGIFtAygmL4Bkz2TdFu+eU0vFPncIcg==} + '@upstash/redis@1.38.2': + resolution: {integrity: sha512-RZ+JaRCVIS+ZTGnjOnDMr+/0aqDxsBb5rV6aW+Pys4SGELwr5lwE3UbLHRCHqMQ5Ulxj0b/CFBHfbmE175Otog==} '@vercel/analytics@2.0.1': resolution: {integrity: sha512-MTQG6V9qQrt1tsDeF+2Uoo5aPjqbVPys1xvnIftXSJYG2SrwXRHnqEvVoYID7BTruDz4lCd2Z7rM1BdkUehk2g==} @@ -3505,6 +3513,41 @@ packages: vue-router: optional: true + '@visx/curve@4.0.1-alpha.0': + resolution: {integrity: sha512-jRu61Uz274pV1zyioXmboyrLutYbnKsgjj4njSGCnhdXj5GkZvZbg+ThDb6oOzoAnJOBRLz4rzPlWvNJOzuVMg==} + + '@visx/event@4.0.1-alpha.0': + resolution: {integrity: sha512-EQqCMSv/s8NbFjo+hz3FKsvvYfP+2QslsFJ/24/O5l/W+7UC6J6aAvO0ujVwrTwdYbuQ+vhxKi1xdPdKR/qj1g==} + + '@visx/grid@4.0.1-alpha.0': + resolution: {integrity: sha512-rycutGmTHO+znNdPumheWMglm7YfpffvRwUkVy5zy4WoORIuKTMkDxwnOzHG2xMxU3EE/YCd37xFV5AxA30yeg==} + peerDependencies: + react: ^16.14.0 || ^17.0.0-0 || ^18.0.0-0 || ^19.0.0-0 + + '@visx/group@4.0.1-alpha.0': + resolution: {integrity: sha512-V19l7iQ7jccBv8kao/EByuI6o4xtxzzLV9nqVI1hRvmdzTVsuLpqlwzYCZUXJaTVvUWf8s4D2SQFjGkj/Nw+0w==} + peerDependencies: + react: ^16.14.0 || ^17.0.0-0 || ^18.0.0-0 || ^19.0.0-0 + + '@visx/point@4.0.1-alpha.0': + resolution: {integrity: sha512-ijTfr/Nx09f03vIj9nyTr3z4Xth4Y75427UaogJh6dnIRLMEFHQOwNu791sbfiNj0a+ZXuaE32h0vKrFe4/8Qg==} + + '@visx/responsive@4.0.1-alpha.0': + resolution: {integrity: sha512-o+1zGywQZY0+yOx3Iw87wc4bbPJRr/HnIukTwfOz4UVyj9pB1OQNVHB7OORO1+LBHJceWpB31co/ZV9KHncKrA==} + peerDependencies: + react: ^16.14.0 || ^17.0.0-0 || ^18.0.0-0 || ^19.0.0-0 + + '@visx/scale@4.0.1-alpha.0': + resolution: {integrity: sha512-nzjeE87vFSAXGWFiiNfBpNLAf0Q8Qmf6syvKLjqNi4kGZkdhbUll3E/59YsgWXmjM8+llPLWzGsP+JPvo5eq1A==} + + '@visx/shape@4.0.1-alpha.0': + resolution: {integrity: sha512-62QeiVNmPlterQGwhkEDcbq7M0MqY0lBsK5QKXtM9ZoPZWkuGV3aykA3+Xu20B2FAvyJq4LqJzBc7Sxr+EAdbA==} + peerDependencies: + react: ^16.14.0 || ^17.0.0-0 || ^18.0.0-0 || ^19.0.0-0 + + '@visx/vendor@4.0.0-alpha.0': + resolution: {integrity: sha512-6I+MuqXBcv9jnlcVowHoHKSdk9gXTWkHLKyqBwRWg7LY6A3Ei8SHfubpqGV5rBUSppxMq2RszPJUS6w+H0YgmQ==} + '@webassemblyjs/ast@1.14.1': resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} @@ -3569,19 +3612,18 @@ packages: peerDependencies: acorn: ^8 - acorn-import-phases@1.0.4: - resolution: {integrity: sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==} - engines: {node: '>=10.13.0'} - peerDependencies: - acorn: ^8.14.0 - acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn@8.16.0: - resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + + acorn@8.18.0: + resolution: {integrity: sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==} engines: {node: '>=0.4.0'} hasBin: true @@ -3589,10 +3631,6 @@ packages: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} - agent-base@7.1.4: - resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} - engines: {node: '>= 14'} - ajv-formats@2.1.1: resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} peerDependencies: @@ -3614,8 +3652,8 @@ packages: peerDependencies: ajv: ^8.8.2 - ajv@6.15.0: - resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} ajv@8.20.0: resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} @@ -3628,8 +3666,8 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - ansi-regex@6.2.2: - resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + ansi-regex@6.3.0: + resolution: {integrity: sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==} engines: {node: '>=12'} ansi-styles@4.3.0: @@ -3697,6 +3735,10 @@ packages: asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + atomically@1.7.0: + resolution: {integrity: sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w==} + engines: {node: '>=10.12.0'} + atomically@2.1.1: resolution: {integrity: sha512-P4w9o2dqARji6P7MHprklbfiArZAWvo07yW7qs3pdljb3BWr12FIB7W+p0zJiuiVsUpRO0iZn1kFFcpPegg0tQ==} @@ -3708,12 +3750,12 @@ packages: resolution: {integrity: sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==} engines: {node: '>= 6.0.0'} - axe-core@4.11.4: - resolution: {integrity: sha512-KunSNx+TVpkAw/6ULfhnx+HWRecjqZGTOyquAoWHYLRSdK1tB5Ihce1ZW+UY3fj33bYAFWPu7W/GRSmmrCGuxA==} + axe-core@4.13.0: + resolution: {integrity: sha512-UzGt8zg7Ny8djbYMhxl2zuEevVa7r2gJjYY5Lwr1xM7+XU2nd6CkIWFTVcCIbAP63vSz71NaVyyuSk9lHKcy0A==} engines: {node: '>=4'} - axios@1.16.1: - resolution: {integrity: sha512-caYkukvroVPO8KrzuJEb50Hm07KwfBZPEC3VeFHTsqWHvKTsy54hjJz9BS/cdaypROE2rH6xvm9mHX4fgWkr3A==} + axios@1.19.0: + resolution: {integrity: sha512-ht/iuYZXEjFxLH/Hkezgd7m6JKlHHXEUSneaDz8uZe1Gj5QZtCnpyDsckvAiEnT89OEbCLmnte4R4sn7P0EKFw==} axobject-query@4.1.0: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} @@ -3733,8 +3775,8 @@ packages: resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} engines: {node: ^4.5.0 || >= 5.9} - baseline-browser-mapping@2.10.32: - resolution: {integrity: sha512-wbPvpyjJPC0zdfdKXxqEL3Ea+bOMD/87X4lftiJkkaBiuG6ALQy1SLmEd7BSmVCuwCQsBrCamgBoLyfFDD1EPg==} + baseline-browser-mapping@2.11.14: + resolution: {integrity: sha512-JyJ954WzuIR8/FFzX0o5krdSTrBAkcCSRfWSleRsIHSWV+cZe2FI1PKggVkFke1hBldRs+LRxUczzE9iPmgZww==} engines: {node: '>=6.0.0'} hasBin: true @@ -3742,8 +3784,8 @@ packages: resolution: {integrity: sha512-GlF5wPWnSa/X5LKM1o0wz0suXIINz1iHRLvTS+sLyi7XPbe5ycmYI3DlZqVGZZtDgl4DmasFg7gOB3JYbphV5g==} hasBin: true - better-auth@1.6.11: - resolution: {integrity: sha512-Wwt6+q07dwIhsp6XiM7L1qSXVUWBEtNl+eZvwM778CguFqDZFBN9Pt6LtFaHl55t8Z+Zc//5kxcbgDY8/79vFQ==} + better-auth@1.6.29: + resolution: {integrity: sha512-7i2kOry+Jb1mRUR14kCDVS23GCKUGWxayZRXULbNz/6nFLPT6XSuGJVrwo/d+Qfq/iubA0/4Acw2/eg/tPCCnA==} peerDependencies: '@lynx-js/react': '*' '@prisma/client': ^5.0.0 || ^6.0.0 || ^7.0.0 @@ -3804,34 +3846,37 @@ packages: vue: optional: true - better-call@1.3.5: - resolution: {integrity: sha512-kOFJkBP7utAQLEYrobZm3vkTH8mXq5GNgvjc5/XEST1ilVHaxXUXfeDeFlqoETMtyqS4+3/h4ONX2i++ebZrvA==} + better-call@1.4.0: + resolution: {integrity: sha512-bBKOT4vv1kZLDgxVePdilk/Jwkn+dtRRsmi3DzHcDP+WnswyVl6dR59l2HEeP/0cB+bDoopASAesWDPIdd/zZA==} peerDependencies: zod: ^4.0.0 peerDependenciesMeta: zod: optional: true - better-result@2.9.2: - resolution: {integrity: sha512-WIFoBPCdnTOdk9inkE1ZRvCZ4P0CpSkAiLlchC65N7n9DcjZ3NhqkBOlafzpOVnO8ixyi37kicmSJ3ENhPZl7Q==} + better-result@2.10.0: + resolution: {integrity: sha512-oQhh0y1qo2/ZKdAAEvHZAqKKiHOFU5k/bW96fE2ScgQOVkJRiHwB+nOS1SgFsYqRlxMDWvefXi9Q3px7QvgNDw==} - body-parser@2.2.2: - resolution: {integrity: sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==} + body-parser@2.3.0: + resolution: {integrity: sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==} engines: {node: '>=18'} - brace-expansion@1.1.14: - resolution: {integrity: sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==} + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} - brace-expansion@5.0.6: - resolution: {integrity: sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==} - engines: {node: 18 || 20 || >=22} + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + + brace-expansion@5.0.9: + resolution: {integrity: sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==} + engines: {node: 20 || >=22} braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - browserslist@4.28.2: - resolution: {integrity: sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==} + browserslist@4.28.8: + resolution: {integrity: sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -3858,8 +3903,8 @@ packages: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} - call-bind@1.0.9: - resolution: {integrity: sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==} + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} engines: {node: '>= 0.4'} call-bound@1.0.4: @@ -3870,8 +3915,11 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - caniuse-lite@1.0.30001793: - resolution: {integrity: sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA==} + caniuse-lite@1.0.30001761: + resolution: {integrity: sha512-JF9ptu1vP2coz98+5051jZ4PwQgd2ni8A+gYSN7EA7dPKIMf0pDlSUxhdmVOaV3/fYK5uWBkgSXJaRLr4+3A6g==} + + caniuse-lite@1.0.30001809: + resolution: {integrity: sha512-xxWVywk6a6Arlk+hymeycyn/VgqEfLDxupvhH/xiY5SJ/18kmi9o6MiO320DCUzypORHLtvh0I4i04tUhCNHNQ==} ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -3896,10 +3944,6 @@ packages: character-reference-invalid@2.0.1: resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} - chart.js@4.5.1: - resolution: {integrity: sha512-GIjfiT9dbmHRiYi6Nl2yFCq7kkwdkp1W/lp2J99rX0yo9tgJGn3lKQATztIjb5tVtevcBtIdICNWqlq5+E8/Pw==} - engines: {pnpm: '>=8'} - chokidar@4.0.3: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} @@ -3915,12 +3959,15 @@ packages: citty@0.2.2: resolution: {integrity: sha512-+6vJA3L98yv+IdfKGZHBNiGW5KHn22e/JwID0Strsz8h4S/csAu/OuICwxrg44k5MRiZHWIo8XXuJgQTriRP4w==} - cjs-module-lexer@2.2.0: - resolution: {integrity: sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==} + cjs-module-lexer@2.2.1: + resolution: {integrity: sha512-Ca8swihM+/4yKecYHY52kgJd300hi2lADU/a1RxNTRe+RJ9jvqQlESpbz9DnG9mowez8qwXHB8qYdIUw9e+F5Q==} class-variance-authority@0.7.1: resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} + classnames@2.5.1: + resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} + cli-cursor@5.0.0: resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} engines: {node: '>=18'} @@ -3929,17 +3976,9 @@ packages: resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} engines: {node: '>=6'} - cli-width@4.1.0: - resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} - engines: {node: '>= 12'} - client-only@0.0.1: resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} - cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} - clsx@2.1.1: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} @@ -4002,6 +4041,10 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + conf@10.2.0: + resolution: {integrity: sha512-8fLl9F04EJqjSqH+QjITQfJF8BrOVaYr1jewVgSRAEWePfxT0sku4w2hrGQ60BC/TNLGQ2pgxNlTbWQmMPFvXg==} + engines: {node: '>=12'} + conf@15.1.0: resolution: {integrity: sha512-Uy5YN9KEu0WWDaZAVJ5FAmZoaJt9rdK6kH+utItPyGsCqCgaTKkrmZx3zoE0/3q6S3bcp3Ihkk+ZqPxWxFK5og==} engines: {node: '>=20'} @@ -4017,8 +4060,8 @@ packages: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} - content-type@2.0.0: - resolution: {integrity: sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==} + content-type@2.1.0: + resolution: {integrity: sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==} engines: {node: '>=18'} convert-source-map@2.0.0: @@ -4032,10 +4075,6 @@ packages: resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} engines: {node: '>= 0.6'} - cookie@1.1.1: - resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} - engines: {node: '>=18'} - core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} @@ -4049,8 +4088,8 @@ packages: cose-base@2.2.0: resolution: {integrity: sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==} - cosmiconfig@9.0.1: - resolution: {integrity: sha512-hr4ihw+DBqcvrsEDioRO31Z17x71pUYoNe/4h6Z0wB72p7MU7/9gH8Q3s12NFhHPfYBBOV3qyfUxmr/Yn3shnQ==} + cosmiconfig@9.0.2: + resolution: {integrity: sha512-gtTZxTDau1wL7Y7zifc2dd8jHSK/k6BTx/2Xp/BpdlAdnlYWFVt7qhJqgwi7637yRwRQ3qL4ZidbB4I8tA5VOg==} engines: {node: '>=14'} peerDependencies: typescript: '>=4.9.5' @@ -4064,6 +4103,7 @@ packages: crypto-js@4.2.0: resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} + deprecated: Active development of CryptoJS has been discontinued. This library is no longer maintained. css-tree@3.2.1: resolution: {integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==} @@ -4074,8 +4114,8 @@ packages: engines: {node: '>=4'} hasBin: true - csstype@3.2.3: - resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} cytoscape-cose-bilkent@4.1.0: resolution: {integrity: sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==} @@ -4087,13 +4127,17 @@ packages: peerDependencies: cytoscape: ^3.2.0 - cytoscape@3.34.0: - resolution: {integrity: sha512-62rNSrioXw93uliKFBwjukeQyeWwH2PqDrTac31r2P6464u3AUvTk0xS4LVvT251g7IgkFunrI48ZEZGjywSOg==} + cytoscape@3.34.1: + resolution: {integrity: sha512-Lr0RvH9H75y9ar8h9Toy6u4lxRSCcxUq+hHcQ26sVWo6BnaQp1gwEZOYqwuYTZhyW7npyKnNLP8oJ2p1/3OZ7g==} engines: {node: '>=0.10'} d3-array@2.12.1: resolution: {integrity: sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==} + d3-array@3.2.1: + resolution: {integrity: sha512-gUY/qeHq/yNqqoCKNq4vtpFLdoCdvyNpWoC/KNjhGbhDuQpAM9sIQQKkXSNpXa9h5KySs/gzm7R88WkUutgwWQ==} + engines: {node: '>=12'} + d3-array@3.2.4: resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} engines: {node: '>=12'} @@ -4118,6 +4162,10 @@ packages: resolution: {integrity: sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==} engines: {node: '>=12'} + d3-delaunay@6.0.2: + resolution: {integrity: sha512-IMLNldruDQScrcfT+MWnazhHbDJhcRJyOEBAJfwQnHle1RPh6WDuLvxNArUju2VSMSUuKlY5BGHRJ2cYyoFLQQ==} + engines: {node: '>=12'} + d3-delaunay@6.0.4: resolution: {integrity: sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==} engines: {node: '>=12'} @@ -4147,10 +4195,18 @@ packages: resolution: {integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==} engines: {node: '>=12'} + d3-format@3.1.0: + resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} + engines: {node: '>=12'} + d3-format@3.1.2: resolution: {integrity: sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==} engines: {node: '>=12'} + d3-geo@3.1.0: + resolution: {integrity: sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==} + engines: {node: '>=12'} + d3-geo@3.1.1: resolution: {integrity: sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==} engines: {node: '>=12'} @@ -4236,10 +4292,6 @@ packages: damerau-levenshtein@1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} - data-uri-to-buffer@4.0.1: - resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} - engines: {node: '>= 12'} - data-view-buffer@1.0.2: resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} engines: {node: '>= 0.4'} @@ -4252,11 +4304,15 @@ packages: resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} engines: {node: '>= 0.4'} - date-fns@4.3.0: - resolution: {integrity: sha512-OYcL+3N/jyWbYdFGqoMAhytDgxP9pbYPUUiRCOgn4Fewaadk9l/Wam4Avciiyp2BgkpfQyBV9B+ehnVJych+eQ==} + date-fns@4.4.0: + resolution: {integrity: sha512-+1UMbeh68lH1SegH83CGWwpb6OHHbpSgr3+s5Eww5M4CAgswBpoWS0AjTOfEJ33HiYKz1hdj/KTFprzXHmq/6w==} + + dayjs@1.11.22: + resolution: {integrity: sha512-1YRnxzt/AabP3GHxnaB9/b+ZScCKu5TeF+co+BWG+lnWVIwEcTFc1FVE0WLNmNO3sA6GGXL40i5qkHfbLzpwrg==} - dayjs@1.11.21: - resolution: {integrity: sha512-98IT+HOahAisibz/yjKbzuOBwYcjJ7BCLPzARyHiyEBmRz4fatF+KPJszEHXsGYjUG234aH/cOjW1wwTbKUZlA==} + debounce-fn@4.0.0: + resolution: {integrity: sha512-8pYCQiL9Xdcg0UPSD3d+0KMlOjp+KGU5EPwYddgzQ7DATsg4fuUDjQtsYLmWjnk2obnNHgV3vE2Y4jejSOJVBQ==} + engines: {node: '>=10'} debounce-fn@6.0.0: resolution: {integrity: sha512-rBMW+F2TXryBwB54Q0d8drNEI+TfoS9JpNTAoVpukbWEhjXQq4rySFYLaqXMFXwdv61Zb2OHtj5bviSoimqxRQ==} @@ -4312,14 +4368,18 @@ packages: resolution: {integrity: sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==} engines: {node: '>=18'} - default-browser@5.5.0: - resolution: {integrity: sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==} + default-browser@5.5.1: + resolution: {integrity: sha512-m1pAzaJgZ/gssEqlOhJkPJp8Xly7QyW6xcrkUa2KKcDeDSEMP7X8xipU3snUcfisTQx0w1AGae+9UtJSfVnXGw==} engines: {node: '>=18'} define-data-property@1.1.4: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} + define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + define-lazy-prop@3.0.0: resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} engines: {node: '>=12'} @@ -4371,8 +4431,8 @@ packages: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} - docx@9.6.1: - resolution: {integrity: sha512-ZJja9/KBUuFC109sCMzovoq2GR2wCG/AuxivjA+OHj/q0TEgJIm3S7yrlUxIy3B+bV8YDj/BiHfWyrRFmyWpDQ==} + docx@9.7.1: + resolution: {integrity: sha512-ilXFf9Moz47ABjFpDiA5s1w9lpb4EFSp7+5iiJSbfyYDM+bpZdAgLlSr7fW4aXhVe/E+F6QCv0EvRVFEd5CsWg==} engines: {node: '>=10'} dom-serializer@2.0.0: @@ -4385,16 +4445,20 @@ packages: resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} engines: {node: '>= 4'} - dompurify@3.4.11: - resolution: {integrity: sha512-zhlUV12GsaRzMsf9q5M254YhA4+VuF0fG+QFqu6aYpoGlKtz+w8//jBcGVYBgQkR5GHjUomejY84AV+/uPbWdw==} + dompurify@3.4.13: + resolution: {integrity: sha512-2vmYIoqjze2d+kakP8S/nS5shfsl587kzwEjcGlTdiksUVgFHnFCsLYDVj/JNqJVOQZGSYBTmuycv0PodwmnMQ==} domutils@3.2.2: resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} - dot-prop@10.1.0: - resolution: {integrity: sha512-MVUtAugQMOff5RnBy2d9N31iG0lNwg1qAoAOn7pOK5wf94WIaE3My2p3uwTQuvS2AcqchkcR3bHByjaM0mmi7Q==} + dot-prop@10.2.0: + resolution: {integrity: sha512-BTJ9aZYL3vCfZlZOBLy9v8TUqWGQ0pzFnygKwFZt5udj6viBoFIBviKPUoZLDCPn1FoXffv6McQFDenrm5Krfw==} engines: {node: '>=20'} + dot-prop@6.0.1: + resolution: {integrity: sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==} + engines: {node: '>=10'} + dotenv@16.6.1: resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} engines: {node: '>=12'} @@ -4407,18 +4471,17 @@ packages: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} - eciesjs@0.4.18: - resolution: {integrity: sha512-wG99Zcfcys9fZux7Cft8BAX/YrOJLJSZ3jyYPfhZHqN2E+Ffx+QXBDsv3gubEgPtV6dTzJMSQUwk1H98/t/0wQ==} - engines: {bun: '>=1', deno: '>=2', node: '>=16'} - ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} effect@3.20.0: resolution: {integrity: sha512-qMLfDJscrNG8p/aw+IkT9W7fgj50Z4wG5bLBy0Txsxz8iUHjDIkOgO3SV0WZfnQbNG2VJYb0b+rDLMrhM4+Krw==} - electron-to-chromium@1.5.361: - resolution: {integrity: sha512-Q6Hts7N9FnJc5LeGRINFvLhCI9xZmNtTDe5ZbcVezQz7cU4a8Aua3GH1b8J2XY8Al9PF+OCwYqhgsOOheMdvkA==} + electron-to-chromium@1.5.407: + resolution: {integrity: sha512-4R8XgQOdfxexCd/u63lRm6wCHjECwI45MV9wxAs2ggtfWe2hwlo1ql97jKsju2IcJ+jFSTwBssyYoiWhh7mauQ==} + + elkjs@0.11.1: + resolution: {integrity: sha512-zxxR9k+rx5ktMwT/FwyLdPCrq7xN6e4VGGHH8hA01vVYKjTFik7nHOxBnAYtrgYUB1RpAiLvA1/U2YraWxyKKg==} embla-carousel-react@8.6.0: resolution: {integrity: sha512-0/PjqU7geVmo6F734pmPqpyHqiM99olvyecY7zdweCw+6tKEXnrE90pBiBbMMU8s5tICemzpQ3hi5EpxzGW+JA==} @@ -4436,9 +4499,6 @@ packages: emoji-regex@10.6.0: resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} @@ -4454,12 +4514,12 @@ packages: resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==} engines: {node: '>=10.0.0'} - engine.io@6.6.8: - resolution: {integrity: sha512-2agL3ueZhqxoVrfmntO8yuVj+uNSlIOnhykYHk3Cq0ShYPdUjjUiSJrQvXjq01I9jAuI0Zl2YO8Evv5Mqytm5g==} + engine.io@6.6.9: + resolution: {integrity: sha512-clKkw4C7nJ22mGgoVcCg6V/W/TxdNyIOTr89k2ONZu81qqkddPFDF0LXcbAwhzPD8DjkiRCjzuiO6Y+fkpD4vg==} engines: {node: '>=10.2.0'} - enhanced-resolve@5.22.0: - resolution: {integrity: sha512-xYcDWrpELkFzz9SpZ3PlI6Eu6eD93Yf0WLDRxikGhWJ3MAir2SNZTIVCVZqZ/NUyx8AdMc2gT9C0gPiw18kG+A==} + enhanced-resolve@5.24.5: + resolution: {integrity: sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A==} engines: {node: '>=10.13.0'} enquirer@2.4.1: @@ -4481,8 +4541,8 @@ packages: error-ex@1.3.4: resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} - es-abstract@1.24.2: - resolution: {integrity: sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==} + es-abstract@1.24.0: + resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} engines: {node: '>= 0.4'} es-define-property@1.0.1: @@ -4493,15 +4553,15 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-iterator-helpers@1.3.2: - resolution: {integrity: sha512-HVLACW1TppGYjJ8H6/jqH/pqOtKRw6wMlrB23xfExmFWxFquAIWCmwoLsOyN96K4a5KbmOf5At9ZUO3GZbetAw==} + es-iterator-helpers@1.2.1: + resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==} engines: {node: '>= 0.4'} - es-module-lexer@2.1.0: - resolution: {integrity: sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==} + es-module-lexer@2.3.1: + resolution: {integrity: sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==} - es-object-atoms@1.1.2: - resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==} + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} engines: {node: '>= 0.4'} es-set-tostringtag@2.1.0: @@ -4516,8 +4576,8 @@ packages: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} - es-toolkit@1.46.1: - resolution: {integrity: sha512-5eNtXOs3tbfxXOj04tjjseeWkRWaoCjdEI+96DgwzZoe6c9juL49pXlzAFTI72aWC9Y8p7168g6XIKjh7k6pyQ==} + es-toolkit@1.50.0: + resolution: {integrity: sha512-OyZKhUVvEep9ITEiwHn8GKnMRQIVqoSIX7WnRbkWgJkllCujilqP2rD0u979tkl8wqyc8ICwlc1UBVv/Sl1G6w==} esast-util-from-estree@2.0.0: resolution: {integrity: sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==} @@ -4530,8 +4590,8 @@ packages: engines: {node: '>=18'} hasBin: true - esbuild@0.28.0: - resolution: {integrity: sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw==} + esbuild@0.28.2: + resolution: {integrity: sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==} engines: {node: '>=18'} hasBin: true @@ -4575,8 +4635,8 @@ packages: eslint-plugin-import-x: optional: true - eslint-module-utils@2.12.1: - resolution: {integrity: sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==} + eslint-module-utils@2.14.0: + resolution: {integrity: sha512-W2WCRZ9Dqntd+2u8jJcVMV2PKulc6RdLgUUoh/yQr3uB6lo/ZOeGx11sv60/8S4QFFKNslAlWhr9u0Ef7ZW6Ig==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -4640,12 +4700,8 @@ packages: resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint-visitor-keys@5.0.1: - resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - - eslint@9.39.4: - resolution: {integrity: sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==} + eslint@9.39.1: + resolution: {integrity: sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -4663,6 +4719,10 @@ packages: engines: {node: '>=4'} hasBin: true + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + esquery@1.7.0: resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} engines: {node: '>=0.10'} @@ -4721,8 +4781,8 @@ packages: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} - eventsource-parser@3.0.8: - resolution: {integrity: sha512-70QWGkr4snxr0OXLRWsFLeRBIRPuQOvt4s8QYjmUlmlkyTZkRqS7EDVRZtzU3TiyDbXSzaOeF0XUKy8PchzukQ==} + eventsource-parser@3.1.1: + resolution: {integrity: sha512-EKN1vKAMcZ8MlYMpaNuxN6R9yakzH6uajHcHVTqWJzvu5pWw9DyhbP35HH8MVBQ+dZjAfDxk+A8NiR9KWaXiyQ==} engines: {node: '>=18.0.0'} eventsource@3.0.7: @@ -4737,8 +4797,8 @@ packages: resolution: {integrity: sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==} engines: {node: ^18.19.0 || >=20.5.0} - express-rate-limit@8.5.2: - resolution: {integrity: sha512-5Kb34ipNX694DH48vN9irak1Qx30nb0PLYHXfJgw4YEjiC3ZEmZJhwOp+VfiCYwFzvFTdB9QkArYS5kXa2cx2A==} + express-rate-limit@8.6.2: + resolution: {integrity: sha512-YH4ru+eOJxQABscKFfRCy9R7x9QFGdezclVMwwgFFndzS2Xnm0uo6B0ABZsLhcpeptGv2qvuJVWlQr9gQZoC3A==} engines: {node: '>= 16'} peerDependencies: express: '>= 4.11' @@ -4747,8 +4807,8 @@ packages: resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==} engines: {node: '>= 18'} - exsolve@1.0.8: - resolution: {integrity: sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==} + exsolve@1.1.1: + resolution: {integrity: sha512-9U/jZUgjnSGyntRr6y5Muu1MJcwFl6kPu7k8qLF0IMNfLqvw0NZ4nnVDq0RVoZ0RvCyumib4Ez3KYrVfilrw+g==} extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} @@ -4757,11 +4817,14 @@ packages: resolution: {integrity: sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A==} engines: {node: '>=8.0.0'} + fast-decode-uri-component@1.0.1: + resolution: {integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==} + fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - fast-equals@5.4.0: - resolution: {integrity: sha512-jt2DW/aNFNwke7AUd+Z+e6pz39KO5rzdbbFCg2sGafS4mk13MI7Z8O5z9cADNn5lhGODIgLwug6TZO2ctf7kcw==} + fast-equals@5.4.1: + resolution: {integrity: sha512-DjlFSM5Pk9cGcL0q5QXl66eGzx0N6szNgaswwc5ZphlBohjTVJSnGgI+rJVOgOi65qUoQnDZN4nDqi33udtydQ==} engines: {node: '>=6.0.0'} fast-glob@3.3.1: @@ -4778,23 +4841,17 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + fast-querystring@1.1.2: + resolution: {integrity: sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==} + fast-sha256@1.3.0: resolution: {integrity: sha512-n11RGP/lrWEFI/bWdygLxhI+pVeo1ZYIVwvvPkW7azl/rOy+F3HYRZ2K5zeE9mmkhQppyv9sQFx0JM9UabnpPQ==} - fast-string-truncated-width@3.0.3: - resolution: {integrity: sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==} - - fast-string-width@3.0.2: - resolution: {integrity: sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==} + fast-uri@3.1.5: + resolution: {integrity: sha512-gHwA1O9LDIcKunMKhObS/HimwtehO1nPUECKAu5TpKgaO19fcWEl4bliWe1jWxVFvIXztJjjQ4L8XQ1EU9f7Jw==} - fast-uri@3.1.2: - resolution: {integrity: sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==} - - fast-wrap-ansi@0.2.2: - resolution: {integrity: sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==} - - fastq@1.20.1: - resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} + fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} @@ -4805,10 +4862,6 @@ packages: picomatch: optional: true - fetch-blob@3.2.0: - resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} - engines: {node: ^12.20 || >= 14.13} - figures@6.1.0: resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} engines: {node: '>=18'} @@ -4825,6 +4878,14 @@ packages: resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==} engines: {node: '>= 18.0.0'} + find-my-way@9.7.0: + resolution: {integrity: sha512-f2JHn75x2JlwUwLenZypgczR7YWMb/uO9BvUXtus+JMgkbIkLADd38cI4EiV+OQqrGo1Zlq6V8wnqMJ8e62wUQ==} + engines: {node: '>=20'} + + find-up@3.0.0: + resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} + engines: {node: '>=6'} + find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} @@ -4833,8 +4894,8 @@ packages: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} - flatted@3.4.2: - resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} follow-redirects@1.16.0: resolution: {integrity: sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==} @@ -4853,23 +4914,16 @@ packages: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} - form-data@4.0.5: - resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} + form-data@4.0.6: + resolution: {integrity: sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==} engines: {node: '>= 6'} - formdata-polyfill@4.0.10: - resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} - engines: {node: '>=12.20.0'} - - forwarded-parse@2.1.2: - resolution: {integrity: sha512-alTFZZQDKMporBH77856pXgzhEzaUVmLCDk+egLgIgHst3Tpndzz8MnKe+GzRJRfvVdn69HhpW7cmXzvtLvJAw==} - forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} - framer-motion@12.40.0: - resolution: {integrity: sha512-uaBd3qC1v3KQqBEjwTUd183K6PbS+j0yR9w9VmEOLWA/tnUcSn8Xa3uck7t4dgpDoUss8xQTcj8W2L07lrnLFg==} + framer-motion@12.43.0: + resolution: {integrity: sha512-1eaL3RvR/kAlbG7UYcpMptEyzPoENO0c6w7ZnB3/hh2vSAz/6uGAFn6fdoqTBguNstf3MsFhJHsD/0DHiclG+g==} peerDependencies: '@emotion/is-prop-valid': '*' react: ^18.0.0 || ^19.0.0 @@ -4886,8 +4940,8 @@ packages: resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} engines: {node: '>= 0.8'} - fs-extra@11.3.5: - resolution: {integrity: sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg==} + fs-extra@11.4.0: + resolution: {integrity: sha512-EQsFzMUJkCKGr1ePqlYADkIUmHW1s3ZXr5Yqy6wbGrfUCphpl2maM/kyOIRA2HpP3AaFQTZXD4ldjek+nccddA==} engines: {node: '>=14.14'} fsevents@2.3.3: @@ -4993,18 +5047,10 @@ packages: generate-function@2.3.1: resolution: {integrity: sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==} - generator-function@2.0.1: - resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} - engines: {node: '>= 0.4'} - gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - get-east-asian-width@1.6.0: resolution: {integrity: sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==} engines: {node: '>=18'} @@ -5040,11 +5086,11 @@ packages: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} - get-tsconfig@4.14.0: - resolution: {integrity: sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==} + get-tsconfig@4.14.2: + resolution: {integrity: sha512-XpwZALwwl/BaKTAyC6+c5T8y6kCg2jk+XGqOVrKIQmW49pNypYLMRjCUXqa28tQgJlhS2RlzP7sc+Rx7W6qsfw==} - giget@3.2.0: - resolution: {integrity: sha512-GvHTWcykIR/fP8cj8dMpuMMkvaeJfPvYnhq0oW+chSeIr+ldX21ifU2Ms6KBoyKZQZmVaUAAhQ2EZ68KJF8a7A==} + giget@3.3.1: + resolution: {integrity: sha512-r+mvuDjrjMpsdw46Kmeydb8bdHm7wOKw8wNBtTndkjbPjgAp5oUJUxRE76wZFknxIPokfWvep2qSXK37aXE6zg==} hasBin: true github-slugger@2.0.0: @@ -5058,17 +5104,10 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} - glob-to-regexp@0.4.1: - resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - glob@13.0.6: resolution: {integrity: sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==} engines: {node: 18 || 20 || >=22} - globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} - globals@14.0.0: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} @@ -5084,16 +5123,12 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - grammex@3.1.12: - resolution: {integrity: sha512-6ufJOsSA7LcQehIJNCO7HIBykfM7DXQual0Ny780/DEcJIpBlHRvcqEBWGPYd7hrXL2GJ3oJI1MIhaXjWmLQOQ==} + grammex@3.1.13: + resolution: {integrity: sha512-LnPnhOBLEJEVKS8WFDVaA397L9Kq55Q9oSITJiVLHVdhAclfUkWzQv74KhvZHKL2Q09Pb1XdsrOsZ4LfTFFTEg==} graphmatch@1.1.1: resolution: {integrity: sha512-5ykVn/EXM1hF0XCaWh05VbYvEiOL2lY1kBxZtaYsyvjp7cmWOU1XsAdfQBwClraEofXDT197lFbXOEVMHpvQOg==} - graphql@16.14.0: - resolution: {integrity: sha512-BBvQ/406p+4CZbTpCbVPSxfzrZrbnuWSP1ELYgyS6B+hNeKzgrdB4JczCa5VZUBQrDa9hUngm0KnexY6pJRN5Q==} - engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} - hachure-fill@0.5.2: resolution: {integrity: sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==} @@ -5123,8 +5158,12 @@ packages: hash.js@1.1.7: resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} - hasown@2.0.3: - resolution: {integrity: sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==} + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hasown@2.0.4: + resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} engines: {node: '>= 0.4'} hast-util-to-estree@3.1.3: @@ -5142,11 +5181,8 @@ packages: hast-util-whitespace@3.0.0: resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} - headers-polyfill@5.0.1: - resolution: {integrity: sha512-1TJ6Fih/b8h5TIcv+1+Hw0PDQWJTKDKzFZzcKOiW1wJza3XoAQlkCuXLbymPYB8+ZQyw8mHvdw560e8zVFIWyA==} - - hono@4.12.22: - resolution: {integrity: sha512-7fvVPbB92zNRsQke+uiRGwtTuef0tB2Dg4hWxYfFNvkQhIltWoyi0ONReM5LWA+jJWS3nfT5lTq+qbsIpX0IQw==} + hono@4.13.2: + resolution: {integrity: sha512-JydRilDRkYBQMt9qR9U92mXxmbGqsqSn/IKOrh4e7/gEbn+0zSr8igTu0obwJoNGN4sez28DIql7FBHWydoJpA==} engines: {node: '>=16.9.0'} html-to-text@9.0.5: @@ -5156,6 +5192,9 @@ packages: html-void-elements@3.0.0: resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + html5parser@3.0.0: + resolution: {integrity: sha512-iNpSopa+4YHX50UOk825tBy7MghmXHo/ZpLskBYN0kAr1xhH8GlIMk5bLRXcZlfP3AnLUcSuFMu8C4MdOUxA8A==} + htmlparser2@8.0.2: resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} @@ -5163,17 +5202,10 @@ packages: resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} engines: {node: '>= 0.8'} - http-status-codes@2.3.0: - resolution: {integrity: sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA==} - https-proxy-agent@5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} - https-proxy-agent@7.0.6: - resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} - engines: {node: '>= 14'} - human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} @@ -5190,8 +5222,8 @@ packages: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} - iconv-lite@0.7.2: - resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} + iconv-lite@0.7.3: + resolution: {integrity: sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==} engines: {node: '>=0.10.0'} ignore@5.3.2: @@ -5213,8 +5245,8 @@ packages: immer@10.2.0: resolution: {integrity: sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw==} - immer@11.1.8: - resolution: {integrity: sha512-/tbkHMW7y10Lx6i1crLjD4/OhNkRG+Fo7byZHtah0547nIeXYcpIXaUh0IAQY6gO5459qpGGYapcEOHtFXkIuA==} + immer@11.1.17: + resolution: {integrity: sha512-8Vu44Y0MuMBlTQz/jQ8HEMYNq/bBqk87MnBwYR5mC8AthfhEXidZ5aT/oA/CUqboa8THKltnD9L3xyqhU/Sy1Q==} import-fresh@3.3.1: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} @@ -5254,8 +5286,8 @@ packages: resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} engines: {node: '>=12'} - ip-address@10.2.0: - resolution: {integrity: sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==} + ip-address@10.5.0: + resolution: {integrity: sha512-R5SnVLJmgYYvf2F2ZgwSBnelz5G4q5AxIC277GDfUaNbrZKNANcBC7RHqYYePlszf4kBolVkJauG0ZjHHFh55g==} engines: {node: '>= 12'} ipaddr.js@1.9.1: @@ -5294,6 +5326,10 @@ packages: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + is-core-module@2.16.2: resolution: {integrity: sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==} engines: {node: '>= 0.4'} @@ -5309,6 +5345,11 @@ packages: is-decimal@2.0.1: resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + is-docker@3.0.0: resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -5322,12 +5363,8 @@ packages: resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} engines: {node: '>= 0.4'} - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-generator-function@1.1.2: - resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} + is-generator-function@1.1.0: + resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} engines: {node: '>= 0.4'} is-glob@4.0.3: @@ -5358,9 +5395,6 @@ packages: resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} engines: {node: '>= 0.4'} - is-node-process@1.2.0: - resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==} - is-number-object@1.1.1: resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} engines: {node: '>= 0.4'} @@ -5369,6 +5403,10 @@ packages: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} + is-obj@2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + is-obj@3.0.0: resolution: {integrity: sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==} engines: {node: '>=12'} @@ -5442,6 +5480,10 @@ packages: resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} engines: {node: '>= 0.4'} + is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + is-wsl@3.1.1: resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==} engines: {node: '>=16'} @@ -5467,8 +5509,8 @@ packages: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} - jiti@2.4.2: - resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} + jiti@2.6.1: + resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} hasBin: true jiti@2.7.0: @@ -5478,14 +5520,14 @@ packages: jose@5.10.0: resolution: {integrity: sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==} - jose@6.2.3: - resolution: {integrity: sha512-YYVDInQKFJfR/xa3ojUTl8c2KoTwiL1R5Wg9YCydwH0x0B9grbzlg5HC7mMjCtUJjbQ/YnGEZIhI5tCgfTb4Hw==} + jose@6.2.9: + resolution: {integrity: sha512-XrchZOFZUl/T3vTwRe8XK+cJrGtMF4th1ARnDfwbBXFKThGhlsxEE4Zu03AD/bjJSt/9jT/mxrOCkJWOg77aPA==} js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - js-yaml@4.1.1: - resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true jsesc@3.1.0: @@ -5505,6 +5547,9 @@ packages: json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + json-schema-typed@7.0.3: + resolution: {integrity: sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A==} + json-schema-typed@8.0.2: resolution: {integrity: sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==} @@ -5548,9 +5593,9 @@ packages: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} - kysely@0.28.17: - resolution: {integrity: sha512-nbD8lB9EB3wNdMhOCdx5Li8DxnLbvKByylRLcJ1h+4SkrowVeECAyZlyiKMThF7xFdRz0jSQ2MoJr+wXux2y0Q==} - engines: {node: '>=20.0.0'} + kysely@0.29.5: + resolution: {integrity: sha512-ooa+eSbBNPTo3MycPEuW5jdrxQdQwdtB3LC3h43FiXQbIry5tR0C5lDG7eealK0E4D7XjrnOP5DIUg/LyjRMYQ==} + engines: {node: '>=22.0.0'} language-subtag-registry@0.3.23: resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} @@ -5651,9 +5696,9 @@ packages: linkifyjs@4.3.3: resolution: {integrity: sha512-P8aEP5U/D1/IlTY2OeYsErdwh9bGuLE30NcXtKEjgdHcahveQoQwM2yZNsioQHsWFz0P7KKudisbrzCgR0sDHg==} - loader-runner@4.3.2: - resolution: {integrity: sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w==} - engines: {node: '>=6.11.5'} + locate-path@3.0.0: + resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} + engines: {node: '>=6'} locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} @@ -5665,6 +5710,9 @@ packages: lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + lodash@4.18.1: + resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==} + log-symbols@6.0.0: resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==} engines: {node: '>=18'} @@ -5683,8 +5731,8 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true - lru-cache@11.5.0: - resolution: {integrity: sha512-5YgH9UJd7wVb9hIouI2adWpgqrrICkt070Dnj8EUY1+B4B2P9eRLPAkAAo6NICA7CEhOIeBHl46u9zSNpNu7zA==} + lru-cache@11.5.2: + resolution: {integrity: sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==} engines: {node: 20 || >=22} lru-cache@5.1.1: @@ -5694,8 +5742,8 @@ packages: resolution: {integrity: sha512-DqC6n3QQ77zdFpCMASA1a3Jlb64Hv2N2DciFGkO/4L9+q/IpIAuRlKOvCXabtRW6cQf8usbmM6BE/TOPysCdIA==} engines: {bun: '>=1.0.0', deno: '>=1.30.0', node: '>=8.0.0'} - lucide-react@1.16.0: - resolution: {integrity: sha512-dYwyPzb4MEKpGUmNYk3WKWPnMrHs3FKM+q94kAnJrcDIqqn1hq2xY8scaS2ovsOCM5D51ey2gaRG3PBb1vgoYQ==} + lucide-react@1.31.0: + resolution: {integrity: sha512-G8u2eEtoHUnUa9f8lbvqDhCiORMnYLdUEo06EEG9MQvHQrInKcX3Pa2TH39MM5qyzRcWETxB0+aOwAPI1g1kEg==} peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -5774,8 +5822,8 @@ packages: mdn-data@2.27.1: resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==} - media-typer@1.1.0: - resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} + media-typer@1.1.1: + resolution: {integrity: sha512-yz3xRaG20c6/BOzvYoDaGtPmGscs7YivItZEEqe6GbwNfHuxu9YNmvnEkMzKldAGY4/80pRcQRZSEnhquk9XuQ==} engines: {node: '>= 0.8'} merge-descriptors@2.0.0: @@ -5789,8 +5837,12 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - mermaid@11.15.0: - resolution: {integrity: sha512-pTMbcf3rWdtLiYGpmoTjHEpeY8seiy6sR+9nD7LOs8KfUbHE4lOUAprTRqRAcWSQ6MQpdX+YEsxShtGsINtPtw==} + meriyah@6.1.4: + resolution: {integrity: sha512-Sz8FzjzI0kN13GK/6MVEsVzMZEPvOhnmmI1lU5+/1cGOiK3QUahntrNNtdVeihrO7t9JpoH75iMNXg6R6uWflQ==} + engines: {node: '>=18.0.0'} + + mermaid@11.16.1: + resolution: {integrity: sha512-TQsq6u22fAn3rek5VOubrhKPo1g5hwC3FXUN9hiyupTckcYiGuuKGkNQrKYwGJkXUxZdojwRG46gsSCFZMDp4g==} micromark-core-commonmark@2.0.3: resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} @@ -5921,6 +5973,10 @@ packages: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} + mimic-fn@3.1.0: + resolution: {integrity: sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==} + engines: {node: '>=8'} + mimic-function@5.0.1: resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} engines: {node: '>=18'} @@ -5928,16 +5984,63 @@ packages: minimalistic-assert@1.0.1: resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} - minimatch@10.2.5: - resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} + minimatch@10.2.6: + resolution: {integrity: sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==} engines: {node: 18 || 20 || >=22} - minimatch@3.1.5: - resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + minimizer-webpack-plugin@5.6.1: + resolution: {integrity: sha512-DoeAZz8Q1C1znwsUzej1fdoi4jCf7/+Em27ouLqfK/+3m8G+D7yDhUwrc3CNhjSzGUN1kn7Iv4sWmjflQHenpw==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@minify-html/node': '*' + '@swc/core': '*' + '@swc/css': '*' + '@swc/html': '*' + clean-css: '*' + cssnano: '*' + csso: '*' + esbuild: '*' + html-minifier-terser: '*' + lightningcss: '*' + postcss: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@minify-html/node': + optional: true + '@swc/core': + optional: true + '@swc/css': + optional: true + '@swc/html': + optional: true + clean-css: + optional: true + cssnano: + optional: true + csso: + optional: true + esbuild: + optional: true + html-minifier-terser: + optional: true + lightningcss: + optional: true + postcss: + optional: true + uglify-js: + optional: true + minipass@7.1.3: resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} engines: {node: '>=16 || 14 >=14.17'} @@ -5945,14 +6048,14 @@ packages: module-details-from-path@1.0.4: resolution: {integrity: sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==} - motion-dom@12.40.0: - resolution: {integrity: sha512-HxU3ZaBwNPVQUBQf1xxgq+7JrPNZvjLVxgbpEZL7RrWJnsxOf0/OM+yrHG9ogLQ31Do/r57Oz2gQWPK+6q62mg==} + motion-dom@12.43.0: + resolution: {integrity: sha512-azKON4d9S65PEoFUiQTMTgPheEmzf2QngdRc50AKfJp9Q9mmcBVw22c8eMq9k8kxOFHdL7+WZY7N/5F/lwiDag==} motion-utils@12.39.0: resolution: {integrity: sha512-8nadJAJjTtqRkmRF36FoJTrywK9nnFmnPwnSMyxaOCU7GDjN9RTMJIxx9De8ErM+vpPhMccr/6fo5WciyQLnMQ==} - motion@12.40.0: - resolution: {integrity: sha512-yjrHUrBFW6kQvjJwRsoiPSAhC5tRwRqNGJWmiJ4CrGnbKp0V88AdzkhBmDoqIsIPfarOe0Uddd37Xq43/gIocA==} + motion@12.43.0: + resolution: {integrity: sha512-BQgQbSa9Hn3/mtbib0MK53y6JSANa+YKUKlaYnWzAVDH424RYQ5LVpV3pNiWH00BA2z4ojsSdMzqT7g2FQwjuQ==} peerDependencies: '@emotion/is-prop-valid': '*' react: ^18.0.0 || ^19.0.0 @@ -5968,20 +6071,6 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - msw@2.14.6: - resolution: {integrity: sha512-ALe+N10S72cyx94cMcy3Zs4HhXCj35sgeAL4c+WTvKi0zWnbd8/h0lcFqv0mb2P+aSgAdD7p9HzvA0DiUPxsyg==} - engines: {node: '>=18'} - hasBin: true - peerDependencies: - typescript: '>= 4.8.x' - peerDependenciesMeta: - typescript: - optional: true - - mute-stream@3.0.0: - resolution: {integrity: sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw==} - engines: {node: ^20.17.0 || >=22.9.0} - mysql2@3.15.3: resolution: {integrity: sha512-FBrGau0IXmuqg4haEZRBfHNWB5mUARw6hNwPDXXGg0XzVJ50mr/9hb267lvpVMnhZ1FON3qNd4Xfcez1rbFwSg==} engines: {node: '>= 8.0'} @@ -5990,18 +6079,18 @@ packages: resolution: {integrity: sha512-Tz09sEL2EEuv5fFowm419c1+a/jSMiBjI9gHxVLrVdbUkkNUUfjsVYs9pVZu5oCon/kmRh9TfLEObFtkVxmY0w==} engines: {node: '>=8.0.0'} - nanoid@3.3.12: - resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==} + nanoid@3.3.17: + resolution: {integrity: sha512-xQLf0A3HOMlgHq0n247/LRuAOYmB7dXJ/DvAxGvsSBij45XtBSmQycu+F8ODbHwns/XyFZagyL1+J0Offw1E0g==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - nanoid@5.1.11: - resolution: {integrity: sha512-v+KEsUv2ps74PaSKv0gHTxTCgMXOIfBEbaqa6w6ISIGC7ZsvHN4N9oJ8d4cmf0n5oTzQz2SLmThbQWhjd/8eKg==} + nanoid@5.1.16: + resolution: {integrity: sha512-kVrnsrJqMR8+oLJnGEmSWw9BivK5mt7H3FZatVRjrc5wGqFYuBxX1yG7+A7Gi5AefkX6t/oCkizcQgpu0cY1dQ==} engines: {node: ^18 || >=20} hasBin: true - nanostores@1.3.0: - resolution: {integrity: sha512-XPUa/jz+P1oJvN9VBxw4L9MtdFfaH3DAryqPssqhb2kXjmb9npz0dly6rCsgFWOPr4Yg9mTfM3MDZgZZ+7A3lA==} + nanostores@1.5.0: + resolution: {integrity: sha512-E0SrU7uLV/k4E6YbBIpQNDnRj00vgE5wlutM1sYVSAXDtHQosiRCGS9eKMKyiGg4ChXfDiJmTB+NCR3yXr6UAw==} engines: {node: ^20.0.0 || >=22.0.0} napi-postinstall@0.3.4: @@ -6054,13 +6143,8 @@ packages: sass: optional: true - node-domexception@1.0.0: - resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} - engines: {node: '>=10.5.0'} - deprecated: Use your platform's native DOMException instead - - node-exports-info@1.6.0: - resolution: {integrity: sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==} + node-exports-info@1.6.2: + resolution: {integrity: sha512-kXs9Go0cah0qHVV2v389IXQLdLCeE1xfFtjOAF+iobu0OIoG1pje8At2vMHyaPMiPMnG/LWP50twML21eMcAag==} engines: {node: '>= 0.4'} node-fetch@2.7.0: @@ -6072,12 +6156,8 @@ packages: encoding: optional: true - node-fetch@3.3.2: - resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - node-releases@2.0.46: - resolution: {integrity: sha512-GYVXHE2KnrzAfsAjl4uP++evGFCrAU1jta4ubEjIG7YWt/64Gqv66a30yKwWczVjA6j3bM4nBwH7Pk1JmDHaxQ==} + node-releases@2.0.53: + resolution: {integrity: sha512-D9UOmYG3UH1V+ENW56t5QXBwJw1YEY18ruVeus89Rw+SyIgjPkCO84bRzO3uNIYosJbNwiabWVn48o3uJLjxFQ==} engines: {node: '>=18'} normalize-path@3.0.0: @@ -6092,8 +6172,8 @@ packages: resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} engines: {node: '>=18'} - npm-to-yarn@3.0.1: - resolution: {integrity: sha512-tt6PvKu4WyzPwWUzy/hvPFqn+uwXO0K1ZHka8az3NnrhWJDmSqI8ncWq0fkL0k/lmmi5tAC11FXwXuh0rFbt1A==} + npm-to-yarn@3.2.0: + resolution: {integrity: sha512-K1HmQeZT2HrjpsR6KgqbN2FAXL2NrJJmNUSD9ck7HGTVu1JKXox8n9SB+tjbU8m8JGLF4OscrroPepew/L7/Xw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} nypm@0.6.6: @@ -6137,8 +6217,8 @@ packages: resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} engines: {node: '>= 0.4'} - ohash@2.0.11: - resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} + ohash@2.0.12: + resolution: {integrity: sha512-65S/5gk9YSsaRjcyf7Nfa6h/d3E8/1gslpXfI4W7Dxn/oap8IKRuNT5VXkLQ1YFKIEg4apRY4Pj6aiwFzrDdmw==} on-finished@2.4.1: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} @@ -6161,10 +6241,14 @@ packages: oniguruma-to-es@4.3.6: resolution: {integrity: sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==} - open@11.0.0: - resolution: {integrity: sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw==} + open@11.0.1: + resolution: {integrity: sha512-NzwMUB6C1D0+Kd+9iMS/H4k+Ck3cTX6Ckyfr/gAGlmvSE1LUQZnEZvWBi4PYmMwH/S5SMeTXnE+9uAz8uF+pWw==} engines: {node: '>=20'} + open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} @@ -6176,23 +6260,32 @@ packages: orderedmap@2.1.1: resolution: {integrity: sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==} - outvariant@1.4.3: - resolution: {integrity: sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==} - own-keys@1.0.1: resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} engines: {node: '>= 0.4'} + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} + p-locate@3.0.0: + resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} + engines: {node: '>=6'} + p-locate@5.0.0: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} - package-manager-detector@1.6.0: - resolution: {integrity: sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==} + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + package-manager-detector@1.8.0: + resolution: {integrity: sha512-yQA4H19AmPEoMUeavPMDIe1higySl/gH/yaQrkT/s07Qp+7pp2hYz30N3z2l5BkjVkF9Ow6o0wjJamm2y7Sn0A==} pako@1.0.11: resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} @@ -6225,6 +6318,10 @@ packages: path-data-parser@0.1.0: resolution: {integrity: sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==} + path-exists@3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} + path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -6244,9 +6341,6 @@ packages: resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} engines: {node: 18 || 20 || >=22} - path-to-regexp@6.3.0: - resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} - path-to-regexp@8.4.2: resolution: {integrity: sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==} @@ -6262,8 +6356,8 @@ packages: pg-cloudflare@1.4.0: resolution: {integrity: sha512-Vo7z/6rrQYxpNRylp4Tlob2elzbh+N/MOQbxFVWCxS7oEx6jF53GTJFxK2WWpKuBRkmiin4Mt+xofFDjx09R0A==} - pg-connection-string@2.13.0: - resolution: {integrity: sha512-EMnU9E2fSULdsbErBbMaXJvFeD9B4+nPcM3f+4lsiCR0BHLPrLVjv3DbyM2hgQQviKJaTWIRRTjKjWlHg3p2ig==} + pg-connection-string@2.14.0: + resolution: {integrity: sha512-XwWDGcLRGCXAR8F/AM5bG7Q+A3Wm2s6QeEjlOKZLlH3UYcguiqCWKyWXVag5TLTIjR7oOJUY8kcADaZgWPyLeg==} pg-int8@1.0.1: resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} @@ -6274,15 +6368,15 @@ packages: peerDependencies: pg: '>=8.0' - pg-protocol@1.14.0: - resolution: {integrity: sha512-n5taZ1kO3s9ngDTVxsEznOqCyToTgz0FLuPq0B33COy5pPpuWJpY3/2oRBVETuOgzdqRXfWpM9HIhp2LBBT1BA==} + pg-protocol@1.16.0: + resolution: {integrity: sha512-sILXutLVjCLjcDuOmvhX5e2Z4cS5qG/6Bu3VkpFwdf/633ElGLpEh9bgmuI5I4sqKqkifQiGyiCcx1HdtrK7tg==} pg-types@2.2.0: resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} engines: {node: '>=4'} - pg@8.21.0: - resolution: {integrity: sha512-AUP1EYJuHraQGsVoCQVIcM7TEJVGtDzxWtGFZd8rds9d+CCXlU5Js1rYgfLNvxy9iJrpHjGrRjoi/3BT9fRyiA==} + pg@8.23.0: + resolution: {integrity: sha512-Ip2EQCngowJLGOfCwkFhPXU7/ljlhn6Rxlmy4XYfL2Y+vyRM59+8uR2xqRWKdYmbXmxCFOAmKxBuSUCdF34qLg==} engines: {node: '>= 16.0.0'} peerDependencies: pg-native: '>=3.0.1' @@ -6296,16 +6390,20 @@ packages: picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - picomatch@2.3.2: - resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} - picomatch@4.0.4: - resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + + picomatch@4.0.5: + resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==} engines: {node: '>=12'} - picospinner@3.0.0: - resolution: {integrity: sha512-lGA1TNsmy2bxvRsTI2cV01kfTwKzZjnZSDmF9llYNyMHMrU4sP87lQ5taiIKm88L3cbswjl008nwyGc3WpNvzg==} + picospinner@3.1.2: + resolution: {integrity: sha512-0Z++uU8mvB0EvCPAEUq9BGiPcSravzJ+RPdXfjYlzXffqsogisiKRQqI6ctrSSJ6n985vxrgKtQ5n4sRINcJZg==} engines: {node: '>=18.0.0'} pkce-challenge@5.0.1: @@ -6315,6 +6413,10 @@ packages: pkg-types@2.3.1: resolution: {integrity: sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg==} + pkg-up@3.1.0: + resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==} + engines: {node: '>=8'} + points-on-curve@0.2.0: resolution: {integrity: sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==} @@ -6325,19 +6427,19 @@ packages: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} - postal-mime@2.7.4: - resolution: {integrity: sha512-0WdnFQYUrPGGTFu1uOqD2s7omwua8xaeYGdO6rb88oD5yJ/4pPHDA4sdWqfD8wQVfCny563n/HQS7zTFft+f/g==} + postal-mime@2.7.5: + resolution: {integrity: sha512-GNEXKvWFQnbgO5NlrGzVa0FmWzBZ24PersAWErttSg1Hjpf0ATxTwS5DOMGaOpTG6bUh5cTr7xi0jAD942wCJA==} - postcss-selector-parser@7.1.1: - resolution: {integrity: sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==} + postcss-selector-parser@7.1.5: + resolution: {integrity: sha512-KvvtD7SrlBP7dlgkBghEE3r84CABm5SmV2aNcG4oCA+qDnJ/tvKonFVvwWAyyWUEwxuNawdfEAZKP9zM3oZ2Uw==} engines: {node: '>=4'} postcss@8.4.31: resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} engines: {node: ^10 || ^12 || >=14} - postcss@8.5.15: - resolution: {integrity: sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==} + postcss@8.5.23: + resolution: {integrity: sha512-g50586zr4bZmwFiTlflMu8E0bDTb5I5gertgwAKmsdUlTQIhZtunzUlD1WSzwcVWPoAVpsrA6vlfCD7oXvRwgg==} engines: {node: ^10 || ^12 || >=14} postgres-array@2.0.0: @@ -6368,12 +6470,20 @@ packages: resolution: {integrity: sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==} engines: {node: '>=20'} + powershell-utils@0.2.0: + resolution: {integrity: sha512-ZlsFlG7MtSFCoc5xreOvBAozCJ6Pf06opgJjh9ONEv418xpZSAzNjstD36C6+JwOnfSqOW/9uDkqKjezTdxZhw==} + engines: {node: '>=20'} + prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - prettier@3.8.3: - resolution: {integrity: sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==} + prettier@3.7.4: + resolution: {integrity: sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==} + engines: {node: '>=14'} + + prettier@3.9.6: + resolution: {integrity: sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g==} engines: {node: '>=14'} hasBin: true @@ -6381,8 +6491,8 @@ packages: resolution: {integrity: sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==} engines: {node: '>=18'} - prisma@7.8.0: - resolution: {integrity: sha512-yfN4yrw7HV9kEJhoy1+jgah0jafEIQsf7uWouSsM8MvJtlubsk+kM7AIBWZ8+GJl74Yj3c+nbYqBkMOxtsZ3Lw==} + prisma@7.9.1: + resolution: {integrity: sha512-aPqePoZIqwlAchbgbFDO/wHqGB+7H1nj9gaM+OsL9h77S5S3TnLd9BgD3LnoeDikULo7cl2HSUrEyQ55Z7DYbg==} engines: {node: ^20.19 || ^22.12 || >=24.0} hasBin: true peerDependencies: @@ -6415,17 +6525,17 @@ packages: proper-lockfile@4.1.2: resolution: {integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==} - property-information@7.1.0: - resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} + property-information@7.2.0: + resolution: {integrity: sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==} prosemirror-changeset@2.4.1: resolution: {integrity: sha512-96WBLhOaYhJ+kPhLg3uW359Tz6I/MfcrQfL4EGv4SrcqKEMC1gmoGrXHecPE8eOwTVCJ4IwgfzM8fFad25wNfw==} - prosemirror-commands@1.7.1: - resolution: {integrity: sha512-rT7qZnQtx5c0/y/KlYaGvtG411S97UaL6gdp6RIZ23DLHanMYLyfGBV5DtSnZdthQql7W+lEVbpSfwtO8T+L2w==} + prosemirror-commands@1.7.2: + resolution: {integrity: sha512-q6Q6szxqdu9Xd6EcdKsqXghu5nQdZTpB4Q9yd04WRc7/jt763e/rT60Owh0L1GYY+T46o5rD+9lEN36dZS43tw==} - prosemirror-dropcursor@1.8.2: - resolution: {integrity: sha512-CCk6Gyx9+Tt2sbYk5NK0nB1ukHi2ryaRgadV/LvyNuO3ena1payM2z6Cg0vO1ebK8cxbzo41ku2DE5Axj1Zuiw==} + prosemirror-dropcursor@1.8.3: + resolution: {integrity: sha512-FoYbsJR8gK+DGlqhNoE29Loa38eIZPzQRIb1VMaDNBoo4OLP6vVof/jR8qFY/6XvUd6Dhug8MDCHl2a/h8RTfQ==} prosemirror-gapcursor@1.4.1: resolution: {integrity: sha512-pMdYaEnjNMSwl11yjEGtgTmLkR08m/Vl+Jj443167p9eB3HVQKhYCc4gmHVDsLPODfZfjr/MmirsdyZziXbQKw==} @@ -6433,11 +6543,14 @@ packages: prosemirror-history@1.5.0: resolution: {integrity: sha512-zlzTiH01eKA55UAf1MEjtssJeHnGxO0j4K4Dpx+gnmX9n+SHNlDqI2oO1Kv1iPN5B1dm5fsljCfqKF9nFL6HRg==} + prosemirror-inputrules@1.5.1: + resolution: {integrity: sha512-7wj4uMjKaXWAQ1CDgxNzNtR9AlsuwzHfdFH1ygEHA2KHF2DOEaXl1CJfNPAKCg9qNEh4rum975QLaCiQPyY6Fw==} + prosemirror-keymap@1.2.3: resolution: {integrity: sha512-4HucRlpiLd1IPQQXNqeo81BGtkY8Ai5smHhKW9jjPKRc2wQIxksg7Hl1tTI2IfT2B/LgX6bfYvXxEpJl7aKYKw==} - prosemirror-model@1.25.7: - resolution: {integrity: sha512-A79aN8QEFUwI6cax8Yq4Rpcx1TJZ3Kagn+ii7qLo4/V8H3mMiHrhFyhTyHHvpSnOgMPpWiDGSwM3etwrxE50ug==} + prosemirror-model@1.25.11: + resolution: {integrity: sha512-QWg9RhnpLlogAmp3p96uEFrE5txQpFynd4vhBAELkwgOCWQs/X0yCzB3/hrHqiPwf91RG5KyWq6553zs9JqIOQ==} prosemirror-schema-list@1.5.1: resolution: {integrity: sha512-927lFx/uwyQaGwJxLWCZRkjXG0p48KpMj6ueoYiu4JX05GGuGcgzAy62dfiV8eFZftgyBUvLx76RsMe20fJl+Q==} @@ -6451,8 +6564,8 @@ packages: prosemirror-transform@1.12.0: resolution: {integrity: sha512-GxboyN4AMIsoHNtz5uf2r2Ru551i5hWeCMD6E2Ib4Eogqoub0NflniaBPVQ4MrGE5yZ8JV9tUHg9qcZTTrcN4w==} - prosemirror-view@1.41.8: - resolution: {integrity: sha512-TnKDdohEatgyZNGCDWIdccOHXhYloJwbwU+phw/a23KBvJIR9lWQWW7WHHK3vBdOLDNuF7TaX98GObUZOWkOnA==} + prosemirror-view@1.42.2: + resolution: {integrity: sha512-Pdg0l5kXm8aLDquFAnQFTCITg0q44sLqBlHlpsVLD9segdOao8TOfQdAhCrCXyVgPSRr6UDDROOIWA3bIrN9YQ==} proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} @@ -6472,15 +6585,15 @@ packages: pure-rand@6.1.0: resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} - qs@6.15.2: - resolution: {integrity: sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==} + qs@6.15.3: + resolution: {integrity: sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==} engines: {node: '>=0.6'} queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - radix-ui@1.4.3: - resolution: {integrity: sha512-aWizCQiyeAenIdUbqEpXgRA1ya65P13NKn/W8rWkcN0OPkRDxdBVLWnIEDsS2RpwCK2nobI7oMUSmexzTDyAmA==} + radix-ui@1.6.7: + resolution: {integrity: sha512-QBdhh1arIEUvPC0dQ5+nwWAxt7+N+oP/9jPwjJkGFoSk/sqxg32gJtSXGtFh8frAIcS6oC9cx2Q+7KYCQLOAeA==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -6492,16 +6605,16 @@ packages: '@types/react-dom': optional: true - range-parser@1.2.1: - resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + range-parser@1.3.0: + resolution: {integrity: sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw==} engines: {node: '>= 0.6'} raw-body@3.0.2: resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} engines: {node: '>= 0.10'} - razorpay@2.9.6: - resolution: {integrity: sha512-zsHAQzd6e1Cc6BNoCNZQaf65ElL6O6yw0wulxmoG5VQDr363fZC90Mp1V5EktVzG45yPyNomNXWlf4cQ3622gQ==} + razorpay@2.9.8: + resolution: {integrity: sha512-Uqv3KV7JAfpLlabGdg8Cw7e7ieGkK/DighFq6iGkNnz0Y+it6+/lFmPCTfkcptc2EagL2Og25VWUxc+Fgp/+nA==} rc9@3.0.1: resolution: {integrity: sha512-gMDyleLWVE+i6Sgtc0QbbY6pEKqYs97NGi6isHQPqYlLemPoO8dxQ3uGi0f4NiP98c+jMW6cG1Kx9dDwfvqARQ==} @@ -6521,30 +6634,30 @@ packages: peerDependencies: react: ^19.1.0 - react-email@6.3.2: - resolution: {integrity: sha512-ZzmrwM+QLzfs/EZBnFZRMZwT3Kfvp46zIMCLsGn/rtRBh9ocRJDKHcnV0JWJyc0AVJTdPDHeFNBWap6N/3Dnhg==} + react-email@6.9.2: + resolution: {integrity: sha512-A6SiRdH1U7qJcfgpaJ1BYGud8GbnPwDw61l3PP3JR1qMAmBgTlL02UuCPwPOClwc1x+saUU9OxJfPQHMNaTBMA==} engines: {node: '>=20.0.0'} hasBin: true peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc react-dom: ^18.0 || ^19.0 || ^19.0.0-rc - react-hook-form@7.76.1: - resolution: {integrity: sha512-rYM7tPiWlu3nZchkR/ex7piyzui2vFPyaLnXnI/RnblB/L4qfMmyses8llJVtF1NpE9WBBsJlGtcSZzPCXW1qQ==} + react-hook-form@7.85.0: + resolution: {integrity: sha512-U2MTriFXnclmV4rOE20p2DcRFv5WEg3FIcBFOKcOLFHDVvGIMPvLTkTWefUsonmlaVy23khVDxDWym6uJVGOzw==} engines: {node: '>=18.0.0'} peerDependencies: react: ^16.8.0 || ^17 || ^18 || ^19 - react-icons@5.6.0: - resolution: {integrity: sha512-RH93p5ki6LfOiIt0UtDyNg/cee+HLVR6cHHtW3wALfo+eOHTp8RnU2kRkI6E+H19zMIs03DyxUG/GfZMOGvmiA==} + react-icons@5.7.0: + resolution: {integrity: sha512-LBLy340Rzqy6+/yVhZKT3B/QpP1BZaesGqasf09HPOBzRarcDIFH0WwXlXQfE7q7ipxK4MSiC5DIBWURCny6fw==} peerDependencies: react: '*' react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - react-medium-image-zoom@5.4.5: - resolution: {integrity: sha512-58QSIRK6X3uw2fSTejJRnH0JuKTZl7ZJYX+sAMaYx4YTEm33gsNdnP5RuQSCnBiAvisQeErqZWAT31bR89WB6g==} + react-medium-image-zoom@5.4.9: + resolution: {integrity: sha512-czBdTbJI6JEbqeRIT5M8D3j7TrffBfo00U0P0lzzd19usj8PiR1yPH7PK/vQlwBE/Sv9YFdJGN6XauJPi4jRyg==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -6581,8 +6694,8 @@ packages: '@types/react': optional: true - react-resizable-panels@4.11.1: - resolution: {integrity: sha512-kA4w58V6wYdRLm2rg9pzroZwGlqBLul1FjMP0J8kqTo3zSHtjeH+LXmZaldCo6+HWqs1e5hOcPoajKXdOze37Q==} + react-resizable-panels@4.12.3: + resolution: {integrity: sha512-GHMJWnDXui/3RX4bT+cgBP+N3N2nkwcoZATr/2xLFpqQQe7TlBrE0cGM0dUa9ceT7A90tUrSRsiqgRG+g0/2AA==} peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 @@ -6608,12 +6721,12 @@ packages: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} - readdirp@5.0.0: - resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==} + readdirp@5.1.1: + resolution: {integrity: sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==} engines: {node: '>= 20.19.0'} - recast@0.23.11: - resolution: {integrity: sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==} + recast@0.23.21: + resolution: {integrity: sha512-mFAyJq9vUbSTARLZUvAEf1z3YxlvAwswbmxMx2mPA/MSm4KmpwvwvhsH/NIrZhyOuwD60Lzyw2qh83uCbgTPYw==} engines: {node: '>= 4'} recharts@3.8.0: @@ -6687,10 +6800,6 @@ packages: remeda@2.33.4: resolution: {integrity: sha512-ygHswjlc/opg2VrtiYvUOPLjxjtdKvjGz1/plDhkG66hjNjFr1xmfrs2ClNFo/E6TyUFiwYNh53bKV26oBoMGQ==} - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - require-from-string@2.0.2: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} @@ -6705,8 +6814,8 @@ packages: reselect@5.2.0: resolution: {integrity: sha512-AgZ3UOZm3YndfrJ4OYjgrT7bmCm/1iqkjvEfH/oYjzh6PD2qw4QuT3jjnXIrpdt4MTpMXclMT3lXbmRY+XRakw==} - resend@6.12.3: - resolution: {integrity: sha512-FkEi6YPnVL96/LvH8+QP7NaeaBy5brYXwlRqUCqZZeNL0/iyKij18IPmyPXYauT/2ODn1JG04qKz+qlJfzqzTw==} + resend@6.20.0: + resolution: {integrity: sha512-fXDFt7jVMuka6ruS79DzaQFKPyxOAUtoYUGSl3dTUyOnFK9klmUULxADQRzFFtHfHRipYyy62jYcm4cMKqvtjw==} engines: {node: '>=20'} peerDependencies: '@react-email/render': '*' @@ -6721,6 +6830,10 @@ packages: resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + resolve@2.0.0-next.5: + resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} + hasBin: true + resolve@2.0.0-next.7: resolution: {integrity: sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ==} engines: {node: '>= 0.4'} @@ -6730,13 +6843,14 @@ packages: resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} engines: {node: '>=18'} + ret@0.5.0: + resolution: {integrity: sha512-I1XxrZSQ+oErkRR4jYbAyEEu2I0avBvvMM5JN+6EBprOGRCs63ENqZ3vjavq8fBw2+62G5LF5XelKwuJpcvcxw==} + engines: {node: '>=10'} + retry@0.12.0: resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} engines: {node: '>= 4'} - rettime@0.11.11: - resolution: {integrity: sha512-ILJRqVWBCTlg9r42fFgwVZx1gnFAcQF8mRoMkbgQfIrjEDf9nbBFDFx00oloOa+Q869FUtaYDXZvEfnecQSCoQ==} - reusify@1.1.0: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -6744,16 +6858,16 @@ packages: robust-predicates@3.0.3: resolution: {integrity: sha512-NS3levdsRIUOmiJ8FZWCP7LG3QpJyrs/TE0Zpf1yvZu8cAJJ6QMW92H1c7kWpdIHo8RvmLxN/o2JXTKHp74lUA==} - rollup@4.60.4: - resolution: {integrity: sha512-WHeFSbZYsPu3+bLoNRUuAO+wavNlocOPf3wSHTP7hcFKVnJeWsYlCDbr3mTS14FCizf9ccIxXA8sGL8zKeQN3g==} + rollup@4.62.4: + resolution: {integrity: sha512-RXOqwaPsBGjMNMa4sQjDjHieHEZDFoj/Rdr46l2MU5DfEs16wHJPC2RPTPHWhNl+M3aI472LLqFkFKut4SblOg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true rope-sequence@1.3.4: resolution: {integrity: sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==} - rou3@0.7.12: - resolution: {integrity: sha512-iFE4hLDuloSWcD7mjdCDhx2bKcIsYbtOTpfH5MHHLSKMOUyjqQXTeZVa289uuwEGEKFoE/BAPbhaU4B774nceg==} + rou3@0.9.2: + resolution: {integrity: sha512-3SOzvaAg8rkHrXtRjpCvCvbyO5to9oOO27Z/XqHEYXfMRVSw/qMIVdmaOk9W2lcRLtR6dlqTjo9hDeJk70QBYQ==} roughjs@4.6.6: resolution: {integrity: sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==} @@ -6772,8 +6886,8 @@ packages: rw@1.3.3: resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} - safe-array-concat@1.1.4: - resolution: {integrity: sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==} + safe-array-concat@1.1.3: + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} engines: {node: '>=0.4'} safe-buffer@5.1.2: @@ -6787,11 +6901,15 @@ packages: resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} engines: {node: '>= 0.4'} + safe-regex2@5.1.1: + resolution: {integrity: sha512-mOSBvHGDZMuIEZMdOz/aCEYDCv0E7nfcNsIhUF+/P+xC7Hyf3FkvymqgPbg9D1EdSGu+uKbJgy09K/RKKc7kJA==} + hasBin: true + safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - sax@1.6.0: - resolution: {integrity: sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==} + sax@1.6.1: + resolution: {integrity: sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==} engines: {node: '>=11.0.0'} scheduler@0.26.0: @@ -6807,12 +6925,15 @@ packages: selderee@0.11.0: resolution: {integrity: sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA==} + semifies@1.0.0: + resolution: {integrity: sha512-xXR3KGeoxTNWPD4aBvL5NUpMTT7WMANr3EWnaS190QVkY52lqqcVRD7Q05UVbBhiWDGWMlJEUam9m7uFFGVScw==} + semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.8.1: - resolution: {integrity: sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==} + semver@7.8.5: + resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} engines: {node: '>=10'} hasBin: true @@ -6827,8 +6948,8 @@ packages: resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==} engines: {node: '>= 18'} - set-cookie-parser@3.1.0: - resolution: {integrity: sha512-kjnC1DXBHcxaOaOXBHBeRtltsDG2nUiUni+jP92M9gYdW12rsmx92UsfpH7o5tDRs7I1ZZPSQJQGv3UaRfCiuw==} + set-cookie-parser@3.1.2: + resolution: {integrity: sha512-5/r/lTwbJ3zQ+qwdUFZYeRNqda7P5HD8zQKqlSjdGt1/S0cjLAphHusj4Y58ahDtWn/g32xrIS58/ikOvwl0Lw==} set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} @@ -6848,8 +6969,9 @@ packages: setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - shadcn@4.8.0: - resolution: {integrity: sha512-LAm3I/1FdoU/zu5GVG8Hbna4X9zlzEG5TeeCPXqsopkjvGk8QUF9OFhqeRN8oM6Oh/ynUI/yQHZxQAO3Ymcqsg==} + shadcn@4.18.0: + resolution: {integrity: sha512-tUFZgkYmfVNQVm3xX7lhSzOvDsp+O14ac5dwgXIr5mIsr79ISueb/Mu+ZtWMz0DH6v77u4eYyvbQ9TTMpSn3aw==} + engines: {node: '>=20.18.1'} hasBin: true sharp@0.34.5: @@ -6867,6 +6989,10 @@ packages: shiki@3.23.0: resolution: {integrity: sha512-55Dj73uq9ZXL5zyeRPzHQsK7Nbyt6Y10k5s7OjuFZGMhpp4r/rsLBH0o/0fstIzX1Lep9VxefWljK/SKCzygIA==} + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + side-channel-list@1.0.1: resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==} engines: {node: '>= 0.4'} @@ -6883,6 +7009,10 @@ packages: resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} engines: {node: '>= 0.4'} + side-channel@1.1.1: + resolution: {integrity: sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==} + engines: {node: '>= 0.4'} + signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} @@ -6893,22 +7023,34 @@ packages: sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - socket.io-adapter@2.5.7: - resolution: {integrity: sha512-e0LyK91f3cUxTmv95/KzoLg47+zF+s/sbxRGDNsyG4dmIP8ZSX8ax6byOxfJXeNNtS/8AZlfD+uP7gBeR7DLlg==} + smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} - socket.io-parser@4.2.6: - resolution: {integrity: sha512-asJqbVBDsBCJx0pTqw3WfesSY0iRX+2xzWEWzrpcH7L6fLzrhyF8WPI8UaeM4YCuDfpwA/cgsdugMsmtz8EJeg==} + socket.io-adapter@2.5.8: + resolution: {integrity: sha512-6Oy52pbg+kvdCVvjcN+FnY7BvxZ7cIHNScbvztT/It5d0vbwoJoVZmF2gjJmnV0/4WlXRfG15zc45ySk9Ah8bw==} + + socket.io-parser@4.2.7: + resolution: {integrity: sha512-IH/iSeO9T6gz1KkFleGDWkG9N3dl4jXVYUtMhIqH10Md0ttMer8nUNWiP1DKuNrybD2xBrixLJdCC9J6ECoYkg==} engines: {node: '>=10.0.0'} socket.io@4.8.3: resolution: {integrity: sha512-2Dd78bqzzjE6KPkD5fHZmDAKRNe3J15q+YHDrIsy9WEkqttc7GY+kT9OBLSMaPbQaEd0x1BjcmtMtXkfpc+T5A==} engines: {node: '>=10.2.0'} - sonner@2.0.7: - resolution: {integrity: sha512-W6ZN4p58k8aDKA4XPcx2hpIQXBRAgyiWVkYhT7CvK6D3iAu7xjvVyhQHg2/iaKJZ1XVJ4r7XuwGL+WGEK37i9w==} + socks@2.8.9: + resolution: {integrity: sha512-LJhUYUvItdQ0LkJTmPeaEObWXAqFyfmP85x0tch/ez9cahmhlBBLbIqDFnvBnUJGagb0JbIQrkBs1wJ+yRYpEw==} + engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + + sonner@2.0.8: + resolution: {integrity: sha512-UM/ByIoFra8yzV75n1o0Puu0bw5U/9UNnDacrJNspekBewIfsQ3D6ez1nvlWpt7aTsO6rujQtifBpycwIivqlg==} peerDependencies: + '@types/react': ^18.0.0 || ^19.0.0 react: ^18.0.0 || ^19.0.0 || ^19.0.0-rc react-dom: ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} @@ -6961,13 +7103,6 @@ packages: resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} engines: {node: '>= 0.4'} - strict-event-emitter@0.5.1: - resolution: {integrity: sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - string-width@7.2.0: resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} engines: {node: '>=18'} @@ -7069,8 +7204,11 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - svix@1.92.2: - resolution: {integrity: sha512-ZmuA3UVvlnF9EgxlzmPtF7CKjQb64Z6OFlyfdDfU0sdcC7dJa+3aOYX5B9mA+RS6ch1AxBa4UP/l6KmqfGtWBQ==} + systeminformation@5.33.1: + resolution: {integrity: sha512-DEN6ICHk3Tk0Uf/hrAHh7xlt7iL5CJFBtPZinA0H62DrGG/KPKqq/Nzj6lCXPS4Ay/sf/14zNnk9LpqKzBIc+w==} + engines: {node: '>=10.0.0'} + os: [darwin, linux, win32, freebsd, openbsd, netbsd, sunos, android] + hasBin: true tagged-tag@1.0.0: resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==} @@ -7079,79 +7217,29 @@ packages: tailwind-merge@3.6.0: resolution: {integrity: sha512-uxL7qAVQriqRQPAyK3pj66VqskWqoZ37PW94jwOTwNfq/z9oyu1V+eqrZqtR2+fCiXdYOZe/Modt8GtvqNzu+w==} - tailwindcss@4.3.0: - resolution: {integrity: sha512-y6nxMGB1nMW9R6k96e5gdIFzcfL/gTJRNaqGes1YvkLnPVXzWgbqFF2yLC0T8G774n24cx3Pe8XrKoniCOAH+Q==} + tailwindcss@4.3.3: + resolution: {integrity: sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ==} tapable@2.3.3: resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} engines: {node: '>=6'} - terser-webpack-plugin@5.6.0: - resolution: {integrity: sha512-Eum+5ajkaOhf5KbM26osvv21kLD7BaGqQ1UA4Ami4arYwylmGUQTgHFpHDdmJod1q4QXa66p0to/FBKID+J1vA==} - engines: {node: '>= 10.13.0'} - peerDependencies: - '@minify-html/node': '*' - '@swc/core': '*' - '@swc/css': '*' - '@swc/html': '*' - clean-css: '*' - cssnano: '*' - csso: '*' - esbuild: '*' - html-minifier-terser: '*' - lightningcss: '*' - postcss: '*' - uglify-js: '*' - webpack: ^5.1.0 - peerDependenciesMeta: - '@minify-html/node': - optional: true - '@swc/core': - optional: true - '@swc/css': - optional: true - '@swc/html': - optional: true - clean-css: - optional: true - cssnano: - optional: true - csso: - optional: true - esbuild: - optional: true - html-minifier-terser: - optional: true - lightningcss: - optional: true - postcss: - optional: true - uglify-js: - optional: true - - terser@5.48.0: - resolution: {integrity: sha512-J/9An6vs9Us6wKRriSFXBWdRZapREHqFzdNUKk0pmu804EMR6dr6winwo7e5JDxN4xahxQsuysyYFwlwj4XN/Q==} + terser@5.50.0: + resolution: {integrity: sha512-CN9BVxWhgS/hRxtUMjtC2uRWSTcSfQFHMDWma6sKKfIivCD91sM+FOPfvwoaRMqCSrUpe1nv3jDamd9eEQ4y+w==} engines: {node: '>=10'} hasBin: true tiny-invariant@1.3.3: resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} - tinyexec@1.2.1: - resolution: {integrity: sha512-iqo2IULiwCbMOLU9lVR5XMmXjWMh0ewJSFNOfFRHislSG31ESRnUg4awuiaFUcnINcz+oyQQY43QGh3rGn5aCA==} + tinyexec@1.3.0: + resolution: {integrity: sha512-QKAl9m8gWWGHV8jZcPeym6j+XULi6tOf1mT83WYJ4Lk2ytW/uwAWkrP0uFsdoYMdueVJ0qs26wZ+23xeB4ibNQ==} engines: {node: '>=18'} - tinyglobby@0.2.16: - resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} - tldts-core@7.0.32: - resolution: {integrity: sha512-GbSw6chU2HsHIB/NAyBJYxXQKpcqhtgY6bvWi90OarpbuMia+Z4Gw5BYiW4hJo1DzQ/6k9coba7FU/ijcgVLLw==} - - tldts@7.0.32: - resolution: {integrity: sha512-5eDV0tK2NhLAAqBeXDAQ36+EwuStd1HbsSOnGsp+JbExITnExcALLL5M1kTH8gjDYN5QvwmUWimE3GoMZ2A7xQ==} - hasBin: true - to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -7160,10 +7248,6 @@ packages: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} - tough-cookie@6.0.1: - resolution: {integrity: sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==} - engines: {node: '>=16'} - tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} @@ -7173,8 +7257,8 @@ packages: trough@2.2.0: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} - ts-api-utils@2.5.0: - resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} + ts-api-utils@2.1.0: + resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} engines: {node: '>=18.12'} peerDependencies: typescript: '>=4.8.4' @@ -7196,6 +7280,10 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + turbo@2.10.10: + resolution: {integrity: sha512-/90KTW+USzvYOPmafRZHVKLBsHXQ5810Ao/HdtJYAqguIhZ+XruS6eIUjqJUDtrSxaZYynNFht68qckGKAOWTA==} + hasBin: true + tw-animate-css@1.4.0: resolution: {integrity: sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==} @@ -7207,8 +7295,8 @@ packages: resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==} engines: {node: '>=8'} - type-fest@5.6.0: - resolution: {integrity: sha512-8ZiHFm91orbSAe2PSAiSVBVko18pbhbiB3U9GglSzF/zCGkR+rxpHx6sEMCUm4kxY4LjDIUGgCfUMtwfZfjfUA==} + type-fest@5.8.0: + resolution: {integrity: sha512-YGYEVz3Fm5iy/AybuA0oyNFq7H4CgQNfRp/qfe8nurE1kuCeNm3/vfm9X4Mtl+qLyaKJUh5xrFZwogr41SMjYA==} engines: {node: '>=20'} type-is@2.1.0: @@ -7231,10 +7319,9 @@ packages: resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} - typescript@5.9.3: - resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + typescript@5.9.2: + resolution: {integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==} engines: {node: '>=14.17'} - hasBin: true uint8array-extras@1.5.0: resolution: {integrity: sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==} @@ -7253,6 +7340,10 @@ packages: undici-types@7.24.6: resolution: {integrity: sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==} + undici@7.29.0: + resolution: {integrity: sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw==} + engines: {node: '>=20.18.1'} + unicorn-magic@0.3.0: resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} engines: {node: '>=18'} @@ -7292,11 +7383,8 @@ packages: unrs-resolver@1.12.2: resolution: {integrity: sha512-dmlRxBJJayXjqTwC+JtF1HhJmgf3ftQ3YejFcZrf4+KKtJv0qDsK1pjqaaVjG7wJ5NJ6UVP1OqRMQ71Z4C3rxQ==} - until-async@3.0.2: - resolution: {integrity: sha512-IiSk4HlzAMqTUseHHe3VhIGyuFmN90zMTpD3Z3y8jeQbzLIq500MVM7Jq2vUAnTKAFPJrqwkzr6PoTcPhGcOiw==} - - update-browserslist-db@1.2.3: - resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} + update-browserslist-db@1.3.1: + resolution: {integrity: sha512-ZZ61DsRsOnakl74HAmp3oSN4aXUmEWXf+i/yv0h7tIBfICc3VdrFErQKUUKPgu3AMsTUMbcongALEN4l6GSUrQ==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' @@ -7332,12 +7420,12 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - uuid@14.0.0: - resolution: {integrity: sha512-Qo+uWgilfSmAhXCMav1uYFynlQO7fMFiMVZsQqZRMIXp0O7rR7qjkj+cPvBHLgBqi960QCoo/PH2/6ZtVqKvrg==} + uuid@14.0.1: + resolution: {integrity: sha512-6ZxzVpzDXDa3bJWaHilVayA+BH/1zmxCJoVgvmqJnid/gPoKHxUrS/aC/T6LGQtNHT+XHG9fXPJB4d+IrU30Ew==} hasBin: true - valibot@1.2.0: - resolution: {integrity: sha512-mm1rxUsmOxzrwnX5arGS+U4T25RdvpPjPN4yR0u9pUBov9+zGVtO84tif1eY4r6zWxVxu3KzIyknJy3rxfRZZg==} + valibot@1.4.2: + resolution: {integrity: sha512-gjdCvJ6d3RyHAneqxMYMW9QMCwYMb3jpOO0IyHZV1bnRHFBHrX3VkIILt5XYR0WhwHiH7Mty8ovuPZ/O3gamrg==} peerDependencies: typescript: '>=5' peerDependenciesMeta: @@ -7370,23 +7458,19 @@ packages: w3c-keyname@2.2.8: resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} - watchpack@2.5.1: - resolution: {integrity: sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==} + watchpack@2.5.2: + resolution: {integrity: sha512-6i/00NBjP4yGPs+caKSyRfpTF/8Torsu0MOW3mMzIbhgISFder8i7xbqgHlLMwJrdiN8ndBV3UA1/AfzPSr+jg==} engines: {node: '>=10.13.0'} - web-streams-polyfill@3.3.3: - resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} - engines: {node: '>= 8'} - webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - webpack-sources@3.5.0: - resolution: {integrity: sha512-HPuy+uuoTCaaoEoI1LQ3JN9+vrPBvEesnnX1jADHy728cHSMlq4wUc4afYqahq2B1mhQVZxCXOkNTnXltr+2vQ==} + webpack-sources@3.5.1: + resolution: {integrity: sha512-jyuiGJdtvY434z5bUZrjz67v76/ePNvFZTp9Mdz29IlH4+GPsgyGjiv0fKI+M7BdkU6ADjulUcKAd3tUK3WlEw==} engines: {node: '>=10.13.0'} - webpack@5.107.1: - resolution: {integrity: sha512-mvdIWxj/H6QsfgDdH9djne3a5dYcmEmtsXGESkypaGN5jXjF/b+9KDlmTDQ2TKlFUeA2fI9Y65kihD30JOdB+Q==} + webpack@5.109.2: + resolution: {integrity: sha512-U9/cvLzxObKNEZ9+TtdqrHM5/9z3lgl2c+c4BzbqGxFQvQvBAq87yql5A8pQ+rrMbS496MZJeF5enVBndIy2hw==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: @@ -7413,8 +7497,8 @@ packages: resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} engines: {node: '>= 0.4'} - which-typed-array@1.1.20: - resolution: {integrity: sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==} + which-typed-array@1.1.19: + resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} engines: {node: '>= 0.4'} which@2.0.2: @@ -7431,15 +7515,11 @@ packages: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - ws@8.20.1: - resolution: {integrity: sha512-It4dO0K5v//JtTXuPkfEOaI3uUN87iYPnqo/ZzqCoG3g8uhA66QUMs/SrM0YK7/NAu+r4LMh/9dq2A7k+rHs+w==} + ws@8.21.3: + resolution: {integrity: sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -7450,8 +7530,8 @@ packages: utf-8-validate: optional: true - wsl-utils@0.3.1: - resolution: {integrity: sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==} + wsl-utils@1.0.0: + resolution: {integrity: sha512-Hl0ZOAs672vg+06kfujwRhoS6/jehvULrlFkuF2dRu6pHgA8U06h3xqNIqNNU1LTXPcedxByAR4GS6pwQK0mgA==} engines: {node: '>=20'} xml-js@1.6.11: @@ -7465,31 +7545,19 @@ packages: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} - - yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} - yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - yocto-spinner@1.2.0: - resolution: {integrity: sha512-Yw0hUB6UA3o4YUgKy3oSe9a4cxoaZ9sBfYDw+JSxo6Id0KoJGoxzPA24qqUXYKBWABs/zDSGTz9kww7t3F0XGw==} + yocto-spinner@1.2.2: + resolution: {integrity: sha512-DODGl1wJjA/s5pnJFKau9lIYHT81lnhob1i3e1TjxZRxEhWRKl74nTbWE6H5KlkViQQTo/Z29YFdxzTZAMY3ng==} engines: {node: '>=18.19'} - yoctocolors@2.1.2: - resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} + yoctocolors@2.2.0: + resolution: {integrity: sha512-xYqdZFUK/VYazNl/oCDYN+3WloWQwMfZxBoiNt6qNyk+xfOdi598muWE42rNZFp1kNOiqW936q5RhUdnpqElSg==} engines: {node: '>=18'} zeptomatch@2.1.0: @@ -7515,28 +7583,52 @@ snapshots: '@antfu/install-pkg@1.1.0': dependencies: - package-manager-detector: 1.6.0 - tinyexec: 1.2.1 + package-manager-detector: 1.8.0 + tinyexec: 1.3.0 + + '@apm-js-collab/code-transformer-bundler-plugins@0.7.4': + dependencies: + '@apm-js-collab/code-transformer': 0.18.1 + es-module-lexer: 2.3.1 + magic-string: 0.30.21 + module-details-from-path: 1.0.4 - '@babel/code-frame@7.29.0': + '@apm-js-collab/code-transformer@0.18.1': dependencies: - '@babel/helper-validator-identifier': 7.28.5 + '@types/estree': 1.0.8 + astring: 1.9.0 + esquery: 1.7.0 + meriyah: 6.1.4 + semifies: 1.0.0 + source-map: 0.6.1 + + '@apm-js-collab/tracing-hooks@0.13.0': + dependencies: + '@apm-js-collab/code-transformer': 0.18.1 + debug: 4.4.3 + module-details-from-path: 1.0.4 + transitivePeerDependencies: + - supports-color + + '@babel/code-frame@7.29.7': + dependencies: + '@babel/helper-validator-identifier': 7.29.7 js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.29.3': {} + '@babel/compat-data@7.29.7': {} - '@babel/core@7.29.0': + '@babel/core@7.29.7': dependencies: - '@babel/code-frame': 7.29.0 - '@babel/generator': 7.29.1 - '@babel/helper-compilation-targets': 7.28.6 - '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) - '@babel/helpers': 7.29.2 - '@babel/parser': 7.29.3 - '@babel/template': 7.28.6 - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.8 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) + '@babel/helpers': 7.29.7 + '@babel/parser': 7.29.8 + '@babel/template': 7.29.7 + '@babel/traverse': 7.29.8 + '@babel/types': 7.29.8 '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 debug: 4.4.3 @@ -7546,262 +7638,266 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/generator@7.29.1': + '@babel/generator@7.29.8': dependencies: - '@babel/parser': 7.29.3 - '@babel/types': 7.29.0 + '@babel/parser': 7.29.8 + '@babel/types': 7.29.8 '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 - '@babel/helper-annotate-as-pure@7.27.3': + '@babel/helper-annotate-as-pure@7.29.7': dependencies: - '@babel/types': 7.29.0 + '@babel/types': 7.29.8 - '@babel/helper-compilation-targets@7.28.6': + '@babel/helper-compilation-targets@7.29.7': dependencies: - '@babel/compat-data': 7.29.3 - '@babel/helper-validator-option': 7.27.1 - browserslist: 4.28.2 + '@babel/compat-data': 7.29.7 + '@babel/helper-validator-option': 7.29.7 + browserslist: 4.28.8 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.29.3(@babel/core@7.29.0)': + '@babel/helper-create-class-features-plugin@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-member-expression-to-functions': 7.28.5 - '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/helper-replace-supers': 7.28.6(@babel/core@7.29.0) - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/traverse': 7.29.0 + '@babel/core': 7.29.7 + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-member-expression-to-functions': 7.29.7 + '@babel/helper-optimise-call-expression': 7.29.7 + '@babel/helper-replace-supers': 7.29.7(@babel/core@7.29.7) + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 + '@babel/traverse': 7.29.8 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/helper-globals@7.28.0': {} + '@babel/helper-globals@7.29.7': {} - '@babel/helper-member-expression-to-functions@7.28.5': + '@babel/helper-member-expression-to-functions@7.29.7': dependencies: - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 + '@babel/traverse': 7.29.8 + '@babel/types': 7.29.8 transitivePeerDependencies: - supports-color - '@babel/helper-module-imports@7.28.6': + '@babel/helper-module-imports@7.29.7': dependencies: - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 + '@babel/traverse': 7.29.8 + '@babel/types': 7.29.8 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.28.6(@babel/core@7.29.0)': + '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-module-imports': 7.28.6 - '@babel/helper-validator-identifier': 7.28.5 - '@babel/traverse': 7.29.0 + '@babel/core': 7.29.7 + '@babel/helper-module-imports': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + '@babel/traverse': 7.29.8 transitivePeerDependencies: - supports-color - '@babel/helper-optimise-call-expression@7.27.1': + '@babel/helper-optimise-call-expression@7.29.7': dependencies: - '@babel/types': 7.29.0 + '@babel/types': 7.29.8 - '@babel/helper-plugin-utils@7.28.6': {} + '@babel/helper-plugin-utils@7.29.7': {} - '@babel/helper-replace-supers@7.28.6(@babel/core@7.29.0)': + '@babel/helper-replace-supers@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-member-expression-to-functions': 7.28.5 - '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/traverse': 7.29.0 + '@babel/core': 7.29.7 + '@babel/helper-member-expression-to-functions': 7.29.7 + '@babel/helper-optimise-call-expression': 7.29.7 + '@babel/traverse': 7.29.8 transitivePeerDependencies: - supports-color - '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + '@babel/helper-skip-transparent-expression-wrappers@7.29.7': dependencies: - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 + '@babel/traverse': 7.29.8 + '@babel/types': 7.29.8 transitivePeerDependencies: - supports-color - '@babel/helper-string-parser@7.27.1': {} + '@babel/helper-string-parser@7.29.7': {} - '@babel/helper-validator-identifier@7.28.5': {} + '@babel/helper-validator-identifier@7.29.7': {} - '@babel/helper-validator-option@7.27.1': {} + '@babel/helper-validator-option@7.29.7': {} - '@babel/helpers@7.29.2': + '@babel/helpers@7.29.7': dependencies: - '@babel/template': 7.28.6 - '@babel/types': 7.29.0 + '@babel/template': 7.29.7 + '@babel/types': 7.29.8 - '@babel/parser@7.27.0': + '@babel/parser@7.29.2': dependencies: - '@babel/types': 7.29.0 + '@babel/types': 7.29.8 - '@babel/parser@7.29.3': + '@babel/parser@7.29.8': dependencies: - '@babel/types': 7.29.0 + '@babel/types': 7.29.8 - '@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-typescript@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-modules-commonjs@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-modules-commonjs@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-typescript@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-typescript@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.29.3(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.0) + '@babel/core': 7.29.7 + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 + '@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.29.7) transitivePeerDependencies: - supports-color - '@babel/preset-typescript@7.28.5(@babel/core@7.29.0)': + '@babel/preset-typescript@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-modules-commonjs': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-typescript': 7.28.6(@babel/core@7.29.0) + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-validator-option': 7.29.7 + '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-modules-commonjs': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.29.7) transitivePeerDependencies: - supports-color - '@babel/runtime@7.29.2': {} + '@babel/runtime@7.29.7': {} - '@babel/template@7.28.6': + '@babel/template@7.29.7': dependencies: - '@babel/code-frame': 7.29.0 - '@babel/parser': 7.29.3 - '@babel/types': 7.29.0 + '@babel/code-frame': 7.29.7 + '@babel/parser': 7.29.8 + '@babel/types': 7.29.8 - '@babel/traverse@7.27.0': + '@babel/traverse@7.29.0': dependencies: - '@babel/code-frame': 7.29.0 - '@babel/generator': 7.29.1 - '@babel/parser': 7.27.0 - '@babel/template': 7.28.6 - '@babel/types': 7.29.0 + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.8 + '@babel/helper-globals': 7.29.7 + '@babel/parser': 7.29.2 + '@babel/template': 7.29.7 + '@babel/types': 7.29.8 debug: 4.4.3 - globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/traverse@7.29.0': + '@babel/traverse@7.29.8': dependencies: - '@babel/code-frame': 7.29.0 - '@babel/generator': 7.29.1 - '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.29.3 - '@babel/template': 7.28.6 - '@babel/types': 7.29.0 + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.8 + '@babel/helper-globals': 7.29.7 + '@babel/parser': 7.29.8 + '@babel/template': 7.29.7 + '@babel/types': 7.29.8 debug: 4.4.3 transitivePeerDependencies: - supports-color - '@babel/types@7.29.0': + '@babel/types@7.29.8': dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.28.5 + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 - '@base-ui/react@1.5.0(@date-fns/tz@1.5.0)(@types/react@19.2.15)(date-fns@4.3.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@base-ui/react@1.7.0(@date-fns/tz@1.5.0)(@types/react@19.2.2)(date-fns@4.4.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@babel/runtime': 7.29.2 - '@base-ui/utils': 0.2.9(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@floating-ui/react-dom': 2.1.8(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@floating-ui/utils': 0.2.11 + '@babel/runtime': 7.29.7 + '@base-ui/utils': 0.3.2(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@floating-ui/react-dom': 2.1.9(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@floating-ui/utils': 0.2.12 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) use-sync-external-store: 1.6.0(react@19.1.0) optionalDependencies: '@date-fns/tz': 1.5.0 - '@types/react': 19.2.15 - date-fns: 4.3.0 + '@types/react': 19.2.2 + date-fns: 4.4.0 - '@base-ui/utils@0.2.9(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@base-ui/utils@0.3.2(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@babel/runtime': 7.29.2 - '@floating-ui/utils': 0.2.11 + '@babel/runtime': 7.29.7 + '@floating-ui/utils': 0.2.12 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) reselect: 5.2.0 use-sync-external-store: 1.6.0(react@19.1.0) optionalDependencies: - '@types/react': 19.2.15 + '@types/react': 19.2.2 - '@better-auth/core@1.6.11(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.1)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0)': + '@better-auth/core@1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.0)': dependencies: - '@better-auth/utils': 0.4.0 - '@better-fetch/fetch': 1.1.21 - '@opentelemetry/semantic-conventions': 1.41.1 + '@better-auth/utils': 0.4.2 + '@better-fetch/fetch': 1.3.1 + '@opentelemetry/semantic-conventions': 1.43.0 '@standard-schema/spec': 1.1.0 - better-call: 1.3.5(zod@4.4.3) - jose: 6.2.3 - kysely: 0.28.17 - nanostores: 1.3.0 + better-call: 1.4.0(zod@4.4.3) + jose: 6.2.9 + kysely: 0.29.5 + nanostores: 1.5.0 zod: 4.4.3 optionalDependencies: '@opentelemetry/api': 1.9.1 - '@better-auth/drizzle-adapter@1.6.11(@better-auth/core@1.6.11(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.1)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0))(@better-auth/utils@0.4.0)': + '@better-auth/drizzle-adapter@1.6.29(@better-auth/core@1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.0))(@better-auth/utils@0.4.2)': dependencies: - '@better-auth/core': 1.6.11(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.1)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0) - '@better-auth/utils': 0.4.0 + '@better-auth/core': 1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.0) + '@better-auth/utils': 0.4.2 - '@better-auth/kysely-adapter@1.6.11(@better-auth/core@1.6.11(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.1)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0))(@better-auth/utils@0.4.0)(kysely@0.28.17)': + '@better-auth/kysely-adapter@1.6.29(@better-auth/core@1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.0))(@better-auth/utils@0.4.2)(kysely@0.29.5)': dependencies: - '@better-auth/core': 1.6.11(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.1)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0) - '@better-auth/utils': 0.4.0 + '@better-auth/core': 1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.0) + '@better-auth/utils': 0.4.2 optionalDependencies: - kysely: 0.28.17 + kysely: 0.29.5 - '@better-auth/memory-adapter@1.6.11(@better-auth/core@1.6.11(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.1)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0))(@better-auth/utils@0.4.0)': + '@better-auth/memory-adapter@1.6.29(@better-auth/core@1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.0))(@better-auth/utils@0.4.2)': dependencies: - '@better-auth/core': 1.6.11(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.1)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0) - '@better-auth/utils': 0.4.0 + '@better-auth/core': 1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.0) + '@better-auth/utils': 0.4.2 - '@better-auth/mongo-adapter@1.6.11(@better-auth/core@1.6.11(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.1)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0))(@better-auth/utils@0.4.0)': + '@better-auth/mongo-adapter@1.6.29(@better-auth/core@1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.0))(@better-auth/utils@0.4.2)': dependencies: - '@better-auth/core': 1.6.11(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.1)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0) - '@better-auth/utils': 0.4.0 + '@better-auth/core': 1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.0) + '@better-auth/utils': 0.4.2 - '@better-auth/prisma-adapter@1.6.11(@better-auth/core@1.6.11(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.1)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0))(@better-auth/utils@0.4.0)(@prisma/client@7.8.0(prisma@7.8.0(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.9.3))(typescript@5.9.3))(prisma@7.8.0(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.9.3))': + '@better-auth/prisma-adapter@1.6.29(@better-auth/core@1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.0))(@better-auth/utils@0.4.2)(@prisma/client@7.9.1(prisma@7.9.1(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.9.2))(typescript@5.9.2))(prisma@7.9.1(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.9.2))': dependencies: - '@better-auth/core': 1.6.11(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.1)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0) - '@better-auth/utils': 0.4.0 + '@better-auth/core': 1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.0) + '@better-auth/utils': 0.4.2 optionalDependencies: - '@prisma/client': 7.8.0(prisma@7.8.0(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.9.3))(typescript@5.9.3) - prisma: 7.8.0(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.9.3) + '@prisma/client': 7.9.1(prisma@7.9.1(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.9.2))(typescript@5.9.2) + prisma: 7.9.1(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.9.2) - '@better-auth/telemetry@1.6.11(@better-auth/core@1.6.11(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.1)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0))(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)': + '@better-auth/telemetry@1.6.29(@better-auth/core@1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.0))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)': dependencies: - '@better-auth/core': 1.6.11(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.1)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0) - '@better-auth/utils': 0.4.0 - '@better-fetch/fetch': 1.1.21 + '@better-auth/core': 1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.0) + '@better-auth/utils': 0.4.2 + '@better-fetch/fetch': 1.3.1 - '@better-auth/utils@0.4.0': + '@better-auth/utils@0.4.2': dependencies: - '@noble/hashes': 2.2.0 + '@noble/hashes': 2.3.0 - '@better-fetch/fetch@1.1.21': {} + '@better-auth/utils@0.5.0': + dependencies: + '@noble/hashes': 2.3.0 + + '@better-fetch/fetch@1.3.1': {} '@braintree/sanitize-url@7.1.2': {} @@ -7834,33 +7930,36 @@ snapshots: react: 19.1.0 tslib: 2.8.1 - '@dotenvx/dotenvx@1.67.0': + '@dotenvx/dotenvx@1.75.1': dependencies: + '@dotenvx/primitives': 0.8.0 commander: 11.1.0 + conf: 10.2.0 dotenv: 17.4.2 - eciesjs: 0.4.18 enquirer: 2.4.1 + env-paths: 2.2.1 execa: 5.1.1 - fdir: 6.5.0(picomatch@4.0.4) + fdir: 6.5.0(picomatch@4.0.5) ignore: 5.3.2 object-treeify: 1.1.33 - picomatch: 4.0.4 + open: 8.4.2 + picomatch: 4.0.5 + systeminformation: 5.33.1 + undici: 7.29.0 which: 4.0.0 - yocto-spinner: 1.2.0 + yocto-spinner: 1.2.2 - '@ecies/ciphers@0.2.6(@noble/ciphers@1.3.0)': - dependencies: - '@noble/ciphers': 1.3.0 + '@dotenvx/primitives@0.8.0': {} - '@electric-sql/pglite-socket@0.1.1(@electric-sql/pglite@0.4.1)': + '@electric-sql/pglite-socket@0.1.3(@electric-sql/pglite@0.4.3)': dependencies: - '@electric-sql/pglite': 0.4.1 + '@electric-sql/pglite': 0.4.3 - '@electric-sql/pglite-tools@0.3.1(@electric-sql/pglite@0.4.1)': + '@electric-sql/pglite-tools@0.3.3(@electric-sql/pglite@0.4.3)': dependencies: - '@electric-sql/pglite': 0.4.1 + '@electric-sql/pglite': 0.4.3 - '@electric-sql/pglite@0.4.1': {} + '@electric-sql/pglite@0.4.3': {} '@emnapi/core@1.10.0': dependencies: @@ -7873,6 +7972,11 @@ snapshots: tslib: 2.8.1 optional: true + '@emnapi/runtime@1.11.3': + dependencies: + tslib: 2.8.1 + optional: true + '@emnapi/wasi-threads@1.2.1': dependencies: tslib: 2.8.1 @@ -7881,171 +7985,171 @@ snapshots: '@esbuild/aix-ppc64@0.25.12': optional: true - '@esbuild/aix-ppc64@0.28.0': + '@esbuild/aix-ppc64@0.28.2': optional: true '@esbuild/android-arm64@0.25.12': optional: true - '@esbuild/android-arm64@0.28.0': + '@esbuild/android-arm64@0.28.2': optional: true '@esbuild/android-arm@0.25.12': optional: true - '@esbuild/android-arm@0.28.0': + '@esbuild/android-arm@0.28.2': optional: true '@esbuild/android-x64@0.25.12': optional: true - '@esbuild/android-x64@0.28.0': + '@esbuild/android-x64@0.28.2': optional: true '@esbuild/darwin-arm64@0.25.12': optional: true - '@esbuild/darwin-arm64@0.28.0': + '@esbuild/darwin-arm64@0.28.2': optional: true '@esbuild/darwin-x64@0.25.12': optional: true - '@esbuild/darwin-x64@0.28.0': + '@esbuild/darwin-x64@0.28.2': optional: true '@esbuild/freebsd-arm64@0.25.12': optional: true - '@esbuild/freebsd-arm64@0.28.0': + '@esbuild/freebsd-arm64@0.28.2': optional: true '@esbuild/freebsd-x64@0.25.12': optional: true - '@esbuild/freebsd-x64@0.28.0': + '@esbuild/freebsd-x64@0.28.2': optional: true '@esbuild/linux-arm64@0.25.12': optional: true - '@esbuild/linux-arm64@0.28.0': + '@esbuild/linux-arm64@0.28.2': optional: true '@esbuild/linux-arm@0.25.12': optional: true - '@esbuild/linux-arm@0.28.0': + '@esbuild/linux-arm@0.28.2': optional: true '@esbuild/linux-ia32@0.25.12': optional: true - '@esbuild/linux-ia32@0.28.0': + '@esbuild/linux-ia32@0.28.2': optional: true '@esbuild/linux-loong64@0.25.12': optional: true - '@esbuild/linux-loong64@0.28.0': + '@esbuild/linux-loong64@0.28.2': optional: true '@esbuild/linux-mips64el@0.25.12': optional: true - '@esbuild/linux-mips64el@0.28.0': + '@esbuild/linux-mips64el@0.28.2': optional: true '@esbuild/linux-ppc64@0.25.12': optional: true - '@esbuild/linux-ppc64@0.28.0': + '@esbuild/linux-ppc64@0.28.2': optional: true '@esbuild/linux-riscv64@0.25.12': optional: true - '@esbuild/linux-riscv64@0.28.0': + '@esbuild/linux-riscv64@0.28.2': optional: true '@esbuild/linux-s390x@0.25.12': optional: true - '@esbuild/linux-s390x@0.28.0': + '@esbuild/linux-s390x@0.28.2': optional: true '@esbuild/linux-x64@0.25.12': optional: true - '@esbuild/linux-x64@0.28.0': + '@esbuild/linux-x64@0.28.2': optional: true '@esbuild/netbsd-arm64@0.25.12': optional: true - '@esbuild/netbsd-arm64@0.28.0': + '@esbuild/netbsd-arm64@0.28.2': optional: true '@esbuild/netbsd-x64@0.25.12': optional: true - '@esbuild/netbsd-x64@0.28.0': + '@esbuild/netbsd-x64@0.28.2': optional: true '@esbuild/openbsd-arm64@0.25.12': optional: true - '@esbuild/openbsd-arm64@0.28.0': + '@esbuild/openbsd-arm64@0.28.2': optional: true '@esbuild/openbsd-x64@0.25.12': optional: true - '@esbuild/openbsd-x64@0.28.0': + '@esbuild/openbsd-x64@0.28.2': optional: true '@esbuild/openharmony-arm64@0.25.12': optional: true - '@esbuild/openharmony-arm64@0.28.0': + '@esbuild/openharmony-arm64@0.28.2': optional: true '@esbuild/sunos-x64@0.25.12': optional: true - '@esbuild/sunos-x64@0.28.0': + '@esbuild/sunos-x64@0.28.2': optional: true '@esbuild/win32-arm64@0.25.12': optional: true - '@esbuild/win32-arm64@0.28.0': + '@esbuild/win32-arm64@0.28.2': optional: true '@esbuild/win32-ia32@0.25.12': optional: true - '@esbuild/win32-ia32@0.28.0': + '@esbuild/win32-ia32@0.28.2': optional: true '@esbuild/win32-x64@0.25.12': optional: true - '@esbuild/win32-x64@0.28.0': + '@esbuild/win32-x64@0.28.2': optional: true - '@eslint-community/eslint-utils@4.9.1(eslint@9.39.4(jiti@2.7.0))': + '@eslint-community/eslint-utils@4.9.1(eslint@9.39.1(jiti@2.7.0))': dependencies: - eslint: 9.39.4(jiti@2.7.0) + eslint: 9.39.1(jiti@2.7.0) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} - '@eslint/config-array@0.21.2': + '@eslint/config-array@0.21.1': dependencies: '@eslint/object-schema': 2.1.7 debug: 4.4.3 - minimatch: 3.1.5 + minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -8057,21 +8161,21 @@ snapshots: dependencies: '@types/json-schema': 7.0.15 - '@eslint/eslintrc@3.3.5': + '@eslint/eslintrc@3.3.1': dependencies: - ajv: 6.15.0 + ajv: 6.12.6 debug: 4.4.3 espree: 10.4.0 globals: 14.0.0 ignore: 5.3.2 import-fresh: 3.3.1 - js-yaml: 4.1.1 - minimatch: 3.1.5 + js-yaml: 4.1.0 + minimatch: 3.1.2 strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color - '@eslint/js@9.39.4': {} + '@eslint/js@9.39.1': {} '@eslint/object-schema@2.1.7': {} @@ -8080,32 +8184,22 @@ snapshots: '@eslint/core': 0.17.0 levn: 0.4.1 - '@fastify/otel@0.18.0(@opentelemetry/api@1.9.1)': + '@floating-ui/core@1.8.0': dependencies: - '@opentelemetry/api': 1.9.1 - '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation': 0.212.0(@opentelemetry/api@1.9.1) - '@opentelemetry/semantic-conventions': 1.41.1 - minimatch: 10.2.5 - transitivePeerDependencies: - - supports-color + '@floating-ui/utils': 0.2.12 - '@floating-ui/core@1.7.5': + '@floating-ui/dom@1.8.0': dependencies: - '@floating-ui/utils': 0.2.11 + '@floating-ui/core': 1.8.0 + '@floating-ui/utils': 0.2.12 - '@floating-ui/dom@1.7.6': + '@floating-ui/react-dom@2.1.9(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@floating-ui/core': 1.7.5 - '@floating-ui/utils': 0.2.11 - - '@floating-ui/react-dom@2.1.8(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@floating-ui/dom': 1.7.6 + '@floating-ui/dom': 1.8.0 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - '@floating-ui/utils@0.2.11': {} + '@floating-ui/utils@0.2.12': {} '@formatjs/intl-localematcher@0.6.2': dependencies: @@ -8113,38 +8207,36 @@ snapshots: '@google/generative-ai@0.24.1': {} - '@hono/node-server@1.19.11(hono@4.12.22)': - dependencies: - hono: 4.12.22 - - '@hono/node-server@1.19.14(hono@4.12.22)': + '@hono/node-server@2.1.1(hono@4.13.2)': dependencies: - hono: 4.12.22 + hono: 4.13.2 - '@hookform/resolvers@5.4.0(react-hook-form@7.76.1(react@19.1.0))': + '@hookform/resolvers@5.9.0(@standard-schema/spec@1.1.0)(ajv-formats@3.0.1(ajv@8.20.0))(ajv@8.20.0)(effect@3.20.0)(react-hook-form@7.85.0(react@19.1.0))(valibot@1.4.2(typescript@5.9.2))(zod@4.4.3)': dependencies: '@standard-schema/utils': 0.3.0 - react-hook-form: 7.76.1(react@19.1.0) + react-hook-form: 7.85.0(react@19.1.0) + optionalDependencies: + '@standard-schema/spec': 1.1.0 + ajv: 8.20.0 + ajv-formats: 3.0.1(ajv@8.20.0) + effect: 3.20.0 + valibot: 1.4.2(typescript@5.9.2) + zod: 4.4.3 - '@humanfs/core@0.19.2': - dependencies: - '@humanfs/types': 0.15.0 + '@humanfs/core@0.19.1': {} - '@humanfs/node@0.16.8': + '@humanfs/node@0.16.7': dependencies: - '@humanfs/core': 0.19.2 - '@humanfs/types': 0.15.0 + '@humanfs/core': 0.19.1 '@humanwhocodes/retry': 0.4.3 - '@humanfs/types@0.15.0': {} - '@humanwhocodes/module-importer@1.0.1': {} '@humanwhocodes/retry@0.4.3': {} '@iconify/types@2.0.0': {} - '@iconify/utils@3.1.3': + '@iconify/utils@3.1.4': dependencies: '@antfu/install-pkg': 1.1.0 '@iconify/types': 2.0.0 @@ -8235,7 +8327,7 @@ snapshots: '@img/sharp-wasm32@0.34.5': dependencies: - '@emnapi/runtime': 1.10.0 + '@emnapi/runtime': 1.11.3 optional: true '@img/sharp-win32-arm64@0.34.5': @@ -8247,33 +8339,6 @@ snapshots: '@img/sharp-win32-x64@0.34.5': optional: true - '@inquirer/ansi@2.0.5': {} - - '@inquirer/confirm@6.0.13(@types/node@20.19.41)': - dependencies: - '@inquirer/core': 11.1.10(@types/node@20.19.41) - '@inquirer/type': 4.0.5(@types/node@20.19.41) - optionalDependencies: - '@types/node': 20.19.41 - - '@inquirer/core@11.1.10(@types/node@20.19.41)': - dependencies: - '@inquirer/ansi': 2.0.5 - '@inquirer/figures': 2.0.5 - '@inquirer/type': 4.0.5(@types/node@20.19.41) - cli-width: 4.1.0 - fast-wrap-ansi: 0.2.2 - mute-stream: 3.0.0 - signal-exit: 4.1.0 - optionalDependencies: - '@types/node': 20.19.41 - - '@inquirer/figures@2.0.5': {} - - '@inquirer/type@4.0.5(@types/node@20.19.41)': - optionalDependencies: - '@types/node': 20.19.41 - '@jridgewell/gen-mapping@0.3.13': dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -8298,15 +8363,13 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 - '@kurkle/color@0.3.4': {} - '@mdx-js/mdx@3.1.1': dependencies: - '@types/estree': 1.0.9 + '@types/estree': 1.0.8 '@types/estree-jsx': 1.0.5 - '@types/hast': 3.0.4 - '@types/mdx': 2.0.13 - acorn: 8.16.0 + '@types/hast': 3.0.5 + '@types/mdx': 2.0.14 + acorn: 8.15.0 collapse-white-space: 2.1.0 devlop: 1.1.0 estree-util-is-identifier-name: 3.0.0 @@ -8315,7 +8378,7 @@ snapshots: hast-util-to-jsx-runtime: 2.3.6 markdown-extensions: 2.0.0 recma-build-jsx: 1.0.0 - recma-jsx: 1.0.1(acorn@8.16.0) + recma-jsx: 1.0.1(acorn@8.15.0) recma-stringify: 1.0.0 rehype-recma: 1.0.0 remark-mdx: 3.1.1 @@ -8330,24 +8393,24 @@ snapshots: transitivePeerDependencies: - supports-color - '@mermaid-js/parser@1.1.1': + '@mermaid-js/parser@1.2.0': dependencies: '@chevrotain/types': 11.1.2 - '@modelcontextprotocol/sdk@1.29.0(zod@3.25.76)': + '@modelcontextprotocol/sdk@1.30.0(zod@3.25.76)': dependencies: - '@hono/node-server': 1.19.14(hono@4.12.22) + '@hono/node-server': 2.1.1(hono@4.13.2) ajv: 8.20.0 ajv-formats: 3.0.1(ajv@8.20.0) content-type: 1.0.5 cors: 2.8.6 cross-spawn: 7.0.6 eventsource: 3.0.7 - eventsource-parser: 3.0.8 + eventsource-parser: 3.1.1 express: 5.2.1 - express-rate-limit: 8.5.2(express@5.2.1) - hono: 4.12.22 - jose: 6.2.3 + express-rate-limit: 8.6.2(express@5.2.1) + hono: 4.13.2 + jose: 6.2.9 json-schema-typed: 8.0.2 pkce-challenge: 5.0.1 raw-body: 3.0.2 @@ -8356,20 +8419,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@mswjs/interceptors@0.41.9': - dependencies: - '@open-draft/deferred-promise': 2.2.0 - '@open-draft/logger': 0.3.0 - '@open-draft/until': 2.1.0 - is-node-process: 1.2.0 - outvariant: 1.4.3 - strict-event-emitter: 0.5.1 + '@napi-rs/lzma-linux-x64-gnu@1.5.1': + optional: true - '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': + '@napi-rs/wasm-runtime@1.2.3(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': dependencies: '@emnapi/core': 1.10.0 '@emnapi/runtime': 1.10.0 - '@tybys/wasm-util': 0.10.2 + '@tybys/wasm-util': 0.10.3 optional: true '@next/env@15.5.18': {} @@ -8402,17 +8459,9 @@ snapshots: '@next/swc-win32-x64-msvc@15.5.18': optional: true - '@noble/ciphers@1.3.0': {} + '@noble/ciphers@2.3.0': {} - '@noble/ciphers@2.2.0': {} - - '@noble/curves@1.9.7': - dependencies: - '@noble/hashes': 1.8.0 - - '@noble/hashes@1.8.0': {} - - '@noble/hashes@2.2.0': {} + '@noble/hashes@2.3.0': {} '@nodelib/fs.scandir@2.1.5': dependencies: @@ -8424,268 +8473,74 @@ snapshots: '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.20.1 + fastq: 1.19.1 '@nolyfill/is-core-module@1.0.39': {} - '@open-draft/deferred-promise@2.2.0': {} - - '@open-draft/deferred-promise@3.0.0': {} - - '@open-draft/logger@0.3.0': - dependencies: - is-node-process: 1.2.0 - outvariant: 1.4.3 - - '@open-draft/until@2.1.0': {} - - '@opentelemetry/api-logs@0.207.0': - dependencies: - '@opentelemetry/api': 1.9.1 - - '@opentelemetry/api-logs@0.212.0': - dependencies: - '@opentelemetry/api': 1.9.1 - - '@opentelemetry/api-logs@0.214.0': + '@opentelemetry/api-logs@0.220.0': dependencies: '@opentelemetry/api': 1.9.1 '@opentelemetry/api@1.9.1': {} - '@opentelemetry/core@2.6.1(@opentelemetry/api@1.9.1)': - dependencies: - '@opentelemetry/api': 1.9.1 - '@opentelemetry/semantic-conventions': 1.41.1 - - '@opentelemetry/core@2.7.1(@opentelemetry/api@1.9.1)': - dependencies: - '@opentelemetry/api': 1.9.1 - '@opentelemetry/semantic-conventions': 1.41.1 - - '@opentelemetry/instrumentation-amqplib@0.61.0(@opentelemetry/api@1.9.1)': - dependencies: - '@opentelemetry/api': 1.9.1 - '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation': 0.214.0(@opentelemetry/api@1.9.1) - '@opentelemetry/semantic-conventions': 1.41.1 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-connect@0.57.0(@opentelemetry/api@1.9.1)': - dependencies: - '@opentelemetry/api': 1.9.1 - '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation': 0.214.0(@opentelemetry/api@1.9.1) - '@opentelemetry/semantic-conventions': 1.41.1 - '@types/connect': 3.4.38 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-dataloader@0.31.0(@opentelemetry/api@1.9.1)': - dependencies: - '@opentelemetry/api': 1.9.1 - '@opentelemetry/instrumentation': 0.214.0(@opentelemetry/api@1.9.1) - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-fs@0.33.0(@opentelemetry/api@1.9.1)': - dependencies: - '@opentelemetry/api': 1.9.1 - '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation': 0.214.0(@opentelemetry/api@1.9.1) - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-generic-pool@0.57.0(@opentelemetry/api@1.9.1)': - dependencies: - '@opentelemetry/api': 1.9.1 - '@opentelemetry/instrumentation': 0.214.0(@opentelemetry/api@1.9.1) - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-graphql@0.62.0(@opentelemetry/api@1.9.1)': - dependencies: - '@opentelemetry/api': 1.9.1 - '@opentelemetry/instrumentation': 0.214.0(@opentelemetry/api@1.9.1) - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-hapi@0.60.0(@opentelemetry/api@1.9.1)': - dependencies: - '@opentelemetry/api': 1.9.1 - '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation': 0.214.0(@opentelemetry/api@1.9.1) - '@opentelemetry/semantic-conventions': 1.41.1 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-http@0.214.0(@opentelemetry/api@1.9.1)': - dependencies: - '@opentelemetry/api': 1.9.1 - '@opentelemetry/core': 2.6.1(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation': 0.214.0(@opentelemetry/api@1.9.1) - '@opentelemetry/semantic-conventions': 1.41.1 - forwarded-parse: 2.1.2 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-kafkajs@0.23.0(@opentelemetry/api@1.9.1)': - dependencies: - '@opentelemetry/api': 1.9.1 - '@opentelemetry/instrumentation': 0.214.0(@opentelemetry/api@1.9.1) - '@opentelemetry/semantic-conventions': 1.41.1 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-knex@0.58.0(@opentelemetry/api@1.9.1)': - dependencies: - '@opentelemetry/api': 1.9.1 - '@opentelemetry/instrumentation': 0.214.0(@opentelemetry/api@1.9.1) - '@opentelemetry/semantic-conventions': 1.41.1 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-koa@0.62.0(@opentelemetry/api@1.9.1)': - dependencies: - '@opentelemetry/api': 1.9.1 - '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation': 0.214.0(@opentelemetry/api@1.9.1) - '@opentelemetry/semantic-conventions': 1.41.1 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-lru-memoizer@0.58.0(@opentelemetry/api@1.9.1)': - dependencies: - '@opentelemetry/api': 1.9.1 - '@opentelemetry/instrumentation': 0.214.0(@opentelemetry/api@1.9.1) - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-mongodb@0.67.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/core@2.10.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 - '@opentelemetry/instrumentation': 0.214.0(@opentelemetry/api@1.9.1) - '@opentelemetry/semantic-conventions': 1.41.1 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-mongoose@0.60.0(@opentelemetry/api@1.9.1)': - dependencies: - '@opentelemetry/api': 1.9.1 - '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation': 0.214.0(@opentelemetry/api@1.9.1) - '@opentelemetry/semantic-conventions': 1.41.1 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-mysql2@0.60.0(@opentelemetry/api@1.9.1)': - dependencies: - '@opentelemetry/api': 1.9.1 - '@opentelemetry/instrumentation': 0.214.0(@opentelemetry/api@1.9.1) - '@opentelemetry/semantic-conventions': 1.41.1 - '@opentelemetry/sql-common': 0.41.2(@opentelemetry/api@1.9.1) - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-mysql@0.60.0(@opentelemetry/api@1.9.1)': - dependencies: - '@opentelemetry/api': 1.9.1 - '@opentelemetry/instrumentation': 0.214.0(@opentelemetry/api@1.9.1) - '@opentelemetry/semantic-conventions': 1.41.1 - '@types/mysql': 2.15.27 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-pg@0.66.0(@opentelemetry/api@1.9.1)': - dependencies: - '@opentelemetry/api': 1.9.1 - '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation': 0.214.0(@opentelemetry/api@1.9.1) - '@opentelemetry/semantic-conventions': 1.41.1 - '@opentelemetry/sql-common': 0.41.2(@opentelemetry/api@1.9.1) - '@types/pg': 8.15.6 - '@types/pg-pool': 2.0.7 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-tedious@0.33.0(@opentelemetry/api@1.9.1)': - dependencies: - '@opentelemetry/api': 1.9.1 - '@opentelemetry/instrumentation': 0.214.0(@opentelemetry/api@1.9.1) - '@opentelemetry/semantic-conventions': 1.41.1 - '@types/tedious': 4.0.14 - transitivePeerDependencies: - - supports-color + '@opentelemetry/semantic-conventions': 1.43.0 - '@opentelemetry/instrumentation@0.207.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/instrumentation@0.220.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 - '@opentelemetry/api-logs': 0.207.0 + '@opentelemetry/api-logs': 0.220.0 import-in-the-middle: 3.0.1 require-in-the-middle: 8.0.1 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation@0.212.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/resources@2.10.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 - '@opentelemetry/api-logs': 0.212.0 - import-in-the-middle: 3.0.1 - require-in-the-middle: 8.0.1 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation@0.214.0(@opentelemetry/api@1.9.1)': - dependencies: - '@opentelemetry/api': 1.9.1 - '@opentelemetry/api-logs': 0.214.0 - import-in-the-middle: 3.0.1 - require-in-the-middle: 8.0.1 - transitivePeerDependencies: - - supports-color + '@opentelemetry/core': 2.10.0(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.43.0 - '@opentelemetry/resources@2.7.1(@opentelemetry/api@1.9.1)': + '@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 - '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) - '@opentelemetry/semantic-conventions': 1.41.1 + '@opentelemetry/core': 2.10.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.10.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace': 2.10.0(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.43.0 - '@opentelemetry/sdk-trace-base@2.7.1(@opentelemetry/api@1.9.1)': + '@opentelemetry/sdk-trace@2.10.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 - '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) - '@opentelemetry/resources': 2.7.1(@opentelemetry/api@1.9.1) - '@opentelemetry/semantic-conventions': 1.41.1 + '@opentelemetry/core': 2.10.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.10.0(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.43.0 - '@opentelemetry/semantic-conventions@1.41.1': {} - - '@opentelemetry/sql-common@0.41.2(@opentelemetry/api@1.9.1)': - dependencies: - '@opentelemetry/api': 1.9.1 - '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions@1.43.0': {} '@orama/orama@3.1.18': {} - '@prisma/adapter-pg@7.8.0': + '@prisma/adapter-pg@7.9.1': dependencies: - '@prisma/driver-adapter-utils': 7.8.0 - '@types/pg': 8.20.0 - pg: 8.21.0 + '@prisma/driver-adapter-utils': 7.9.1 + '@types/pg': 8.21.0 + pg: 8.23.0 postgres-array: 3.0.4 transitivePeerDependencies: - pg-native - '@prisma/client-runtime-utils@7.8.0': {} + '@prisma/client-runtime-utils@7.9.1': {} - '@prisma/client@7.8.0(prisma@7.8.0(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.9.3))(typescript@5.9.3)': + '@prisma/client@7.9.1(prisma@7.9.1(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.9.2))(typescript@5.9.2)': dependencies: - '@prisma/client-runtime-utils': 7.8.0 + '@prisma/client-runtime-utils': 7.9.1 optionalDependencies: - prisma: 7.8.0(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.9.3) - typescript: 5.9.3 + prisma: 7.9.1(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.9.2) + typescript: 5.9.2 - '@prisma/config@7.8.0': + '@prisma/config@7.9.1': dependencies: c12: 3.3.4 deepmerge-ts: 7.1.5 @@ -8696,845 +8551,885 @@ snapshots: '@prisma/debug@7.2.0': {} - '@prisma/debug@7.8.0': {} + '@prisma/debug@7.9.1': {} - '@prisma/dev@0.24.3(typescript@5.9.3)': + '@prisma/dev@0.24.17(typescript@5.9.2)': dependencies: - '@electric-sql/pglite': 0.4.1 - '@electric-sql/pglite-socket': 0.1.1(@electric-sql/pglite@0.4.1) - '@electric-sql/pglite-tools': 0.3.1(@electric-sql/pglite@0.4.1) - '@hono/node-server': 1.19.11(hono@4.12.22) + '@electric-sql/pglite': 0.4.3 + '@electric-sql/pglite-socket': 0.1.3(@electric-sql/pglite@0.4.3) + '@electric-sql/pglite-tools': 0.3.3(@electric-sql/pglite@0.4.3) '@prisma/get-platform': 7.2.0 '@prisma/query-plan-executor': 7.2.0 - '@prisma/streams-local': 0.1.2 + '@prisma/streams-local': 0.1.11 + find-my-way: 9.7.0 foreground-child: 3.3.1 get-port-please: 3.2.0 - hono: 4.12.22 - http-status-codes: 2.3.0 pathe: 2.0.3 proper-lockfile: 4.1.2 remeda: 2.33.4 std-env: 3.10.0 - valibot: 1.2.0(typescript@5.9.3) + valibot: 1.4.2(typescript@5.9.2) zeptomatch: 2.1.0 transitivePeerDependencies: - typescript - '@prisma/driver-adapter-utils@7.8.0': + '@prisma/driver-adapter-utils@7.9.1': dependencies: - '@prisma/debug': 7.8.0 + '@prisma/debug': 7.9.1 - '@prisma/engines-version@7.8.0-6.3c6e192761c0362d496ed980de936e2f3cebcd3a': {} + '@prisma/engines-version@7.9.0-1.e922089b7d7502aff4249d5da3420f6fa55fc6ad': {} - '@prisma/engines@7.8.0': + '@prisma/engines@7.9.1': dependencies: - '@prisma/debug': 7.8.0 - '@prisma/engines-version': 7.8.0-6.3c6e192761c0362d496ed980de936e2f3cebcd3a - '@prisma/fetch-engine': 7.8.0 - '@prisma/get-platform': 7.8.0 + '@prisma/debug': 7.9.1 + '@prisma/engines-version': 7.9.0-1.e922089b7d7502aff4249d5da3420f6fa55fc6ad + '@prisma/fetch-engine': 7.9.1 + '@prisma/get-platform': 7.9.1 - '@prisma/fetch-engine@7.8.0': + '@prisma/fetch-engine@7.9.1': dependencies: - '@prisma/debug': 7.8.0 - '@prisma/engines-version': 7.8.0-6.3c6e192761c0362d496ed980de936e2f3cebcd3a - '@prisma/get-platform': 7.8.0 + '@prisma/debug': 7.9.1 + '@prisma/engines-version': 7.9.0-1.e922089b7d7502aff4249d5da3420f6fa55fc6ad + '@prisma/get-platform': 7.9.1 '@prisma/get-platform@7.2.0': dependencies: '@prisma/debug': 7.2.0 - '@prisma/get-platform@7.8.0': + '@prisma/get-platform@7.9.1': dependencies: - '@prisma/debug': 7.8.0 - - '@prisma/instrumentation@7.6.0(@opentelemetry/api@1.9.1)': - dependencies: - '@opentelemetry/api': 1.9.1 - '@opentelemetry/instrumentation': 0.207.0(@opentelemetry/api@1.9.1) - transitivePeerDependencies: - - supports-color + '@prisma/debug': 7.9.1 '@prisma/query-plan-executor@7.2.0': {} - '@prisma/streams-local@0.1.2': + '@prisma/streams-local@0.1.11': dependencies: ajv: 8.20.0 - better-result: 2.9.2 + better-result: 2.10.0 env-paths: 3.0.0 proper-lockfile: 4.1.2 - '@prisma/studio-core@0.27.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/react-toggle': 1.1.10(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@types/react': 19.2.15 - chart.js: 4.5.1 + '@prisma/studio-core@0.33.0(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/react-toggle': 1.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@types/react': 19.2.2 + '@visx/curve': 4.0.1-alpha.0 + '@visx/event': 4.0.1-alpha.0 + '@visx/grid': 4.0.1-alpha.0(react@19.1.0) + '@visx/group': 4.0.1-alpha.0(react@19.1.0) + '@visx/responsive': 4.0.1-alpha.0(react@19.1.0) + '@visx/scale': 4.0.1-alpha.0 + '@visx/shape': 4.0.1-alpha.0(react@19.1.0) + d3-array: 3.2.4 + d3-shape: 3.2.0 + elkjs: 0.11.1 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) transitivePeerDependencies: - '@types/react-dom' - '@radix-ui/number@1.1.1': {} + '@radix-ui/number@1.1.3': {} '@radix-ui/primitive@1.1.3': {} - '@radix-ui/react-accessible-icon@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/primitive@1.1.7': {} + + '@radix-ui/react-accessible-icon@1.1.15(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-visually-hidden': 1.2.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) optionalDependencies: - '@types/react': 19.2.15 - '@types/react-dom': 19.2.3(@types/react@19.2.15) - - '@radix-ui/react-accordion@1.2.12(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collapsible': 1.1.12(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.15)(react@19.1.0) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) + + '@radix-ui/react-accordion@1.2.20(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-collapsible': 1.1.20(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-collection': 1.1.15(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-context': 1.2.2(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-direction': 1.1.4(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-id': 1.1.4(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.2.2)(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) optionalDependencies: - '@types/react': 19.2.15 - '@types/react-dom': 19.2.3(@types/react@19.2.15) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) - '@radix-ui/react-alert-dialog@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/react-alert-dialog@1.1.23(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.15)(react@19.1.0) + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-context': 1.2.2(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-dialog': 1.1.23(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) optionalDependencies: - '@types/react': 19.2.15 - '@types/react-dom': 19.2.3(@types/react@19.2.15) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) - '@radix-ui/react-arrow@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/react-arrow@1.1.15(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) optionalDependencies: - '@types/react': 19.2.15 - '@types/react-dom': 19.2.3(@types/react@19.2.15) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) - '@radix-ui/react-aspect-ratio@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/react-aspect-ratio@1.1.15(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) optionalDependencies: - '@types/react': 19.2.15 - '@types/react-dom': 19.2.3(@types/react@19.2.15) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) - '@radix-ui/react-avatar@1.1.10(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/react-avatar@1.2.6(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.15)(react@19.1.0) + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-context': 1.2.2(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-use-is-hydrated': 0.1.3(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.2)(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) optionalDependencies: - '@types/react': 19.2.15 - '@types/react-dom': 19.2.3(@types/react@19.2.15) - - '@radix-ui/react-checkbox@1.3.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.15)(react@19.1.0) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) + + '@radix-ui/react-checkbox@1.3.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-context': 1.2.2(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-presence': 1.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-use-size': 1.1.4(@types/react@19.2.2)(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) optionalDependencies: - '@types/react': 19.2.15 - '@types/react-dom': 19.2.3(@types/react@19.2.15) - - '@radix-ui/react-collapsible@1.1.12(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.15)(react@19.1.0) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) + + '@radix-ui/react-collapsible@1.1.20(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-context': 1.2.2(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-id': 1.1.4(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-presence': 1.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.2)(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) optionalDependencies: - '@types/react': 19.2.15 - '@types/react-dom': 19.2.3(@types/react@19.2.15) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) - '@radix-ui/react-collection@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/react-collection@1.1.15(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.15)(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-context': 1.2.2(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-slot': 1.3.3(@types/react@19.2.2)(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) optionalDependencies: - '@types/react': 19.2.15 - '@types/react-dom': 19.2.3(@types/react@19.2.15) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) - '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.15)(react@19.1.0)': + '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.2)(react@19.1.0)': dependencies: react: 19.1.0 optionalDependencies: - '@types/react': 19.2.15 + '@types/react': 19.2.2 - '@radix-ui/react-context-menu@2.2.16(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/react-compose-refs@1.1.5(@types/react@19.2.2)(react@19.1.0)': dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.15)(react@19.1.0) react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) optionalDependencies: - '@types/react': 19.2.15 - '@types/react-dom': 19.2.3(@types/react@19.2.15) + '@types/react': 19.2.2 - '@radix-ui/react-context@1.1.2(@types/react@19.2.15)(react@19.1.0)': + '@radix-ui/react-context-menu@2.3.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-context': 1.2.2(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-menu': 2.1.24(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.2.2)(react@19.1.0) react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) optionalDependencies: - '@types/react': 19.2.15 + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) - '@radix-ui/react-dialog@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/react-context@1.2.2(@types/react@19.2.2)(react@19.1.0)': dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.15)(react@19.1.0) + react: 19.1.0 + optionalDependencies: + '@types/react': 19.2.2 + + '@radix-ui/react-dialog@1.1.23(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-context': 1.2.2(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-dismissable-layer': 1.1.19(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-focus-guards': 1.1.6(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-focus-scope': 1.1.16(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-id': 1.1.4(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-portal': 1.1.17(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-presence': 1.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-slot': 1.3.3(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.2)(react@19.1.0) aria-hidden: 1.2.6 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - react-remove-scroll: 2.7.2(@types/react@19.2.15)(react@19.1.0) + react-remove-scroll: 2.7.2(@types/react@19.2.2)(react@19.1.0) optionalDependencies: - '@types/react': 19.2.15 - '@types/react-dom': 19.2.3(@types/react@19.2.15) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) - '@radix-ui/react-direction@1.1.1(@types/react@19.2.15)(react@19.1.0)': + '@radix-ui/react-direction@1.1.4(@types/react@19.2.2)(react@19.1.0)': dependencies: react: 19.1.0 optionalDependencies: - '@types/react': 19.2.15 + '@types/react': 19.2.2 - '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/react-dismissable-layer@1.1.19(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.2.15)(react@19.1.0) + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-use-effect-event': 0.0.5(@types/react@19.2.2)(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) optionalDependencies: - '@types/react': 19.2.15 - '@types/react-dom': 19.2.3(@types/react@19.2.15) - - '@radix-ui/react-dropdown-menu@2.1.16(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.15)(react@19.1.0) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) + + '@radix-ui/react-dropdown-menu@2.1.24(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-context': 1.2.2(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-id': 1.1.4(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-menu': 2.1.24(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.2.2)(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) optionalDependencies: - '@types/react': 19.2.15 - '@types/react-dom': 19.2.3(@types/react@19.2.15) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) - '@radix-ui/react-focus-guards@1.1.3(@types/react@19.2.15)(react@19.1.0)': + '@radix-ui/react-focus-guards@1.1.6(@types/react@19.2.2)(react@19.1.0)': dependencies: react: 19.1.0 optionalDependencies: - '@types/react': 19.2.15 + '@types/react': 19.2.2 - '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/react-focus-scope@1.1.16(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.15)(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.2.2)(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) optionalDependencies: - '@types/react': 19.2.15 - '@types/react-dom': 19.2.3(@types/react@19.2.15) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) - '@radix-ui/react-form@0.1.8(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/react-form@0.1.16(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-label': 2.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-context': 1.2.2(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-id': 1.1.4(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-label': 2.1.15(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) optionalDependencies: - '@types/react': 19.2.15 - '@types/react-dom': 19.2.3(@types/react@19.2.15) - - '@radix-ui/react-hover-card@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.15)(react@19.1.0) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) + + '@radix-ui/react-hover-card@1.1.23(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-context': 1.2.2(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-dismissable-layer': 1.1.19(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-popper': 1.3.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-portal': 1.1.17(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-presence': 1.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.2.2)(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) optionalDependencies: - '@types/react': 19.2.15 - '@types/react-dom': 19.2.3(@types/react@19.2.15) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) - '@radix-ui/react-id@1.1.1(@types/react@19.2.15)(react@19.1.0)': + '@radix-ui/react-id@1.1.4(@types/react@19.2.2)(react@19.1.0)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.15)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.2)(react@19.1.0) react: 19.1.0 optionalDependencies: - '@types/react': 19.2.15 + '@types/react': 19.2.2 - '@radix-ui/react-label@2.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/react-label@2.1.15(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) optionalDependencies: - '@types/react': 19.2.15 - '@types/react-dom': 19.2.3(@types/react@19.2.15) - - '@radix-ui/react-menu@2.1.16(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.15)(react@19.1.0) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) + + '@radix-ui/react-menu@2.1.24(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-collection': 1.1.15(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-context': 1.2.2(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-direction': 1.1.4(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-dismissable-layer': 1.1.19(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-focus-guards': 1.1.6(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-focus-scope': 1.1.16(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-id': 1.1.4(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-popper': 1.3.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-portal': 1.1.17(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-presence': 1.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-roving-focus': 1.1.19(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-slot': 1.3.3(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.2.2)(react@19.1.0) aria-hidden: 1.2.6 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - react-remove-scroll: 2.7.2(@types/react@19.2.15)(react@19.1.0) + react-remove-scroll: 2.7.2(@types/react@19.2.2)(react@19.1.0) optionalDependencies: - '@types/react': 19.2.15 - '@types/react-dom': 19.2.3(@types/react@19.2.15) - - '@radix-ui/react-menubar@1.1.16(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.15)(react@19.1.0) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) + + '@radix-ui/react-menubar@1.1.24(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-collection': 1.1.15(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-context': 1.2.2(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-direction': 1.1.4(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-id': 1.1.4(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-menu': 2.1.24(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-roving-focus': 1.1.19(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.2.2)(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) optionalDependencies: - '@types/react': 19.2.15 - '@types/react-dom': 19.2.3(@types/react@19.2.15) - - '@radix-ui/react-navigation-menu@1.2.14(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) + + '@radix-ui/react-navigation-menu@1.2.22(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-collection': 1.1.15(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-context': 1.2.2(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-direction': 1.1.4(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-dismissable-layer': 1.1.19(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-id': 1.1.4(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-presence': 1.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-use-previous': 1.1.4(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-visually-hidden': 1.2.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) optionalDependencies: - '@types/react': 19.2.15 - '@types/react-dom': 19.2.3(@types/react@19.2.15) - - '@radix-ui/react-one-time-password-field@0.1.8(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/number': 1.1.1 - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.15)(react@19.1.0) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) + + '@radix-ui/react-one-time-password-field@0.1.16(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/number': 1.1.3 + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-collection': 1.1.15(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-context': 1.2.2(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-direction': 1.1.4(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-roving-focus': 1.1.19(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-use-effect-event': 0.0.5(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-use-is-hydrated': 0.1.3(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.2)(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) optionalDependencies: - '@types/react': 19.2.15 - '@types/react-dom': 19.2.3(@types/react@19.2.15) - - '@radix-ui/react-password-toggle-field@0.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@19.2.15)(react@19.1.0) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) + + '@radix-ui/react-password-toggle-field@0.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-context': 1.2.2(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-id': 1.1.4(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-use-effect-event': 0.0.5(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-use-is-hydrated': 0.1.3(@types/react@19.2.2)(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) optionalDependencies: - '@types/react': 19.2.15 - '@types/react-dom': 19.2.3(@types/react@19.2.15) - - '@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.15)(react@19.1.0) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) + + '@radix-ui/react-popover@1.1.23(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-context': 1.2.2(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-dismissable-layer': 1.1.19(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-focus-guards': 1.1.6(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-focus-scope': 1.1.16(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-id': 1.1.4(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-popper': 1.3.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-portal': 1.1.17(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-presence': 1.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-slot': 1.3.3(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.2.2)(react@19.1.0) aria-hidden: 1.2.6 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - react-remove-scroll: 2.7.2(@types/react@19.2.15)(react@19.1.0) + react-remove-scroll: 2.7.2(@types/react@19.2.2)(react@19.1.0) optionalDependencies: - '@types/react': 19.2.15 - '@types/react-dom': 19.2.3(@types/react@19.2.15) - - '@radix-ui/react-popper@1.2.8(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@floating-ui/react-dom': 2.1.8(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-use-rect': 1.1.1(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/rect': 1.1.1 + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) + + '@radix-ui/react-popper@1.3.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@floating-ui/react-dom': 2.1.9(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-arrow': 1.1.15(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-context': 1.2.2(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-use-rect': 1.1.4(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-use-size': 1.1.4(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/rect': 1.1.3 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) optionalDependencies: - '@types/react': 19.2.15 - '@types/react-dom': 19.2.3(@types/react@19.2.15) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) - '@radix-ui/react-portal@1.1.9(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/react-portal@1.1.17(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.15)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.2)(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) optionalDependencies: - '@types/react': 19.2.15 - '@types/react-dom': 19.2.3(@types/react@19.2.15) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) - '@radix-ui/react-presence@1.1.5(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/react-presence@1.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.15)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.2)(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) optionalDependencies: - '@types/react': 19.2.15 - '@types/react-dom': 19.2.3(@types/react@19.2.15) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) - '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/react-primitive@2.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.15)(react@19.1.0) + '@radix-ui/react-slot': 1.3.3(@types/react@19.2.2)(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) optionalDependencies: - '@types/react': 19.2.15 - '@types/react-dom': 19.2.3(@types/react@19.2.15) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) - '@radix-ui/react-primitive@2.1.4(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@radix-ui/react-slot': 1.2.4(@types/react@19.2.15)(react@19.1.0) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.2)(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) optionalDependencies: - '@types/react': 19.2.15 - '@types/react-dom': 19.2.3(@types/react@19.2.15) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) - '@radix-ui/react-progress@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/react-progress@1.1.16(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-context': 1.2.2(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) optionalDependencies: - '@types/react': 19.2.15 - '@types/react-dom': 19.2.3(@types/react@19.2.15) - - '@radix-ui/react-radio-group@1.3.8(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.15)(react@19.1.0) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) + + '@radix-ui/react-radio-group@1.4.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-context': 1.2.2(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-direction': 1.1.4(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-presence': 1.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-roving-focus': 1.1.19(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-use-size': 1.1.4(@types/react@19.2.2)(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) optionalDependencies: - '@types/react': 19.2.15 - '@types/react-dom': 19.2.3(@types/react@19.2.15) - - '@radix-ui/react-roving-focus@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.15)(react@19.1.0) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) + + '@radix-ui/react-roving-focus@1.1.19(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-collection': 1.1.15(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-context': 1.2.2(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-direction': 1.1.4(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-id': 1.1.4(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-use-is-hydrated': 0.1.3(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.2)(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) optionalDependencies: - '@types/react': 19.2.15 - '@types/react-dom': 19.2.3(@types/react@19.2.15) - - '@radix-ui/react-scroll-area@1.2.10(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/number': 1.1.1 - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.15)(react@19.1.0) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) + + '@radix-ui/react-scroll-area@1.2.18(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/number': 1.1.3 + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-context': 1.2.2(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-direction': 1.1.4(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-presence': 1.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.2)(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) optionalDependencies: - '@types/react': 19.2.15 - '@types/react-dom': 19.2.3(@types/react@19.2.15) - - '@radix-ui/react-select@2.2.6(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/number': 1.1.1 - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) + + '@radix-ui/react-select@2.3.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/number': 1.1.3 + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-collection': 1.1.15(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-context': 1.2.2(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-direction': 1.1.4(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-dismissable-layer': 1.1.19(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-focus-guards': 1.1.6(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-focus-scope': 1.1.16(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-id': 1.1.4(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-popper': 1.3.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-portal': 1.1.17(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-presence': 1.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-slot': 1.3.3(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-use-previous': 1.1.4(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-visually-hidden': 1.2.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) aria-hidden: 1.2.6 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - react-remove-scroll: 2.7.2(@types/react@19.2.15)(react@19.1.0) + react-remove-scroll: 2.7.2(@types/react@19.2.2)(react@19.1.0) optionalDependencies: - '@types/react': 19.2.15 - '@types/react-dom': 19.2.3(@types/react@19.2.15) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) - '@radix-ui/react-separator@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/react-separator@1.1.15(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) optionalDependencies: - '@types/react': 19.2.15 - '@types/react-dom': 19.2.3(@types/react@19.2.15) - - '@radix-ui/react-slider@1.3.6(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/number': 1.1.1 - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.15)(react@19.1.0) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) + + '@radix-ui/react-slider@1.4.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/number': 1.1.3 + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-collection': 1.1.15(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-context': 1.2.2(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-direction': 1.1.4(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-use-previous': 1.1.4(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-use-size': 1.1.4(@types/react@19.2.2)(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) optionalDependencies: - '@types/react': 19.2.15 - '@types/react-dom': 19.2.3(@types/react@19.2.15) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) - '@radix-ui/react-slot@1.2.3(@types/react@19.2.15)(react@19.1.0)': + '@radix-ui/react-slot@1.2.3(@types/react@19.2.2)(react@19.1.0)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.1.0) react: 19.1.0 optionalDependencies: - '@types/react': 19.2.15 + '@types/react': 19.2.2 - '@radix-ui/react-slot@1.2.4(@types/react@19.2.15)(react@19.1.0)': + '@radix-ui/react-slot@1.3.3(@types/react@19.2.2)(react@19.1.0)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.2)(react@19.1.0) react: 19.1.0 optionalDependencies: - '@types/react': 19.2.15 + '@types/react': 19.2.2 - '@radix-ui/react-switch@1.2.6(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/react-switch@1.3.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.15)(react@19.1.0) + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-context': 1.2.2(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-use-size': 1.1.4(@types/react@19.2.2)(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) optionalDependencies: - '@types/react': 19.2.15 - '@types/react-dom': 19.2.3(@types/react@19.2.15) - - '@radix-ui/react-tabs@1.1.13(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.15)(react@19.1.0) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) + + '@radix-ui/react-tabs@1.1.21(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-context': 1.2.2(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-direction': 1.1.4(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-id': 1.1.4(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-presence': 1.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-roving-focus': 1.1.19(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.2.2)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) + + '@radix-ui/react-toast@1.2.23(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-collection': 1.1.15(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-context': 1.2.2(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-dismissable-layer': 1.1.19(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-portal': 1.1.17(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-presence': 1.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-visually-hidden': 1.2.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) + + '@radix-ui/react-toggle-group@1.1.19(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-context': 1.2.2(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-direction': 1.1.4(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-roving-focus': 1.1.19(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-toggle': 1.1.18(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.2.2)(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) optionalDependencies: - '@types/react': 19.2.15 - '@types/react-dom': 19.2.3(@types/react@19.2.15) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) - '@radix-ui/react-toast@1.2.15(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/react-toggle@1.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) optionalDependencies: - '@types/react': 19.2.15 - '@types/react-dom': 19.2.3(@types/react@19.2.15) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) - '@radix-ui/react-toggle-group@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/react-toggle@1.1.18(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-toggle': 1.1.10(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.15)(react@19.1.0) + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.2.2)(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) optionalDependencies: - '@types/react': 19.2.15 - '@types/react-dom': 19.2.3(@types/react@19.2.15) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) + + '@radix-ui/react-toolbar@1.1.19(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-context': 1.2.2(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-direction': 1.1.4(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-roving-focus': 1.1.19(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-separator': 1.1.15(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-toggle-group': 1.1.19(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) + + '@radix-ui/react-tooltip@1.2.16(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-context': 1.2.2(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-dismissable-layer': 1.1.19(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-id': 1.1.4(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-popper': 1.3.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-portal': 1.1.17(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-presence': 1.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-slot': 1.3.3(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-visually-hidden': 1.2.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) - '@radix-ui/react-toggle@1.1.10(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/react-use-callback-ref@1.1.4(@types/react@19.2.2)(react@19.1.0)': dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.15)(react@19.1.0) react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) optionalDependencies: - '@types/react': 19.2.15 - '@types/react-dom': 19.2.3(@types/react@19.2.15) + '@types/react': 19.2.2 - '@radix-ui/react-toolbar@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.2.2)(react@19.1.0)': dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-separator': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-toggle-group': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.1.0) react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) optionalDependencies: - '@types/react': 19.2.15 - '@types/react-dom': 19.2.3(@types/react@19.2.15) + '@types/react': 19.2.2 - '@radix-ui/react-tooltip@1.2.8(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/react-use-controllable-state@1.2.6(@types/react@19.2.2)(react@19.1.0)': dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-use-effect-event': 0.0.5(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.2)(react@19.1.0) react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) optionalDependencies: - '@types/react': 19.2.15 - '@types/react-dom': 19.2.3(@types/react@19.2.15) + '@types/react': 19.2.2 - '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.2.15)(react@19.1.0)': + '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.2.2)(react@19.1.0)': dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.1.0) react: 19.1.0 optionalDependencies: - '@types/react': 19.2.15 + '@types/react': 19.2.2 - '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.2.15)(react@19.1.0)': + '@radix-ui/react-use-effect-event@0.0.5(@types/react@19.2.2)(react@19.1.0)': dependencies: - '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.15)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.2)(react@19.1.0) react: 19.1.0 optionalDependencies: - '@types/react': 19.2.15 + '@types/react': 19.2.2 - '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.2.15)(react@19.1.0)': + '@radix-ui/react-use-escape-keydown@1.1.5(@types/react@19.2.2)(react@19.1.0)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.15)(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.2.2)(react@19.1.0) react: 19.1.0 optionalDependencies: - '@types/react': 19.2.15 + '@types/react': 19.2.2 - '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.2.15)(react@19.1.0)': + '@radix-ui/react-use-is-hydrated@0.1.3(@types/react@19.2.2)(react@19.1.0)': dependencies: - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.15)(react@19.1.0) react: 19.1.0 optionalDependencies: - '@types/react': 19.2.15 + '@types/react': 19.2.2 - '@radix-ui/react-use-is-hydrated@0.1.0(@types/react@19.2.15)(react@19.1.0)': + '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.2)(react@19.1.0)': dependencies: react: 19.1.0 - use-sync-external-store: 1.6.0(react@19.1.0) optionalDependencies: - '@types/react': 19.2.15 + '@types/react': 19.2.2 - '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.15)(react@19.1.0)': + '@radix-ui/react-use-layout-effect@1.1.4(@types/react@19.2.2)(react@19.1.0)': dependencies: react: 19.1.0 optionalDependencies: - '@types/react': 19.2.15 + '@types/react': 19.2.2 - '@radix-ui/react-use-previous@1.1.1(@types/react@19.2.15)(react@19.1.0)': + '@radix-ui/react-use-previous@1.1.4(@types/react@19.2.2)(react@19.1.0)': dependencies: react: 19.1.0 optionalDependencies: - '@types/react': 19.2.15 + '@types/react': 19.2.2 - '@radix-ui/react-use-rect@1.1.1(@types/react@19.2.15)(react@19.1.0)': + '@radix-ui/react-use-rect@1.1.4(@types/react@19.2.2)(react@19.1.0)': dependencies: - '@radix-ui/rect': 1.1.1 + '@radix-ui/rect': 1.1.3 react: 19.1.0 optionalDependencies: - '@types/react': 19.2.15 + '@types/react': 19.2.2 - '@radix-ui/react-use-size@1.1.1(@types/react@19.2.15)(react@19.1.0)': + '@radix-ui/react-use-size@1.1.4(@types/react@19.2.2)(react@19.1.0)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.15)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.2)(react@19.1.0) react: 19.1.0 optionalDependencies: - '@types/react': 19.2.15 + '@types/react': 19.2.2 - '@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/react-visually-hidden@1.2.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) optionalDependencies: - '@types/react': 19.2.15 - '@types/react-dom': 19.2.3(@types/react@19.2.15) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) - '@radix-ui/rect@1.1.1': {} + '@radix-ui/rect@1.1.3': {} '@react-email/body@0.3.0(react@19.1.0)': dependencies: @@ -9627,14 +9522,16 @@ snapshots: '@react-email/render@2.0.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: html-to-text: 9.0.5 - prettier: 3.8.3 + prettier: 3.9.6 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - '@react-email/render@2.0.8(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@react-email/render@2.1.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: + entities: 4.5.0 html-to-text: 9.0.5 - prettier: 3.8.3 + html5parser: 3.0.0 + prettier: 3.9.6 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) @@ -9650,7 +9547,7 @@ snapshots: dependencies: '@react-email/text': 0.1.6(react@19.1.0) react: 19.1.0 - tailwindcss: 4.3.0 + tailwindcss: 4.3.3 optionalDependencies: '@react-email/body': 0.3.0(react@19.1.0) '@react-email/button': 0.2.1(react@19.1.0) @@ -9667,111 +9564,111 @@ snapshots: dependencies: react: 19.1.0 - '@reduxjs/toolkit@2.12.0(react-redux@9.3.0(@types/react@19.2.15)(react@19.1.0)(redux@5.0.1))(react@19.1.0)': + '@reduxjs/toolkit@2.12.0(react-redux@9.3.0(@types/react@19.2.2)(react@19.1.0)(redux@5.0.1))(react@19.1.0)': dependencies: '@standard-schema/spec': 1.1.0 '@standard-schema/utils': 0.3.0 - immer: 11.1.8 + immer: 11.1.17 redux: 5.0.1 redux-thunk: 3.1.0(redux@5.0.1) reselect: 5.1.1 optionalDependencies: react: 19.1.0 - react-redux: 9.3.0(@types/react@19.2.15)(react@19.1.0)(redux@5.0.1) + react-redux: 9.3.0(@types/react@19.2.2)(react@19.1.0)(redux@5.0.1) - '@rollup/plugin-commonjs@28.0.1(rollup@4.60.4)': + '@rollup/plugin-commonjs@28.0.1(rollup@4.62.4)': dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.60.4) + '@rollup/pluginutils': 5.4.0(rollup@4.62.4) commondir: 1.0.1 estree-walker: 2.0.2 - fdir: 6.5.0(picomatch@4.0.4) + fdir: 6.5.0(picomatch@4.0.3) is-reference: 1.2.1 magic-string: 0.30.21 - picomatch: 4.0.4 + picomatch: 4.0.3 optionalDependencies: - rollup: 4.60.4 + rollup: 4.62.4 - '@rollup/pluginutils@5.3.0(rollup@4.60.4)': + '@rollup/pluginutils@5.4.0(rollup@4.62.4)': dependencies: - '@types/estree': 1.0.9 + '@types/estree': 1.0.8 estree-walker: 2.0.2 - picomatch: 4.0.4 + picomatch: 4.0.3 optionalDependencies: - rollup: 4.60.4 + rollup: 4.62.4 - '@rollup/rollup-android-arm-eabi@4.60.4': + '@rollup/rollup-android-arm-eabi@4.62.4': optional: true - '@rollup/rollup-android-arm64@4.60.4': + '@rollup/rollup-android-arm64@4.62.4': optional: true - '@rollup/rollup-darwin-arm64@4.60.4': + '@rollup/rollup-darwin-arm64@4.62.4': optional: true - '@rollup/rollup-darwin-x64@4.60.4': + '@rollup/rollup-darwin-x64@4.62.4': optional: true - '@rollup/rollup-freebsd-arm64@4.60.4': + '@rollup/rollup-freebsd-arm64@4.62.4': optional: true - '@rollup/rollup-freebsd-x64@4.60.4': + '@rollup/rollup-freebsd-x64@4.62.4': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.60.4': + '@rollup/rollup-linux-arm-gnueabihf@4.62.4': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.60.4': + '@rollup/rollup-linux-arm-musleabihf@4.62.4': optional: true - '@rollup/rollup-linux-arm64-gnu@4.60.4': + '@rollup/rollup-linux-arm64-gnu@4.62.4': optional: true - '@rollup/rollup-linux-arm64-musl@4.60.4': + '@rollup/rollup-linux-arm64-musl@4.62.4': optional: true - '@rollup/rollup-linux-loong64-gnu@4.60.4': + '@rollup/rollup-linux-loong64-gnu@4.62.4': optional: true - '@rollup/rollup-linux-loong64-musl@4.60.4': + '@rollup/rollup-linux-loong64-musl@4.62.4': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.60.4': + '@rollup/rollup-linux-ppc64-gnu@4.62.4': optional: true - '@rollup/rollup-linux-ppc64-musl@4.60.4': + '@rollup/rollup-linux-ppc64-musl@4.62.4': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.60.4': + '@rollup/rollup-linux-riscv64-gnu@4.62.4': optional: true - '@rollup/rollup-linux-riscv64-musl@4.60.4': + '@rollup/rollup-linux-riscv64-musl@4.62.4': optional: true - '@rollup/rollup-linux-s390x-gnu@4.60.4': + '@rollup/rollup-linux-s390x-gnu@4.62.4': optional: true - '@rollup/rollup-linux-x64-gnu@4.60.4': + '@rollup/rollup-linux-x64-gnu@4.62.4': optional: true - '@rollup/rollup-linux-x64-musl@4.60.4': + '@rollup/rollup-linux-x64-musl@4.62.4': optional: true - '@rollup/rollup-openbsd-x64@4.60.4': + '@rollup/rollup-openbsd-x64@4.62.4': optional: true - '@rollup/rollup-openharmony-arm64@4.60.4': + '@rollup/rollup-openharmony-arm64@4.62.4': optional: true - '@rollup/rollup-win32-arm64-msvc@4.60.4': + '@rollup/rollup-win32-arm64-msvc@4.62.4': optional: true - '@rollup/rollup-win32-ia32-msvc@4.60.4': + '@rollup/rollup-win32-ia32-msvc@4.62.4': optional: true - '@rollup/rollup-win32-x64-gnu@4.60.4': + '@rollup/rollup-win32-x64-gnu@4.62.4': optional: true - '@rollup/rollup-win32-x64-msvc@4.60.4': + '@rollup/rollup-win32-x64-msvc@4.62.4': optional: true '@rtsao/scc@1.1.0': {} @@ -9785,37 +9682,25 @@ snapshots: domhandler: 5.0.3 selderee: 0.11.0 - '@sentry-internal/browser-utils@10.53.1': - dependencies: - '@sentry/core': 10.53.1 - - '@sentry-internal/feedback@10.53.1': - dependencies: - '@sentry/core': 10.53.1 - - '@sentry-internal/replay-canvas@10.53.1': - dependencies: - '@sentry-internal/replay': 10.53.1 - '@sentry/core': 10.53.1 + '@sentry/babel-plugin-component-annotate@5.3.0': {} - '@sentry-internal/replay@10.53.1': + '@sentry/browser-utils@10.70.0': dependencies: - '@sentry-internal/browser-utils': 10.53.1 - '@sentry/core': 10.53.1 - - '@sentry/babel-plugin-component-annotate@5.3.0': {} + '@sentry/conventions': 0.16.0 + '@sentry/core': 10.70.0 - '@sentry/browser@10.53.1': + '@sentry/browser@10.70.0': dependencies: - '@sentry-internal/browser-utils': 10.53.1 - '@sentry-internal/feedback': 10.53.1 - '@sentry-internal/replay': 10.53.1 - '@sentry-internal/replay-canvas': 10.53.1 - '@sentry/core': 10.53.1 + '@sentry/browser-utils': 10.70.0 + '@sentry/conventions': 0.16.0 + '@sentry/core': 10.70.0 + '@sentry/feedback': 10.70.0 + '@sentry/replay': 10.70.0 + '@sentry/replay-canvas': 10.70.0 '@sentry/bundler-plugin-core@5.3.0': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.29.7 '@sentry/babel-plugin-component-annotate': 5.3.0 '@sentry/cli': 2.58.6 dotenv: 16.6.1 @@ -9826,6 +9711,22 @@ snapshots: - encoding - supports-color + '@sentry/bundler-plugins@10.70.0(rollup@4.62.4)(webpack@5.109.2)': + dependencies: + '@babel/core': 7.29.7 + '@sentry/cli': 2.58.6 + '@sentry/core': 10.70.0 + dotenv: 17.4.2 + find-up: 5.0.0 + glob: 13.0.6 + magic-string: 0.30.21 + optionalDependencies: + rollup: 4.62.4 + webpack: 5.109.2 + transitivePeerDependencies: + - encoding + - supports-color + '@sentry/cli-darwin@2.58.6': optional: true @@ -9870,23 +9771,32 @@ snapshots: - encoding - supports-color - '@sentry/core@10.53.1': {} + '@sentry/conventions@0.16.0': {} + + '@sentry/core@10.70.0': + dependencies: + '@sentry/conventions': 0.16.0 + + '@sentry/feedback@10.70.0': + dependencies: + '@sentry/core': 10.70.0 - '@sentry/nextjs@10.53.1(@opentelemetry/core@2.7.1(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.7.1(@opentelemetry/api@1.9.1))(next@15.5.18(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0)(webpack@5.107.1)': + '@sentry/nextjs@10.70.0(@opentelemetry/core@2.10.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(next@15.5.18(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0)(webpack@5.109.2)': dependencies: '@opentelemetry/api': 1.9.1 - '@opentelemetry/semantic-conventions': 1.41.1 - '@rollup/plugin-commonjs': 28.0.1(rollup@4.60.4) - '@sentry-internal/browser-utils': 10.53.1 + '@rollup/plugin-commonjs': 28.0.1(rollup@4.62.4) + '@sentry/browser-utils': 10.70.0 '@sentry/bundler-plugin-core': 5.3.0 - '@sentry/core': 10.53.1 - '@sentry/node': 10.53.1 - '@sentry/opentelemetry': 10.53.1(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.7.1(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.7.1(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.41.1) - '@sentry/react': 10.53.1(react@19.1.0) - '@sentry/vercel-edge': 10.53.1 - '@sentry/webpack-plugin': 5.3.0(webpack@5.107.1) - next: 15.5.18(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - rollup: 4.60.4 + '@sentry/conventions': 0.16.0 + '@sentry/core': 10.70.0 + '@sentry/node': 10.70.0(@opentelemetry/core@2.10.0(@opentelemetry/api@1.9.1)) + '@sentry/opentelemetry': 10.70.0(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.10.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1)) + '@sentry/react': 10.70.0(react@19.1.0) + '@sentry/server-utils': 10.70.0 + '@sentry/vercel-edge': 10.70.0 + '@sentry/webpack-plugin': 5.4.0(rollup@4.62.4)(webpack@5.109.2) + next: 15.5.18(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + rollup: 4.62.4 stacktrace-parser: 0.1.11 transitivePeerDependencies: - '@opentelemetry/core' @@ -9897,86 +9807,88 @@ snapshots: - supports-color - webpack - '@sentry/node-core@10.53.1(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.7.1(@opentelemetry/api@1.9.1))(@opentelemetry/instrumentation@0.214.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.7.1(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.41.1)': + '@sentry/node-core@10.70.0(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.10.0(@opentelemetry/api@1.9.1))(@opentelemetry/instrumentation@0.220.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))': dependencies: - '@sentry/core': 10.53.1 - '@sentry/opentelemetry': 10.53.1(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.7.1(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.7.1(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.41.1) + '@sentry/conventions': 0.16.0 + '@sentry/core': 10.70.0 + '@sentry/opentelemetry': 10.70.0(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.10.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1)) import-in-the-middle: 3.0.1 optionalDependencies: '@opentelemetry/api': 1.9.1 - '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation': 0.214.0(@opentelemetry/api@1.9.1) - '@opentelemetry/sdk-trace-base': 2.7.1(@opentelemetry/api@1.9.1) - '@opentelemetry/semantic-conventions': 1.41.1 + '@opentelemetry/core': 2.10.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.220.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-base': 2.10.0(@opentelemetry/api@1.9.1) - '@sentry/node@10.53.1': + '@sentry/node@10.70.0(@opentelemetry/core@2.10.0(@opentelemetry/api@1.9.1))': dependencies: - '@fastify/otel': 0.18.0(@opentelemetry/api@1.9.1) '@opentelemetry/api': 1.9.1 - '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation': 0.214.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-amqplib': 0.61.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-connect': 0.57.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-dataloader': 0.31.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-fs': 0.33.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-generic-pool': 0.57.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-graphql': 0.62.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-hapi': 0.60.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-http': 0.214.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-kafkajs': 0.23.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-knex': 0.58.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-koa': 0.62.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-lru-memoizer': 0.58.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-mongodb': 0.67.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-mongoose': 0.60.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-mysql': 0.60.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-mysql2': 0.60.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-pg': 0.66.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-tedious': 0.33.0(@opentelemetry/api@1.9.1) - '@opentelemetry/sdk-trace-base': 2.7.1(@opentelemetry/api@1.9.1) - '@opentelemetry/semantic-conventions': 1.41.1 - '@prisma/instrumentation': 7.6.0(@opentelemetry/api@1.9.1) - '@sentry/core': 10.53.1 - '@sentry/node-core': 10.53.1(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.7.1(@opentelemetry/api@1.9.1))(@opentelemetry/instrumentation@0.214.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.7.1(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.41.1) - '@sentry/opentelemetry': 10.53.1(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.7.1(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.7.1(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.41.1) + '@opentelemetry/instrumentation': 0.220.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-base': 2.10.0(@opentelemetry/api@1.9.1) + '@sentry/conventions': 0.16.0 + '@sentry/core': 10.70.0 + '@sentry/node-core': 10.70.0(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.10.0(@opentelemetry/api@1.9.1))(@opentelemetry/instrumentation@0.220.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1)) + '@sentry/opentelemetry': 10.70.0(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.10.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1)) + '@sentry/server-utils': 10.70.0 import-in-the-middle: 3.0.1 transitivePeerDependencies: + - '@opentelemetry/core' - '@opentelemetry/exporter-trace-otlp-http' - supports-color - '@sentry/opentelemetry@10.53.1(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.7.1(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.7.1(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.41.1)': + '@sentry/opentelemetry@10.70.0(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.10.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))': dependencies: '@opentelemetry/api': 1.9.1 - '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) - '@opentelemetry/sdk-trace-base': 2.7.1(@opentelemetry/api@1.9.1) - '@opentelemetry/semantic-conventions': 1.41.1 - '@sentry/core': 10.53.1 + '@opentelemetry/core': 2.10.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-base': 2.10.0(@opentelemetry/api@1.9.1) + '@sentry/conventions': 0.16.0 + '@sentry/core': 10.70.0 - '@sentry/react@10.53.1(react@19.1.0)': + '@sentry/react@10.70.0(react@19.1.0)': dependencies: - '@sentry/browser': 10.53.1 - '@sentry/core': 10.53.1 + '@sentry/browser': 10.70.0 + '@sentry/conventions': 0.16.0 + '@sentry/core': 10.70.0 react: 19.1.0 - '@sentry/vercel-edge@10.53.1': + '@sentry/replay-canvas@10.70.0': + dependencies: + '@sentry/core': 10.70.0 + '@sentry/replay': 10.70.0 + + '@sentry/replay@10.70.0': + dependencies: + '@sentry/browser-utils': 10.70.0 + '@sentry/core': 10.70.0 + + '@sentry/server-utils@10.70.0': + dependencies: + '@apm-js-collab/code-transformer-bundler-plugins': 0.7.4 + '@apm-js-collab/tracing-hooks': 0.13.0 + '@sentry/conventions': 0.16.0 + '@sentry/core': 10.70.0 + meriyah: 6.1.4 + transitivePeerDependencies: + - supports-color + + '@sentry/vercel-edge@10.70.0': dependencies: '@opentelemetry/api': 1.9.1 - '@opentelemetry/resources': 2.7.1(@opentelemetry/api@1.9.1) - '@sentry/core': 10.53.1 + '@sentry/core': 10.70.0 - '@sentry/webpack-plugin@5.3.0(webpack@5.107.1)': + '@sentry/webpack-plugin@5.4.0(rollup@4.62.4)(webpack@5.109.2)': dependencies: - '@sentry/bundler-plugin-core': 5.3.0 - webpack: 5.107.1 + '@sentry/bundler-plugins': 10.70.0(rollup@4.62.4)(webpack@5.109.2) + webpack: 5.109.2 transitivePeerDependencies: - encoding + - rollup - supports-color '@shikijs/core@3.23.0': dependencies: '@shikijs/types': 3.23.0 '@shikijs/vscode-textmate': 10.0.2 - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 hast-util-to-html: 9.0.5 '@shikijs/engine-javascript@3.23.0': @@ -9997,7 +9909,7 @@ snapshots: '@shikijs/rehype@3.23.0': dependencies: '@shikijs/types': 3.23.0 - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 hast-util-to-string: 3.0.1 shiki: 3.23.0 unified: 11.0.5 @@ -10015,7 +9927,7 @@ snapshots: '@shikijs/types@3.23.0': dependencies: '@shikijs/vscode-textmate': 10.0.2 - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 '@shikijs/vscode-textmate@10.0.2': {} @@ -10029,308 +9941,330 @@ snapshots: '@standard-schema/utils@0.3.0': {} - '@supabase/auth-js@2.106.1': + '@supabase/auth-js@2.112.3': dependencies: tslib: 2.8.1 - '@supabase/functions-js@2.106.1': + '@supabase/functions-js@2.112.3': dependencies: tslib: 2.8.1 - '@supabase/phoenix@0.4.2': {} + '@supabase/phoenix@0.4.5': {} - '@supabase/postgrest-js@2.106.1': + '@supabase/postgrest-js@2.112.3': dependencies: tslib: 2.8.1 - '@supabase/realtime-js@2.106.1': + '@supabase/realtime-js@2.112.3': dependencies: - '@supabase/phoenix': 0.4.2 + '@supabase/phoenix': 0.4.5 tslib: 2.8.1 - '@supabase/storage-js@2.106.1': + '@supabase/storage-js@2.112.3': dependencies: iceberg-js: 0.8.1 tslib: 2.8.1 - '@supabase/supabase-js@2.106.1': + '@supabase/supabase-js@2.112.3(@opentelemetry/api@1.9.1)': dependencies: - '@supabase/auth-js': 2.106.1 - '@supabase/functions-js': 2.106.1 - '@supabase/postgrest-js': 2.106.1 - '@supabase/realtime-js': 2.106.1 - '@supabase/storage-js': 2.106.1 + '@supabase/auth-js': 2.112.3 + '@supabase/functions-js': 2.112.3 + '@supabase/postgrest-js': 2.112.3 + '@supabase/realtime-js': 2.112.3 + '@supabase/storage-js': 2.112.3 + optionalDependencies: + '@opentelemetry/api': 1.9.1 '@swc/helpers@0.5.15': dependencies: tslib: 2.8.1 - '@tailwindcss/node@4.3.0': + '@tailwindcss/node@4.3.3': dependencies: '@jridgewell/remapping': 2.3.5 - enhanced-resolve: 5.22.0 + enhanced-resolve: 5.24.5 jiti: 2.7.0 lightningcss: 1.32.0 magic-string: 0.30.21 source-map-js: 1.2.1 - tailwindcss: 4.3.0 + tailwindcss: 4.3.3 - '@tailwindcss/oxide-android-arm64@4.3.0': + '@tailwindcss/oxide-android-arm64@4.3.3': optional: true - '@tailwindcss/oxide-darwin-arm64@4.3.0': + '@tailwindcss/oxide-darwin-arm64@4.3.3': optional: true - '@tailwindcss/oxide-darwin-x64@4.3.0': + '@tailwindcss/oxide-darwin-x64@4.3.3': optional: true - '@tailwindcss/oxide-freebsd-x64@4.3.0': + '@tailwindcss/oxide-freebsd-x64@4.3.3': optional: true - '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.0': + '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.3': optional: true - '@tailwindcss/oxide-linux-arm64-gnu@4.3.0': + '@tailwindcss/oxide-linux-arm64-gnu@4.3.3': optional: true - '@tailwindcss/oxide-linux-arm64-musl@4.3.0': + '@tailwindcss/oxide-linux-arm64-musl@4.3.3': optional: true - '@tailwindcss/oxide-linux-x64-gnu@4.3.0': + '@tailwindcss/oxide-linux-x64-gnu@4.3.3': optional: true - '@tailwindcss/oxide-linux-x64-musl@4.3.0': + '@tailwindcss/oxide-linux-x64-musl@4.3.3': optional: true - '@tailwindcss/oxide-wasm32-wasi@4.3.0': + '@tailwindcss/oxide-wasm32-wasi@4.3.3': optional: true - '@tailwindcss/oxide-win32-arm64-msvc@4.3.0': + '@tailwindcss/oxide-win32-arm64-msvc@4.3.3': optional: true - '@tailwindcss/oxide-win32-x64-msvc@4.3.0': + '@tailwindcss/oxide-win32-x64-msvc@4.3.3': optional: true - '@tailwindcss/oxide@4.3.0': + '@tailwindcss/oxide@4.3.3': optionalDependencies: - '@tailwindcss/oxide-android-arm64': 4.3.0 - '@tailwindcss/oxide-darwin-arm64': 4.3.0 - '@tailwindcss/oxide-darwin-x64': 4.3.0 - '@tailwindcss/oxide-freebsd-x64': 4.3.0 - '@tailwindcss/oxide-linux-arm-gnueabihf': 4.3.0 - '@tailwindcss/oxide-linux-arm64-gnu': 4.3.0 - '@tailwindcss/oxide-linux-arm64-musl': 4.3.0 - '@tailwindcss/oxide-linux-x64-gnu': 4.3.0 - '@tailwindcss/oxide-linux-x64-musl': 4.3.0 - '@tailwindcss/oxide-wasm32-wasi': 4.3.0 - '@tailwindcss/oxide-win32-arm64-msvc': 4.3.0 - '@tailwindcss/oxide-win32-x64-msvc': 4.3.0 - - '@tailwindcss/postcss@4.3.0': + '@tailwindcss/oxide-android-arm64': 4.3.3 + '@tailwindcss/oxide-darwin-arm64': 4.3.3 + '@tailwindcss/oxide-darwin-x64': 4.3.3 + '@tailwindcss/oxide-freebsd-x64': 4.3.3 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.3.3 + '@tailwindcss/oxide-linux-arm64-gnu': 4.3.3 + '@tailwindcss/oxide-linux-arm64-musl': 4.3.3 + '@tailwindcss/oxide-linux-x64-gnu': 4.3.3 + '@tailwindcss/oxide-linux-x64-musl': 4.3.3 + '@tailwindcss/oxide-wasm32-wasi': 4.3.3 + '@tailwindcss/oxide-win32-arm64-msvc': 4.3.3 + '@tailwindcss/oxide-win32-x64-msvc': 4.3.3 + + '@tailwindcss/postcss@4.3.3': dependencies: '@alloc/quick-lru': 5.2.0 - '@tailwindcss/node': 4.3.0 - '@tailwindcss/oxide': 4.3.0 - postcss: 8.5.15 - tailwindcss: 4.3.0 + '@tailwindcss/node': 4.3.3 + '@tailwindcss/oxide': 4.3.3 + postcss: 8.5.23 + tailwindcss: 4.3.3 - '@tanstack/query-core@5.100.13': {} + '@tanstack/query-core@5.101.4': {} - '@tanstack/query-devtools@5.100.13': {} + '@tanstack/query-devtools@5.101.4': {} - '@tanstack/react-query-devtools@5.100.13(@tanstack/react-query@5.100.13(react@19.1.0))(react@19.1.0)': + '@tanstack/react-query-devtools@5.101.4(@tanstack/react-query@5.101.4(react@19.1.0))(react@19.1.0)': dependencies: - '@tanstack/query-devtools': 5.100.13 - '@tanstack/react-query': 5.100.13(react@19.1.0) + '@tanstack/query-devtools': 5.101.4 + '@tanstack/react-query': 5.101.4(react@19.1.0) react: 19.1.0 - '@tanstack/react-query@5.100.13(react@19.1.0)': + '@tanstack/react-query@5.101.4(react@19.1.0)': dependencies: - '@tanstack/query-core': 5.100.13 + '@tanstack/query-core': 5.101.4 react: 19.1.0 - '@tiptap/core@3.23.6(@tiptap/pm@3.23.6)': + '@tiptap/core@3.30.1(@tiptap/pm@3.30.1)': dependencies: - '@tiptap/pm': 3.23.6 + '@tiptap/pm': 3.30.1 - '@tiptap/extension-blockquote@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))': + '@tiptap/extension-blockquote@3.30.1(@tiptap/core@3.30.1(@tiptap/pm@3.30.1))(@tiptap/pm@3.30.1)': dependencies: - '@tiptap/core': 3.23.6(@tiptap/pm@3.23.6) + '@tiptap/core': 3.30.1(@tiptap/pm@3.30.1) + '@tiptap/pm': 3.30.1 - '@tiptap/extension-bold@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))': + '@tiptap/extension-bold@3.30.1(@tiptap/core@3.30.1(@tiptap/pm@3.30.1))': dependencies: - '@tiptap/core': 3.23.6(@tiptap/pm@3.23.6) + '@tiptap/core': 3.30.1(@tiptap/pm@3.30.1) - '@tiptap/extension-bubble-menu@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6)': + '@tiptap/extension-bubble-menu@3.30.1(@tiptap/core@3.30.1(@tiptap/pm@3.30.1))(@tiptap/pm@3.30.1)': dependencies: - '@floating-ui/dom': 1.7.6 - '@tiptap/core': 3.23.6(@tiptap/pm@3.23.6) - '@tiptap/pm': 3.23.6 + '@floating-ui/dom': 1.8.0 + '@tiptap/core': 3.30.1(@tiptap/pm@3.30.1) + '@tiptap/pm': 3.30.1 optional: true - '@tiptap/extension-bullet-list@3.23.6(@tiptap/extension-list@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6))': + '@tiptap/extension-bullet-list@3.30.1(@tiptap/extension-list@3.30.1(@tiptap/core@3.30.1(@tiptap/pm@3.30.1))(@tiptap/pm@3.30.1))': dependencies: - '@tiptap/extension-list': 3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6) + '@tiptap/extension-list': 3.30.1(@tiptap/core@3.30.1(@tiptap/pm@3.30.1))(@tiptap/pm@3.30.1) - '@tiptap/extension-code-block@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6)': + '@tiptap/extension-code-block@3.30.1(@tiptap/core@3.30.1(@tiptap/pm@3.30.1))(@tiptap/pm@3.30.1)': dependencies: - '@tiptap/core': 3.23.6(@tiptap/pm@3.23.6) - '@tiptap/pm': 3.23.6 + '@tiptap/core': 3.30.1(@tiptap/pm@3.30.1) + '@tiptap/pm': 3.30.1 - '@tiptap/extension-code@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))': + '@tiptap/extension-code@3.30.1(@tiptap/core@3.30.1(@tiptap/pm@3.30.1))': dependencies: - '@tiptap/core': 3.23.6(@tiptap/pm@3.23.6) + '@tiptap/core': 3.30.1(@tiptap/pm@3.30.1) - '@tiptap/extension-document@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))': + '@tiptap/extension-document@3.30.1(@tiptap/core@3.30.1(@tiptap/pm@3.30.1))': dependencies: - '@tiptap/core': 3.23.6(@tiptap/pm@3.23.6) + '@tiptap/core': 3.30.1(@tiptap/pm@3.30.1) - '@tiptap/extension-dropcursor@3.23.6(@tiptap/extensions@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6))': + '@tiptap/extension-dropcursor@3.30.1(@tiptap/extensions@3.30.1(@tiptap/core@3.30.1(@tiptap/pm@3.30.1))(@tiptap/pm@3.30.1))': dependencies: - '@tiptap/extensions': 3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6) + '@tiptap/extensions': 3.30.1(@tiptap/core@3.30.1(@tiptap/pm@3.30.1))(@tiptap/pm@3.30.1) - '@tiptap/extension-floating-menu@3.23.6(@floating-ui/dom@1.7.6)(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6)': + '@tiptap/extension-floating-menu@3.30.1(@floating-ui/dom@1.8.0)(@tiptap/core@3.30.1(@tiptap/pm@3.30.1))(@tiptap/pm@3.30.1)': dependencies: - '@floating-ui/dom': 1.7.6 - '@tiptap/core': 3.23.6(@tiptap/pm@3.23.6) - '@tiptap/pm': 3.23.6 + '@floating-ui/dom': 1.8.0 + '@tiptap/core': 3.30.1(@tiptap/pm@3.30.1) + '@tiptap/pm': 3.30.1 optional: true - '@tiptap/extension-gapcursor@3.23.6(@tiptap/extensions@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6))': + '@tiptap/extension-gapcursor@3.30.1(@tiptap/extensions@3.30.1(@tiptap/core@3.30.1(@tiptap/pm@3.30.1))(@tiptap/pm@3.30.1))': dependencies: - '@tiptap/extensions': 3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6) + '@tiptap/extensions': 3.30.1(@tiptap/core@3.30.1(@tiptap/pm@3.30.1))(@tiptap/pm@3.30.1) - '@tiptap/extension-hard-break@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))': + '@tiptap/extension-hard-break@3.30.1(@tiptap/core@3.30.1(@tiptap/pm@3.30.1))': dependencies: - '@tiptap/core': 3.23.6(@tiptap/pm@3.23.6) + '@tiptap/core': 3.30.1(@tiptap/pm@3.30.1) - '@tiptap/extension-heading@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))': + '@tiptap/extension-heading@3.30.1(@tiptap/core@3.30.1(@tiptap/pm@3.30.1))': dependencies: - '@tiptap/core': 3.23.6(@tiptap/pm@3.23.6) + '@tiptap/core': 3.30.1(@tiptap/pm@3.30.1) - '@tiptap/extension-horizontal-rule@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6)': + '@tiptap/extension-horizontal-rule@3.30.1(@tiptap/core@3.30.1(@tiptap/pm@3.30.1))(@tiptap/pm@3.30.1)': dependencies: - '@tiptap/core': 3.23.6(@tiptap/pm@3.23.6) - '@tiptap/pm': 3.23.6 + '@tiptap/core': 3.30.1(@tiptap/pm@3.30.1) + '@tiptap/pm': 3.30.1 - '@tiptap/extension-image@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))': + '@tiptap/extension-image@3.30.1(@tiptap/core@3.30.1(@tiptap/pm@3.30.1))': dependencies: - '@tiptap/core': 3.23.6(@tiptap/pm@3.23.6) + '@tiptap/core': 3.30.1(@tiptap/pm@3.30.1) - '@tiptap/extension-italic@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))': + '@tiptap/extension-italic@3.30.1(@tiptap/core@3.30.1(@tiptap/pm@3.30.1))': dependencies: - '@tiptap/core': 3.23.6(@tiptap/pm@3.23.6) + '@tiptap/core': 3.30.1(@tiptap/pm@3.30.1) - '@tiptap/extension-link@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6)': + '@tiptap/extension-link@3.30.1(@tiptap/core@3.30.1(@tiptap/pm@3.30.1))(@tiptap/pm@3.30.1)': dependencies: - '@tiptap/core': 3.23.6(@tiptap/pm@3.23.6) - '@tiptap/pm': 3.23.6 + '@tiptap/core': 3.30.1(@tiptap/pm@3.30.1) + '@tiptap/pm': 3.30.1 linkifyjs: 4.3.3 - '@tiptap/extension-list-item@3.23.6(@tiptap/extension-list@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6))': + '@tiptap/extension-list-item@3.30.1(@tiptap/extension-list@3.30.1(@tiptap/core@3.30.1(@tiptap/pm@3.30.1))(@tiptap/pm@3.30.1))': dependencies: - '@tiptap/extension-list': 3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6) + '@tiptap/extension-list': 3.30.1(@tiptap/core@3.30.1(@tiptap/pm@3.30.1))(@tiptap/pm@3.30.1) - '@tiptap/extension-list-keymap@3.23.6(@tiptap/extension-list@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6))': + '@tiptap/extension-list-keymap@3.30.1(@tiptap/extension-list@3.30.1(@tiptap/core@3.30.1(@tiptap/pm@3.30.1))(@tiptap/pm@3.30.1))': dependencies: - '@tiptap/extension-list': 3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6) + '@tiptap/extension-list': 3.30.1(@tiptap/core@3.30.1(@tiptap/pm@3.30.1))(@tiptap/pm@3.30.1) - '@tiptap/extension-list@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6)': + '@tiptap/extension-list@3.30.1(@tiptap/core@3.30.1(@tiptap/pm@3.30.1))(@tiptap/pm@3.30.1)': dependencies: - '@tiptap/core': 3.23.6(@tiptap/pm@3.23.6) - '@tiptap/pm': 3.23.6 + '@tiptap/core': 3.30.1(@tiptap/pm@3.30.1) + '@tiptap/pm': 3.30.1 - '@tiptap/extension-ordered-list@3.23.6(@tiptap/extension-list@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6))': + '@tiptap/extension-ordered-list@3.30.1(@tiptap/extension-list@3.30.1(@tiptap/core@3.30.1(@tiptap/pm@3.30.1))(@tiptap/pm@3.30.1))': dependencies: - '@tiptap/extension-list': 3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6) + '@tiptap/extension-list': 3.30.1(@tiptap/core@3.30.1(@tiptap/pm@3.30.1))(@tiptap/pm@3.30.1) - '@tiptap/extension-paragraph@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))': + '@tiptap/extension-paragraph@3.30.1(@tiptap/core@3.30.1(@tiptap/pm@3.30.1))': dependencies: - '@tiptap/core': 3.23.6(@tiptap/pm@3.23.6) + '@tiptap/core': 3.30.1(@tiptap/pm@3.30.1) - '@tiptap/extension-strike@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))': + '@tiptap/extension-strike@3.30.1(@tiptap/core@3.30.1(@tiptap/pm@3.30.1))': dependencies: - '@tiptap/core': 3.23.6(@tiptap/pm@3.23.6) + '@tiptap/core': 3.30.1(@tiptap/pm@3.30.1) - '@tiptap/extension-text@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))': + '@tiptap/extension-text@3.30.1(@tiptap/core@3.30.1(@tiptap/pm@3.30.1))': dependencies: - '@tiptap/core': 3.23.6(@tiptap/pm@3.23.6) + '@tiptap/core': 3.30.1(@tiptap/pm@3.30.1) - '@tiptap/extension-underline@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))': + '@tiptap/extension-underline@3.30.1(@tiptap/core@3.30.1(@tiptap/pm@3.30.1))': dependencies: - '@tiptap/core': 3.23.6(@tiptap/pm@3.23.6) + '@tiptap/core': 3.30.1(@tiptap/pm@3.30.1) - '@tiptap/extensions@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6)': + '@tiptap/extensions@3.30.1(@tiptap/core@3.30.1(@tiptap/pm@3.30.1))(@tiptap/pm@3.30.1)': dependencies: - '@tiptap/core': 3.23.6(@tiptap/pm@3.23.6) - '@tiptap/pm': 3.23.6 + '@tiptap/core': 3.30.1(@tiptap/pm@3.30.1) + '@tiptap/pm': 3.30.1 - '@tiptap/pm@3.23.6': + '@tiptap/pm@3.30.1': dependencies: prosemirror-changeset: 2.4.1 - prosemirror-commands: 1.7.1 - prosemirror-dropcursor: 1.8.2 + prosemirror-commands: 1.7.2 + prosemirror-dropcursor: 1.8.3 prosemirror-gapcursor: 1.4.1 prosemirror-history: 1.5.0 + prosemirror-inputrules: 1.5.1 prosemirror-keymap: 1.2.3 - prosemirror-model: 1.25.7 + prosemirror-model: 1.25.11 prosemirror-schema-list: 1.5.1 prosemirror-state: 1.4.4 prosemirror-tables: 1.8.5 prosemirror-transform: 1.12.0 - prosemirror-view: 1.41.8 + prosemirror-view: 1.42.2 - '@tiptap/react@3.23.6(@floating-ui/dom@1.7.6)(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6)(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@tiptap/react@3.30.1(@floating-ui/dom@1.8.0)(@tiptap/core@3.30.1(@tiptap/pm@3.30.1))(@tiptap/pm@3.30.1)(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@tiptap/core': 3.23.6(@tiptap/pm@3.23.6) - '@tiptap/pm': 3.23.6 - '@types/react': 19.2.15 - '@types/react-dom': 19.2.3(@types/react@19.2.15) + '@tiptap/core': 3.30.1(@tiptap/pm@3.30.1) + '@tiptap/pm': 3.30.1 + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) '@types/use-sync-external-store': 0.0.6 - fast-equals: 5.4.0 + fast-equals: 5.4.1 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) use-sync-external-store: 1.6.0(react@19.1.0) optionalDependencies: - '@tiptap/extension-bubble-menu': 3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6) - '@tiptap/extension-floating-menu': 3.23.6(@floating-ui/dom@1.7.6)(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6) + '@tiptap/extension-bubble-menu': 3.30.1(@tiptap/core@3.30.1(@tiptap/pm@3.30.1))(@tiptap/pm@3.30.1) + '@tiptap/extension-floating-menu': 3.30.1(@floating-ui/dom@1.8.0)(@tiptap/core@3.30.1(@tiptap/pm@3.30.1))(@tiptap/pm@3.30.1) transitivePeerDependencies: - '@floating-ui/dom' - '@tiptap/starter-kit@3.23.6': - dependencies: - '@tiptap/core': 3.23.6(@tiptap/pm@3.23.6) - '@tiptap/extension-blockquote': 3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6)) - '@tiptap/extension-bold': 3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6)) - '@tiptap/extension-bullet-list': 3.23.6(@tiptap/extension-list@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6)) - '@tiptap/extension-code': 3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6)) - '@tiptap/extension-code-block': 3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6) - '@tiptap/extension-document': 3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6)) - '@tiptap/extension-dropcursor': 3.23.6(@tiptap/extensions@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6)) - '@tiptap/extension-gapcursor': 3.23.6(@tiptap/extensions@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6)) - '@tiptap/extension-hard-break': 3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6)) - '@tiptap/extension-heading': 3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6)) - '@tiptap/extension-horizontal-rule': 3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6) - '@tiptap/extension-italic': 3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6)) - '@tiptap/extension-link': 3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6) - '@tiptap/extension-list': 3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6) - '@tiptap/extension-list-item': 3.23.6(@tiptap/extension-list@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6)) - '@tiptap/extension-list-keymap': 3.23.6(@tiptap/extension-list@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6)) - '@tiptap/extension-ordered-list': 3.23.6(@tiptap/extension-list@3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6)) - '@tiptap/extension-paragraph': 3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6)) - '@tiptap/extension-strike': 3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6)) - '@tiptap/extension-text': 3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6)) - '@tiptap/extension-underline': 3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6)) - '@tiptap/extensions': 3.23.6(@tiptap/core@3.23.6(@tiptap/pm@3.23.6))(@tiptap/pm@3.23.6) - '@tiptap/pm': 3.23.6 + '@tiptap/starter-kit@3.30.1': + dependencies: + '@tiptap/core': 3.30.1(@tiptap/pm@3.30.1) + '@tiptap/extension-blockquote': 3.30.1(@tiptap/core@3.30.1(@tiptap/pm@3.30.1))(@tiptap/pm@3.30.1) + '@tiptap/extension-bold': 3.30.1(@tiptap/core@3.30.1(@tiptap/pm@3.30.1)) + '@tiptap/extension-bullet-list': 3.30.1(@tiptap/extension-list@3.30.1(@tiptap/core@3.30.1(@tiptap/pm@3.30.1))(@tiptap/pm@3.30.1)) + '@tiptap/extension-code': 3.30.1(@tiptap/core@3.30.1(@tiptap/pm@3.30.1)) + '@tiptap/extension-code-block': 3.30.1(@tiptap/core@3.30.1(@tiptap/pm@3.30.1))(@tiptap/pm@3.30.1) + '@tiptap/extension-document': 3.30.1(@tiptap/core@3.30.1(@tiptap/pm@3.30.1)) + '@tiptap/extension-dropcursor': 3.30.1(@tiptap/extensions@3.30.1(@tiptap/core@3.30.1(@tiptap/pm@3.30.1))(@tiptap/pm@3.30.1)) + '@tiptap/extension-gapcursor': 3.30.1(@tiptap/extensions@3.30.1(@tiptap/core@3.30.1(@tiptap/pm@3.30.1))(@tiptap/pm@3.30.1)) + '@tiptap/extension-hard-break': 3.30.1(@tiptap/core@3.30.1(@tiptap/pm@3.30.1)) + '@tiptap/extension-heading': 3.30.1(@tiptap/core@3.30.1(@tiptap/pm@3.30.1)) + '@tiptap/extension-horizontal-rule': 3.30.1(@tiptap/core@3.30.1(@tiptap/pm@3.30.1))(@tiptap/pm@3.30.1) + '@tiptap/extension-italic': 3.30.1(@tiptap/core@3.30.1(@tiptap/pm@3.30.1)) + '@tiptap/extension-link': 3.30.1(@tiptap/core@3.30.1(@tiptap/pm@3.30.1))(@tiptap/pm@3.30.1) + '@tiptap/extension-list': 3.30.1(@tiptap/core@3.30.1(@tiptap/pm@3.30.1))(@tiptap/pm@3.30.1) + '@tiptap/extension-list-item': 3.30.1(@tiptap/extension-list@3.30.1(@tiptap/core@3.30.1(@tiptap/pm@3.30.1))(@tiptap/pm@3.30.1)) + '@tiptap/extension-list-keymap': 3.30.1(@tiptap/extension-list@3.30.1(@tiptap/core@3.30.1(@tiptap/pm@3.30.1))(@tiptap/pm@3.30.1)) + '@tiptap/extension-ordered-list': 3.30.1(@tiptap/extension-list@3.30.1(@tiptap/core@3.30.1(@tiptap/pm@3.30.1))(@tiptap/pm@3.30.1)) + '@tiptap/extension-paragraph': 3.30.1(@tiptap/core@3.30.1(@tiptap/pm@3.30.1)) + '@tiptap/extension-strike': 3.30.1(@tiptap/core@3.30.1(@tiptap/pm@3.30.1)) + '@tiptap/extension-text': 3.30.1(@tiptap/core@3.30.1(@tiptap/pm@3.30.1)) + '@tiptap/extension-underline': 3.30.1(@tiptap/core@3.30.1(@tiptap/pm@3.30.1)) + '@tiptap/extensions': 3.30.1(@tiptap/core@3.30.1(@tiptap/pm@3.30.1))(@tiptap/pm@3.30.1) + '@tiptap/pm': 3.30.1 '@ts-morph/common@0.27.0': dependencies: fast-glob: 3.3.3 - minimatch: 10.2.5 + minimatch: 10.2.6 path-browserify: 1.0.1 - '@tybys/wasm-util@0.10.2': + '@turbo/darwin-64@2.10.10': + optional: true + + '@turbo/darwin-arm64@2.10.10': + optional: true + + '@turbo/linux-64@2.10.10': + optional: true + + '@turbo/linux-arm64@2.10.10': + optional: true + + '@turbo/windows-64@2.10.10': + optional: true + + '@turbo/windows-arm64@2.10.10': + optional: true + + '@tybys/wasm-util@0.10.3': dependencies: tslib: 2.8.1 optional: true @@ -10339,13 +10273,11 @@ snapshots: dependencies: bcryptjs: 3.0.3 - '@types/connect@3.4.38': - dependencies: - '@types/node': 20.19.41 - '@types/cors@2.8.19': dependencies: - '@types/node': 20.19.41 + '@types/node': 20.19.43 + + '@types/d3-array@3.0.3': {} '@types/d3-array@3.2.2': {} @@ -10359,6 +10291,8 @@ snapshots: '@types/d3-chord@3.0.6': {} + '@types/d3-color@3.1.0': {} + '@types/d3-color@3.1.3': {} '@types/d3-contour@3.0.6': @@ -10366,6 +10300,8 @@ snapshots: '@types/d3-array': 3.2.2 '@types/geojson': 7946.0.16 + '@types/d3-delaunay@6.0.1': {} + '@types/d3-delaunay@6.0.4': {} '@types/d3-dispatch@3.0.7': {} @@ -10384,14 +10320,24 @@ snapshots: '@types/d3-force@3.0.10': {} + '@types/d3-format@3.0.1': {} + '@types/d3-format@3.0.4': {} '@types/d3-geo@3.1.0': dependencies: '@types/geojson': 7946.0.16 + '@types/d3-geo@3.1.1': + dependencies: + '@types/geojson': 7946.0.16 + '@types/d3-hierarchy@3.1.7': {} + '@types/d3-interpolate@3.0.1': + dependencies: + '@types/d3-color': 3.1.0 + '@types/d3-interpolate@3.0.4': dependencies: '@types/d3-color': 3.1.3 @@ -10402,22 +10348,34 @@ snapshots: '@types/d3-quadtree@3.0.6': {} - '@types/d3-random@3.0.3': {} + '@types/d3-random@3.0.4': {} '@types/d3-scale-chromatic@3.1.0': {} + '@types/d3-scale@4.0.2': + dependencies: + '@types/d3-time': 3.0.0 + '@types/d3-scale@4.0.9': dependencies: '@types/d3-time': 3.0.4 '@types/d3-selection@3.0.11': {} + '@types/d3-shape@3.1.7': + dependencies: + '@types/d3-path': 3.1.1 + '@types/d3-shape@3.1.8': dependencies: '@types/d3-path': 3.1.1 + '@types/d3-time-format@2.1.0': {} + '@types/d3-time-format@4.0.3': {} + '@types/d3-time@3.0.0': {} + '@types/d3-time@3.0.4': {} '@types/d3-timer@3.0.2': {} @@ -10447,13 +10405,13 @@ snapshots: '@types/d3-fetch': 3.0.7 '@types/d3-force': 3.0.10 '@types/d3-format': 3.0.4 - '@types/d3-geo': 3.1.0 + '@types/d3-geo': 3.1.1 '@types/d3-hierarchy': 3.1.7 '@types/d3-interpolate': 3.0.4 '@types/d3-path': 3.1.1 '@types/d3-polygon': 3.0.2 '@types/d3-quadtree': 3.0.6 - '@types/d3-random': 3.0.3 + '@types/d3-random': 3.0.4 '@types/d3-scale': 4.0.9 '@types/d3-scale-chromatic': 3.1.0 '@types/d3-selection': 3.0.11 @@ -10470,7 +10428,7 @@ snapshots: '@types/estree-jsx@1.0.5': dependencies: - '@types/estree': 1.0.9 + '@types/estree': 1.0.8 '@types/estree@1.0.8': {} @@ -10478,7 +10436,7 @@ snapshots: '@types/geojson@7946.0.16': {} - '@types/hast@3.0.4': + '@types/hast@3.0.5': dependencies: '@types/unist': 3.0.3 @@ -10486,59 +10444,37 @@ snapshots: '@types/json5@0.0.29': {} + '@types/lodash@4.17.25': {} + '@types/mdast@4.0.4': dependencies: '@types/unist': 3.0.3 - '@types/mdx@2.0.13': {} + '@types/mdx@2.0.14': {} '@types/ms@2.1.0': {} - '@types/mysql@2.15.27': - dependencies: - '@types/node': 20.19.41 - - '@types/node@20.19.41': + '@types/node@20.19.43': dependencies: undici-types: 6.21.0 - '@types/node@25.9.1': + '@types/node@25.9.5': dependencies: undici-types: 7.24.6 - '@types/pg-pool@2.0.7': - dependencies: - '@types/pg': 8.20.0 - - '@types/pg@8.15.6': - dependencies: - '@types/node': 20.19.41 - pg-protocol: 1.14.0 - pg-types: 2.2.0 - - '@types/pg@8.20.0': + '@types/pg@8.21.0': dependencies: - '@types/node': 20.19.41 - pg-protocol: 1.14.0 + '@types/node': 20.19.43 + pg-protocol: 1.16.0 pg-types: 2.2.0 - '@types/react-dom@19.2.3(@types/react@19.2.15)': + '@types/react-dom@19.2.2(@types/react@19.2.2)': dependencies: - '@types/react': 19.2.15 + '@types/react': 19.2.2 - '@types/react@19.2.15': + '@types/react@19.2.2': dependencies: - csstype: 3.2.3 - - '@types/set-cookie-parser@2.4.10': - dependencies: - '@types/node': 20.19.41 - - '@types/statuses@2.0.6': {} - - '@types/tedious@4.0.14': - dependencies: - '@types/node': 20.19.41 + csstype: 3.1.3 '@types/trusted-types@2.0.7': optional: true @@ -10553,100 +10489,100 @@ snapshots: '@types/ws@8.18.1': dependencies: - '@types/node': 20.19.41 + '@types/node': 20.19.43 - '@typescript-eslint/eslint-plugin@8.59.4(@typescript-eslint/parser@8.59.4(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.50.0(@typescript-eslint/parser@8.50.0(eslint@9.39.1(jiti@2.7.0))(typescript@5.9.2))(eslint@9.39.1(jiti@2.7.0))(typescript@5.9.2)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.59.4(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.59.4 - '@typescript-eslint/type-utils': 8.59.4(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) - '@typescript-eslint/utils': 8.59.4(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.59.4 - eslint: 9.39.4(jiti@2.7.0) + '@typescript-eslint/parser': 8.50.0(eslint@9.39.1(jiti@2.7.0))(typescript@5.9.2) + '@typescript-eslint/scope-manager': 8.50.0 + '@typescript-eslint/type-utils': 8.50.0(eslint@9.39.1(jiti@2.7.0))(typescript@5.9.2) + '@typescript-eslint/utils': 8.50.0(eslint@9.39.1(jiti@2.7.0))(typescript@5.9.2) + '@typescript-eslint/visitor-keys': 8.50.0 + eslint: 9.39.1(jiti@2.7.0) ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 2.5.0(typescript@5.9.3) - typescript: 5.9.3 + ts-api-utils: 2.1.0(typescript@5.9.2) + typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.59.4(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3)': + '@typescript-eslint/parser@8.50.0(eslint@9.39.1(jiti@2.7.0))(typescript@5.9.2)': dependencies: - '@typescript-eslint/scope-manager': 8.59.4 - '@typescript-eslint/types': 8.59.4 - '@typescript-eslint/typescript-estree': 8.59.4(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.59.4 + '@typescript-eslint/scope-manager': 8.50.0 + '@typescript-eslint/types': 8.50.0 + '@typescript-eslint/typescript-estree': 8.50.0(typescript@5.9.2) + '@typescript-eslint/visitor-keys': 8.50.0 debug: 4.4.3 - eslint: 9.39.4(jiti@2.7.0) - typescript: 5.9.3 + eslint: 9.39.1(jiti@2.7.0) + typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.59.4(typescript@5.9.3)': + '@typescript-eslint/project-service@8.50.0(typescript@5.9.2)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.59.4(typescript@5.9.3) - '@typescript-eslint/types': 8.59.4 + '@typescript-eslint/tsconfig-utils': 8.50.0(typescript@5.9.2) + '@typescript-eslint/types': 8.50.0 debug: 4.4.3 - typescript: 5.9.3 + typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.59.4': + '@typescript-eslint/scope-manager@8.50.0': dependencies: - '@typescript-eslint/types': 8.59.4 - '@typescript-eslint/visitor-keys': 8.59.4 + '@typescript-eslint/types': 8.50.0 + '@typescript-eslint/visitor-keys': 8.50.0 - '@typescript-eslint/tsconfig-utils@8.59.4(typescript@5.9.3)': + '@typescript-eslint/tsconfig-utils@8.50.0(typescript@5.9.2)': dependencies: - typescript: 5.9.3 + typescript: 5.9.2 - '@typescript-eslint/type-utils@8.59.4(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.50.0(eslint@9.39.1(jiti@2.7.0))(typescript@5.9.2)': dependencies: - '@typescript-eslint/types': 8.59.4 - '@typescript-eslint/typescript-estree': 8.59.4(typescript@5.9.3) - '@typescript-eslint/utils': 8.59.4(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/types': 8.50.0 + '@typescript-eslint/typescript-estree': 8.50.0(typescript@5.9.2) + '@typescript-eslint/utils': 8.50.0(eslint@9.39.1(jiti@2.7.0))(typescript@5.9.2) debug: 4.4.3 - eslint: 9.39.4(jiti@2.7.0) - ts-api-utils: 2.5.0(typescript@5.9.3) - typescript: 5.9.3 + eslint: 9.39.1(jiti@2.7.0) + ts-api-utils: 2.1.0(typescript@5.9.2) + typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.59.4': {} + '@typescript-eslint/types@8.50.0': {} - '@typescript-eslint/typescript-estree@8.59.4(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@8.50.0(typescript@5.9.2)': dependencies: - '@typescript-eslint/project-service': 8.59.4(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.59.4(typescript@5.9.3) - '@typescript-eslint/types': 8.59.4 - '@typescript-eslint/visitor-keys': 8.59.4 + '@typescript-eslint/project-service': 8.50.0(typescript@5.9.2) + '@typescript-eslint/tsconfig-utils': 8.50.0(typescript@5.9.2) + '@typescript-eslint/types': 8.50.0 + '@typescript-eslint/visitor-keys': 8.50.0 debug: 4.4.3 - minimatch: 10.2.5 - semver: 7.8.1 - tinyglobby: 0.2.16 - ts-api-utils: 2.5.0(typescript@5.9.3) - typescript: 5.9.3 + minimatch: 9.0.5 + semver: 7.8.5 + tinyglobby: 0.2.15 + ts-api-utils: 2.1.0(typescript@5.9.2) + typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.59.4(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3)': + '@typescript-eslint/utils@8.50.0(eslint@9.39.1(jiti@2.7.0))(typescript@5.9.2)': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.7.0)) - '@typescript-eslint/scope-manager': 8.59.4 - '@typescript-eslint/types': 8.59.4 - '@typescript-eslint/typescript-estree': 8.59.4(typescript@5.9.3) - eslint: 9.39.4(jiti@2.7.0) - typescript: 5.9.3 + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.1(jiti@2.7.0)) + '@typescript-eslint/scope-manager': 8.50.0 + '@typescript-eslint/types': 8.50.0 + '@typescript-eslint/typescript-estree': 8.50.0(typescript@5.9.2) + eslint: 9.39.1(jiti@2.7.0) + typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.59.4': + '@typescript-eslint/visitor-keys@8.50.0': dependencies: - '@typescript-eslint/types': 8.59.4 - eslint-visitor-keys: 5.0.1 + '@typescript-eslint/types': 8.50.0 + eslint-visitor-keys: 4.2.1 - '@ungap/structured-clone@1.3.1': {} + '@ungap/structured-clone@1.3.3': {} '@unrs/resolver-binding-android-arm-eabi@1.12.2': optional: true @@ -10706,7 +10642,7 @@ snapshots: dependencies: '@emnapi/core': 1.10.0 '@emnapi/runtime': 1.10.0 - '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + '@napi-rs/wasm-runtime': 1.2.3(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) optional: true '@unrs/resolver-binding-win32-arm64-msvc@1.12.2': @@ -10723,29 +10659,106 @@ snapshots: d3-selection: 3.0.0 d3-transition: 3.0.1(d3-selection@3.0.0) - '@upstash/core-analytics@0.0.10': + '@upstash/core-analytics@0.0.10': + dependencies: + '@upstash/redis': 1.38.2 + + '@upstash/qstash@2.11.3': + dependencies: + crypto-js: 4.2.0 + jose: 5.10.0 + neverthrow: 7.2.0 + + '@upstash/ratelimit@2.0.8(@upstash/redis@1.38.2)': + dependencies: + '@upstash/core-analytics': 0.0.10 + '@upstash/redis': 1.38.2 + + '@upstash/redis@1.38.2': + dependencies: + uncrypto: 0.1.3 + + '@vercel/analytics@2.0.1(next@15.5.18(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0)': + optionalDependencies: + next: 15.5.18(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + react: 19.1.0 + + '@visx/curve@4.0.1-alpha.0': + dependencies: + '@visx/vendor': 4.0.0-alpha.0 + + '@visx/event@4.0.1-alpha.0': + dependencies: + '@types/react': 19.2.2 + '@visx/point': 4.0.1-alpha.0 + + '@visx/grid@4.0.1-alpha.0(react@19.1.0)': + dependencies: + '@types/react': 19.2.2 + '@visx/curve': 4.0.1-alpha.0 + '@visx/group': 4.0.1-alpha.0(react@19.1.0) + '@visx/point': 4.0.1-alpha.0 + '@visx/scale': 4.0.1-alpha.0 + '@visx/shape': 4.0.1-alpha.0(react@19.1.0) + classnames: 2.5.1 + react: 19.1.0 + + '@visx/group@4.0.1-alpha.0(react@19.1.0)': + dependencies: + '@types/react': 19.2.2 + classnames: 2.5.1 + react: 19.1.0 + + '@visx/point@4.0.1-alpha.0': {} + + '@visx/responsive@4.0.1-alpha.0(react@19.1.0)': dependencies: - '@upstash/redis': 1.38.0 + '@types/lodash': 4.17.25 + '@types/react': 19.2.2 + lodash: 4.18.1 + react: 19.1.0 - '@upstash/qstash@2.11.0': + '@visx/scale@4.0.1-alpha.0': dependencies: - crypto-js: 4.2.0 - jose: 5.10.0 - neverthrow: 7.2.0 + '@visx/vendor': 4.0.0-alpha.0 - '@upstash/ratelimit@2.0.8(@upstash/redis@1.38.0)': + '@visx/shape@4.0.1-alpha.0(react@19.1.0)': dependencies: - '@upstash/core-analytics': 0.0.10 - '@upstash/redis': 1.38.0 + '@types/lodash': 4.17.25 + '@types/react': 19.2.2 + '@visx/curve': 4.0.1-alpha.0 + '@visx/group': 4.0.1-alpha.0(react@19.1.0) + '@visx/scale': 4.0.1-alpha.0 + '@visx/vendor': 4.0.0-alpha.0 + classnames: 2.5.1 + lodash: 4.18.1 + react: 19.1.0 - '@upstash/redis@1.38.0': + '@visx/vendor@4.0.0-alpha.0': dependencies: - uncrypto: 0.1.3 - - '@vercel/analytics@2.0.1(next@15.5.18(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0)': - optionalDependencies: - next: 15.5.18(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - react: 19.1.0 + '@types/d3-array': 3.0.3 + '@types/d3-color': 3.1.0 + '@types/d3-delaunay': 6.0.1 + '@types/d3-format': 3.0.1 + '@types/d3-geo': 3.1.0 + '@types/d3-interpolate': 3.0.1 + '@types/d3-path': 3.1.1 + '@types/d3-scale': 4.0.2 + '@types/d3-shape': 3.1.7 + '@types/d3-time': 3.0.0 + '@types/d3-time-format': 2.1.0 + d3-array: 3.2.1 + d3-color: 3.1.0 + d3-delaunay: 6.0.2 + d3-format: 3.1.0 + d3-geo: 3.1.0 + d3-interpolate: 3.0.1 + d3-path: 3.1.0 + d3-scale: 4.0.2 + d3-shape: 3.2.0 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + internmap: 2.0.3 '@webassemblyjs/ast@1.14.1': dependencies: @@ -10837,19 +10850,17 @@ snapshots: mime-types: 3.0.2 negotiator: 1.0.0 - acorn-import-attributes@1.9.5(acorn@8.16.0): + acorn-import-attributes@1.9.5(acorn@8.15.0): dependencies: - acorn: 8.16.0 + acorn: 8.15.0 - acorn-import-phases@1.0.4(acorn@8.16.0): + acorn-jsx@5.3.2(acorn@8.15.0): dependencies: - acorn: 8.16.0 + acorn: 8.15.0 - acorn-jsx@5.3.2(acorn@8.16.0): - dependencies: - acorn: 8.16.0 + acorn@8.15.0: {} - acorn@8.16.0: {} + acorn@8.18.0: {} agent-base@6.0.2: dependencies: @@ -10857,8 +10868,6 @@ snapshots: transitivePeerDependencies: - supports-color - agent-base@7.1.4: {} - ajv-formats@2.1.1(ajv@8.20.0): optionalDependencies: ajv: 8.20.0 @@ -10872,7 +10881,7 @@ snapshots: ajv: 8.20.0 fast-deep-equal: 3.1.3 - ajv@6.15.0: + ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 fast-json-stable-stringify: 2.1.0 @@ -10882,7 +10891,7 @@ snapshots: ajv@8.20.0: dependencies: fast-deep-equal: 3.1.3 - fast-uri: 3.1.2 + fast-uri: 3.1.5 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 @@ -10890,7 +10899,7 @@ snapshots: ansi-regex@5.0.1: {} - ansi-regex@6.2.2: {} + ansi-regex@6.3.0: {} ansi-styles@4.3.0: dependencies: @@ -10911,62 +10920,62 @@ snapshots: array-includes@3.1.9: dependencies: - call-bind: 1.0.9 + call-bind: 1.0.8 call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.24.2 - es-object-atoms: 1.1.2 + es-abstract: 1.24.0 + es-object-atoms: 1.1.1 get-intrinsic: 1.3.0 is-string: 1.1.1 math-intrinsics: 1.1.0 array.prototype.findlast@1.2.5: dependencies: - call-bind: 1.0.9 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.24.2 + es-abstract: 1.24.0 es-errors: 1.3.0 - es-object-atoms: 1.1.2 + es-object-atoms: 1.1.1 es-shim-unscopables: 1.1.0 array.prototype.findlastindex@1.2.6: dependencies: - call-bind: 1.0.9 + call-bind: 1.0.8 call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.24.2 + es-abstract: 1.24.0 es-errors: 1.3.0 - es-object-atoms: 1.1.2 + es-object-atoms: 1.1.1 es-shim-unscopables: 1.1.0 array.prototype.flat@1.3.3: dependencies: - call-bind: 1.0.9 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.24.2 + es-abstract: 1.24.0 es-shim-unscopables: 1.1.0 array.prototype.flatmap@1.3.3: dependencies: - call-bind: 1.0.9 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.24.2 + es-abstract: 1.24.0 es-shim-unscopables: 1.1.0 array.prototype.tosorted@1.1.4: dependencies: - call-bind: 1.0.9 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.24.2 + es-abstract: 1.24.0 es-errors: 1.3.0 es-shim-unscopables: 1.1.0 arraybuffer.prototype.slice@1.0.4: dependencies: array-buffer-byte-length: 1.0.2 - call-bind: 1.0.9 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.24.2 + es-abstract: 1.24.0 es-errors: 1.3.0 get-intrinsic: 1.3.0 is-array-buffer: 3.0.5 @@ -10983,6 +10992,8 @@ snapshots: asynckit@0.4.0: {} + atomically@1.7.0: {} + atomically@2.1.1: dependencies: stubborn-fs: 2.0.0 @@ -10994,12 +11005,12 @@ snapshots: aws-ssl-profiles@1.1.2: {} - axe-core@4.11.4: {} + axe-core@4.13.0: {} - axios@1.16.1: + axios@1.19.0: dependencies: follow-redirects: 1.16.0 - form-data: 4.0.5 + form-data: 4.0.6 https-proxy-agent: 5.0.1 proxy-from-env: 2.1.0 transitivePeerDependencies: @@ -11016,72 +11027,76 @@ snapshots: base64id@2.0.0: {} - baseline-browser-mapping@2.10.32: {} + baseline-browser-mapping@2.11.14: {} bcryptjs@3.0.3: {} - better-auth@1.6.11(@opentelemetry/api@1.9.1)(@prisma/client@7.8.0(prisma@7.8.0(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.9.3))(typescript@5.9.3))(mysql2@3.15.3)(next@15.5.18(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(pg@8.21.0)(prisma@7.8.0(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.9.3))(react-dom@19.1.0(react@19.1.0))(react@19.1.0): - dependencies: - '@better-auth/core': 1.6.11(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.1)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0) - '@better-auth/drizzle-adapter': 1.6.11(@better-auth/core@1.6.11(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.1)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0))(@better-auth/utils@0.4.0) - '@better-auth/kysely-adapter': 1.6.11(@better-auth/core@1.6.11(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.1)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0))(@better-auth/utils@0.4.0)(kysely@0.28.17) - '@better-auth/memory-adapter': 1.6.11(@better-auth/core@1.6.11(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.1)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0))(@better-auth/utils@0.4.0) - '@better-auth/mongo-adapter': 1.6.11(@better-auth/core@1.6.11(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.1)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0))(@better-auth/utils@0.4.0) - '@better-auth/prisma-adapter': 1.6.11(@better-auth/core@1.6.11(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.1)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0))(@better-auth/utils@0.4.0)(@prisma/client@7.8.0(prisma@7.8.0(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.9.3))(typescript@5.9.3))(prisma@7.8.0(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.9.3)) - '@better-auth/telemetry': 1.6.11(@better-auth/core@1.6.11(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.1)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0))(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21) - '@better-auth/utils': 0.4.0 - '@better-fetch/fetch': 1.1.21 - '@noble/ciphers': 2.2.0 - '@noble/hashes': 2.2.0 - better-call: 1.3.5(zod@4.4.3) + better-auth@1.6.29(@opentelemetry/api@1.9.1)(@prisma/client@7.9.1(prisma@7.9.1(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.9.2))(typescript@5.9.2))(mysql2@3.15.3)(next@15.5.18(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(pg@8.23.0)(prisma@7.9.1(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.9.2))(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + dependencies: + '@better-auth/core': 1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.0) + '@better-auth/drizzle-adapter': 1.6.29(@better-auth/core@1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.0))(@better-auth/utils@0.4.2) + '@better-auth/kysely-adapter': 1.6.29(@better-auth/core@1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.0))(@better-auth/utils@0.4.2)(kysely@0.29.5) + '@better-auth/memory-adapter': 1.6.29(@better-auth/core@1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.0))(@better-auth/utils@0.4.2) + '@better-auth/mongo-adapter': 1.6.29(@better-auth/core@1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.0))(@better-auth/utils@0.4.2) + '@better-auth/prisma-adapter': 1.6.29(@better-auth/core@1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.0))(@better-auth/utils@0.4.2)(@prisma/client@7.9.1(prisma@7.9.1(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.9.2))(typescript@5.9.2))(prisma@7.9.1(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.9.2)) + '@better-auth/telemetry': 1.6.29(@better-auth/core@1.6.29(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.5)(nanostores@1.5.0))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1) + '@better-auth/utils': 0.4.2 + '@better-fetch/fetch': 1.3.1 + '@noble/ciphers': 2.3.0 + '@noble/hashes': 2.3.0 + better-call: 1.4.0(zod@4.4.3) defu: 6.1.7 - jose: 6.2.3 - kysely: 0.28.17 - nanostores: 1.3.0 + jose: 6.2.9 + kysely: 0.29.5 + nanostores: 1.5.0 zod: 4.4.3 optionalDependencies: - '@prisma/client': 7.8.0(prisma@7.8.0(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.9.3))(typescript@5.9.3) + '@prisma/client': 7.9.1(prisma@7.9.1(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.9.2))(typescript@5.9.2) mysql2: 3.15.3 - next: 15.5.18(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - pg: 8.21.0 - prisma: 7.8.0(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.9.3) + next: 15.5.18(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + pg: 8.23.0 + prisma: 7.9.1(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.9.2) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) transitivePeerDependencies: - '@cloudflare/workers-types' - '@opentelemetry/api' - better-call@1.3.5(zod@4.4.3): + better-call@1.4.0(zod@4.4.3): dependencies: - '@better-auth/utils': 0.4.0 - '@better-fetch/fetch': 1.1.21 - rou3: 0.7.12 - set-cookie-parser: 3.1.0 + '@better-auth/utils': 0.5.0 + '@better-fetch/fetch': 1.3.1 + rou3: 0.9.2 + set-cookie-parser: 3.1.2 optionalDependencies: zod: 4.4.3 - better-result@2.9.2: {} + better-result@2.10.0: {} - body-parser@2.2.2: + body-parser@2.3.0: dependencies: bytes: 3.1.2 - content-type: 1.0.5 + content-type: 2.1.0 debug: 4.4.3 http-errors: 2.0.1 - iconv-lite: 0.7.2 + iconv-lite: 0.7.3 on-finished: 2.4.1 - qs: 6.15.2 + qs: 6.15.3 raw-body: 3.0.2 type-is: 2.1.0 transitivePeerDependencies: - supports-color - brace-expansion@1.1.14: + brace-expansion@1.1.12: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - brace-expansion@5.0.6: + brace-expansion@2.0.2: + dependencies: + balanced-match: 1.0.2 + + brace-expansion@5.0.9: dependencies: balanced-match: 4.0.4 @@ -11089,13 +11104,13 @@ snapshots: dependencies: fill-range: 7.1.1 - browserslist@4.28.2: + browserslist@4.28.8: dependencies: - baseline-browser-mapping: 2.10.32 - caniuse-lite: 1.0.30001793 - electron-to-chromium: 1.5.361 - node-releases: 2.0.46 - update-browserslist-db: 1.2.3(browserslist@4.28.2) + baseline-browser-mapping: 2.11.14 + caniuse-lite: 1.0.30001809 + electron-to-chromium: 1.5.407 + node-releases: 2.0.53 + update-browserslist-db: 1.3.1(browserslist@4.28.8) buffer-from@1.1.2: {} @@ -11111,10 +11126,10 @@ snapshots: confbox: 0.2.4 defu: 6.1.7 dotenv: 17.4.2 - exsolve: 1.0.8 - giget: 3.2.0 + exsolve: 1.1.1 + giget: 3.3.1 jiti: 2.7.0 - ohash: 2.0.11 + ohash: 2.0.12 pathe: 2.0.3 perfect-debounce: 2.1.0 pkg-types: 2.3.1 @@ -11125,7 +11140,7 @@ snapshots: es-errors: 1.3.0 function-bind: 1.1.2 - call-bind@1.0.9: + call-bind@1.0.8: dependencies: call-bind-apply-helpers: 1.0.2 es-define-property: 1.0.1 @@ -11139,7 +11154,9 @@ snapshots: callsites@3.1.0: {} - caniuse-lite@1.0.30001793: {} + caniuse-lite@1.0.30001761: {} + + caniuse-lite@1.0.30001809: {} ccount@2.0.1: {} @@ -11158,52 +11175,42 @@ snapshots: character-reference-invalid@2.0.1: {} - chart.js@4.5.1: - dependencies: - '@kurkle/color': 0.3.4 - chokidar@4.0.3: dependencies: readdirp: 4.1.2 chokidar@5.0.0: dependencies: - readdirp: 5.0.0 + readdirp: 5.1.1 chrome-trace-event@1.0.4: {} citty@0.2.2: {} - cjs-module-lexer@2.2.0: {} + cjs-module-lexer@2.2.1: {} class-variance-authority@0.7.1: dependencies: clsx: 2.1.1 + classnames@2.5.1: {} + cli-cursor@5.0.0: dependencies: restore-cursor: 5.1.0 cli-spinners@2.9.2: {} - cli-width@4.1.0: {} - client-only@0.0.1: {} - cliui@8.0.1: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - clsx@2.1.1: {} - cmdk@1.1.1(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + cmdk@1.1.1(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-primitive': 2.1.4(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-dialog': 1.1.23(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-id': 1.1.4(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) transitivePeerDependencies: @@ -11244,16 +11251,29 @@ snapshots: concat-map@0.0.1: {} + conf@10.2.0: + dependencies: + ajv: 8.20.0 + ajv-formats: 2.1.1(ajv@8.20.0) + atomically: 1.7.0 + debounce-fn: 4.0.0 + dot-prop: 6.0.1 + env-paths: 2.2.1 + json-schema-typed: 7.0.3 + onetime: 5.1.2 + pkg-up: 3.1.0 + semver: 7.8.5 + conf@15.1.0: dependencies: ajv: 8.20.0 ajv-formats: 3.0.1(ajv@8.20.0) atomically: 2.1.1 debounce-fn: 6.0.0 - dot-prop: 10.1.0 + dot-prop: 10.2.0 env-paths: 3.0.0 json-schema-typed: 8.0.2 - semver: 7.8.1 + semver: 7.8.5 uint8array-extras: 1.5.0 confbox@0.2.4: {} @@ -11262,7 +11282,7 @@ snapshots: content-type@1.0.5: {} - content-type@2.0.0: {} + content-type@2.1.0: {} convert-source-map@2.0.0: {} @@ -11270,8 +11290,6 @@ snapshots: cookie@0.7.2: {} - cookie@1.1.1: {} - core-util-is@1.0.3: {} cors@2.8.6: @@ -11287,14 +11305,14 @@ snapshots: dependencies: layout-base: 2.0.1 - cosmiconfig@9.0.1(typescript@5.9.3): + cosmiconfig@9.0.2(typescript@5.9.2): dependencies: env-paths: 2.2.1 import-fresh: 3.3.1 - js-yaml: 4.1.1 + js-yaml: 4.1.0 parse-json: 5.2.0 optionalDependencies: - typescript: 5.9.3 + typescript: 5.9.2 cross-spawn@7.0.6: dependencies: @@ -11311,24 +11329,28 @@ snapshots: cssesc@3.0.0: {} - csstype@3.2.3: {} + csstype@3.1.3: {} - cytoscape-cose-bilkent@4.1.0(cytoscape@3.34.0): + cytoscape-cose-bilkent@4.1.0(cytoscape@3.34.1): dependencies: cose-base: 1.0.3 - cytoscape: 3.34.0 + cytoscape: 3.34.1 - cytoscape-fcose@2.2.0(cytoscape@3.34.0): + cytoscape-fcose@2.2.0(cytoscape@3.34.1): dependencies: cose-base: 2.2.0 - cytoscape: 3.34.0 + cytoscape: 3.34.1 - cytoscape@3.34.0: {} + cytoscape@3.34.1: {} d3-array@2.12.1: dependencies: internmap: 1.0.1 + d3-array@3.2.1: + dependencies: + internmap: 2.0.3 + d3-array@3.2.4: dependencies: internmap: 2.0.3 @@ -11353,6 +11375,10 @@ snapshots: dependencies: d3-array: 3.2.4 + d3-delaunay@6.0.2: + dependencies: + delaunator: 5.1.0 + d3-delaunay@6.0.4: dependencies: delaunator: 5.1.0 @@ -11382,8 +11408,14 @@ snapshots: d3-quadtree: 3.0.1 d3-timer: 3.0.1 + d3-format@3.1.0: {} + d3-format@3.1.2: {} + d3-geo@3.1.0: + dependencies: + d3-array: 3.2.4 + d3-geo@3.1.1: dependencies: d3-array: 3.2.4 @@ -11499,8 +11531,6 @@ snapshots: damerau-levenshtein@1.0.8: {} - data-uri-to-buffer@4.0.1: {} - data-view-buffer@1.0.2: dependencies: call-bound: 1.0.4 @@ -11519,9 +11549,13 @@ snapshots: es-errors: 1.3.0 is-data-view: 1.0.2 - date-fns@4.3.0: {} + date-fns@4.4.0: {} - dayjs@1.11.21: {} + dayjs@1.11.22: {} + + debounce-fn@4.0.0: + dependencies: + mimic-fn: 3.1.0 debounce-fn@6.0.0: dependencies: @@ -11553,7 +11587,7 @@ snapshots: default-browser-id@5.0.1: {} - default-browser@5.5.0: + default-browser@5.5.1: dependencies: bundle-name: 4.1.0 default-browser-id: 5.0.1 @@ -11564,6 +11598,8 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 + define-lazy-prop@2.0.0: {} + define-lazy-prop@3.0.0: {} define-properties@1.2.1: @@ -11602,12 +11638,12 @@ snapshots: dependencies: esutils: 2.0.3 - docx@9.6.1: + docx@9.7.1: dependencies: - '@types/node': 25.9.1 + '@types/node': 25.9.5 hash.js: 1.1.7 jszip: 3.10.1 - nanoid: 5.1.11 + nanoid: 5.1.16 xml: 1.0.1 xml-js: 1.6.11 @@ -11623,7 +11659,7 @@ snapshots: dependencies: domelementtype: 2.3.0 - dompurify@3.4.11: + dompurify@3.4.13: optionalDependencies: '@types/trusted-types': 2.0.7 @@ -11633,9 +11669,13 @@ snapshots: domelementtype: 2.3.0 domhandler: 5.0.3 - dot-prop@10.1.0: + dot-prop@10.2.0: + dependencies: + type-fest: 5.8.0 + + dot-prop@6.0.1: dependencies: - type-fest: 5.6.0 + is-obj: 2.0.0 dotenv@16.6.1: {} @@ -11647,13 +11687,6 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 - eciesjs@0.4.18: - dependencies: - '@ecies/ciphers': 0.2.6(@noble/ciphers@1.3.0) - '@noble/ciphers': 1.3.0 - '@noble/curves': 1.9.7 - '@noble/hashes': 1.8.0 - ee-first@1.1.1: {} effect@3.20.0: @@ -11661,7 +11694,9 @@ snapshots: '@standard-schema/spec': 1.1.0 fast-check: 3.23.2 - electron-to-chromium@1.5.361: {} + electron-to-chromium@1.5.407: {} + + elkjs@0.11.1: {} embla-carousel-react@8.6.0(react@19.1.0): dependencies: @@ -11677,8 +11712,6 @@ snapshots: emoji-regex@10.6.0: {} - emoji-regex@8.0.0: {} - emoji-regex@9.2.2: {} empathic@2.0.0: {} @@ -11687,10 +11720,10 @@ snapshots: engine.io-parser@5.2.3: {} - engine.io@6.6.8: + engine.io@6.6.9: dependencies: '@types/cors': 2.8.19 - '@types/node': 20.19.41 + '@types/node': 20.19.43 '@types/ws': 8.18.1 accepts: 1.3.8 base64id: 2.0.0 @@ -11698,13 +11731,13 @@ snapshots: cors: 2.8.6 debug: 4.4.3 engine.io-parser: 5.2.3 - ws: 8.20.1 + ws: 8.21.3 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - enhanced-resolve@5.22.0: + enhanced-resolve@5.24.5: dependencies: graceful-fs: 4.2.11 tapable: 2.3.3 @@ -11724,19 +11757,19 @@ snapshots: dependencies: is-arrayish: 0.2.1 - es-abstract@1.24.2: + es-abstract@1.24.0: dependencies: array-buffer-byte-length: 1.0.2 arraybuffer.prototype.slice: 1.0.4 available-typed-arrays: 1.0.7 - call-bind: 1.0.9 + call-bind: 1.0.8 call-bound: 1.0.4 data-view-buffer: 1.0.2 data-view-byte-length: 1.0.2 data-view-byte-offset: 1.0.1 es-define-property: 1.0.1 es-errors: 1.3.0 - es-object-atoms: 1.1.2 + es-object-atoms: 1.1.1 es-set-tostringtag: 2.1.0 es-to-primitive: 1.3.0 function.prototype.name: 1.1.8 @@ -11748,7 +11781,7 @@ snapshots: has-property-descriptors: 1.0.2 has-proto: 1.2.0 has-symbols: 1.1.0 - hasown: 2.0.3 + hasown: 2.0.2 internal-slot: 1.1.0 is-array-buffer: 3.0.5 is-callable: 1.2.7 @@ -11766,7 +11799,7 @@ snapshots: object.assign: 4.1.7 own-keys: 1.0.1 regexp.prototype.flags: 1.5.4 - safe-array-concat: 1.1.4 + safe-array-concat: 1.1.3 safe-push-apply: 1.0.0 safe-regex-test: 1.1.0 set-proto: 1.0.0 @@ -11779,18 +11812,18 @@ snapshots: typed-array-byte-offset: 1.0.4 typed-array-length: 1.0.7 unbox-primitive: 1.1.0 - which-typed-array: 1.1.20 + which-typed-array: 1.1.19 es-define-property@1.0.1: {} es-errors@1.3.0: {} - es-iterator-helpers@1.3.2: + es-iterator-helpers@1.2.1: dependencies: - call-bind: 1.0.9 + call-bind: 1.0.8 call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.24.2 + es-abstract: 1.24.0 es-errors: 1.3.0 es-set-tostringtag: 2.1.0 function-bind: 1.1.2 @@ -11802,11 +11835,11 @@ snapshots: has-symbols: 1.1.0 internal-slot: 1.1.0 iterator.prototype: 1.1.5 - math-intrinsics: 1.1.0 + safe-array-concat: 1.1.3 - es-module-lexer@2.1.0: {} + es-module-lexer@2.3.1: {} - es-object-atoms@1.1.2: + es-object-atoms@1.1.1: dependencies: es-errors: 1.3.0 @@ -11815,11 +11848,11 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.3.0 has-tostringtag: 1.0.2 - hasown: 2.0.3 + hasown: 2.0.4 es-shim-unscopables@1.1.0: dependencies: - hasown: 2.0.3 + hasown: 2.0.2 es-to-primitive@1.3.0: dependencies: @@ -11827,7 +11860,7 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 - es-toolkit@1.46.1: {} + es-toolkit@1.50.0: {} esast-util-from-estree@2.0.0: dependencies: @@ -11839,7 +11872,7 @@ snapshots: esast-util-from-js@2.0.1: dependencies: '@types/estree-jsx': 1.0.5 - acorn: 8.16.0 + acorn: 8.15.0 esast-util-from-estree: 2.0.0 vfile-message: 4.0.3 @@ -11872,34 +11905,34 @@ snapshots: '@esbuild/win32-ia32': 0.25.12 '@esbuild/win32-x64': 0.25.12 - esbuild@0.28.0: - optionalDependencies: - '@esbuild/aix-ppc64': 0.28.0 - '@esbuild/android-arm': 0.28.0 - '@esbuild/android-arm64': 0.28.0 - '@esbuild/android-x64': 0.28.0 - '@esbuild/darwin-arm64': 0.28.0 - '@esbuild/darwin-x64': 0.28.0 - '@esbuild/freebsd-arm64': 0.28.0 - '@esbuild/freebsd-x64': 0.28.0 - '@esbuild/linux-arm': 0.28.0 - '@esbuild/linux-arm64': 0.28.0 - '@esbuild/linux-ia32': 0.28.0 - '@esbuild/linux-loong64': 0.28.0 - '@esbuild/linux-mips64el': 0.28.0 - '@esbuild/linux-ppc64': 0.28.0 - '@esbuild/linux-riscv64': 0.28.0 - '@esbuild/linux-s390x': 0.28.0 - '@esbuild/linux-x64': 0.28.0 - '@esbuild/netbsd-arm64': 0.28.0 - '@esbuild/netbsd-x64': 0.28.0 - '@esbuild/openbsd-arm64': 0.28.0 - '@esbuild/openbsd-x64': 0.28.0 - '@esbuild/openharmony-arm64': 0.28.0 - '@esbuild/sunos-x64': 0.28.0 - '@esbuild/win32-arm64': 0.28.0 - '@esbuild/win32-ia32': 0.28.0 - '@esbuild/win32-x64': 0.28.0 + esbuild@0.28.2: + optionalDependencies: + '@esbuild/aix-ppc64': 0.28.2 + '@esbuild/android-arm': 0.28.2 + '@esbuild/android-arm64': 0.28.2 + '@esbuild/android-x64': 0.28.2 + '@esbuild/darwin-arm64': 0.28.2 + '@esbuild/darwin-x64': 0.28.2 + '@esbuild/freebsd-arm64': 0.28.2 + '@esbuild/freebsd-x64': 0.28.2 + '@esbuild/linux-arm': 0.28.2 + '@esbuild/linux-arm64': 0.28.2 + '@esbuild/linux-ia32': 0.28.2 + '@esbuild/linux-loong64': 0.28.2 + '@esbuild/linux-mips64el': 0.28.2 + '@esbuild/linux-ppc64': 0.28.2 + '@esbuild/linux-riscv64': 0.28.2 + '@esbuild/linux-s390x': 0.28.2 + '@esbuild/linux-x64': 0.28.2 + '@esbuild/netbsd-arm64': 0.28.2 + '@esbuild/netbsd-x64': 0.28.2 + '@esbuild/openbsd-arm64': 0.28.2 + '@esbuild/openbsd-x64': 0.28.2 + '@esbuild/openharmony-arm64': 0.28.2 + '@esbuild/sunos-x64': 0.28.2 + '@esbuild/win32-arm64': 0.28.2 + '@esbuild/win32-ia32': 0.28.2 + '@esbuild/win32-x64': 0.28.2 escalade@3.2.0: {} @@ -11909,21 +11942,21 @@ snapshots: escape-string-regexp@5.0.0: {} - eslint-config-next@15.5.18(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3): + eslint-config-next@15.5.18(eslint@9.39.1(jiti@2.7.0))(typescript@5.9.2): dependencies: '@next/eslint-plugin-next': 15.5.18 '@rushstack/eslint-patch': 1.16.1 - '@typescript-eslint/eslint-plugin': 8.59.4(@typescript-eslint/parser@8.59.4(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) - '@typescript-eslint/parser': 8.59.4(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) - eslint: 9.39.4(jiti@2.7.0) + '@typescript-eslint/eslint-plugin': 8.50.0(@typescript-eslint/parser@8.50.0(eslint@9.39.1(jiti@2.7.0))(typescript@5.9.2))(eslint@9.39.1(jiti@2.7.0))(typescript@5.9.2) + '@typescript-eslint/parser': 8.50.0(eslint@9.39.1(jiti@2.7.0))(typescript@5.9.2) + eslint: 9.39.1(jiti@2.7.0) eslint-import-resolver-node: 0.3.10 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.4(jiti@2.7.0)) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.59.4(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4(jiti@2.7.0)) - eslint-plugin-jsx-a11y: 6.10.2(eslint@9.39.4(jiti@2.7.0)) - eslint-plugin-react: 7.37.5(eslint@9.39.4(jiti@2.7.0)) - eslint-plugin-react-hooks: 5.2.0(eslint@9.39.4(jiti@2.7.0)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.1(jiti@2.7.0)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.50.0(eslint@9.39.1(jiti@2.7.0))(typescript@5.9.2))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.1(jiti@2.7.0)) + eslint-plugin-jsx-a11y: 6.10.2(eslint@9.39.1(jiti@2.7.0)) + eslint-plugin-react: 7.37.5(eslint@9.39.1(jiti@2.7.0)) + eslint-plugin-react-hooks: 5.2.0(eslint@9.39.1(jiti@2.7.0)) optionalDependencies: - typescript: 5.9.3 + typescript: 5.9.2 transitivePeerDependencies: - eslint-import-resolver-webpack - eslint-plugin-import-x @@ -11932,38 +11965,38 @@ snapshots: eslint-import-resolver-node@0.3.10: dependencies: debug: 3.2.7 - is-core-module: 2.16.2 + is-core-module: 2.16.1 resolve: 2.0.0-next.7 transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.4(jiti@2.7.0)): + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.1(jiti@2.7.0)): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.3 - eslint: 9.39.4(jiti@2.7.0) - get-tsconfig: 4.14.0 + eslint: 9.39.1(jiti@2.7.0) + get-tsconfig: 4.14.2 is-bun-module: 2.0.0 stable-hash: 0.0.5 - tinyglobby: 0.2.16 + tinyglobby: 0.2.15 unrs-resolver: 1.12.2 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.59.4(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4(jiti@2.7.0)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.50.0(eslint@9.39.1(jiti@2.7.0))(typescript@5.9.2))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.1(jiti@2.7.0)) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.59.4(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4(jiti@2.7.0)): + eslint-module-utils@2.14.0(@typescript-eslint/parser@8.50.0(eslint@9.39.1(jiti@2.7.0))(typescript@5.9.2))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.1(jiti@2.7.0)))(eslint@9.39.1(jiti@2.7.0)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.59.4(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) - eslint: 9.39.4(jiti@2.7.0) + '@typescript-eslint/parser': 8.50.0(eslint@9.39.1(jiti@2.7.0))(typescript@5.9.2) + eslint: 9.39.1(jiti@2.7.0) eslint-import-resolver-node: 0.3.10 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.4(jiti@2.7.0)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.1(jiti@2.7.0)) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.59.4(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4(jiti@2.7.0)): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.50.0(eslint@9.39.1(jiti@2.7.0))(typescript@5.9.2))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.1(jiti@2.7.0)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -11972,13 +12005,13 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.39.4(jiti@2.7.0) + eslint: 9.39.1(jiti@2.7.0) eslint-import-resolver-node: 0.3.10 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.59.4(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4(jiti@2.7.0)) - hasown: 2.0.3 - is-core-module: 2.16.2 + eslint-module-utils: 2.14.0(@typescript-eslint/parser@8.50.0(eslint@9.39.1(jiti@2.7.0))(typescript@5.9.2))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.1(jiti@2.7.0)))(eslint@9.39.1(jiti@2.7.0)) + hasown: 2.0.2 + is-core-module: 2.16.1 is-glob: 4.0.3 - minimatch: 3.1.5 + minimatch: 3.1.2 object.fromentries: 2.0.8 object.groupby: 1.0.3 object.values: 1.2.1 @@ -11986,53 +12019,53 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.59.4(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/parser': 8.50.0(eslint@9.39.1(jiti@2.7.0))(typescript@5.9.2) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-jsx-a11y@6.10.2(eslint@9.39.4(jiti@2.7.0)): + eslint-plugin-jsx-a11y@6.10.2(eslint@9.39.1(jiti@2.7.0)): dependencies: aria-query: 5.3.2 array-includes: 3.1.9 array.prototype.flatmap: 1.3.3 ast-types-flow: 0.0.8 - axe-core: 4.11.4 + axe-core: 4.13.0 axobject-query: 4.1.0 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - eslint: 9.39.4(jiti@2.7.0) - hasown: 2.0.3 + eslint: 9.39.1(jiti@2.7.0) + hasown: 2.0.2 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 - minimatch: 3.1.5 + minimatch: 3.1.2 object.fromentries: 2.0.8 safe-regex-test: 1.1.0 string.prototype.includes: 2.0.1 - eslint-plugin-react-hooks@5.2.0(eslint@9.39.4(jiti@2.7.0)): + eslint-plugin-react-hooks@5.2.0(eslint@9.39.1(jiti@2.7.0)): dependencies: - eslint: 9.39.4(jiti@2.7.0) + eslint: 9.39.1(jiti@2.7.0) - eslint-plugin-react@7.37.5(eslint@9.39.4(jiti@2.7.0)): + eslint-plugin-react@7.37.5(eslint@9.39.1(jiti@2.7.0)): dependencies: array-includes: 3.1.9 array.prototype.findlast: 1.2.5 array.prototype.flatmap: 1.3.3 array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 - es-iterator-helpers: 1.3.2 - eslint: 9.39.4(jiti@2.7.0) + es-iterator-helpers: 1.2.1 + eslint: 9.39.1(jiti@2.7.0) estraverse: 5.3.0 - hasown: 2.0.3 + hasown: 2.0.2 jsx-ast-utils: 3.3.5 - minimatch: 3.1.5 + minimatch: 3.1.2 object.entries: 1.1.9 object.fromentries: 2.0.8 object.values: 1.2.1 prop-types: 15.8.1 - resolve: 2.0.0-next.7 + resolve: 2.0.0-next.5 semver: 6.3.1 string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 @@ -12051,23 +12084,21 @@ snapshots: eslint-visitor-keys@4.2.1: {} - eslint-visitor-keys@5.0.1: {} - - eslint@9.39.4(jiti@2.7.0): + eslint@9.39.1(jiti@2.7.0): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.7.0)) + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.1(jiti@2.7.0)) '@eslint-community/regexpp': 4.12.2 - '@eslint/config-array': 0.21.2 + '@eslint/config-array': 0.21.1 '@eslint/config-helpers': 0.4.2 '@eslint/core': 0.17.0 - '@eslint/eslintrc': 3.3.5 - '@eslint/js': 9.39.4 + '@eslint/eslintrc': 3.3.1 + '@eslint/js': 9.39.1 '@eslint/plugin-kit': 0.4.1 - '@humanfs/node': 0.16.8 + '@humanfs/node': 0.16.7 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 - '@types/estree': 1.0.9 - ajv: 6.15.0 + '@types/estree': 1.0.8 + ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 debug: 4.4.3 @@ -12075,7 +12106,7 @@ snapshots: eslint-scope: 8.4.0 eslint-visitor-keys: 4.2.1 espree: 10.4.0 - esquery: 1.7.0 + esquery: 1.6.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 file-entry-cache: 8.0.0 @@ -12086,7 +12117,7 @@ snapshots: is-glob: 4.0.3 json-stable-stringify-without-jsonify: 1.0.1 lodash.merge: 4.6.2 - minimatch: 3.1.5 + minimatch: 3.1.2 natural-compare: 1.4.0 optionator: 0.9.4 optionalDependencies: @@ -12096,12 +12127,16 @@ snapshots: espree@10.4.0: dependencies: - acorn: 8.16.0 - acorn-jsx: 5.3.2(acorn@8.16.0) + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) eslint-visitor-keys: 4.2.1 esprima@4.0.1: {} + esquery@1.6.0: + dependencies: + estraverse: 5.3.0 + esquery@1.7.0: dependencies: estraverse: 5.3.0 @@ -12116,7 +12151,7 @@ snapshots: estree-util-attach-comments@3.0.0: dependencies: - '@types/estree': 1.0.9 + '@types/estree': 1.0.8 estree-util-build-jsx@3.0.1: dependencies: @@ -12129,7 +12164,7 @@ snapshots: estree-util-scope@1.0.0: dependencies: - '@types/estree': 1.0.9 + '@types/estree': 1.0.8 devlop: 1.1.0 estree-util-to-js@2.0.0: @@ -12140,7 +12175,7 @@ snapshots: estree-util-value-to-estree@3.5.0: dependencies: - '@types/estree': 1.0.9 + '@types/estree': 1.0.8 estree-util-visit@2.0.0: dependencies: @@ -12151,7 +12186,7 @@ snapshots: estree-walker@3.0.3: dependencies: - '@types/estree': 1.0.9 + '@types/estree': 1.0.8 esutils@2.0.3: {} @@ -12161,11 +12196,11 @@ snapshots: events@3.3.0: {} - eventsource-parser@3.0.8: {} + eventsource-parser@3.1.1: {} eventsource@3.0.7: dependencies: - eventsource-parser: 3.0.8 + eventsource-parser: 3.1.1 execa@5.1.1: dependencies: @@ -12192,17 +12227,20 @@ snapshots: pretty-ms: 9.3.0 signal-exit: 4.1.0 strip-final-newline: 4.0.0 - yoctocolors: 2.1.2 + yoctocolors: 2.2.0 - express-rate-limit@8.5.2(express@5.2.1): + express-rate-limit@8.6.2(express@5.2.1): dependencies: + debug: 4.4.3 express: 5.2.1 - ip-address: 10.2.0 + ip-address: 10.5.0 + transitivePeerDependencies: + - supports-color express@5.2.1: dependencies: accepts: 2.0.0 - body-parser: 2.2.2 + body-parser: 2.3.0 content-disposition: 1.1.0 content-type: 1.0.5 cookie: 0.7.2 @@ -12221,8 +12259,8 @@ snapshots: once: 1.4.0 parseurl: 1.3.3 proxy-addr: 2.0.7 - qs: 6.15.2 - range-parser: 1.2.1 + qs: 6.15.3 + range-parser: 1.3.0 router: 2.2.0 send: 1.2.1 serve-static: 2.2.1 @@ -12232,7 +12270,7 @@ snapshots: transitivePeerDependencies: - supports-color - exsolve@1.0.8: {} + exsolve@1.1.1: {} extend@3.0.2: {} @@ -12240,9 +12278,11 @@ snapshots: dependencies: pure-rand: 6.1.0 + fast-decode-uri-component@1.0.1: {} + fast-deep-equal@3.1.3: {} - fast-equals@5.4.0: {} + fast-equals@5.4.1: {} fast-glob@3.3.1: dependencies: @@ -12264,32 +12304,25 @@ snapshots: fast-levenshtein@2.0.6: {} - fast-sha256@1.3.0: {} - - fast-string-truncated-width@3.0.3: {} - - fast-string-width@3.0.2: + fast-querystring@1.1.2: dependencies: - fast-string-truncated-width: 3.0.3 + fast-decode-uri-component: 1.0.1 - fast-uri@3.1.2: {} + fast-sha256@1.3.0: {} - fast-wrap-ansi@0.2.2: - dependencies: - fast-string-width: 3.0.2 + fast-uri@3.1.5: {} - fastq@1.20.1: + fastq@1.19.1: dependencies: reusify: 1.1.0 - fdir@6.5.0(picomatch@4.0.4): + fdir@6.5.0(picomatch@4.0.3): optionalDependencies: - picomatch: 4.0.4 + picomatch: 4.0.3 - fetch-blob@3.2.0: - dependencies: - node-domexception: 1.0.0 - web-streams-polyfill: 3.3.3 + fdir@6.5.0(picomatch@4.0.5): + optionalDependencies: + picomatch: 4.0.5 figures@6.1.0: dependencies: @@ -12314,6 +12347,16 @@ snapshots: transitivePeerDependencies: - supports-color + find-my-way@9.7.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-querystring: 1.1.2 + safe-regex2: 5.1.1 + + find-up@3.0.0: + dependencies: + locate-path: 3.0.0 + find-up@5.0.0: dependencies: locate-path: 6.0.0 @@ -12321,10 +12364,10 @@ snapshots: flat-cache@4.0.1: dependencies: - flatted: 3.4.2 + flatted: 3.3.3 keyv: 4.5.4 - flatted@3.4.2: {} + flatted@3.3.3: {} follow-redirects@1.16.0: {} @@ -12337,25 +12380,19 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 - form-data@4.0.5: + form-data@4.0.6: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 es-set-tostringtag: 2.1.0 - hasown: 2.0.3 + hasown: 2.0.4 mime-types: 2.1.35 - formdata-polyfill@4.0.10: - dependencies: - fetch-blob: 3.2.0 - - forwarded-parse@2.1.2: {} - forwarded@0.2.0: {} - framer-motion@12.40.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + framer-motion@12.43.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: - motion-dom: 12.40.0 + motion-dom: 12.43.0 motion-utils: 12.39.0 tslib: 2.8.1 optionalDependencies: @@ -12364,7 +12401,7 @@ snapshots: fresh@2.0.0: {} - fs-extra@11.3.5: + fs-extra@11.4.0: dependencies: graceful-fs: 4.2.11 jsonfile: 6.2.1 @@ -12373,7 +12410,7 @@ snapshots: fsevents@2.3.3: optional: true - fumadocs-core@15.8.5(@types/react@19.2.15)(lucide-react@1.16.0(react@19.1.0))(next@15.5.18(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + fumadocs-core@15.8.5(@types/react@19.2.2)(lucide-react@1.31.0(react@19.1.0))(next@15.5.18(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: '@formatjs/intl-localematcher': 0.6.2 '@orama/orama': 3.1.18 @@ -12384,9 +12421,9 @@ snapshots: hast-util-to-jsx-runtime: 2.3.6 image-size: 2.0.2 negotiator: 1.0.0 - npm-to-yarn: 3.0.1 + npm-to-yarn: 3.2.0 path-to-regexp: 8.4.2 - react-remove-scroll: 2.7.2(@types/react@19.2.15)(react@19.1.0) + react-remove-scroll: 2.7.2(@types/react@19.2.2)(react@19.1.0) remark: 15.0.1 remark-gfm: 4.0.1 remark-rehype: 11.1.2 @@ -12394,75 +12431,75 @@ snapshots: shiki: 3.23.0 unist-util-visit: 5.1.0 optionalDependencies: - '@types/react': 19.2.15 - lucide-react: 1.16.0(react@19.1.0) - next: 15.5.18(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@types/react': 19.2.2 + lucide-react: 1.31.0(react@19.1.0) + next: 15.5.18(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) transitivePeerDependencies: - supports-color - fumadocs-mdx@13.0.8(fumadocs-core@15.8.5(@types/react@19.2.15)(lucide-react@1.16.0(react@19.1.0))(next@15.5.18(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(next@15.5.18(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0): + fumadocs-mdx@13.0.8(fumadocs-core@15.8.5(@types/react@19.2.2)(lucide-react@1.31.0(react@19.1.0))(next@15.5.18(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(next@15.5.18(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0): dependencies: '@mdx-js/mdx': 3.1.1 '@standard-schema/spec': 1.1.0 chokidar: 4.0.3 esbuild: 0.25.12 estree-util-value-to-estree: 3.5.0 - fumadocs-core: 15.8.5(@types/react@19.2.15)(lucide-react@1.16.0(react@19.1.0))(next@15.5.18(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - js-yaml: 4.1.1 - lru-cache: 11.5.0 + fumadocs-core: 15.8.5(@types/react@19.2.2)(lucide-react@1.31.0(react@19.1.0))(next@15.5.18(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + js-yaml: 4.1.0 + lru-cache: 11.5.2 mdast-util-to-markdown: 2.1.2 picocolors: 1.1.1 - picomatch: 4.0.4 + picomatch: 4.0.3 remark-mdx: 3.1.1 - tinyexec: 1.2.1 - tinyglobby: 0.2.16 + tinyexec: 1.3.0 + tinyglobby: 0.2.15 unified: 11.0.5 unist-util-remove-position: 5.0.0 unist-util-visit: 5.1.0 zod: 4.4.3 optionalDependencies: - next: 15.5.18(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + next: 15.5.18(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) react: 19.1.0 transitivePeerDependencies: - supports-color - fumadocs-mermaid@1.3.1(fumadocs-ui@15.8.5(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(lucide-react@1.16.0(react@19.1.0))(next@15.5.18(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(tailwindcss@4.3.0))(lucide-react@1.16.0(react@19.1.0))(mermaid@11.15.0)(next-themes@0.4.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0): + fumadocs-mermaid@1.3.1(fumadocs-ui@15.8.5(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(lucide-react@1.31.0(react@19.1.0))(next@15.5.18(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(tailwindcss@4.3.3))(lucide-react@1.31.0(react@19.1.0))(mermaid@11.16.1)(next-themes@0.4.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0): dependencies: - fumadocs-ui: 15.8.5(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(lucide-react@1.16.0(react@19.1.0))(next@15.5.18(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(tailwindcss@4.3.0) - lucide-react: 1.16.0(react@19.1.0) - mermaid: 11.15.0 + fumadocs-ui: 15.8.5(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(lucide-react@1.31.0(react@19.1.0))(next@15.5.18(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(tailwindcss@4.3.3) + lucide-react: 1.31.0(react@19.1.0) + mermaid: 11.16.1 next-themes: 0.4.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0) react: 19.1.0 unist-util-visit: 5.1.0 - fumadocs-ui@15.8.5(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(lucide-react@1.16.0(react@19.1.0))(next@15.5.18(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(tailwindcss@4.3.0): - dependencies: - '@radix-ui/react-accordion': 1.2.12(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-collapsible': 1.1.12(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-navigation-menu': 1.2.14(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-popover': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-scroll-area': 1.2.10(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-slot': 1.2.4(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-tabs': 1.1.13(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + fumadocs-ui@15.8.5(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(lucide-react@1.31.0(react@19.1.0))(next@15.5.18(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(tailwindcss@4.3.3): + dependencies: + '@radix-ui/react-accordion': 1.2.20(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-collapsible': 1.1.20(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-dialog': 1.1.23(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-direction': 1.1.4(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-navigation-menu': 1.2.22(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-popover': 1.1.23(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-presence': 1.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-scroll-area': 1.2.18(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-slot': 1.3.3(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-tabs': 1.1.21(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) class-variance-authority: 0.7.1 - fumadocs-core: 15.8.5(@types/react@19.2.15)(lucide-react@1.16.0(react@19.1.0))(next@15.5.18(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + fumadocs-core: 15.8.5(@types/react@19.2.2)(lucide-react@1.31.0(react@19.1.0))(next@15.5.18(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0) lodash.merge: 4.6.2 next-themes: 0.4.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - postcss-selector-parser: 7.1.1 + postcss-selector-parser: 7.1.5 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - react-medium-image-zoom: 5.4.5(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + react-medium-image-zoom: 5.4.9(react-dom@19.1.0(react@19.1.0))(react@19.1.0) scroll-into-view-if-needed: 3.1.0 tailwind-merge: 3.6.0 optionalDependencies: - '@types/react': 19.2.15 - next: 15.5.18(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - tailwindcss: 4.3.0 + '@types/react': 19.2.2 + next: 15.5.18(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + tailwindcss: 4.3.3 transitivePeerDependencies: - '@mixedbread/sdk' - '@oramacloud/client' @@ -12478,11 +12515,11 @@ snapshots: function.prototype.name@1.1.8: dependencies: - call-bind: 1.0.9 + call-bind: 1.0.8 call-bound: 1.0.4 define-properties: 1.2.1 functions-have-names: 1.2.3 - hasown: 2.0.3 + hasown: 2.0.2 is-callable: 1.2.7 functions-have-names@1.2.3: {} @@ -12493,12 +12530,8 @@ snapshots: dependencies: is-property: 1.0.2 - generator-function@2.0.1: {} - gensync@1.0.0-beta.2: {} - get-caller-file@2.0.5: {} - get-east-asian-width@1.6.0: {} get-intrinsic@1.3.0: @@ -12506,12 +12539,12 @@ snapshots: call-bind-apply-helpers: 1.0.2 es-define-property: 1.0.1 es-errors: 1.3.0 - es-object-atoms: 1.1.2 + es-object-atoms: 1.1.1 function-bind: 1.1.2 get-proto: 1.0.1 gopd: 1.2.0 has-symbols: 1.1.0 - hasown: 2.0.3 + hasown: 2.0.2 math-intrinsics: 1.1.0 get-nonce@1.0.1: {} @@ -12523,7 +12556,7 @@ snapshots: get-proto@1.0.1: dependencies: dunder-proto: 1.0.1 - es-object-atoms: 1.1.2 + es-object-atoms: 1.1.1 get-stream@6.0.1: {} @@ -12538,11 +12571,11 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.3.0 - get-tsconfig@4.14.0: + get-tsconfig@4.14.2: dependencies: resolve-pkg-maps: 1.0.0 - giget@3.2.0: {} + giget@3.3.1: {} github-slugger@2.0.0: {} @@ -12554,16 +12587,12 @@ snapshots: dependencies: is-glob: 4.0.3 - glob-to-regexp@0.4.1: {} - glob@13.0.6: dependencies: - minimatch: 10.2.5 + minimatch: 10.2.6 minipass: 7.1.3 path-scurry: 2.0.2 - globals@11.12.0: {} - globals@14.0.0: {} globalthis@1.0.4: @@ -12575,12 +12604,10 @@ snapshots: graceful-fs@4.2.11: {} - grammex@3.1.12: {} + grammex@3.1.13: {} graphmatch@1.1.1: {} - graphql@16.14.0: {} - hachure-fill@0.5.2: {} has-bigints@1.1.0: {} @@ -12606,15 +12633,19 @@ snapshots: inherits: 2.0.4 minimalistic-assert: 1.0.1 - hasown@2.0.3: + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + hasown@2.0.4: dependencies: function-bind: 1.1.2 hast-util-to-estree@3.1.3: dependencies: - '@types/estree': 1.0.9 + '@types/estree': 1.0.8 '@types/estree-jsx': 1.0.5 - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 comma-separated-tokens: 2.0.3 devlop: 1.1.0 estree-util-attach-comments: 3.0.0 @@ -12623,7 +12654,7 @@ snapshots: mdast-util-mdx-expression: 2.0.1 mdast-util-mdx-jsx: 3.2.0 mdast-util-mdxjs-esm: 2.0.1 - property-information: 7.1.0 + property-information: 7.2.0 space-separated-tokens: 2.0.2 style-to-js: 1.1.21 unist-util-position: 5.0.0 @@ -12633,22 +12664,22 @@ snapshots: hast-util-to-html@9.0.5: dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 '@types/unist': 3.0.3 ccount: 2.0.1 comma-separated-tokens: 2.0.3 hast-util-whitespace: 3.0.0 html-void-elements: 3.0.0 mdast-util-to-hast: 13.2.1 - property-information: 7.1.0 + property-information: 7.2.0 space-separated-tokens: 2.0.2 stringify-entities: 4.0.4 zwitch: 2.0.4 hast-util-to-jsx-runtime@2.3.6: dependencies: - '@types/estree': 1.0.9 - '@types/hast': 3.0.4 + '@types/estree': 1.0.8 + '@types/hast': 3.0.5 '@types/unist': 3.0.3 comma-separated-tokens: 2.0.3 devlop: 1.1.0 @@ -12657,7 +12688,7 @@ snapshots: mdast-util-mdx-expression: 2.0.1 mdast-util-mdx-jsx: 3.2.0 mdast-util-mdxjs-esm: 2.0.1 - property-information: 7.1.0 + property-information: 7.2.0 space-separated-tokens: 2.0.2 style-to-js: 1.1.21 unist-util-position: 5.0.0 @@ -12667,18 +12698,13 @@ snapshots: hast-util-to-string@3.0.1: dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 hast-util-whitespace@3.0.0: dependencies: - '@types/hast': 3.0.4 - - headers-polyfill@5.0.1: - dependencies: - '@types/set-cookie-parser': 2.4.10 - set-cookie-parser: 3.1.0 + '@types/hast': 3.0.5 - hono@4.12.22: {} + hono@4.13.2: {} html-to-text@9.0.5: dependencies: @@ -12690,6 +12716,8 @@ snapshots: html-void-elements@3.0.0: {} + html5parser@3.0.0: {} + htmlparser2@8.0.2: dependencies: domelementtype: 2.3.0 @@ -12705,8 +12733,6 @@ snapshots: statuses: 2.0.2 toidentifier: 1.0.1 - http-status-codes@2.3.0: {} - https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 @@ -12714,13 +12740,6 @@ snapshots: transitivePeerDependencies: - supports-color - https-proxy-agent@7.0.6: - dependencies: - agent-base: 7.1.4 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - human-signals@2.1.0: {} human-signals@8.0.1: {} @@ -12731,7 +12750,7 @@ snapshots: dependencies: safer-buffer: 2.1.2 - iconv-lite@0.7.2: + iconv-lite@0.7.3: dependencies: safer-buffer: 2.1.2 @@ -12745,7 +12764,7 @@ snapshots: immer@10.2.0: {} - immer@11.1.8: {} + immer@11.1.17: {} import-fresh@3.3.1: dependencies: @@ -12754,9 +12773,9 @@ snapshots: import-in-the-middle@3.0.1: dependencies: - acorn: 8.16.0 - acorn-import-attributes: 1.9.5(acorn@8.16.0) - cjs-module-lexer: 2.2.0 + acorn: 8.15.0 + acorn-import-attributes: 1.9.5(acorn@8.15.0) + cjs-module-lexer: 2.2.1 module-details-from-path: 1.0.4 import-meta-resolve@4.2.0: {} @@ -12775,14 +12794,14 @@ snapshots: internal-slot@1.1.0: dependencies: es-errors: 1.3.0 - hasown: 2.0.3 + hasown: 2.0.2 side-channel: 1.1.0 internmap@1.0.1: {} internmap@2.0.3: {} - ip-address@10.2.0: {} + ip-address@10.5.0: {} ipaddr.js@1.9.1: {} @@ -12795,7 +12814,7 @@ snapshots: is-array-buffer@3.0.5: dependencies: - call-bind: 1.0.9 + call-bind: 1.0.8 call-bound: 1.0.4 get-intrinsic: 1.3.0 @@ -12820,13 +12839,17 @@ snapshots: is-bun-module@2.0.0: dependencies: - semver: 7.8.1 + semver: 7.8.5 is-callable@1.2.7: {} + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + is-core-module@2.16.2: dependencies: - hasown: 2.0.3 + hasown: 2.0.4 is-data-view@1.0.2: dependencies: @@ -12841,6 +12864,8 @@ snapshots: is-decimal@2.0.1: {} + is-docker@2.2.1: {} + is-docker@3.0.0: {} is-extglob@2.1.1: {} @@ -12849,12 +12874,9 @@ snapshots: dependencies: call-bound: 1.0.4 - is-fullwidth-code-point@3.0.0: {} - - is-generator-function@1.1.2: + is-generator-function@1.1.0: dependencies: call-bound: 1.0.4 - generator-function: 2.0.1 get-proto: 1.0.1 has-tostringtag: 1.0.2 safe-regex-test: 1.1.0 @@ -12877,8 +12899,6 @@ snapshots: is-negative-zero@2.0.3: {} - is-node-process@1.2.0: {} - is-number-object@1.1.1: dependencies: call-bound: 1.0.4 @@ -12886,6 +12906,8 @@ snapshots: is-number@7.0.0: {} + is-obj@2.0.0: {} + is-obj@3.0.0: {} is-plain-obj@4.1.0: {} @@ -12896,14 +12918,14 @@ snapshots: is-reference@1.2.1: dependencies: - '@types/estree': 1.0.9 + '@types/estree': 1.0.8 is-regex@1.2.1: dependencies: call-bound: 1.0.4 gopd: 1.2.0 has-tostringtag: 1.0.2 - hasown: 2.0.3 + hasown: 2.0.2 is-regexp@3.1.0: {} @@ -12930,7 +12952,7 @@ snapshots: is-typed-array@1.1.15: dependencies: - which-typed-array: 1.1.20 + which-typed-array: 1.1.19 is-unicode-supported@1.3.0: {} @@ -12947,6 +12969,10 @@ snapshots: call-bound: 1.0.4 get-intrinsic: 1.3.0 + is-wsl@2.2.0: + dependencies: + is-docker: 2.2.1 + is-wsl@3.1.1: dependencies: is-inside-container: 1.0.0 @@ -12962,7 +12988,7 @@ snapshots: iterator.prototype@1.1.5: dependencies: define-data-property: 1.1.4 - es-object-atoms: 1.1.2 + es-object-atoms: 1.1.1 get-intrinsic: 1.3.0 get-proto: 1.0.1 has-symbols: 1.1.0 @@ -12970,21 +12996,21 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 20.19.41 + '@types/node': 20.19.43 merge-stream: 2.0.0 supports-color: 8.1.1 - jiti@2.4.2: {} + jiti@2.6.1: {} jiti@2.7.0: {} jose@5.10.0: {} - jose@6.2.3: {} + jose@6.2.9: {} js-tokens@4.0.0: {} - js-yaml@4.1.1: + js-yaml@4.1.0: dependencies: argparse: 2.0.1 @@ -12998,6 +13024,8 @@ snapshots: json-schema-traverse@1.0.0: {} + json-schema-typed@7.0.3: {} + json-schema-typed@8.0.2: {} json-stable-stringify-without-jsonify@1.0.1: {} @@ -13042,7 +13070,7 @@ snapshots: kleur@4.1.5: {} - kysely@0.28.17: {} + kysely@0.29.5: {} language-subtag-registry@0.3.23: {} @@ -13118,7 +13146,10 @@ snapshots: linkifyjs@4.3.3: {} - loader-runner@4.3.2: {} + locate-path@3.0.0: + dependencies: + p-locate: 3.0.0 + path-exists: 3.0.0 locate-path@6.0.0: dependencies: @@ -13128,6 +13159,8 @@ snapshots: lodash.merge@4.6.2: {} + lodash@4.18.1: {} + log-symbols@6.0.0: dependencies: chalk: 5.6.2 @@ -13136,7 +13169,7 @@ snapshots: log-symbols@7.0.1: dependencies: is-unicode-supported: 2.1.0 - yoctocolors: 2.1.2 + yoctocolors: 2.2.0 long@5.3.2: {} @@ -13146,7 +13179,7 @@ snapshots: dependencies: js-tokens: 4.0.0 - lru-cache@11.5.0: {} + lru-cache@11.5.2: {} lru-cache@5.1.1: dependencies: @@ -13154,7 +13187,7 @@ snapshots: lru.min@1.1.4: {} - lucide-react@1.16.0(react@19.1.0): + lucide-react@1.31.0(react@19.1.0): dependencies: react: 19.1.0 @@ -13256,7 +13289,7 @@ snapshots: mdast-util-mdx-expression@2.0.1: dependencies: '@types/estree-jsx': 1.0.5 - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 '@types/mdast': 4.0.4 devlop: 1.1.0 mdast-util-from-markdown: 2.0.3 @@ -13267,7 +13300,7 @@ snapshots: mdast-util-mdx-jsx@3.2.0: dependencies: '@types/estree-jsx': 1.0.5 - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 '@types/mdast': 4.0.4 '@types/unist': 3.0.3 ccount: 2.0.1 @@ -13294,7 +13327,7 @@ snapshots: mdast-util-mdxjs-esm@2.0.1: dependencies: '@types/estree-jsx': 1.0.5 - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 '@types/mdast': 4.0.4 devlop: 1.1.0 mdast-util-from-markdown: 2.0.3 @@ -13309,9 +13342,9 @@ snapshots: mdast-util-to-hast@13.2.1: dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 '@types/mdast': 4.0.4 - '@ungap/structured-clone': 1.3.1 + '@ungap/structured-clone': 1.3.3 devlop: 1.1.0 micromark-util-sanitize-uri: 2.0.1 trim-lines: 3.0.1 @@ -13337,7 +13370,7 @@ snapshots: mdn-data@2.27.1: {} - media-typer@1.1.0: {} + media-typer@1.1.1: {} merge-descriptors@2.0.0: {} @@ -13345,29 +13378,31 @@ snapshots: merge2@1.4.1: {} - mermaid@11.15.0: + meriyah@6.1.4: {} + + mermaid@11.16.1: dependencies: '@braintree/sanitize-url': 7.1.2 - '@iconify/utils': 3.1.3 - '@mermaid-js/parser': 1.1.1 + '@iconify/utils': 3.1.4 + '@mermaid-js/parser': 1.2.0 '@types/d3': 7.4.3 '@upsetjs/venn.js': 2.0.0 - cytoscape: 3.34.0 - cytoscape-cose-bilkent: 4.1.0(cytoscape@3.34.0) - cytoscape-fcose: 2.2.0(cytoscape@3.34.0) + cytoscape: 3.34.1 + cytoscape-cose-bilkent: 4.1.0(cytoscape@3.34.1) + cytoscape-fcose: 2.2.0(cytoscape@3.34.1) d3: 7.9.0 d3-sankey: 0.12.3 dagre-d3-es: 7.0.14 - dayjs: 1.11.21 - dompurify: 3.4.11 - es-toolkit: 1.46.1 + dayjs: 1.11.22 + dompurify: 3.4.13 + es-toolkit: 1.50.0 katex: 0.16.47 khroma: 2.1.0 marked: 16.4.2 roughjs: 4.6.6 stylis: 4.4.0 ts-dedent: 2.3.0 - uuid: 14.0.0 + uuid: 14.0.1 micromark-core-commonmark@2.0.3: dependencies: @@ -13448,7 +13483,7 @@ snapshots: micromark-extension-mdx-expression@3.0.1: dependencies: - '@types/estree': 1.0.9 + '@types/estree': 1.0.8 devlop: 1.1.0 micromark-factory-mdx-expression: 2.0.3 micromark-factory-space: 2.0.1 @@ -13459,7 +13494,7 @@ snapshots: micromark-extension-mdx-jsx@3.0.2: dependencies: - '@types/estree': 1.0.9 + '@types/estree': 1.0.8 devlop: 1.1.0 estree-util-is-identifier-name: 3.0.0 micromark-factory-mdx-expression: 2.0.3 @@ -13476,7 +13511,7 @@ snapshots: micromark-extension-mdxjs-esm@3.0.0: dependencies: - '@types/estree': 1.0.9 + '@types/estree': 1.0.8 devlop: 1.1.0 micromark-core-commonmark: 2.0.3 micromark-util-character: 2.1.1 @@ -13488,8 +13523,8 @@ snapshots: micromark-extension-mdxjs@3.0.0: dependencies: - acorn: 8.16.0 - acorn-jsx: 5.3.2(acorn@8.16.0) + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) micromark-extension-mdx-expression: 3.0.1 micromark-extension-mdx-jsx: 3.0.2 micromark-extension-mdx-md: 2.0.0 @@ -13512,7 +13547,7 @@ snapshots: micromark-factory-mdx-expression@2.0.3: dependencies: - '@types/estree': 1.0.9 + '@types/estree': 1.0.8 devlop: 1.1.0 micromark-factory-space: 2.0.1 micromark-util-character: 2.1.1 @@ -13576,7 +13611,7 @@ snapshots: micromark-util-events-to-acorn@2.0.3: dependencies: - '@types/estree': 1.0.9 + '@types/estree': 1.0.8 '@types/unist': 3.0.3 devlop: 1.1.0 estree-util-visit: 2.0.0 @@ -13636,7 +13671,7 @@ snapshots: micromatch@4.0.8: dependencies: braces: 3.0.3 - picomatch: 2.3.2 + picomatch: 2.3.1 mime-db@1.52.0: {} @@ -13652,33 +13687,47 @@ snapshots: mimic-fn@2.1.0: {} + mimic-fn@3.1.0: {} + mimic-function@5.0.1: {} minimalistic-assert@1.0.1: {} - minimatch@10.2.5: + minimatch@10.2.6: dependencies: - brace-expansion: 5.0.6 + brace-expansion: 5.0.9 - minimatch@3.1.5: + minimatch@3.1.2: dependencies: - brace-expansion: 1.1.14 + brace-expansion: 1.1.12 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.2 minimist@1.2.8: {} + minimizer-webpack-plugin@5.6.1(webpack@5.109.2): + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + jest-worker: 27.5.1 + schema-utils: 4.3.3 + terser: 5.50.0 + webpack: 5.109.2 + minipass@7.1.3: {} module-details-from-path@1.0.4: {} - motion-dom@12.40.0: + motion-dom@12.43.0: dependencies: motion-utils: 12.39.0 motion-utils@12.39.0: {} - motion@12.40.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + motion@12.43.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: - framer-motion: 12.40.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + framer-motion: 12.43.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) tslib: 2.8.1 optionalDependencies: react: 19.1.0 @@ -13686,39 +13735,12 @@ snapshots: ms@2.1.3: {} - msw@2.14.6(@types/node@20.19.41)(typescript@5.9.3): - dependencies: - '@inquirer/confirm': 6.0.13(@types/node@20.19.41) - '@mswjs/interceptors': 0.41.9 - '@open-draft/deferred-promise': 3.0.0 - '@types/statuses': 2.0.6 - cookie: 1.1.1 - graphql: 16.14.0 - headers-polyfill: 5.0.1 - is-node-process: 1.2.0 - outvariant: 1.4.3 - path-to-regexp: 6.3.0 - picocolors: 1.1.1 - rettime: 0.11.11 - statuses: 2.0.2 - strict-event-emitter: 0.5.1 - tough-cookie: 6.0.1 - type-fest: 5.6.0 - until-async: 3.0.2 - yargs: 17.7.2 - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - '@types/node' - - mute-stream@3.0.0: {} - mysql2@3.15.3: dependencies: aws-ssl-profiles: 1.1.2 denque: 2.1.0 generate-function: 2.3.1 - iconv-lite: 0.7.2 + iconv-lite: 0.7.3 long: 5.3.2 lru.min: 1.1.4 named-placeholders: 1.1.6 @@ -13729,11 +13751,11 @@ snapshots: dependencies: lru.min: 1.1.4 - nanoid@3.3.12: {} + nanoid@3.3.17: {} - nanoid@5.1.11: {} + nanoid@5.1.16: {} - nanostores@1.3.0: {} + nanostores@1.5.0: {} napi-postinstall@0.3.4: {} @@ -13752,15 +13774,15 @@ snapshots: react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - next@15.5.18(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + next@15.5.18(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: '@next/env': 15.5.18 '@swc/helpers': 0.5.15 - caniuse-lite: 1.0.30001793 + caniuse-lite: 1.0.30001761 postcss: 8.4.31 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - styled-jsx: 5.1.6(@babel/core@7.29.0)(react@19.1.0) + styled-jsx: 5.1.6(@babel/core@7.29.7)(react@19.1.0) optionalDependencies: '@next/swc-darwin-arm64': 15.5.18 '@next/swc-darwin-x64': 15.5.18 @@ -13776,9 +13798,7 @@ snapshots: - '@babel/core' - babel-plugin-macros - node-domexception@1.0.0: {} - - node-exports-info@1.6.0: + node-exports-info@1.6.2: dependencies: array.prototype.flatmap: 1.3.3 es-errors: 1.3.0 @@ -13789,13 +13809,7 @@ snapshots: dependencies: whatwg-url: 5.0.0 - node-fetch@3.3.2: - dependencies: - data-uri-to-buffer: 4.0.1 - fetch-blob: 3.2.0 - formdata-polyfill: 4.0.10 - - node-releases@2.0.46: {} + node-releases@2.0.53: {} normalize-path@3.0.0: {} @@ -13808,13 +13822,13 @@ snapshots: path-key: 4.0.0 unicorn-magic: 0.3.0 - npm-to-yarn@3.0.1: {} + npm-to-yarn@3.2.0: {} nypm@0.6.6: dependencies: citty: 0.2.2 pathe: 2.0.3 - tinyexec: 1.2.1 + tinyexec: 1.3.0 object-assign@4.1.1: {} @@ -13826,41 +13840,41 @@ snapshots: object.assign@4.1.7: dependencies: - call-bind: 1.0.9 + call-bind: 1.0.8 call-bound: 1.0.4 define-properties: 1.2.1 - es-object-atoms: 1.1.2 + es-object-atoms: 1.1.1 has-symbols: 1.1.0 object-keys: 1.1.1 object.entries@1.1.9: dependencies: - call-bind: 1.0.9 + call-bind: 1.0.8 call-bound: 1.0.4 define-properties: 1.2.1 - es-object-atoms: 1.1.2 + es-object-atoms: 1.1.1 object.fromentries@2.0.8: dependencies: - call-bind: 1.0.9 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.24.2 - es-object-atoms: 1.1.2 + es-abstract: 1.24.0 + es-object-atoms: 1.1.1 object.groupby@1.0.3: dependencies: - call-bind: 1.0.9 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.24.2 + es-abstract: 1.24.0 object.values@1.2.1: dependencies: - call-bind: 1.0.9 + call-bind: 1.0.8 call-bound: 1.0.4 define-properties: 1.2.1 - es-object-atoms: 1.1.2 + es-object-atoms: 1.1.1 - ohash@2.0.11: {} + ohash@2.0.12: {} on-finished@2.4.1: dependencies: @@ -13886,14 +13900,20 @@ snapshots: regex: 6.1.0 regex-recursion: 6.0.2 - open@11.0.0: + open@11.0.1: dependencies: - default-browser: 5.5.0 + default-browser: 5.5.1 define-lazy-prop: 3.0.0 is-in-ssh: 1.0.0 is-inside-container: 1.0.0 - powershell-utils: 0.1.0 - wsl-utils: 0.3.1 + powershell-utils: 0.2.0 + wsl-utils: 1.0.0 + + open@8.4.2: + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 optionator@0.9.4: dependencies: @@ -13918,23 +13938,31 @@ snapshots: orderedmap@2.1.1: {} - outvariant@1.4.3: {} - own-keys@1.0.1: dependencies: get-intrinsic: 1.3.0 object-keys: 1.1.1 safe-push-apply: 1.0.0 + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 + p-locate@3.0.0: + dependencies: + p-limit: 2.3.0 + p-locate@5.0.0: dependencies: p-limit: 3.1.0 - package-manager-detector@1.6.0: {} + p-try@2.2.0: {} + + package-manager-detector@1.8.0: {} pako@1.0.11: {} @@ -13954,7 +13982,7 @@ snapshots: parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.29.0 + '@babel/code-frame': 7.29.7 error-ex: 1.3.4 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -13972,6 +14000,8 @@ snapshots: path-data-parser@0.1.0: {} + path-exists@3.0.0: {} + path-exists@4.0.0: {} path-key@3.1.1: {} @@ -13982,11 +14012,9 @@ snapshots: path-scurry@2.0.2: dependencies: - lru-cache: 11.5.0 + lru-cache: 11.5.2 minipass: 7.1.3 - path-to-regexp@6.3.0: {} - path-to-regexp@8.4.2: {} pathe@2.0.3: {} @@ -13998,15 +14026,15 @@ snapshots: pg-cloudflare@1.4.0: optional: true - pg-connection-string@2.13.0: {} + pg-connection-string@2.14.0: {} pg-int8@1.0.1: {} - pg-pool@3.14.0(pg@8.21.0): + pg-pool@3.14.0(pg@8.23.0): dependencies: - pg: 8.21.0 + pg: 8.23.0 - pg-protocol@1.14.0: {} + pg-protocol@1.16.0: {} pg-types@2.2.0: dependencies: @@ -14016,11 +14044,11 @@ snapshots: postgres-date: 1.0.7 postgres-interval: 1.2.0 - pg@8.21.0: + pg@8.23.0: dependencies: - pg-connection-string: 2.13.0 - pg-pool: 3.14.0(pg@8.21.0) - pg-protocol: 1.14.0 + pg-connection-string: 2.14.0 + pg-pool: 3.14.0(pg@8.23.0) + pg-protocol: 1.16.0 pg-types: 2.2.0 pgpass: 1.0.5 optionalDependencies: @@ -14032,20 +14060,26 @@ snapshots: picocolors@1.1.1: {} - picomatch@2.3.2: {} + picomatch@2.3.1: {} + + picomatch@4.0.3: {} - picomatch@4.0.4: {} + picomatch@4.0.5: {} - picospinner@3.0.0: {} + picospinner@3.1.2: {} pkce-challenge@5.0.1: {} pkg-types@2.3.1: dependencies: confbox: 0.2.4 - exsolve: 1.0.8 + exsolve: 1.1.1 pathe: 2.0.3 + pkg-up@3.1.0: + dependencies: + find-up: 3.0.0 + points-on-curve@0.2.0: {} points-on-path@0.2.1: @@ -14055,22 +14089,22 @@ snapshots: possible-typed-array-names@1.1.0: {} - postal-mime@2.7.4: {} + postal-mime@2.7.5: {} - postcss-selector-parser@7.1.1: + postcss-selector-parser@7.1.5: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 postcss@8.4.31: dependencies: - nanoid: 3.3.12 + nanoid: 3.3.17 picocolors: 1.1.1 source-map-js: 1.2.1 - postcss@8.5.15: + postcss@8.5.23: dependencies: - nanoid: 3.3.12 + nanoid: 3.3.17 picocolors: 1.1.1 source-map-js: 1.2.1 @@ -14090,24 +14124,28 @@ snapshots: powershell-utils@0.1.0: {} + powershell-utils@0.2.0: {} + prelude-ls@1.2.1: {} - prettier@3.8.3: {} + prettier@3.7.4: {} + + prettier@3.9.6: {} pretty-ms@9.3.0: dependencies: parse-ms: 4.0.0 - prisma@7.8.0(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.9.3): + prisma@7.9.1(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.9.2): dependencies: - '@prisma/config': 7.8.0 - '@prisma/dev': 0.24.3(typescript@5.9.3) - '@prisma/engines': 7.8.0 - '@prisma/studio-core': 0.27.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@prisma/config': 7.9.1 + '@prisma/dev': 0.24.17(typescript@5.9.2) + '@prisma/engines': 7.9.1 + '@prisma/studio-core': 0.33.0(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) mysql2: 3.15.3 postgres: 3.4.7 optionalDependencies: - typescript: 5.9.3 + typescript: 5.9.2 transitivePeerDependencies: - '@types/react' - '@types/react-dom' @@ -14138,74 +14176,79 @@ snapshots: retry: 0.12.0 signal-exit: 3.0.7 - property-information@7.1.0: {} + property-information@7.2.0: {} prosemirror-changeset@2.4.1: dependencies: prosemirror-transform: 1.12.0 - prosemirror-commands@1.7.1: + prosemirror-commands@1.7.2: dependencies: - prosemirror-model: 1.25.7 + prosemirror-model: 1.25.11 prosemirror-state: 1.4.4 prosemirror-transform: 1.12.0 - prosemirror-dropcursor@1.8.2: + prosemirror-dropcursor@1.8.3: dependencies: prosemirror-state: 1.4.4 prosemirror-transform: 1.12.0 - prosemirror-view: 1.41.8 + prosemirror-view: 1.42.2 prosemirror-gapcursor@1.4.1: dependencies: prosemirror-keymap: 1.2.3 - prosemirror-model: 1.25.7 + prosemirror-model: 1.25.11 prosemirror-state: 1.4.4 - prosemirror-view: 1.41.8 + prosemirror-view: 1.42.2 prosemirror-history@1.5.0: dependencies: prosemirror-state: 1.4.4 prosemirror-transform: 1.12.0 - prosemirror-view: 1.41.8 + prosemirror-view: 1.42.2 rope-sequence: 1.3.4 + prosemirror-inputrules@1.5.1: + dependencies: + prosemirror-state: 1.4.4 + prosemirror-transform: 1.12.0 + prosemirror-keymap@1.2.3: dependencies: prosemirror-state: 1.4.4 w3c-keyname: 2.2.8 - prosemirror-model@1.25.7: + prosemirror-model@1.25.11: dependencies: orderedmap: 2.1.1 prosemirror-schema-list@1.5.1: dependencies: - prosemirror-model: 1.25.7 + prosemirror-model: 1.25.11 prosemirror-state: 1.4.4 prosemirror-transform: 1.12.0 prosemirror-state@1.4.4: dependencies: - prosemirror-model: 1.25.7 + prosemirror-model: 1.25.11 prosemirror-transform: 1.12.0 - prosemirror-view: 1.41.8 + prosemirror-view: 1.42.2 prosemirror-tables@1.8.5: dependencies: prosemirror-keymap: 1.2.3 - prosemirror-model: 1.25.7 + prosemirror-model: 1.25.11 prosemirror-state: 1.4.4 prosemirror-transform: 1.12.0 - prosemirror-view: 1.41.8 + prosemirror-view: 1.42.2 prosemirror-transform@1.12.0: dependencies: - prosemirror-model: 1.25.7 + prosemirror-model: 1.25.11 - prosemirror-view@1.41.8: + prosemirror-view@1.42.2: dependencies: - prosemirror-model: 1.25.7 + prosemirror-model: 1.25.11 prosemirror-state: 1.4.4 prosemirror-transform: 1.12.0 @@ -14222,87 +14265,88 @@ snapshots: pure-rand@6.1.0: {} - qs@6.15.2: + qs@6.15.3: dependencies: - side-channel: 1.1.0 + es-define-property: 1.0.1 + side-channel: 1.1.1 queue-microtask@1.2.3: {} - radix-ui@1.4.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0): - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-accessible-icon': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-accordion': 1.2.12(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-alert-dialog': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-aspect-ratio': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-avatar': 1.1.10(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-checkbox': 1.3.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-collapsible': 1.1.12(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-context-menu': 2.2.16(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-dropdown-menu': 2.1.16(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-form': 0.1.8(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-hover-card': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-label': 2.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-menubar': 1.1.16(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-navigation-menu': 1.2.14(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-one-time-password-field': 0.1.8(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-password-toggle-field': 0.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-popover': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-progress': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-radio-group': 1.3.8(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-scroll-area': 1.2.10(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-select': 2.2.6(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-separator': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-slider': 1.3.6(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-switch': 1.2.6(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-tabs': 1.1.13(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-toast': 1.2.15(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-toggle': 1.1.10(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-toggle-group': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-toolbar': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-tooltip': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.15)(react@19.1.0) - '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + radix-ui@1.6.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + dependencies: + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-accessible-icon': 1.1.15(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-accordion': 1.2.20(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-alert-dialog': 1.1.23(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-arrow': 1.1.15(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-aspect-ratio': 1.1.15(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-avatar': 1.2.6(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-checkbox': 1.3.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-collapsible': 1.1.20(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-collection': 1.1.15(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-context': 1.2.2(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-context-menu': 2.3.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-dialog': 1.1.23(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-direction': 1.1.4(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-dismissable-layer': 1.1.19(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-dropdown-menu': 2.1.24(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-focus-guards': 1.1.6(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-focus-scope': 1.1.16(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-form': 0.1.16(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-hover-card': 1.1.23(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-label': 2.1.15(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-menu': 2.1.24(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-menubar': 1.1.24(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-navigation-menu': 1.2.22(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-one-time-password-field': 0.1.16(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-password-toggle-field': 0.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-popover': 1.1.23(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-popper': 1.3.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-portal': 1.1.17(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-presence': 1.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-progress': 1.1.16(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-radio-group': 1.4.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-roving-focus': 1.1.19(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-scroll-area': 1.2.18(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-select': 2.3.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-separator': 1.1.15(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-slider': 1.4.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-slot': 1.3.3(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-switch': 1.3.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-tabs': 1.1.21(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-toast': 1.2.23(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-toggle': 1.1.18(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-toggle-group': 1.1.19(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-toolbar': 1.1.19(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-tooltip': 1.2.16(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-use-effect-event': 0.0.5(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-use-escape-keydown': 1.1.5(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-use-is-hydrated': 0.1.3(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-use-size': 1.1.4(@types/react@19.2.2)(react@19.1.0) + '@radix-ui/react-visually-hidden': 1.2.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) optionalDependencies: - '@types/react': 19.2.15 - '@types/react-dom': 19.2.3(@types/react@19.2.15) + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) - range-parser@1.2.1: {} + range-parser@1.3.0: {} raw-body@3.0.2: dependencies: bytes: 3.1.2 http-errors: 2.0.1 - iconv-lite: 0.7.2 + iconv-lite: 0.7.3 unpipe: 1.0.0 - razorpay@2.9.6: + razorpay@2.9.8: dependencies: - axios: 1.16.1 + axios: 1.19.0 transitivePeerDependencies: - debug - supports-color @@ -14312,105 +14356,105 @@ snapshots: defu: 6.1.7 destr: 2.0.5 - react-day-picker@10.0.1(@types/react@19.2.15)(react@19.1.0): + react-day-picker@10.0.1(@types/react@19.2.2)(react@19.1.0): dependencies: '@date-fns/tz': 1.5.0 - date-fns: 4.3.0 + date-fns: 4.4.0 react: 19.1.0 optionalDependencies: - '@types/react': 19.2.15 + '@types/react': 19.2.2 react-dom@19.1.0(react@19.1.0): dependencies: react: 19.1.0 scheduler: 0.26.0 - react-email@6.3.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + react-email@6.9.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: - '@babel/parser': 7.27.0 - '@babel/traverse': 7.27.0 - '@react-email/render': 2.0.8(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@babel/parser': 7.29.2 + '@babel/traverse': 7.29.0 + '@react-email/render': 2.1.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) chokidar: 4.0.3 commander: 13.1.0 conf: 15.1.0 css-tree: 3.2.1 debounce: 2.2.0 - esbuild: 0.28.0 + esbuild: 0.28.2 glob: 13.0.6 - jiti: 2.4.2 + jiti: 2.6.1 log-symbols: 7.0.1 marked: 15.0.12 mime-types: 3.0.2 normalize-path: 3.0.0 nypm: 0.6.6 - picospinner: 3.0.0 + picospinner: 3.1.2 prismjs: 1.30.0 prompts: 2.4.2 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) socket.io: 4.8.3 - tailwindcss: 4.3.0 + tailwindcss: 4.3.3 tsconfig-paths: 4.2.0 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - react-hook-form@7.76.1(react@19.1.0): + react-hook-form@7.85.0(react@19.1.0): dependencies: react: 19.1.0 - react-icons@5.6.0(react@19.1.0): + react-icons@5.7.0(react@19.1.0): dependencies: react: 19.1.0 react-is@16.13.1: {} - react-medium-image-zoom@5.4.5(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + react-medium-image-zoom@5.4.9(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - react-redux@9.3.0(@types/react@19.2.15)(react@19.1.0)(redux@5.0.1): + react-redux@9.3.0(@types/react@19.2.2)(react@19.1.0)(redux@5.0.1): dependencies: '@types/use-sync-external-store': 0.0.6 react: 19.1.0 use-sync-external-store: 1.6.0(react@19.1.0) optionalDependencies: - '@types/react': 19.2.15 + '@types/react': 19.2.2 redux: 5.0.1 - react-remove-scroll-bar@2.3.8(@types/react@19.2.15)(react@19.1.0): + react-remove-scroll-bar@2.3.8(@types/react@19.2.2)(react@19.1.0): dependencies: react: 19.1.0 - react-style-singleton: 2.2.3(@types/react@19.2.15)(react@19.1.0) + react-style-singleton: 2.2.3(@types/react@19.2.2)(react@19.1.0) tslib: 2.8.1 optionalDependencies: - '@types/react': 19.2.15 + '@types/react': 19.2.2 - react-remove-scroll@2.7.2(@types/react@19.2.15)(react@19.1.0): + react-remove-scroll@2.7.2(@types/react@19.2.2)(react@19.1.0): dependencies: react: 19.1.0 - react-remove-scroll-bar: 2.3.8(@types/react@19.2.15)(react@19.1.0) - react-style-singleton: 2.2.3(@types/react@19.2.15)(react@19.1.0) + react-remove-scroll-bar: 2.3.8(@types/react@19.2.2)(react@19.1.0) + react-style-singleton: 2.2.3(@types/react@19.2.2)(react@19.1.0) tslib: 2.8.1 - use-callback-ref: 1.3.3(@types/react@19.2.15)(react@19.1.0) - use-sidecar: 1.1.3(@types/react@19.2.15)(react@19.1.0) + use-callback-ref: 1.3.3(@types/react@19.2.2)(react@19.1.0) + use-sidecar: 1.1.3(@types/react@19.2.2)(react@19.1.0) optionalDependencies: - '@types/react': 19.2.15 + '@types/react': 19.2.2 - react-resizable-panels@4.11.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + react-resizable-panels@4.12.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - react-style-singleton@2.2.3(@types/react@19.2.15)(react@19.1.0): + react-style-singleton@2.2.3(@types/react@19.2.2)(react@19.1.0): dependencies: get-nonce: 1.0.1 react: 19.1.0 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.2.15 + '@types/react': 19.2.2 react@19.1.0: {} @@ -14426,9 +14470,9 @@ snapshots: readdirp@4.1.2: {} - readdirp@5.0.0: {} + readdirp@5.1.1: {} - recast@0.23.11: + recast@0.23.21: dependencies: ast-types: 0.16.1 esprima: 4.0.1 @@ -14436,18 +14480,18 @@ snapshots: tiny-invariant: 1.3.3 tslib: 2.8.1 - recharts@3.8.0(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react-is@16.13.1)(react@19.1.0)(redux@5.0.1): + recharts@3.8.0(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react-is@16.13.1)(react@19.1.0)(redux@5.0.1): dependencies: - '@reduxjs/toolkit': 2.12.0(react-redux@9.3.0(@types/react@19.2.15)(react@19.1.0)(redux@5.0.1))(react@19.1.0) + '@reduxjs/toolkit': 2.12.0(react-redux@9.3.0(@types/react@19.2.2)(react@19.1.0)(redux@5.0.1))(react@19.1.0) clsx: 2.1.1 decimal.js-light: 2.5.1 - es-toolkit: 1.46.1 + es-toolkit: 1.50.0 eventemitter3: 5.0.4 immer: 10.2.0 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) react-is: 16.13.1 - react-redux: 9.3.0(@types/react@19.2.15)(react@19.1.0)(redux@5.0.1) + react-redux: 9.3.0(@types/react@19.2.2)(react@19.1.0)(redux@5.0.1) reselect: 5.1.1 tiny-invariant: 1.3.3 use-sync-external-store: 1.6.0(react@19.1.0) @@ -14458,14 +14502,14 @@ snapshots: recma-build-jsx@1.0.0: dependencies: - '@types/estree': 1.0.9 + '@types/estree': 1.0.8 estree-util-build-jsx: 3.0.1 vfile: 6.0.3 - recma-jsx@1.0.1(acorn@8.16.0): + recma-jsx@1.0.1(acorn@8.15.0): dependencies: - acorn: 8.16.0 - acorn-jsx: 5.3.2(acorn@8.16.0) + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) estree-util-to-js: 2.0.0 recma-parse: 1.0.0 recma-stringify: 1.0.0 @@ -14473,14 +14517,14 @@ snapshots: recma-parse@1.0.0: dependencies: - '@types/estree': 1.0.9 + '@types/estree': 1.0.8 esast-util-from-js: 2.0.1 unified: 11.0.5 vfile: 6.0.3 recma-stringify@1.0.0: dependencies: - '@types/estree': 1.0.9 + '@types/estree': 1.0.8 estree-util-to-js: 2.0.0 unified: 11.0.5 vfile: 6.0.3 @@ -14493,11 +14537,11 @@ snapshots: reflect.getprototypeof@1.0.10: dependencies: - call-bind: 1.0.9 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.24.2 + es-abstract: 1.24.0 es-errors: 1.3.0 - es-object-atoms: 1.1.2 + es-object-atoms: 1.1.1 get-intrinsic: 1.3.0 get-proto: 1.0.1 which-builtin-type: 1.2.1 @@ -14514,7 +14558,7 @@ snapshots: regexp.prototype.flags@1.5.4: dependencies: - call-bind: 1.0.9 + call-bind: 1.0.8 define-properties: 1.2.1 es-errors: 1.3.0 get-proto: 1.0.1 @@ -14523,8 +14567,8 @@ snapshots: rehype-recma@1.0.0: dependencies: - '@types/estree': 1.0.9 - '@types/hast': 3.0.4 + '@types/estree': 1.0.8 + '@types/hast': 3.0.5 hast-util-to-estree: 3.1.3 transitivePeerDependencies: - supports-color @@ -14558,7 +14602,7 @@ snapshots: remark-rehype@11.1.2: dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 '@types/mdast': 4.0.4 mdast-util-to-hast: 13.2.1 unified: 11.0.5 @@ -14581,8 +14625,6 @@ snapshots: remeda@2.33.4: {} - require-directory@2.1.1: {} - require-from-string@2.0.2: {} require-in-the-middle@8.0.1: @@ -14596,22 +14638,28 @@ snapshots: reselect@5.2.0: {} - resend@6.12.3(@react-email/render@2.0.8(react-dom@19.1.0(react@19.1.0))(react@19.1.0)): + resend@6.20.0(@react-email/render@2.1.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)): dependencies: - postal-mime: 2.7.4 - svix: 1.92.2 + postal-mime: 2.7.5 + standardwebhooks: 1.0.0 optionalDependencies: - '@react-email/render': 2.0.8(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@react-email/render': 2.1.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) resolve-from@4.0.0: {} resolve-pkg-maps@1.0.0: {} + resolve@2.0.0-next.5: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + resolve@2.0.0-next.7: dependencies: es-errors: 1.3.0 is-core-module: 2.16.2 - node-exports-info: 1.6.0 + node-exports-info: 1.6.2 object-keys: 1.1.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 @@ -14621,48 +14669,49 @@ snapshots: onetime: 7.0.0 signal-exit: 4.1.0 - retry@0.12.0: {} + ret@0.5.0: {} - rettime@0.11.11: {} + retry@0.12.0: {} reusify@1.1.0: {} robust-predicates@3.0.3: {} - rollup@4.60.4: + rollup@4.62.4: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.60.4 - '@rollup/rollup-android-arm64': 4.60.4 - '@rollup/rollup-darwin-arm64': 4.60.4 - '@rollup/rollup-darwin-x64': 4.60.4 - '@rollup/rollup-freebsd-arm64': 4.60.4 - '@rollup/rollup-freebsd-x64': 4.60.4 - '@rollup/rollup-linux-arm-gnueabihf': 4.60.4 - '@rollup/rollup-linux-arm-musleabihf': 4.60.4 - '@rollup/rollup-linux-arm64-gnu': 4.60.4 - '@rollup/rollup-linux-arm64-musl': 4.60.4 - '@rollup/rollup-linux-loong64-gnu': 4.60.4 - '@rollup/rollup-linux-loong64-musl': 4.60.4 - '@rollup/rollup-linux-ppc64-gnu': 4.60.4 - '@rollup/rollup-linux-ppc64-musl': 4.60.4 - '@rollup/rollup-linux-riscv64-gnu': 4.60.4 - '@rollup/rollup-linux-riscv64-musl': 4.60.4 - '@rollup/rollup-linux-s390x-gnu': 4.60.4 - '@rollup/rollup-linux-x64-gnu': 4.60.4 - '@rollup/rollup-linux-x64-musl': 4.60.4 - '@rollup/rollup-openbsd-x64': 4.60.4 - '@rollup/rollup-openharmony-arm64': 4.60.4 - '@rollup/rollup-win32-arm64-msvc': 4.60.4 - '@rollup/rollup-win32-ia32-msvc': 4.60.4 - '@rollup/rollup-win32-x64-gnu': 4.60.4 - '@rollup/rollup-win32-x64-msvc': 4.60.4 + '@napi-rs/lzma-linux-x64-gnu': 1.5.1 + '@rollup/rollup-android-arm-eabi': 4.62.4 + '@rollup/rollup-android-arm64': 4.62.4 + '@rollup/rollup-darwin-arm64': 4.62.4 + '@rollup/rollup-darwin-x64': 4.62.4 + '@rollup/rollup-freebsd-arm64': 4.62.4 + '@rollup/rollup-freebsd-x64': 4.62.4 + '@rollup/rollup-linux-arm-gnueabihf': 4.62.4 + '@rollup/rollup-linux-arm-musleabihf': 4.62.4 + '@rollup/rollup-linux-arm64-gnu': 4.62.4 + '@rollup/rollup-linux-arm64-musl': 4.62.4 + '@rollup/rollup-linux-loong64-gnu': 4.62.4 + '@rollup/rollup-linux-loong64-musl': 4.62.4 + '@rollup/rollup-linux-ppc64-gnu': 4.62.4 + '@rollup/rollup-linux-ppc64-musl': 4.62.4 + '@rollup/rollup-linux-riscv64-gnu': 4.62.4 + '@rollup/rollup-linux-riscv64-musl': 4.62.4 + '@rollup/rollup-linux-s390x-gnu': 4.62.4 + '@rollup/rollup-linux-x64-gnu': 4.62.4 + '@rollup/rollup-linux-x64-musl': 4.62.4 + '@rollup/rollup-openbsd-x64': 4.62.4 + '@rollup/rollup-openharmony-arm64': 4.62.4 + '@rollup/rollup-win32-arm64-msvc': 4.62.4 + '@rollup/rollup-win32-ia32-msvc': 4.62.4 + '@rollup/rollup-win32-x64-gnu': 4.62.4 + '@rollup/rollup-win32-x64-msvc': 4.62.4 fsevents: 2.3.3 rope-sequence@1.3.4: {} - rou3@0.7.12: {} + rou3@0.9.2: {} roughjs@4.6.6: dependencies: @@ -14689,9 +14738,9 @@ snapshots: rw@1.3.3: {} - safe-array-concat@1.1.4: + safe-array-concat@1.1.3: dependencies: - call-bind: 1.0.9 + call-bind: 1.0.8 call-bound: 1.0.4 get-intrinsic: 1.3.0 has-symbols: 1.1.0 @@ -14710,9 +14759,13 @@ snapshots: es-errors: 1.3.0 is-regex: 1.2.1 + safe-regex2@5.1.1: + dependencies: + ret: 0.5.0 + safer-buffer@2.1.2: {} - sax@1.6.0: {} + sax@1.6.1: {} scheduler@0.26.0: {} @@ -14731,9 +14784,11 @@ snapshots: dependencies: parseley: 0.12.1 + semifies@1.0.0: {} + semver@6.3.1: {} - semver@7.8.1: {} + semver@7.8.5: {} send@1.2.1: dependencies: @@ -14746,7 +14801,7 @@ snapshots: mime-types: 3.0.2 ms: 2.1.3 on-finished: 2.4.1 - range-parser: 1.2.1 + range-parser: 1.3.0 statuses: 2.0.2 transitivePeerDependencies: - supports-color @@ -14762,7 +14817,7 @@ snapshots: transitivePeerDependencies: - supports-color - set-cookie-parser@3.1.0: {} + set-cookie-parser@3.1.2: {} set-function-length@1.2.2: dependencies: @@ -14784,51 +14839,49 @@ snapshots: dependencies: dunder-proto: 1.0.1 es-errors: 1.3.0 - es-object-atoms: 1.1.2 + es-object-atoms: 1.1.1 setimmediate@1.0.5: {} setprototypeof@1.2.0: {} - shadcn@4.8.0(@types/node@20.19.41)(typescript@5.9.3): + shadcn@4.18.0(typescript@5.9.2): dependencies: - '@babel/core': 7.29.0 - '@babel/parser': 7.29.3 - '@babel/plugin-transform-typescript': 7.28.6(@babel/core@7.29.0) - '@babel/preset-typescript': 7.28.5(@babel/core@7.29.0) - '@dotenvx/dotenvx': 1.67.0 - '@modelcontextprotocol/sdk': 1.29.0(zod@3.25.76) + '@babel/core': 7.29.7 + '@babel/parser': 7.29.8 + '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.29.7) + '@babel/preset-typescript': 7.29.7(@babel/core@7.29.7) + '@dotenvx/dotenvx': 1.75.1 + '@modelcontextprotocol/sdk': 1.30.0(zod@3.25.76) '@types/validate-npm-package-name': 4.0.2 - browserslist: 4.28.2 + browserslist: 4.28.8 commander: 14.0.3 - cosmiconfig: 9.0.1(typescript@5.9.3) + cosmiconfig: 9.0.2(typescript@5.9.2) dedent: 1.7.2 deepmerge: 4.3.1 diff: 8.0.4 execa: 9.6.1 fast-glob: 3.3.3 - fs-extra: 11.3.5 + fs-extra: 11.4.0 fuzzysort: 3.1.0 - https-proxy-agent: 7.0.6 kleur: 4.1.5 - msw: 2.14.6(@types/node@20.19.41)(typescript@5.9.3) - node-fetch: 3.3.2 - open: 11.0.0 + open: 11.0.1 ora: 8.2.0 - postcss: 8.5.15 - postcss-selector-parser: 7.1.1 + postcss: 8.5.23 + postcss-selector-parser: 7.1.5 prompts: 2.4.2 - recast: 0.23.11 + recast: 0.23.21 + socks: 2.8.9 stringify-object: 5.0.0 tailwind-merge: 3.6.0 ts-morph: 26.0.0 tsconfig-paths: 4.2.0 + undici: 7.29.0 validate-npm-package-name: 7.0.2 zod: 3.25.76 zod-to-json-schema: 3.25.2(zod@3.25.76) transitivePeerDependencies: - '@cfworker/json-schema' - - '@types/node' - babel-plugin-macros - supports-color - typescript @@ -14837,7 +14890,7 @@ snapshots: dependencies: '@img/colour': 1.1.0 detect-libc: 2.1.2 - semver: 7.8.1 + semver: 7.8.5 optionalDependencies: '@img/sharp-darwin-arm64': 0.34.5 '@img/sharp-darwin-x64': 0.34.5 @@ -14880,7 +14933,12 @@ snapshots: '@shikijs/themes': 3.23.0 '@shikijs/types': 3.23.0 '@shikijs/vscode-textmate': 10.0.2 - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 + + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 side-channel-list@1.0.1: dependencies: @@ -14903,6 +14961,14 @@ snapshots: side-channel-map: 1.0.1 side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + side-channel@1.1.1: dependencies: es-errors: 1.3.0 object-inspect: 1.13.4 @@ -14916,16 +14982,18 @@ snapshots: sisteransi@1.0.5: {} - socket.io-adapter@2.5.7: + smart-buffer@4.2.0: {} + + socket.io-adapter@2.5.8: dependencies: debug: 4.4.3 - ws: 8.20.1 + ws: 8.21.3 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - socket.io-parser@4.2.6: + socket.io-parser@4.2.7: dependencies: '@socket.io/component-emitter': 3.1.2 debug: 4.4.3 @@ -14938,18 +15006,25 @@ snapshots: base64id: 2.0.0 cors: 2.8.6 debug: 4.4.3 - engine.io: 6.6.8 - socket.io-adapter: 2.5.7 - socket.io-parser: 4.2.6 + engine.io: 6.6.9 + socket.io-adapter: 2.5.8 + socket.io-parser: 4.2.7 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - sonner@2.0.7(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + socks@2.8.9: + dependencies: + ip-address: 10.5.0 + smart-buffer: 4.2.0 + + sonner@2.0.8(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: react: 19.1.0 react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.2.2 source-map-js@1.2.1: {} @@ -14990,14 +15065,6 @@ snapshots: es-errors: 1.3.0 internal-slot: 1.1.0 - strict-event-emitter@0.5.1: {} - - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - string-width@7.2.0: dependencies: emoji-regex: 10.6.0 @@ -15006,18 +15073,18 @@ snapshots: string.prototype.includes@2.0.1: dependencies: - call-bind: 1.0.9 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.24.2 + es-abstract: 1.24.0 string.prototype.matchall@4.0.12: dependencies: - call-bind: 1.0.9 + call-bind: 1.0.8 call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.24.2 + es-abstract: 1.24.0 es-errors: 1.3.0 - es-object-atoms: 1.1.2 + es-object-atoms: 1.1.1 get-intrinsic: 1.3.0 gopd: 1.2.0 has-symbols: 1.1.0 @@ -15029,30 +15096,30 @@ snapshots: string.prototype.repeat@1.0.0: dependencies: define-properties: 1.2.1 - es-abstract: 1.24.2 + es-abstract: 1.24.0 string.prototype.trim@1.2.10: dependencies: - call-bind: 1.0.9 + call-bind: 1.0.8 call-bound: 1.0.4 define-data-property: 1.1.4 define-properties: 1.2.1 - es-abstract: 1.24.2 - es-object-atoms: 1.1.2 + es-abstract: 1.24.0 + es-object-atoms: 1.1.1 has-property-descriptors: 1.0.2 string.prototype.trimend@1.0.9: dependencies: - call-bind: 1.0.9 + call-bind: 1.0.8 call-bound: 1.0.4 define-properties: 1.2.1 - es-object-atoms: 1.1.2 + es-object-atoms: 1.1.1 string.prototype.trimstart@1.0.8: dependencies: - call-bind: 1.0.9 + call-bind: 1.0.8 define-properties: 1.2.1 - es-object-atoms: 1.1.2 + es-object-atoms: 1.1.1 string_decoder@1.1.1: dependencies: @@ -15075,7 +15142,7 @@ snapshots: strip-ansi@7.2.0: dependencies: - ansi-regex: 6.2.2 + ansi-regex: 6.3.0 strip-bom@3.0.0: {} @@ -15099,12 +15166,12 @@ snapshots: dependencies: inline-style-parser: 0.2.7 - styled-jsx@5.1.6(@babel/core@7.29.0)(react@19.1.0): + styled-jsx@5.1.6(@babel/core@7.29.7)(react@19.1.0): dependencies: client-only: 0.0.1 react: 19.1.0 optionalDependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.29.7 stylis@4.4.0: {} @@ -15118,47 +15185,31 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - svix@1.92.2: - dependencies: - standardwebhooks: 1.0.0 + systeminformation@5.33.1: {} tagged-tag@1.0.0: {} tailwind-merge@3.6.0: {} - tailwindcss@4.3.0: {} + tailwindcss@4.3.3: {} tapable@2.3.3: {} - terser-webpack-plugin@5.6.0(webpack@5.107.1): - dependencies: - '@jridgewell/trace-mapping': 0.3.31 - jest-worker: 27.5.1 - schema-utils: 4.3.3 - terser: 5.48.0 - webpack: 5.107.1 - - terser@5.48.0: + terser@5.50.0: dependencies: '@jridgewell/source-map': 0.3.11 - acorn: 8.16.0 + acorn: 8.18.0 commander: 2.20.3 source-map-support: 0.5.21 tiny-invariant@1.3.3: {} - tinyexec@1.2.1: {} - - tinyglobby@0.2.16: - dependencies: - fdir: 6.5.0(picomatch@4.0.4) - picomatch: 4.0.4 - - tldts-core@7.0.32: {} + tinyexec@1.3.0: {} - tldts@7.0.32: + tinyglobby@0.2.15: dependencies: - tldts-core: 7.0.32 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 to-regex-range@5.0.1: dependencies: @@ -15166,19 +15217,15 @@ snapshots: toidentifier@1.0.1: {} - tough-cookie@6.0.1: - dependencies: - tldts: 7.0.32 - tr46@0.0.3: {} trim-lines@3.0.1: {} trough@2.2.0: {} - ts-api-utils@2.5.0(typescript@5.9.3): + ts-api-utils@2.1.0(typescript@5.9.2): dependencies: - typescript: 5.9.3 + typescript: 5.9.2 ts-dedent@2.3.0: {} @@ -15202,6 +15249,15 @@ snapshots: tslib@2.8.1: {} + turbo@2.10.10: + optionalDependencies: + '@turbo/darwin-64': 2.10.10 + '@turbo/darwin-arm64': 2.10.10 + '@turbo/linux-64': 2.10.10 + '@turbo/linux-arm64': 2.10.10 + '@turbo/windows-64': 2.10.10 + '@turbo/windows-arm64': 2.10.10 + tw-animate-css@1.4.0: {} type-check@0.4.0: @@ -15210,14 +15266,14 @@ snapshots: type-fest@0.7.1: {} - type-fest@5.6.0: + type-fest@5.8.0: dependencies: tagged-tag: 1.0.0 type-is@2.1.0: dependencies: - content-type: 2.0.0 - media-typer: 1.1.0 + content-type: 2.1.0 + media-typer: 1.1.1 mime-types: 3.0.2 typed-array-buffer@1.0.3: @@ -15228,7 +15284,7 @@ snapshots: typed-array-byte-length@1.0.3: dependencies: - call-bind: 1.0.9 + call-bind: 1.0.8 for-each: 0.3.5 gopd: 1.2.0 has-proto: 1.2.0 @@ -15237,7 +15293,7 @@ snapshots: typed-array-byte-offset@1.0.4: dependencies: available-typed-arrays: 1.0.7 - call-bind: 1.0.9 + call-bind: 1.0.8 for-each: 0.3.5 gopd: 1.2.0 has-proto: 1.2.0 @@ -15246,14 +15302,14 @@ snapshots: typed-array-length@1.0.7: dependencies: - call-bind: 1.0.9 + call-bind: 1.0.8 for-each: 0.3.5 gopd: 1.2.0 is-typed-array: 1.1.15 possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typescript@5.9.3: {} + typescript@5.9.2: {} uint8array-extras@1.5.0: {} @@ -15270,6 +15326,8 @@ snapshots: undici-types@7.24.6: {} + undici@7.29.0: {} + unicorn-magic@0.3.0: {} unified@11.0.5: @@ -15345,11 +15403,9 @@ snapshots: '@unrs/resolver-binding-win32-ia32-msvc': 1.12.2 '@unrs/resolver-binding-win32-x64-msvc': 1.12.2 - until-async@3.0.2: {} - - update-browserslist-db@1.2.3(browserslist@4.28.2): + update-browserslist-db@1.3.1(browserslist@4.28.8): dependencies: - browserslist: 4.28.2 + browserslist: 4.28.8 escalade: 3.2.0 picocolors: 1.1.1 @@ -15357,20 +15413,20 @@ snapshots: dependencies: punycode: 2.3.1 - use-callback-ref@1.3.3(@types/react@19.2.15)(react@19.1.0): + use-callback-ref@1.3.3(@types/react@19.2.2)(react@19.1.0): dependencies: react: 19.1.0 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.2.15 + '@types/react': 19.2.2 - use-sidecar@1.1.3(@types/react@19.2.15)(react@19.1.0): + use-sidecar@1.1.3(@types/react@19.2.2)(react@19.1.0): dependencies: detect-node-es: 1.1.0 react: 19.1.0 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.2.15 + '@types/react': 19.2.2 use-sync-external-store@1.6.0(react@19.1.0): dependencies: @@ -15378,19 +15434,19 @@ snapshots: util-deprecate@1.0.2: {} - uuid@14.0.0: {} + uuid@14.0.1: {} - valibot@1.2.0(typescript@5.9.3): + valibot@1.4.2(typescript@5.9.2): optionalDependencies: - typescript: 5.9.3 + typescript: 5.9.2 validate-npm-package-name@7.0.2: {} vary@1.1.2: {} - vaul@1.1.2(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + vaul@1.1.2(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: - '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-dialog': 1.1.23(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) transitivePeerDependencies: @@ -15426,42 +15482,36 @@ snapshots: w3c-keyname@2.2.8: {} - watchpack@2.5.1: + watchpack@2.5.2: dependencies: - glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 - web-streams-polyfill@3.3.3: {} - webidl-conversions@3.0.1: {} - webpack-sources@3.5.0: {} + webpack-sources@3.5.1: {} - webpack@5.107.1: + webpack@5.109.2: dependencies: - '@types/estree': 1.0.9 + '@types/estree': 1.0.8 '@types/json-schema': 7.0.15 '@webassemblyjs/ast': 1.14.1 '@webassemblyjs/wasm-edit': 1.14.1 '@webassemblyjs/wasm-parser': 1.14.1 - acorn: 8.16.0 - acorn-import-phases: 1.0.4(acorn@8.16.0) - browserslist: 4.28.2 + acorn: 8.18.0 + browserslist: 4.28.8 chrome-trace-event: 1.0.4 - enhanced-resolve: 5.22.0 - es-module-lexer: 2.1.0 + enhanced-resolve: 5.24.5 + es-module-lexer: 2.3.1 eslint-scope: 5.1.1 events: 3.3.0 - glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 - loader-runner: 4.3.2 mime-db: 1.54.0 + minimizer-webpack-plugin: 5.6.1(webpack@5.109.2) neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.3 - terser-webpack-plugin: 5.6.0(webpack@5.107.1) - watchpack: 2.5.1 - webpack-sources: 3.5.0 + watchpack: 2.5.2 + webpack-sources: 3.5.1 transitivePeerDependencies: - '@minify-html/node' - '@swc/core' @@ -15499,13 +15549,13 @@ snapshots: is-async-function: 2.1.1 is-date-object: 1.1.0 is-finalizationregistry: 1.1.1 - is-generator-function: 1.1.2 + is-generator-function: 1.1.0 is-regex: 1.2.1 is-weakref: 1.1.1 isarray: 2.0.5 which-boxed-primitive: 1.1.1 which-collection: 1.0.2 - which-typed-array: 1.1.20 + which-typed-array: 1.1.19 which-collection@1.0.2: dependencies: @@ -15514,10 +15564,10 @@ snapshots: is-weakmap: 2.0.2 is-weakset: 2.0.4 - which-typed-array@1.1.20: + which-typed-array@1.1.19: dependencies: available-typed-arrays: 1.0.7 - call-bind: 1.0.9 + call-bind: 1.0.8 call-bound: 1.0.4 for-each: 0.3.5 get-proto: 1.0.1 @@ -15534,56 +15584,36 @@ snapshots: word-wrap@1.2.5: {} - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrappy@1.0.2: {} - ws@8.20.1: {} + ws@8.21.3: {} - wsl-utils@0.3.1: + wsl-utils@1.0.0: dependencies: is-wsl: 3.1.1 powershell-utils: 0.1.0 xml-js@1.6.11: dependencies: - sax: 1.6.0 + sax: 1.6.1 xml@1.0.1: {} xtend@4.0.2: {} - y18n@5.0.8: {} - yallist@3.1.1: {} - yargs-parser@21.1.1: {} - - yargs@17.7.2: - dependencies: - cliui: 8.0.1 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 21.1.1 - yocto-queue@0.1.0: {} - yocto-spinner@1.2.0: + yocto-spinner@1.2.2: dependencies: - yoctocolors: 2.1.2 + yoctocolors: 2.2.0 - yoctocolors@2.1.2: {} + yoctocolors@2.2.0: {} zeptomatch@2.1.0: dependencies: - grammex: 3.1.12 + grammex: 3.1.13 graphmatch: 1.1.1 zod-to-json-schema@3.25.2(zod@3.25.76): diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 0000000..3ff5faa --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,3 @@ +packages: + - "apps/*" + - "packages/*" diff --git a/scripts/__tests__/api-explorer-environment.test.ts b/scripts/__tests__/api-explorer-environment.test.ts index 1faff6d..d7a432b 100644 --- a/scripts/__tests__/api-explorer-environment.test.ts +++ b/scripts/__tests__/api-explorer-environment.test.ts @@ -1,10 +1,10 @@ import test from "node:test"; import assert from "node:assert"; -import { prisma } from "../../src/lib/prisma"; -import { auth } from "../../src/lib/auth"; -import { POST } from "../../src/app/api/internal/api-explorer/run/route"; +import { prisma } from "../../apps/app/src/lib/prisma"; +import { auth } from "../../apps/app/src/lib/auth"; +import { POST } from "../../apps/app/src/app/api/internal/api-explorer/run/route"; import { NextRequest } from "next/server"; -import { ApiKey, User, WorkspaceMember, Collection, Environment, Entry, EntryStatus } from "../../src/generated/prisma"; +import { ApiKey, User, WorkspaceMember, Collection, Environment, Entry, EntryStatus } from "../../apps/app/src/generated/prisma"; // Save original methods const originalGetSession = auth.api.getSession; diff --git a/scripts/__tests__/api-key-limit.test.ts b/scripts/__tests__/api-key-limit.test.ts index 9beaeed..55f97e8 100644 --- a/scripts/__tests__/api-key-limit.test.ts +++ b/scripts/__tests__/api-key-limit.test.ts @@ -1,7 +1,7 @@ import test from "node:test"; import assert from "node:assert"; -import { prisma } from "../../src/lib/prisma"; -import { ApiKeyService } from "../../src/server/services/api-key.service"; +import { prisma } from "../../apps/app/src/lib/prisma"; +import { ApiKeyService } from "../../apps/app/src/server/services/api-key.service"; // Save originals const originalCount = prisma.apiKey.count; diff --git a/scripts/__tests__/audit-persistence.test.ts b/scripts/__tests__/audit-persistence.test.ts index 218e2c1..5b1db5d 100644 --- a/scripts/__tests__/audit-persistence.test.ts +++ b/scripts/__tests__/audit-persistence.test.ts @@ -1,8 +1,8 @@ import test from "node:test"; import assert from "node:assert"; -import { prisma } from "../../src/lib/prisma"; -import { logAction } from "../../src/lib/audit"; -import { Plan } from "../../src/generated/prisma"; +import { prisma } from "../../apps/app/src/lib/prisma"; +import { logAction } from "../../apps/app/src/lib/audit"; +import { Plan } from "../../apps/app/src/generated/prisma"; // Mock implementation helper const originalCreate = prisma.auditLog.create; diff --git a/scripts/__tests__/entry-environment.test.ts b/scripts/__tests__/entry-environment.test.ts index 404f091..a34b606 100644 --- a/scripts/__tests__/entry-environment.test.ts +++ b/scripts/__tests__/entry-environment.test.ts @@ -1,8 +1,8 @@ import test from "node:test"; import assert from "node:assert"; -import { prisma } from "../../src/lib/prisma"; -import { auth } from "../../src/lib/auth"; -import { POST } from "../../src/app/api/internal/entries/route"; +import { prisma } from "../../apps/app/src/lib/prisma"; +import { auth } from "../../apps/app/src/lib/auth"; +import { POST } from "../../apps/app/src/app/api/internal/entries/route"; import { NextRequest } from "next/server"; // Save original methods diff --git a/scripts/__tests__/logger-hardening.test.ts b/scripts/__tests__/logger-hardening.test.ts index 03e5a1c..54acb90 100644 --- a/scripts/__tests__/logger-hardening.test.ts +++ b/scripts/__tests__/logger-hardening.test.ts @@ -1,17 +1,17 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import test from "node:test"; import assert from "node:assert"; -import { prisma } from "../../src/lib/prisma"; -import { auth } from "../../src/lib/auth"; -import { logger } from "../../src/lib/logger"; +import { prisma } from "../../apps/app/src/lib/prisma"; +import { auth } from "../../apps/app/src/lib/auth"; +import { logger } from "../../apps/app/src/lib/logger"; import { NextRequest } from "next/server"; -import { WorkspaceService } from "../../src/server/services/workspace.service"; +import { WorkspaceService } from "../../apps/app/src/server/services/workspace.service"; // Import route handlers to test -import { POST as apiExplorerPOST } from "../../src/app/api/internal/api-explorer/run/route"; -import { POST as onboardingPOST } from "../../src/app/api/internal/onboarding/complete/route"; -import { POST as replayPOST } from "../../src/app/api/internal/webhooks/deliveries/[id]/replay/route"; -import { PATCH as envPATCH, DELETE as envDELETE } from "../../src/app/api/internal/environments/[envId]/route"; +import { POST as apiExplorerPOST } from "../../apps/app/src/app/api/internal/api-explorer/run/route"; +import { POST as onboardingPOST } from "../../apps/app/src/app/api/internal/onboarding/complete/route"; +import { POST as replayPOST } from "../../apps/app/src/app/api/internal/webhooks/deliveries/[id]/replay/route"; +import { PATCH as envPATCH, DELETE as envDELETE } from "../../apps/app/src/app/api/internal/environments/[envId]/route"; // Save original methods const originalGetSession = auth.api.getSession; diff --git a/scripts/__tests__/storage-display.test.ts b/scripts/__tests__/storage-display.test.ts index 1fda89a..88ccc06 100644 --- a/scripts/__tests__/storage-display.test.ts +++ b/scripts/__tests__/storage-display.test.ts @@ -1,7 +1,7 @@ import test from "node:test"; import assert from "node:assert"; -import { prisma } from "../../src/lib/prisma"; -import { getStorageUsage, checkStorageLimit } from "../../src/lib/usage"; +import { prisma } from "../../apps/app/src/lib/prisma"; +import { getStorageUsage, checkStorageLimit } from "../../apps/app/src/lib/usage"; // Mock media data array interface MockMediaItem { diff --git a/scripts/__tests__/storage-limit.test.ts b/scripts/__tests__/storage-limit.test.ts index 6914ac2..1473ade 100644 --- a/scripts/__tests__/storage-limit.test.ts +++ b/scripts/__tests__/storage-limit.test.ts @@ -1,7 +1,7 @@ import test from "node:test"; import assert from "node:assert"; -import { prisma } from "../../src/lib/prisma"; -import { checkStorageLimit } from "../../src/lib/usage"; +import { prisma } from "../../apps/app/src/lib/prisma"; +import { checkStorageLimit } from "../../apps/app/src/lib/usage"; // Save original prisma aggregate const originalAggregate = prisma.media.aggregate; diff --git a/scripts/__tests__/tokens-crypto.test.ts b/scripts/__tests__/tokens-crypto.test.ts index 8017958..150fbf3 100644 --- a/scripts/__tests__/tokens-crypto.test.ts +++ b/scripts/__tests__/tokens-crypto.test.ts @@ -1,6 +1,6 @@ import test from "node:test"; import assert from "node:assert"; -import { signPayload, verifyPayload } from "../../src/lib/security/tokens"; +import { signPayload, verifyPayload } from "../../apps/app/src/lib/security/tokens"; // Set secret environment variable if not present if (!process.env.BETTER_AUTH_SECRET) { diff --git a/scripts/__tests__/webhook-limit.test.ts b/scripts/__tests__/webhook-limit.test.ts index 822c5e9..cd0f094 100644 --- a/scripts/__tests__/webhook-limit.test.ts +++ b/scripts/__tests__/webhook-limit.test.ts @@ -1,7 +1,7 @@ import test from "node:test"; import assert from "node:assert"; -import { prisma } from "../../src/lib/prisma"; -import { WebhookService } from "../../src/server/services/webhook.service"; +import { prisma } from "../../apps/app/src/lib/prisma"; +import { WebhookService } from "../../apps/app/src/server/services/webhook.service"; // Save originals const originalCount = prisma.webhook.count; diff --git a/scripts/run-api-key-lifecycle-tests.ts b/scripts/run-api-key-lifecycle-tests.ts index 1b30264..896e94e 100644 --- a/scripts/run-api-key-lifecycle-tests.ts +++ b/scripts/run-api-key-lifecycle-tests.ts @@ -1,7 +1,7 @@ -import { prisma } from "../src/lib/prisma"; -import { ApiKeyService } from "../src/server/services/api-key.service"; -import { verifyApiKey, invalidateApiKeyCache } from "../src/lib/api-key"; -import { redis } from "../src/lib/cache"; +import { prisma } from "../apps/app/src/lib/prisma"; +import { ApiKeyService } from "../apps/app/src/server/services/api-key.service"; +import { verifyApiKey, invalidateApiKeyCache } from "../apps/app/src/lib/api-key"; +import { redis } from "../apps/app/src/lib/cache"; import crypto from "crypto"; async function runApiKeyLifecycleTests() { diff --git a/scripts/run-api-key-tests.ts b/scripts/run-api-key-tests.ts index 48c7f46..13ce332 100644 --- a/scripts/run-api-key-tests.ts +++ b/scripts/run-api-key-tests.ts @@ -1,11 +1,11 @@ -import { prisma } from "../src/lib/prisma"; -import { ApiKeyService } from "../src/server/services/api-key.service"; -import { GET as getEntries } from "../src/app/api/v1/entries/[collectionSlug]/route"; -import { GET as getEntry } from "../src/app/api/v1/entries/[collectionSlug]/[entrySlug]/route"; -import { GET as getMedia } from "../src/app/api/v1/media/route"; -import { GET as getWorkspace } from "../src/app/api/v1/workspace/route"; -import { withApiAuth, requireScope } from "../src/middleware/with-api-auth"; -import { apiSuccess } from "../src/types/api"; +import { prisma } from "../apps/app/src/lib/prisma"; +import { ApiKeyService } from "../apps/app/src/server/services/api-key.service"; +import { GET as getEntries } from "../apps/app/src/app/api/v1/entries/[collectionSlug]/route"; +import { GET as getEntry } from "../apps/app/src/app/api/v1/entries/[collectionSlug]/[entrySlug]/route"; +import { GET as getMedia } from "../apps/app/src/app/api/v1/media/route"; +import { GET as getWorkspace } from "../apps/app/src/app/api/v1/workspace/route"; +import { withApiAuth, requireScope } from "../apps/app/src/middleware/with-api-auth"; +import { apiSuccess } from "../apps/app/src/types/api"; import { NextRequest } from "next/server"; async function runApiKeyTests() { diff --git a/scripts/run-critical-error-tests.ts b/scripts/run-critical-error-tests.ts new file mode 100644 index 0000000..ee4a0ac --- /dev/null +++ b/scripts/run-critical-error-tests.ts @@ -0,0 +1,153 @@ +import { captureCriticalError, normalizeErrorMessage, generateErrorFingerprint } from "../apps/app/src/lib/errors/capture-critical-error"; +import { prisma } from "../apps/app/src/lib/prisma"; + +async function runCriticalErrorTests() { + console.log("=================================================="); + console.log(" RUNNING FLOWCMS CRITICAL ERROR SYSTEM TESTS "); + console.log("=================================================="); + + let passed = 0; + let failed = 0; + + function assert(name: string, condition: boolean, message?: string) { + if (condition) { + console.log(` ✓ [PASS] ${name}`); + passed++; + } else { + console.error(` ✗ [FAIL] ${name}${message ? ` - ${message}` : ""}`); + failed++; + } + } + + const suffix = Math.random().toString(36).substring(7); + const testRoute = `/api/test/critical-${suffix}`; + const testOperation = `testOperation_${suffix}`; + + try { + // ----------------------------------------------------------------- + // Test 1: Message Normalization & Fingerprinting + // ----------------------------------------------------------------- + { + const rawMsg1 = "Database connection failed for workspace ws_123456789012345678901234 on item 42"; + const rawMsg2 = "Database connection failed for workspace ws_987654321098765432109876 on item 999"; + + const norm1 = normalizeErrorMessage(rawMsg1); + const norm2 = normalizeErrorMessage(rawMsg2); + + assert( + "Dynamic IDs and numbers are normalized to identical template string", + norm1 === norm2, + `Norm1: "${norm1}", Norm2: "${norm2}"` + ); + + const fp1 = generateErrorFingerprint("DatabaseError", norm1, "/api/v1/test", "dbQuery"); + const fp2 = generateErrorFingerprint("DatabaseError", norm2, "/api/v1/test", "dbQuery"); + + assert("Normalized errors produce identical fingerprint SHA256", fp1 === fp2, `fp1: ${fp1}, fp2: ${fp2}`); + } + + // ----------------------------------------------------------------- + // Test 2: First Error Occurrence Persistence + // ----------------------------------------------------------------- + const uniqueErrMessage = `Simulated primary database failure ${suffix}`; + const firstError = new Error(uniqueErrMessage); + + await captureCriticalError(firstError, { + route: testRoute, + method: "POST", + operation: testOperation, + requestId: `req_${suffix}`, + metadata: { debugFlag: true, sensitiveToken: "bearer_secret_12345" }, + }); + + const expectedFp = generateErrorFingerprint("Error", normalizeErrorMessage(uniqueErrMessage), testRoute, testOperation); + const dbRecord = await prisma.criticalError.findUnique({ where: { fingerprint: expectedFp } }); + + assert("First occurrence creates database record", !!dbRecord, `Fingerprint: ${expectedFp}`); + if (dbRecord) { + assert("occurrenceCount is 1 on first occurrence", dbRecord.occurrenceCount === 1, `Count: ${dbRecord.occurrenceCount}`); + assert("Initial status is OPEN", dbRecord.status === "OPEN", `Status: ${dbRecord.status}`); + assert("Route & method are correctly saved", dbRecord.route === testRoute && dbRecord.method === "POST"); + + // Test 5: Sensitive Metadata Key Sanitization + const meta = dbRecord.metadata as Record | null; + assert("Normal metadata keys are preserved", meta?.debugFlag === true); + assert("Sensitive token in metadata is sanitized to [REDACTED]", meta?.sensitiveToken === "[REDACTED]", `Actual: ${JSON.stringify(meta)}`); + } + + // ----------------------------------------------------------------- + // Test 3: Duplicate Error Aggregation + // ----------------------------------------------------------------- + // Short wait to ensure timestamp diff if any + await new Promise((r) => setTimeout(r, 50)); + + // Capture second occurrence of the same error + await captureCriticalError(new Error(uniqueErrMessage), { + route: testRoute, + method: "POST", + operation: testOperation, + requestId: `req_${suffix}_2`, + }); + + const updatedRecord = await prisma.criticalError.findUnique({ where: { fingerprint: expectedFp } }); + assert("Duplicate occurrence updates existing record instead of creating new row", !!updatedRecord); + if (updatedRecord) { + assert("occurrenceCount is incremented to 2", updatedRecord.occurrenceCount === 2, `Count: ${updatedRecord.occurrenceCount}`); + assert("lastSeenAt is updated", updatedRecord.lastSeenAt >= updatedRecord.firstSeenAt); + } + + // ----------------------------------------------------------------- + // Test 4: Different Error Creates Separate Record + // ----------------------------------------------------------------- + const differentError = new TypeError(`Different type error ${suffix}`); + await captureCriticalError(differentError, { + route: testRoute, + method: "GET", + operation: "differentOp", + }); + + const diffFp = generateErrorFingerprint("TypeError", normalizeErrorMessage(differentError.message), testRoute, "differentOp"); + const diffRecord = await prisma.criticalError.findUnique({ where: { fingerprint: diffFp } }); + assert("Different error creates a distinct database record", !!diffRecord && diffRecord.fingerprint !== expectedFp); + + // ----------------------------------------------------------------- + // Test 5: Fail-Safe Handling (Does Not Throw on Invalid Input / Failure) + // ----------------------------------------------------------------- + let throwOccurred = false; + try { + // Pass null/circular objects / unexpected inputs to verify no thrown error + const circular: any = {}; + circular.self = circular; + await captureCriticalError(circular, { route: "invalid", metadata: circular }); + } catch { + throwOccurred = true; + } + assert("captureCriticalError never throws outward exception on internal failure", !throwOccurred); + + // Clean up created test error records + await prisma.criticalError.deleteMany({ + where: { + fingerprint: { in: [expectedFp, diffFp] }, + }, + }).catch(() => {}); + + } catch (err) { + console.error("Unhandled test runner error:", err); + failed++; + } + + console.log("\n=================================================="); + console.log(` CRITICAL ERROR TESTS COMPLETE: ${passed} PASSED, ${failed} FAILED`); + console.log("=================================================="); + + if (failed > 0) { + process.exit(1); + } else { + process.exit(0); + } +} + +runCriticalErrorTests().catch((err) => { + console.error("Unhandled rejection in test runner:", err); + process.exit(1); +}); diff --git a/scripts/run-environment-isolation-tests.ts b/scripts/run-environment-isolation-tests.ts index 0314def..4d32ed1 100644 --- a/scripts/run-environment-isolation-tests.ts +++ b/scripts/run-environment-isolation-tests.ts @@ -1,9 +1,9 @@ -import { prisma } from "../src/lib/prisma"; -import { ApiKeyService } from "../src/server/services/api-key.service"; -import { GET as getEntries } from "../src/app/api/v1/entries/[collectionSlug]/route"; -import { GET as getEntry } from "../src/app/api/v1/entries/[collectionSlug]/[entrySlug]/route"; -import { verifyDraftPreview } from "../src/lib/preview"; -import { dispatchWebhooks } from "../src/lib/webhooks"; +import { prisma } from "../apps/app/src/lib/prisma"; +import { ApiKeyService } from "../apps/app/src/server/services/api-key.service"; +import { GET as getEntries } from "../apps/app/src/app/api/v1/entries/[collectionSlug]/route"; +import { GET as getEntry } from "../apps/app/src/app/api/v1/entries/[collectionSlug]/[entrySlug]/route"; +import { verifyDraftPreview } from "../apps/app/src/lib/preview"; +import { dispatchWebhooks } from "../apps/app/src/lib/webhooks"; import { NextRequest } from "next/server"; // Simple mock for qstash.publishJSON to intercept and track webhook calls in tests diff --git a/scripts/run-environment-lifecycle-tests.ts b/scripts/run-environment-lifecycle-tests.ts index e85e54d..6ae9916 100644 --- a/scripts/run-environment-lifecycle-tests.ts +++ b/scripts/run-environment-lifecycle-tests.ts @@ -1,9 +1,9 @@ /* eslint-disable */ -import { prisma } from "../src/lib/prisma"; -import { auth } from "../src/lib/auth"; +import { prisma } from "../apps/app/src/lib/prisma"; +import { auth } from "../apps/app/src/lib/auth"; import { NextRequest } from "next/server"; -import { POST as createEnvironment } from "../src/app/api/internal/environments/route"; -import { PATCH as updateEnvironment, DELETE as deleteEnvironment } from "../src/app/api/internal/environments/[envId]/route"; +import { POST as createEnvironment } from "../apps/app/src/app/api/internal/environments/route"; +import { PATCH as updateEnvironment, DELETE as deleteEnvironment } from "../apps/app/src/app/api/internal/environments/[envId]/route"; // Global mock state let mockSessionUser: any = null; diff --git a/scripts/run-plan-tests.ts b/scripts/run-plan-tests.ts index b7b4ce4..c9f998a 100644 --- a/scripts/run-plan-tests.ts +++ b/scripts/run-plan-tests.ts @@ -1,5 +1,5 @@ -import { Plan } from "../src/generated/prisma"; -import { PLANS } from "../src/lib/plans"; +import { Plan } from "../apps/app/src/generated/prisma"; +import { PLANS } from "../apps/app/src/lib/plans"; async function runPlanTests() { console.log("=================================================="); diff --git a/scripts/run-rbac-tests.ts b/scripts/run-rbac-tests.ts index 9e09b21..54704c8 100644 --- a/scripts/run-rbac-tests.ts +++ b/scripts/run-rbac-tests.ts @@ -1,6 +1,6 @@ -import { prisma } from "../src/lib/prisma"; -import { auth } from "../src/lib/auth"; -import { qstash } from "../src/lib/qstash"; +import { prisma } from "../apps/app/src/lib/prisma"; +import { auth } from "../apps/app/src/lib/auth"; +import { qstash } from "../apps/app/src/lib/qstash"; import { testCollections } from "./tests/rbac/collections.test"; import { testEntries } from "./tests/rbac/entries.test"; import { testMedia } from "./tests/rbac/media.test"; diff --git a/scripts/test-invite.ts b/scripts/test-invite.ts index d694684..63903eb 100644 --- a/scripts/test-invite.ts +++ b/scripts/test-invite.ts @@ -1,6 +1,6 @@ -import { prisma } from "../src/lib/prisma"; -import { auth } from "../src/lib/auth"; -import { GET } from "../src/app/api/auth/invite/[token]/route"; +import { prisma } from "../apps/app/src/lib/prisma"; +import { auth } from "../apps/app/src/lib/auth"; +import { GET } from "../apps/app/src/app/api/auth/invite/[token]/route"; import { NextRequest } from "next/server"; // Mock auth session to control logged in state easily during tests diff --git a/scripts/test-preview.ts b/scripts/test-preview.ts index b95e7d6..d0cbc25 100644 --- a/scripts/test-preview.ts +++ b/scripts/test-preview.ts @@ -1,5 +1,5 @@ -import { prisma } from "../src/lib/prisma"; -import { verifyDraftPreview } from "../src/lib/preview"; +import { prisma } from "../apps/app/src/lib/prisma"; +import { verifyDraftPreview } from "../apps/app/src/lib/preview"; async function runTests() { console.log("=== STARTING DRAFT PREVIEW SECURITY TESTS ==="); diff --git a/scripts/test-relation-expansion.ts b/scripts/test-relation-expansion.ts index 1795381..1bbdc94 100644 --- a/scripts/test-relation-expansion.ts +++ b/scripts/test-relation-expansion.ts @@ -1,8 +1,8 @@ -import { prisma } from "../src/lib/prisma"; -import { ApiKeyService } from "../src/server/services/api-key.service"; -import { GET as getEntries } from "../src/app/api/v1/entries/[collectionSlug]/route"; +import { prisma } from "../apps/app/src/lib/prisma"; +import { ApiKeyService } from "../apps/app/src/server/services/api-key.service"; +import { GET as getEntries } from "../apps/app/src/app/api/v1/entries/[collectionSlug]/route"; import { NextRequest } from "next/server"; -import { EntryStatus } from "../src/generated/prisma"; +import { EntryStatus } from "../apps/app/src/generated/prisma"; async function runTests() { console.log("=================================================="); diff --git a/scripts/test-slug-uniqueness.ts b/scripts/test-slug-uniqueness.ts index 230cf25..3110217 100644 --- a/scripts/test-slug-uniqueness.ts +++ b/scripts/test-slug-uniqueness.ts @@ -1,8 +1,8 @@ -import { prisma } from "../src/lib/prisma"; -import { auth } from "../src/lib/auth"; -import { POST as createEntry } from "../src/app/api/internal/entries/route"; -import { PATCH as updateEntry, DELETE as deleteEntry } from "../src/app/api/internal/entries/[id]/route"; -import { verifyDraftPreview } from "../src/lib/preview"; +import { prisma } from "../apps/app/src/lib/prisma"; +import { auth } from "../apps/app/src/lib/auth"; +import { POST as createEntry } from "../apps/app/src/app/api/internal/entries/route"; +import { PATCH as updateEntry, DELETE as deleteEntry } from "../apps/app/src/app/api/internal/entries/[id]/route"; +import { verifyDraftPreview } from "../apps/app/src/lib/preview"; import { NextRequest } from "next/server"; // Global mock state diff --git a/scripts/tests/rbac/collections.test.ts b/scripts/tests/rbac/collections.test.ts index d4d5365..abd9094 100644 --- a/scripts/tests/rbac/collections.test.ts +++ b/scripts/tests/rbac/collections.test.ts @@ -1,8 +1,8 @@ -import { POST as createCollection } from "../../../src/app/api/internal/collections/route"; -import { PATCH as updateCollection, DELETE as deleteCollection } from "../../../src/app/api/internal/collections/[id]/route"; -import { POST as applyTemplate } from "../../../src/app/api/internal/collections/apply-template/route"; +import { POST as createCollection } from "../../../apps/app/src/app/api/internal/collections/route"; +import { PATCH as updateCollection, DELETE as deleteCollection } from "../../../apps/app/src/app/api/internal/collections/[id]/route"; +import { POST as applyTemplate } from "../../../apps/app/src/app/api/internal/collections/apply-template/route"; import { NextRequest } from "next/server"; -import { prisma } from "../../../src/lib/prisma"; +import { prisma } from "../../../apps/app/src/lib/prisma"; import { setMockUser } from "../../run-rbac-tests"; export async function testCollections(ctx: { diff --git a/scripts/tests/rbac/entries.test.ts b/scripts/tests/rbac/entries.test.ts index 2b0e8a7..173f3c2 100644 --- a/scripts/tests/rbac/entries.test.ts +++ b/scripts/tests/rbac/entries.test.ts @@ -1,8 +1,8 @@ -import { POST as createEntry } from "../../../src/app/api/internal/entries/route"; -import { PATCH as updateEntry, DELETE as deleteEntry } from "../../../src/app/api/internal/entries/[id]/route"; -import { PATCH as publishEntry } from "../../../src/app/api/internal/entries/[id]/publish/route"; +import { POST as createEntry } from "../../../apps/app/src/app/api/internal/entries/route"; +import { PATCH as updateEntry, DELETE as deleteEntry } from "../../../apps/app/src/app/api/internal/entries/[id]/route"; +import { PATCH as publishEntry } from "../../../apps/app/src/app/api/internal/entries/[id]/publish/route"; import { NextRequest } from "next/server"; -import { prisma } from "../../../src/lib/prisma"; +import { prisma } from "../../../apps/app/src/lib/prisma"; import { setMockUser } from "../../run-rbac-tests"; export async function testEntries(ctx: { diff --git a/scripts/tests/rbac/media.test.ts b/scripts/tests/rbac/media.test.ts index 4af8807..3bd1e6a 100644 --- a/scripts/tests/rbac/media.test.ts +++ b/scripts/tests/rbac/media.test.ts @@ -1,12 +1,12 @@ -import { POST as createMedia } from "../../../src/app/api/internal/media/route"; -import { PATCH as updateMedia, DELETE as deleteMedia } from "../../../src/app/api/internal/media/[id]/route"; -import { POST as createFolder } from "../../../src/app/api/internal/media/folders/route"; -import { PATCH as updateFolder, DELETE as deleteFolder } from "../../../src/app/api/internal/media/folders/[id]/route"; -import { POST as bulkMedia } from "../../../src/app/api/internal/media/bulk/route"; +import { POST as createMedia } from "../../../apps/app/src/app/api/internal/media/route"; +import { PATCH as updateMedia, DELETE as deleteMedia } from "../../../apps/app/src/app/api/internal/media/[id]/route"; +import { POST as createFolder } from "../../../apps/app/src/app/api/internal/media/folders/route"; +import { PATCH as updateFolder, DELETE as deleteFolder } from "../../../apps/app/src/app/api/internal/media/folders/[id]/route"; +import { POST as bulkMedia } from "../../../apps/app/src/app/api/internal/media/bulk/route"; import { NextRequest } from "next/server"; -import { prisma } from "../../../src/lib/prisma"; +import { prisma } from "../../../apps/app/src/lib/prisma"; import { setMockUser } from "../../run-rbac-tests"; -import { storage } from "../../../src/lib/storage"; +import { storage } from "../../../apps/app/src/lib/storage"; export async function testMedia(ctx: { workspace: any; diff --git a/scripts/tests/rbac/webhooks.test.ts b/scripts/tests/rbac/webhooks.test.ts index 90ef317..e71aa9d 100644 --- a/scripts/tests/rbac/webhooks.test.ts +++ b/scripts/tests/rbac/webhooks.test.ts @@ -1,9 +1,9 @@ -import { GET as getWebhooks, POST as createWebhook, DELETE as deleteWebhook } from "../../../src/app/api/internal/webhooks/route"; -import { POST as replayWebhook } from "../../../src/app/api/internal/webhooks/deliveries/[id]/replay/route"; +import { GET as getWebhooks, POST as createWebhook, DELETE as deleteWebhook } from "../../../apps/app/src/app/api/internal/webhooks/route"; +import { POST as replayWebhook } from "../../../apps/app/src/app/api/internal/webhooks/deliveries/[id]/replay/route"; import { NextRequest } from "next/server"; -import { prisma } from "../../../src/lib/prisma"; +import { prisma } from "../../../apps/app/src/lib/prisma"; import { setMockUser } from "../../run-rbac-tests"; -import { WebhookEvent } from "../../../src/generated/prisma"; +import { WebhookEvent } from "../../../apps/app/src/generated/prisma"; export async function testWebhooks(ctx: { workspace: any; diff --git a/scripts/tests/rbac/workspace.test.ts b/scripts/tests/rbac/workspace.test.ts index 2941a80..21b9092 100644 --- a/scripts/tests/rbac/workspace.test.ts +++ b/scripts/tests/rbac/workspace.test.ts @@ -1,12 +1,12 @@ -import { GET as getWorkspace, PATCH as updateWorkspace, DELETE as deleteWorkspace } from "../../../src/app/api/internal/workspace/route"; -import { POST as checkoutSession } from "../../../src/app/api/billing/checkout/route"; -import { DELETE as removeMember } from "../../../src/app/api/internal/members/[userId]/route"; -import { GET as getInvitations, POST as createInvitation } from "../../../src/app/api/internal/workspace/invitations/route"; -import { DELETE as deleteInvitation } from "../../../src/app/api/internal/workspace/invitations/[id]/route"; +import { GET as getWorkspace, PATCH as updateWorkspace, DELETE as deleteWorkspace } from "../../../apps/app/src/app/api/internal/workspace/route"; +import { POST as checkoutSession } from "../../../apps/app/src/app/api/billing/checkout/route"; +import { DELETE as removeMember } from "../../../apps/app/src/app/api/internal/members/[userId]/route"; +import { GET as getInvitations, POST as createInvitation } from "../../../apps/app/src/app/api/internal/workspace/invitations/route"; +import { DELETE as deleteInvitation } from "../../../apps/app/src/app/api/internal/workspace/invitations/[id]/route"; import { NextRequest } from "next/server"; -import { prisma } from "../../../src/lib/prisma"; +import { prisma } from "../../../apps/app/src/lib/prisma"; import { setMockUser } from "../../run-rbac-tests"; -import { FEATURES } from "../../../src/lib/launch"; +import { FEATURES } from "../../../apps/app/src/lib/launch"; export async function testWorkspace(ctx: { workspace: any; diff --git a/src/instrumentation-client.ts b/src/instrumentation-client.ts deleted file mode 100644 index 1719cad..0000000 --- a/src/instrumentation-client.ts +++ /dev/null @@ -1,23 +0,0 @@ -import * as Sentry from "@sentry/nextjs"; - -Sentry.init({ - dsn: process.env.NEXT_PUBLIC_SENTRY_DSN, - - sendDefaultPii: true, - - // 100% in dev, 10% in production - tracesSampleRate: process.env.NODE_ENV === "development" ? 1.0 : 0.1, - - // Session Replay: 10% of all sessions, 100% of sessions with errors - replaysSessionSampleRate: 0.1, - replaysOnErrorSampleRate: 1.0, - - enableLogs: true, - - integrations: [ - Sentry.replayIntegration(), - ], -}); - -// Hook into App Router navigation transitions -export const onRouterTransitionStart = Sentry.captureRouterTransitionStart; diff --git a/src/instrumentation.ts b/src/instrumentation.ts deleted file mode 100644 index 7cbe93c..0000000 --- a/src/instrumentation.ts +++ /dev/null @@ -1,13 +0,0 @@ -import * as Sentry from "@sentry/nextjs"; - -export async function register() { - if (process.env.NEXT_RUNTIME === "nodejs") { - await import("./sentry.server.config"); - } - - if (process.env.NEXT_RUNTIME === "edge") { - await import("./sentry.edge.config"); - } -} - -export const onRequestError = Sentry.captureRequestError; diff --git a/src/sentry.edge.config.ts b/src/sentry.edge.config.ts deleted file mode 100644 index cd3a3e3..0000000 --- a/src/sentry.edge.config.ts +++ /dev/null @@ -1,10 +0,0 @@ -import * as Sentry from "@sentry/nextjs"; - -Sentry.init({ - dsn: process.env.SENTRY_DSN || process.env.NEXT_PUBLIC_SENTRY_DSN, - - sendDefaultPii: true, - tracesSampleRate: process.env.NODE_ENV === "development" ? 1.0 : 0.1, - - enableLogs: true, -}); diff --git a/src/sentry.server.config.ts b/src/sentry.server.config.ts deleted file mode 100644 index 56da90c..0000000 --- a/src/sentry.server.config.ts +++ /dev/null @@ -1,13 +0,0 @@ -import * as Sentry from "@sentry/nextjs"; - -Sentry.init({ - dsn: process.env.SENTRY_DSN || process.env.NEXT_PUBLIC_SENTRY_DSN, - - sendDefaultPii: true, - tracesSampleRate: process.env.NODE_ENV === "development" ? 1.0 : 0.1, - - // Attach local variable values to stack frames - includeLocalVariables: true, - - enableLogs: true, -}); diff --git a/turbo.json b/turbo.json new file mode 100644 index 0000000..6bde259 --- /dev/null +++ b/turbo.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://turborepo.dev/schema.json", + "ui": "tui", + "tasks": { + "build": { + "dependsOn": ["^build"], + "inputs": ["$TURBO_DEFAULT$", ".env*"], + "outputs": [".next/**", "!.next/cache/**", "!.next/dev/**"] + }, + "lint": { + "dependsOn": ["^lint"] + }, + "check-types": { + "dependsOn": ["^check-types"] + }, + "dev": { + "cache": false, + "persistent": true + } + } +} From 431d2c8047e17677bb255fae13835d9c0648a2dd Mon Sep 17 00:00:00 2001 From: kjxcodez Date: Mon, 17 Aug 2026 09:41:15 +0530 Subject: [PATCH 2/6] feat: implement centralized critical error capture and aggregation system with automated testing and sensitive data redaction --- .../src/lib/errors/capture-critical-error.ts | 2 +- scripts/run-critical-error-tests.ts | 23 +++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/apps/app/src/lib/errors/capture-critical-error.ts b/apps/app/src/lib/errors/capture-critical-error.ts index 19eece6..9b997ab 100644 --- a/apps/app/src/lib/errors/capture-critical-error.ts +++ b/apps/app/src/lib/errors/capture-critical-error.ts @@ -147,7 +147,7 @@ export async function captureCriticalError( lastSeenAt: new Date(), status: "OPEN", stack: stackTrace, - metadata: sanitizedMeta ? (sanitizedMeta as any) : undefined, + metadata: sanitizedMeta ? JSON.parse(JSON.stringify(sanitizedMeta)) : undefined, }, }); } catch (err) { diff --git a/scripts/run-critical-error-tests.ts b/scripts/run-critical-error-tests.ts index ee4a0ac..87b3496 100644 --- a/scripts/run-critical-error-tests.ts +++ b/scripts/run-critical-error-tests.ts @@ -1,3 +1,26 @@ +import fs from "fs"; +import path from "path"; + +const envPath = path.resolve(__dirname, "../apps/app/.env"); +if (fs.existsSync(envPath)) { + const envContent = fs.readFileSync(envPath, "utf-8"); + for (const line of envContent.split("\n")) { + const trimmed = line.trim(); + if (!trimmed || trimmed.startsWith("#")) continue; + const eqIdx = trimmed.indexOf("="); + if (eqIdx > 0) { + const key = trimmed.substring(0, eqIdx).trim(); + let val = trimmed.substring(eqIdx + 1).trim(); + if ((val.startsWith('"') && val.endsWith('"')) || (val.startsWith("'") && val.endsWith("'"))) { + val = val.substring(1, val.length - 1); + } + if (!process.env[key]) { + process.env[key] = val; + } + } + } +} + import { captureCriticalError, normalizeErrorMessage, generateErrorFingerprint } from "../apps/app/src/lib/errors/capture-critical-error"; import { prisma } from "../apps/app/src/lib/prisma"; From cea53e81a43200336d33e0376e5dba01791023a7 Mon Sep 17 00:00:00 2001 From: kjxcodez Date: Mon, 17 Aug 2026 09:46:31 +0530 Subject: [PATCH 3/6] feat: add CriticalError model and ErrorStatus enum for system error tracking --- .../migration.sql | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 apps/app/prisma/migrations/20260817041503_add_critical_error_tracking/migration.sql diff --git a/apps/app/prisma/migrations/20260817041503_add_critical_error_tracking/migration.sql b/apps/app/prisma/migrations/20260817041503_add_critical_error_tracking/migration.sql new file mode 100644 index 0000000..beab508 --- /dev/null +++ b/apps/app/prisma/migrations/20260817041503_add_critical_error_tracking/migration.sql @@ -0,0 +1,43 @@ +-- CreateEnum +CREATE TYPE "ErrorStatus" AS ENUM ('OPEN', 'INVESTIGATING', 'RESOLVED', 'IGNORED'); + +-- CreateTable +CREATE TABLE "CriticalError" ( + "id" TEXT NOT NULL, + "fingerprint" TEXT NOT NULL, + "errorName" TEXT, + "message" TEXT NOT NULL, + "route" TEXT, + "method" TEXT, + "environment" TEXT, + "deploymentId" TEXT, + "requestId" TEXT, + "operation" TEXT, + "userId" TEXT, + "workspaceId" TEXT, + "occurrenceCount" INTEGER NOT NULL DEFAULT 1, + "firstSeenAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "lastSeenAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "status" "ErrorStatus" NOT NULL DEFAULT 'OPEN', + "stack" TEXT, + "metadata" JSONB, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "CriticalError_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "CriticalError_fingerprint_key" ON "CriticalError"("fingerprint"); + +-- CreateIndex +CREATE INDEX "CriticalError_lastSeenAt_idx" ON "CriticalError"("lastSeenAt"); + +-- CreateIndex +CREATE INDEX "CriticalError_status_idx" ON "CriticalError"("status"); + +-- CreateIndex +CREATE INDEX "CriticalError_workspaceId_idx" ON "CriticalError"("workspaceId"); + +-- AddForeignKey +ALTER TABLE "CriticalError" ADD CONSTRAINT "CriticalError_workspaceId_fkey" FOREIGN KEY ("workspaceId") REFERENCES "Workspace"("id") ON DELETE CASCADE ON UPDATE CASCADE; From 7d13823c921eccccbbbf149607126840cb8d7568 Mon Sep 17 00:00:00 2001 From: kjxcodez Date: Mon, 17 Aug 2026 11:20:42 +0530 Subject: [PATCH 4/6] feat: initialize Prisma schema and configure database client with pg-adapter connection pooling --- apps/app/prisma/schema.prisma | 5 ++- apps/app/src/lib/prisma.ts | 62 +++++++++++++++++++++++++++++++---- 2 files changed, 58 insertions(+), 9 deletions(-) diff --git a/apps/app/prisma/schema.prisma b/apps/app/prisma/schema.prisma index f7a57a6..304e545 100644 --- a/apps/app/prisma/schema.prisma +++ b/apps/app/prisma/schema.prisma @@ -1,7 +1,6 @@ generator client { - provider = "prisma-client-js" - previewFeatures = ["driverAdapters"] - output = "../src/generated/prisma" + provider = "prisma-client-js" + output = "../src/generated/prisma" } datasource db { diff --git a/apps/app/src/lib/prisma.ts b/apps/app/src/lib/prisma.ts index 95e78fe..2a65280 100644 --- a/apps/app/src/lib/prisma.ts +++ b/apps/app/src/lib/prisma.ts @@ -2,15 +2,63 @@ import "dotenv/config"; import { PrismaClient } from "../generated/prisma"; import { PrismaPg } from "@prisma/adapter-pg"; import { Pool } from "pg"; +import type { PoolConfig } from "pg"; -if (!process.env.DIRECT_URL) { - throw new Error("DIRECT_URL environment variable is not set"); +/** + * Runtime database connection — uses Supabase Supavisor transaction pooler (port 6543). + * + * DATABASE_URL must point to the transaction pooler with ?pgbouncer=true to disable + * named prepared statements, which are incompatible with Supabase transaction pooling. + * Example: postgresql://user:pass@host:6543/db?pgbouncer=true + * + * DIRECT_URL (port 5432) is intentionally NOT used here; it is only for Prisma CLI + * migrations (configured in prisma.config.ts). + */ +if (!process.env.DATABASE_URL) { + throw new Error("DATABASE_URL environment variable is not set"); } -const pool = new Pool({ connectionString: process.env.DIRECT_URL }); -const adapter = new PrismaPg(pool); +/** + * pg.Pool configuration. + * + * Pool settings are configured here because @prisma/adapter-pg v7 uses the underlying + * pg driver for connection pooling — the ?connection_limit= URL parameter no longer + * applies when using driver adapters (it was a Prisma Rust engine parameter). + * + * Pool size reasoning: + * - max: 5 → conservative for serverless (Vercel). Each function instance holds at + * most 5 client connections to Supavisor. Supavisor then multiplexes those into a + * much smaller number of real PostgreSQL backend connections. + * Max real connections consumed = max × concurrent instances, all brokered by Supavisor. + * - idleTimeoutMillis: 30000 → release idle connections back to Supavisor after 30 s + * to avoid accumulating stale, long-lived pooler slots. + * - connectionTimeoutMillis: 10000 → surface a clear timeout error (instead of hanging + * indefinitely) if Supavisor's client queue is full during a traffic burst. + */ +const poolConfig: PoolConfig = { + connectionString: process.env.DATABASE_URL, + max: 5, + idleTimeoutMillis: 30_000, + connectionTimeoutMillis: 10_000, +}; -const globalForPrisma = globalThis as unknown as { prisma: PrismaClient }; +/** + * Global singleton holders. + * Storing both `prisma` and `prismaPool` in globalThis prevents Next.js hot-reload from + * constructing a new PrismaPg adapter (and leaking an orphaned pg.Pool) on every + * module re-evaluation in development. + */ +const globalForPrisma = globalThis as unknown as { + prisma: PrismaClient | undefined; + prismaPool: Pool | undefined; +}; + +// Re-use or create the pg.Pool singleton +if (!globalForPrisma.prismaPool) { + globalForPrisma.prismaPool = new Pool(poolConfig); +} + +const adapter = new PrismaPg(globalForPrisma.prismaPool); export const prisma = globalForPrisma.prisma ?? @@ -19,4 +67,6 @@ export const prisma = log: process.env.NODE_ENV === "development" ? ["query", "error", "warn"] : ["error"], }); -if (process.env.NODE_ENV !== "production") globalForPrisma.prisma = prisma; +if (process.env.NODE_ENV !== "production") { + globalForPrisma.prisma = prisma; +} From 4742a6a0fbe1f539f333a396c06232d8959e93db Mon Sep 17 00:00:00 2001 From: kjxcodez Date: Mon, 17 Aug 2026 11:50:32 +0530 Subject: [PATCH 5/6] feat: initialize FlowCMS repository with CI workflows, issue templates, and project documentation --- .github/ISSUE_TEMPLATE/bug.yml | 70 +++++++++++ .github/ISSUE_TEMPLATE/config.yml | 5 + .github/ISSUE_TEMPLATE/feature.yml | 37 ++++++ .github/dependabot.yml | 63 ++++++++++ .github/pull_request_template.md | 34 +++++ .github/workflows/ci.yml | 60 +++++++++ CONTRIBUTING.md | 87 +++++++++++++ README.md | 193 ++++++++--------------------- SECURITY.md | 35 ++++++ 9 files changed, 443 insertions(+), 141 deletions(-) create mode 100644 .github/ISSUE_TEMPLATE/bug.yml create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/ISSUE_TEMPLATE/feature.yml create mode 100644 .github/dependabot.yml create mode 100644 .github/pull_request_template.md create mode 100644 .github/workflows/ci.yml create mode 100644 CONTRIBUTING.md create mode 100644 SECURITY.md diff --git a/.github/ISSUE_TEMPLATE/bug.yml b/.github/ISSUE_TEMPLATE/bug.yml new file mode 100644 index 0000000..9aabb35 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug.yml @@ -0,0 +1,70 @@ +name: Bug Report +description: Report a bug or unintended behavior in FlowCMS +title: "[Bug]: " +labels: ["bug"] +body: + - type: markdown + attributes: + value: | + Thanks for taking the time to report a bug in FlowCMS! Please fill out the form below as completely as possible. Do not include passwords, API keys, or database credentials. + + - type: textarea + id: description + attributes: + label: Bug Description + description: A clear and concise description of what the bug is. + placeholder: Describe what happened... + validations: + required: true + + - type: dropdown + id: component + attributes: + label: Affected Area + description: What part of FlowCMS is affected? + options: + - "App UI / Dashboard" + - "Authentication (Better Auth)" + - "API (v1 / Internal)" + - "Database / Prisma / Supabase" + - "Webhooks / QStash" + - "Media Storage" + - "Billing (Razorpay)" + - "Other" + validations: + required: true + + - type: textarea + id: reproduction + attributes: + label: Steps to Reproduce + description: Explain step-by-step how to reproduce the bug. + placeholder: | + 1. Go to '...' + 2. Click on '....' + 3. Scroll down to '....' + 4. See error + validations: + required: true + + - type: textarea + id: expected + attributes: + label: Expected Behavior + description: A clear and concise description of what you expected to happen. + validations: + required: true + + - type: textarea + id: logs + attributes: + label: Logs or Stack Trace + description: Paste relevant browser console logs, server logs, or stack traces (redact secrets!). + render: shell + + - type: input + id: environment + attributes: + label: Environment + description: OS, browser version, Node.js version, deployment environment (e.g. Vercel, Docker, Local). + placeholder: e.g. Windows 11, Chrome 120, Node 22, Vercel diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..12379c5 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,5 @@ +blank_issues_enabled: true +contact_links: + - name: Security Vulnerability Reporting + url: https://github.com/kjxcodez/FlowCMS/security/advisories/new + about: Report security vulnerabilities privately using GitHub Security Advisories. diff --git a/.github/ISSUE_TEMPLATE/feature.yml b/.github/ISSUE_TEMPLATE/feature.yml new file mode 100644 index 0000000..7c68874 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature.yml @@ -0,0 +1,37 @@ +name: Feature Request +description: Suggest an idea or feature for FlowCMS +title: "[Feature]: " +labels: ["enhancement"] +body: + - type: markdown + attributes: + value: | + Thank you for suggesting a feature for FlowCMS! Please share details about the problem you are solving and your proposed solution. + + - type: textarea + id: problem + attributes: + label: Is your feature request related to a problem? + description: A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + validations: + required: true + + - type: textarea + id: solution + attributes: + label: Proposed Solution + description: Describe the solution or feature you'd like to see implemented. + validations: + required: true + + - type: textarea + id: alternatives + attributes: + label: Alternatives Considered + description: Describe any alternative solutions or features you've considered. + + - type: textarea + id: context + attributes: + label: Additional Context + description: Add any other context, screenshots, or mockups about the feature request here. diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..52ca622 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,63 @@ +version: 2 + +updates: + # Keep npm/pnpm dependencies current (covers pnpm-lock.yaml at the monorepo root) + - package-ecosystem: "npm" + directory: "/" + schedule: + interval: "weekly" + day: "monday" + time: "06:00" + timezone: "UTC" + # Group minor + patch updates for common dependency categories to avoid PR spam + groups: + prisma: + patterns: + - "prisma" + - "@prisma/*" + next-ecosystem: + patterns: + - "next" + - "react" + - "react-dom" + - "@types/react*" + radix-ui: + patterns: + - "radix-ui" + - "@radix-ui/*" + - "@base-ui/*" + tanstack: + patterns: + - "@tanstack/*" + tiptap: + patterns: + - "@tiptap/*" + upstash: + patterns: + - "@upstash/*" + dnd-kit: + patterns: + - "@dnd-kit/*" + dev-tooling: + patterns: + - "typescript" + - "eslint*" + - "@eslint/*" + - "prettier" + - "turbo" + - "@types/*" + labels: + - "dependencies" + open-pull-requests-limit: 10 + + # Keep GitHub Actions dependencies current + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "weekly" + day: "monday" + time: "06:00" + timezone: "UTC" + labels: + - "dependencies" + open-pull-requests-limit: 5 diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000..2879955 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,34 @@ +## Description + +Briefly describe what this PR changes and why. + +## Type of Change + +- [ ] Bug fix (non-breaking change which fixes an issue) +- [ ] New feature (non-breaking change which adds functionality) +- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected) +- [ ] Refactoring / Code quality improvement +- [ ] Documentation update + +## Affected Areas + +- [ ] Apps (`apps/app`) +- [ ] Database / Prisma Schema +- [ ] API routes (`src/app/api`) +- [ ] Authentication / Session handling +- [ ] UI Components / Design System +- [ ] Scripts / Infrastructure / CI + +## Checklist + +- [ ] I tested the changes locally (`pnpm dev` / relevant scripts) +- [ ] I ran type checking (`pnpm check-types`) with zero errors +- [ ] I ran linting (`pnpm lint`) with zero warnings/errors +- [ ] I verified production build completes (`pnpm build`) +- [ ] I did not commit secrets, private keys, or `.env` files +- [ ] Database/schema migration changes are included (if applicable) +- [ ] Breaking API changes are documented (if applicable) + +## Related Issues + +Closes # diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..5db102f --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,60 @@ +name: CI + +on: + pull_request: + branches: + - main + push: + branches: + - main + workflow_dispatch: + +# Cancel in-progress runs for the same PR/branch to avoid wasting runner minutes +concurrency: + group: ci-${{ github.ref }} + cancel-in-progress: true + +permissions: + contents: read + +jobs: + validate: + name: Lint, Typecheck & Build + runs-on: ubuntu-latest + timeout-minutes: 15 + + steps: + - name: Checkout + uses: actions/checkout@v7 + + - name: Setup Node.js + uses: actions/setup-node@v7 + with: + node-version: 22 + cache: pnpm + + - name: Install pnpm + run: corepack enable pnpm + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Lint + run: pnpm turbo lint + + - name: Typecheck + run: pnpm turbo check-types + + - name: Build + run: pnpm turbo build + env: + # Stub env vars so Next.js build-time validation passes. + # These are NOT real credentials. The DB is never contacted during build; + # prisma.ts only runs at request time (server components / route handlers). + DATABASE_URL: "postgresql://ci:ci@localhost:5432/ci_stub" + DIRECT_URL: "postgresql://ci:ci@localhost:5432/ci_stub" + BETTER_AUTH_SECRET: "ci-stub-secret-not-real" + BETTER_AUTH_URL: "http://localhost:3000" + NEXT_PUBLIC_APP_URL: "http://localhost:3000" + NEXT_PUBLIC_SUPABASE_URL: "https://stub.supabase.co" + NEXT_PUBLIC_SUPABASE_ANON_KEY: "stub" diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..74753f1 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,87 @@ +# Contributing to FlowCMS + +Thank you for your interest in contributing to FlowCMS! + +This guide will help you set up your development environment and outline the standards for submitting contributions. + +## Prerequisites + +Ensure you have the following installed locally: + +- **Node.js**: `>=18` (Node 22 LTS recommended) +- **pnpm**: `^9.0.0` (Use `corepack enable pnpm`) +- **Docker & Docker Compose** (Optional, for running local PostgreSQL) + +## Getting Started + +1. **Clone the repository**: + ```bash + git clone https://github.com/kjxcodez/FlowCMS.git + cd FlowCMS + ``` + +2. **Install dependencies**: + ```bash + pnpm install + ``` + +3. **Configure Environment Variables**: + Copy `.env.example` to `.env` inside `apps/app`: + ```bash + cp apps/app/.env.example apps/app/.env + ``` + Fill in the required database connection strings (`DATABASE_URL` and `DIRECT_URL`). + +4. **Database & Prisma Setup**: + Generate the Prisma Client: + ```bash + cd apps/app + pnpm prisma generate + ``` + +5. **Start Development Server**: + From the root of the repository: + ```bash + pnpm dev + ``` + +## Repository Structure + +FlowCMS is structured as a pnpm workspace managed with Turborepo: + +```text +├── apps/ +│ └── app/ # Main Next.js 15 application (UI, API routes, Prisma schema) +├── scripts/ # Test suites & utility scripts +├── pnpm-workspace.yaml # Monorepo workspace configuration +├── turbo.json # Turborepo task pipeline +└── package.json # Monorepo root package definition +``` + +## Available Scripts + +Run these from the monorepo root: + +- `pnpm dev`: Start the development server with hot-reloading +- `pnpm build`: Build all applications and packages for production +- `pnpm lint`: Run ESLint across all packages +- `pnpm check-types`: Run TypeScript type checking (`tsc --noEmit`) + +## Development Guidelines + +### Database & Prisma Rules +- Application runtime code **must** use `DATABASE_URL` (Supavisor transaction pooler on port 6543). +- Prisma CLI migrations **must** use `DIRECT_URL` (port 5432). +- Do **not** instantiate multiple `PrismaClient` or `pg.Pool` instances. Always import `prisma` from `@/lib/prisma`. +- Do **not** add `$disconnect()` calls inside Next.js request handlers. + +### Code Quality & Formatting +- Ensure all code passes type checking (`pnpm check-types`) and linting (`pnpm lint`) before submitting a PR. +- Never commit `.env` files, credentials, secrets, or API keys. + +## Submitting Pull Requests + +1. Create a feature branch off `main`: `git checkout -b feature/my-feature` +2. Make your changes and verify with `pnpm check-types` and `pnpm lint`. +3. Push to your fork/branch and open a Pull Request targeting `main`. +4. Ensure the PR template is filled out completely. diff --git a/README.md b/README.md index 2132f71..d076bb7 100644 --- a/README.md +++ b/README.md @@ -1,159 +1,70 @@ -# Turborepo starter +# FlowCMS -This Turborepo starter is maintained by the Turborepo core team. +FlowCMS is a modern, headless Content Management System (CMS) built with Next.js, TypeScript, Prisma ORM, and Supabase PostgreSQL. -## Using this example +## Features -Run the following command: +- **Content Management**: Structured and visual collections for managing entries, media, and environments. +- **Authentication**: Powered by Better Auth with support for email/password and OAuth (Google). +- **Database & Pooling**: Prisma ORM with `@prisma/adapter-pg` configured for Supabase Supavisor connection pooling. +- **API & Webhooks**: Headless API endpoints (`/api/v1`) with background webhook delivery powered by Upstash QStash. +- **Billing & Usage**: Integrated Razorpay billing and rate limiting via Upstash Redis. -```sh -npx create-turbo@latest -``` +## Tech Stack -## What's inside? +- **Framework**: [Next.js 15](https://nextjs.org/) (App Router, React 19) +- **Language**: [TypeScript](https://www.typescriptlang.org/) +- **ORM**: [Prisma ORM 7](https://www.prisma.io/) with `@prisma/adapter-pg` +- **Database**: [Supabase PostgreSQL](https://supabase.com/) with Supavisor Pooler +- **Monorepo Engine**: [Turborepo](https://turbo.build/) & [pnpm](https://pnpm.io/) +- **UI & Styling**: Tailwind CSS, Radix UI / Base UI, Motion, Lucide Icons -This Turborepo includes the following packages/apps: +## Getting Started -### Apps and Packages +### Prerequisites -- `docs`: a [Next.js](https://nextjs.org/) app -- `web`: another [Next.js](https://nextjs.org/) app -- `@repo/ui`: a stub React component library shared by both `web` and `docs` applications -- `@repo/eslint-config`: `eslint` configurations (includes `eslint-config-next` and `eslint-config-prettier`) -- `@repo/typescript-config`: `tsconfig.json`s used throughout the monorepo +- Node.js `>=18` (Node 22 LTS recommended) +- pnpm `^9.0.0` (`corepack enable pnpm`) -Each package/app is 100% [TypeScript](https://www.typescriptlang.org/). +### Local Setup -### Utilities +1. **Clone the repository**: + ```bash + git clone https://github.com/kjxcodez/FlowCMS.git + cd FlowCMS + ``` -This Turborepo has some additional tools already setup for you: +2. **Install dependencies**: + ```bash + pnpm install + ``` -- [TypeScript](https://www.typescriptlang.org/) for static type checking -- [ESLint](https://eslint.org/) for code linting -- [Prettier](https://prettier.io) for code formatting +3. **Configure Environment Variables**: + Copy `.env.example` to `.env` in `apps/app`: + ```bash + cp apps/app/.env.example apps/app/.env + ``` -### Build +4. **Generate Prisma Client**: + ```bash + cd apps/app && pnpm prisma generate + ``` -To build all apps and packages, run the following command: +5. **Run Development Server**: + From the repository root: + ```bash + pnpm dev + ``` + Open [http://localhost:3000](http://localhost:3000) in your browser. -With [global `turbo`](https://turborepo.dev/docs/getting-started/installation#global-installation) installed (recommended): +## Monorepo Commands -```sh -cd my-turborepo -turbo build -``` +- `pnpm dev`: Run local development server +- `pnpm build`: Build all packages for production +- `pnpm lint`: Run ESLint checks +- `pnpm check-types`: Run TypeScript compiler type checking (`tsc --noEmit`) -Without global `turbo`, use your package manager: +## Contributing & Governance -```sh -cd my-turborepo -npx turbo build -pnpm dlx turbo build -pnpm exec turbo build -``` - -You can build a specific package by using a [filter](https://turborepo.dev/docs/crafting-your-repository/running-tasks#using-filters): - -With [global `turbo`](https://turborepo.dev/docs/getting-started/installation#global-installation) installed: - -```sh -turbo build --filter=docs -``` - -Without global `turbo`: - -```sh -npx turbo build --filter=docs -pnpm exec turbo build --filter=docs -pnpm exec turbo build --filter=docs -``` - -### Develop - -To develop all apps and packages, run the following command: - -With [global `turbo`](https://turborepo.dev/docs/getting-started/installation#global-installation) installed (recommended): - -```sh -cd my-turborepo -turbo dev -``` - -Without global `turbo`, use your package manager: - -```sh -cd my-turborepo -npx turbo dev -pnpm exec turbo dev -pnpm exec turbo dev -``` - -You can develop a specific package by using a [filter](https://turborepo.dev/docs/crafting-your-repository/running-tasks#using-filters): - -With [global `turbo`](https://turborepo.dev/docs/getting-started/installation#global-installation) installed: - -```sh -turbo dev --filter=web -``` - -Without global `turbo`: - -```sh -npx turbo dev --filter=web -pnpm exec turbo dev --filter=web -pnpm exec turbo dev --filter=web -``` - -### Remote Caching - -> [!TIP] -> Vercel Remote Cache is free for all plans. Get started today at [vercel.com](https://vercel.com/signup?utm_source=remote-cache-sdk&utm_campaign=free_remote_cache). - -Turborepo can use a technique known as [Remote Caching](https://turborepo.dev/docs/core-concepts/remote-caching) to share cache artifacts across machines, enabling you to share build caches with your team and CI/CD pipelines. - -By default, Turborepo will cache locally. To enable Remote Caching you will need an account with Vercel. If you don't have an account you can [create one](https://vercel.com/signup?utm_source=turborepo-examples), then enter the following commands: - -With [global `turbo`](https://turborepo.dev/docs/getting-started/installation#global-installation) installed (recommended): - -```sh -cd my-turborepo -turbo login -``` - -Without global `turbo`, use your package manager: - -```sh -cd my-turborepo -npx turbo login -pnpm exec turbo login -pnpm exec turbo login -``` - -This will authenticate the Turborepo CLI with your [Vercel account](https://vercel.com/docs/concepts/personal-accounts/overview). - -Next, you can link your Turborepo to your Remote Cache by running the following command from the root of your Turborepo: - -With [global `turbo`](https://turborepo.dev/docs/getting-started/installation#global-installation) installed: - -```sh -turbo link -``` - -Without global `turbo`: - -```sh -npx turbo link -pnpm exec turbo link -pnpm exec turbo link -``` - -## Useful Links - -Learn more about the power of Turborepo: - -- [Tasks](https://turborepo.dev/docs/crafting-your-repository/running-tasks) -- [Caching](https://turborepo.dev/docs/crafting-your-repository/caching) -- [Remote Caching](https://turborepo.dev/docs/core-concepts/remote-caching) -- [Filtering](https://turborepo.dev/docs/crafting-your-repository/running-tasks#using-filters) -- [Configuration Options](https://turborepo.dev/docs/reference/configuration) -- [CLI Usage](https://turborepo.dev/docs/reference/command-line-reference) +- Please read [CONTRIBUTING.md](./CONTRIBUTING.md) for development rules and guidelines. +- To report security vulnerabilities, review [SECURITY.md](./SECURITY.md). diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..e509b22 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,35 @@ +# Security Policy + +FlowCMS takes security seriously. We appreciate your efforts to responsibly disclose any vulnerabilities you find. + +## Supported Versions + +Only the latest version running on `main` branch / production deployment is currently supported with security updates. + +| Version | Supported | +| ------- | ------------------ | +| `main` | :white_check_mark: | + +## Reporting a Vulnerability + +**Please do not report security vulnerabilities through public GitHub issues.** + +Instead, please report security vulnerabilities privately using **GitHub Security Advisories**: + +1. Go to the repository's [Security Advisories](https://github.com/kjxcodez/FlowCMS/security/advisories/new) tab. +2. Click **Report a vulnerability**. +3. Fill out the report form with details about the vulnerability, reproduction steps, and impact. + +### What to include in your report + +- A description of the issue and its potential impact. +- Clear reproduction steps or proof-of-concept (PoC) code. +- Any suggested mitigations or fixes. + +### Our Commitment + +- We will acknowledge receipt of your report promptly. +- We will investigate and validate the issue. +- Once fixed, we will publish an update and credit you if desired. + +Thank you for keeping FlowCMS secure! From fcb6a30de0264ff1f22d30684c45255822062b7d Mon Sep 17 00:00:00 2001 From: kjxcodez Date: Mon, 17 Aug 2026 12:15:43 +0530 Subject: [PATCH 6/6] chore: update pnpm-lock.yaml dependencies --- pnpm-lock.yaml | 1237 +----------------------------------------------- 1 file changed, 4 insertions(+), 1233 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ec6ad0b..6697b29 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -50,9 +50,6 @@ importers: '@prisma/client-runtime-utils': specifier: ^7.8.0 version: 7.9.1 - '@sentry/nextjs': - specifier: ^10.52.0 - version: 10.70.0(@opentelemetry/core@2.10.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(next@15.5.18(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0)(webpack@5.109.2) '@supabase/supabase-js': specifier: ^2.105.3 version: 2.112.3(@opentelemetry/api@1.9.1) @@ -268,17 +265,6 @@ packages: '@antfu/install-pkg@1.1.0': resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==} - '@apm-js-collab/code-transformer-bundler-plugins@0.7.4': - resolution: {integrity: sha512-nAfOeZPSUAQvJa1iFT/5oCrTm5YQhMMrfCNthNnaXHZiOQhu1KGuLoIx7HtbAi3wfwaBYLaICPIeenIaEwcXIg==} - engines: {node: '>=18.0.0'} - - '@apm-js-collab/code-transformer@0.18.1': - resolution: {integrity: sha512-u1Hb6bHjWtkSpiprwVP6YaHC1DTN4RAU3zYkUDUe7WMnJwdyU1pwTL9dFKiSJB9IiLue/EQovmyx6xhU7FFtAQ==} - hasBin: true - - '@apm-js-collab/tracing-hooks@0.13.0': - resolution: {integrity: sha512-mTvWz9rnQwx1U3h0XPTHaX7bgfkpipLLTQyjlC2cdhQpQEuoLT0AGzoydeoq2NxfEVv6fWOOETcSbb2nptleyw==} - '@babel/code-frame@7.29.7': resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} engines: {node: '>=6.9.0'} @@ -1219,9 +1205,6 @@ packages: resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - '@jridgewell/source-map@0.3.11': - resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==} - '@jridgewell/sourcemap-codec@1.5.5': resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} @@ -1244,12 +1227,6 @@ packages: '@cfworker/json-schema': optional: true - '@napi-rs/lzma-linux-x64-gnu@1.5.1': - resolution: {integrity: sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==} - engines: {node: ^22.20 || ^24.12 || >=25} - cpu: [x64] - os: [linux] - '@napi-rs/wasm-runtime@1.2.3': resolution: {integrity: sha512-UMduMbqO5s5zF2NkNacMT/yK5Y5QiKvWr2+50bzIIxFDwVJ2h49b+oyjaCGPhJxd2/gC2x39EHv/gHVuu36x2Q==} engines: {node: ^20.19.0 || ^22.13.0 || >=23.5.0} @@ -1335,44 +1312,10 @@ packages: resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} engines: {node: '>=12.4.0'} - '@opentelemetry/api-logs@0.220.0': - resolution: {integrity: sha512-CmVa4ImJ+ynfrPMNaAXHET6Bhb44SwzmfyVJFq9ni2jgXJR/l7C6gfVFddNmHP+ZOkP9cf4f9DBe68qVLTHc9w==} - engines: {node: '>=8.0.0'} - '@opentelemetry/api@1.9.1': resolution: {integrity: sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q==} engines: {node: '>=8.0.0'} - '@opentelemetry/core@2.10.0': - resolution: {integrity: sha512-/wNZ8twnEQQA4HoHu22+vcsdru6pWPWxW+7w+FlxT6Id7PE/WIbZmVKkte+PF72e0F2dnImFeHD2syyE1Mw6MQ==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.10.0' - - '@opentelemetry/instrumentation@0.220.0': - resolution: {integrity: sha512-xQx3E2WxP1mDvKzxLxX+CTCtNLa560YJZ3087qYHerl2YmiKpv7AH+dAy7vmx+eVrZ5BwhfWUAVoKOoxCNHcpw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/resources@2.10.0': - resolution: {integrity: sha512-q6MMm2zhggzsHVNbabYwut+a6nbuQQe3URUoxaojM/8K1IBfwwPzvxIjNi2/lI1TFe+fMHMW9MWhrtDLEXEnkA==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': '>=1.3.0 <1.10.0' - - '@opentelemetry/sdk-trace-base@2.10.0': - resolution: {integrity: sha512-GuYQQT7QD2EeO8lcZLRQzcbOyhqAzL+6WWTKTU9mSUBYBazkEDl+VrQcXQhbB08OWM9anD1aHleVadzulpOaUQ==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': '>=1.3.0 <1.10.0' - - '@opentelemetry/sdk-trace@2.10.0': - resolution: {integrity: sha512-MfQGq3GRmTh5fM/y+OjaO0vj6+luCB1XO2gfXCalKCfgKw0eHL++sm75DNweC6ohlp+aFvACqeE0fYayqdRaoQ==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': '>=1.3.0 <1.10.0' - '@opentelemetry/semantic-conventions@1.43.0': resolution: {integrity: sha512-eSYWTm620tTk45EKSedaUL8MFYI8hW164hIXsgIHyxu3VobUB3fFCu5t0hQby6OoWRPsG1KkKUG2M5UadiLiVg==} engines: {node: '>=14'} @@ -2405,149 +2348,6 @@ packages: react-redux: optional: true - '@rollup/plugin-commonjs@28.0.1': - resolution: {integrity: sha512-+tNWdlWKbpB3WgBN7ijjYkq9X5uhjmcvyjEght4NmH5fAU++zfQzAJ6wumLS+dNcvwEZhKx2Z+skY8m7v0wGSA==} - engines: {node: '>=16.0.0 || 14 >= 14.17'} - peerDependencies: - rollup: ^2.68.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true - - '@rollup/pluginutils@5.4.0': - resolution: {integrity: sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true - - '@rollup/rollup-android-arm-eabi@4.62.4': - resolution: {integrity: sha512-RrPokAb7dmbxFoeO3TloqHyOjgye8RkBhSqmp4aJMIex4c9r46ZstPnleDQOq1t46VOVjwIuwNogIqbodV1Vvg==} - cpu: [arm] - os: [android] - - '@rollup/rollup-android-arm64@4.62.4': - resolution: {integrity: sha512-JKuJc+pnpks2pjy7L/N3v/cAkZxYlnmuZoD840ldbMI5KDbC4iO9NKwPKYdjYFCMAIIlBzYSFHxIJVYzRo2/8A==} - cpu: [arm64] - os: [android] - - '@rollup/rollup-darwin-arm64@4.62.4': - resolution: {integrity: sha512-krw5uS2STmvJ02x0uTXHbqQNuz+9eZ1iw+qXk9dmW2gvV4jV7O2hEoOnuhFrpOPiel1mBFtqbxYZZtC46hXLOw==} - cpu: [arm64] - os: [darwin] - - '@rollup/rollup-darwin-x64@4.62.4': - resolution: {integrity: sha512-wsTxtgApb4PrOsNJIm0FZ1h3WvCC+k9uxLJ4ad75hgoS4NiRes2SoJFlDAyMwiUY8IssDqGcHbXuN0sx1tfF1A==} - cpu: [x64] - os: [darwin] - - '@rollup/rollup-freebsd-arm64@4.62.4': - resolution: {integrity: sha512-GUOnQlyZe3yAXhWOtOMsn5Qkrv5E5mZXa0thbARWi5Ei2szlVXJFQhddZ4HbAzh8q92w5twp+CQvs/eFanz9YQ==} - cpu: [arm64] - os: [freebsd] - - '@rollup/rollup-freebsd-x64@4.62.4': - resolution: {integrity: sha512-/Y7f3QuxjzPKsjA/rfEDa3+0vXqyjmJ50Ln8dPpCmWkKTrUoWHG1cWhTqaAMLob2m2nESWuC7yGrREz019Ztqg==} - cpu: [x64] - os: [freebsd] - - '@rollup/rollup-linux-arm-gnueabihf@4.62.4': - resolution: {integrity: sha512-81wiiX3v7aqy+T+bT61TJ78yJjRquqFFTTbAPt08imfQQzkPIW8t6aJbkTagtCCrXMNc9D66+geqlK7ydLPNqA==} - cpu: [arm] - os: [linux] - - '@rollup/rollup-linux-arm-musleabihf@4.62.4': - resolution: {integrity: sha512-9kmDIvNZqdoHOBZgNtpTBeLWYO/LVipM3H/j62P8848/l/VPEQL6N3uxU9pvP1oZAsXyC2MEnFP3ovRjo7WYNQ==} - cpu: [arm] - os: [linux] - - '@rollup/rollup-linux-arm64-gnu@4.62.4': - resolution: {integrity: sha512-CcnXHWnXg69g+DX5VWL3FHts3qMRN2uVEHX+BZvGLdd07/gXkn3ePjYtO1LDJvxkGKVHMclKBRa1QUTH+6toYQ==} - cpu: [arm64] - os: [linux] - - '@rollup/rollup-linux-arm64-musl@4.62.4': - resolution: {integrity: sha512-iFOibiHnTRuhrWLlRsOQFdZJJIa7S8OwkneJr4ocALP16u5yk6lWLINFwhHaEqBFMsKDUZofLkGos7+CPzGB3g==} - cpu: [arm64] - os: [linux] - - '@rollup/rollup-linux-loong64-gnu@4.62.4': - resolution: {integrity: sha512-XnWYMI7euHlb5a871xPja+Gm7DRCFU+FGRrtS2sMq9N8FvqtpagUy6gD4YOemC5MRk9xbh8+jYMEJbigFQwsgA==} - cpu: [loong64] - os: [linux] - - '@rollup/rollup-linux-loong64-musl@4.62.4': - resolution: {integrity: sha512-qGDAlO0U8xedCcsdRm9oaoQY8DAx/QT7uIxJWhCdx0ceIWX783UC9QSYkdpzAe29wNiVfp24+bZdQmn49o45SQ==} - cpu: [loong64] - os: [linux] - - '@rollup/rollup-linux-ppc64-gnu@4.62.4': - resolution: {integrity: sha512-ru4H6ezD7ysA5EiEK6qkkaEb4modH8CTej6kUy/gQi20u3kB3G7Zn8snXXkeJSCOFKG/rbPPtM/+9Wgas1961w==} - cpu: [ppc64] - os: [linux] - - '@rollup/rollup-linux-ppc64-musl@4.62.4': - resolution: {integrity: sha512-2W4MO5WQVJnbJaZdvDb9rhBDuFU1nKIepPFpJUBsTh2k1YY2g+ODViaWuyOAjQ5cOP7NvrvLzt3wvHOoiAvc7w==} - cpu: [ppc64] - os: [linux] - - '@rollup/rollup-linux-riscv64-gnu@4.62.4': - resolution: {integrity: sha512-+fxjfuoAmVMCYV5QyjoIpu0cp5DOiOTeqYFk1AVaxGr+/ravWLX89XfQmptsoWcaVy/TGf2hexzbUOrCQIL1CQ==} - cpu: [riscv64] - os: [linux] - - '@rollup/rollup-linux-riscv64-musl@4.62.4': - resolution: {integrity: sha512-jTn8JfHGL4djjFxPuM06LmNUJDsst2jeVlsd9OmIH6zc5sC9K6rIuO4YajXatLUpBmBKl6b35ro1QZocLi+tcA==} - cpu: [riscv64] - os: [linux] - - '@rollup/rollup-linux-s390x-gnu@4.62.4': - resolution: {integrity: sha512-oCJCJL4pXsoDcP2QZ+JVlPTIRc6266zsIaeJJsWImmF7HO0W8nb6HuSgZlMWxJwaPf8ehbSw8yo0EUw925hKsA==} - cpu: [s390x] - os: [linux] - - '@rollup/rollup-linux-x64-gnu@4.62.4': - resolution: {integrity: sha512-W69hukhZ3KKNRCaMIEzKvcFye42hh0FE1+YoYaf5+Ikacuftoco6yO/xouz0hc5d5W/s3yBro5jRiuEE/Q5vUw==} - cpu: [x64] - os: [linux] - - '@rollup/rollup-linux-x64-musl@4.62.4': - resolution: {integrity: sha512-qiXbGG2jkjXhzXpsFZSR2Xpb8DN/UaxYsbb/STbuR/6fpaDgRmmaq1B/LmtF2wQFOFOSsK2jdE0RZ3a0zHn4QA==} - cpu: [x64] - os: [linux] - - '@rollup/rollup-openbsd-x64@4.62.4': - resolution: {integrity: sha512-nWeM//hxv8mIo6jD7Hu4o48DVmV9pbV6gsKaWU+4NFyqHoPKwrkRiZGLKUhOBk8qNmDmpwFtPKg80Bo/Tn4xiQ==} - cpu: [x64] - os: [openbsd] - - '@rollup/rollup-openharmony-arm64@4.62.4': - resolution: {integrity: sha512-s62SQ/vgsRSvMwDkOEfTqfgASF0f26ZNaQuTA6Aok5lrikf89yI2W0gFHvZb2Jpgc6N8JnOKZgCK2iciO3CsxQ==} - cpu: [arm64] - os: [openharmony] - - '@rollup/rollup-win32-arm64-msvc@4.62.4': - resolution: {integrity: sha512-J6wGf8TVGbXJq+HH+ttTvrcfNKPbuZecV6KT1B8I18BC5IURUh5kl4Yl5OEP5eFIUoI5BWxCsyYMhFsDx8kekw==} - cpu: [arm64] - os: [win32] - - '@rollup/rollup-win32-ia32-msvc@4.62.4': - resolution: {integrity: sha512-zmfrQd/0wu6oJs8Vq8KwY/YtsKSsLtKe/HwAP4Wqy8LhWjeT55fHRAkOhYQ12wI3ayS4Tt12d5CDRD7N96SAYQ==} - cpu: [ia32] - os: [win32] - - '@rollup/rollup-win32-x64-gnu@4.62.4': - resolution: {integrity: sha512-qPzHqdj9rfUD+w79dtE07zi/kFwKyCJqplp5K5ygeLTp7jLpAoc16OAH39HSmRC9UpozaecsleI8uAdEj6v2yw==} - cpu: [x64] - os: [win32] - - '@rollup/rollup-win32-x64-msvc@4.62.4': - resolution: {integrity: sha512-zD6NdeWEByGE9QF9vCrlJ5YQB4oq9q91kPZS37Jwj5hOkvR1lTBSpsKhKDw4IJtbQ35LsTS1HD9DZYGKIshU1Q==} - cpu: [x64] - os: [win32] - '@rtsao/scc@1.1.0': resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} @@ -2560,165 +2360,6 @@ packages: '@selderee/plugin-htmlparser2@0.11.0': resolution: {integrity: sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==} - '@sentry/babel-plugin-component-annotate@5.3.0': - resolution: {integrity: sha512-p4q8gn8wcFqZGP/s2MnJCAAd8fTikaU6A0mM97RDHQgStcrYiaS0Sc5zUNfb1V+UOLPuvdEdL6MwyxfzjYJQTA==} - engines: {node: '>= 18'} - - '@sentry/browser-utils@10.70.0': - resolution: {integrity: sha512-IvjhafF5NFXrPCg5EHbAPGDwIhHxgUcLlHTklZ3DAdA6ky88BJYMfevbcnOEmgavf4nylhCaquRUFNB5+szj+A==} - engines: {node: '>=18'} - - '@sentry/browser@10.70.0': - resolution: {integrity: sha512-IK6+J+8H06tZe+A8L37TT5ZxxwNtyQatW8zl5RYYJ/e9CsjrM8fPi8I1OT7uquTw8UtjqFHt7bEef/Vy63ksPg==} - engines: {node: '>=18'} - - '@sentry/bundler-plugin-core@5.3.0': - resolution: {integrity: sha512-L5T60sWdAI3qWwdg3Ptwek/0TY59PERrxyqp4XMUkroayQvGd9r5dIW9Q1kSeXX9iJ442nXbFZKAOyCKV4Z13Q==} - engines: {node: '>= 18'} - - '@sentry/bundler-plugins@10.70.0': - resolution: {integrity: sha512-M+a32VOZVeTUxF+QecQ+OHYj8hb5FeppKwwWpTQ9cfS6ixgoNUK7/B7NhB2XbfxE3F1BcGvOxyS+AB+fvPfSRQ==} - engines: {node: '>= 18'} - peerDependencies: - rollup: '>=3.2.0' - webpack: '>=5.0.0' - peerDependenciesMeta: - rollup: - optional: true - webpack: - optional: true - - '@sentry/cli-darwin@2.58.6': - resolution: {integrity: sha512-udAVvcyfNa0R+95GvPz/+43/N3TC0TYKdkQ7D7jhPSzbcMc7l2fxRNN5yB3UpCA5fWFnW4toeaqwDBhb/Wh3LA==} - engines: {node: '>=10'} - os: [darwin] - - '@sentry/cli-linux-arm64@2.58.6': - resolution: {integrity: sha512-q8mEcNNmeXMy5i+jWT30TVpH7LcP4HD21CD5XRSPAd/a912HF6EpK0ybf/1USO14WOhoXbAGi9txwaWabSe33g==} - engines: {node: '>=10'} - cpu: [arm64] - os: [linux, freebsd, android] - - '@sentry/cli-linux-arm@2.58.6': - resolution: {integrity: sha512-pD0LAt5PcUzAinBwvDqc66x9+2CabHEv486yP0gRjWO7SakbaxmfVq/EXd8VLq/Tzi39LAu422UYK1lpW3MILw==} - engines: {node: '>=10'} - cpu: [arm] - os: [linux, freebsd, android] - - '@sentry/cli-linux-i686@2.58.6': - resolution: {integrity: sha512-q8vNJi1eOV/4vxAFWBsEwLHoSYapaZHIf4j76KJGJXFKTkEbsjCOOsKbwUIBTQQhRgV4DFWh3ryfsPS/que4Kg==} - engines: {node: '>=10'} - cpu: [x86, ia32] - os: [linux, freebsd, android] - - '@sentry/cli-linux-x64@2.58.6': - resolution: {integrity: sha512-DZu956Mhi3ZRjTBe1WdbGV46ldVbA8d2rgp/fh51GsI25zjBHah4wZnPTSzpc+YqxU6pJpg579B/r3jrIK530Q==} - engines: {node: '>=10'} - cpu: [x64] - os: [linux, freebsd, android] - - '@sentry/cli-win32-arm64@2.58.6': - resolution: {integrity: sha512-nj0Ff/kmAB73EPDhR8B4O9r+NUHK5GkPCkGWC+kXVemqAJWL5jcJ5KdxG0l/S0z6RoEoltID8/43/B+TaMlT7A==} - engines: {node: '>=10'} - cpu: [arm64] - os: [win32] - - '@sentry/cli-win32-i686@2.58.6': - resolution: {integrity: sha512-WNZiDzPbgsEMQWq4avsQ391v/xWKJDIWWWo9GYl+N/w5qcYKkoDW7wQG7T9FasI6ENn68phChTOAPXXxbfAdOg==} - engines: {node: '>=10'} - cpu: [x86, ia32] - os: [win32] - - '@sentry/cli-win32-x64@2.58.6': - resolution: {integrity: sha512-R35WJ17oF4D2eqI1DR2sQQqr0fjRTt5xoP16WrTu91XM2lndRMFsnjh+/GttbxapLCBNlrjzia99MJ0PZHZpgA==} - engines: {node: '>=10'} - cpu: [x64] - os: [win32] - - '@sentry/cli@2.58.6': - resolution: {integrity: sha512-baBcNPLLfUi9WuL+Tpri9BFaAdvugZIKelC5X0tt0Zdy+K0K+PCVSrnNmwMWU/HyaF/SEv6b6UHnXIdqanBlcg==} - engines: {node: '>= 10'} - hasBin: true - - '@sentry/conventions@0.16.0': - resolution: {integrity: sha512-fO9PLmHdVURcSPUpWCItWAtgKiMwGdJHbovoSEyLplX5sxs2ugvI4CBPTrkkgqhObnZOD0CnWBKDzSVQYBKEyQ==} - engines: {node: '>=14'} - - '@sentry/core@10.70.0': - resolution: {integrity: sha512-ozhCTDqg89oB4XmWfAwuHshABpvT7AkRpaPnogopPfMAaI61G1t8EKCJ4W7aum8JSBonlfyjPCyW5oYZFm0KvA==} - engines: {node: '>=18'} - - '@sentry/feedback@10.70.0': - resolution: {integrity: sha512-6VQn2ETJjHkk4QQDdx/587/JDfXsk3yBTLZ3UZOMtBVrkmwgk+1FJZ8ULJ3ud1xZcuh2icunIkc7tGVv2axdnw==} - engines: {node: '>=18'} - - '@sentry/nextjs@10.70.0': - resolution: {integrity: sha512-HL6hoEARpdL/NH3uIQ/O9BczP5P3QLSWerQgv8C4/vZl3JPQOWmFsJEN0F8/dU4+OFqlPz3P52InZjaYO3MA+w==} - engines: {node: '>=18'} - peerDependencies: - next: ^13.2.0 || ^14.0 || ^15.0.0-rc.0 || ^16.0.0-0 - - '@sentry/node-core@10.70.0': - resolution: {integrity: sha512-oPOEVVNxv5WHtckx2i06Wi9FLWyvOg/1DUeX732jZ4iqT2nupINaMH4nF4f4kSvUThFnxkFSRQxwqOxgzMKhKA==} - engines: {node: '>=18'} - peerDependencies: - '@opentelemetry/api': ^1.9.0 - '@opentelemetry/core': ^1.30.1 || ^2.1.0 - '@opentelemetry/exporter-trace-otlp-http': '>=0.57.0 <1' - '@opentelemetry/instrumentation': '>=0.57.1 <1' - '@opentelemetry/sdk-trace-base': ^1.30.1 || ^2.1.0 - peerDependenciesMeta: - '@opentelemetry/api': - optional: true - '@opentelemetry/core': - optional: true - '@opentelemetry/exporter-trace-otlp-http': - optional: true - '@opentelemetry/instrumentation': - optional: true - '@opentelemetry/sdk-trace-base': - optional: true - - '@sentry/node@10.70.0': - resolution: {integrity: sha512-SPOOVxmKTVIEtqvOKkQT163e/pOwucjS7OPsCHyRs8sFR4nfBNu0EThplyqnvqd5BWBMTPH6WTBQfo+QWHV+HA==} - engines: {node: '>=18'} - - '@sentry/opentelemetry@10.70.0': - resolution: {integrity: sha512-UNV/2tqypcUK6FDzerAsFJn1Km/c4VZCYkUZDNbnV5S0cwAq2BYKMo4M5vovaLDBQlxA+Wk9ovbxi5wYjjl9fw==} - engines: {node: '>=18'} - peerDependencies: - '@opentelemetry/api': ^1.9.0 - '@opentelemetry/core': ^1.30.1 || ^2.1.0 - '@opentelemetry/sdk-trace-base': ^1.30.1 || ^2.1.0 - - '@sentry/react@10.70.0': - resolution: {integrity: sha512-j1d/4hvoaUVKs5GRrfmwUCkiEmkfaeHsk+xgausZlzg5YvmwpF+gyevBLNP26GFEH7nyHXW4l8dbbo0eNieJmw==} - engines: {node: '>=18'} - peerDependencies: - react: ^16.14.0 || 17.x || 18.x || 19.x - - '@sentry/replay-canvas@10.70.0': - resolution: {integrity: sha512-irzpw22bK5CF3jbecDa0gBUcfjv7tgeUoLAvtIfeHOP5ajmf3o4Cp99a9RQqkfgvkcMeRZBUwE91SQhp6Ank+w==} - engines: {node: '>=18'} - - '@sentry/replay@10.70.0': - resolution: {integrity: sha512-xMnSGzJn9Xd29rYd32lkx/gFW+5mtgqADJ2FiZvis0MBGZuDlNRwPn0/Cs1xA3JNXKV3NGfhdmmvs90w4dHSmw==} - engines: {node: '>=18'} - - '@sentry/server-utils@10.70.0': - resolution: {integrity: sha512-rzegZjMFFgCp3o+N8+XU13rfSvz4B+f8rU0ijBGrQcHdMNyfsFDTu1UTm262JofmrV2u+s+D0u0vFTnqtOGkbA==} - engines: {node: '>=18'} - - '@sentry/vercel-edge@10.70.0': - resolution: {integrity: sha512-RJgatvWPLq7fm8tTiwH8oQ0TyHPzn4kr9kXFjqTsUsbnVyfZm4/jZ88V0vP05y/GHh/WjLQAGNqOajR9scduZA==} - engines: {node: '>=18'} - - '@sentry/webpack-plugin@5.4.0': - resolution: {integrity: sha512-J3a0BvUZ75Qxy+v/Ap3Hx4ZEcSjlPHZ/jDtxdRhXQCyNeEb8xq0uUBTI9VLtGk2eNeNucOxOEJ5ngqdNjnEH/A==} - engines: {node: '>= 18'} - peerDependencies: - webpack: '>=5.0.0' - '@shikijs/core@3.23.0': resolution: {integrity: sha512-NSWQz0riNb67xthdm5br6lAkvpDJRTgB36fxlo37ZzM2yq0PQFFzbd8psqC2XMPgCzo1fW6cVi18+ArJ44wqgA==} @@ -3232,9 +2873,6 @@ packages: '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} - '@types/estree@1.0.9': - resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} - '@types/geojson@7946.0.16': resolution: {integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==} @@ -3548,57 +3186,6 @@ packages: '@visx/vendor@4.0.0-alpha.0': resolution: {integrity: sha512-6I+MuqXBcv9jnlcVowHoHKSdk9gXTWkHLKyqBwRWg7LY6A3Ei8SHfubpqGV5rBUSppxMq2RszPJUS6w+H0YgmQ==} - '@webassemblyjs/ast@1.14.1': - resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} - - '@webassemblyjs/floating-point-hex-parser@1.13.2': - resolution: {integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==} - - '@webassemblyjs/helper-api-error@1.13.2': - resolution: {integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==} - - '@webassemblyjs/helper-buffer@1.14.1': - resolution: {integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==} - - '@webassemblyjs/helper-numbers@1.13.2': - resolution: {integrity: sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==} - - '@webassemblyjs/helper-wasm-bytecode@1.13.2': - resolution: {integrity: sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==} - - '@webassemblyjs/helper-wasm-section@1.14.1': - resolution: {integrity: sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==} - - '@webassemblyjs/ieee754@1.13.2': - resolution: {integrity: sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==} - - '@webassemblyjs/leb128@1.13.2': - resolution: {integrity: sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==} - - '@webassemblyjs/utf8@1.13.2': - resolution: {integrity: sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==} - - '@webassemblyjs/wasm-edit@1.14.1': - resolution: {integrity: sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==} - - '@webassemblyjs/wasm-gen@1.14.1': - resolution: {integrity: sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==} - - '@webassemblyjs/wasm-opt@1.14.1': - resolution: {integrity: sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==} - - '@webassemblyjs/wasm-parser@1.14.1': - resolution: {integrity: sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==} - - '@webassemblyjs/wast-printer@1.14.1': - resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} - - '@xtuc/ieee754@1.2.0': - resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} - - '@xtuc/long@4.2.2': - resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} - accepts@1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} @@ -3622,11 +3209,6 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - acorn@8.18.0: - resolution: {integrity: sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==} - engines: {node: '>=0.4.0'} - hasBin: true - agent-base@6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} @@ -3647,11 +3229,6 @@ packages: ajv: optional: true - ajv-keywords@5.1.0: - resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} - peerDependencies: - ajv: ^8.8.2 - ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} @@ -3880,9 +3457,6 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - bundle-name@4.1.0: resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} engines: {node: '>=18'} @@ -3952,10 +3526,6 @@ packages: resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} engines: {node: '>= 20.19.0'} - chrome-trace-event@1.0.4: - resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} - engines: {node: '>=6.0'} - citty@0.2.2: resolution: {integrity: sha512-+6vJA3L98yv+IdfKGZHBNiGW5KHn22e/JwID0Strsz8h4S/csAu/OuICwxrg44k5MRiZHWIo8XXuJgQTriRP4w==} @@ -4021,9 +3591,6 @@ packages: resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} engines: {node: '>=20'} - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - commander@7.2.0: resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} engines: {node: '>= 10'} @@ -4032,9 +3599,6 @@ packages: resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} engines: {node: '>= 12'} - commondir@1.0.1: - resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} - compute-scroll-into-view@3.1.1: resolution: {integrity: sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw==} @@ -4459,10 +4023,6 @@ packages: resolution: {integrity: sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==} engines: {node: '>=10'} - dotenv@16.6.1: - resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} - engines: {node: '>=12'} - dotenv@17.4.2: resolution: {integrity: sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==} engines: {node: '>=12'} @@ -4557,9 +4117,6 @@ packages: resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==} engines: {node: '>= 0.4'} - es-module-lexer@2.3.1: - resolution: {integrity: sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==} - es-object-atoms@1.1.1: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} engines: {node: '>= 0.4'} @@ -4684,10 +4241,6 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 - eslint-scope@5.1.1: - resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} - engines: {node: '>=8.0.0'} - eslint-scope@8.4.0: resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -4723,18 +4276,10 @@ packages: resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} engines: {node: '>=0.10'} - esquery@1.7.0: - resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} - engines: {node: '>=0.10'} - esrecurse@4.3.0: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} - estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} - estraverse@5.3.0: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} @@ -4760,9 +4305,6 @@ packages: estree-util-visit@2.0.0: resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==} - estree-walker@2.0.2: - resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} - estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} @@ -4777,10 +4319,6 @@ packages: eventemitter3@5.0.4: resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} - events@3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} - eventsource-parser@3.1.1: resolution: {integrity: sha512-EKN1vKAMcZ8MlYMpaNuxN6R9yakzH6uajHcHVTqWJzvu5pWw9DyhbP35HH8MVBQ+dZjAfDxk+A8NiR9KWaXiyQ==} engines: {node: '>=18.0.0'} @@ -4944,11 +4482,6 @@ packages: resolution: {integrity: sha512-EQsFzMUJkCKGr1ePqlYADkIUmHW1s3ZXr5Yqy6wbGrfUCphpl2maM/kyOIRA2HpP3AaFQTZXD4ldjek+nccddA==} engines: {node: '>=14.14'} - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - fumadocs-core@15.8.5: resolution: {integrity: sha512-hyJtKGuB2J/5y7tDfI1EnGMKlNbSXM5N5cpwvgCY0DcBJwFMDG/GpSpaVRzh3aWy67pAYDZFIwdtbKXBa/q5bg==} peerDependencies: @@ -5421,9 +4954,6 @@ packages: is-property@1.0.2: resolution: {integrity: sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==} - is-reference@1.2.1: - resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} - is-regex@1.2.1: resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} engines: {node: '>= 0.4'} @@ -5505,10 +5035,6 @@ packages: resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} engines: {node: '>= 0.4'} - jest-worker@27.5.1: - resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} - engines: {node: '>= 10.13.0'} - jiti@2.6.1: resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} hasBin: true @@ -5837,10 +5363,6 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - meriyah@6.1.4: - resolution: {integrity: sha512-Sz8FzjzI0kN13GK/6MVEsVzMZEPvOhnmmI1lU5+/1cGOiK3QUahntrNNtdVeihrO7t9JpoH75iMNXg6R6uWflQ==} - engines: {node: '>=18.0.0'} - mermaid@11.16.1: resolution: {integrity: sha512-TQsq6u22fAn3rek5VOubrhKPo1g5hwC3FXUN9hiyupTckcYiGuuKGkNQrKYwGJkXUxZdojwRG46gsSCFZMDp4g==} @@ -5998,49 +5520,6 @@ packages: minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - minimizer-webpack-plugin@5.6.1: - resolution: {integrity: sha512-DoeAZz8Q1C1znwsUzej1fdoi4jCf7/+Em27ouLqfK/+3m8G+D7yDhUwrc3CNhjSzGUN1kn7Iv4sWmjflQHenpw==} - engines: {node: '>= 10.13.0'} - peerDependencies: - '@minify-html/node': '*' - '@swc/core': '*' - '@swc/css': '*' - '@swc/html': '*' - clean-css: '*' - cssnano: '*' - csso: '*' - esbuild: '*' - html-minifier-terser: '*' - lightningcss: '*' - postcss: '*' - uglify-js: '*' - webpack: ^5.1.0 - peerDependenciesMeta: - '@minify-html/node': - optional: true - '@swc/core': - optional: true - '@swc/css': - optional: true - '@swc/html': - optional: true - clean-css: - optional: true - cssnano: - optional: true - csso: - optional: true - esbuild: - optional: true - html-minifier-terser: - optional: true - lightningcss: - optional: true - postcss: - optional: true - uglify-js: - optional: true - minipass@7.1.3: resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} engines: {node: '>=16 || 14 >=14.17'} @@ -6109,9 +5588,6 @@ packages: resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} engines: {node: '>= 0.6'} - neo-async@2.6.2: - resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - neverthrow@7.2.0: resolution: {integrity: sha512-iGBUfFB7yPczHHtA8dksKTJ9E8TESNTAx1UQWW6TzMF280vo9jdPYpLUXrMN1BCkPdHFdNG3fxOt2CUad8KhAw==} engines: {node: '>=18'} @@ -6147,15 +5623,6 @@ packages: resolution: {integrity: sha512-kXs9Go0cah0qHVV2v389IXQLdLCeE1xfFtjOAF+iobu0OIoG1pje8At2vMHyaPMiPMnG/LWP50twML21eMcAag==} engines: {node: '>= 0.4'} - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - node-releases@2.0.53: resolution: {integrity: sha512-D9UOmYG3UH1V+ENW56t5QXBwJw1YEY18ruVeus89Rw+SyIgjPkCO84bRzO3uNIYosJbNwiabWVn48o3uJLjxFQ==} engines: {node: '>=18'} @@ -6511,10 +5978,6 @@ packages: process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - progress@2.0.3: - resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} - engines: {node: '>=0.4.0'} - prompts@2.4.2: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} engines: {node: '>= 6'} @@ -6571,9 +6034,6 @@ packages: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} - proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - proxy-from-env@2.1.0: resolution: {integrity: sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==} engines: {node: '>=10'} @@ -6858,11 +6318,6 @@ packages: robust-predicates@3.0.3: resolution: {integrity: sha512-NS3levdsRIUOmiJ8FZWCP7LG3QpJyrs/TE0Zpf1yvZu8cAJJ6QMW92H1c7kWpdIHo8RvmLxN/o2JXTKHp74lUA==} - rollup@4.62.4: - resolution: {integrity: sha512-RXOqwaPsBGjMNMa4sQjDjHieHEZDFoj/Rdr46l2MU5DfEs16wHJPC2RPTPHWhNl+M3aI472LLqFkFKut4SblOg==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true - rope-sequence@1.3.4: resolution: {integrity: sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==} @@ -6915,19 +6370,12 @@ packages: scheduler@0.26.0: resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} - schema-utils@4.3.3: - resolution: {integrity: sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==} - engines: {node: '>= 10.13.0'} - scroll-into-view-if-needed@3.1.0: resolution: {integrity: sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==} selderee@0.11.0: resolution: {integrity: sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA==} - semifies@1.0.0: - resolution: {integrity: sha512-xXR3KGeoxTNWPD4aBvL5NUpMTT7WMANr3EWnaS190QVkY52lqqcVRD7Q05UVbBhiWDGWMlJEUam9m7uFFGVScw==} - semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true @@ -7056,9 +6504,6 @@ packages: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} @@ -7081,10 +6526,6 @@ packages: stable-hash@0.0.5: resolution: {integrity: sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==} - stacktrace-parser@0.1.11: - resolution: {integrity: sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==} - engines: {node: '>=6'} - standardwebhooks@1.0.0: resolution: {integrity: sha512-BbHGOQK9olHPMvQNHWul6MYlrRTAOKn03rOe4A8O3CLWhNf4YHBqq2HJKKC+sfqpxiBY52pNeesD6jIiLDz8jg==} @@ -7196,10 +6637,6 @@ packages: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} @@ -7224,11 +6661,6 @@ packages: resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} engines: {node: '>=6'} - terser@5.50.0: - resolution: {integrity: sha512-CN9BVxWhgS/hRxtUMjtC2uRWSTcSfQFHMDWma6sKKfIivCD91sM+FOPfvwoaRMqCSrUpe1nv3jDamd9eEQ4y+w==} - engines: {node: '>=10'} - hasBin: true - tiny-invariant@1.3.3: resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} @@ -7248,9 +6680,6 @@ packages: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} @@ -7291,10 +6720,6 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - type-fest@0.7.1: - resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==} - engines: {node: '>=8'} - type-fest@5.8.0: resolution: {integrity: sha512-YGYEVz3Fm5iy/AybuA0oyNFq7H4CgQNfRp/qfe8nurE1kuCeNm3/vfm9X4Mtl+qLyaKJUh5xrFZwogr41SMjYA==} engines: {node: '>=20'} @@ -7458,30 +6883,6 @@ packages: w3c-keyname@2.2.8: resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} - watchpack@2.5.2: - resolution: {integrity: sha512-6i/00NBjP4yGPs+caKSyRfpTF/8Torsu0MOW3mMzIbhgISFder8i7xbqgHlLMwJrdiN8ndBV3UA1/AfzPSr+jg==} - engines: {node: '>=10.13.0'} - - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - webpack-sources@3.5.1: - resolution: {integrity: sha512-jyuiGJdtvY434z5bUZrjz67v76/ePNvFZTp9Mdz29IlH4+GPsgyGjiv0fKI+M7BdkU6ADjulUcKAd3tUK3WlEw==} - engines: {node: '>=10.13.0'} - - webpack@5.109.2: - resolution: {integrity: sha512-U9/cvLzxObKNEZ9+TtdqrHM5/9z3lgl2c+c4BzbqGxFQvQvBAq87yql5A8pQ+rrMbS496MZJeF5enVBndIy2hw==} - engines: {node: '>=10.13.0'} - hasBin: true - peerDependencies: - webpack-cli: '*' - peerDependenciesMeta: - webpack-cli: - optional: true - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - when-exit@2.1.5: resolution: {integrity: sha512-VGkKJ564kzt6Ms1dbgPP/yuIoQCrsFAnRbptpC5wOEsDaNsbCB2bnfnaA8i/vRs5tjUSEOtIuvl9/MyVsvQZCg==} @@ -7586,30 +6987,6 @@ snapshots: package-manager-detector: 1.8.0 tinyexec: 1.3.0 - '@apm-js-collab/code-transformer-bundler-plugins@0.7.4': - dependencies: - '@apm-js-collab/code-transformer': 0.18.1 - es-module-lexer: 2.3.1 - magic-string: 0.30.21 - module-details-from-path: 1.0.4 - - '@apm-js-collab/code-transformer@0.18.1': - dependencies: - '@types/estree': 1.0.8 - astring: 1.9.0 - esquery: 1.7.0 - meriyah: 6.1.4 - semifies: 1.0.0 - source-map: 0.6.1 - - '@apm-js-collab/tracing-hooks@0.13.0': - dependencies: - '@apm-js-collab/code-transformer': 0.18.1 - debug: 4.4.3 - module-details-from-path: 1.0.4 - transitivePeerDependencies: - - supports-color - '@babel/code-frame@7.29.7': dependencies: '@babel/helper-validator-identifier': 7.29.7 @@ -8351,11 +7728,6 @@ snapshots: '@jridgewell/resolve-uri@3.1.2': {} - '@jridgewell/source-map@0.3.11': - dependencies: - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - '@jridgewell/sourcemap-codec@1.5.5': {} '@jridgewell/trace-mapping@0.3.31': @@ -8419,9 +7791,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@napi-rs/lzma-linux-x64-gnu@1.5.1': - optional: true - '@napi-rs/wasm-runtime@1.2.3(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': dependencies: '@emnapi/core': 1.10.0 @@ -8475,48 +7844,10 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.19.1 - '@nolyfill/is-core-module@1.0.39': {} - - '@opentelemetry/api-logs@0.220.0': - dependencies: - '@opentelemetry/api': 1.9.1 - - '@opentelemetry/api@1.9.1': {} - - '@opentelemetry/core@2.10.0(@opentelemetry/api@1.9.1)': - dependencies: - '@opentelemetry/api': 1.9.1 - '@opentelemetry/semantic-conventions': 1.43.0 - - '@opentelemetry/instrumentation@0.220.0(@opentelemetry/api@1.9.1)': - dependencies: - '@opentelemetry/api': 1.9.1 - '@opentelemetry/api-logs': 0.220.0 - import-in-the-middle: 3.0.1 - require-in-the-middle: 8.0.1 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/resources@2.10.0(@opentelemetry/api@1.9.1)': - dependencies: - '@opentelemetry/api': 1.9.1 - '@opentelemetry/core': 2.10.0(@opentelemetry/api@1.9.1) - '@opentelemetry/semantic-conventions': 1.43.0 - - '@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1)': - dependencies: - '@opentelemetry/api': 1.9.1 - '@opentelemetry/core': 2.10.0(@opentelemetry/api@1.9.1) - '@opentelemetry/resources': 2.10.0(@opentelemetry/api@1.9.1) - '@opentelemetry/sdk-trace': 2.10.0(@opentelemetry/api@1.9.1) - '@opentelemetry/semantic-conventions': 1.43.0 - - '@opentelemetry/sdk-trace@2.10.0(@opentelemetry/api@1.9.1)': - dependencies: - '@opentelemetry/api': 1.9.1 - '@opentelemetry/core': 2.10.0(@opentelemetry/api@1.9.1) - '@opentelemetry/resources': 2.10.0(@opentelemetry/api@1.9.1) - '@opentelemetry/semantic-conventions': 1.43.0 + '@nolyfill/is-core-module@1.0.39': {} + + '@opentelemetry/api@1.9.1': + optional: true '@opentelemetry/semantic-conventions@1.43.0': {} @@ -9576,101 +8907,6 @@ snapshots: react: 19.1.0 react-redux: 9.3.0(@types/react@19.2.2)(react@19.1.0)(redux@5.0.1) - '@rollup/plugin-commonjs@28.0.1(rollup@4.62.4)': - dependencies: - '@rollup/pluginutils': 5.4.0(rollup@4.62.4) - commondir: 1.0.1 - estree-walker: 2.0.2 - fdir: 6.5.0(picomatch@4.0.3) - is-reference: 1.2.1 - magic-string: 0.30.21 - picomatch: 4.0.3 - optionalDependencies: - rollup: 4.62.4 - - '@rollup/pluginutils@5.4.0(rollup@4.62.4)': - dependencies: - '@types/estree': 1.0.8 - estree-walker: 2.0.2 - picomatch: 4.0.3 - optionalDependencies: - rollup: 4.62.4 - - '@rollup/rollup-android-arm-eabi@4.62.4': - optional: true - - '@rollup/rollup-android-arm64@4.62.4': - optional: true - - '@rollup/rollup-darwin-arm64@4.62.4': - optional: true - - '@rollup/rollup-darwin-x64@4.62.4': - optional: true - - '@rollup/rollup-freebsd-arm64@4.62.4': - optional: true - - '@rollup/rollup-freebsd-x64@4.62.4': - optional: true - - '@rollup/rollup-linux-arm-gnueabihf@4.62.4': - optional: true - - '@rollup/rollup-linux-arm-musleabihf@4.62.4': - optional: true - - '@rollup/rollup-linux-arm64-gnu@4.62.4': - optional: true - - '@rollup/rollup-linux-arm64-musl@4.62.4': - optional: true - - '@rollup/rollup-linux-loong64-gnu@4.62.4': - optional: true - - '@rollup/rollup-linux-loong64-musl@4.62.4': - optional: true - - '@rollup/rollup-linux-ppc64-gnu@4.62.4': - optional: true - - '@rollup/rollup-linux-ppc64-musl@4.62.4': - optional: true - - '@rollup/rollup-linux-riscv64-gnu@4.62.4': - optional: true - - '@rollup/rollup-linux-riscv64-musl@4.62.4': - optional: true - - '@rollup/rollup-linux-s390x-gnu@4.62.4': - optional: true - - '@rollup/rollup-linux-x64-gnu@4.62.4': - optional: true - - '@rollup/rollup-linux-x64-musl@4.62.4': - optional: true - - '@rollup/rollup-openbsd-x64@4.62.4': - optional: true - - '@rollup/rollup-openharmony-arm64@4.62.4': - optional: true - - '@rollup/rollup-win32-arm64-msvc@4.62.4': - optional: true - - '@rollup/rollup-win32-ia32-msvc@4.62.4': - optional: true - - '@rollup/rollup-win32-x64-gnu@4.62.4': - optional: true - - '@rollup/rollup-win32-x64-msvc@4.62.4': - optional: true - '@rtsao/scc@1.1.0': {} '@rushstack/eslint-patch@1.16.1': {} @@ -9682,208 +8918,6 @@ snapshots: domhandler: 5.0.3 selderee: 0.11.0 - '@sentry/babel-plugin-component-annotate@5.3.0': {} - - '@sentry/browser-utils@10.70.0': - dependencies: - '@sentry/conventions': 0.16.0 - '@sentry/core': 10.70.0 - - '@sentry/browser@10.70.0': - dependencies: - '@sentry/browser-utils': 10.70.0 - '@sentry/conventions': 0.16.0 - '@sentry/core': 10.70.0 - '@sentry/feedback': 10.70.0 - '@sentry/replay': 10.70.0 - '@sentry/replay-canvas': 10.70.0 - - '@sentry/bundler-plugin-core@5.3.0': - dependencies: - '@babel/core': 7.29.7 - '@sentry/babel-plugin-component-annotate': 5.3.0 - '@sentry/cli': 2.58.6 - dotenv: 16.6.1 - find-up: 5.0.0 - glob: 13.0.6 - magic-string: 0.30.21 - transitivePeerDependencies: - - encoding - - supports-color - - '@sentry/bundler-plugins@10.70.0(rollup@4.62.4)(webpack@5.109.2)': - dependencies: - '@babel/core': 7.29.7 - '@sentry/cli': 2.58.6 - '@sentry/core': 10.70.0 - dotenv: 17.4.2 - find-up: 5.0.0 - glob: 13.0.6 - magic-string: 0.30.21 - optionalDependencies: - rollup: 4.62.4 - webpack: 5.109.2 - transitivePeerDependencies: - - encoding - - supports-color - - '@sentry/cli-darwin@2.58.6': - optional: true - - '@sentry/cli-linux-arm64@2.58.6': - optional: true - - '@sentry/cli-linux-arm@2.58.6': - optional: true - - '@sentry/cli-linux-i686@2.58.6': - optional: true - - '@sentry/cli-linux-x64@2.58.6': - optional: true - - '@sentry/cli-win32-arm64@2.58.6': - optional: true - - '@sentry/cli-win32-i686@2.58.6': - optional: true - - '@sentry/cli-win32-x64@2.58.6': - optional: true - - '@sentry/cli@2.58.6': - dependencies: - https-proxy-agent: 5.0.1 - node-fetch: 2.7.0 - progress: 2.0.3 - proxy-from-env: 1.1.0 - which: 2.0.2 - optionalDependencies: - '@sentry/cli-darwin': 2.58.6 - '@sentry/cli-linux-arm': 2.58.6 - '@sentry/cli-linux-arm64': 2.58.6 - '@sentry/cli-linux-i686': 2.58.6 - '@sentry/cli-linux-x64': 2.58.6 - '@sentry/cli-win32-arm64': 2.58.6 - '@sentry/cli-win32-i686': 2.58.6 - '@sentry/cli-win32-x64': 2.58.6 - transitivePeerDependencies: - - encoding - - supports-color - - '@sentry/conventions@0.16.0': {} - - '@sentry/core@10.70.0': - dependencies: - '@sentry/conventions': 0.16.0 - - '@sentry/feedback@10.70.0': - dependencies: - '@sentry/core': 10.70.0 - - '@sentry/nextjs@10.70.0(@opentelemetry/core@2.10.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(next@15.5.18(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0)(webpack@5.109.2)': - dependencies: - '@opentelemetry/api': 1.9.1 - '@rollup/plugin-commonjs': 28.0.1(rollup@4.62.4) - '@sentry/browser-utils': 10.70.0 - '@sentry/bundler-plugin-core': 5.3.0 - '@sentry/conventions': 0.16.0 - '@sentry/core': 10.70.0 - '@sentry/node': 10.70.0(@opentelemetry/core@2.10.0(@opentelemetry/api@1.9.1)) - '@sentry/opentelemetry': 10.70.0(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.10.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1)) - '@sentry/react': 10.70.0(react@19.1.0) - '@sentry/server-utils': 10.70.0 - '@sentry/vercel-edge': 10.70.0 - '@sentry/webpack-plugin': 5.4.0(rollup@4.62.4)(webpack@5.109.2) - next: 15.5.18(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - rollup: 4.62.4 - stacktrace-parser: 0.1.11 - transitivePeerDependencies: - - '@opentelemetry/core' - - '@opentelemetry/exporter-trace-otlp-http' - - '@opentelemetry/sdk-trace-base' - - encoding - - react - - supports-color - - webpack - - '@sentry/node-core@10.70.0(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.10.0(@opentelemetry/api@1.9.1))(@opentelemetry/instrumentation@0.220.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))': - dependencies: - '@sentry/conventions': 0.16.0 - '@sentry/core': 10.70.0 - '@sentry/opentelemetry': 10.70.0(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.10.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1)) - import-in-the-middle: 3.0.1 - optionalDependencies: - '@opentelemetry/api': 1.9.1 - '@opentelemetry/core': 2.10.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation': 0.220.0(@opentelemetry/api@1.9.1) - '@opentelemetry/sdk-trace-base': 2.10.0(@opentelemetry/api@1.9.1) - - '@sentry/node@10.70.0(@opentelemetry/core@2.10.0(@opentelemetry/api@1.9.1))': - dependencies: - '@opentelemetry/api': 1.9.1 - '@opentelemetry/instrumentation': 0.220.0(@opentelemetry/api@1.9.1) - '@opentelemetry/sdk-trace-base': 2.10.0(@opentelemetry/api@1.9.1) - '@sentry/conventions': 0.16.0 - '@sentry/core': 10.70.0 - '@sentry/node-core': 10.70.0(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.10.0(@opentelemetry/api@1.9.1))(@opentelemetry/instrumentation@0.220.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1)) - '@sentry/opentelemetry': 10.70.0(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.10.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1)) - '@sentry/server-utils': 10.70.0 - import-in-the-middle: 3.0.1 - transitivePeerDependencies: - - '@opentelemetry/core' - - '@opentelemetry/exporter-trace-otlp-http' - - supports-color - - '@sentry/opentelemetry@10.70.0(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.10.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))': - dependencies: - '@opentelemetry/api': 1.9.1 - '@opentelemetry/core': 2.10.0(@opentelemetry/api@1.9.1) - '@opentelemetry/sdk-trace-base': 2.10.0(@opentelemetry/api@1.9.1) - '@sentry/conventions': 0.16.0 - '@sentry/core': 10.70.0 - - '@sentry/react@10.70.0(react@19.1.0)': - dependencies: - '@sentry/browser': 10.70.0 - '@sentry/conventions': 0.16.0 - '@sentry/core': 10.70.0 - react: 19.1.0 - - '@sentry/replay-canvas@10.70.0': - dependencies: - '@sentry/core': 10.70.0 - '@sentry/replay': 10.70.0 - - '@sentry/replay@10.70.0': - dependencies: - '@sentry/browser-utils': 10.70.0 - '@sentry/core': 10.70.0 - - '@sentry/server-utils@10.70.0': - dependencies: - '@apm-js-collab/code-transformer-bundler-plugins': 0.7.4 - '@apm-js-collab/tracing-hooks': 0.13.0 - '@sentry/conventions': 0.16.0 - '@sentry/core': 10.70.0 - meriyah: 6.1.4 - transitivePeerDependencies: - - supports-color - - '@sentry/vercel-edge@10.70.0': - dependencies: - '@opentelemetry/api': 1.9.1 - '@sentry/core': 10.70.0 - - '@sentry/webpack-plugin@5.4.0(rollup@4.62.4)(webpack@5.109.2)': - dependencies: - '@sentry/bundler-plugins': 10.70.0(rollup@4.62.4)(webpack@5.109.2) - webpack: 5.109.2 - transitivePeerDependencies: - - encoding - - rollup - - supports-color - '@shikijs/core@3.23.0': dependencies: '@shikijs/types': 3.23.0 @@ -10432,8 +9466,6 @@ snapshots: '@types/estree@1.0.8': {} - '@types/estree@1.0.9': {} - '@types/geojson@7946.0.16': {} '@types/hast@3.0.5': @@ -10760,86 +9792,6 @@ snapshots: d3-time-format: 4.1.0 internmap: 2.0.3 - '@webassemblyjs/ast@1.14.1': - dependencies: - '@webassemblyjs/helper-numbers': 1.13.2 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - - '@webassemblyjs/floating-point-hex-parser@1.13.2': {} - - '@webassemblyjs/helper-api-error@1.13.2': {} - - '@webassemblyjs/helper-buffer@1.14.1': {} - - '@webassemblyjs/helper-numbers@1.13.2': - dependencies: - '@webassemblyjs/floating-point-hex-parser': 1.13.2 - '@webassemblyjs/helper-api-error': 1.13.2 - '@xtuc/long': 4.2.2 - - '@webassemblyjs/helper-wasm-bytecode@1.13.2': {} - - '@webassemblyjs/helper-wasm-section@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-buffer': 1.14.1 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - '@webassemblyjs/wasm-gen': 1.14.1 - - '@webassemblyjs/ieee754@1.13.2': - dependencies: - '@xtuc/ieee754': 1.2.0 - - '@webassemblyjs/leb128@1.13.2': - dependencies: - '@xtuc/long': 4.2.2 - - '@webassemblyjs/utf8@1.13.2': {} - - '@webassemblyjs/wasm-edit@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-buffer': 1.14.1 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - '@webassemblyjs/helper-wasm-section': 1.14.1 - '@webassemblyjs/wasm-gen': 1.14.1 - '@webassemblyjs/wasm-opt': 1.14.1 - '@webassemblyjs/wasm-parser': 1.14.1 - '@webassemblyjs/wast-printer': 1.14.1 - - '@webassemblyjs/wasm-gen@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - '@webassemblyjs/ieee754': 1.13.2 - '@webassemblyjs/leb128': 1.13.2 - '@webassemblyjs/utf8': 1.13.2 - - '@webassemblyjs/wasm-opt@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-buffer': 1.14.1 - '@webassemblyjs/wasm-gen': 1.14.1 - '@webassemblyjs/wasm-parser': 1.14.1 - - '@webassemblyjs/wasm-parser@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-api-error': 1.13.2 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - '@webassemblyjs/ieee754': 1.13.2 - '@webassemblyjs/leb128': 1.13.2 - '@webassemblyjs/utf8': 1.13.2 - - '@webassemblyjs/wast-printer@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@xtuc/long': 4.2.2 - - '@xtuc/ieee754@1.2.0': {} - - '@xtuc/long@4.2.2': {} - accepts@1.3.8: dependencies: mime-types: 2.1.35 @@ -10860,8 +9812,6 @@ snapshots: acorn@8.15.0: {} - acorn@8.18.0: {} - agent-base@6.0.2: dependencies: debug: 4.4.3 @@ -10876,11 +9826,6 @@ snapshots: optionalDependencies: ajv: 8.20.0 - ajv-keywords@5.1.0(ajv@8.20.0): - dependencies: - ajv: 8.20.0 - fast-deep-equal: 3.1.3 - ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 @@ -11112,8 +10057,6 @@ snapshots: node-releases: 2.0.53 update-browserslist-db: 1.3.1(browserslist@4.28.8) - buffer-from@1.1.2: {} - bundle-name@4.1.0: dependencies: run-applescript: 7.1.0 @@ -11183,8 +10126,6 @@ snapshots: dependencies: readdirp: 5.1.1 - chrome-trace-event@1.0.4: {} - citty@0.2.2: {} cjs-module-lexer@2.2.1: {} @@ -11239,14 +10180,10 @@ snapshots: commander@14.0.3: {} - commander@2.20.3: {} - commander@7.2.0: {} commander@8.3.0: {} - commondir@1.0.1: {} - compute-scroll-into-view@3.1.1: {} concat-map@0.0.1: {} @@ -11677,8 +10614,6 @@ snapshots: dependencies: is-obj: 2.0.0 - dotenv@16.6.1: {} - dotenv@17.4.2: {} dunder-proto@1.0.1: @@ -11837,8 +10772,6 @@ snapshots: iterator.prototype: 1.1.5 safe-array-concat: 1.1.3 - es-module-lexer@2.3.1: {} - es-object-atoms@1.1.1: dependencies: es-errors: 1.3.0 @@ -12070,11 +11003,6 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-scope@5.1.1: - dependencies: - esrecurse: 4.3.0 - estraverse: 4.3.0 - eslint-scope@8.4.0: dependencies: esrecurse: 4.3.0 @@ -12137,16 +11065,10 @@ snapshots: dependencies: estraverse: 5.3.0 - esquery@1.7.0: - dependencies: - estraverse: 5.3.0 - esrecurse@4.3.0: dependencies: estraverse: 5.3.0 - estraverse@4.3.0: {} - estraverse@5.3.0: {} estree-util-attach-comments@3.0.0: @@ -12182,8 +11104,6 @@ snapshots: '@types/estree-jsx': 1.0.5 '@types/unist': 3.0.3 - estree-walker@2.0.2: {} - estree-walker@3.0.3: dependencies: '@types/estree': 1.0.8 @@ -12194,8 +11114,6 @@ snapshots: eventemitter3@5.0.4: {} - events@3.3.0: {} - eventsource-parser@3.1.1: {} eventsource@3.0.7: @@ -12407,9 +11325,6 @@ snapshots: jsonfile: 6.2.1 universalify: 2.0.1 - fsevents@2.3.3: - optional: true - fumadocs-core@15.8.5(@types/react@19.2.2)(lucide-react@1.31.0(react@19.1.0))(next@15.5.18(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: '@formatjs/intl-localematcher': 0.6.2 @@ -12916,10 +11831,6 @@ snapshots: is-property@1.0.2: {} - is-reference@1.2.1: - dependencies: - '@types/estree': 1.0.8 - is-regex@1.2.1: dependencies: call-bound: 1.0.4 @@ -12994,12 +11905,6 @@ snapshots: has-symbols: 1.1.0 set-function-name: 2.0.2 - jest-worker@27.5.1: - dependencies: - '@types/node': 20.19.43 - merge-stream: 2.0.0 - supports-color: 8.1.1 - jiti@2.6.1: {} jiti@2.7.0: {} @@ -13378,8 +12283,6 @@ snapshots: merge2@1.4.1: {} - meriyah@6.1.4: {} - mermaid@11.16.1: dependencies: '@braintree/sanitize-url': 7.1.2 @@ -13707,14 +12610,6 @@ snapshots: minimist@1.2.8: {} - minimizer-webpack-plugin@5.6.1(webpack@5.109.2): - dependencies: - '@jridgewell/trace-mapping': 0.3.31 - jest-worker: 27.5.1 - schema-utils: 4.3.3 - terser: 5.50.0 - webpack: 5.109.2 - minipass@7.1.3: {} module-details-from-path@1.0.4: {} @@ -13765,8 +12660,6 @@ snapshots: negotiator@1.0.0: {} - neo-async@2.6.2: {} - neverthrow@7.2.0: {} next-themes@0.4.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0): @@ -13805,10 +12698,6 @@ snapshots: object.entries: 1.1.9 semver: 6.3.1 - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - node-releases@2.0.53: {} normalize-path@3.0.0: {} @@ -14157,8 +13046,6 @@ snapshots: process-nextick-args@2.0.1: {} - progress@2.0.3: {} - prompts@2.4.2: dependencies: kleur: 3.0.3 @@ -14257,8 +13144,6 @@ snapshots: forwarded: 0.2.0 ipaddr.js: 1.9.1 - proxy-from-env@1.1.0: {} - proxy-from-env@2.1.0: {} punycode@2.3.1: {} @@ -14677,38 +13562,6 @@ snapshots: robust-predicates@3.0.3: {} - rollup@4.62.4: - dependencies: - '@types/estree': 1.0.9 - optionalDependencies: - '@napi-rs/lzma-linux-x64-gnu': 1.5.1 - '@rollup/rollup-android-arm-eabi': 4.62.4 - '@rollup/rollup-android-arm64': 4.62.4 - '@rollup/rollup-darwin-arm64': 4.62.4 - '@rollup/rollup-darwin-x64': 4.62.4 - '@rollup/rollup-freebsd-arm64': 4.62.4 - '@rollup/rollup-freebsd-x64': 4.62.4 - '@rollup/rollup-linux-arm-gnueabihf': 4.62.4 - '@rollup/rollup-linux-arm-musleabihf': 4.62.4 - '@rollup/rollup-linux-arm64-gnu': 4.62.4 - '@rollup/rollup-linux-arm64-musl': 4.62.4 - '@rollup/rollup-linux-loong64-gnu': 4.62.4 - '@rollup/rollup-linux-loong64-musl': 4.62.4 - '@rollup/rollup-linux-ppc64-gnu': 4.62.4 - '@rollup/rollup-linux-ppc64-musl': 4.62.4 - '@rollup/rollup-linux-riscv64-gnu': 4.62.4 - '@rollup/rollup-linux-riscv64-musl': 4.62.4 - '@rollup/rollup-linux-s390x-gnu': 4.62.4 - '@rollup/rollup-linux-x64-gnu': 4.62.4 - '@rollup/rollup-linux-x64-musl': 4.62.4 - '@rollup/rollup-openbsd-x64': 4.62.4 - '@rollup/rollup-openharmony-arm64': 4.62.4 - '@rollup/rollup-win32-arm64-msvc': 4.62.4 - '@rollup/rollup-win32-ia32-msvc': 4.62.4 - '@rollup/rollup-win32-x64-gnu': 4.62.4 - '@rollup/rollup-win32-x64-msvc': 4.62.4 - fsevents: 2.3.3 - rope-sequence@1.3.4: {} rou3@0.9.2: {} @@ -14769,13 +13622,6 @@ snapshots: scheduler@0.26.0: {} - schema-utils@4.3.3: - dependencies: - '@types/json-schema': 7.0.15 - ajv: 8.20.0 - ajv-formats: 2.1.1(ajv@8.20.0) - ajv-keywords: 5.1.0(ajv@8.20.0) - scroll-into-view-if-needed@3.1.0: dependencies: compute-scroll-into-view: 3.1.1 @@ -14784,8 +13630,6 @@ snapshots: dependencies: parseley: 0.12.1 - semifies@1.0.0: {} - semver@6.3.1: {} semver@7.8.5: {} @@ -15028,11 +13872,6 @@ snapshots: source-map-js@1.2.1: {} - source-map-support@0.5.21: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - source-map@0.6.1: {} source-map@0.7.6: {} @@ -15045,10 +13884,6 @@ snapshots: stable-hash@0.0.5: {} - stacktrace-parser@0.1.11: - dependencies: - type-fest: 0.7.1 - standardwebhooks@1.0.0: dependencies: '@stablelib/base64': 1.0.1 @@ -15179,10 +14014,6 @@ snapshots: dependencies: has-flag: 4.0.0 - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 - supports-preserve-symlinks-flag@1.0.0: {} systeminformation@5.33.1: {} @@ -15195,13 +14026,6 @@ snapshots: tapable@2.3.3: {} - terser@5.50.0: - dependencies: - '@jridgewell/source-map': 0.3.11 - acorn: 8.18.0 - commander: 2.20.3 - source-map-support: 0.5.21 - tiny-invariant@1.3.3: {} tinyexec@1.3.0: {} @@ -15217,8 +14041,6 @@ snapshots: toidentifier@1.0.1: {} - tr46@0.0.3: {} - trim-lines@3.0.1: {} trough@2.2.0: {} @@ -15264,8 +14086,6 @@ snapshots: dependencies: prelude-ls: 1.2.1 - type-fest@0.7.1: {} - type-fest@5.8.0: dependencies: tagged-tag: 1.0.0 @@ -15482,55 +14302,6 @@ snapshots: w3c-keyname@2.2.8: {} - watchpack@2.5.2: - dependencies: - graceful-fs: 4.2.11 - - webidl-conversions@3.0.1: {} - - webpack-sources@3.5.1: {} - - webpack@5.109.2: - dependencies: - '@types/estree': 1.0.8 - '@types/json-schema': 7.0.15 - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/wasm-edit': 1.14.1 - '@webassemblyjs/wasm-parser': 1.14.1 - acorn: 8.18.0 - browserslist: 4.28.8 - chrome-trace-event: 1.0.4 - enhanced-resolve: 5.24.5 - es-module-lexer: 2.3.1 - eslint-scope: 5.1.1 - events: 3.3.0 - graceful-fs: 4.2.11 - mime-db: 1.54.0 - minimizer-webpack-plugin: 5.6.1(webpack@5.109.2) - neo-async: 2.6.2 - schema-utils: 4.3.3 - tapable: 2.3.3 - watchpack: 2.5.2 - webpack-sources: 3.5.1 - transitivePeerDependencies: - - '@minify-html/node' - - '@swc/core' - - '@swc/css' - - '@swc/html' - - clean-css - - cssnano - - csso - - esbuild - - html-minifier-terser - - lightningcss - - postcss - - uglify-js - - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - when-exit@2.1.5: {} which-boxed-primitive@1.1.1: