@volar/typescript 2.2.0-alpha.2 → 2.2.0-alpha.4

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.
@@ -4,7 +4,7 @@ exports.searchExternalFiles = exports.decorateLanguageServiceHost = void 0;
4
4
  const resolveModuleName_1 = require("../resolveModuleName");
5
5
  function decorateLanguageServiceHost(ts, language, languageServiceHost, getLanguageId) {
6
6
  let extraProjectVersion = 0;
7
- const exts = language.plugins
7
+ const extensions = language.plugins
8
8
  .map(plugin => plugin.typescript?.extraFileExtensions.map(ext => '.' + ext.extension) ?? [])
9
9
  .flat();
10
10
  const scripts = new Map();
@@ -18,7 +18,7 @@ function decorateLanguageServiceHost(ts, language, languageServiceHost, getLangu
18
18
  if (readDirectory) {
19
19
  languageServiceHost.readDirectory = (path, extensions, exclude, include, depth) => {
20
20
  if (extensions) {
21
- for (const ext of exts) {
21
+ for (const ext of extensions) {
22
22
  if (!extensions.includes(ext)) {
23
23
  extensions = [...extensions, ...ext];
24
24
  }
@@ -27,25 +27,29 @@ function decorateLanguageServiceHost(ts, language, languageServiceHost, getLangu
27
27
  return readDirectory(path, extensions, exclude, include, depth);
28
28
  };
29
29
  }
30
- if (language.plugins.some(language => language.typescript?.extraFileExtensions.length)) {
30
+ if (extensions.length) {
31
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());
32
36
  if (resolveModuleNameLiterals) {
33
37
  languageServiceHost.resolveModuleNameLiterals = (moduleLiterals, containingFile, redirectedReference, options, ...rest) => {
34
- if (moduleLiterals.every(name => !exts.some(ext => name.text.endsWith(ext)))) {
38
+ if (moduleLiterals.every(name => !extensions.some(ext => name.text.endsWith(ext)))) {
35
39
  return resolveModuleNameLiterals(moduleLiterals, containingFile, redirectedReference, options, ...rest);
36
40
  }
37
41
  return moduleLiterals.map(moduleLiteral => {
38
- return resolveModuleName(moduleLiteral.text, containingFile, options, undefined, redirectedReference);
42
+ return resolveModuleName(moduleLiteral.text, containingFile, options, moduleResolutionCache, redirectedReference);
39
43
  });
40
44
  };
41
45
  }
42
46
  if (resolveModuleNames) {
43
47
  languageServiceHost.resolveModuleNames = (moduleNames, containingFile, reusedNames, redirectedReference, options, containingSourceFile) => {
44
- if (moduleNames.every(name => !exts.some(ext => name.endsWith(ext)))) {
48
+ if (moduleNames.every(name => !extensions.some(ext => name.endsWith(ext)))) {
45
49
  return resolveModuleNames(moduleNames, containingFile, reusedNames, redirectedReference, options, containingSourceFile);
46
50
  }
47
51
  return moduleNames.map(moduleName => {
48
- return resolveModuleName(moduleName, containingFile, options, undefined, redirectedReference).resolvedModule;
52
+ return resolveModuleName(moduleName, containingFile, options, moduleResolutionCache, redirectedReference).resolvedModule;
49
53
  });
50
54
  };
51
55
  }
@@ -3,6 +3,7 @@ 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
+ const resolveModuleName_1 = require("../resolveModuleName");
6
7
  function proxyCreateProgram(ts, original, getLanguagePlugins, getLanguageId) {
7
8
  return new Proxy(original, {
8
9
  apply: (target, thisArg, args) => {
@@ -15,8 +16,7 @@ function proxyCreateProgram(ts, original, getLanguagePlugins, getLanguageId) {
15
16
  const sourceFileToSnapshotMap = new WeakMap();
16
17
  const language = (0, language_core_1.createLanguage)(languagePlugins, ts.sys.useCaseSensitiveFileNames, fileName => {
17
18
  let snapshot;
18
- assert(originalSourceFiles.has(fileName), `originalSourceFiles.has(${fileName})`);
19
- const sourceFile = originalSourceFiles.get(fileName);
19
+ const sourceFile = originalHost.getSourceFile(fileName, 99);
20
20
  if (sourceFile) {
21
21
  snapshot = sourceFileToSnapshotMap.get(sourceFile);
22
22
  if (!snapshot) {
@@ -41,26 +41,11 @@ function proxyCreateProgram(ts, original, getLanguagePlugins, getLanguageId) {
41
41
  language.scripts.delete(fileName);
42
42
  }
43
43
  });
44
- const originalSourceFiles = new Map();
45
44
  const parsedSourceFiles = new WeakMap();
46
- const arbitraryExtensions = extensions.map(ext => `.d${ext}.ts`);
47
45
  const originalHost = options.host;
48
- const moduleResolutionHost = {
49
- ...originalHost,
50
- fileExists(fileName) {
51
- for (let i = 0; i < arbitraryExtensions.length; i++) {
52
- if (fileName.endsWith(arbitraryExtensions[i])) {
53
- return originalHost.fileExists(fileName.slice(0, -arbitraryExtensions[i].length) + extensions[i]);
54
- }
55
- }
56
- return originalHost.fileExists(fileName);
57
- },
58
- };
59
46
  options.host = { ...originalHost };
60
- options.options.allowArbitraryExtensions = true;
61
47
  options.host.getSourceFile = (fileName, languageVersionOrOptions, onError, shouldCreateNewSourceFile) => {
62
48
  const originalSourceFile = originalHost.getSourceFile(fileName, languageVersionOrOptions, onError, shouldCreateNewSourceFile);
63
- originalSourceFiles.set(fileName, originalSourceFile);
64
49
  if (originalSourceFile && extensions.some(ext => fileName.endsWith(ext))) {
65
50
  let sourceFile2 = parsedSourceFiles.get(originalSourceFile);
66
51
  if (!sourceFile2) {
@@ -69,14 +54,14 @@ function proxyCreateProgram(ts, original, getLanguagePlugins, getLanguageId) {
69
54
  let patchedText = originalSourceFile.text.split('\n').map(line => ' '.repeat(line.length)).join('\n');
70
55
  let scriptKind = ts.ScriptKind.TS;
71
56
  if (sourceScript.generated?.languagePlugin.typescript) {
72
- const { getServiceScript: getScript, getExtraServiceScripts: getExtraScripts } = sourceScript.generated.languagePlugin.typescript;
73
- const serviceScript = getScript(sourceScript.generated.root);
57
+ const { getServiceScript, getExtraServiceScripts } = sourceScript.generated.languagePlugin.typescript;
58
+ const serviceScript = getServiceScript(sourceScript.generated.root);
74
59
  if (serviceScript) {
75
60
  scriptKind = serviceScript.scriptKind;
76
61
  patchedText += serviceScript.code.snapshot.getText(0, serviceScript.code.snapshot.getLength());
77
62
  }
78
- if (getExtraScripts) {
79
- console.warn('getExtraScripts() is not available in this use case.');
63
+ if (getExtraServiceScripts) {
64
+ console.warn('getExtraServiceScripts() is not available in this use case.');
80
65
  }
81
66
  }
82
67
  sourceFile2 = ts.createSourceFile(fileName, patchedText, 99, true, scriptKind);
@@ -88,34 +73,34 @@ function proxyCreateProgram(ts, original, getLanguagePlugins, getLanguageId) {
88
73
  }
89
74
  return originalSourceFile;
90
75
  };
91
- options.host.resolveModuleNameLiterals = (moduleNames, containingFile, redirectedReference, options) => {
92
- return moduleNames.map(name => {
93
- return resolveModuleName(name.text, containingFile, options, redirectedReference);
94
- });
95
- };
96
- options.host.resolveModuleNames = (moduleNames, containingFile, _reusedNames, redirectedReference, options) => {
97
- return moduleNames.map(name => {
98
- return resolveModuleName(name, containingFile, options, redirectedReference).resolvedModule;
99
- });
100
- };
101
- 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);
102
100
  (0, decorateProgram_1.decorateProgram)(language, program);
103
101
  // TODO: #128
104
102
  program.__volar__ = { language };
105
103
  return program;
106
- function resolveModuleName(name, containingFile, options, redirectedReference) {
107
- const resolved = ts.resolveModuleName(name, containingFile, options, moduleResolutionHost, originalHost.getModuleResolutionCache?.(), redirectedReference);
108
- if (resolved.resolvedModule) {
109
- for (let i = 0; i < arbitraryExtensions.length; i++) {
110
- if (resolved.resolvedModule.resolvedFileName.endsWith(arbitraryExtensions[i])) {
111
- const sourceFileName = resolved.resolvedModule.resolvedFileName.slice(0, -arbitraryExtensions[i].length) + extensions[i];
112
- resolved.resolvedModule.resolvedFileName = sourceFileName;
113
- resolved.resolvedModule.extension = extensions[i];
114
- }
115
- }
116
- }
117
- return resolved;
118
- }
119
104
  },
120
105
  });
121
106
  }
@@ -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 { 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.2",
3
+ "version": "2.2.0-alpha.4",
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.2",
15
+ "@volar/language-core": "2.2.0-alpha.4",
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.2"
21
+ "@volar/language-service": "2.2.0-alpha.4"
22
22
  },
23
- "gitHead": "c6a538c915cc8b32ad9a7ca1092a29a326d49161"
23
+ "gitHead": "bd85b9c56d71c411fa3342696014c4b5f7436568"
24
24
  }