Skip to content

Commit 8dd0f8e

Browse files
committed
feat(tsfmt): support --verify option closes #15
1 parent ac7f787 commit 8dd0f8e

File tree

4 files changed

+83
-7
lines changed

4 files changed

+83
-7
lines changed

lib/cli.ts

+35
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ var packageJson = JSON.parse(fs.readFileSync(__dirname + "/../package.json").toS
1212

1313
interface RootOptions {
1414
replace:boolean;
15+
verify:boolean;
1516
stdin:boolean;
1617
tslint:boolean;
1718
editorconfig:boolean;
@@ -27,13 +28,15 @@ var root = commandpost
2728
.create<RootOptions, RootArguments>("tsfmt [files...]")
2829
.version(packageJson.version, "-v, --version")
2930
.option("-r, --replace", "replace .ts file")
31+
.option("--verify", "checking file format")
3032
.option("--stdin", "get formatting content from stdin")
3133
.option("--no-tslint", "don't read a tslint.json")
3234
.option("--no-editorconfig", "don't read a .editorconfig")
3335
.option("--no-tsfmt", "don't read a tsfmt.json")
3436
.option("--verbose", "makes output more verbose")
3537
.action((opts, args)=> {
3638
var replace = !!opts.replace;
39+
var verify = !!opts.verify;
3740
var stdin = !!opts.stdin;
3841
var tslint = !!opts.tslint;
3942
var editorconfig = !!opts.editorconfig;
@@ -46,6 +49,7 @@ var root = commandpost
4649

4750
if (opts.verbose) {
4851
console.log("replace: " + (replace ? "ON" : "OFF"));
52+
console.log("verify: " + (verify ? "ON" : "OFF"));
4953
console.log("stdin: " + (stdin ? "ON" : "OFF"));
5054
console.log("tslint: " + (tslint ? "ON" : "OFF"));
5155
console.log("editorconfig: " + (editorconfig ? "ON" : "OFF"));
@@ -60,19 +64,28 @@ var root = commandpost
6064
lib
6165
.processStream(args.files[0] || "temp.ts", process.stdin, {
6266
replace: replace,
67+
verify: verify,
6368
tslint: tslint,
6469
editorconfig: editorconfig,
6570
tsfmt: tsfmt
6671
})
72+
.then(result => {
73+
var resultMap: lib.ResultMap = {};
74+
resultMap[result.fileName] = result;
75+
return resultMap;
76+
})
77+
.then(showResultHandler)
6778
.catch(errorHandler);
6879
} else {
6980
lib
7081
.processFiles(args.files, {
7182
replace: replace,
83+
verify: verify,
7284
tslint: tslint,
7385
editorconfig: editorconfig,
7486
tsfmt: tsfmt
7587
})
88+
.then(showResultHandler)
7689
.catch(errorHandler);
7790
}
7891
});
@@ -81,6 +94,28 @@ commandpost
8194
.exec(root, process.argv)
8295
.catch(errorHandler);
8396

97+
function showResultHandler(resultMap: lib.ResultMap): Promise<any> {
98+
"use strict";
99+
100+
var hasError = Object.keys(resultMap).filter(fileName => resultMap[fileName].error).length !== 0;
101+
if (hasError) {
102+
Object.keys(resultMap)
103+
.map(fileName => resultMap[fileName])
104+
.filter(result => result.error)
105+
.forEach(result => console.error(result.message));
106+
process.exit(1);
107+
} else {
108+
Object.keys(resultMap)
109+
.map(fileName => resultMap[fileName])
110+
.forEach(result => {
111+
if (result.message) {
112+
console.log(result.message);
113+
}
114+
});
115+
}
116+
return null;
117+
}
118+
84119
function errorHandler(err:any): Promise<any> {
85120
"use strict";
86121

lib/index.ts

+24-6
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ export interface Options {
1818
dryRun?: boolean;
1919
verbose?: boolean;
2020
replace: boolean;
21+
verify: boolean;
2122
tslint: boolean;
2223
editorconfig: boolean;
2324
tsfmt: boolean;
@@ -30,6 +31,8 @@ export interface ResultMap {
3031
export interface Result {
3132
fileName: string;
3233
options: ts.FormatCodeOptions;
34+
message: string;
35+
error: boolean;
3336
src: string;
3437
dest: string;
3538
}
@@ -40,9 +43,15 @@ export function processFiles(files:string[], opts:Options):Promise<ResultMap> {
4043
var resultMap:ResultMap = {};
4144
var promises = files.map(fileName => {
4245
if (!fs.existsSync(fileName)) {
43-
console.error(fileName + " is not exists. process abort.");
44-
process.exit(1);
45-
return;
46+
var result:Result = {
47+
fileName: fileName,
48+
options: null,
49+
message: `${fileName} is not exists. process abort.`,
50+
error: true,
51+
src: "",
52+
dest: ""
53+
};
54+
return Promise.resolve(result);
4655
}
4756

4857
var content = fs.readFileSync(fileName).toString();
@@ -97,18 +106,27 @@ export function processString(fileName:string, content:string, opts:Options):Pro
97106
.then(()=> {
98107
var formattedCode = formatter(content, options);
99108
// TODO replace newline code. NewLineCharacter params affect to only "new" newline. maybe.
100-
if (opts && opts.replace) {
109+
var message: string;
110+
var error = false;
111+
if (opts && opts.verify) {
112+
if (content !== formattedCode) {
113+
message = `${fileName} is not formatted`;
114+
error = true;
115+
}
116+
} else if (opts && opts.replace) {
101117
if (content !== formattedCode) {
102118
fs.writeFileSync(fileName, formattedCode);
103-
console.log("replaced " + fileName);
119+
message = `replaced ${fileName}`;
104120
}
105121
} else if (opts && !opts.dryRun) {
106-
console.log(formattedCode);
122+
message = formattedCode;
107123
}
108124

109125
var result:Result = {
110126
fileName: fileName,
111127
options: options,
128+
message: message,
129+
error: error,
112130
src: content,
113131
dest: formattedCode
114132
};

test/indexSpec.ts

+21-1
Original file line numberDiff line numberDiff line change
@@ -88,13 +88,15 @@ describe("tsfmt test", () => {
8888
.processFiles([fileName], {
8989
dryRun: true,
9090
replace: false,
91+
verify: false,
9192
tslint: true,
9293
editorconfig: true,
9394
tsfmt: true
9495
})
9596
.then(resultMap => {
9697
var result = resultMap[fileName];
9798
assert(result !== null);
99+
assert(result.error === false);
98100

99101
var expectedTsFileName = fileName.replace(fixtureDir, expectedDir);
100102
// console.log(fileName, expectedFileName);
@@ -131,8 +133,24 @@ describe("tsfmt test", () => {
131133
});
132134
});
133135
});
134-
});
135136

137+
it("verify unformatted file", () => {
138+
var fileName = "./test/fixture/tsfmt/a/main.ts";
139+
return lib
140+
.processFiles([fileName], {
141+
dryRun: true,
142+
replace: false,
143+
verify: true,
144+
tslint: true,
145+
editorconfig: true,
146+
tsfmt: true
147+
})
148+
.then(resultMap => {
149+
assert(resultMap[fileName].error);
150+
assert(resultMap[fileName].message === "./test/fixture/tsfmt/a/main.ts is not formatted");
151+
});
152+
});
153+
});
136154

137155
describe("processStream function", () => {
138156
var fileName = "test/fixture/default/main.ts";
@@ -144,12 +162,14 @@ describe("tsfmt test", () => {
144162
.processStream(fileName, input, {
145163
dryRun: true,
146164
replace: false,
165+
verify: false,
147166
tslint: true,
148167
editorconfig: true,
149168
tsfmt: true
150169
})
151170
.then(result=> {
152171
assert(result !== null);
172+
assert(result.error === false);
153173
assert(result.dest === `class Sample { getString(): string { return "hi!"; } }`);
154174
});
155175
});

typescript-formatter.d.ts

+3
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ declare module 'typescript-formatter' {
88
dryRun?: boolean;
99
verbose?: boolean;
1010
replace: boolean;
11+
verify: boolean;
1112
tslint: boolean;
1213
editorconfig: boolean;
1314
tsfmt: boolean;
@@ -18,6 +19,8 @@ declare module 'typescript-formatter' {
1819
export interface Result {
1920
fileName: string;
2021
options: ts.FormatCodeOptions;
22+
message: string;
23+
error: boolean;
2124
src: string;
2225
dest: string;
2326
}

0 commit comments

Comments
 (0)