"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.denormalizeProperty = void 0; const json_pointer_helpers_1 = require("@useoptic/json-pointer-helpers"); const openapi_utilities_1 = require("@useoptic/openapi-utilities"); const pointer_1 = require("./pointer"); function mergeAllOf(allOf, sourcemap, pointers) { const warnings = []; // Then we should merge this and replace it with an object const effectiveObject = { type: 'object', properties: {}, required: [], }; for (let [index, polymorphicItem] of allOf.entries()) { if (polymorphicItem.allOf) { const { obj, warnings: w } = mergeAllOf(polymorphicItem.allOf, sourcemap, { old: json_pointer_helpers_1.jsonPointerHelpers.append(pointers.old, 'allOf', String(index)), new: json_pointer_helpers_1.jsonPointerHelpers.append(pointers.new, 'allOf', String(index)), }); warnings.push(...w); polymorphicItem = obj; } const effectiveProperties = effectiveObject.properties; for (const [key, property] of Object.entries(polymorphicItem.properties ?? {})) { // For duplicates, choose the first instance of this key if (!effectiveProperties[key]) { const beforeRequiredIdx = polymorphicItem.required?.findIndex((s) => s === key) ?? -1; if (beforeRequiredIdx !== -1) { const oldRequired = json_pointer_helpers_1.jsonPointerHelpers.append(pointers.old, 'allOf', String(index), 'required', String(beforeRequiredIdx)); const newRequired = json_pointer_helpers_1.jsonPointerHelpers.append(pointers.new, 'required', String(effectiveObject.required.length)); sourcemap && (0, pointer_1.logPointer)(sourcemap, { old: oldRequired, new: newRequired }); effectiveObject.required.push(key); } const oldProperty = json_pointer_helpers_1.jsonPointerHelpers.append(pointers.old, 'allOf', String(index), 'properties', key); const newProperty = json_pointer_helpers_1.jsonPointerHelpers.append(pointers.new, 'properties', key); const w = denormalizeProperty(property, sourcemap, { old: oldProperty, new: newProperty, }); warnings.push(...w); sourcemap && (0, pointer_1.logPointer)(sourcemap, { old: oldProperty, new: newProperty }); effectiveProperties[key] = property; } } } if (effectiveObject.required?.length === 0) { delete effectiveObject.required; } return { obj: effectiveObject, warnings }; } function denormalizeProperty(schema, sourcemap, pointers) { const warnings = []; const polymorphicKey = schema.allOf ? 'allOf' : schema.anyOf ? 'anyOf' : schema.oneOf ? 'oneOf' : null; const polymorphicValue = schema.allOf || schema.anyOf || schema.oneOf; if (polymorphicKey && polymorphicValue) { if (polymorphicKey === 'allOf') { let effectiveObject; if (polymorphicValue.length === 1) { effectiveObject = polymorphicValue[0]; } else { const objectsAndAllOf = polymorphicValue.filter((schema) => openapi_utilities_1.OAS3.isObjectType(schema.type) || schema.allOf); const invalidChildren = polymorphicValue .map((v, i) => [v, i]) .filter(([schema]) => !(openapi_utilities_1.OAS3.isObjectType(schema.type) || schema.allOf)); const { obj, warnings: w } = mergeAllOf(objectsAndAllOf, sourcemap, pointers); let maybeReader = undefined; if (sourcemap) { maybeReader = (0, openapi_utilities_1.sourcemapReader)(sourcemap).findFileAndLines; } warnings.push(...invalidChildren.map(([, i]) => { const jsonPath = json_pointer_helpers_1.jsonPointerHelpers.append(pointers.old, 'allOf', String(i)); const maybeSourcemap = maybeReader ? maybeReader(jsonPath) : maybeReader; const location = maybeSourcemap ? `${(0, openapi_utilities_1.getSourcemapLink)(maybeSourcemap)} (${jsonPath})` : jsonPath; return `invalid allOf variant at ${location}`; }), ...w); effectiveObject = obj; } for (const [key, value] of Object.entries(effectiveObject)) { schema[key] = value; } delete schema[polymorphicKey]; } else { for (const [index, polymorphicItem] of polymorphicValue.entries()) { const w = denormalizeProperty(polymorphicItem, sourcemap, { old: json_pointer_helpers_1.jsonPointerHelpers.append(pointers.old, polymorphicKey, String(index)), new: json_pointer_helpers_1.jsonPointerHelpers.append(pointers.new, polymorphicKey, String(index)), }); warnings.push(...w); } } } else { if (openapi_utilities_1.OAS3.isArrayType(schema.type) && schema.items) { const w = denormalizeProperty(schema.items, sourcemap, { old: json_pointer_helpers_1.jsonPointerHelpers.append(pointers.old, 'items'), new: json_pointer_helpers_1.jsonPointerHelpers.append(pointers.new, 'items'), }); warnings.push(...w); } if (openapi_utilities_1.OAS3.isObjectType(schema.type)) { const properties = schema.properties ?? {}; for (const [key, property] of Object.entries(properties)) { const w = denormalizeProperty(property, sourcemap, { old: json_pointer_helpers_1.jsonPointerHelpers.append(pointers.old, 'properties', key), new: json_pointer_helpers_1.jsonPointerHelpers.append(pointers.new, 'properties', key), }); warnings.push(...w); } } } // else we stop here return warnings; } exports.denormalizeProperty = denormalizeProperty; //# sourceMappingURL=denormalizeProperty.js.map