cspell
Version:
A Spelling Checker for Code!
62 lines • 2.26 kB
JavaScript
import { dynamicImport } from '@cspell/dynamic-import';
import { pkgDir } from '../pkgInfo.js';
import { ApplicationError, toError } from './errors.js';
function callAll(methods) {
return (...p) => {
for (const method of methods) {
method(...p);
}
return;
};
}
function extractEmitter(reporters, emitterName) {
// The `bind` is used in case the reporter is a class.
return reporters
.map((r) => r[emitterName]?.bind(r))
.filter((r) => !!r);
}
function mergeResultEmitters(reporters) {
return async (result) => {
await Promise.all(reporters.map((reporter) => reporter.result?.(result)));
};
}
/**
* Mergers several cspell reporters into a single one
*/
export function mergeReporters(...reporters) {
return {
issue: callAll(extractEmitter(reporters, 'issue')),
info: callAll(extractEmitter(reporters, 'info')),
debug: callAll(extractEmitter(reporters, 'debug')),
progress: callAll(extractEmitter(reporters, 'progress')),
error: callAll(extractEmitter(reporters, 'error')),
result: mergeResultEmitters(reporters),
};
}
/**
* Loads reporter modules configured in cspell config file
*/
export async function loadReporters(reporters, defaultReporter, config) {
async function loadReporter(reporterSettings) {
if (reporterSettings === 'default')
return defaultReporter;
if (!Array.isArray(reporterSettings)) {
reporterSettings = [reporterSettings];
}
const [moduleName, settings] = reporterSettings;
try {
const { getReporter } = await dynamicImport(moduleName, [process.cwd(), pkgDir]);
return getReporter(settings, config);
}
catch (e) {
throw new ApplicationError(`Failed to load reporter ${moduleName}: ${toError(e).message}`);
}
}
reporters = !reporters || !reporters.length ? ['default'] : [...reporters];
const loadedReporters = await Promise.all(reporters.map(loadReporter));
return loadedReporters.filter((v) => v !== undefined);
}
export function finalizeReporter(reporter) {
return reporter && mergeReporters(reporter);
}
//# sourceMappingURL=reporters.js.map