44 lines
1.7 KiB
JavaScript
44 lines
1.7 KiB
JavaScript
import gp from "@sagold/json-pointer";
|
|
import getTypeDefs from "./schema/getTypeDefs";
|
|
import { isObject } from "./utils/isObject";
|
|
function nextTypeDefs(schema, pointer) {
|
|
if (this.callback(schema, pointer) === true) {
|
|
// eslint-disable-line no-invalid-this
|
|
return; // stop iteration
|
|
}
|
|
const defs = getTypeDefs(schema);
|
|
// eslint-disable-next-line no-invalid-this
|
|
defs.forEach((next) => this.nextTypeDefs(next.def, gp.join(pointer, next.pointer, false)));
|
|
}
|
|
function eachDefinition(walk, schema, pointer, key = "definitions") {
|
|
const defs = schema[key];
|
|
Object.keys(defs).forEach((defId) => {
|
|
if (defs[defId] === false || isObject(defs[defId])) {
|
|
walk.nextTypeDefs(defs[defId], gp.join(pointer, key, defId, false));
|
|
return;
|
|
}
|
|
// console.log(`Invalid schema in ${pointer}/${key}/${defId}`);
|
|
});
|
|
}
|
|
export function eachSchema(schema, callback, pointer = "#") {
|
|
const walk = { callback, nextTypeDefs };
|
|
walk.nextTypeDefs(schema, pointer);
|
|
if (schema.definitions != null) {
|
|
walk.callback = (defschema, schemaPointer) => {
|
|
callback(defschema, schemaPointer);
|
|
if (defschema.definitions != null) {
|
|
eachDefinition(walk, defschema, schemaPointer);
|
|
}
|
|
};
|
|
eachDefinition(walk, schema, pointer);
|
|
}
|
|
if (schema.$defs != null) {
|
|
walk.callback = (defschema, schemaPointer) => {
|
|
callback(defschema, schemaPointer);
|
|
if (defschema.definitions != null) {
|
|
eachDefinition(walk, defschema, schemaPointer);
|
|
}
|
|
};
|
|
eachDefinition(walk, schema, pointer, "$defs");
|
|
}
|
|
}
|