env.ts 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. import { createEnv } from '@t3-oss/env-nextjs'
  2. import * as z from 'zod'
  3. /**
  4. * z.string() // 必须是字符串
  5. z.string().min(1) // 字符串且不能是空字符串(最常用的"必填"写法)
  6. z.string().url() // 必须是合法 URL 格式(http://xxx 或 https://xxx)
  7. z.string().length(3) // 字符串长度必须恰好是 3(比如货币代码 USD)
  8. z.enum(['a', 'b']) // 值必须是给定的几个字符串之一,多了写不了就用这个
  9. z.string().startsWith('pk_') // 必须以某个前缀开头
  10. .default('xxx') // 如果没配置,给个默认值,不会校验失败
  11. .optional() // 允许是 undefined(不常用在这里,因为你都要求必填)
  12. */
  13. export const env = createEnv({
  14. /**
  15. * 服务端变量:只能在服务端代码里访问(API Route / Server Component / Server Action)
  16. * 客户端组件里引用会直接报错,防止密钥泄漏
  17. */
  18. server: {
  19. // 业务环境标识,限定只能是这几个值之一
  20. APP_ENV: z.enum(['development', 'test', 'production']),
  21. // NextAuth 配置
  22. NEXTAUTH_URL: z.url(),
  23. // NextAuth 官方建议至少 32 位随机字符串,这里加个长度校验,防止手滑写太短
  24. NEXTAUTH_SECRET: z.string().min(32, 'NEXTAUTH_SECRET 长度至少 32 位,建议用 openssl rand -base64 32 生成'),
  25. // PayPal
  26. PAYPAL_SANDBOX_CLIENT_ID: z.string().min(1),
  27. PAYPAL_PRODUCTION_CLIENT_ID: z.string().min(1),
  28. // 业务配置
  29. COMPANY_NAME: z.string().min(1),
  30. STORE_NAME: z.string().min(1),
  31. DEFAULT_CURRENCY: z.string().length(3), // 货币代码固定 3 位,比如 USD、CNY
  32. DEFAULT_LOCAL: z.string().min(2), // 语言代码,比如 en、zh-CN
  33. DEFAULT_CHANNEL: z.string().min(1),
  34. },
  35. /**
  36. * 客户端变量:必须以 NEXT_PUBLIC_ 开头,会被打包进浏览器 bundle,不要放密钥
  37. */
  38. client: {
  39. NEXT_PUBLIC_APP_ENV: z.enum(['development', 'test', 'production']),
  40. NEXT_PUBLIC_SITE_URL: z.url(),
  41. NEXT_PUBLIC_BAGISTO_ENDPOINT: z.url(),
  42. // storefront key 有固定前缀,顺手校验一下,配错了能第一时间发现
  43. NEXT_PUBLIC_BAGISTO_STOREFRONT_KEY: z.string().startsWith('pk_storefront_'),
  44. },
  45. /**
  46. * 只需要列出 client 变量即可,Next.js >= 13.4.4 都用这个写法
  47. */
  48. experimental__runtimeEnv: {
  49. NEXT_PUBLIC_APP_ENV: process.env.NEXT_PUBLIC_APP_ENV,
  50. NEXT_PUBLIC_SITE_URL: process.env.NEXT_PUBLIC_SITE_URL,
  51. NEXT_PUBLIC_BAGISTO_ENDPOINT: process.env.NEXT_PUBLIC_BAGISTO_ENDPOINT,
  52. NEXT_PUBLIC_BAGISTO_STOREFRONT_KEY: process.env.NEXT_PUBLIC_BAGISTO_STOREFRONT_KEY,
  53. },
  54. /**
  55. * docker build 或 CI 阶段如果没有真实环境变量,可以临时跳过校验
  56. * SKIP_ENV_VALIDATION 变量需要在docker的配置文件中注入
  57. */
  58. skipValidation: !!process.env.SKIP_ENV_VALIDATION,
  59. /**
  60. * .env 里如果某个变量写成空字符串(比如 XXX=),当作没配置处理,而不是校验通过一个空串
  61. */
  62. emptyStringAsUndefined: true,
  63. })