@tsslint/typescript-plugin 1.4.6 → 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.
Files changed (2) hide show
  1. package/index.js +105 -12
  2. 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
- if (info.project.projectKind === ts.server.ProjectKind.Configured) {
12
- let decorator = languageServiceDecorators.get(info.project);
13
- if (!decorator) {
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
- decorator.update();
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, tsconfig, info) {
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(path.dirname(tsconfig), ts.sys.fileExists, 'tsslint.config.ts');
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.4.6",
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.4.6",
15
+ "@tsslint/core": "1.5.0",
16
16
  "source-map-support": "^0.5.21"
17
17
  },
18
18
  "devDependencies": {
19
- "@tsslint/config": "1.4.6"
19
+ "@tsslint/config": "1.5.0"
20
20
  },
21
- "gitHead": "9c5bc3471bb1c737144f90a1a70470975088e7fc"
21
+ "gitHead": "6585740b4ecbc8251163923b4e8c7978fe9cb12c"
22
22
  }