96 lines · 3.0 KB · TypeScript
RawDownload
// @effect-diagnostics nodeBuiltinImport:off - Build bootstrap reads optional root env files before an Effect runtime exists.import * as NodeFS from "node:fs";import * as NodePath from "node:path";import * as NodeURL from "node:url";import * as NodeUtil from "node:util"; export interface T3CodePublicConfig {  readonly clerkPublishableKey: string | undefined;  readonly clerkJwtTemplate: string | undefined;  readonly clerkCliOAuthClientId: string | undefined;  readonly relayUrl: string | undefined;} type Environment = Readonly<Record<string, string | undefined>>; const REPO_ROOT = NodePath.dirname(  NodePath.dirname(NodePath.dirname(NodeURL.fileURLToPath(import.meta.url))),); export function loadRepoEnv({  baseEnv = process.env,  repoRoot = REPO_ROOT,}: {  readonly baseEnv?: Environment;  readonly repoRoot?: string;} = {}): Record<string, string | undefined> {  const rootEnv = readEnvFile(NodePath.join(repoRoot, ".env"));  const localEnv = readEnvFile(NodePath.join(repoRoot, ".env.local"));  const config = resolvePublicConfig(baseEnv, localEnv, rootEnv);   return {    ...rootEnv,    ...localEnv,    ...baseEnv,    ...(config.clerkPublishableKey      ? {          T3CODE_CLERK_PUBLISHABLE_KEY: config.clerkPublishableKey,          VITE_CLERK_PUBLISHABLE_KEY: config.clerkPublishableKey,          EXPO_PUBLIC_CLERK_PUBLISHABLE_KEY: config.clerkPublishableKey,        }      : {}),    ...(config.clerkJwtTemplate      ? {          T3CODE_CLERK_JWT_TEMPLATE: config.clerkJwtTemplate,          VITE_CLERK_JWT_TEMPLATE: config.clerkJwtTemplate,          EXPO_PUBLIC_CLERK_JWT_TEMPLATE: config.clerkJwtTemplate,        }      : {}),    ...(config.clerkCliOAuthClientId      ? {          T3CODE_CLERK_CLI_OAUTH_CLIENT_ID: config.clerkCliOAuthClientId,        }      : {}),    ...(config.relayUrl      ? {          T3CODE_RELAY_URL: config.relayUrl,          VITE_T3CODE_RELAY_URL: config.relayUrl,        }      : {}),  };} export function resolvePublicConfig(...sources: readonly Environment[]): T3CodePublicConfig {  return {    clerkPublishableKey: firstNonEmpty(      sources,      "T3CODE_CLERK_PUBLISHABLE_KEY",      "VITE_CLERK_PUBLISHABLE_KEY",      "EXPO_PUBLIC_CLERK_PUBLISHABLE_KEY",    ),    clerkJwtTemplate: firstNonEmpty(      sources,      "T3CODE_CLERK_JWT_TEMPLATE",      "VITE_CLERK_JWT_TEMPLATE",      "EXPO_PUBLIC_CLERK_JWT_TEMPLATE",    ),    clerkCliOAuthClientId: firstNonEmpty(sources, "T3CODE_CLERK_CLI_OAUTH_CLIENT_ID"),    relayUrl: firstNonEmpty(sources, "T3CODE_RELAY_URL", "VITE_T3CODE_RELAY_URL"),  };} function firstNonEmpty(sources: readonly Environment[], ...names: readonly string[]) {  for (const source of sources) {    for (const name of names) {      const value = source[name]?.trim();      if (value) {        return value;      }    }  }  return undefined;} function readEnvFile(path: string): Record<string, string | undefined> {  return NodeFS.existsSync(path) ? NodeUtil.parseEnv(NodeFS.readFileSync(path, "utf8")) : {};}