json: fix mjs implementation + align outputs

This commit is contained in:
ochafik 2024-03-12 02:08:07 +00:00
parent 51ca7cb863
commit 0be059def8
2 changed files with 22 additions and 18 deletions

View file

@ -456,7 +456,7 @@ class SchemaConverter:
rule += ' | '.join( rule += ' | '.join(
get_recursive_refs(optional_props[i:], first_is_optional=False) get_recursive_refs(optional_props[i:], first_is_optional=False)
for i in range(len(optional_props)) for i in range(len(optional_props))
) + ' ' )
if required_props: if required_props:
rule += ' )' rule += ' )'
rule += ' )?' rule += ' )?'
@ -466,7 +466,10 @@ class SchemaConverter:
return rule return rule
def format_grammar(self): def format_grammar(self):
return '\n'.join((f'{name} ::= {rule}' for name, rule in self._rules.items())) return '\n'.join(
f'{name} ::= {rule}'
for name, rule in sorted(self._rules.items(), key=lambda kv: kv[0])
)
def main(args_in = None): def main(args_in = None):

View file

@ -135,7 +135,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 ? '-' : ''}${i}`))
.join(' | '); .join(' | ');
} }
@ -377,7 +377,7 @@ export class SchemaConverter {
} else if ((schemaType === undefined || schemaType === 'object') && 'additionalProperties' in schema) { } else if ((schemaType === undefined || schemaType === 'object') && 'additionalProperties' in schema) {
const additionalProperties = typeof schema.additionalProperties === 'object' ? schema.additionalProperties : {}; const additionalProperties = typeof schema.additionalProperties === 'object' ? schema.additionalProperties : {};
const subName = `${name}${name ? '-' : ''}additionalProperties`; const subName = `${name ?? ''}${name ? '-' : ''}additionalProperties`;
const valueRule = this.visit(additionalProperties, `${subName}-value`); const valueRule = this.visit(additionalProperties, `${subName}-value`);
const kvRule = this._addRule(`${subName}-kv`, `string ":" space ${valueRule}`); const kvRule = this._addRule(`${subName}-kv`, `string ":" space ${valueRule}`);
return this._addRule(ruleName, `( ${kvRule} ( "," space ${kvRule} )* )*`); return this._addRule(ruleName, `( ${kvRule} ( "," space ${kvRule} )* )*`);
@ -387,17 +387,18 @@ export class SchemaConverter {
return this._addRule( return this._addRule(
ruleName, ruleName,
'"[" space ' + '"[" space ' +
items.map((item, i) => this.visit(item, `${name}${name ? '-' : ''}tuple-${i}`)).join(' "," space ') + items.map((item, i) => this.visit(item, `${name ?? ''}${name ? '-' : ''}tuple-${i}`)).join(' "," space ') +
' "]" space' ' "]" space'
); );
} else { } else {
const itemRuleName = this.visit(items, `${name}${name ? '-' : ''}item`); const itemRuleName = this.visit(items, `${name ?? ''}${name ? '-' : ''}item`);
const listItemOperator = `( "," space ${itemRuleName} )`; const listItemOperator = `( "," space ${itemRuleName} )`;
let successiveItems = ''; let successiveItems = '';
const minItems = schema.minItems || 0; let minItems = schema.minItems || 0;
const maxItems = schema.maxItems; const maxItems = schema.maxItems;
if (minItems > 0) { if (minItems > 0) {
successiveItems = listItemOperator.repeat(minItems - 1); successiveItems = listItemOperator.repeat(minItems - 1);
minItems--;
} }
if (maxItems !== undefined && maxItems > minItems) { if (maxItems !== undefined && maxItems > minItems) {
successiveItems += `${listItemOperator}?`.repeat(maxItems - minItems - 1); successiveItems += `${listItemOperator}?`.repeat(maxItems - minItems - 1);
@ -449,9 +450,9 @@ export class SchemaConverter {
const propKvRuleNames = {}; const propKvRuleNames = {};
for (const [propName, propSchema] of properties) { for (const [propName, propSchema] of properties) {
const propRuleName = this.visit(propSchema, `${name}${name ? '-' : ''}${propName}`); const propRuleName = this.visit(propSchema, `${name ?? ''}${name ? '-' : ''}${propName}`);
propKvRuleNames[propName] = this._addRule( propKvRuleNames[propName] = this._addRule(
`${name}${name ? '-' : ''}${propName}-kv`, `${name ?? ''}${name ? '-' : ''}${propName}-kv`,
`${this._formatLiteral(propName)} space ":" space ${propRuleName}` `${this._formatLiteral(propName)} space ":" space ${propRuleName}`
); );
} }
@ -474,7 +475,7 @@ export class SchemaConverter {
let res = firstIsOptional ? `( "," space ${kvRuleName} )?` : kvRuleName; let res = firstIsOptional ? `( "," space ${kvRuleName} )?` : kvRuleName;
if (rest.length > 0) { if (rest.length > 0) {
res += ' ' + this._addRule( res += ' ' + this._addRule(
`${name}${name ? '-' : ''}${k}-rest`, `${name ?? ''}${name ? '-' : ''}${k}-rest`,
getRecursiveRefs(rest, true) getRecursiveRefs(rest, true)
); );
} }
@ -495,7 +496,7 @@ export class SchemaConverter {
formatGrammar() { formatGrammar() {
let grammar = ''; let grammar = '';
for (const [name, rule] of Object.entries(this._rules)) { for (const [name, rule] of Object.entries(this._rules).sort(([a], [b]) => a.localeCompare(b))) {
grammar += `${name} ::= ${rule}\n`; grammar += `${name} ::= ${rule}\n`;
} }
return grammar; return grammar;