Skip to content

Commit cbba514

Browse files
authored
Merge pull request npm#16 from herodevs/tracker
Implement HeroDevs tracker logic in this CLI
2 parents 301b9f1 + 56fe832 commit cbba514

25 files changed

Lines changed: 2571 additions & 641 deletions

package-lock.json

Lines changed: 1743 additions & 631 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,16 @@
2323
"@oclif/core": "^2",
2424
"@oclif/plugin-help": "^5",
2525
"@oclif/plugin-plugins": "^3.2.0",
26+
"chart.js": "^3.9.1",
27+
"chart.js-image": "^6.1.3",
28+
"chartjs-node-canvas": "^4.1.6",
29+
"chartjs-plugin-autocolors": "^0.2.2",
30+
"chartjs-plugin-datalabels": "^2.2.0",
2631
"date-fns": "^2.30.0",
32+
"git-last-commit": "^1.0.1",
2733
"module-alias": "^2.2.3",
28-
"shelljs": "^0.8.5"
34+
"shelljs": "^0.8.5",
35+
"sloc": "^0.2.1"
2936
},
3037
"devDependencies": {
3138
"@oclif/test": "^2.4.4",
@@ -55,6 +62,9 @@
5562
"topics": {
5663
"committer": {
5764
"description": "Committer actions"
65+
},
66+
"tracker": {
67+
"description": "Track project progress"
5868
}
5969
}
6070
},
@@ -106,5 +116,11 @@
106116
"keywords": [
107117
"oclif"
108118
],
109-
"types": "dist/index.d.ts"
119+
"types": "dist/index.d.ts",
120+
"prettier": {
121+
"singleQuote": true,
122+
"trailingComma": "es5",
123+
"bracketSpacing": true,
124+
"printWidth": 100
125+
}
110126
}

src/commands/tracker/index.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import { Args, Command, Flags } from '@oclif/core';
2+
import { TrackerInit } from './init';
3+
import { BaseCommand } from '../../shared';
4+
import { TrackerRun } from './run';
5+
6+
export default class Tracker extends Command {
7+
static description = 'Tracker info';
8+
9+
static examples = [`$ @herodevs/cli tracker`];
10+
11+
static flags = {};
12+
13+
static args = {
14+
init: TrackerInit.args,
15+
run: TrackerRun.args,
16+
} as any;
17+
18+
async run(): Promise<void> {}
19+
}

src/commands/tracker/init.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import { Args, Command, Flags } from '@oclif/core';
2+
import { initialize } from '../../shared/tracker/initialize';
3+
import { getTheRootDirectory } from '../../shared/tracker/util';
4+
5+
export class TrackerInit extends Command {
6+
static description = 'Initialize the tracker configuration';
7+
8+
static examples = ['<%= config.bin %> <%= command.id %>'];
9+
10+
static flags = {};
11+
12+
static args = {};
13+
14+
public async run(): Promise<void> {
15+
initialize(getTheRootDirectory(global.process.cwd()));
16+
}
17+
}

src/commands/tracker/run.ts

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import { Args, Command, Flags } from '@oclif/core';
2+
import { resolve } from 'path';
3+
import {
4+
createDataVizIn,
5+
getData,
6+
getTheRootDirectory,
7+
readConfig,
8+
saveResults,
9+
} from '../../shared/tracker/util';
10+
import { processConfig } from '../../shared/tracker/process-config';
11+
import { ChartConfig } from '../../shared/tracker/models/chart-config';
12+
13+
export class TrackerRun extends Command {
14+
static description = 'Run the tracker';
15+
16+
static examples = ['<%= config.bin %> <%= command.id %>'];
17+
18+
static flags = {
19+
root: Flags.string({ char: 'r', description: 'root dir of the project' }),
20+
config: Flags.string({ char: 'c', description: 'path to config file' }),
21+
chart: Flags.custom<ChartConfig>({
22+
description: 'chart configuration',
23+
})(),
24+
};
25+
26+
static args = {};
27+
28+
public async run(): Promise<void> {
29+
const { flags } = await this.parse(TrackerRun);
30+
31+
const localRootDir = getTheRootDirectory(global.process.cwd());
32+
33+
const rootDirectory = flags.root ? resolve(flags.root) : localRootDir;
34+
const config = readConfig(localRootDir, flags.config);
35+
36+
const results = await processConfig(config, rootDirectory);
37+
38+
saveResults(localRootDir, config.outputDir, results);
39+
40+
const allData = getData(localRootDir, config.outputDir);
41+
42+
const parentDir = resolve(localRootDir, config.outputDir);
43+
44+
const chartConfig = new ChartConfig(flags.chart);
45+
46+
await createDataVizIn(chartConfig, parentDir, allData);
47+
}
48+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { Config } from './models/config';
2+
3+
const defaultConfig: Config = {
4+
categories: {
5+
legacy: {
6+
fileTypes: ['js', 'ts', 'html', 'css', 'scss', 'less'],
7+
includes: ['./legacy'],
8+
jsTsPairs: 'js',
9+
},
10+
modern: {
11+
fileTypes: ['ts', 'html', 'css', 'scss', 'less'],
12+
includes: ['./modern'],
13+
jsTsPairs: 'ts',
14+
},
15+
},
16+
ignorePatterns: ['node_modules'],
17+
outputDir: 'hd-tracker',
18+
};
19+
20+
export default defaultConfig;

src/shared/tracker/initialize.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { join } from "path";
2+
import { existsSync, writeFileSync, mkdirSync } from "fs";
3+
4+
import defaultConfig from "./default-config";
5+
6+
export function initialize(rootDir: string): void {
7+
const output = JSON.stringify(defaultConfig, null, 2);
8+
const dir = join(rootDir, "hd-tracker");
9+
if (!existsSync(dir)) {
10+
mkdirSync(dir);
11+
}
12+
writeFileSync(join(dir, "config.json"), output);
13+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import { TotalResult } from './total-result';
2+
3+
export interface AggregateResult extends TotalResult {
4+
fileType: string;
5+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import { AggregateResult } from './aggregate-result';
2+
import { TotalResult } from './total-result';
3+
4+
export interface CategoryResult {
5+
name: string;
6+
totals: TotalResult;
7+
fileTypes: AggregateResult[];
8+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
export interface Category extends CategoryDefinition {
2+
name: string;
3+
}
4+
5+
export interface CategoryDefinition {
6+
fileTypes: string[];
7+
includes: string[];
8+
excludes?: string[];
9+
jsTsPairs?: 'js' | 'ts' | 'ignore';
10+
}

0 commit comments

Comments
 (0)