Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 12 additions & 1 deletion web/app/env.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ const isVercelNonPreviewDeployment =
process.env.VERCEL === "1" &&
typeof process.env.VERCEL_ENV === "string" &&
process.env.VERCEL_ENV !== "preview";
const isVercelProductionDeployment =
process.env.VERCEL === "1" && process.env.VERCEL_ENV === "production";
const requireVercelNonPreviewValue = (name: string): z.ZodType<string | undefined> =>
z.string().min(1).optional().superRefine((value, context) => {
if (isVercelNonPreviewDeployment && !value) {
Expand All @@ -30,6 +32,15 @@ const requireVercelNonPreviewValue = (name: string): z.ZodType<string | undefine
});
}
});
const requireVercelProductionValue = (name: string): z.ZodType<string | undefined> =>
z.string().min(1).optional().superRefine((value, context) => {
if (isVercelProductionDeployment && !value) {
context.addIssue({
code: z.ZodIssueCode.custom,
message: `${name} is required for Vercel production runtimes`,
Comment thread
coderabbitai[bot] marked this conversation as resolved.
});
}
});

const stackEnv = (
value: string | undefined,
Expand All @@ -46,7 +57,7 @@ export const env = createEnv({
CMUX_FEEDBACK_FROM_EMAIL: z.string().email(),
CMUX_FEEDBACK_RATE_LIMIT_ID: z.string().min(1),
CMUX_CLIENT_CONFIG_RATE_LIMIT_ID: requireVercelNonPreviewValue("CMUX_CLIENT_CONFIG_RATE_LIMIT_ID"),
CMUX_ANALYTICS_RATE_LIMIT_ID: z.string().min(1).optional(),
CMUX_ANALYTICS_RATE_LIMIT_ID: requireVercelProductionValue("CMUX_ANALYTICS_RATE_LIMIT_ID"),
STACK_SECRET_SERVER_KEY: z.string().min(1),
// APNs push (iOS notifications). Optional: the app boots without them; the
// push route returns a clear "not configured" error until they are set.
Expand Down
26 changes: 25 additions & 1 deletion web/tests/client-config-env.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,12 +35,36 @@ describe("client config env validation", () => {
expect(result.stderr).toContain("CMUX_CLIENT_CONFIG_RATE_LIMIT_ID is required");
});

test("accepts explicit Vercel production deployments with the limiter id", () => {
test("accepts explicit Vercel production deployments with both limiter ids", () => {
const result = importEnv({
...requiredEnv,
VERCEL: "1",
VERCEL_ENV: "production",
CMUX_CLIENT_CONFIG_RATE_LIMIT_ID: "client-config-rule",
CMUX_ANALYTICS_RATE_LIMIT_ID: "analytics-rule",
});

expect(result.exitCode).toBe(0);
});

test("requires the analytics limiter id in explicit Vercel production deployments", () => {
const result = importEnv({
...requiredEnv,
VERCEL: "1",
VERCEL_ENV: "production",
CMUX_CLIENT_CONFIG_RATE_LIMIT_ID: "client-config-rule",
});

expect(result.exitCode).not.toBe(0);
expect(result.stderr).toContain("CMUX_ANALYTICS_RATE_LIMIT_ID is required");
});

test("allows Vercel development without the analytics limiter id", () => {
const result = importEnv({
...requiredEnv,
VERCEL: "1",
VERCEL_ENV: "development",
CMUX_CLIENT_CONFIG_RATE_LIMIT_ID: "client-config-rule",
});

expect(result.exitCode).toBe(0);
Expand Down