|
| 1 | +# Plan: Web App Dependency Update |
| 2 | + |
| 3 | +> Track: web-nuxt-update-20260328 |
| 4 | +> Spec: [spec.md](./spec.md) |
| 5 | +
|
| 6 | +## Overview |
| 7 | + |
| 8 | +- **Source**: spec.md |
| 9 | +- **Issue**: #126 |
| 10 | +- **Created**: 2026-03-28 |
| 11 | +- **Approach**: Incremental — minor/patch updates first, then major bumps with migration |
| 12 | + |
| 13 | +## Purpose |
| 14 | + |
| 15 | +After this change, the marketplace web app will run on the latest Nuxt 4.4, Nuxt UI 4.6, and TypeScript 6.0 with all dependencies current. Developers can verify it works by running `bun run build` and `bun run dev` successfully. |
| 16 | + |
| 17 | +## Context |
| 18 | + |
| 19 | +The `apps/web/` marketplace frontend has 10 outdated packages spanning core framework (Nuxt, Nuxt UI, Nuxt Content), Vue ecosystem (vue, vue-router), dev tools (eslint, better-sqlite3), and two major version bumps (@nuxt/test-utils 3→4, TypeScript 5.9→6.0). The app consists of 4 Vue components, 1 API route, and server utilities — relatively small surface area. No test files currently exist, so @nuxt/test-utils migration is low-risk. TypeScript 6.0 changes default values for `strict`, `types`, and `module` which may require tsconfig adjustments. |
| 20 | + |
| 21 | +### Non-goals |
| 22 | +- Adding new features or pages |
| 23 | +- Refactoring beyond what breaking changes require |
| 24 | +- Updating monorepo root dependencies |
| 25 | + |
| 26 | +## Architecture Decision |
| 27 | + |
| 28 | +- Decision: Incremental update — safe minor/patch updates first, then major bumps separately |
| 29 | +- Rationale: Isolates breakage. Minor updates (Nuxt, Nuxt UI, Content, Vue) are low-risk and can be batched. Major bumps (TypeScript 6.0, test-utils 4.0) have significant breaking changes and need individual attention. |
| 30 | +- Date/Author: 2026-03-28 / Claude |
| 31 | + |
| 32 | +## Tasks |
| 33 | + |
| 34 | +- [x] T001 Update minor/patch dependencies — nuxt, @nuxt/ui, @nuxt/content, vue, vue-router, eslint, better-sqlite3 (file: apps/web/package.json) |
| 35 | +- [x] T002 Apply Nuxt UI 4.x migration fixes — check for UTable @select arg order, CommandPalette trailing-icon rename, exposed ref changes (depends on T001) |
| 36 | +- [x] T003 Apply Nuxt 4.4 migration fixes — update createError calls (statusCode→status), update compatibilityDate in nuxt.config.ts (depends on T001) |
| 37 | +- [x] T004 [P] Upgrade TypeScript to 6.0 — update tsconfig.json for new defaults (types, strict, moduleResolution), run ts5to6 migration tool (file: apps/web/tsconfig.json, depends on T001) |
| 38 | +- [x] T005 [P] Upgrade @nuxt/test-utils to 4.0 (file: apps/web/package.json, depends on T001) |
| 39 | +- [x] T006 Verify build and dev server — run bun run build and bun run dev, fix any remaining issues (depends on T002, T003, T004, T005) |
| 40 | + |
| 41 | +## Key Files |
| 42 | + |
| 43 | +### Modify |
| 44 | +- `apps/web/package.json` — dependency versions |
| 45 | +- `apps/web/nuxt.config.ts` — compatibilityDate update |
| 46 | +- `apps/web/tsconfig.json` — TypeScript 6.0 adjustments |
| 47 | + |
| 48 | +### Reuse (check for breaking changes) |
| 49 | +- `apps/web/app/pages/index.vue` — main page |
| 50 | +- `apps/web/app/components/PluginCard.vue` — Nuxt UI components |
| 51 | +- `apps/web/app/components/PluginSearch.vue` — USelectMenu, UInput usage |
| 52 | +- `apps/web/app/components/InstallModal.vue` — UModal usage |
| 53 | +- `apps/web/server/api/marketplaces.get.ts` — createError usage check |
| 54 | +- `apps/web/server/utils/github.ts` — createError usage check |
| 55 | + |
| 56 | +## Verification |
| 57 | + |
| 58 | +### Automated Tests |
| 59 | +- [ ] `bun run build` completes without errors |
| 60 | +- [ ] TypeScript compilation has no type errors |
| 61 | + |
| 62 | +### Observable Outcomes |
| 63 | +- Running `bun run dev` starts the dev server and pages render correctly |
| 64 | +- Running `bun outdated` in apps/web/ shows no outdated packages |
| 65 | + |
| 66 | +### Manual Testing |
| 67 | +- [ ] Homepage loads and displays plugin cards |
| 68 | +- [ ] Plugin search and filtering works |
| 69 | +- [ ] Install modal opens and displays correctly |
| 70 | +- [ ] Dark/light mode toggle works |
| 71 | + |
| 72 | +## Progress |
| 73 | + |
| 74 | +- [x] (2026-03-28 23:40 KST) T001 Update minor/patch dependencies |
| 75 | + Evidence: `bun update` → 7 packages updated successfully |
| 76 | +- [x] (2026-03-28 23:41 KST) T002 Apply Nuxt UI 4.x migration fixes |
| 77 | + Evidence: No UTable, CommandPalette, or exposed ref patterns found — no migration needed |
| 78 | +- [x] (2026-03-28 23:41 KST) T003 Apply Nuxt 4.4 migration fixes |
| 79 | + Evidence: createError statusCode→status in marketplaces.get.ts, compatibilityDate updated |
| 80 | +- [x] (2026-03-28 23:42 KST) T004 Upgrade TypeScript to 6.0 |
| 81 | + Evidence: typescript 6.0.2 installed, `nuxi prepare` succeeds |
| 82 | +- [x] (2026-03-28 23:42 KST) T005 Upgrade @nuxt/test-utils to 4.0 |
| 83 | + Evidence: @nuxt/test-utils 4.0.0 installed |
| 84 | +- [x] (2026-03-28 23:45 KST) T006 Verify build and dev server |
| 85 | + Evidence: `NITRO_PRESET=node-server bun run build` → Build complete! |
| 86 | + |
| 87 | +## Surprises & Discoveries |
| 88 | + |
| 89 | +- Observation: Vercel preset ISR symlink fails in git worktree environments |
| 90 | + Evidence: EROFS error trying to symlink to `/_payload.json-isr.func` (absolute root path). Build succeeds with node-server preset. This is a nitropack/vercel preset bug, not caused by our upgrade. |
| 91 | +- Observation: `bun outdated` shows old "Current" column based on package.json range minimum, not installed version |
| 92 | + Evidence: Despite packages being installed at latest, `bun outdated` compares against semver range floor |
| 93 | + |
| 94 | +## Decision Log |
| 95 | + |
| 96 | +- Decision: Incremental update approach |
| 97 | + Rationale: Isolates breakage sources; minor updates are safe to batch |
| 98 | + Date/Author: 2026-03-28 / Claude |
| 99 | + |
| 100 | +## Outcomes & Retrospective |
| 101 | + |
| 102 | +### What Was Shipped |
| 103 | +- All 10 outdated packages updated to latest versions |
| 104 | +- Nuxt 4.4 migration applied (createError statusCode → status) |
| 105 | +- TypeScript 6.0 major version bump |
| 106 | +- @nuxt/test-utils 4.0 major version bump |
| 107 | +- Tech-stack documentation updated |
| 108 | + |
| 109 | +### What Went Well |
| 110 | +- Code review caught two real issues (version regression and incorrect field rename) |
| 111 | +- Nuxt UI migration was a no-op — no affected components in use |
| 112 | +- Build verification confirmed clean compilation |
| 113 | + |
| 114 | +### What Could Improve |
| 115 | +- Git stash/restore during build testing caused package.json regression — avoid stash when testing builds |
| 116 | +- Verify `bun add` actually writes to correct workspace package.json in monorepos |
| 117 | + |
| 118 | +### Tech Debt Created |
| 119 | +- Vercel ISR symlink fails in worktree environments (nitropack bug, not our code) |
0 commit comments