@tsslint/typescript-plugin 1.4.5 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.js +105 -12
- package/package.json +4 -4
package/index.js
CHANGED
|
@@ -8,28 +8,123 @@ const plugin = modules => {
|
|
|
8
8
|
const { typescript: ts } = modules;
|
|
9
9
|
const pluginModule = {
|
|
10
10
|
create(info) {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
if (
|
|
11
|
+
let decorator = languageServiceDecorators.get(info.project);
|
|
12
|
+
if (!decorator) {
|
|
13
|
+
if (info.project.projectKind === ts.server.ProjectKind.Configured) {
|
|
14
14
|
const tsconfig = info.project.getProjectName();
|
|
15
|
-
decorator = decorateLanguageService(ts, tsconfig, info);
|
|
16
|
-
languageServiceDecorators.set(info.project, decorator);
|
|
15
|
+
decorator = decorateLanguageService(ts, path.dirname(tsconfig), info);
|
|
17
16
|
}
|
|
18
|
-
|
|
17
|
+
else {
|
|
18
|
+
decorator = decorateLanguageService(ts, info.project.getCurrentDirectory(), info);
|
|
19
|
+
}
|
|
20
|
+
languageServiceDecorators.set(info.project, decorator);
|
|
19
21
|
}
|
|
22
|
+
decorator.update();
|
|
20
23
|
return info.languageService;
|
|
21
24
|
},
|
|
22
25
|
};
|
|
23
26
|
return pluginModule;
|
|
24
27
|
};
|
|
25
|
-
function decorateLanguageService(ts,
|
|
26
|
-
const { getSemanticDiagnostics, getCodeFixesAtPosition, getCombinedCodeFix, getApplicableRefactors, getEditsForRefactor, } = info.languageService;
|
|
28
|
+
function decorateLanguageService(ts, projectRoot, info) {
|
|
29
|
+
const { getSemanticDiagnostics, getCodeFixesAtPosition, getCombinedCodeFix, getApplicableRefactors, getEditsForRefactor, getFormattingEditsForDocument, getFormattingEditsForRange, } = info.languageService;
|
|
30
|
+
const getScriptSnapshot = info.languageServiceHost.getScriptSnapshot.bind(info.languageServiceHost);
|
|
31
|
+
const getScriptVersion = info.languageServiceHost.getScriptVersion.bind(info.languageServiceHost);
|
|
27
32
|
const projectFileNameKeys = new Set();
|
|
28
33
|
let configFile;
|
|
29
34
|
let configFileBuildContext;
|
|
30
35
|
let configFileDiagnostics = [];
|
|
31
36
|
let config;
|
|
32
37
|
let linter;
|
|
38
|
+
let formattingSnapshot;
|
|
39
|
+
let formattingSnapshotVersion = 0;
|
|
40
|
+
info.languageServiceHost.getScriptSnapshot = fileName => {
|
|
41
|
+
if (formattingSnapshot) {
|
|
42
|
+
return formattingSnapshot;
|
|
43
|
+
}
|
|
44
|
+
return getScriptSnapshot(fileName);
|
|
45
|
+
};
|
|
46
|
+
info.languageServiceHost.getScriptVersion = fileName => {
|
|
47
|
+
if (formattingSnapshot) {
|
|
48
|
+
return `tsslint-fmt-${formattingSnapshotVersion++}`;
|
|
49
|
+
}
|
|
50
|
+
return getScriptVersion(fileName);
|
|
51
|
+
};
|
|
52
|
+
info.languageService.getFormattingEditsForDocument = (fileName, options) => {
|
|
53
|
+
if (linter) {
|
|
54
|
+
try {
|
|
55
|
+
const sourceFile = info.languageService.getNonBoundSourceFile(fileName);
|
|
56
|
+
const linterEdits = linter.format(sourceFile);
|
|
57
|
+
if (linterEdits.length) {
|
|
58
|
+
const originalLength = sourceFile.text.length;
|
|
59
|
+
let text = sourceFile.text;
|
|
60
|
+
for (const edit of linterEdits.sort((a, b) => (b.span.start + b.span.length) - (a.span.start + a.span.length))) {
|
|
61
|
+
text = text.slice(0, edit.span.start) + edit.newText + text.slice(edit.span.start + edit.span.length);
|
|
62
|
+
}
|
|
63
|
+
formattingSnapshot = ts.ScriptSnapshot.fromString(text);
|
|
64
|
+
const serviceEdits = getFormattingEditsForDocument(fileName, options);
|
|
65
|
+
formattingSnapshot = undefined;
|
|
66
|
+
if (serviceEdits.length) {
|
|
67
|
+
for (const edit of serviceEdits.sort((a, b) => (b.span.start + b.span.length) - (a.span.start + a.span.length))) {
|
|
68
|
+
text = text.slice(0, edit.span.start) + edit.newText + text.slice(edit.span.start + edit.span.length);
|
|
69
|
+
}
|
|
70
|
+
return [{
|
|
71
|
+
span: { start: 0, length: originalLength },
|
|
72
|
+
newText: text,
|
|
73
|
+
}];
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
return linterEdits;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
debugger;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return getFormattingEditsForDocument(fileName, options);
|
|
85
|
+
};
|
|
86
|
+
info.languageService.getFormattingEditsForRange = (fileName, start, end, options) => {
|
|
87
|
+
if (linter) {
|
|
88
|
+
try {
|
|
89
|
+
const sourceFile = info.languageService.getNonBoundSourceFile(fileName);
|
|
90
|
+
const linterEdits = linter.format(sourceFile);
|
|
91
|
+
if (linterEdits.length) {
|
|
92
|
+
const originalLength = sourceFile.text.length;
|
|
93
|
+
let text = sourceFile.text;
|
|
94
|
+
let formattingStart = start;
|
|
95
|
+
let formattingEnd = end;
|
|
96
|
+
for (const edit of linterEdits.sort((a, b) => (b.span.start + b.span.length) - (a.span.start + a.span.length))) {
|
|
97
|
+
text = text.slice(0, edit.span.start) + edit.newText + text.slice(edit.span.start + edit.span.length);
|
|
98
|
+
if (edit.span.start < start) {
|
|
99
|
+
formattingStart += edit.newText.length - edit.span.length;
|
|
100
|
+
}
|
|
101
|
+
if (edit.span.start + edit.span.length < end) {
|
|
102
|
+
formattingEnd += edit.newText.length - edit.span.length;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
formattingSnapshot = ts.ScriptSnapshot.fromString(text);
|
|
106
|
+
const serviceEdits = getFormattingEditsForRange(fileName, formattingStart, formattingEnd, options);
|
|
107
|
+
formattingSnapshot = undefined;
|
|
108
|
+
if (serviceEdits.length) {
|
|
109
|
+
for (const edit of serviceEdits.sort((a, b) => (b.span.start + b.span.length) - (a.span.start + a.span.length))) {
|
|
110
|
+
text = text.slice(0, edit.span.start) + edit.newText + text.slice(edit.span.start + edit.span.length);
|
|
111
|
+
}
|
|
112
|
+
return [{
|
|
113
|
+
span: { start: 0, length: originalLength },
|
|
114
|
+
newText: text,
|
|
115
|
+
}];
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
return linterEdits;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
debugger;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return getFormattingEditsForRange(fileName, start, end, options);
|
|
127
|
+
};
|
|
33
128
|
info.languageService.getSemanticDiagnostics = fileName => {
|
|
34
129
|
let result = getSemanticDiagnostics(fileName);
|
|
35
130
|
if (!isProjectFileName(fileName)) {
|
|
@@ -107,7 +202,7 @@ function decorateLanguageService(ts, tsconfig, info) {
|
|
|
107
202
|
return info.languageServiceHost.useCaseSensitiveFileNames?.() ? fileName : fileName.toLowerCase();
|
|
108
203
|
}
|
|
109
204
|
async function update() {
|
|
110
|
-
const newConfigFile = ts.findConfigFile(
|
|
205
|
+
const newConfigFile = ts.findConfigFile(projectRoot, ts.sys.fileExists, 'tsslint.config.ts');
|
|
111
206
|
if (newConfigFile !== configFile) {
|
|
112
207
|
configFile = newConfigFile;
|
|
113
208
|
config = undefined;
|
|
@@ -118,11 +213,9 @@ function decorateLanguageService(ts, tsconfig, info) {
|
|
|
118
213
|
return;
|
|
119
214
|
}
|
|
120
215
|
const projectContext = {
|
|
121
|
-
configFile,
|
|
122
216
|
languageServiceHost: info.languageServiceHost,
|
|
123
217
|
languageService: info.languageService,
|
|
124
218
|
typescript: ts,
|
|
125
|
-
tsconfig: ts.server.toNormalizedPath(tsconfig),
|
|
126
219
|
};
|
|
127
220
|
try {
|
|
128
221
|
configFileBuildContext = await core.watchConfig(configFile, async (builtConfig, { errors, warnings }) => {
|
|
@@ -163,7 +256,7 @@ function decorateLanguageService(ts, tsconfig, info) {
|
|
|
163
256
|
initSourceMapSupport();
|
|
164
257
|
const mtime = ts.sys.getModifiedTime?.(builtConfig)?.getTime() ?? Date.now();
|
|
165
258
|
config = (await import(url.pathToFileURL(builtConfig).toString() + '?tsslint_time=' + mtime)).default;
|
|
166
|
-
linter = core.createLinter(projectContext, config, 'typescript-plugin');
|
|
259
|
+
linter = core.createLinter(projectContext, path.dirname(configFile), config, 'typescript-plugin');
|
|
167
260
|
}
|
|
168
261
|
catch (err) {
|
|
169
262
|
config = undefined;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tsslint/typescript-plugin",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.5.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"files": [
|
|
6
6
|
"**/*.js",
|
|
@@ -12,11 +12,11 @@
|
|
|
12
12
|
"directory": "packages/typescript-plugin"
|
|
13
13
|
},
|
|
14
14
|
"dependencies": {
|
|
15
|
-
"@tsslint/core": "1.
|
|
15
|
+
"@tsslint/core": "1.5.0",
|
|
16
16
|
"source-map-support": "^0.5.21"
|
|
17
17
|
},
|
|
18
18
|
"devDependencies": {
|
|
19
|
-
"@tsslint/config": "1.
|
|
19
|
+
"@tsslint/config": "1.5.0"
|
|
20
20
|
},
|
|
21
|
-
"gitHead": "
|
|
21
|
+
"gitHead": "6585740b4ecbc8251163923b4e8c7978fe9cb12c"
|
|
22
22
|
}
|