clean-code-metrics
Version:
metrics for clean code
89 lines (82 loc) • 2.52 kB
text/typescript
import TaskMetrics from "../TaskMetrics";
import chalk from "chalk";
import { TaskFile } from "../types/TaskMetrics";
import { getColor } from "./TaskStyles";
import fs from "fs";
export default async function list(
fileFilter: string[] | undefined,
verbose: boolean,
configOverridePath?: fs.PathLike,
): Promise<void> {
fileFilter = fileFilter?.length ? fileFilter : undefined;
if (verbose) {
console.info(
`Listing Tasks grouped by File: ${formatFileList(fileFilter)}`,
);
}
const taskMetric = (
await TaskMetrics.createMetrics(configOverridePath)
).get();
const taskLength = Math.max(
...taskMetric.getRawData().map((s) => s.task.length),
);
const list = taskMetric.getList(fileFilter);
const lineMaxLength = Math.max(
...list.map((t) => t.tasks.map((v) => String(v.lineNumber).length)).flat(2),
);
console.info(prettyPrint(list, taskLength, lineMaxLength));
}
function formatFileList(fileList: string[] | undefined) {
return fileList ? `(${fileList.join(", ")})` : "";
}
function prettyPrint(
allTasks: TaskFile[],
taskLength: number,
lineMaxLength: number,
) {
return allTasks
.sort((a, b) => b.tasks.length - a.tasks.length)
.map(
(t) =>
prettyFile(t) +
"\n" +
prettyTasks(t.tasks, taskLength, lineMaxLength) +
"\n",
)
.join("\n");
}
const prettyFile = (task: TaskFile): string =>
`at ${task.file}:0\t${chalk.bold.inverse(`#tasks: ${task.tasks.length}`)}`;
function prettyTasks(
tasks: { task: string; lineNumber: number; content: string }[],
taskLength: number,
lineMaxLength: number,
) {
return (
tasks
//.sort((a, b) => getPrio(a.task) - getPrio(b.task)) // TODO use a flag to decide the sorting parameter
.sort((a, b) => a.lineNumber - b.lineNumber)
.map((task) => prettyTask(task, taskLength, lineMaxLength))
.join("\n")
);
}
function prettyTask(
task: {
task: string;
lineNumber: number;
content: string;
},
taskLength: number,
lineMaxLength: number,
): string {
const taskAppender = " ".repeat(taskLength - task.task.length);
const lineAppender = " ".repeat(
lineMaxLength - String(task.lineNumber).length,
);
const color = getColor(task.task);
const line_string = chalk.gray(lineAppender + task.lineNumber);
const task_string = color.inverse(`${task.task}${taskAppender}`);
//const taskStart = task.content.indexOf(task.task) + task.task.length; //TODO cut task if in the beginning
const content_string = color(task.content.trim());
return ` ${line_string} ${task_string} ${content_string}`;
}