chore: relax env parsing for deploy

This commit is contained in:
Esdras Renan 2025-11-19 16:30:39 -03:00
parent e1ecf20346
commit 784962947a

View file

@ -1,12 +1,24 @@
import { z } from "zod" import { z } from "zod"
const urlField = () =>
z.preprocess(
(value) => (typeof value === "string" ? value.trim() || undefined : value),
z.string().url().optional()
)
const stringField = () =>
z.preprocess(
(value) => (typeof value === "string" ? value.trim() || undefined : value),
z.string().min(1).optional()
)
const envSchema = z.object({ const envSchema = z.object({
BETTER_AUTH_SECRET: z.string().min(1).optional(), BETTER_AUTH_SECRET: stringField().or(z.literal("")).optional(),
BETTER_AUTH_URL: z.string().url().optional(), BETTER_AUTH_URL: urlField().or(z.literal("")).optional(),
NEXT_PUBLIC_CONVEX_URL: z.string().url().optional(), NEXT_PUBLIC_CONVEX_URL: urlField().or(z.literal("")).optional(),
CONVEX_INTERNAL_URL: z.string().url().optional(), CONVEX_INTERNAL_URL: urlField().or(z.literal("")).optional(),
DATABASE_URL: z.string().min(1).optional(), DATABASE_URL: stringField().or(z.literal("")).optional(),
NEXT_PUBLIC_APP_URL: z.string().url().optional(), NEXT_PUBLIC_APP_URL: urlField().or(z.literal("")).optional(),
MACHINE_PROVISIONING_SECRET: z.string().optional(), MACHINE_PROVISIONING_SECRET: z.string().optional(),
MACHINE_TOKEN_TTL_MS: z.coerce.number().optional(), MACHINE_TOKEN_TTL_MS: z.coerce.number().optional(),
FLEET_SYNC_SECRET: z.string().optional(), FLEET_SYNC_SECRET: z.string().optional(),
@ -20,7 +32,7 @@ const envSchema = z.object({
SMTP_TLS: z.string().optional(), SMTP_TLS: z.string().optional(),
MAILER_SENDER_EMAIL: z.string().optional(), MAILER_SENDER_EMAIL: z.string().optional(),
REPORTS_CRON_SECRET: z.string().optional(), REPORTS_CRON_SECRET: z.string().optional(),
REPORTS_CRON_BASE_URL: z.string().url().optional(), REPORTS_CRON_BASE_URL: urlField().or(z.literal("")).optional(),
}) })
const parsed = envSchema.safeParse(process.env) const parsed = envSchema.safeParse(process.env)
@ -33,7 +45,7 @@ if (!parsed.success) {
const isBuildPhase = process.env.NEXT_PHASE === "phase-production-build" const isBuildPhase = process.env.NEXT_PHASE === "phase-production-build"
function resolveSecret(value: string | undefined, key: string) { function resolveSecret(value: string | undefined, key: string) {
if (value) return value if (value && value.length > 0) return value
const fallback = isBuildPhase ? `build-placeholder-${key.toLowerCase()}` : `dev-${key.toLowerCase()}` const fallback = isBuildPhase ? `build-placeholder-${key.toLowerCase()}` : `dev-${key.toLowerCase()}`
if (process.env.NODE_ENV === "production" && !isBuildPhase) { if (process.env.NODE_ENV === "production" && !isBuildPhase) {
throw new Error(`${key} must be set in production runtime environment`) throw new Error(`${key} must be set in production runtime environment`)