@redocly/openapi-core
Version:
See https://github.com/Redocly/redocly-cli
50 lines • 1.91 kB
JavaScript
import { asserts, buildAssertCustomFunction } from '../rules/common/assertions/asserts.js';
export function groupAssertionRules(config, plugins) {
if (!config.rules) {
return {};
}
// Create a new record to avoid mutating original
const transformedRules = {};
// Collect assertion rules
const assertions = [];
for (const [ruleKey, rule] of Object.entries(config.rules)) {
if (ruleKey.startsWith('rule/') && typeof rule === 'object' && rule !== null) {
const assertion = rule;
if (plugins) {
registerCustomAssertions(plugins, assertion);
// We may have custom assertion inside where block
for (const context of assertion.where || []) {
registerCustomAssertions(plugins, context);
}
}
assertions.push({
...assertion,
assertionId: ruleKey,
});
}
else {
// If it's not an assertion, keep it as is
transformedRules[ruleKey] = rule;
}
}
if (assertions.length > 0) {
transformedRules.assertions = assertions;
}
return transformedRules;
}
function registerCustomAssertions(plugins, assertion) {
for (const field of Object.keys(assertion.assertions || {})) {
const [pluginId, fn] = field.split('/');
if (!pluginId || !fn)
continue;
const plugin = plugins.find((plugin) => plugin.id === pluginId);
if (!plugin) {
throw Error(`Plugin ${pluginId} isn't found.`);
}
if (!plugin.assertions || !plugin.assertions[fn]) {
throw Error(`Plugin ${pluginId} doesn't export assertions function with name ${fn}.`);
}
asserts[field] = buildAssertCustomFunction(plugin.assertions[fn]);
}
}
//# sourceMappingURL=group-assertion-rules.js.map