Skip to content

Commit 4dd3f55

Browse files
committed
fix(tsfmt): use ts.sys.readDirectory and ts.parseJsonConfigFileContent completely closes #77 #84
1 parent ccc119b commit 4dd3f55

File tree

2 files changed

+18
-71
lines changed

2 files changed

+18
-71
lines changed

lib/provider/tsconfigjson.ts

+2-23
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
import * as ts from "typescript";
22

33
import * as path from "path";
4-
import * as fs from "fs";
54

65
import { Options } from "../";
7-
import { getConfigFileName, parseJSON } from "../utils";
6+
import { getConfigFileName, readTsconfig } from "../utils";
87

98
export default function makeFormatCodeOptions(fileName: string, opts: Options, formatSettings: ts.FormatCodeSettings): ts.FormatCodeSettings {
109

@@ -22,27 +21,7 @@ export default function makeFormatCodeOptions(fileName: string, opts: Options, f
2221
console.log(`read ${configFileName} for ${fileName}`);
2322
}
2423

25-
// for `extends` support. It supported from TypeScript 2.1.1.
26-
// `& { readFile(path: string): string; }` is backword compat for TypeScript compiler 2.0.3 support.
27-
const host: ts.ParseConfigHost & { readFile(path: string): string; } = {
28-
useCaseSensitiveFileNames: true,
29-
readDirectory: (rootDir, _extensions, excludes, _includes) => {
30-
// _extensions -> [ '.ts', '.tsx', '.d.ts' ]
31-
// _includes -> [ '**/*' ]
32-
33-
const files = fs.readdirSync(rootDir);
34-
return files
35-
.filter(file => excludes.every(exclude => file !== exclude));
36-
},
37-
fileExists: path => fs.existsSync(path),
38-
readFile: (path: string) => fs.readFileSync(path, "utf-8"),
39-
};
40-
let rootConfig = parseJSON(fs.readFileSync(configFileName, "utf-8"));
41-
let parsed = ts.parseJsonConfigFileContent(rootConfig, host, baseDir);
42-
if (parsed.errors && parsed.errors.length !== 0) {
43-
throw new Error(parsed.errors.map(e => e.messageText).join("\n"));
44-
}
45-
24+
let parsed = readTsconfig(configFileName);
4625
if (parsed.options.newLine === ts.NewLineKind.CarriageReturnLineFeed) {
4726
formatSettings.newLineCharacter = "\r\n";
4827
} else if (parsed.options.newLine === ts.NewLineKind.LineFeed) {

lib/utils.ts

+16-48
Original file line numberDiff line numberDiff line change
@@ -39,57 +39,25 @@ export function getConfigFileName(baseDir: string, configFileName: string): stri
3939
}
4040

4141
export function readFilesFromTsconfig(configPath: string): string[] {
42+
return readTsconfig(configPath).fileNames;
43+
}
4244

43-
interface TsConfigJSON {
44-
files?: string[];
45-
include?: string[];
46-
exclude?: string[];
47-
}
48-
49-
let tsconfigDir = path.dirname(configPath);
50-
let tsconfig: TsConfigJSON = parseJSON(fs.readFileSync(configPath, "utf-8"));
51-
if (tsconfig.files && (tsconfig.include || tsconfig.exclude)) {
52-
return tsconfig.files.concat(tsMatchFiles(tsconfig.exclude || [], tsconfig.include || []));
53-
} else if (tsconfig.files) {
54-
let files: string[] = tsconfig.files;
55-
return files.map(filePath => path.resolve(tsconfigDir, filePath));
56-
} else if (tsconfig.include || tsconfig.exclude) {
57-
return tsMatchFiles(tsconfig.exclude || [], tsconfig.include || []);
58-
} else {
59-
return tsMatchFiles([], []);
45+
export function readTsconfig(configPath: string): ts.ParsedCommandLine {
46+
// for `extends` support. It supported from TypeScript 2.1.1.
47+
// `& { readFile(path: string): string; }` is backword compat for TypeScript compiler 2.0.3 support.
48+
const host: ts.ParseConfigHost & { readFile(path: string): string; } = {
49+
useCaseSensitiveFileNames: ts.sys.useCaseSensitiveFileNames,
50+
readDirectory: ts.sys.readDirectory,
51+
fileExists: path => fs.existsSync(path),
52+
readFile: (path: string) => fs.readFileSync(path, "utf-8"),
53+
};
54+
let rootConfig = parseJSON(fs.readFileSync(configPath, "utf-8"));
55+
let parsed = ts.parseJsonConfigFileContent(rootConfig, host, path.dirname(configPath));
56+
if (parsed.errors && parsed.errors.length !== 0) {
57+
throw new Error(parsed.errors.map(e => e.messageText).join("\n"));
6058
}
6159

62-
function tsMatchFiles(excludes: string[], includes: string[]) {
63-
interface TsMatchFiles {
64-
(path: string, extensions: string[], excludes: string[], includes: string[], useCaseSensitiveFileNames: boolean, currentDirectory: string, getFileSystemEntries: (path: string) => TsFileSystemEntries): string[];
65-
}
66-
interface TsFileSystemEntries {
67-
files: string[];
68-
directories: string[];
69-
}
70-
71-
let f: TsMatchFiles = (ts as any).matchFiles;
72-
if (!f) {
73-
throw new Error("ts.matchFiles is not exists. typescript@^2.0.0 required");
74-
}
75-
return f(tsconfigDir, [".ts", ".tsx"], excludes, includes, true, tsconfigDir, dirPath => {
76-
let stat = fs.statSync(dirPath);
77-
if (stat.isDirectory()) {
78-
let result: TsFileSystemEntries = { files: [], directories: [] };
79-
let dirEntries = fs.readdirSync(dirPath);
80-
dirEntries.forEach(entry => {
81-
let stat = fs.statSync(path.join(dirPath, entry));
82-
if (stat.isDirectory()) {
83-
result.directories.push(entry);
84-
} else if (stat.isFile()) {
85-
result.files.push(entry);
86-
}
87-
});
88-
return result;
89-
}
90-
return { files: [], directories: [] };
91-
});
92-
}
60+
return parsed;
9361
}
9462

9563
export function parseJSON(jsonText: string): any {

0 commit comments

Comments
 (0)