{"version":3,"sources":["../src/env.ts"],"sourcesContent":["export interface EnvSchema<TOutput = unknown> {\n  parse(value: unknown): TOutput;\n}\n\nexport type EnvParser<TOutput = unknown> =\n  | EnvSchema<TOutput>\n  | ((value: string | undefined, context: { key: string; scope: \"server\" | \"public\" }) => TOutput);\n\nexport type EnvShape = Record<string, EnvParser<any>>;\n\nexport type InferEnvParser<TParser> =\n  TParser extends EnvSchema<infer TOutput>\n    ? TOutput\n    : TParser extends (value: string | undefined, context: any) => infer TOutput\n      ? TOutput\n      : never;\n\nexport type InferEnvShape<TShape> = TShape extends EnvShape\n  ? { [K in keyof TShape]: InferEnvParser<TShape[K]> }\n  : {};\n\nexport interface FarmEnvConfig<\n  TServer extends EnvShape = EnvShape,\n  TPublic extends EnvShape = EnvShape,\n> {\n  server?: TServer;\n  public?: TPublic;\n}\n\nexport interface ResolvedFarmEnv<\n  TServer extends Record<string, any> = Record<string, unknown>,\n  TPublic extends Record<string, any> = Record<string, unknown>,\n> {\n  server: TServer;\n  public: TPublic;\n}\n\nexport type InferEnv<TConfig> =\n  TConfig extends FarmEnvConfig<infer TServer, infer TPublic>\n    ? ResolvedFarmEnv<InferEnvShape<TServer>, InferEnvShape<TPublic>>\n    : ResolvedFarmEnv;\n\n/**\n * Augmented by generated src/farm.d.ts for project-specific autocomplete.\n */\nexport interface FarmEnvTypes {}\n\nexport type FarmServerEnv = FarmEnvTypes extends { server: infer TServer }\n  ? TServer extends Record<string, any>\n    ? TServer\n    : Record<string, unknown>\n  : Record<string, unknown>;\n\nexport type FarmPublicEnv = FarmEnvTypes extends { public: infer TPublic }\n  ? TPublic extends Record<string, any>\n    ? TPublic\n    : Record<string, unknown>\n  : Record<string, unknown>;\n\nexport type FarmTypedEnv = ResolvedFarmEnv<FarmServerEnv, FarmPublicEnv>;\n\ndeclare const __FARM_PUBLIC_ENV__: Record<string, unknown> | undefined;\ndeclare const __FARM_ENV__: ResolvedFarmEnv | undefined;\n\nconst FARM_ENV_SYMBOL = Symbol.for(\"farm.env\");\nconst farmEnvGlobal = globalThis as typeof globalThis & {\n  [FARM_ENV_SYMBOL]?: ResolvedFarmEnv;\n};\nlet currentEnv: ResolvedFarmEnv = getInitialEnv();\n\nexport function resolveEnv<TConfig extends FarmEnvConfig<any, any> | undefined>(\n  config: TConfig,\n  source: Record<string, string | undefined> = getProcessEnv(),\n): InferEnv<NonNullable<TConfig>> {\n  const resolved = {\n    server: resolveEnvScope(config?.server, source, \"server\"),\n    public: resolveEnvScope(config?.public, source, \"public\"),\n  } as InferEnv<NonNullable<TConfig>>;\n\n  return resolved;\n}\n\nexport function setEnv(env: ResolvedFarmEnv): void {\n  currentEnv = normalizeResolvedEnv(env);\n  if (typeof window === \"undefined\") {\n    farmEnvGlobal[FARM_ENV_SYMBOL] = currentEnv;\n  }\n}\n\nexport function getResolvedEnv<TEnv extends ResolvedFarmEnv = FarmTypedEnv>(): TEnv {\n  return getCurrentEnv() as TEnv;\n}\n\nexport function getEnv<TServer extends Record<string, any> = FarmServerEnv>(): TServer;\nexport function getEnv<TKey extends Extract<keyof FarmServerEnv, string>>(\n  key: TKey,\n): FarmServerEnv[TKey];\nexport function getEnv(key?: string): unknown {\n  assertServerEnvAccess();\n  if (key === undefined) {\n    return getCurrentEnv().server;\n  }\n\n  return getCurrentEnv().server[key];\n}\n\nexport function getPublicEnv<TPublic extends Record<string, any> = FarmPublicEnv>(): TPublic;\nexport function getPublicEnv<TKey extends Extract<keyof FarmPublicEnv, string>>(\n  key: TKey,\n): FarmPublicEnv[TKey];\nexport function getPublicEnv(key?: string): unknown {\n  if (key === undefined) {\n    return getCurrentEnv().public;\n  }\n\n  return getCurrentEnv().public[key];\n}\n\nexport const env = createEnvProxy(\"server\") as FarmServerEnv;\nexport const serverEnv = env;\nexport const publicEnv = createEnvProxy(\"public\") as FarmPublicEnv;\n\nfunction resolveEnvScope(\n  shape: EnvShape | undefined,\n  source: Record<string, string | undefined>,\n  scope: \"server\" | \"public\",\n): Record<string, unknown> {\n  if (!shape) {\n    return {};\n  }\n\n  const resolved: Record<string, unknown> = {};\n\n  for (const [key, parser] of Object.entries(shape)) {\n    try {\n      resolved[key] = parseEnvValue(parser, source[key], key, scope);\n    } catch (error) {\n      const message = error instanceof Error ? error.message : String(error);\n      throw new Error(`Invalid ${scope} env \"${key}\": ${message}`);\n    }\n  }\n\n  return resolved;\n}\n\nfunction parseEnvValue(\n  parser: EnvParser<any>,\n  value: string | undefined,\n  key: string,\n  scope: \"server\" | \"public\",\n): unknown {\n  if (typeof parser === \"function\") {\n    return parser(value, { key, scope });\n  }\n\n  if (parser && typeof parser.parse === \"function\") {\n    return parser.parse(value);\n  }\n\n  throw new Error(\"expected a parser function or schema with parse()\");\n}\n\nfunction createEnvProxy(scope: \"server\" | \"public\"): Record<string, unknown> {\n  return new Proxy(\n    {},\n    {\n      get(_target, property) {\n        if (typeof property === \"symbol\") {\n          return undefined;\n        }\n\n        const env = getEnvScope(scope);\n        return env[property];\n      },\n      ownKeys() {\n        return Reflect.ownKeys(getEnvScope(scope));\n      },\n      getOwnPropertyDescriptor(_target, property) {\n        const env = getEnvScope(scope);\n        if (!(property in env)) {\n          return undefined;\n        }\n\n        return {\n          enumerable: true,\n          configurable: true,\n          value: env[property as keyof typeof env],\n        };\n      },\n      has(_target, property) {\n        return property in getEnvScope(scope);\n      },\n    },\n  );\n}\n\nfunction getEnvScope(scope: \"server\" | \"public\"): Record<string, unknown> {\n  if (scope === \"server\") {\n    assertServerEnvAccess();\n  }\n\n  return getCurrentEnv()[scope] || {};\n}\n\nfunction assertServerEnvAccess(): void {\n  if (typeof window !== \"undefined\") {\n    throw new Error(\"Farm server env is not available in the browser. Use publicEnv.\");\n  }\n}\n\nfunction getInitialEnv(): ResolvedFarmEnv {\n  const injectedEnv = getInjectedEnv();\n  if (injectedEnv) {\n    return injectedEnv;\n  }\n\n  if (typeof window === \"undefined\" && farmEnvGlobal[FARM_ENV_SYMBOL]) {\n    return normalizeResolvedEnv(farmEnvGlobal[FARM_ENV_SYMBOL]);\n  }\n\n  return {\n    server: {},\n    public: getInjectedPublicEnv(),\n  };\n}\n\nfunction getCurrentEnv(): ResolvedFarmEnv {\n  if (typeof window === \"undefined\" && farmEnvGlobal[FARM_ENV_SYMBOL]) {\n    return farmEnvGlobal[FARM_ENV_SYMBOL];\n  }\n\n  return currentEnv;\n}\n\nfunction getInjectedEnv(): ResolvedFarmEnv | null {\n  try {\n    if (typeof __FARM_ENV__ !== \"undefined\" && __FARM_ENV__) {\n      return normalizeResolvedEnv(__FARM_ENV__);\n    }\n  } catch {\n    // The compile-time global is only defined in Farm server bundles.\n  }\n\n  return null;\n}\n\nfunction getInjectedPublicEnv(): Record<string, unknown> {\n  try {\n    if (typeof __FARM_PUBLIC_ENV__ !== \"undefined\" && __FARM_PUBLIC_ENV__) {\n      return __FARM_PUBLIC_ENV__;\n    }\n  } catch {\n    // The compile-time global is only defined in Farm browser bundles.\n  }\n\n  return {};\n}\n\nfunction normalizeResolvedEnv(env: ResolvedFarmEnv): ResolvedFarmEnv {\n  return {\n    server: isRecord(env.server) ? env.server : {},\n    public: isRecord(env.public) ? env.public : {},\n  };\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n  return !!value && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction getProcessEnv(): Record<string, string | undefined> {\n  if (typeof process !== \"undefined\" && process.env) {\n    return process.env;\n  }\n\n  return {};\n}\n"],"mappings":"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","names":["env"]}