next.js/packages/next/src/server/lib/experimental/create-env-definitions.ts
create-env-definitions.ts48 lines1.1 KB
import type { LoadedEnvFiles } from '@next/env'
import { join } from 'node:path'
import { writeFile } from 'node:fs/promises'

export async function createEnvDefinitions({
  distDir,
  loadedEnvFiles,
}: {
  distDir: string
  loadedEnvFiles: LoadedEnvFiles
}) {
  const envLines = []
  const seenKeys = new Set()
  // env files are in order of priority
  for (const { path, env } of loadedEnvFiles) {
    for (const key in env) {
      if (!seenKeys.has(key)) {
        envLines.push(`      /** Loaded from \`${path}\` */`)
        envLines.push(`      ${key}?: string`)
        seenKeys.add(key)
      }
    }
  }
  const envStr = envLines.join('\n')

  const definitionStr = `// Type definitions for Next.js environment variables
declare global {
  namespace NodeJS {
    interface ProcessEnv {
${envStr}
    }
  }
}
export {}`

  if (process.env.NODE_ENV === 'test') {
    return definitionStr
  }

  try {
    // we expect the types directory to already exist
    const envDtsPath = join(distDir, 'types', 'env.d.ts')
    await writeFile(envDtsPath, definitionStr, 'utf-8')
  } catch (e) {
    console.error('Failed to write env.d.ts:', e)
  }
}
Quest for Codev2.0.0
/
SIGN IN