77 lines
2.4 KiB
JavaScript
77 lines
2.4 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.parseObjectDef = void 0;
|
|
const parseDef_js_1 = require("../parseDef.js");
|
|
function parseObjectDef(def, refs) {
|
|
const forceOptionalIntoNullable = refs.target === "openAi";
|
|
const result = {
|
|
type: "object",
|
|
properties: {},
|
|
};
|
|
const required = [];
|
|
const shape = def.shape();
|
|
for (const propName in shape) {
|
|
let propDef = shape[propName];
|
|
if (propDef === undefined || propDef._def === undefined) {
|
|
continue;
|
|
}
|
|
let propOptional = safeIsOptional(propDef);
|
|
if (propOptional && forceOptionalIntoNullable) {
|
|
if (propDef._def.typeName === "ZodOptional") {
|
|
propDef = propDef._def.innerType;
|
|
}
|
|
if (!propDef.isNullable()) {
|
|
propDef = propDef.nullable();
|
|
}
|
|
propOptional = false;
|
|
}
|
|
const parsedDef = (0, parseDef_js_1.parseDef)(propDef._def, {
|
|
...refs,
|
|
currentPath: [...refs.currentPath, "properties", propName],
|
|
propertyPath: [...refs.currentPath, "properties", propName],
|
|
});
|
|
if (parsedDef === undefined) {
|
|
continue;
|
|
}
|
|
result.properties[propName] = parsedDef;
|
|
if (!propOptional) {
|
|
required.push(propName);
|
|
}
|
|
}
|
|
if (required.length) {
|
|
result.required = required;
|
|
}
|
|
const additionalProperties = decideAdditionalProperties(def, refs);
|
|
if (additionalProperties !== undefined) {
|
|
result.additionalProperties = additionalProperties;
|
|
}
|
|
return result;
|
|
}
|
|
exports.parseObjectDef = parseObjectDef;
|
|
function decideAdditionalProperties(def, refs) {
|
|
if (def.catchall._def.typeName !== "ZodNever") {
|
|
return (0, parseDef_js_1.parseDef)(def.catchall._def, {
|
|
...refs,
|
|
currentPath: [...refs.currentPath, "additionalProperties"],
|
|
});
|
|
}
|
|
switch (def.unknownKeys) {
|
|
case "passthrough":
|
|
return refs.allowedAdditionalProperties;
|
|
case "strict":
|
|
return refs.rejectedAdditionalProperties;
|
|
case "strip":
|
|
return refs.removeAdditionalStrategy === "strict"
|
|
? refs.allowedAdditionalProperties
|
|
: refs.rejectedAdditionalProperties;
|
|
}
|
|
}
|
|
function safeIsOptional(schema) {
|
|
try {
|
|
return schema.isOptional();
|
|
}
|
|
catch {
|
|
return true;
|
|
}
|
|
}
|