full site update

This commit is contained in:
2025-07-24 18:46:24 +02:00
parent bfe2b90d8d
commit 37a6e0ab31
6912 changed files with 540482 additions and 361712 deletions

View File

@@ -37,6 +37,7 @@ exports.defaultOptions = {
emailStrategy: "format:email",
base64Strategy: "contentEncoding:base64",
nameStrategy: "ref",
openAiAnyTypeName: "OpenAiAnyType"
};
const getDefaultOptions = (options) => (typeof options === "string"
? {

View File

@@ -9,6 +9,7 @@ const getRefs = (options) => {
: _options.basePath;
return {
..._options,
flags: { hasReferencedOpenAiAnyType: false },
currentPath: currentPath,
propertyPath: undefined,
seen: new Map(Object.entries(_options.definitions).map(([name, def]) => [

View File

@@ -0,0 +1,12 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.getRelativePath = void 0;
const getRelativePath = (pathA, pathB) => {
let i = 0;
for (; i < pathA.length && i < pathB.length; i++) {
if (pathA[i] !== pathB[i])
break;
}
return [(pathA.length - i).toString(), ...pathB.slice(i)].join("/");
};
exports.getRelativePath = getRelativePath;

View File

@@ -17,6 +17,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
__exportStar(require("./Options.js"), exports);
__exportStar(require("./Refs.js"), exports);
__exportStar(require("./errorMessages.js"), exports);
__exportStar(require("./getRelativePath.js"), exports);
__exportStar(require("./parseDef.js"), exports);
__exportStar(require("./parseTypes.js"), exports);
__exportStar(require("./parsers/any.js"), exports);

View File

@@ -3,6 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
exports.parseDef = void 0;
const Options_js_1 = require("./Options.js");
const selectParser_js_1 = require("./selectParser.js");
const getRelativePath_js_1 = require("./getRelativePath.js");
const any_js_1 = require("./parsers/any.js");
function parseDef(def, refs, forceResolution = false) {
const seenItem = refs.seen.get(def);
if (refs.override) {
@@ -41,26 +43,18 @@ const get$ref = (item, refs) => {
case "root":
return { $ref: item.path.join("/") };
case "relative":
return { $ref: getRelativePath(refs.currentPath, item.path) };
return { $ref: (0, getRelativePath_js_1.getRelativePath)(refs.currentPath, item.path) };
case "none":
case "seen": {
if (item.path.length < refs.currentPath.length &&
item.path.every((value, index) => refs.currentPath[index] === value)) {
console.warn(`Recursive reference detected at ${refs.currentPath.join("/")}! Defaulting to any`);
return {};
return (0, any_js_1.parseAnyDef)(refs);
}
return refs.$refStrategy === "seen" ? {} : undefined;
return refs.$refStrategy === "seen" ? (0, any_js_1.parseAnyDef)(refs) : undefined;
}
}
};
const getRelativePath = (pathA, pathB) => {
let i = 0;
for (; i < pathA.length && i < pathB.length; i++) {
if (pathA[i] !== pathB[i])
break;
}
return [(pathA.length - i).toString(), ...pathB.slice(i)].join("/");
};
const addMeta = (def, refs, jsonSchema) => {
if (def.description) {
jsonSchema.description = def.description;

View File

@@ -1,7 +1,21 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.parseAnyDef = void 0;
function parseAnyDef() {
return {};
const getRelativePath_js_1 = require("../getRelativePath.js");
function parseAnyDef(refs) {
if (refs.target !== "openAi") {
return {};
}
const anyDefinitionPath = [
...refs.basePath,
refs.definitionPath,
refs.openAiAnyTypeName,
];
refs.flags.hasReferencedOpenAiAnyType = true;
return {
$ref: refs.$refStrategy === "relative"
? (0, getRelativePath_js_1.getRelativePath)(anyDefinitionPath, refs.currentPath)
: anyDefinitionPath.join("/"),
};
}
exports.parseAnyDef = parseAnyDef;

View File

@@ -2,9 +2,10 @@
Object.defineProperty(exports, "__esModule", { value: true });
exports.parseEffectsDef = void 0;
const parseDef_js_1 = require("../parseDef.js");
const any_js_1 = require("./any.js");
function parseEffectsDef(_def, refs) {
return refs.effectStrategy === "input"
? (0, parseDef_js_1.parseDef)(_def.schema._def, refs)
: {};
: (0, any_js_1.parseAnyDef)(refs);
}
exports.parseEffectsDef = parseEffectsDef;

View File

@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
exports.parseMapDef = void 0;
const parseDef_js_1 = require("../parseDef.js");
const record_js_1 = require("./record.js");
const any_js_1 = require("./any.js");
function parseMapDef(def, refs) {
if (refs.mapStrategy === "record") {
return (0, record_js_1.parseRecordDef)(def, refs);
@@ -10,11 +11,11 @@ function parseMapDef(def, refs) {
const keys = (0, parseDef_js_1.parseDef)(def.keyType._def, {
...refs,
currentPath: [...refs.currentPath, "items", "items", "0"],
}) || {};
}) || (0, any_js_1.parseAnyDef)(refs);
const values = (0, parseDef_js_1.parseDef)(def.valueType._def, {
...refs,
currentPath: [...refs.currentPath, "items", "items", "1"],
}) || {};
}) || (0, any_js_1.parseAnyDef)(refs);
return {
type: "array",
maxItems: 125,

View File

@@ -1,9 +1,15 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.parseNeverDef = void 0;
function parseNeverDef() {
return {
not: {},
};
const any_js_1 = require("./any.js");
function parseNeverDef(refs) {
return refs.target === "openAi"
? undefined
: {
not: (0, any_js_1.parseAnyDef)({
...refs,
currentPath: [...refs.currentPath, "not"],
}),
};
}
exports.parseNeverDef = parseNeverDef;

View File

@@ -1,7 +1,6 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.parseObjectDef = void 0;
const zod_1 = require("zod");
const parseDef_js_1 = require("../parseDef.js");
function parseObjectDef(def, refs) {
const forceOptionalIntoNullable = refs.target === "openAi";
@@ -18,7 +17,7 @@ function parseObjectDef(def, refs) {
}
let propOptional = safeIsOptional(propDef);
if (propOptional && forceOptionalIntoNullable) {
if (propDef instanceof zod_1.ZodOptional) {
if (propDef._def.typeName === "ZodOptional") {
propDef = propDef._def.innerType;
}
if (!propDef.isNullable()) {

View File

@@ -2,6 +2,7 @@
Object.defineProperty(exports, "__esModule", { value: true });
exports.parseOptionalDef = void 0;
const parseDef_js_1 = require("../parseDef.js");
const any_js_1 = require("./any.js");
const parseOptionalDef = (def, refs) => {
if (refs.currentPath.toString() === refs.propertyPath?.toString()) {
return (0, parseDef_js_1.parseDef)(def.innerType._def, refs);
@@ -14,11 +15,11 @@ const parseOptionalDef = (def, refs) => {
? {
anyOf: [
{
not: {},
not: (0, any_js_1.parseAnyDef)(refs),
},
innerSchema,
],
}
: {};
: (0, any_js_1.parseAnyDef)(refs);
};
exports.parseOptionalDef = parseOptionalDef;

View File

@@ -5,6 +5,7 @@ const zod_1 = require("zod");
const parseDef_js_1 = require("../parseDef.js");
const string_js_1 = require("./string.js");
const branded_js_1 = require("./branded.js");
const any_js_1 = require("./any.js");
function parseRecordDef(def, refs) {
if (refs.target === "openAi") {
console.warn("Warning: OpenAI may not support records in schemas! Try an array of key-value pairs instead.");
@@ -19,7 +20,7 @@ function parseRecordDef(def, refs) {
[key]: (0, parseDef_js_1.parseDef)(def.valueType._def, {
...refs,
currentPath: [...refs.currentPath, "properties", key],
}) ?? {},
}) ?? (0, any_js_1.parseAnyDef)(refs),
}), {}),
additionalProperties: refs.rejectedAdditionalProperties,
};

View File

@@ -1,9 +1,10 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.parseUndefinedDef = void 0;
function parseUndefinedDef() {
const any_js_1 = require("./any.js");
function parseUndefinedDef(refs) {
return {
not: {},
not: (0, any_js_1.parseAnyDef)(refs),
};
}
exports.parseUndefinedDef = parseUndefinedDef;

View File

@@ -1,7 +1,8 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.parseUnknownDef = void 0;
function parseUnknownDef() {
return {};
const any_js_1 = require("./any.js");
function parseUnknownDef(refs) {
return (0, any_js_1.parseAnyDef)(refs);
}
exports.parseUnknownDef = parseUnknownDef;

View File

@@ -47,7 +47,7 @@ const selectParser = (def, typeName, refs) => {
case zod_1.ZodFirstPartyTypeKind.ZodDate:
return (0, date_js_1.parseDateDef)(def, refs);
case zod_1.ZodFirstPartyTypeKind.ZodUndefined:
return (0, undefined_js_1.parseUndefinedDef)();
return (0, undefined_js_1.parseUndefinedDef)(refs);
case zod_1.ZodFirstPartyTypeKind.ZodNull:
return (0, null_js_1.parseNullDef)(refs);
case zod_1.ZodFirstPartyTypeKind.ZodArray:
@@ -81,13 +81,13 @@ const selectParser = (def, typeName, refs) => {
return (0, promise_js_1.parsePromiseDef)(def, refs);
case zod_1.ZodFirstPartyTypeKind.ZodNaN:
case zod_1.ZodFirstPartyTypeKind.ZodNever:
return (0, never_js_1.parseNeverDef)();
return (0, never_js_1.parseNeverDef)(refs);
case zod_1.ZodFirstPartyTypeKind.ZodEffects:
return (0, effects_js_1.parseEffectsDef)(def, refs);
case zod_1.ZodFirstPartyTypeKind.ZodAny:
return (0, any_js_1.parseAnyDef)();
return (0, any_js_1.parseAnyDef)(refs);
case zod_1.ZodFirstPartyTypeKind.ZodUnknown:
return (0, unknown_js_1.parseUnknownDef)();
return (0, unknown_js_1.parseUnknownDef)(refs);
case zod_1.ZodFirstPartyTypeKind.ZodDefault:
return (0, default_js_1.parseDefaultDef)(def, refs);
case zod_1.ZodFirstPartyTypeKind.ZodBranded:

View File

@@ -3,15 +3,16 @@ Object.defineProperty(exports, "__esModule", { value: true });
exports.zodToJsonSchema = void 0;
const parseDef_js_1 = require("./parseDef.js");
const Refs_js_1 = require("./Refs.js");
const any_js_1 = require("./parsers/any.js");
const zodToJsonSchema = (schema, options) => {
const refs = (0, Refs_js_1.getRefs)(options);
const definitions = typeof options === "object" && options.definitions
let definitions = typeof options === "object" && options.definitions
? Object.entries(options.definitions).reduce((acc, [name, schema]) => ({
...acc,
[name]: (0, parseDef_js_1.parseDef)(schema._def, {
...refs,
currentPath: [...refs.basePath, refs.definitionPath, name],
}, true) ?? {},
}, true) ?? (0, any_js_1.parseAnyDef)(refs),
}), {})
: undefined;
const name = typeof options === "string"
@@ -24,7 +25,7 @@ const zodToJsonSchema = (schema, options) => {
: {
...refs,
currentPath: [...refs.basePath, refs.definitionPath, name],
}, false) ?? {};
}, false) ?? (0, any_js_1.parseAnyDef)(refs);
const title = typeof options === "object" &&
options.name !== undefined &&
options.nameStrategy === "title"
@@ -33,6 +34,26 @@ const zodToJsonSchema = (schema, options) => {
if (title !== undefined) {
main.title = title;
}
if (refs.flags.hasReferencedOpenAiAnyType) {
if (!definitions) {
definitions = {};
}
if (!definitions[refs.openAiAnyTypeName]) {
definitions[refs.openAiAnyTypeName] = {
// Skipping "object" as no properties can be defined and additionalProperties must be "false"
type: ["string", "number", "integer", "boolean", "array", "null"],
items: {
$ref: refs.$refStrategy === "relative"
? "1"
: [
...refs.basePath,
refs.definitionPath,
refs.openAiAnyTypeName,
].join("/"),
},
};
}
}
const combined = name === undefined
? definitions
? {