Description
This is a proposal from @ruifortes. All words after this intro paragraph are his, copied from json-schema-org/json-schema-org.github.io#77 (comment) Note that this is sort-of a simplified version of #321.
Why not just use something like spread in js?
Instead of creating complicated semantics for the json-schema itself it could be assumed that some basic operations would be possible in simple json like "$ref" is.
"#ref" has nothing to do with the schema itself, just json.
So, why not use a similar approach using "$spread" like the js obj2 = {...obj1, otherProp, yetAnotherOne}
but declarative.
If you have to basic shemas foo
and bar
{
description: 'foo schema',
type: 'object',
properties: {
foo1: {type: 'number'},
foo2: {type: 'boolean'}
}
}
{
description: 'bar shema' ,
type: 'object'
properties: {
bar1: {type: 'string'},
bar2: {type: 'boolean'}
}
}
you could extend foo like:
{
description: 'foo and more shema' ,
type: 'object'
properties: {
more1: {type: 'string'},
more2: {type: 'boolean'},
$spread: {$ref: 'pathto/foo#properties'}
}
}
eventually $spread position in would be relevant for overriding props.
To create a foobar schema that extends both you could:
{
description: 'foobar and more shema' ,
type: 'object'
properties: {
foobarSpecific: {type: 'string'},
$spread: [
{$ref: 'pathto/foo#properties'},
{$ref: 'pathto/baar#properties'}
]
}
}
The idea would be that json-schema would be a simple schema definition without fancy inheritance semantics and there would be some json (object) declarative manipulations mechanism like $ref and something like $spread could be another one