@murmurations/jsig
Version:
JSON Schema Instance Generator (JSIG)
66 lines (65 loc) • 2.39 kB
JavaScript
export async function parseSchemas(url, schemaName) {
if (schemaName.length === 0) {
throw new Response('No schema name provided', {
status: 400
});
}
let mergedSchema = {
$schema: '',
type: 'object',
properties: {},
required: [],
metadata: {
schema: []
}
};
if (schemaName.length > 1) {
const schemas = [];
// Need to wait all results and then return the data
// Create an array to store the promises to solve the order problem
const promises = schemaName.map(async (name) => {
return await retrieveSchema(url, name);
});
const resolvedSchemas = await Promise.all(promises);
schemas.push(...resolvedSchemas);
// Remove duplicate properties
// todo: we only merge properties, required and schema here. If we need the other properties here, we should add it here.
schemas.forEach((val, index) => {
if (index === 0) {
mergedSchema.$schema = val.$schema;
mergedSchema.properties = val.properties;
mergedSchema.required = val.required;
mergedSchema.metadata.schema = [val.metadata.schema.name];
}
else {
// Properties field
Object.keys(val.properties).forEach(property => {
if (!(property in mergedSchema.properties)) {
mergedSchema.properties[property] = val.properties[property];
}
});
// Required field
mergedSchema.required = Array.from(new Set(mergedSchema.required.concat(val.required)));
// metadata-schema
mergedSchema.metadata.schema.push(val.metadata.schema.name);
}
});
}
else {
const getSchema = await retrieveSchema(url, schemaName[0]);
mergedSchema = getSchema;
mergedSchema.metadata.schema = [getSchema.metadata.schema.name];
}
return mergedSchema;
}
async function retrieveSchema(url, schemaName) {
const schemaUrl = `${url}/${schemaName}`;
try {
return await fetch(schemaUrl).then(res => res.json());
}
catch (error) {
throw new Response(`parseRef error: ${error}`, {
status: 500
});
}
}