refactor: use yup custom validator

This commit is contained in:
ReaJason
2025-05-28 01:22:54 +08:00
parent 55e2b2f5a6
commit df6125c046
8 changed files with 176 additions and 72 deletions
+50 -9
View File
@@ -1,11 +1,51 @@
import * as z from "zod";
import * as yup from "yup";
const EnvSchema = z.object({
API_URL: z.optional(z.string()),
BASE_PATH: z.optional(z.string()),
MODE: z.string(),
const EnvSchema = yup.object({
API_URL: yup.string().optional(),
BASE_PATH: yup.string().optional(),
MODE: yup.string().required(),
});
type EnvSchema = yup.InferType<typeof EnvSchema>;
function safeParseYup<T>(schema: yup.ObjectSchema<any>, data: unknown) {
try {
const validatedData = schema.validateSync(data, {
abortEarly: false,
stripUnknown: true
});
return {
success: true as const,
data: validatedData as T,
error: undefined,
};
} catch (error) {
if (error instanceof yup.ValidationError) {
return {
success: false as const,
data: undefined,
error: {
issues: error.inner.map(err => ({
path: err.path?.split('.') || [],
message: err.message,
code: err.type ?? 'validation_error',
})),
message: error.message,
},
};
}
return {
success: false as const,
data: undefined,
error: {
issues: [],
message: 'Unknown validation error',
},
};
}
}
const createEnv = () => {
// @ts-ignore
const envVars = Object.entries(import.meta.env).reduce<Record<string, string>>((acc, curr) => {
@@ -20,14 +60,15 @@ const createEnv = () => {
}
return acc;
}, {});
const parsedEnv = EnvSchema.safeParse(envVars);
console.log(envVars)
const parsedEnv = safeParseYup<EnvSchema>(EnvSchema, envVars);
if (!parsedEnv.success) {
throw new Error(
`Invalid env provided.
The following variables are missing or invalid:
${Object.entries(parsedEnv.error.flatten().fieldErrors)
.map(([k, v]) => `- ${k}: ${v}`)
.join("\n")}
${parsedEnv.error.issues
.map(({ path, message }) => `- ${path}: ${message}`)
.join("\n")}
`,
);
}