Как разрешить JsonSchema и переместить подсхему в корень? - PullRequest
0 голосов
/ 07 июня 2018

Я написал схему в JavaScript , потому что она проще, которую я могу просто запустить, чтобы превратить ее в JSON .

С этой частью все в порядке, но теперьЯ хочу извлечь подсхему / определение, потому что приложение, с которым я хочу ее использовать, не позволит мне указать путь JSON для интересующей подсхемы.

Поэтому я попытался написать немногоскрипт для его извлечения:

#!/usr/bin/env node
import Ajv from 'ajv';
import Path from 'path';
const ajv = new Ajv({
    $data: true,
});
ajv.addSchema(require(Path.resolve(process.argv[2])).default,'x');
const schema = ajv.getSchema(`x#/${process.argv[3]}`).schema;
console.log(JSON.stringify(schema,null,4));

Но я получаю следующее:

{
    "type": "object",
    "additionalProperties": false,
    "properties": {
        "name": {
            "$ref": "#/defs/Identifier"
        },
        "versions": {
            "type": "array",
            "items": {
                "$ref": "#/defs/TableVersion"
            }
        }
    },
    "required": [
        "name",
        "versions"
    ]
}

то есть я потерял другие определения!

Существуют ли некоторые методы APIв AJV вытащить подсхему, не нарушая все $ refs?

1 Ответ

0 голосов
/ 07 июня 2018

Я сделал это с другой библиотекой.

Вот сценарий, который я придумал:

#!/usr/bin/env node
import $RefParser from 'json-schema-ref-parser';
import Path from 'path';

async function main() {
    const parser = new $RefParser();
    const [file,$ref] = process.argv[2].split('#');
    let rawSchema = require(Path.resolve(file));
    if(rawSchema.__esModule) {
        rawSchema = rawSchema.default;
    }
    let schema = await parser.dereference(rawSchema);
    if($ref) {
       schema = await parser.$refs.get('#'+$ref); 
    }
    console.log(JSON.stringify(schema,null,4));
}

main().catch(err => {
    process.stderr.write(`${err}\n`);
    process.exit(1);
});

Использование:

node export-schema.js table.schema.js#/defs/Table > table.schema.json
...