UNPKG

debt-collector

Version:

a nodejs tool to identify, track and mesure technical debt

78 lines (77 loc) 2.77 kB
import fs from 'node:fs'; import { getRulesForFile } from '../filters/filterRules.js'; import { createMatchRuleUtils } from '../rulesUtils/index.js'; import getfileRulesErrors from './getFileRulesErrors.js'; import { truncateString, getConfigRuleById } from '../utils/index.js'; import getAdoptionRulesResults from './getAdoptionRulesResults.js'; const updateResults = (config, brokenRules, fileResults, key = 'brokenRules') => { const updatedFileResults = { ...fileResults, }; if (brokenRules.length > 0) { brokenRules.forEach(({ ruleId, occurences }) => { if (ruleId === undefined || occurences === undefined) return; let rule; if (key === 'adoptionRules') { rule = config.adoptionRules?.find((r) => r.id === ruleId); } else { rule = getConfigRuleById(config, ruleId); } const ruleTotalSore = (rule?.debtScore ?? 0) * occurences; updatedFileResults[key].push({ ruleTitle: rule?.title ?? '', ruleId, occurences, ruleTotalSore, }); if (key === 'brokenRules') { updatedFileResults.totalScore += ruleTotalSore; } }); } return updatedFileResults; }; const runFileChecks = async (config, filePath) => { let fileResults = { filePath, fileShortPath: truncateString(filePath, 80), brokenRules: [], adoptionRules: [], totalScore: 0, }; if ((config.fileRules?.length ?? 0) === 0 && (config.adoptionRules?.length ?? 0) === 0) { return fileResults; } let data = ''; try { data = await fs.promises.readFile(filePath, 'utf-8'); } catch { data = ''; } if (data) { // Build utils once per file — all rule checks share the same pre-parsed // DOM tags, closures, and content string rather than rebuilding independently. const utils = createMatchRuleUtils(filePath, data); if (config.fileRules?.length) { fileResults = updateResults(config, getfileRulesErrors(config, utils), fileResults, 'brokenRules'); } if (config.adoptionRules?.length) { fileResults = updateResults(config, getAdoptionRulesResults(config, utils), fileResults, 'adoptionRules'); } } return fileResults; }; const getFileResult = async (config, file, incrementCounter) => { const rulesForFile = getRulesForFile(config, file); const fileResult = await runFileChecks({ ...config, ...rulesForFile, }, file); incrementCounter(); return fileResult; }; export default getFileResult;