Safe Parse
JSON x Zod (Schema Validation)
safeParse.ts
ts
import { z } from "zod";
export const safeParse = <T extends z.ZodType>(value: string, schema: T): z.infer<T> => {
try {
const data = JSON.parse(value);
return schema.parse(data);
} catch (err) {
if (err instanceof z.ZodError) {
throw new Error("Validation Error");
}
throw new Error("Parsing Failure");
}
};safeParse.spec.ts
ts
import { z } from "zod";
import { safeParse } from "./safeParse";
describe("safeParse", () => {
const accessTokenSchema = z.object({
access_token: z.string(),
expires_in: z.number()
});
type AccessToken = z.infer<typeof accessTokenSchema>;
it("should (safe) parse json", () => {
const str = `
{
"access_token": "eyJiZWFyZXIiOiJ0b2tlbiJ9",
"expires_in": 300
}
`;
const data: AccessToken = safeParse(str, accessTokenSchema);
expect(data.access_token).toEqual("eyJiZWFyZXIiOiJ0b2tlbiJ9");
expect(data.expires_in).toEqual(300);
});
it("should throw an (validation) error", () => {
const str = `
{
"bearer_token": "eyJiZWFyZXIiOiJ0b2tlbiJ9",
"expires_in": "300"
}
`;
expect(() => safeParse(str, accessTokenSchema)).toThrow("Validation Error");
});
});