@eklmv/jscpd-sarif-reporter
Version:
Reporter for jscpd. Generate a report in SARIF format (https://github.com/oasis-tcs/sarif-spec).
84 lines (83 loc) • 3.48 kB
JavaScript
// ../../node_modules/.pnpm/tsup@8.2.4_jiti@1.21.0_postcss@8.4.38_typescript@5.5.4_yaml@2.4.3/node_modules/tsup/assets/esm_shims.js
import { fileURLToPath } from "url";
import path from "path";
var getFilename = () => fileURLToPath(import.meta.url);
var getDirname = () => path.dirname(getFilename());
var __dirname = /* @__PURE__ */ getDirname();
// src/index.ts
import { join } from "path";
import { ensureDirSync, readJsonSync, writeFileSync } from "fs-extra";
import { green } from "colors/safe";
import { SarifBuilder, SarifResultBuilder, SarifRuleBuilder, SarifRunBuilder } from "node-sarif-builder";
function getSourceLocation(start, end) {
return `${start.line}:${start.column} - ${end.line}:${end.column}`;
}
var SarifReporter = class {
constructor(options) {
this.options = options;
}
report(clones, statistic) {
const url = "https://github.com/kucherenko/jscpd/";
if (this.options.output) {
const pkg = readJsonSync(join(__dirname, "../package.json"));
const sarifBuilder = new SarifBuilder();
const sarifRunBuilder = new SarifRunBuilder().initSimple({
toolDriverName: "jscpd",
toolDriverVersion: pkg.version,
url
});
sarifRunBuilder.addRule(
new SarifRuleBuilder().initSimple({
ruleId: "duplication",
shortDescriptionText: "Found code duplication",
helpUri: url
})
);
sarifRunBuilder.addRule(
new SarifRuleBuilder().initSimple({
ruleId: "duplications-threshold",
shortDescriptionText: "Level of duplication is too high",
helpUri: url
})
);
for (const clone of clones) {
const sarifResultBuilder = new SarifResultBuilder();
sarifRunBuilder.addResult(
sarifResultBuilder.initSimple(
{
// Transcode to a SARIF level: can be "warning" or "error" or "note"
level: "warning",
messageText: `Clone detected in ${clone.format}, - ${clone.duplicationA.sourceId}[${getSourceLocation(clone.duplicationA.start, clone.duplicationA.end)}] and ${clone.duplicationB.sourceId}[${getSourceLocation(clone.duplicationB.start, clone.duplicationB.end)}]`,
ruleId: "duplication",
fileUri: clone.duplicationA.sourceId,
startLine: clone.duplicationA.start.line,
startColumn: clone.duplicationA.start.column,
endLine: clone.duplicationA.end.line,
endColumn: clone.duplicationA.end.column
}
)
);
}
if (statistic.total?.percentage >= (this.options.threshold || 100)) {
const sarifResultBuilderThreshold = new SarifResultBuilder();
sarifRunBuilder.addResult(
sarifResultBuilderThreshold.initSimple({
level: "error",
messageText: `The duplication level (${statistic.total.percentage}%) is bigger than threshold (${this.options.threshold}%)`,
ruleId: "duplications-threshold"
})
);
}
const path2 = join(this.options.output, "jscpd-sarif.json");
sarifBuilder.addRun(sarifRunBuilder);
const sarifJsonString = sarifBuilder.buildSarifJsonString({ indent: false });
ensureDirSync(this.options.output);
writeFileSync(path2, sarifJsonString);
console.log(green(`SARIF report saved to ${path2}`));
}
}
};
export {
SarifReporter as default
};
//# sourceMappingURL=index.mjs.map