تحويل JSON Schema إلى مخطط Zod — Numio
يُنشئ شيفرة تحقق Zod من JSON Schema باستخدام json-schema-to-zod. تصبح القيود مثل minLength وminimum وpattern وdefault توابع Zod متسلسلة، وتحصل الخصائص غير المدرجة في "required" على .optional().
تتلقى JSON Schema من فريق آخر وتريد تحققًا وقت التشغيل في خدمة TypeScript دون مدقق JSON Schema.
متى تستخدمها
- تتلقى JSON Schema من فريق آخر وتريد تحققًا وقت التشغيل في خدمة TypeScript دون مدقق JSON Schema.
- تنقل التحقق من النماذج من مدقق JSON Schema مثل Ajv إلى Zod وتريد شيفرة مولَّدة تبدأ منها.
طريقة الاستخدام
- الصق JSON Schema في لوحة JSON Schema.
- اختياريًا، افتح الإعدادات وغيّر Root Schema Name (الافتراضي "schema")؛ ويصبح اسم const المُصدَّر.
- انسخ الشيفرة المولَّدة، التي تستورد z من "zod"، إلى مشروعك. يجري التحويل في المتصفح.
JSON Schema
{
"type": "object",
"properties": {
"username": { "type": "string", "minLength": 3, "maxLength": 20 },
"age": { "type": "integer", "minimum": 18 },
"contact": {
"oneOf": [
{ "type": "string", "format": "email" },
{ "type": "string", "pattern": "^\\+[0-9]+$" }
]
},
"newsletter": { "type": "boolean", "default": false }
},
"required": ["username", "contact"]
}مخطط Zod
import { z } from "zod"
export const schema = z.object({
username: z.string().min(3).max(20),
age: z.number().int().gte(18).optional(),
contact: z.any().superRefine((x, ctx) => {
const schemas = [
z.string().email(),
z.string().regex(new RegExp("^\\+[0-9]+$")),
]
const errors = schemas.reduce(
(errors: z.ZodError[], schema) =>
((result) => ("error" in result ? [...errors, result.error] : errors))(
schema.safeParse(x),
),
[],
)
if (schemas.length - errors.length !== 1) {
ctx.addIssue({
path: ctx.path,
code: "invalid_union",
unionErrors: errors,
message: "Invalid input: Should pass single schema",
})
…التفاصيل والقيود
يُحوَّل oneOf إلى z.any().superRefine(...)، الذي يتحقق من نجاح مخطط فرعي واحد بالضبط، كما يُظهر المثال.
لا يُحَل $ref: تصبح الخاصية المرجعية z.any().
يضيف integer .int()، ويضيف format "email" .email()، ويضيف format "date-time" .datetime().
يصبح additionalProperties: false إلى .catchall(z.never()) بدلًا من .strict().
FAQ
كيف تُعالَج الأنواع القابلة لـ null؟
يصبح "type": ["string", "null"] إلى z.union([z.string(), z.null()])، مع إضافة .optional() إذا لم تكن الخاصية مطلوبة.
هل يمكنني إعادة تسمية المخطط المُصدَّر؟
نعم. اضبط Root Schema Name في الإعدادات؛ فيصبح الناتج export const <name> = ... بدلًا من export const schema.
هل definitions و$ref مدعومة؟
لا. تصبح الخاصية التي تستخدم $ref إلى z.any()، لذا ضمِّن المخطط المرجعي مباشرةً قبل التحويل.