Skip to content

Commit 6adfcb0

Browse files
authored
refactor: use virtual module for env-config (@fehmer) (monkeytypegame#7095)
1 parent 556208e commit 6adfcb0

File tree

18 files changed

+99
-78
lines changed

18 files changed

+99
-78
lines changed

frontend/scripts/env-config.ts

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
import { Plugin } from "vite";
2+
import { EnvConfig } from "virtual:env-config";
3+
4+
const virtualModuleId = "virtual:env-config";
5+
const resolvedVirtualModuleId = "\0" + virtualModuleId;
6+
7+
const developmentConfig: EnvConfig = {
8+
isDevelopment: true,
9+
backendUrl: fallbackEnv("BACKEND_URL", "http://localhost:5005"),
10+
clientVersion: "DEVELOPMENT_CLIENT",
11+
recaptchaSiteKey: "6LeIxAcTAAAAAJcZVRqyHh71UMIEGNQ_MXjiZKhI",
12+
quickLoginEmail: process.env["QUICK_LOGIN_EMAIL"],
13+
quickLoginPassword: process.env["QUICK_LOGIN_PASSWORD"],
14+
};
15+
const productionConfig: Omit<EnvConfig, "clientVersion"> = {
16+
isDevelopment: false,
17+
backendUrl: fallbackEnv("BACKEND_URL", "https://api.monkeytype.com"),
18+
recaptchaSiteKey: process.env["RECAPTCHA_SITE_KEY"] ?? "",
19+
quickLoginEmail: undefined,
20+
quickLoginPassword: undefined,
21+
};
22+
23+
export function envConfig(
24+
options:
25+
| {
26+
isDevelopment: true;
27+
}
28+
| {
29+
isDevelopment: false;
30+
clientVersion: string;
31+
}
32+
): Plugin {
33+
return {
34+
name: "virtual-env-config",
35+
resolveId(id) {
36+
if (id === virtualModuleId) return resolvedVirtualModuleId;
37+
return;
38+
},
39+
load(id) {
40+
if (id === resolvedVirtualModuleId) {
41+
const envConfig = options.isDevelopment
42+
? developmentConfig
43+
: {
44+
...productionConfig,
45+
clientVersion: options.clientVersion,
46+
};
47+
48+
return `
49+
export const envConfig = ${JSON.stringify(envConfig)};
50+
`;
51+
}
52+
return;
53+
},
54+
};
55+
}
56+
57+
function fallbackEnv(envVariable: string, fallback: string): string {
58+
const value = process.env[envVariable];
59+
if (value === null || value === undefined || value === "") return fallback;
60+
return value;
61+
}

frontend/scripts/language-hashes.ts

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,8 @@ import { createHash } from "crypto";
55

66
const virtualModuleId = "virtual:language-hashes";
77
const resolvedVirtualModuleId = "\0" + virtualModuleId;
8-
let skip = false;
98

10-
export function languageHashes(): Plugin {
9+
export function languageHashes(options?: { skip: boolean }): Plugin {
1110
return {
1211
name: "virtual-language-hashes",
1312
resolveId(id) {
@@ -16,19 +15,17 @@ export function languageHashes(): Plugin {
1615
},
1716
load(id) {
1817
if (id === resolvedVirtualModuleId) {
19-
const hashes: Record<string, string> = skip ? {} : getHashes();
18+
if (options?.skip) {
19+
console.log("Skipping language hashing in dev environment.");
20+
}
21+
22+
const hashes: Record<string, string> = options?.skip ? {} : getHashes();
2023
return `
2124
export const languageHashes = ${JSON.stringify(hashes)};
2225
`;
2326
}
2427
return;
2528
},
26-
configResolved(resolvedConfig) {
27-
if (resolvedConfig?.define?.["IS_DEVELOPMENT"] === "true") {
28-
skip = true;
29-
console.log("Skipping language hashing in dev environment.");
30-
}
31-
},
3229
};
3330
}
3431

frontend/src/ts/ape/adapters/ts-rest-adapter.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import {
44
tsRestFetchApi,
55
type ApiFetcherArgs,
66
} from "@ts-rest/core";
7-
import { envConfig } from "../../constants/env-config";
7+
import { envConfig } from "virtual:env-config";
88
import { getIdToken } from "../../firebase";
99
import {
1010
COMPATIBILITY_CHECK,

frontend/src/ts/ape/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { envConfig } from "../constants/env-config";
1+
import { envConfig } from "virtual:env-config";
22
import { buildClient } from "./adapters/ts-rest-adapter";
33
import { contract } from "@monkeytype/contracts";
44
import { devContract } from "@monkeytype/contracts/dev";

frontend/src/ts/constants/env-config.ts

Lines changed: 0 additions & 31 deletions
This file was deleted.

frontend/src/ts/controllers/captcha-controller.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,4 @@
1-
/* eslint-disable @typescript-eslint/no-unsafe-call */
2-
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
3-
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
4-
import { envConfig } from "../constants/env-config";
1+
import { envConfig } from "virtual:env-config";
52
const siteKey = envConfig.recaptchaSiteKey;
63

74
const captchas: Record<string, number> = {};

frontend/src/ts/elements/no-css.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { envConfig } from "../constants/env-config";
1+
import { envConfig } from "virtual:env-config";
22

33
$("#nocss .requestedStylesheets").html(
44
"Requested stylesheets:<br>" +

frontend/src/ts/event-handlers/footer.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import * as Commandline from "../commandline/commandline";
66
import * as SupportPopup from "../modals/support";
77
import * as ContactModal from "../modals/contact";
88
import * as VersionHistoryModal from "../modals/version-history";
9-
import { envConfig } from "../constants/env-config";
9+
import { envConfig } from "virtual:env-config";
1010
import { COMPATIBILITY_CHECK } from "@monkeytype/contracts";
1111
import { lastSeenServerCompatibility } from "../ape/adapters/ts-rest-adapter";
1212

frontend/src/ts/modals/dev-options.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { envConfig } from "../constants/env-config";
1+
import { envConfig } from "virtual:env-config";
22
import AnimatedModal from "../utils/animated-modal";
33
import { showPopup } from "./simple-modals";
44
import * as Notifications from "../elements/notifications";

frontend/src/ts/sentry.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { envConfig } from "./constants/env-config";
1+
import { envConfig } from "virtual:env-config";
22

33
async function getSentry(): Promise<typeof import("@sentry/browser")> {
44
return await import("@sentry/browser");

0 commit comments

Comments
 (0)