50 lines
No EOL
1.9 KiB
JavaScript
50 lines
No EOL
1.9 KiB
JavaScript
import { parseDef } from "../parseDef.mjs";
|
|
const isJsonSchema7AllOfType = (type) => {
|
|
if ('type' in type && type.type === 'string')
|
|
return false;
|
|
return 'allOf' in type;
|
|
};
|
|
export function parseIntersectionDef(def, refs) {
|
|
const allOf = [
|
|
parseDef(def.left._def, {
|
|
...refs,
|
|
currentPath: [...refs.currentPath, 'allOf', '0'],
|
|
}),
|
|
parseDef(def.right._def, {
|
|
...refs,
|
|
currentPath: [...refs.currentPath, 'allOf', '1'],
|
|
}),
|
|
].filter((x) => !!x);
|
|
let unevaluatedProperties = refs.target === 'jsonSchema2019-09' ? { unevaluatedProperties: false } : undefined;
|
|
const mergedAllOf = [];
|
|
// If either of the schemas is an allOf, merge them into a single allOf
|
|
allOf.forEach((schema) => {
|
|
if (isJsonSchema7AllOfType(schema)) {
|
|
mergedAllOf.push(...schema.allOf);
|
|
if (schema.unevaluatedProperties === undefined) {
|
|
// If one of the schemas has no unevaluatedProperties set,
|
|
// the merged schema should also have no unevaluatedProperties set
|
|
unevaluatedProperties = undefined;
|
|
}
|
|
}
|
|
else {
|
|
let nestedSchema = schema;
|
|
if ('additionalProperties' in schema && schema.additionalProperties === false) {
|
|
const { additionalProperties, ...rest } = schema;
|
|
nestedSchema = rest;
|
|
}
|
|
else {
|
|
// As soon as one of the schemas has additionalProperties set not to false, we allow unevaluatedProperties
|
|
unevaluatedProperties = undefined;
|
|
}
|
|
mergedAllOf.push(nestedSchema);
|
|
}
|
|
});
|
|
return mergedAllOf.length ?
|
|
{
|
|
allOf: mergedAllOf,
|
|
...unevaluatedProperties,
|
|
}
|
|
: undefined;
|
|
}
|
|
//# sourceMappingURL=intersection.mjs.map
|