json: test/fix top-level anyOf
This commit is contained in:
parent
20869ede26
commit
618247885c
6 changed files with 84 additions and 7 deletions
|
@ -128,7 +128,7 @@ class SchemaConverter:
|
||||||
|
|
||||||
def _generate_union_rule(self, name, alt_schemas):
|
def _generate_union_rule(self, name, alt_schemas):
|
||||||
return ' | '.join((
|
return ' | '.join((
|
||||||
self.visit(alt_schema, f'{name}{"-" if name else ""}{i}')
|
self.visit(alt_schema, f'{name}{"-" if name else "alternative-"}{i}')
|
||||||
for i, alt_schema in enumerate(alt_schemas)
|
for i, alt_schema in enumerate(alt_schemas)
|
||||||
))
|
))
|
||||||
|
|
||||||
|
|
|
@ -170,7 +170,7 @@ private:
|
||||||
string _generate_union_rule(const string& name, const vector<json>& alt_schemas) {
|
string _generate_union_rule(const string& name, const vector<json>& alt_schemas) {
|
||||||
vector<string> rules;
|
vector<string> rules;
|
||||||
for (size_t i = 0; i < alt_schemas.size(); i++) {
|
for (size_t i = 0; i < alt_schemas.size(); i++) {
|
||||||
rules.push_back(visit(alt_schemas[i], name + (name.empty() ? "" : "-") + to_string(i)));
|
rules.push_back(visit(alt_schemas[i], name + (name.empty() ? "alternative-" : "-") + to_string(i)));
|
||||||
}
|
}
|
||||||
return join(rules.begin(), rules.end(), " | ");
|
return join(rules.begin(), rules.end(), " | ");
|
||||||
}
|
}
|
||||||
|
@ -596,7 +596,10 @@ public:
|
||||||
properties.emplace_back(prop.key(), prop.value());
|
properties.emplace_back(prop.key(), prop.value());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return _add_rule(rule_name, _build_object_rule(properties, required, name, schema["additionalProperties"]));
|
return _add_rule(rule_name,
|
||||||
|
_build_object_rule(
|
||||||
|
properties, required, name,
|
||||||
|
schema.contains("additionalProperties") ? schema["additionalProperties"] : json()));
|
||||||
} else if ((schema_type.is_null() || schema_type == "object") && schema.contains("allOf")) {
|
} else if ((schema_type.is_null() || schema_type == "object") && schema.contains("allOf")) {
|
||||||
unordered_set<string> required;
|
unordered_set<string> required;
|
||||||
vector<pair<string, json>> properties;
|
vector<pair<string, json>> properties;
|
||||||
|
|
|
@ -406,7 +406,8 @@ unsigned char json_schema_to_grammar_mjs[] = {
|
||||||
0x73, 0x69, 0x74, 0x28, 0x61, 0x6c, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d,
|
0x73, 0x69, 0x74, 0x28, 0x61, 0x6c, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d,
|
||||||
0x61, 0x2c, 0x20, 0x60, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3f,
|
0x61, 0x2c, 0x20, 0x60, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3f,
|
||||||
0x3f, 0x20, 0x27, 0x27, 0x7d, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x20,
|
0x3f, 0x20, 0x27, 0x27, 0x7d, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x20,
|
||||||
0x3f, 0x20, 0x27, 0x2d, 0x27, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x7d, 0x24,
|
0x3f, 0x20, 0x27, 0x2d, 0x27, 0x20, 0x3a, 0x20, 0x27, 0x61, 0x6c, 0x74,
|
||||||
|
0x65, 0x72, 0x6e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x2d, 0x27, 0x7d, 0x24,
|
||||||
0x7b, 0x69, 0x7d, 0x60, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
|
0x7b, 0x69, 0x7d, 0x60, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
0x20, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x20, 0x7c, 0x20, 0x27,
|
0x20, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x20, 0x7c, 0x20, 0x27,
|
||||||
0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x5f, 0x76,
|
0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x5f, 0x76,
|
||||||
|
@ -1662,4 +1663,4 @@ unsigned char json_schema_to_grammar_mjs[] = {
|
||||||
0x61, 0x73, 0x74, 0x4b, 0x65, 0x79, 0x2c, 0x20, 0x67, 0x72, 0x6f, 0x75,
|
0x61, 0x73, 0x74, 0x4b, 0x65, 0x79, 0x2c, 0x20, 0x67, 0x72, 0x6f, 0x75,
|
||||||
0x70, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x0a
|
0x70, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x0a
|
||||||
};
|
};
|
||||||
unsigned int json_schema_to_grammar_mjs_len = 19942;
|
unsigned int json_schema_to_grammar_mjs_len = 19954;
|
||||||
|
|
|
@ -138,7 +138,7 @@ export class SchemaConverter {
|
||||||
|
|
||||||
_generateUnionRule(name, altSchemas) {
|
_generateUnionRule(name, altSchemas) {
|
||||||
return altSchemas
|
return altSchemas
|
||||||
.map((altSchema, i) => this.visit(altSchema, `${name ?? ''}${name ? '-' : ''}${i}`))
|
.map((altSchema, i) => this.visit(altSchema, `${name ?? ''}${name ? '-' : 'alternative-'}${i}`))
|
||||||
.join(' | ');
|
.join(' | ');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -19,7 +19,7 @@ echo "export type MyType = $type" > "$DTS_FILE"
|
||||||
|
|
||||||
# This is a fork of typescript-json-schema, actively maintained as of March 2024:
|
# This is a fork of typescript-json-schema, actively maintained as of March 2024:
|
||||||
# https://github.com/vega/ts-json-schema-generator
|
# https://github.com/vega/ts-json-schema-generator
|
||||||
npx ts-json-schema-generator --unstable --no-top-ref --path "$DTS_FILE" --type MyType -e none | tee "$SCHEMA_FILE" >&2
|
npx ts-json-schema-generator --unstable --no-top-ref --path "$DTS_FILE" --type MyType -e none > "$SCHEMA_FILE"
|
||||||
|
|
||||||
# Alternative, not actively maintained as of March 2024:
|
# Alternative, not actively maintained as of March 2024:
|
||||||
# https://github.com/YousefED/typescript-json-schema
|
# https://github.com/YousefED/typescript-json-schema
|
||||||
|
|
|
@ -577,6 +577,79 @@ static void test_all(const string& lang, std::function<void(const TestCase&)> ru
|
||||||
)"""
|
)"""
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test({
|
||||||
|
SUCCESS,
|
||||||
|
"anyOf",
|
||||||
|
R"""({
|
||||||
|
"anyOf": [
|
||||||
|
{"$ref": "#/definitions/foo"},
|
||||||
|
{"$ref": "#/definitions/bar"}
|
||||||
|
],
|
||||||
|
"definitions": {
|
||||||
|
"foo": {
|
||||||
|
"properties": {"a": {"type": "number"}}
|
||||||
|
},
|
||||||
|
"bar": {
|
||||||
|
"properties": {"b": {"type": "number"}}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"type": "object"
|
||||||
|
})""",
|
||||||
|
R"""(
|
||||||
|
alternative-0 ::= foo
|
||||||
|
alternative-1 ::= bar
|
||||||
|
bar ::= "{" space (bar-b-kv )? "}" space
|
||||||
|
bar-b-kv ::= "\"b\"" space ":" space number
|
||||||
|
foo ::= "{" space (foo-a-kv )? "}" space
|
||||||
|
foo-a-kv ::= "\"a\"" space ":" space number
|
||||||
|
number ::= ("-"? ([0-9] | [1-9] [0-9]*)) ("." [0-9]+)? ([eE] [-+]? [0-9]+)? space
|
||||||
|
root ::= alternative-0 | alternative-1
|
||||||
|
space ::= " "?
|
||||||
|
)"""
|
||||||
|
});
|
||||||
|
|
||||||
|
test({
|
||||||
|
SUCCESS,
|
||||||
|
"mix of allOf, anyOf and $ref (similar to https://json.schemastore.org/tsconfig.json)",
|
||||||
|
R"""({
|
||||||
|
"allOf": [
|
||||||
|
{"$ref": "#/definitions/foo"},
|
||||||
|
{"$ref": "#/definitions/bar"},
|
||||||
|
{
|
||||||
|
"anyOf": [
|
||||||
|
{"$ref": "#/definitions/baz"},
|
||||||
|
{"$ref": "#/definitions/bam"}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"definitions": {
|
||||||
|
"foo": {
|
||||||
|
"properties": {"a": {"type": "number"}}
|
||||||
|
},
|
||||||
|
"bar": {
|
||||||
|
"properties": {"b": {"type": "number"}}
|
||||||
|
},
|
||||||
|
"bam": {
|
||||||
|
"properties": {"c": {"type": "number"}}
|
||||||
|
},
|
||||||
|
"baz": {
|
||||||
|
"properties": {"d": {"type": "number"}}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"type": "object"
|
||||||
|
})""",
|
||||||
|
R"""(
|
||||||
|
a-kv ::= "\"a\"" space ":" space number
|
||||||
|
b-kv ::= "\"b\"" space ":" space number
|
||||||
|
c-kv ::= "\"c\"" space ":" space number
|
||||||
|
d-kv ::= "\"d\"" space ":" space number
|
||||||
|
d-rest ::= ( "," space c-kv )?
|
||||||
|
number ::= ("-"? ([0-9] | [1-9] [0-9]*)) ("." [0-9]+)? ([eE] [-+]? [0-9]+)? space
|
||||||
|
root ::= "{" space a-kv "," space b-kv ( "," space ( d-kv d-rest | c-kv ) )? "}" space
|
||||||
|
space ::= " "?
|
||||||
|
)"""
|
||||||
|
});
|
||||||
|
|
||||||
test({
|
test({
|
||||||
SUCCESS,
|
SUCCESS,
|
||||||
"conflicting names",
|
"conflicting names",
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue