@volar/language-core 1.0.13 → 1.0.16

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.
@@ -1,7 +1,7 @@
1
1
  import { Mapping, SourceMapBase } from '@volar/source-map';
2
2
  import { Teleport } from './sourceMaps';
3
3
  import type { EmbeddedFile, LanguageModule, SourceFile } from './types';
4
- export declare function forEachEmbeddeds(input: EmbeddedFile[], cb: (embedded: EmbeddedFile) => void): void;
4
+ export declare function forEachEmbeddeds(file: EmbeddedFile, cb: (embedded: EmbeddedFile) => void): void;
5
5
  export type DocumentRegistry = ReturnType<typeof createDocumentRegistry>;
6
6
  export declare function createDocumentRegistry(): {
7
7
  get: (fileName: string) => [SourceFile, LanguageModule] | undefined;
@@ -15,7 +15,7 @@ export declare function createDocumentRegistry(): {
15
15
  sourceFile: SourceFile;
16
16
  embedded: EmbeddedFile;
17
17
  }, void, unknown>;
18
- fromEmbeddedLocation: (fileName: string, offset: number) => Generator<{
18
+ fromEmbeddedLocation: (fileName: string, offset: number, baseOnRight?: boolean) => Generator<{
19
19
  fileName: string;
20
20
  offset: number;
21
21
  mapping: Mapping<any>;
@@ -3,12 +3,10 @@ exports.createDocumentRegistry = exports.forEachEmbeddeds = void 0;
3
3
  const source_map_1 = require("@volar/source-map");
4
4
  const reactivity_1 = require("@vue/reactivity");
5
5
  const sourceMaps_1 = require("./sourceMaps");
6
- function forEachEmbeddeds(input, cb) {
7
- for (const child of input) {
8
- if (child) {
9
- cb(child);
10
- }
11
- forEachEmbeddeds(child.embeddeds, cb);
6
+ function forEachEmbeddeds(file, cb) {
7
+ cb(file);
8
+ for (const child of file.embeddeds) {
9
+ forEachEmbeddeds(child, cb);
12
10
  }
13
11
  }
14
12
  exports.forEachEmbeddeds = forEachEmbeddeds;
@@ -19,7 +17,7 @@ function createDocumentRegistry() {
19
17
  const embeddedDocumentsMap = (0, reactivity_1.computed)(() => {
20
18
  const map = new WeakMap();
21
19
  for (const [sourceFile] of all.value) {
22
- forEachEmbeddeds(sourceFile.embeddeds, embedded => {
20
+ forEachEmbeddeds(sourceFile, embedded => {
23
21
  map.set(embedded, sourceFile);
24
22
  });
25
23
  }
@@ -28,7 +26,7 @@ function createDocumentRegistry() {
28
26
  const sourceMapsByFileName = (0, reactivity_1.computed)(() => {
29
27
  const map = new Map();
30
28
  for (const [sourceFile] of all.value) {
31
- forEachEmbeddeds(sourceFile.embeddeds, embedded => {
29
+ forEachEmbeddeds(sourceFile, embedded => {
32
30
  map.set(normalizePath(embedded.fileName), { sourceFile, embedded });
33
31
  });
34
32
  }
@@ -38,7 +36,7 @@ function createDocumentRegistry() {
38
36
  const map = new Map();
39
37
  for (const key in files) {
40
38
  const [sourceFile] = files[key];
41
- forEachEmbeddeds(sourceFile.embeddeds, embedded => {
39
+ forEachEmbeddeds(sourceFile, embedded => {
42
40
  if (embedded.teleportMappings) {
43
41
  map.set(normalizePath(embedded.fileName), getTeleport(sourceFile, embedded.teleportMappings));
44
42
  }
@@ -61,14 +59,14 @@ function createDocumentRegistry() {
61
59
  yield sourceMap[1];
62
60
  }
63
61
  },
64
- fromEmbeddedLocation: function* (fileName, offset) {
62
+ fromEmbeddedLocation: function* (fileName, offset, baseOnRight = false) {
65
63
  if (fileName.endsWith('/__VLS_types.ts')) { // TODO: monkey fix
66
64
  return;
67
65
  }
68
66
  const mapped = sourceMapsByFileName.value.get(normalizePath(fileName));
69
67
  if (mapped) {
70
68
  const sourceMap = getSourceMap(mapped.sourceFile, mapped.embedded.mappings);
71
- for (const vueRange of sourceMap.toSourceOffsets(offset)) {
69
+ for (const vueRange of sourceMap.toSourceOffsets(offset, baseOnRight)) {
72
70
  yield {
73
71
  fileName: mapped.sourceFile.fileName,
74
72
  offset: vueRange[0],
@@ -15,7 +15,7 @@ export declare function createEmbeddedLanguageServiceHost(host: LanguageServiceH
15
15
  sourceFile: SourceFile;
16
16
  embedded: import("./types").EmbeddedFile;
17
17
  }, void, unknown>;
18
- fromEmbeddedLocation: (fileName: string, offset: number) => Generator<{
18
+ fromEmbeddedLocation: (fileName: string, offset: number, baseOnRight?: boolean) => Generator<{
19
19
  fileName: string;
20
20
  offset: number;
21
21
  mapping: import("@volar/source-map").Mapping<any>;
@@ -21,16 +21,17 @@ function createEmbeddedLanguageServiceHost(host, languageModules) {
21
21
  let tsProjectVersion = 0;
22
22
  const documentRegistry = (0, documentRegistry_1.createDocumentRegistry)();
23
23
  const ts = host.getTypeScriptModule();
24
- const tsFileVersions = new Map();
25
24
  const scriptSnapshots = new Map();
26
- const fileVersions = new Map();
25
+ const sourceTsFileVersions = new Map();
26
+ const sourceVueFileVersions = new Map();
27
+ const virtualFileVersions = new Map();
27
28
  const _tsHost = {
28
29
  fileExists: host.fileExists
29
30
  ? fileName => {
30
31
  var _a;
31
32
  // .vue.js -> .vue
32
33
  // .vue.ts -> .vue
33
- // .vue.d.ts (never)
34
+ // .vue.d.ts -> [ignored]
34
35
  const vueFileName = fileName.substring(0, fileName.lastIndexOf('.'));
35
36
  if (!documentRegistry.get(vueFileName)) {
36
37
  // create virtual files
@@ -104,82 +105,80 @@ function createEmbeddedLanguageServiceHost(host, languageModules) {
104
105
  function update() {
105
106
  var _a;
106
107
  const newProjectVersion = (_a = host.getProjectVersion) === null || _a === void 0 ? void 0 : _a.call(host);
107
- const sholdUpdate = newProjectVersion === undefined || newProjectVersion !== lastProjectVersion;
108
+ const shouldUpdate = newProjectVersion === undefined || newProjectVersion !== lastProjectVersion;
108
109
  lastProjectVersion = newProjectVersion;
109
- if (!sholdUpdate)
110
+ if (!shouldUpdate)
110
111
  return;
111
112
  let tsFileUpdated = false;
112
- const remainFileNames = new Set(host.getScriptFileNames());
113
- const sourceFilesToUpdate = [];
113
+ const checkRemains = new Set(host.getScriptFileNames());
114
+ const sourceFilesShouldUpdate = [];
114
115
  // .vue
115
116
  for (const [sourceFile, languageModule] of documentRegistry.getAll()) {
116
- remainFileNames.delete(sourceFile.fileName);
117
+ checkRemains.delete(sourceFile.fileName);
118
+ const snapshot = host.getScriptSnapshot(sourceFile.fileName);
119
+ if (!snapshot) {
120
+ // delete
121
+ documentRegistry.delete(sourceFile.fileName);
122
+ tsFileUpdated = true;
123
+ continue;
124
+ }
117
125
  const newVersion = host.getScriptVersion(sourceFile.fileName);
118
- if (fileVersions.get(sourceFile.fileName) !== newVersion) {
119
- fileVersions.set(sourceFile.fileName, newVersion);
120
- const snapshot = host.getScriptSnapshot(sourceFile.fileName);
121
- if (snapshot) {
122
- // update
123
- sourceFilesToUpdate.push([sourceFile, languageModule, snapshot]);
124
- }
125
- else {
126
- // delete
127
- if (documentRegistry.delete(sourceFile.fileName)) {
128
- tsFileUpdated = true;
129
- }
130
- }
126
+ if (sourceVueFileVersions.get(sourceFile.fileName) !== newVersion) {
127
+ // update
128
+ sourceVueFileVersions.set(sourceFile.fileName, newVersion);
129
+ sourceFilesShouldUpdate.push([sourceFile, languageModule, snapshot]);
131
130
  }
132
131
  }
133
132
  // no any vue file version change, it mean project version was update by ts file change at this time
134
- if (!sourceFilesToUpdate.length) {
133
+ if (!sourceFilesShouldUpdate.length) {
135
134
  tsFileUpdated = true;
136
135
  }
137
136
  // add
138
- for (const fileName of [...remainFileNames]) {
137
+ for (const fileName of [...checkRemains]) {
139
138
  const snapshot = host.getScriptSnapshot(fileName);
140
139
  if (snapshot) {
141
140
  for (const languageModule of languageModules) {
142
141
  const sourceFile = languageModule.createSourceFile(fileName, snapshot);
143
142
  if (sourceFile) {
144
- fileVersions.set(sourceFile.fileName, host.getScriptVersion(fileName));
143
+ sourceVueFileVersions.set(sourceFile.fileName, host.getScriptVersion(fileName));
145
144
  documentRegistry.set(fileName, (0, reactivity_1.shallowReactive)(sourceFile), languageModule);
146
- remainFileNames.delete(fileName);
145
+ checkRemains.delete(fileName);
147
146
  break;
148
147
  }
149
148
  }
150
149
  }
151
150
  }
152
151
  // .ts / .js / .d.ts / .json ...
153
- for (const [oldTsFileName, oldTsFileVersion] of [...tsFileVersions]) {
152
+ for (const [oldTsFileName, oldTsFileVersion] of [...sourceTsFileVersions]) {
154
153
  const newVersion = host.getScriptVersion(oldTsFileName);
155
154
  if (oldTsFileVersion !== newVersion) {
156
- if (!remainFileNames.has(oldTsFileName) && !host.getScriptSnapshot(oldTsFileName)) {
155
+ if (!checkRemains.has(oldTsFileName) && !host.getScriptSnapshot(oldTsFileName)) {
157
156
  // delete
158
- tsFileVersions.delete(oldTsFileName);
157
+ sourceTsFileVersions.delete(oldTsFileName);
159
158
  }
160
159
  else {
161
160
  // update
162
- tsFileVersions.set(oldTsFileName, newVersion);
161
+ sourceTsFileVersions.set(oldTsFileName, newVersion);
163
162
  }
164
163
  tsFileUpdated = true;
165
164
  }
166
165
  }
167
- for (const nowFileName of remainFileNames) {
168
- if (!tsFileVersions.has(nowFileName)) {
166
+ for (const nowFileName of checkRemains) {
167
+ if (!sourceTsFileVersions.has(nowFileName)) {
169
168
  // add
170
169
  const newVersion = host.getScriptVersion(nowFileName);
171
- tsFileVersions.set(nowFileName, newVersion);
170
+ sourceTsFileVersions.set(nowFileName, newVersion);
172
171
  tsFileUpdated = true;
173
172
  }
174
173
  }
175
- for (const [sourceFile, languageModule, snapshot] of sourceFilesToUpdate) {
176
- (0, documentRegistry_1.forEachEmbeddeds)(sourceFile.embeddeds, embedded => {
177
- fileVersions.delete(embedded.fileName);
174
+ for (const [sourceFile, languageModule, snapshot] of sourceFilesShouldUpdate) {
175
+ (0, documentRegistry_1.forEachEmbeddeds)(sourceFile, embedded => {
176
+ virtualFileVersions.delete(embedded.fileName);
178
177
  });
179
178
  const oldScripts = {};
180
179
  const newScripts = {};
181
180
  if (!tsFileUpdated) {
182
- (0, documentRegistry_1.forEachEmbeddeds)(sourceFile.embeddeds, embedded => {
181
+ (0, documentRegistry_1.forEachEmbeddeds)(sourceFile, embedded => {
183
182
  if (embedded.kind) {
184
183
  oldScripts[embedded.fileName] = embedded.text;
185
184
  }
@@ -188,7 +187,7 @@ function createEmbeddedLanguageServiceHost(host, languageModules) {
188
187
  languageModule.updateSourceFile(sourceFile, snapshot);
189
188
  documentRegistry.onSourceFileUpdated(sourceFile);
190
189
  if (!tsFileUpdated) {
191
- (0, documentRegistry_1.forEachEmbeddeds)(sourceFile.embeddeds, embedded => {
190
+ (0, documentRegistry_1.forEachEmbeddeds)(sourceFile, embedded => {
192
191
  if (embedded.kind) {
193
192
  newScripts[embedded.fileName] = embedded.text;
194
193
  }
@@ -212,10 +211,7 @@ function createEmbeddedLanguageServiceHost(host, languageModules) {
212
211
  }
213
212
  }
214
213
  for (const fileName of host.getScriptFileNames()) {
215
- if (host.isTsPlugin) {
216
- tsFileNames.add(fileName); // .vue + .ts
217
- }
218
- else if (!documentRegistry.has(fileName)) {
214
+ if (!documentRegistry.has(fileName)) {
219
215
  tsFileNames.add(fileName); // .ts
220
216
  }
221
217
  }
@@ -225,8 +221,8 @@ function createEmbeddedLanguageServiceHost(host, languageModules) {
225
221
  var _a, _b, _c;
226
222
  let mapped = documentRegistry.fromEmbeddedFileName(fileName);
227
223
  if (mapped) {
228
- if (fileVersions.has(mapped.embedded.fileName)) {
229
- return fileVersions.get(mapped.embedded.fileName);
224
+ if (virtualFileVersions.has(mapped.embedded.fileName)) {
225
+ return virtualFileVersions.get(mapped.embedded.fileName);
230
226
  }
231
227
  else {
232
228
  let version = (_c = (_b = (_a = ts.sys) === null || _a === void 0 ? void 0 : _a.createHash) === null || _b === void 0 ? void 0 : _b.call(_a, mapped.embedded.text)) !== null && _c !== void 0 ? _c : mapped.embedded.text;
@@ -234,7 +230,7 @@ function createEmbeddedLanguageServiceHost(host, languageModules) {
234
230
  // fix https://github.com/johnsoncodehk/volar/issues/1082
235
231
  version = host.getScriptVersion(mapped.sourceFile.fileName) + ':' + version;
236
232
  }
237
- fileVersions.set(mapped.embedded.fileName, version);
233
+ virtualFileVersions.set(mapped.embedded.fileName, version);
238
234
  return version;
239
235
  }
240
236
  }
package/out/types.d.ts CHANGED
@@ -40,10 +40,7 @@ export interface TextRange {
40
40
  start: number;
41
41
  end: number;
42
42
  }
43
- export interface SourceFile {
44
- fileName: string;
45
- text: string;
46
- embeddeds: EmbeddedFile[];
43
+ export interface SourceFile extends EmbeddedFile {
47
44
  }
48
45
  export declare enum EmbeddedFileKind {
49
46
  TextFile = 0,
@@ -65,6 +62,5 @@ export interface LanguageModule<T extends SourceFile = SourceFile> {
65
62
  }
66
63
  export type LanguageServiceHost = ts.LanguageServiceHost & {
67
64
  getTypeScriptModule(): typeof import('typescript/lib/tsserverlibrary');
68
- isTsPlugin?: boolean;
69
65
  isTsc?: boolean;
70
66
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@volar/language-core",
3
- "version": "1.0.13",
3
+ "version": "1.0.16",
4
4
  "main": "out/index.js",
5
5
  "license": "MIT",
6
6
  "files": [
@@ -13,9 +13,9 @@
13
13
  "directory": "packages/language-core"
14
14
  },
15
15
  "dependencies": {
16
- "@volar/source-map": "1.0.13",
16
+ "@volar/source-map": "1.0.16",
17
17
  "@vue/reactivity": "^3.2.45",
18
18
  "muggle-string": "^0.1.0"
19
19
  },
20
- "gitHead": "cba2eba187b2d82e1d45dd86b3edeab0ca7caad6"
20
+ "gitHead": "af476047d8859652254ed36f8aee184f1972a97a"
21
21
  }