From d1a3be4e26d59878b95809a8ded43736f0f86077 Mon Sep 17 00:00:00 2001 From: Simon Holthausen Date: Mon, 27 Feb 2023 09:56:05 +0100 Subject: [PATCH] (fix) use ts only through injection There were two ts usages through imports, one of them using an import that is no longer available which broke the plugin. Guard against that by only using the ts version that is passed to the plugin, which is more correct anyway #1897 --- .../typescript-plugin/src/language-service/completions.ts | 6 ++++-- packages/typescript-plugin/src/language-service/index.ts | 2 +- packages/typescript-plugin/src/module-loader.ts | 2 +- packages/typescript-plugin/src/svelte-sys.ts | 6 ++++-- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/packages/typescript-plugin/src/language-service/completions.ts b/packages/typescript-plugin/src/language-service/completions.ts index fb708c6af..b18c5a1b0 100644 --- a/packages/typescript-plugin/src/language-service/completions.ts +++ b/packages/typescript-plugin/src/language-service/completions.ts @@ -1,11 +1,13 @@ import { basename, dirname, extname } from 'path'; -import ts from 'typescript/lib/tsserverlibrary'; +import type ts from 'typescript'; import { Logger } from '../logger'; import { isSvelteFilePath, replaceDeep } from '../utils'; +type _ts = typeof ts; + const componentPostfix = '__SvelteComponent_'; -export function decorateCompletions(ls: ts.LanguageService, logger: Logger): void { +export function decorateCompletions(ls: ts.LanguageService, ts: _ts, logger: Logger): void { const getCompletionsAtPosition = ls.getCompletionsAtPosition; ls.getCompletionsAtPosition = (fileName, position, options) => { const completions = getCompletionsAtPosition(fileName, position, options); diff --git a/packages/typescript-plugin/src/language-service/index.ts b/packages/typescript-plugin/src/language-service/index.ts index a649b685c..ec3171ff9 100644 --- a/packages/typescript-plugin/src/language-service/index.ts +++ b/packages/typescript-plugin/src/language-service/index.ts @@ -42,7 +42,7 @@ function decorateLanguageServiceInner( decorateRename(ls, snapshotManager, logger); decorateDiagnostics(ls, logger); decorateFindReferences(ls, snapshotManager, logger); - decorateCompletions(ls, logger); + decorateCompletions(ls, typescript, logger); decorateGetDefinition(ls, snapshotManager, logger); decorateGetImplementation(ls, snapshotManager, logger); decorateUpdateImports(ls, snapshotManager, logger); diff --git a/packages/typescript-plugin/src/module-loader.ts b/packages/typescript-plugin/src/module-loader.ts index bb0d24a8b..8a051fd9e 100644 --- a/packages/typescript-plugin/src/module-loader.ts +++ b/packages/typescript-plugin/src/module-loader.ts @@ -102,7 +102,7 @@ export function patchModuleLoader( project: ts.server.Project, configManager: ConfigManager ): void { - const svelteSys = createSvelteSys(logger); + const svelteSys = createSvelteSys(typescript, logger); const moduleCache = new ModuleResolutionCache(project.projectService); const origResolveModuleNames = lsHost.resolveModuleNames?.bind(lsHost); const origResolveModuleNamLiterals = lsHost.resolveModuleNameLiterals?.bind(lsHost); diff --git a/packages/typescript-plugin/src/svelte-sys.ts b/packages/typescript-plugin/src/svelte-sys.ts index e8afc22ee..e42a38117 100644 --- a/packages/typescript-plugin/src/svelte-sys.ts +++ b/packages/typescript-plugin/src/svelte-sys.ts @@ -1,11 +1,13 @@ -import ts from 'typescript'; +import type ts from 'typescript'; import { Logger } from './logger'; import { ensureRealSvelteFilePath, isVirtualSvelteFilePath, toRealSvelteFilePath } from './utils'; +type _ts = typeof ts; + /** * This should only be accessed by TS svelte module resolution. */ -export function createSvelteSys(logger: Logger) { +export function createSvelteSys(ts: _ts, logger: Logger) { const svelteSys: ts.System = { ...ts.sys, fileExists(path: string) {