1 | const tslint = require("tslint");
|
2 | const path = require("path");
|
3 |
|
4 | const packageName = process.argv[2];
|
5 | const watch = process.argv[3] === "watch";
|
6 | const tsConfigPath = process.argv[4];
|
7 |
|
8 | let projectPath = "";
|
9 | let split = process.cwd().split(/[\\/]/);
|
10 | if (split[split.length - 1] === packageName) {
|
11 | projectPath = path.resolve(process.cwd(), "../..");
|
12 | }
|
13 | else {
|
14 | projectPath = process.cwd()
|
15 | }
|
16 |
|
17 | const tsconfigFile = tsConfigPath || path.resolve(projectPath, "packages", packageName, "tsconfig.json");
|
18 | const configFile = path.resolve(projectPath, "packages", packageName, "tslint.json");
|
19 |
|
20 | process.on("message", (changedFiles) => {
|
21 | const program = tslint.Linter.createProgram(tsconfigFile, path.dirname(tsconfigFile));
|
22 | const linter = new tslint.Linter({formatter: "json", fix: false}, program);
|
23 |
|
24 | const prepareSourceFiles = (
|
25 | changedFiles.length > 0 ? changedFiles : program.getSourceFiles().map(item => item.fileName)
|
26 | ).map(file => program.getSourceFile(file)).filter(item => !!item);
|
27 |
|
28 | const sourceFiles = [];
|
29 | for (const item of prepareSourceFiles) {
|
30 | if (sourceFiles.every(item1 => item1.fileName !== item.fileName)) {
|
31 | sourceFiles.push(item);
|
32 | }
|
33 | }
|
34 |
|
35 | for (const sourceFile of sourceFiles) {
|
36 | if (/\.d\.ts$/.test(sourceFile.fileName)) continue;
|
37 | if (!path.resolve(sourceFile.fileName).startsWith(path.resolve(path.dirname(tsconfigFile)))) continue;
|
38 |
|
39 | const config = tslint.Configuration.findConfiguration(configFile, sourceFile.fileName);
|
40 | linter.lint(sourceFile.fileName, sourceFile.getFullText(), config.results);
|
41 |
|
42 | const result = linter.getResult();
|
43 |
|
44 | for (const failure of result.failures) {
|
45 | if (failure.getFileName() !== sourceFile.fileName) {
|
46 | continue;
|
47 | }
|
48 |
|
49 | const severity = failure.getRuleSeverity();
|
50 | const message = failure.getFailure();
|
51 | const rule = failure.getRuleName();
|
52 | const fileName = failure.getFileName();
|
53 | const lineNumber = failure.getStartPosition().getLineAndCharacter().line + 1;
|
54 | const charNumber = failure.getStartPosition().getLineAndCharacter().character + 1;
|
55 |
|
56 | const resultMessage = `${fileName}(${lineNumber},${charNumber}): ${severity}: ${message} (${rule})`;
|
57 | sendMessage(resultMessage);
|
58 | }
|
59 | }
|
60 |
|
61 | process.send("finish", err => {
|
62 | if (err) throw err;
|
63 | });
|
64 |
|
65 | if (!watch) process.exit();
|
66 | });
|
67 |
|
68 | function sendMessage(message) {
|
69 | process.send(message, err => {
|
70 | if (err) throw err;
|
71 | });
|
72 | } |
\ | No newline at end of file |