ui-syncup 0.3.13 → 0.4.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/skills/ai-spec-workflow/SKILL.md +58 -0
- package/.agents/skills/ai-spec-workflow/references/AI_SPECIFICATION_WORKFLOW.md +1434 -0
- package/.agents/skills/ai-spec-workflow/references/templates/design-template.md +729 -0
- package/.agents/skills/ai-spec-workflow/references/templates/requirements-template.md +179 -0
- package/.agents/skills/ai-spec-workflow/references/templates/tasks-template.md +501 -0
- package/.agents/skills/animation-designer/SKILL.md +688 -0
- package/.agents/skills/animation-designer/manifest.yaml +44 -0
- package/.agents/skills/brainstorming/SKILL.md +54 -0
- package/.agents/skills/contract-driven-ui/SKILL.md +270 -0
- package/.agents/skills/dispatching-parallel-agents/SKILL.md +180 -0
- package/.agents/skills/executing-plans/SKILL.md +76 -0
- package/.agents/skills/executing-specs/SKILL.md +53 -0
- package/.agents/skills/finishing-a-development-branch/SKILL.md +200 -0
- package/.agents/skills/github-workflow-automation/SKILL.md +846 -0
- package/.agents/skills/react-best-practices/AGENTS.md +2249 -0
- package/.agents/skills/react-best-practices/README.md +123 -0
- package/.agents/skills/react-best-practices/SKILL.md +121 -0
- package/.agents/skills/react-best-practices/metadata.json +15 -0
- package/.agents/skills/react-best-practices/rules/_sections.md +46 -0
- package/.agents/skills/react-best-practices/rules/_template.md +28 -0
- package/.agents/skills/react-best-practices/rules/advanced-event-handler-refs.md +55 -0
- package/.agents/skills/react-best-practices/rules/advanced-use-latest.md +49 -0
- package/.agents/skills/react-best-practices/rules/async-api-routes.md +38 -0
- package/.agents/skills/react-best-practices/rules/async-defer-await.md +80 -0
- package/.agents/skills/react-best-practices/rules/async-dependencies.md +36 -0
- package/.agents/skills/react-best-practices/rules/async-parallel.md +28 -0
- package/.agents/skills/react-best-practices/rules/async-suspense-boundaries.md +99 -0
- package/.agents/skills/react-best-practices/rules/bundle-barrel-imports.md +59 -0
- package/.agents/skills/react-best-practices/rules/bundle-conditional.md +31 -0
- package/.agents/skills/react-best-practices/rules/bundle-defer-third-party.md +49 -0
- package/.agents/skills/react-best-practices/rules/bundle-dynamic-imports.md +35 -0
- package/.agents/skills/react-best-practices/rules/bundle-preload.md +50 -0
- package/.agents/skills/react-best-practices/rules/client-event-listeners.md +74 -0
- package/.agents/skills/react-best-practices/rules/client-swr-dedup.md +56 -0
- package/.agents/skills/react-best-practices/rules/js-batch-dom-css.md +82 -0
- package/.agents/skills/react-best-practices/rules/js-cache-function-results.md +80 -0
- package/.agents/skills/react-best-practices/rules/js-cache-property-access.md +28 -0
- package/.agents/skills/react-best-practices/rules/js-cache-storage.md +70 -0
- package/.agents/skills/react-best-practices/rules/js-combine-iterations.md +32 -0
- package/.agents/skills/react-best-practices/rules/js-early-exit.md +50 -0
- package/.agents/skills/react-best-practices/rules/js-hoist-regexp.md +45 -0
- package/.agents/skills/react-best-practices/rules/js-index-maps.md +37 -0
- package/.agents/skills/react-best-practices/rules/js-length-check-first.md +49 -0
- package/.agents/skills/react-best-practices/rules/js-min-max-loop.md +82 -0
- package/.agents/skills/react-best-practices/rules/js-set-map-lookups.md +24 -0
- package/.agents/skills/react-best-practices/rules/js-tosorted-immutable.md +57 -0
- package/.agents/skills/react-best-practices/rules/rendering-activity.md +26 -0
- package/.agents/skills/react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
- package/.agents/skills/react-best-practices/rules/rendering-conditional-render.md +40 -0
- package/.agents/skills/react-best-practices/rules/rendering-content-visibility.md +38 -0
- package/.agents/skills/react-best-practices/rules/rendering-hoist-jsx.md +46 -0
- package/.agents/skills/react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
- package/.agents/skills/react-best-practices/rules/rendering-svg-precision.md +28 -0
- package/.agents/skills/react-best-practices/rules/rerender-defer-reads.md +39 -0
- package/.agents/skills/react-best-practices/rules/rerender-dependencies.md +45 -0
- package/.agents/skills/react-best-practices/rules/rerender-derived-state.md +29 -0
- package/.agents/skills/react-best-practices/rules/rerender-functional-setstate.md +74 -0
- package/.agents/skills/react-best-practices/rules/rerender-lazy-state-init.md +58 -0
- package/.agents/skills/react-best-practices/rules/rerender-memo.md +44 -0
- package/.agents/skills/react-best-practices/rules/rerender-transitions.md +40 -0
- package/.agents/skills/react-best-practices/rules/server-after-nonblocking.md +73 -0
- package/.agents/skills/react-best-practices/rules/server-cache-lru.md +41 -0
- package/.agents/skills/react-best-practices/rules/server-cache-react.md +26 -0
- package/.agents/skills/react-best-practices/rules/server-parallel-fetching.md +79 -0
- package/.agents/skills/react-best-practices/rules/server-serialization.md +38 -0
- package/.agents/skills/react-ui-patterns/SKILL.md +289 -0
- package/.agents/skills/receiving-code-review/SKILL.md +213 -0
- package/.agents/skills/requesting-code-review/SKILL.md +105 -0
- package/.agents/skills/requesting-code-review/code-reviewer.md +146 -0
- package/.agents/skills/reviewing-code/SKILL.md +28 -0
- package/.agents/skills/shadcn/SKILL.md +240 -0
- package/.agents/skills/shadcn/agents/openai.yml +5 -0
- package/.agents/skills/shadcn/assets/shadcn-small.png +0 -0
- package/.agents/skills/shadcn/assets/shadcn.png +0 -0
- package/.agents/skills/shadcn/cli.md +255 -0
- package/.agents/skills/shadcn/customization.md +202 -0
- package/.agents/skills/shadcn/evals/evals.json +47 -0
- package/.agents/skills/shadcn/mcp.md +94 -0
- package/.agents/skills/shadcn/rules/base-vs-radix.md +306 -0
- package/.agents/skills/shadcn/rules/composition.md +195 -0
- package/.agents/skills/shadcn/rules/forms.md +192 -0
- package/.agents/skills/shadcn/rules/icons.md +101 -0
- package/.agents/skills/shadcn/rules/styling.md +162 -0
- package/.agents/skills/steering-creation/SKILL.md +221 -0
- package/.agents/skills/steering-creation/references/STEERING_CREATION_INSTRUCTION.md +850 -0
- package/.agents/skills/subagent-driven-development/SKILL.md +240 -0
- package/.agents/skills/subagent-driven-development/code-quality-reviewer-prompt.md +20 -0
- package/.agents/skills/subagent-driven-development/implementer-prompt.md +78 -0
- package/.agents/skills/subagent-driven-development/spec-reviewer-prompt.md +61 -0
- package/.agents/skills/systematic-debugging/CREATION-LOG.md +119 -0
- package/.agents/skills/systematic-debugging/SKILL.md +296 -0
- package/.agents/skills/systematic-debugging/condition-based-waiting-example.ts +158 -0
- package/.agents/skills/systematic-debugging/condition-based-waiting.md +115 -0
- package/.agents/skills/systematic-debugging/defense-in-depth.md +122 -0
- package/.agents/skills/systematic-debugging/find-polluter.sh +63 -0
- package/.agents/skills/systematic-debugging/root-cause-tracing.md +169 -0
- package/.agents/skills/systematic-debugging/test-academic.md +14 -0
- package/.agents/skills/systematic-debugging/test-pressure-1.md +58 -0
- package/.agents/skills/systematic-debugging/test-pressure-2.md +68 -0
- package/.agents/skills/systematic-debugging/test-pressure-3.md +69 -0
- package/.agents/skills/test-driven-development/SKILL.md +371 -0
- package/.agents/skills/test-driven-development/testing-anti-patterns.md +299 -0
- package/.agents/skills/using-git-worktrees/SKILL.md +217 -0
- package/.agents/skills/using-superpowers/SKILL.md +87 -0
- package/.agents/skills/verification-before-completion/SKILL.md +139 -0
- package/.agents/skills/web-design-guidelines/SKILL.md +36 -0
- package/.agents/skills/writing-plans/SKILL.md +116 -0
- package/.agents/skills/writing-skills/SKILL.md +655 -0
- package/.agents/skills/writing-skills/anthropic-best-practices.md +1150 -0
- package/.agents/skills/writing-skills/examples/CLAUDE_MD_TESTING.md +189 -0
- package/.agents/skills/writing-skills/graphviz-conventions.dot +172 -0
- package/.agents/skills/writing-skills/persuasion-principles.md +187 -0
- package/.agents/skills/writing-skills/render-graphs.js +168 -0
- package/.agents/skills/writing-skills/testing-skills-with-subagents.md +384 -0
- package/.ai/steering/product.md +51 -0
- package/.ai/steering/structure.md +275 -0
- package/.ai/steering/tech.md +188 -0
- package/.claude/agents/database-architect.md +96 -0
- package/.claude/agents/deployment-pipeline-architect.md +122 -0
- package/.claude/agents/nextjs-expert.md +69 -0
- package/.claude/agents/ui-design-expert.md +106 -0
- package/.claudeignore +69 -0
- package/.dockerignore +8 -0
- package/.env.development +86 -0
- package/.env.example +171 -0
- package/.env.production +139 -0
- package/.env.test +58 -0
- package/.gitattributes +2 -0
- package/.github/ISSUE_TEMPLATE/bug_report.yml +33 -0
- package/.github/ISSUE_TEMPLATE/feature_request.yml +20 -0
- package/.github/PULL_REQUEST_TEMPLATE.md +23 -0
- package/.github/workflows/ci.yml +64 -0
- package/.github/workflows/release.yml +174 -0
- package/.nvmrc +1 -0
- package/.releaserc.json +18 -0
- package/.vercelignore +73 -0
- package/AGENTS.md +544 -0
- package/CHANGELOG.md +69 -0
- package/CODE_OF_CONDUCT.md +21 -0
- package/CONTRIBUTING.md +32 -0
- package/Dockerfile +84 -0
- package/LICENSE +21 -0
- package/README.md +328 -59
- package/SECURITY.md +16 -0
- package/bun.lock +3853 -0
- package/cli/README.md +94 -0
- package/cli/bun.lock +306 -0
- package/cli/index.ts +96 -0
- package/cli/package-lock.json +2157 -0
- package/cli/package.json +30 -0
- package/cli/src/commands/backup.ts +78 -0
- package/cli/src/commands/doctor.ts +82 -0
- package/cli/src/commands/init.ts +234 -0
- package/cli/src/commands/logs.ts +26 -0
- package/cli/src/commands/open.ts +23 -0
- package/cli/src/commands/remove.ts +44 -0
- package/cli/src/commands/restart.ts +21 -0
- package/cli/src/commands/restore.ts +90 -0
- package/cli/src/commands/start.ts +26 -0
- package/cli/src/commands/status.ts +25 -0
- package/cli/src/commands/stop.ts +20 -0
- package/cli/src/commands/upgrade.ts +28 -0
- package/cli/src/lib/docker.ts +40 -0
- package/cli/src/lib/env.ts +42 -0
- package/cli/src/lib/ui.ts +43 -0
- package/cli/tsconfig.json +13 -0
- package/cli/tsup.config.ts +12 -0
- package/components.json +24 -0
- package/docker/README.md +430 -0
- package/docker/compose.dev-minio.yml +30 -0
- package/docker/compose.dev.yml +39 -0
- package/docker/compose.local.yml +84 -0
- package/docker/compose.yml +153 -0
- package/docs/VERSIONING.md +101 -0
- package/docs/database/DRIZZLE_COMMANDS_EXPLAINED.md +1779 -0
- package/docs/database/DRIZZLE_ZOD_POSTGRESQL_INSTRUCTION.md +646 -0
- package/docs/database/MIGRATION_BEST_PRACTICES.md +601 -0
- package/docs/database/MIGRATION_ROLLBACK.md +1080 -0
- package/docs/database/MIGRATION_SYSTEM.md +165 -0
- package/docs/database/MIGRATION_TROUBLESHOOTING.md +881 -0
- package/docs/development/ENVIRONMENT_CONFIG.md +896 -0
- package/docs/development/LOCAL_DEVELOPMENT.md +456 -0
- package/docs/development/REMOTE_DATABASE_SETUP.md +786 -0
- package/docs/development/STORAGE_SETUP.md +207 -0
- package/docs/development/SUPABASE_LOCAL_SETUP.md +178 -0
- package/docs/development/TESTING.md +714 -0
- package/docs/feature-architectures/LOADING_ARCHITECTURE.md +343 -0
- package/docs/feature-architectures/NOTIFICATION_ARCHITECTURE.md +858 -0
- package/docs/feature-architectures/RATE_LIMIT_RESET.md +147 -0
- package/docs/feature-architectures/RBAC.md +1132 -0
- package/docs/feature-architectures/RESOURCE_LIMITS.md +69 -0
- package/docs/feature-architectures/SECURITY.md +284 -0
- package/docs/feature-architectures/WORKSPACES.md +278 -0
- package/docs/plans/admin-setup-wizard-routing-plan.md +623 -0
- package/drizzle/0000_purple_wilson_fisk.sql +360 -0
- package/drizzle/0001_drop_instance_public_url.sql +1 -0
- package/drizzle/meta/0000_snapshot.json +3118 -0
- package/drizzle/meta/_journal.json +20 -0
- package/drizzle.config.ts +13 -0
- package/eslint.config.mjs +44 -0
- package/install.sh +180 -0
- package/next.config.ts +91 -0
- package/package.json +128 -22
- package/playwright.config.ts +70 -0
- package/postcss.config.mjs +7 -0
- package/public/file.svg +1 -0
- package/public/globe.svg +1 -0
- package/public/logo.svg +11 -0
- package/public/next.svg +1 -0
- package/public/playground/CPM-101/as-is-image.jpg +0 -0
- package/public/playground/CPM-101/to-be-image.jpg +0 -0
- package/public/playground/TEST-1/LinkedIn-skeleton-screen.png +0 -0
- package/public/playground/TEST-1/https___dev-to-uploads.s3.amazonaws.com_uploads_articles_vuahe90ka1mkx9aepmea.webp +0 -0
- package/public/playground/TEST-1/linkedin_skeletonscreen.jpg +0 -0
- package/public/vercel.svg +1 -0
- package/public/window.svg +1 -0
- package/scripts/__tests__/migrate.integration.test.ts +642 -0
- package/scripts/__tests__/migrate.property.test.ts +1714 -0
- package/scripts/__tests__/migrate.test.ts +536 -0
- package/scripts/admin-reset-password.ts +114 -0
- package/scripts/check-email-queue.ts +99 -0
- package/scripts/check-sessions.ts +50 -0
- package/scripts/db-pull-data.sh +73 -0
- package/scripts/force-verify-email.sh +13 -0
- package/scripts/migrate.ts +693 -0
- package/scripts/process-email-queue.ts +26 -0
- package/scripts/reset-db.ts +47 -0
- package/scripts/reset-rate-limit.sh +26 -0
- package/scripts/reset-remote-db.sql +31 -0
- package/scripts/retry-failed-emails.ts +67 -0
- package/scripts/seed.ts +605 -0
- package/scripts/setup-monitoring.sh +440 -0
- package/scripts/sync-migration-tracking.ts +113 -0
- package/scripts/test-ci-error-handling.sh +237 -0
- package/scripts/test-ci-workflow.sh +200 -0
- package/scripts/test-migration.sh +151 -0
- package/scripts/validate-env.ts +25 -0
- package/scripts/validate-migration-system.ts +566 -0
- package/scripts/verify-ci-status-reporting.sh +206 -0
- package/scripts/verify-user-email.sql +22 -0
- package/scripts/verify-vercel-integration.ts +292 -0
- package/seed_data.md +54 -0
- package/src/app/(protected)/(team)/(routes)/[projectSlug]/error.tsx +89 -0
- package/src/app/(protected)/(team)/(routes)/[projectSlug]/loading.tsx +101 -0
- package/src/app/(protected)/(team)/(routes)/[projectSlug]/page.tsx +91 -0
- package/src/app/(protected)/(team)/(routes)/issue/[issueKey]/README.md +192 -0
- package/src/app/(protected)/(team)/(routes)/issue/[issueKey]/error.tsx +58 -0
- package/src/app/(protected)/(team)/(routes)/issue/[issueKey]/loading.tsx +14 -0
- package/src/app/(protected)/(team)/(routes)/issue/[issueKey]/not-found.tsx +47 -0
- package/src/app/(protected)/(team)/(routes)/issue/[issueKey]/page.tsx +91 -0
- package/src/app/(protected)/(team)/projects/page.tsx +16 -0
- package/src/app/(protected)/(team)/team/settings/(section)/instance/page.tsx +52 -0
- package/src/app/(protected)/(team)/team/settings/(section)/integrations/loading.tsx +5 -0
- package/src/app/(protected)/(team)/team/settings/(section)/integrations/page.tsx +23 -0
- package/src/app/(protected)/(team)/team/settings/(section)/members/loading.tsx +5 -0
- package/src/app/(protected)/(team)/team/settings/(section)/members/page.tsx +35 -0
- package/src/app/(protected)/(team)/team/settings/layout.tsx +72 -0
- package/src/app/(protected)/(team)/team/settings/loading.tsx +5 -0
- package/src/app/(protected)/(team)/team/settings/page.tsx +71 -0
- package/src/app/(protected)/dev/auth/README.md +151 -0
- package/src/app/(protected)/dev/auth/page.tsx +590 -0
- package/src/app/(protected)/layout.test.tsx +209 -0
- package/src/app/(protected)/layout.tsx +28 -0
- package/src/app/(protected)/onboarding/page.tsx +27 -0
- package/src/app/(protected)/settings/integrations/page.tsx +23 -0
- package/src/app/(protected)/settings/layout.tsx +26 -0
- package/src/app/(protected)/settings/notifications/page.tsx +26 -0
- package/src/app/(protected)/settings/other/page.tsx +23 -0
- package/src/app/(protected)/settings/page.tsx +23 -0
- package/src/app/(protected)/settings/preferences/page.tsx +23 -0
- package/src/app/(protected)/settings/security/page.tsx +37 -0
- package/src/app/(public)/forgot-password/page.tsx +20 -0
- package/src/app/(public)/invite/project/[token]/error.tsx +50 -0
- package/src/app/(public)/invite/project/[token]/loading.tsx +39 -0
- package/src/app/(public)/invite/project/[token]/page.tsx +156 -0
- package/src/app/(public)/layout.tsx +9 -0
- package/src/app/(public)/privacy-policy/page.tsx +12 -0
- package/src/app/(public)/reset-password/page.tsx +37 -0
- package/src/app/(public)/setup/__tests__/page.test.tsx +30 -0
- package/src/app/(public)/setup/page.tsx +17 -0
- package/src/app/(public)/share/issue/[token]/page.tsx +51 -0
- package/src/app/(public)/sign-in/page.tsx +55 -0
- package/src/app/(public)/sign-up/page.tsx +23 -0
- package/src/app/(public)/verify-email/page.tsx +22 -0
- package/src/app/(public)/verify-email-confirm/page.tsx +40 -0
- package/src/app/api/auth/[...all]/route.ts +6 -0
- package/src/app/api/auth/delete-account/route.ts +134 -0
- package/src/app/api/auth/dev/force-verify/route.ts +180 -0
- package/src/app/api/auth/dev/reset-rate-limit/route.ts +144 -0
- package/src/app/api/auth/dev/sessions/route.ts +172 -0
- package/src/app/api/auth/forgot-password/__tests__/forgot-password.property.test.ts +397 -0
- package/src/app/api/auth/forgot-password/route.ts +277 -0
- package/src/app/api/auth/logout/route.ts +115 -0
- package/src/app/api/auth/me/route.ts +123 -0
- package/src/app/api/auth/providers/__tests__/route.test.ts +236 -0
- package/src/app/api/auth/providers/route.ts +119 -0
- package/src/app/api/auth/resend-verification/route.ts +262 -0
- package/src/app/api/auth/reset-password/__tests__/reset-password.property.test.ts +493 -0
- package/src/app/api/auth/reset-password/__tests__/route.test.ts +284 -0
- package/src/app/api/auth/reset-password/route.ts +251 -0
- package/src/app/api/auth/verify-email/route.ts +232 -0
- package/src/app/api/example-cors/route.ts +61 -0
- package/src/app/api/health/route.ts +14 -0
- package/src/app/api/invite/project/[token]/__tests__/accept-invitation.integration.test.ts +348 -0
- package/src/app/api/invite/project/[token]/decline/route.ts +99 -0
- package/src/app/api/invite/project/[token]/route.ts +269 -0
- package/src/app/api/issues/[issueId]/activities/route.ts +213 -0
- package/src/app/api/issues/[issueId]/attachments/[attachmentId]/annotations/[annotationId]/comments/[commentId]/route.ts +486 -0
- package/src/app/api/issues/[issueId]/attachments/[attachmentId]/annotations/[annotationId]/comments/route.ts +283 -0
- package/src/app/api/issues/[issueId]/attachments/[attachmentId]/annotations/[annotationId]/read/route.ts +242 -0
- package/src/app/api/issues/[issueId]/attachments/[attachmentId]/annotations/[annotationId]/route.ts +534 -0
- package/src/app/api/issues/[issueId]/attachments/[attachmentId]/annotations/route.ts +514 -0
- package/src/app/api/issues/[issueId]/attachments/[attachmentId]/route.ts +161 -0
- package/src/app/api/issues/[issueId]/attachments/route.ts +376 -0
- package/src/app/api/issues/[issueId]/route.ts +516 -0
- package/src/app/api/notifications/[id]/read/route.ts +131 -0
- package/src/app/api/notifications/__tests__/notifications.integration.test.ts +350 -0
- package/src/app/api/notifications/read-all/route.ts +72 -0
- package/src/app/api/notifications/route.ts +148 -0
- package/src/app/api/notifications/unread-count/route.ts +77 -0
- package/src/app/api/projects/[id]/activities/route.ts +174 -0
- package/src/app/api/projects/[id]/invitations/[invitationId]/resend/route.ts +99 -0
- package/src/app/api/projects/[id]/invitations/[invitationId]/route.ts +96 -0
- package/src/app/api/projects/[id]/invitations/route.ts +254 -0
- package/src/app/api/projects/[id]/issues/route.ts +452 -0
- package/src/app/api/projects/[id]/join/route.ts +207 -0
- package/src/app/api/projects/[id]/members/[memberId]/route.ts +364 -0
- package/src/app/api/projects/[id]/members/me/route.ts +121 -0
- package/src/app/api/projects/[id]/members/route.ts +129 -0
- package/src/app/api/projects/[id]/route.ts +476 -0
- package/src/app/api/projects/route.ts +394 -0
- package/src/app/api/setup/admin/route.ts +255 -0
- package/src/app/api/setup/complete/__tests__/route.test.ts +60 -0
- package/src/app/api/setup/complete/route.ts +244 -0
- package/src/app/api/setup/config/route.ts +195 -0
- package/src/app/api/setup/export/route.ts +111 -0
- package/src/app/api/setup/health/route.ts +74 -0
- package/src/app/api/setup/import/route.ts +154 -0
- package/src/app/api/setup/status/route.ts +82 -0
- package/src/app/api/setup/workspace/route.ts +252 -0
- package/src/app/api/teams/[teamId]/export/route.ts +115 -0
- package/src/app/api/teams/[teamId]/invitations/[invitationId]/resend/route.ts +132 -0
- package/src/app/api/teams/[teamId]/invitations/[invitationId]/route.ts +117 -0
- package/src/app/api/teams/[teamId]/invitations/route.ts +363 -0
- package/src/app/api/teams/[teamId]/members/[userId]/route.ts +335 -0
- package/src/app/api/teams/[teamId]/members/route.ts +184 -0
- package/src/app/api/teams/[teamId]/members/search/route.ts +202 -0
- package/src/app/api/teams/[teamId]/route.ts +423 -0
- package/src/app/api/teams/[teamId]/switch/route.ts +140 -0
- package/src/app/api/teams/[teamId]/transfer-ownership/route.ts +212 -0
- package/src/app/api/teams/invitations/[token]/accept/route.ts +140 -0
- package/src/app/api/teams/invitations/by-id/[id]/accept/route.ts +98 -0
- package/src/app/api/teams/invitations/by-id/[id]/decline/route.ts +90 -0
- package/src/app/api/teams/route.ts +278 -0
- package/src/app/api/uploads/media/route.ts +118 -0
- package/src/app/api/uploads/presigned/route.ts +49 -0
- package/src/app/api/user/linked-accounts/route.ts +35 -0
- package/src/app/email-preview/page.tsx +11 -0
- package/src/app/favicon.ico +0 -0
- package/src/app/global-error.tsx +21 -0
- package/src/app/layout.tsx +50 -0
- package/src/app/page.tsx +5 -0
- package/src/components/icons/atlassian-icon.tsx +22 -0
- package/src/components/icons/index.ts +1 -0
- package/src/components/layout/SIDEBAR_LAYOUT_BEST_PRACTICES.md +240 -0
- package/src/components/layout/app-shell-header-store.tsx +20 -0
- package/src/components/layout/app-shell-skeleton.tsx +89 -0
- package/src/components/layout/app-shell-wrapper.tsx +32 -0
- package/src/components/layout/app-shell.test.tsx +155 -0
- package/src/components/layout/app-shell.tsx +100 -0
- package/src/components/shared/headers/app-header-configurator.tsx +42 -0
- package/src/components/shared/headers/app-header.tsx +103 -0
- package/src/components/shared/headers/header-user-menu.tsx +247 -0
- package/src/components/shared/headers/index.ts +44 -0
- package/src/components/shared/headers/page-header.tsx +25 -0
- package/src/components/shared/notifications/__tests__/notification-bell.test.tsx +159 -0
- package/src/components/shared/notifications/__tests__/notification-dropdown.test.tsx +296 -0
- package/src/components/shared/notifications/__tests__/notification-item.test.tsx +328 -0
- package/src/components/shared/notifications/index.ts +45 -0
- package/src/components/shared/notifications/notification-actions.tsx +295 -0
- package/src/components/shared/notifications/notification-bell-button.tsx +77 -0
- package/src/components/shared/notifications/notification-dropdown.tsx +160 -0
- package/src/components/shared/notifications/notification-group-item.tsx +268 -0
- package/src/components/shared/notifications/notification-item.tsx +193 -0
- package/src/components/shared/notifications/notification-load-more.tsx +50 -0
- package/src/components/shared/notifications/notification-panel.tsx +49 -0
- package/src/components/shared/notifications/utils.tsx +127 -0
- package/src/components/shared/permission-guard/index.ts +1 -0
- package/src/components/shared/permission-guard/permission-tooltip.tsx +45 -0
- package/src/components/shared/relative-time.tsx +53 -0
- package/src/components/shared/section-container.tsx +32 -0
- package/src/components/shared/service-status-banner.tsx +121 -0
- package/src/components/shared/settings-sidebar/index.ts +2 -0
- package/src/components/shared/settings-sidebar/team-setting-aside.tsx +97 -0
- package/src/components/shared/settings-sidebar/user-settings-aside.tsx +66 -0
- package/src/components/shared/sidebar/app-sidebar.tsx +146 -0
- package/src/components/shared/sidebar/index.ts +36 -0
- package/src/components/shared/sidebar/sidebar-main.tsx +81 -0
- package/src/components/shared/sidebar/sidebar-project.tsx +61 -0
- package/src/components/shared/sidebar/sidebar-team-avatar.tsx +126 -0
- package/src/components/shared/sidebar/sidebar-team-switcher.tsx +185 -0
- package/src/components/shared/sidebar/type.ts +97 -0
- package/src/components/ui/alert-dialog.tsx +157 -0
- package/src/components/ui/alert.tsx +66 -0
- package/src/components/ui/avatar-upload.tsx +147 -0
- package/src/components/ui/avatar.tsx +53 -0
- package/src/components/ui/badge.tsx +46 -0
- package/src/components/ui/breadcrumb.tsx +109 -0
- package/src/components/ui/button.tsx +60 -0
- package/src/components/ui/card.tsx +92 -0
- package/src/components/ui/checkbox.tsx +32 -0
- package/src/components/ui/collapsible.tsx +33 -0
- package/src/components/ui/command.tsx +184 -0
- package/src/components/ui/dialog.tsx +143 -0
- package/src/components/ui/dropdown-menu.tsx +257 -0
- package/src/components/ui/empty.tsx +104 -0
- package/src/components/ui/field.tsx +244 -0
- package/src/components/ui/image-cropper-dialog.tsx +167 -0
- package/src/components/ui/input.tsx +21 -0
- package/src/components/ui/label.tsx +24 -0
- package/src/components/ui/optimized-image.tsx +220 -0
- package/src/components/ui/pagination.tsx +127 -0
- package/src/components/ui/popover.tsx +48 -0
- package/src/components/ui/progress.tsx +31 -0
- package/src/components/ui/radio-group.tsx +45 -0
- package/src/components/ui/scroll-area.tsx +58 -0
- package/src/components/ui/select.tsx +187 -0
- package/src/components/ui/separator.tsx +28 -0
- package/src/components/ui/sheet.tsx +139 -0
- package/src/components/ui/sidebar.tsx +733 -0
- package/src/components/ui/skeleton.tsx +13 -0
- package/src/components/ui/sonner.tsx +40 -0
- package/src/components/ui/spinner.tsx +16 -0
- package/src/components/ui/switch.tsx +31 -0
- package/src/components/ui/table.tsx +116 -0
- package/src/components/ui/tabs.tsx +66 -0
- package/src/components/ui/textarea.tsx +23 -0
- package/src/components/ui/tooltip.tsx +61 -0
- package/src/config/__tests__/workspace.property.test.ts +40 -0
- package/src/config/auth.ts +62 -0
- package/src/config/integrations.ts +126 -0
- package/src/config/quotas.ts +20 -0
- package/src/config/roles.ts +463 -0
- package/src/config/settings-nav.ts +39 -0
- package/src/config/team-settings-nav.ts +37 -0
- package/src/config/user-settings-nav.ts +42 -0
- package/src/config/version.ts +1 -0
- package/src/config/workspace.ts +64 -0
- package/src/features/annotations/README.md +283 -0
- package/src/features/annotations/api/annotations-api.ts +194 -0
- package/src/features/annotations/api/comments-api.ts +147 -0
- package/src/features/annotations/api/index.ts +71 -0
- package/src/features/annotations/api/save-annotation.ts +150 -0
- package/src/features/annotations/api/schemas.ts +142 -0
- package/src/features/annotations/components/annotated-attachment-view.tsx +576 -0
- package/src/features/annotations/components/annotation-action-sheet.tsx +140 -0
- package/src/features/annotations/components/annotation-annotations-panel.tsx +213 -0
- package/src/features/annotations/components/annotation-box.tsx +539 -0
- package/src/features/annotations/components/annotation-canvas.tsx +534 -0
- package/src/features/annotations/components/annotation-comment-input.tsx +145 -0
- package/src/features/annotations/components/annotation-context-menu.tsx +164 -0
- package/src/features/annotations/components/annotation-drawer.tsx +231 -0
- package/src/features/annotations/components/annotation-layer.tsx +271 -0
- package/src/features/annotations/components/annotation-pin.tsx +318 -0
- package/src/features/annotations/components/annotation-popover.tsx +562 -0
- package/src/features/annotations/components/annotation-thread-panel.tsx +485 -0
- package/src/features/annotations/components/annotation-thread-preview.tsx +195 -0
- package/src/features/annotations/components/annotation-toolbar.tsx +244 -0
- package/src/features/annotations/components/keyboard-shortcuts-modal.tsx +79 -0
- package/src/features/annotations/docs/ANNOTATIONS_ARCHITECTURE.md +67 -0
- package/src/features/annotations/docs/ANNOTATION_SAVE_ARCHITECTURE.md +422 -0
- package/src/features/annotations/docs/ANNOTATION_SAVE_FEATURE.md +408 -0
- package/src/features/annotations/docs/BOX_ANNOTATION_GUIDE.md +542 -0
- package/src/features/annotations/docs/NEXTSTEP.md +28 -0
- package/src/features/annotations/docs/STALE_CLOSURE_FIX.md +344 -0
- package/src/features/annotations/docs/UNDO_REDO_QUICK_START.md +545 -0
- package/src/features/annotations/docs/local_first_canvas_autosave_architecture.md +674 -0
- package/src/features/annotations/examples/complete-example.tsx +266 -0
- package/src/features/annotations/examples/save-annotation-example.tsx +309 -0
- package/src/features/annotations/hooks/__tests__/use-annotation-permissions.property.test.tsx +493 -0
- package/src/features/annotations/hooks/index.ts +36 -0
- package/src/features/annotations/hooks/use-annotation-batch-save.ts +109 -0
- package/src/features/annotations/hooks/use-annotation-comments.ts +353 -0
- package/src/features/annotations/hooks/use-annotation-drafts.ts +137 -0
- package/src/features/annotations/hooks/use-annotation-edit-state.ts +99 -0
- package/src/features/annotations/hooks/use-annotation-history-tracker.ts +159 -0
- package/src/features/annotations/hooks/use-annotation-integration.ts +916 -0
- package/src/features/annotations/hooks/use-annotation-permissions.ts +210 -0
- package/src/features/annotations/hooks/use-annotation-popover.ts +175 -0
- package/src/features/annotations/hooks/use-annotation-save.ts +208 -0
- package/src/features/annotations/hooks/use-annotation-tools.ts +237 -0
- package/src/features/annotations/hooks/use-annotations-with-history.ts +332 -0
- package/src/features/annotations/hooks/use-auto-save.ts +94 -0
- package/src/features/annotations/index.ts +111 -0
- package/src/features/annotations/types/annotation.ts +201 -0
- package/src/features/annotations/types/index.ts +28 -0
- package/src/features/annotations/utils/history-manager.ts +73 -0
- package/src/features/annotations/utils/index.ts +2 -0
- package/src/features/annotations/utils/map-attachments-to-threads.ts +28 -0
- package/src/features/annotations/utils/position-comment-input.ts +136 -0
- package/src/features/annotations/utils/re-sequence-labels.ts +92 -0
- package/src/features/annotations/utils/validate-annotation-label.ts +120 -0
- package/src/features/auth/api/types.ts +101 -0
- package/src/features/auth/components/__tests__/role-gate.test.tsx +448 -0
- package/src/features/auth/components/__tests__/social-login-buttons.test.tsx +313 -0
- package/src/features/auth/components/auth-card.tsx +36 -0
- package/src/features/auth/components/forgot-password-form.tsx +115 -0
- package/src/features/auth/components/index.ts +14 -0
- package/src/features/auth/components/invite-code-input.tsx +155 -0
- package/src/features/auth/components/invited-user-form.tsx +309 -0
- package/src/features/auth/components/onboarding-form.tsx +195 -0
- package/src/features/auth/components/password-strength-indicator.tsx +113 -0
- package/src/features/auth/components/reset-password-form.tsx +138 -0
- package/src/features/auth/components/role-gate.tsx +124 -0
- package/src/features/auth/components/self-registration-choice.tsx +153 -0
- package/src/features/auth/components/sign-in-form.tsx +159 -0
- package/src/features/auth/components/sign-up-form.tsx +158 -0
- package/src/features/auth/components/social-login-buttons.tsx +219 -0
- package/src/features/auth/hooks/__tests__/use-onboarding.test.tsx +109 -0
- package/src/features/auth/hooks/__tests__/use-session.test.tsx +160 -0
- package/src/features/auth/hooks/index.ts +15 -0
- package/src/features/auth/hooks/use-accept-invitation.ts +194 -0
- package/src/features/auth/hooks/use-delete-account.ts +86 -0
- package/src/features/auth/hooks/use-force-verify.ts +89 -0
- package/src/features/auth/hooks/use-forgot-password.ts +144 -0
- package/src/features/auth/hooks/use-link-account.ts +78 -0
- package/src/features/auth/hooks/use-linked-accounts.ts +88 -0
- package/src/features/auth/hooks/use-onboarding.ts +159 -0
- package/src/features/auth/hooks/use-resend-verification.ts +139 -0
- package/src/features/auth/hooks/use-reset-password.ts +151 -0
- package/src/features/auth/hooks/use-reset-rate-limit.ts +56 -0
- package/src/features/auth/hooks/use-self-registration.ts +202 -0
- package/src/features/auth/hooks/use-session.ts +81 -0
- package/src/features/auth/hooks/use-sessions.ts +59 -0
- package/src/features/auth/hooks/use-sign-in.ts +234 -0
- package/src/features/auth/hooks/use-sign-out.ts +88 -0
- package/src/features/auth/hooks/use-sign-up.ts +194 -0
- package/src/features/auth/hooks/use-unlink-account.ts +100 -0
- package/src/features/auth/hooks/use-verify-email-token.ts +125 -0
- package/src/features/auth/index.ts +75 -0
- package/src/features/auth/screens/forgot-password-screen.tsx +33 -0
- package/src/features/auth/screens/index.ts +7 -0
- package/src/features/auth/screens/onboarding-screen.tsx +49 -0
- package/src/features/auth/screens/reset-password-screen.tsx +33 -0
- package/src/features/auth/screens/sign-in-screen.tsx +61 -0
- package/src/features/auth/screens/sign-up-screen.tsx +37 -0
- package/src/features/auth/screens/verify-email-confirm-screen.tsx +286 -0
- package/src/features/auth/screens/verify-email-screen.tsx +146 -0
- package/src/features/auth/types/index.ts +14 -0
- package/src/features/auth/utils/__tests__/validators.test.ts +331 -0
- package/src/features/auth/utils/password-strength.ts +129 -0
- package/src/features/auth/utils/validators.ts +124 -0
- package/src/features/email-preview/actions/render-email.ts +21 -0
- package/src/features/email-preview/screens/email-preview-screen.tsx +81 -0
- package/src/features/folder-scaffold-template/index.ts +0 -0
- package/src/features/instance-settings/components/index.ts +6 -0
- package/src/features/instance-settings/components/instance-settings-form.tsx +180 -0
- package/src/features/instance-settings/components/instance-status-display.tsx +158 -0
- package/src/features/instance-settings/index.ts +7 -0
- package/src/features/instance-settings/screens/index.ts +5 -0
- package/src/features/instance-settings/screens/instance-settings-screen.tsx +59 -0
- package/src/features/issues/README.md +330 -0
- package/src/features/issues/api/create-issue.ts +19 -0
- package/src/features/issues/api/delete-issue.ts +27 -0
- package/src/features/issues/api/get-issue-activities.ts +58 -0
- package/src/features/issues/api/get-issue-details.ts +25 -0
- package/src/features/issues/api/get-project-issues-server.ts +44 -0
- package/src/features/issues/api/get-project-issues.ts +21 -0
- package/src/features/issues/api/index.ts +44 -0
- package/src/features/issues/api/update-issue.ts +31 -0
- package/src/features/issues/api/upload-attachment.ts +81 -0
- package/src/features/issues/components/activity-timeline.tsx +440 -0
- package/src/features/issues/components/canvas-state-indicator.tsx +90 -0
- package/src/features/issues/components/centered-canvas-view.tsx +739 -0
- package/src/features/issues/components/image-selector.tsx +123 -0
- package/src/features/issues/components/image-upload-zone.tsx +262 -0
- package/src/features/issues/components/infinite-canvas-background.tsx +163 -0
- package/src/features/issues/components/inline-editable-select.tsx +173 -0
- package/src/features/issues/components/inline-editable-text.tsx +225 -0
- package/src/features/issues/components/inline-editable-textarea.tsx +219 -0
- package/src/features/issues/components/inline-editable-user-select.tsx +202 -0
- package/src/features/issues/components/issue-deletion-dialog.tsx +142 -0
- package/src/features/issues/components/issue-details-panel.tsx +101 -0
- package/src/features/issues/components/issues-create-dialog.tsx +578 -0
- package/src/features/issues/components/issues-list-filter.tsx +312 -0
- package/src/features/issues/components/issues-list.tsx +151 -0
- package/src/features/issues/components/issues-priority-badge.tsx +77 -0
- package/src/features/issues/components/issues-status-badge.tsx +100 -0
- package/src/features/issues/components/metadata-section.tsx +389 -0
- package/src/features/issues/components/optimized-attachment-view.tsx +528 -0
- package/src/features/issues/components/optimized-image.tsx +257 -0
- package/src/features/issues/components/panel-header.tsx +186 -0
- package/src/features/issues/components/preload.ts +31 -0
- package/src/features/issues/components/priority-selector.tsx +101 -0
- package/src/features/issues/components/responsive-issue-layout-skeleton.tsx +139 -0
- package/src/features/issues/components/responsive-issue-layout.tsx +617 -0
- package/src/features/issues/components/status-selector.tsx +320 -0
- package/src/features/issues/components/type-selector.tsx +102 -0
- package/src/features/issues/components/upload-progress-overlay.tsx +35 -0
- package/src/features/issues/components/uploaded-image-preview.tsx +173 -0
- package/src/features/issues/components/workflow-control.tsx +318 -0
- package/src/features/issues/components/zoom-controls.tsx +150 -0
- package/src/features/issues/config/index.ts +47 -0
- package/src/features/issues/config/options.ts +323 -0
- package/src/features/issues/config/workflow.ts +102 -0
- package/src/features/issues/docs/ARCHITECTURE_DIAGRAM.md +321 -0
- package/src/features/issues/docs/BACKEND_ARCHITECTURE.md +194 -0
- package/src/features/issues/docs/IMAGE_COMPONENTS_ARCHITECTURE.md +363 -0
- package/src/features/issues/docs/IMAGE_COMPONENTS_IMPORTS.md +412 -0
- package/src/features/issues/docs/IMPLEMENTATION_CHECKLIST.md +210 -0
- package/src/features/issues/docs/ROUTE_SETUP_COMPLETE.md +242 -0
- package/src/features/issues/hooks/index.ts +78 -0
- package/src/features/issues/hooks/use-canvas-transform.ts +255 -0
- package/src/features/issues/hooks/use-create-issue.ts +28 -0
- package/src/features/issues/hooks/use-elastic-scroll.ts +296 -0
- package/src/features/issues/hooks/use-issue-activities.ts +71 -0
- package/src/features/issues/hooks/use-issue-delete.ts +84 -0
- package/src/features/issues/hooks/use-issue-details.ts +70 -0
- package/src/features/issues/hooks/use-issue-filters.ts +50 -0
- package/src/features/issues/hooks/use-issue-update.ts +93 -0
- package/src/features/issues/hooks/use-keyboard-shortcuts.ts +104 -0
- package/src/features/issues/hooks/use-optimized-image.ts +228 -0
- package/src/features/issues/hooks/use-project-issues.ts +14 -0
- package/src/features/issues/index.ts +65 -0
- package/src/features/issues/screens/issue-details-screen.tsx +207 -0
- package/src/features/issues/screens/issue-details-skeletons.tsx +295 -0
- package/src/features/issues/screens/issue-share-screen.tsx +56 -0
- package/src/features/issues/types/index.ts +48 -0
- package/src/features/issues/types/issue.ts +291 -0
- package/src/features/issues/utils/filter-issues.ts +141 -0
- package/src/features/issues/utils/index.ts +14 -0
- package/src/features/legal/index.ts +1 -0
- package/src/features/legal/screens/privacy-policy-screen.tsx +307 -0
- package/src/features/notifications/api/get-notifications.ts +58 -0
- package/src/features/notifications/api/get-unread-count.ts +37 -0
- package/src/features/notifications/api/index.ts +35 -0
- package/src/features/notifications/api/mark-all-as-read.ts +37 -0
- package/src/features/notifications/api/mark-as-read.ts +41 -0
- package/src/features/notifications/api/types.ts +109 -0
- package/src/features/notifications/hooks/__tests__/use-notification-subscription.test.ts +206 -0
- package/src/features/notifications/hooks/index.ts +28 -0
- package/src/features/notifications/hooks/use-mark-all-as-read.ts +106 -0
- package/src/features/notifications/hooks/use-mark-as-read.ts +106 -0
- package/src/features/notifications/hooks/use-notification-subscription.ts +244 -0
- package/src/features/notifications/hooks/use-notification-toast.ts +161 -0
- package/src/features/notifications/hooks/use-notifications.ts +80 -0
- package/src/features/notifications/hooks/use-unread-count.ts +60 -0
- package/src/features/notifications/index.ts +48 -0
- package/src/features/notifications/utils/group-notifications.ts +152 -0
- package/src/features/notifications/utils/index.ts +9 -0
- package/src/features/projects/api/create-invitation.ts +45 -0
- package/src/features/projects/api/create-project.ts +64 -0
- package/src/features/projects/api/delete-project.ts +50 -0
- package/src/features/projects/api/get-project-activities.ts +43 -0
- package/src/features/projects/api/get-project-members.ts +53 -0
- package/src/features/projects/api/get-project.ts +49 -0
- package/src/features/projects/api/get-projects.ts +61 -0
- package/src/features/projects/api/index.ts +27 -0
- package/src/features/projects/api/join-project.ts +52 -0
- package/src/features/projects/api/leave-project.ts +51 -0
- package/src/features/projects/api/list-invitations.ts +36 -0
- package/src/features/projects/api/remove-member.ts +60 -0
- package/src/features/projects/api/resend-invitation.ts +36 -0
- package/src/features/projects/api/revoke-invitation.ts +36 -0
- package/src/features/projects/api/types.ts +286 -0
- package/src/features/projects/api/update-member-role.ts +70 -0
- package/src/features/projects/api/update-project.ts +69 -0
- package/src/features/projects/components/__tests__/project-detail-activity-feed.test.tsx +106 -0
- package/src/features/projects/components/__tests__/project-invitation-dialog.test.tsx +211 -0
- package/src/features/projects/components/__tests__/project-member-manager-dialog.test.tsx +254 -0
- package/src/features/projects/components/index.ts +21 -0
- package/src/features/projects/components/project-actions.tsx +248 -0
- package/src/features/projects/components/project-create-dialog.tsx +410 -0
- package/src/features/projects/components/project-detail-activity-feed.tsx +206 -0
- package/src/features/projects/components/project-detail-header.tsx +103 -0
- package/src/features/projects/components/project-detail-overview.tsx +128 -0
- package/src/features/projects/components/project-icon-selector.test.tsx +49 -0
- package/src/features/projects/components/project-icon-selector.tsx +76 -0
- package/src/features/projects/components/project-invitation-dialog.tsx +368 -0
- package/src/features/projects/components/project-issues.tsx +128 -0
- package/src/features/projects/components/project-leave-button.tsx +69 -0
- package/src/features/projects/components/project-list-card.tsx +246 -0
- package/src/features/projects/components/project-list-filters.tsx +320 -0
- package/src/features/projects/components/project-member-manager-dialog.tsx +419 -0
- package/src/features/projects/components/project-settings-dialog.tsx +204 -0
- package/src/features/projects/components/project-stats.tsx +46 -0
- package/src/features/projects/components/project-title-section.tsx +78 -0
- package/src/features/projects/config/icons.ts +91 -0
- package/src/features/projects/hooks/index.ts +28 -0
- package/src/features/projects/hooks/use-create-invitation.ts +83 -0
- package/src/features/projects/hooks/use-create-project.ts +77 -0
- package/src/features/projects/hooks/use-delete-project.ts +84 -0
- package/src/features/projects/hooks/use-join-project.ts +43 -0
- package/src/features/projects/hooks/use-leave-project.ts +84 -0
- package/src/features/projects/hooks/use-project-activities.ts +39 -0
- package/src/features/projects/hooks/use-project-filters.ts +86 -0
- package/src/features/projects/hooks/use-project-invitations.ts +66 -0
- package/src/features/projects/hooks/use-project-members.ts +57 -0
- package/src/features/projects/hooks/use-project.ts +67 -0
- package/src/features/projects/hooks/use-projects.ts +49 -0
- package/src/features/projects/hooks/use-recent-projects.ts +58 -0
- package/src/features/projects/hooks/use-remove-member.ts +89 -0
- package/src/features/projects/hooks/use-resend-invitation.ts +68 -0
- package/src/features/projects/hooks/use-revoke-invitation.ts +71 -0
- package/src/features/projects/hooks/use-team-member-suggestions.ts +133 -0
- package/src/features/projects/hooks/use-update-member-role.ts +92 -0
- package/src/features/projects/hooks/use-update-project.ts +88 -0
- package/src/features/projects/index.ts +91 -0
- package/src/features/projects/screens/index.ts +3 -0
- package/src/features/projects/screens/invitation-acceptance-screen.tsx +320 -0
- package/src/features/projects/screens/project-detail-screen-wrapper.tsx +47 -0
- package/src/features/projects/screens/project-detail-screen.tsx +661 -0
- package/src/features/projects/screens/projects-list-screen.tsx +161 -0
- package/src/features/projects/types/index.ts +59 -0
- package/src/features/projects/utils/format-helpers.ts +16 -0
- package/src/features/projects/utils/index.ts +2 -0
- package/src/features/projects/utils/role-helpers.ts +25 -0
- package/src/features/setup/api/complete-setup.ts +21 -0
- package/src/features/setup/api/create-admin.ts +21 -0
- package/src/features/setup/api/create-first-workspace.ts +21 -0
- package/src/features/setup/api/get-instance-status.ts +12 -0
- package/src/features/setup/api/get-service-health.ts +12 -0
- package/src/features/setup/api/index.ts +44 -0
- package/src/features/setup/api/save-instance-config.ts +21 -0
- package/src/features/setup/api/types.ts +122 -0
- package/src/features/setup/components/__tests__/setup-wizard-ui.test.tsx +362 -0
- package/src/features/setup/components/admin-account-step.tsx +205 -0
- package/src/features/setup/components/first-workspace-step.tsx +120 -0
- package/src/features/setup/components/index.ts +9 -0
- package/src/features/setup/components/instance-config-step.tsx +107 -0
- package/src/features/setup/components/mail-config-step.tsx +205 -0
- package/src/features/setup/components/sample-data-step.tsx +131 -0
- package/src/features/setup/components/service-health-step.tsx +180 -0
- package/src/features/setup/components/service-status-badge.tsx +50 -0
- package/src/features/setup/components/setup-progress.tsx +103 -0
- package/src/features/setup/components/setup-wizard.tsx +169 -0
- package/src/features/setup/hooks/index.ts +12 -0
- package/src/features/setup/hooks/use-complete-setup.ts +23 -0
- package/src/features/setup/hooks/use-create-admin.ts +25 -0
- package/src/features/setup/hooks/use-create-first-workspace.ts +24 -0
- package/src/features/setup/hooks/use-instance-status.ts +21 -0
- package/src/features/setup/hooks/use-save-instance-config.ts +23 -0
- package/src/features/setup/hooks/use-service-health.ts +21 -0
- package/src/features/setup/hooks/use-setup-wizard.ts +152 -0
- package/src/features/setup/hooks/use-workspace-mode.ts +19 -0
- package/src/features/setup/index.ts +30 -0
- package/src/features/setup/screens/index.ts +1 -0
- package/src/features/setup/screens/setup-screen.tsx +40 -0
- package/src/features/setup/types/index.ts +69 -0
- package/src/features/setup/utils/index.ts +78 -0
- package/src/features/team-settings/components/index.ts +39 -0
- package/src/features/team-settings/components/loading-states.tsx +296 -0
- package/src/features/team-settings/components/permission-guard.tsx +23 -0
- package/src/features/team-settings/components/settings-card.tsx +22 -0
- package/src/features/team-settings/components/settings-context-provider.tsx +51 -0
- package/src/features/team-settings/components/settings-error-boundary.tsx +366 -0
- package/src/features/team-settings/components/settings-navigation.tsx +87 -0
- package/src/features/team-settings/components/settings-section.tsx +23 -0
- package/src/features/team-settings/components/team-danger-zone.tsx +275 -0
- package/src/features/team-settings/components/team-information-form.tsx +116 -0
- package/src/features/team-settings/components/team-invitations-list.tsx +463 -0
- package/src/features/team-settings/components/team-members-list.tsx +342 -0
- package/src/features/team-settings/components/team-permission-guard.tsx +56 -0
- package/src/features/team-settings/components/team-setting-integrations.tsx +27 -0
- package/src/features/team-settings/components/team-setting-member.tsx +28 -0
- package/src/features/team-settings/components/team-settings-general.tsx +131 -0
- package/src/features/team-settings/components/transfer-ownership-modal.tsx +164 -0
- package/src/features/team-settings/components/unauthorized-access.tsx +52 -0
- package/src/features/team-settings/hooks/__tests__/use-team-settings.test.tsx +139 -0
- package/src/features/team-settings/hooks/index.ts +1 -0
- package/src/features/team-settings/hooks/use-team-settings.ts +148 -0
- package/src/features/team-settings/hooks/use-transfer-ownership.ts +45 -0
- package/src/features/team-settings/index.ts +25 -0
- package/src/features/team-settings/screens/index.ts +1 -0
- package/src/features/team-settings/screens/team-settings-screen.tsx +33 -0
- package/src/features/team-settings/types/index.ts +78 -0
- package/src/features/team-settings/utils/index.ts +6 -0
- package/src/features/team-settings/utils/mock-data.ts +40 -0
- package/src/features/teams/api/cancel-invitation.ts +25 -0
- package/src/features/teams/api/create-invitation.ts +28 -0
- package/src/features/teams/api/create-team.ts +14 -0
- package/src/features/teams/api/delete-team.ts +19 -0
- package/src/features/teams/api/get-invitations.ts +25 -0
- package/src/features/teams/api/get-team-members.ts +25 -0
- package/src/features/teams/api/get-team.ts +13 -0
- package/src/features/teams/api/get-teams.ts +19 -0
- package/src/features/teams/api/index.ts +49 -0
- package/src/features/teams/api/leave-team.ts +22 -0
- package/src/features/teams/api/remove-member.ts +25 -0
- package/src/features/teams/api/resend-invitation.ts +26 -0
- package/src/features/teams/api/switch-team.ts +13 -0
- package/src/features/teams/api/types.ts +122 -0
- package/src/features/teams/api/update-member-roles.ts +28 -0
- package/src/features/teams/api/update-team.ts +17 -0
- package/src/features/teams/components/create-team-dialog.tsx +105 -0
- package/src/features/teams/hooks/__tests__/cache-invalidation.property.test.tsx +268 -0
- package/src/features/teams/hooks/index.ts +35 -0
- package/src/features/teams/hooks/use-can-manage-members.ts +21 -0
- package/src/features/teams/hooks/use-can-manage-team.ts +21 -0
- package/src/features/teams/hooks/use-cancel-invitation.ts +52 -0
- package/src/features/teams/hooks/use-create-invitation.ts +59 -0
- package/src/features/teams/hooks/use-create-team.ts +38 -0
- package/src/features/teams/hooks/use-delete-team.ts +43 -0
- package/src/features/teams/hooks/use-invitations.ts +31 -0
- package/src/features/teams/hooks/use-leave-team.ts +43 -0
- package/src/features/teams/hooks/use-remove-member.ts +58 -0
- package/src/features/teams/hooks/use-resend-invitation.ts +52 -0
- package/src/features/teams/hooks/use-switch-team.ts +41 -0
- package/src/features/teams/hooks/use-team-members.ts +31 -0
- package/src/features/teams/hooks/use-team-permissions.ts +102 -0
- package/src/features/teams/hooks/use-team.ts +30 -0
- package/src/features/teams/hooks/use-teams.ts +26 -0
- package/src/features/teams/hooks/use-update-member-roles.ts +64 -0
- package/src/features/teams/hooks/use-update-team.ts +47 -0
- package/src/features/teams/index.ts +111 -0
- package/src/features/user-settings/actions/set-password.ts +63 -0
- package/src/features/user-settings/api/index.ts +16 -0
- package/src/features/user-settings/components/__tests__/security-settings.test.tsx +125 -0
- package/src/features/user-settings/components/delete-account-dialog.tsx +185 -0
- package/src/features/user-settings/components/index.ts +13 -0
- package/src/features/user-settings/components/integrations-list.tsx +152 -0
- package/src/features/user-settings/components/notification-preferences.tsx +112 -0
- package/src/features/user-settings/components/other-settings.tsx +126 -0
- package/src/features/user-settings/components/password-section.tsx +297 -0
- package/src/features/user-settings/components/security-settings.tsx +184 -0
- package/src/features/user-settings/components/user-preferences.tsx +146 -0
- package/src/features/user-settings/hooks/index.ts +8 -0
- package/src/features/user-settings/hooks/use-notification-preferences.ts +65 -0
- package/src/features/user-settings/hooks/use-user-preferences.ts +52 -0
- package/src/features/user-settings/index.ts +22 -0
- package/src/features/user-settings/screens/index.ts +11 -0
- package/src/features/user-settings/screens/integrations-screen.tsx +24 -0
- package/src/features/user-settings/screens/notifications-screen.tsx +29 -0
- package/src/features/user-settings/screens/other-settings-screen.tsx +24 -0
- package/src/features/user-settings/screens/setting-preferences-screen.tsx +24 -0
- package/src/features/user-settings/screens/user-settings-screen.tsx +23 -0
- package/src/features/user-settings/types/index.ts +42 -0
- package/src/features/user-settings/utils/index.ts +8 -0
- package/src/hooks/use-long-press.ts +196 -0
- package/src/hooks/use-media-upload.ts +95 -0
- package/src/hooks/use-mobile.ts +19 -0
- package/src/hooks/use-team.ts +32 -0
- package/src/instrumentation.ts +14 -0
- package/src/lib/__tests__/auth-config.test.ts +166 -0
- package/src/lib/__tests__/config.test.ts +42 -0
- package/src/lib/__tests__/db.test.ts +101 -0
- package/src/lib/__tests__/env.property.test.ts +197 -0
- package/src/lib/__tests__/env.test.ts +177 -0
- package/src/lib/__tests__/health-check.test.ts +87 -0
- package/src/lib/__tests__/oauth-errors.test.ts +184 -0
- package/src/lib/__tests__/oauth-redirect.test.ts +224 -0
- package/src/lib/__tests__/oauth-scopes.test.ts +268 -0
- package/src/lib/__tests__/storage.test.ts +58 -0
- package/src/lib/__tests__/url-validator.test.ts +232 -0
- package/src/lib/api-client.ts +93 -0
- package/src/lib/auth-client.ts +5 -0
- package/src/lib/auth-config.ts +146 -0
- package/src/lib/auth.ts +209 -0
- package/src/lib/config.ts +228 -0
- package/src/lib/cors.ts +96 -0
- package/src/lib/date.ts +16 -0
- package/src/lib/db.ts +88 -0
- package/src/lib/env.ts +489 -0
- package/src/lib/feedback.ts +29 -0
- package/src/lib/health-check.ts +229 -0
- package/src/lib/logger.ts +204 -0
- package/src/lib/oauth-errors.ts +138 -0
- package/src/lib/performance.ts +367 -0
- package/src/lib/query-server.ts +35 -0
- package/src/lib/query.tsx +43 -0
- package/src/lib/resend.ts +36 -0
- package/src/lib/security-headers.ts +165 -0
- package/src/lib/setup-status.ts +34 -0
- package/src/lib/storage.ts +150 -0
- package/src/lib/supabase-client.ts +58 -0
- package/src/lib/testing/test-db.ts +75 -0
- package/src/lib/url-validator.ts +168 -0
- package/src/lib/utils.ts +6 -0
- package/src/mocks/README.md +42 -0
- package/src/mocks/activity.fixtures.ts +281 -0
- package/src/mocks/annotation.fixtures.ts +325 -0
- package/src/mocks/attachment.fixtures.ts +80 -0
- package/src/mocks/email.fixtures.ts +61 -0
- package/src/mocks/index.ts +33 -0
- package/src/mocks/issue.fixtures.ts +364 -0
- package/src/mocks/landing.fixtures.ts +118 -0
- package/src/mocks/notification.fixtures.ts +111 -0
- package/src/mocks/project-activity.fixtures.ts +69 -0
- package/src/mocks/project-invitation.fixtures.ts +95 -0
- package/src/mocks/project-member.fixtures.ts +93 -0
- package/src/mocks/project.fixtures.ts +249 -0
- package/src/mocks/settings.fixtures.ts +56 -0
- package/src/mocks/share.fixtures.ts +48 -0
- package/src/mocks/team-member.fixtures.ts +147 -0
- package/src/mocks/team.fixtures.ts +35 -0
- package/src/mocks/user-settings.fixtures.ts +77 -0
- package/src/mocks/user.fixtures.ts +21 -0
- package/src/providers/theme-provider.tsx +11 -0
- package/src/proxy/__tests__/proxy-setup-gate.test.ts +43 -0
- package/src/proxy.ts +169 -0
- package/src/server/annotations/__tests__/annotation-limit.property.test.ts +291 -0
- package/src/server/annotations/__tests__/attachment-deletion-cascade.property.test.ts +385 -0
- package/src/server/annotations/__tests__/comment-delete-authorization.property.test.ts +419 -0
- package/src/server/annotations/__tests__/sanitize.property.test.ts +302 -0
- package/src/server/annotations/annotation-service.ts +305 -0
- package/src/server/annotations/comment-service.ts +288 -0
- package/src/server/annotations/index.ts +61 -0
- package/src/server/annotations/permission-utils.ts +125 -0
- package/src/server/annotations/sanitize.ts +134 -0
- package/src/server/annotations/types.ts +161 -0
- package/src/server/audit/audit-service.ts +85 -0
- package/src/server/audit/index.ts +11 -0
- package/src/server/audit/types.ts +75 -0
- package/src/server/auth/__tests__/README.md +368 -0
- package/src/server/auth/__tests__/account-linking.integration.test.ts +410 -0
- package/src/server/auth/__tests__/auth-integration.test.ts +811 -0
- package/src/server/auth/__tests__/cookies.test.ts +337 -0
- package/src/server/auth/__tests__/login.property.test.ts +428 -0
- package/src/server/auth/__tests__/oauth-integration.test.ts +555 -0
- package/src/server/auth/__tests__/password.test.ts +194 -0
- package/src/server/auth/__tests__/rate-limiter.test.ts +450 -0
- package/src/server/auth/__tests__/rbac.test.ts +474 -0
- package/src/server/auth/__tests__/session.test.ts +599 -0
- package/src/server/auth/__tests__/signup.property.test.ts +224 -0
- package/src/server/auth/__tests__/token-encryption.test.ts +171 -0
- package/src/server/auth/__tests__/tokens.test.ts +476 -0
- package/src/server/auth/__tests__/verify-email.property.test.ts +372 -0
- package/src/server/auth/cookies.ts +184 -0
- package/src/server/auth/password.ts +94 -0
- package/src/server/auth/rate-limiter.ts +257 -0
- package/src/server/auth/rbac.ts +1168 -0
- package/src/server/auth/session.ts +392 -0
- package/src/server/auth/token-encryption.ts +201 -0
- package/src/server/auth/tokens.ts +397 -0
- package/src/server/db/schema/account.ts +21 -0
- package/src/server/db/schema/annotation-read-status.ts +57 -0
- package/src/server/db/schema/better-auth-verifications.ts +27 -0
- package/src/server/db/schema/email-jobs.ts +24 -0
- package/src/server/db/schema/index.ts +20 -0
- package/src/server/db/schema/instance-settings.ts +42 -0
- package/src/server/db/schema/issue-activities.ts +97 -0
- package/src/server/db/schema/issue-attachments.ts +101 -0
- package/src/server/db/schema/issues.ts +139 -0
- package/src/server/db/schema/notifications.ts +119 -0
- package/src/server/db/schema/project-activities.ts +116 -0
- package/src/server/db/schema/project-invitations.ts +34 -0
- package/src/server/db/schema/project-members.ts +29 -0
- package/src/server/db/schema/projects.ts +46 -0
- package/src/server/db/schema/sessions.ts +17 -0
- package/src/server/db/schema/team-invitations.ts +22 -0
- package/src/server/db/schema/team-members.ts +18 -0
- package/src/server/db/schema/teams.ts +15 -0
- package/src/server/db/schema/user-roles.ts +14 -0
- package/src/server/db/schema/users.ts +17 -0
- package/src/server/db/schema/verification-tokens.ts +15 -0
- package/src/server/email/README.md +258 -0
- package/src/server/email/__tests__/client.property.test.ts +218 -0
- package/src/server/email/__tests__/payload.property.test.ts +205 -0
- package/src/server/email/__tests__/queue.test.ts +407 -0
- package/src/server/email/__tests__/render-template.test.tsx +172 -0
- package/src/server/email/client.ts +70 -0
- package/src/server/email/index.ts +20 -0
- package/src/server/email/providers/console-provider.ts +43 -0
- package/src/server/email/providers/index.ts +5 -0
- package/src/server/email/providers/resend-provider.ts +59 -0
- package/src/server/email/providers/smtp-provider.ts +65 -0
- package/src/server/email/queue.ts +365 -0
- package/src/server/email/render-template.tsx +117 -0
- package/src/server/email/templates/layout.tsx +66 -0
- package/src/server/email/templates/ownership-transfer-email.tsx +75 -0
- package/src/server/email/templates/password-reset-email.tsx +72 -0
- package/src/server/email/templates/project-invitation-email.tsx +70 -0
- package/src/server/email/templates/security-alert-email.tsx +161 -0
- package/src/server/email/templates/team-invitation-email.tsx +68 -0
- package/src/server/email/templates/verification-email.tsx +61 -0
- package/src/server/email/templates/welcome-email.tsx +60 -0
- package/src/server/email/worker.ts +182 -0
- package/src/server/issues/activity-service.ts +422 -0
- package/src/server/issues/attachment-service.ts +379 -0
- package/src/server/issues/index.ts +68 -0
- package/src/server/issues/issue-service.ts +569 -0
- package/src/server/issues/types.ts +233 -0
- package/src/server/notifications/__tests__/notification-service.integration.test.ts +405 -0
- package/src/server/notifications/index.ts +13 -0
- package/src/server/notifications/notification-service.ts +526 -0
- package/src/server/notifications/types.ts +234 -0
- package/src/server/projects/__tests__/activity-logging.integration.test.ts +319 -0
- package/src/server/projects/__tests__/invitation-email.integration.test.ts +258 -0
- package/src/server/projects/__tests__/invitation-service.integration.test.ts +651 -0
- package/src/server/projects/__tests__/member-service.property.test.ts +397 -0
- package/src/server/projects/__tests__/project-service.property.test.ts +116 -0
- package/src/server/projects/activity-service.ts +548 -0
- package/src/server/projects/index.ts +11 -0
- package/src/server/projects/invitation-service.ts +773 -0
- package/src/server/projects/member-service.ts +458 -0
- package/src/server/projects/project-service.ts +491 -0
- package/src/server/projects/schemas.ts +310 -0
- package/src/server/projects/types.ts +166 -0
- package/src/server/projects/utils.ts +128 -0
- package/src/server/setup/__tests__/health-check.property.test.ts +70 -0
- package/src/server/setup/__tests__/sample-data.property.test.ts +82 -0
- package/src/server/setup/__tests__/setup.property.test.ts +95 -0
- package/src/server/setup/health-check-service.ts +294 -0
- package/src/server/setup/index.ts +35 -0
- package/src/server/setup/sample-data-service.ts +233 -0
- package/src/server/setup/setup-service.ts +229 -0
- package/src/server/setup/types.ts +96 -0
- package/src/server/teams/__tests__/export.property.test.ts +542 -0
- package/src/server/teams/__tests__/get-members.integration.test.ts +105 -0
- package/src/server/teams/__tests__/invitation-flow.integration.test.ts +402 -0
- package/src/server/teams/__tests__/invitations.property.test.ts +235 -0
- package/src/server/teams/__tests__/member-management-flow.integration.test.ts +306 -0
- package/src/server/teams/__tests__/members.property.test.ts +180 -0
- package/src/server/teams/__tests__/ownership-transfer.property.test.ts +173 -0
- package/src/server/teams/__tests__/resource-limits.property.test.ts +382 -0
- package/src/server/teams/__tests__/team-context-management.integration.test.ts +396 -0
- package/src/server/teams/__tests__/team-context.property.test.ts +854 -0
- package/src/server/teams/__tests__/team-creation-flow.integration.test.ts +310 -0
- package/src/server/teams/__tests__/team-creation.property.test.ts +280 -0
- package/src/server/teams/errors.ts +396 -0
- package/src/server/teams/export-service.ts +383 -0
- package/src/server/teams/index.ts +10 -0
- package/src/server/teams/invitation-service.ts +708 -0
- package/src/server/teams/member-service.ts +334 -0
- package/src/server/teams/resource-limits.ts +211 -0
- package/src/server/teams/slug.ts +58 -0
- package/src/server/teams/team-context.ts +648 -0
- package/src/server/teams/team-service.ts +660 -0
- package/src/server/teams/types.ts +81 -0
- package/src/server/teams/validation.ts +209 -0
- package/src/styles/globals.css +160 -0
- package/src/types/deployment.ts +39 -0
- package/supabase/config.toml +357 -0
- package/supabase/seed.sql +480 -0
- package/tests/e2e/.gitkeep +0 -0
- package/tests/e2e/QUICK_START.md +98 -0
- package/tests/e2e/README.md +301 -0
- package/tests/e2e/auth.spec.ts +583 -0
- package/tests/e2e/global-setup.ts +23 -0
- package/tests/e2e/global-teardown.ts +23 -0
- package/tests/e2e/helpers/auth-helpers.ts +310 -0
- package/tests/e2e/helpers/test-fixtures.ts +286 -0
- package/tests/e2e/smoke-test.spec.ts +330 -0
- package/tsconfig.json +48 -0
- package/vitest.config.ts +50 -0
- package/vitest.setup.ts +56 -0
- package/dist/index.js +0 -778
|
@@ -0,0 +1,786 @@
|
|
|
1
|
+
# Remote Database Setup Guide
|
|
2
|
+
|
|
3
|
+
This guide explains how to initialize and manage the database schema on remote Supabase instances (develop, staging, production).
|
|
4
|
+
|
|
5
|
+
## Table of Contents
|
|
6
|
+
|
|
7
|
+
- [Prerequisites](#prerequisites)
|
|
8
|
+
- [Quick Start](#quick-start)
|
|
9
|
+
- [Deployment Methods](#deployment-methods)
|
|
10
|
+
- [Method 1: Drizzle Kit (Recommended)](#method-1-drizzle-kit-recommended)
|
|
11
|
+
- [Method 2: Supabase CLI](#method-2-supabase-cli)
|
|
12
|
+
- [Method 3: Direct SQL Execution](#method-3-direct-sql-execution)
|
|
13
|
+
- [CI/CD Integration](#cicd-integration)
|
|
14
|
+
- [Vercel Deployment](#vercel-deployment)
|
|
15
|
+
- [Safety Guidelines](#safety-guidelines)
|
|
16
|
+
- [Troubleshooting](#troubleshooting)
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## Prerequisites
|
|
21
|
+
|
|
22
|
+
Before deploying database schema to remote Supabase:
|
|
23
|
+
|
|
24
|
+
- [ ] Remote Supabase project created (develop/staging/production)
|
|
25
|
+
- [ ] Database connection strings obtained from Supabase Dashboard
|
|
26
|
+
- [ ] Local migrations tested and working (`bun run db:migrate` on local)
|
|
27
|
+
- [ ] Database backup verified (Supabase provides automatic backups)
|
|
28
|
+
- [ ] Access credentials secured (never commit to Git)
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## Quick Start
|
|
33
|
+
|
|
34
|
+
**TL;DR - Deploy schema to remote database in 3 steps:**
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
# 1. Get your remote database URL from Supabase Dashboard
|
|
38
|
+
# Settings → Database → Connection string (Direct connection)
|
|
39
|
+
|
|
40
|
+
# 2. Set environment variable
|
|
41
|
+
export DIRECT_URL="postgresql://postgres:[PASSWORD]@db.[PROJECT-REF].supabase.co:5432/postgres"
|
|
42
|
+
|
|
43
|
+
# 3. Run migrations
|
|
44
|
+
bun run db:migrate
|
|
45
|
+
|
|
46
|
+
# 4. Verify tables were created
|
|
47
|
+
psql "$DIRECT_URL" -c "\dt"
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## Deployment Methods
|
|
53
|
+
|
|
54
|
+
### Method 1: Drizzle Kit (Recommended)
|
|
55
|
+
|
|
56
|
+
This is the cleanest approach since the project uses Drizzle ORM for schema management.
|
|
57
|
+
|
|
58
|
+
#### Step 1: Obtain Remote Database Credentials
|
|
59
|
+
|
|
60
|
+
1. Go to [Supabase Dashboard](https://supabase.com/dashboard)
|
|
61
|
+
2. Select your project (develop/staging/production)
|
|
62
|
+
3. Navigate to **Settings** → **Database**
|
|
63
|
+
4. Scroll to **Connection string** section
|
|
64
|
+
5. Copy both connection strings:
|
|
65
|
+
- **Transaction mode** (pooled) → `DATABASE_URL`
|
|
66
|
+
- **Session mode** (direct) → `DIRECT_URL`
|
|
67
|
+
|
|
68
|
+
**Example connection strings:**
|
|
69
|
+
```bash
|
|
70
|
+
# Pooled connection (for application runtime)
|
|
71
|
+
DATABASE_URL="postgresql://postgres.[PROJECT-REF]:[PASSWORD]@aws-0-us-west-1.pooler.supabase.com:5432/postgres"
|
|
72
|
+
|
|
73
|
+
# Direct connection (for migrations)
|
|
74
|
+
DIRECT_URL="postgresql://postgres:[PASSWORD]@db.[PROJECT-REF].supabase.co:5432/postgres"
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
#### Step 2: Configure Environment Variables
|
|
78
|
+
|
|
79
|
+
**Option A: Create environment-specific file**
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
# Create .env.develop (for develop environment)
|
|
83
|
+
cat > .env.develop << EOF
|
|
84
|
+
DATABASE_URL="postgresql://postgres.[PROJECT-REF]:[PASSWORD]@aws-0-us-west-1.pooler.supabase.com:5432/postgres"
|
|
85
|
+
DIRECT_URL="postgresql://postgres:[PASSWORD]@db.[PROJECT-REF].supabase.co:5432/postgres"
|
|
86
|
+
EOF
|
|
87
|
+
|
|
88
|
+
# Or .env.production (for production environment)
|
|
89
|
+
cat > .env.production << EOF
|
|
90
|
+
DATABASE_URL="your-production-pooled-url"
|
|
91
|
+
DIRECT_URL="your-production-direct-url"
|
|
92
|
+
EOF
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
**Option B: Export environment variables**
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
# For develop environment
|
|
99
|
+
export DATABASE_URL="your-develop-pooled-url"
|
|
100
|
+
export DIRECT_URL="your-develop-direct-url"
|
|
101
|
+
|
|
102
|
+
# For production environment
|
|
103
|
+
export DATABASE_URL="your-production-pooled-url"
|
|
104
|
+
export DIRECT_URL="your-production-direct-url"
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
#### Step 3: Run Migrations
|
|
108
|
+
|
|
109
|
+
**Using environment file:**
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
# Load environment variables from file
|
|
113
|
+
export $(cat .env.develop | xargs)
|
|
114
|
+
|
|
115
|
+
# Run migrations
|
|
116
|
+
bun run db:migrate
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
**Using inline environment variables:**
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
# Run migrations with explicit connection string
|
|
123
|
+
DATABASE_URL="your-remote-url" DIRECT_URL="your-direct-url" bun run db:migrate
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
**Using Drizzle Kit directly:**
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
# Run migrations with custom config
|
|
130
|
+
drizzle-kit migrate --config=drizzle.config.ts
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
#### Step 4: Verify Schema Deployment
|
|
134
|
+
|
|
135
|
+
**Check tables via psql:**
|
|
136
|
+
|
|
137
|
+
```bash
|
|
138
|
+
# List all tables
|
|
139
|
+
psql "$DIRECT_URL" -c "\dt"
|
|
140
|
+
|
|
141
|
+
# Check specific table structure
|
|
142
|
+
psql "$DIRECT_URL" -c "\d users"
|
|
143
|
+
|
|
144
|
+
# Verify migration history
|
|
145
|
+
psql "$DIRECT_URL" -c "SELECT * FROM drizzle.__drizzle_migrations ORDER BY created_at;"
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
**Check via Supabase Dashboard:**
|
|
149
|
+
|
|
150
|
+
1. Go to **Table Editor** in Supabase Dashboard
|
|
151
|
+
2. Verify all tables are present
|
|
152
|
+
3. Check table structures match your schema
|
|
153
|
+
|
|
154
|
+
**Check via Drizzle Studio:**
|
|
155
|
+
|
|
156
|
+
```bash
|
|
157
|
+
# Open Drizzle Studio connected to remote database
|
|
158
|
+
DATABASE_URL="your-remote-url" bun run db:studio
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
---
|
|
162
|
+
|
|
163
|
+
### Method 2: Supabase CLI
|
|
164
|
+
|
|
165
|
+
Use Supabase's native migration system for tighter integration with Supabase features.
|
|
166
|
+
|
|
167
|
+
#### Step 1: Install and Login to Supabase CLI
|
|
168
|
+
|
|
169
|
+
```bash
|
|
170
|
+
# Install Supabase CLI (if not already installed)
|
|
171
|
+
npm install -g supabase
|
|
172
|
+
|
|
173
|
+
# Or use npx (no installation required)
|
|
174
|
+
npx supabase --version
|
|
175
|
+
|
|
176
|
+
# Login to Supabase
|
|
177
|
+
npx supabase login
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
#### Step 2: Link Local Project to Remote
|
|
181
|
+
|
|
182
|
+
```bash
|
|
183
|
+
# Link to your remote Supabase project
|
|
184
|
+
npx supabase link --project-ref [YOUR-PROJECT-REF]
|
|
185
|
+
|
|
186
|
+
# Find your project ref in the Supabase Dashboard URL:
|
|
187
|
+
# https://supabase.com/dashboard/project/[PROJECT-REF]
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
**Example:**
|
|
191
|
+
```bash
|
|
192
|
+
npx supabase link --project-ref abcdefghijklmnop
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
#### Step 3: Convert Drizzle Migrations to Supabase Format
|
|
196
|
+
|
|
197
|
+
Supabase expects migrations in `supabase/migrations/` directory with timestamp-based naming.
|
|
198
|
+
|
|
199
|
+
```bash
|
|
200
|
+
# Create Supabase migrations directory (if not exists)
|
|
201
|
+
mkdir -p supabase/migrations
|
|
202
|
+
|
|
203
|
+
# Copy Drizzle migrations with proper naming
|
|
204
|
+
# Format: YYYYMMDDHHMMSS_description.sql
|
|
205
|
+
cp drizzle/0000_strange_reaper.sql supabase/migrations/20240101000000_initial_schema.sql
|
|
206
|
+
cp drizzle/0001_wonderful_triathlon.sql supabase/migrations/20240102000000_update_schema.sql
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
**Or use a script to automate conversion:**
|
|
210
|
+
|
|
211
|
+
```bash
|
|
212
|
+
# Create conversion script
|
|
213
|
+
cat > scripts/convert-migrations.sh << 'EOF'
|
|
214
|
+
#!/bin/bash
|
|
215
|
+
mkdir -p supabase/migrations
|
|
216
|
+
counter=0
|
|
217
|
+
for file in drizzle/*.sql; do
|
|
218
|
+
timestamp=$(date -u -d "+$counter days" +"%Y%m%d%H%M%S")
|
|
219
|
+
filename=$(basename "$file" .sql)
|
|
220
|
+
cp "$file" "supabase/migrations/${timestamp}_${filename}.sql"
|
|
221
|
+
counter=$((counter + 1))
|
|
222
|
+
done
|
|
223
|
+
echo "✅ Migrations converted to Supabase format"
|
|
224
|
+
EOF
|
|
225
|
+
|
|
226
|
+
chmod +x scripts/convert-migrations.sh
|
|
227
|
+
./scripts/convert-migrations.sh
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
#### Step 4: Push Migrations to Remote
|
|
231
|
+
|
|
232
|
+
```bash
|
|
233
|
+
# Push all migrations to the remote database
|
|
234
|
+
npx supabase db push
|
|
235
|
+
|
|
236
|
+
# Or push to specific environment
|
|
237
|
+
npx supabase db push --db-url "your-direct-connection-string"
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
#### Step 5: Verify Deployment
|
|
241
|
+
|
|
242
|
+
```bash
|
|
243
|
+
# Check remote database status
|
|
244
|
+
npx supabase db remote status
|
|
245
|
+
|
|
246
|
+
# List applied migrations
|
|
247
|
+
npx supabase migration list --remote
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
---
|
|
251
|
+
|
|
252
|
+
### Method 3: Direct SQL Execution
|
|
253
|
+
|
|
254
|
+
Quick one-time setup for manual deployment or emergency fixes.
|
|
255
|
+
|
|
256
|
+
#### Step 1: Combine Migration Files
|
|
257
|
+
|
|
258
|
+
```bash
|
|
259
|
+
# Combine all Drizzle migrations into a single file
|
|
260
|
+
cat drizzle/0000_strange_reaper.sql drizzle/0001_wonderful_triathlon.sql > combined_migration.sql
|
|
261
|
+
|
|
262
|
+
# Review the combined file before executing
|
|
263
|
+
cat combined_migration.sql
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
#### Step 2: Execute via Supabase Dashboard (GUI Method)
|
|
267
|
+
|
|
268
|
+
1. Go to [Supabase Dashboard](https://supabase.com/dashboard)
|
|
269
|
+
2. Select your project
|
|
270
|
+
3. Navigate to **SQL Editor**
|
|
271
|
+
4. Click **New query**
|
|
272
|
+
5. Paste the contents of `combined_migration.sql`
|
|
273
|
+
6. Click **Run** or press `Cmd/Ctrl + Enter`
|
|
274
|
+
7. Verify success message
|
|
275
|
+
|
|
276
|
+
#### Step 3: Execute via Command Line (CLI Method)
|
|
277
|
+
|
|
278
|
+
```bash
|
|
279
|
+
# Execute SQL file directly
|
|
280
|
+
psql "$DIRECT_URL" < combined_migration.sql
|
|
281
|
+
|
|
282
|
+
# Or execute with verbose output
|
|
283
|
+
psql "$DIRECT_URL" -f combined_migration.sql -v ON_ERROR_STOP=1
|
|
284
|
+
|
|
285
|
+
# Or execute inline SQL
|
|
286
|
+
psql "$DIRECT_URL" -c "$(cat combined_migration.sql)"
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
#### Step 4: Verify Execution
|
|
290
|
+
|
|
291
|
+
```bash
|
|
292
|
+
# Check if tables were created
|
|
293
|
+
psql "$DIRECT_URL" -c "\dt"
|
|
294
|
+
|
|
295
|
+
# Check table counts
|
|
296
|
+
psql "$DIRECT_URL" -c "SELECT schemaname, tablename FROM pg_tables WHERE schemaname = 'public';"
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
---
|
|
300
|
+
|
|
301
|
+
## CI/CD Integration
|
|
302
|
+
|
|
303
|
+
Automate database migrations in your deployment pipeline.
|
|
304
|
+
|
|
305
|
+
### Create Migration Script
|
|
306
|
+
|
|
307
|
+
Create `scripts/migrate-remote.ts`:
|
|
308
|
+
|
|
309
|
+
```typescript
|
|
310
|
+
import { drizzle } from 'drizzle-orm/postgres-js';
|
|
311
|
+
import { migrate } from 'drizzle-orm/postgres-js/migrator';
|
|
312
|
+
import postgres from 'postgres';
|
|
313
|
+
|
|
314
|
+
async function runMigrations() {
|
|
315
|
+
const connectionString = process.env.DIRECT_URL || process.env.DATABASE_URL;
|
|
316
|
+
|
|
317
|
+
if (!connectionString) {
|
|
318
|
+
throw new Error('DATABASE_URL or DIRECT_URL must be set');
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
console.log('🔄 Running migrations against remote database...');
|
|
322
|
+
console.log(`📍 Target: ${connectionString.split('@')[1]?.split('/')[0] || 'unknown'}`);
|
|
323
|
+
|
|
324
|
+
const sql = postgres(connectionString, { max: 1 });
|
|
325
|
+
const db = drizzle(sql);
|
|
326
|
+
|
|
327
|
+
try {
|
|
328
|
+
await migrate(db, { migrationsFolder: './drizzle' });
|
|
329
|
+
console.log('✅ Migrations completed successfully');
|
|
330
|
+
} catch (error) {
|
|
331
|
+
console.error('❌ Migration failed:', error);
|
|
332
|
+
throw error;
|
|
333
|
+
} finally {
|
|
334
|
+
await sql.end();
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
runMigrations().catch((err) => {
|
|
339
|
+
console.error('Fatal error:', err);
|
|
340
|
+
process.exit(1);
|
|
341
|
+
});
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
### Add Script to package.json
|
|
345
|
+
|
|
346
|
+
```json
|
|
347
|
+
{
|
|
348
|
+
"scripts": {
|
|
349
|
+
"db:migrate:remote": "bun run scripts/migrate-remote.ts",
|
|
350
|
+
"db:migrate:develop": "DIRECT_URL=$DEVELOP_DIRECT_URL bun run scripts/migrate-remote.ts",
|
|
351
|
+
"db:migrate:production": "DIRECT_URL=$PRODUCTION_DIRECT_URL bun run scripts/migrate-remote.ts"
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
### GitHub Actions Workflow
|
|
357
|
+
|
|
358
|
+
Create `.github/workflows/deploy-database.yml`:
|
|
359
|
+
|
|
360
|
+
```yaml
|
|
361
|
+
name: Deploy Database Schema
|
|
362
|
+
|
|
363
|
+
on:
|
|
364
|
+
workflow_dispatch:
|
|
365
|
+
inputs:
|
|
366
|
+
environment:
|
|
367
|
+
description: 'Target environment'
|
|
368
|
+
required: true
|
|
369
|
+
type: choice
|
|
370
|
+
options:
|
|
371
|
+
- develop
|
|
372
|
+
- staging
|
|
373
|
+
- production
|
|
374
|
+
|
|
375
|
+
jobs:
|
|
376
|
+
migrate:
|
|
377
|
+
runs-on: ubuntu-latest
|
|
378
|
+
environment: ${{ github.event.inputs.environment }}
|
|
379
|
+
|
|
380
|
+
steps:
|
|
381
|
+
- name: Checkout code
|
|
382
|
+
uses: actions/checkout@v4
|
|
383
|
+
|
|
384
|
+
- name: Setup Bun
|
|
385
|
+
uses: oven-sh/setup-bun@v1
|
|
386
|
+
with:
|
|
387
|
+
bun-version: latest
|
|
388
|
+
|
|
389
|
+
- name: Install dependencies
|
|
390
|
+
run: bun install
|
|
391
|
+
|
|
392
|
+
- name: Run migrations
|
|
393
|
+
env:
|
|
394
|
+
DIRECT_URL: ${{ secrets.DIRECT_URL }}
|
|
395
|
+
DATABASE_URL: ${{ secrets.DATABASE_URL }}
|
|
396
|
+
run: bun run db:migrate:remote
|
|
397
|
+
|
|
398
|
+
- name: Verify migration
|
|
399
|
+
env:
|
|
400
|
+
DIRECT_URL: ${{ secrets.DIRECT_URL }}
|
|
401
|
+
run: |
|
|
402
|
+
psql "$DIRECT_URL" -c "\dt" || echo "⚠️ Could not verify tables"
|
|
403
|
+
```
|
|
404
|
+
|
|
405
|
+
### Manual Deployment Workflow
|
|
406
|
+
|
|
407
|
+
```bash
|
|
408
|
+
# 1. Deploy code to preview environment
|
|
409
|
+
git push origin develop
|
|
410
|
+
|
|
411
|
+
# 2. Wait for Vercel preview deployment to complete
|
|
412
|
+
# Check: https://vercel.com/dashboard
|
|
413
|
+
|
|
414
|
+
# 3. Run migrations against develop database
|
|
415
|
+
export DIRECT_URL="your-develop-direct-url"
|
|
416
|
+
bun run db:migrate:remote
|
|
417
|
+
|
|
418
|
+
# 4. Test the preview deployment
|
|
419
|
+
# Visit: https://develop-ui-syncup.vercel.app
|
|
420
|
+
|
|
421
|
+
# 5. If all tests pass, merge to main (production)
|
|
422
|
+
git checkout main
|
|
423
|
+
git merge develop
|
|
424
|
+
git push origin main
|
|
425
|
+
|
|
426
|
+
# 6. Run migrations against production database
|
|
427
|
+
export DIRECT_URL="your-production-direct-url"
|
|
428
|
+
bun run db:migrate:remote
|
|
429
|
+
```
|
|
430
|
+
|
|
431
|
+
---
|
|
432
|
+
|
|
433
|
+
## Vercel Deployment
|
|
434
|
+
|
|
435
|
+
Integrate database migrations with Vercel deployments.
|
|
436
|
+
|
|
437
|
+
### Option 1: Pre-build Hook (Automatic)
|
|
438
|
+
|
|
439
|
+
**⚠️ Warning:** This runs migrations automatically on every deployment. Use with caution.
|
|
440
|
+
|
|
441
|
+
Add to `package.json`:
|
|
442
|
+
|
|
443
|
+
```json
|
|
444
|
+
{
|
|
445
|
+
"scripts": {
|
|
446
|
+
"vercel-build": "bun run db:migrate && bun run build"
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
```
|
|
450
|
+
|
|
451
|
+
Configure in `vercel.json`:
|
|
452
|
+
|
|
453
|
+
```json
|
|
454
|
+
{
|
|
455
|
+
"buildCommand": "bun run vercel-build"
|
|
456
|
+
}
|
|
457
|
+
```
|
|
458
|
+
|
|
459
|
+
**Pros:**
|
|
460
|
+
- Fully automated
|
|
461
|
+
- No manual intervention required
|
|
462
|
+
|
|
463
|
+
**Cons:**
|
|
464
|
+
- Migrations run on every deployment (even failed builds)
|
|
465
|
+
- No rollback mechanism
|
|
466
|
+
- Risky for production
|
|
467
|
+
|
|
468
|
+
### Option 2: Separate Deployment Step (Recommended)
|
|
469
|
+
|
|
470
|
+
Run migrations manually before promoting deployments.
|
|
471
|
+
|
|
472
|
+
**Workflow:**
|
|
473
|
+
|
|
474
|
+
```bash
|
|
475
|
+
# 1. Deploy code to preview (automatic)
|
|
476
|
+
git push origin develop
|
|
477
|
+
|
|
478
|
+
# 2. Wait for preview deployment
|
|
479
|
+
# Vercel will post preview URL in PR comments
|
|
480
|
+
|
|
481
|
+
# 3. Run migrations against develop database
|
|
482
|
+
export DIRECT_URL="$DEVELOP_DIRECT_URL"
|
|
483
|
+
bun run db:migrate:remote
|
|
484
|
+
|
|
485
|
+
# 4. Test preview deployment thoroughly
|
|
486
|
+
# Visit preview URL and test all features
|
|
487
|
+
|
|
488
|
+
# 5. If tests pass, promote to production
|
|
489
|
+
vercel promote <preview-deployment-url>
|
|
490
|
+
|
|
491
|
+
# 6. Run migrations against production database
|
|
492
|
+
export DIRECT_URL="$PRODUCTION_DIRECT_URL"
|
|
493
|
+
bun run db:migrate:remote
|
|
494
|
+
```
|
|
495
|
+
|
|
496
|
+
### Option 3: Vercel Deploy Hook
|
|
497
|
+
|
|
498
|
+
Create a separate deployment hook for migrations.
|
|
499
|
+
|
|
500
|
+
**Setup:**
|
|
501
|
+
|
|
502
|
+
1. Go to Vercel Dashboard → Project Settings → Git
|
|
503
|
+
2. Create a **Deploy Hook** named "Run Migrations"
|
|
504
|
+
3. Copy the webhook URL
|
|
505
|
+
|
|
506
|
+
**Usage:**
|
|
507
|
+
|
|
508
|
+
```bash
|
|
509
|
+
# Trigger migration deployment
|
|
510
|
+
curl -X POST "https://api.vercel.com/v1/integrations/deploy/[HOOK-ID]"
|
|
511
|
+
|
|
512
|
+
# Or use GitHub Actions to trigger after successful deployment
|
|
513
|
+
```
|
|
514
|
+
|
|
515
|
+
---
|
|
516
|
+
|
|
517
|
+
## Safety Guidelines
|
|
518
|
+
|
|
519
|
+
### Pre-Migration Checklist
|
|
520
|
+
|
|
521
|
+
Before running migrations on any remote database:
|
|
522
|
+
|
|
523
|
+
- [ ] **Test locally first**: Run `bun run db:migrate` on local Supabase
|
|
524
|
+
- [ ] **Review SQL**: Check migration files for destructive operations (DROP, TRUNCATE)
|
|
525
|
+
- [ ] **Backup database**: Verify Supabase automatic backups are enabled
|
|
526
|
+
- [ ] **Check dependencies**: Ensure no breaking schema changes
|
|
527
|
+
- [ ] **Plan rollback**: Have a rollback strategy ready
|
|
528
|
+
- [ ] **Schedule maintenance**: Run during low-traffic periods (if destructive)
|
|
529
|
+
- [ ] **Notify team**: Inform team members of deployment
|
|
530
|
+
- [ ] **Monitor application**: Watch error logs during and after migration
|
|
531
|
+
|
|
532
|
+
### Migration Best Practices
|
|
533
|
+
|
|
534
|
+
**DO:**
|
|
535
|
+
- ✅ Use transactions for multiple operations
|
|
536
|
+
- ✅ Add indexes after data insertion (for large tables)
|
|
537
|
+
- ✅ Use `IF NOT EXISTS` for idempotent migrations
|
|
538
|
+
- ✅ Test migrations on a copy of production data
|
|
539
|
+
- ✅ Keep migrations small and focused
|
|
540
|
+
- ✅ Document breaking changes in migration comments
|
|
541
|
+
|
|
542
|
+
**DON'T:**
|
|
543
|
+
- ❌ Drop tables without backup
|
|
544
|
+
- ❌ Remove columns without deprecation period
|
|
545
|
+
- ❌ Run migrations during peak traffic
|
|
546
|
+
- ❌ Skip testing on staging environment
|
|
547
|
+
- ❌ Modify production data without approval
|
|
548
|
+
- ❌ Use hardcoded values (use environment variables)
|
|
549
|
+
|
|
550
|
+
### Rollback Strategy
|
|
551
|
+
|
|
552
|
+
**If migration fails:**
|
|
553
|
+
|
|
554
|
+
```bash
|
|
555
|
+
# 1. Identify the failed migration
|
|
556
|
+
psql "$DIRECT_URL" -c "SELECT * FROM drizzle.__drizzle_migrations ORDER BY created_at DESC LIMIT 5;"
|
|
557
|
+
|
|
558
|
+
# 2. Restore from backup (Supabase Dashboard → Database → Backups)
|
|
559
|
+
# Or manually revert changes
|
|
560
|
+
|
|
561
|
+
# 3. Fix the migration file locally
|
|
562
|
+
# Edit drizzle/XXXX_migration.sql
|
|
563
|
+
|
|
564
|
+
# 4. Test the fix locally
|
|
565
|
+
bun run db:migrate
|
|
566
|
+
|
|
567
|
+
# 5. Re-run on remote
|
|
568
|
+
bun run db:migrate:remote
|
|
569
|
+
```
|
|
570
|
+
|
|
571
|
+
**If application breaks after migration:**
|
|
572
|
+
|
|
573
|
+
```bash
|
|
574
|
+
# 1. Rollback application deployment
|
|
575
|
+
vercel promote <previous-deployment-url>
|
|
576
|
+
|
|
577
|
+
# 2. Revert database schema (if needed)
|
|
578
|
+
# Restore from Supabase backup
|
|
579
|
+
|
|
580
|
+
# 3. Fix issues and redeploy
|
|
581
|
+
```
|
|
582
|
+
|
|
583
|
+
### Monitoring After Migration
|
|
584
|
+
|
|
585
|
+
**Immediate checks (within 5 minutes):**
|
|
586
|
+
|
|
587
|
+
```bash
|
|
588
|
+
# Check application health
|
|
589
|
+
curl https://ui-syncup.com/api/health
|
|
590
|
+
|
|
591
|
+
# Check database connectivity
|
|
592
|
+
psql "$DIRECT_URL" -c "SELECT 1;"
|
|
593
|
+
|
|
594
|
+
# Check table counts
|
|
595
|
+
psql "$DIRECT_URL" -c "SELECT schemaname, tablename, n_live_tup FROM pg_stat_user_tables;"
|
|
596
|
+
|
|
597
|
+
# Check for errors in application logs
|
|
598
|
+
vercel logs --follow
|
|
599
|
+
```
|
|
600
|
+
|
|
601
|
+
**Extended monitoring (within 30 minutes):**
|
|
602
|
+
|
|
603
|
+
- Monitor error rates in Vercel Analytics
|
|
604
|
+
- Check database CPU and memory usage in Supabase Dashboard
|
|
605
|
+
- Verify critical user flows work correctly
|
|
606
|
+
- Review slow query logs
|
|
607
|
+
|
|
608
|
+
---
|
|
609
|
+
|
|
610
|
+
## Troubleshooting
|
|
611
|
+
|
|
612
|
+
### Common Issues and Solutions
|
|
613
|
+
|
|
614
|
+
#### Issue: "relation already exists"
|
|
615
|
+
|
|
616
|
+
**Cause:** Migration already applied or table exists from previous attempt.
|
|
617
|
+
|
|
618
|
+
**Solution:**
|
|
619
|
+
|
|
620
|
+
```bash
|
|
621
|
+
# Check migration history
|
|
622
|
+
psql "$DIRECT_URL" -c "SELECT * FROM drizzle.__drizzle_migrations;"
|
|
623
|
+
|
|
624
|
+
# If migration is recorded but table doesn't exist, remove the record
|
|
625
|
+
psql "$DIRECT_URL" -c "DELETE FROM drizzle.__drizzle_migrations WHERE name = 'XXXX_migration';"
|
|
626
|
+
|
|
627
|
+
# Re-run migration
|
|
628
|
+
bun run db:migrate:remote
|
|
629
|
+
```
|
|
630
|
+
|
|
631
|
+
#### Issue: "password authentication failed"
|
|
632
|
+
|
|
633
|
+
**Cause:** Incorrect database credentials or expired password.
|
|
634
|
+
|
|
635
|
+
**Solution:**
|
|
636
|
+
|
|
637
|
+
```bash
|
|
638
|
+
# Verify connection string format
|
|
639
|
+
echo $DIRECT_URL
|
|
640
|
+
|
|
641
|
+
# Test connection manually
|
|
642
|
+
psql "$DIRECT_URL" -c "SELECT version();"
|
|
643
|
+
|
|
644
|
+
# Reset database password in Supabase Dashboard
|
|
645
|
+
# Settings → Database → Database password → Reset
|
|
646
|
+
```
|
|
647
|
+
|
|
648
|
+
#### Issue: "connection timeout"
|
|
649
|
+
|
|
650
|
+
**Cause:** Network issues, firewall, or database overload.
|
|
651
|
+
|
|
652
|
+
**Solution:**
|
|
653
|
+
|
|
654
|
+
```bash
|
|
655
|
+
# Check Supabase status
|
|
656
|
+
curl https://status.supabase.com/api/v2/status.json
|
|
657
|
+
|
|
658
|
+
# Test connectivity
|
|
659
|
+
ping db.[PROJECT-REF].supabase.co
|
|
660
|
+
|
|
661
|
+
# Try with increased timeout
|
|
662
|
+
psql "$DIRECT_URL?connect_timeout=30" -c "SELECT 1;"
|
|
663
|
+
|
|
664
|
+
# Check if IP is blocked (Supabase Dashboard → Settings → Database → Connection pooling)
|
|
665
|
+
```
|
|
666
|
+
|
|
667
|
+
#### Issue: "too many connections"
|
|
668
|
+
|
|
669
|
+
**Cause:** Connection pool exhausted.
|
|
670
|
+
|
|
671
|
+
**Solution:**
|
|
672
|
+
|
|
673
|
+
```bash
|
|
674
|
+
# Use direct connection (not pooled)
|
|
675
|
+
# Ensure DIRECT_URL uses port 5432, not 6543
|
|
676
|
+
|
|
677
|
+
# Check active connections
|
|
678
|
+
psql "$DIRECT_URL" -c "SELECT count(*) FROM pg_stat_activity;"
|
|
679
|
+
|
|
680
|
+
# Kill idle connections (if needed)
|
|
681
|
+
psql "$DIRECT_URL" -c "SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE state = 'idle' AND state_change < NOW() - INTERVAL '5 minutes';"
|
|
682
|
+
```
|
|
683
|
+
|
|
684
|
+
#### Issue: "migration out of order"
|
|
685
|
+
|
|
686
|
+
**Cause:** Migrations applied in wrong order or missing migration.
|
|
687
|
+
|
|
688
|
+
**Solution:**
|
|
689
|
+
|
|
690
|
+
```bash
|
|
691
|
+
# Check which migrations are applied
|
|
692
|
+
psql "$DIRECT_URL" -c "SELECT * FROM drizzle.__drizzle_migrations ORDER BY created_at;"
|
|
693
|
+
|
|
694
|
+
# Check local migration files
|
|
695
|
+
ls -la drizzle/
|
|
696
|
+
|
|
697
|
+
# Apply missing migrations manually
|
|
698
|
+
psql "$DIRECT_URL" < drizzle/XXXX_missing_migration.sql
|
|
699
|
+
|
|
700
|
+
# Record migration in history
|
|
701
|
+
psql "$DIRECT_URL" -c "INSERT INTO drizzle.__drizzle_migrations (name, created_at) VALUES ('XXXX_missing_migration', NOW());"
|
|
702
|
+
```
|
|
703
|
+
|
|
704
|
+
#### Issue: "syntax error in SQL"
|
|
705
|
+
|
|
706
|
+
**Cause:** Invalid SQL in migration file or PostgreSQL version mismatch.
|
|
707
|
+
|
|
708
|
+
**Solution:**
|
|
709
|
+
|
|
710
|
+
```bash
|
|
711
|
+
# Check PostgreSQL version
|
|
712
|
+
psql "$DIRECT_URL" -c "SELECT version();"
|
|
713
|
+
|
|
714
|
+
# Validate SQL syntax locally
|
|
715
|
+
psql "postgresql://localhost:5432/postgres" < drizzle/XXXX_migration.sql
|
|
716
|
+
|
|
717
|
+
# Fix syntax errors in migration file
|
|
718
|
+
# Re-generate migration if needed
|
|
719
|
+
bun run db:generate
|
|
720
|
+
```
|
|
721
|
+
|
|
722
|
+
### Getting Help
|
|
723
|
+
|
|
724
|
+
**Check logs:**
|
|
725
|
+
|
|
726
|
+
```bash
|
|
727
|
+
# Drizzle migration logs
|
|
728
|
+
bun run db:migrate:remote 2>&1 | tee migration.log
|
|
729
|
+
|
|
730
|
+
# Supabase logs
|
|
731
|
+
npx supabase logs --db
|
|
732
|
+
|
|
733
|
+
# Application logs
|
|
734
|
+
vercel logs --follow
|
|
735
|
+
```
|
|
736
|
+
|
|
737
|
+
**Useful commands:**
|
|
738
|
+
|
|
739
|
+
```bash
|
|
740
|
+
# Check database size
|
|
741
|
+
psql "$DIRECT_URL" -c "SELECT pg_size_pretty(pg_database_size('postgres'));"
|
|
742
|
+
|
|
743
|
+
# List all schemas
|
|
744
|
+
psql "$DIRECT_URL" -c "\dn"
|
|
745
|
+
|
|
746
|
+
# List all tables with row counts
|
|
747
|
+
psql "$DIRECT_URL" -c "SELECT schemaname, tablename, n_live_tup FROM pg_stat_user_tables ORDER BY n_live_tup DESC;"
|
|
748
|
+
|
|
749
|
+
# Check table structure
|
|
750
|
+
psql "$DIRECT_URL" -c "\d+ users"
|
|
751
|
+
|
|
752
|
+
# Export schema
|
|
753
|
+
pg_dump "$DIRECT_URL" --schema-only > schema.sql
|
|
754
|
+
```
|
|
755
|
+
|
|
756
|
+
**Resources:**
|
|
757
|
+
|
|
758
|
+
- [Drizzle ORM Documentation](https://orm.drizzle.team/docs/overview)
|
|
759
|
+
- [Supabase Database Documentation](https://supabase.com/docs/guides/database)
|
|
760
|
+
- [PostgreSQL Documentation](https://www.postgresql.org/docs/)
|
|
761
|
+
- [Vercel Deployment Documentation](https://vercel.com/docs/deployments)
|
|
762
|
+
|
|
763
|
+
---
|
|
764
|
+
|
|
765
|
+
## Summary
|
|
766
|
+
|
|
767
|
+
**Recommended workflow for production:**
|
|
768
|
+
|
|
769
|
+
1. ✅ Test migrations locally (`bun run db:migrate`)
|
|
770
|
+
2. ✅ Deploy code to preview environment
|
|
771
|
+
3. ✅ Run migrations on develop database (`bun run db:migrate:remote`)
|
|
772
|
+
4. ✅ Test preview deployment thoroughly
|
|
773
|
+
5. ✅ Merge to main and deploy to production
|
|
774
|
+
6. ✅ Run migrations on production database
|
|
775
|
+
7. ✅ Monitor application health and error logs
|
|
776
|
+
|
|
777
|
+
**Key takeaways:**
|
|
778
|
+
|
|
779
|
+
- Always test migrations locally first
|
|
780
|
+
- Use `DIRECT_URL` for migrations (not pooled connection)
|
|
781
|
+
- Keep migrations idempotent (safe to run multiple times)
|
|
782
|
+
- Have a rollback plan ready
|
|
783
|
+
- Monitor application after migration
|
|
784
|
+
- Document any manual steps or special considerations
|
|
785
|
+
|
|
786
|
+
For questions or issues, refer to the [Troubleshooting](#troubleshooting) section or contact the team.
|