173 lines · 5.6 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;  readonly mobileOtlpTracesUrl: string | undefined;  readonly mobileOtlpTracesDataset: string | undefined;  readonly mobileOtlpTracesToken: string | undefined;  readonly relayClientOtlpTracesUrl: string | undefined;  readonly relayClientOtlpTracesDataset: string | undefined;  readonly relayClientOtlpTracesToken: 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,          VITE_CLERK_CLI_OAUTH_CLIENT_ID: config.clerkCliOAuthClientId,        }      : {}),    ...(config.relayUrl      ? {          T3CODE_RELAY_URL: config.relayUrl,          VITE_T3CODE_RELAY_URL: config.relayUrl,        }      : {}),    ...(config.mobileOtlpTracesUrl      ? {          T3CODE_MOBILE_OTLP_TRACES_URL: config.mobileOtlpTracesUrl,          EXPO_PUBLIC_OTLP_TRACES_URL: config.mobileOtlpTracesUrl,        }      : {}),    ...(config.mobileOtlpTracesDataset      ? {          T3CODE_MOBILE_OTLP_TRACES_DATASET: config.mobileOtlpTracesDataset,          EXPO_PUBLIC_OTLP_TRACES_DATASET: config.mobileOtlpTracesDataset,        }      : {}),    ...(config.mobileOtlpTracesToken      ? {          T3CODE_MOBILE_OTLP_TRACES_TOKEN: config.mobileOtlpTracesToken,          EXPO_PUBLIC_OTLP_TRACES_TOKEN: config.mobileOtlpTracesToken,        }      : {}),    ...(config.relayClientOtlpTracesUrl      ? {          T3CODE_RELAY_CLIENT_OTLP_TRACES_URL: config.relayClientOtlpTracesUrl,          VITE_RELAY_OTLP_TRACES_URL: config.relayClientOtlpTracesUrl,        }      : {}),    ...(config.relayClientOtlpTracesDataset      ? {          T3CODE_RELAY_CLIENT_OTLP_TRACES_DATASET: config.relayClientOtlpTracesDataset,          VITE_RELAY_OTLP_TRACES_DATASET: config.relayClientOtlpTracesDataset,        }      : {}),    ...(config.relayClientOtlpTracesToken      ? {          T3CODE_RELAY_CLIENT_OTLP_TRACES_TOKEN: config.relayClientOtlpTracesToken,          VITE_RELAY_OTLP_TRACES_TOKEN: config.relayClientOtlpTracesToken,        }      : {}),  };} 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",      "VITE_CLERK_CLI_OAUTH_CLIENT_ID",    ),    relayUrl: firstNonEmpty(sources, "T3CODE_RELAY_URL", "VITE_T3CODE_RELAY_URL"),    mobileOtlpTracesUrl: firstNonEmpty(      sources,      "T3CODE_MOBILE_OTLP_TRACES_URL",      "EXPO_PUBLIC_OTLP_TRACES_URL",    ),    mobileOtlpTracesDataset: firstNonEmpty(      sources,      "T3CODE_MOBILE_OTLP_TRACES_DATASET",      "EXPO_PUBLIC_OTLP_TRACES_DATASET",    ),    mobileOtlpTracesToken: firstNonEmpty(      sources,      "T3CODE_MOBILE_OTLP_TRACES_TOKEN",      "EXPO_PUBLIC_OTLP_TRACES_TOKEN",    ),    relayClientOtlpTracesUrl: firstNonEmpty(      sources,      "T3CODE_RELAY_CLIENT_OTLP_TRACES_URL",      "VITE_RELAY_OTLP_TRACES_URL",    ),    relayClientOtlpTracesDataset: firstNonEmpty(      sources,      "T3CODE_RELAY_CLIENT_OTLP_TRACES_DATASET",      "VITE_RELAY_OTLP_TRACES_DATASET",    ),    relayClientOtlpTracesToken: firstNonEmpty(      sources,      "T3CODE_RELAY_CLIENT_OTLP_TRACES_TOKEN",      "VITE_RELAY_OTLP_TRACES_TOKEN",    ),  };} 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")) : {};}