@volar/typescript 2.2.0-alpha.1 → 2.2.0-alpha.3

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,4 +1,4 @@
1
- import { type Language } from '@volar/language-core';
1
+ import type { Language } from '@volar/language-core';
2
2
  import type * as ts from 'typescript';
3
- export declare function decorateLanguageServiceHost(language: Language, languageServiceHost: ts.LanguageServiceHost, ts: typeof import('typescript')): void;
3
+ export declare function decorateLanguageServiceHost(ts: typeof import('typescript'), language: Language, languageServiceHost: ts.LanguageServiceHost, getLanguageId: (fileName: string) => string): void;
4
4
  export declare function searchExternalFiles(ts: typeof import('typescript'), project: ts.server.Project, exts: string[]): string[];
@@ -1,11 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.searchExternalFiles = exports.decorateLanguageServiceHost = void 0;
4
- const language_core_1 = require("@volar/language-core");
5
4
  const resolveModuleName_1 = require("../resolveModuleName");
6
- function decorateLanguageServiceHost(language, languageServiceHost, ts) {
5
+ function decorateLanguageServiceHost(ts, language, languageServiceHost, getLanguageId) {
7
6
  let extraProjectVersion = 0;
8
- const exts = language.plugins
7
+ const extensions = language.plugins
9
8
  .map(plugin => plugin.typescript?.extraFileExtensions.map(ext => '.' + ext.extension) ?? [])
10
9
  .flat();
11
10
  const scripts = new Map();
@@ -19,7 +18,7 @@ function decorateLanguageServiceHost(language, languageServiceHost, ts) {
19
18
  if (readDirectory) {
20
19
  languageServiceHost.readDirectory = (path, extensions, exclude, include, depth) => {
21
20
  if (extensions) {
22
- for (const ext of exts) {
21
+ for (const ext of extensions) {
23
22
  if (!extensions.includes(ext)) {
24
23
  extensions = [...extensions, ...ext];
25
24
  }
@@ -28,25 +27,29 @@ function decorateLanguageServiceHost(language, languageServiceHost, ts) {
28
27
  return readDirectory(path, extensions, exclude, include, depth);
29
28
  };
30
29
  }
31
- if (language.plugins.some(language => language.typescript?.extraFileExtensions.length)) {
30
+ if (extensions.length) {
32
31
  const resolveModuleName = (0, resolveModuleName_1.createResolveModuleName)(ts, languageServiceHost, language.plugins, fileName => language.scripts.get(fileName));
32
+ const getCanonicalFileName = languageServiceHost.useCaseSensitiveFileNames?.()
33
+ ? (fileName) => fileName
34
+ : (fileName) => fileName.toLowerCase();
35
+ const moduleResolutionCache = ts.createModuleResolutionCache(languageServiceHost.getCurrentDirectory(), getCanonicalFileName, languageServiceHost.getCompilationSettings());
33
36
  if (resolveModuleNameLiterals) {
34
37
  languageServiceHost.resolveModuleNameLiterals = (moduleLiterals, containingFile, redirectedReference, options, ...rest) => {
35
- if (moduleLiterals.every(name => !exts.some(ext => name.text.endsWith(ext)))) {
38
+ if (moduleLiterals.every(name => !extensions.some(ext => name.text.endsWith(ext)))) {
36
39
  return resolveModuleNameLiterals(moduleLiterals, containingFile, redirectedReference, options, ...rest);
37
40
  }
38
41
  return moduleLiterals.map(moduleLiteral => {
39
- return resolveModuleName(moduleLiteral.text, containingFile, options, undefined, redirectedReference);
42
+ return resolveModuleName(moduleLiteral.text, containingFile, options, moduleResolutionCache, redirectedReference);
40
43
  });
41
44
  };
42
45
  }
43
46
  if (resolveModuleNames) {
44
47
  languageServiceHost.resolveModuleNames = (moduleNames, containingFile, reusedNames, redirectedReference, options, containingSourceFile) => {
45
- if (moduleNames.every(name => !exts.some(ext => name.endsWith(ext)))) {
48
+ if (moduleNames.every(name => !extensions.some(ext => name.endsWith(ext)))) {
46
49
  return resolveModuleNames(moduleNames, containingFile, reusedNames, redirectedReference, options, containingSourceFile);
47
50
  }
48
51
  return moduleNames.map(moduleName => {
49
- return resolveModuleName(moduleName, containingFile, options, undefined, redirectedReference).resolvedModule;
52
+ return resolveModuleName(moduleName, containingFile, options, moduleResolutionCache, redirectedReference).resolvedModule;
50
53
  });
51
54
  };
52
55
  }
@@ -81,7 +84,7 @@ function decorateLanguageServiceHost(language, languageServiceHost, ts) {
81
84
  const snapshot = getScriptSnapshot(fileName);
82
85
  if (snapshot) {
83
86
  extraProjectVersion++;
84
- const sourceScript = language.scripts.set(fileName, (0, language_core_1.resolveCommonLanguageId)(fileName), snapshot);
87
+ const sourceScript = language.scripts.set(fileName, getLanguageId(fileName), snapshot);
85
88
  if (sourceScript.generated) {
86
89
  const text = snapshot.getText(0, snapshot.getLength());
87
90
  let patchedText = text.split('\n').map(line => ' '.repeat(line.length)).join('\n');
@@ -1,3 +1,3 @@
1
1
  import type * as ts from 'typescript';
2
2
  import { LanguagePlugin } from '@volar/language-core';
3
- export declare function proxyCreateProgram(ts: typeof import('typescript'), original: typeof ts['createProgram'], extensions: string[], 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[], getLanguageId: (fileName: string) => string): typeof import("typescript").createProgram;
@@ -3,16 +3,20 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.proxyCreateProgram = void 0;
4
4
  const decorateProgram_1 = require("./decorateProgram");
5
5
  const language_core_1 = require("@volar/language-core");
6
- function proxyCreateProgram(ts, original, extensions, getLanguagePlugins) {
6
+ const resolveModuleName_1 = require("../resolveModuleName");
7
+ function proxyCreateProgram(ts, original, getLanguagePlugins, getLanguageId) {
7
8
  return new Proxy(original, {
8
9
  apply: (target, thisArg, args) => {
9
10
  const options = args[0];
10
11
  assert(!!options.host, '!!options.host');
12
+ const languagePlugins = getLanguagePlugins(ts, options);
13
+ const extensions = languagePlugins
14
+ .map(plugin => plugin.typescript?.extraFileExtensions.map(({ extension }) => `.${extension}`) ?? [])
15
+ .flat();
11
16
  const sourceFileToSnapshotMap = new WeakMap();
12
- const language = (0, language_core_1.createLanguage)(getLanguagePlugins(ts, options), ts.sys.useCaseSensitiveFileNames, fileName => {
17
+ const language = (0, language_core_1.createLanguage)(languagePlugins, ts.sys.useCaseSensitiveFileNames, fileName => {
13
18
  let snapshot;
14
- assert(originalSourceFiles.has(fileName), `originalSourceFiles.has(${fileName})`);
15
- const sourceFile = originalSourceFiles.get(fileName);
19
+ const sourceFile = originalHost.getSourceFile(fileName, 99);
16
20
  if (sourceFile) {
17
21
  snapshot = sourceFileToSnapshotMap.get(sourceFile);
18
22
  if (!snapshot) {
@@ -31,32 +35,17 @@ function proxyCreateProgram(ts, original, extensions, getLanguagePlugins) {
31
35
  }
32
36
  }
33
37
  if (snapshot) {
34
- language.scripts.set(fileName, (0, language_core_1.resolveCommonLanguageId)(fileName), snapshot);
38
+ language.scripts.set(fileName, getLanguageId(fileName), snapshot);
35
39
  }
36
40
  else {
37
41
  language.scripts.delete(fileName);
38
42
  }
39
43
  });
40
- const originalSourceFiles = new Map();
41
44
  const parsedSourceFiles = new WeakMap();
42
- const arbitraryExtensions = extensions.map(ext => `.d${ext}.ts`);
43
45
  const originalHost = options.host;
44
- const moduleResolutionHost = {
45
- ...originalHost,
46
- fileExists(fileName) {
47
- for (let i = 0; i < arbitraryExtensions.length; i++) {
48
- if (fileName.endsWith(arbitraryExtensions[i])) {
49
- return originalHost.fileExists(fileName.slice(0, -arbitraryExtensions[i].length) + extensions[i]);
50
- }
51
- }
52
- return originalHost.fileExists(fileName);
53
- },
54
- };
55
46
  options.host = { ...originalHost };
56
- options.options.allowArbitraryExtensions = true;
57
47
  options.host.getSourceFile = (fileName, languageVersionOrOptions, onError, shouldCreateNewSourceFile) => {
58
48
  const originalSourceFile = originalHost.getSourceFile(fileName, languageVersionOrOptions, onError, shouldCreateNewSourceFile);
59
- originalSourceFiles.set(fileName, originalSourceFile);
60
49
  if (originalSourceFile && extensions.some(ext => fileName.endsWith(ext))) {
61
50
  let sourceFile2 = parsedSourceFiles.get(originalSourceFile);
62
51
  if (!sourceFile2) {
@@ -65,14 +54,14 @@ function proxyCreateProgram(ts, original, extensions, getLanguagePlugins) {
65
54
  let patchedText = originalSourceFile.text.split('\n').map(line => ' '.repeat(line.length)).join('\n');
66
55
  let scriptKind = ts.ScriptKind.TS;
67
56
  if (sourceScript.generated?.languagePlugin.typescript) {
68
- const { getServiceScript: getScript, getExtraServiceScripts: getExtraScripts } = sourceScript.generated.languagePlugin.typescript;
69
- const serviceScript = getScript(sourceScript.generated.root);
57
+ const { getServiceScript, getExtraServiceScripts } = sourceScript.generated.languagePlugin.typescript;
58
+ const serviceScript = getServiceScript(sourceScript.generated.root);
70
59
  if (serviceScript) {
71
60
  scriptKind = serviceScript.scriptKind;
72
61
  patchedText += serviceScript.code.snapshot.getText(0, serviceScript.code.snapshot.getLength());
73
62
  }
74
- if (getExtraScripts) {
75
- console.warn('getExtraScripts() is not available in this use case.');
63
+ if (getExtraServiceScripts) {
64
+ console.warn('getExtraServiceScripts() is not available in this use case.');
76
65
  }
77
66
  }
78
67
  sourceFile2 = ts.createSourceFile(fileName, patchedText, 99, true, scriptKind);
@@ -84,34 +73,34 @@ function proxyCreateProgram(ts, original, extensions, getLanguagePlugins) {
84
73
  }
85
74
  return originalSourceFile;
86
75
  };
87
- options.host.resolveModuleNameLiterals = (moduleNames, containingFile, redirectedReference, options) => {
88
- return moduleNames.map(name => {
89
- return resolveModuleName(name.text, containingFile, options, redirectedReference);
90
- });
91
- };
92
- options.host.resolveModuleNames = (moduleNames, containingFile, _reusedNames, redirectedReference, options) => {
93
- return moduleNames.map(name => {
94
- return resolveModuleName(name, containingFile, options, redirectedReference).resolvedModule;
95
- });
96
- };
97
- const program = Reflect.apply(target, thisArg, [options]);
76
+ if (extensions.length) {
77
+ options.options.allowArbitraryExtensions = true;
78
+ const resolveModuleName = (0, resolveModuleName_1.createResolveModuleName)(ts, originalHost, language.plugins, fileName => language.scripts.get(fileName));
79
+ const resolveModuleNameLiterals = originalHost.resolveModuleNameLiterals;
80
+ const resolveModuleNames = originalHost.resolveModuleNames;
81
+ const moduleResolutionCache = ts.createModuleResolutionCache(originalHost.getCurrentDirectory(), originalHost.getCanonicalFileName, options.options);
82
+ options.host.resolveModuleNameLiterals = (moduleLiterals, containingFile, redirectedReference, compilerOptions, ...rest) => {
83
+ if (resolveModuleNameLiterals && moduleLiterals.every(name => !extensions.some(ext => name.text.endsWith(ext)))) {
84
+ return resolveModuleNameLiterals(moduleLiterals, containingFile, redirectedReference, compilerOptions, ...rest);
85
+ }
86
+ return moduleLiterals.map(moduleLiteral => {
87
+ return resolveModuleName(moduleLiteral.text, containingFile, compilerOptions, moduleResolutionCache, redirectedReference);
88
+ });
89
+ };
90
+ options.host.resolveModuleNames = (moduleNames, containingFile, reusedNames, redirectedReference, compilerOptions, containingSourceFile) => {
91
+ if (resolveModuleNames && moduleNames.every(name => !extensions.some(ext => name.endsWith(ext)))) {
92
+ return resolveModuleNames(moduleNames, containingFile, reusedNames, redirectedReference, compilerOptions, containingSourceFile);
93
+ }
94
+ return moduleNames.map(moduleName => {
95
+ return resolveModuleName(moduleName, containingFile, compilerOptions, moduleResolutionCache, redirectedReference).resolvedModule;
96
+ });
97
+ };
98
+ }
99
+ const program = Reflect.apply(target, thisArg, args);
98
100
  (0, decorateProgram_1.decorateProgram)(language, program);
99
101
  // TODO: #128
100
- program.__volar__ = { files: language };
102
+ program.__volar__ = { language };
101
103
  return program;
102
- function resolveModuleName(name, containingFile, options, redirectedReference) {
103
- const resolved = ts.resolveModuleName(name, containingFile, options, moduleResolutionHost, originalHost.getModuleResolutionCache?.(), redirectedReference);
104
- if (resolved.resolvedModule) {
105
- for (let i = 0; i < arbitraryExtensions.length; i++) {
106
- if (resolved.resolvedModule.resolvedFileName.endsWith(arbitraryExtensions[i])) {
107
- const sourceFileName = resolved.resolvedModule.resolvedFileName.slice(0, -arbitraryExtensions[i].length) + extensions[i];
108
- resolved.resolvedModule.resolvedFileName = sourceFileName;
109
- resolved.resolvedModule.extension = extensions[i];
110
- }
111
- }
112
- }
113
- return resolved;
114
- }
115
104
  },
116
105
  });
117
106
  }
@@ -2,6 +2,7 @@ import { Language, CodeInformation, SourceMap, SourceScript } from '@volar/langu
2
2
  import type * as ts from 'typescript';
3
3
  export declare function transformCallHierarchyItem(language: Language, item: ts.CallHierarchyItem, filter: (data: CodeInformation) => boolean): ts.CallHierarchyItem;
4
4
  export declare function transformDiagnostic<T extends ts.Diagnostic>(language: Language, diagnostic: T): T | undefined;
5
+ export declare function transformSourceFile(sourceFile: ts.SourceFile, sourceText: string): ts.SourceFile;
5
6
  export declare function transformFileTextChanges(language: Language, changes: ts.FileTextChanges, filter: (data: CodeInformation) => boolean): ts.FileTextChanges | undefined;
6
7
  export declare function transformDocumentSpan<T extends ts.DocumentSpan>(language: Language, documentSpan: T, filter: (data: CodeInformation) => boolean, shouldFallback?: boolean): T | undefined;
7
8
  export declare function transformSpan(language: Language, fileName: string | undefined, textSpan: ts.TextSpan | undefined, filter: (data: CodeInformation) => boolean): {
@@ -1,9 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.toGeneratedOffset = exports.toSourceOffset = exports.transformTextSpan = exports.transformTextChange = exports.transformSpan = exports.transformDocumentSpan = exports.transformFileTextChanges = exports.transformDiagnostic = exports.transformCallHierarchyItem = void 0;
3
+ exports.toGeneratedOffset = exports.toSourceOffset = exports.transformTextSpan = exports.transformTextChange = exports.transformSpan = exports.transformDocumentSpan = exports.transformFileTextChanges = exports.transformSourceFile = exports.transformDiagnostic = exports.transformCallHierarchyItem = void 0;
4
4
  const language_core_1 = require("@volar/language-core");
5
5
  const utils_1 = require("./utils");
6
6
  const transformedDiagnostics = new WeakMap();
7
+ const transformedSourceFiles = new WeakMap();
7
8
  function transformCallHierarchyItem(language, item, filter) {
8
9
  const span = transformSpan(language, item.file, item.span, filter);
9
10
  const selectionSpan = transformSpan(language, item.file, item.selectionSpan, filter);
@@ -34,6 +35,7 @@ function transformDiagnostic(language, diagnostic) {
34
35
  ...diagnostic,
35
36
  start: sourceSpan.start,
36
37
  length: sourceSpan.length,
38
+ file: transformSourceFile(diagnostic.file, sourceScript.snapshot.getText(0, sourceScript.snapshot.getLength())),
37
39
  });
38
40
  }
39
41
  }
@@ -48,6 +50,16 @@ function transformDiagnostic(language, diagnostic) {
48
50
  return transformedDiagnostics.get(diagnostic);
49
51
  }
50
52
  exports.transformDiagnostic = transformDiagnostic;
53
+ function transformSourceFile(sourceFile, sourceText) {
54
+ if (!transformedSourceFiles.has(sourceFile)) {
55
+ transformedSourceFiles.set(sourceFile, {
56
+ ...sourceFile,
57
+ text: sourceText,
58
+ });
59
+ }
60
+ return transformedSourceFiles.get(sourceFile);
61
+ }
62
+ exports.transformSourceFile = transformSourceFile;
51
63
  function transformFileTextChanges(language, changes, filter) {
52
64
  const [_, source] = (0, utils_1.getServiceScript)(language, changes.fileName);
53
65
  if (source) {
@@ -43,7 +43,7 @@ function createTypeScriptLanguage(ts, languagePlugins, projectHost) {
43
43
  }
44
44
  if (languagePlugins.some(language => language.typescript?.extraFileExtensions.length)) {
45
45
  // TODO: can this share between monorepo packages?
46
- const moduleCache = ts.createModuleResolutionCache(languageServiceHost.getCurrentDirectory(), languageServiceHost.useCaseSensitiveFileNames ? s => s : s => s.toLowerCase(), languageServiceHost.getCompilationSettings());
46
+ const moduleCache = ts.createModuleResolutionCache(languageServiceHost.getCurrentDirectory(), languageServiceHost.useCaseSensitiveFileNames?.() ? s => s : s => s.toLowerCase(), languageServiceHost.getCompilationSettings());
47
47
  const resolveModuleName = (0, resolveModuleName_1.createResolveModuleName)(ts, languageServiceHost, languagePlugins, fileName => language.scripts.get(projectHost.fileNameToScriptId(fileName)));
48
48
  let lastSysVersion = projectHost.getSystemVersion?.();
49
49
  languageServiceHost.resolveModuleNameLiterals = (moduleLiterals, containingFile, redirectedReference, options, sourceFile) => {
@@ -1,3 +1,3 @@
1
1
  import type * as ts from 'typescript';
2
2
  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;
3
+ export declare function createAsyncLanguageServicePlugin(extensions: string[], scriptKind: ts.ScriptKind, loadLanguagePlugins: (ts: typeof import('typescript'), info: ts.server.PluginCreateInfo) => Promise<LanguagePlugin[]>, getLanguageId: (fileName: string) => string): ts.server.PluginModuleFactory;
@@ -8,7 +8,7 @@ const createLanguageServicePlugin_1 = require("./createLanguageServicePlugin");
8
8
  const externalFiles = new WeakMap();
9
9
  const decoratedLanguageServices = new WeakSet();
10
10
  const decoratedLanguageServiceHosts = new WeakSet();
11
- function createAsyncLanguageServicePlugin(extensions, scriptKind, loadLanguagePlugins) {
11
+ function createAsyncLanguageServicePlugin(extensions, scriptKind, loadLanguagePlugins, getLanguageId) {
12
12
  return modules => {
13
13
  const { typescript: ts } = modules;
14
14
  const pluginModule = {
@@ -55,14 +55,14 @@ function createAsyncLanguageServicePlugin(extensions, scriptKind, loadLanguagePl
55
55
  const language = (0, language_core_1.createLanguage)(languagePlugins, ts.sys.useCaseSensitiveFileNames, fileName => {
56
56
  const snapshot = getScriptSnapshot(fileName);
57
57
  if (snapshot) {
58
- language.scripts.set(fileName, (0, language_core_1.resolveCommonLanguageId)(fileName), snapshot);
58
+ language.scripts.set(fileName, getLanguageId(fileName), snapshot);
59
59
  }
60
60
  else {
61
61
  language.scripts.delete(fileName);
62
62
  }
63
63
  });
64
64
  (0, decorateLanguageService_1.decorateLanguageService)(language, info.languageService);
65
- (0, decorateLanguageServiceHost_1.decorateLanguageServiceHost)(language, info.languageServiceHost, ts);
65
+ (0, decorateLanguageServiceHost_1.decorateLanguageServiceHost)(ts, language, info.languageServiceHost, getLanguageId);
66
66
  info.project.markAsDirty();
67
67
  initialized = true;
68
68
  });
@@ -1,4 +1,4 @@
1
1
  import type * as ts from 'typescript';
2
2
  import { LanguagePlugin } from '@volar/language-core';
3
- export declare function createLanguageServicePlugin(loadLanguagePlugins: (ts: typeof import('typescript'), info: ts.server.PluginCreateInfo) => LanguagePlugin[]): ts.server.PluginModuleFactory;
3
+ export declare function createLanguageServicePlugin(loadLanguagePlugins: (ts: typeof import('typescript'), info: ts.server.PluginCreateInfo) => LanguagePlugin[], getLanguageId: (fileName: string) => string): ts.server.PluginModuleFactory;
4
4
  export declare function arrayItemsEqual(a: string[], b: string[]): boolean;
@@ -8,7 +8,7 @@ const externalFiles = new WeakMap();
8
8
  const projectExternalFileExtensions = new WeakMap();
9
9
  const decoratedLanguageServices = new WeakSet();
10
10
  const decoratedLanguageServiceHosts = new WeakSet();
11
- function createLanguageServicePlugin(loadLanguagePlugins) {
11
+ function createLanguageServicePlugin(loadLanguagePlugins, getLanguageId) {
12
12
  return modules => {
13
13
  const { typescript: ts } = modules;
14
14
  const pluginModule = {
@@ -26,14 +26,14 @@ function createLanguageServicePlugin(loadLanguagePlugins) {
26
26
  const language = (0, language_core_1.createLanguage)(languagePlugins, ts.sys.useCaseSensitiveFileNames, fileName => {
27
27
  const snapshot = getScriptSnapshot(fileName);
28
28
  if (snapshot) {
29
- language.scripts.set(fileName, (0, language_core_1.resolveCommonLanguageId)(fileName), snapshot);
29
+ language.scripts.set(fileName, getLanguageId(fileName), snapshot);
30
30
  }
31
31
  else {
32
32
  language.scripts.delete(fileName);
33
33
  }
34
34
  });
35
35
  (0, decorateLanguageService_1.decorateLanguageService)(language, info.languageService);
36
- (0, decorateLanguageServiceHost_1.decorateLanguageServiceHost)(language, info.languageServiceHost, ts);
36
+ (0, decorateLanguageServiceHost_1.decorateLanguageServiceHost)(ts, language, info.languageServiceHost, getLanguageId);
37
37
  }
38
38
  return info.languageService;
39
39
  },
@@ -1,4 +1,5 @@
1
1
  import type * as ts from 'typescript';
2
2
  import type { LanguagePlugin } from '@volar/language-core';
3
3
  export declare let getLanguagePlugins: (ts: typeof import('typescript'), options: ts.CreateProgramOptions) => LanguagePlugin[];
4
- export declare function runTsc(tscPath: string, extensions: string[], _getLanguagePlugins: typeof getLanguagePlugins): void;
4
+ export declare let getLanguageId: (fileName: string) => string;
5
+ export declare function runTsc(tscPath: string, extensions: string[], _getLanguagePlugins: typeof getLanguagePlugins, _getLanguageId: typeof getLanguageId): void;
@@ -1,11 +1,14 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.runTsc = exports.getLanguagePlugins = void 0;
3
+ exports.runTsc = exports.getLanguageId = exports.getLanguagePlugins = void 0;
4
4
  const fs = require("fs");
5
5
  let getLanguagePlugins = () => [];
6
6
  exports.getLanguagePlugins = getLanguagePlugins;
7
- function runTsc(tscPath, extensions, _getLanguagePlugins) {
7
+ let getLanguageId = () => 'ts';
8
+ exports.getLanguageId = getLanguageId;
9
+ function runTsc(tscPath, extensions, _getLanguagePlugins, _getLanguageId) {
8
10
  exports.getLanguagePlugins = _getLanguagePlugins;
11
+ exports.getLanguageId = _getLanguageId;
9
12
  const proxyApiPath = require.resolve('../node/proxyCreateProgram');
10
13
  const readFileSync = fs.readFileSync;
11
14
  fs.readFileSync = (...args) => {
@@ -18,10 +21,12 @@ function runTsc(tscPath, extensions, _getLanguagePlugins) {
18
21
  tsc = replace(tsc, /allSupportedExtensions = .*(?=;)/, s => s + `.concat([[${extsText}]])`);
19
22
  // proxy createProgram
20
23
  tsc = replace(tsc, /function createProgram\(.+\) {/, s => `var createProgram = require(${JSON.stringify(proxyApiPath)}).proxyCreateProgram(`
21
- + `new Proxy({}, { get(_target, p, _receiver) { return eval(p); } } ), `
22
- + `_createProgram, `
23
- + `[${extsText}], `
24
- + `require(${JSON.stringify(__filename)}).getLanguagePlugins`
24
+ + [
25
+ `new Proxy({}, { get(_target, p, _receiver) { return eval(p); } } )`,
26
+ `_createProgram`,
27
+ `require(${JSON.stringify(__filename)}).getLanguagePlugins`,
28
+ `require(${JSON.stringify(__filename)}).getLanguageId`,
29
+ ].join(', ')
25
30
  + `);\n`
26
31
  + s.replace('createProgram', '_createProgram'));
27
32
  return tsc;
@@ -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'), languageServiceHost: ts.LanguageServiceHost, 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(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;
@@ -1,15 +1,17 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createResolveModuleName = void 0;
4
- function createResolveModuleName(ts, languageServiceHost, languagePlugins, getSourceScript) {
4
+ function createResolveModuleName(ts, host, languagePlugins, getSourceScript) {
5
5
  const toPatchResults = new Map();
6
6
  const moduleResolutionHost = {
7
- readFile: languageServiceHost.readFile.bind(languageServiceHost),
8
- directoryExists: languageServiceHost.directoryExists?.bind(languageServiceHost),
9
- realpath: languageServiceHost.realpath?.bind(languageServiceHost),
10
- getCurrentDirectory: languageServiceHost.getCurrentDirectory.bind(languageServiceHost),
11
- getDirectories: languageServiceHost.getDirectories?.bind(languageServiceHost),
12
- useCaseSensitiveFileNames: languageServiceHost.useCaseSensitiveFileNames?.bind(languageServiceHost),
7
+ readFile: host.readFile.bind(host),
8
+ directoryExists: host.directoryExists?.bind(host),
9
+ realpath: host.realpath?.bind(host),
10
+ getCurrentDirectory: host.getCurrentDirectory?.bind(host),
11
+ getDirectories: host.getDirectories?.bind(host),
12
+ useCaseSensitiveFileNames: typeof host.useCaseSensitiveFileNames === 'function'
13
+ ? host.useCaseSensitiveFileNames.bind(host)
14
+ : host.useCaseSensitiveFileNames,
13
15
  fileExists(fileName) {
14
16
  for (const { typescript } of languagePlugins) {
15
17
  if (!typescript) {
@@ -25,7 +27,7 @@ function createResolveModuleName(ts, languageServiceHost, languagePlugins, getSo
25
27
  }
26
28
  }
27
29
  }
28
- return languageServiceHost.fileExists(fileName);
30
+ return host.fileExists(fileName);
29
31
  },
30
32
  };
31
33
  return (moduleName, containingFile, compilerOptions, cache, redirectedReference, resolutionMode) => {
@@ -45,8 +47,8 @@ function createResolveModuleName(ts, languageServiceHost, languagePlugins, getSo
45
47
  };
46
48
  // fix https://github.com/vuejs/language-tools/issues/3332
47
49
  function fileExists(fileName) {
48
- if (languageServiceHost.fileExists(fileName)) {
49
- const fileSize = ts.sys.getFileSize?.(fileName) ?? languageServiceHost.readFile(fileName)?.length ?? 0;
50
+ if (host.fileExists(fileName)) {
51
+ const fileSize = ts.sys.getFileSize?.(fileName) ?? host.readFile(fileName)?.length ?? 0;
50
52
  return fileSize < 4 * 1024 * 1024;
51
53
  }
52
54
  return false;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@volar/typescript",
3
- "version": "2.2.0-alpha.1",
3
+ "version": "2.2.0-alpha.3",
4
4
  "license": "MIT",
5
5
  "files": [
6
6
  "**/*.js",
@@ -12,13 +12,13 @@
12
12
  "directory": "packages/typescript"
13
13
  },
14
14
  "dependencies": {
15
- "@volar/language-core": "2.2.0-alpha.1",
15
+ "@volar/language-core": "2.2.0-alpha.3",
16
16
  "path-browserify": "^1.0.1"
17
17
  },
18
18
  "devDependencies": {
19
19
  "@types/node": "latest",
20
20
  "@types/path-browserify": "latest",
21
- "@volar/language-service": "2.2.0-alpha.1"
21
+ "@volar/language-service": "2.2.0-alpha.3"
22
22
  },
23
- "gitHead": "e6dcb83ecadcfcc9e22083eea61e1ee817a9d483"
23
+ "gitHead": "9f3432fabfbcdb2bdda6b7d015653706cfdf108d"
24
24
  }