object.js 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.parseObjectDef = void 0;
  4. const zod_1 = require("zod");
  5. const parseDef_js_1 = require("../parseDef.js");
  6. function parseObjectDef(def, refs) {
  7. const forceOptionalIntoNullable = refs.target === "openAi";
  8. const result = {
  9. type: "object",
  10. properties: {},
  11. };
  12. const required = [];
  13. const shape = def.shape();
  14. for (const propName in shape) {
  15. let propDef = shape[propName];
  16. if (propDef === undefined || propDef._def === undefined) {
  17. continue;
  18. }
  19. let propOptional = safeIsOptional(propDef);
  20. if (propOptional && forceOptionalIntoNullable) {
  21. if (propDef instanceof zod_1.ZodOptional) {
  22. propDef = propDef._def.innerType;
  23. }
  24. if (!propDef.isNullable()) {
  25. propDef = propDef.nullable();
  26. }
  27. propOptional = false;
  28. }
  29. const parsedDef = (0, parseDef_js_1.parseDef)(propDef._def, {
  30. ...refs,
  31. currentPath: [...refs.currentPath, "properties", propName],
  32. propertyPath: [...refs.currentPath, "properties", propName],
  33. });
  34. if (parsedDef === undefined) {
  35. continue;
  36. }
  37. result.properties[propName] = parsedDef;
  38. if (!propOptional) {
  39. required.push(propName);
  40. }
  41. }
  42. if (required.length) {
  43. result.required = required;
  44. }
  45. const additionalProperties = decideAdditionalProperties(def, refs);
  46. if (additionalProperties !== undefined) {
  47. result.additionalProperties = additionalProperties;
  48. }
  49. return result;
  50. }
  51. exports.parseObjectDef = parseObjectDef;
  52. function decideAdditionalProperties(def, refs) {
  53. if (def.catchall._def.typeName !== "ZodNever") {
  54. return (0, parseDef_js_1.parseDef)(def.catchall._def, {
  55. ...refs,
  56. currentPath: [...refs.currentPath, "additionalProperties"],
  57. });
  58. }
  59. switch (def.unknownKeys) {
  60. case "passthrough":
  61. return refs.allowedAdditionalProperties;
  62. case "strict":
  63. return refs.rejectedAdditionalProperties;
  64. case "strip":
  65. return refs.removeAdditionalStrategy === "strict"
  66. ? refs.allowedAdditionalProperties
  67. : refs.rejectedAdditionalProperties;
  68. }
  69. }
  70. function safeIsOptional(schema) {
  71. try {
  72. return schema.isOptional();
  73. }
  74. catch {
  75. return true;
  76. }
  77. }