1// @effect-diagnostics nodeBuiltinImport:off - Tests exercise root env file precedence directly.
2import * as NodeFS from "node:fs";
3import * as NodeOS from "node:os";
4import * as NodePath from "node:path";
5import { afterEach, describe, expect, it } from "vite-plus/test";
6
7import { loadRepoEnv, resolvePublicConfig } from "./public-config.ts";
8
9const temporaryDirectories: string[] = [];
10
11afterEach(() => {
12 for (const directory of temporaryDirectories.splice(0)) {
13 NodeFS.rmSync(directory, { recursive: true, force: true });
14 }
15});
16
17describe("loadRepoEnv", () => {
18 it("does not project cloud configuration for an unconfigured clone", () => {
19 const env = loadRepoEnv({ baseEnv: {}, repoRoot: makeTemporaryDirectory() });
20
21 expect(env.T3CODE_CLERK_PUBLISHABLE_KEY).toBeUndefined();
22 expect(env.T3CODE_CLERK_CLI_OAUTH_CLIENT_ID).toBeUndefined();
23 expect(env.VITE_CLERK_PUBLISHABLE_KEY).toBeUndefined();
24 expect(env.EXPO_PUBLIC_CLERK_PUBLISHABLE_KEY).toBeUndefined();
25 expect(env.T3CODE_CLERK_JWT_TEMPLATE).toBeUndefined();
26 expect(env.VITE_CLERK_JWT_TEMPLATE).toBeUndefined();
27 expect(env.EXPO_PUBLIC_CLERK_JWT_TEMPLATE).toBeUndefined();
28 expect(env.T3CODE_RELAY_URL).toBeUndefined();
29 expect(env.VITE_T3CODE_RELAY_URL).toBeUndefined();
30 });
31
32 it("applies process, root local, and root precedence in that order", () => {
33 const repoRoot = makeTemporaryDirectory();
34 NodeFS.writeFileSync(
35 NodePath.join(repoRoot, ".env"),
36 "T3CODE_CLERK_PUBLISHABLE_KEY=pk_root\nT3CODE_CLERK_JWT_TEMPLATE=template_root\nT3CODE_CLERK_CLI_OAUTH_CLIENT_ID=oauth_root\nT3CODE_RELAY_URL=https://root.example.test\n",
37 );
38 NodeFS.writeFileSync(
39 NodePath.join(repoRoot, ".env.local"),
40 "T3CODE_CLERK_PUBLISHABLE_KEY=pk_local\nT3CODE_CLERK_JWT_TEMPLATE=template_local\nT3CODE_CLERK_CLI_OAUTH_CLIENT_ID=oauth_local\nT3CODE_RELAY_URL=https://local.example.test\n",
41 );
42
43 expect(loadRepoEnv({ baseEnv: {}, repoRoot }).T3CODE_RELAY_URL).toBe(
44 "https://local.example.test",
45 );
46 expect(
47 loadRepoEnv({
48 baseEnv: {
49 T3CODE_CLERK_PUBLISHABLE_KEY: "pk_ci",
50 T3CODE_CLERK_JWT_TEMPLATE: "template_ci",
51 T3CODE_CLERK_CLI_OAUTH_CLIENT_ID: "oauth_ci",
52 T3CODE_RELAY_URL: "https://ci.example.test",
53 },
54 repoRoot,
55 }),
56 ).toMatchObject({
57 T3CODE_CLERK_PUBLISHABLE_KEY: "pk_ci",
58 T3CODE_CLERK_CLI_OAUTH_CLIENT_ID: "oauth_ci",
59 VITE_CLERK_PUBLISHABLE_KEY: "pk_ci",
60 EXPO_PUBLIC_CLERK_PUBLISHABLE_KEY: "pk_ci",
61 T3CODE_CLERK_JWT_TEMPLATE: "template_ci",
62 VITE_CLERK_JWT_TEMPLATE: "template_ci",
63 EXPO_PUBLIC_CLERK_JWT_TEMPLATE: "template_ci",
64 T3CODE_RELAY_URL: "https://ci.example.test",
65 VITE_T3CODE_RELAY_URL: "https://ci.example.test",
66 });
67 });
68
69 it("accepts legacy framework aliases as root overrides", () => {
70 expect(
71 resolvePublicConfig({
72 VITE_CLERK_PUBLISHABLE_KEY: "pk_legacy",
73 VITE_CLERK_JWT_TEMPLATE: "template_legacy",
74 T3CODE_CLERK_CLI_OAUTH_CLIENT_ID: "oauth_canonical",
75 VITE_T3CODE_RELAY_URL: "https://legacy.example.test",
76 }),
77 ).toEqual({
78 clerkPublishableKey: "pk_legacy",
79 clerkJwtTemplate: "template_legacy",
80 clerkCliOAuthClientId: "oauth_canonical",
81 relayUrl: "https://legacy.example.test",
82 });
83 });
84});
85
86function makeTemporaryDirectory() {
87 const directory = NodeFS.mkdtempSync(NodePath.join(NodeOS.tmpdir(), "t3code-public-config-"));
88 temporaryDirectories.push(directory);
89 return directory;
90}