82 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			82 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
"use strict";
 | 
						|
Object.defineProperty(exports, "__esModule", { value: true });
 | 
						|
exports.zodToJsonSchema = void 0;
 | 
						|
const parseDef_1 = require("./parseDef.js");
 | 
						|
const Refs_1 = require("./Refs.js");
 | 
						|
const util_1 = require("./util.js");
 | 
						|
const zodToJsonSchema = (schema, options) => {
 | 
						|
    const refs = (0, Refs_1.getRefs)(options);
 | 
						|
    const name = typeof options === 'string' ? options
 | 
						|
        : options?.nameStrategy === 'title' ? undefined
 | 
						|
            : options?.name;
 | 
						|
    const main = (0, parseDef_1.parseDef)(schema._def, name === undefined ? refs : ({
 | 
						|
        ...refs,
 | 
						|
        currentPath: [...refs.basePath, refs.definitionPath, name],
 | 
						|
    }), false) ?? {};
 | 
						|
    const title = typeof options === 'object' && options.name !== undefined && options.nameStrategy === 'title' ?
 | 
						|
        options.name
 | 
						|
        : undefined;
 | 
						|
    if (title !== undefined) {
 | 
						|
        main.title = title;
 | 
						|
    }
 | 
						|
    const definitions = (() => {
 | 
						|
        if ((0, util_1.isEmptyObj)(refs.definitions)) {
 | 
						|
            return undefined;
 | 
						|
        }
 | 
						|
        const definitions = {};
 | 
						|
        const processedDefinitions = new Set();
 | 
						|
        // the call to `parseDef()` here might itself add more entries to `.definitions`
 | 
						|
        // so we need to continually evaluate definitions until we've resolved all of them
 | 
						|
        //
 | 
						|
        // we have a generous iteration limit here to avoid blowing up the stack if there
 | 
						|
        // are any bugs that would otherwise result in us iterating indefinitely
 | 
						|
        for (let i = 0; i < 500; i++) {
 | 
						|
            const newDefinitions = Object.entries(refs.definitions).filter(([key]) => !processedDefinitions.has(key));
 | 
						|
            if (newDefinitions.length === 0)
 | 
						|
                break;
 | 
						|
            for (const [key, schema] of newDefinitions) {
 | 
						|
                definitions[key] =
 | 
						|
                    (0, parseDef_1.parseDef)((0, util_1.zodDef)(schema), { ...refs, currentPath: [...refs.basePath, refs.definitionPath, key] }, true) ?? {};
 | 
						|
                processedDefinitions.add(key);
 | 
						|
            }
 | 
						|
        }
 | 
						|
        return definitions;
 | 
						|
    })();
 | 
						|
    const combined = name === undefined ?
 | 
						|
        definitions ?
 | 
						|
            {
 | 
						|
                ...main,
 | 
						|
                [refs.definitionPath]: definitions,
 | 
						|
            }
 | 
						|
            : main
 | 
						|
        : refs.nameStrategy === 'duplicate-ref' ?
 | 
						|
            {
 | 
						|
                ...main,
 | 
						|
                ...(definitions || refs.seenRefs.size ?
 | 
						|
                    {
 | 
						|
                        [refs.definitionPath]: {
 | 
						|
                            ...definitions,
 | 
						|
                            // only actually duplicate the schema definition if it was ever referenced
 | 
						|
                            // otherwise the duplication is completely pointless
 | 
						|
                            ...(refs.seenRefs.size ? { [name]: main } : undefined),
 | 
						|
                        },
 | 
						|
                    }
 | 
						|
                    : undefined),
 | 
						|
            }
 | 
						|
            : {
 | 
						|
                $ref: [...(refs.$refStrategy === 'relative' ? [] : refs.basePath), refs.definitionPath, name].join('/'),
 | 
						|
                [refs.definitionPath]: {
 | 
						|
                    ...definitions,
 | 
						|
                    [name]: main,
 | 
						|
                },
 | 
						|
            };
 | 
						|
    if (refs.target === 'jsonSchema7') {
 | 
						|
        combined.$schema = 'http://json-schema.org/draft-07/schema#';
 | 
						|
    }
 | 
						|
    else if (refs.target === 'jsonSchema2019-09') {
 | 
						|
        combined.$schema = 'https://json-schema.org/draft/2019-09/schema#';
 | 
						|
    }
 | 
						|
    return combined;
 | 
						|
};
 | 
						|
exports.zodToJsonSchema = zodToJsonSchema;
 | 
						|
//# sourceMappingURL=zodToJsonSchema.js.map
 |