77 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			77 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|  | "use strict"; | ||
|  | Object.defineProperty(exports, "__esModule", { value: true }); | ||
|  | exports.primitiveMappings = void 0; | ||
|  | exports.parseUnionDef = parseUnionDef; | ||
|  | const parseDef_1 = require("../parseDef.js"); | ||
|  | exports.primitiveMappings = { | ||
|  |     ZodString: 'string', | ||
|  |     ZodNumber: 'number', | ||
|  |     ZodBigInt: 'integer', | ||
|  |     ZodBoolean: 'boolean', | ||
|  |     ZodNull: 'null', | ||
|  | }; | ||
|  | function parseUnionDef(def, refs) { | ||
|  |     if (refs.target === 'openApi3') | ||
|  |         return asAnyOf(def, refs); | ||
|  |     const options = def.options instanceof Map ? Array.from(def.options.values()) : def.options; | ||
|  |     // This blocks tries to look ahead a bit to produce nicer looking schemas with type array instead of anyOf.
 | ||
|  |     if (options.every((x) => x._def.typeName in exports.primitiveMappings && (!x._def.checks || !x._def.checks.length))) { | ||
|  |         // all types in union are primitive and lack checks, so might as well squash into {type: [...]}
 | ||
|  |         const types = options.reduce((types, x) => { | ||
|  |             const type = exports.primitiveMappings[x._def.typeName]; //Can be safely casted due to row 43
 | ||
|  |             return type && !types.includes(type) ? [...types, type] : types; | ||
|  |         }, []); | ||
|  |         return { | ||
|  |             type: types.length > 1 ? types : types[0], | ||
|  |         }; | ||
|  |     } | ||
|  |     else if (options.every((x) => x._def.typeName === 'ZodLiteral' && !x.description)) { | ||
|  |         // all options literals
 | ||
|  |         const types = options.reduce((acc, x) => { | ||
|  |             const type = typeof x._def.value; | ||
|  |             switch (type) { | ||
|  |                 case 'string': | ||
|  |                 case 'number': | ||
|  |                 case 'boolean': | ||
|  |                     return [...acc, type]; | ||
|  |                 case 'bigint': | ||
|  |                     return [...acc, 'integer']; | ||
|  |                 case 'object': | ||
|  |                     if (x._def.value === null) | ||
|  |                         return [...acc, 'null']; | ||
|  |                 case 'symbol': | ||
|  |                 case 'undefined': | ||
|  |                 case 'function': | ||
|  |                 default: | ||
|  |                     return acc; | ||
|  |             } | ||
|  |         }, []); | ||
|  |         if (types.length === options.length) { | ||
|  |             // all the literals are primitive, as far as null can be considered primitive
 | ||
|  |             const uniqueTypes = types.filter((x, i, a) => a.indexOf(x) === i); | ||
|  |             return { | ||
|  |                 type: uniqueTypes.length > 1 ? uniqueTypes : uniqueTypes[0], | ||
|  |                 enum: options.reduce((acc, x) => { | ||
|  |                     return acc.includes(x._def.value) ? acc : [...acc, x._def.value]; | ||
|  |                 }, []), | ||
|  |             }; | ||
|  |         } | ||
|  |     } | ||
|  |     else if (options.every((x) => x._def.typeName === 'ZodEnum')) { | ||
|  |         return { | ||
|  |             type: 'string', | ||
|  |             enum: options.reduce((acc, x) => [...acc, ...x._def.values.filter((x) => !acc.includes(x))], []), | ||
|  |         }; | ||
|  |     } | ||
|  |     return asAnyOf(def, refs); | ||
|  | } | ||
|  | const asAnyOf = (def, refs) => { | ||
|  |     const anyOf = (def.options instanceof Map ? Array.from(def.options.values()) : def.options) | ||
|  |         .map((x, i) => (0, parseDef_1.parseDef)(x._def, { | ||
|  |         ...refs, | ||
|  |         currentPath: [...refs.currentPath, 'anyOf', `${i}`], | ||
|  |     })) | ||
|  |         .filter((x) => !!x && (!refs.strictUnions || (typeof x === 'object' && Object.keys(x).length > 0))); | ||
|  |     return anyOf.length ? { anyOf } : undefined; | ||
|  | }; | ||
|  | //# sourceMappingURL=union.js.map
 |