versionPicker.ts 3.9 KB
Newer Older
M
Matt Bierner 已提交
1 2 3 4 5
/*---------------------------------------------------------------------------------------------
 *  Copyright (c) Microsoft Corporation. All rights reserved.
 *  Licensed under the MIT License. See License.txt in the project root for license information.
 *--------------------------------------------------------------------------------------------*/

6
import * as vscode from 'vscode';
M
Matt Bierner 已提交
7
import * as nls from 'vscode-nls';
8
import { TypeScriptVersion, TypeScriptVersionProvider } from './versionProvider';
M
Matt Bierner 已提交
9 10 11 12 13

const localize = nls.loadMessageBundle();

const useWorkspaceTsdkStorageKey = 'typescript.useWorkspaceTsdk';

14
interface MyQuickPickItem extends vscode.QuickPickItem {
M
Matt Bierner 已提交
15
	id: MessageAction;
16
	version?: TypeScriptVersion;
M
Matt Bierner 已提交
17 18 19 20 21
}

enum MessageAction {
	useLocal,
	useBundled,
22
	learnMore,
M
Matt Bierner 已提交
23 24 25 26 27 28 29
}

export class TypeScriptVersionPicker {
	private _currentVersion: TypeScriptVersion;

	public constructor(
		private readonly versionProvider: TypeScriptVersionProvider,
30
		private readonly workspaceState: vscode.Memento
M
Matt Bierner 已提交
31 32 33
	) {
		this._currentVersion = this.versionProvider.defaultVersion;

34
		if (this.useWorkspaceTsdkSetting) {
M
Matt Bierner 已提交
35
			const localVersion = this.versionProvider.localVersion;
M
Matt Bierner 已提交
36 37 38 39 40 41
			if (localVersion) {
				this._currentVersion = localVersion;
			}
		}
	}

42 43 44 45
	public get useWorkspaceTsdkSetting(): boolean {
		return this.workspaceState.get<boolean>(useWorkspaceTsdkStorageKey, false);
	}

M
Matt Bierner 已提交
46 47 48 49 50 51 52 53
	public get currentVersion(): TypeScriptVersion {
		return this._currentVersion;
	}

	public useBundledVersion(): void {
		this._currentVersion = this.versionProvider.bundledVersion;
	}

54
	public async show(firstRun?: boolean): Promise<{ oldVersion?: TypeScriptVersion, newVersion?: TypeScriptVersion }> {
M
Matt Bierner 已提交
55 56
		const pickOptions: MyQuickPickItem[] = [];

57
		const shippedVersion = this.versionProvider.defaultVersion;
M
Matt Bierner 已提交
58
		pickOptions.push({
59
			label: (!this.useWorkspaceTsdkSetting
60
				? ''
M
Matt Bierner 已提交
61
				: '') + localize('useVSCodeVersionOption', 'Use VS Code\'s Version'),
62
			description: shippedVersion.versionString,
63
			detail: shippedVersion.pathLabel,
64
			id: MessageAction.useBundled,
M
Matt Bierner 已提交
65 66
		});

67
		for (const version of this.versionProvider.localVersions) {
M
Matt Bierner 已提交
68
			pickOptions.push({
69
				label: (this.useWorkspaceTsdkSetting && this.currentVersion.path === version.path
70
					? ''
71
					: '') + localize('useWorkspaceVersionOption', 'Use Workspace Version'),
72
				description: version.versionString,
73
				detail: version.pathLabel,
74
				id: MessageAction.useLocal,
75
				version
M
Matt Bierner 已提交
76 77 78 79 80 81 82 83 84
			});
		}

		pickOptions.push({
			label: localize('learnMore', 'Learn More'),
			description: '',
			id: MessageAction.learnMore
		});

85
		const selected = await vscode.window.showQuickPick<MyQuickPickItem>(pickOptions, {
M
Matt Bierner 已提交
86 87 88
			placeHolder: localize(
				'selectTsVersion',
				'Select the TypeScript version used for JavaScript and TypeScript language features'),
89
			ignoreFocusOut: firstRun,
90 91 92 93 94 95 96 97 98 99
		});

		if (!selected) {
			return { oldVersion: this.currentVersion };
		}

		switch (selected.id) {
			case MessageAction.useLocal:
				await this.workspaceState.update(useWorkspaceTsdkStorageKey, true);
				if (selected.version) {
100
					const tsConfig = vscode.workspace.getConfiguration('typescript');
101
					await tsConfig.update('tsdk', selected.version.pathLabel, false);
102 103 104 105

					const previousVersion = this.currentVersion;
					this._currentVersion = selected.version;
					return { oldVersion: previousVersion, newVersion: selected.version };
M
Matt Bierner 已提交
106
				}
107 108 109 110 111 112 113
				return { oldVersion: this.currentVersion };

			case MessageAction.useBundled:
				await this.workspaceState.update(useWorkspaceTsdkStorageKey, false);
				const previousVersion = this.currentVersion;
				this._currentVersion = shippedVersion;
				return { oldVersion: previousVersion, newVersion: shippedVersion };
M
Matt Bierner 已提交
114

115
			case MessageAction.learnMore:
M
Matt Bierner 已提交
116
				vscode.env.openExternal(vscode.Uri.parse('https://go.microsoft.com/fwlink/?linkid=839919'));
117 118 119 120 121
				return { oldVersion: this.currentVersion };

			default:
				return { oldVersion: this.currentVersion };
		}
M
Matt Bierner 已提交
122 123
	}
}