feat(plugins): expose JSON Schema merging mechanism from samples plugins (#9766)
Refs #9765
This commit is contained in:
@@ -11,3 +11,4 @@ export {
|
||||
export { default as encoderAPI } from "./api/encoderAPI"
|
||||
export { default as formatAPI } from "./api/formatAPI"
|
||||
export { default as mediaTypeAPI } from "./api/mediaTypeAPI"
|
||||
export { default as mergeJsonSchema } from "./core/merge"
|
||||
|
||||
@@ -10,6 +10,7 @@ import {
|
||||
encoderAPI,
|
||||
mediaTypeAPI,
|
||||
formatAPI,
|
||||
mergeJsonSchema,
|
||||
} from "./fn/index"
|
||||
import makeGetJsonSampleSchema from "./fn/get-json-sample-schema"
|
||||
import makeGetYamlSampleSchema from "./fn/get-yaml-sample-schema"
|
||||
@@ -37,6 +38,7 @@ const JSONSchema202012SamplesPlugin = ({ getSystem }) => {
|
||||
getYamlSampleSchema,
|
||||
getXmlSampleSchema,
|
||||
getSampleSchema,
|
||||
mergeJsonSchema,
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
@@ -56,10 +56,12 @@ const numberContracts = [
|
||||
]
|
||||
const stringContracts = ["minLength", "maxLength"]
|
||||
|
||||
const liftSampleHelper = (oldSchema, target, config = {}) => {
|
||||
export const mergeJsonSchema = (target, source, config = {}) => {
|
||||
const merged = { ...target }
|
||||
|
||||
const setIfNotDefinedInTarget = (key) => {
|
||||
if(target[key] === undefined && oldSchema[key] !== undefined) {
|
||||
target[key] = oldSchema[key]
|
||||
if(merged[key] === undefined && source[key] !== undefined) {
|
||||
merged[key] = source[key]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -75,22 +77,22 @@ const liftSampleHelper = (oldSchema, target, config = {}) => {
|
||||
...stringContracts,
|
||||
].forEach(key => setIfNotDefinedInTarget(key))
|
||||
|
||||
if(oldSchema.required !== undefined && Array.isArray(oldSchema.required)) {
|
||||
if(target.required === undefined || !target.required.length) {
|
||||
target.required = []
|
||||
if(source.required !== undefined && Array.isArray(source.required)) {
|
||||
if(merged.required === undefined || !merged.required.length) {
|
||||
merged.required = []
|
||||
}
|
||||
oldSchema.required.forEach(key => {
|
||||
if(target.required.includes(key)) {
|
||||
source.required.forEach(key => {
|
||||
if(merged.required.includes(key)) {
|
||||
return
|
||||
}
|
||||
target.required.push(key)
|
||||
merged.required.push(key)
|
||||
})
|
||||
}
|
||||
if(oldSchema.properties) {
|
||||
if(!target.properties) {
|
||||
target.properties = {}
|
||||
if(source.properties) {
|
||||
if(!merged.properties) {
|
||||
merged.properties = {}
|
||||
}
|
||||
let props = objectify(oldSchema.properties)
|
||||
let props = objectify(source.properties)
|
||||
for (let propName in props) {
|
||||
if (!Object.prototype.hasOwnProperty.call(props, propName)) {
|
||||
continue
|
||||
@@ -104,26 +106,26 @@ const liftSampleHelper = (oldSchema, target, config = {}) => {
|
||||
if ( props[propName] && props[propName].writeOnly && !config.includeWriteOnly ) {
|
||||
continue
|
||||
}
|
||||
if(!target.properties[propName]) {
|
||||
target.properties[propName] = props[propName]
|
||||
if(!oldSchema.required && Array.isArray(oldSchema.required) && oldSchema.required.indexOf(propName) !== -1) {
|
||||
if(!target.required) {
|
||||
target.required = [propName]
|
||||
if(!merged.properties[propName]) {
|
||||
merged.properties[propName] = props[propName]
|
||||
if(!source.required && Array.isArray(source.required) && source.required.indexOf(propName) !== -1) {
|
||||
if(!merged.required) {
|
||||
merged.required = [propName]
|
||||
} else {
|
||||
target.required.push(propName)
|
||||
merged.required.push(propName)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if(oldSchema.items) {
|
||||
if(!target.items) {
|
||||
target.items = {}
|
||||
if(source.items) {
|
||||
if(!merged.items) {
|
||||
merged.items = {}
|
||||
}
|
||||
target.items = liftSampleHelper(oldSchema.items, target.items, config)
|
||||
merged.items = mergeJsonSchema(merged.items, source.items, config)
|
||||
}
|
||||
|
||||
return target
|
||||
return merged
|
||||
}
|
||||
|
||||
export const sampleFromSchemaGeneric = (schema, config={}, exampleOverride = undefined, respectXML = false) => {
|
||||
@@ -138,7 +140,7 @@ export const sampleFromSchemaGeneric = (schema, config={}, exampleOverride = und
|
||||
? schema.oneOf[0]
|
||||
: schema.anyOf[0]
|
||||
)
|
||||
liftSampleHelper(schemaToAdd, schema, config)
|
||||
schema = mergeJsonSchema(schema, schemaToAdd, config)
|
||||
if(!schema.xml && schemaToAdd.xml) {
|
||||
schema.xml = schemaToAdd.xml
|
||||
}
|
||||
@@ -537,9 +539,9 @@ export const sampleFromSchemaGeneric = (schema, config={}, exampleOverride = und
|
||||
}
|
||||
|
||||
if(Array.isArray(items.anyOf)) {
|
||||
sampleArray = items.anyOf.map(i => sampleFromSchemaGeneric(liftSampleHelper(items, i, config), config, undefined, respectXML))
|
||||
sampleArray = items.anyOf.map(i => sampleFromSchemaGeneric(mergeJsonSchema(i, items, config), config, undefined, respectXML))
|
||||
} else if(Array.isArray(items.oneOf)) {
|
||||
sampleArray = items.oneOf.map(i => sampleFromSchemaGeneric(liftSampleHelper(items, i, config), config, undefined, respectXML))
|
||||
sampleArray = items.oneOf.map(i => sampleFromSchemaGeneric(mergeJsonSchema(i, items, config), config, undefined, respectXML))
|
||||
} else if(!respectXML || respectXML && xml.wrapped) {
|
||||
sampleArray = [sampleFromSchemaGeneric(items, config, undefined, respectXML)]
|
||||
} else {
|
||||
|
||||
@@ -8,6 +8,7 @@ import {
|
||||
createXMLExample,
|
||||
memoizedCreateXMLExample,
|
||||
memoizedSampleFromSchema,
|
||||
mergeJsonSchema,
|
||||
} from "./fn/index"
|
||||
import makeGetJsonSampleSchema from "./fn/get-json-sample-schema"
|
||||
import makeGetYamlSampleSchema from "./fn/get-yaml-sample-schema"
|
||||
@@ -33,6 +34,7 @@ const JSONSchema5SamplesPlugin = ({ getSystem }) => {
|
||||
getYamlSampleSchema,
|
||||
getXmlSampleSchema,
|
||||
getSampleSchema,
|
||||
mergeJsonSchema,
|
||||
},
|
||||
inferSchema,
|
||||
sampleFromSchema,
|
||||
@@ -44,6 +46,7 @@ const JSONSchema5SamplesPlugin = ({ getSystem }) => {
|
||||
getYamlSampleSchema,
|
||||
getXmlSampleSchema,
|
||||
getSampleSchema,
|
||||
mergeJsonSchema,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
@@ -31,6 +31,7 @@ function afterLoad({ fn, getSystem }) {
|
||||
getYamlSampleSchema: fn.jsonSchema202012.getYamlSampleSchema,
|
||||
getXmlSampleSchema: fn.jsonSchema202012.getXmlSampleSchema,
|
||||
getSampleSchema: fn.jsonSchema202012.getSampleSchema,
|
||||
mergeJsonSchema: fn.jsonSchema202012.mergeJsonSchema,
|
||||
},
|
||||
getSystem()
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user