@volar/language-core 1.0.21 → 1.0.24

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/out/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export * from './documentRegistry';
1
+ export * from './virtualFiles';
2
2
  export * from './languageContext';
3
3
  export * from './sourceMaps';
4
4
  export * from './types';
package/out/index.js CHANGED
@@ -13,7 +13,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
13
13
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
14
14
  };
15
15
  Object.defineProperty(exports, "__esModule", { value: true });
16
- __exportStar(require("./documentRegistry"), exports);
16
+ __exportStar(require("./virtualFiles"), exports);
17
17
  __exportStar(require("./languageContext"), exports);
18
18
  __exportStar(require("./sourceMaps"), exports);
19
19
  __exportStar(require("./types"), exports);
@@ -6,13 +6,14 @@ export declare function createLanguageContext(host: LanguageServiceHost, languag
6
6
  languageServiceHost: ts.LanguageServiceHost;
7
7
  };
8
8
  virtualFiles: {
9
- all: Map<string, [string, ts.IScriptSnapshot, import("./types").VirtualFile, LanguageModule<import("./types").VirtualFile>]>;
10
- update(fileName: string, snapshot: ts.IScriptSnapshot): import("./types").VirtualFile | undefined;
11
- delete(fileName: string): void;
12
- get(fileName: string): readonly [ts.IScriptSnapshot, import("./types").VirtualFile] | undefined;
13
- hasSourceFile: (fileName: string) => boolean;
9
+ allSources(): import("./virtualFiles").Source[];
10
+ updateSource(fileName: string, snapshot: ts.IScriptSnapshot): import("./types").VirtualFile | undefined;
11
+ deleteSource(fileName: string): void;
12
+ getSource(fileName: string): import("./virtualFiles").Source | undefined;
13
+ hasSource: (fileName: string) => boolean;
14
14
  getMirrorMap: (file: import("./types").VirtualFile) => import("./sourceMaps").MirrorMap | undefined;
15
15
  getMaps: (virtualFile: import("./types").VirtualFile) => [string, import("@volar/source-map").SourceMap<import("./types").FileRangeCapabilities>][];
16
- getSourceByVirtualFileName(fileName: string): readonly [string, ts.IScriptSnapshot, import("./types").VirtualFile] | undefined;
16
+ hasVirtualFile(fileName: string): boolean;
17
+ getVirtualFile(fileName: string): readonly [import("./types").VirtualFile, import("./virtualFiles").Source] | readonly [undefined, undefined];
17
18
  };
18
19
  };
@@ -1,7 +1,7 @@
1
1
  Object.defineProperty(exports, "__esModule", { value: true });
2
2
  exports.createLanguageContext = void 0;
3
3
  const path_1 = require("path");
4
- const documentRegistry_1 = require("./documentRegistry");
4
+ const virtualFiles_1 = require("./virtualFiles");
5
5
  const types_1 = require("./types");
6
6
  function createLanguageContext(host, languageModules) {
7
7
  for (const languageModule of languageModules.reverse()) {
@@ -19,7 +19,7 @@ function createLanguageContext(host, languageModules) {
19
19
  }
20
20
  let lastProjectVersion;
21
21
  let tsProjectVersion = 0;
22
- const virtualFiles = (0, documentRegistry_1.createVirtualFiles)(languageModules);
22
+ const virtualFiles = (0, virtualFiles_1.createVirtualFiles)(languageModules);
23
23
  const ts = host.getTypeScriptModule();
24
24
  const scriptSnapshots = new Map();
25
25
  const sourceTsFileVersions = new Map();
@@ -29,18 +29,27 @@ function createLanguageContext(host, languageModules) {
29
29
  fileExists: host.fileExists
30
30
  ? fileName => {
31
31
  var _a;
32
- // .vue.js -> .vue
33
- // .vue.ts -> .vue
34
- // .vue.d.ts -> [ignored]
35
- const vueFileName = fileName.substring(0, fileName.lastIndexOf('.'));
36
- if (!virtualFiles.hasSourceFile(vueFileName)) {
37
- // create virtual files
38
- const scriptSnapshot = host.getScriptSnapshot(vueFileName);
39
- if (scriptSnapshot) {
40
- virtualFiles.update(vueFileName, scriptSnapshot);
32
+ const ext = fileName.substring(fileName.lastIndexOf('.'));
33
+ if (ext === '.js'
34
+ || ext === '.ts'
35
+ || ext === '.jsx'
36
+ || ext === '.tsx') {
37
+ /**
38
+ * If try to access a external .vue file that outside of the project,
39
+ * the file will not process by language service host,
40
+ * so virtual file will not be created.
41
+ *
42
+ * We try to create virtual file here.
43
+ */
44
+ const sourceFileName = fileName.substring(0, fileName.lastIndexOf('.'));
45
+ if (!virtualFiles.hasSource(sourceFileName)) {
46
+ const scriptSnapshot = host.getScriptSnapshot(sourceFileName);
47
+ if (scriptSnapshot) {
48
+ virtualFiles.updateSource(sourceFileName, scriptSnapshot);
49
+ }
41
50
  }
42
51
  }
43
- if (virtualFiles.getSourceByVirtualFileName(fileName)) {
52
+ if (virtualFiles.hasVirtualFile(fileName)) {
44
53
  return true;
45
54
  }
46
55
  return !!((_a = host.fileExists) === null || _a === void 0 ? void 0 : _a.call(host, fileName));
@@ -55,7 +64,7 @@ function createLanguageContext(host, languageModules) {
55
64
  readDirectory: (_path, extensions, exclude, include, depth) => {
56
65
  var _a, _b;
57
66
  const result = (_b = (_a = host.readDirectory) === null || _a === void 0 ? void 0 : _a.call(host, _path, extensions, exclude, include, depth)) !== null && _b !== void 0 ? _b : [];
58
- for (const [, [fileName]] of virtualFiles.all) {
67
+ for (const { fileName } of virtualFiles.allSources()) {
59
68
  const vuePath2 = path_1.posix.join(_path, path_1.posix.basename(fileName));
60
69
  if (path_1.posix.relative(_path.toLowerCase(), fileName.toLowerCase()).startsWith('..')) {
61
70
  continue;
@@ -71,7 +80,7 @@ function createLanguageContext(host, languageModules) {
71
80
  },
72
81
  getScriptKind(fileName) {
73
82
  if (ts) {
74
- if (virtualFiles.hasSourceFile(fileName))
83
+ if (virtualFiles.hasSource(fileName))
75
84
  return ts.ScriptKind.Deferred;
76
85
  switch (path_1.posix.extname(fileName)) {
77
86
  case '.js': return ts.ScriptKind.JS;
@@ -112,12 +121,12 @@ function createLanguageContext(host, languageModules) {
112
121
  let virtualFilesUpdatedNum = 0;
113
122
  const remainRootFiles = new Set(host.getScriptFileNames());
114
123
  // .vue
115
- for (const [_, [fileName]] of virtualFiles.all) {
124
+ for (const { fileName } of virtualFiles.allSources()) {
116
125
  remainRootFiles.delete(fileName);
117
126
  const snapshot = host.getScriptSnapshot(fileName);
118
127
  if (!snapshot) {
119
128
  // delete
120
- virtualFiles.delete(fileName);
129
+ virtualFiles.deleteSource(fileName);
121
130
  shouldUpdateTsProject = true;
122
131
  virtualFilesUpdatedNum++;
123
132
  continue;
@@ -126,7 +135,7 @@ function createLanguageContext(host, languageModules) {
126
135
  if (sourceFileVersions.get(fileName) !== newVersion) {
127
136
  // update
128
137
  sourceFileVersions.set(fileName, newVersion);
129
- virtualFiles.update(fileName, snapshot);
138
+ virtualFiles.updateSource(fileName, snapshot);
130
139
  virtualFilesUpdatedNum++;
131
140
  }
132
141
  }
@@ -138,7 +147,7 @@ function createLanguageContext(host, languageModules) {
138
147
  for (const fileName of [...remainRootFiles]) {
139
148
  const snapshot = host.getScriptSnapshot(fileName);
140
149
  if (snapshot) {
141
- const virtualFile = virtualFiles.update(fileName, snapshot);
150
+ const virtualFile = virtualFiles.updateSource(fileName, snapshot);
142
151
  if (virtualFile) {
143
152
  remainRootFiles.delete(fileName);
144
153
  }
@@ -167,9 +176,9 @@ function createLanguageContext(host, languageModules) {
167
176
  shouldUpdateTsProject = true;
168
177
  }
169
178
  }
170
- for (const [_, [_1, _2, virtualFile]] of virtualFiles.all) {
179
+ for (const { root: rootVirtualFile } of virtualFiles.allSources()) {
171
180
  if (!shouldUpdateTsProject) {
172
- (0, documentRegistry_1.forEachEmbeddedFile)(virtualFile, embedded => {
181
+ (0, virtualFiles_1.forEachEmbeddedFile)(rootVirtualFile, embedded => {
173
182
  var _a;
174
183
  if (embedded.kind === types_1.FileKind.TypeScriptHostFile) {
175
184
  if (virtualFileVersions.has(embedded.fileName) && ((_a = virtualFileVersions.get(embedded.fileName)) === null || _a === void 0 ? void 0 : _a.virtualFileSnapshot) !== embedded.snapshot) {
@@ -185,38 +194,38 @@ function createLanguageContext(host, languageModules) {
185
194
  }
186
195
  function getScriptFileNames() {
187
196
  const tsFileNames = new Set();
188
- for (const [_, [_1, _2, sourceFile]] of virtualFiles.all) {
189
- (0, documentRegistry_1.forEachEmbeddedFile)(sourceFile, embedded => {
197
+ for (const { root: rootVirtualFile } of virtualFiles.allSources()) {
198
+ (0, virtualFiles_1.forEachEmbeddedFile)(rootVirtualFile, embedded => {
190
199
  if (embedded.kind === types_1.FileKind.TypeScriptHostFile) {
191
200
  tsFileNames.add(embedded.fileName); // virtual .ts
192
201
  }
193
202
  });
194
203
  }
195
204
  for (const fileName of host.getScriptFileNames()) {
196
- if (!virtualFiles.hasSourceFile(fileName)) {
205
+ if (!virtualFiles.hasSource(fileName)) {
197
206
  tsFileNames.add(fileName); // .ts
198
207
  }
199
208
  }
200
209
  return [...tsFileNames];
201
210
  }
202
211
  function getScriptVersion(fileName) {
203
- let source = virtualFiles.getSourceByVirtualFileName(fileName);
204
- if (source) {
205
- let version = virtualFileVersions.get(source[2].fileName);
212
+ let [virtualFile, source] = virtualFiles.getVirtualFile(fileName);
213
+ if (virtualFile && source) {
214
+ let version = virtualFileVersions.get(virtualFile.fileName);
206
215
  if (!version) {
207
216
  version = {
208
217
  value: 0,
209
- virtualFileSnapshot: source[2].snapshot,
210
- sourceFileSnapshot: source[1],
218
+ virtualFileSnapshot: virtualFile.snapshot,
219
+ sourceFileSnapshot: source.snapshot,
211
220
  };
212
- virtualFileVersions.set(source[2].fileName, version);
221
+ virtualFileVersions.set(virtualFile.fileName, version);
213
222
  }
214
- else if (version.virtualFileSnapshot !== source[2].snapshot
215
- || (host.isTsc && version.sourceFileSnapshot !== source[1]) // fix https://github.com/johnsoncodehk/volar/issues/1082
223
+ else if (version.virtualFileSnapshot !== virtualFile.snapshot
224
+ || (host.isTsc && version.sourceFileSnapshot !== source.snapshot) // fix https://github.com/johnsoncodehk/volar/issues/1082
216
225
  ) {
217
226
  version.value++;
218
- version.virtualFileSnapshot = source[2].snapshot;
219
- version.sourceFileSnapshot = source[1];
227
+ version.virtualFileSnapshot = virtualFile.snapshot;
228
+ version.sourceFileSnapshot = source.snapshot;
220
229
  }
221
230
  return version.value.toString();
222
231
  }
@@ -228,9 +237,9 @@ function createLanguageContext(host, languageModules) {
228
237
  if (cache && cache[0] === version) {
229
238
  return cache[1];
230
239
  }
231
- const source = virtualFiles.getSourceByVirtualFileName(fileName);
232
- if (source) {
233
- const snapshot = source[2].snapshot;
240
+ const [virtualFile] = virtualFiles.getVirtualFile(fileName);
241
+ if (virtualFile) {
242
+ const snapshot = virtualFile.snapshot;
234
243
  scriptSnapshots.set(fileName.toLowerCase(), [version, snapshot]);
235
244
  return snapshot;
236
245
  }
package/out/types.d.ts CHANGED
@@ -32,6 +32,15 @@ export interface MirrorBehaviorCapabilities {
32
32
  definition?: boolean;
33
33
  rename?: boolean;
34
34
  }
35
+ export declare namespace FileCapabilities {
36
+ const full: FileCapabilities;
37
+ }
38
+ export declare namespace FileRangeCapabilities {
39
+ const full: FileRangeCapabilities;
40
+ }
41
+ export declare namespace MirrorBehaviorCapabilities {
42
+ const full: MirrorBehaviorCapabilities;
43
+ }
35
44
  export declare enum FileKind {
36
45
  TextFile = 0,
37
46
  TypeScriptHostFile = 1
package/out/types.js CHANGED
@@ -1,5 +1,36 @@
1
1
  Object.defineProperty(exports, "__esModule", { value: true });
2
- exports.FileKind = void 0;
2
+ exports.FileKind = exports.MirrorBehaviorCapabilities = exports.FileRangeCapabilities = exports.FileCapabilities = void 0;
3
+ var FileCapabilities;
4
+ (function (FileCapabilities) {
5
+ FileCapabilities.full = {
6
+ diagnostic: true,
7
+ foldingRange: true,
8
+ documentFormatting: true,
9
+ documentSymbol: true,
10
+ codeAction: true,
11
+ inlayHint: true,
12
+ };
13
+ })(FileCapabilities = exports.FileCapabilities || (exports.FileCapabilities = {}));
14
+ var FileRangeCapabilities;
15
+ (function (FileRangeCapabilities) {
16
+ FileRangeCapabilities.full = {
17
+ hover: true,
18
+ references: true,
19
+ definition: true,
20
+ rename: true,
21
+ completion: true,
22
+ diagnostic: true,
23
+ semanticTokens: true,
24
+ };
25
+ })(FileRangeCapabilities = exports.FileRangeCapabilities || (exports.FileRangeCapabilities = {}));
26
+ var MirrorBehaviorCapabilities;
27
+ (function (MirrorBehaviorCapabilities) {
28
+ MirrorBehaviorCapabilities.full = {
29
+ references: true,
30
+ definition: true,
31
+ rename: true,
32
+ };
33
+ })(MirrorBehaviorCapabilities = exports.MirrorBehaviorCapabilities || (exports.MirrorBehaviorCapabilities = {}));
3
34
  var FileKind;
4
35
  (function (FileKind) {
5
36
  FileKind[FileKind["TextFile"] = 0] = "TextFile";
@@ -2,21 +2,21 @@ import { SourceMap } from '@volar/source-map';
2
2
  import { MirrorMap } from './sourceMaps';
3
3
  import type { LanguageModule, FileRangeCapabilities, VirtualFile } from './types';
4
4
  export type VirtualFiles = ReturnType<typeof createVirtualFiles>;
5
- type Source = [
6
- string,
7
- ts.IScriptSnapshot,
8
- VirtualFile,
9
- LanguageModule
10
- ];
5
+ export interface Source {
6
+ fileName: string;
7
+ snapshot: ts.IScriptSnapshot;
8
+ root: VirtualFile;
9
+ languageModule: LanguageModule;
10
+ }
11
11
  export declare function createVirtualFiles(languageModules: LanguageModule[]): {
12
- all: Map<string, Source>;
13
- update(fileName: string, snapshot: ts.IScriptSnapshot): VirtualFile | undefined;
14
- delete(fileName: string): void;
15
- get(fileName: string): readonly [import("typescript/lib/tsserverlibrary").IScriptSnapshot, VirtualFile] | undefined;
16
- hasSourceFile: (fileName: string) => boolean;
12
+ allSources(): Source[];
13
+ updateSource(fileName: string, snapshot: ts.IScriptSnapshot): VirtualFile | undefined;
14
+ deleteSource(fileName: string): void;
15
+ getSource(fileName: string): Source | undefined;
16
+ hasSource: (fileName: string) => boolean;
17
17
  getMirrorMap: (file: VirtualFile) => MirrorMap | undefined;
18
18
  getMaps: (virtualFile: VirtualFile) => [string, SourceMap<FileRangeCapabilities>][];
19
- getSourceByVirtualFileName(fileName: string): readonly [string, import("typescript/lib/tsserverlibrary").IScriptSnapshot, VirtualFile] | undefined;
19
+ hasVirtualFile(fileName: string): boolean;
20
+ getVirtualFile(fileName: string): readonly [VirtualFile, Source] | readonly [undefined, undefined];
20
21
  };
21
22
  export declare function forEachEmbeddedFile(file: VirtualFile, cb: (embedded: VirtualFile) => void): void;
22
- export {};
@@ -9,59 +9,53 @@ function createVirtualFiles(languageModules) {
9
9
  const virtualFileToMirrorMap = new WeakMap();
10
10
  let sourceFilesDirty = true;
11
11
  return {
12
- all: sourceFiles,
13
- update(fileName, snapshot) {
12
+ allSources() {
13
+ return Array.from(sourceFiles.values());
14
+ },
15
+ updateSource(fileName, snapshot) {
14
16
  const key = normalizePath(fileName);
15
17
  const value = sourceFiles.get(key);
16
18
  if (value) {
17
- const virtualFile = value[2];
18
- value[1] = snapshot;
19
- value[3].updateFile(virtualFile, snapshot);
19
+ value.snapshot = snapshot;
20
+ value.languageModule.updateFile(value.root, snapshot);
20
21
  sourceFilesDirty = true;
21
- return virtualFile; // updated
22
+ return value.root; // updated
22
23
  }
23
24
  for (const languageModule of languageModules) {
24
25
  const virtualFile = languageModule.createFile(fileName, snapshot);
25
26
  if (virtualFile) {
26
- sourceFiles.set(key, [fileName, snapshot, virtualFile, languageModule]);
27
+ sourceFiles.set(key, { fileName, snapshot, root: virtualFile, languageModule });
27
28
  sourceFilesDirty = true;
28
29
  return virtualFile; // created
29
30
  }
30
31
  }
31
32
  },
32
- delete(fileName) {
33
+ deleteSource(fileName) {
33
34
  var _a, _b;
34
35
  const key = normalizePath(fileName);
35
36
  const value = sourceFiles.get(key);
36
37
  if (value) {
37
- const virtualFile = value[2];
38
- (_b = (_a = value[3]).deleteFile) === null || _b === void 0 ? void 0 : _b.call(_a, virtualFile);
38
+ (_b = (_a = value.languageModule).deleteFile) === null || _b === void 0 ? void 0 : _b.call(_a, value.root);
39
39
  sourceFiles.delete(key); // deleted
40
40
  sourceFilesDirty = true;
41
41
  }
42
42
  },
43
- get(fileName) {
43
+ getSource(fileName) {
44
44
  const key = normalizePath(fileName);
45
- const value = sourceFiles.get(key);
46
- if (value) {
47
- return [
48
- value[1],
49
- value[2],
50
- ];
51
- }
45
+ return sourceFiles.get(key);
52
46
  },
53
- hasSourceFile: (fileName) => sourceFiles.has(normalizePath(fileName)),
47
+ hasSource: (fileName) => sourceFiles.has(normalizePath(fileName)),
54
48
  getMirrorMap: getMirrorMap,
55
49
  getMaps: getSourceMaps,
56
- getSourceByVirtualFileName(fileName) {
57
- const source = getVirtualFilesMap().get(normalizePath(fileName));
58
- if (source) {
59
- return [
60
- source[1][0],
61
- source[1][1],
62
- source[0],
63
- ];
50
+ hasVirtualFile(fileName) {
51
+ return !!getVirtualFilesMap().get(normalizePath(fileName));
52
+ },
53
+ getVirtualFile(fileName) {
54
+ const sourceAndVirtual = getVirtualFilesMap().get(normalizePath(fileName));
55
+ if (sourceAndVirtual) {
56
+ return [sourceAndVirtual.virtualFile, sourceAndVirtual.source];
64
57
  }
58
+ return [undefined, undefined];
65
59
  },
66
60
  };
67
61
  function getVirtualFilesMap() {
@@ -69,8 +63,8 @@ function createVirtualFiles(languageModules) {
69
63
  sourceFilesDirty = false;
70
64
  virtualFiles.clear();
71
65
  for (const [_, row] of sourceFiles) {
72
- forEachEmbeddedFile(row[2], file => {
73
- virtualFiles.set(normalizePath(file.fileName), [file, row]);
66
+ forEachEmbeddedFile(row.root, file => {
67
+ virtualFiles.set(normalizePath(file.fileName), { virtualFile: file, source: row });
74
68
  });
75
69
  }
76
70
  }
@@ -87,7 +81,7 @@ function createVirtualFiles(languageModules) {
87
81
  sources.add(map.source);
88
82
  }
89
83
  for (const source of sources) {
90
- const sourceFileName = source !== null && source !== void 0 ? source : getVirtualFilesMap().get(normalizePath(virtualFile.fileName))[1][0];
84
+ const sourceFileName = source !== null && source !== void 0 ? source : getVirtualFilesMap().get(normalizePath(virtualFile.fileName)).source.fileName;
91
85
  if (!sourceMapsBySourceFileName.has(sourceFileName)) {
92
86
  sourceMapsBySourceFileName.set(sourceFileName, [
93
87
  sourceFileName,
@@ -115,4 +109,4 @@ exports.forEachEmbeddedFile = forEachEmbeddedFile;
115
109
  function normalizePath(fileName) {
116
110
  return fileName.replace(/\\/g, '/').toLowerCase();
117
111
  }
118
- //# sourceMappingURL=documentRegistry.js.map
112
+ //# sourceMappingURL=virtualFiles.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@volar/language-core",
3
- "version": "1.0.21",
3
+ "version": "1.0.24",
4
4
  "main": "out/index.js",
5
5
  "license": "MIT",
6
6
  "files": [
@@ -13,8 +13,8 @@
13
13
  "directory": "packages/language-core"
14
14
  },
15
15
  "dependencies": {
16
- "@volar/source-map": "1.0.21",
16
+ "@volar/source-map": "1.0.24",
17
17
  "muggle-string": "^0.1.0"
18
18
  },
19
- "gitHead": "72332760759e06eed18e62026185cbad70250367"
19
+ "gitHead": "46da609e8914e29642f4707dec31507ad51b03fc"
20
20
  }