Merge remote-tracking branch 'origin' into electron-18.x.y

This commit is contained in:
deepak1556 2022-06-04 09:38:17 +09:00
commit 17aee6520d
84 changed files with 2078 additions and 1350 deletions

View file

@ -994,7 +994,7 @@
]
},
"dependencies": {
"vscode-languageclient": "^8.0.1",
"vscode-languageclient": "^8.0.2-next.4",
"vscode-nls": "^5.0.0",
"vscode-uri": "^3.0.3"
},

View file

@ -11,7 +11,7 @@
"browser": "./dist/browser/cssServerMain",
"dependencies": {
"vscode-css-languageservice": "^6.0.1",
"vscode-languageserver": "^8.0.1",
"vscode-languageserver": "^8.0.2-next.4",
"vscode-uri": "^3.0.3"
},
"devDependencies": {

View file

@ -22,35 +22,40 @@ vscode-css-languageservice@^6.0.1:
vscode-nls "^5.0.1"
vscode-uri "^3.0.3"
vscode-jsonrpc@8.0.1:
version "8.0.1"
resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-8.0.1.tgz#f30b0625ebafa0fb3bc53e934ca47b706445e57e"
integrity sha512-N/WKvghIajmEvXpatSzvTvOIz61ZSmOSa4BRA4pTLi+1+jozquQKP/MkaylP9iB68k73Oua1feLQvH3xQuigiQ==
vscode-jsonrpc@8.0.2-next.1:
version "8.0.2-next.1"
resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-8.0.2-next.1.tgz#6bdc39fd194782032e34047eeefce562941259c6"
integrity sha512-sbbvGSWja7NVBLHPGawtgezc8DHYJaP4qfr/AaJiyDapWcSFtHyPtm18+LnYMLTmB7bhOUW/lf5PeeuLpP6bKA==
vscode-languageserver-protocol@3.17.1:
version "3.17.1"
resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.1.tgz#e801762c304f740208b6c804a0cf21f2c87509ed"
integrity sha512-BNlAYgQoYwlSgDLJhSG+DeA8G1JyECqRzM2YO6tMmMji3Ad9Mw6AW7vnZMti90qlAKb0LqAlJfSVGEdqMMNzKg==
vscode-languageserver-protocol@3.17.2-next.5:
version "3.17.2-next.5"
resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.2-next.5.tgz#9bc747411c3ce9e1d73c2714bf6555e0199eec26"
integrity sha512-UlH+QL4Q4lX94of/UPDDwwWIkd8w7dtMW4khzvEDUoykiG9tba0iG6V0bAiv8XVpnBIUYjL2FNFiL3zl+TY1Sw==
dependencies:
vscode-jsonrpc "8.0.1"
vscode-languageserver-types "3.17.1"
vscode-jsonrpc "8.0.2-next.1"
vscode-languageserver-types "3.17.2-next.2"
vscode-languageserver-textdocument@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.4.tgz#3cd56dd14cec1d09e86c4bb04b09a246cb3df157"
integrity sha512-/xhqXP/2A2RSs+J8JNXpiiNVvvNM0oTosNVmQnunlKvq9o4mupHOBAnnzH0lwIPKazXKvAKsVp1kr+H/K4lgoQ==
vscode-languageserver-types@3.17.1, vscode-languageserver-types@^3.17.1:
vscode-languageserver-types@3.17.2-next.2:
version "3.17.2-next.2"
resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.2-next.2.tgz#af5d6978eee7682aab87c1419323f5b141ac6596"
integrity sha512-TiAkLABgqkVWdAlC3XlOfdhdjIAdVU4YntPUm9kKGbXr+MGwpVnKz2KZMNBcvG0CFx8Hi8qliL0iq+ndPB720w==
vscode-languageserver-types@^3.17.1:
version "3.17.1"
resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.1.tgz#c2d87fa7784f8cac389deb3ff1e2d9a7bef07e16"
integrity sha512-K3HqVRPElLZVVPtMeKlsyL9aK0GxGQpvtAUTfX4k7+iJ4mc1M+JM+zQwkgGy2LzY0f0IAafe8MKqIkJrxfGGjQ==
vscode-languageserver@^8.0.1:
version "8.0.1"
resolved "https://registry.yarnpkg.com/vscode-languageserver/-/vscode-languageserver-8.0.1.tgz#56bd7a01f5c88af075a77f1d220edcb30fc4bdc7"
integrity sha512-sn7SjBwWm3OlmLtgg7jbM0wBULppyL60rj8K5HF0ny/MzN+GzPBX1kCvYdybhl7UW63V5V5tRVnyB8iwC73lSQ==
vscode-languageserver@^8.0.2-next.4:
version "8.0.2-next.4"
resolved "https://registry.yarnpkg.com/vscode-languageserver/-/vscode-languageserver-8.0.2-next.4.tgz#c10cc95be06325b56b7ec1d10271c9e4adf3ef07"
integrity sha512-B3roWH4TmJiB6Zh5+r7zu0QdlLqJsPdGo0LeEi6OiLfrHYCDlcI7DNcQ7F17vWmxC3C82SrxMt/EuLBMpKQM0A==
dependencies:
vscode-languageserver-protocol "3.17.1"
vscode-languageserver-protocol "3.17.2-next.5"
vscode-nls@^5.0.1:
version "5.0.1"

View file

@ -46,32 +46,32 @@ semver@^7.3.5:
dependencies:
lru-cache "^6.0.0"
vscode-jsonrpc@8.0.1:
version "8.0.1"
resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-8.0.1.tgz#f30b0625ebafa0fb3bc53e934ca47b706445e57e"
integrity sha512-N/WKvghIajmEvXpatSzvTvOIz61ZSmOSa4BRA4pTLi+1+jozquQKP/MkaylP9iB68k73Oua1feLQvH3xQuigiQ==
vscode-jsonrpc@8.0.2-next.1:
version "8.0.2-next.1"
resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-8.0.2-next.1.tgz#6bdc39fd194782032e34047eeefce562941259c6"
integrity sha512-sbbvGSWja7NVBLHPGawtgezc8DHYJaP4qfr/AaJiyDapWcSFtHyPtm18+LnYMLTmB7bhOUW/lf5PeeuLpP6bKA==
vscode-languageclient@^8.0.1:
version "8.0.1"
resolved "https://registry.yarnpkg.com/vscode-languageclient/-/vscode-languageclient-8.0.1.tgz#bf5535c4463a78daeaca0bcb4f5868aec86bb301"
integrity sha512-9XoE+HJfaWvu7Y75H3VmLo5WLCtsbxEgEhrLPqwt7eyoR49lUIyyrjb98Yfa50JCMqF2cePJAEVI6oe2o1sIhw==
vscode-languageclient@^8.0.2-next.4:
version "8.0.2-next.4"
resolved "https://registry.yarnpkg.com/vscode-languageclient/-/vscode-languageclient-8.0.2-next.4.tgz#87dd364ffbd4356aff3af14e7b557d9fe34d2b67"
integrity sha512-j9BEiCYMN9IoKwYdk9iickV6WNPVGPoVO11SMdoxFnWPIT3y5UAe3qf/WsfA9OdklAIaxxYasfgyKCpBjSPNuw==
dependencies:
minimatch "^3.0.4"
semver "^7.3.5"
vscode-languageserver-protocol "3.17.1"
vscode-languageserver-protocol "3.17.2-next.5"
vscode-languageserver-protocol@3.17.1:
version "3.17.1"
resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.1.tgz#e801762c304f740208b6c804a0cf21f2c87509ed"
integrity sha512-BNlAYgQoYwlSgDLJhSG+DeA8G1JyECqRzM2YO6tMmMji3Ad9Mw6AW7vnZMti90qlAKb0LqAlJfSVGEdqMMNzKg==
vscode-languageserver-protocol@3.17.2-next.5:
version "3.17.2-next.5"
resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.2-next.5.tgz#9bc747411c3ce9e1d73c2714bf6555e0199eec26"
integrity sha512-UlH+QL4Q4lX94of/UPDDwwWIkd8w7dtMW4khzvEDUoykiG9tba0iG6V0bAiv8XVpnBIUYjL2FNFiL3zl+TY1Sw==
dependencies:
vscode-jsonrpc "8.0.1"
vscode-languageserver-types "3.17.1"
vscode-jsonrpc "8.0.2-next.1"
vscode-languageserver-types "3.17.2-next.2"
vscode-languageserver-types@3.17.1:
version "3.17.1"
resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.1.tgz#c2d87fa7784f8cac389deb3ff1e2d9a7bef07e16"
integrity sha512-K3HqVRPElLZVVPtMeKlsyL9aK0GxGQpvtAUTfX4k7+iJ4mc1M+JM+zQwkgGy2LzY0f0IAafe8MKqIkJrxfGGjQ==
vscode-languageserver-types@3.17.2-next.2:
version "3.17.2-next.2"
resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.2-next.2.tgz#af5d6978eee7682aab87c1419323f5b141ac6596"
integrity sha512-TiAkLABgqkVWdAlC3XlOfdhdjIAdVU4YntPUm9kKGbXr+MGwpVnKz2KZMNBcvG0CFx8Hi8qliL0iq+ndPB720w==
vscode-nls@^5.0.0:
version "5.0.0"

View file

@ -1249,17 +1249,17 @@
},
{
"command": "git.revealFileInOS.linux",
"when": "scmProvider == git && scmResourceGroup == merge && resourceScheme == file && isLinux",
"when": "scmProvider == git && scmResourceGroup == merge && remoteName == '' && isLinux",
"group": "2_view@2"
},
{
"command": "git.revealFileInOS.mac",
"when": "scmProvider == git && scmResourceGroup == merge && resourceScheme == file && isMac",
"when": "scmProvider == git && scmResourceGroup == merge && remoteName == '' && isMac",
"group": "2_view@2"
},
{
"command": "git.revealFileInOS.windows",
"when": "scmProvider == git && scmResourceGroup == merge && resourceScheme == file && isWindows",
"when": "scmProvider == git && scmResourceGroup == merge && remoteName == '' && isWindows",
"group": "2_view@2"
},
{
@ -1304,17 +1304,17 @@
},
{
"command": "git.revealFileInOS.linux",
"when": "scmProvider == git && scmResourceGroup == index && resourceScheme == file && isLinux",
"when": "scmProvider == git && scmResourceGroup == index && remoteName == '' && isLinux",
"group": "2_view@2"
},
{
"command": "git.revealFileInOS.mac",
"when": "scmProvider == git && scmResourceGroup == index && resourceScheme == file && isMac",
"when": "scmProvider == git && scmResourceGroup == index && remoteName == '' && isMac",
"group": "2_view@2"
},
{
"command": "git.revealFileInOS.windows",
"when": "scmProvider == git && scmResourceGroup == index && resourceScheme == file && isWindows",
"when": "scmProvider == git && scmResourceGroup == index && remoteName == '' && isWindows",
"group": "2_view@2"
},
{
@ -1384,17 +1384,17 @@
},
{
"command": "git.revealFileInOS.linux",
"when": "scmProvider == git && scmResourceGroup == workingTree && resourceScheme == file && isLinux",
"when": "scmProvider == git && scmResourceGroup == workingTree && remoteName == '' && isLinux",
"group": "2_view@2"
},
{
"command": "git.revealFileInOS.mac",
"when": "scmProvider == git && scmResourceGroup == workingTree && resourceScheme == file && isMac",
"when": "scmProvider == git && scmResourceGroup == workingTree && remoteName == '' && isMac",
"group": "2_view@2"
},
{
"command": "git.revealFileInOS.windows",
"when": "scmProvider == git && scmResourceGroup == workingTree && resourceScheme == file && isWindows",
"when": "scmProvider == git && scmResourceGroup == workingTree && remoteName == '' && isWindows",
"group": "2_view@2"
},
{
@ -1913,8 +1913,22 @@
"type": "array",
"markdownDescription": "%config.branchRandomNameDictionary%",
"items": {
"type": "string"
"type": "string",
"enum": [
"adjectives",
"animals",
"colors",
"numbers"
],
"enumDescriptions": [
"%config.branchRandomNameDictionary.adjectives%",
"%config.branchRandomNameDictionary.animals%",
"%config.branchRandomNameDictionary.colors%",
"%config.branchRandomNameDictionary.numbers%"
]
},
"minItems": 1,
"maxItems": 5,
"default": [
"adjectives",
"animals"

View file

@ -126,7 +126,11 @@
"config.branchProtectionPrompt.alwaysCommit": "Always commit changes to the protected branch.",
"config.branchProtectionPrompt.alwaysCommitToNewBranch": "Always commit changes to a new branch.",
"config.branchProtectionPrompt.alwaysPrompt": "Always prompt before changes are committed to a protected branch.",
"config.branchRandomNameDictionary": "List of dictionaries used when the branch name that is randomly generated. Supported values: `adjectives`, `animals`, `colors`, `numbers`.",
"config.branchRandomNameDictionary": "List of dictionaries used for the randomly generated branch name. Each value represents the dictionary used to generate the segment of the branch name. Supported dictionaries: `adjectives`, `animals`, `colors` and `numbers`.",
"config.branchRandomNameDictionary.adjectives": "A random adjective",
"config.branchRandomNameDictionary.animals": "A random animal name",
"config.branchRandomNameDictionary.colors": "A random color name",
"config.branchRandomNameDictionary.numbers": "A random number between 100 and 999",
"config.branchRandomNameEnable": "Controls whether a random name is generated when creating a new branch.",
"config.branchValidationRegex": "A regular expression to validate new branch names.",
"config.branchWhitespaceChar": "The character to replace whitespace in new branch names, and to separate segments of a randomly generated branch name.",

View file

@ -368,7 +368,7 @@ export class CommandCenter {
return;
}
this.outputChannelLogger.setLogLevel(choice.logLevel);
this.outputChannelLogger.currentLogLevel = choice.logLevel;
}
@command('git.refresh', { repository: true })

View file

@ -30,12 +30,22 @@ export class OutputChannelLogger {
private _onDidChangeLogLevel = new EventEmitter<LogLevel>();
readonly onDidChangeLogLevel: Event<LogLevel> = this._onDidChangeLogLevel.event;
private _currentLogLevel: LogLevel;
private _currentLogLevel!: LogLevel;
get currentLogLevel(): LogLevel {
return this._currentLogLevel;
}
set currentLogLevel(value: LogLevel) {
if (this._currentLogLevel === value) {
return;
}
private _defaultLogLevel: LogLevel;
this._currentLogLevel = value;
this._onDidChangeLogLevel.fire(value);
this.log(localize('gitLogLevel', "Log level: {0}", LogLevel[value]));
}
private _defaultLogLevel!: LogLevel;
get defaultLogLevel(): LogLevel {
return this._defaultLogLevel;
}
@ -49,20 +59,26 @@ export class OutputChannelLogger {
commands.registerCommand('git.showOutput', () => this.showOutputChannel());
this._disposables.push(this._outputChannel);
// Initialize log level
const config = workspace.getConfiguration('git');
const logLevel: keyof typeof LogLevel = config.get('logLevel', 'Info');
this._currentLogLevel = this._defaultLogLevel = LogLevel[logLevel] ?? LogLevel.Info;
this.logInfo(localize('gitLogLevel', "Log level: {0}", LogLevel[this._currentLogLevel]));
this._disposables.push(workspace.onDidChangeConfiguration(e => {
if (e.affectsConfiguration('git.logLevel')) {
this.onLogLevelChange();
}
}));
this.onLogLevelChange();
}
private log(message: string, logLevel: LogLevel): void {
if (logLevel < this._currentLogLevel) {
private onLogLevelChange(): void {
const config = workspace.getConfiguration('git');
const logLevel: keyof typeof LogLevel = config.get('logLevel', 'Info');
this.currentLogLevel = this._defaultLogLevel = LogLevel[logLevel] ?? LogLevel.Info;
}
log(message: string, logLevel?: LogLevel): void {
if (logLevel && logLevel < this._currentLogLevel) {
return;
}
this._outputChannel.appendLine(`[${new Date().toISOString()}] [${LogLevel[logLevel].toLowerCase()}] ${message}`);
this._outputChannel.appendLine(`[${new Date().toISOString()}]${logLevel ? ` [${LogLevel[logLevel].toLowerCase()}]` : ''} ${message}`);
}
logCritical(message: string): void {
@ -89,21 +105,6 @@ export class OutputChannelLogger {
this.log(message, LogLevel.Warning);
}
logGitCommand(command: string): void {
this._outputChannel.appendLine(`[${new Date().toISOString()}] ${command}`);
}
setLogLevel(logLevel: LogLevel): void {
if (this._currentLogLevel === logLevel) {
return;
}
this._currentLogLevel = logLevel;
this._onDidChangeLogLevel.fire(logLevel);
this.logInfo(localize('changed', "Log level changed to: {0}", LogLevel[logLevel]));
}
showOutputChannel(): void {
this._outputChannel.show();
}

View file

@ -90,7 +90,7 @@ async function createModel(context: ExtensionContext, outputChannelLogger: Outpu
lines.pop();
}
outputChannelLogger.logGitCommand(lines.join('\n'));
outputChannelLogger.log(lines.join('\n'));
};
git.onOutput.addListener('log', onOutput);
disposables.push(toDisposable(() => git.onOutput.removeListener('log', onOutput)));

View file

@ -262,7 +262,7 @@
},
"dependencies": {
"@vscode/extension-telemetry": "0.5.1",
"vscode-languageclient": "^8.0.1",
"vscode-languageclient": "^8.0.2-next.4",
"vscode-nls": "^5.0.1",
"vscode-uri": "^3.0.3"
},

View file

@ -11,7 +11,7 @@
"dependencies": {
"vscode-css-languageservice": "^6.0.1",
"vscode-html-languageservice": "^5.0.0",
"vscode-languageserver": "^8.0.1",
"vscode-languageserver": "^8.0.2-next.4",
"vscode-languageserver-textdocument": "^1.0.4",
"vscode-nls": "^5.0.1",
"vscode-uri": "^3.0.3"

View file

@ -32,35 +32,40 @@ vscode-html-languageservice@^5.0.0:
vscode-nls "^5.0.1"
vscode-uri "^3.0.3"
vscode-jsonrpc@8.0.1:
version "8.0.1"
resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-8.0.1.tgz#f30b0625ebafa0fb3bc53e934ca47b706445e57e"
integrity sha512-N/WKvghIajmEvXpatSzvTvOIz61ZSmOSa4BRA4pTLi+1+jozquQKP/MkaylP9iB68k73Oua1feLQvH3xQuigiQ==
vscode-jsonrpc@8.0.2-next.1:
version "8.0.2-next.1"
resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-8.0.2-next.1.tgz#6bdc39fd194782032e34047eeefce562941259c6"
integrity sha512-sbbvGSWja7NVBLHPGawtgezc8DHYJaP4qfr/AaJiyDapWcSFtHyPtm18+LnYMLTmB7bhOUW/lf5PeeuLpP6bKA==
vscode-languageserver-protocol@3.17.1:
version "3.17.1"
resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.1.tgz#e801762c304f740208b6c804a0cf21f2c87509ed"
integrity sha512-BNlAYgQoYwlSgDLJhSG+DeA8G1JyECqRzM2YO6tMmMji3Ad9Mw6AW7vnZMti90qlAKb0LqAlJfSVGEdqMMNzKg==
vscode-languageserver-protocol@3.17.2-next.5:
version "3.17.2-next.5"
resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.2-next.5.tgz#9bc747411c3ce9e1d73c2714bf6555e0199eec26"
integrity sha512-UlH+QL4Q4lX94of/UPDDwwWIkd8w7dtMW4khzvEDUoykiG9tba0iG6V0bAiv8XVpnBIUYjL2FNFiL3zl+TY1Sw==
dependencies:
vscode-jsonrpc "8.0.1"
vscode-languageserver-types "3.17.1"
vscode-jsonrpc "8.0.2-next.1"
vscode-languageserver-types "3.17.2-next.2"
vscode-languageserver-textdocument@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.4.tgz#3cd56dd14cec1d09e86c4bb04b09a246cb3df157"
integrity sha512-/xhqXP/2A2RSs+J8JNXpiiNVvvNM0oTosNVmQnunlKvq9o4mupHOBAnnzH0lwIPKazXKvAKsVp1kr+H/K4lgoQ==
vscode-languageserver-types@3.17.1, vscode-languageserver-types@^3.17.1:
vscode-languageserver-types@3.17.2-next.2:
version "3.17.2-next.2"
resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.2-next.2.tgz#af5d6978eee7682aab87c1419323f5b141ac6596"
integrity sha512-TiAkLABgqkVWdAlC3XlOfdhdjIAdVU4YntPUm9kKGbXr+MGwpVnKz2KZMNBcvG0CFx8Hi8qliL0iq+ndPB720w==
vscode-languageserver-types@^3.17.1:
version "3.17.1"
resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.1.tgz#c2d87fa7784f8cac389deb3ff1e2d9a7bef07e16"
integrity sha512-K3HqVRPElLZVVPtMeKlsyL9aK0GxGQpvtAUTfX4k7+iJ4mc1M+JM+zQwkgGy2LzY0f0IAafe8MKqIkJrxfGGjQ==
vscode-languageserver@^8.0.1:
version "8.0.1"
resolved "https://registry.yarnpkg.com/vscode-languageserver/-/vscode-languageserver-8.0.1.tgz#56bd7a01f5c88af075a77f1d220edcb30fc4bdc7"
integrity sha512-sn7SjBwWm3OlmLtgg7jbM0wBULppyL60rj8K5HF0ny/MzN+GzPBX1kCvYdybhl7UW63V5V5tRVnyB8iwC73lSQ==
vscode-languageserver@^8.0.2-next.4:
version "8.0.2-next.4"
resolved "https://registry.yarnpkg.com/vscode-languageserver/-/vscode-languageserver-8.0.2-next.4.tgz#c10cc95be06325b56b7ec1d10271c9e4adf3ef07"
integrity sha512-B3roWH4TmJiB6Zh5+r7zu0QdlLqJsPdGo0LeEi6OiLfrHYCDlcI7DNcQ7F17vWmxC3C82SrxMt/EuLBMpKQM0A==
dependencies:
vscode-languageserver-protocol "3.17.1"
vscode-languageserver-protocol "3.17.2-next.5"
vscode-nls@^5.0.1:
version "5.0.1"

View file

@ -51,32 +51,32 @@ semver@^7.3.5:
dependencies:
lru-cache "^6.0.0"
vscode-jsonrpc@8.0.1:
version "8.0.1"
resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-8.0.1.tgz#f30b0625ebafa0fb3bc53e934ca47b706445e57e"
integrity sha512-N/WKvghIajmEvXpatSzvTvOIz61ZSmOSa4BRA4pTLi+1+jozquQKP/MkaylP9iB68k73Oua1feLQvH3xQuigiQ==
vscode-jsonrpc@8.0.2-next.1:
version "8.0.2-next.1"
resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-8.0.2-next.1.tgz#6bdc39fd194782032e34047eeefce562941259c6"
integrity sha512-sbbvGSWja7NVBLHPGawtgezc8DHYJaP4qfr/AaJiyDapWcSFtHyPtm18+LnYMLTmB7bhOUW/lf5PeeuLpP6bKA==
vscode-languageclient@^8.0.1:
version "8.0.1"
resolved "https://registry.yarnpkg.com/vscode-languageclient/-/vscode-languageclient-8.0.1.tgz#bf5535c4463a78daeaca0bcb4f5868aec86bb301"
integrity sha512-9XoE+HJfaWvu7Y75H3VmLo5WLCtsbxEgEhrLPqwt7eyoR49lUIyyrjb98Yfa50JCMqF2cePJAEVI6oe2o1sIhw==
vscode-languageclient@^8.0.2-next.4:
version "8.0.2-next.4"
resolved "https://registry.yarnpkg.com/vscode-languageclient/-/vscode-languageclient-8.0.2-next.4.tgz#87dd364ffbd4356aff3af14e7b557d9fe34d2b67"
integrity sha512-j9BEiCYMN9IoKwYdk9iickV6WNPVGPoVO11SMdoxFnWPIT3y5UAe3qf/WsfA9OdklAIaxxYasfgyKCpBjSPNuw==
dependencies:
minimatch "^3.0.4"
semver "^7.3.5"
vscode-languageserver-protocol "3.17.1"
vscode-languageserver-protocol "3.17.2-next.5"
vscode-languageserver-protocol@3.17.1:
version "3.17.1"
resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.1.tgz#e801762c304f740208b6c804a0cf21f2c87509ed"
integrity sha512-BNlAYgQoYwlSgDLJhSG+DeA8G1JyECqRzM2YO6tMmMji3Ad9Mw6AW7vnZMti90qlAKb0LqAlJfSVGEdqMMNzKg==
vscode-languageserver-protocol@3.17.2-next.5:
version "3.17.2-next.5"
resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.2-next.5.tgz#9bc747411c3ce9e1d73c2714bf6555e0199eec26"
integrity sha512-UlH+QL4Q4lX94of/UPDDwwWIkd8w7dtMW4khzvEDUoykiG9tba0iG6V0bAiv8XVpnBIUYjL2FNFiL3zl+TY1Sw==
dependencies:
vscode-jsonrpc "8.0.1"
vscode-languageserver-types "3.17.1"
vscode-jsonrpc "8.0.2-next.1"
vscode-languageserver-types "3.17.2-next.2"
vscode-languageserver-types@3.17.1:
version "3.17.1"
resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.1.tgz#c2d87fa7784f8cac389deb3ff1e2d9a7bef07e16"
integrity sha512-K3HqVRPElLZVVPtMeKlsyL9aK0GxGQpvtAUTfX4k7+iJ4mc1M+JM+zQwkgGy2LzY0f0IAafe8MKqIkJrxfGGjQ==
vscode-languageserver-types@3.17.2-next.2:
version "3.17.2-next.2"
resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.2-next.2.tgz#af5d6978eee7682aab87c1419323f5b141ac6596"
integrity sha512-TiAkLABgqkVWdAlC3XlOfdhdjIAdVU4YntPUm9kKGbXr+MGwpVnKz2KZMNBcvG0CFx8Hi8qliL0iq+ndPB720w==
vscode-nls@^5.0.1:
version "5.0.1"

View file

@ -149,7 +149,7 @@
"dependencies": {
"@vscode/extension-telemetry": "0.5.1",
"request-light": "^0.5.8",
"vscode-languageclient": "^8.0.1",
"vscode-languageclient": "^8.0.2-next.4",
"vscode-nls": "^5.0.1"
},
"devDependencies": {

View file

@ -15,7 +15,7 @@
"jsonc-parser": "^3.0.0",
"request-light": "^0.5.8",
"vscode-json-languageservice": "^5.0.0",
"vscode-languageserver": "^8.0.1",
"vscode-languageserver": "^8.0.2-next.4",
"vscode-uri": "^3.0.3"
},
"devDependencies": {

View file

@ -33,35 +33,40 @@ vscode-json-languageservice@^5.0.0:
vscode-nls "^5.0.1"
vscode-uri "^3.0.3"
vscode-jsonrpc@8.0.1:
version "8.0.1"
resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-8.0.1.tgz#f30b0625ebafa0fb3bc53e934ca47b706445e57e"
integrity sha512-N/WKvghIajmEvXpatSzvTvOIz61ZSmOSa4BRA4pTLi+1+jozquQKP/MkaylP9iB68k73Oua1feLQvH3xQuigiQ==
vscode-jsonrpc@8.0.2-next.1:
version "8.0.2-next.1"
resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-8.0.2-next.1.tgz#6bdc39fd194782032e34047eeefce562941259c6"
integrity sha512-sbbvGSWja7NVBLHPGawtgezc8DHYJaP4qfr/AaJiyDapWcSFtHyPtm18+LnYMLTmB7bhOUW/lf5PeeuLpP6bKA==
vscode-languageserver-protocol@3.17.1:
version "3.17.1"
resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.1.tgz#e801762c304f740208b6c804a0cf21f2c87509ed"
integrity sha512-BNlAYgQoYwlSgDLJhSG+DeA8G1JyECqRzM2YO6tMmMji3Ad9Mw6AW7vnZMti90qlAKb0LqAlJfSVGEdqMMNzKg==
vscode-languageserver-protocol@3.17.2-next.5:
version "3.17.2-next.5"
resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.2-next.5.tgz#9bc747411c3ce9e1d73c2714bf6555e0199eec26"
integrity sha512-UlH+QL4Q4lX94of/UPDDwwWIkd8w7dtMW4khzvEDUoykiG9tba0iG6V0bAiv8XVpnBIUYjL2FNFiL3zl+TY1Sw==
dependencies:
vscode-jsonrpc "8.0.1"
vscode-languageserver-types "3.17.1"
vscode-jsonrpc "8.0.2-next.1"
vscode-languageserver-types "3.17.2-next.2"
vscode-languageserver-textdocument@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.4.tgz#3cd56dd14cec1d09e86c4bb04b09a246cb3df157"
integrity sha512-/xhqXP/2A2RSs+J8JNXpiiNVvvNM0oTosNVmQnunlKvq9o4mupHOBAnnzH0lwIPKazXKvAKsVp1kr+H/K4lgoQ==
vscode-languageserver-types@3.17.1, vscode-languageserver-types@^3.17.1:
vscode-languageserver-types@3.17.2-next.2:
version "3.17.2-next.2"
resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.2-next.2.tgz#af5d6978eee7682aab87c1419323f5b141ac6596"
integrity sha512-TiAkLABgqkVWdAlC3XlOfdhdjIAdVU4YntPUm9kKGbXr+MGwpVnKz2KZMNBcvG0CFx8Hi8qliL0iq+ndPB720w==
vscode-languageserver-types@^3.17.1:
version "3.17.1"
resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.1.tgz#c2d87fa7784f8cac389deb3ff1e2d9a7bef07e16"
integrity sha512-K3HqVRPElLZVVPtMeKlsyL9aK0GxGQpvtAUTfX4k7+iJ4mc1M+JM+zQwkgGy2LzY0f0IAafe8MKqIkJrxfGGjQ==
vscode-languageserver@^8.0.1:
version "8.0.1"
resolved "https://registry.yarnpkg.com/vscode-languageserver/-/vscode-languageserver-8.0.1.tgz#56bd7a01f5c88af075a77f1d220edcb30fc4bdc7"
integrity sha512-sn7SjBwWm3OlmLtgg7jbM0wBULppyL60rj8K5HF0ny/MzN+GzPBX1kCvYdybhl7UW63V5V5tRVnyB8iwC73lSQ==
vscode-languageserver@^8.0.2-next.4:
version "8.0.2-next.4"
resolved "https://registry.yarnpkg.com/vscode-languageserver/-/vscode-languageserver-8.0.2-next.4.tgz#c10cc95be06325b56b7ec1d10271c9e4adf3ef07"
integrity sha512-B3roWH4TmJiB6Zh5+r7zu0QdlLqJsPdGo0LeEi6OiLfrHYCDlcI7DNcQ7F17vWmxC3C82SrxMt/EuLBMpKQM0A==
dependencies:
vscode-languageserver-protocol "3.17.1"
vscode-languageserver-protocol "3.17.2-next.5"
vscode-nls@^5.0.1:
version "5.0.1"

View file

@ -56,32 +56,32 @@ semver@^7.3.5:
dependencies:
lru-cache "^6.0.0"
vscode-jsonrpc@8.0.1:
version "8.0.1"
resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-8.0.1.tgz#f30b0625ebafa0fb3bc53e934ca47b706445e57e"
integrity sha512-N/WKvghIajmEvXpatSzvTvOIz61ZSmOSa4BRA4pTLi+1+jozquQKP/MkaylP9iB68k73Oua1feLQvH3xQuigiQ==
vscode-jsonrpc@8.0.2-next.1:
version "8.0.2-next.1"
resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-8.0.2-next.1.tgz#6bdc39fd194782032e34047eeefce562941259c6"
integrity sha512-sbbvGSWja7NVBLHPGawtgezc8DHYJaP4qfr/AaJiyDapWcSFtHyPtm18+LnYMLTmB7bhOUW/lf5PeeuLpP6bKA==
vscode-languageclient@^8.0.1:
version "8.0.1"
resolved "https://registry.yarnpkg.com/vscode-languageclient/-/vscode-languageclient-8.0.1.tgz#bf5535c4463a78daeaca0bcb4f5868aec86bb301"
integrity sha512-9XoE+HJfaWvu7Y75H3VmLo5WLCtsbxEgEhrLPqwt7eyoR49lUIyyrjb98Yfa50JCMqF2cePJAEVI6oe2o1sIhw==
vscode-languageclient@^8.0.2-next.4:
version "8.0.2-next.4"
resolved "https://registry.yarnpkg.com/vscode-languageclient/-/vscode-languageclient-8.0.2-next.4.tgz#87dd364ffbd4356aff3af14e7b557d9fe34d2b67"
integrity sha512-j9BEiCYMN9IoKwYdk9iickV6WNPVGPoVO11SMdoxFnWPIT3y5UAe3qf/WsfA9OdklAIaxxYasfgyKCpBjSPNuw==
dependencies:
minimatch "^3.0.4"
semver "^7.3.5"
vscode-languageserver-protocol "3.17.1"
vscode-languageserver-protocol "3.17.2-next.5"
vscode-languageserver-protocol@3.17.1:
version "3.17.1"
resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.1.tgz#e801762c304f740208b6c804a0cf21f2c87509ed"
integrity sha512-BNlAYgQoYwlSgDLJhSG+DeA8G1JyECqRzM2YO6tMmMji3Ad9Mw6AW7vnZMti90qlAKb0LqAlJfSVGEdqMMNzKg==
vscode-languageserver-protocol@3.17.2-next.5:
version "3.17.2-next.5"
resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.2-next.5.tgz#9bc747411c3ce9e1d73c2714bf6555e0199eec26"
integrity sha512-UlH+QL4Q4lX94of/UPDDwwWIkd8w7dtMW4khzvEDUoykiG9tba0iG6V0bAiv8XVpnBIUYjL2FNFiL3zl+TY1Sw==
dependencies:
vscode-jsonrpc "8.0.1"
vscode-languageserver-types "3.17.1"
vscode-jsonrpc "8.0.2-next.1"
vscode-languageserver-types "3.17.2-next.2"
vscode-languageserver-types@3.17.1:
version "3.17.1"
resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.1.tgz#c2d87fa7784f8cac389deb3ff1e2d9a7bef07e16"
integrity sha512-K3HqVRPElLZVVPtMeKlsyL9aK0GxGQpvtAUTfX4k7+iJ4mc1M+JM+zQwkgGy2LzY0f0IAafe8MKqIkJrxfGGjQ==
vscode-languageserver-types@3.17.2-next.2:
version "3.17.2-next.2"
resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.2-next.2.tgz#af5d6978eee7682aab87c1419323f5b141ac6596"
integrity sha512-TiAkLABgqkVWdAlC3XlOfdhdjIAdVU4YntPUm9kKGbXr+MGwpVnKz2KZMNBcvG0CFx8Hi8qliL0iq+ndPB720w==
vscode-nls@^5.0.1:
version "5.0.1"

View file

@ -28,7 +28,7 @@
"configuration.markdown.links.openLocation.currentGroup": "Open links in the active editor group.",
"configuration.markdown.links.openLocation.beside": "Open links beside the active editor.",
"configuration.markdown.suggest.paths.enabled.description": "Enable/disable path suggestions for markdown links",
"configuration.markdown.editor.drop.enabled": "Enable/disable dropping into the markdown editor to insert shift. Requires enabling `#workbenck.experimental.editor.dropIntoEditor.enabled#`.",
"configuration.markdown.editor.drop.enabled": "Enable/disable dropping into the markdown editor to insert shift. Requires enabling `#workbench.experimental.editor.dropIntoEditor.enabled#`.",
"configuration.markdown.editor.pasteLinks.enabled": "Enable/disable pasting files into a Markdown editor inserts Markdown links.",
"configuration.markdown.experimental.validate.enabled.description": "Enable/disable all error reporting in Markdown files.",
"configuration.markdown.experimental.validate.referenceLinks.enabled.description": "Validate reference links in Markdown files, e.g. `[link][ref]`. Requires enabling `#markdown.experimental.validate.enabled#`.",

View file

@ -4,7 +4,7 @@
"license": "MIT",
"description": "Dependencies shared by all extensions",
"dependencies": {
"typescript": "4.7"
"typescript": "4.7.3"
},
"scripts": {
"postinstall": "node ./postinstall.mjs"

View file

@ -42,10 +42,10 @@ node-gyp-build@^4.3.0:
resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.3.0.tgz#9f256b03e5826150be39c764bf51e993946d71a3"
integrity sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q==
typescript@4.7:
version "4.7.2"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.7.2.tgz#1f9aa2ceb9af87cca227813b4310fff0b51593c4"
integrity sha512-Mamb1iX2FDUpcTRzltPxgWMKy3fhg0TN378ylbktPGPK/99KbDtMQ4W1hwgsbPAsG3a0xKa1vmw4VKZQbkvz5A==
typescript@4.7.3:
version "4.7.3"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.7.3.tgz#8364b502d5257b540f9de4c40be84c98e23a129d"
integrity sha512-WOkT3XYvrpXx4vMMqlD+8R8R37fZkjyLGlxavMc4iB8lrl8L0DeTcHbYgw/v0N/z9wAFsgBhcsF0ruoySS22mA==
vscode-grammar-updater@^1.1.0:
version "1.1.0"

View file

@ -1,7 +1,7 @@
{
"name": "code-oss-dev",
"version": "1.68.0",
"distro": "1af1d9e4f6e2609bd0eb3dea3786ef1571338986",
"distro": "2966cd72fc1a3a5fb89bf2d85a1a66e56206961a",
"author": {
"name": "Microsoft Corporation"
},
@ -85,12 +85,12 @@
"vscode-proxy-agent": "^0.12.0",
"vscode-regexpp": "^3.1.0",
"vscode-textmate": "7.0.1",
"xterm": "4.19.0-beta.56",
"xterm": "4.19.0-beta.58",
"xterm-addon-search": "0.9.0-beta.39",
"xterm-addon-serialize": "0.7.0-beta.12",
"xterm-addon-unicode11": "0.4.0-beta.3",
"xterm-addon-webgl": "0.12.0-beta.36",
"xterm-headless": "4.19.0-beta.56",
"xterm-addon-webgl": "0.12.0-beta.37",
"xterm-headless": "4.19.0-beta.58",
"yauzl": "^2.9.2",
"yazl": "^2.4.3"
},

View file

@ -24,12 +24,12 @@
"vscode-proxy-agent": "^0.12.0",
"vscode-regexpp": "^3.1.0",
"vscode-textmate": "7.0.1",
"xterm": "4.19.0-beta.56",
"xterm": "4.19.0-beta.58",
"xterm-addon-search": "0.9.0-beta.39",
"xterm-addon-serialize": "0.7.0-beta.12",
"xterm-addon-unicode11": "0.4.0-beta.3",
"xterm-addon-webgl": "0.12.0-beta.36",
"xterm-headless": "4.19.0-beta.56",
"xterm-addon-webgl": "0.12.0-beta.37",
"xterm-headless": "4.19.0-beta.58",
"yauzl": "^2.9.2",
"yazl": "^2.4.3"
},

View file

@ -10,9 +10,9 @@
"tas-client-umd": "0.1.6",
"vscode-oniguruma": "1.6.1",
"vscode-textmate": "7.0.1",
"xterm": "4.19.0-beta.56",
"xterm": "4.19.0-beta.58",
"xterm-addon-search": "0.9.0-beta.39",
"xterm-addon-unicode11": "0.4.0-beta.3",
"xterm-addon-webgl": "0.12.0-beta.36"
"xterm-addon-webgl": "0.12.0-beta.37"
}
}

View file

@ -123,12 +123,12 @@ xterm-addon-unicode11@0.4.0-beta.3:
resolved "https://registry.yarnpkg.com/xterm-addon-unicode11/-/xterm-addon-unicode11-0.4.0-beta.3.tgz#f350184155fafd5ad0d6fbf31d13e6ca7dea1efa"
integrity sha512-FryZAVwbUjKTmwXnm1trch/2XO60F5JsDvOkZhzobV1hm10sFLVuZpFyHXiUx7TFeeFsvNP+S77LAtWoeT5z+Q==
xterm-addon-webgl@0.12.0-beta.36:
version "0.12.0-beta.36"
resolved "https://registry.yarnpkg.com/xterm-addon-webgl/-/xterm-addon-webgl-0.12.0-beta.36.tgz#460f80829a78c979a448d5b764699af3f0366ff1"
integrity sha512-sgX7OHSGZQZE5b4xtPqd/5NEcll0Z+00tnTVxKZlXf5XEENcG0tnBF4I4f+k9K3cmjE1UIUVG2yYPrqWlYCdpA==
xterm-addon-webgl@0.12.0-beta.37:
version "0.12.0-beta.37"
resolved "https://registry.yarnpkg.com/xterm-addon-webgl/-/xterm-addon-webgl-0.12.0-beta.37.tgz#e465100041a7e0b1d32b01cd0b0ba5a516ac13c2"
integrity sha512-d4GfKlMrWZGzsMfMHd2siG+QiOvwikhwiu+JQlIhlnAShT/wU5BOGbNfDDA1tHmkW7G1UCFgucBuVxrs5wjuBQ==
xterm@4.19.0-beta.56:
version "4.19.0-beta.56"
resolved "https://registry.yarnpkg.com/xterm/-/xterm-4.19.0-beta.56.tgz#a3f1021b43ac04aa0c3f7b06f1b44ad34d487879"
integrity sha512-kywKIK61oPjbloZI+jXY1zgjQm/ghOsFFMjb79IIMaWocUDDqdpo9MmGwziTVZYu4w/Air2Zfas9UWBu4/KEyA==
xterm@4.19.0-beta.58:
version "4.19.0-beta.58"
resolved "https://registry.yarnpkg.com/xterm/-/xterm-4.19.0-beta.58.tgz#cbe535b0b85bc7f8ae3cc242df006bea04cdf541"
integrity sha512-fr3QC2qS2NBab8X7kwA/3QZELzQqhAKsngvK8NkhsrFN1DAuyEETkzqXuKbO7OKpCB6VqGDN6GPkNlUB9VrIDA==

View file

@ -929,20 +929,20 @@ xterm-addon-unicode11@0.4.0-beta.3:
resolved "https://registry.yarnpkg.com/xterm-addon-unicode11/-/xterm-addon-unicode11-0.4.0-beta.3.tgz#f350184155fafd5ad0d6fbf31d13e6ca7dea1efa"
integrity sha512-FryZAVwbUjKTmwXnm1trch/2XO60F5JsDvOkZhzobV1hm10sFLVuZpFyHXiUx7TFeeFsvNP+S77LAtWoeT5z+Q==
xterm-addon-webgl@0.12.0-beta.36:
version "0.12.0-beta.36"
resolved "https://registry.yarnpkg.com/xterm-addon-webgl/-/xterm-addon-webgl-0.12.0-beta.36.tgz#460f80829a78c979a448d5b764699af3f0366ff1"
integrity sha512-sgX7OHSGZQZE5b4xtPqd/5NEcll0Z+00tnTVxKZlXf5XEENcG0tnBF4I4f+k9K3cmjE1UIUVG2yYPrqWlYCdpA==
xterm-addon-webgl@0.12.0-beta.37:
version "0.12.0-beta.37"
resolved "https://registry.yarnpkg.com/xterm-addon-webgl/-/xterm-addon-webgl-0.12.0-beta.37.tgz#e465100041a7e0b1d32b01cd0b0ba5a516ac13c2"
integrity sha512-d4GfKlMrWZGzsMfMHd2siG+QiOvwikhwiu+JQlIhlnAShT/wU5BOGbNfDDA1tHmkW7G1UCFgucBuVxrs5wjuBQ==
xterm-headless@4.19.0-beta.56:
version "4.19.0-beta.56"
resolved "https://registry.yarnpkg.com/xterm-headless/-/xterm-headless-4.19.0-beta.56.tgz#7e6bdc8d647916bf5de64a73eee6bd508d25e344"
integrity sha512-EZoR/HqZoernhFngFQp7gUPy+G0TpEJkbJ9HVZcINC3m8wuV1wZKfZ4xBhsRPfhSJ7rsPnqbC+qez5ZjxwYEIw==
xterm-headless@4.19.0-beta.58:
version "4.19.0-beta.58"
resolved "https://registry.yarnpkg.com/xterm-headless/-/xterm-headless-4.19.0-beta.58.tgz#3a38cf3b9cd2606fb342a5cf8f2a0cfb963a62e8"
integrity sha512-wKQW8VzkFjyYDvcaM26gulo+YghyocfkZnKMH7gc/+/mFn3YXUPBPuOcX6e0M7NibyMlewpQpZjHQUPLBjkzfw==
xterm@4.19.0-beta.56:
version "4.19.0-beta.56"
resolved "https://registry.yarnpkg.com/xterm/-/xterm-4.19.0-beta.56.tgz#a3f1021b43ac04aa0c3f7b06f1b44ad34d487879"
integrity sha512-kywKIK61oPjbloZI+jXY1zgjQm/ghOsFFMjb79IIMaWocUDDqdpo9MmGwziTVZYu4w/Air2Zfas9UWBu4/KEyA==
xterm@4.19.0-beta.58:
version "4.19.0-beta.58"
resolved "https://registry.yarnpkg.com/xterm/-/xterm-4.19.0-beta.58.tgz#cbe535b0b85bc7f8ae3cc242df006bea04cdf541"
integrity sha512-fr3QC2qS2NBab8X7kwA/3QZELzQqhAKsngvK8NkhsrFN1DAuyEETkzqXuKbO7OKpCB6VqGDN6GPkNlUB9VrIDA==
yallist@^4.0.0:
version "4.0.0"

View file

@ -63,7 +63,7 @@ else
export ELECTRON_ENABLE_LOGGING=1
# Running from a build, we need to enable the vscode-test-resolver extension
EXTRA_INTEGRATION_TEST_ARGUMENTS="--extensions-dir=$EXT_PATH --enable-proposed-api=vscode.vscode-test-resolver --enable-proposed-api=vscode.vscode-api-tests"
EXTRA_INTEGRATION_TEST_ARGUMENTS="--extensions-dir=$EXT_PATH --enable-proposed-api=vscode.vscode-test-resolver --enable-proposed-api=vscode.vscode-api-tests --enable-proposed-api=vscode.markdown-language-features --enable-proposed-api=vscode.git"
echo "Storing crash reports into '$VSCODECRASHDIR'."
echo "Storing log files into '$VSCODELOGSDIR'."

View file

@ -17,7 +17,7 @@
.fullscreen .menubar:not(.compact) {
margin: 0px;
padding: 0px 5px;
padding: 4px 5px;
}
.menubar > .menubar-menu-button {

View file

@ -446,8 +446,8 @@ class FastRenderedViewLine implements IRenderedViewLine {
}
private _getCharPosition(column: number): number {
const charOffset = this._characterMapping.getAbsoluteOffset(column);
return this._charWidth * charOffset;
const horizontalOffset = this._characterMapping.getHorizontalOffset(column);
return this._charWidth * horizontalOffset;
}
public getColumnOfNodeOffset(lineNumber: number, spanNode: HTMLElement, offset: number): number {
@ -625,8 +625,8 @@ class RenderedViewLine implements IRenderedViewLine {
}
const result = r[0].left;
if (this.input.isBasicASCII) {
const charOffset = this._characterMapping.getAbsoluteOffset(column);
const expectedResult = Math.round(this.input.spaceWidth * charOffset);
const horizontalOffset = this._characterMapping.getHorizontalOffset(column);
const expectedResult = Math.round(this.input.spaceWidth * horizontalOffset);
if (Math.abs(expectedResult - result) <= 1) {
return expectedResult;
}

View file

@ -2495,7 +2495,7 @@ class InlineViewZonesComputer extends ViewZonesComputer {
marginDomNode.appendChild(marginElement);
}
return output.characterMapping.getAbsoluteOffset(output.characterMapping.length);
return output.characterMapping.getHorizontalOffset(output.characterMapping.length);
}
}

View file

@ -160,7 +160,7 @@ function getClassifier(): CharacterClassifier<CharacterClass> {
_classifier.set(FORCE_TERMINATION_CHARACTERS.charCodeAt(i), CharacterClass.ForceTermination);
}
const CANNOT_END_WITH_CHARACTERS = '.,;';
const CANNOT_END_WITH_CHARACTERS = '.,;:';
for (let i = 0; i < CANNOT_END_WITH_CHARACTERS.length; i++) {
_classifier.set(CANNOT_END_WITH_CHARACTERS.charCodeAt(i), CharacterClass.CannotEndIn);
}

View file

@ -127,7 +127,11 @@ export class BracketPairsTextModelPart extends Disposable implements IBracketPai
if (this.canBuildAST) {
const closingBracketInfo = this.languageConfigurationService
.getLanguageConfiguration(languageId)
.bracketsNew.getClosingBracketInfo(_bracket)!;
.bracketsNew.getClosingBracketInfo(_bracket);
if (!closingBracketInfo) {
return null;
}
const bracketPair = findLast(this.getBracketPairsInRange(Range.fromPositions(_position, _position)) || [], (b) =>
closingBracketInfo.closes(b.openingBracketInfo)

View file

@ -199,7 +199,7 @@ class NonPeekableTextBufferTokenizer {
const endOffset = lineTokens.getEndOffset(this.lineTokenOffset);
// Is there a bracket token next? Only consume text.
if (containsBracketType && isOther && endOffset !== this.lineCharOffset) {
if (containsBracketType && isOther && this.lineCharOffset < endOffset) {
const languageId = lineTokens.getLanguageId(this.lineTokenOffset);
const text = this.line.substring(this.lineCharOffset, endOffset);

View file

@ -205,29 +205,29 @@ export class CharacterMapping {
public readonly length: number;
private readonly _data: Uint32Array;
private readonly _absoluteOffsets: Uint32Array;
private readonly _horizontalOffset: Uint32Array;
constructor(length: number, partCount: number) {
this.length = length;
this._data = new Uint32Array(this.length);
this._absoluteOffsets = new Uint32Array(this.length);
this._horizontalOffset = new Uint32Array(this.length);
}
public setColumnInfo(column: number, partIndex: number, charIndex: number, partAbsoluteOffset: number): void {
public setColumnInfo(column: number, partIndex: number, charIndex: number, horizontalOffset: number): void {
const partData = (
(partIndex << CharacterMappingConstants.PART_INDEX_OFFSET)
| (charIndex << CharacterMappingConstants.CHAR_INDEX_OFFSET)
) >>> 0;
this._data[column - 1] = partData;
this._absoluteOffsets[column - 1] = partAbsoluteOffset + charIndex;
this._horizontalOffset[column - 1] = horizontalOffset;
}
public getAbsoluteOffset(column: number): number {
if (this._absoluteOffsets.length === 0) {
public getHorizontalOffset(column: number): number {
if (this._horizontalOffset.length === 0) {
// No characters on this line
return 0;
}
return this._absoluteOffsets[column - 1];
return this._horizontalOffset[column - 1];
}
private charOffsetToPartData(charOffset: number): number {
@ -314,6 +314,18 @@ export class CharacterMapping {
}
return max;
}
public inflate() {
const result: [number, number, number][] = [];
for (let i = 0; i < this.length; i++) {
const partData = this._data[i];
const partIndex = CharacterMapping.getPartIndex(partData);
const charIndex = CharacterMapping.getCharIndex(partData);
const visibleColumn = this._horizontalOffset[i];
result.push([partIndex, charIndex, visibleColumn]);
}
return result;
}
}
export const enum ForeignElementType {
@ -914,11 +926,10 @@ function _renderLine(input: ResolvedRenderLineInput, sb: IStringBuilder): Render
let charIndex = 0;
let visibleColumn = startVisibleColumn;
let charOffsetInPart = 0;
let charOffsetInPart = 0; // the character offset in the current part
let charHorizontalOffset = 0; // the character horizontal position in terms of chars relative to line start
let partDisplacement = 0;
let prevPartContentCnt = 0;
let partAbsoluteOffset = 0;
if (containsRTL) {
sb.appendASCIIString('<span dir="ltr">');
@ -927,7 +938,6 @@ function _renderLine(input: ResolvedRenderLineInput, sb: IStringBuilder): Render
}
for (let partIndex = 0, tokensLen = parts.length; partIndex < tokensLen; partIndex++) {
partAbsoluteOffset += prevPartContentCnt;
const part = parts[partIndex];
const partEndIndex = part.endIndex;
@ -948,7 +958,7 @@ function _renderLine(input: ResolvedRenderLineInput, sb: IStringBuilder): Render
if (partRendersWhitespace) {
let partContentCnt = 0;
let partWidth = 0;
{
let _charIndex = charIndex;
let _visibleColumn = visibleColumn;
@ -956,7 +966,7 @@ function _renderLine(input: ResolvedRenderLineInput, sb: IStringBuilder): Render
for (; _charIndex < partEndIndex; _charIndex++) {
const charCode = lineContent.charCodeAt(_charIndex);
const charWidth = (charCode === CharCode.Tab ? (tabSize - (_visibleColumn % tabSize)) : 1) | 0;
partContentCnt += charWidth;
partWidth += charWidth;
if (_charIndex >= fauxIndentLength) {
_visibleColumn += charWidth;
}
@ -965,19 +975,22 @@ function _renderLine(input: ResolvedRenderLineInput, sb: IStringBuilder): Render
if (partRendersWhitespaceWithWidth) {
sb.appendASCIIString(' style="width:');
sb.appendASCIIString(String(spaceWidth * partContentCnt));
sb.appendASCIIString(String(spaceWidth * partWidth));
sb.appendASCIIString('px"');
}
sb.appendASCII(CharCode.GreaterThan);
for (; charIndex < partEndIndex; charIndex++) {
characterMapping.setColumnInfo(charIndex + 1, partIndex - partDisplacement, charOffsetInPart, partAbsoluteOffset);
characterMapping.setColumnInfo(charIndex + 1, partIndex - partDisplacement, charOffsetInPart, charHorizontalOffset);
partDisplacement = 0;
const charCode = lineContent.charCodeAt(charIndex);
let producedCharacters: number;
let charWidth: number;
if (charCode === CharCode.Tab) {
charWidth = (tabSize - (visibleColumn % tabSize)) | 0;
producedCharacters = (tabSize - (visibleColumn % tabSize)) | 0;
charWidth = producedCharacters;
if (!canUseHalfwidthRightwardsArrow || charWidth > 1) {
sb.write1(0x2192); // RIGHTWARDS ARROW
@ -989,29 +1002,26 @@ function _renderLine(input: ResolvedRenderLineInput, sb: IStringBuilder): Render
}
} else { // must be CharCode.Space
producedCharacters = 2;
charWidth = 1;
sb.write1(0x200C); // ZERO WIDTH NON-JOINER
sb.write1(renderSpaceCharCode); // &middot; or word separator middle dot
sb.write1(0x200C); // ZERO WIDTH NON-JOINER
}
charOffsetInPart += charWidth;
charOffsetInPart += producedCharacters;
charHorizontalOffset += charWidth;
if (charIndex >= fauxIndentLength) {
visibleColumn += charWidth;
}
}
prevPartContentCnt = partContentCnt;
} else {
let partContentCnt = 0;
sb.appendASCII(CharCode.GreaterThan);
for (; charIndex < partEndIndex; charIndex++) {
characterMapping.setColumnInfo(charIndex + 1, partIndex - partDisplacement, charOffsetInPart, partAbsoluteOffset);
characterMapping.setColumnInfo(charIndex + 1, partIndex - partDisplacement, charOffsetInPart, charHorizontalOffset);
partDisplacement = 0;
const charCode = lineContent.charCodeAt(charIndex);
@ -1074,19 +1084,18 @@ function _renderLine(input: ResolvedRenderLineInput, sb: IStringBuilder): Render
sb.appendASCIIString(to4CharHex(charCode));
sb.appendASCIIString(']');
producedCharacters = 8;
charWidth = producedCharacters;
} else {
sb.write1(charCode);
}
}
charOffsetInPart += producedCharacters;
partContentCnt += producedCharacters;
charHorizontalOffset += charWidth;
if (charIndex >= fauxIndentLength) {
visibleColumn += charWidth;
}
}
prevPartContentCnt = partContentCnt;
}
if (partIsEmptyAndHasPseudoAfter) {
@ -1097,7 +1106,7 @@ function _renderLine(input: ResolvedRenderLineInput, sb: IStringBuilder): Render
if (charIndex >= len && !lastCharacterMappingDefined && part.isPseudoAfter()) {
lastCharacterMappingDefined = true;
characterMapping.setColumnInfo(charIndex + 1, partIndex, charOffsetInPart, partAbsoluteOffset);
characterMapping.setColumnInfo(charIndex + 1, partIndex, charOffsetInPart, charHorizontalOffset);
}
sb.appendASCIIString('</span>');
@ -1107,7 +1116,7 @@ function _renderLine(input: ResolvedRenderLineInput, sb: IStringBuilder): Render
if (!lastCharacterMappingDefined) {
// When getting client rects for the last character, we will position the
// text range at the end of the span, insteaf of at the beginning of next span
characterMapping.setColumnInfo(len + 1, parts.length - 1, charOffsetInPart, partAbsoluteOffset);
characterMapping.setColumnInfo(len + 1, parts.length - 1, charOffsetInPart, charHorizontalOffset);
}
if (isOverflowing) {

View file

@ -251,4 +251,11 @@ suite('Editor Modes - Link Computer', () => {
' https://zh.wikipedia.org/wiki/“常凯申”误译事件 '
);
});
test('issue #150905: Colon after bare hyperlink is treated as its part', () => {
assertLink(
'https://site.web/page.html: blah blah blah',
'https://site.web/page.html '
);
});
});

View file

@ -131,4 +131,42 @@ suite('ModelService', () => {
]));
assert.deepStrictEqual(result.toString(), expected.toString());
});
test('issue #149130: vscode freezes because of Bracket Pair Colorization', () => {
const languageId = 'q';
disposables.add(languageService.registerLanguage({ id: languageId }));
const legend = {
tokenTypes: ['st0', 'st1', 'st2', 'st3', 'st4', 'st5'],
tokenModifiers: ['stm0', 'stm1', 'stm2']
};
instantiationService.stub(IThemeService, <Partial<IThemeService>>{
getColorTheme() {
return {
getTokenStyleMetadata: (tokenType, tokenModifiers, languageId): ITokenStyle => {
return {
foreground: parseInt(tokenType.substr(2), 10),
bold: undefined,
underline: undefined,
strikethrough: undefined,
italic: undefined
};
}
};
}
});
const styling = instantiationService.createInstance(SemanticTokensProviderStyling, legend);
const badTokens = {
data: new Uint32Array([
0, 11, 1, 1, 0,
0, 4, 1, 1, 0,
0, 4294967289, 1, 1, 0
])
};
const result = toMultilineTokens2(badTokens, styling, languageId);
const expected = SparseMultilineTokens.create(1, new Uint32Array([
0, 11, 12, (MetadataConsts.SEMANTIC_USE_FOREGROUND | (1 << MetadataConsts.FOREGROUND_OFFSET)),
0, 15, 16, (MetadataConsts.SEMANTIC_USE_FOREGROUND | (1 << MetadataConsts.FOREGROUND_OFFSET)),
]));
assert.deepStrictEqual(result.toString(), expected.toString());
});
});

File diff suppressed because it is too large Load diff

View file

@ -88,7 +88,7 @@ export abstract class AbstractExtensionManagementService extends Disposable impl
if (!this.galleryService.isEnabled()) {
throw new ExtensionManagementError(nls.localize('MarketPlaceDisabled', "Marketplace is not enabled"), ExtensionManagementErrorCode.Internal);
}
const compatible = await this.checkAndGetCompatibleVersion(extension, !options.installGivenVersion, !!options.installPreReleaseVersion);
const compatible = await this.checkAndGetCompatibleVersion(extension, !!options.installGivenVersion, !!options.installPreReleaseVersion);
return await this.installExtension(compatible.manifest, compatible.extension, options);
} catch (error) {
reportTelemetry(this.telemetryService, 'extensionGallery:install', { extensionData: getGalleryExtensionTelemetryData(extension), error });
@ -336,7 +336,7 @@ export abstract class AbstractExtensionManagementService extends Disposable impl
const isDependency = dependecies.some(id => areSameExtensions({ id }, galleryExtension.identifier));
let compatible;
try {
compatible = await this.checkAndGetCompatibleVersion(galleryExtension, true, installPreRelease);
compatible = await this.checkAndGetCompatibleVersion(galleryExtension, false, installPreRelease);
} catch (error) {
if (error instanceof ExtensionManagementError && error.code === ExtensionManagementErrorCode.IncompatibleTargetPlatform && !isDependency) {
this.logService.info('Skipping the packed extension as it cannot be installed', galleryExtension.identifier.id);
@ -357,7 +357,7 @@ export abstract class AbstractExtensionManagementService extends Disposable impl
return allDependenciesAndPacks.filter(e => !installed.some(i => areSameExtensions(i.identifier, e.gallery.identifier)));
}
private async checkAndGetCompatibleVersion(extension: IGalleryExtension, fetchCompatibleVersion: boolean, installPreRelease: boolean): Promise<{ extension: IGalleryExtension; manifest: IExtensionManifest }> {
private async checkAndGetCompatibleVersion(extension: IGalleryExtension, sameVersion: boolean, installPreRelease: boolean): Promise<{ extension: IGalleryExtension; manifest: IExtensionManifest }> {
const report = await this.getExtensionsControlManifest();
if (getMaliciousExtensionsSet(report).has(extension.identifier.id)) {
throw new ExtensionManagementError(nls.localize('malicious extension', "Can't install '{0}' extension since it was reported to be problematic.", extension.identifier.id), ExtensionManagementErrorCode.Malicious);
@ -368,9 +368,9 @@ export abstract class AbstractExtensionManagementService extends Disposable impl
throw new ExtensionManagementError(nls.localize('incompatible platform', "The '{0}' extension is not available in {1} for {2}.", extension.identifier.id, this.productService.nameLong, TargetPlatformToString(targetPlatform)), ExtensionManagementErrorCode.IncompatibleTargetPlatform);
}
const compatibleExtension = await this.getCompatibleVersion(extension, fetchCompatibleVersion, installPreRelease);
const compatibleExtension = await this.getCompatibleVersion(extension, sameVersion, installPreRelease);
if (compatibleExtension) {
if (installPreRelease && fetchCompatibleVersion && extension.hasPreReleaseVersion && !compatibleExtension.properties.isPreReleaseVersion) {
if (installPreRelease && !sameVersion && extension.hasPreReleaseVersion && !compatibleExtension.properties.isPreReleaseVersion) {
throw new ExtensionManagementError(nls.localize('notFoundCompatiblePrereleaseDependency', "Can't install pre-release version of '{0}' extension because it is not compatible with the current version of {1} (version {2}).", extension.identifier.id, this.productService.nameLong, this.productService.version), ExtensionManagementErrorCode.IncompatiblePreRelease);
}
} else {
@ -394,11 +394,11 @@ export abstract class AbstractExtensionManagementService extends Disposable impl
return { extension: compatibleExtension, manifest };
}
protected async getCompatibleVersion(extension: IGalleryExtension, fetchCompatibleVersion: boolean, includePreRelease: boolean): Promise<IGalleryExtension | null> {
protected async getCompatibleVersion(extension: IGalleryExtension, sameVersion: boolean, includePreRelease: boolean): Promise<IGalleryExtension | null> {
const targetPlatform = await this.getTargetPlatform();
let compatibleExtension: IGalleryExtension | null = null;
if (fetchCompatibleVersion && extension.hasPreReleaseVersion && extension.properties.isPreReleaseVersion !== includePreRelease) {
if (!sameVersion && extension.hasPreReleaseVersion && extension.properties.isPreReleaseVersion !== includePreRelease) {
compatibleExtension = (await this.galleryService.getExtensions([{ ...extension.identifier, preRelease: includePreRelease }], { targetPlatform, compatible: true }, CancellationToken.None))[0] || null;
}
@ -406,8 +406,12 @@ export abstract class AbstractExtensionManagementService extends Disposable impl
compatibleExtension = extension;
}
if (!compatibleExtension && fetchCompatibleVersion) {
compatibleExtension = await this.galleryService.getCompatibleExtension(extension, includePreRelease, targetPlatform);
if (!compatibleExtension) {
if (sameVersion) {
compatibleExtension = (await this.galleryService.getExtensions([{ ...extension.identifier, version: extension.version }], { targetPlatform, compatible: true }, CancellationToken.None))[0] || null;
} else {
compatibleExtension = await this.galleryService.getCompatibleExtension(extension, includePreRelease, targetPlatform);
}
}
return compatibleExtension;

View file

@ -237,20 +237,21 @@ const DefaultQueryState: IQueryState = {
type GalleryServiceQueryClassification = {
owner: 'sandy081';
readonly filterTypes: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' };
readonly flags: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' };
readonly sortBy: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' };
readonly sortOrder: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' };
readonly pageNumber: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' };
readonly duration: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth'; 'isMeasurement': true };
readonly success: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' };
readonly requestBodySize: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' };
readonly responseBodySize?: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' };
readonly statusCode?: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' };
readonly errorCode?: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' };
readonly count?: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' };
readonly source?: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' };
readonly searchTextLength?: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' };
comment: 'Information about Marketplace query and its response';
readonly filterTypes: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'Filter types used in the query.' };
readonly flags: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'Flags passed in the query.' };
readonly sortBy: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'sorted by option passed in the query' };
readonly sortOrder: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'sort order option passed in the query' };
readonly pageNumber: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'requested page number in the query' };
readonly duration: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth'; 'isMeasurement': true; comment: 'amount of time taken by the query request' };
readonly success: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'whether the query reques is success or not' };
readonly requestBodySize: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'size of the request body' };
readonly responseBodySize?: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'size of the response body' };
readonly statusCode?: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'status code of the response' };
readonly errorCode?: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'error code of the response' };
readonly count?: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'total number of extensions matching the query' };
readonly source?: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'source that requested this query, eg., recommendations, viewlet' };
readonly searchTextLength?: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'length of the search text in the query' };
};
type QueryTelemetryData = {
@ -275,8 +276,9 @@ type GalleryServiceQueryEvent = QueryTelemetryData & {
type GalleryServiceAdditionalQueryClassification = {
owner: 'sandy081';
readonly duration: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth'; 'isMeasurement': true };
readonly count: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' };
comment: 'Response information about the additional query to the Marketplace for fetching all versions to get release version';
readonly duration: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth'; 'isMeasurement': true; comment: 'Amount of time taken by the additional query' };
readonly count: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'Total number of extensions returned by this additional query' };
};
type GalleryServiceAdditionalQueryEvent = {
@ -1134,8 +1136,9 @@ abstract class AbstractExtensionGalleryService implements IExtensionGalleryServi
const message = getErrorMessage(err);
type GalleryServiceCDNFallbackClassification = {
owner: 'sandy081';
url: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' };
message: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' };
comment: 'Fallback request information when the primary asset request to CDN fails';
url: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'asset url that failed' };
message: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'error message' };
};
type GalleryServiceCDNFallbackEvent = {
url: string;

View file

@ -28,8 +28,9 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
type ExeExtensionRecommendationsClassification = {
owner: 'sandy081';
extensionId: { classification: 'PublicNonPersonalData'; purpose: 'FeatureInsight' };
exeName: { classification: 'PublicNonPersonalData'; purpose: 'FeatureInsight' };
comment: 'Information about executable based extension recommendation';
extensionId: { classification: 'PublicNonPersonalData'; purpose: 'FeatureInsight'; comment: 'id of the recommended extension' };
exeName: { classification: 'PublicNonPersonalData'; purpose: 'FeatureInsight'; comment: 'name of the executable for which extension is being recommended' };
};
type IExeBasedExtensionTips = {

View file

@ -17,9 +17,10 @@ import { DBClosedError, IndexedDB } from 'vs/base/browser/indexedDB';
export type IndexedDBFileSystemProviderErrorDataClassification = {
owner: 'sandy081';
readonly scheme: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' };
readonly operation: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' };
readonly code: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth' };
comment: 'Information about errors that occur in the IndexedDB file system provider';
readonly scheme: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'IndexedDB file system provider scheme for which this error occurred' };
readonly operation: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'operation during which this error occurred' };
readonly code: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth'; comment: 'error code' };
};
export type IndexedDBFileSystemProviderErrorData = {

View file

@ -28,9 +28,10 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity';
import { Change, getLastSyncResourceUri, IRemoteUserData, IResourcePreview as IBaseResourcePreview, ISyncData, ISyncResourceHandle, ISyncResourcePreview as IBaseSyncResourcePreview, IUserData, IUserDataInitializer, IUserDataManifest, IUserDataSyncBackupStoreService, IUserDataSyncConfiguration, IUserDataSynchroniser, IUserDataSyncLogService, IUserDataSyncEnablementService, IUserDataSyncStoreService, IUserDataSyncUtilService, MergeState, PREVIEW_DIR_NAME, SyncResource, SyncStatus, UserDataSyncError, UserDataSyncErrorCode, USER_DATA_SYNC_CONFIGURATION_SCOPE, USER_DATA_SYNC_SCHEME } from 'vs/platform/userDataSync/common/userDataSync';
type SyncSourceClassification = {
type IncompatibleSyncSourceClassification = {
owner: 'sandy081';
source?: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true };
comment: 'Information about the sync resource that is incompatible';
source: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'settings sync resource. eg., settings, keybindings...' };
};
export function isSyncData(thing: any): thing is ISyncData {
@ -168,15 +169,6 @@ export abstract class AbstractSynchroniser extends Disposable implements IUserDa
protected setStatus(status: SyncStatus): void {
if (this._status !== status) {
const oldStatus = this._status;
if (status === SyncStatus.HasConflicts) {
// Log to telemetry when there is a sync conflict
this.telemetryService.publicLog2<{ source: string }, SyncSourceClassification>('sync/conflictsDetected', { source: this.resource });
}
if (oldStatus === SyncStatus.HasConflicts && status === SyncStatus.Idle) {
// Log to telemetry when conflicts are resolved
this.telemetryService.publicLog2<{ source: string }, SyncSourceClassification>('sync/conflictsResolved', { source: this.resource });
}
this._status = status;
this._onDidChangStatus.fire(status);
}
@ -306,7 +298,7 @@ export abstract class AbstractSynchroniser extends Disposable implements IUserDa
private async performSync(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null, apply: boolean, userDataSyncConfiguration: IUserDataSyncConfiguration): Promise<SyncStatus> {
if (remoteUserData.syncData && remoteUserData.syncData.version > this.version) {
// current version is not compatible with cloud version
this.telemetryService.publicLog2<{ source: string }, SyncSourceClassification>('sync/incompatible', { source: this.resource });
this.telemetryService.publicLog2<{ source: string }, IncompatibleSyncSourceClassification>('sync/incompatible', { source: this.resource });
throw new UserDataSyncError(localize({ key: 'incompatible', comment: ['This is an error while syncing a resource that its local version is not compatible with its remote version.'] }, "Cannot sync {0} as its local version {1} is not compatible with its remote version {2}", this.resource, this.version, remoteUserData.syncData.version), UserDataSyncErrorCode.IncompatibleLocalContent, this.resource);
}

View file

@ -23,13 +23,15 @@ import { IUserDataSyncMachinesService } from 'vs/platform/userDataSync/common/us
type AutoSyncClassification = {
owner: 'sandy081';
sources: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true };
comment: 'Information about the sources triggering auto sync';
sources: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'Source that triggered auto sync' };
};
type AutoSyncErrorClassification = {
owner: 'sandy081';
code: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true };
service: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true };
comment: 'Information about the error that causes auto sync to fail';
code: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'error code' };
service: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'Settings sync service for which this error has occurred' };
};
const disableMachineEventuallyKey = 'sync.disableMachineEventually';
@ -196,7 +198,7 @@ export class UserDataAutoSyncService extends Disposable implements IUserDataAuto
// Reset
if (everywhere) {
this.telemetryService.publicLog2<{}, { owner: 'sandy081' }>('sync/turnOffEveryWhere');
this.telemetryService.publicLog2<{}, { owner: 'sandy081'; comment: 'Reporting when settings sync is turned off in all devices' }>('sync/turnOffEveryWhere');
await this.userDataSyncService.reset();
} else {
await this.userDataSyncService.resetLocal();

View file

@ -13,7 +13,8 @@ import { ALL_SYNC_RESOURCES, getEnablementKey, IUserDataSyncEnablementService, I
type SyncEnablementClassification = {
owner: 'sandy081';
enabled?: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true };
comment: 'Reporting when Settings Sync is turned on or off';
enabled?: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'Flag indicating if settings sync is enabled or not' };
};
const enablementKey = 'sync.enable';

View file

@ -29,12 +29,13 @@ import { ALL_SYNC_RESOURCES, Change, createSyncHeaders, IManualSyncTask, IResour
type SyncErrorClassification = {
owner: 'sandy081';
code: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true };
service: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true };
serverCode?: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true };
url?: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true };
resource?: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true };
executionId?: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true };
comment: 'Information about the error that occurred while syncing';
code: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'error code' };
service: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'Settings Sync service for which this error has occurred' };
serverCode?: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'Settings Sync service error code' };
url?: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'Settings Sync resource URL for which this error has occurred' };
resource?: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'Settings Sync resource for which this error has occurred' };
executionId?: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'Settings Sync execution id for which this error has occurred' };
};
const LAST_SYNC_TIME_KEY = 'sync.lastSyncTime';

View file

@ -11,7 +11,7 @@ import { join, delimiter } from 'vs/base/common/path';
import { VSBuffer } from 'vs/base/common/buffer';
import { IRemoteConsoleLog } from 'vs/base/common/console';
import { Emitter, Event } from 'vs/base/common/event';
import { NodeSocket, WebSocketNodeSocket } from 'vs/base/parts/ipc/node/ipc.net';
import { createRandomIPCHandle, NodeSocket, WebSocketNodeSocket } from 'vs/base/parts/ipc/node/ipc.net';
import { getResolvedShellEnv } from 'vs/platform/shell/node/shellEnv';
import { ILogService } from 'vs/platform/log/common/log';
import { IRemoteExtensionHostStartParams } from 'vs/platform/remote/common/remoteAgentConnection';
@ -21,6 +21,7 @@ import { IProcessEnvironment, isWindows } from 'vs/base/common/platform';
import { logRemoteEntry } from 'vs/workbench/services/extensions/common/remoteConsoleUtil';
import { removeDangerousEnvVariables } from 'vs/base/common/processes';
import { IExtensionHostStatusService } from 'vs/server/node/extensionHostStatusService';
import { DisposableStore, toDisposable } from 'vs/base/common/lifecycle';
export async function buildUserEnvironment(startParamsEnv: { [key: string]: string | null } = {}, withUserShellEnvironment: boolean, language: string, isDebug: boolean, environmentService: IServerEnvironmentService, logService: ILogService): Promise<IProcessEnvironment> {
const nlsConfig = await getNLSConfiguration(language, environmentService.userDataPath);
@ -44,7 +45,6 @@ export async function buildUserEnvironment(startParamsEnv: { [key: string]: stri
VSCODE_AMD_ENTRYPOINT: 'vs/workbench/api/node/extensionHostProcess',
VSCODE_PIPE_LOGGING: 'true',
VSCODE_VERBOSE_LOGGING: 'true',
VSCODE_EXTHOST_WILL_SEND_SOCKET: 'true',
VSCODE_HANDLES_UNCAUGHT_ERRORS: 'true',
VSCODE_LOG_STACK: 'false',
VSCODE_NLS_CONFIG: JSON.stringify(nlsConfig, undefined, 0)
@ -73,21 +73,36 @@ export async function buildUserEnvironment(startParamsEnv: { [key: string]: stri
class ConnectionData {
constructor(
public readonly socket: net.Socket,
public readonly socketDrain: Promise<void>,
public readonly initialDataChunk: VSBuffer,
public readonly skipWebSocketFrames: boolean,
public readonly permessageDeflate: boolean,
public readonly inflateBytes: VSBuffer,
public readonly socket: NodeSocket | WebSocketNodeSocket,
public readonly initialDataChunk: VSBuffer
) { }
public socketDrain(): Promise<void> {
return this.socket.drain();
}
public toIExtHostSocketMessage(): IExtHostSocketMessage {
let skipWebSocketFrames: boolean;
let permessageDeflate: boolean;
let inflateBytes: VSBuffer;
if (this.socket instanceof NodeSocket) {
skipWebSocketFrames = true;
permessageDeflate = false;
inflateBytes = VSBuffer.alloc(0);
} else {
skipWebSocketFrames = false;
permessageDeflate = this.socket.permessageDeflate;
inflateBytes = this.socket.recordedInflateBytes;
}
return {
type: 'VSCODE_EXTHOST_IPC_SOCKET',
initialDataChunk: (<Buffer>this.initialDataChunk.buffer).toString('base64'),
skipWebSocketFrames: this.skipWebSocketFrames,
permessageDeflate: this.permessageDeflate,
inflateBytes: (<Buffer>this.inflateBytes.buffer).toString('base64'),
skipWebSocketFrames: skipWebSocketFrames,
permessageDeflate: permessageDeflate,
inflateBytes: (<Buffer>inflateBytes.buffer).toString('base64'),
};
}
}
@ -97,6 +112,7 @@ export class ExtensionHostConnection {
private _onClose = new Emitter<void>();
readonly onClose: Event<void> = this._onClose.event;
private readonly _canSendSocket: boolean;
private _disposed: boolean;
private _remoteAddress: string;
private _extensionHostProcess: cp.ChildProcess | null;
@ -111,10 +127,11 @@ export class ExtensionHostConnection {
@ILogService private readonly _logService: ILogService,
@IExtensionHostStatusService private readonly _extensionHostStatusService: IExtensionHostStatusService,
) {
this._canSendSocket = (!isWindows || !this._environmentService.args['socket-path']);
this._disposed = false;
this._remoteAddress = remoteAddress;
this._extensionHostProcess = null;
this._connectionData = ExtensionHostConnection._toConnectionData(socket, initialDataChunk);
this._connectionData = new ConnectionData(socket, initialDataChunk);
this._log(`New connection established.`);
}
@ -131,19 +148,46 @@ export class ExtensionHostConnection {
this._logService.error(`${this._logPrefix}${_str}`);
}
private static _toConnectionData(socket: NodeSocket | WebSocketNodeSocket, initialDataChunk: VSBuffer): ConnectionData {
if (socket instanceof NodeSocket) {
return new ConnectionData(socket.socket, socket.drain(), initialDataChunk, true, false, VSBuffer.alloc(0));
} else {
return new ConnectionData(socket.socket.socket, socket.drain(), initialDataChunk, false, socket.permessageDeflate, socket.recordedInflateBytes);
private async _pipeSockets(extHostSocket: net.Socket, connectionData: ConnectionData): Promise<void> {
const disposables = new DisposableStore();
disposables.add(connectionData.socket);
disposables.add(toDisposable(() => {
extHostSocket.destroy();
}));
const stopAndCleanup = () => {
disposables.dispose();
};
disposables.add(connectionData.socket.onEnd(stopAndCleanup));
disposables.add(connectionData.socket.onClose(stopAndCleanup));
disposables.add(Event.fromNodeEventEmitter<void>(extHostSocket, 'end')(stopAndCleanup));
disposables.add(Event.fromNodeEventEmitter<void>(extHostSocket, 'close')(stopAndCleanup));
disposables.add(Event.fromNodeEventEmitter<void>(extHostSocket, 'error')(stopAndCleanup));
disposables.add(connectionData.socket.onData((e) => extHostSocket.write(e.buffer)));
disposables.add(Event.fromNodeEventEmitter<Buffer>(extHostSocket, 'data')((e) => {
connectionData.socket.write(VSBuffer.wrap(e));
}));
if (connectionData.initialDataChunk.byteLength > 0) {
extHostSocket.write(connectionData.initialDataChunk.buffer);
}
}
private async _sendSocketToExtensionHost(extensionHostProcess: cp.ChildProcess, connectionData: ConnectionData): Promise<void> {
// Make sure all outstanding writes have been drained before sending the socket
await connectionData.socketDrain;
await connectionData.socketDrain();
const msg = connectionData.toIExtHostSocketMessage();
extensionHostProcess.send(msg, connectionData.socket);
let socket: net.Socket;
if (connectionData.socket instanceof NodeSocket) {
socket = connectionData.socket.socket;
} else {
socket = connectionData.socket.socket.socket;
}
extensionHostProcess.send(msg, socket);
}
public shortenReconnectionGraceTimeIfNecessary(): void {
@ -159,7 +203,7 @@ export class ExtensionHostConnection {
public acceptReconnection(remoteAddress: string, _socket: NodeSocket | WebSocketNodeSocket, initialDataChunk: VSBuffer): void {
this._remoteAddress = remoteAddress;
this._log(`The client has reconnected.`);
const connectionData = ExtensionHostConnection._toConnectionData(_socket, initialDataChunk);
const connectionData = new ConnectionData(_socket, initialDataChunk);
if (!this._extensionHostProcess) {
// The extension host didn't even start up yet
@ -197,6 +241,17 @@ export class ExtensionHostConnection {
const env = await buildUserEnvironment(startParams.env, true, startParams.language, !!startParams.debugId, this._environmentService, this._logService);
removeDangerousEnvVariables(env);
let extHostNamedPipeServer: net.Server | null;
if (this._canSendSocket) {
env['VSCODE_EXTHOST_WILL_SEND_SOCKET'] = 'true';
extHostNamedPipeServer = null;
} else {
const { namedPipeServer, pipeName } = await this._listenOnPipe();
env['VSCODE_IPC_HOOK_EXTHOST'] = pipeName;
extHostNamedPipeServer = namedPipeServer;
}
const opts = {
env,
execArgv,
@ -240,14 +295,21 @@ export class ExtensionHostConnection {
this._cleanResources();
});
const messageListener = (msg: IExtHostReadyMessage) => {
if (msg.type === 'VSCODE_EXTHOST_IPC_READY') {
this._extensionHostProcess!.removeListener('message', messageListener);
this._sendSocketToExtensionHost(this._extensionHostProcess!, this._connectionData!);
this._connectionData = null;
}
};
this._extensionHostProcess.on('message', messageListener);
if (extHostNamedPipeServer) {
extHostNamedPipeServer.on('connection', (socket) => {
extHostNamedPipeServer!.close();
this._pipeSockets(socket, this._connectionData!);
});
} else {
const messageListener = (msg: IExtHostReadyMessage) => {
if (msg.type === 'VSCODE_EXTHOST_IPC_READY') {
this._extensionHostProcess!.removeListener('message', messageListener);
this._sendSocketToExtensionHost(this._extensionHostProcess!, this._connectionData!);
this._connectionData = null;
}
};
this._extensionHostProcess.on('message', messageListener);
}
} catch (error) {
console.error('ExtensionHostConnection errored');
@ -256,6 +318,21 @@ export class ExtensionHostConnection {
}
}
}
private _listenOnPipe(): Promise<{ pipeName: string; namedPipeServer: net.Server }> {
return new Promise<{ pipeName: string; namedPipeServer: net.Server }>((resolve, reject) => {
const pipeName = createRandomIPCHandle();
const namedPipeServer = net.createServer();
namedPipeServer.on('error', reject);
namedPipeServer.listen(pipeName, () => {
if (namedPipeServer) {
namedPipeServer.removeListener('error', reject);
}
resolve({ pipeName, namedPipeServer });
});
});
}
}
function readCaseInsensitive(env: { [key: string]: string | undefined }, key: string): string | undefined {

View file

@ -210,7 +210,9 @@ function _createExtHostProtocol(): Promise<IMessagePassingProtocol> {
const socket = net.createConnection(pipeName, () => {
socket.removeListener('error', reject);
resolve(new PersistentProtocol(new NodeSocket(socket, 'extHost-renderer')));
const protocol = new PersistentProtocol(new NodeSocket(socket, 'extHost-renderer'));
protocol.sendResume();
resolve(protocol);
});
socket.once('error', reject);

View file

@ -152,7 +152,7 @@ export class FloatingClickWidget extends Widget implements IOverlayWidget {
super();
this._domNode = $('.floating-click-widget');
this._domNode.style.padding = '10px';
this._domNode.style.padding = '6px 11px';
this._domNode.style.cursor = 'pointer';
if (keyBindingAction) {

View file

@ -46,6 +46,13 @@
justify-content: left;
}
.monaco-workbench.web.safari .part.titlebar,
.monaco-workbench.web.safari .part.titlebar>.titlebar-container {
/* Must be scoped to safari due to #148851 */
/* Is required in safari due to #149476 */
overflow: visible;
}
/* Draggable region */
.monaco-workbench .part.titlebar>.titlebar-container>.titlebar-drag-region {
top: 0;

View file

@ -1089,10 +1089,10 @@ class TreeRenderer extends Disposable implements ITreeRenderer<ITreeItem, FuzzyS
return false;
}
if (hasResource && (this.isFileKindThemeIcon(icon) || !this.shouldShowFileIcons())) {
return false;
} else if (hasResource && (this.isFolderThemeIcon(icon) || !this.shouldShowFolderIcons())) {
return false;
if (hasResource && this.isFileKindThemeIcon(icon)) {
return !this.shouldShowFileIcons();
} else if (hasResource && this.isFolderThemeIcon(icon)) {
return !this.shouldShowFolderIcons();
}
return true;
}

View file

@ -51,7 +51,7 @@ export interface IViewPaneOptions extends IPaneOptions {
}
type WelcomeActionClassification = {
owner: 'sandy081';
owner: 'joaomoreno';
viewId: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' };
uri: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' };
};

View file

@ -820,12 +820,6 @@ export class ViewPaneContainer extends Component implements IViewPaneContainer {
// Check if view is active
if (this.viewContainerModel.activeViewDescriptors.some(viewDescriptor => viewDescriptor.id === viewId)) {
const visible = !this.viewContainerModel.isVisible(viewId);
type ViewsToggleVisibilityClassification = {
owner: 'sandy081';
viewId: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' };
visible: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' };
};
this.telemetryService.publicLog2<{ viewId: String; visible: boolean }, ViewsToggleVisibilityClassification>('views.toggleVisibility', { viewId, visible });
this.viewContainerModel.setVisible(viewId, visible);
}
}

View file

@ -17,8 +17,9 @@ import { localize } from 'vs/nls';
type DynamicWorkspaceRecommendationsClassification = {
owner: 'sandy081';
count: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true };
cache: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true };
comment: 'Information about recommendations by scanning the workspace';
count: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'Total number of extensions those are recommended' };
cache: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'Flag if extensions are recommended from cache or not' };
};
type IStoredDynamicWorkspaceRecommendations = { recommendations: string[]; timestamp: number };

View file

@ -28,14 +28,16 @@ import { IExtensionIgnoredRecommendationsService } from 'vs/workbench/services/e
type ExtensionRecommendationsNotificationClassification = {
owner: 'sandy081';
userReaction: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' };
extensionId?: { classification: 'PublicNonPersonalData'; purpose: 'FeatureInsight' };
source: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' };
comment: 'Response information when an extension is recommended';
userReaction: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'User reaction after showing the recommendation prompt. Eg., install, cancel, show, neverShowAgain' };
extensionId?: { classification: 'PublicNonPersonalData'; purpose: 'FeatureInsight'; comment: 'Id of the extension that is recommended' };
source: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'The source from which this recommendation is coming from. Eg., file, exe.,' };
};
type ExtensionWorkspaceRecommendationsNotificationClassification = {
owner: 'sandy081';
userReaction: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' };
comment: 'Response information when a recommendation from workspace is recommended';
userReaction: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'User reaction after showing the recommendation prompt. Eg., install, cancel, show, neverShowAgain' };
};
const ignoreImportantExtensionRecommendationStorageKey = 'extensionsAssistant/importantRecommendationsIgnore';

View file

@ -30,8 +30,9 @@ import { areSameExtensions } from 'vs/platform/extensionManagement/common/extens
type IgnoreRecommendationClassification = {
owner: 'sandy081';
recommendationReason: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true };
extensionId: { classification: 'PublicNonPersonalData'; purpose: 'FeatureInsight' };
comment: 'Report when a recommendation is ignored';
recommendationReason: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'Reason why extension is recommended' };
extensionId: { classification: 'PublicNonPersonalData'; purpose: 'FeatureInsight'; comment: 'Id of the extension recommendation that is being ignored' };
};
export class ExtensionRecommendationsService extends Disposable implements IExtensionRecommendationsService {

View file

@ -282,7 +282,7 @@ export abstract class AbstractInstallAction extends ExtensionAction {
}
if (this.extension.deprecationInfo) {
let detail = localize('deprecated message', "This extension is deprecated as it is no longer being maintained");
let detail = localize('deprecated message', "This extension is deprecated as it is no longer being maintained.");
let action: () => Promise<any> = async () => undefined;
const buttons = [
localize('install anyway', "Install Anyway"),
@ -2311,7 +2311,7 @@ export class ExtensionStatusAction extends ExtensionAction {
const link = `[${localize('settings', "settings")}](${URI.parse(`command:workbench.action.openSettings?${encodeURIComponent(JSON.stringify([this.extension.deprecationInfo.settings.map(setting => `@id:${setting}`).join(' ')]))}`)})`;
this.updateStatus({ icon: warningIcon, message: new MarkdownString(localize('deprecated with alternate settings tooltip', "This extension is deprecated as this functionality is now built-in to VS Code. Configure these {0} to use this functionality.", link)) }, true);
} else {
this.updateStatus({ icon: warningIcon, message: new MarkdownString(localize('deprecated tooltip', "This extension is deprecated as it is no longer being maintained")) }, true);
this.updateStatus({ icon: warningIcon, message: new MarkdownString(localize('deprecated tooltip', "This extension is deprecated as it is no longer being maintained.")) }, true);
}
return;
}

View file

@ -214,8 +214,13 @@ export class Renderer implements IPagedRenderer<IExtension, ITemplateData> {
data.name.textContent = extension.displayName;
data.description.textContent = extension.description;
data.publisherDisplayName.textContent = extension.publisherDisplayName;
data.verifiedPublisherIcon.style.display = extension.publisherDomain?.verified ? 'inherit' : 'none';
const updatePublisher = () => {
data.publisherDisplayName.textContent = extension.publisherDisplayName;
data.verifiedPublisherIcon.style.display = extension.publisherDomain?.verified ? 'inherit' : 'none';
};
updatePublisher();
Event.filter(this.extensionsWorkbenchService.onChange, e => !!e && areSameExtensions(e.identifier, extension.identifier))(() => updatePublisher(), this, data.extensionDisposables);
data.installCount.style.display = '';
data.ratings.style.display = '';

View file

@ -60,11 +60,6 @@ import { isOfflineError } from 'vs/base/parts/request/common/request';
// Extensions that are automatically classified as Programming Language extensions, but should be Feature extensions
const FORCE_FEATURE_EXTENSIONS = ['vscode.git', 'vscode.git-base', 'vscode.search-result'];
type WorkspaceRecommendationsClassification = {
owner: 'sandy081';
count: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; 'isMeasurement': true };
};
class ExtensionsViewState extends Disposable implements IExtensionsViewState {
private readonly _onFocus: Emitter<IExtension> = this._register(new Emitter<IExtension>());
@ -832,7 +827,6 @@ export class ExtensionsListView extends ViewPane {
private async getWorkspaceRecommendationsModel(query: Query, options: IQueryOptions, token: CancellationToken): Promise<IPagedModel<IExtension>> {
const recommendations = await this.getWorkspaceRecommendations();
const installableRecommendations = (await this.getInstallableRecommendations(recommendations, { ...options, source: 'recommendations-workspace' }, token));
this.telemetryService.publicLog2<{ count: number }, WorkspaceRecommendationsClassification>('extensionWorkspaceRecommendations:open', { count: installableRecommendations.length });
const result: IExtension[] = coalesce(recommendations.map(id => installableRecommendations.find(i => areSameExtensions(i.identifier, { id }))));
return new PagedModel(result);
}

View file

@ -554,7 +554,7 @@ class Extensions extends Disposable {
}
}
private onDidInstallExtensions(results: readonly InstallExtensionResult[]): void {
private async onDidInstallExtensions(results: readonly InstallExtensionResult[]): Promise<void> {
for (const event of results) {
const { local, source } = event;
const gallery = source && !URI.isUri(source) ? source : undefined;
@ -577,12 +577,13 @@ class Extensions extends Disposable {
if (!extension.gallery) {
extension.gallery = gallery;
}
Extensions.updateExtensionFromControlManifest(extension, await this.server.extensionManagementService.getExtensionsControlManifest());
extension.enablementState = this.extensionEnablementService.getEnablementState(local);
}
}
this._onChange.fire(!local || !extension ? undefined : { extension, operation: event.operation });
if (extension && extension.local && !extension.gallery) {
this.syncInstalledExtensionWithGallery(extension);
await this.syncInstalledExtensionWithGallery(extension);
}
}
}
@ -1087,8 +1088,8 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension
// Skip if check updates only for builtin extensions and current extension is not builtin.
continue;
}
if (installed.isBuiltin && (!installed.local?.identifier.uuid || this.productService.quality !== 'stable')) {
// Skip if the builtin extension does not have Marketplace identifier or the current quality is not stable.
if (installed.isBuiltin && (!installed.local?.identifier.uuid || (!isWeb && this.productService.quality === 'stable'))) {
// Skip checking updates for a builtin extension if it does not has Marketplace identifier or the current product is VS Code Desktop stable.
continue;
}
infos.push({ ...installed.identifier, preRelease: !!installed.local?.preRelease });
@ -1246,7 +1247,8 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension
throw new Error('Missing gallery');
}
const [gallery] = await this.galleryService.getExtensions([{ id: extension.gallery.identifier.id, version }], CancellationToken.None);
const targetPlatform = extension.server ? await extension.server.extensionManagementService.getTargetPlatform() : undefined;
const [gallery] = await this.galleryService.getExtensions([{ id: extension.gallery.identifier.id, version }], { targetPlatform }, CancellationToken.None);
if (!gallery) {
throw new Error(nls.localize('not found', "Unable to install extension '{0}' because the requested version '{1}' is not found.", extension.gallery!.identifier.id, version));
}

View file

@ -38,8 +38,9 @@ import { areSameExtensions } from 'vs/platform/extensionManagement/common/extens
type FileExtensionSuggestionClassification = {
owner: 'sandy081';
userReaction: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' };
fileExtension: { classification: 'PublicNonPersonalData'; purpose: 'FeatureInsight' };
comment: 'Response information when a file based reccommendation is suggested';
userReaction: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'User reaction after showing the recommendation prompt. Eg., install, cancel, show, neverShowAgain' };
fileExtension: { classification: 'PublicNonPersonalData'; purpose: 'FeatureInsight'; comment: 'Extension of the file for which an extension is being recommended.' };
};
const promptedRecommendationsStorageKey = 'fileBasedRecommendations/promptedRecommendations';

View file

@ -192,8 +192,8 @@ export class SaveExtensionHostProfileAction extends Action {
private async _asyncRun(): Promise<any> {
let picked = await this._nativeHostService.showSaveDialog({
title: 'Save Extension Host Profile',
buttonLabel: 'Save',
title: nls.localize('saveprofile.dialogTitle', "Save Extension Host Profile"),
buttonLabel: nls.localize('saveprofile.saveButton', "Save"),
defaultPath: `CPU-${new Date().toISOString().replace(/[\-:]/g, '')}.cpuprofile`,
filters: [{
name: 'CPU Profiles',

View file

@ -308,23 +308,23 @@ suite('ExtensionsActions', () => {
});
});
test('Test Uninstall action after extension is installed', () => {
test('Test Uninstall action after extension is installed', async () => {
const testObject: ExtensionsActions.UninstallAction = instantiationService.createInstance(ExtensionsActions.UninstallAction);
instantiationService.createInstance(ExtensionContainers, [testObject]);
const gallery = aGalleryExtension('a');
instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));
return instantiationService.get(IExtensionsWorkbenchService).queryGallery(CancellationToken.None)
.then(paged => {
testObject.extension = paged.firstPage[0];
const paged = await instantiationService.get(IExtensionsWorkbenchService).queryGallery(CancellationToken.None);
testObject.extension = paged.firstPage[0];
installEvent.fire({ identifier: gallery.identifier, source: gallery });
didInstallEvent.fire([{ identifier: gallery.identifier, source: gallery, operation: InstallOperation.Install, local: aLocalExtension('a', gallery, gallery) }]);
installEvent.fire({ identifier: gallery.identifier, source: gallery });
const promise = Event.toPromise(testObject.onDidChange);
didInstallEvent.fire([{ identifier: gallery.identifier, source: gallery, operation: InstallOperation.Install, local: aLocalExtension('a', gallery, gallery) }]);
assert.ok(testObject.enabled);
assert.strictEqual('Uninstall', testObject.label);
assert.strictEqual('extension-action label uninstall', testObject.class);
});
await promise;
assert.ok(testObject.enabled);
assert.strictEqual('Uninstall', testObject.label);
assert.strictEqual('extension-action label uninstall', testObject.class);
});
test('Test UpdateAction when there is no extension', () => {
@ -475,22 +475,22 @@ suite('ExtensionsActions', () => {
});
});
test('Test ManageExtensionAction when extension is queried from gallery and installed', () => {
test('Test ManageExtensionAction when extension is queried from gallery and installed', async () => {
const testObject: ExtensionsActions.ManageExtensionAction = instantiationService.createInstance(ExtensionsActions.ManageExtensionAction);
instantiationService.createInstance(ExtensionContainers, [testObject]);
const gallery = aGalleryExtension('a');
instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));
return instantiationService.get(IExtensionsWorkbenchService).queryGallery(CancellationToken.None)
.then(page => {
testObject.extension = page.firstPage[0];
installEvent.fire({ identifier: gallery.identifier, source: gallery });
didInstallEvent.fire([{ identifier: gallery.identifier, source: gallery, operation: InstallOperation.Install, local: aLocalExtension('a', gallery, gallery) }]);
const paged = await instantiationService.get(IExtensionsWorkbenchService).queryGallery(CancellationToken.None);
testObject.extension = paged.firstPage[0];
installEvent.fire({ identifier: gallery.identifier, source: gallery });
const promise = Event.toPromise(testObject.onDidChange);
didInstallEvent.fire([{ identifier: gallery.identifier, source: gallery, operation: InstallOperation.Install, local: aLocalExtension('a', gallery, gallery) }]);
assert.ok(testObject.enabled);
assert.strictEqual('extension-action icon manage codicon codicon-extensions-manage', testObject.class);
assert.strictEqual('', testObject.tooltip);
});
await promise;
assert.ok(testObject.enabled);
assert.strictEqual('extension-action icon manage codicon codicon-extensions-manage', testObject.class);
assert.strictEqual('', testObject.tooltip);
});
test('Test ManageExtensionAction when extension is system extension', () => {
@ -961,7 +961,9 @@ suite('ReloadAction', () => {
assert.ok(!testObject.enabled);
installEvent.fire({ identifier: gallery.identifier, source: gallery });
const promise = Event.toPromise(testObject.onDidChange);
didInstallEvent.fire([{ identifier: gallery.identifier, source: gallery, operation: InstallOperation.Install, local: aLocalExtension('a', gallery, gallery) }]);
await promise;
assert.ok(testObject.enabled);
assert.strictEqual(testObject.tooltip, 'Please reload Visual Studio Code to enable this extension.');
});
@ -1311,8 +1313,10 @@ suite('ReloadAction', () => {
assert.ok(!testObject.enabled);
const remoteExtension = aLocalExtension('a', { extensionKind: ['workspace'] }, { location: URI.file('pub.a').with({ scheme: Schemas.vscodeRemote }) });
const promise = Event.toPromise(testObject.onDidChange);
onDidInstallEvent.fire([{ identifier: remoteExtension.identifier, local: remoteExtension, operation: InstallOperation.Install }]);
await promise;
assert.ok(testObject.enabled);
assert.strictEqual(testObject.tooltip, 'Please reload Visual Studio Code to enable this extension.');
});
@ -1347,8 +1351,10 @@ suite('ReloadAction', () => {
assert.ok(!testObject.enabled);
const localExtension = aLocalExtension('a', { extensionKind: ['ui'] }, { location: URI.file('pub.a') });
const promise = Event.toPromise(Event.filter(testObject.onDidChange, () => testObject.enabled));
onDidInstallEvent.fire([{ identifier: localExtension.identifier, local: localExtension, operation: InstallOperation.Install }]);
await promise;
assert.ok(testObject.enabled);
assert.strictEqual(testObject.tooltip, 'Please reload Visual Studio Code to enable this extension.');
});
@ -1599,7 +1605,9 @@ suite('RemoteInstallAction', () => {
assert.strictEqual('extension-action label install installing', testObject.class);
const installedExtension = aLocalExtension('a', { extensionKind: ['workspace'] }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });
const promise = Event.toPromise(testObject.onDidChange);
onDidInstallEvent.fire([{ identifier: installedExtension.identifier, local: installedExtension, operation: InstallOperation.Install }]);
await promise;
assert.ok(!testObject.enabled);
});
@ -2048,7 +2056,9 @@ suite('LocalInstallAction', () => {
assert.strictEqual('extension-action label install installing', testObject.class);
const installedExtension = aLocalExtension('a', { extensionKind: ['ui'] }, { location: URI.file(`pub.a`) });
const promise = Event.toPromise(testObject.onDidChange);
onDidInstallEvent.fire([{ identifier: installedExtension.identifier, local: installedExtension, operation: InstallOperation.Install }]);
await promise;
assert.ok(!testObject.enabled);
});

View file

@ -446,21 +446,19 @@ suite('ExtensionsWorkbenchServiceTest', () => {
const gallery = aGalleryExtension('gallery1');
testObject = await aWorkbenchService();
instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));
const target = sinon.spy();
return testObject.queryGallery(CancellationToken.None).then(page => {
const extension = page.firstPage[0];
assert.strictEqual(ExtensionState.Uninstalled, extension.state);
const page = await testObject.queryGallery(CancellationToken.None);
const extension = page.firstPage[0];
assert.strictEqual(ExtensionState.Uninstalled, extension.state);
testObject.install(extension);
installEvent.fire({ identifier: gallery.identifier, source: gallery });
testObject.onChange(target);
testObject.install(extension);
installEvent.fire({ identifier: gallery.identifier, source: gallery });
const promise = Event.toPromise(testObject.onChange);
// Installed
didInstallEvent.fire([{ identifier: gallery.identifier, source: gallery, operation: InstallOperation.Install, local: aLocalExtension(gallery.name, gallery, gallery) }]);
// Installed
didInstallEvent.fire([{ identifier: gallery.identifier, source: gallery, operation: InstallOperation.Install, local: aLocalExtension(gallery.name, gallery, gallery) }]);
assert.ok(target.calledOnce);
});
await promise;
});
test('test onchange event is triggered when installation is finished', async () => {

View file

@ -56,7 +56,7 @@
}
.merge-accept-gutter-marker.multi-line .background {
border: 2px solid var(--vscode-checkbox-border);
border: 1px solid var(--vscode-checkbox-border);
border-right: 0;
left: 8px;
width: 10px;

View file

@ -17,6 +17,13 @@ import { MergeEditorInput, MergeEditorInputData } from 'vs/workbench/contrib/mer
import { IEditorService } from 'vs/workbench/services/editor/common/editorService';
import { MergeEditorSerializer } from './mergeEditorSerializer';
import { Codicon } from 'vs/base/common/codicons';
import { IWorkbenchFileService } from 'vs/workbench/services/files/common/files';
import { InMemoryFileSystemProvider } from 'vs/platform/files/common/inMemoryFilesystemProvider';
import { VSBuffer } from 'vs/base/common/buffer';
import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService';
import { IQuickInputService } from 'vs/platform/quickinput/common/quickInput';
import { INotificationService } from 'vs/platform/notification/common/notification';
import { ITextModelService } from 'vs/editor/common/services/resolverService';
Registry.as<IEditorPaneRegistry>(EditorExtensions.EditorPane).registerEditorPane(
EditorPaneDescriptor.create(
@ -152,3 +159,132 @@ interface IOpenEditorArgs {
input2: MergeEditorInputData;
output: URI;
}
registerAction2(class extends Action2 {
constructor() {
super({
id: 'merge.dev.copyContents',
title: localize('merge.dev.copyContents', "Developer Merge Editor: Copy Contents of Inputs, Base and Result as JSON"),
icon: Codicon.layoutCentered,
f1: true,
});
}
run(accessor: ServicesAccessor): void {
const { activeEditorPane } = accessor.get(IEditorService);
const clipboardService = accessor.get(IClipboardService);
const notificationService = accessor.get(INotificationService);
if (!(activeEditorPane instanceof MergeEditor)) {
notificationService.info({
name: localize('mergeEditor.name', 'Merge Editor'),
message: localize('mergeEditor.noActiveMergeEditor', "No active merge editor")
});
return;
}
const model = activeEditorPane.model;
if (!model) {
return;
}
const contents: MergeEditorContents = {
languageId: model.result.getLanguageId(),
base: model.base.getValue(),
input1: model.input1.getValue(),
input2: model.input2.getValue(),
result: model.result.getValue(),
};
const jsonStr = JSON.stringify(contents, undefined, 4);
clipboardService.writeText(jsonStr);
notificationService.info({
name: localize('mergeEditor.name', 'Merge Editor'),
message: localize('mergeEditor.successfullyCopiedMergeEditorContents', "Successfully copied merge editor contents"),
});
}
});
registerAction2(class extends Action2 {
constructor() {
super({
id: 'merge.dev.openContents',
title: localize('merge.dev.openContents', "Developer Merge Editor: Open Contents of Inputs, Base and Result from JSON"),
icon: Codicon.layoutCentered,
f1: true,
});
}
async run(accessor: ServicesAccessor): Promise<void> {
const service = accessor.get(IWorkbenchFileService);
const instaService = accessor.get(IInstantiationService);
const editorService = accessor.get(IEditorService);
const inputService = accessor.get(IQuickInputService);
const clipboardService = accessor.get(IClipboardService);
const textModelService = accessor.get(ITextModelService);
const result = await inputService.input({
prompt: localize('mergeEditor.enterJSON', 'Enter JSON'),
value: await clipboardService.readText(),
});
if (!result) {
return;
}
const content: MergeEditorContents = JSON.parse(result);
const scheme = 'merge-editor-dev';
let provider = service.getProvider(scheme) as InMemoryFileSystemProvider | undefined;
if (!provider) {
provider = new InMemoryFileSystemProvider();
service.registerProvider(scheme, provider);
}
const baseUri = URI.from({ scheme, path: '/ancestor' });
const input1Uri = URI.from({ scheme, path: '/input1' });
const input2Uri = URI.from({ scheme, path: '/input2' });
const resultUri = URI.from({ scheme, path: '/result' });
function writeFile(uri: URI, content: string): Promise<void> {
return provider!.writeFile(uri, VSBuffer.fromString(content).buffer, { create: true, overwrite: true, unlock: true });
}
await Promise.all([
writeFile(baseUri, content.base),
writeFile(input1Uri, content.input1),
writeFile(input2Uri, content.input2),
writeFile(resultUri, content.result),
]);
async function setLanguageId(uri: URI, languageId: string): Promise<void> {
const ref = await textModelService.createModelReference(uri);
ref.object.textEditorModel.setMode(languageId);
ref.dispose();
}
await Promise.all([
setLanguageId(baseUri, content.languageId),
setLanguageId(input1Uri, content.languageId),
setLanguageId(input2Uri, content.languageId),
setLanguageId(resultUri, content.languageId),
]);
const input = instaService.createInstance(
MergeEditorInput,
baseUri,
{ uri: input1Uri, description: 'Input 1', detail: '(from JSON)' },
{ uri: input2Uri, description: 'Input 2', detail: '(from JSON)' },
resultUri,
);
editorService.openEditor(input);
}
});
interface MergeEditorContents {
languageId: string;
base: string;
input1: string;
input2: string;
result: string;
}

View file

@ -67,6 +67,9 @@ export class MergeEditor extends EditorPane {
private readonly _ctxIsMergeEditor: IContextKey<boolean>;
private readonly _ctxUsesColumnLayout: IContextKey<boolean>;
private _model: MergeEditorModel | undefined;
public get model(): MergeEditorModel | undefined { return this._model; }
constructor(
@IInstantiationService private readonly instantiation: IInstantiationService,
@ILabelService private readonly _labelService: ILabelService,
@ -216,6 +219,7 @@ export class MergeEditor extends EditorPane {
this._sessionDisposables.clear();
const model = await input.resolve();
this._model = model;
this.input1View.setModel(model, model.input1, localize('yours', 'Yours'), model.input1Detail, model.input1Description);
this.input2View.setModel(model, model.input2, localize('theirs', 'Theirs',), model.input2Detail, model.input2Description);

View file

@ -50,12 +50,6 @@ import { KeybindingsEditorInput } from 'vs/workbench/services/preferences/browse
import { IEditorOptions } from 'vs/platform/editor/common/editor';
import { ToolBar } from 'vs/base/browser/ui/toolbar/toolbar';
type KeybindingEditorActionClassification = {
owner: 'sandy081';
action: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true };
command: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true };
};
const $ = DOM.$;
class ThemableToggleActionViewItem extends ToggleActionViewItem {
@ -189,7 +183,6 @@ export class KeybindingsEditor extends EditorPane implements IKeybindingsEditorP
try {
const key = await this.defineKeybindingWidget.define();
if (key) {
this.reportKeybindingAction(KEYBINDINGS_EDITOR_COMMAND_DEFINE, keybindingEntry.keybindingItem.command);
await this.updateKeybinding(keybindingEntry, key, keybindingEntry.keybindingItem.when, add);
}
} catch (error) {
@ -224,7 +217,6 @@ export class KeybindingsEditor extends EditorPane implements IKeybindingsEditorP
async removeKeybinding(keybindingEntry: IKeybindingItemEntry): Promise<void> {
this.selectEntry(keybindingEntry);
if (keybindingEntry.keybindingItem.keybinding) { // This should be a pre-condition
this.reportKeybindingAction(KEYBINDINGS_EDITOR_COMMAND_REMOVE, keybindingEntry.keybindingItem.command);
try {
await this.keybindingEditingService.removeKeybinding(keybindingEntry.keybindingItem.keybindingItem);
this.focus();
@ -237,7 +229,6 @@ export class KeybindingsEditor extends EditorPane implements IKeybindingsEditorP
async resetKeybinding(keybindingEntry: IKeybindingItemEntry): Promise<void> {
this.selectEntry(keybindingEntry);
this.reportKeybindingAction(KEYBINDINGS_EDITOR_COMMAND_RESET, keybindingEntry.keybindingItem.command);
try {
await this.keybindingEditingService.resetKeybinding(keybindingEntry.keybindingItem.keybindingItem);
if (!keybindingEntry.keybindingItem.keybinding) { // reveal only if keybinding was added to unassinged. Because the entry will be placed in different position after rendering
@ -252,7 +243,6 @@ export class KeybindingsEditor extends EditorPane implements IKeybindingsEditorP
async copyKeybinding(keybinding: IKeybindingItemEntry): Promise<void> {
this.selectEntry(keybinding);
this.reportKeybindingAction(KEYBINDINGS_EDITOR_COMMAND_COPY, keybinding.keybindingItem.command);
const userFriendlyKeybinding: IUserFriendlyKeybinding = {
key: keybinding.keybindingItem.keybinding ? keybinding.keybindingItem.keybinding.getUserSettingsLabel() || '' : '',
command: keybinding.keybindingItem.command
@ -265,13 +255,11 @@ export class KeybindingsEditor extends EditorPane implements IKeybindingsEditorP
async copyKeybindingCommand(keybinding: IKeybindingItemEntry): Promise<void> {
this.selectEntry(keybinding);
this.reportKeybindingAction(KEYBINDINGS_EDITOR_COMMAND_COPY_COMMAND, keybinding.keybindingItem.command);
await this.clipboardService.writeText(keybinding.keybindingItem.command);
}
async copyKeybindingCommandTitle(keybinding: IKeybindingItemEntry): Promise<void> {
this.selectEntry(keybinding);
this.reportKeybindingAction(KEYBINDINGS_EDITOR_COMMAND_COPY_COMMAND_TITLE, keybinding.keybindingItem.command);
await this.clipboardService.writeText(keybinding.keybindingItem.commandLabel);
}
@ -305,7 +293,7 @@ export class KeybindingsEditor extends EditorPane implements IKeybindingsEditorP
private createOverlayContainer(parent: HTMLElement): void {
this.overlayContainer = DOM.append(parent, $('.overlay-container'));
this.overlayContainer.style.position = 'absolute';
this.overlayContainer.style.zIndex = '10';
this.overlayContainer.style.zIndex = '40'; // has to greater than sash z-index which is 35
this.defineKeybindingWidget = this._register(this.instantiationService.createInstance(DefineKeybindingWidget, this.overlayContainer));
this._register(this.defineKeybindingWidget.onDidChange(keybindingStr => this.defineKeybindingWidget.printExisting(this.keybindingsEditorModel!.fetch(`"${keybindingStr}"`).length)));
this._register(this.defineKeybindingWidget.onShowExistingKeybidings(keybindingStr => this.searchWidget.setValue(`"${keybindingStr}"`)));
@ -502,6 +490,10 @@ export class KeybindingsEditor extends EditorPane implements IKeybindingsEditorP
this.keybindingFocusContextKey.reset();
}));
this._register(this.keybindingsTable.onDidOpen((e) => {
// stop double click action on the input #148493
if (e.browserEvent?.defaultPrevented) {
return;
}
const activeKeybindingEntry = this.activeKeybindingEntry;
if (activeKeybindingEntry) {
this.defineKeybinding(activeKeybindingEntry, false);
@ -775,10 +767,6 @@ export class KeybindingsEditor extends EditorPane implements IKeybindingsEditorP
};
}
private reportKeybindingAction(action: string, command: string): void {
this.telemetryService.publicLog2<{ action: string; command: string }, KeybindingEditorActionClassification>('keybindingsEditor.action', { command, action });
}
private onKeybindingEditingError(error: any): void {
this.notificationService.error(typeof error === 'string' ? error : localize('error', "Error '{0}' while editing the keybinding. Please open 'keybindings.json' file and check for errors.", `${error}`));
}
@ -1073,6 +1061,9 @@ class WhenColumnRenderer implements ITableRenderer<IKeybindingItemEntry, IWhenCo
_onDidReject.fire();
})));
// stop double click action on the input #148493
disposables.add((DOM.addDisposableListener(whenInput.inputElement, DOM.EventType.DBLCLICK, e => DOM.EventHelper.stop(e))));
const renderDisposables = disposables.add(new DisposableStore());
return {

View file

@ -1121,7 +1121,7 @@ export class SearchModel extends Disposable {
/* __GDPR__
"searchResultsShown" : {
owner": "roblourens",
"owner": "roblourens",
"count" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true },
"fileCount": { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true },
"options": { "${inline}": [ "${IPatternInfo}" ] },

View file

@ -33,6 +33,11 @@ if [ -z "$VSCODE_SHELL_INTEGRATION" ]; then
builtin return
fi
__vsc_initialized=0
__vsc_original_PS1="$PS1"
__vsc_original_PS2="$PS2"
__vsc_custom_PS1=""
__vsc_custom_PS2=""
__vsc_in_command_execution="1"
__vsc_last_history_id=$(history 1 | awk '{print $1;}')
@ -72,42 +77,50 @@ __vsc_command_complete() {
}
__vsc_update_prompt() {
__vsc_prior_prompt="$PS1"
__vsc_in_command_execution=""
PS1="\[$(__vsc_prompt_start)\]$PREFIX$PS1\[$(__vsc_prompt_end)\]"
PS2="\[$(__vsc_continuation_start)\]$PS2\[$(__vsc_continuation_end)\]"
# in command execution
if [ "$__vsc_in_command_execution" = "1" ]; then
# Wrap the prompt if it is not yet wrapped, if the PS1 changed this this was last set it
# means the user re-exported the PS1 so we should re-wrap it
if [[ "$__vsc_custom_PS1" == "" || "$__vsc_custom_PS1" != "$PS1" ]]; then
__vsc_original_PS1=$PS1
__vsc_custom_PS1="\[$(__vsc_prompt_start)\]$PREFIX$__vsc_original_PS1\[$(__vsc_prompt_end)\]"
PS1="$__vsc_custom_PS1"
fi
if [[ "$__vsc_custom_PS2" == "" || "$__vsc_custom_PS2" != "$PS2" ]]; then
__vsc_original_PS2=$PS2
__vsc_custom_PS2="\[$(__vsc_continuation_start)\]$__vsc_original_PS2\[$(__vsc_continuation_end)\]"
PS2="$__vsc_custom_PS2"
fi
__vsc_in_command_execution="0"
fi
}
__vsc_precmd() {
__vsc_command_complete "$__vsc_status"
# in command execution
if [ -n "$__vsc_in_command_execution" ]; then
# non null
__vsc_update_prompt
fi
__vsc_update_prompt
}
__vsc_preexec() {
PS1="$__vsc_prior_prompt"
if [ -z "${__vsc_in_command_execution-}" ]; then
if [ "$__vsc_in_command_execution" = "0" ]; then
__vsc_initialized=1
__vsc_in_command_execution="1"
__vsc_command_output_start
fi
}
# Debug trapping/preexec inspired by starship (ISC)
dbg_trap="$(trap -p DEBUG | cut -d' ' -f3 | tr -d \')"
if [[ -z "$dbg_trap" ]]; then
__vsc_dbg_trap="$(trap -p DEBUG | cut -d' ' -f3 | tr -d \')"
if [[ -z "$__vsc_dbg_trap" ]]; then
__vsc_preexec_only() {
__vsc_status="$?"
__vsc_preexec
}
trap '__vsc_preexec_only "$_"' DEBUG
elif [[ "$dbg_trap" != '__vsc_preexec "$_"' && "$dbg_trap" != '__vsc_preexec_all "$_"' ]]; then
elif [[ "$__vsc_dbg_trap" != '__vsc_preexec "$_"' && "$__vsc_dbg_trap" != '__vsc_preexec_all "$_"' ]]; then
__vsc_preexec_all() {
__vsc_status="$?"
local PREV_LAST_ARG=$1 ; $dbg_trap; __vsc_preexec; : "$PREV_LAST_ARG";
builtin eval ${__vsc_dbg_trap}
__vsc_preexec
}
trap '__vsc_preexec_all "$_"' DEBUG
fi

View file

@ -21,6 +21,7 @@ if [ -z "$VSCODE_SHELL_INTEGRATION" ]; then
builtin return
fi
__vsc_initialized="0"
__vsc_in_command_execution="1"
__vsc_last_history_id=0
@ -58,11 +59,14 @@ __vsc_right_prompt_end() {
__vsc_command_complete() {
builtin local __vsc_history_id=$(builtin history | tail -n1 | awk '{print $1;}')
if [[ "$__vsc_history_id" == "$__vsc_last_history_id" ]]; then
builtin printf "\033]633;D\007"
else
builtin printf "\033]633;D;%s\007" "$__vsc_status"
__vsc_last_history_id=$__vsc_history_id
# Don't write the command complete sequence for the first prompt without an associated command
if [[ "$__vsc_initialized" == "1" ]]; then
if [[ "$__vsc_history_id" == "$__vsc_last_history_id" ]]; then
builtin printf "\033]633;D\007"
else
builtin printf "\033]633;D;%s\007" "$__vsc_status"
__vsc_last_history_id=$__vsc_history_id
fi
fi
__vsc_update_cwd
}
@ -99,6 +103,7 @@ __vsc_preexec() {
if [ -n "$RPROMPT" ]; then
RPROMPT="$__vsc_prior_rprompt"
fi
__vsc_initialized="1"
__vsc_in_command_execution="1"
__vsc_command_output_start
}

View file

@ -458,8 +458,14 @@
outline-style: dotted !important;
}
.hc-black .xterm-find-active-result-decoration,
.hc-light .xterm-find-active-result-decoration {
.hc-black .xterm-find-result-decoration,
.hc-light .xterm-find-result-decoration {
outline-style: solid !important;
}
.xterm-find-active-result-decoration {
outline-style: solid !important;
outline-width: 2px !important;
/* Ensure the active decoration is above the regular decoration */
z-index: 7 !important;
}

View file

@ -458,6 +458,11 @@ export interface ITerminalInstance {
*/
target?: TerminalLocation;
/**
* Whether or not shell integration telemetry / warnings should be reported for this terminal.
*/
disableShellIntegrationReporting: boolean;
/**
* The id of a persistent process. This is defined if this is a terminal created by a pty host
* that supports reconnection.

View file

@ -206,6 +206,7 @@ export class TerminalInstance extends Disposable implements ITerminalInstance {
private _userHome?: string;
private _hasScrollBar?: boolean;
private _target?: TerminalLocation | undefined;
private _disableShellIntegrationReporting: boolean | undefined;
readonly capabilities = new TerminalCapabilityStoreMultiplexer();
readonly statusList: ITerminalStatusList;
@ -220,7 +221,12 @@ export class TerminalInstance extends Disposable implements ITerminalInstance {
}
this._target = value;
}
get disableShellIntegrationReporting(): boolean {
if (this._disableShellIntegrationReporting === undefined) {
this._disableShellIntegrationReporting = this.shellLaunchConfig.isFeatureTerminal || this.shellLaunchConfig.hideFromUser || this.shellLaunchConfig.executable === undefined;
}
return this._disableShellIntegrationReporting;
}
get instanceId(): number { return this._instanceId; }
get resource(): URI { return this._resource; }
get cols(): number {
@ -658,8 +664,7 @@ export class TerminalInstance extends Disposable implements ITerminalInstance {
throw new ErrorNoTelemetry('Terminal disposed of during xterm.js creation');
}
const disableShellIntegrationTelemetry = this.shellLaunchConfig.isFeatureTerminal || this.shellLaunchConfig.hideFromUser || this.shellLaunchConfig.executable === undefined;
const xterm = this._instantiationService.createInstance(XtermTerminal, Terminal, this._configHelper, this._cols, this._rows, this.target || TerminalLocation.Panel, this.capabilities, disableShellIntegrationTelemetry);
const xterm = this._instantiationService.createInstance(XtermTerminal, Terminal, this._configHelper, this._cols, this._rows, this.target || TerminalLocation.Panel, this.capabilities, this.disableShellIntegrationReporting);
this.xterm = xterm;
const lineDataEventAddon = new LineDataEventAddon();
this.xterm.raw.loadAddon(lineDataEventAddon);

View file

@ -10,7 +10,7 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur
import { TerminalSettingId } from 'vs/platform/terminal/common/terminal';
export function getShellIntegrationTooltip(instance: ITerminalInstance, markdown: boolean, configurationService: IConfigurationService): string {
if (!configurationService.getValue(TerminalSettingId.ShellIntegrationEnabled)) {
if (!configurationService.getValue(TerminalSettingId.ShellIntegrationEnabled) || instance.disableShellIntegrationReporting) {
return '';
}
const shellIntegrationCapabilities: TerminalCapability[] = [];

View file

@ -114,6 +114,10 @@ export class DecorationAddon extends Disposable implements ITerminalAddon {
if (this._commandDetectionListeners) {
dispose(this._commandDetectionListeners);
}
this.clearDecorations();
}
public clearDecorations(): void {
this._placeholderDecoration?.dispose();
this._placeholderDecoration?.marker.dispose();
for (const value of this._decorations.values()) {

View file

@ -32,7 +32,7 @@ import { Color } from 'vs/base/common/color';
import { ShellIntegrationAddon } from 'vs/platform/terminal/common/xterm/shellIntegrationAddon';
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
import { DecorationAddon } from 'vs/workbench/contrib/terminal/browser/xterm/decorationAddon';
import { ITerminalCapabilityStore, ITerminalCommand } from 'vs/platform/terminal/common/capabilities/capabilities';
import { ITerminalCapabilityStore, ITerminalCommand, TerminalCapability } from 'vs/platform/terminal/common/capabilities/capabilities';
import { Emitter } from 'vs/base/common/event';
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
@ -99,7 +99,7 @@ export class XtermTerminal extends DisposableStore implements IXtermTerminal {
rows: number,
location: TerminalLocation,
private readonly _capabilities: ITerminalCapabilityStore,
disableShellIntegrationTelemetry: boolean,
disableShellIntegrationReporting: boolean,
@IConfigurationService private readonly _configurationService: IConfigurationService,
@IInstantiationService private readonly _instantiationService: IInstantiationService,
@ILogService private readonly _logService: ILogService,
@ -176,7 +176,7 @@ export class XtermTerminal extends DisposableStore implements IXtermTerminal {
this._updateUnicodeVersion();
this._commandNavigationAddon = this._instantiationService.createInstance(CommandNavigationAddon, _capabilities);
this.raw.loadAddon(this._commandNavigationAddon);
this._shellIntegrationAddon = this._instantiationService.createInstance(ShellIntegrationAddon, disableShellIntegrationTelemetry, this._telemetryService);
this._shellIntegrationAddon = this._instantiationService.createInstance(ShellIntegrationAddon, disableShellIntegrationReporting, this._telemetryService);
this.raw.loadAddon(this._shellIntegrationAddon);
this._updateShellIntegrationAddons();
}
@ -258,8 +258,7 @@ export class XtermTerminal extends DisposableStore implements IXtermTerminal {
}
clearDecorations(): void {
this._decorationAddon?.dispose();
this._decorationAddon = undefined;
this._decorationAddon?.clearDecorations();
}
forceRefresh() {
@ -397,8 +396,10 @@ export class XtermTerminal extends DisposableStore implements IXtermTerminal {
clearBuffer(): void {
this.raw.clear();
// hack so that the next placeholder shows
this._decorationAddon?.registerCommandDecoration({ marker: this.raw.registerMarker(0), hasOutput: false, timestamp: Date.now(), getOutput: () => { return undefined; }, command: '' }, true);
// xterm.js does not clear the first prompt, so trigger these to simulate
// the prompt being written
this._capabilities.get(TerminalCapability.CommandDetection)?.handlePromptStart();
this._capabilities.get(TerminalCapability.CommandDetection)?.handleCommandStart();
}
private _setCursorBlink(blink: boolean): void {

View file

@ -67,8 +67,9 @@ type ConfigureSyncQuickPickItem = { id: SyncResource; label: string; description
type SyncConflictsClassification = {
owner: 'sandy081';
source: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true };
action?: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true };
comment: 'Response information when conflict happens during settings sync';
source: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'settings sync resource. eg., settings, keybindings...' };
action?: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'action taken while resolving conflicts. Eg: acceptLocal, acceptRemote' };
};
const turnOnSyncCommand = { id: 'workbench.userDataSync.actions.turnOn', title: localize('turn on sync with category', "{0}: Turn On...", SYNC_TITLE) };

View file

@ -67,8 +67,8 @@ export class WebExtensionManagementService extends AbstractExtensionManagementSe
return this.installExtension(manifest, location, options);
}
protected override async getCompatibleVersion(extension: IGalleryExtension, fetchCompatibleVersion: boolean, includePreRelease: boolean): Promise<IGalleryExtension | null> {
const compatibleExtension = await super.getCompatibleVersion(extension, fetchCompatibleVersion, includePreRelease);
protected override async getCompatibleVersion(extension: IGalleryExtension, sameVersion: boolean, includePreRelease: boolean): Promise<IGalleryExtension | null> {
const compatibleExtension = await super.getCompatibleVersion(extension, sameVersion, includePreRelease);
if (compatibleExtension) {
return compatibleExtension;
}
@ -105,7 +105,7 @@ function toLocalExtension(extension: IExtension): ILocalExtension {
const metadata = getMetadata(undefined, extension);
return {
...extension,
identifier: { id: extension.identifier.id, uuid: metadata.id },
identifier: { id: extension.identifier.id, uuid: metadata.id ?? extension.identifier.uuid },
isMachineScoped: !!metadata.isMachineScoped,
publisherId: metadata.publisherId || null,
publisherDisplayName: metadata.publisherDisplayName || null,

View file

@ -38,7 +38,11 @@ export class HoverService implements IHoverService {
const hoverDisposables = new DisposableStore();
const hover = this._instantiationService.createInstance(HoverWidget, options);
hover.onDispose(() => {
this._currentHoverOptions = undefined;
// Only clear the current options if it's the current hover, the current options help
// reduce flickering when the same hover is shown multiple times
if (this._currentHoverOptions === options) {
this._currentHoverOptions = undefined;
}
hoverDisposables.dispose();
});
const provider = this._contextViewService as IContextViewProvider;

View file

@ -507,7 +507,7 @@ export class HoverWidget extends Widget {
}
class CompositeMouseTracker extends Widget {
private _isMouseIn: boolean = false;
private _isMouseIn: boolean = true;
private _mouseTimeout: number | undefined;
private readonly _onMouseOut = this._register(new Emitter<void>());

View file

@ -142,8 +142,8 @@ export class LabelService extends Disposable implements ILabelService {
this.os = OS;
this.userHome = pathService.defaultUriScheme === Schemas.file ? this.pathService.userHome({ preferLocal: true }) : undefined;
const memento = this.storedFormattersMemento = new Memento('cachedResourceFormatters', storageService);
this.storedFormatters = memento.getMemento(StorageScope.GLOBAL, StorageTarget.USER);
const memento = this.storedFormattersMemento = new Memento('cachedResourceLabelFormatters', storageService);
this.storedFormatters = memento.getMemento(StorageScope.GLOBAL, StorageTarget.MACHINE);
this.formatters = this.storedFormatters?.formatters || [];
// Remote environment is potentially long running

View file

@ -166,7 +166,7 @@ suite('URI Label', () => {
test('label caching', () => {
const m = new Memento('cachedResourceFormatters', storageService).getMemento(StorageScope.GLOBAL, StorageTarget.MACHINE);
const m = new Memento('cachedResourceLabelFormatters', storageService).getMemento(StorageScope.GLOBAL, StorageTarget.MACHINE);
const makeFormatter = (scheme: string): ResourceLabelFormatter => ({ formatting: { label: `\${path} (${scheme})`, separator: '/' }, scheme });
assert.deepStrictEqual(m, {});

View file

@ -28,7 +28,6 @@ import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding';
import { ILabelService } from 'vs/platform/label/common/label';
import { INotificationService } from 'vs/platform/notification/common/notification';
import { Registry } from 'vs/platform/registry/common/platform';
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace';
import { IEditorPane } from 'vs/workbench/common/editor';
import { EditorInput } from 'vs/workbench/common/editor/editorInput';
@ -68,7 +67,6 @@ export class PreferencesService extends Disposable implements IPreferencesServic
@IWorkspaceContextService private readonly contextService: IWorkspaceContextService,
@IInstantiationService private readonly instantiationService: IInstantiationService,
@IEnvironmentService private readonly environmentService: IEnvironmentService,
@ITelemetryService private readonly telemetryService: ITelemetryService,
@ITextModelService private readonly textModelResolverService: ITextModelService,
@IKeybindingService keybindingService: IKeybindingService,
@IModelService private readonly modelService: IModelService,
@ -303,12 +301,6 @@ export class PreferencesService extends Disposable implements IPreferencesServic
}
async openGlobalKeybindingSettings(textual: boolean, options?: IKeybindingsEditorOptions): Promise<void> {
type OpenKeybindingsClassification = {
owner: 'sandy081';
textual: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true };
};
this.telemetryService.publicLog2<{ textual: boolean }, OpenKeybindingsClassification>('openKeybindings', { textual });
options = { pinned: true, revealIfOpened: true, ...options };
if (textual) {
const emptyContents = '// ' + nls.localize('emptyKeybindingsHeader', "Place your key bindings in this file to override the defaults") + '\n[\n]';

View file

@ -36,20 +36,10 @@ import { UserDataSyncStoreTypeSynchronizer } from 'vs/platform/userDataSync/comm
import { ICredentialsService } from 'vs/platform/credentials/common/credentials';
import { CancellationError } from 'vs/base/common/errors';
type UserAccountClassification = {
owner: 'sandy081';
id: { classification: 'EndUserPseudonymizedInformation'; purpose: 'BusinessInsight' };
providerId: { classification: 'EndUserPseudonymizedInformation'; purpose: 'BusinessInsight' };
};
type FirstTimeSyncClassification = {
owner: 'sandy081';
action: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true };
};
type UserAccountEvent = {
id: string;
providerId: string;
comment: 'Action taken when there are merges while turning on settins sync';
action: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'action taken turning on sync. Eg: merge, pull, manual or cancel' };
};
type FirstTimeSyncAction = 'pull' | 'push' | 'merge' | 'manual';
@ -614,12 +604,11 @@ export class UserDataSyncWorkbenchService extends Disposable implements IUserDat
// accounts are switched while sync is enabled.
}
this.currentSessionId = sessionId;
this.telemetryService.publicLog2<UserAccountEvent, UserAccountClassification>('sync.userAccount', { id: accountId, providerId: authenticationProviderId });
await this.update();
}
private async onDidSuccessiveAuthFailures(): Promise<void> {
this.telemetryService.publicLog2<{}, { owner: 'sandy081' }>('sync/successiveAuthFailures');
this.telemetryService.publicLog2<{}, { owner: 'sandy081'; comment: 'Report when there are successive auth failures during settings sync' }>('sync/successiveAuthFailures');
this.currentSessionId = undefined;
await this.update();

View file

@ -12213,20 +12213,20 @@ xterm-addon-unicode11@0.4.0-beta.3:
resolved "https://registry.yarnpkg.com/xterm-addon-unicode11/-/xterm-addon-unicode11-0.4.0-beta.3.tgz#f350184155fafd5ad0d6fbf31d13e6ca7dea1efa"
integrity sha512-FryZAVwbUjKTmwXnm1trch/2XO60F5JsDvOkZhzobV1hm10sFLVuZpFyHXiUx7TFeeFsvNP+S77LAtWoeT5z+Q==
xterm-addon-webgl@0.12.0-beta.36:
version "0.12.0-beta.36"
resolved "https://registry.yarnpkg.com/xterm-addon-webgl/-/xterm-addon-webgl-0.12.0-beta.36.tgz#460f80829a78c979a448d5b764699af3f0366ff1"
integrity sha512-sgX7OHSGZQZE5b4xtPqd/5NEcll0Z+00tnTVxKZlXf5XEENcG0tnBF4I4f+k9K3cmjE1UIUVG2yYPrqWlYCdpA==
xterm-addon-webgl@0.12.0-beta.37:
version "0.12.0-beta.37"
resolved "https://registry.yarnpkg.com/xterm-addon-webgl/-/xterm-addon-webgl-0.12.0-beta.37.tgz#e465100041a7e0b1d32b01cd0b0ba5a516ac13c2"
integrity sha512-d4GfKlMrWZGzsMfMHd2siG+QiOvwikhwiu+JQlIhlnAShT/wU5BOGbNfDDA1tHmkW7G1UCFgucBuVxrs5wjuBQ==
xterm-headless@4.19.0-beta.56:
version "4.19.0-beta.56"
resolved "https://registry.yarnpkg.com/xterm-headless/-/xterm-headless-4.19.0-beta.56.tgz#7e6bdc8d647916bf5de64a73eee6bd508d25e344"
integrity sha512-EZoR/HqZoernhFngFQp7gUPy+G0TpEJkbJ9HVZcINC3m8wuV1wZKfZ4xBhsRPfhSJ7rsPnqbC+qez5ZjxwYEIw==
xterm-headless@4.19.0-beta.58:
version "4.19.0-beta.58"
resolved "https://registry.yarnpkg.com/xterm-headless/-/xterm-headless-4.19.0-beta.58.tgz#3a38cf3b9cd2606fb342a5cf8f2a0cfb963a62e8"
integrity sha512-wKQW8VzkFjyYDvcaM26gulo+YghyocfkZnKMH7gc/+/mFn3YXUPBPuOcX6e0M7NibyMlewpQpZjHQUPLBjkzfw==
xterm@4.19.0-beta.56:
version "4.19.0-beta.56"
resolved "https://registry.yarnpkg.com/xterm/-/xterm-4.19.0-beta.56.tgz#a3f1021b43ac04aa0c3f7b06f1b44ad34d487879"
integrity sha512-kywKIK61oPjbloZI+jXY1zgjQm/ghOsFFMjb79IIMaWocUDDqdpo9MmGwziTVZYu4w/Air2Zfas9UWBu4/KEyA==
xterm@4.19.0-beta.58:
version "4.19.0-beta.58"
resolved "https://registry.yarnpkg.com/xterm/-/xterm-4.19.0-beta.58.tgz#cbe535b0b85bc7f8ae3cc242df006bea04cdf541"
integrity sha512-fr3QC2qS2NBab8X7kwA/3QZELzQqhAKsngvK8NkhsrFN1DAuyEETkzqXuKbO7OKpCB6VqGDN6GPkNlUB9VrIDA==
y18n@^3.2.1:
version "3.2.2"