uui-build/ts/tasks/docsGen/compareStatsUtils/statsComparatorUtils.ts (76 lines of code) (raw):
import { TDocGenStatsResult } from '../types/types';
import { formatResultsToMd } from './statsMdFormatterUtils';
import { getStatsFromFile, removeComparisonReportMd, saveComparisonReportMd } from './statsLoaderUtils';
import { TCompareStatsResult } from './types';
export function compareToPrevStats(nextStats: TDocGenStatsResult, relPath: string | undefined) {
removeComparisonReportMd();
if (relPath) {
const prevStats = getStatsFromFile(relPath);
const comparisonResult = compareStats({ prevStats, nextStats });
const mdReport = formatResultsToMd(comparisonResult);
saveComparisonReportMd(mdReport);
}
}
function compareStats(params: { prevStats: TDocGenStatsResult | undefined, nextStats: TDocGenStatsResult }): TCompareStatsResult {
const { prevStats, nextStats } = params;
const propsNoComment = {
prev: prevStats ? prevStats.missingPropComment.totals.amountProps : undefined,
next: nextStats.missingPropComment.totals.amountProps,
};
const typesNoComment = {
prev: prevStats ? prevStats.missingTypeComment.totals.amountTypes : undefined,
next: nextStats.missingTypeComment.totals.amountTypes,
};
return {
propsNoComment: {
...propsNoComment,
isIncreased: isIncreased(propsNoComment.prev, propsNoComment.next),
newWithNoComment: getNewPropsWithNoComments(params),
},
typesNoComment: {
...typesNoComment,
isIncreased: isIncreased(typesNoComment.prev, typesNoComment.next),
newWithNoComment: getNewTypesWithNoComments(params),
},
};
function isIncreased(prevAmount: number | undefined, nextAmount: number) {
if (prevAmount === undefined) {
return false;
}
return nextAmount > prevAmount;
}
}
function getNewTypesWithNoComments(params: { prevStats: TDocGenStatsResult | undefined, nextStats: TDocGenStatsResult }): string[] {
const res: string[] = [];
const { prevStats, nextStats } = params;
const prevSet = new Set(prevStats?.missingTypeComment.value || []);
nextStats.missingTypeComment.value.forEach((typeRef) => {
if (!prevSet.has(typeRef)) {
res.push(typeRef);
}
});
return res;
}
function getNewPropsWithNoComments(params: { prevStats: TDocGenStatsResult | undefined, nextStats: TDocGenStatsResult }): string[] {
const res: string[] = [];
const { prevStats, nextStats } = params;
const prevSet = new Set(normMissingPropComments(prevStats));
const nextArr = normMissingPropComments(nextStats);
nextArr.forEach((typeRef) => {
if (!prevSet.has(typeRef)) {
res.push(typeRef);
}
});
return res;
function normMissingPropComments(stats: TDocGenStatsResult | undefined) {
if (!stats) {
return [];
}
return stats.missingPropComment.value.reduce<string[]>((acc, { typeRef, value }) => {
value.forEach((propName) => {
acc.push(`${typeRef}/${propName}`);
});
return acc;
}, []);
}
}