UNPKG

debt-collector

Version:

a nodejs tool to identify, track and mesure technical debt

110 lines (109 loc) 4.28 kB
const getDateRulesDatas = ({ config, results, }) => { // console.log('getDateRulesDatas results', results) // console.log('getDateRulesDatas config', config) const allRules = config.fileRules?.map((rule) => rule.id) ?? []; // console.log('getDateRulesDatas allRules', allRules) const rulesDateScoreObj = allRules.reduce((acc, ruleId) => { acc[ruleId] = results.map(({ date, brokenRules }) => { const rule = brokenRules?.find(({ ruleId: id }) => id === ruleId); const score = rule ? rule.ruleTotalSore : 0; return { date, score }; }); return acc; }, {}); const global = results.map(({ date, totalScore }) => ({ date, score: totalScore, })); return { rules: rulesDateScoreObj, global, }; }; const getSpeedEstimation = (arr) => { // console.log('getSpeedEstimation arr', arr) if (arr.length === 0) { return { currentScore: 0, avairage: { tendencyDay: 0, tendencyMonth: 0, daysToReachZero: 0, estimatedendDate: 'never', }, lastPeriod: { tendencyDay: 0, tendencyMonth: 0, daysToReachZero: 0, estimatedendDate: 'never', }, }; } const trend = arr.reduce((acc, { date, score }) => { // console.log('acc', acc) if (Object.keys(acc).length === 0) { return { lastDate: date, lastScore: score, trendArr: [], }; } const diff = score - acc.lastScore; const diffDays = Math.floor((new Date(date).getTime() - new Date(acc.lastDate).getTime()) / (1000 * 60 * 60 * 24)); const diffScoreByDay = diff / diffDays; acc.lastDate = date; acc.lastScore = score; acc.trendArr.push(diffScoreByDay); return acc; }, {}); const addDays = (theDate, days) => new Date(theDate.getTime() + days * 24 * 60 * 60 * 1000); const avairageTendencyDay = trend.trendArr?.reduce((acc, monthTrend) => acc + monthTrend, 0) / trend.trendArr?.length || 0; const avairageTendencyMonth = avairageTendencyDay * 30.5; const avairageDaysToReachZero = avairageTendencyMonth <= 0 ? Math.round(Math.abs(trend.lastScore / avairageTendencyDay)) : Infinity; const lastCommitDate = new Date(trend.lastDate); const avairageEndDebtDate = avairageTendencyDay >= 0 ? 'never' : addDays(new Date(lastCommitDate), avairageDaysToReachZero); const lastPeriodTendencyDay = trend.trendArr[trend.trendArr?.length - 1] || 0; const lastPeriodDaysToReachZero = lastPeriodTendencyDay <= 0 ? Math.round(Math.abs(trend.lastScore / lastPeriodTendencyDay)) : Infinity; const lastPeriodEndDebtDate = lastPeriodTendencyDay >= 0 ? 'never' : addDays(new Date(lastCommitDate), lastPeriodDaysToReachZero); const result = { currentScore: trend.lastScore, avairage: { tendencyDay: avairageTendencyDay, tendencyMonth: avairageTendencyMonth, daysToReachZero: avairageDaysToReachZero, estimatedendDate: avairageEndDebtDate, }, lastPeriod: { tendencyDay: lastPeriodTendencyDay, tendencyMonth: lastPeriodTendencyDay * 30.5, daysToReachZero: lastPeriodDaysToReachZero, estimatedendDate: lastPeriodEndDebtDate, }, }; // console.log('result', result) return result; }; export const getEndDatesEstimations = (results) => { // console.log('getEndDatesEstimations results prop', results) const resultRuleDatas = getDateRulesDatas(results); // console.log('getEndDatesEstimations resultRuleDatas', resultRuleDatas) const endDateEstimation = { rules: {}, global: {}, }; endDateEstimation.rules = Object.keys(resultRuleDatas.rules).reduce((acc, key) => { acc[key] = getSpeedEstimation(resultRuleDatas.rules[key] || []); return acc; }, {}); endDateEstimation.global = getSpeedEstimation(resultRuleDatas.global); return endDateEstimation; };