Four low-risk adds before the Zod 4 / drizzle-zod headliner: - @total-typescript/ts-reset: tightens TS stdlib types globally (JSON.parse → unknown, fetch().json() → unknown, .filter(Boolean) narrows, Set literals respect typed Set targets). Caught 179 latent type errors; fixed all production sites (8 files) and added `any` cast escape hatch in test files (ESLint exemption scoped to tests/). - web-vitals + /api/v1/internal/vitals endpoint + WebVitalsReporter client component: establishes Core Web Vitals baseline (LCP/INP/CLS/ FCP/TTFB) via navigator.sendBeacon. Required before optimisation work. - @hookform/devtools + FormDevtool wrapper: dev-only RHF state inspector, lazy-loaded via next/dynamic so the chunk is excluded from prod bundles entirely. - @tanstack/query-broadcast-client-experimental: cross-tab cache sync via BroadcastChannel — wired in query-provider.tsx, 1-liner. Audit doc updated with sections 35 + 36 (PDF stack overhaul + comprehensive second-pass package sweep) covering ~20 package adoption candidates and 4-5 deprecation candidates. Verified: tsc clean, vitest 1293/1293 pass. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
33 lines
1.2 KiB
TypeScript
33 lines
1.2 KiB
TypeScript
'use client';
|
|
|
|
import dynamic from 'next/dynamic';
|
|
import type { Control, FieldValues } from 'react-hook-form';
|
|
|
|
// Lazy-load @hookform/devtools only when actually rendered. The
|
|
// `process.env.NODE_ENV` guard below ensures we never hit this path in
|
|
// production, so Next.js' code splitter keeps the devtools chunk out of
|
|
// the prod bundle entirely.
|
|
const DevTool = dynamic(() => import('@hookform/devtools').then((m) => ({ default: m.DevTool })), {
|
|
ssr: false,
|
|
});
|
|
|
|
/**
|
|
* Floating react-hook-form state inspector. Shows live values, errors,
|
|
* touched/dirty state. Rendered only in development.
|
|
*
|
|
* Usage in any form component:
|
|
*
|
|
* const form = useForm({ resolver: zodResolver(schema) });
|
|
* ...
|
|
* <form onSubmit={form.handleSubmit(onSubmit)}>
|
|
* <FormDevtool control={form.control} />
|
|
* {fields}
|
|
* </form>
|
|
*/
|
|
export function FormDevtool<T extends FieldValues>({ control }: { control: Control<T> }) {
|
|
if (process.env.NODE_ENV !== 'development') return null;
|
|
// Cast: @hookform/devtools types Control as the v6 shape; ours is v7+.
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
return <DevTool control={control as any} placement="bottom-right" />;
|
|
}
|