debt-collector
Version:
a nodejs tool to identify, track and mesure technical debt
110 lines (109 loc) • 4.28 kB
JavaScript
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;
};