@volar/typescript 2.2.4 → 2.3.0-alpha.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.d.ts CHANGED
@@ -4,3 +4,4 @@ export * from './lib/node/decorateProgram';
4
4
  export * from './lib/node/proxyCreateProgram';
5
5
  export * from './lib/protocol/createProject';
6
6
  export * from './lib/protocol/createSys';
7
+ export * from './lib/common';
package/index.js CHANGED
@@ -20,4 +20,5 @@ __exportStar(require("./lib/node/decorateProgram"), exports);
20
20
  __exportStar(require("./lib/node/proxyCreateProgram"), exports);
21
21
  __exportStar(require("./lib/protocol/createProject"), exports);
22
22
  __exportStar(require("./lib/protocol/createSys"), exports);
23
+ __exportStar(require("./lib/common"), exports);
23
24
  //# sourceMappingURL=index.js.map
package/lib/common.d.ts CHANGED
@@ -1,2 +1 @@
1
- import type { LanguagePlugin } from "@volar/language-core";
2
- export declare const fileLanguageIdProviderPlugin: LanguagePlugin;
1
+ export declare function resolveFileLanguageId(path: string): string | undefined;
package/lib/common.js CHANGED
@@ -1,20 +1,19 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.fileLanguageIdProviderPlugin = void 0;
4
- exports.fileLanguageIdProviderPlugin = {
5
- getLanguageId(scriptId) {
6
- const ext = scriptId.split('.').pop();
7
- switch (ext) {
8
- case 'js': return 'javascript';
9
- case 'cjs': return 'javascript';
10
- case 'mjs': return 'javascript';
11
- case 'ts': return 'typescript';
12
- case 'cts': return 'typescript';
13
- case 'mts': return 'typescript';
14
- case 'jsx': return 'javascriptreact';
15
- case 'tsx': return 'typescriptreact';
16
- case 'json': return 'json';
17
- }
18
- },
19
- };
3
+ exports.resolveFileLanguageId = void 0;
4
+ function resolveFileLanguageId(path) {
5
+ const ext = path.split('.').pop();
6
+ switch (ext) {
7
+ case 'js': return 'javascript';
8
+ case 'cjs': return 'javascript';
9
+ case 'mjs': return 'javascript';
10
+ case 'ts': return 'typescript';
11
+ case 'cts': return 'typescript';
12
+ case 'mts': return 'typescript';
13
+ case 'jsx': return 'javascriptreact';
14
+ case 'tsx': return 'typescriptreact';
15
+ case 'json': return 'json';
16
+ }
17
+ }
18
+ exports.resolveFileLanguageId = resolveFileLanguageId;
20
19
  //# sourceMappingURL=common.js.map
@@ -1,3 +1,3 @@
1
1
  import { Language } from '@volar/language-core';
2
2
  import type * as ts from 'typescript';
3
- export declare function decorateLanguageService(language: Language, languageService: ts.LanguageService): void;
3
+ export declare function decorateLanguageService(language: Language<string>, languageService: ts.LanguageService): void;
@@ -415,9 +415,9 @@ function decorateLanguageService(language, languageService) {
415
415
  // TODO reuse the logic from language service
416
416
  if ((0, language_core_1.isSemanticTokensEnabled)(mapping.data) && mapping.sourceOffsets[0] >= span.start && mapping.sourceOffsets[0] <= span.start + span.length) {
417
417
  start ??= mapping.generatedOffsets[0];
418
- end ??= mapping.generatedOffsets[mapping.generatedOffsets.length - 1] + mapping.lengths[mapping.lengths.length - 1];
418
+ end ??= mapping.generatedOffsets[mapping.generatedOffsets.length - 1] + (mapping.generatedLengths ?? mapping.lengths)[mapping.lengths.length - 1];
419
419
  start = Math.min(start, mapping.generatedOffsets[0]);
420
- end = Math.max(end, mapping.generatedOffsets[mapping.generatedOffsets.length - 1] + mapping.lengths[mapping.lengths.length - 1]);
420
+ end = Math.max(end, mapping.generatedOffsets[mapping.generatedOffsets.length - 1] + (mapping.generatedLengths ?? mapping.lengths)[mapping.lengths.length - 1]);
421
421
  }
422
422
  }
423
423
  start ??= 0;
@@ -1,4 +1,4 @@
1
1
  import type { Language } from '@volar/language-core';
2
2
  import type * as ts from 'typescript';
3
- export declare function decorateLanguageServiceHost(ts: typeof import('typescript'), language: Language, languageServiceHost: ts.LanguageServiceHost): void;
3
+ export declare function decorateLanguageServiceHost(ts: typeof import('typescript'), language: Language<string>, languageServiceHost: ts.LanguageServiceHost): void;
4
4
  export declare function searchExternalFiles(ts: typeof import('typescript'), project: ts.server.Project, exts: string[]): string[];
@@ -1,3 +1,3 @@
1
1
  import type { Language } from '@volar/language-core';
2
2
  import type * as ts from 'typescript';
3
- export declare function decorateProgram(language: Language, program: ts.Program): void;
3
+ export declare function decorateProgram(language: Language<string>, program: ts.Program): void;
@@ -1,3 +1,3 @@
1
1
  import { LanguagePlugin } from '@volar/language-core';
2
2
  import type * as ts from 'typescript';
3
- export declare function proxyCreateProgram(ts: typeof import('typescript'), original: typeof ts['createProgram'], getLanguagePlugins: (ts: typeof import('typescript'), options: ts.CreateProgramOptions) => LanguagePlugin[]): typeof import("typescript").createProgram;
3
+ export declare function proxyCreateProgram(ts: typeof import('typescript'), original: typeof ts['createProgram'], getLanguagePlugins: (ts: typeof import('typescript'), options: ts.CreateProgramOptions) => LanguagePlugin<string>[]): typeof import("typescript").createProgram;
@@ -30,7 +30,7 @@ const objectEqual = (a, b) => {
30
30
  return true;
31
31
  };
32
32
  function proxyCreateProgram(ts, original, getLanguagePlugins) {
33
- const sourceFileSnapshots = new Map();
33
+ const sourceFileSnapshots = new language_core_1.FileMap(ts.sys.useCaseSensitiveFileNames);
34
34
  const parsedSourceFiles = new WeakMap();
35
35
  let lastOptions;
36
36
  let languagePlugins;
@@ -50,8 +50,12 @@ function proxyCreateProgram(ts, original, getLanguagePlugins) {
50
50
  languagePlugins = getLanguagePlugins(ts, options);
51
51
  language = (0, language_core_1.createLanguage)([
52
52
  ...languagePlugins,
53
- common_1.fileLanguageIdProviderPlugin,
54
- ], ts.sys.useCaseSensitiveFileNames, fileName => {
53
+ {
54
+ getLanguageId(fileName) {
55
+ return (0, common_1.resolveFileLanguageId)(fileName);
56
+ },
57
+ },
58
+ ], new language_core_1.FileMap(ts.sys.useCaseSensitiveFileNames), fileName => {
55
59
  if (!sourceFileSnapshots.has(fileName)) {
56
60
  const sourceFileText = originalHost.readFile(fileName);
57
61
  if (sourceFileText !== undefined) {
@@ -1,16 +1,17 @@
1
- import { Language, CodeInformation, SourceMap, SourceScript } from '@volar/language-core';
1
+ import type { CodeInformation, SourceMap, SourceScript } from '@volar/language-core';
2
+ import { Language } from '@volar/language-core';
2
3
  import type * as ts from 'typescript';
3
- export declare function transformCallHierarchyItem(language: Language, item: ts.CallHierarchyItem, filter: (data: CodeInformation) => boolean): ts.CallHierarchyItem;
4
- export declare function transformDiagnostic<T extends ts.Diagnostic>(language: Language, diagnostic: T, isTsc: boolean): T | undefined;
5
- export declare function fillSourceFileText(language: Language, sourceFile: ts.SourceFile): void;
6
- export declare function transformFileTextChanges(language: Language, changes: ts.FileTextChanges, filter: (data: CodeInformation) => boolean): ts.FileTextChanges | undefined;
7
- export declare function transformDocumentSpan<T extends ts.DocumentSpan>(language: Language, documentSpan: T, filter: (data: CodeInformation) => boolean, shouldFallback?: boolean): T | undefined;
8
- export declare function transformSpan(language: Language, fileName: string | undefined, textSpan: ts.TextSpan | undefined, filter: (data: CodeInformation) => boolean): {
4
+ export declare function transformCallHierarchyItem(language: Language<string>, item: ts.CallHierarchyItem, filter: (data: CodeInformation) => boolean): ts.CallHierarchyItem;
5
+ export declare function transformDiagnostic<T extends ts.Diagnostic>(language: Language<string>, diagnostic: T, isTsc: boolean): T | undefined;
6
+ export declare function fillSourceFileText(language: Language<string>, sourceFile: ts.SourceFile): void;
7
+ export declare function transformFileTextChanges(language: Language<string>, changes: ts.FileTextChanges, filter: (data: CodeInformation) => boolean): ts.FileTextChanges | undefined;
8
+ export declare function transformDocumentSpan<T extends ts.DocumentSpan>(language: Language<string>, documentSpan: T, filter: (data: CodeInformation) => boolean, shouldFallback?: boolean): T | undefined;
9
+ export declare function transformSpan(language: Language<string>, fileName: string | undefined, textSpan: ts.TextSpan | undefined, filter: (data: CodeInformation) => boolean): {
9
10
  fileName: string;
10
11
  textSpan: ts.TextSpan;
11
12
  } | undefined;
12
- export declare function transformTextChange(sourceScript: SourceScript, map: SourceMap<CodeInformation>, textChange: ts.TextChange, filter: (data: CodeInformation) => boolean): ts.TextChange | undefined;
13
- export declare function transformTextSpan(sourceScript: SourceScript, map: SourceMap<CodeInformation>, textSpan: ts.TextSpan, filter: (data: CodeInformation) => boolean): ts.TextSpan | undefined;
14
- export declare function toSourceOffset(sourceScript: SourceScript, map: SourceMap, position: number, filter: (data: CodeInformation) => boolean): number | undefined;
15
- export declare function toGeneratedOffset(sourceScript: SourceScript, map: SourceMap, position: number, filter: (data: CodeInformation) => boolean): number | undefined;
16
- export declare function toGeneratedOffsets(sourceScript: SourceScript, map: SourceMap<CodeInformation>, position: number): Generator<readonly [number, import("@volar/language-core").Mapping<CodeInformation>], void, unknown>;
13
+ export declare function transformTextChange(sourceScript: SourceScript<string>, map: SourceMap<CodeInformation>, textChange: ts.TextChange, filter: (data: CodeInformation) => boolean): ts.TextChange | undefined;
14
+ export declare function transformTextSpan(sourceScript: SourceScript<string>, map: SourceMap<CodeInformation>, textSpan: ts.TextSpan, filter: (data: CodeInformation) => boolean): ts.TextSpan | undefined;
15
+ export declare function toSourceOffset(sourceScript: SourceScript<string>, map: SourceMap, position: number, filter: (data: CodeInformation) => boolean): number | undefined;
16
+ export declare function toGeneratedOffset(sourceScript: SourceScript<string>, map: SourceMap, position: number, filter: (data: CodeInformation) => boolean): number | undefined;
17
+ export declare function toGeneratedOffsets(sourceScript: SourceScript<string>, map: SourceMap<CodeInformation>, position: number): Generator<readonly [number, import("@volar/language-core").Mapping<CodeInformation>], void, unknown>;
@@ -1,3 +1,3 @@
1
1
  import type { Language } from '@volar/language-core';
2
2
  export declare function notEmpty<T>(value: T | null | undefined): value is T;
3
- export declare function getServiceScript(language: Language, fileName: string): readonly [import("@volar/language-core").ServiceScript, import("@volar/language-core").SourceScript, import("@volar/language-core").SourceMap<import("@volar/language-core").CodeInformation>] | readonly [undefined, undefined, undefined];
3
+ export declare function getServiceScript(language: Language<string>, fileName: string): readonly [import("@volar/language-core").TypeScriptServiceScript, import("@volar/language-core").SourceScript<string>, import("@volar/language-core").SourceMap<import("@volar/language-core").CodeInformation>] | readonly [undefined, undefined, undefined];
@@ -1,2 +1,9 @@
1
- import { LanguagePlugin, Language, TypeScriptProjectHost } from '@volar/language-core';
2
- export declare function createTypeScriptLanguage(ts: typeof import('typescript'), languagePlugins: LanguagePlugin[], projectHost: TypeScriptProjectHost): Language;
1
+ import { Language, TypeScriptExtraServiceScript } from '@volar/language-core';
2
+ import type * as ts from 'typescript';
3
+ import type { createSys } from './createSys';
4
+ export interface TypeScriptProjectHost extends Pick<ts.LanguageServiceHost, 'getLocalizedDiagnosticMessages' | 'getCurrentDirectory' | 'getCompilationSettings' | 'getProjectReferences' | 'getScriptFileNames' | 'getProjectVersion' | 'getScriptSnapshot'> {
5
+ }
6
+ export declare function createLanguageServiceHost<T>(ts: typeof import('typescript'), sys: ReturnType<typeof createSys> | ts.System, language: Language<T>, asScrpitId: (fileName: string) => T, projectHost: TypeScriptProjectHost): {
7
+ languageServiceHost: ts.LanguageServiceHost;
8
+ getExtraServiceScript: (fileName: string) => TypeScriptExtraServiceScript | undefined;
9
+ };
@@ -1,58 +1,129 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createTypeScriptLanguage = void 0;
3
+ exports.createLanguageServiceHost = void 0;
4
4
  const language_core_1 = require("@volar/language-core");
5
- const language_core_2 = require("@volar/language-core");
6
5
  const path = require("path-browserify");
7
6
  const resolveModuleName_1 = require("../resolveModuleName");
8
- const common_1 = require("../common");
9
- const scriptVersions = new Map();
10
- const fsFileSnapshots = new Map();
11
- function createTypeScriptLanguage(ts, languagePlugins, projectHost) {
12
- const language = (0, language_core_1.createLanguage)([
13
- ...languagePlugins,
14
- common_1.fileLanguageIdProviderPlugin,
15
- ], projectHost.useCaseSensitiveFileNames, scriptId => {
16
- const fileName = projectHost.scriptIdToFileName(scriptId);
17
- // opened files
18
- let snapshot = projectHost.getScriptSnapshot(fileName);
19
- if (!snapshot) {
20
- // fs files
21
- const cache = fsFileSnapshots.get(fileName);
22
- const modifiedTime = projectHost.getModifiedTime?.(fileName)?.valueOf();
23
- if (!cache || cache[0] !== modifiedTime) {
24
- if (projectHost.fileExists(fileName)) {
25
- const text = projectHost.readFile(fileName);
26
- const snapshot = text !== undefined ? ts.ScriptSnapshot.fromString(text) : undefined;
27
- fsFileSnapshots.set(fileName, [modifiedTime, snapshot]);
7
+ function createLanguageServiceHost(ts, sys, language, asScrpitId, projectHost) {
8
+ const scriptVersions = new language_core_1.FileMap(sys.useCaseSensitiveFileNames);
9
+ let lastProjectVersion;
10
+ let tsProjectVersion = 0;
11
+ let tsFileRegistry = new language_core_1.FileMap(sys.useCaseSensitiveFileNames);
12
+ let extraScriptRegistry = new language_core_1.FileMap(sys.useCaseSensitiveFileNames);
13
+ let lastTsVirtualFileSnapshots = new Set();
14
+ let lastOtherVirtualFileSnapshots = new Set();
15
+ let languageServiceHost = {
16
+ ...sys,
17
+ getCurrentDirectory() {
18
+ return projectHost.getCurrentDirectory();
19
+ },
20
+ useCaseSensitiveFileNames() {
21
+ return sys.useCaseSensitiveFileNames;
22
+ },
23
+ getNewLine() {
24
+ return sys.newLine;
25
+ },
26
+ getTypeRootsVersion: () => {
27
+ return 'version' in sys ? sys.version : -1; // TODO: only update for /node_modules changes?
28
+ },
29
+ getDirectories(dirName) {
30
+ return sys.getDirectories(dirName);
31
+ },
32
+ readDirectory(dirName, extensions, excludes, includes, depth) {
33
+ const exts = new Set(extensions);
34
+ for (const languagePlugin of language.plugins) {
35
+ for (const ext of languagePlugin.typescript?.extraFileExtensions ?? []) {
36
+ exts.add('.' + ext.extension);
28
37
  }
29
- else {
30
- fsFileSnapshots.set(fileName, [modifiedTime, undefined]);
38
+ }
39
+ extensions = [...exts];
40
+ return sys.readDirectory(dirName, extensions, excludes, includes, depth);
41
+ },
42
+ getCompilationSettings() {
43
+ const options = projectHost.getCompilationSettings();
44
+ if (language.plugins.some(language => language.typescript?.extraFileExtensions.length)) {
45
+ options.allowNonTsExtensions ??= true;
46
+ if (!options.allowNonTsExtensions) {
47
+ console.warn('`allowNonTsExtensions` must be `true`.');
31
48
  }
32
49
  }
33
- snapshot = fsFileSnapshots.get(fileName)?.[1];
34
- }
35
- if (snapshot) {
36
- language.scripts.set(scriptId, snapshot);
37
- }
38
- else {
39
- language.scripts.delete(scriptId);
40
- }
41
- });
42
- let { languageServiceHost, getExtraScript } = createLanguageServiceHost();
43
- for (const language of languagePlugins) {
44
- if (language.typescript?.resolveLanguageServiceHost) {
45
- languageServiceHost = language.typescript.resolveLanguageServiceHost(languageServiceHost);
50
+ return options;
51
+ },
52
+ getLocalizedDiagnosticMessages: projectHost.getLocalizedDiagnosticMessages,
53
+ getProjectReferences: projectHost.getProjectReferences,
54
+ getDefaultLibFileName: options => {
55
+ try {
56
+ return ts.getDefaultLibFilePath(options);
57
+ }
58
+ catch {
59
+ // web
60
+ return `/node_modules/typescript/lib/${ts.getDefaultLibFileName(options)}`;
61
+ }
62
+ },
63
+ readFile(fileName) {
64
+ const snapshot = getScriptSnapshot(fileName);
65
+ if (snapshot) {
66
+ return snapshot.getText(0, snapshot.getLength());
67
+ }
68
+ },
69
+ fileExists(fileName) {
70
+ return getScriptVersion(fileName) !== '';
71
+ },
72
+ getProjectVersion() {
73
+ sync();
74
+ return tsProjectVersion + ('version' in sys ? `:${sys.version}` : '');
75
+ },
76
+ getScriptFileNames() {
77
+ sync();
78
+ return [...tsFileRegistry.keys()];
79
+ },
80
+ getScriptKind(fileName) {
81
+ sync();
82
+ if (extraScriptRegistry.has(fileName)) {
83
+ return extraScriptRegistry.get(fileName).scriptKind;
84
+ }
85
+ const sourceScript = language.scripts.get(asScrpitId(fileName));
86
+ if (sourceScript?.generated) {
87
+ const serviceScript = sourceScript.generated.languagePlugin.typescript?.getServiceScript(sourceScript.generated.root);
88
+ if (serviceScript) {
89
+ return serviceScript.scriptKind;
90
+ }
91
+ }
92
+ switch (path.extname(fileName)) {
93
+ case '.js':
94
+ case '.cjs':
95
+ case '.mjs':
96
+ return ts.ScriptKind.JS;
97
+ case '.jsx':
98
+ return ts.ScriptKind.JSX;
99
+ case '.ts':
100
+ case '.cts':
101
+ case '.mts':
102
+ return ts.ScriptKind.TS;
103
+ case '.tsx':
104
+ return ts.ScriptKind.TSX;
105
+ case '.json':
106
+ return ts.ScriptKind.JSON;
107
+ default:
108
+ return ts.ScriptKind.Unknown;
109
+ }
110
+ },
111
+ getScriptVersion,
112
+ getScriptSnapshot,
113
+ };
114
+ for (const plugin of language.plugins) {
115
+ if (plugin.typescript?.resolveLanguageServiceHost) {
116
+ languageServiceHost = plugin.typescript.resolveLanguageServiceHost(languageServiceHost);
46
117
  }
47
118
  }
48
- if (languagePlugins.some(language => language.typescript?.extraFileExtensions.length)) {
119
+ if (language.plugins.some(language => language.typescript?.extraFileExtensions.length)) {
49
120
  // TODO: can this share between monorepo packages?
50
121
  const moduleCache = ts.createModuleResolutionCache(languageServiceHost.getCurrentDirectory(), languageServiceHost.useCaseSensitiveFileNames?.() ? s => s : s => s.toLowerCase(), languageServiceHost.getCompilationSettings());
51
- const resolveModuleName = (0, resolveModuleName_1.createResolveModuleName)(ts, languageServiceHost, languagePlugins, fileName => language.scripts.get(projectHost.fileNameToScriptId(fileName)));
52
- let lastSysVersion = projectHost.getSystemVersion?.();
122
+ const resolveModuleName = (0, resolveModuleName_1.createResolveModuleName)(ts, languageServiceHost, language.plugins, fileName => language.scripts.get(asScrpitId(fileName)));
123
+ let lastSysVersion = 'version' in sys ? sys.version : undefined;
53
124
  languageServiceHost.resolveModuleNameLiterals = (moduleLiterals, containingFile, redirectedReference, options, sourceFile) => {
54
- if (projectHost.getSystemVersion && lastSysVersion !== projectHost.getSystemVersion()) {
55
- lastSysVersion = projectHost.getSystemVersion();
125
+ if ('version' in sys && lastSysVersion !== sys.version) {
126
+ lastSysVersion = sys.version;
56
127
  moduleCache.clear();
57
128
  }
58
129
  return moduleLiterals.map(moduleLiteral => {
@@ -60,8 +131,8 @@ function createTypeScriptLanguage(ts, languagePlugins, projectHost) {
60
131
  });
61
132
  };
62
133
  languageServiceHost.resolveModuleNames = (moduleNames, containingFile, _reusedNames, redirectedReference, options) => {
63
- if (projectHost.getSystemVersion && lastSysVersion !== projectHost.getSystemVersion()) {
64
- lastSysVersion = projectHost.getSystemVersion();
134
+ if ('version' in sys && lastSysVersion !== sys.version) {
135
+ lastSysVersion = sys.version;
65
136
  moduleCache.clear();
66
137
  }
67
138
  return moduleNames.map(moduleName => {
@@ -69,227 +140,116 @@ function createTypeScriptLanguage(ts, languagePlugins, projectHost) {
69
140
  });
70
141
  };
71
142
  }
72
- language.typescript = {
73
- projectHost,
143
+ return {
74
144
  languageServiceHost,
75
- getExtraServiceScript: getExtraScript,
145
+ getExtraServiceScript,
76
146
  };
77
- return language;
78
- function createLanguageServiceHost() {
79
- let lastProjectVersion;
80
- let tsProjectVersion = 0;
81
- let tsFileRegistry = new language_core_1.FileMap(projectHost.useCaseSensitiveFileNames);
82
- let extraScriptRegistry = new language_core_1.FileMap(projectHost.useCaseSensitiveFileNames);
83
- let lastTsVirtualFileSnapshots = new Set();
84
- let lastOtherVirtualFileSnapshots = new Set();
85
- const languageServiceHost = {
86
- ...projectHost,
87
- getCurrentDirectory: projectHost.getCurrentDirectory,
88
- getCompilationSettings() {
89
- const options = projectHost.getCompilationSettings();
90
- if (languagePlugins.some(language => language.typescript?.extraFileExtensions.length)) {
91
- options.allowNonTsExtensions ??= true;
92
- if (!options.allowNonTsExtensions) {
93
- console.warn('`allowNonTsExtensions` must be `true`.');
94
- }
95
- }
96
- return options;
97
- },
98
- getLocalizedDiagnosticMessages: projectHost.getLocalizedDiagnosticMessages,
99
- getProjectReferences: projectHost.getProjectReferences,
100
- getDefaultLibFileName: options => {
101
- try {
102
- return ts.getDefaultLibFilePath(options);
103
- }
104
- catch {
105
- // web
106
- return `/node_modules/typescript/lib/${ts.getDefaultLibFileName(options)}`;
107
- }
108
- },
109
- useCaseSensitiveFileNames() {
110
- return projectHost.useCaseSensitiveFileNames;
111
- },
112
- getNewLine() {
113
- return projectHost.newLine;
114
- },
115
- getTypeRootsVersion: () => {
116
- return projectHost.getSystemVersion?.() ?? -1; // TODO: only update for /node_modules changes?
117
- },
118
- getDirectories(dirName) {
119
- return projectHost.getDirectories(dirName);
120
- },
121
- readDirectory(dirName, extensions, excludes, includes, depth) {
122
- const exts = new Set(extensions);
123
- for (const languagePlugin of languagePlugins) {
124
- for (const ext of languagePlugin.typescript?.extraFileExtensions ?? []) {
125
- exts.add('.' + ext.extension);
126
- }
127
- }
128
- extensions = [...exts];
129
- return projectHost.readDirectory(dirName, extensions, excludes, includes, depth);
130
- },
131
- readFile(fileName) {
132
- const snapshot = getScriptSnapshot(fileName);
133
- if (snapshot) {
134
- return snapshot.getText(0, snapshot.getLength());
135
- }
136
- },
137
- fileExists(fileName) {
138
- return getScriptVersion(fileName) !== '';
139
- },
140
- getProjectVersion() {
141
- sync();
142
- return tsProjectVersion + (projectHost.getSystemVersion ? `:${projectHost.getSystemVersion()}` : '');
143
- },
144
- getScriptFileNames() {
145
- sync();
146
- return [...tsFileRegistry.keys()];
147
- },
148
- getScriptKind(fileName) {
149
- sync();
150
- if (extraScriptRegistry.has(fileName)) {
151
- return extraScriptRegistry.get(fileName).scriptKind;
152
- }
153
- const sourceScript = language.scripts.get(projectHost.fileNameToScriptId(fileName));
154
- if (sourceScript?.generated) {
155
- const serviceScript = sourceScript.generated.languagePlugin.typescript?.getServiceScript(sourceScript.generated.root);
156
- if (serviceScript) {
157
- return serviceScript.scriptKind;
158
- }
159
- }
160
- switch (path.extname(fileName)) {
161
- case '.js':
162
- case '.cjs':
163
- case '.mjs':
164
- return ts.ScriptKind.JS;
165
- case '.jsx':
166
- return ts.ScriptKind.JSX;
167
- case '.ts':
168
- case '.cts':
169
- case '.mts':
170
- return ts.ScriptKind.TS;
171
- case '.tsx':
172
- return ts.ScriptKind.TSX;
173
- case '.json':
174
- return ts.ScriptKind.JSON;
175
- default:
176
- return ts.ScriptKind.Unknown;
177
- }
178
- },
179
- getScriptVersion,
180
- getScriptSnapshot,
181
- };
182
- return {
183
- languageServiceHost,
184
- getExtraScript,
185
- };
186
- function getExtraScript(fileName) {
187
- sync();
188
- return extraScriptRegistry.get(fileName);
189
- }
190
- function sync() {
191
- const newProjectVersion = projectHost.getProjectVersion?.();
192
- const shouldUpdate = newProjectVersion === undefined || newProjectVersion !== lastProjectVersion;
193
- if (!shouldUpdate) {
194
- return;
195
- }
196
- lastProjectVersion = newProjectVersion;
197
- extraScriptRegistry.clear();
198
- const newTsVirtualFileSnapshots = new Set();
199
- const newOtherVirtualFileSnapshots = new Set();
200
- const tsFileNamesSet = new Set();
201
- for (const fileName of projectHost.getScriptFileNames()) {
202
- const sourceScript = language.scripts.get(projectHost.fileNameToScriptId(fileName));
203
- if (sourceScript?.generated) {
204
- const serviceScript = sourceScript.generated.languagePlugin.typescript?.getServiceScript(sourceScript.generated.root);
205
- if (serviceScript) {
206
- newTsVirtualFileSnapshots.add(serviceScript.code.snapshot);
207
- tsFileNamesSet.add(fileName);
208
- }
209
- for (const extraServiceScript of sourceScript.generated.languagePlugin.typescript?.getExtraServiceScripts?.(fileName, sourceScript.generated.root) ?? []) {
210
- newTsVirtualFileSnapshots.add(extraServiceScript.code.snapshot);
211
- tsFileNamesSet.add(extraServiceScript.fileName);
212
- extraScriptRegistry.set(extraServiceScript.fileName, extraServiceScript);
213
- }
214
- for (const code of (0, language_core_2.forEachEmbeddedCode)(sourceScript.generated.root)) {
215
- newOtherVirtualFileSnapshots.add(code.snapshot);
216
- }
217
- }
218
- else {
219
- tsFileNamesSet.add(fileName);
220
- }
221
- }
222
- if (!setEquals(lastTsVirtualFileSnapshots, newTsVirtualFileSnapshots)) {
223
- tsProjectVersion++;
224
- }
225
- else if (setEquals(lastOtherVirtualFileSnapshots, newOtherVirtualFileSnapshots)) {
226
- // no any meta language files update, it mean project version was update by source files this time
227
- tsProjectVersion++;
228
- }
229
- lastTsVirtualFileSnapshots = newTsVirtualFileSnapshots;
230
- lastOtherVirtualFileSnapshots = newOtherVirtualFileSnapshots;
231
- tsFileRegistry.clear();
232
- for (const fileName of tsFileNamesSet) {
233
- tsFileRegistry.set(fileName, true);
234
- }
147
+ function getExtraServiceScript(fileName) {
148
+ sync();
149
+ return extraScriptRegistry.get(fileName);
150
+ }
151
+ function sync() {
152
+ const newProjectVersion = projectHost.getProjectVersion?.();
153
+ const shouldUpdate = newProjectVersion === undefined || newProjectVersion !== lastProjectVersion;
154
+ if (!shouldUpdate) {
155
+ return;
235
156
  }
236
- function getScriptSnapshot(fileName) {
237
- sync();
238
- if (extraScriptRegistry.has(fileName)) {
239
- return extraScriptRegistry.get(fileName).code.snapshot;
240
- }
241
- const sourceScript = language.scripts.get(projectHost.fileNameToScriptId(fileName));
157
+ lastProjectVersion = newProjectVersion;
158
+ extraScriptRegistry.clear();
159
+ const newTsVirtualFileSnapshots = new Set();
160
+ const newOtherVirtualFileSnapshots = new Set();
161
+ const tsFileNamesSet = new Set();
162
+ for (const fileName of projectHost.getScriptFileNames()) {
163
+ const sourceScript = language.scripts.get(asScrpitId(fileName));
242
164
  if (sourceScript?.generated) {
243
165
  const serviceScript = sourceScript.generated.languagePlugin.typescript?.getServiceScript(sourceScript.generated.root);
244
166
  if (serviceScript) {
245
- return serviceScript.code.snapshot;
167
+ newTsVirtualFileSnapshots.add(serviceScript.code.snapshot);
168
+ tsFileNamesSet.add(fileName);
169
+ }
170
+ for (const extraServiceScript of sourceScript.generated.languagePlugin.typescript?.getExtraServiceScripts?.(fileName, sourceScript.generated.root) ?? []) {
171
+ newTsVirtualFileSnapshots.add(extraServiceScript.code.snapshot);
172
+ tsFileNamesSet.add(extraServiceScript.fileName);
173
+ extraScriptRegistry.set(extraServiceScript.fileName, extraServiceScript);
174
+ }
175
+ for (const code of (0, language_core_1.forEachEmbeddedCode)(sourceScript.generated.root)) {
176
+ newOtherVirtualFileSnapshots.add(code.snapshot);
246
177
  }
247
178
  }
248
- else if (sourceScript) {
249
- return sourceScript.snapshot;
179
+ else {
180
+ tsFileNamesSet.add(fileName);
250
181
  }
251
182
  }
252
- function getScriptVersion(fileName) {
253
- sync();
254
- if (!scriptVersions.has(fileName)) {
255
- scriptVersions.set(fileName, { lastVersion: 0, map: new WeakMap() });
183
+ if (!setEquals(lastTsVirtualFileSnapshots, newTsVirtualFileSnapshots)) {
184
+ tsProjectVersion++;
185
+ }
186
+ else if (setEquals(lastOtherVirtualFileSnapshots, newOtherVirtualFileSnapshots)) {
187
+ // no any meta language files update, it mean project version was update by source files this time
188
+ tsProjectVersion++;
189
+ }
190
+ lastTsVirtualFileSnapshots = newTsVirtualFileSnapshots;
191
+ lastOtherVirtualFileSnapshots = newOtherVirtualFileSnapshots;
192
+ tsFileRegistry.clear();
193
+ for (const fileName of tsFileNamesSet) {
194
+ tsFileRegistry.set(fileName, true);
195
+ }
196
+ }
197
+ function getScriptSnapshot(fileName) {
198
+ sync();
199
+ if (extraScriptRegistry.has(fileName)) {
200
+ return extraScriptRegistry.get(fileName).code.snapshot;
201
+ }
202
+ const sourceScript = language.scripts.get(asScrpitId(fileName));
203
+ if (sourceScript?.generated) {
204
+ const serviceScript = sourceScript.generated.languagePlugin.typescript?.getServiceScript(sourceScript.generated.root);
205
+ if (serviceScript) {
206
+ return serviceScript.code.snapshot;
256
207
  }
257
- const version = scriptVersions.get(fileName);
258
- if (extraScriptRegistry.has(fileName)) {
259
- const snapshot = extraScriptRegistry.get(fileName).code.snapshot;
260
- if (!version.map.has(snapshot)) {
261
- version.map.set(snapshot, version.lastVersion++);
262
- }
263
- return version.map.get(snapshot).toString();
208
+ }
209
+ else if (sourceScript) {
210
+ return sourceScript.snapshot;
211
+ }
212
+ }
213
+ function getScriptVersion(fileName) {
214
+ sync();
215
+ if (!scriptVersions.has(fileName)) {
216
+ scriptVersions.set(fileName, { lastVersion: 0, map: new WeakMap() });
217
+ }
218
+ const version = scriptVersions.get(fileName);
219
+ if (extraScriptRegistry.has(fileName)) {
220
+ const snapshot = extraScriptRegistry.get(fileName).code.snapshot;
221
+ if (!version.map.has(snapshot)) {
222
+ version.map.set(snapshot, version.lastVersion++);
264
223
  }
265
- const sourceScript = language.scripts.get(projectHost.fileNameToScriptId(fileName));
266
- if (sourceScript?.generated) {
267
- const serviceScript = sourceScript.generated.languagePlugin.typescript?.getServiceScript(sourceScript.generated.root);
268
- if (serviceScript) {
269
- if (!version.map.has(serviceScript.code.snapshot)) {
270
- version.map.set(serviceScript.code.snapshot, version.lastVersion++);
271
- }
272
- return version.map.get(serviceScript.code.snapshot).toString();
224
+ return version.map.get(snapshot).toString();
225
+ }
226
+ const sourceScript = language.scripts.get(asScrpitId(fileName));
227
+ if (sourceScript?.generated) {
228
+ const serviceScript = sourceScript.generated.languagePlugin.typescript?.getServiceScript(sourceScript.generated.root);
229
+ if (serviceScript) {
230
+ if (!version.map.has(serviceScript.code.snapshot)) {
231
+ version.map.set(serviceScript.code.snapshot, version.lastVersion++);
273
232
  }
233
+ return version.map.get(serviceScript.code.snapshot).toString();
274
234
  }
275
- const isOpenedFile = !!projectHost.getScriptSnapshot(fileName);
276
- if (isOpenedFile) {
277
- const sourceScript = language.scripts.get(projectHost.fileNameToScriptId(fileName));
278
- if (sourceScript && !sourceScript.generated) {
279
- if (!version.map.has(sourceScript.snapshot)) {
280
- version.map.set(sourceScript.snapshot, version.lastVersion++);
281
- }
282
- return version.map.get(sourceScript.snapshot).toString();
235
+ }
236
+ const isOpenedFile = !!projectHost.getScriptSnapshot(fileName);
237
+ if (isOpenedFile) {
238
+ const sourceScript = language.scripts.get(asScrpitId(fileName));
239
+ if (sourceScript && !sourceScript.generated) {
240
+ if (!version.map.has(sourceScript.snapshot)) {
241
+ version.map.set(sourceScript.snapshot, version.lastVersion++);
283
242
  }
243
+ return version.map.get(sourceScript.snapshot).toString();
284
244
  }
285
- if (projectHost.fileExists(fileName)) {
286
- return projectHost.getModifiedTime?.(fileName)?.valueOf().toString() ?? '0';
287
- }
288
- return '';
289
245
  }
246
+ if (sys.fileExists(fileName)) {
247
+ return sys.getModifiedTime?.(fileName)?.valueOf().toString() ?? '0';
248
+ }
249
+ return '';
290
250
  }
291
251
  }
292
- exports.createTypeScriptLanguage = createTypeScriptLanguage;
252
+ exports.createLanguageServiceHost = createLanguageServiceHost;
293
253
  function setEquals(a, b) {
294
254
  if (a.size !== b.size) {
295
255
  return false;
@@ -1,6 +1,10 @@
1
- import type { ServiceEnvironment, Disposable } from '@volar/language-service';
1
+ import type { LanguageServiceEnvironment, Disposable } from '@volar/language-service';
2
2
  import type * as ts from 'typescript';
3
- export declare function createSys(ts: typeof import('typescript'), env: ServiceEnvironment, currentDirectory: string): ts.System & {
3
+ import { URI } from 'vscode-uri';
4
+ export declare function createSys(sys: ts.System | undefined, env: LanguageServiceEnvironment, workspaceFolder: URI | undefined, uriConverter: {
5
+ asUri(fileName: string): URI;
6
+ asFileName(uri: URI): string;
7
+ }): ts.System & {
4
8
  version: number;
5
9
  sync(): Promise<number>;
6
10
  } & Disposable;
@@ -3,11 +3,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createSys = void 0;
4
4
  const path = require("path-browserify");
5
5
  const utilities_1 = require("../typescript/utilities");
6
+ const vscode_uri_1 = require("vscode-uri");
6
7
  let currentCwd = '';
7
- function createSys(ts, env, currentDirectory) {
8
+ function createSys(sys, env, workspaceFolder, uriConverter) {
8
9
  let version = 0;
9
- // sys is undefined in browser
10
- const sys = ts.sys;
10
+ const currentDirectory = workspaceFolder ? uriConverter.asFileName(workspaceFolder) : '';
11
11
  const caseSensitive = sys?.useCaseSensitiveFileNames ?? false;
12
12
  const root = {
13
13
  name: '',
@@ -19,7 +19,8 @@ function createSys(ts, env, currentDirectory) {
19
19
  const fileWatcher = env.onDidChangeWatchedFiles?.(({ changes }) => {
20
20
  version++;
21
21
  for (const change of changes) {
22
- const fileName = env.typescript.uriToFileName(change.uri);
22
+ const changeUri = vscode_uri_1.URI.parse(change.uri);
23
+ const fileName = uriConverter.asFileName(changeUri);
23
24
  const dirName = path.dirname(fileName);
24
25
  const baseName = path.basename(fileName);
25
26
  const fileExists = change.type === 1
@@ -107,7 +108,7 @@ function createSys(ts, env, currentDirectory) {
107
108
  const dir = getDir(dirName);
108
109
  if (dir.exists === undefined) {
109
110
  dir.exists = false;
110
- const result = env.fs?.stat(env.typescript.fileNameToUri(dirName));
111
+ const result = env.fs?.stat(uriConverter.asUri(dirName));
111
112
  if (typeof result === 'object' && 'then' in result) {
112
113
  const promise = result;
113
114
  promises.add(promise);
@@ -148,7 +149,7 @@ function createSys(ts, env, currentDirectory) {
148
149
  return exists();
149
150
  }
150
151
  function handleStat(fileName, file) {
151
- const result = env.fs?.stat(env.typescript.fileNameToUri(fileName));
152
+ const result = env.fs?.stat(uriConverter.asUri(fileName));
152
153
  if (typeof result === 'object' && 'then' in result) {
153
154
  const promise = result;
154
155
  promises.add(promise);
@@ -219,7 +220,7 @@ function createSys(ts, env, currentDirectory) {
219
220
  return;
220
221
  }
221
222
  file.requestedText = true;
222
- const uri = env.typescript.fileNameToUri(fileName);
223
+ const uri = uriConverter.asUri(fileName);
223
224
  const result = env.fs?.readFile(uri, encoding);
224
225
  if (typeof result === 'object' && 'then' in result) {
225
226
  const promise = result;
@@ -245,7 +246,7 @@ function createSys(ts, env, currentDirectory) {
245
246
  return;
246
247
  }
247
248
  dir.requestedRead = true;
248
- const result = env.fs?.readDirectory(env.typescript.fileNameToUri(dirName || '.'));
249
+ const result = env.fs?.readDirectory(uriConverter.asUri(dirName || '.'));
249
250
  if (typeof result === 'object' && 'then' in result) {
250
251
  const promise = result;
251
252
  promises.add(promise);
@@ -267,7 +268,7 @@ function createSys(ts, env, currentDirectory) {
267
268
  for (const [name, _fileType] of result) {
268
269
  let fileType = _fileType;
269
270
  if (fileType === 64) {
270
- const stat = env.fs?.stat(env.typescript.fileNameToUri(dirName + '/' + name));
271
+ const stat = env.fs?.stat(uriConverter.asUri(dirName + '/' + name));
271
272
  if (typeof stat === 'object' && 'then' in stat) {
272
273
  const promise = stat;
273
274
  promises.add(promise);
@@ -1,3 +1,3 @@
1
- import type * as ts from 'typescript';
2
1
  import { LanguagePlugin } from '@volar/language-core';
3
- export declare function createAsyncLanguageServicePlugin(extensions: string[], scriptKind: ts.ScriptKind, loadLanguagePlugins: (ts: typeof import('typescript'), info: ts.server.PluginCreateInfo) => Promise<LanguagePlugin[]>): ts.server.PluginModuleFactory;
2
+ import type * as ts from 'typescript';
3
+ export declare function createAsyncLanguageServicePlugin(extensions: string[], scriptKind: ts.ScriptKind, loadLanguagePlugins: (ts: typeof import('typescript'), info: ts.server.PluginCreateInfo) => Promise<LanguagePlugin<string>[]>): ts.server.PluginModuleFactory;
@@ -1,11 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createAsyncLanguageServicePlugin = void 0;
4
+ const language_core_1 = require("@volar/language-core");
5
+ const common_1 = require("../common");
4
6
  const decorateLanguageService_1 = require("../node/decorateLanguageService");
5
7
  const decorateLanguageServiceHost_1 = require("../node/decorateLanguageServiceHost");
6
- const language_core_1 = require("@volar/language-core");
7
8
  const createLanguageServicePlugin_1 = require("./createLanguageServicePlugin");
8
- const common_1 = require("../common");
9
9
  const externalFiles = new WeakMap();
10
10
  const decoratedLanguageServices = new WeakSet();
11
11
  const decoratedLanguageServiceHosts = new WeakSet();
@@ -56,8 +56,12 @@ function createAsyncLanguageServicePlugin(extensions, scriptKind, loadLanguagePl
56
56
  const syncedScriptVersions = new language_core_1.FileMap(ts.sys.useCaseSensitiveFileNames);
57
57
  const language = (0, language_core_1.createLanguage)([
58
58
  ...languagePlugins,
59
- common_1.fileLanguageIdProviderPlugin,
60
- ], ts.sys.useCaseSensitiveFileNames, fileName => {
59
+ {
60
+ getLanguageId(fileName) {
61
+ return (0, common_1.resolveFileLanguageId)(fileName);
62
+ },
63
+ },
64
+ ], new language_core_1.FileMap(ts.sys.useCaseSensitiveFileNames), fileName => {
61
65
  const version = getScriptVersion(fileName);
62
66
  if (syncedScriptVersions.get(fileName) === version) {
63
67
  return;
@@ -1,4 +1,4 @@
1
- import type * as ts from 'typescript';
2
1
  import { LanguagePlugin } from '@volar/language-core';
3
- export declare function createLanguageServicePlugin(loadLanguagePlugins: (ts: typeof import('typescript'), info: ts.server.PluginCreateInfo) => LanguagePlugin[]): ts.server.PluginModuleFactory;
2
+ import type * as ts from 'typescript';
3
+ export declare function createLanguageServicePlugin(loadLanguagePlugins: (ts: typeof import('typescript'), info: ts.server.PluginCreateInfo) => LanguagePlugin<string>[]): ts.server.PluginModuleFactory;
4
4
  export declare function arrayItemsEqual(a: string[], b: string[]): boolean;
@@ -1,10 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.arrayItemsEqual = exports.createLanguageServicePlugin = void 0;
4
- const decorateLanguageService_1 = require("../node/decorateLanguageService");
5
- const decorateLanguageServiceHost_1 = require("../node/decorateLanguageServiceHost");
6
4
  const language_core_1 = require("@volar/language-core");
7
5
  const common_1 = require("../common");
6
+ const decorateLanguageService_1 = require("../node/decorateLanguageService");
7
+ const decorateLanguageServiceHost_1 = require("../node/decorateLanguageServiceHost");
8
8
  const externalFiles = new WeakMap();
9
9
  const projectExternalFileExtensions = new WeakMap();
10
10
  const decoratedLanguageServices = new WeakSet();
@@ -28,8 +28,12 @@ function createLanguageServicePlugin(loadLanguagePlugins) {
28
28
  const syncedScriptVersions = new language_core_1.FileMap(ts.sys.useCaseSensitiveFileNames);
29
29
  const language = (0, language_core_1.createLanguage)([
30
30
  ...languagePlugins,
31
- common_1.fileLanguageIdProviderPlugin,
32
- ], ts.sys.useCaseSensitiveFileNames, fileName => {
31
+ {
32
+ getLanguageId(fileName) {
33
+ return (0, common_1.resolveFileLanguageId)(fileName);
34
+ },
35
+ },
36
+ ], new language_core_1.FileMap(ts.sys.useCaseSensitiveFileNames), fileName => {
33
37
  const version = getScriptVersion(fileName);
34
38
  if (syncedScriptVersions.get(fileName) === version) {
35
39
  return;
@@ -1,4 +1,4 @@
1
1
  import type * as ts from 'typescript';
2
2
  import type { LanguagePlugin } from '@volar/language-core';
3
- export declare let getLanguagePlugins: (ts: typeof import('typescript'), options: ts.CreateProgramOptions) => LanguagePlugin[];
3
+ export declare let getLanguagePlugins: (ts: typeof import('typescript'), options: ts.CreateProgramOptions) => LanguagePlugin<string>[];
4
4
  export declare function runTsc(tscPath: string, extensions: string[], _getLanguagePlugins: typeof getLanguagePlugins): void;
@@ -1,3 +1,3 @@
1
1
  import type { LanguagePlugin, SourceScript } from '@volar/language-core';
2
2
  import type * as ts from 'typescript';
3
- export declare function createResolveModuleName(ts: typeof import('typescript'), host: ts.ModuleResolutionHost, languagePlugins: LanguagePlugin<any>[], getSourceScript: (fileName: string) => SourceScript | undefined): (moduleName: string, containingFile: string, compilerOptions: ts.CompilerOptions, cache?: ts.ModuleResolutionCache, redirectedReference?: ts.ResolvedProjectReference, resolutionMode?: ts.ResolutionMode) => ts.ResolvedModuleWithFailedLookupLocations;
3
+ export declare function createResolveModuleName<T>(ts: typeof import('typescript'), host: ts.ModuleResolutionHost, languagePlugins: LanguagePlugin<any>[], getSourceScript: (fileName: string) => SourceScript<T> | undefined): (moduleName: string, containingFile: string, compilerOptions: ts.CompilerOptions, cache?: ts.ModuleResolutionCache, redirectedReference?: ts.ResolvedProjectReference, resolutionMode?: ts.ResolutionMode) => ts.ResolvedModuleWithFailedLookupLocations;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@volar/typescript",
3
- "version": "2.2.4",
3
+ "version": "2.3.0-alpha.0",
4
4
  "license": "MIT",
5
5
  "files": [
6
6
  "**/*.js",
@@ -12,13 +12,14 @@
12
12
  "directory": "packages/typescript"
13
13
  },
14
14
  "dependencies": {
15
- "@volar/language-core": "2.2.4",
16
- "path-browserify": "^1.0.1"
15
+ "@volar/language-core": "2.3.0-alpha.0",
16
+ "path-browserify": "^1.0.1",
17
+ "vscode-uri": "^3.0.8"
17
18
  },
18
19
  "devDependencies": {
19
20
  "@types/node": "latest",
20
21
  "@types/path-browserify": "latest",
21
- "@volar/language-service": "2.2.4"
22
+ "@volar/language-service": "2.3.0-alpha.0"
22
23
  },
23
- "gitHead": "71a58c8b9c3a3e420b95df9ffb4a50be37cb31bc"
24
+ "gitHead": "f17c19f712651acde33cc2171a112e64db0b460e"
24
25
  }