next.js/test/unit/write-app-declarations.test.ts
write-app-declarations.test.ts140 lines3.8 KB
/* eslint-env jest */
import os from 'os'
import fs from 'fs-extra'
import { join } from 'path'
import { writeAppTypeDeclarations } from 'next/dist/lib/typescript/writeAppTypeDeclarations'

const fixtureDir = join(__dirname, 'fixtures/app-declarations')
const declarationFile = join(fixtureDir, 'next-env.d.ts')
const imageImportsEnabled = false

describe('find config', () => {
  beforeEach(async () => {
    await fs.ensureDir(fixtureDir)
  })
  afterEach(() => fs.remove(declarationFile))

  it('should preserve CRLF EOL', async () => {
    const eol = '\r\n'
    const content =
      '/// <reference types="next" />' +
      eol +
      (imageImportsEnabled
        ? '/// <reference types="next/image-types/global" />' + eol
        : '') +
      `import "./.next/types/routes.d.ts";` +
      eol +
      eol +
      '// NOTE: This file should not be edited' +
      eol +
      '// see https://nextjs.org/docs/pages/api-reference/config/typescript for more information.' +
      eol

    await fs.writeFile(declarationFile, content)

    await writeAppTypeDeclarations({
      baseDir: fixtureDir,
      distDir: '.next',
      imageImportsEnabled,
      hasPagesDir: false,
      hasAppDir: false,
      strictRouteTypes: false,
      typedRoutes: true,
      rootParams: false,
    })
    expect(await fs.readFile(declarationFile, 'utf8')).toBe(content)
  })

  it('should preserve LF EOL', async () => {
    const eol = '\n'
    const content =
      '/// <reference types="next" />' +
      eol +
      (imageImportsEnabled
        ? '/// <reference types="next/image-types/global" />' + eol
        : '') +
      `import "./.next/types/routes.d.ts";` +
      eol +
      eol +
      '// NOTE: This file should not be edited' +
      eol +
      '// see https://nextjs.org/docs/pages/api-reference/config/typescript for more information.' +
      eol

    await fs.writeFile(declarationFile, content)

    await writeAppTypeDeclarations({
      baseDir: fixtureDir,
      distDir: '.next',
      imageImportsEnabled,
      hasPagesDir: false,
      hasAppDir: false,
      strictRouteTypes: false,
      typedRoutes: true,
      rootParams: false,
    })
    expect(await fs.readFile(declarationFile, 'utf8')).toBe(content)
  })

  it('should use OS EOL by default', async () => {
    const eol = os.EOL
    const content =
      '/// <reference types="next" />' +
      eol +
      (imageImportsEnabled
        ? '/// <reference types="next/image-types/global" />' + eol
        : '') +
      `import "./.next/types/routes.d.ts";` +
      eol +
      eol +
      '// NOTE: This file should not be edited' +
      eol +
      '// see https://nextjs.org/docs/pages/api-reference/config/typescript for more information.' +
      eol

    await writeAppTypeDeclarations({
      baseDir: fixtureDir,
      distDir: '.next',
      imageImportsEnabled,
      hasPagesDir: false,
      hasAppDir: false,
      strictRouteTypes: false,
      typedRoutes: true,
      rootParams: false,
    })
    expect(await fs.readFile(declarationFile, 'utf8')).toBe(content)
  })

  it('should include navigation types if app directory is enabled', async () => {
    await writeAppTypeDeclarations({
      baseDir: fixtureDir,
      distDir: '.next',
      imageImportsEnabled,
      hasPagesDir: false,
      hasAppDir: true,
      strictRouteTypes: false,
      typedRoutes: true,
      rootParams: false,
    })

    await expect(fs.readFile(declarationFile, 'utf8')).resolves.not.toContain(
      'next/navigation-types/compat/navigation'
    )

    await writeAppTypeDeclarations({
      baseDir: fixtureDir,
      distDir: '.next',
      imageImportsEnabled,
      hasPagesDir: true,
      hasAppDir: true,
      strictRouteTypes: false,
      typedRoutes: true,
      rootParams: false,
    })

    await expect(fs.readFile(declarationFile, 'utf8')).resolves.toContain(
      'next/navigation-types/compat/navigation'
    )
  })
})
Quest for Codev2.0.0
/
SIGN IN