Skip to content

Commit 225c69d

Browse files
committed
Remove more usage of typescript
1 parent 8c4bd2d commit 225c69d

File tree

3 files changed

+88
-52
lines changed

3 files changed

+88
-52
lines changed

src/IncrementalChecker.ts

Lines changed: 3 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -10,42 +10,7 @@ import { NormalizedMessage } from './NormalizedMessage';
1010
import { CancellationToken } from './CancellationToken';
1111
import * as minimatch from 'minimatch';
1212
import { VueProgram } from './VueProgram';
13-
14-
interface TypeScriptInstance {
15-
parseJsonConfigFileContent(
16-
json: any,
17-
host: ts.ParseConfigHost,
18-
basePath: string,
19-
existingOptions?: ts.CompilerOptions,
20-
configFileName?: string,
21-
resolutionStack?: ts.Path[],
22-
extraFileExtensions?: ReadonlyArray<ts.FileExtensionInfo>
23-
): ts.ParsedCommandLine;
24-
readConfigFile(
25-
fileName: string,
26-
readFile: (path: string) => string | undefined
27-
): {
28-
config?: any;
29-
error?: ts.Diagnostic;
30-
};
31-
createCompilerHost(
32-
options: ts.CompilerOptions,
33-
setParentNodes?: boolean
34-
): ts.CompilerHost;
35-
createProgram(
36-
rootNames: ReadonlyArray<string>,
37-
options: ts.CompilerOptions,
38-
host?: ts.CompilerHost,
39-
oldProgram?: ts.Program,
40-
configFileParsingDiagnostics?: ReadonlyArray<ts.Diagnostic>
41-
): ts.Program;
42-
flattenDiagnosticMessageText(
43-
messageText: string | ts.DiagnosticMessageChain | undefined,
44-
newLine: string
45-
): string;
46-
47-
sys: ts.System;
48-
}
13+
import { TypeScriptInstance } from './TypeScriptInstance';
4914

5015
// Need some augmentation here - linterOptions.exclude is not (yet) part of the official
5116
// types for tslint.
@@ -246,11 +211,13 @@ export class IncrementalChecker {
246211
this.programConfig =
247212
this.programConfig ||
248213
VueProgram.loadProgramConfig(
214+
this.typescript,
249215
this.programConfigFile,
250216
this.compilerOptions
251217
);
252218

253219
return VueProgram.createProgram(
220+
this.typescript,
254221
this.programConfig,
255222
path.dirname(this.programConfigFile),
256223
this.files,

src/TypeScriptInstance.ts

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
import * as ts from 'typescript';
2+
3+
// TODO: keep in sync with TypeScript
4+
export enum ScriptKind {
5+
Unknown = 0,
6+
JS = 1,
7+
JSX = 2,
8+
TS = 3,
9+
TSX = 4,
10+
External = 5,
11+
JSON = 6,
12+
/**
13+
* Used on extensions that doesn't define the ScriptKind but the content defines it.
14+
* Deferred extensions are going to be included in all project contexts.
15+
*/
16+
Deferred = 7
17+
}
18+
19+
export interface TypeScriptInstance {
20+
parseJsonConfigFileContent(
21+
json: any,
22+
host: ts.ParseConfigHost,
23+
basePath: string,
24+
existingOptions?: ts.CompilerOptions,
25+
configFileName?: string,
26+
resolutionStack?: ts.Path[],
27+
extraFileExtensions?: ReadonlyArray<ts.FileExtensionInfo>
28+
): ts.ParsedCommandLine;
29+
readConfigFile(
30+
fileName: string,
31+
readFile: (path: string) => string | undefined
32+
): {
33+
config?: any;
34+
error?: ts.Diagnostic;
35+
};
36+
createCompilerHost(
37+
options: ts.CompilerOptions,
38+
setParentNodes?: boolean
39+
): ts.CompilerHost;
40+
createProgram(
41+
rootNames: ReadonlyArray<string>,
42+
options: ts.CompilerOptions,
43+
host?: ts.CompilerHost,
44+
oldProgram?: ts.Program,
45+
configFileParsingDiagnostics?: ReadonlyArray<ts.Diagnostic>
46+
): ts.Program;
47+
flattenDiagnosticMessageText(
48+
messageText: string | ts.DiagnosticMessageChain | undefined,
49+
newLine: string
50+
): string;
51+
resolveModuleName(
52+
moduleName: string,
53+
containingFile: string,
54+
compilerOptions: ts.CompilerOptions,
55+
host: ts.ModuleResolutionHost,
56+
cache?: ts.ModuleResolutionCache
57+
): ts.ResolvedModuleWithFailedLookupLocations;
58+
createSourceFile(
59+
fileName: string,
60+
sourceText: string,
61+
languageVersion: ts.ScriptTarget,
62+
setParentNodes?: boolean,
63+
scriptKind?: ts.ScriptKind
64+
): ts.SourceFile;
65+
66+
sys: ts.System;
67+
}

src/VueProgram.ts

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import * as path from 'path';
33
import * as ts from 'typescript';
44
import { FilesRegister } from './FilesRegister';
55
import { FilesWatcher } from './FilesWatcher';
6+
import { ScriptKind, TypeScriptInstance } from './TypeScriptInstance';
67
// tslint:disable-next-line
78
import * as vueCompiler from 'vue-template-compiler';
89

@@ -12,15 +13,15 @@ interface ResolvedScript {
1213
}
1314

1415
export class VueProgram {
15-
static loadProgramConfig(configFile: string, compilerOptions: object) {
16+
static loadProgramConfig(typescript: TypeScriptInstance, configFile: string, compilerOptions: object) {
1617
const extraExtensions = ['vue'];
1718

1819
const parseConfigHost: ts.ParseConfigHost = {
19-
fileExists: ts.sys.fileExists,
20-
readFile: ts.sys.readFile,
21-
useCaseSensitiveFileNames: ts.sys.useCaseSensitiveFileNames,
20+
fileExists: typescript.sys.fileExists,
21+
readFile: typescript.sys.readFile,
22+
useCaseSensitiveFileNames: typescript.sys.useCaseSensitiveFileNames,
2223
readDirectory: (rootDir, extensions, excludes, includes, depth) => {
23-
return ts.sys.readDirectory(
24+
return typescript.sys.readDirectory(
2425
rootDir,
2526
extensions.concat(extraExtensions),
2627
excludes,
@@ -30,15 +31,15 @@ export class VueProgram {
3031
}
3132
};
3233

33-
const tsconfig = ts.readConfigFile(configFile, ts.sys.readFile).config;
34+
const tsconfig = typescript.readConfigFile(configFile, typescript.sys.readFile).config;
3435

3536
tsconfig.compilerOptions = tsconfig.compilerOptions || {};
3637
tsconfig.compilerOptions = {
3738
...tsconfig.compilerOptions,
3839
...compilerOptions
3940
};
4041

41-
const parsed = ts.parseJsonConfigFileContent(
42+
const parsed = typescript.parseJsonConfigFileContent(
4243
tsconfig,
4344
parseConfigHost,
4445
path.dirname(configFile)
@@ -107,13 +108,14 @@ export class VueProgram {
107108
}
108109

109110
static createProgram(
111+
typescript: TypeScriptInstance,
110112
programConfig: ts.ParsedCommandLine,
111113
basedir: string,
112114
files: FilesRegister,
113115
watcher: FilesWatcher,
114116
oldProgram: ts.Program
115117
) {
116-
const host = ts.createCompilerHost(programConfig.options);
118+
const host = typescript.createCompilerHost(programConfig.options);
117119
const realGetSourceFile = host.getSourceFile;
118120

119121
// We need a host that can parse Vue SFCs (single file components).
@@ -142,7 +144,7 @@ export class VueProgram {
142144
// get typescript contents from Vue file
143145
if (source && VueProgram.isVue(filePath)) {
144146
const resolved = VueProgram.resolveScriptBlock(source.text);
145-
source = ts.createSourceFile(
147+
source = typescript.createSourceFile(
146148
filePath,
147149
resolved.content,
148150
languageVersion,
@@ -160,7 +162,7 @@ export class VueProgram {
160162

161163
for (const moduleName of moduleNames) {
162164
// Try to use standard resolution.
163-
const { resolvedModule } = ts.resolveModuleName(
165+
const { resolvedModule } = typescript.resolveModuleName(
164166
moduleName,
165167
containingFile,
166168
programConfig.options,
@@ -226,7 +228,7 @@ export class VueProgram {
226228
return resolvedModules;
227229
};
228230

229-
return ts.createProgram(
231+
return typescript.createProgram(
230232
programConfig.fileNames,
231233
programConfig.options,
232234
host,
@@ -236,14 +238,14 @@ export class VueProgram {
236238

237239
private static getScriptKindByLang(lang: string) {
238240
if (lang === 'ts') {
239-
return ts.ScriptKind.TS;
241+
return ScriptKind.TS;
240242
} else if (lang === 'tsx') {
241-
return ts.ScriptKind.TSX;
243+
return ScriptKind.TSX;
242244
} else if (lang === 'jsx') {
243-
return ts.ScriptKind.JSX;
245+
return ScriptKind.JSX;
244246
} else {
245247
// when lang is "js" or no lang specified
246-
return ts.ScriptKind.JS;
248+
return ScriptKind.JS;
247249
}
248250
}
249251

@@ -269,7 +271,7 @@ export class VueProgram {
269271
// No <script> block
270272
if (!script) {
271273
return {
272-
scriptKind: ts.ScriptKind.JS,
274+
scriptKind: ScriptKind.JS,
273275
content: '/* tslint:disable */\nexport default {};\n'
274276
};
275277
}

0 commit comments

Comments
 (0)