diff --git a/extensions/typescript-language-features/package.nls.json b/extensions/typescript-language-features/package.nls.json index 332f69b7140..7fb5bae6ad1 100644 --- a/extensions/typescript-language-features/package.nls.json +++ b/extensions/typescript-language-features/package.nls.json @@ -217,7 +217,7 @@ "configuration.suggest.objectLiteralMethodSnippets.enabled": "Enable/disable snippet completions for methods in object literals.", "configuration.tsserver.web.projectWideIntellisense.enabled": "Enable/disable project-wide IntelliSense on web. Requires that VS Code is running in a trusted context.", "configuration.tsserver.web.projectWideIntellisense.suppressSemanticErrors": "Suppresses semantic errors on web even when project wide IntelliSense is enabled. This is always on when project wide IntelliSense is not enabled or available. See `#typescript.tsserver.web.projectWideIntellisense.enabled#`", - "configuration.tsserver.web.typeAcquisition.enabled": "Enable/disable package acquisition on the web. This enables IntelliSense for imported packages. Requires `#typescript.tsserver.web.projectWideIntellisense.enabled#`.", + "configuration.tsserver.web.typeAcquisition.enabled": "Enable/disable package acquisition on the web. This enables IntelliSense for imported packages. Requires `#typescript.tsserver.web.projectWideIntellisense.enabled#`. Currently not supported for Safari.", "configuration.tsserver.nodePath": "Run TS Server on a custom Node installation. This can be a path to a Node executable, or 'node' if you want VS Code to detect a Node installation.", "walkthroughs.nodejsWelcome.title": "Get started with JavaScript and Node.js", "walkthroughs.nodejsWelcome.description": "Make the most of Visual Studio Code's first-class JavaScript experience.", diff --git a/extensions/typescript-language-features/src/extension.browser.ts b/extensions/typescript-language-features/src/extension.browser.ts index 25a7669a326..2f6bd2127e1 100644 --- a/extensions/typescript-language-features/src/extension.browser.ts +++ b/extensions/typescript-language-features/src/extension.browser.ts @@ -25,7 +25,7 @@ import { ITypeScriptVersionProvider, TypeScriptVersion, TypeScriptVersionSource import { ActiveJsTsEditorTracker } from './ui/activeJsTsEditorTracker'; import { Disposable } from './utils/dispose'; import { getPackageInfo } from './utils/packageInfo'; -import { isWebAndHasSharedArrayBuffers } from './utils/platform'; +import { isWebAndHasSharedArrayBuffers, supportsReadableByteStreams } from './utils/platform'; class StaticVersionProvider implements ITypeScriptVersionProvider { @@ -101,14 +101,17 @@ export async function activate(context: vscode.ExtensionContext): Promise { context.subscriptions.push(lazilyActivateClient(lazyClientHost, pluginManager, activeJsTsEditorTracker, async () => { await startPreloadWorkspaceContentsIfNeeded(context, logger); })); - context.subscriptions.push(vscode.workspace.registerFileSystemProvider('vscode-global-typings', new MemFs(), { - isCaseSensitive: true, - isReadonly: false - })); - context.subscriptions.push(vscode.workspace.registerFileSystemProvider('vscode-node-modules', new AutoInstallerFs(), { - isCaseSensitive: true, - isReadonly: false - })); + + if (supportsReadableByteStreams()) { + context.subscriptions.push(vscode.workspace.registerFileSystemProvider('vscode-global-typings', new MemFs(), { + isCaseSensitive: true, + isReadonly: false + })); + context.subscriptions.push(vscode.workspace.registerFileSystemProvider('vscode-node-modules', new AutoInstallerFs(), { + isCaseSensitive: true, + isReadonly: false + })); + } return getExtensionApi(onCompletionAccepted.event, pluginManager); } @@ -131,7 +134,11 @@ async function startPreloadWorkspaceContentsIfNeeded(context: vscode.ExtensionCo const loader = new RemoteWorkspaceContentsPreloader(workspaceUri, logger); context.subscriptions.push(loader); - await loader.triggerPreload(); + try { + await loader.triggerPreload(); + } catch (error) { + console.error(error); + } })); } diff --git a/extensions/typescript-language-features/src/languageProvider.ts b/extensions/typescript-language-features/src/languageProvider.ts index f44ebcc1212..b09df40561b 100644 --- a/extensions/typescript-language-features/src/languageProvider.ts +++ b/extensions/typescript-language-features/src/languageProvider.ts @@ -18,7 +18,7 @@ import { ClientCapability } from './typescriptService'; import TypeScriptServiceClient from './typescriptServiceClient'; import TypingsStatus from './ui/typingsStatus'; import { Disposable } from './utils/dispose'; -import { isWeb, isWebAndHasSharedArrayBuffers } from './utils/platform'; +import { isWeb, isWebAndHasSharedArrayBuffers, supportsReadableByteStreams } from './utils/platform'; const validateSetting = 'validate.enable'; @@ -143,7 +143,9 @@ export default class LanguageProvider extends Disposable { } if (diagnosticsKind === DiagnosticKind.Semantic && isWeb()) { - if (!isWebAndHasSharedArrayBuffers() + if ( + !isWebAndHasSharedArrayBuffers() + || !supportsReadableByteStreams() // No ata. Will result in lots of false positives || this.client.configuration.webProjectWideIntellisenseSuppressSemanticErrors || !this.client.configuration.webProjectWideIntellisenseEnabled ) { diff --git a/extensions/typescript-language-features/src/tsServer/serverProcess.browser.ts b/extensions/typescript-language-features/src/tsServer/serverProcess.browser.ts index 8c5b8bfc527..71daf1fb0b6 100644 --- a/extensions/typescript-language-features/src/tsServer/serverProcess.browser.ts +++ b/extensions/typescript-language-features/src/tsServer/serverProcess.browser.ts @@ -8,12 +8,13 @@ import { ApiService, Requests } from '@vscode/sync-api-service'; import * as vscode from 'vscode'; import { TypeScriptServiceConfiguration } from '../configuration/configuration'; import { Logger } from '../logging/logger'; +import { supportsReadableByteStreams } from '../utils/platform'; import { FileWatcherManager } from './fileWatchingManager'; +import { NodeVersionManager } from './nodeManager'; import type * as Proto from './protocol/protocol'; import { TsServerLog, TsServerProcess, TsServerProcessFactory, TsServerProcessKind } from './server'; import { TypeScriptVersionManager } from './versionManager'; import { TypeScriptVersion } from './versionProvider'; -import { NodeVersionManager } from './nodeManager'; type BrowserWatchEvent = { type: 'watchDirectory' | 'watchFile'; @@ -50,7 +51,7 @@ export class WorkerServerProcessFactory implements TsServerProcessFactory { // Explicitly give TS Server its path so it can load local resources '--executingFilePath', tsServerPath, ]; - if (_configuration.webTypeAcquisitionEnabled) { + if (_configuration.webTypeAcquisitionEnabled && supportsReadableByteStreams()) { launchArgs.push('--experimentalTypeAcquisition'); } return new WorkerServerProcess(kind, tsServerPath, this._extensionUri, launchArgs, tsServerLog, this._logger); diff --git a/extensions/typescript-language-features/src/utils/platform.ts b/extensions/typescript-language-features/src/utils/platform.ts index a7bdd8f30ff..ba954f59da3 100644 --- a/extensions/typescript-language-features/src/utils/platform.ts +++ b/extensions/typescript-language-features/src/utils/platform.ts @@ -12,3 +12,8 @@ export function isWeb(): boolean { export function isWebAndHasSharedArrayBuffers(): boolean { return isWeb() && (globalThis as any)['crossOriginIsolated']; } + +export function supportsReadableByteStreams(): boolean { + return isWeb() && 'ReadableByteStreamController' in globalThis; +} +