Closes the source-side half of P0 #7 from .convoys/ship-readiness.md. The page-side sweep (Brief 2) follows in a separate commit. components/Layout.js: - Default user prop is now null (was hardcoded to { email: 'me@randallstillwell.com', role: 'user' }) - UserProfileDropdown renders a "Sign in" link to /login when user === null instead of the maintainer's email + auth-only menu items (Decision A1) - All user.* accesses guarded with optional chaining or null checks - useState hook stays above the new null-user early return to satisfy rules-of-hooks (boot-the-brief caught this on the first try; see AGENTS.md Gotcha #11.5) test/components/Layout.test.js (new): - First jsdom test in the repo (Decision D2) - 5 regression-lock assertions: no maintainer email ever rendered (prop omitted, prop=null), Sign-in link exists with href=/login, supplied email renders when prop is set, no "Guest" placeholder (locks A1 copy choice) - Mocks next/link, next/router (prefetch, replace, events, query), and theme-context.useTheme for jsdom safety under Next 16 package.json + package-lock.json: - Add jsdom@^29 and @testing-library/react@^16 to devDependencies - @testing-library/dom@^10 added explicitly (peer auto-install skipped it under npm 11; brief anticipated this fallback) vitest.config.js (deviation from brief — see PR description): - Add esbuild { loader: 'jsx', jsx: 'automatic' } so vitest can parse JSX in .js files. Required to import any React component written in the repo's Next.js pages-router .js convention (AGENTS.md Gotcha #9). The brief said "no change" to this file, but JSX-in-.js parsing is a hard prerequisite for the new test to import components/Layout.js — the alternatives (rename test to .test.jsx; rewrite test in React.createElement) either break the test glob or still hit the same Layout.js parse failure. Other tests are unaffected (they import non-JSX modules). Smoke output: see PR description. addresses: P0 #7 from .convoys/ship-readiness.md (last P0 ship-blocker) Co-authored-by: Cursor <cursoragent@cursor.com>
23 lines
783 B
JavaScript
23 lines
783 B
JavaScript
import { defineConfig } from 'vitest/config';
|
|
|
|
export default defineConfig({
|
|
// Repo-wide convention: React components live in .js files (Next.js
|
|
// pages-router style — see AGENTS.md Gotcha #9, "typescript is a devDep
|
|
// but the source is JavaScript-only"). Vite's default esbuild loader
|
|
// treats .js as plain JS and rejects JSX, which breaks any test that
|
|
// imports a component (e.g. test/components/Layout.test.js). This widens
|
|
// the JSX loader to .js so component tests work without renaming files.
|
|
esbuild: {
|
|
loader: 'jsx',
|
|
jsx: 'automatic',
|
|
include: /\.[jt]sx?$/,
|
|
exclude: [],
|
|
},
|
|
test: {
|
|
environment: 'node',
|
|
globals: false,
|
|
setupFiles: ['./test/setup.js'],
|
|
include: ['test/**/*.test.js'],
|
|
testTimeout: 5000,
|
|
},
|
|
});
|