/
cleanup.ts
73 lines (56 loc) · 2.04 KB
/
cleanup.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
import * as fs from "fs";
import { promisify } from "util";
console.log("Hello");
const config: Promise<DeletionCriteria> = readConfig();
const data: Promise<RepoData[]> = gatherData();
const report: Promise<string[]> = constructReport(config, data);
makeRecommendations(report);
/********************************/
function makeRecommendations(recommendationsPromise: Promise<string[]>): Promise<void> {
return recommendationsPromise.then(recommendations =>
recommendations.forEach(rec =>
console.log(rec)));
}
interface DeletionCriteria {
tooFewCommits: number;
suspiciousPrefix: string;
}
function readConfig(): Promise<DeletionCriteria> {
return promisify(fs.readFile)(
"config/deletionCriteria.json",
{ encoding: "utf8" })
.then(configFileContent =>
JSON.parse(configFileContent));
}
interface RepoData {
name: string;
commits: number;
}
function gatherData(): Promise<RepoData[]> {
const repositoryNames = ["test-repo-1", "promises-blog", "abandoned-project", "test-repo-2"];
function commitCount(repositoryName: string): number {
return ({
"test-repo-1": 1,
"promises-blog": 4,
"abandoned-project": 1,
"test-repo-2": 2,
})[repositoryName];
}
const repositoryData = repositoryNames.map(repositoryName => {
const numberOfCommits = commitCount(repositoryName);
return {
name: repositoryName,
commits: numberOfCommits,
};
});
return Promise.resolve(repositoryData);
}
function constructReport(criteriaPromise: Promise<DeletionCriteria>, inputPromise: Promise<RepoData[]>): Promise<string[]> {
return criteriaPromise.then(criteria => inputPromise
.then(input => {
const singleCommitRepos = input.filter(r =>
(r.commits <= criteria.tooFewCommits) ||
(r.name.startsWith(criteria.suspiciousPrefix)));
return singleCommitRepos.map(r => "I recommend deleting " + r.name);
}));
}