Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

utils.tsx 1.1KB

123456789101112131415161718192021222324252627282930313233
  1. import { z } from 'zod'
  2. const arrayStringSchemaParttern = z.array(z.string())
  3. const arrayNumberSchemaParttern = z.array(z.number())
  4. // # jsonSchema from https://zod.dev/?id=json-type
  5. const literalSchema = z.union([z.string(), z.number(), z.boolean(), z.null()])
  6. type Literal = z.infer<typeof literalSchema>
  7. type Json = Literal | { [key: string]: Json } | Json[]
  8. const jsonSchema: z.ZodType<Json> = z.lazy(() => z.union([literalSchema, z.array(jsonSchema), z.record(jsonSchema)]))
  9. const arrayJsonSchema: z.ZodType<Json[]> = z.lazy(() => z.array(jsonSchema))
  10. export const validateJSONSchema = (schema: any, type: string) => {
  11. if (type === 'array[string]') {
  12. const result = arrayStringSchemaParttern.safeParse(schema)
  13. return result
  14. }
  15. else if (type === 'array[number]') {
  16. const result = arrayNumberSchemaParttern.safeParse(schema)
  17. return result
  18. }
  19. else if (type === 'object') {
  20. const result = jsonSchema.safeParse(schema)
  21. return result
  22. }
  23. else if (type === 'array[object]') {
  24. const result = arrayJsonSchema.safeParse(schema)
  25. return result
  26. }
  27. else {
  28. return { success: true } as any
  29. }
  30. }