next.js/packages/next/src/lib/static-env.ts
static-env.ts83 lines2.3 KB
import type {
  NextConfigComplete,
  NextConfigRuntime,
} from '../server/config-shared'

function errorIfEnvConflicted(
  config: NextConfigComplete | NextConfigRuntime,
  key: string
) {
  const isPrivateKey = /^(?:NODE_.+)|^(?:__.+)$/i.test(key)
  const hasNextRuntimeKey = key === 'NEXT_RUNTIME'

  if (isPrivateKey || hasNextRuntimeKey) {
    throw new Error(
      `The key "${key}" under "env" in ${config.configFileName || 'config'} is not allowed. https://nextjs.org/docs/messages/env-key-not-allowed`
    )
  }
}

/**
 * Collects all environment variables that are using the `NEXT_PUBLIC_` prefix.
 */
export function getNextPublicEnvironmentVariables() {
  const defineEnv: [string, string | undefined][] = []
  for (const key in process.env) {
    if (key.startsWith('NEXT_PUBLIC_')) {
      const value = process.env[key]
      if (value != null) {
        defineEnv.push([`process.env.${key}`, value])
      }
    }
  }
  defineEnv.sort((a, b) => a[0].localeCompare(b[0]))
  return Object.fromEntries(defineEnv)
}

/**
 * Collects the `env` config value from the Next.js config.
 */
export function getNextConfigEnv(
  config: NextConfigComplete | NextConfigRuntime
) {
  // Refactored code below to use for-of
  const defineEnv: Record<string, string | undefined> = {}
  const env = config.env
  for (const key in env) {
    const value = env[key]
    if (value != null) {
      errorIfEnvConflicted(config, key)
      defineEnv[`process.env.${key}`] = value
    }
  }
  return defineEnv
}

export function getStaticEnv(
  config: NextConfigComplete | NextConfigRuntime,
  deploymentId: string
) {
  const staticEnv: Record<string, string | undefined> = {
    ...getNextPublicEnvironmentVariables(),
    ...getNextConfigEnv(config),
    'process.env.NEXT_DEPLOYMENT_ID': deploymentId,
  }
  return staticEnv
}

export function populateStaticEnv(
  config: NextConfigComplete | NextConfigRuntime,
  deploymentId: string
) {
  // since inlining comes after static generation we need
  // to ensure this value is assigned to process env so it
  // can still be accessed
  const staticEnv = getStaticEnv(config, deploymentId)
  for (const key in staticEnv) {
    const innerKey = key.split('.').pop() || ''
    if (!process.env[innerKey]) {
      process.env[innerKey] = staticEnv[key] || ''
    }
  }
}
Quest for Codev2.0.0
/
SIGN IN