schyma
Version:
JSON Schemas Visualizer React component
110 lines • 4.31 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.handleCompositions = void 0;
exports.getCompositionType = getCompositionType;
exports.arrayToProps = arrayToProps;
const types_1 = require("../types");
const reusables_1 = require("./reusables");
const conditions_1 = require("../helpers/conditions");
function getCompositionType(schema) {
if (schema.oneOf)
return types_1.CompositionType.OneOf;
if (schema.anyOf)
return types_1.CompositionType.AnyOf;
if (schema.allOf)
return types_1.CompositionType.AllOf;
if (schema.not)
return types_1.CompositionType.Not;
return null;
}
function getSchemaName(schema, label, index) {
if (schema.title) {
return schema.title;
}
if (schema.$ref) {
return (0, reusables_1.nameFromRef)(schema.$ref);
}
if (schema.properties) {
for (const key of Object.keys(schema.properties)) {
const prop = schema.properties[key];
if (prop.const !== undefined) {
return String(prop.const);
}
}
}
if (schema.type && schema.const) {
return `${schema.const}`;
}
if (schema.type && schema.type !== 'object') {
return `${schema.type}`;
}
return `${label} ${index + 1}`;
}
function arrayToProps(props, label) {
const propObj = {};
for (let i = 0; i < props.length; i++) {
const name = getSchemaName(props[i], label, i);
propObj[name] = props[i];
}
return propObj;
}
const handleCompositions = (schema, mergedProps, label) => {
if (schema.allOf) {
let propObj = {};
for (const item of schema.allOf) {
if (item.if) {
(0, conditions_1.handleConditions)(item, propObj);
}
else if (item.$ref) {
const name = (0, reusables_1.nameFromRef)(item.$ref);
propObj[name] = item;
}
else {
if (item.properties) {
propObj = Object.assign(Object.assign({}, propObj), item.properties);
}
if (item.patternProperties) {
propObj = Object.assign(Object.assign({}, propObj), item.patternProperties);
}
if (item.additionalProperties && typeof item.additionalProperties === 'object') {
if (item.additionalProperties.$ref) {
const name = (0, reusables_1.nameFromRef)(item.additionalProperties.$ref);
propObj[name] = item.additionalProperties;
}
}
// Fallback for primitive types without properties
if (item.type && !item.properties && !item.patternProperties) {
propObj[item.type] = item;
}
}
}
Object.assign(mergedProps, propObj);
}
if (schema.oneOf || schema.anyOf) {
const items = schema.oneOf || schema.anyOf;
const compositionType = schema.oneOf ? types_1.CompositionType.OneOf : types_1.CompositionType.AnyOf;
for (let i = 0; i < items.length; i++) {
const item = items[i];
// Only flatten if item is ONLY a condition (no other schema content)
const isOnlyCondition = item.if && !item.title && !item.properties && !item.$ref && !item.type;
if (isOnlyCondition) {
(0, conditions_1.handleConditions)(item, mergedProps);
}
else {
const name = getSchemaName(item, label, i);
mergedProps[name] = Object.assign(Object.assign({}, item), { _compositionSource: compositionType });
}
}
}
if (schema.not) {
if (schema.not.$ref) {
const name = (0, reusables_1.nameFromRef)(schema.not.$ref);
mergedProps[name] = Object.assign(Object.assign({}, schema.not), { _compositionSource: types_1.CompositionType.Not });
}
else if (schema.not.type) {
mergedProps[schema.not.type] = Object.assign(Object.assign({}, schema.not), { _compositionSource: types_1.CompositionType.Not });
}
}
};
exports.handleCompositions = handleCompositions;
//# sourceMappingURL=compositions.js.map