import { nextTestSetup } from 'e2e-utils' import { retry } from 'next-test-utils' describe('stale-dev-types', () => { const { next } = nextTestSetup({ files: __dirname, }) it('should not fail build when .next/dev has stale types from deleted routes', async () => { // Step 1: Wait for dev server to generate .next/dev/types/validator.ts await retry( async () => { const exists = await next .readFile('.next/dev/types/validator.ts') .then(() => true) .catch(() => false) if (!exists) { throw new Error('validator.ts not generated yet') } }, 5000, 500 ) // Verify validator.ts contains reference to temp-route const validatorContent = await next.readFile('.next/dev/types/validator.ts') expect(validatorContent).toContain('temp-route/page') // Step 2: Stop dev server await next.stop() // Step 3: Delete the temp-route (simulating user deleting a route) await next.deleteFile('app/temp-route/page.tsx') // Verify .next/dev/types/validator.ts still references deleted route (stale) const staleValidator = await next.readFile('.next/dev/types/validator.ts') expect(staleValidator).toContain('temp-route/page') // Step 4: Run build - should NOT fail due to stale .next/dev types const { exitCode, cliOutput } = await next.build() // Build should succeed - stale dev types should be excluded from type checking expect(cliOutput).not.toContain( "Cannot find module '../../../app/temp-route/page" ) expect(exitCode).toBe(0) }) })