{"version":3,"sources":["../src/schema-utils.ts"],"names":["ajv","Ajv","addTypeofKeyword","ajvDefaults","validateSchema","schema","isSchemaValid","__name","jsonSchemaZodSchema","z","data","ctx","ok","message","validateSchemaAndAssignDefaults","newData","isValid","validateDataAgainstSchema"],"mappings":"uKAKO,IAAMA,CAAAA,CAAM,IAAIC,EAEvBC,CAAAA,CAAiBF,CAAG,CAAA,CAIpB,IAAMG,EAAc,IAAIF,CAAAA,CAAI,CAC1B,WAAA,CAAa,IACf,CAAC,EAOM,SAASG,CAAAA,CAAeC,EAG7B,CACA,IAAMC,EAAgBN,CAAAA,CAAI,cAAA,CAAeK,CAAM,CAAA,CAC/C,OAAO,CACL,GAAIC,CAAAA,CACJ,OAAA,CAASA,EACL,EAAA,CACA,CAAA,4BAAA,EAA+BN,EAAI,UAAA,EAAY,CAAA,CACrD,CACF,CAXgBO,CAAAA,CAAAH,EAAA,gBAAA,CAAA,CAgBT,IAAMI,EAAsBC,CAAAA,CAChC,MAAA,CAAOA,EAAE,MAAA,EAAO,CAAGA,CAAAA,CAAE,OAAA,EAAS,CAAA,CAC9B,YAAY,CAACC,CAAAA,CAAMC,IAAQ,CAC1B,GAAM,CAAE,EAAA,CAAAC,CAAAA,CAAI,OAAA,CAAAC,CAAQ,CAAA,CAAIT,CAAAA,CAAeM,CAAI,CAAA,CACtCE,CAAAA,EACHD,EAAI,QAAA,CAAS,CACX,KAAM,QAAA,CACN,OAAA,CAAAE,CACF,CAAC,EAEL,CAAC,EACA,SAAA,CAAWH,CAAAA,EAASA,CAAwB,EAOxC,SAASI,CAAAA,CACdT,EACAK,CAAAA,CAC2C,CAC3C,GAAM,CAAE,EAAA,CAAAE,CAAAA,CAAI,QAAAC,CAAQ,CAAA,CAAIT,EAAeC,CAAM,CAAA,CAC7C,GAAI,CAACO,CAAAA,CACH,OAAO,CACL,EAAA,CAAI,KAAA,CACJ,QAAAC,CAAAA,CACA,IAAA,CAAAH,CACF,CAAA,CAGF,IAAMK,EAAU,CAAE,GAAGL,CAAK,CAAA,CAEpBM,CAAAA,CAAU,CAAC,CAACb,CAAAA,CAAY,QAAA,CAASE,EAAQU,CAAO,CAAA,CACtD,OAAO,CACL,EAAA,CAAIC,CAAAA,CACJ,OAAA,CAASA,CAAAA,CAAU,EAAA,CAAKb,EAAY,UAAA,EAAW,CAC/C,IAAA,CAAMY,CACR,CACF,CArBgBR,EAAAO,CAAAA,CAAA,iCAAA,CAAA,CA2BT,SAASG,CAAAA,CACdZ,CAAAA,CACAK,CAAAA,CAKA,CACA,GAAM,CAAE,GAAAE,CAAAA,CAAI,OAAA,CAAAC,CAAQ,CAAA,CAAIT,CAAAA,CAAeC,CAAM,CAAA,CAC7C,GAAI,CAACO,EACH,OAAO,CACL,GAAI,KAAA,CACJ,OAAA,CAAAC,CACF,CAAA,CAGF,IAAMG,CAAAA,CAAU,CAAC,CAAChB,CAAAA,CAAI,SAASK,CAAAA,CAAQK,CAAI,EAC3C,OAAO,CACL,GAAIM,CAAAA,CACJ,OAAA,CAASA,CAAAA,CAAU,EAAA,CAAKhB,CAAAA,CAAI,UAAA,GAC5B,MAAA,CAAQgB,CAAAA,CAAU,EAAC,CAAIhB,CAAAA,CAAI,MAAA,EAAU,EACvC,CACF,CAtBgBO,CAAAA,CAAAU,CAAAA,CAAA,2BAAA,CAAA","file":"schema-utils.mjs","sourcesContent":["import Ajv, { type ErrorObject } from 'ajv'; // https://github.com/epoberezkin/ajv\nimport addTypeofKeyword from 'ajv-keywords/keywords/typeof.js';\nimport { type JsonSchemaObject } from '@knapsack/types';\nimport { z } from 'zod';\n\nexport const ajv = new Ajv();\n\naddTypeofKeyword(ajv);\n\ntype ajvErrors = ErrorObject[];\n\nconst ajvDefaults = new Ajv({\n  useDefaults: true,\n});\n\n/**\n * Validate Schema itself (metaSchema)\n * Validates against contents of the `$schema` field\n * @link https://github.com/epoberezkin/ajv#validateschemaobject-schema---boolean\n */\nexport function validateSchema(schema: Record<string, unknown>): {\n  ok: boolean;\n  message: string;\n} {\n  const isSchemaValid = ajv.validateSchema(schema);\n  return {\n    ok: isSchemaValid,\n    message: isSchemaValid\n      ? ''\n      : `Schema itself is not valid. ${ajv.errorsText()}`,\n  };\n}\n\n/**\n * Validates a {@link JsonSchemaObject} using Zod\n */\nexport const jsonSchemaZodSchema = z\n  .record(z.string(), z.unknown())\n  .superRefine((data, ctx) => {\n    const { ok, message } = validateSchema(data);\n    if (!ok) {\n      ctx.addIssue({\n        code: 'custom',\n        message,\n      });\n    }\n  })\n  .transform((data) => data as JsonSchemaObject);\n\n/**\n * Validate Schema and Assign Defaults\n * Any `default` on properties will be added if that property is absent\n * @link https://github.com/epoberezkin/ajv#assigning-defaults\n */\nexport function validateSchemaAndAssignDefaults<T>(\n  schema: Record<string, unknown>,\n  data: T,\n): { ok: boolean; message: string; data: T } {\n  const { ok, message } = validateSchema(schema);\n  if (!ok) {\n    return {\n      ok: false,\n      message,\n      data,\n    };\n  }\n\n  const newData = { ...data };\n  // This `validate` function mutates `newData`, so that's why we created a new object above first.\n  const isValid = !!ajvDefaults.validate(schema, newData);\n  return {\n    ok: isValid,\n    message: isValid ? '' : ajvDefaults.errorsText(),\n    data: newData,\n  };\n}\n\n/**\n * Validate Data against Schema\n * @link https://github.com/epoberezkin/ajv\n */\nexport function validateDataAgainstSchema<T>(\n  schema: Record<string, unknown>,\n  data: T,\n): {\n  ok: boolean;\n  message: string;\n  errors?: ajvErrors;\n} {\n  const { ok, message } = validateSchema(schema);\n  if (!ok) {\n    return {\n      ok: false,\n      message,\n    };\n  }\n\n  const isValid = !!ajv.validate(schema, data);\n  return {\n    ok: isValid,\n    message: isValid ? '' : ajv.errorsText(),\n    errors: isValid ? [] : ajv.errors || [],\n  };\n}\n\n//\n"]}