@adobe/jsonschema2md
Version:
Validate and document complex JSON Schemas the easy way.
98 lines (85 loc) • 3.35 kB
JavaScript
/*
* Copyright 2019 Adobe. All rights reserved.
* This file is licensed to you under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. You may obtain a copy
* of the License at http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under
* the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
* OF ANY KIND, either express or implied. See the License for the specific language
* governing permissions and limitations under the License.
*/
import {
map, pipe, filter, list as flist, mapSort, uniq,
} from 'ferrum';
import {
root, paragraph, text, heading, list, listItem, link, inlineCode,
} from 'mdast-builder';
import i from 'es2015-i18n-tag';
import s from './symbols.js';
import { gentitle, gendescription } from './formattingTools.js';
import { keyword } from './keywords.js';
const { default: i18n } = i;
function makeversionnote(schemas) {
const versions = flist(uniq(schemas
.map((schema) => schema[keyword`$schema`])
.filter((e) => !!e)));
if (versions.length === 1) {
return [
heading(2, text(i18n`Version Note`)),
paragraph([
text('The schemas linked above follow the JSON Schema Spec version: '),
inlineCode(versions[0]),
]),
];
}
return [];
}
/**
* Generate the README.md
* @param {object} opts
* @returns {function(Array): import('unist').Parent|null}
*/
export default function build({ readme = true }) {
return (schemas) => {
if (readme) {
console.log('building readme');
const toplevel = flist(pipe(
schemas,
filter((schema) => !schema[s.parent]), // remove schemas with a parent
mapSort((schema) => gentitle(schema[s.titles], schema[keyword`type`])),
map((schema) => listItem(paragraph([
link(`./${schema[s.slug]}.md`, gendescription(schema), [text(gentitle(schema[s.titles], schema[keyword`type`]))]),
text(' – '),
inlineCode(schema[keyword`$id`] || '-'),
]))),
), Array);
const bytype = (type) => flist(pipe(
schemas,
filter((schema) => schema[keyword`type`] === type), // remove schemas without matching type
filter((schema) => !!schema[s.parent]), // keep only schemas with a parent
filter((schema) => !schema.$ref), // it is not a reference
mapSort((schema) => gentitle(schema[s.titles], schema[keyword`type`])),
map((schema) => listItem(paragraph([
link(`./${schema[s.slug]}.md`, gendescription(schema), [text(gentitle(schema[s.titles], schema[keyword`type`]))]),
text(' – '),
inlineCode(`${schema[s.id]}#${schema[s.pointer]}`),
]))),
), Array);
const readmenode = root([
heading(1, text(i18n`README`)),
heading(2, text(i18n`Top-level Schemas`)),
list('unordered', toplevel),
heading(2, text(i18n`Other Schemas`)),
heading(3, text(i18n`Objects`)),
list('unordered', bytype('object')),
heading(3, text(i18n`Arrays`)),
list('unordered', bytype('array')),
...makeversionnote(schemas),
]);
// console.log(inspect(readmenode));
return readmenode;
}
return null;
};
}