@redocly/cli
Version:
[@Redocly](https://redocly.com) CLI is your all-in-one API documentation utility. It builds, manages, improves, and quality-checks your API descriptions, all of which comes in handy for various phases of the API Lifecycle. Create your own rulesets to make
66 lines • 2.86 kB
JavaScript
import { logger, createConfig, lintDocument, pluralize } from '@redocly/openapi-core';
import { evaluatePluginsFromCode } from './plugin-evaluator.js';
import { exitWithError } from '../../../utils/error.js';
export async function validateScorecard({ document, externalRefResolver, scorecardConfig, configPath, pluginsCodeOrPlugins, targetLevel, verbose = false, }) {
const problems = [];
const levelResults = new Map();
if (targetLevel && !scorecardConfig.levels?.some((level) => level.name === targetLevel)) {
exitWithError(`Target level "${targetLevel}" not found in the scorecard configuration levels.\n`);
}
for (const level of scorecardConfig?.levels || []) {
if (verbose) {
logger.info(`\nValidating level: "${level.name}"\n`);
}
const plugins = typeof pluginsCodeOrPlugins === 'string'
? await evaluatePluginsFromCode(pluginsCodeOrPlugins, verbose)
: pluginsCodeOrPlugins;
if (verbose && plugins && plugins.length > 0) {
logger.info(`Using ${plugins.length} ${pluralize('plugin', plugins.length)} for this level.\n`);
}
const config = await createConfig({ ...level, plugins }, {
configPath,
});
if (verbose) {
logger.info(`Linting document against level rules...\n`);
}
const levelProblems = await lintDocument({
document,
externalRefResolver,
config,
});
const filteredProblems = levelProblems
.filter(({ ignored }) => !ignored)
.map((problem) => ({
...problem,
scorecardLevel: level.name,
}));
levelResults.set(level.name, filteredProblems);
if (verbose) {
logger.info(`Found ${filteredProblems.length} ${pluralize('problem', filteredProblems.length)} for level "${level.name}".\n`);
}
problems.push(...filteredProblems);
}
const achievedLevel = determineAchievedLevel(levelResults, scorecardConfig.levels || [], targetLevel);
const targetLevelAchieved = targetLevel ? achievedLevel === targetLevel : true;
return {
problems,
achievedLevel,
targetLevelAchieved,
};
}
function determineAchievedLevel(levelResults, levels, targetLevel) {
let lastPassedLevel = null;
for (const level of levels) {
const levelProblems = levelResults.get(level.name) || [];
const hasErrors = levelProblems.some((p) => p.severity === 'error');
if (hasErrors) {
return lastPassedLevel || 'Non Conformant';
}
lastPassedLevel = level.name;
if (targetLevel && level.name === targetLevel) {
return level.name;
}
}
return lastPassedLevel || 'Non Conformant';
}
//# sourceMappingURL=validate-scorecard.js.map