diff --git a/app/root.tsx b/app/root.tsx
index 8813dc5bb0..2f55dc791e 100644
--- a/app/root.tsx
+++ b/app/root.tsx
@@ -23,8 +23,7 @@ import type { UserTable } from "./db/models";
import { $R, R } from "./misc/routes";
import { HideRecaptchaBadge } from "./routes/users/register";
import { trpc } from "./trpc/client";
-import { publicConfig } from "./utils/config";
-import { ConfigPlaceholder } from "./utils/config-placeholder";
+import { CONFIG_SCRIPT_PLACEHOLDER, publicConfig } from "./utils/config";
import { useFlashMessages } from "./utils/flash-message-hook";
import { RootLoaderData, useRootLoaderData } from "./utils/loader-utils";
import { makeLoader } from "./utils/loader-utils.server";
@@ -73,10 +72,19 @@ export default function DefaultComponent() {
-
-
-
+
+
{/* TODO: default position="top" is fine? */}
@@ -99,19 +107,6 @@ export default function DefaultComponent() {
);
}
-function ThemeScript() {
- return (
-
- );
-}
-
function Root() {
const data = useRootLoaderData();
useFlashMessages(data.flashMessages);
diff --git a/app/utils/config-placeholder.tsx b/app/utils/config-placeholder.tsx
deleted file mode 100644
index 1ab7f08a50..0000000000
--- a/app/utils/config-placeholder.tsx
+++ /dev/null
@@ -1,16 +0,0 @@
-import { CONFIG_SCRIPT_ID, CONFIG_SCRIPT_PLACEHOLDER } from "./config";
-
-// split from config.ts to workaround playwright transpilation
-
-// modified by server (injectConfigScript)
-// read by client (initializeConfigClient)
-export function ConfigPlaceholder() {
- return (
-
- );
-}
diff --git a/app/utils/config.ts b/app/utils/config.ts
index 91a49bbc79..76a829a7f3 100644
--- a/app/utils/config.ts
+++ b/app/utils/config.ts
@@ -1,5 +1,5 @@
import * as process from "process";
-import { once, tinyassert } from "@hiogawa/utils";
+import { once } from "@hiogawa/utils";
import { z } from "zod";
import { uninitialized } from "./misc";
@@ -29,13 +29,19 @@ const Z_PUBLIC_CONFIG = z.object({
VERCEL_ENV: z.string().optional(),
});
+// prettier-ignore
+const Z_BUILD_CONFIG = z.object({
+ // build time constants injected via esbuild "define" options
+ GIT_COMMIT_REF: z.string().optional(),
+});
+
export let serverConfig = uninitialized as z.infer;
export let publicConfig = uninitialized as z.infer;
-export const CONFIG_SCRIPT_ID = "__configScript";
+export let buildConfig = uninitialized as z.infer;
-export const CONFIG_SCRIPT_PLACEHOLDER = "@@__configScriptPlaceholder@@";
+export const CONFIG_SCRIPT_PLACEHOLDER = "/*@@INJECT_CONFIG_SCRIPT@@*/";
//
// server
@@ -44,13 +50,21 @@ export const CONFIG_SCRIPT_PLACEHOLDER = "@@__configScriptPlaceholder@@";
export const initializeConfigServer = once(() => {
serverConfig = Z_SERVER_CONFIG.parse(process.env);
publicConfig = Z_PUBLIC_CONFIG.parse(process.env);
+ // esbuild injects BUILD_CONFIG_DEFINE on release build
+ buildConfig = Z_BUILD_CONFIG.parse(process.env.BUILD_CONFIG_DEFINE ?? {});
});
+// pass data to client via global script
+declare let __publicConfig: any;
+declare let __buildConfig: any;
+
export function injectConfigScript(markup: string): string {
- return markup.replace(
- CONFIG_SCRIPT_PLACEHOLDER,
- JSON.stringify(publicConfig)
- );
+ // TODO: need to escape?
+ const code = `
+globalThis.__publicConfig = ${JSON.stringify(publicConfig)};
+globalThis.__buildConfig = ${JSON.stringify(buildConfig)};
+`;
+ return markup.replace(CONFIG_SCRIPT_PLACEHOLDER, code);
}
//
@@ -58,7 +72,6 @@ export function injectConfigScript(markup: string): string {
//
export const initializeConfigClient = once(() => {
- const el = document.querySelector("#" + CONFIG_SCRIPT_ID);
- tinyassert(el);
- publicConfig = JSON.parse(el.innerHTML);
+ publicConfig = __publicConfig;
+ buildConfig = __buildConfig;
});
diff --git a/misc/build/bundle-vercel.ts b/misc/build/bundle-vercel.ts
index 9936a38a2d..cbb6d3bf92 100644
--- a/misc/build/bundle-vercel.ts
+++ b/misc/build/bundle-vercel.ts
@@ -1,5 +1,7 @@
+import { execSync } from "child_process";
import fs from "node:fs";
import esbuild from "esbuild";
+import type { buildConfig } from "../../app/utils/config";
// used by scripts/vercel.sh to
// - bundle server app for simpler vercel deployment
@@ -9,6 +11,14 @@ import esbuild from "esbuild";
// - https://esbuild.github.io/plugins/
// - https://github.com/evanw/esbuild/issues/1685#issuecomment-944916409
+const GIT_COMMIT_REF = execSync("git rev-parse HEAD", {
+ encoding: "utf8",
+}).trim();
+
+const BUILD_CONFIG_DEFINE: typeof buildConfig = {
+ GIT_COMMIT_REF,
+};
+
esbuild.build({
logLevel: "info",
entryPoints: ["./build/remix/production/server/index.js"],
@@ -27,6 +37,9 @@ esbuild.build({
"pg-query-stream",
],
plugins: [noSourceMapNodeModulesPlugin()],
+ define: {
+ "process.env.BUILD_CONFIG_DEFINE": JSON.stringify(BUILD_CONFIG_DEFINE),
+ },
});
// https://github.com/evanw/esbuild/issues/1685#issuecomment-944916409